Compare commits

...

365 Commits

Author SHA1 Message Date
Konstantina Galouni 5f4e40a834 Merge remote-tracking branch 'origin/develop' 2024-09-23 14:11:11 +03:00
Konstantina Galouni 7abfb0bb49 Updating openaireLibrary 2024-09-23 14:09:01 +03:00
Konstantina Galouni e356b58380 Updating openaireLibrary & common-assets 2024-09-23 14:04:53 +03:00
Konstantina Galouni 7ab767aec8 Updating openaireLibrary 2024-09-23 13:20:14 +03:00
argirok 4ca47d7f36 [develop | DONE | ADDED ] utils service: add calculation date for grouped requests (useful when the response is cached) 2024-09-19 13:51:22 +03:00
Konstantina Galouni 974c43b00d Updating openaireLibrary 2024-09-18 14:27:44 +03:00
Konstantina Galouni 8c3f17cc20 Updating openaireLibrary & common-assets 2024-09-10 02:56:55 +03:00
Konstantina Galouni 0879a339ff [develop | DONE | ADDED]: app.component.ts: Added commented code for parsing file for new FoS codes/labels. 2024-09-10 01:10:05 +03:00
Konstantina Galouni 623eb2fad0 [develop | DONE | CHANGED]: Funders page: added link to RFO dashboard (irish) when available.
1. funders.component.html:
   a. [BUG] Updated checks to show Monitor dashboard link only when monitorDashboardStatus has a value.
   b. Replaced alias usage with monitorDashboard.
   c. Added link to RFO dashboard if irishDashboard and irishDashboardStatus are available.
2. funders.component.ts:
   a. Removed from fundersMap "alias" and added irishDashboard, irishDashboardStatus.
   b. In showOptions, renamed "dashboard" to "monitor" and added "rfo" for RFO dashboard.
3. funders.component.less: Added variable @irish-color and set css for .irish-dashboard-link.
2024-09-06 10:41:09 +03:00
Konstantina Galouni cf998dcd2e [develop | DONE | ADDED]: common-assets/common: Added small logo of irish dashboard to be used in funders page: small_irish.svg. 2024-09-06 10:35:19 +03:00
Konstantina Galouni 5d0c69e410 [develop | DONE | CHANGED]: utils-service: Added request to irish-monitor-service to get Funders (/stakeholder?type=funder) and their dashboard info.
1. beta.properties & production-properties.file & properties.file: Added irishMonitorAPIUrl.
2. uploadService.js: Added request to irishMonitorAPIUrl and in the response added irishAlias and irishVisibility.
2024-09-05 18:18:38 +03:00
Konstantina Galouni 7d986a7028 Merge remote-tracking branch 'origin/develop' 2024-08-02 10:41:44 +03:00
Konstantina Galouni 24895a85a2 Updating openaireLibrary 2024-08-02 10:41:28 +03:00
Konstantina Galouni 7ca0d9e8b8 [develop | DONE | CHANGED]: Updated CHANGELOG.md to add [production-release-august-2024] logs. 2024-08-01 14:35:17 +03:00
Konstantina Galouni 68ecec3210 Updating openaireLibrary 2024-08-01 14:06:45 +03:00
Konstantina Galouni 6881ae35b2 Updating openaireLibrary 2024-08-01 11:11:57 +03:00
Konstantina Galouni a1ec284c63 Merge remote-tracking branch 'origin/develop' 2024-07-23 11:24:11 +03:00
Konstantina Galouni 3acffc3d79 Updating openaireLibrary 2024-07-23 11:24:04 +03:00
Konstantina Galouni c1bac808f9 Updating openaireLibrary 2024-07-23 11:03:45 +03:00
argirok 7ec3df2dc3 [develop | DONE | CHANGED ] Cache: update accesslogCustomFormat 2024-07-19 12:37:23 +03:00
argirok 40830c48df Merge remote-tracking branch 'origin/develop' into develop 2024-07-19 11:14:06 +03:00
argirok 1e06fb0404 [develop | DONE | FIX ] Cache: fix clear specific url 2024-07-19 11:13:54 +03:00
Konstantina Galouni 0de2ac90d7 [develop | DONE | FIXED]: funders.component.ts: Fixed funder ids in staticLogos (name and shortname were cut, but they are needed eventually). 2024-07-18 18:37:45 +03:00
Konstantina Galouni d172ef8991 Updating openaireLibrary 2024-07-18 16:32:43 +03:00
Konstantina Galouni 8bed072023 [develop | DONE | CHANGED]: funders.component: Added shortName field in "fundersMap" and set it funder shortName or (if short name not available) with stakeholder alias. 2024-07-18 15:41:05 +03:00
Konstantina Galouni 16838a3d51 [develop | DONE | FIXED]: uploadService.js: Fixed funder id format (keep it as it is on the index so that search queries & links work) and parsing from the Funders API & Added check also with stakeholder's name and shortname to get the correct stakeholder (funder) from the Monitor API when there are more than one with the same index id & Added shortname as a different field for funders. 2024-07-18 14:03:13 +03:00
argirok 706fe7cd07 [develop | DONE | ADDED ] Cache: add access logs 2024-07-15 11:37:16 +03:00
Konstantina Galouni 4fc4182696 Merge remote-tracking branch 'origin/develop' 2024-07-12 11:29:46 +03:00
Konstantina Galouni 2754736693 Updating libraries 2024-07-12 11:26:47 +03:00
Konstantina Galouni d484f4afda Merge remote-tracking branch 'origin/develop' into develop 2024-07-12 11:00:08 +03:00
Konstantina Galouni 45f93d79ef [develop | DONE | CHANGED]: Added logs for [production-release-july-2024] - 2024/07/11. 2024-07-12 10:59:56 +03:00
Konstantina Galouni c4e8a2b390 Updating openaireLibrary 2024-07-11 16:36:25 +03:00
Konstantina Galouni ff3e56465e [develop | DONE | ADDED]: funders.component.ts: Adding sorting options by Research products and by Projects & Renamed typo for descending order (desc instead of dsc) | funders.component.less: Commented css rule for "custom-view-button" class (now available on general.less). 2024-07-11 15:32:48 +03:00
Konstantina Galouni 0181035409 Updating libraries 2024-07-09 17:22:28 +03:00
Konstantina Galouni 7a863e3d4b [develop | DONE | FIXED]: Initialize properties on field definition (files: contact.component.ts & funders.component.ts) 2024-07-05 15:55:12 +03:00
Konstantina Galouni faad25e780 [develop | DONE | ADDED]: package.json: Added on dependencies "flag-icons": "^7.2.1" (library to show flag icon according to country code) | funders.component.less: Import "flag-icons/css/flag-icons.min.css" | funders.component.ts: Added for funders fields "websiteUrl", "country", "registered" & added sorting option by country (asc) | funders.component.html: Display new fundes info ("websiteUrl", "country", "registered"). 2024-06-20 16:23:51 +03:00
Konstantina Galouni 1494f44362 [develop | DONE | CHANGED]: utils-service: beta-properties.file & production-properties.file & properties.file: Added property fundersServiceAPIUrl | uploadService.js: Added query and parsing of funders from new Funders API (created by CNR) for extra info (country, websiteUrl, registered, etc..) 2024-06-20 15:36:56 +03:00
Konstantina Galouni b059b300ba Merge remote-tracking branch 'origin/develop' 2024-06-04 17:36:04 +03:00
Konstantina Galouni d05209a54c Updating openaireLibrary & common-assets 2024-06-04 17:35:55 +03:00
Konstantina Galouni 24696d7991 Merge remote-tracking branch 'origin/develop' into develop 2024-06-04 16:48:57 +03:00
Konstantina Galouni b72a7f03b1 [develop | DONE | CHANGED]: CHANGELOG.md: Added logs for [production-release-june-2024] - 2024/06/04. 2024-06-04 16:48:46 +03:00
Konstantina Galouni e4d230369e Updating openaireLibrary & common-assets 2024-06-04 16:14:58 +03:00
Konstantina Galouni ba83087b59 [develop | DONE | CHANGED]: uploadService.js: In endpoint "/explore/search", added in projects count query &fq=projectcode<>"unidentified" | In endpoint "/explore/funders", replaced fq=projecttitle with fq=projectcode, to exclude unidentified projects based on their code. 2024-05-28 15:44:49 +03:00
Konstantina Galouni 55469cc2bc [develop | DONE | CHANGED]: CHANGELOG.md: Updated changelog to include [production-release-may-2024] - 2024/05/23. 2024-05-27 11:21:17 +03:00
Konstantina Galouni dbdb929a8f Merge remote-tracking branch 'origin/develop' 2024-05-23 19:30:32 +03:00
Konstantina Galouni 58770771ca Updating libraries 2024-05-23 19:30:19 +03:00
Konstantina Galouni 0c82b325cf Updating openaireLibrary 2024-05-23 18:16:56 +03:00
Konstantina Galouni e518a80ba4 Updating openaireLibrary & openaire-theme 2024-05-23 18:11:36 +03:00
Konstantina Galouni 234b12be9d Updating openaireLibrary 2024-05-21 13:17:19 +03:00
Konstantina Galouni 5789293ffe Merge pull request 'Merge on-push-strategy branch into develop (on push strategy in result-preview component, i.e. search result cards)' (#15) from on-push-strategy into develop
Reviewed-on: #15
2024-05-21 12:16:29 +02:00
Konstantina Galouni 83f01d8aa1 Updating openaireLibrary & openaire-theme 2024-05-21 13:11:36 +03:00
Konstantina Galouni 0a20d80c4c Updating libraries 2024-04-30 14:47:53 +03:00
Konstantina Galouni 8a3e859132 Merge remote-tracking branch 'origin/develop' into on-push-strategy 2024-04-30 14:47:25 +03:00
Konstantina Galouni ca41e89465 [develop | DONE | CHANGED]: Updated color of selected search filter labels (not purple, but portal color).
1. newSearchPage.component.html: Replaced class "uk-label-search-filter" with "uk-label-secondary" on selected search filter labels.
2. color.less: Removed color variable @search-filter-color: #B41FD0;
3. label.less: Removed custom color variables and class "uk-label-search-filter" | Updated class "uk-label-secondary".
4. explore-custom.less: Override @uk-label-secondary: @explore-color;
2024-04-30 13:08:54 +03:00
Konstantina Galouni e563886f8a Updating openaireLibrary 2024-04-24 16:36:18 +03:00
Konstantina Galouni d1b482c189 Updating openaireLibrary 2024-04-24 16:09:14 +03:00
Konstantina Galouni 443f90d2e9 Updating openaireLibrary 2024-04-23 16:59:46 +03:00
Konstantina Galouni 8d0f711064 Updating openaireLibrary 2024-04-23 16:04:02 +03:00
Konstantina Galouni 0f639ec210 Updating openaireLibrary 2024-04-22 17:27:15 +03:00
Konstantina Galouni d9647d2a46 Updating openaireLibrary 2024-04-16 16:22:05 +03:00
Konstantina Galouni b79dbd20ec Updating libraries 2024-04-16 16:10:41 +03:00
Konstantina Galouni ccae7b03a5 [develop | DONE | CHANGED]: funders.component.ts: Added alt attribute on funders image and removed loading="lazy" | home.component.html: Updated header elements to make them as sequential as possible (SEO & PageSpeed). 2024-04-16 12:41:13 +03:00
Alex Martzios 59f3e8dae9 [develop | DONE | CHANGED] update submodules 2024-04-11 16:34:50 +03:00
Alex Martzios 09b7435243 [develop | DONE | ADDED] funders page: update cards and lists to prepare for new data to be shown 2024-04-08 19:10:44 +03:00
argirok 260b263e6f [develop | DONE | CHANGED] cache.js add compression library, reload content based on forceReload parameter or cache control headers 2024-04-03 10:20:58 +03:00
Alex Martzios d42a3973bd [develop | DONE | ADDED] update submodules for bulk deletion functionality for claims 2024-03-28 13:07:54 +02:00
Konstantina Galouni 37358b14db [develop | DONE | FIXED]: CHANGELOG.md: Spelling error fix. 2024-03-05 13:59:37 +02:00
Konstantina Galouni 2a4b92ba00 Merge remote-tracking branch 'origin/develop' 2024-03-05 13:53:24 +02:00
Konstantina Galouni 4ad1f4e51c [develop | DONE | CHANGED]: CHANGELOG.md: Added changelog for production-release-march-2024. 2024-03-05 13:52:29 +02:00
Konstantina Galouni 3d2ad5336b Merge remote-tracking branch 'origin/develop' 2024-03-04 18:46:56 +02:00
Konstantina Galouni 60de7eb2a0 Updating libraries 2024-03-04 18:46:36 +02:00
Konstantina Galouni 45561bddb2 Updating openaireLibrary 2024-03-04 17:04:52 +02:00
Konstantina Galouni 215c3fbc83 [develop | DONE | FIXED]: home.module.ts: Moved HomeRoutingModule first to make sure that this routing is loaded in Home page. 2024-03-04 17:04:01 +02:00
Konstantina Galouni a79b936629 [develop | DONE | FIXED]: Moved RoutingModule as first imported module with possible routing (advanced search projects & organizations were loading orcid routing instead of their own). 2024-03-04 17:02:33 +02:00
Alex Martzios b7a05316c0 [develop | DONE | FIXED] update submodule 2024-03-04 10:39:56 +02:00
Konstantina Galouni a99e6378fc Updating openaireLibrary 2024-02-28 18:08:10 +02:00
Konstantina Galouni 8949088e0e [develop | DONE | CHANGED]: funders.component.html: Added loading="lazy" on images (<img> elements). 2024-02-28 17:30:43 +02:00
Konstantina Galouni 463410a135 [develop | DONE | CHANGED]: Removed "PreviousRouteRecorder", "IsRouteEnabled", "PiwikService", "LoginGuard", "EmailService" from providers array declared in module.ts & removed import of "PiwikServiceModule". 2024-02-28 16:49:50 +02:00
Konstantina Galouni 17165e83ae [develop | DONE | CHANGED]: Removed folders: error, fos, landingPages, login, orcid, reload, sdg (were just calling library components) | app.module.ts: Removed declaration of OpenaireErrorPageComponent | app-routing.module.ts: Updates routes for 'sdgs', 'fields-of-science', 'orcid', 'my-orcid-links', landing pages routes, 'reload', 'user-info' to import library modules instead of intermediate project specific modules & replaced OpenaireErrorPageComponent with ErrorPageComponent (from library). 2024-02-28 14:41:39 +02:00
Alex Martzios f3115b9f98 [develop | DONE | CHANGED] change footer text and update submodules 2024-02-20 13:38:46 +02:00
Alex Martzios f226482ba3 [develop | DONE | CHANGED] compress all .png and .jpg images on explore-assets and exploreLogos 2024-02-20 12:46:45 +02:00
Konstantina Galouni 38337e296f [develop | WIP | CHANGED]: assets/:Restores jpg and png images and deleted their webp version - pngs will be compressed | funders.component & home.component: Updated images - use the png/jpg version again. 2024-02-20 12:12:42 +02:00
argirok c81c6196c0 [ develop | DONE | ADDED] Utils servise: add a method to get counts for results, use the same method in /explore/home 2024-02-20 11:39:49 +02:00
Konstantina Galouni 178846353c [develop | DONE | DELETED]: assets: Deleted unused images: logo-large-explore.webp & logo-sma
.
2024-02-19 13:09:22 +02:00
Konstantina Galouni 49dce466ce [develop | DONE | CHANGED]: assets: Deleted unused images & replaced jpg and png images with their webp version | funders.component & home.component: Updated images - use the webp version. 2024-02-19 13:07:34 +02:00
argirok 68662693a4 [ develop | DONE | ADDED] Cache: add a method to get info 2024-02-15 12:13:04 +02:00
Konstantina Galouni e8e4c410dd Updating openaireLibrary & openaire-theme 2024-02-14 16:48:38 +02:00
Konstantina Galouni c51b2b58f4 [develop | DONE | CHANGED]: app.component.ts: Added check, not to add "My ORCID Links" user menu item in beta environment. 2024-02-13 17:34:29 +02:00
Konstantinos Triantafyllou 85320e8653 [develop]: Remove userInfoURL property usage 2024-02-13 12:10:20 +02:00
Konstantina Galouni 9f53423ae3 Merge remote-tracking branch 'origin/develop' 2024-02-12 14:50:33 +02:00
Konstantina Galouni 15499aa4ca Updating openaireLibrary 2024-02-12 14:50:19 +02:00
Konstantina Galouni a762efab08 Merge remote-tracking branch 'origin/develop' into develop 2024-02-12 14:47:59 +02:00
Konstantina Galouni 8cdc423f02 [develop | DONE | CHANGED]: CHANGELOG.md: Added changelogs for [production-release-february-2024]. 2024-02-12 14:47:47 +02:00
Konstantinos Triantafyllou 3797ddcc3a Merge branch 'develop' of code-repo.d4science.org:MaDgIK/explore-services into develop 2024-02-12 14:47:16 +02:00
Konstantinos Triantafyllou e57f1b02ed [develop]: Split style of deposit and funders to new css files and use rootClass to appy style in html 2024-02-12 14:47:02 +02:00
Konstantina Galouni b6db196e68 Merge pull request 'Production release February 2024 - Fixes and updates in cache' (#13) from develop into master
Reviewed-on: #13
2024-02-12 12:30:21 +01:00
Konstantina Galouni 6af07478b4 [develop | DONE | CHANGED]: cache.js: Increased "cacheMaxSize" from 300 to 1000 requests. 2024-02-12 13:29:23 +02:00
argirok 3b058ee74d [ develop | DONE | CHANGED] Cache: update isAllowed Method, correct https check, decode urls before check 2024-02-12 11:13:38 +02:00
Konstantina Galouni 4258055e51 Merge pull request 'Production release February 2024 - Home page logos update' (#12) from develop into master
Reviewed-on: #12
2024-02-12 08:08:29 +01:00
Konstantina Galouni c20002c9e9 [develop | DONE | CHANGED]: home.component & assets/ExploreLogos: Grouped logos of slider in Home page (per slide) into one image and replaced the old logos - better performance. 2024-02-12 09:04:29 +02:00
Konstantina Galouni 134c21d6be Merge pull request 'Production release February 2024 - Fix' (#11) from develop into master
Reviewed-on: #11
2024-02-08 18:44:55 +01:00
Konstantina Galouni fbdc3710dc [develop | DONE | FIXED]: cache.js: Updated checks in method "isAllowedToBeCached()" to check for encoded urls. 2024-02-08 19:43:31 +02:00
Konstantina Galouni a5019e083c Merge remote-tracking branch 'origin/develop' 2024-02-08 19:10:13 +02:00
Konstantina Galouni ee38203ee4 Updating openaireLibrary & openaire-theme 2024-02-08 19:10:04 +02:00
Konstantina Galouni 1d7a7ae2c4 Updating openaireLibrary & openaire-theme 2024-02-08 18:48:22 +02:00
Konstantina Galouni d639261fbe [develop | WIP | FIXED]: Added correct alt on images, width and height in FoS and SDG images and lazy loading everywhere. 2024-02-08 18:46:45 +02:00
Konstantina Galouni a7d0cc5d4e [develop | DONE | CHANGED]: app.module.ts: Removed CacheInterceptorService from EXPLORE. 2024-02-08 17:56:42 +02:00
Konstantina Galouni 9952b55f2c [develop | DONE | CHANGED]: cache.js: Added "lab.idiap.ch/enermaps" in "isAllowedToBeCached()" method. 2024-02-08 17:55:22 +02:00
argirok b94006ea99 Merge remote-tracking branch 'origin/develop' into develop
# Conflicts:
#	services/cache/mecache/cache.js
2024-02-08 15:59:59 +02:00
argirok b0db89f826 [ develop | DONE | CHANGED] Cache: change to LRU cache, remove short/long cache related code and properties, add preload requests in properties to load on init cache (on start, on clear and on daily reset) 2024-02-08 15:58:43 +02:00
Konstantina Galouni 07681241c0 [develop | DONE | CHANGED]: contact.component.ts: Do not request page help contents (helptexts). 2024-02-08 14:20:13 +02:00
Konstantina Galouni ee00eaaebf Merge remote-tracking branch 'origin/grouped-queries' into develop 2024-02-08 12:40:55 +02:00
Konstantina Galouni 1738dfcccc Updating openaireLibrary 2024-02-08 12:40:48 +02:00
Konstantina Galouni 5b5000b2fe Updating openaireLibrary 2024-02-07 23:06:52 +02:00
Konstantina Galouni af50558136 [grouped-queries | DONE | CHANGED] funders.component.ts: Replaced search & stakeholders queries of funders (in Funders page) with grouped query for Funders page of EXPLORE 2024-02-07 22:56:11 +02:00
Konstantina Galouni 36f1ed105d Updating openaireLibrary & common-assets 2024-02-07 22:53:03 +02:00
Konstantina Galouni 414ff59fd0 Merge remote-tracking branch 'origin/develop' 2024-02-07 22:41:04 +02:00
Konstantina Galouni 5408bd9f82 Updating openaireLibrary & common-assets 2024-02-07 22:39:56 +02:00
Konstantina Galouni a3c79137aa [develop | DONE | CHANGED]: Remove preselected "Open Access" filter from search.
1. home.component.ts: Set field "resultsQuickFilter" to null.
2. searchAll.component.ts: Set field "quickFilter" to null | In method "entityChanged()" do not set parameter "resultbestaccessright" | [BUG FIX] Clear subscriptions from fetchOrps.
3. searchResearchResults.component.ts: Set field "quickFilter" to null.
4. navigationBar.component.ts: Set field "resultsQuickFilter" to null.
5. app.component.ts: Remove "resultbestaccessright" parameter from menu items of Search research products.
2024-02-07 21:28:45 +02:00
Konstantina Galouni 4131de601c [develop | DONE | ADDED]: cache.js: Added in "longCachingRequests", the endpoints "/utils-service/explore/search" and "/utils-service/explore/funders" to be used as a grouped responses in explore search and funders pages. 2024-02-07 12:00:16 +02:00
argirok 7761eeeedc [ develop | DONE | CHANGED] Utils services: update funders response, remove open access filter from results query in /explore/search 2024-02-07 11:05:55 +02:00
argirok 46ad6aef36 [ develop | DONE | ADDED] Utils services: add /explore/funders method that groups requests for funder page 2024-02-06 11:31:47 +02:00
argirok f64b410dd5 Merge remote-tracking branch 'origin/develop' into develop 2024-02-05 12:08:57 +02:00
argirok 629d3efb08 [ develop | DONE | ADDED] Cache services: add initialization method to initiate grouped requests from utils service. Init after clear and when cache starts 2024-02-05 12:08:34 +02:00
argirok a9d06e61fa [ develop | DONE | ADDED] Utils services: group common requests in a single request 2024-02-05 12:07:34 +02:00
Konstantina Galouni 102f41722e Updating openaireLibrary & common-assets 2024-02-05 11:55:23 +02:00
Konstantina Galouni 109be1c6f6 [cache | develop | DONE | ADDED]: cache.js: Added in "longCachingRequests", the endpoint "/utils-service/explore/home" to be used as a grouped response for the numbers in explore home page. 2024-02-02 12:44:54 +02:00
Konstantina Galouni 3678f7c5ea [cache | develop | DONE | CHANGED]: cache.js: Increased time of short cache from 2 minutes to 1 hour. 2024-02-02 12:12:57 +02:00
Konstantina Galouni 278fefb45a Merge remote-tracking branch 'origin/develop' 2024-02-01 21:52:27 +02:00
Konstantina Galouni 3562d4f6c6 Updating openaireLibrary 2024-02-01 21:52:17 +02:00
Konstantina Galouni cca45918d8 Merge branch 'develop' of code-repo.d4science.org:MaDgIK/explore-services into develop 2024-02-01 21:48:17 +02:00
Konstantina Galouni 099f6a6ce6 [develop | DONE | CHANGED]: CHANGELOG.md: Added logs for [production-release-january-2024]. 2024-02-01 21:47:48 +02:00
Konstantina Galouni b21d7dcd93 Merge remote-tracking branch 'origin/develop' 2024-02-01 21:12:13 +02:00
Konstantina Galouni 2adb378467 Updating libraries 2024-02-01 21:10:48 +02:00
Konstantina Galouni c41cbb6355 Updating openaireLibrary 2024-02-01 21:09:28 +02:00
Konstantina Galouni 5c95fac244 [develop | DONE | FIXED]: routes.ts: Added missing routes for prometheus logs. 2024-01-29 20:01:11 +02:00
Konstantina Galouni 17325b3ab2 [develop | DONE | DELETED]: Removed legacy unused files htmlProjectReport.component.ts & htmlProjectReport-routing.module.ts & libHtmlProjectReport.module.ts & mailPrefs.component.ts & mailPrefs.module.ts & mailPrefs-routing.module.ts | app-routing.module.ts: Deleted legacy routes 'mail-preferences' & 'project-report'. 2024-01-29 20:00:28 +02:00
Konstantina Galouni 6fd19ea661 Updating libraries 2024-01-25 12:36:38 +02:00
Alex Martzios e01371ff14 [master | DONE | ADDED] update submodules 2024-01-17 11:16:33 +02:00
Konstantina Galouni 96e400552a [develop | DONE | ADDED]: Added CHANGELOG.md file in the explore folder. 2024-01-15 13:44:23 +02:00
Konstantina Galouni da33e403f6 Updating openaireLibrary 2024-01-12 14:03:26 +02:00
Konstantina Galouni 9ca57b8f4d [develop | DONE | CHANGED]: explore-assets/funders/logos: Renamed all funder logos by using only their shortnames | funders.component.ts: For static logos, split funder id and get only their shortname, to get the static logo - Special characters where causing problems in pulling the project in Windows environment. 2024-01-12 14:02:37 +02:00
Konstantina Galouni 5b86f1a4d1 Updating libraries 2023-12-28 16:35:43 +02:00
Konstantina Galouni c3587bb2c4 Merge remote-tracking branch 'origin/develop' 2023-11-28 13:15:23 +02:00
Konstantina Galouni 288e106779 Updating libraries 2023-11-28 13:12:26 +02:00
Konstantina Galouni c416853045 Updating openaireLibrary 2023-11-28 13:02:55 +02:00
Konstantina Galouni ec8e6b6938 Updating openaireLibrary 2023-11-27 13:49:04 +02:00
Konstantina Galouni 852c81d834 [develop | DONE | CHANGED]: home.component.html: In home page, get number of funders by numbers.mergedFundersSize (instead of numbers.fundersSize) - all funders that with research products or >1 projects. 2023-11-24 17:01:38 +02:00
Konstantina Galouni 8c9337fd0b [develop | DONE | FIXED]: funders.component.ts: Updated method called in refine queries from "getRefineFieldsResultsByEntityName()" to "getAllRefineFieldResultsByFieldName()" to be able to get more than 100 funders each time. 2023-11-24 11:45:59 +02:00
Konstantina Galouni bce47ea21e [develop | DONE | CHANGED]: data sources landing: Get and parse number of collected fulltexts from a new stats api.
1. env-properties.ts: Added property pdfStatisticsAPIURL?: string;
2. environment.ts: Added pdfStatisticsAPIURL property in all environments.
3. dataProvider.service.ts: Uncomment method "getCollectedFulltexts()".
4. dataProvider.component.ts: Call method "getCollectedFulltexts()" instead of "getDataProviderAggregationStatus()".
2023-11-10 19:44:15 +02:00
Konstantina Galouni 11f0f8befb Merge remote-tracking branch 'origin/develop' 2023-11-10 19:33:22 +02:00
Konstantina Galouni ab839498a8 Updating libraries 2023-11-10 19:31:34 +02:00
Konstantina Galouni 2bfb614008 [develop | WIP | CHANGED]: explore-assets/funders/logos: Updated logo for Tara funder. 2023-11-09 15:18:30 +02:00
Konstantina Galouni 5eb3883d6b [develop | WIP | FIXED]: funders.component.ts: Fixed typo in previous commit causing page crash. 2023-11-09 13:41:21 +02:00
Konstantina Galouni 4fd541f460 [develop | WIP | CHANGED]: explore-assets/funders/logos: Missing logos for production funders added temporarily | funders.component.ts: Added staticLogos field to get missing logos for prod funders from local folder - temporary solution, to be removed asap. 2023-11-09 13:39:01 +02:00
Konstantina Galouni cfe0cc3b7b [develop | DONE | FIXED]: environment.beta.ts: Updated piwikSiteId for beta from "109" to "6" (this shouldn't be used - it should be fetched dynamically by admin tools API). 2023-11-08 22:42:28 +02:00
Konstantina Galouni f1330358f8 [develop | DONE | FIXED]: package.json: Restored uikit version from 3.16.14 to 3.16.24. 2023-11-03 13:26:44 +02:00
argirok b5b9aa7d24 [ DONE | UPDATED] remove common properties to use the properties from library 2023-11-01 14:27:35 +02:00
Konstantina Galouni 1dbce23e13 [develop | DONE | FIXED] environment.prod.ts: In claimsAPIURL property call production API, not beta. 2023-10-31 12:35:01 +02:00
Konstantina Galouni e1e53a7bbe Updating libraries 2023-10-30 21:59:53 +02:00
Konstantina Galouni 3903c940a7 Merge pull request 'BETA & PROD Explore release October 2023 - Update to Angular-16' (#4) from angular-16 into develop
Reviewed-on: #4
2023-10-30 20:55:49 +01:00
Konstantina Galouni d83c614892 [angular-16 | DONE | UPDATED] environment.prod.ts: Updated claimsAPIURL property to call new claims API. 2023-10-30 21:22:52 +02:00
Konstantina Galouni 363e371ec1 Merge branch 'angular-16' of code-repo.d4science.org:MaDgIK/explore-services into angular-16 2023-10-30 19:23:04 +02:00
Konstantina Galouni ce034c1c8c [angular-16 | DONE | FIXED] package.json: Downgraded version of uikit from 3.16.24 to 3.16.14 (parallax not working). 2023-10-30 19:22:24 +02:00
Konstantina Galouni aa192044af Updating openaireLibrary & common-assets 2023-10-30 14:29:16 +02:00
Konstantina Galouni f24e62cad6 [angular-16 | DONE | FIXED]: In queries of results by pid, do not include pidtype restriction (some handle pids are resolved by doi regex, but no results returned for pidtype exact "doi"). 2023-10-30 10:53:19 +02:00
Konstantina Galouni 16a73b6e29 [angular-16 | DONE | CHANGED] environments/: Updated imports - import all common properties from src/app/openaireLibrary/utils/properties/environments/environment.ts 2023-10-19 14:51:21 +03:00
Konstantina Galouni ecd21315f4 [Library | angular-16]: [Bug fix] Name of bip metrics accidentally removed in branches merge. 2023-10-18 14:18:04 +03:00
Konstantina Galouni a5beb8ba76 [Explore | angular-16]: [Bug fix] funders.component.ts: Added ADDITIONAL check to the previous commit (about choosing among multiple stakeholders with the same index info). 2023-10-16 16:07:42 +03:00
Konstantina Galouni 713e6014c3 [Explore | angular-16]: [Bug fix] environment.beta.ts: Updated property "claimsAPIURL" with the new claims API | funders.component.ts: Added check to choose among multiple stakeholders with the same index info (according to the stakeholders' visibility). 2023-10-16 16:02:32 +03:00
Konstantina Galouni a5ce147fa1 Updating openaireLibrary 2023-10-16 14:56:46 +03:00
Konstantina Galouni 4aa01517f2 Merge remote-tracking branch 'origin/develop' 2023-10-16 13:43:23 +03:00
Konstantina Galouni fb2e542c4d Updating openaireLibrary (after it was merged from develop to master). 2023-10-16 13:43:09 +03:00
Konstantina Galouni c676603faa Updating libraries 2023-10-16 13:34:18 +03:00
Konstantina Galouni 65ba5ef994 Merge remote-tracking branch 'origin/develop' into angular-16 2023-10-16 13:27:45 +03:00
Konstantina Galouni d786a50074 Updating openaireLibrary 2023-10-16 13:27:31 +03:00
Konstantina Galouni 88c53b6cc3 Update openaireLibrary 2023-10-16 13:00:46 +03:00
Konstantina Galouni 7be7c08442 [Library | develop]: resultLanding.component.html: [Bug fix] Fix check isNumber for bip measures & remove check if value (show citation score also when it is 0). 2023-10-16 12:53:40 +03:00
Konstantina Galouni 20ac495013 [Explore | develop]: funders.component.html: [Bug fix] Updated height-match cases and added uk-grid-match to fix and align heights of cards and their contents | funders.component.ts: Added check to not show when there is just one project for a funder (it is the custom unidentified project added for the data). 2023-10-16 11:47:45 +03:00
Konstantina Galouni 185344d878 [Library | develop]: search-input.component.ts: [Bug fix] Added cdr.detectChanges() call on ngAfterViewInit, to solve expressionChangedAfterItHasBeenChecked error. 2023-10-16 11:44:18 +03:00
Konstantina Galouni 2d8400e9b7 [Explore | develop]: app.component.ts: Commented out MenuItem for funders page. 2023-10-11 13:24:21 +03:00
Konstantina Galouni bc05c92edc [Library | develop]: Added Full-Text in research products actions when available.
1. availableOn.component.ts: Added Full-Text before Data sources, as a separate action and as information for each instance.
2. parsingFunctions.class.ts: Added parsing for fulltext and updated method "compareHostedByCollectedFrom()" to sort by both access and existence of fulltext.
3. resultLanding.component.html: Removed classes for <availableOn> in mobile actions.
4. entity-actions.component.ts: Updated uk-text-bolder class for all actions.
5. result-preview.ts: Added "fulltext?: string;" in HostedByCollectedFrom.
2023-10-11 12:46:10 +03:00
Konstantina Galouni b1d4ac4665 [Library & Explore | develop]: Added in openaireLibrary environment files for common properties (environment.all.ts: Common properties among all portals, regardless environment, environment.-/test/beta/prod.ts: Common properties per environment among all portals) | environments/: Build and export properties by merging local properties and common properties. 2023-10-10 17:42:40 +03:00
Konstantinos Triantafyllou 642509a1f5 Merge remote-tracking branch 'origin/develop' into angular-16 2023-10-10 17:17:02 +03:00
Konstantinos Triantafyllou f948757eb2 Merge remote-tracking branch 'origin/develop' into angular-16 2023-10-10 17:16:27 +03:00
Konstantinos Triantafyllou e33812c8d8 Slider: CHangfe period to 8s and make it infinite. 2023-10-10 17:14:45 +03:00
Alex Martzios f851fbefed funders page: change width of image's hero section again 2023-10-09 11:47:10 +03:00
argirok 55150473ab remove unused imports to deleted searchZenodoCommunitiesService 2023-10-09 11:31:12 +03:00
Alex Martzios 4f9ba17092 funders page: change inputs and actions, add grid/list view for funders 2023-10-09 10:30:34 +03:00
Konstantinos Triantafyllou 8dfa776e0a Change button-link in home page with text-primary 2023-10-06 20:21:07 +03:00
Konstantinos Triantafyllou d97231ba92 Change scroll-section with slider 2023-10-06 14:50:22 +03:00
Konstantina Galouni 7835c273b4 [Library & Explore | develop]: Added software heritage as pid for research products.
1. environments/: Added in all environments, property: swhURL: "https://archive.softwareheritage.org/".
2. env-properties.ts: Added property swhURL?: string;
3. string-utils.class.ts: Added method "isValidSwhId()" and swhid in checks and definitions.
4. resultLandingInfo.ts: Added swhid in accepted types of interface Id.
5. resultLanding.component.ts: Added check for swhid in "getReferenceIdName()" and "getReferenceUrl()".
6. parsingFunctions.class.ts: Added pid[i].classid == "swhid" check in "parseIdentifiers()".
7. showIdentifiers.component.ts: Added "swhid" in display of pids.
2023-10-06 12:22:00 +03:00
Alex Martzios ca9a00e879 add new custom css class for explore, update submodules 2023-10-02 12:18:42 +03:00
Konstantinos Triantafyllou f443ca9a61 Merge remote-tracking branch 'origin/develop' into angular-16 2023-09-15 15:35:24 +03:00
Konstantinos Triantafyllou d8fadf50e6 Update libraries. Update node to version 16 and angular in readme 2023-09-15 15:33:14 +03:00
Konstantina Galouni 3cb7443a2e Updating openaireLibrary before release 2023-09-06 15:09:24 +03:00
Konstantina Galouni 8690029fd0 [Library | develop]: searchFields.ts: In RESULT_REFINE_FIELDS, query "foslabel" (instead of fos) field in all environments. 2023-09-04 15:45:07 +03:00
Konstantinos Triantafyllou 6d4f7d5645 Revert port of Upload to 8000 2023-08-31 13:53:24 +03:00
Konstantinos Triantafyllou bfd7e1bf94 Add hasStickyHeaderInMobile in home page. 2023-08-30 14:05:20 +03:00
Konstantina Galouni 14c289b719 [Explore | develop]: server.ts: Added endpoint '/health-check' with basic information. 2023-08-30 13:21:36 +03:00
Konstantina Galouni 1fef8ce8e6 [Library | develop]: resultLanding.component.html & project.component.html & organization.component.html & dataProvider.component.html: In main action bar for mobile (landing-action-bar-mobile), replaced uk-background-default with uk-tile-default uk-blur-background. 2023-08-25 15:56:53 +03:00
Konstantina Galouni 93777a8079 [Library | develop]: [Bug fix] landing-utils/fos.component.ts & fos/fos.component.ts & fos/fos.component.html: Added methods "buildFosQueryParam()" and "buildFosHrefParam()" to build and set in fos links, search param "fos" for production and "foslabel" for beta or dev environments. 2023-08-24 18:31:04 +03:00
Konstantina Galouni e56c3d82e4 [Library | develop]: alert.ts & full-screen-modal.component.ts: Updated (h6 from h4 or h5) header font size and ratio of icons (make them smaller) - in angular 16 branch, paddings have also changed. 2023-08-24 18:20:49 +03:00
Konstantinos Triantafyllou 1602407c41 Update uikit to version 3.16.24 2023-08-23 16:57:51 +03:00
Konstantina Galouni dd5ede2794 [Library & common-assets | develop]: Minor updates in mobile screens in icons/ paddings in landing pages.
1. resultLanding.component.html & project.component.html & dataProvider.component.html & organization.component.html: In mobile (small) screens, change ratio of icons in bottom action bar from 2 to 1.4.
2. showIdentifiers.component.ts: In mobile (small) screens, added in fs-modal classTitle="uk-tile-default uk-border-bottom".
3. landing.less: Added variable @landing-action-bar-mobile-border: @global-border; to use it in border-top of landing-action-bar-mobile > div | Changed padding of landing-action-bar-mobile > div to 8px in top and bottom.
2023-08-21 13:59:20 +03:00
Konstantinos Triantafyllou c8967dd92b Delete ServerTransferStateModule 2023-08-04 15:53:10 +03:00
Konstantinos Triantafyllou 95f749e9f0 Update versions in sitemaps. Need to be checked. 2023-08-04 15:45:18 +03:00
Konstantinos Triantafyllou 3a463f9bab Update dependencies and node version in cache and utils-service 2023-08-04 13:54:46 +03:00
Konstantinos Triantafyllou 15cd6a2fb6 Update library 2023-08-02 14:08:49 +03:00
Konstantinos Triantafyllou cffe2a0967 Remove BrowserStateModule 2023-08-02 14:04:32 +03:00
Konstantinos Triantafyllou 3011294f5b Update material to angular 16. 2023-08-02 14:02:51 +03:00
Konstantinos Triantafyllou eb15f07ef0 Update angular to angular 16. 2023-08-02 14:02:11 +03:00
Konstantinos Triantafyllou 89788f660d Update Zone to 0.13.1 2023-08-02 13:57:33 +03:00
Konstantinos Triantafyllou 986aecfe2a Update material to angular 15. 2023-08-02 12:48:36 +03:00
Konstantinos Triantafyllou 7ada3160f2 Migrate angular core and cli to version 15 and update dependencies to be compatible with the newer version. 2023-08-02 12:46:06 +03:00
Konstantinos Triantafyllou 12ee95b98c Update typescript to version 4.9.5 2023-08-02 12:32:27 +03:00
Konstantina Galouni f762d78226 [Library | develop]: resultLanding.component.ts: Added ContextsService and call to get public communities, and then filter out contexts (related to communities) of resultLandingInfo if they are hidden. 2023-07-28 16:04:14 +03:00
Konstantina Galouni 6ce1f32759 Updating openaire-theme before beta release.. 2023-07-27 16:04:56 +03:00
Konstantina Galouni d9549f8c93 [Library | develop]: funders.component.html: Show number of projects before number of research products in funders cards. 2023-07-27 16:02:01 +03:00
Konstantina Galouni ac797aba3c Updating openaireLibrary before beta release.. 2023-07-27 15:51:11 +03:00
Konstantina Galouni 5883af71da [Library | develop]: entity-actions.component.ts & transferData.component.html & orcid-work.component.ts & resultLanding.component.html & project.component.html & organization.component.html & dataProvider.component.html: Added "tooltips/messages" under the landing actions in mobile-small screens. 2023-07-27 15:28:40 +03:00
Konstantinos Triantafyllou ccc59c14b0 Update library and assets 2023-07-25 19:10:31 +03:00
Konstantina Galouni ca9f2bca45 [Library | develop]: In search bars, set in placeholder the portal name according to the configuration name.
1. home.component & navigationBar.component: Get portalName by config.portalAsObservable>name and set placeholder to "Search "+portalName.
2. searchAll.component.ts: Set default value of "formPlaceholderText" to "Search".
3. advancedSearchForm.component.html: Set placeholder of input (when there is also the <entities-selection>) to [placeholder]="formPlaceholderText".
2023-07-24 16:25:20 +03:00
Alex Martzios 665a6cb61b update submodules 2023-07-20 11:50:29 +03:00
Alex Martzios 96c0b16680 update submodules 2023-07-19 12:20:57 +03:00
Konstantina Galouni 48906a3e28 [Explore | develop]: funders.component.ts: [Bug fix] When there is a funder dashboard with no research products or projects, do not show this funder at all. 2023-07-17 16:59:12 +03:00
Konstantina Galouni 36108a81f1 [Explore | develop]: funders.component.ts: [Bug fix] Updated logoUrl parsing - if isUpload is true, get logo from properties.utilsService + "/download/". 2023-07-17 16:37:51 +03:00
Konstantinos Triantafyllou c7ffca77fd Update library 2023-07-13 14:44:28 +03:00
Konstantinos Triantafyllou e724914d64 Change piwik base on the new dynamic piwik. 2023-07-13 10:55:08 +03:00
Konstantina Galouni b93da0d434 [Library & common-assets | develop]: [WIP] dataProvider.component.html & project.component.html & resultLanding.component.html: Removed "uk-card uk-card-secondary" classes from metrics box and commented badge icon | metrics-badge.svg: Changed badge color to white (used to be orange - Explore specific) | landing.less: Updated class ".landing-metrics-card" to use background-blend-mode: color-dodge for svgs in landing metrics box. 2023-07-12 17:22:45 +03:00
Konstantina Galouni eda8c5c2d9 [Explore | develop]: app.component.ts: Added open access param in sub menu items of research products (publications, software, ...) | home.component.ts: Removed an unnecessary log. 2023-07-11 15:26:38 +03:00
Alex Martzios cf7664534b add funders' page content, enable route from app-routing file, update submodules 2023-07-11 13:00:13 +03:00
Alex Martzios 9556ae36b9 funders page: responsive design for sorting actions 2023-07-07 16:30:51 +03:00
Konstantina Galouni 378d7ccb83 [Explore | develop]: app-routing.module.ts: Set specific search routes for each entity before setting generic route "search/find/:entity" | Updating openaireLibrary and common-assets. 2023-07-07 13:56:55 +03:00
Konstantina Galouni a23afc29d2 [Explore | develop]: [Bug fix] Refactor code for showing help button or not.
1. home.component.ts: Removed field "showQuickContact" | In constructor set quickContactService.setDisplay(false) and in ngOnDestroy quickContactService.setDisplay(true) | Refactor intersectionObserver.
2. app.component.ts: Updated checks for <quick-contact> | Added public bottomNotIntersecting: boolean; and public displayQuickContact: boolean; (check if intersecting with specific section in home page) | Added disconnect in ngOnDestroy for IntersectionObserver subscriptions.
2023-07-06 16:14:31 +03:00
Konstantina Galouni 1d6e5deeed Updating libraries before release 2023-07-05 12:18:53 +03:00
Konstantina Galouni 3b7af8f0b0 Merge pull request 'Merging explore-redesign branch into develop for Explore July release' (#1) from explore-redesign into develop
Reviewed-on: #1
2023-07-05 11:16:45 +02:00
Konstantina Galouni beece2680b Updating openaireLibrary before merging develop branch into explore-redesign 2023-07-05 11:43:08 +03:00
Konstantina Galouni 57a4ca5420 [Library & common-assets | explore-redesign]: addThis.component.ts: Replaced addthis external library with addtoany - addthis is no longer supported | general.less: css for addtoany social icons (classes .fully_rounded .a2a_svg). 2023-07-04 19:12:34 +03:00
Konstantina Galouni a6d24784fc [Library | explore-redesign]: dataProvider.service.ts & dataProvider.component.ts: Added method "getCollectedFulltexts()" in service and component to get and parse number of collected fulltexts from a new stats api - commented/ API is still in dev. 2023-07-04 19:10:15 +03:00
Konstantinos Triantafyllou 945b37f5b2 Merge branch 'explore-redesign' of code-repo.d4science.org:MaDgIK/explore-services into explore-redesign 2023-07-04 11:11:32 +03:00
Konstantinos Triantafyllou b30eba84bb Update libraries 2023-07-04 11:11:21 +03:00
Alex Martzios 38535403c5 WIP: create new funders page - TODO: intro content and responsive degisn of filters/sorting 2023-07-04 10:16:57 +03:00
Alex Martzios 6784c8ad62 update submodules 2023-06-08 10:55:22 +03:00
Alex Martzios 9974e9e1f4 update submodules 2023-06-07 11:09:56 +03:00
Konstantina Galouni 5f445e5c08 [Library | explore-redesign]: Bug fixes in what is executed when tabs of search all are clicked - formPlaceholderText and simpleKeywordChanged().
1. searchAll.component.ts: [Bug fix] From previous commit - Set formPlaceholderText outside if condition.
2. advancedSearchForm.component.ts: [Bug fix] In method "simpleKeywordChanged()", do not check for selectedEntity when !this.entitiesSelection (selectedEntity is changed only when exists <entities-selection>.
2023-05-19 19:09:37 +03:00
Konstantina Galouni dc248e999d [Library | explore-redesign]: Bug fix in sticky tabs of search all | Updated formPlaceholderText of search form in search all - different for each entity | Search form not sticky in advanced search page.
1. searchAll.component.ts:
   a. [Bug fix] Subscribe to layoutService.isMobile and calculate there the "offset" (for sticky tabs).
   b. Updated "formPlaceholderText" - different for each entity.
2. newSearchPage.component.html: Added check, so that search form is not sticky in advanced search pages.
2023-05-19 17:49:38 +03:00
Konstantina Galouni 9611021a55 [Library | explore-redesign]: Fixes in usage counts iframes, bip iframe, orcid buttons in search results, filters button in small screens and fos/sdgs vocabulary calls.
1. dataProvider.component.html & project.component.html & resultLanding.component.html: [Bug fix] Updated checks for usage counts iframes and changed the order they appear (first views, then downloads).
2. dataProvider.component.ts & project.component.ts:
   a. [Bug fix] Added fields public hasViews: boolean = false; and public hasDownloads: boolean = false; - used in checks for displaying usage counts iframes.
   b. [Bug fix] Updated parsing of dataProviderInfo.measure.counts when querying external usage counts api.
3. resultLanding.component.ts:
   a. [Bug fix] Added fields public hasViews: boolean = false; and public hasDownloads: boolean = false; - used in checks for displaying usage counts iframes.
   b. [Bug fix] In bipFrameUrl, when environment == "beta", add "&src=beta" parameter.
4. orcid-work.component.ts:
   a. [Bug fix] Updated disabled class checks, to enable orcid buttons in search too when there are identifiers.
   b. When loading - action is in progress, show loading icon next to the label.
   c. In my orcid links page: renamed "Add to ORCID" to "Claim" and "Delete from ORCID" to "Remove".
5. newSearchPage.component.html: [Bug fix] Updated checks for "filters" floating button in mobile/ small screens.
6. Added method "detectChanges()" to be called by html.
7. navigationBar.component.html: Updated placeholder of search-input to align with the generic search form (Home page).
8. ISVocabularies.service.ts: [Bug fix] In methods getFos() and getSDGs(), removed check and call to cache - these files are always local.
2023-05-19 14:37:23 +03:00
Alex Martzios 9be9d575a3 update submodules 2023-05-19 11:32:14 +03:00
Konstantina Galouni 392cac52f2 [Library | explore-redesign]: Hide numbers of entity tabs on mobile screens | Bug fix in search filters.
1. searchFilter.component.ts: [Bug fix] In method "filterKeywords()", set hasMatch and call detectChanges(), only if !hasMatch.
2. searchAll.component.html: Hide numbers of entity tabs on mobile screens.
2023-05-16 14:29:31 +03:00
Konstantina Galouni e012c5c77c [Library | explore-redesign]: Bug fixes in range filter, advanced search link of search all page, search results "cards" in mobile screens.
1. rangeFilter.component: [Bug fix] Removed from method get disabled() check of isDisabled and added this check for class "disabled" in action/button (error on enter, because isDisabled was already true before triggering the action of yearChanged).
2. search-input.component.ts: [Bug fix] Added check for client side in ngAfterViewInit(), before calling "getComputedStyle".
3. searchAll.component:
   a. Set "advancedSearchLink" properly and pass it to each search entity page in "simpleSearchLink" parameter.
   b. In <advanced-search-form>, pass parameters [entityType]="activeEntity" and [advancedSearchLink]="advancedSearchLink" [advancedSearchLinkParameters]="parameters".
4. advancedSearchForm.component.html: Removed check this.entityType == this.selectedEntity from advanced search link.
5. searchFilter.component.ts: In filterKeywords() method, added cdr.detectChanges().
6. searchResult.component.html: [Bug fix] Reverted [isMobile] parameter to <result-preview" (removed by mistake in a previous merge).
2023-05-16 12:28:35 +03:00
Konstantina Galouni 7dbb5358d6 [Library & Explore | explore-redesign]: Renamed "OpenAIRE Research Graph" to "OpenAIRE Graph" | Fixed duplicate queries in search all | Updated paper in FoS page | Improvements in sticky tabs (search all & landing).
1. Deleted assers/explore-assets/home/graph.svg - Replaced by assets/common-assets/common/graph-nodes.svg.
2. home.component.html:
   a. Updated graph image.
   b. Added in <div search-input>: [searchInputClass]="'inner background'".
   c. Renamed "OpenAIRE Research Graph" to "OpenAIRE Graph".
3. claimResultSearchForm.component.html & searchDataprovidersToDeposit.component.ts: Added in <div search-input>: [searchInputClass]="'inner background'".
4. searchAll.component.html:
   a. Updated margins/paddings for sticky tabs.
   b. Renamed "OpenAIRE Research Graph" to "OpenAIRE Graph".
5. searchAll.component.ts:
   a. [Bug fix] In method ngOnInit(), moved loadAll() call inside check - avoid duplicate calls to search for each tab with count query.
   b. Renamed "OpenAIRE Research Graph" to "OpenAIRE Graph".
6. fos.component.html:
   a. Updated paper of SciNoBo - replaced the old one with the newest.
   b. Renamed "OpenAIRE Research Graph" to "OpenAIRE Graph".
7. fos.component.ts: Renamed "OpenAIRE Research Graph" to "OpenAIRE Graph".
8. resultLanding.component.html & project.component.html & organization.component.html & dataProvider.component.html: [Improvement] Updated check and class for <landing-header> when sticky - make it invisible, when not sticky - solved flickering and change of content position.
9. showTitle.component.ts: Added @Input() isSticky: boolean = false; and when sticky, show only 1 line of the title (class lines-1).
10. landing-header.component.ts: Show only title when sticky and pass isSticky to <showTitle>.
2023-05-15 17:28:33 +03:00
Alex Martzios f63e83258d update submodules 2023-05-15 13:09:53 +03:00
Konstantina Galouni d0a5c3b469 [Library | explore-redesign]: Moved <quick-selections> to the left as filter and re-arranged the order of the filters.
1. searchFields.ts:
   a. Added in HIDDEN_FIELDS, "instancetypename" (refine filter for research products).
   b. In DEPENDENT_FIELDS, set ["instancetypename"]: "type"
2. quick-selections.component.ts: Added again (as in the past), @Input() vertical: boolean=false and show types using <search-filter> if vertical is true.
3. searchAll.component.html: Changed medium top and bottom margins to uk-margin-top uk-margin-bottom.
4. newSearchPage.component.ts:
   a. In method "getFields()", check for HIDDEN_FIELDS, also dependencies to resultTypes.
   b. Added method "getFilterById()".
5. newSearchPage.component.html:
   a. Moved <quick-selections> to the left as filter (removed "include" line).
   b. Added <ng-template #search_filter> and re-arranged the order of the filters
2023-05-12 18:52:13 +03:00
Konstantinos Triantafyllou 58fc4f84c2 Update Uikit version to 3.13.10. Update library and theme 2023-05-12 17:29:13 +03:00
Alex Martzios dc21fd528d update submodules 2023-05-12 15:55:32 +03:00
Alex Martzios 0d9688a980 update submodules 2023-05-12 14:00:52 +03:00
Konstantina Galouni 3047236d1c [Library & openaire-theme & Explore | explore-redesign]: Added search form in menu (navbar) in landing pages.
1. search.less: Added css for modifier .small-vertical for .input-wrapper of <search-input>.
2. layout.service.ts: Added hasMenuSearchBarSubject: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false), parsing and getter/setter methods.
3. navigationBar.module.ts: Imported SearchInputModule.
4. navigationBar.component.ts:
   a. Added searchMode: boolean = false; and hasSearchBar: boolean = false; (and other helpful fields)
   b. Subscribe to queryParams to hide search bar and reset keyword | Subscribe to layoutService.hasMenuSearchBar to check if search should be included in navbar or not.
   c. Added methods "openSearch()" to show the search form and "goTo()" to trigger the search action and navigate to the search page.
5. navigationBar.component.html: Added <div search-input> and search-icon button to show search bar | Added checks if searchMode is enabled (search form visible) or not.
6. app-routing.module.ts: In routes for landing pages added in data: hasMenuSearchBar: true.
2023-05-11 17:17:16 +03:00
Alex Martzios bdad7dc6e6 update submodules 2023-05-11 12:42:35 +03:00
Alex Martzios 7722b6f968 update submodules 2023-05-11 10:56:55 +03:00
Alex Martzios 2d859f03e5 update submodule 2023-05-10 16:35:28 +03:00
Alex Martzios fae5a4bc5b search page: remove all various search pages and keep only 'search all' - TODO: redirect old ?active=<entity> to the new path, update submodules 2023-05-10 15:10:40 +03:00
Konstantina Galouni 2da6b5f360 [Library | explore-redesign]: Added/ updated how filters appear in mobile screens | Updated search forms.
1. general.less: Added fixed position for .filters-toggle-button.
2. newSearchPage.component.html: Added floating button for filters in mobile screens.
3. advancedSearchForm.component.html: Re-introduced commented out <entities-selection> inside <advanced-search-input> | Removed iconPosition and commented button for filters inside search form.
4. home.module.ts: Imported SearchInputModule.
5. home.component.html: Replaced <advanced-search-input> with <div search-input>
6. searchDataProviders.component.ts: Set entitiesSelection to false for <new-search-page>
7. newSearchPage.component.ts & searchAll.component.html: Set entitiesSelection to false for <advanced-search-form>
2023-05-08 17:10:51 +03:00
Konstantina Galouni 0774efbb0d [Library | explore-redesign]: availableOn.component.ts & resultLanding.component & result-preview.component: [Bug fix] Added method "getAccessLabel()" to create label from accessRight. 2023-05-08 16:41:42 +03:00
Konstantina Galouni b49e000020 [Library | explore-redesign]: Updated icon for "not available" access of sources on research products.
1. icons.ts: Added custom icon "unknown_access", when access is not available (locker with questionmark inside).
2. parsingFunctions.class.ts: Set "accessRightIcon" of each source to "unknown_access" icon, when access is not available.
3. resultLandingUtils.module.ts: Added "unknown_access" icon in iconsService.registerIcons.
4. resultLanding.component.html: Mobile view: Updated tooltip of access - added "access" word in the end.
5. availableOn.component.ts: Updated tooltip of access - added "access" word in the end.
6. result-preview.component.html: In mobile view, show access on the top right, next to the title.
7. searchResearchResults.service.ts: [Bug fix] Call parsingFunctions.addPublisherToHostedBy_collectedFrom after parsing journal, publisher and identifiers.
2023-05-08 10:53:38 +03:00
Alex Martzios 6d59e508ba update submodules 2023-05-04 15:15:56 +03:00
Alex Martzios a7e56df08a update submodules 2023-05-04 11:58:23 +03:00
Alex Martzios 650ded2050 update submodules 2023-05-02 12:47:56 +03:00
Alex Martzios 1d8a48ef78 update submodules 2023-05-02 12:11:36 +03:00
Alex Martzios 411720917b update submodules 2023-05-02 12:00:50 +03:00
Alex Martzios caeb15f927 update submodules 2023-04-26 12:28:59 +03:00
Alex Martzios 58d5481166 update submodules 2023-04-25 13:11:47 +03:00
Alex Martzios 35ed4cf5be update submodules 2023-04-25 13:02:42 +03:00
Alex Martzios b3934411ca update submodules 2023-04-21 13:37:36 +03:00
Alex Martzios ebf26d66cf home page: simplify search bar - remove 2 steps, update submodules 2023-04-21 11:05:05 +03:00
Alex Martzios 0b92ad3725 update submodule 2023-04-10 14:06:51 +03:00
Alex Martzios a0fa5002c9 add advanced search option in home page 2023-04-10 12:13:58 +03:00
Alex Martzios b1aed8224a update submodule 2023-04-10 11:51:31 +03:00
Konstantina Galouni 2190234ba0 [Explore | explore-redesign]: package.json: Upgraded uikit version from 3.12.0 to 3.12.2. 2023-04-06 21:50:20 +03:00
Alex Martzios cf069d2550 update submodule 2023-04-06 12:46:59 +03:00
Konstantina Galouni 0db79b0ffd Merge remote-tracking branch 'origin/develop' into explore-redesign 2023-04-06 12:10:27 +03:00
Konstantina Galouni 40d0a2a24c Updating openaireLibrary and openaire-theme library before merging develop branch into explore-redesign 2023-04-06 12:10:09 +03:00
Konstantina Galouni e36d6d5ed3 Updating common-assets library before merge. 2023-04-05 18:34:51 +03:00
Alex Martzios 2ba2990479 update submodules 2023-03-31 13:28:43 +03:00
Alex Martzios fdc3cc76b0 update submodules 2023-03-28 11:37:53 +03:00
Alex Martzios 5f66f3cdc1 update submodule 2023-03-27 16:32:55 +03:00
Alex Martzios 21aeaf0efa update submodules 2023-03-27 13:03:25 +03:00
Konstantinos Triantafyllou 36f4bd1c60 Utils Service: Change user info property. 2023-03-23 10:41:37 +02:00
Konstantina Galouni a3194bb41a [Library | explore-redesign]: result-preview.component.html: [Bug fix] Added [relationName]="relationName" [provenanceAction]="provenanceAction" in <entity-metadata> to expose these info in Related Research in Result landing pages. 2023-03-16 13:57:33 +02:00
Alex Martzios 866d40cff1 update submodules 2023-03-01 16:49:51 +02:00
Konstantina Galouni 3490594513 [Library | explore-redesign]: Fixes in direct linking - back button link | Added back button link to the landing page for projects.
1. linkingGeneric.component.html: [Bug fix] Updated checks for back to result landing page button link | Added back to project landing page button link.
2. directLinking.component.ts: In "createClaimEntity()" method, set value of entity.project.url.
3. ClaimEntityTitle.component.ts: Added "uk-flex" class to middle align icon to the name.
4. claimHelper.class.ts: Commented a console.log.
2023-03-01 11:59:48 +02:00
Alex Martzios 4f6529b46f project landing mobile redesign, update submodule 2023-02-23 13:10:30 +02:00
Konstantina Galouni e0e319119f [Library | explore-redesign]: In small screens (mobile) open full screen modal when viewing all authors or all identifiers.
1. showAuthors.module.ts: Imported FullScreenModalModule.
2. showAuthors.component.ts & showIdentifiers.component.ts: Added @Input() isMobile: boolean = false; | Added <fs-modal> for view all authors, to trigger it when isMobile.
3. landing-header.component.ts: Added @Input() isMobile: boolean = false; | Pass input param isMobile to <showAuthors>.
4. resultLanding.component.html: Pass input param isMobile to <showSubjects>, <showIdentifiers>, <landing-header>.
2023-02-22 23:13:46 +02:00
Konstantina Galouni e93022c7dd [Library | explore-redesign]: Mobile redesign for organization landing complete and functional.
1. loadingModal.module.ts: Imported LoadingModule.
2. loading.component.ts:
   a. [Bug fix] loading icon (spinner) was not visible.
   b. Added inputs title: string, @Input() isMobile: boolean = false, @Input() classTitle: string = "uk-background-primary uk-light".
   c. Added html for small screens (mobile) when isMobile.
3. search-tab.component.ts: Added @Input() public isMobile: boolean = false and [class.uk-flex-column]="isMobile" to not show title and view all link in the same row when isMobile.
4. organization.module.ts: Imported FullScreenModalModule.
5. organization.component.ts & organization.component.html: Mobile redesign complete and functional.
2023-02-22 00:09:12 +02:00
Alex Martzios 94ddb1f017 update submodule 2023-02-21 19:13:31 +02:00
Konstantina Galouni a7e63f05ae [Library | explore-redesign]: Mobile redesign minor fixes for actions icons.
1. availableOn.component.ts: Make "arrow_right" and access right icons bigger in for mobile.
2. resultLanding.component.html: Set same ratio in all actions icons.
3. orcid-work.component.ts: Add margin small (not xsmall) when isMobile and landing.
2023-02-21 17:07:24 +02:00
Konstantina Galouni 4235621315 [Library | explore-redesign]: Mobile redesign for the 3 buttons at the bottom (main info, metrics, actions) and their contents.
1. availableOn.component.ts: Mobile redesign - open in full screen modal instead of drop | icons updated.
2. fos.component.ts: In mobile show {{title}} instead of hardcoded title.
3. resultLandingUtils.module.ts: Imported FullScreenModalModule.
4. deletedByInference.component.ts: Removed class "uk-list-divider" for <result-preview> - after redesign each result has its own bottom border.
5. orcid.module.ts: Imported FullScreenModalModule.
6. orcid-work.component.ts: Mobile redesign - Added full screen modals propagationFsModal and grantFsModal.
7. resultLanding.component.ts: Added citeFsModal, addThisFsModal, alertModalDeletedByInferenceFS and property public mobileContent: "info" | "metrics" | "actions" = "info".
8. resultLanding.component.html: Mobile redesign for the 3 buttons at the bottom (main info, metrics, actions).
2023-02-21 16:10:21 +02:00
Alex Martzios 08bc9741b8 update submodule 2023-02-21 15:06:49 +02:00
Alex Martzios 1dc6f9b1a4 update submodule 2023-02-20 19:29:39 +02:00
Konstantina Galouni b347ea300b [Library | explore-redesign]: Result landing redesign for small screens (mobile) - main info & tabs of main info.
1. fos.component.ts & sdg.component.ts: Added Beta badge and "View all" link.
2. fundedBy.component.ts: Added @Input isMobile and relative checks in html | Updated how projects appear in mobile | Added ng-template for #funder and #dropInfo.
3. relatedTo.component.ts: Added @Input isMobile and relative checks in html | Added uk-margin-small-bottom between communities in mobile.
4. showSubjects.component.ts:
   a. Added @Input isMobile and relative checks in html.
   b. Added @Input() viewAllSubjects: boolean = false, @Input() viewAllClassifiedSubjects: boolean = false, @Output() viewAllClicked  = new EventEmitter(); and methods "viewAllSubjectsClicked()", "viewAllSubjectsByVocabularyClicked()" to show subjects properly in mobile.
5. full-screen-modal.component.ts: Added method "backClicked()" and field public stayOpenInBack: boolean = false.
6. resultLanding.module.ts: Imported FullScreenModalModule.
7. resultLanding.component.ts & resultLanding.component.html: Redesign for small screens (mobile) for main info and its tabs (Summary, References, etc..).
2023-02-20 17:56:02 +02:00
Alex Martzios 35d59d4c4c update submodule 2023-02-20 16:34:25 +02:00
Konstantina Galouni 6199afde33 [Explore & Library | explore-redesign]: searchResearchResults.service.ts: [Bug fix] Fix parsing of hostedBy_collectedFrom (download from/source) - initialize, add journal and sort outside the loop. 2023-02-18 03:44:30 +02:00
Alex Martzios ed4edc1b9f update submodule 2023-02-17 19:08:52 +02:00
Alex Martzios 2c759d2f15 update submodules 2023-02-16 13:00:18 +02:00
Konstantina Galouni d4b9d4954e [Explore & Library | explore-redesign]: First update for direct linking according to redesign.
1. claimContextSearchForm.component.ts & claimProjectSearchForm.component.ts & claimResultSearchForm.component.ts: Added "@Input() public centerAlign: boolean = false".
2. claimContextSearchForm.component.html & claimProjectSearchForm.component.html & claimResultSearchForm.component.html: align search form to the center if centerAlign is true (in direct linking).
3. linkingGeneric.component.ts:
   a. Scroll to top smoothly when changing step.
   b. Added method "getEntityName()" to resolve entity name from entity type.
4. linkingGeneric.component.html: Redesign in direct linking:
   a. Hidden stepper.
   b. Title before search form
   c. Back button instead of breadcrumb.
   d. Search form aligned to the center.
   e. In basket, no tabs, but source on top of link source to.
   f. Button to Step 3 renamed to "Summarise".
5. HelperFunctions.class.ts: In methods "scroll()" and "scrollTo()" added parameter "smooth: boolean = false" for smooth scroll.
6. tsconfig.json: Commented "angularCompilerOptions": { "strictTemplates": true}.
2023-02-15 23:56:16 +02:00
Alex Martzios c1bb343097 add strictTemplates: true option in angularCompilerOptions (VS Code needs this for proper angular-language features to work), update submodules 2023-02-13 15:52:22 +02:00
Alex Martzios cbf1a5c6d6 update submodule 2023-02-08 11:43:59 +02:00
Alex Martzios 1389b9d934 add new property for BIP charts API, update submodules 2023-02-08 11:21:49 +02:00
Alex Martzios 0623defdb6 start on result landing mobile redesign, update submodules 2023-01-24 15:33:37 +02:00
Alex Martzios d2bfe2560c update submodules 2023-01-23 16:19:14 +02:00
Konstantina Galouni a1f9e47874 [Explore] Updating libraries... 2023-01-18 23:15:17 +02:00
Alex Martzios 2d8de7b5a5 update submodules 2023-01-13 15:57:40 +02:00
Alex Martzios b5bf06b7f2 tweaks for subnav styling, update submodules 2023-01-13 08:32:47 +02:00
Konstantina Galouni 0377810717 [Explore | master & Library | angular-14]: composer.ts: [Bug fix] Add parenthesis around ternary operator in method composeEmailForExplore() - empty or wrong body | contact-us.component.html: Added #captchaElem in <re-captcha> | contact-us.component.ts: Added ViewChild for captchaElem and added method "resetRecaptcha()" | contact.component.html: Added #contactUs in <contact-us> | contact.component.ts: Added ViewChild for contactUs and call contactUsComponent.resetRecaptcha() on reset method. 2023-01-10 02:25:03 +02:00
Alex Martzios a02255548d update submodules 2023-01-09 18:35:48 +02:00
Alex Martzios 3a3a503c70 update submodules 2022-12-20 15:27:42 +02:00
Konstantina Galouni d715e0a281 [Library | angular-14]: loading.component.ts: [Bug fix] In ngOnDestory changed to document.getElementById("modal-container"). 2022-12-16 17:21:37 +02:00
Konstantina Galouni 448a67b9fb [Library | angular-14 & Explore | master]: Updated request to Crossref for bulk uploaded DOIs in linking | Added link for more information to joomla article (Canada's request).
1. sdg.component.html: Added link for more information to joomla article (Canada's request).
2. timeout-interceptor.service.ts: Excluded from timeout interceptor  properties.searchCrossrefAPIURL and properties.searchDataciteAPIURL.
3. searchDatacite.service.ts: In method "getDataciteResultByDOI()", for requests coming from file uploaded in linking added timeout to 20 sec, and for other requests timeout similar to the interceptor (6 sec for production, 12 otherwise).
4. searchCrossref.service.ts: In method "searchCrossrefByDOIs()", added timeout similar to the interceptor (6 sec for production, 12 otherwise) | Added method "searchCrossrefByDOI()", called for requests coming from file uploaded in linking.
5. bulkClaim.component.ts: Call new API method for Crossref requests for DOIs | Fixed tooltip to appear.
2022-12-16 09:59:48 +02:00
Alex Martzios 4a4a251a2e Merge remote-tracking branch 'origin/master' into explore-redesign 2022-12-13 11:10:46 +02:00
Konstantina Galouni e04f0af2e2 [Explore]: home.module.ts: Removed arrow_right icon from iconsService.registerIcons and from import. 2022-12-13 11:07:16 +02:00
Alex Martzios 3b23a1c0eb publish new branch, update submodules 2022-12-13 11:00:22 +02:00
Konstantina Galouni 44ee139a1a [Library | angular-14]: resultLanding.component.ts: [SEO] Added more keywords in "title_authors_words" (method checkIfAllowed()), to not index records containing them in the title or authors. 2022-12-05 12:36:53 +02:00
Konstantina Galouni 200c84044a Updating common-assets 2022-11-30 18:01:45 +02:00
Konstantina Galouni 7bc1cb7f24 [Explore | angular-14] environment.ts: Property claimsAPIURL updated in development. 2022-11-30 17:27:26 +02:00
Konstantina Galouni 446f0df950 Updating libraries... 2022-11-29 23:53:07 +02:00
Konstantina Galouni 42d002f6ff [Explore | angular-14]: environment.ts: Updated loginUrl, userInfoUrl, logoutUrl properties (19080 port). 2022-11-29 23:51:59 +02:00
Alex Martzios a9733427e8 reintroduce numbersComponent in homepage, update submodules 2022-11-08 14:32:44 +02:00
Konstantina Galouni 4b6a383154 [Library]: #7883 - searchResearchResults.service.ts: Added parsing for C1-C5 classes | result-preview.component.less: Added css rules for C1-C5 classes in <measure> (influence/popularity) 2022-11-07 17:14:01 +02:00
Konstantina Galouni 75fdfe1491 Merged origin/master into angular-14 branch 2022-11-07 13:10:52 +02:00
Konstantina Galouni cb7de49f89 Updated libraries 2022-11-07 13:07:44 +02:00
Konstantina Galouni 93abf84ee4 Updated libraries 2022-11-07 13:06:01 +02:00
Alex Martzios b01e3f8ca8 create fos/sdg components to call library components in order to use extra parameters, update submodules 2022-11-03 16:05:26 +02:00
Alex Martzios 89ace01826 remove fos/sdg assets, vocabulary and components from explore project, update submodules 2022-11-03 12:22:18 +02:00
Alex Martzios 9d755ff1db tweak options for footer observer 2022-11-01 13:36:36 +02:00
Alex Martzios ab302e040f remove options from footer observer 2022-11-01 13:27:21 +02:00
Alex Martzios a358686a3d remove help button when reaching footer by scroll, update submodules 2022-11-01 11:29:40 +02:00
Alex Martzios b3ac3b3391 help button: release at the bottom, update submodules 2022-10-31 14:01:13 +02:00
Konstantina Galouni 732e96512d [Library]: timeout-interceptor.service.ts: #8186 - Added properties.claimsAPIURL in TIMEOUT_WHITELIST to exclude claims requests from timeout interceptor. 2022-10-26 13:49:01 +03:00
Konstantina Galouni 578b79b1c2 Merged with origin/master 2022-10-26 00:11:48 +03:00
Konstantina Galouni cbdfada293 Updated libraries 2022-10-25 23:52:56 +03:00
Alex Martzios 4d35658d05 update submodules 2022-10-25 17:22:06 +03:00
Konstantina Galouni e6cfab5646 [Explore]: fos.component.html: Updated doi link of SciNoBo. 2022-10-19 18:57:36 +03:00
Konstantina Galouni 120774c414 [Library]: claimResultSearchForm.component.html & claimProjectSearchForm.component.html & claimContextSearchForm.component.html: Set tooltip=true in search input form. 2022-10-18 15:55:16 +03:00
Alex Martzios 55bd190ec8 FOS page: add horizontal navigation tabs for mobile/tablet 2022-10-18 15:31:37 +03:00
Konstantina Galouni 25a92c827c [Explore & Library]: home.component.html & advancedSearchForm.component.html & claimContextSearchForm.component.html & claimProjectSearchForm.component.html & claimResultSearchForm.component.html: Increased width of search forms and fixed width of each step of stepper input. 2022-10-18 15:28:04 +03:00
Konstantina Galouni 2faf2202fe Merge branch 'master' of code-repo.d4science.org:MaDgIK/explore-services 2022-10-12 16:37:12 +03:00
Konstantinos Triantafyllou 4db4795a04 Change inverse text primary 2022-10-12 16:36:37 +03:00
Konstantina Galouni 285c65e3f2 [Explore]: orcid-work.component.ts: [Bug fix] Added [size]="'small'" input to <loading> | environment.ts: Updated port of orcidAPIURL (standalone service). 2022-10-12 16:36:33 +03:00
Alex Martzios 6380311b1e add fixed contact/help button 2022-10-12 15:31:34 +03:00
Konstantinos Triantafyllou dc1f947d7a Fos: Change search-modifier, make some page alignments and add observer to handle scroll 2022-10-12 12:25:47 +03:00
Alex Martzios 98effe34a0 update FOS page, change to new uoa-admin-tools duffy port 2022-10-10 17:20:51 +03:00
Konstantina Galouni 0c0ba653cc Updating openaireLibrary 2022-10-05 17:59:11 +03:00
Konstantina Galouni a3d560a984 Merge remote-tracking branch 'origin/angular-13' into angular-14 2022-10-04 16:13:55 +03:00
Konstantina Galouni e3cd34e44d Merge remote-tracking branch 'origin/angular-13' into angular-14 2022-10-04 15:42:50 +03:00
Konstantina Galouni de3adf74d5 Merge remote-tracking branch 'origin/angular-13' into angular-14 2022-10-04 13:57:02 +03:00
Konstantina Galouni 73726abeca Updating libraries 2022-10-04 13:56:53 +03:00
Konstantina Galouni 991e05693e [Explore | angular-14]: angular.json: Updated optimization configuration to set "inlineCritical": false. 2022-10-03 16:22:08 +03:00
Konstantinos Triantafyllou be7c535518 Disable critical inline css in server.ts 2022-10-03 12:40:35 +03:00
Konstantinos Triantafyllou d03db02103 Merge from angular 13 2022-09-29 10:49:10 +03:00
Alex Martzios 91b482e51e Update recaptcha to version 10.0.0 2022-09-26 16:59:06 +03:00
Alex Martzios 85ad4b94bd add .angular folder to gitignore 2022-09-23 16:04:51 +03:00
Alex Martzios b220fe81c3 update submodules to v14, add .angular folder to gitignore and after-build-clean, add pathMatch: 'full' to routing configuration 2022-09-23 16:04:13 +03:00
Alex Martzios 907b4e9512 update angular express engine to v14 2022-09-23 15:53:16 +03:00
Alex Martzios d0f24a40fd update angular material to v14 2022-09-23 15:52:25 +03:00
Alex Martzios 94a59dc5a6 update angular core and cli to v14 2022-09-23 15:51:21 +03:00
257 changed files with 2710 additions and 4618 deletions

1
.gitignore vendored
View File

@ -1,4 +1,5 @@
.idea
**/.angular/
**/node_modules
**/package-lock.json
**/.idea

218
explore/CHANGELOG.md Normal file
View File

@ -0,0 +1,218 @@
# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
*For each release, use the following sub-sections:*
- *Added (for new features)*
- *Changed (for changes in existing functionality)*
- *Deprecated (for soon-to-be removed features)*
- *Removed (for now removed features)*
- *Fixed (for any bug fixes)*
- *Security (in case of vulnerabilities)*
## [production-release-august-2024] - 2024/08/01
### Changed
* Hide L3 & L4 from FoS (Fields of Science page, Detailed page, Advanced search page)
* Search page: Reordered buttons - moved compact results button before download button
## [production-release-july-2024] - 2024/07/11
### Changed
* Parse instances new info (to delete deletedbyinference records)
* Detailed page: Remove subjects by vocabulary section and show all subjects under keywords
### Fixed
* Updated vocabulary for Fields of Science level 4
* Linking: Do not add unidentified code in queries - missing irish funders
### Added
* Funders page: More information in cards (i.e. country, registered)
* Funders page: New sorting options by research products & projects
* Links between Research products and Data sources
* Design of compact search results
## [production-release-june-2024] - 2024/06/04
### Changed
* Filter out unidentified projects from the search page and related tabs in detailed pages
* Updated link functionality for funding: search either by selecting funder or directly for projects
### Fixed
* Search results: adjust message when >= 1000 relations in the metadata line
* Fixed message on "Related Data Sources" tab of Data source detailed page
* Query 100 top values when a value of the filter is selected (bug when selected not in top 7 values)
## [production-release-may-2024] - 2024/05/23
### Changed
* Restored in search pages: number of results & selected keyword
* Performance improvements: onPush Strategy for checking when there are content changes in search results
* Updated color of filter labels & set color of "x" on filter labels same as the text
* Updated cards in funders page
### Fixed
* Filters in claims (projects) always loading
* z-index issue in dropdown (ORCID) inside modal (authors)
* Close dropdown of ORCID author when clicking on the search button
* Replaced /projects search endpoint with /resources2?type=projects in project claims
### Added
* Link directly with funding (unidentified projects)
* Display organization persistent identifiers (search results & detailed page)
* Search & Advanced search organizations by pid
* Display full organization names in search organizations page
* Added level4 FoS in fos.json vocabulary
## [production-release-march-2024] - 2024/03/04
### Changed
* Performance improvements
* Search pages: Access Routes, impact-based indicators, usage counts: Open drops on click, instead of hover
* Linking: change Datacite api from /works to /dois
* Updated funding text in footer
* Removed tooltips from search results
* UI updates on search pages
* Paging only at the bottom under the search results
* Removed number of results
* Removed results per page option
### Fixed
* z-index issue in dropdowns inside modals
* Change search tab from menu
* Requests in bulk DOIs upload in linking
* View all for search filters
* Research products detailed page: Provenance label in funded by
### Added
* Full-Text link in Research products
## [production-release-february-2024] - 2024/02/12
### Changed
* Remove "open access" as preselected filter
* Rounded numbers in search tabs
* Home page: Performance improvements on images loading
* Home page, Search page, Funders page: Performance improvements on services requests
### Fixed
* Filtering out in funding levels according to selected funder when querying 100 values
* Filters in claims & in organization landing > projects tab were always loading
* Research products landing page: Added providers in versions
* SEO fixes in landing pages
## [production-release-january-2024] - 2024/02/01
### Changed
* Updated FoS search filter - do not display code
* Removed "BETA" indication from FoS
* Access search filter: Display always all the predefined values
* Filters: remove number of values
* Filters: Get 7 value (display 6) and 100 on "view more" click
* My claims: remove urls for pending claims
* Improve queries for search organizations & data sources
### Fixed
* Search query with input full ORCID url or just ORCID id
* In search, added also in count query for data sources the datasource pid check
* Landing: min-height needed in metrics box
### Added
* Linking: responsive in mobile
## [production-release-november-2023-v2] - 2023/11/28
### Added
* Add sorting options with impact factors in search results page
### Changed
* Data source landing: get collected full texts from new stats API
* Updated parsing of measures - in results: views/downloads per data source
### Fixed
* Updated query for funders number in Funders page
* Updated query for funders number is first page
* Advanced Search Results: funder field to return all funders
* Advanced Search Projects: funder field to return all funders
## [production-release-november-2023] - 2023/11/09
### Added
* Missing funders' logos locally in Explore assets
### Changed
* Deposit search page: UI improvement in “Go to repository” button
### Fixed
* Reverted version of UIkit back to version 3.16.24 - previous version caused bug with dropdowns
## [production-release-october-2023] - 2023/10/18
### Added
* Search page: Add view more option on overflow (e.g authors, partners, subjects, projects)
### Changed
* Upgrade to Angular 16
* New Claims API
* New Funders Page
### Fixed
* Reverted version of UIkit to version 3.16.14 because of parallax
* A persistent identifier can resolve in more than one pid types
## [production-release-september-2023] - 2023/09/25
### FIXED
* Error on grant access in ORCID Search & Link Wizard
* Added missing id in linking from the project landing
* Added check in search data sources parsing
## [production-release-august-2023] - 2023/08/25
### Added
* Search mobile: Added actions
* Detailed pages - mobile: Added search-bar
* Mobile: new drops and dropdowns
### Changed
* Linking: Redesign of results view
* Advanced search form: Add autocomplete input for eosc subject field
* Detailed pages - mobile: UI updates & improvements
### Fixed
* Advanced search and detailed page
* Added a necessary check in html of detailed pages
## [production-release-may-2023] - 2023/05/19
### Added
* Detailed research products page: Added suggest modals for Sustainable Development Goals and Fields of Science
* Get research products, projects & data sources usage counts from index
### Changed
* Redesign of detailed pages and mobile version
### Fixed
* Fix path for fos/sdg vocabularies in advanced search
* Search page improvements
* UI updates & improvements in search results and detailed pages (minor)
## [production-release-january-2023] - 2023/01/18
### FIXED
* Contact us form: Email body was either empty or incomplete
* Contact us page: After sending an email, clear recaptcha
## [production-release-december-2022] - 2022/12/21
### Added
* Link to blog in Sustainable Development Goals page
### Changed
* SEO updates and mobile menu
### Fixed
* Linking: Changed Crossref requests for bulk uploaded DOIs
* Medium screens: not sticky navbar causing error
## [production-release-november-2022] - 2022/11/30
### Added
* EOSC subjects from eoscifguidelines field & Advanced field "EOSC Subject"
* New Contact us page
### Changed
* Upgrade to Angular 14
* Refinement of filters
* Advanced search form: UI updates and smooth scrolling
* FoS and deposit pages updates
* Bip Finder: Updated parsing and labels for Bip Finder scores & updated link to BiP Finder

View File

@ -1,6 +1,6 @@
# Explore
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.3.10 and has been updated to 11.2.14.
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.3.10 and has been updated to 16.1.7.
## Install packages

View File

@ -52,6 +52,8 @@
],
"styles": [
"src/styles.less",
{"input": "src/assets/deposit.less", "inject": false },
{"input": "src/assets/funders.less", "inject": false },
"src/assets/common-assets/library-css/material.scss"
],
"scripts": [
@ -68,7 +70,14 @@
},
"configurations": {
"development": {
"optimization": true,
"optimization": {
"scripts": true,
"styles": {
"minify": true,
"inlineCritical": false
},
"fonts": true
},
"outputHashing": "all",
"sourceMap": false,
"namedChunks": false,
@ -94,7 +103,14 @@
"with": "src/environments/environment.test.ts"
}
],
"optimization": true,
"optimization": {
"scripts": true,
"styles": {
"minify": true,
"inlineCritical": false
},
"fonts": true
},
"outputHashing": "all",
"sourceMap": false,
"namedChunks": false,
@ -139,7 +155,14 @@
"with": "src/environments/environment.beta.ts"
}
],
"optimization": true,
"optimization": {
"scripts": true,
"styles": {
"minify": true,
"inlineCritical": false
},
"fonts": true
},
"outputHashing": "all",
"sourceMap": false,
"namedChunks": false,
@ -184,7 +207,14 @@
"with": "src/environments/environment.prod.ts"
}
],
"optimization": true,
"optimization": {
"scripts": true,
"styles": {
"minify": true,
"inlineCritical": false
},
"fonts": true
},
"outputHashing": "all",
"sourceMap": false,
"namedChunks": false,
@ -246,13 +276,16 @@
"main": "server.ts",
"tsConfig": "src/tsconfig.server.json",
"sourceMap": true,
"optimization": false
"optimization": false,
"buildOptimizer": false
},
"configurations": {
"development": {
"outputHashing": "media",
"sourceMap": false,
"optimization": true
"optimization": true,
"vendorChunk": true,
"buildOptimizer": true
},
"test": {
"outputHashing": "media",
@ -263,7 +296,8 @@
}
],
"sourceMap": false,
"optimization": true
"optimization": true,
"buildOptimizer": true
},
"beta": {
"outputHashing": "media",
@ -274,7 +308,8 @@
}
],
"sourceMap": false,
"optimization": true
"optimization": true,
"buildOptimizer": true
},
"production": {
"outputHashing": "media",
@ -285,7 +320,8 @@
}
],
"sourceMap": false,
"optimization": true
"optimization": true,
"buildOptimizer": true
}
},
"defaultConfiguration": ""
@ -338,5 +374,7 @@
}
}
},
"defaultProject": "explore"
"cli": {
"analytics": false
}
}

View File

@ -19,46 +19,47 @@
"build:ssr-beta": "npm run build-beta && ng run explore:server:beta",
"build:ssr-prod": "npm run build-prod && ng run explore:server:production",
"prerender": "ng run explore:prerender",
"after-build-clean": "rm -rf dist/explore/browser/assets/common-assets/.git/ src/app/openaireLibrary/.git node_modules src/assets/common-assets/.git/ .git .idea"
"after-build-clean": "rm -rf dist/explore/browser/assets/common-assets/.git/ src/app/openaireLibrary/.git node_modules .angular src/assets/common-assets/.git/ .git .idea"
},
"private": true,
"dependencies": {
"@angular/animations": "~13.3.11",
"@angular/cdk": "^13.3.9",
"@angular/common": "~13.3.11",
"@angular/compiler": "~13.3.11",
"@angular/core": "~13.3.11",
"@angular/forms": "~13.3.11",
"@angular/localize": "^13.3.11",
"@angular/material": "^13.3.9",
"@angular/platform-browser": "~13.3.11",
"@angular/platform-browser-dynamic": "~13.3.11",
"@angular/platform-server": "~13.3.11",
"@angular/router": "~13.3.11",
"@nguniversal/express-engine": "^13.1.1",
"@angular/animations": "^16.1.7",
"@angular/cdk": "^16.1.6",
"@angular/common": "^16.1.7",
"@angular/compiler": "^16.1.7",
"@angular/core": "^16.1.7",
"@angular/forms": "^16.1.7",
"@angular/localize": "^16.1.7",
"@angular/material": "^16.1.6",
"@angular/platform-browser": "^16.1.7",
"@angular/platform-browser-dynamic": "^16.1.7",
"@angular/platform-server": "^16.1.7",
"@angular/router": "^16.1.7",
"@nguniversal/express-engine": "^16.1.1",
"clipboard": "^1.5.16",
"core-js": "^2.5.4",
"express": "^4.15.2",
"flag-icons": "^7.2.1",
"jquery": "^3.4.1",
"ng-recaptcha": "^7.0.1",
"ng-recaptcha": "^12.0.2",
"prom-client": "^11.3.0",
"rxjs": "^6.5.1",
"ts-md5": "^1.2.0",
"tslib": "^2.0.0",
"uikit": "3.12.0",
"zone.js": "~0.11.4"
"uikit": "3.16.24",
"zone.js": "~0.13.1"
},
"devDependencies": {
"@angular-devkit/build-angular": "~13.3.9",
"@angular/cli": "~13.3.9",
"@angular/compiler-cli": "~13.3.11",
"@angular/language-service": "~13.3.11",
"@nguniversal/builders": "^13.1.1",
"@angular-devkit/build-angular": "^16.1.6",
"@angular/cli": "^16.1.6",
"@angular/compiler-cli": "^16.1.7",
"@angular/language-service": "^16.1.7",
"@nguniversal/builders": "^16.1.1",
"@types/compression": "^1.7.0",
"@types/express": "^4.17.0",
"@types/jasmine": "~3.6.0",
"@types/jasminewd2": "~2.0.3",
"@types/node": "^12.11.1",
"@types/node": "^16.18.50",
"codelyzer": "^6.0.0",
"jasmine-core": "~3.8.0",
"jasmine-spec-reporter": "~5.0.0",
@ -69,6 +70,6 @@
"karma-jasmine-html-reporter": "^1.6.0",
"protractor": "~7.0.0",
"ts-node": "~7.0.0",
"typescript": "~4.6.4"
"typescript": "~4.9.5"
}
}

View File

@ -13,6 +13,8 @@ export const routes = [
'/participate/deposit-subject-result',
'/participate/deposit-publications',
'/participate/deposit-publications-result',
'/participate/deposit/learn-how',
'/participate/deposit/search',
'/search/find/research-outcomes',
'/search/find',
'/search/find/publications',
@ -40,4 +42,9 @@ export const routes = [
'/claims',
'/participate/claim',
'/participate/direct-claim',
'/my-orcid-links',
'/sdgs',
'/fields-of-science',
'/funders',
'/contact-us',
];

View File

@ -39,6 +39,7 @@ export function app() {
// Our Universal express-engine (found @ https://github.com/angular/universal/tree/master/modules/express-engine)
server.engine('html', ngExpressEngine({
bootstrap: AppServerModule,
inlineCriticalCss: false
}));
server.set('view engine', 'html');
@ -56,6 +57,29 @@ export function app() {
res.end(register.metrics());
});
server.get('/health-check', async (_req, res, _next) => {
var uptime = process.uptime();
const date = new Date(uptime*1000);
const days = date.getUTCDate() - 1,
hours = date.getUTCHours(),
minutes = date.getUTCMinutes(),
seconds = date.getUTCSeconds(),
milliseconds = date.getUTCMilliseconds();
const healthcheck = {
uptime: days + " days, " + hours + " hours, " + minutes + " minutes, " + seconds + " seconds, " + milliseconds + " milliseconds",
message: 'OK',
timestamp: new Date()
};
try {
res.send(healthcheck);
} catch (error) {
healthcheck.message = error;
res.status(503).send();
}
});
// All regular routes use the Universal engine
server.get('*', (req, res) => {
if (routes.indexOf(req.path) !== -1) {

View File

@ -1,58 +1,50 @@
import {NgModule} from '@angular/core';
import {PreloadAllModules, RouterModule, Routes} from '@angular/router';
import {OpenaireErrorPageComponent} from './error/errorPage.component';
import {RouterModule, Routes} from '@angular/router';
import {PageURLResolverComponent} from "./openaireLibrary/utils/pageURLResolver.component";
import {SdgModule} from "./openaireLibrary/sdg/sdg.module";
import {ErrorPageComponent} from "./openaireLibrary/error/errorPage.component";
const routes: Routes = [
// Other Pages
{path: '', loadChildren: () => import('./home/home.module').then(m => m.HomeModule)},
//{ path: 'home', loadChildren: './home/home.module#HomeModule'},
{path: '', loadChildren: () => import('./home/home.module').then(m => m.HomeModule), data: {hasStickyHeaderOnMobile: true}},
{path: 'home', redirectTo: '', pathMatch: 'full'},
{path: 'mail-preferences', loadChildren: () => import('./userEmailPreferences/mailPrefs.module').then(m => m.LibMailPrefsModule)},
{path: 'sdgs', loadChildren: () => import('./sdg/sdg.module').then(m => m.SdgModule)},
{path: 'fields-of-science', loadChildren: () => import('./fos/fos.module').then(m => m.FosModule)},
{path: 'contact-us', loadChildren: () => import('./contact/contact.module').then(m => m.ContactModule)},
{path: 'sdgs', loadChildren: () => import('./openaireLibrary/sdg/sdg.module').then(m => m.SdgModule)},
{path: 'fields-of-science', loadChildren: () => import('./openaireLibrary/fos/fos.module').then(m => m.FosModule), data: {extraOffset: 100}},
{path: 'funders', loadChildren: () => import('./funders/funders.module').then(m => m.FundersModule)},
{path: 'contact-us', loadChildren: () => import('./contact/contact.module').then(m => m.ContactModule), data: {hasQuickContact: false}},
// ORCID Pages
{path: 'orcid', loadChildren: () => import('./orcid/orcid.module').then(m => m.LibOrcidModule)},
{path: 'my-orcid-links', loadChildren: () => import('./orcid/my-orcid-links/myOrcidLinks.module').then(m => m.LibMyOrcidLinksModule)},
{path: 'orcid', loadChildren: () => import('./openaireLibrary/orcid/orcid.module').then(m => m.OrcidModule)},
{path: 'my-orcid-links', loadChildren: () => import('./openaireLibrary/orcid/my-orcid-links/myOrcidLinks.module').then(m => m.MyOrcidLinksModule)},
// Landing Pages
{path: 'search/result', loadChildren: () => import('./landingPages/result/libResult.module').then(m => m.LibResultModule)},
{path: 'search/publication', loadChildren: () => import('./landingPages/publication/libPublication.module').then(m => m.LibPublicationModule)},
{path: 'search/dataset', loadChildren: () => import('./landingPages/dataset/libDataset.module').then(m => m.LibDatasetModule)},
{path: 'search/software', loadChildren: () => import('./landingPages/software/libSoftware.module').then(m => m.LibSoftwareModule)},
{path: 'search/other', loadChildren: () => import('./landingPages/orp/libOrp.module').then(m => m.LibOrpModule)},
{path: 'search/project', loadChildren: () => import('./landingPages/project/libProject.module').then(m => m.LibProjectModule)},
{path: 'search/result', loadChildren: () => import('./openaireLibrary/landingPages/result/resultLanding.module').then(m => m.ResultLandingModule), data: {hasQuickContact: false, hasMenuSearchBar: true, type: 'result', community: 'openaire'}},
{path: 'search/publication', loadChildren: () => import('./openaireLibrary/landingPages/result/resultLanding.module').then(m => m.ResultLandingModule), data: {hasQuickContact: false, hasMenuSearchBar: true, type: 'publication', community: 'openaire'}},
{path: 'search/dataset', loadChildren: () => import('./openaireLibrary/landingPages/result/resultLanding.module').then(m => m.ResultLandingModule), data: {hasQuickContact: false, hasMenuSearchBar: true, type: 'dataset', community: 'openaire'}},
{path: 'search/software', loadChildren: () => import('./openaireLibrary/landingPages/result/resultLanding.module').then(m => m.ResultLandingModule), data: {hasQuickContact: false, hasMenuSearchBar: true, type: 'software', community: 'openaire'}},
{path: 'search/other', loadChildren: () => import('./openaireLibrary/landingPages/result/resultLanding.module').then(m => m.ResultLandingModule), data: {hasQuickContact: false, hasMenuSearchBar: true, type: 'orp', community: 'openaire'}},
{path: 'search/project', loadChildren: () => import('./openaireLibrary/landingPages/project/project.module').then(m => m.ProjectModule), data: {hasQuickContact: false, hasMenuSearchBar: true, community: 'openaire'}},
{
path: 'search/dataprovider',
loadChildren: () => import('././landingPages/dataProvider/libDataProvider.module').then(m => m.LibDataProviderModule)
loadChildren: () => import('./openaireLibrary/landingPages/dataProvider/dataProvider.module').then(m => m.DataProviderModule),
data: {hasQuickContact: false, hasMenuSearchBar: true, community: 'openaire'}
},
{
path: 'search/organization',
loadChildren: () => import('./landingPages/organization/libOrganization.module').then(m => m.LibOrganizationModule)
},
{
path: 'project-report',
loadChildren: () => import('./landingPages/htmlProjectReport/libHtmlProjectReport.module').then(m => m.LibHtmlProjectReportModule)
loadChildren: () => import('./openaireLibrary/landingPages/organization/organization.module').then(m => m.OrganizationModule),
data: {hasQuickContact: false, hasMenuSearchBar: true, community: 'openaire'}
},
// Search Pages
{path: 'search/find', loadChildren: () => import('./searchPages/find/libSearch.module').then(m => m.LibMainSearchModule)},
{
path: 'search/find/research-outcomes',
loadChildren: () => import('./searchPages/simple/searchResearchResults.module').then(m => m.OpenaireSearchResearchResultsModule)
path: 'search/find', loadChildren: () => import('./searchPages/find/libSearch.module').then(m => m.LibMainSearchModule)
},
{path: 'search/find/publications', component: PageURLResolverComponent},
{path: 'search/find/datasets', component: PageURLResolverComponent},
{path: 'search/find/software', component: PageURLResolverComponent},
{path: 'search/find/other', component: PageURLResolverComponent},
{path: 'search/find/projects', loadChildren: () => import('./searchPages/simple/searchProjects.module').then(m => m.LibSearchProjectsModule)},
{
path: 'search/find/dataproviders',
loadChildren: () => import('./searchPages/simple/searchDataProviders.module').then(m => m.LibSearchDataProvidersModule)
},
{
path: 'search/find/organizations',
loadChildren: () => import('./searchPages/simple/searchOrganizations.module').then(m => m.LibSearchOrganizationsModule)
path: 'search/find/:entity', loadChildren: () => import('./searchPages/find/libSearch.module').then(m => m.LibMainSearchModule)
},
// Advanced Search Pages
{
path: 'search/advanced/research-outcomes',
@ -79,14 +71,14 @@ const routes: Routes = [
path: 'search/content-providers',
loadChildren: () => import('./searchPages/dataProviders/compatibleDataProviders.module').then(m => m.LibCompatibleDataProvidersModule)
},
{path: 'search/content-providers-table', redirectTo: 'search/content-providers'},
{path: 'search/content-providers-table', redirectTo: 'search/content-providers', pathMatch: 'full'},
{
path: 'search/entity-registries',
loadChildren: () => import('./searchPages/dataProviders/entityRegistries.module').then(m => m.LibEntityRegistriesModule)
},
{path: 'search/entity-registries-table', redirectTo: 'search/entity-registries'},
{path: 'search/entity-registries-table', redirectTo: 'search/entity-registries', pathMatch: 'full'},
{path: 'search/journals', loadChildren: () => import('./searchPages/dataProviders/journals.module').then(m => m.LibJournalsModule)},
{path: 'search/journals-table', redirectTo: 'search/journals'},
{path: 'search/journals-table', redirectTo: 'search/journals', pathMatch: 'full'},
// Deposit Pages
{path: 'participate/deposit-datasets', redirectTo: 'participate/deposit/learn-how', pathMatch: 'full'},
{path: 'participate/deposit-datasets-result', redirectTo: 'participate/deposit/learn-how', pathMatch: 'full'},
@ -108,10 +100,10 @@ const routes: Routes = [
},
// { path: 'claims-project-manager', loadChildren: './claims/claimsByToken/claimsByToken.module#LibClaimsByTokenModule'},
// help pages - do not exist in Admin portal/api/db
{path: 'reload', loadChildren: () => import('./reload/libReload.module').then(m => m.LibReloadModule)},
{path: 'user-info', loadChildren: () => import('./login/libUser.module').then(m => m.LibUserModule)},
{path: 'error', component: OpenaireErrorPageComponent},
{path: '**', pathMatch: 'full', component: OpenaireErrorPageComponent}
{path: 'reload', loadChildren: () => import('./openaireLibrary/reload/reload.module').then(m => m.ReloadModule)},
{path: 'user-info', loadChildren: () => import('./openaireLibrary/login/user.module').then(m => m.UserModule)},
{path: 'error', component: ErrorPageComponent},
{path: '**', pathMatch: 'full', component: ErrorPageComponent}
];
@NgModule({

View File

@ -1,10 +1,8 @@
import {Component} from '@angular/core';
import {AfterViewInit, ChangeDetectorRef, Component, ElementRef, ViewChild} from '@angular/core';
import {ActivatedRoute, Router} from '@angular/router';
import {EnvProperties} from './openaireLibrary/utils/properties/env-properties';
import {MenuItem} from './openaireLibrary/sharedComponents/menu';
import {EnvironmentSpecificService} from './openaireLibrary/utils/properties/environment-specific.service';
import {Session, User} from './openaireLibrary/login/utils/helper.class';
import {UserManagementService} from "./openaireLibrary/services/user-management.service";
import {ConfigurationService} from "./openaireLibrary/utils/configuration/configuration.service";
@ -15,22 +13,38 @@ import {properties} from "../environments/environment";
import {SmoothScroll} from "./openaireLibrary/utils/smooth-scroll";
import {SEOService} from "./openaireLibrary/sharedComponents/SEO/SEO.service";
import {OpenaireEntities} from "./openaireLibrary/utils/properties/searchFields";
import {FormBuilder, FormGroup, Validators} from '@angular/forms';
import {QuickContactComponent} from './openaireLibrary/sharedComponents/quick-contact/quick-contact.component';
import {EmailService} from './openaireLibrary/utils/email/email.service';
import {Composer} from "./openaireLibrary/utils/email/composer";
import {AlertModal} from './openaireLibrary/utils/modal/alert';
import {NotificationHandler} from "./openaireLibrary/utils/notification-handler";
import {QuickContactService} from './openaireLibrary/sharedComponents/quick-contact/quick-contact.service';
import {LayoutService} from './openaireLibrary/dashboard/sharedComponents/sidebar/layout.service';
import {ISVocabulariesService} from "./openaireLibrary/utils/staticAutoComplete/ISVocabularies.service";
@Component({
//changeDetection: ChangeDetectionStrategy.Default,
//encapsulation: ViewEncapsulation.Emulated,
selector: 'app-root',
template: `
<div id="modal-container"></div>
<navbar *ngIf="properties && header" [header]="header" [portal]="properties.dashboard" [properties]=properties
[onlyTop]=false [user]="user"
[communityId]="properties.adminToolsCommunity" [userMenuItems]=userMenuItems [menuItems]=menuItems></navbar>
<div *ngIf="loading">
<loading [full]="true"></loading>
</div>
<schema2jsonld *ngIf="properties" [URL]="properties.domain+properties.baseLink"
[logoURL]="properties.domain+properties.baseLink+'/assets/common-assets/logo-services/explore/main.svg'"
type="home"
name="OpenAIRE | Find and Share research"
description="OpenAIRE Explore: Over 100M of research deduplicated, 170K research software, 11M research data. One of the largest open scholarly records collection worldwide."></schema2jsonld>
<div class="custom-main-content">
<div [class.uk-hidden]="loading" [ngClass]="rootClass">
<div id="modal-container"></div>
<!-- <span class="js-upload" uk-form-custom>-->
<!-- <input id="exampleInputFile" class="uk-width-medium" type="file" (change)="fileChangeEvent($event)"/>-->
<!-- <span class="uk-link " style="text-decoration: underline;">Parse NEW FOS</span>-->
<!-- </span>-->
<!-- <a (click)="checkDifferences()" class="uk-margin-left uk-link ">Check if different FOS codes/labels</a>-->
<main>
<router-outlet></router-outlet>
</main>
@ -45,10 +59,15 @@ import {OpenaireEntities} from "./openaireLibrary/utils/properties/searchFields"
ratio="1"><polyline fill="none" stroke="#000" stroke-width="1.03" points="7 4 13 10 7 16"></polyline></svg>
</span></a>
</cookie-law>
<bottom id="bottom" *ngIf="isClient && properties" [properties]="properties"></bottom>
<bottom id="bottom" #bottom *ngIf="isClient && properties" [properties]="properties"></bottom>
<quick-contact #quickContact *ngIf="bottomNotIntersecting && displayQuickContact && showQuickContact && contactForm" (sendEmitter)="send($event)"
[contactForm]="contactForm" [sending]="sending" [contact]="'Help'" class="uk-visible@m"></quick-contact>
<modal-alert #modal [overflowBody]="false"></modal-alert>
`
})
export class AppComponent {
export class AppComponent implements AfterViewInit {
loading: boolean = false;
rootClass: string;
isClient: boolean = false;
userMenuItems: MenuItem[] = [];
menuItems: MenuItem [] = [];
@ -56,18 +75,245 @@ export class AppComponent {
properties: EnvProperties = properties;
user: User;
header: Header;
/* Contact */
public showQuickContact: boolean;
public bottomNotIntersecting: boolean;
public displayQuickContact: boolean; // intersecting with specific section in home page
public contactForm: FormGroup;
public sending: boolean = false;
@ViewChild('quickContact') quickContact: QuickContactComponent;
@ViewChild('modal') modal: AlertModal;
@ViewChild('bottom', {read: ElementRef}) bottom: ElementRef;
subscriptions = [];
constructor(private route: ActivatedRoute, private propertiesService: EnvironmentSpecificService,
private router: Router, private userManagementService: UserManagementService, private smoothScroll: SmoothScroll,
private configurationService: ConfigurationService, private _meta: Meta, private seoService: SEOService,) {
private configurationService: ConfigurationService, private _meta: Meta, private seoService: SEOService,
private emailService: EmailService, private fb: FormBuilder, private quickContactService: QuickContactService,
private layoutService: LayoutService, private cdr: ChangeDetectorRef,
private ISVocabulariesService: ISVocabulariesService) {
}
// fileChangeEvent(fileInput: any) {
// let file = <Array<File>>fileInput.target.files;
// this.parseNewFos(file);
// }
//
// makeFileRequest(url: string, params: Array<string>, files: Array<File>) {
// return new Promise<void>((resolve, reject) => {
// const formData: any = new FormData();
// const xhr = new XMLHttpRequest();
// for (let i = 0; i < files.length; i++) {
// formData.append("uploads[]", files[i], files[i].name);
// }
// xhr.onreadystatechange = function () {
// if (xhr.readyState == 4) {
// if (xhr.status == 200) {
// resolve(xhr.response);
// } else {
// reject(xhr.response);
// }
// }
// }
//
// xhr.open("POST", url, true);
// xhr.send(formData);
// });
// }
//
// parseNewFos(file: Array<File>) {
// let fos = null;
// this.makeFileRequest(this.properties.utilsService + '/upload', [], file).then((result) => {
// this.ISVocabulariesService.getFos(properties).subscribe(fosRes => {
// fos = fosRes['fos'];
// for(let fieldL1 of fos) {
// if(fieldL1.children != null) {
// for (let fieldL2 of fieldL1.children) {
// if(fieldL2.children != null) {
// for (let fieldL3 of fieldL2.children) {
// if(fieldL3.children != null)
// fieldL3.children = [];
// }
// }
// }
// }
// }
// // console.log(fos);
// let setOfCodes: Set<string> = new Set<string>();
// let duplicates = new Map<string, string[]>;
// const rows = (result as any).split('\n'); // I have used space, you can use any thing.
// let added = false;
// for (let i = 0; i < (rows.length); i++) {
// if (rows[i] && rows[i] != null && rows[i] != "") {
// added = false;
// let code = rows[i].split(' ')[0];
// if(setOfCodes.has(code)) {
// console.log("SAME CODE!!!!!!!!");
// } else {
// setOfCodes.add(code);
// }
// let label = rows[i].substring(code.length+1, rows[i].length);
// // console.log(rows[i]);
// let firstLevel = rows[i].substring(0, 2);
// let secondLevel = rows[i].substring(0, 4);
// let thirdLevel = rows[i].substring(0, 6);
// for(let fieldL1 of fos) {
// if(fieldL1.code == firstLevel) {
// for(let fieldL2 of fieldL1.children) {
// if(fieldL2.code == secondLevel) {
// for(let fieldL3 of fieldL2.children) {
// if(fieldL3.code == thirdLevel) {
// if(fieldL3.children == null) {
// fieldL3.children = [];
// }
// fieldL3.children.push({
// "code": code,
// "id": rows[i],
// "label": label,
// "level": 4
// })
// added = true;
// break;
// }
// }
// if(!added && (!fieldL2.children || fieldL2.children.filter(field => field.code == thirdLevel).length == 0)) {
// console.log("Level 3 not found for "+rows[i]);
// }
// break;
// }
// }
// if(!added && (!fieldL1.children || fieldL1.children.filter(field => field.code == secondLevel).length == 0)) {
// console.log("Level 2 not found for "+rows[i]);
// }
// break;
// }
// }
//
// if(!added && fos.filter(field => field.code == firstLevel).length == 0) {
// console.log("Level 1 not found for |"+rows[i]+"|");
// }
// }
// }
//
// for(let l1 of fos) {
// if(duplicates.has(l1.label)) {
// duplicates.get(l1.label).push(l1.id);
// } else {
// duplicates.set(l1.label, [l1.id]);
// }
// if(l1.children) {
// for (let l2 of l1.children) {
// if(duplicates.has(l2.label)) {
// duplicates.get(l2.label).push(l2.id);
// } else {
// duplicates.set(l2.label, [l2.id]);
// }
//
// if(l2.children) {
// for(let l3 of l2.children) {
// if(duplicates.has(l3.label)) {
// duplicates.get(l3.label).push(l3.id);
// } else {
// duplicates.set(l3.label, [l3.id]);
// }
//
// if(l3.children) {
// for(let l4 of l3.children) {
// if(duplicates.has(l4.label)) {
// duplicates.get(l4.label).push(l4.id);
// } else {
// duplicates.set(l4.label, [l4.id]);
// }
// }
// }
// }
// }
// }
// }
// }
//
// for(let label of duplicates.keys()) {
// if(duplicates.get(label).length > 1) {
// console.log(label, duplicates.get(label));
// }
// }
// var url = window.URL.createObjectURL(new Blob([JSON.stringify(fos)]));
// var a = window.document.createElement('a');
// window.document.body.appendChild(a);
// a.setAttribute('style', 'display: none');
// a.href = url;
// a.download = "fosNewL4.json";
// a.click();
// window.URL.revokeObjectURL(url);
// a.remove(); // remove the element
//
// // var theJSON = JSON.stringify(fos);
// // var uri = this.sanitizer.bypassSecurityTrustUrl("data:text/json;charset=UTF-8," + encodeURIComponent(theJSON));
// // this.downloadJsonHref = uri;
// // console.log(fos);
// });
// });
// }
//
// checkDifferences() {
// this.ISVocabulariesService.getIndexedFosL4(properties).subscribe(fosRes => {
// console.log(fosRes);
// this.ISVocabulariesService.getFos(properties).subscribe(currentFos => {
// console.log(currentFos);
// let currentSet: Map<string, string> = new Map<string, string>();
// for(let currentL1 of currentFos['fos']) {
// if(currentL1.children?.length > 0) {
// for(let currentL2 of currentL1.children) {
// if(currentL2.children?.length > 0) {
// for(let currentL3 of currentL2.children) {
// if(currentL3.children?.length > 0) {
// for(let currentL4 of currentL3.children) {
// if(currentSet.has(currentL4.code)) {
// console.log("ALREADY HERE ",currentL4.code);
// }
// currentSet.set(currentL4.code, currentL4.label);
// }
// }
// }
// }
// }
// }
// }
//
// console.log(currentSet);
// for (let fos of fosRes) {
// if(!currentSet.has(fos.l4code)) {
// console.log(fos.l4code + " does not exist in current voc");
// } else {
// if(currentSet.get(fos.l4code) != fos.l4label) {
// console.log(fos.l4code + " different label");
// }
// }
// }
//
// for(let code of currentSet.keys()) {
// let found = false;
// for(let fos of fosRes) {
// if(fos.l4code == code) {
// found = true;
// break;
// }
// }
// if(!found) {
// console.log("current code "+code+" not indexed");
// }
// }
// });
// });
// }
ngOnInit() {
if (typeof document !== 'undefined') {
this.isClient = true;
}
this.configurationService.initCommunityInformation(this.properties, this.properties.adminToolsCommunity);
this.configurationService.initPortal(this.properties, this.properties.adminToolsCommunity);
this.feedbackmail = this.properties.feedbackmail;
if (this.properties.environment == "production" || this.properties.environment == "development") {
this.subscriptions.push(this.route.queryParams.subscribe(data => {
@ -88,6 +334,19 @@ export class AppComponent {
position: 'left',
badge: true
};
this.reset();
}));
this.subscriptions.push(this.layoutService.hasQuickContact.subscribe(hasQuickContact => {
if(this.showQuickContact !== hasQuickContact) {
this.showQuickContact = hasQuickContact;
this.cdr.detectChanges();
}
}));
this.subscriptions.push(this.quickContactService.isDisplayed.subscribe(display => {
if(this.displayQuickContact !== display) {
this.displayQuickContact = display;
this.cdr.detectChanges();
}
}));
}
@ -95,6 +354,8 @@ export class AppComponent {
this.subscriptions.forEach(subscription => {
if (subscription instanceof Subscriber) {
subscription.unsubscribe();
} else if (typeof IntersectionObserver !== "undefined" && subscription instanceof IntersectionObserver) {
subscription.disconnect();
}
});
this.configurationService.clearSubscriptions();
@ -102,12 +363,63 @@ export class AppComponent {
this.smoothScroll.clearSubscriptions();
}
ngAfterViewInit() {
if (typeof window !== "undefined") {
this.createObservers();
this.subscriptions.push(this.layoutService.rootClass.subscribe(rootClass => {
this.loading = true;
this.cdr.detectChanges();
if (rootClass && this.isClient) {
let link = <HTMLLinkElement>document.getElementById('theme');
let append = false;
if (!link) {
link = document.createElement('link');
link.rel = 'stylesheet';
link.id = 'theme';
append = true;
}
link.href = rootClass + '.css';
link.onerror = (error) => console.log(error);
if (append) {
document.head.appendChild(link);
}
}
this.rootClass = rootClass;
this.cdr.detectChanges();
setTimeout(() => {
this.loading = false;
this.cdr.detectChanges();
}, 500)
}));
}
}
createObservers() {
let options = {
root: null,
rootMargin: '0px',
threshold: 0.1
};
let intersectionObserver = new IntersectionObserver(entries => {
entries.forEach(entry => {
if(this.bottomNotIntersecting !== (!entry.isIntersecting)) {
this.bottomNotIntersecting = !entry.isIntersecting;
this.cdr.detectChanges();
}
});
}, options);
intersectionObserver.observe(this.bottom.nativeElement);
this.subscriptions.push(intersectionObserver);
}
buildMenu() {
this.userMenuItems = [];
this.userMenuItems.push(new MenuItem("", "My profile", "", "", false, [], [], {}));
this.userMenuItems.push(new MenuItem("", "My ORCID links", "", "/my-orcid-links", false, [], [""], {}));
if(this.properties.environment != "beta") {
this.userMenuItems.push(new MenuItem("", "My ORCID links", "", "/my-orcid-links", false, [], [""], {}));
}
this.userMenuItems.push(new MenuItem("", "My links", "", "/myclaims", false, [], ["/myclaims"], {}));
let researchOutcomesMenu = new MenuItem("", OpenaireEntities.RESULTS, "", "/search/find/research-outcomes", false, [], ["/search/find/research-outcomes"], {resultbestaccessright: '"' + encodeURIComponent("Open Access") + '"'});
let researchOutcomesMenu = new MenuItem("", OpenaireEntities.RESULTS, "", "/search/find/research-outcomes", false, [], ["/search/find/research-outcomes"], {});
researchOutcomesMenu.items = [
new MenuItem("", OpenaireEntities.PUBLICATIONS, "", "/search/find/research-outcomes", false, [], ["/search/find/research-outcomes"], {type: '"' + encodeURIComponent("publications") + '"'}),
new MenuItem("", OpenaireEntities.DATASETS, "", "/search/find/research-outcomes", false, [], ["/search/find/research-outcomes"], {type: '"' + encodeURIComponent("datasets") + '"'}),
@ -115,7 +427,7 @@ export class AppComponent {
new MenuItem("", OpenaireEntities.OTHER, "", "/search/find/research-outcomes", false, [], ["/search/find/research-outcomes"], {type: '"' + encodeURIComponent("other") + '"'})];
//TODO add check for research results route
this.menuItems = [
new MenuItem("search", "Search", "", "/search/find", false, [], ["/search/find"], {qf: true},
new MenuItem("search", "Search", "", "/search/find/research-outcomes", false, [], ["/search/find/research-outcomes"], {},
null, null, null, null, "_blank", "internal", false,
[
researchOutcomesMenu,
@ -138,7 +450,7 @@ export class AppComponent {
new MenuItem("", "Registries", "", "/search/entity-registries", false, ["datasource"], ["/search/entity-registries"], {}),
new MenuItem("", "Browse all", "", "/search/find/dataproviders", false, ["datasource"], ["/search/find/dataproviders"], {})]
),
new MenuItem("contact", "Contact us", "", "/contact-us", false, [], ["/contact-us"], {}),
new MenuItem("funders", "Funders", "", "/funders", false, [], ["/funders"], {}),
];
if (Session.isPortalAdministrator(this.user)) {
this.userMenuItems.push(new MenuItem("", "Manage all links", "", "/claims", false, [], ["/claims"], {}));
@ -150,6 +462,66 @@ export class AppComponent {
if (this.user) {
this.userMenuItems.push(new MenuItem("", "User information", "", "/user-info", false, [], [], {}));
}
}
public send(event) {
if (event.valid === true) {
this.sendMail(this.properties.admins);
}
}
private sendMail(admins: string[]) {
this.sending = true;
this.subscriptions.push(this.emailService.contact(this.properties,
Composer.composeEmailForExplore(this.contactForm.value, admins),
this.contactForm.value.recaptcha).subscribe(
res => {
if (res) {
this.sending = false;
this.reset();
this.modalOpen();
} else {
this.handleError('Email <b>sent failed!</b> Please try again.');
}
},
error => {
this.handleError('Email <b>sent failed!</b> Please try again.', error);
}
));
}
public reset() {
if (this.quickContact) {
this.quickContact.close();
}
this.contactForm = this.fb.group({
name: this.fb.control('', Validators.required),
surname: this.fb.control('', Validators.required),
email: this.fb.control('', [Validators.required, Validators.email]),
affiliation: this.fb.control(''),
message: this.fb.control('', Validators.required),
recaptcha: this.fb.control('', Validators.required),
});
}
public modalOpen() {
this.modal.okButton = true;
this.modal.alertTitle = 'Your request has been successfully submitted';
this.modal.message = 'Our team will respond to your submission soon.';
this.modal.cancelButton = false;
this.modal.okButtonLeft = false;
this.modal.okButtonText = 'OK';
this.modal.open();
}
handleError(message: string, error = null) {
if (error) {
console.error(error);
}
this.sending = false;
this.quickContact.close();
NotificationHandler.rise(message, 'danger');
this.contactForm.get('recaptcha').setValue('');
}
}

View File

@ -1,6 +1,6 @@
import {NgModule} from '@angular/core';
import {APP_ID, NgModule} from '@angular/core';
import {SharedModule} from './openaireLibrary/shared/shared.module';
import {BrowserModule, BrowserTransferStateModule} from '@angular/platform-browser';
import {BrowserModule} from '@angular/platform-browser';
import {BrowserAnimationsModule} from '@angular/platform-browser/animations';
import {CommonModule} from '@angular/common';
import {HTTP_INTERCEPTORS, HttpClientModule} from '@angular/common/http';
@ -9,7 +9,6 @@ import {NavigationBarModule} from './openaireLibrary/sharedComponents/navigation
import {CookieLawModule} from './openaireLibrary/sharedComponents/cookie-law/cookie-law.module';
import {BottomModule} from './openaireLibrary/sharedComponents/bottom.module';
import {ErrorModule} from './openaireLibrary/error/error.module';
import {OpenaireErrorPageComponent} from './error/errorPage.component';
import {AppRoutingModule} from './app-routing.module';
import {HttpInterceptorService} from "./openaireLibrary/http-interceptor.service";
import {PageURLResolverModule} from "./openaireLibrary/utils/pageURLResolver.module";
@ -17,6 +16,9 @@ import {Schema2jsonldModule} from "./openaireLibrary/sharedComponents/schema2jso
import {CacheInterceptorService} from "./openaireLibrary/cache-interceptor.service";
import {DEFAULT_TIMEOUT, TimeoutInterceptor} from "./openaireLibrary/timeout-interceptor.service";
import {ErrorInterceptorService} from "./openaireLibrary/error-interceptor.service";
import {QuickContactModule} from './openaireLibrary/sharedComponents/quick-contact/quick-contact.module';
import {AlertModalModule} from './openaireLibrary/utils/modal/alertModal.module';
import {LoadingModule} from "./openaireLibrary/utils/loading/loading.module";
@NgModule({
imports: [
@ -26,19 +28,22 @@ import {ErrorInterceptorService} from "./openaireLibrary/error-interceptor.servi
ErrorModule,
NavigationBarModule, BottomModule,
CookieLawModule,
BrowserModule.withServerTransition({ appId: 'explore' }),
BrowserModule,
AppRoutingModule,
BrowserTransferStateModule,
BrowserAnimationsModule, PageURLResolverModule, Schema2jsonldModule
BrowserAnimationsModule, PageURLResolverModule,
Schema2jsonldModule,
QuickContactModule,
AlertModalModule, LoadingModule
],
declarations: [AppComponent, OpenaireErrorPageComponent],
declarations: [AppComponent],
exports: [AppComponent],
providers: [
{
provide: HTTP_INTERCEPTORS,
useClass: CacheInterceptorService,
multi: true
},
{provide: APP_ID, useValue: 'explore'},
// {
// provide: HTTP_INTERCEPTORS,
// useClass: CacheInterceptorService,
// multi: true
// },
{
provide: HTTP_INTERCEPTORS,
useClass: HttpInterceptorService,

View File

@ -1,5 +1,5 @@
import { NgModule } from '@angular/core';
import {ServerModule, ServerTransferStateModule} from '@angular/platform-server';
import {ServerModule} from '@angular/platform-server';
import { AppModule } from './app.module';
import { AppComponent } from './app.component';
@ -7,8 +7,7 @@ import { AppComponent } from './app.component';
@NgModule({
imports: [
AppModule,
ServerModule,
ServerTransferStateModule
ServerModule
],
bootstrap: [AppComponent],
})

View File

@ -4,19 +4,17 @@ import {properties} from "../../../environments/environment";
@Component({
selector: 'openaire-claims-admin',
template: `
<claims-admin *ngIf="claimsInfoURL && userInfoURL" [claimsInfoURL]=claimsInfoURL [userInfoURL]="userInfoURL">
<claims-admin *ngIf="claimsInfoURL" [claimsInfoURL]="claimsInfoURL">
</claims-admin>
`,
})
export class OpenaireClaimsAdminComponent implements OnInit {
claimsInfoURL: string;
userInfoURL: string;
constructor() {
}
public ngOnInit() {
this.claimsInfoURL = properties.claimsInformationLink;
this.userInfoURL = properties.userInfoUrl;
}
}

View File

@ -5,9 +5,6 @@ import { OpenaireClaimsAdminComponent } from './claimsAdmin.component';
import { ClaimsAdminRoutingModule } from './claimsAdmin-routing.module';
import{ClaimsAdminModule } from '../../openaireLibrary/claims/claimsAdmin/claimsAdmin.module';
import{ ClaimsCuratorGuard} from '../../openaireLibrary/login/claimsCuratorGuard.guard';
import {PreviousRouteRecorder} from '../../openaireLibrary/utils/piwik/previousRouteRecorder.guard';
import {IsRouteEnabled} from '../../openaireLibrary/error/isRouteEnabled.guard';
@NgModule({
imports: [
@ -15,7 +12,7 @@ import {IsRouteEnabled} from '../../openaireLibrary/error/isRouteEnabled.guard';
ClaimsAdminRoutingModule,
ClaimsAdminModule
],
providers:[ClaimsCuratorGuard, PreviousRouteRecorder,IsRouteEnabled],
providers:[ClaimsCuratorGuard],
declarations: [
OpenaireClaimsAdminComponent
]

View File

@ -4,15 +4,12 @@ import { SharedModule } from '../../openaireLibrary/shared/shared.module';
import { OpenaireDirectLinkingComponent } from './directLinking.component';
import{ DirectLinkingModule} from '../../openaireLibrary/claims/directLinking/directLinking.module';
import {DirectLinkingRoutingModule} from './directLinking-routing.module';
import {LoginGuard} from '../../openaireLibrary/login/loginGuard.guard';
import {PreviousRouteRecorder} from '../../openaireLibrary/utils/piwik/previousRouteRecorder.guard';
import {IsRouteEnabled} from '../../openaireLibrary/error/isRouteEnabled.guard';
@NgModule({
imports: [
SharedModule, DirectLinkingModule, DirectLinkingRoutingModule
],
providers:[LoginGuard, PreviousRouteRecorder, IsRouteEnabled],
providers:[],
declarations: [
OpenaireDirectLinkingComponent
], exports:[OpenaireDirectLinkingComponent]

View File

@ -4,15 +4,12 @@ import { SharedModule } from '../../openaireLibrary/shared/shared.module';
import {OpenaireLinkingComponent} from './linkingGeneric.component';
import {LinkingRoutingModule} from './linking-routing.module';
import{ LinkingGenericModule} from '../../openaireLibrary/claims/linking/linkingGeneric.module';
import {LoginGuard} from '../../openaireLibrary/login/loginGuard.guard';
import {PreviousRouteRecorder} from '../../openaireLibrary/utils/piwik/previousRouteRecorder.guard';
import {IsRouteEnabled} from '../../openaireLibrary/error/isRouteEnabled.guard';
@NgModule({
imports: [
SharedModule, LinkingRoutingModule, LinkingGenericModule
],
providers:[LoginGuard, PreviousRouteRecorder, IsRouteEnabled],
providers:[],
declarations: [
OpenaireLinkingComponent
], exports:[

View File

@ -5,20 +5,18 @@ import {properties} from "../../../environments/environment";
@Component({
selector: 'openaire-my-claims',
template: `
<my-claims *ngIf="userInfoURL && claimsInfoURL" [claimsInfoURL]=claimsInfoURL [userInfoURL]="userInfoURL">
<my-claims *ngIf="claimsInfoURL" [claimsInfoURL]="claimsInfoURL">
</my-claims>
`
})
export class OpenaireMyClaimsComponent implements OnInit {
claimsInfoURL: string;
userInfoURL: string;
constructor() {
}
public ngOnInit() {
this.claimsInfoURL = properties.claimsInformationLink;
this.userInfoURL = properties.userInfoUrl;
}
}

View File

@ -4,10 +4,6 @@ import { SharedModule } from '../../openaireLibrary/shared/shared.module';
import { OpenaireMyClaimsComponent } from './myClaims.component';
import { MyClaimsRoutingModule } from './myClaims-routing.module';
import{ MyClaimsModule} from '../../openaireLibrary/claims/myClaims/myClaims.module';
import {LoginGuard} from '../../openaireLibrary/login/loginGuard.guard';
import {PreviousRouteRecorder} from '../../openaireLibrary/utils/piwik/previousRouteRecorder.guard';
import {IsRouteEnabled} from '../../openaireLibrary/error/isRouteEnabled.guard';
@NgModule({
imports: [
@ -16,7 +12,7 @@ import {IsRouteEnabled} from '../../openaireLibrary/error/isRouteEnabled.guard';
MyClaimsModule
],
providers:[LoginGuard, PreviousRouteRecorder, IsRouteEnabled],
providers:[],
declarations: [
OpenaireMyClaimsComponent
]

View File

@ -7,7 +7,7 @@
<div class="uk-section uk-padding-remove-top uk-container uk-container-large uk-flex uk-flex-center"
uk-scrollspy="target: [uk-scrollspy-class]; cls: uk-animation-slide-bottom-medium; delay: 200">
<div class="uk-padding-small uk-width-1-2@l uk-width-2-3@m uk-width-1-1">
<contact-us [sending]="sending" [scrollspy]="true"
<contact-us #contactUs [sending]="sending" [scrollspy]="true"
[contactForm]="contactForm" (sendEmitter)="send($event)">
<h1 page-title class="uk-margin-auto uk-text-center" uk-scrollspy-class>
Contact us to <br> learn more<span class="uk-text-primary">.</span>

View File

@ -14,6 +14,7 @@ import {Breadcrumb} from "../openaireLibrary/utils/breadcrumbs/breadcrumbs.compo
import {Subscriber} from "rxjs";
import {properties} from "../../environments/environment";
import {NotificationHandler} from "../openaireLibrary/utils/notification-handler";
import {ContactUsComponent} from "../openaireLibrary/contact-us/contact-us.component";
@Component({
selector: 'contact',
@ -33,6 +34,7 @@ export class ContactComponent implements OnInit {
public contactForm: FormGroup;
@ViewChild('modal') modal;
private subscriptions = [];
@ViewChild('contactUs') contactUsComponent : ContactUsComponent;
ngOnDestroy() {
this.subscriptions.forEach(subscription => {
@ -56,19 +58,15 @@ export class ContactComponent implements OnInit {
ngOnInit() {
this._title.setTitle('OpenAIRE - Explore | Contact Us');
this.properties = properties;
this.email = {body: '', subject: '', recipients: []};
if (this.properties.enablePiwikTrack && (typeof document !== 'undefined')) {
this.subscriptions.push( this._piwikService.trackView(this.properties, this.pageTitle, this.properties.piwikSiteId).subscribe());
}
this.subscriptions.push( this._piwikService.trackView(this.properties, this.pageTitle).subscribe());
this.url = this.properties.domain + this._router.url;
this.seoService.createLinkForCanonicalURL(this.url);
this.updateUrl(this.url);
this.updateTitle(this.pageTitle);
this.updateDescription(this.description);
this.reset();
this.getPageContents();
// this.getPageContents();
this.sending = false;
}
@ -94,6 +92,9 @@ export class ContactComponent implements OnInit {
message: this.fb.control('', Validators.required),
recaptcha: this.fb.control('', Validators.required),
});
if(this.contactUsComponent) {
this.contactUsComponent.resetRecaptcha();
}
}
private sendMail(admins: any) {

View File

@ -4,11 +4,8 @@ import {RouterModule} from '@angular/router';
import {ContactComponent} from './contact.component';
import {ContactRoutingModule} from "./contact-routing.module";
import {EmailService} from "../openaireLibrary/utils/email/email.service";
import {AlertModalModule} from "../openaireLibrary/utils/modal/alertModal.module";
import {PiwikService} from "../openaireLibrary/utils/piwik/piwik.service";
import {HelperModule} from "../openaireLibrary/utils/helper/helper.module";
import {IsRouteEnabled} from "../openaireLibrary/error/isRouteEnabled.guard";
import {Schema2jsonldModule} from "../openaireLibrary/sharedComponents/schema2jsonld/schema2jsonld.module";
import {SEOServiceModule} from "../openaireLibrary/sharedComponents/SEO/SEOService.module";
import {ContactUsModule} from "../openaireLibrary/contact-us/contact-us.module";
@ -25,9 +22,7 @@ import {LoadingModule} from "../openaireLibrary/utils/loading/loading.module";
declarations: [
ContactComponent
],
providers: [
EmailService, PiwikService, IsRouteEnabled
],
providers: [],
exports: [
ContactComponent
]

View File

@ -1,4 +1,5 @@
import {Component} from '@angular/core';
import {Component, OnDestroy, OnInit} from '@angular/core';
import {LayoutService} from "../openaireLibrary/dashboard/sharedComponents/sidebar/layout.service";
@Component({
selector: 'openaire-deposit',
@ -7,11 +8,17 @@ import {Component} from '@angular/core';
`
})
export class OpenaireDepositComponent {
export class OpenaireDepositComponent implements OnInit, OnDestroy {
constructor() {
constructor(private layoutService: LayoutService) {
}
public ngOnInit() {}
public ngOnInit() {
this.layoutService.setRootClass('deposit');
}
ngOnDestroy() {
this.layoutService.setRootClass(null);
}
}

View File

@ -2,17 +2,12 @@ import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import {PreviousRouteRecorder} from '../openaireLibrary/utils/piwik/previousRouteRecorder.guard';
import {IsRouteEnabled} from '../openaireLibrary/error/isRouteEnabled.guard';
import {OpenaireDepositComponent} from "./deposit.component";
import {DepositRoutingModule} from "./deposit-routing.module";
import {DepositFirstPageModule} from "../openaireLibrary/deposit/depositFirstPage.module";
import {ZenodoCommunitiesService} from "../openaireLibrary/connect/zenodoCommunities/zenodo-communities.service";
import {CommunityService} from "../openaireLibrary/connect/community/community.service";
import {SearchZenodoCommunitiesService} from "../openaireLibrary/connect/zenodoCommunities/searchZenodoCommunities.service";
@NgModule({
imports: [
@ -25,7 +20,8 @@ import {SearchZenodoCommunitiesService} from "../openaireLibrary/connect/zenodoC
exports: [
OpenaireDepositComponent,
],
providers: [PreviousRouteRecorder, IsRouteEnabled,
ZenodoCommunitiesService, CommunityService, SearchZenodoCommunitiesService]
providers: [
ZenodoCommunitiesService, CommunityService
]
})
export class LibDepositModule { }

View File

@ -6,19 +6,15 @@ import { OpenaireSearchDataprovidersToDepositComponent } from './searchDataprovi
import {SearchDataprovidersToDepositRoutingModule} from './searchDataprovidersToDeposit-routing.module';
import {SearchDataprovidersToDepositModule} from '../openaireLibrary/deposit/searchDataprovidersToDeposit.module';
import {PreviousRouteRecorder} from '../openaireLibrary/utils/piwik/previousRouteRecorder.guard';
import {IsRouteEnabled} from '../openaireLibrary/error/isRouteEnabled.guard';
import {ZenodoCommunitiesServiceModule} from '../openaireLibrary/connect/zenodoCommunities/zenodo-communitiesService.module';
import {SearchZenodoCommunitiesServiceModule} from '../openaireLibrary/connect/zenodoCommunities/searchZenodoCommunitiesService.module';
import {CommunityService} from '../openaireLibrary/connect/community/community.service';
@NgModule({
imports: [
CommonModule, FormsModule,
SearchDataprovidersToDepositModule,
SearchDataprovidersToDepositRoutingModule,
ZenodoCommunitiesServiceModule, SearchZenodoCommunitiesServiceModule
SearchDataprovidersToDepositModule,
ZenodoCommunitiesServiceModule
],
declarations: [
OpenaireSearchDataprovidersToDepositComponent
@ -26,6 +22,6 @@ import {CommunityService} from '../openaireLibrary/connect/community/community.s
exports: [
OpenaireSearchDataprovidersToDepositComponent,
],
providers: [PreviousRouteRecorder, IsRouteEnabled, CommunityService]
providers: [CommunityService]
})
export class LibSearchDataprovidersToDepositModule { }

View File

@ -1,12 +0,0 @@
import { Component } from '@angular/core';
@Component({
selector: 'openaire-error',
template: `
<error></error>
`
})
export class OpenaireErrorPageComponent {
}

View File

@ -1,13 +0,0 @@
import {NgModule} from '@angular/core';
import {RouterModule} from '@angular/router';
import {FosComponent} from './fos.component';
import {PreviousRouteRecorder} from '../openaireLibrary/utils/piwik/previousRouteRecorder.guard';
@NgModule({
imports: [
RouterModule.forChild([
{ path: '', component: FosComponent, canDeactivate: [PreviousRouteRecorder] }
])
]
})
export class FosRoutingModule { }

View File

@ -1,145 +0,0 @@
<schema2jsonld *ngIf="url" [URL]="url" [name]="pageTitle" type="other" [description]="pageDescription"></schema2jsonld>
<div class="uk-container uk-container-large uk-section uk-section-small uk-padding-remove-bottom">
<div class="uk-padding-small uk-padding-remove-horizontal">
<breadcrumbs [breadcrumbs]="breadcrumbs"></breadcrumbs>
</div>
</div>
<div class="uk-container uk-container-large uk-section" uk-scrollspy="target: [uk-scrollspy-class]; cls: uk-animation-slide-bottom-medium; delay: 200">
<div class="uk-grid uk-grid-large uk-grid-stack uk-padding-small" uk-grid>
<div class="uk-width-3-5@m uk-width-1-1@s uk-flex uk-flex-column uk-flex-center">
<span class="uk-align-left uk-margin-remove-bottom">
<span uk-scrollspy-class class="uk-text-large" style="color: #EEB204">Beta</span>
</span>
<div style="max-width: 600px;">
<h1 uk-scrollspy-class class="uk-h1 uk-margin-remove-top">
<span>Fields of Science <span class="uk-text-primary">.</span></span>
</h1>
<div uk-scrollspy-class>
We have integrated a Field-of-Science (FoS) taxonomy into our dataset to organize and discover research more effectively. Using the full capabilities of the OpenAIRE Research Graph (full-texts, citations, references, venues) we apply AI and bring forward any multidisciplinarity potential.
</div>
<div class="uk-text-meta uk-margin-top" uk-scrollspy-class>
Our work is based on the work from our partner Athena Research Center: SciNoBo : A Hierarchical Multi-Label Classifier of Scientific Publications - <a href="https://arxiv.org/abs/2204.00880" target="_blank">https://arxiv.org/abs/2204.00880</a>
</div>
<!-- TODO: We need a page for the button link -->
<!-- <div>
<a class="uk-display-inline-block uk-text-uppercase uk-button uk-button-text uk-margin-top" uk-scrollspy-class
routerLinkActive="router-link-active" routerLink="/">
<span class="uk-flex uk-flex-middle">
<span>Learn More</span>
</span>
</a>
</div> -->
</div>
</div>
<div class="uk-width-2-5@m uk-width-1-1@s uk-text-center" uk-scrollspy-class>
<img src="../../assets/explore-assets/fos-hero-img.svg" loading="lazy">
</div>
</div>
</div>
<div class="uk-container uk-container-large uk-section" uk-scrollspy="target: [uk-scrollspy-class]; cls: uk-animation-slide-bottom-medium; delay: 200">
<div class="uk-grid uk-flex uk-flex-middle uk-flex-center uk-padding-small" uk-grid>
<div class="uk-margin-large-bottom">
<div search-input [searchControl]="keywordControl" [options]="fosOptions" placeholder="Search" (searchEmitter)="onSubmit()"
class="uk-width-large"></div>
</div>
</div>
<ng-container *ngIf="keyword && keyword.length">
<div class="uk-padding-small">
<div class="uk-margin-small-bottom">Search results for:</div>
<span class="uk-display-inline-block">
<span class="uk-label uk-label-primary uk-flex uk-flex-middle">
<span class="uk-margin-small-right uk-width-expand uk-text-truncate">{{keyword}}</span>
<!-- <icon class="uk-text-muted" name="close" flex="true" ratio="0.7"></icon> -->
<button class="uk-close uk-icon" [attr.uk-tooltip]="'Remove'" (click)="clearKeyword()">
<icon name="close" flex="true" ratio="0.7"></icon>
</button>
</span>
<!-- <a [attr.uk-tooltip]="'Remove'" (click)="clearKeyword()" class="uk-link-reset">
<span class="uk-label uk-label-primary uk-flex uk-flex-middle">
<span class="uk-margin-small-right uk-width-expand">{{keyword}}</span>
<button class="uk-close uk-icon">
<icon name="close" flex="true" ratio="0.7"></icon>
</button>
</span>
</a> -->
</span>
</div>
</ng-container>
<ng-container *ngIf="!keyword">
<div class="uk-margin-top uk-padding-small">
<div class="uk-grid uk-grid-large" uk-grid>
<div class="uk-width-1-4">
<ul class="uk-nav uk-nav-default">
<li *ngFor="let item of fos; index as i"
class="uk-margin-small-bottom uk-text-capitalize"
[class]="index == i ? 'uk-active':''"
(click)="changeDisplayedFos(i)">
<a class="uk-padding-remove">{{item.id}}</a>
</li>
</ul>
</div>
<div *ngIf="fos[index]" class="uk-width-3-4">
<div class="uk-text-capitalize">
<h2 class="uk-h4 uk-margin-remove">
<a [routerLink]="properties.searchLinkToResults" [queryParams]="{'fos': urlEncodeAndQuote(fos[index].id)}"
class="uk-link-text">
{{fos[index].id}}
</a>
</h2>
</div>
<div class="uk-grid uk-child-width-1-3 uk-margin-large-top uk-margin-medium-bottom" uk-grid="masonry: false">
<div *ngFor="let child of fos[index].children">
<div class="whole-child uk-text-capitalize">
<h3 class="uk-h6 uk-margin-small-bottom">
<a [routerLink]="properties.searchLinkToResults" [queryParams]="{'fos': urlEncodeAndQuote(child.id)}"
class="uk-link-text">
{{child.id}}
</a>
</h3>
<div *ngFor="let subChild of child.children" style="margin-bottom: 5px;">
<a [routerLink]="properties.searchLinkToResults" [queryParams]="{'fos': urlEncodeAndQuote(subChild.id)}"
class="uk-link-text">
{{subChild.id}}
</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</ng-container>
<ng-container *ngIf="keyword && keyword.length">
<div class="uk-margin-medium-top uk-padding-small">
<ng-container *ngFor="let item of viewResults; let i=index">
<div
class="uk-margin-large-bottom uk-padding uk-padding-remove-top uk-padding-remove-horizontal uk-text-capitalize" [class.custom-bottom-border]="i < viewResults.length - 1">
<h2 class="uk-h4 uk-margin-remove">
<a [routerLink]="properties.searchLinkToResults" [queryParams]="{'fos': urlEncodeAndQuote(item.id)}"
class="uk-link-text" [innerHTML]="highlightKeyword(item.id)">
</a>
</h2>
<div class="uk-grid uk-child-width-1-3 uk-margin-large-top uk-margin-medium-bottom" uk-grid="masonry: false">
<div *ngFor="let subItem of item.children">
<h3 class="uk-h6 uk-margin-small-bottom">
<a [routerLink]="properties.searchLinkToResults" [queryParams]="{'fos': urlEncodeAndQuote(subItem.id)}"
class="uk-link-text" [innerHTML]="highlightKeyword(subItem.id)">
</a>
</h3>
<div *ngFor="let subSubItem of subItem.children" style="margin-bottom: 5px;">
<a [routerLink]="properties.searchLinkToResults" [queryParams]="{'fos': urlEncodeAndQuote(subSubItem.id)}"
class="uk-link-text" [innerHTML]="highlightKeyword(subSubItem.id)">
</a>
</div>
</div>
</div>
</div>
</ng-container>
<ng-container *ngIf="!viewResults?.length">
<div class="uk-padding uk-text-center">
<h2 class="uk-h3">No results were found.</h2>
</div>
</ng-container>
</div>
</ng-container>
</div>

View File

@ -1,5 +0,0 @@
@import (reference) "~src/assets/openaire-theme/less/_import-variables";
.custom-bottom-border {
border-bottom: 5px solid fade(@explore-color, @global-opacity);
}

View File

@ -1,177 +0,0 @@
import {HttpClient} from "@angular/common/http";
import {Component, OnDestroy, OnInit} from "@angular/core";
import {Subscription} from "rxjs";
import {Breadcrumb} from "../openaireLibrary/utils/breadcrumbs/breadcrumbs.component";
import {EnvProperties} from "../openaireLibrary/utils/properties/env-properties";
import {properties} from "src/environments/environment";
import {FormBuilder, FormControl} from "@angular/forms";
import {ActivatedRoute, Router} from "@angular/router";
import {Meta, Title} from "@angular/platform-browser";
import {Location} from "@angular/common";
import {StringUtils} from "../openaireLibrary/utils/string-utils.class";
import {SEOService} from "../openaireLibrary/sharedComponents/SEO/SEO.service";
import {PiwikService} from "../openaireLibrary/utils/piwik/piwik.service";
@Component({
selector: 'fos',
templateUrl: 'fos.component.html',
styleUrls: ['fos.component.less']
})
export class FosComponent implements OnInit, OnDestroy {
public url: string = null;
public pageTitle: string = "OpenAIRE | Fields of Science";
public pageDescription: string = "We have integrated a Field-of-Science (FoS) taxonomy into our dataset to organize and discover research more effectively. Using the full capabilities of the OpenAIRE Research Graph (full-texts, citations, references, venues) we apply AI and bring forward any multidisciplinarity potential.";
public fos: any[] = [];
public fosOptions: string[] = [];
public index: number = 0;
public keywordControl: FormControl;
public keyword: string = null;
public viewResults = [];
public result = [];
properties: EnvProperties = properties;
public breadcrumbs: Breadcrumb[] = [{name: 'home', route: '/'}, {name: 'Fields of Science'}];
subscriptions: Subscription[] = [];
constructor(
private httpClient: HttpClient,
private fb: FormBuilder,
private location: Location,
private route: ActivatedRoute,
private _router: Router,
private _meta: Meta,
private _title: Title,
private seoService: SEOService,
private _piwikService: PiwikService
) {}
ngOnInit() {
if (this.properties.enablePiwikTrack && (typeof document !== 'undefined')) {
this.subscriptions.push(this._piwikService.trackView(this.properties, this.pageTitle, this.properties.piwikSiteId).subscribe());
}
this.url = this.properties.domain + this.properties.baseLink + this._router.url;
this.seoService.createLinkForCanonicalURL(this.url);
this.updateUrl(this.url);
this.updateTitle(this.pageTitle);
this.updateDescription(this.pageDescription);
this.keywordControl = this.fb.control('');
this.httpClient.get(properties.domain+'/assets/vocabulary/fos.json').subscribe(data => {
this.fos = data['fos'];
this.convertFosToOptions();
this.subscriptions.push(this.route.queryParams.subscribe(params => {
if(params.keyword) {
this.keywordControl.setValue(params.keyword);
this.keyword = this.keywordControl.value;
this.findMatches();
}
}));
});
}
public ngOnDestroy() {
for (let sub of this.subscriptions) {
sub.unsubscribe();
}
}
changeDisplayedFos(i) {
this.index = i;
}
onSubmit() {
if(this.keywordControl.value) {
this.keyword = this.keywordControl.value;
// TODO: router.navigate();
this.location.go(window.location.pathname + '?keyword=' + this.keyword);
this.findMatches();
}
}
convertFosToOptions() {
this.fosOptions = [];
this.fos.forEach(fos => {
this.fosOptions.push(fos.id);
if(fos.children) {
fos.children.forEach(child => {
this.fosOptions.push(child.id);
if(child.children) {
child.children.forEach(child2 => {
this.fosOptions.push(child2.id);
});
}
});
}
});
}
findMatches() {
this.viewResults = JSON.parse(JSON.stringify(this.fos));
let matchLevel1: boolean = false;
let matchLevel2: boolean = false;
// 1st level search
if(this.viewResults.length) {
this.viewResults = this.viewResults.filter(item => {
if(item.id.includes(this.keyword.toLowerCase())) {
matchLevel1 = true;
} else {
matchLevel1 = false;
}
// // 2nd level search
if(item.children?.length && !matchLevel1) {
item.children = item.children.filter(subItem => {
if(subItem.id.includes(this.keyword.toLowerCase())) {
matchLevel2 = true;
} else {
matchLevel2 = false;
}
// 3rd level search
if(subItem.children?.length && !matchLevel2) {
subItem.children = subItem.children.filter(subSubItem => subSubItem.id.includes(this.keyword.toLowerCase()));
}
return subItem.children?.length > 0 || matchLevel2;
});
}
return item.children?.length > 0;
});
}
}
highlightKeyword(name) {
if(name.includes(this.keyword.toLowerCase())) {
return name.replace(new RegExp(this.keyword, "gi"), (matchedValue) => `<mark class="highlighted">${matchedValue}</mark>`);
} else {
return name;
}
}
clearKeyword() {
this.keyword = null;
this.keywordControl.setValue('');
this.location.go(window.location.pathname);
}
public urlEncodeAndQuote(str: string): string {
return StringUtils.quote(StringUtils.URIEncode(str));
}
private updateUrl(url: string) {
this._meta.updateTag({content: url}, "property='og:url'");
}
private updateTitle(title: string) {
var _title = ((title.length > 50) ? title.substring(0, 50) : title);
this._title.setTitle(_title);
this._meta.updateTag({content: _title}, "property='og:title'");
}
private updateDescription(description: string) {
this._meta.updateTag({content: description}, "name='description'");
this._meta.updateTag({content: description}, "property='og:description'");
}
}

View File

@ -1,34 +0,0 @@
import {CommonModule} from "@angular/common";
import {NgModule} from "@angular/core";
import {FormsModule} from "@angular/forms";
import {RouterModule} from "@angular/router";
import {PreviousRouteRecorder} from "../openaireLibrary/utils/piwik/previousRouteRecorder.guard";
import {IconsModule} from "../openaireLibrary/utils/icons/icons.module";
import {BreadcrumbsModule} from "../openaireLibrary/utils/breadcrumbs/breadcrumbs.module";
import {Schema2jsonldModule} from "../openaireLibrary/sharedComponents/schema2jsonld/schema2jsonld.module";
import {SearchInputModule} from "../openaireLibrary/sharedComponents/search-input/search-input.module";
import {SEOServiceModule} from "../openaireLibrary/sharedComponents/SEO/SEOService.module";
import {PiwikService} from "../openaireLibrary/utils/piwik/piwik.service";
import {FosRoutingModule} from './fos-routing.module';
import {FosComponent} from './fos.component';
@NgModule({
imports: [
CommonModule, FormsModule, RouterModule,
FosRoutingModule, BreadcrumbsModule, IconsModule,
SearchInputModule, Schema2jsonldModule, SEOServiceModule
],
declarations: [
FosComponent
],
providers: [
PreviousRouteRecorder, PiwikService
],
exports: [
FosComponent
]
})
export class FosModule {
}

View File

@ -0,0 +1,19 @@
import {NgModule} from '@angular/core';
import {RouterModule} from '@angular/router';
import {FundersComponent} from './funders.component';
import {IsRouteEnabled} from "../openaireLibrary/error/isRouteEnabled.guard";
import {PreviousRouteRecorder} from "../openaireLibrary/utils/piwik/previousRouteRecorder.guard";
@NgModule({
imports: [
RouterModule.forChild([
{
path: '', component: FundersComponent,
canActivate: [IsRouteEnabled],
canDeactivate: [PreviousRouteRecorder]
}
])
]
})
export class FundersRoutingModule { }

View File

@ -0,0 +1,377 @@
<schema2jsonld *ngIf="url" [URL]="url" [name]="pageTitle" type="other" [description]="pageDescription"></schema2jsonld>
<div class="funders">
<div class="uk-background-muted">
<div class="uk-container uk-container-large uk-section uk-section-small uk-padding-remove-bottom">
<div class="uk-padding-small uk-padding-remove-horizontal">
<breadcrumbs [breadcrumbs]="breadcrumbs"></breadcrumbs>
</div>
</div>
<div class="uk-container uk-container-large uk-section" uk-scrollspy="target: [uk-scrollspy-class]; cls: uk-animation-slide-bottom-medium; delay: 200">
<div class="uk-grid uk-grid-large uk-grid-stack uk-flex-middle uk-padding-small" uk-grid>
<div class="uk-width-1-2@m uk-width-1-1 uk-flex uk-flex-column uk-flex-center">
<span class="uk-align-left uk-margin-remove-bottom uk-flex uk-flex-middle">
<span class="custom-coins-dot"></span>
<span uk-scrollspy-class class="uk-text-large funders-title">Funders</span>
</span>
<div style="max-width: 600px;">
<h1 uk-scrollspy-class class="uk-h1 uk-margin-remove-top">
<span>Be an integral part of the open R&I ecosystem<span class="custom-handshake-dot"></span></span>
</h1>
<div uk-scrollspy-class>
Welcome to the Funders page on OpenAIRE Explore. Discover key details about each funder, their commitment to open access, and the impactful research they enable. Our aim? To foster transparency, inspire collaboration.
<!-- Welcome to the Funders' page on OpenAIRE Explore. This dedicated hub spotlights our ever-growing extensive network of funding partners:
{{formatNumber(projectsNumber)}} grants from
{{formatNumber(fundersNumber)}} funders currently linked to
{{formatNumber(researchProductsNumber)}} funded research outputs.
Discover key details about each funder, their commitment to open access, and the impactful research they enable.
Our aim? To foster transparency, inspire collaboration. -->
</div>
<div class="uk-margin-medium-top" uk-scrollspy-class>
<a class="uk-button uk-button-primary uk-text-uppercase" target="_blank" href="https://www.openaire.eu/funders-how-to-join-guide">
Join Us
</a>
</div>
<div *ngIf="showContentWithNumbers" class="uk-margin-medium-top" uk-scrollspy-class>
<div class="uk-grid uk-grid-divider" uk-grid>
<div class="uk-flex uk-flex-column uk-flex-center">
<span class="uk-h4 uk-text-primary uk-margin-xsmall-bottom">
{{formatNumber(projectsNumber)}}+
</span>
<span class="uk-text-uppercase">
grants
</span>
</div>
<div class="uk-flex uk-flex-column uk-flex-center">
<span class="uk-h4 uk-text-primary uk-margin-xsmall-bottom">
{{formatNumber(fundersNumber)}}
</span>
<span class="uk-text-uppercase">
funders
</span>
</div>
<div class="uk-flex uk-flex-column uk-flex-center">
<span class="uk-h4 uk-text-primary uk-margin-xsmall-bottom">
{{formatNumber(researchProductsNumber)}}+
</span>
<span class="uk-text-uppercase">
funded research outputs
</span>
</div>
</div>
</div>
</div>
</div>
<div class="uk-width-1-2@m uk-width-1-1 uk-text-center" uk-scrollspy-class>
<img src="assets/explore-assets/funders/funders.png" alt="Funders advertisement image">
</div>
</div>
</div>
</div>
<ng-container *ngIf="showLoading">
<div class="uk-container uk-container-large uk-section">
<loading></loading>
</div>
</ng-container>
<ng-container *ngIf="!showLoading && funders?.length">
<div class="uk-container uk-container-large">
<div id="target" class="uk-section uk-padding-remove-top uk-margin-top" uk-height-match="target: .shortName;">
<div>
<div *ngIf="funders" class="uk-padding-small uk-padding-remove-vertical uk-margin-medium-bottom uk-flex uk-flex-wrap uk-flex-middle uk-flex-between">
<div class="uk-flex uk-flex-wrap uk-flex-middle uk-flex-between uk-width-auto@m uk-width-1-1 uk-margin-top">
<div class="uk-width-small uk-margin-medium-right">
<div input
type="select" placeholder="Show" inputClass="border-bottom"
[options]="showOptions" [(value)]="show" (valueChange)="filtering()">
</div>
</div>
<div class="uk-width-small uk-margin-medium-right">
<div input
type="select" placeholder="Sort by" inputClass="border-bottom"
[options]="sortOptions" [(value)]="sortBy" (valueChange)="sortByChanged()">
</div>
</div>
<div class="uk-width-xsmall">
<div input
type="select" placeholder="Results per page" inputClass="border-bottom"
[options]="pageOptions" [(value)]="pageSize" (valueChange)="sizeChanged($event)">
</div>
</div>
</div>
<div class="uk-flex uk-flex-middle uk-width-auto@m uk-width-1-1 uk-margin-top">
<div search-input [searchControl]="keywordControl" searchInputClass="border-bottom" iconPosition="right"
placeholder="Search funder" [disabled]="showLoading" class="uk-width-auto@m uk-width-medium@s uk-width-1-1">
</div>
<div class="uk-visible@m uk-flex uk-flex-middle uk-margin-medium-left">
<a (click)="gridView = true"
class="uk-link-reset custom-view-button" [ngClass]="gridView ? 'active' : ''">
<icon [name]="'apps'" [ratio]="1.5" [type]="'round'" [flex]="true"></icon>
</a>
<a (click)="gridView = false"
class="uk-link-reset custom-view-button uk-margin-xsmall-left" [ngClass]="gridView ? '' : 'active'">
<icon [name]="'view_list'" [ratio]="1.5" [type]="'round'" [flex]="true"></icon>
</a>
</div>
</div>
</div>
</div>
<div class="uk-margin-large-bottom" uk-height-match="target: .name;">
<div *ngIf="!displayedFunders || displayedFunders?.length == 0" class="uk-text-center uk-margin-large-top">
No funders available
</div>
<div class="uk-grid uk-grid-match uk-padding-small" [ngClass]="gridView ? 'uk-child-width-1-2@m uk-child-width-1-3@l' : 'uk-child-width-1-1'"
uk-grid uk-height-match="target: .data;">
<div *ngFor="let funder of displayedFunders.slice((currentPage-1)*pageSize, currentPage*pageSize)">
<!-- funder's card for GRID view -->
<ng-container *ngIf="gridView || isMobile; else elseBlock">
<div class="uk-card uk-card-default uk-card-hover funder-grid">
<div class="uk-position-top-left uk-padding-small">
<!-- <span class="uk-text-xsmall">flag</span>-->
<span class="fi" [ngClass]="'fi-'+funder.country | lowercase"></span>
</div>
<div *ngIf="funder.registered" class="uk-position-top-right uk-padding-small">
<div class="uk-flex uk-flex-middle uk-text-xsmall uk-text-meta">
<div class="uk-icon-bg uk-icon-bg-small">
<icon name="done" [flex]="true"></icon>
</div>
<span class="uk-margin-xsmall-left">Registered</span>
</div>
</div>
<div class="uk-card-media-top uk-margin-medium-top uk-padding-large uk-padding-remove-vertical uk-flex uk-flex-center uk-flex-middle uk-height-xsmall">
<img *ngIf="funder.logoUrl; else elseBlock" [src]="funder | logoUrl" [alt]="funder.name + ' logo'" class="uk-height-max-xsmall uk-blend-multiply" loading="lazy">
<ng-template #elseBlock>
<img src="assets/common-assets/placeholder.png" alt="OpenAIRE placeholder logo" class="uk-height-max-xsmall uk-blend-multiply" loading="lazy">
</ng-template>
</div>
<div class="uk-padding-small uk-padding-remove-vertical uk-padding-remove-left uk-margin-medium-left">
<!-- shortName -->
<div class="shortName uk-text-uppercase uk-text-small uk-margin-top type">
<ng-container *ngIf="funder.shortName">
{{funder.shortName}}
</ng-container>
</div>
<div class="uk-flex">
<div class="uk-width-expand name uk-h6 uk-margin-remove multi-line-ellipsis lines-2">
<ng-container *ngIf="funder.name" >
<span>{{funder.name}}</span>
</ng-container>
</div>
<div *ngIf="funder.websiteUrl" class="uk-width-auto uk-margin-left">
<a [href]="funder.websiteUrl" target="_blank" class="uk-flex-inline uk-flex-middle uk-text-uppercase uk-button uk-button-text custom-external">
<icon name="payment" [flex]="true"></icon>
</a>
</div>
</div>
</div>
<div class="data uk-background-muted uk-flex uk-flex-middle uk-padding-small uk-padding-remove-left uk-margin-top">
<div class="uk-flex uk-flex-middle uk-width-1-1 uk-child-width-1-2 uk-margin-medium-left">
<div>
<!-- Projects -->
<div *ngIf="funder.projects" class="uk-flex uk-flex-column" [class.uk-margin-small-bottom]="funder.researchProducts">
<span class="uk-text-meta uk-text-xsmall">
Projects
</span>
<a
class="uk-link-text uk-text-large uk-text-bold"
[routerLink]="properties.searchLinkToProjects" [queryParams]="{'funder': urlEncodeAndQuote(funder.id)}">
<span>
{{funder.projects | number}}
</span>
</a>
</div>
<!-- Research products -->
<div *ngIf="funder.researchProducts" class="uk-flex uk-flex-column">
<span class="uk-text-meta uk-text-xsmall">
Research Products
</span>
<a
class="uk-link-text uk-text-large uk-text-bold"
[routerLink]="properties.searchLinkToResults" [queryParams]="{'relfunder': urlEncodeAndQuote(funder.id)}">
<span>
{{funder.researchProducts | number}}
</span>
</a>
</div>
</div>
<div class="uk-flex uk-flex-column uk-flex-middle uk-flex-center">
<div class="uk-progress-semicircle uk-progress-semicircle-small" [attr.percentage]="funder.openAccessPercentage" [style]="'--percentage:' + funder.openAccessPercentage"></div>
<div class="uk-flex uk-flex-middle uk-margin-top">
<icon class="open-access" [name]="'open_access'" [flex]="true" [ratio]="0.8"></icon>
<span class="uk-text-xsmall uk-margin-xsmall-left">Open Access</span>
</div>
</div>
</div>
</div>
<div class="monitor-dashboard uk-padding-small uk-padding-remove-left uk-margin-medium-left">
<a *ngIf="funder.monitorDashboard && funder.monitorDashboardStatus && funder.monitorDashboardStatus != 'PRIVATE' && funder.monitorDashboardStatus != 'RESTRICTED'"
class="uk-display-inline-block uk-text-uppercase uk-button uk-button-text"
target="_blank" [href]="'https://'+(properties.environment =='beta' || properties.environment =='development'?'beta.':'')+'monitor.openaire.eu/dashboard/'+funder.monitorDashboard">
<span class="uk-flex uk-flex-middle">
<img src="assets/common-assets/common/Symbol.png" alt="OpenAIRE logo"
class="uk-margin-xsmall-right" style="width: 17px; height: 17px;" loading="lazy">
<span class="monitor-dashboard-link uk-text-uppercase">Monitor Dashboard</span>
</span>
</a>
<span *ngIf="funder.monitorDashboard && funder.monitorDashboardStatus == 'RESTRICTED'"
class="uk-flex uk-flex-middle">
<img src="assets/common-assets/common/Symbol.png" alt="OpenAIRE logo"
class="uk-margin-xsmall-right" style="width: 17px; height: 17px;" loading="lazy">
<span class="monitor-dashboard-link uk-text-uppercase uk-text-bold uk-text-small">Monitor Dashboard</span>
<icon class="uk-margin-xsmall-left" name="closed_access" [flex]="true" [ratio]="1"></icon>
</span>
<a *ngIf="funder.irishDashboard && funder.irishDashboardStatus && funder.irishDashboardStatus != 'PRIVATE' && funder.irishDashboardStatus != 'RESTRICTED' && properties.environment != 'beta'"
class="uk-display-inline-block uk-text-uppercase uk-button uk-button-text"
target="_blank" [href]="'https://'+(properties.environment =='beta' || properties.environment =='development'?'beta.':'')+'oamonitor.ireland.openaire.eu/rfo/'+funder.irishDashboard">
<span class="uk-flex uk-flex-middle">
<img src="assets/common-assets/common/small_irish.svg" alt="Irish logo"
class="uk-margin-xsmall-right" style="width: 17px; height: 17px;" loading="lazy">
<span class="irish-dashboard-link uk-text-uppercase">RFO Dashboard</span>
</span>
</a>
<span *ngIf="funder.irishDashboard && funder.irishDashboardStatus && (funder.irishDashboardStatus == 'RESTRICTED' || properties.environment =='beta')"
class="uk-flex uk-flex-middle">
<img src="assets/common-assets/common/small_irish.svg" alt="Irish logo"
class="uk-margin-xsmall-right" style="width: 17px; height: 17px;" loading="lazy">
<span class="irish-dashboard-link uk-text-uppercase uk-text-bold uk-text-small">RFO Dashboard</span>
<icon class="uk-margin-xsmall-left" name="closed_access" [flex]="true" [ratio]="1"></icon>
</span>
</div>
</div>
</ng-container>
<!-- funder's card for LIST view -->
<ng-template #elseBlock>
<div class="uk-card uk-card-default uk-card-hover uk-padding-small funder-list">
<div class="uk-grid uk-grid-divider uk-grid-small" uk-grid>
<div class="uk-width-expand uk-flex uk-flex-middle">
<div class="uk-width-1-6 uk-flex uk-flex-middle uk-flex-center">
<img *ngIf="funder.logoUrl; else elseBlock" [src]="funder | logoUrl" [alt]="funder.name + ' logo'" class="uk-height-max-xsmall uk-blend-multiply" loading="lazy">
<ng-template #elseBlock>
<img src="assets/common-assets/placeholder.png" alt="OpenAIRE placeholder logo" class="uk-height-max-xsmall uk-blend-multiply" loading="lazy">
</ng-template>
</div>
<div class="uk-width-expand uk-grid uk-grid-divider uk-child-width-1-2 uk-margin-left" uk-grid>
<div class="uk-flex uk-flex-column uk-flex-center">
<div class="uk-flex uk-flex-middle">
<!-- <span class="uk-text-xsmall uk-margin-small-right">flag</span> -->
<span *ngIf="funder.country" class="fi uk-text-xsmall uk-margin-small-right" [ngClass]="'fi-'+funder.country | lowercase"></span>
<div class="uk-h6 uk-margin-remove uk-text-truncate">
<ng-container *ngIf="funder.name">
<span>{{funder.name}}</span>
</ng-container>
<ng-container *ngIf="funder.shortName" >
<span class="uk-text-uppercase">
({{funder.shortName}})
</span>
</ng-container>
</div>
</div>
<div *ngIf="funder.monitorDashboard || funder.irishDashboard" class="uk-margin-top">
<a *ngIf="funder.monitorDashboard && funder.monitorDashboardStatus && funder.monitorDashboardStatus != 'PRIVATE' && funder.monitorDashboardStatus != 'RESTRICTED'"
class="uk-display-inline-block uk-text-uppercase uk-button uk-button-text"
target="_blank" [href]="'https://'+(properties.environment =='beta' || properties.environment =='development'?'beta.':'')+'monitor.openaire.eu/dashboard/'+funder.monitorDashboard">
<span class="uk-flex uk-flex-middle">
<img src="assets/common-assets/common/Symbol.png" alt="OpenAIRE logo"
class="uk-margin-xsmall-right" style="width: 17px; height: 17px;" loading="lazy">
<span class="monitor-dashboard-link uk-text-uppercase">Monitor Dashboard</span>
</span>
</a>
<span *ngIf="funder.monitorDashboard && funder.monitorDashboardStatus == 'RESTRICTED'"
class="uk-flex uk-flex-middle">
<img src="assets/common-assets/common/Symbol.png" alt="OpenAIRE logo"
class="uk-margin-xsmall-right" style="width: 17px; height: 17px;" loading="lazy">
<span class="monitor-dashboard-link uk-text-uppercase uk-text-bold uk-text-small">Monitor Dashboard</span>
<icon class="uk-margin-xsmall-left" name="closed_access" [flex]="true" [ratio]="1"></icon>
</span>
<a *ngIf="funder.irishDashboard && funder.irishDashboardStatus && funder.irishDashboardStatus != 'PRIVATE' && funder.irishDashboardStatus != 'RESTRICTED' && properties.environment != 'beta'"
class="uk-display-inline-block uk-text-uppercase uk-button uk-button-text"
target="_blank" [href]="'https://'+(properties.environment =='beta' || properties.environment =='development'?'beta.':'')+'monitor.openaire.eu/dashboard/'+funder.irishDashboard">
<span class="uk-flex uk-flex-middle">
<img src="assets/common-assets/common/small_irish.svg" alt="Irish logo"
class="uk-margin-xsmall-right" style="width: 17px; height: 17px;" loading="lazy">
<span class="irish-dashboard-link uk-text-uppercase">RFO Dashboard</span>
</span>
</a>
<span *ngIf="funder.irishDashboard && funder.irishDashboardStatus && (funder.irishDashboardStatus == 'RESTRICTED' || properties.environment == 'beta')"
class="uk-flex uk-flex-middle">
<img src="assets/common-assets/common/small_irish.svg" alt="Irish logo"
class="uk-margin-xsmall-right" style="width: 17px; height: 17px;" loading="lazy">
<span class="irish-dashboard-link uk-text-uppercase uk-text-bold uk-text-small">RFO Dashboard</span>
<icon class="uk-margin-xsmall-left" name="closed_access" [flex]="true" [ratio]="1"></icon>
</span>
</div>
</div>
<div class="uk-flex uk-flex-middle uk-child-width-1-3">
<div>
<div *ngIf="funder.projects" class="uk-flex uk-flex-column">
<span class="uk-text-meta uk-text-xsmall">
Projects
</span>
<a
class="uk-link-text uk-text-large uk-text-bold"
[routerLink]="properties.searchLinkToProjects" [queryParams]="{'funder': urlEncodeAndQuote(funder.id)}">
<span>
{{funder.projects | number}}
</span>
</a>
</div>
</div>
<div>
<div *ngIf="funder.researchProducts" class="uk-flex uk-flex-column">
<span class="uk-text-meta uk-text-xsmall">
Research Products
</span>
<a
class="uk-link-text uk-text-large uk-text-bold"
[routerLink]="properties.searchLinkToResults" [queryParams]="{'relfunder': urlEncodeAndQuote(funder.id)}">
<span>
{{funder.researchProducts | number}}
</span>
</a>
</div>
</div>
<div>
<div *ngIf="funder.openAccessResearchProducts && funder.researchProducts" class="uk-flex uk-flex-column">
<span class="uk-text-meta uk-text-xsmall">Open Access</span>
<div class="uk-flex uk-flex-middle">
<span class="uk-margin-xsmall-right open-access">
<icon name="open_access" [flex]="true" [ratio]="0.8"></icon>
</span>
<span class="uk-text-large uk-text-bold">{{funder.openAccessPercentage}}%</span>
</div>
</div>
</div>
</div>
</div>
</div>
<div *ngIf="funder.registered || funder.websiteUrl" class="uk-width-auto uk-flex uk-flex-column uk-flex-center uk-margin-right">
<div *ngIf="funder.registered" class="uk-flex uk-flex-middle uk-text-xsmall uk-text-meta uk-margin-bottom">
<div class="uk-icon-bg uk-icon-bg-small">
<icon name="done" [flex]="true"></icon>
</div>
<span class="uk-margin-xsmall-left">Registered</span>
</div>
<div *ngIf="funder.websiteUrl">
<a [href]="funder.websiteUrl" target="_blank" class="uk-flex-inline uk-flex-middle uk-text-uppercase uk-button uk-button-text custom-external">
<icon name="payment" [flex]="true"></icon>
</a>
</div>
</div>
</div>
</div>
</ng-template>
</div>
</div>
</div>
<paging-no-load *ngIf="displayedFunders.length > pageSize"
(pageChange)="updateCurrentPage($event)"
[currentPage]="currentPage" [size]="pageSize"
[totalResults]="displayedFunders.length">
</paging-no-load>
</div>
</div>
</ng-container>
</div>

View File

@ -0,0 +1,54 @@
@import (reference) "~src/assets/openaire-theme/less/color.less";
@import "flag-icons/css/flag-icons.min.css";
@irish-color: #FF7901;
.irish-dashboard-link {
color: @irish-color;
}
.custom-coins-dot:after {
content: "";
background-image: url("~src/assets/explore-assets/funders/coins.svg");
display: inline-block;
background-size: 100% 100%;
height: 35px;
width: 35px;
margin-right: 10px;
}
.custom-handshake-dot:after {
content: "";
background-image: url("~src/assets/explore-assets/funders/handshake.svg");
display: inline-block;
background-size: 100% 100%;
height: 30px;
width: 30px;
margin-left: 10px;
}
//.custom-view-button {
// padding: 4px;
// background: @light-color;
// border: 1px solid @disable-color;
// border-radius: 4px;
// icon {
// color: @disable-color;
// }
//
// &.active {
// background: transparent linear-gradient(315deg, @primary-light-color 0%, @primary-dark-color 100%) 0% 0% no-repeat padding-box;
// icon {
// color: @light-color;
// }
// }
//}
// .uk-card {
// &.funder-grid {
// border-bottom: 4px solid fade(@funder-color, 30%);
// }
// &.funder-list {
// border-left: 4px solid fade(@funder-color, 30%);
// }
// }

View File

@ -0,0 +1,426 @@
import {ChangeDetectorRef, Component, OnInit} from '@angular/core';
import {Router} from '@angular/router';
import {Subscriber, Subscription, zip} from "rxjs";
import {Meta, Title} from "@angular/platform-browser";
import {EnvProperties} from "../openaireLibrary/utils/properties/env-properties";
import {PiwikService} from "../openaireLibrary/utils/piwik/piwik.service";
import {SEOService} from "../openaireLibrary/sharedComponents/SEO/SEO.service";
import {Breadcrumb} from "../openaireLibrary/utils/breadcrumbs/breadcrumbs.component";
import {properties} from "../../environments/environment";
import {RefineFieldResultsService} from '../openaireLibrary/services/refineFieldResults.service';
import {StakeholderService} from '../openaireLibrary/monitor/services/stakeholder.service';
import {Option} from '../openaireLibrary/sharedComponents/input/input.component';
import {StringUtils} from '../openaireLibrary/utils/string-utils.class';
import {HelperFunctions} from '../openaireLibrary/utils/HelperFunctions.class';
import {NumberUtils} from '../openaireLibrary/utils/number-utils.class';
import {LayoutService} from '../openaireLibrary/dashboard/sharedComponents/sidebar/layout.service';
import {FormBuilder, FormControl} from '@angular/forms';
import {debounceTime, distinctUntilChanged} from 'rxjs/operators';
import {GroupedRequestsService} from "../openaireLibrary/services/groupedRequests.service";
import {OpenaireEntities} from "../openaireLibrary/utils/properties/searchFields";
@Component({
selector: 'funders',
templateUrl: './funders.component.html',
styleUrls: ['funders.component.less']
})
export class FundersComponent implements OnInit {
private subscriptions: Subscription[] = [];
url: string = null;
pageTitle: string = "OpenAIRE - Explore | Funders";
pageDescription: string = "Funders | Be an integral part of the open R&I ecosystem";
properties: EnvProperties = properties;
public openaireEntities = OpenaireEntities;
breadcrumbs: Breadcrumb[] = [{name: 'home', route: '/'}, {name: 'funders'}];
showLoading: boolean = true;
isMobile: boolean = false;
funders: any[] = [];
displayedFunders: any[] = [];
showOptions: Option[];
sortOptions: Option[];
pageOptions: number[] = [10, 20, 30, 40];
show: string = 'all';
sortBy: string = 'alphAsc';
gridView: boolean = true;
currentPage: number = 1;
pageSize: number = 10;
keywordControl: FormControl;
keyword: string;
fundersNumber: number = 0;
researchProductsNumber: number = 0;
projectsNumber: number = 0;
fundersMap = new Map<string, {
"id": string,
"name": string,
"shortName": string,
// "alias": string,
// "irishAlias": string,
"researchProducts": number,
"openAccessResearchProducts": number,
"openAccessPercentage": number,
"projects": number,
"monitorDashboard": string,
"monitorDashboardStatus": string,
"irishDashboard": string,
"irishDashboardStatus": string,
"logoUrl": string,
"websiteUrl": string,
"country": string,
"registered": boolean
}>();
staticLogos: Map<string, string> = new Map<string, string>([
["arc_________::ARC||Australian Research Council (ARC)||ARC", "ARC"],
["asap________::ASAP||Aligning Science Across Parkinson's||ASAP", "ASAP"],
["cihr________::CIHR||Canadian Institutes of Health Research||CIHR", "CIHR"],
["euenvagency_::EEA||European Environment Agency||EEA", "EEA"],
["inca________::INCA||Institut National du Cancer||INCa", "INCa"],
["nhmrc_______::NHMRC||National Health and Medical Research Council (NHMRC)||NHMRC", "NHMRC"],
["nih_________::NIH||National Institutes of Health||NIH", "NIH"],
["nserc_______::NSERC||Natural Sciences and Engineering Research Council of Canada||NSERC", "NSERC"],
["nsf_________::NSF||National Science Foundation||NSF", "NSF"],
["sshrc_______::SSHRC||Social Sciences and Humanities Research Council||SSHRC", "SSHRC"],
["taraexp_____::tara||Tara Expeditions Foundation||TARA", "TARA"],
["ukri________::UKRI||UK Research and Innovation||UKRI", "UKRI"],
["wt__________::WT||Wellcome Trust||WT", "WT"]
]);
constructor(private router: Router,
private meta: Meta,
private title: Title,
private seoService: SEOService,
private piwikService: PiwikService,
private refineFieldResultsService: RefineFieldResultsService,
private stakeholderService: StakeholderService,
private layoutService: LayoutService,
private cdr: ChangeDetectorRef,
private fb: FormBuilder,
private groupedRequestsService: GroupedRequestsService) {
}
ngOnInit() {
this.layoutService.setRootClass('funders');
this.title.setTitle('OpenAIRE - Explore | Funders');
this.subscriptions.push( this.piwikService.trackView(this.properties, this.pageTitle).subscribe());
this.url = this.properties.domain + this.router.url;
this.seoService.createLinkForCanonicalURL(this.url);
this.updateUrl(this.url);
this.updateTitle(this.pageTitle);
this.updateDescription(this.pageDescription);
this.subscriptions.push(this.layoutService.isMobile.subscribe(isMobile => {
this.isMobile = isMobile;
this.cdr.detectChanges();
}));
this.showOptions = [
{value: 'all', label: 'All funders'},
{value: 'monitor', label: 'Funders with Monitor dashboard'},
{value: 'rfo', label: 'Funders with RFO dashboard'}
];
this.sortOptions = [
{value: 'alphAsc', label: 'Alphabetically asc. (A-Z)'},
{value: 'alphDsc', label: 'Alphabetically desc. (Z-A)'},
{value: 'oaDsc', label: 'Open Access % desc.'},
{value: 'countryAsc', label: 'Country desc. (A-Z)'},
{value: 'researcProductsDsc', label: this.openaireEntities.RESULTS+' desc.'},
{value: 'projectsDsc', label: this.openaireEntities.PROJECTS+' desc.'}
];
this.getFunders();
this.keywordControl = this.fb.control('');
this.subscriptions.push(this.keywordControl.valueChanges.pipe(debounceTime(500), distinctUntilChanged()).subscribe(value => {
this.keyword = value;
this.filtering();
}));
}
ngOnDestroy() {
this.subscriptions.forEach(subscription => {
if (subscription instanceof Subscriber) {
subscription.unsubscribe();
}
});
this.layoutService.setRootClass(null);
}
private updateDescription(description: string) {
this.meta.updateTag({content: description}, "name='description'");
this.meta.updateTag({content: description}, "property='og:description'");
}
private updateTitle(title: string) {
var title = ((title.length > 50) ? title.substring(0, 50) : title);
this.title.setTitle(title);
this.meta.updateTag({content: title}, "property='og:title'");
}
private updateUrl(url: string) {
this.meta.updateTag({content: url}, "property='og:url'");
}
private getFunders() {
this.subscriptions.push(this.groupedRequestsService.funders().subscribe(data => {
let funders = data["funders"];
funders.forEach(queriedFunder => {
let id = queriedFunder.id;
let funder = {
"id": id,
"name": this.removePartAfterCharacters(queriedFunder.name, "||"),
"shortName": queriedFunder.shortName,
// "alias": '',
// "irishAlias": '',
"researchProducts": +queriedFunder.results,
"openAccessResearchProducts": +queriedFunder.openResults,
"openAccessPercentage": 0,
"projects": +queriedFunder.projects,
"monitorDashboard": '',
"monitorDashboardStatus": '',
"irishDashboard": '',
"irishDashboardStatus": '',
"logoUrl": '',
"websiteUrl": '',
"country": queriedFunder.country,
"registered": queriedFunder.registered
};
if((!funder.researchProducts || funder.researchProducts == 0) && (!funder.projects || funder.projects == 0)) {
return;
}
if(queriedFunder.stakeholder) {
let stakeholder = queriedFunder.stakeholder;
// funder.alias = stakeholder.alias;
// funder.irishAlias = stakeholder.irishAlias;
// if(!funder.shortName) {
// funder.shortName = stakeholder.alias;
// }
funder.monitorDashboard = stakeholder.alias;
funder.monitorDashboardStatus = stakeholder.visibility;
funder.irishDashboard = stakeholder.irishAlias;
funder.irishDashboardStatus = stakeholder.irishVisibility;
if(stakeholder.logoUrl) {
funder.logoUrl = (stakeholder.isUpload ? properties.utilsService + "/download/" : "") + (stakeholder.logoUrl);
}
funder.websiteUrl = stakeholder.websiteUrl;
}
if(funder.openAccessResearchProducts && funder.researchProducts) {
funder.openAccessPercentage = Math.round((funder.openAccessResearchProducts / funder.researchProducts) * 100);
}
if(!funder.logoUrl && this.staticLogos.has(funder.id)) {
funder.logoUrl = "assets/explore-assets/funders/logos/"+this.staticLogos.get(funder.id)+".png";
}
this.fundersMap.set(queriedFunder.id, funder);
});
// convert funders map into an array
this.funders = Array.from(this.fundersMap.values());
// calculate total numbers for intro content
this.fundersNumber = data.count;
this.researchProductsNumber = data.results;
this.projectsNumber = data.projects;
// sort funders
this.funders.sort((a, b) => a['name'].localeCompare(b['name']));
// initialize displayedFunders
this.displayedFunders = this.funders;
this.showLoading = false;
}))
// let refineParams = '&fq=resultbestaccessright%20exact%20%22Open%20Access%22';
// this.subscriptions.push(
// zip(
// this.refineFieldResultsService.getAllRefineFieldResultsByFieldName('relfunder', 'result', this.properties),
// this.refineFieldResultsService.getAllRefineFieldResultsByFieldName('relfunder', 'result', this.properties, refineParams),
// this.refineFieldResultsService.getAllRefineFieldResultsByFieldName('funder', 'project', this.properties),
// this.stakeholderService.getStakeholders(this.properties.monitorServiceAPIURL, 'funder')
// ).subscribe((data: any[]) => {
// // storing all needed data to a map
// // 1st call
// let queriedFunders1 = data[0][1][0].values;
// queriedFunders1.forEach(queriedFunder => {
// this.fundersMap.set(queriedFunder.id, {
// "id": queriedFunder.id,
// "name": queriedFunder.name,
// "alias": '',
// "researchProducts": +queriedFunder.number,
// "openAccessResearchProducts": 0,
// "openAccessPercentage": 0,
// "projects": 0,
// "monitorDashboard": '',
// "monitorDashboardStatus": '',
// "logoUrl": ''
// });
// });
//
// // 2nd call
// let queriedFunders2 = data[1][1][0].values;
// queriedFunders2.forEach(queriedFunder => {
// if(this.fundersMap.has(queriedFunder.id)) {
// this.fundersMap.get(queriedFunder.id).openAccessResearchProducts = +queriedFunder.number;
// }
// });
//
// // 3rd call
// let queriedFunders3 = data[2][1][0].values;
// queriedFunders3.forEach(queriedFunder => {
// if(+queriedFunder.number > 1) {
// if (this.fundersMap.has(queriedFunder.id)) {
// this.fundersMap.get(queriedFunder.id).projects = +queriedFunder.number;
// } else {
// this.fundersMap.set(queriedFunder.id, {
// "id": queriedFunder.id,
// "name": queriedFunder.name,
// "alias": '',
// "researchProducts": 0,
// "openAccessResearchProducts": 0,
// "openAccessPercentage": 0,
// "projects": +queriedFunder.number,
// "monitorDashboard": '',
// "monitorDashboardStatus": '',
// "logoUrl": ''
// });
// }
// }
// });
//
// // 4th call
// let queriedFunders4 = data[3];
// queriedFunders4.forEach(queriedFunder => {
// let id = queriedFunder.index_id + '||' + queriedFunder.index_name + '||' + queriedFunder.index_shortName;
// if(this.fundersMap.has(id) && (
// !this.fundersMap.get(id).monitorDashboardStatus
// ||
// (this.fundersMap.get(id).monitorDashboardStatus == "RESTRICTED" && queriedFunder.visibility == "PUBLIC")
// ||
// (this.fundersMap.get(id).monitorDashboardStatus == "PRIVATE" && (queriedFunder.visibility == "RESTRICTED" || queriedFunder.visibility == "PUBLIC")))) {
// this.fundersMap.get(id).alias = queriedFunder.alias;
// this.fundersMap.get(id).monitorDashboard = queriedFunder.alias;
// this.fundersMap.get(id).monitorDashboardStatus = queriedFunder.visibility;
// this.fundersMap.get(id).logoUrl = (queriedFunder.isUpload ? properties.utilsService + "/download/" : "")+ (queriedFunder.logoUrl);
// }
// });
// this.fundersMap.forEach((value) => {
// if(value.openAccessResearchProducts > 0) {
// value.openAccessPercentage = Math.round((value.openAccessResearchProducts / value.researchProducts) * 100);
// }
// if(!value.logoUrl && this.staticLogos.has(value.id)) {
// let split = value.id.split("||");
// let shortname = (split && split.length==3) ? value.id.split("||")[2] : value.id;
// value.logoUrl = "assets/explore-assets/funders/logos/"+shortname+".png";
// }
// });
// // convert funders map into an array
// this.funders = Array.from(this.fundersMap.values());
// // calculate total numbers for intro content
// this.calculateNumbers();
// // sort funders
// this.funders.sort((a, b) => a['name'].localeCompare(b['name']));
// // initialize displayedFunders
// this.displayedFunders = this.funders;
// console.log(this.funders);
// this.showLoading = false;
// })
// );
}
private calculateSum(array, property) {
let sum = 0;
array.forEach(element => {
sum += element[property];
});
return sum;
}
private calculateNumbers() {
this.fundersNumber = this.funders.length;
this.researchProductsNumber = this.calculateSum(this.funders, 'researchProducts');
this.projectsNumber = this.calculateSum(this.funders, 'projects');
}
get showContentWithNumbers() {
return this.fundersNumber && this.researchProductsNumber && this.projectsNumber;
}
formatNumber(num: number | string) {
let formatted = NumberUtils.roundNumber(+num);
return formatted.number + formatted.size;
}
urlEncodeAndQuote(str: string): string {
return StringUtils.quote(StringUtils.URIEncode(str));
}
sortByChanged() {
switch(this.sortBy) {
case 'alphAsc':
this.funders = this.funders.sort((a, b) => a['name'].localeCompare(b['name']));
break;
case 'alphDsc':
this.funders = this.funders.sort((a, b) => b['name'].localeCompare(a['name']));
break;
case 'oaDsc':
this.funders = this.funders.sort((a, b) => b['openAccessPercentage'] - a['openAccessPercentage']);
break;
case 'countryAsc':
this.funders = this.funders.sort((a, b) => {
if(a['country'] && b['country']) {
return a['country'].localeCompare(b['country'])
} else if(!a['country'] && !b['country']) {
return 0;
} else if(!a['country']) {
return 1;
} else {
return -1;
}
});
break;
case "researcProductsDsc":
this.funders = this.funders.sort((a, b) => b['researchProducts'] - a['researchProducts']);
break;
case "projectsDsc":
this.funders = this.funders.sort((a, b) => b['projects'] - a['projects']);
break;
}
this.filtering();
}
sizeChanged($event) {
this.pageSize = $event;
this.currentPage = 1;
}
filtering() {
let displayedFunders = this.funders;
if(!this.keyword){
this.keyword = '';
}
if(this.funders.length) {
displayedFunders = displayedFunders.filter(item => (item['name'] && item['name'].toLowerCase().includes(this.keyword.toLowerCase()))
|| (item['monitorDashboard'] && item['monitorDashboard'].toLowerCase().includes(this.keyword.toLowerCase())
|| (item['irishDashboard'] && item['irishDashboard'].toLowerCase().includes(this.keyword.toLowerCase()))));
}
if(this.show == 'monitor') {
displayedFunders = displayedFunders.filter(funder => funder.monitorDashboard && funder.monitorDashboard?.length > 0 && ((funder.monitorDashboardStatus && funder.monitorDashboardStatus != 'PRIVATE')));
}
if(this.show == 'rfo') {
displayedFunders = displayedFunders.filter(funder => funder.monitorDashboard && funder.monitorDashboard?.length > 0 && ((funder.irishDashboardStatus && funder.irishDashboardStatus != 'PRIVATE')));
}
this.displayedFunders = displayedFunders;
this.currentPage = 1;
}
public updateCurrentPage($event) {
this.currentPage = $event.value;
HelperFunctions.scrollToId('target');
}
private removePartAfterCharacters(field, characters):string {
if(field && field.indexOf(characters) !=-1){
return field.split(characters)[0];
}
return field;
}
}

View File

@ -0,0 +1,44 @@
import {NgModule} from '@angular/core';
import {CommonModule} from '@angular/common';
import {RouterModule} from '@angular/router';
import {FundersComponent} from './funders.component';
import {FundersRoutingModule} from "./funders-routing.module";
import {AlertModalModule} from "../openaireLibrary/utils/modal/alertModal.module";
import {Schema2jsonldModule} from "../openaireLibrary/sharedComponents/schema2jsonld/schema2jsonld.module";
import {SEOServiceModule} from "../openaireLibrary/sharedComponents/SEO/SEOService.module";
import {BreadcrumbsModule} from "../openaireLibrary/utils/breadcrumbs/breadcrumbs.module";
import {LoadingModule} from "../openaireLibrary/utils/loading/loading.module";
import {RefineFieldResultsServiceModule} from '../openaireLibrary/services/refineFieldResultsService.module';
import {LogoUrlPipeModule} from '../openaireLibrary/utils/pipes/logoUrlPipe.module';
import {IconsModule} from '../openaireLibrary/utils/icons/icons.module';
import {IconsService} from '../openaireLibrary/utils/icons/icons.service';
import {open_access} from '../openaireLibrary/utils/icons/icons';
import {closed_access} from '../openaireLibrary/utils/icons/icons';
import {InputModule} from '../openaireLibrary/sharedComponents/input/input.module';
import {PagingModule} from '../openaireLibrary/utils/paging.module';
import {SearchInputModule} from '../openaireLibrary/sharedComponents/search-input/search-input.module';
import {GroupedRequestsServiceModule} from "../openaireLibrary/services/groupedRequestsService.module";
@NgModule({
imports: [
FundersRoutingModule, CommonModule, RouterModule, AlertModalModule,
Schema2jsonldModule, SEOServiceModule, BreadcrumbsModule, LoadingModule,
RefineFieldResultsServiceModule, LogoUrlPipeModule, IconsModule, InputModule,
PagingModule, SearchInputModule, GroupedRequestsServiceModule
],
declarations: [
FundersComponent
],
providers: [],
exports: [
FundersComponent
]
})
export class FundersModule {
constructor(private iconsService: IconsService) {
this.iconsService.registerIcons([open_access, closed_access]);
}
}

View File

@ -1,339 +1,318 @@
<ng-template #_logos let-logo="logo" let-class="class">
<div *ngIf="logo" [class]="'uk-flex uk-flex-middle uk-flex-center uk-padding-remove-horizontal '+class">
<div class="">
<img src="assets/ExploreLogos/{{logo}}" alt="{{logo}} logo" loading="lazy" width="112px" height="44px">
<div *ngIf="logo" [class]="'uk-margin-top uk-flex uk-flex-middle uk-flex-center uk-padding-remove-horizontal '+class">
<div class="">
<!-- <img src="assets/ExploreLogos/grouped/{{logo}}" alt="{{logo}} logo" loading="lazy" width="112px" height="44px">-->
<img src="assets/ExploreLogos/{{logo}}" alt="{{logo}} logo" loading="lazy" width="100%" height="auto">
</div>
</div>
</div>
</ng-template>
<div>
<div class="uk-section uk-padding-remove-bottom uk-overflow-hidden">
<div class="uk-container uk-container-large" uk-scrollspy="target: [uk-scrollspy-class]; cls: uk-animation-slide-bottom-medium; delay: 200">
<div class="uk-grid uk-flex-middle" uk-grid>
<div class="uk-width-3-5@m uk-margin-large-bottom">
<h1 class="uk-h2 uk-width-1-2@m" uk-scrollspy-class>
Discover open linked research<span class="uk-text-primary">.</span>
</h1>
<div *ngIf="showContentWithNumbers" class="uk-margin-top" style="max-width: 600px;" uk-scrollspy-class>
<div>
A comprehensive and open dataset of research information covering
<span class="uk-text-bold">{{numbers.publicationsSize.number|number}}<span class="uk-text-lowercase">{{numbers.publicationsSize.size}}</span> {{openaireEntities.PUBLICATIONS.toLowerCase()}}</span>,
<span class="uk-text-bold">{{numbers.datasetsSize.number|number}}<span class="uk-text-lowercase">{{numbers.datasetsSize.size}}</span> {{openaireEntities.DATASETS.toLowerCase()}}</span>,
<span class="uk-text-bold">{{numbers.softwareSize.number|number}}<span class="uk-text-lowercase">{{numbers.softwareSize.size}}</span> {{openaireEntities.SOFTWARE.toLowerCase()}}</span> items, from
<span class="uk-text-bold">{{numbers.datasourcesSize.number|number}}<span class="uk-text-lowercase">{{numbers.datasourcesSize.size}}</span> {{openaireEntities.DATASOURCES.toLowerCase()}}</span>, linked to
<span class="uk-text-bold">{{numbers.projectsSize.number|number}}<span class="uk-text-lowercase">{{numbers.projectsSize.size}}</span> grants</span> and
<span class="uk-text-bold">{{numbers.organizationsSize.number|number}}<span class="uk-text-lowercase">{{numbers.organizationsSize.size}}</span> {{openaireEntities.ORGANIZATIONS.toLowerCase()}}</span>.
</div>
<div class="uk-text-primary">All linked together through citations and semantics.</div>
</div>
<div [class.uk-invisible]="disableSelect" class="uk-margin-medium-top uk-width-4-5@l uk-width-3-5@xl">
<advanced-search-input #advanced (searchEmitter)="goTo(true)">
<entities-selection [simpleView]="true" currentEntity="all" [selectedEntity]="selectedEntity"
(selectionChange)="entityChanged($event);advanced.focusNext(input, $event)" (disableSelectEmitter)="disableSelectChange($event)"
[onChangeNavigate]="false"></entities-selection>
<div input #input placeholder="Scholary works" [searchable]="true" [hint]="'Search in OpenAIRE'" [(value)]="keyword"></div>
</advanced-search-input>
<div *ngIf="selectedEntity === 'result' && input.focused" (click)="$event.stopPropagation();advanced.focusNext(input, $event)" class="uk-dropdown uk-display-block uk-margin-small-top uk-width-auto">
<div class="uk-padding-small">
<quick-selections [resultTypes]="resultTypes" [quickFilter]="resultsQuickFilter"></quick-selections>
</div>
</div>
</div>
<div class="uk-padding-small uk-margin-small-top">
<div class="uk-text-meta">
Try browsing by:
</div>
<div class="link-actions uk-flex uk-flex-column uk-flex-top uk-margin-small-top">
<a class="uk-display-inline-block uk-text-uppercase uk-button uk-button-text uk-margin-small-bottom"
routerLinkActive="router-link-active" routerLink="/sdgs">
<div class="uk-section uk-padding-remove-bottom uk-overflow-hidden">
<div class="uk-container uk-container-large"
uk-scrollspy="target: [uk-scrollspy-class]; cls: uk-animation-slide-bottom-medium; delay: 200">
<div class="uk-grid uk-flex-middle" uk-grid>
<div class="uk-width-3-5@m uk-margin-large-bottom">
<h1 class="uk-h2 uk-width-1-2@m" uk-scrollspy-class>
Discover open linked research<span class="uk-text-primary">.</span>
</h1>
<numbers #numbersComponent [defaultInit]="false" (results)="numbers = $event"></numbers>
<!-- [class.uk-invisible]="disableSelect" -->
<div class="uk-margin-medium-top" style="max-width: 600px;" uk-scrollspy-class>
<div class="uk-flex uk-flex-right uk-text-small">
<a [routerLink]="properties.searchLinkToAdvancedResults" class="uk-margin-small-bottom">
Advanced search
</a>
</div>
<!-- <advanced-search-input #advanced (searchEmitter)="goTo()">-->
<!-- <entities-selection [simpleView]="true" currentEntity="all" [selectedEntity]="selectedEntity"
(selectionChange)="entityChanged($event);advanced.focusNext(input, $event)" (disableSelectEmitter)="disableSelectChange($event)"
[onChangeNavigate]="false" class="uk-width-2-5"></entities-selection> -->
<!-- <div class="uk-width-expand" input #input placeholder="Search in Explore" [searchable]="true" [hint]="'What are you looking for?'" [(value)]="keyword"></div>-->
<!-- </advanced-search-input>-->
<div search-input [(value)]="keyword"
[placeholder]="'Search'+(portalName ? (' in '+portalName) : '')" (searchEmitter)="goTo()"
[searchInputClass]="'inner background'"></div>
<!-- <div *ngIf="selectedEntity === 'result' && input.focused" (click)="$event.stopPropagation();advanced.focusNext(input, $event)" class="uk-dropdown uk-display-block uk-margin-small-top uk-width-auto">
<div class="uk-padding-small">
<quick-selections [resultTypes]="resultTypes" [quickFilter]="resultsQuickFilter"></quick-selections>
</div>
</div> -->
</div>
<div class="uk-padding-small uk-margin-small-top">
<div class="uk-text-meta">
Try browsing by:
</div>
<div class="link-actions uk-flex uk-flex-column uk-flex-top uk-margin-small-top">
<a class="uk-display-inline-block uk-text-uppercase uk-button uk-button-text uk-margin-small-bottom"
routerLinkActive="router-link-active" routerLink="/sdgs">
<span class="uk-flex uk-flex-middle">
<img src="assets/explore-assets/sdg-dot-img.svg" alt="SDGs logo" loading="lazy">
<span class="uk-margin-small-left">Sustainable Development Goals (SDG<span class="uk-text-lowercase">s</span>)</span>
<img src="assets/common-assets/sdg/sdg-dot-img.svg" alt="SDGs logo" loading="lazy" width="17px" height="17px">
<span class="uk-margin-small-left">Sustainable Development Goals (SDG<span
class="uk-text-lowercase">s</span>)</span>
</span>
</a>
<a class="uk-display-inline-block uk-text-uppercase uk-button uk-button-text"
routerLinkActive="router-link-active" routerLink="/fields-of-science">
</a>
<a class="uk-display-inline-block uk-text-uppercase uk-button uk-button-text"
routerLinkActive="router-link-active" routerLink="/fields-of-science">
<span class="uk-flex uk-flex-middle">
<img src="assets/explore-assets/fos-icon.svg" alt="FOS logo" loading="lazy">
<img src="assets/common-assets/fos/fos-icon.svg" alt="FOS logo" loading="lazy" width="17px" height="8px">
<span class="uk-margin-small-left">Fields of Science (FoS)</span>
</span>
</a>
</div>
</div>
</a>
</div>
</div>
</div>
<div class="uk-visible@m uk-width-expand" uk-scrollspy-class>
<div class="uk-position-relative">
<img src="assets/explore-assets/home/explore.jpg" alt="researchers" uk-parallax="y: 500" loading="lazy">
<img class="uk-position-bottom-left" src="assets/explore-assets/home/mask.svg" alt="search" loading="lazy">
</div>
</div>
</div>
</div>
<div class="uk-visible@m uk-width-expand" uk-scrollspy-class>
<div class="uk-position-relative">
<img src="assets/explore-assets/home/explore.jpg" uk-parallax="y: 500">
<img class="uk-position-bottom-left" src="assets/explore-assets/home/mask.svg">
</div>
</div>
</div>
</div>
</div>
<div class="uk-section uk-section-large uk-padding-remove-top">
<div class="uk-container uk-container-large uk-width-2-3">
<div uk-slider="autoplay: false; autoplay-interval: 2500" class="">
<div class="uk-position-relative">
<div class="uk-slider-container">
<ul class="uk-slider-items" uk-height-match="target: > li > div > div > .logo1; row: false;">
<ng-container *ngFor="let type of getKeys(logos)">
<li *ngFor="let range of createRange(logos[type].length) let j=index"
class="uk-width-1-1 home-logo">
<h1 class="uk-text-center uk-margin-large-bottom uk-text-primary uk-h4">
<span *ngIf="type=='publication' && showPublications && numbers?.publicationsSize">
<div class="uk-section uk-section-large uk-padding-remove-top">
<div class="uk-container uk-container-large uk-width-2-3">
<div uk-slider="autoplay: false; autoplay-interval: 2500" class="">
<div class="uk-position-relative">
<div class="uk-slider-container">
<ul class="uk-slider-items" uk-height-match="target: > li > div > div > .logo1; row: false;">
<ng-container *ngFor="let type of getKeys(logos)">
<li *ngFor="let range of createRange(logos[type].length) let j=index"
class="uk-width-1-1 home-logo">
<h2 class="uk-text-center uk-margin-bottom uk-text-primary uk-h4">
<span *ngIf="type=='publication' && numbersComponent.showPublications && numbers?.publicationsSize">
<span
class="uk-text-bold">{{numbers.publicationsSize.number|number}}{{numbers.publicationsSize.size}}
{{openaireEntities.PUBLICATIONS}}</span><span> deduplicated</span>
class="uk-text-bold">{{numbers.publicationsSize.number|number}}{{numbers.publicationsSize.size}}
{{openaireEntities.PUBLICATIONS}}</span><span> deduplicated</span>
</span>
<span
*ngIf="type=='dataset' && showDatasets && (numbers?.datasetsLinkedSize || numbers?.datasetsSize)">
<span
*ngIf="type=='dataset' && numbersComponent.showDatasets && (numbers?.datasetsLinkedSize || numbers?.datasetsSize)">
<span *ngIf="numbers?.datasetsLinkedSize">
<span
class="uk-text-bold">{{numbers.datasetsLinkedSize.number|number}}{{numbers.datasetsLinkedSize.size}}
datasets</span> interlinked with publications</span>
class="uk-text-bold">{{numbers.datasetsLinkedSize.number|number}}{{numbers.datasetsLinkedSize.size}}
datasets</span> interlinked with publications</span>
<span *ngIf="numbers?.datasetsSize && !numbers?.datasetsLinkedSize"
class="uk-text-bold">{{numbers.datasetsSize.number|number}}{{numbers.datasetsSize.size}}
{{openaireEntities.DATASETS}}</span>
class="uk-text-bold">{{numbers.datasetsSize.number|number}}{{numbers.datasetsSize.size}}
{{openaireEntities.DATASETS}}</span>
</span>
<span
*ngIf="type=='software' && showSoftware && (numbers?.softwareSize || numbers?.softwareLinkedSize)">
<span
*ngIf="type=='software' && numbersComponent.showSoftware && (numbers?.softwareSize || numbers?.softwareLinkedSize)">
<span *ngIf="numbers?.softwareLinkedSize">
<span
class="uk-text-bol ">{{numbers.softwareLinkedSize.number|number}}{{numbers.softwareLinkedSize.size}}
{{openaireEntities.SOFTWARE}}</span> interlinked with publications</span>
class="uk-text-bol ">{{numbers.softwareLinkedSize.number|number}}{{numbers.softwareLinkedSize.size}}
{{openaireEntities.SOFTWARE}}</span> interlinked with publications</span>
<span *ngIf="numbers?.softwareSize && !numbers?.softwareLinkedSize"
class="uk-text-bold">{{numbers.softwareSize.number|number}}{{numbers.softwareSize.size}}
{{openaireEntities.SOFTWARE}}</span>
class="uk-text-bold">{{numbers.softwareSize.number|number}}{{numbers.softwareSize.size}}
{{openaireEntities.SOFTWARE}}</span>
</span>
<span *ngIf="type=='persistent'">
<span *ngIf="type=='persistent'">
<span>Persistent identifiers and registries</span>
</span>
<span *ngIf="type=='funder' && showProjects && numbers?.fundersSize && numbers?.projectsSize">
<span *ngIf="type=='funder' && numbersComponent.showProjects && numbers?.mergedFundersSize && numbers?.projectsSize">
<span
class="uk-text-bold">{{numbers.fundersSize.number|number}}{{numbers.fundersSize.size}}
funders</span><span> and</span>
class="uk-text-bold">{{numbers.mergedFundersSize.number|number}}{{numbers.mergedFundersSize.size}}
funders</span><span> and</span>
<span
class="uk-text-bold"> {{numbers.projectsSize.number|number}}{{numbers.projectsSize.size}}
funded grants</span>
class="uk-text-bold"> {{numbers.projectsSize.number|number}}{{numbers.projectsSize.size}}
funded grants</span>
</span>
</h1>
<div
class="uk-grid-small uk-child-width-1-6 uk-text-center grid uk-flex uk-flex-center"
uk-grid uk-height-match="target: > div > .logo2; row: false;">
<div
*ngFor="let logo of logos[type][j].slice(0,ceil(logos[type][j].length/2)); let i=index">
<ng-container
*ngTemplateOutlet="_logos; context: { logo: logo, class: 'logo1 '}"></ng-container>
<ng-container
*ngTemplateOutlet="_logos; context: { logo: logos[type][j][ceil(logos[type][j].length/2)+i], class: 'uk-margin-top logo2 '}"></ng-container>
</div>
</div>
</li>
</ng-container>
</ul>
</div>
</h2>
<div class="uk-text-center uk-flex uk-flex-center uk-margin-medium-left uk-margin-medium-right">
<ng-container *ngTemplateOutlet="_logos; context: { logo: logos[type][j], class: ' '}"></ng-container>
<!-- <div-->
<!-- class="uk-grid-small uk-child-width-1-6 uk-text-center grid uk-flex uk-flex-center"-->
<!-- uk-grid uk-height-match="target: > div > .logo2; row: false;">-->
<!-- <div-->
<!-- *ngFor="let logo of logos[type][j].slice(0,ceil(logos[type][j].length/2)); let i=index">-->
<!-- <ng-container-->
<!-- *ngTemplateOutlet="_logos; context: { logo: logo, class: 'logo1 '}"></ng-container>-->
<!-- <ng-container-->
<!-- *ngTemplateOutlet="_logos; context: { logo: logos[type][j][ceil(logos[type][j].length/2)+i], class: 'uk-margin-top logo2 '}"></ng-container>-->
<!-- </div>-->
</div>
</li>
</ng-container>
</ul>
</div>
<a class="uk-position-center-left-out" uk-slider-item="previous"><span uk-icon="icon: chevron-left; ratio: 2"></span></a>
<a class="uk-position-center-right-out" uk-slider-item="next"><span uk-icon="icon: chevron-right; ratio: 2"></span></a>
<a class="uk-position-center-left-out" uk-slider-item="previous"><span
uk-icon="icon: chevron-left; ratio: 2"></span></a>
<a class="uk-position-center-right-out" uk-slider-item="next"><span
uk-icon="icon: chevron-right; ratio: 2"></span></a>
</div>
</div>
</div>
</div>
<ng-template #scrolling_text let-position_class="position_class">
<div #scrolling_element [class]="position_class" uk-parallax="target: #js-sticky-parallax-images-all; start: 15%; end: 100% + 100vh - 200vh; opacity: 0,1 20%,1 99%,0">
<h3 class="uk-h2">
<span class="uk-text-primary">Deposit</span> your research<span class="uk-text-primary">.</span>
</h3>
<p class="uk-text-large uk-width-3-4@m">
Whether its publications, data or software,
select an <a href="" target="_blank">OpenAIRE compatible repository</a> and
share using community standards. Alternatively
use Zenodo, a catch-all repository hosted by CERN.
All results will be indexed, discoverable and accessible
via EXPLORE.
</p>
<div class="uk-margin-medium-top">
<a class="uk-button uk-button-primary uk-text-uppercase" routerLink="/participate/deposit/learn-how">Start Deposit</a>
</div>
</div>
<div #scrolling_element [class]="position_class" uk-parallax="target: #js-sticky-parallax-images-all; start: 200vh; end: 100% + 100vh - 300vh; opacity: 0,1 20%" style="padding-top: 4vh;">
<h3 class="uk-h2">
<span class="uk-text-primary">Link</span> your work<span class="uk-text-primary">.</span>
</h3>
<p class="uk-text-large uk-width-3-4@m">
Connect all your research. If you can't find your research
results in OpenAIRE, don't worry! Use our Link service,
that reaches out to many external sources via APIs, and
claim them to your Grant or ORCID. Use the service to provide
meaningful links between publications-datasets-software.
</p>
<div class="uk-margin-medium-top">
<a class="uk-button uk-button-primary uk-text-uppercase" routerLink="/participate/claim">Start Linking</a>
</div>
</div>
</ng-template>
<div class="uk-section uk-section-secondary">
<div class="uk-container uk-container-large">
<div class="uk-width-1-1">
<h2 class="uk-h1 uk-margin-large-top">Share your research<span class="uk-text-primary">.</span></h2>
</div>
<div id="js-sticky-parallax-images-all" style="min-height: 400vh">
<div class="uk-visible@m uk-height-viewport explore-dark-logo-background uk-sticky" uk-sticky="bottom: #js-sticky-parallax-images-all; target-offset: true">
<div class="uk-grid" uk-grid style="height: 100vh;">
<div class="uk-width-expand uk-first-column uk-position-relative uk-height-1-1">
<div class="explore-dark-logo-background">
<div uk-parallax="target: #js-sticky-parallax-images-all;">
<img class="uk-position-center uk-position-z-index" src="assets/explore-assets/home/tablet.png" alt="ipad" loading="lazy"
style="width: 100%;">
<img class="uk-position-center" src="assets/explore-assets/home/1.png" alt="ipad" loading="lazy"
uk-parallax="target: #js-sticky-parallax-images-all; start: 100vh; end: 100% + 100vh - 160vh; opacity: 1,1 99%,0; easing:0"
style="width: 100%;">
<img class="uk-position-center" src="assets/explore-assets/home/2.png" alt="ipad" loading="lazy"
uk-parallax="target: #js-sticky-parallax-images-all; start: 150vh; end: 100% + 100vh - 210vh; opacity: 0,1 20%,1 99%,0; easing:0"
style="width: 100%;">
<img class="uk-position-center" src="assets/explore-assets/home/3.png" alt="ipad" loading="lazy"
uk-parallax="target: #js-sticky-parallax-images-all; start: 200vh; end: 100% + 100vh - 260vh; opacity: 0,1 20%,1 99%,0; easing:0"
style="width: 100%;">
<img class="uk-position-center" src="assets/explore-assets/home/4.png" alt="ipad" loading="lazy"
uk-parallax="target: #js-sticky-parallax-images-all; start: 250vh; end: 100% + 100vh - 310vh; opacity: 0,1 20%,1; easing:0"
style="width: 100%;">
</div>
</div>
</div>
<div class="uk-inline uk-width-expand uk-height-1-1 uk-margin-large-left">
<div>
<div uk-parallax="target: #js-sticky-parallax-images-all; y: 55vh, 40vh;">
<ng-container *ngTemplateOutlet="scrolling_text; context: {position_class: 'uk-position-center-left'}"></ng-container>
</div>
</div>
</div>
</div>
</div>
<div class="uk-hidden@m uk-height-viewport explore-dark-logo-background" uk-sticky="bottom: #js-sticky-parallax-images-all">
<div class="uk-flex uk-flex-column">
<div class="explore-dark-logo-background uk-inline uk-width-1-1" style="height: 40vh;">
<img class="uk-position-center uk-position-z-index" src="assets/explore-assets/home/tablet.png" alt="ipad" loading="lazy"
uk-parallax="target: #js-sticky-parallax-images-all;" style="width: 70%;">
<img class="uk-position-center" src="assets/explore-assets/home/1.png" alt="ipad" loading="lazy"
uk-parallax="target: #js-sticky-parallax-images-all; start: 100vh; end: 100% + 100vh - 160vh; opacity: 1,1 99%,0; easing:0"
style="width: 70%;">
<img class="uk-position-center" src="assets/explore-assets/home/2.png" alt="ipad" loading="lazy"
uk-parallax="target: #js-sticky-parallax-images-all; start: 150vh; end: 100% + 100vh - 210vh; opacity: 0,1 20%,1 99%,0; easing:0"
style="width: 70%;">
<img class="uk-position-center" src="assets/explore-assets/home/3.png" alt="ipad" loading="lazy"
uk-parallax="target: #js-sticky-parallax-images-all; start: 200vh; end: 100% + 100vh - 260vh; opacity: 0,1 20%,1 99%,0; easing:0"
style="width: 70%;">
<img class="uk-position-center" src="assets/explore-assets/home/4.png" alt="ipad" loading="lazy"
uk-parallax="target: #js-sticky-parallax-images-all; start: 250vh; end: 100% + 100vh - 310vh; opacity: 0,1 20%,1; easing:0"
style="width: 70%;">
</div>
<div class="uk-inline uk-width-expand">
<ng-container *ngTemplateOutlet="scrolling_text; context: {position_class: 'uk-position-top-center'}"></ng-container>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="uk-section uk-section-secondary explore-dark-logo-background">
<div class="uk-container uk-container-large uk-margin-large-bottom">
<div class="uk-width-1-1 uk-margin-medium-bottom">
<h2 class="uk-h1 uk-margin-large-top">Share your research<span class="uk-text-primary">.</span></h2>
</div>
<slider-container [total]="2" [period]="8000" [infinite]="true" [navigation]="'progress'">
<slider-column type="slider">
<slider-item type="static">
<img class="uk-position-center uk-position-z-index" src="assets/explore-assets/home/tablet.png"
alt="ipad" loading="lazy">
</slider-item>
<slider-item type="slide" [start]="0">
<img src="assets/explore-assets/home/1.png" alt="Deposit search" loading="lazy">
</slider-item>
<slider-item type="slide" [start]="0.5">
<img src="assets/explore-assets/home/2.png" alt="Deposit in OpenAIRE or Zenodo" loading="lazy">
</slider-item>
<slider-item type="slide" [start]="1">
<img src="assets/explore-assets/home/3.png" alt="Search links" loading="lazy">
</slider-item>
<slider-item type="slide" [start]="1.5">
<img src="assets/explore-assets/home/4.png" alt="link" loading="lazy">
</slider-item>
</slider-column>
<slider-column type="nav" class="slider-nav">
<slider-nav-item [start]="0">
<h3 class="uk-h6">
<i class="uk-text-primary">Deposit</i> your research<span class="uk-text-primary">.</span>
</h3>
<div class="uk-margin-bottom">
Whether its publications, data or software,
select an OpenAIRE compatible repository and
share using community standards. Alternatively
use Zenodo, a catch-all repository hosted by CERN.
All results will be indexed, discoverable and accessible
via EXPLORE.
</div>
<div class="uk-margin-top">
<a class="uk-button uk-button-text uk-text-primary" routerLink="/participate/deposit/learn-how">Start
Deposit</a>
</div>
</slider-nav-item>
<slider-nav-item [start]="1">
<h3 class="uk-h6">
<i class="uk-text-primary">Link</i> your work<span class="uk-text-primary">.</span>
</h3>
<div class="uk-margin-bottom">
Connect all your research. If you can't find your research
results in OpenAIRE, don't worry! Use our Link service,
that reaches out to many external sources via APIs, and
claim them to your Grant or ORCID. Use the service to provide
meaningful links between publications-datasets-software.
</div>
<div class="uk-margin-top">
<a class="uk-button uk-button-text uk-text-primary" routerLink="/participate/claim">Start Linking</a>
</div>
</slider-nav-item>
</slider-column>
</slider-container>
</div>
</div>
<!-- Not yet! -->
<!-- <div class="uk-section">
<div class="uk-container uk-container-large">
<h2 class="uk-h1 uk-text-center">
New sources in OpenAIRE<span class="uk-text-primary">.</span>
</h2>
<div class="cards-on-slider">
TODO: Repositories content
</div>
</div>
</div> -->
<!-- Not yet! -->
<!-- <div class="uk-section">
<div class="uk-container uk-container-large">
<h2 class="uk-h1 uk-text-center">
New sources in OpenAIRE<span class="uk-text-primary">.</span>
</h2>
<div class="cards-on-slider">
TODO: Repositories content
</div>
</div>
</div> -->
<div class="uk-background-muted">
<div class="uk-position-relative">
<div class="uk-section uk-section-large">
<div class="uk-container">
<div class="uk-grid uk-child-width-1-2@m" uk-grid>
<div>
<div style="max-width: 550px;">
<h2>Linked Open Research.</h2>
<div class="">
EXPLORE is built on the <a href="https://graph.openaire.eu/" target="_blank" class="graph">OpenAIRE Research Graph</a>, one of the largest
open scholarly record collections worldwide. Conceived as a public and
transparent good, populated out of data sources trusted by scientists, the
OpenAIRE Research Graph brings discovery, monitoring, and assessment of science
back in the hands of the scientific community.
</div>
</div>
</div>
<div></div>
<img class="uk-visible@m uk-height-1-1 uk-position-top-right" src="assets/explore-assets/home/graph.svg" alt="ipad" loading="lazy">
</div>
</div>
</div>
</div>
<div class="uk-section uk-padding-remove-top">
<div class="uk-container">
<div class="uk-width-1-2@m uk-margin-auto uk-margin-small-top uk-text-center" style="max-width: 600px;">
<div>
Within a constantly emerging scholarly communication environment, the OpenAIRE Research Graph is a moving target, continuously integrating new sources, new types or research objects, and embedding access measures. We therefore welcome the community to work with us to improve all its aspects: its <span class="uk-text-bold">coverage</span> (geographic and thematic), <span class="uk-text-bold">quality</span> (disambiguation and semantics) and <span class="uk-text-bold">access</span> (APIs).
</div>
<div class="uk-margin-top">
Find information about the OpenAIRE Research Graph, how to test it and contribute to improving it.
</div>
<div class="uk-margin-top">
<a href="https://www.openaire.eu/blogs/the-openaire-research-graph" target="_blank" class="uk-display-inline-block uk-text-uppercase uk-button uk-button-text">
Learn more. Contribute
</a>
</div>
</div>
</div>
</div>
</div>
<div class="uk-background-muted">
<div class="uk-position-relative">
<div class="uk-section uk-section-large">
<div class="uk-container">
<div class="uk-grid uk-child-width-1-2@m" uk-grid>
<div>
<div style="max-width: 550px;">
<h2>Linked Open Research.</h2>
<div class="">
EXPLORE is built on the <a href="https://graph.openaire.eu/" target="_blank"
class="graph">OpenAIRE Graph</a>, one of the largest
open scholarly record collections worldwide. Conceived as a public and
transparent good, populated out of data sources trusted by scientists, the
OpenAIRE Graph brings discovery, monitoring, and assessment of science
back in the hands of the scientific community.
</div>
</div>
</div>
<div></div>
<img class="uk-visible@m uk-height-1-1 uk-position-top-right"
src="assets/common-assets/common/graph-nodes.svg" alt="Graph nodes" loading="lazy">
</div>
</div>
</div>
</div>
<div class="uk-section uk-padding-remove-top">
<div class="uk-container">
<div class="uk-width-1-2@m uk-margin-auto uk-margin-small-top uk-text-center" style="max-width: 600px;">
<div>
Within a constantly emerging scholarly communication environment, the OpenAIRE Graph is a moving
target, continuously integrating new sources, new types or research objects, and embedding
access measures. We therefore welcome the community to work with us to improve all its aspects:
its <span class="uk-text-bold">coverage</span> (geographic and thematic), <span
class="uk-text-bold">quality</span> (disambiguation and semantics) and <span
class="uk-text-bold">access</span> (APIs).
</div>
<div class="uk-margin-top">
Find information about the OpenAIRE Graph, how to test it and contribute to improving it.
</div>
<div class="uk-margin-top">
<a href="https://www.openaire.eu/blogs/the-openaire-research-graph" target="_blank"
class="uk-display-inline-block uk-text-uppercase uk-button uk-button-text">
Learn more. Contribute
</a>
</div>
</div>
</div>
</div>
</div>
<div class="uk-section uk-section-large">
<div class="uk-container uk-container-large">
<h2 class="uk-h5 uk-margin-remove uk-text-primary">
Did you know that
</h2>
<h2 class="uk-heading-large uk-margin-large-bottom uk-margin-remove-top">
you may
</h2>
<div class="uk-container">
<div class="uk-grid uk-child-width-1-2@l uk-child-width-1-1 uk-grid-large" uk-grid uk-height-match=".link-title">
<div>
<div class="uk-padding-small uk-padding-remove-horizontal custom-link">
<a href="https://provide.openaire.eu/home" target="_blank" class="uk-button uk-button-text uk-text-left uk-text-large">
<span class="link-title">have your repository, Journal or CRIS system indexed in EXPLORE and take advantage of services for enriching metadata and counting usage?</span>
</a>
</div>
</div>
<div>
<div class="uk-padding-small uk-padding-remove-horizontal custom-link">
<a href="https://canada.explore.openaire.eu/" target="_blank" class="uk-button uk-button-text uk-text-left uk-text-large">
<span class="link-title">use EXPLORE as an application platform as a service (aPaaS) and set up a national portal for Open Science, such as Canada.EXPLORE?</span>
</a>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="uk-section uk-section-large">
<div class="uk-container uk-container-large">
<h2 class="uk-h5 uk-margin-remove uk-text-primary">
Did you know that
</h2>
<h2 class="uk-heading-large uk-margin-large-bottom uk-margin-remove-top">
you may
</h2>
<div class="uk-container">
<div class="uk-grid uk-child-width-1-2@l uk-child-width-1-1 uk-grid-large" uk-grid
uk-height-match=".link-title">
<div>
<div class="uk-padding-small uk-padding-remove-horizontal custom-link">
<a href="https://provide.openaire.eu/home" target="_blank"
class="uk-button uk-button-text uk-text-left uk-text-large">
<span class="link-title">have your repository, Journal or CRIS system indexed in EXPLORE and take advantage of services for enriching metadata and counting usage?</span>
</a>
</div>
</div>
<div>
<div class="uk-padding-small uk-padding-remove-horizontal custom-link">
<a href="https://canada.explore.openaire.eu/" target="_blank"
class="uk-button uk-button-text uk-text-left uk-text-large">
<span class="link-title">use EXPLORE as an application platform as a service (aPaaS) and set up a national portal for Open Science, such as Canada.EXPLORE?</span>
</a>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="uk-section">
<div class="uk-container uk-container-large uk-margin-large-bottom uk-text-center">
<h3 class="uk-h2 uk-margin-remove">
Need more information?
</h3>
<h4 class="uk-h4 uk-margin-small-top uk-margin-medium-bottom">
Get in touch and let us help you<span class="uk-text-primary">.</span>
</h4>
<a class="uk-button uk-button-primary uk-text-uppercase uk-margin-top uk-margin-medium-bottom"
routerLink="/contact-us">Contact us</a>
</div>
</div>
<div #contact class="uk-section">
<div class="uk-container uk-container-large uk-margin-large-bottom uk-text-center">
<h3 class="uk-h2 uk-margin-remove">
Need more information?
</h3>
<h4 class="uk-h4 uk-margin-small-top uk-margin-medium-bottom">
Get in touch and let us help you<span class="uk-text-primary">.</span>
</h4>
<a class="uk-button uk-button-primary uk-text-uppercase uk-margin-top uk-margin-medium-bottom"
routerLink="/contact-us">Contact us</a>
</div>
</div>
</div>

View File

@ -38,14 +38,21 @@
color: @global-secondary-background;
}
}
}
@media only screen and (min-width: @breakpoint-medium) {
.slider-image {
min-width: 550px;
}
@media only screen and (min-width: @breakpoint-large) {
.explore-dark-logo-background {
background-image: url("~src/assets/explore-assets/home/explore-dark-logo.svg");
background-repeat: no-repeat;
background-position: left 95%;
background-size: 65%;
background-position: -5% 102%;
background-size: 35%;
}
.slider-nav {
max-width: 650px;
}
}

View File

@ -9,29 +9,22 @@ import {
ViewChild,
ViewChildren
} from '@angular/core';
import {of, Subscriber, zip} from 'rxjs';
import {ActivatedRoute, Router} from '@angular/router';
import {Location} from '@angular/common';
import {Subscriber} from 'rxjs';
import {Router} from '@angular/router';
import {Meta, Title} from '@angular/platform-browser';
import {ConfigurationService} from '../openaireLibrary/utils/configuration/configuration.service';
import {SearchDataprovidersService} from '../openaireLibrary/services/searchDataproviders.service';
import {SearchProjectsService} from '../openaireLibrary/services/searchProjects.service';
import {SearchOrganizationsService} from '../openaireLibrary/services/searchOrganizations.service';
import {RefineFieldResultsService} from '../openaireLibrary/services/refineFieldResults.service';
import {OpenaireEntities, SearchFields} from '../openaireLibrary/utils/properties/searchFields';
import {RouterHelper} from '../openaireLibrary/utils/routerHelper.class';
import {EnvProperties} from '../openaireLibrary/utils/properties/env-properties';
import {ErrorCodes} from '../openaireLibrary/utils/properties/errorCodes';
import {PiwikService} from '../openaireLibrary/utils/piwik/piwik.service';
import {SEOService} from '../openaireLibrary/sharedComponents/SEO/SEO.service';
import {SearchResearchResultsService} from "../openaireLibrary/services/searchResearchResults.service";
import {HelperService} from "../openaireLibrary/utils/helper/helper.service";
import {Filter} from "../openaireLibrary/searchPages/searchUtils/searchHelperClasses.class";
import {properties} from "../../environments/environment";
import {Numbers, NumbersComponent} from "../openaireLibrary/sharedComponents/numbers/numbers.component";
import {StringUtils} from "../openaireLibrary/utils/string-utils.class";
import {NumberUtils} from '../openaireLibrary/utils/number-utils.class';
import {QuickContactService} from '../openaireLibrary/sharedComponents/quick-contact/quick-contact.service';
@Component({
selector: 'home',
@ -43,111 +36,52 @@ export class HomeComponent implements OnInit, OnDestroy, AfterViewInit {
public logos = {
"publication": [
[
"logo-pubmed.png",
"logo-arxiv.png",
"logo-base.png",
"logo-scielo.png",
"logo-la-referencia.png",
"logo-soar.png",
"logo-repec.png",
"logo-core.png",
"logo-zenodo.png",
"logo-narcis.png"
"publications.png"
],
[
"logo-unpaywall.png",
"logo-elsevier.png",
"logo-spring-nature.png",
"logo-frontiers.png",
"logo-opencitations.png",
"logo-doaj.png",
"logo-microsoft.png",
"logo-plos.png",
"logo-f1000.png",
"logo-copernicus.png"
"publications2.png"
]
],
"software": [
[
"logo-software-heritage.png",
"logo-github.png",
"logo-doecode.png",
"logo-bitbucket.png",
"logo-elixir-bio-tools.png",
"logo-google-code.png",
"logo-sourceforge.png",
"logo-zenodo.png"
"software.png"
]
],
"dataset": [
[
"logo-scholexplorer.png",
"logo-zenodo.png",
"logo-pangea.png",
"logo-figshare.png",
"logo-protocols.png",
"logo-opentrials.png",
"logo-kaggle.png",
"logo-reactome.png",
"logo-easy.png",
"logo-dryad.png"
"datasets.png"
]
],
//"other": [],
"persistent": [
[
"logo-re3data.png",
"logo-orcid.png",
"logo-opendoar.png",
"logo-grid.png",
"logo-fairsharing.png",
"logo-ror.png",
"logo-datacite.png",
"logo-crossref.png"
"pids.png"
]
],
"funder": [
[
"logo-european-commision.png",
"logo-nsf.png",
"logo-nhmrc.png",
"logo-sfi.png",
"logo-nwo.png",
"logo-welcome-trust.png",
"logo-fct.png",
"logo-gsrt.png",
"logo-fnsnf.png"
"funders.png"
]
]
};
public portalName: string = "";
public pageTitle = "OpenAIRE";
public keyword: string = "";
public searchFields: SearchFields = new SearchFields();
public errorCodes: ErrorCodes = new ErrorCodes();
public routerHelper: RouterHelper = new RouterHelper();
public numbers: Numbers = {};
showPublications: boolean = false;
showDatasets: boolean = false;
showSoftware: boolean = false;
showOrp: boolean = false;
showProjects: boolean = false;
showDataProviders: boolean = false;
showOrganizations: boolean = false;
properties: EnvProperties = properties;
public properties: EnvProperties = properties;
public openaireEntities = OpenaireEntities;
public readMore: boolean = false;
@ViewChild('contact') contact: ElementRef;
subscriptions: any[] = [];
@ViewChildren('scrolling_element') elements: QueryList<ElementRef>;
resultsQuickFilter: { filter: Filter, selected: boolean, filterId: string, value: string } = {
filter: null,
selected: true,
filterId: "resultbestaccessright",
value: "Open Access"
};
resultsQuickFilter: { filter: Filter, selected: boolean, filterId: string, value: string } = null;//{
// filter: null,
// selected: true,
// filterId: "resultbestaccessright",
// value: "Open Access"
// };
selectedEntity = "all";
selectedEntitySimpleUrl;
selectedEntityAdvancedUrl;
@ -172,30 +106,17 @@ export class HomeComponent implements OnInit, OnDestroy, AfterViewInit {
{value: "lcsh:Chemistry", label: "Chemistry"},
{value: "lcsh:Engineering (General). Civil engineering (General)", label: "Civil engineering"},
{value: "lcsh:Technology", label: "Technology"},
/* "Mathematics::Combinatorics",
"lcsh:Medicine",
"lcsh:Science",
"lcsh:Biology (General)",
"lcsh:Chemistry",
"lcsh:Engineering (General). Civil engineering (General)",
"lcsh:Technology"*/
];
stringUtils = new StringUtils();
disableSelect: boolean = true;
// disableSelect: boolean = true;
constructor(
private route: ActivatedRoute,
private _router: Router,
private searchResearchResultsService: SearchResearchResultsService,
private searchDataprovidersService: SearchDataprovidersService,
private searchProjectsService: SearchProjectsService,
private searchOrganizationsService: SearchOrganizationsService,
private refineFieldResultsService: RefineFieldResultsService,
private location: Location, private _piwikService: PiwikService,
private _piwikService: PiwikService,
private config: ConfigurationService, private _meta: Meta, private _title: Title, private seoService: SEOService,
private helper: HelperService,
private cdr: ChangeDetectorRef
private cdr: ChangeDetectorRef,
private quickContactService: QuickContactService
) {
let description = "OpenAIRE Explore: Over 100M of research deduplicated, 170K research software, 11M research data. One of the largest open scholarly records collection worldwide.";
let title = "OpenAIRE | Find and Share research";
@ -203,6 +124,7 @@ export class HomeComponent implements OnInit, OnDestroy, AfterViewInit {
this._meta.updateTag({content: description}, "name='description'");
this._meta.updateTag({content: description}, "property='og:description'");
this._meta.updateTag({content: title}, "property='og:title'");
this.quickContactService.setDisplay(false);
}
private getPageContents() {
@ -243,24 +165,35 @@ export class HomeComponent implements OnInit, OnDestroy, AfterViewInit {
if (this.properties != null) {
var url = this.properties.domain + this.properties.baseLink + this._router.url;
this._meta.updateTag({content: url}, "property='og:url'");
if (this.properties.enablePiwikTrack && (typeof document !== 'undefined')) {
this.subscriptions.push(this._piwikService.trackView(this.properties, "OpenAIRE").subscribe());
}
//this.config.getCommunityInformation(this.properties, this.properties.adminToolsCommunity ).subscribe(data => {
this.subscriptions.push(this.config.communityInformationState.subscribe(data => {
if (data) {
this.subscriptions.push(this._piwikService.trackView(this.properties, "OpenAIRE").subscribe());
if(this.numbersComponent) {
this.numbersComponent.showPublications = false;
this.numbersComponent.showDatasets = false;
this.numbersComponent.showSoftware = false;
this.numbersComponent.showOrp = false;
this.numbersComponent.showProjects = false;
this.numbersComponent.showDataProviders = false;
this.numbersComponent.showOrganizations = false;
}
this.subscriptions.push(this.config.portalAsObservable.subscribe(data => {
if(data) {
if(data.name) {
this.portalName = data.name;
}
var showEntity = {};
for (var i = 0; i < data['entities'].length; i++) {
showEntity["" + data['entities'][i]["pid"] + ""] = data['entities'][i]["isEnabled"];
}
this.showPublications = !!showEntity["publication"];
this.showDatasets = !!showEntity["dataset"];
this.showSoftware = !!showEntity["software"];
this.showOrp = !!showEntity["orp"];
this.showProjects = !!showEntity["project"];
this.showDataProviders = !!showEntity["datasource"];
this.showOrganizations = !!showEntity["organization"];
if (this.showPublications) {
if(this.numbersComponent) {
this.numbersComponent.showPublications = !!showEntity["publication"];
this.numbersComponent.showDatasets = !!showEntity["dataset"];
this.numbersComponent.showSoftware = !!showEntity["software"];
this.numbersComponent.showOrp = !!showEntity["orp"];
this.numbersComponent.showProjects = !!showEntity["project"];
this.numbersComponent.showDataProviders = !!showEntity["datasource"];
this.numbersComponent.showOrganizations = !!showEntity["organization"];
}
if(this.numbersComponent && this.numbersComponent.showPublications) {
this.resultTypes.values.push({
name: this.openaireEntities.PUBLICATIONS,
id: "publications",
@ -268,7 +201,7 @@ export class HomeComponent implements OnInit, OnDestroy, AfterViewInit {
number: 0
});
}
if (this.showDatasets) {
if(this.numbersComponent && this.numbersComponent.showDatasets) {
this.resultTypes.values.push({
name: this.openaireEntities.DATASETS,
id: "datasets",
@ -276,7 +209,7 @@ export class HomeComponent implements OnInit, OnDestroy, AfterViewInit {
number: 0
});
}
if (this.showSoftware) {
if(this.numbersComponent && this.numbersComponent.showSoftware) {
this.resultTypes.values.push({
name: this.openaireEntities.SOFTWARE,
id: "software",
@ -284,10 +217,12 @@ export class HomeComponent implements OnInit, OnDestroy, AfterViewInit {
number: 0
});
}
if (this.showOrp) {
if(this.numbersComponent && this.numbersComponent.showOrp) {
this.resultTypes.values.push({name: this.openaireEntities.OTHER, id: "other", selected: false, number: 0});
}
this.init(this.showDatasets, this.showSoftware, this.showPublications, this.showDatasets, this.showSoftware, this.showOrp, this.showProjects, this.showDataProviders, this.showOrganizations);
if(this.numbersComponent) {
this.numbersComponent.init(this.numbersComponent.showDatasets, this.numbersComponent.showSoftware, this.numbersComponent.showPublications, this.numbersComponent.showDatasets, this.numbersComponent.showSoftware, this.numbersComponent.showOrp, this.numbersComponent.showProjects, this.numbersComponent.showDataProviders, this.numbersComponent.showOrganizations);
}
}
},
error => {
@ -299,16 +234,28 @@ export class HomeComponent implements OnInit, OnDestroy, AfterViewInit {
public ngOnDestroy() {
this.quickContactService.setDisplay(true);
this.clear();
}
ngAfterViewInit() {
if (typeof window !== "undefined") {
this.createObserver();
this.createObservers();
}
}
createObserver() {
createObservers() {
let options = {
root: null,
rootMargin: '200px',
threshold: 1.0
};
let intersectionObserver = new IntersectionObserver(entries => {
entries.forEach(entry => {
this.quickContactService.setDisplay(!entry.isIntersecting);
});
}, options);
intersectionObserver.observe(this.contact.nativeElement);
let mutationObserver = new MutationObserver(entries => {
entries.forEach(entry => {
if (entry.attributeName === 'style') {
@ -327,6 +274,7 @@ export class HomeComponent implements OnInit, OnDestroy, AfterViewInit {
this.elements.forEach(element => {
mutationObserver.observe(element.nativeElement, {attributes: true});
});
this.subscriptions.push(intersectionObserver);
this.subscriptions.push(mutationObserver);
}
@ -340,102 +288,47 @@ export class HomeComponent implements OnInit, OnDestroy, AfterViewInit {
this.selectedEntityAdvancedUrl = $event.advancedUrl;
}
goTo(simple: boolean) {
let url = (simple) ? this.selectedEntitySimpleUrl : this.selectedEntityAdvancedUrl;
goTo() {
let parameterNames = [];
let parameterValues = [];
if (this.selectedEntity == "result") {
if (this.resultTypes) {
let values = [];
for (let value of this.resultTypes.values) {
if (value.selected) {
values.push(value.id);
}
}
if (values.length > 0 && values.length != 4) {
parameterNames.push("type");
parameterValues.push(values.join(","));
}
if (this.resultsQuickFilter && this.resultsQuickFilter.selected) {
parameterNames.push(this.resultsQuickFilter.filterId);
parameterValues.push('"' + encodeURIComponent(this.resultsQuickFilter.value) + '"');
}
}
} else if (this.selectedEntity == "all") {
if (this.resultsQuickFilter && this.resultsQuickFilter.selected) {
parameterNames.push(this.resultsQuickFilter.filterId);
parameterValues.push('"' + encodeURIComponent(this.resultsQuickFilter.value) + '"');
}
// if (this.selectedEntity == "result") {
// if (this.resultTypes) {
// let values = [];
// for (let value of this.resultTypes.values) {
// if (value.selected) {
// values.push(value.id);
// }
// }
// if (values.length > 0 && values.length != 4) {
// parameterNames.push("type");
// parameterValues.push(values.join(","));
// }
// if (this.resultsQuickFilter && this.resultsQuickFilter.selected) {
// parameterNames.push(this.resultsQuickFilter.filterId);
// parameterValues.push('"' + encodeURIComponent(this.resultsQuickFilter.value) + '"');
// }
// }
// } else if (this.selectedEntity == "all") {
if (this.resultsQuickFilter && this.resultsQuickFilter.selected) {
parameterNames.push(this.resultsQuickFilter.filterId);
parameterValues.push('"' + encodeURIComponent(this.resultsQuickFilter.value) + '"');
}
// }
if (this.keyword.length > 0) {
parameterNames.push("fv0");
parameterValues.push(this.keyword);
parameterNames.push("f0");
parameterValues.push("q");
}
this._router.navigate([url], {queryParams: this.routerHelper.createQueryParams(parameterNames, parameterValues)});
this._router.navigate([this.properties.searchLinkToAll], {queryParams: this.routerHelper.createQueryParams(parameterNames, parameterValues)});
}
getSubjectParameter(param) {
return {'f0': 'resultsubject', 'fv0': '"' + (param) + '"', size: 50};
}
init(getDatasetsLinked = false, getSoftwareLinked = false, getPublications = true, getDatasets = true,
getSoftware = true, getOther = true, getProjects = true, getDataProviders = true, getOrganizations = true, refineValue: string = null) {
this.subscriptions.push(zip(
(getPublications) ? this.searchResearchResultsService.numOfSearchResults('publication', '', this.properties, null) : of(0),
(getDatasets) ? this.searchResearchResultsService.numOfSearchResults('dataset', '', this.properties, null) : of(0),
(getDatasetsLinked) ? this.searchResearchResultsService.numOfSearchResultsLinkedToPub("dataset", this.properties) : of(0),
(getSoftware) ? this.searchResearchResultsService.numOfSearchResults('software', '', this.properties, null) : of(0),
(getSoftwareLinked) ? this.searchResearchResultsService.numOfSearchResultsLinkedToPub("software", this.properties) : of(0),
(getOther) ? this.searchResearchResultsService.numOfSearchResults('other', '', this.properties, null) : of(0),
(getProjects) ? this.refineFieldResultsService.getRefineFieldsResultsByEntityName(['funder'], 'project', this.properties, null) : of(0),
(getDataProviders) ? this.searchDataprovidersService.numOfSearchDataproviders('', this.properties, null) : of(0),
(getOrganizations) ? this.searchOrganizationsService.numOfSearchOrganizations2('', this.properties, null) : of(0)
).subscribe((data: any[]) => {
if (data[0] && data[0] > 0) {
this.numbers.publicationsSize = NumberUtils.roundNumber(data[0]);
}
if (data[1] && data[1] > 0) {
this.numbers.datasetsSize = NumberUtils.roundNumber(data[1]);
}
if (data[2] && data[2] > 0) {
this.numbers.datasetsLinkedSize = NumberUtils.roundNumber(data[2]);
}
if (data[3] && data[3] > 0) {
this.numbers.softwareSize = NumberUtils.roundNumber(data[3]);
}
if (data[4] && data[4] > 0) {
this.numbers.softwareLinkedSize = NumberUtils.roundNumber(data[4]);
}
if (data[5] && data[5] > 0) {
this.numbers.otherSize = NumberUtils.roundNumber(data[5]);
}
if (data[6][0] && data[6][0] > 0) {
this.numbers.projectsSize = NumberUtils.roundNumber(data[6][0]);
}
if (data[6][1] && data[6][1].length > 0 && data[6][1][0].filterId == 'funder' && data[6][1][0].values) {
this.numbers.fundersSize = NumberUtils.roundNumber(data[6][1][0].values.length);
}
if (data[7] && data[7] > 0) {
this.numbers.datasourcesSize = NumberUtils.roundNumber(data[7]);
}
if (data[8] && data[8] > 0) {
this.numbers.organizationsSize = NumberUtils.roundNumber(data[8]);
}
}, err => {
this.handleError('Error getting numbers', err);
}));
}
disableSelectChange(event: boolean) {
this.disableSelect = event;
this.cdr.detectChanges();
}
public get showContentWithNumbers() {
if (this.numbers && this.numbers.publicationsSize && this.numbers.datasetsSize && this.numbers.softwareSize && this.numbers.datasourcesSize && this.numbers.projectsSize && this.numbers.organizationsSize) {
return true;
}
}
// disableSelectChange(event: boolean) {
// this.disableSelect = event;
// this.cdr.detectChanges();
// }
}

View File

@ -10,12 +10,10 @@ import { DataProvidersServiceModule} from '../openaireLibrary/services/dataProvi
import { SearchResearchResultsServiceModule} from '../openaireLibrary/services/searchResearchResultsService.module';
import { ProjectsServiceModule} from '../openaireLibrary/services/projectsService.module';
import { OrganizationsServiceModule} from '../openaireLibrary/services/organizationsService.module';
import { PiwikServiceModule} from '../openaireLibrary/utils/piwik/piwikService.module';
import {HelperModule} from '../openaireLibrary/utils/helper/helper.module';
import {RefineFieldResultsServiceModule} from '../openaireLibrary/services/refineFieldResultsService.module';
import {PreviousRouteRecorder} from '../openaireLibrary/utils/piwik/previousRouteRecorder.guard';
import { SEOServiceModule } from '../openaireLibrary/sharedComponents/SEO/SEOService.module';
import {OtherPortalsModule} from "../openaireLibrary/sharedComponents/other-portals/other-portals.module";
@ -23,34 +21,33 @@ import {EntitiesSelectionModule} from "../openaireLibrary/searchPages/searchUtil
import {QuickSelectionsModule} from "../openaireLibrary/searchPages/searchUtils/quick-selections.module";
import {IconsModule} from "../openaireLibrary/utils/icons/icons.module";
import {IconsService} from "../openaireLibrary/utils/icons/icons.service";
import {arrow_right, book, cog, database, earth} from "../openaireLibrary/utils/icons/icons";
import {book, cog, database, earth} from "../openaireLibrary/utils/icons/icons";
import {NumbersModule} from "../openaireLibrary/sharedComponents/numbers/numbers.module";
import {AdvancedSearchInputModule} from "../openaireLibrary/sharedComponents/advanced-search-input/advanced-search-input.module";
import {InputModule} from "../openaireLibrary/sharedComponents/input/input.module";
import {SearchInputModule} from "../openaireLibrary/sharedComponents/search-input/search-input.module";
import {SliderUtilsModule} from "../openaireLibrary/sharedComponents/slider-utils/slider-utils.module";
@NgModule({
imports: [
HomeRoutingModule,
CommonModule, FormsModule, RouterModule,
RefineFieldResultsServiceModule,
DataProvidersServiceModule, SearchResearchResultsServiceModule,
ProjectsServiceModule, OrganizationsServiceModule,
PiwikServiceModule,
HomeRoutingModule,
HelperModule,
SEOServiceModule, OtherPortalsModule, EntitiesSelectionModule, QuickSelectionsModule, IconsModule, NumbersModule, AdvancedSearchInputModule, InputModule
SEOServiceModule, OtherPortalsModule, EntitiesSelectionModule, QuickSelectionsModule, IconsModule, NumbersModule, AdvancedSearchInputModule, InputModule, SearchInputModule, SliderUtilsModule
],
declarations: [
HomeComponent
],
providers:[
PreviousRouteRecorder
],
providers:[],
exports: [
HomeComponent
]
})
export class HomeModule {
constructor(private iconsService: IconsService) {
this.iconsService.registerIcons([arrow_right, book, cog, database, earth]);
this.iconsService.registerIcons([book, cog, database, earth]);
}
}

View File

@ -1,18 +0,0 @@
import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
import { OpenaireDataProviderComponent } from './dataProvider.component';
import {PreviousRouteRecorder} from '../../openaireLibrary/utils/piwik/previousRouteRecorder.guard';
import {properties} from "../../../environments/environment";
@NgModule({
imports: [
RouterModule.forChild([
{ path: '', component: OpenaireDataProviderComponent, data: {
redirect: properties.errorLink, community : 'openaire'
},canDeactivate: [PreviousRouteRecorder] }
])
]
})
export class DataProviderRoutingModule { }

View File

@ -1,17 +0,0 @@
import {Component} from '@angular/core';
@Component({
selector: 'openaire-dataprovider',
template: `<dataprovider></dataprovider>`,
})
export class OpenaireDataProviderComponent{
constructor ( ) {
}
ngOnInit() {
}
}

View File

@ -1,13 +0,0 @@
import { NgModule} from '@angular/core';
import { DataProviderModule } from '../../openaireLibrary/landingPages/dataProvider/dataProvider.module';
import { OpenaireDataProviderComponent } from './dataProvider.component';
import {DataProviderRoutingModule} from './dataProvider-routing.module';
import {PreviousRouteRecorder} from '../../openaireLibrary/utils/piwik/previousRouteRecorder.guard';
@NgModule({
imports: [DataProviderModule, DataProviderRoutingModule],
declarations:[OpenaireDataProviderComponent],
providers:[ PreviousRouteRecorder],
exports:[OpenaireDataProviderComponent]
})
export class LibDataProviderModule { }

View File

@ -1,17 +0,0 @@
import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
import { OpenaireDatasetComponent } from './dataset.component';
import {PreviousRouteRecorder} from '../../openaireLibrary/utils/piwik/previousRouteRecorder.guard';
import {properties} from "../../../environments/environment";
@NgModule({
imports: [
RouterModule.forChild([
{ path: '', component: OpenaireDatasetComponent, data: {
redirect: properties.errorLink, community : 'openaire'
},canDeactivate: [PreviousRouteRecorder] }
])
]
})
export class DatasetRoutingModule { }

View File

@ -1,7 +0,0 @@
import {Component} from '@angular/core';
@Component({
selector: 'openaire-dataset',
template: `<result-landing type="dataset"></result-landing>`,
})
export class OpenaireDatasetComponent{}

View File

@ -1,12 +0,0 @@
import { NgModule} from '@angular/core';
import { OpenaireDatasetComponent } from './dataset.component';
import {PreviousRouteRecorder} from '../../openaireLibrary/utils/piwik/previousRouteRecorder.guard';
import {DatasetRoutingModule} from './dataset-routing.module';
import {ResultLandingModule} from "../../openaireLibrary/landingPages/result/resultLanding.module";
@NgModule({
imports: [DatasetRoutingModule, ResultLandingModule],
declarations:[OpenaireDatasetComponent],
providers:[PreviousRouteRecorder],
exports:[OpenaireDatasetComponent]
})
export class LibDatasetModule { }

View File

@ -1,12 +0,0 @@
import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
import { OpenaireHtmlProjectReportComponent } from './htmlProjectReport.component';
import {PreviousRouteRecorder} from '../../openaireLibrary/utils/piwik/previousRouteRecorder.guard';
@NgModule({
imports: [
RouterModule.forChild([
{ path: '', component: OpenaireHtmlProjectReportComponent ,canDeactivate: [PreviousRouteRecorder]}
])
]
})
export class HtmlProjectReportRoutingModule { }

View File

@ -1,17 +0,0 @@
import {Component} from '@angular/core';
@Component({
selector: 'openaire-htmlProjectReport',
template: `<htmlProjectReport></htmlProjectReport>`,
})
export class OpenaireHtmlProjectReportComponent{
constructor ( ) {
}
ngOnInit() {
}
}

View File

@ -1,13 +0,0 @@
import { NgModule} from '@angular/core';
import { HtmlProjectReportModule } from '../../openaireLibrary/landingPages/htmlProjectReport/htmlProjectReport.module';
import {PreviousRouteRecorder} from '../../openaireLibrary/utils/piwik/previousRouteRecorder.guard';
import { OpenaireHtmlProjectReportComponent } from './htmlProjectReport.component';
import {HtmlProjectReportRoutingModule} from './htmlProjectReport-routing.module';
@NgModule({
imports: [HtmlProjectReportModule, HtmlProjectReportRoutingModule],
declarations:[OpenaireHtmlProjectReportComponent],
providers:[ PreviousRouteRecorder],
exports:[OpenaireHtmlProjectReportComponent]
})
export class LibHtmlProjectReportModule { }

View File

@ -1,13 +0,0 @@
import { NgModule} from '@angular/core';
import { OrganizationModule } from '../../openaireLibrary/landingPages/organization/organization.module';
import {PreviousRouteRecorder} from '../../openaireLibrary/utils/piwik/previousRouteRecorder.guard';
import { OpenaireOrganizationComponent } from './organization.component';
import {OrganizationRoutingModule} from './organization-routing.module';
@NgModule({
imports: [OrganizationModule, OrganizationRoutingModule],
declarations:[OpenaireOrganizationComponent],
providers:[ PreviousRouteRecorder],
exports:[OpenaireOrganizationComponent]
})
export class LibOrganizationModule { }

View File

@ -1,19 +0,0 @@
import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
import { OpenaireOrganizationComponent } from './organization.component';
import {PreviousRouteRecorder} from '../../openaireLibrary/utils/piwik/previousRouteRecorder.guard';
import {properties} from "../../../environments/environment";
@NgModule({
imports: [
RouterModule.forChild([
{ path: '', component: OpenaireOrganizationComponent, data: {
redirect: properties.errorLink, community : 'openaire'
},canDeactivate: [PreviousRouteRecorder] }
])
]
})
export class OrganizationRoutingModule { }

View File

@ -1,17 +0,0 @@
import {Component} from '@angular/core';
@Component({
selector: 'openaire-organization',
template: `<organization></organization>`,
})
export class OpenaireOrganizationComponent{
constructor ( ) {
}
ngOnInit() {
}
}

View File

@ -1,12 +0,0 @@
import { NgModule} from '@angular/core';
import { OpenaireOrpComponent } from './orp.component';
import {PreviousRouteRecorder} from '../../openaireLibrary/utils/piwik/previousRouteRecorder.guard';
import {OrpRoutingModule} from './orp-routing.module';
import {ResultLandingModule} from "../../openaireLibrary/landingPages/result/resultLanding.module";
@NgModule({
imports: [OrpRoutingModule, ResultLandingModule],
declarations:[OpenaireOrpComponent],
providers:[ PreviousRouteRecorder],
exports:[OpenaireOrpComponent]
})
export class LibOrpModule { }

View File

@ -1,18 +0,0 @@
import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
import { OpenaireOrpComponent } from './orp.component';
import {PreviousRouteRecorder} from '../../openaireLibrary/utils/piwik/previousRouteRecorder.guard';
import {properties} from "../../../environments/environment";
@NgModule({
imports: [
RouterModule.forChild([
{ path: '', component: OpenaireOrpComponent, data: {
redirect: properties.errorLink, community : 'openaire'
},canDeactivate: [PreviousRouteRecorder] }
])
]
})
export class OrpRoutingModule { }

View File

@ -1,7 +0,0 @@
import {Component} from '@angular/core';
@Component({
selector: 'openaire-orp',
template: `<result-landing type="orp"></result-landing>`,
})
export class OpenaireOrpComponent{}

View File

@ -1,13 +0,0 @@
import { NgModule} from '@angular/core';
import { ProjectModule } from '../../openaireLibrary/landingPages/project/project.module';
import {PreviousRouteRecorder} from '../../openaireLibrary/utils/piwik/previousRouteRecorder.guard';
import { OpenaireProjectComponent } from './project.component';
import {ProjectRoutingModule} from './project-routing.module';
@NgModule({
imports: [ProjectModule, ProjectRoutingModule],
declarations:[OpenaireProjectComponent],
providers:[ PreviousRouteRecorder],
exports:[OpenaireProjectComponent]
})
export class LibProjectModule { }

View File

@ -1,17 +0,0 @@
import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
import { OpenaireProjectComponent } from './project.component';
import {PreviousRouteRecorder} from '../../openaireLibrary/utils/piwik/previousRouteRecorder.guard';
import {properties} from "../../../environments/environment";
@NgModule({
imports: [
RouterModule.forChild([
{ path: '', component: OpenaireProjectComponent, data: {
redirect: properties.errorLink, community : 'openaire'
},canDeactivate: [PreviousRouteRecorder] }
])
]
})
export class ProjectRoutingModule { }

View File

@ -1,17 +0,0 @@
import {Component} from '@angular/core';
@Component({
selector: 'openaire-project',
template: `<project></project>`,
})
export class OpenaireProjectComponent{
constructor ( ) {
}
ngOnInit() {
}
}

View File

@ -1,13 +0,0 @@
import { NgModule} from '@angular/core';
import {PreviousRouteRecorder} from '../../openaireLibrary/utils/piwik/previousRouteRecorder.guard';
import { OpenairePublicationComponent } from './publication.component';
import {PublicationRoutingModule} from './publication-routing.module';
import {ResultLandingModule} from "../../openaireLibrary/landingPages/result/resultLanding.module";
@NgModule({
imports: [PublicationRoutingModule, ResultLandingModule],
declarations:[OpenairePublicationComponent],
providers:[ PreviousRouteRecorder],
exports:[OpenairePublicationComponent]
})
export class LibPublicationModule { }

View File

@ -1,17 +0,0 @@
import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
import {OpenairePublicationComponent } from './publication.component';
import {PreviousRouteRecorder} from '../../openaireLibrary/utils/piwik/previousRouteRecorder.guard';
import {properties} from "../../../environments/environment";
@NgModule({
imports: [
RouterModule.forChild([
{ path: '', component: OpenairePublicationComponent, data: {
redirect: properties.errorLink, community : 'openaire'
},canDeactivate: [PreviousRouteRecorder] }
])
]
})
export class PublicationRoutingModule { }

View File

@ -1,8 +0,0 @@
import {Component} from '@angular/core';
@Component({
selector: 'openaire-publication',
template: `
<result-landing type="publication"></result-landing>`,
})
export class OpenairePublicationComponent {}

View File

@ -1,13 +0,0 @@
import {NgModule} from '@angular/core';
import {PreviousRouteRecorder} from '../../openaireLibrary/utils/piwik/previousRouteRecorder.guard';
import {OpenaireResultComponent} from './result.component';
import {ResultRoutingModule} from './result-routing.module';
import {ResultLandingModule} from "../../openaireLibrary/landingPages/result/resultLanding.module";
@NgModule({
imports: [ResultRoutingModule, ResultLandingModule],
declarations:[OpenaireResultComponent],
providers:[PreviousRouteRecorder],
exports:[OpenaireResultComponent]
})
export class LibResultModule { }

View File

@ -1,18 +0,0 @@
import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
import {OpenaireResultComponent } from './result.component';
import {PreviousRouteRecorder} from '../../openaireLibrary/utils/piwik/previousRouteRecorder.guard';
import {properties} from "../../../environments/environment";
@NgModule({
imports: [
RouterModule.forChild([
{ path: '', component: OpenaireResultComponent, data: {
redirect: properties.errorLink, community : 'openaire'
},canDeactivate: [PreviousRouteRecorder] }
])
]
})
export class ResultRoutingModule { }

View File

@ -1,7 +0,0 @@
import {Component} from '@angular/core';
@Component({
selector: 'openaire-publication',
template: `<result-landing type="result"></result-landing>`,
})
export class OpenaireResultComponent{}

View File

@ -1,13 +0,0 @@
import { NgModule} from '@angular/core';
import {PreviousRouteRecorder} from '../../openaireLibrary/utils/piwik/previousRouteRecorder.guard';
import { OpenaireSoftwareComponent } from './software.component';
import {SoftwareRoutingModule} from './software-routing.module';
import {ResultLandingModule} from "../../openaireLibrary/landingPages/result/resultLanding.module";
@NgModule({
imports: [SoftwareRoutingModule, ResultLandingModule],
declarations:[OpenaireSoftwareComponent],
providers:[PreviousRouteRecorder],
exports:[OpenaireSoftwareComponent]
})
export class LibSoftwareModule { }

View File

@ -1,14 +0,0 @@
import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
import {OpenaireSoftwareComponent } from './software.component';
import {PreviousRouteRecorder} from '../../openaireLibrary/utils/piwik/previousRouteRecorder.guard';
@NgModule({
imports: [
RouterModule.forChild([
{ path: '', component: OpenaireSoftwareComponent, canDeactivate: [PreviousRouteRecorder] }
])
]
})
export class SoftwareRoutingModule { }

View File

@ -1,7 +0,0 @@
import {Component} from '@angular/core';
@Component({
selector: 'openaire-software',
template: `<result-landing type="software"></result-landing>`,
})
export class OpenaireSoftwareComponent{}

View File

@ -1,23 +0,0 @@
import { NgModule} from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import {OpenaireUserComponent } from './user.component';
import { UserRoutingModule } from './user-routing.module';
import { UserModule} from '../openaireLibrary/login/user.module';
import {PreviousRouteRecorder} from '../openaireLibrary/utils/piwik/previousRouteRecorder.guard';
@NgModule({
imports: [
CommonModule, FormsModule,
UserRoutingModule, UserModule
],
providers:[PreviousRouteRecorder],
declarations: [
OpenaireUserComponent
]
})
export class LibUserModule { }

View File

@ -1,15 +0,0 @@
import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
import {OpenaireUserComponent } from './user.component';
import {PreviousRouteRecorder} from '../openaireLibrary/utils/piwik/previousRouteRecorder.guard';
@NgModule({
imports: [
RouterModule.forChild([
{ path: '', component: OpenaireUserComponent, canDeactivate: [PreviousRouteRecorder]},
])
]
})
export class UserRoutingModule { }

View File

@ -1,10 +0,0 @@
import {Component} from '@angular/core';
@Component({
selector: 'openaire-user',
template: `<user></user>`
})
export class OpenaireUserComponent {
}

@ -1 +1 @@
Subproject commit adb0564b06277c3e19aeae8a7790c33dc03e1fc6
Subproject commit f1fd1ef60c5a964e283ced7840876dc5896af9be

View File

@ -1,21 +0,0 @@
import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
import {PreviousRouteRecorder} from "../../openaireLibrary/utils/piwik/previousRouteRecorder.guard";
import {OpenaireMyOrcidLinksComponent} from "./myOrcidLinks.component";
import {LoginGuard} from "../../openaireLibrary/login/loginGuard.guard";
import {properties} from "../../../environments/environment";
@NgModule({
imports: [
RouterModule.forChild([
{ path: '', component: OpenaireMyOrcidLinksComponent,
canActivate: [LoginGuard], data: {
redirect: properties.errorLink, community : 'openaire'
},
canDeactivate: [PreviousRouteRecorder]
}
])
]
})
export class MyOrcidLinksRoutingModule { }

View File

@ -1,16 +0,0 @@
import {Component} from '@angular/core';
@Component({
selector: 'openaire-my-orcid-links',
template: `
<my-orcid-links></my-orcid-links>
`
})
export class OpenaireMyOrcidLinksComponent {
constructor() {}
public ngOnInit() {}
}

View File

@ -1,24 +0,0 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import {PreviousRouteRecorder} from "../../openaireLibrary/utils/piwik/previousRouteRecorder.guard";
import {OpenaireMyOrcidLinksComponent} from './myOrcidLinks.component';
import {MyOrcidLinksModule} from "../../openaireLibrary/orcid/my-orcid-links/myOrcidLinks.module";
import {MyOrcidLinksRoutingModule} from "./myOrcidLinks-routing.module";
import {LoginGuard} from "../../openaireLibrary/login/loginGuard.guard";
@NgModule({
imports: [
CommonModule, FormsModule,
MyOrcidLinksModule,
MyOrcidLinksRoutingModule
],
declarations: [
OpenaireMyOrcidLinksComponent
],
exports: [
OpenaireMyOrcidLinksComponent
],
providers: [PreviousRouteRecorder, LoginGuard]
})
export class LibMyOrcidLinksModule { }

View File

@ -1,21 +0,0 @@
import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
import {OpenaireOrcidComponent} from './orcid.component';
import {PreviousRouteRecorder} from "../openaireLibrary/utils/piwik/previousRouteRecorder.guard";
import {LoginGuard} from "../openaireLibrary/login/loginGuard.guard";
import {properties} from "../../environments/environment";
@NgModule({
imports: [
RouterModule.forChild([
{ path: '', component: OpenaireOrcidComponent,
canActivate: [LoginGuard], data: {
redirect: properties.errorLink, community : 'openaire'
},
canDeactivate: [PreviousRouteRecorder] }
])
]
})
export class OrcidRoutingModule { }

View File

@ -1,10 +0,0 @@
import { Component } from '@angular/core';
@Component({
selector: 'openaire-orcid',
template: `
<orcid></orcid>
`
})
export class OpenaireOrcidComponent {}

View File

@ -1,24 +0,0 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import {OpenaireOrcidComponent} from './orcid.component';
import {OrcidRoutingModule} from './orcid-routing.module';
import {PreviousRouteRecorder} from "../openaireLibrary/utils/piwik/previousRouteRecorder.guard";
import {FormsModule} from "@angular/forms";
import {OrcidModule} from "../openaireLibrary/orcid/orcid.module";
import {LoginGuard} from "../openaireLibrary/login/loginGuard.guard";
@NgModule({
imports: [
CommonModule, FormsModule,
OrcidModule, OrcidRoutingModule
],
declarations: [
OpenaireOrcidComponent
],
providers: [PreviousRouteRecorder, LoginGuard],
exports: [
OpenaireOrcidComponent
]
})
export class LibOrcidModule { }

View File

@ -1,24 +0,0 @@
import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
import {IsRouteEnabled} from "../../openaireLibrary/error/isRouteEnabled.guard";
import {PreviousRouteRecorder} from "../../openaireLibrary/utils/piwik/previousRouteRecorder.guard";
import {OpenaireSearchRecommendedResultsForOrcidComponent} from "./searchRecommendedResultsForOrcid.component";
import {FreeGuard} from "../../openaireLibrary/login/freeGuard.guard";
import {LoginGuard} from "../../openaireLibrary/login/loginGuard.guard";
import {properties} from "../../../environments/environment";
@NgModule({
imports: [
RouterModule.forChild([
// { path: '', component: OpenaireSearchMyResultsInOrcidComponent, canActivate: [IsRouteEnabled], data: {
{ path: '', component: OpenaireSearchRecommendedResultsForOrcidComponent,
canActivate: [LoginGuard], data: {
redirect: properties.errorLink, community : 'openaire'
},
canDeactivate: [PreviousRouteRecorder]
}
])
]
})
export class SearchRecommendedResultsForOrcidRoutingModule { }

View File

@ -1,16 +0,0 @@
import {Component} from '@angular/core';
@Component({
selector: 'openaire-search-recommended-results-for-orcid',
template: `
<search-recommended-results-for-orcid></search-recommended-results-for-orcid>
`
})
export class OpenaireSearchRecommendedResultsForOrcidComponent {
constructor() {}
public ngOnInit() {}
}

View File

@ -1,27 +0,0 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import {OpenaireSearchRecommendedResultsForOrcidComponent} from "./searchRecommendedResultsForOrcid.component";
import {PreviousRouteRecorder} from "../../openaireLibrary/utils/piwik/previousRouteRecorder.guard";
import {IsRouteEnabled} from "../../openaireLibrary/error/isRouteEnabled.guard";
import {SearchRecommendedResultsForOrcidModule} from "../../openaireLibrary/orcid/recommend-orcid-links/searchRecommendedResultsForOrcid.module";
import {SearchRecommendedResultsForOrcidRoutingModule} from "./searchRecommendedResultsForOrcid-routing.module";
import {FreeGuard} from "../../openaireLibrary/login/freeGuard.guard";
import {LoginGuard} from "../../openaireLibrary/login/loginGuard.guard";
@NgModule({
imports: [
CommonModule, FormsModule,
SearchRecommendedResultsForOrcidModule,
SearchRecommendedResultsForOrcidRoutingModule
],
declarations: [
OpenaireSearchRecommendedResultsForOrcidComponent
],
exports: [
OpenaireSearchRecommendedResultsForOrcidComponent
],
// providers: [PreviousRouteRecorder, IsRouteEnabled]
providers: [PreviousRouteRecorder, LoginGuard]
})
export class LibSearchRecommendedResultsForOrcidModule { }

View File

@ -1,18 +0,0 @@
import {NgModule} from '@angular/core';
import {CommonModule} from '@angular/common';
import {FormsModule} from '@angular/forms';
import {RouterModule} from '@angular/router';
import {ReloadModule} from '../openaireLibrary/reload/reload.module';
@NgModule({
imports: [
CommonModule, FormsModule, RouterModule, ReloadModule
],
declarations: [],
providers: [],
exports: []
})
export class LibReloadModule {
}

View File

@ -1,13 +0,0 @@
import {NgModule} from '@angular/core';
import {RouterModule} from '@angular/router';
import {SdgComponent} from './sdg.component';
import {PreviousRouteRecorder} from '../openaireLibrary/utils/piwik/previousRouteRecorder.guard';
@NgModule({
imports: [
RouterModule.forChild([
{ path: '', component: SdgComponent, canDeactivate: [PreviousRouteRecorder] }
])
]
})
export class SdgRoutingModule { }

View File

@ -1,72 +0,0 @@
<schema2jsonld *ngIf="url" [URL]="url" [name]="pageTitle" type="other" [description]="pageDescription"></schema2jsonld>
<div class="uk-container uk-container-large uk-section uk-section-small uk-padding-remove-bottom">
<div class="uk-padding-small uk-padding-remove-horizontal">
<breadcrumbs [breadcrumbs]="breadcrumbs"></breadcrumbs>
</div>
</div>
<div class="uk-container uk-container-large uk-section" uk-scrollspy="target: [uk-scrollspy-class]; cls: uk-animation-slide-bottom-medium; delay: 200">
<div class="uk-grid uk-grid-large uk-grid-stack uk-padding-small" uk-grid>
<div class="uk-width-3-5@m uk-width-1-1@s uk-flex uk-flex-column uk-flex-center">
<span class="uk-align-left uk-margin-remove-bottom">
<span uk-scrollspy-class class="uk-text-large" style="color: #EEB204">Beta</span>
</span>
<h1 uk-scrollspy-class class="uk-h1 uk-width-4-5@m uk-margin-remove-top">
<span>Science for UN Sustainable Development Goals<span class="custom-sdg-dot"></span></span>
</h1>
<h2 uk-scrollspy-class class="uk-h5 uk-margin-remove-top">
Laying the foundation for new approaches and solutions.
</h2>
<div class="uk-width-3-4@m" uk-scrollspy-class>
We have developed a classification scheme for UN Sustainable Development Goals, to view contributions of research towards complex challenges for humanity such as climate change, biodiversity loss, pollution and poverty reduction.
</div>
<div>
<!-- TODO: need a page for the description of the algorithm - to get us there from the learn more btn -->
<!-- <a class="uk-display-inline-block uk-text-uppercase uk-button uk-button-text uk-margin-top" uk-scrollspy-class
routerLinkActive="router-link-active" routerLink="/">
<span class="uk-flex uk-flex-middle">
<span>Learn More</span>
</span>
</a> -->
</div>
</div>
<div class="uk-width-2-5@m uk-width-1-1@s uk-text-center uk-position-relative" uk-scrollspy-class>
<img src="assets/explore-assets/sdg-hero-img.svg" loading="lazy">
<div class="uk-position-bottom-left uk-card uk-card-default uk-padding">
<img src="assets/explore-assets/sdg-badge.png" loading="lazy" style="max-width: 215px">
</div>
</div>
</div>
</div>
<div class="uk-container uk-container-large uk-section" uk-scrollspy="target: [uk-scrollspy-class]; cls: uk-animation-slide-bottom-medium; delay: 200">
<div *ngIf="loading">
<loading></loading>
</div>
<div *ngIf="!loading">
<div *ngIf="displayedSdgs && displayedSdgs.length" class="uk-padding-small uk-margin-auto@m uk-grid uk-child-width-1-4@xl uk-child-width-1-4@l uk-child-width-1-3@m uk-child-width-1-2@s" uk-grid>
<div *ngFor="let sdg of displayedSdgs">
<a [routerLink]="properties.searchLinkToResults" [queryParams]="{'sdg': urlEncodeAndQuote(sdg.id)}"
class="uk-link-reset">
<div class="uk-card uk-card-default uk-card-hover" [class]="'sdg-card sdg-' + sdg.code">
<div class="uk-height-1-1 uk-flex uk-flex-column uk-flex-between">
<div class="uk-flex uk-flex-middle uk-light uk-padding-small uk-padding-remove-bottom">
<div class="uk-text-bold uk-h4 uk-margin-remove">
{{sdg.code}}
</div>
<div class="uk-text-bold uk-text-uppercase uk-text-small uk-margin-small-left">
<span [innerHTML]="sdg.html"></span>
</div>
</div>
<div class="uk-text-center">
<img [src]="'assets/explore-assets/sdgs/g' + sdg.code + '.png'" alt="">
</div>
<div class="uk-text-center uk-padding-small uk-background-default" style="border-radius: 0 0 4px 4px;">
<span class="uk-text-large uk-text-bold uk-margin-small-bottom">{{sdg.number == null ? '0' : sdg.number | number}}</span>
<p class="uk-text-small uk-text-uppercase uk-margin-remove">{{openaireEntities.RESULTS}}</p>
</div>
</div>
</div>
</a>
</div>
</div>
</div>
</div>

View File

@ -1,30 +0,0 @@
@import (reference) "~src/assets/openaire-theme/less/_import-variables";
@sdgs: #E6233D, #DF9F00, #19A220, #D70023, #FF0B00, #00BFE8, #FFC300, #B10240, #FF5D00,
#F50D86, #FF8A00, #CA8A03, #2B772B, #0098DF, #00B91C, #0069A2, #1C336A;
custom-sdg-dot:after {
content: "";
background-image: url("~src/assets/explore-assets/sdg-dot-img.svg");
display: inline-block;
background-size: 100% 100%;
height: 18px;
width: 18px;
margin-left: 10px;
}
.sdg-card {
width: 265px;
height: 255px;
img {
height: @global-control-height;
width: auto;
}
each(@sdgs, {
&.sdg-@{index} {
background-color: @value !important;
}
})
}

View File

@ -1,97 +0,0 @@
import {HttpClient} from "@angular/common/http";
import {Component, OnDestroy, OnInit} from "@angular/core";
import {Subscription} from "rxjs";
import {Breadcrumb} from "../openaireLibrary/utils/breadcrumbs/breadcrumbs.component";
import {EnvProperties} from "../openaireLibrary/utils/properties/env-properties";
import {properties} from "src/environments/environment";
import {RefineFieldResultsService} from "../openaireLibrary/services/refineFieldResults.service";
import {OpenaireEntities} from "../openaireLibrary/utils/properties/searchFields";
import {StringUtils} from "../openaireLibrary/utils/string-utils.class";
import {Router} from '@angular/router';
import {Meta, Title} from "@angular/platform-browser";
import {SEOService} from "../openaireLibrary/sharedComponents/SEO/SEO.service";
import {PiwikService} from "../openaireLibrary/utils/piwik/piwik.service";
@Component({
selector: 'sdg',
templateUrl: 'sdg.component.html',
styleUrls: ['sdg.component.less']
})
export class SdgComponent implements OnInit, OnDestroy {
public url: string = null;
public pageTitle: string = "OpenAIRE | Sustainable Development Goals";
public pageDescription: string = "Laying the foundation for new approaches and solutions. We have developed a classification scheme for UN Sustainable Development Goals, to view contributions of research towards complex challenges for humanity such as climate change, biodiversity loss, pollution and poverty reduction.";
private sdgs: any = [];
private sdgsResearchOutcomes: any = [];
public displayedSdgs: any = [];
public loading: boolean;
properties: EnvProperties = properties;
openaireEntities = OpenaireEntities;
public breadcrumbs: Breadcrumb[] = [{name: 'home', route: '/'}, {name: 'Sustainable Development Goals'}];
subscriptions: Subscription[] = [];
constructor(
private httpClient: HttpClient, private refineFieldResultsService: RefineFieldResultsService,
private _router: Router,
private _meta: Meta,
private _title: Title,
private seoService: SEOService,
private _piwikService: PiwikService
) {}
ngOnInit() {
this.loading = true;
if (this.properties.enablePiwikTrack && (typeof document !== 'undefined')) {
this.subscriptions.push(this._piwikService.trackView(this.properties, this.pageTitle, this.properties.piwikSiteId).subscribe());
}
this.url = this.properties.domain + this.properties.baseLink + this._router.url;
this.seoService.createLinkForCanonicalURL(this.url);
this.updateUrl(this.url);
this.updateTitle(this.pageTitle);
this.updateDescription(this.pageDescription);
this.httpClient.get(properties.domain+'/assets/vocabulary/sdg.json').subscribe(data => {
this.sdgs = data['sdg'];
});
this.refineFieldResultsService.getRefineFieldsResultsByEntityName(['sdg'], 'result', this.properties, null).subscribe(data => {
this.sdgsResearchOutcomes = data[1][0].values;
let merged =[];
for(let i=0; i<this.sdgs.length; i++){
merged.push({
...this.sdgs[i],
...(this.sdgsResearchOutcomes.find((innerItem) => innerItem.id === this.sdgs[i].id))
});
}
this.displayedSdgs = merged;
this.loading = false;
});
}
public ngOnDestroy() {
for (let sub of this.subscriptions) {
sub.unsubscribe();
}
}
public urlEncodeAndQuote(str: string): string {
return StringUtils.quote(StringUtils.URIEncode(str));
}
private updateUrl(url: string) {
this._meta.updateTag({content: url}, "property='og:url'");
}
private updateTitle(title: string) {
var _title = ((title.length > 50) ? title.substring(0, 50) : title);
this._title.setTitle(_title);
this._meta.updateTag({content: _title}, "property='og:title'");
}
private updateDescription(description: string) {
this._meta.updateTag({content: description}, "name='description'");
this._meta.updateTag({content: description}, "property='og:description'");
}
}

View File

@ -1,34 +0,0 @@
import {CommonModule} from "@angular/common";
import {NgModule} from "@angular/core";
import {FormsModule} from "@angular/forms";
import {RouterModule} from "@angular/router";
import {PreviousRouteRecorder} from "../openaireLibrary/utils/piwik/previousRouteRecorder.guard";
import {BreadcrumbsModule} from "../openaireLibrary/utils/breadcrumbs/breadcrumbs.module";
import {RefineFieldResultsServiceModule} from "../openaireLibrary/services/refineFieldResultsService.module";
import {LoadingModule} from "../openaireLibrary/utils/loading/loading.module";
import {Schema2jsonldModule} from "../openaireLibrary/sharedComponents/schema2jsonld/schema2jsonld.module";
import {SEOServiceModule} from "../openaireLibrary/sharedComponents/SEO/SEOService.module";
import {PiwikService} from "../openaireLibrary/utils/piwik/piwik.service";
import {SdgRoutingModule} from './sdg-routing.module';
import {SdgComponent} from './sdg.component';
@NgModule({
imports: [
CommonModule, FormsModule, RouterModule,
SdgRoutingModule, BreadcrumbsModule, RefineFieldResultsServiceModule,
LoadingModule, Schema2jsonldModule, SEOServiceModule
],
declarations: [
SdgComponent
],
providers: [
PreviousRouteRecorder, PiwikService
],
exports: [
SdgComponent
]
})
export class SdgModule {
}

View File

@ -9,10 +9,9 @@ import {SearchOrganizationsModule} from "../../openaireLibrary/searchPages/searc
@NgModule({
imports: [
AdvancedSearchOrganizationsRoutingModule,
CommonModule, FormsModule,
SearchOrganizationsModule,
AdvancedSearchOrganizationsRoutingModule
SearchOrganizationsModule
],
declarations: [
OpenaireAdvancedSearchOrganizationsComponent

View File

@ -8,10 +8,9 @@ import {SearchProjectsModule} from "../../openaireLibrary/searchPages/searchProj
@NgModule({
imports: [
AdvancedSearchProjectsRoutingModule,
CommonModule, FormsModule,
SearchProjectsModule,
AdvancedSearchProjectsRoutingModule
SearchProjectsModule
],
declarations: [
OpenaireAdvancedSearchProjectsComponent

View File

@ -5,7 +5,6 @@ import { FormsModule } from '@angular/forms';
import{ SearchResearchResultsRoutingModule} from './searchResearchResults-routing.module';
import{OpenaireSearchResearchResultsComponent} from './searchResearchResults.component';
import {PreviousRouteRecorder} from '../../openaireLibrary/utils/piwik/previousRouteRecorder.guard';
import {SearchResearchResultsModule} from "../../openaireLibrary/searchPages/searchResearchResults.module";
@NgModule({
@ -17,7 +16,7 @@ import {SearchResearchResultsModule} from "../../openaireLibrary/searchPages/sea
declarations: [
OpenaireSearchResearchResultsComponent
],
providers:[PreviousRouteRecorder],
providers:[],
exports: [
OpenaireSearchResearchResultsComponent
]

View File

@ -5,8 +5,6 @@ import { FormsModule } from '@angular/forms';
import{ CompatibleDataProvidersRoutingModule} from './compatibleDataProviders-routing.module';
import{OpenaireSearchCompatibleDataprovidersComponent} from './compatibleDataProviders.component';
import {PreviousRouteRecorder} from '../../openaireLibrary/utils/piwik/previousRouteRecorder.guard';
import {SearchDataProvidersModule} from "../../openaireLibrary/searchPages/searchDataProviders.module";
@NgModule({
@ -18,7 +16,7 @@ import {SearchDataProvidersModule} from "../../openaireLibrary/searchPages/searc
declarations: [
OpenaireSearchCompatibleDataprovidersComponent
],
providers:[PreviousRouteRecorder],
providers:[],
exports: [
OpenaireSearchCompatibleDataprovidersComponent
]

View File

@ -4,7 +4,6 @@ import { FormsModule } from '@angular/forms';
import{ EntityRegistriesRoutingModule} from './entityRegistries-routing.module';
import{OpenaireSearchEntityRegistriesComponent} from './entityRegistries.component';
import {PreviousRouteRecorder} from '../../openaireLibrary/utils/piwik/previousRouteRecorder.guard';
import {SearchDataProvidersModule} from "../../openaireLibrary/searchPages/searchDataProviders.module";
@ -17,7 +16,7 @@ import {SearchDataProvidersModule} from "../../openaireLibrary/searchPages/searc
declarations: [
OpenaireSearchEntityRegistriesComponent
],
providers:[PreviousRouteRecorder],
providers:[],
exports: [
OpenaireSearchEntityRegistriesComponent
]

View File

@ -4,7 +4,6 @@ import { FormsModule } from '@angular/forms';
import{ JournalsRoutingModule} from './journals-routing.module';
import{OpenaireSearchJournalsComponent} from './journals.component';
import {PreviousRouteRecorder} from '../../openaireLibrary/utils/piwik/previousRouteRecorder.guard';
import {SearchDataProvidersModule} from "../../openaireLibrary/searchPages/searchDataProviders.module";
@NgModule({
imports: [
@ -14,7 +13,7 @@ import {SearchDataProvidersModule} from "../../openaireLibrary/searchPages/searc
declarations: [
OpenaireSearchJournalsComponent
],
providers:[PreviousRouteRecorder],
providers:[],
exports: [
OpenaireSearchJournalsComponent
]

View File

@ -3,7 +3,6 @@ import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import {OpenaireSearchDataprovidersComponent} from './searchDataproviders.component';
import{ SearchDataProvidersRoutingModule} from './searchDataProviders-routing.module';
import {PreviousRouteRecorder} from '../../openaireLibrary/utils/piwik/previousRouteRecorder.guard';
import {SearchDataProvidersModule} from '../../openaireLibrary/searchPages/searchDataProviders.module';
@NgModule({
imports: [
@ -14,7 +13,7 @@ SearchDataProvidersModule, SearchDataProvidersRoutingModule
declarations: [
OpenaireSearchDataprovidersComponent
],
providers:[PreviousRouteRecorder],
providers:[],
exports: [
OpenaireSearchDataprovidersComponent
]

View File

@ -5,7 +5,6 @@ import { FormsModule } from '@angular/forms';
import{ SearchOrganizationsRoutingModule} from './searchOrganizations-routing.module';
import{OpenaireSearchOrganizationsComponent} from './searchOrganizations.component';
import {PreviousRouteRecorder} from '../../openaireLibrary/utils/piwik/previousRouteRecorder.guard';
import {SearchOrganizationsModule} from "../../openaireLibrary/searchPages/searchOrganizations.module";
@ -18,7 +17,7 @@ import {SearchOrganizationsModule} from "../../openaireLibrary/searchPages/searc
declarations: [
OpenaireSearchOrganizationsComponent
],
providers:[PreviousRouteRecorder],
providers:[],
exports: [
OpenaireSearchOrganizationsComponent
]

View File

@ -5,7 +5,6 @@ import { FormsModule } from '@angular/forms';
import{ SearchProjectsRoutingModule} from './searchProjects-routing.module';
import{OpenaireSearchProjectsComponent} from './searchProjects.component';
import {PreviousRouteRecorder} from '../../openaireLibrary/utils/piwik/previousRouteRecorder.guard';
import { SearchProjectsModule} from '../../openaireLibrary/searchPages/searchProjects.module';
@NgModule({
imports: [
@ -15,7 +14,7 @@ import { SearchProjectsModule} from '../../openaireLibrary/searchPages/searchPro
declarations: [
OpenaireSearchProjectsComponent
],
providers:[PreviousRouteRecorder],
providers:[],
exports: [
OpenaireSearchProjectsComponent
]

View File

@ -5,7 +5,6 @@ import { FormsModule } from '@angular/forms';
import{ SearchResearchResultsRoutingModule} from './searchResearchResults-routing.module';
import{OpenaireSearchResearchResultsComponent} from './searchResearchResults.component';
import {PreviousRouteRecorder} from '../../openaireLibrary/utils/piwik/previousRouteRecorder.guard';
import {SearchResearchResultsModule} from "../../openaireLibrary/searchPages/searchResearchResults.module";
@NgModule({
@ -17,7 +16,7 @@ import {SearchResearchResultsModule} from "../../openaireLibrary/searchPages/sea
declarations: [
OpenaireSearchResearchResultsComponent
],
providers:[PreviousRouteRecorder],
providers:[],
exports: [
OpenaireSearchResearchResultsComponent
]

View File

@ -1,18 +0,0 @@
import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
import {OpenaireMailPrefsComponent } from './mailPrefs.component';
import {LoginGuard} from '../openaireLibrary/login/loginGuard.guard';
import {PreviousRouteRecorder} from '../openaireLibrary/utils/piwik/previousRouteRecorder.guard';
import {IsRouteEnabled} from '../openaireLibrary/error/isRouteEnabled.guard';
import {properties} from "../../environments/environment";
@NgModule({
imports: [
RouterModule.forChild([
{ path: '', component: OpenaireMailPrefsComponent, canActivate: [IsRouteEnabled, LoginGuard],
data: {redirect: properties.errorLink, community : 'openaire'}, canDeactivate: [PreviousRouteRecorder]}])
]
})
export class MailPrefsRoutingModule { }

View File

@ -1,25 +0,0 @@
import {Component} from '@angular/core';
@Component({
selector: 'openaire-mailPrefs',
template: `
<div id="tm-main" class=" uk-section uk-margin-small-top tm-middle">
<div uk-grid uk-grid>
<div class="tm-main uk-width-1-1@s uk-width-1-1@m uk-width-1-1@l uk-row-first">
<mailPrefs [showSaveResetButtons]="true"></mailPrefs>
</div>
</div>
</div>
`
})
export class OpenaireMailPrefsComponent {
constructor () {
}
ngOnInit() {
}
}

View File

@ -1,22 +0,0 @@
import { NgModule } from '@angular/core';
import { SharedModule } from '../openaireLibrary/shared/shared.module';
import { OpenaireMailPrefsComponent } from './mailPrefs.component';
import { MailPrefsRoutingModule } from './mailPrefs-routing.module';
import { MailPrefsModule } from '../openaireLibrary/connect/userEmailPreferences/mailsPrefs.module';
import { LoginGuard } from '../openaireLibrary/login/loginGuard.guard';
import { PreviousRouteRecorder } from '../openaireLibrary/utils/piwik/previousRouteRecorder.guard';
import { IsRouteEnabled } from '../openaireLibrary/error/isRouteEnabled.guard';
@NgModule({
imports: [
SharedModule,
MailPrefsRoutingModule,
MailPrefsModule
],
providers:[LoginGuard, PreviousRouteRecorder, IsRouteEnabled],
declarations: [
OpenaireMailPrefsComponent
]
})
export class LibMailPrefsModule { }

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Some files were not shown because too many files have changed in this diff Show More