From c6d700e3e684021a32347266dc410ed5fee97147 Mon Sep 17 00:00:00 2001 From: "argiro.kokogiannaki" Date: Fri, 27 Oct 2017 15:00:30 +0000 Subject: [PATCH] Adding a first draft for angular4-cli universal git-svn-id: https://svn.driver.research-infrastructures.eu/driver/dnet40/modules/uoa-services-portal/trunk@49720 d315682c-612b-4755-9ff5-7f18f6832af3 --- portal-4cli/.angular-cli.json | 106 + portal-4cli/README.md | 54 + portal-4cli/package.json | 57 + portal-4cli/prerender.ts | 45 + portal-4cli/server.ts | 58 + portal-4cli/src/angular2-meta.ts | 220 ++ portal-4cli/src/app/app.component.ts | 56 + portal-4cli/src/app/app.module.ts | 78 + portal-4cli/src/app/app.server.module.ts | 20 + .../src/app/claims/claim-utils/claim.ts | 15 + .../claimContextSearchForm.component.ts | 343 +++ .../claimContextSearchForm.module.ts | 20 + .../claims/claim-utils/claimEntities.class.ts | 100 + .../claimProjectSearchForm.component.ts | 194 ++ .../claimProjectSearchForm.module.ts | 27 + .../claimResultSearchForm.component.html | 188 ++ .../claimResultSearchForm.component.ts | 587 +++++ .../claimResultSearchForm.module.ts | 29 + .../displayClaims.component.html | 110 + .../displayClaims/displayClaims.component.ts | 486 ++++ .../displayClaims/displayClaims.module.ts | 26 + .../claimEntityFormatter.component.ts | 39 + .../claimEntityFormatter.module.ts | 24 + .../projectTitleFormatter.component.ts | 25 + .../publicationTitleFormatter.component.ts | 26 + .../claim-utils/service/claims.service.ts | 148 ++ .../service/claimsService.module.ts | 23 + .../claim-utils/service/contexts.service.ts | 85 + .../service/contextsService.module.ts | 20 + .../service/customOptions.class.ts | 19 + .../service/searchCrossref.service.ts | 67 + .../service/searchCrossrefService.module.ts | 20 + .../service/searchDatacite.service.ts | 50 + .../service/searchDataciteService.module.ts | 20 + .../service/searchOrcid.service.ts | 126 + .../claims/claim-utils/startOver.component.ts | 65 + .../claims/claim-utils/startOver.module.ts | 16 + portal-4cli/src/app/claims/claim.module.ts | 68 + .../src/app/claims/claim/claim.component.html | 10 + .../claimsAdmin/claimsAdmin-routing.module.ts | 16 + .../claimsAdmin/claimsAdmin.component.ts | 38 + .../claims/claimsAdmin/claimsAdmin.module.ts | 25 + .../claimsByToken-routing.module.ts | 15 + .../claimsByToken/claimsByToken.component.ts | 433 ++++ .../claimsByToken/claimsByToken.module.ts | 49 + .../claimsByToken/claimsByToken.service.ts | 77 + .../directLinking-routing.module.ts | 19 + .../directLinking.component.html | 118 + .../directLinking/directLinking.component.ts | 188 ++ .../directLinking/directLinking.module.ts | 39 + .../linking/bulkClaim/bulkClaim.component.ts | 256 ++ .../linking/bulkClaim/bulkClaim.module.ts | 17 + .../claims/linking/bulkLinking.component.ts | 16 + .../app/claims/linking/bulkLinking.module.ts | 20 + .../insertClaim/insertClaim.component.ts | 369 +++ .../linking/insertClaim/insertClaim.module.ts | 16 + .../claims/linking/linking-routing.module.ts | 19 + .../app/claims/linking/linking.component.ts | 16 + .../linking/linkingGeneric.component.html | 144 ++ .../linking/linkingGeneric.component.ts | 117 + .../claims/linking/linkingGeneric.module.ts | 37 + .../selected/selectedContexts.component.ts | 90 + .../selected/selectedContexts.module.ts | 16 + .../selected/selectedProjects.component.ts | 88 + .../selected/selectedProjects.module.ts | 18 + .../selected/selectedResults.component.ts | 224 ++ .../selected/selectedResults.module.ts | 21 + .../myClaims/myClaims-routing.module.ts | 16 + .../app/claims/myClaims/myClaims.component.ts | 36 + .../app/claims/myClaims/myClaims.module.ts | 25 + .../src/app/claims/myClaimsDemo.component.ts | 51 + .../datasets/depositBySubject.component.ts | 34 + .../depositBySubjectResult-routing.module.ts | 19 + .../depositBySubjectResult.component.html | 79 + .../depositBySubjectResult.component.ts | 127 + .../depositBySubjectResults.module.ts | 34 + .../depositDatasets-routing.module.ts | 20 + .../datasets/depositDatasets.component.ts | 21 + .../datasets/depositDatasets.module.ts | 29 + .../depositDatasetsResult.component.ts | 14 + .../depositDatasetsResults-routing.module.ts | 18 + .../datasets/depositDatasetsResults.module.ts | 29 + .../src/app/deposit/deposit.component.html | 56 + .../src/app/deposit/deposit.component.ts | 91 + portal-4cli/src/app/deposit/deposit.module.ts | 45 + .../app/deposit/depositResult.component.ts | 284 +++ .../depositPublications-routing.module.ts | 18 + .../depositPublications.component.ts | 21 + .../depositPublications.module.ts | 27 + ...epositPublicationsResult-routing.module.ts | 18 + .../depositPublicationsResult.component.ts | 12 + .../depositPublicationsResults.module.ts | 27 + .../src/app/error/error-routing.module.ts | 16 + portal-4cli/src/app/error/error.module.ts | 14 + .../src/app/error/errorPage.component.ts | 55 + .../src/app/error/isRouteEnabled.guard.ts | 23 + .../src/app/home/home-routing.module.ts | 16 + portal-4cli/src/app/home/home.component.html | 65 + portal-4cli/src/app/home/home.component.ts | 182 ++ portal-4cli/src/app/home/home.module.ts | 45 + .../dataProvider-routing.module.ts | 18 + .../dataProvider/dataProvider.component.html | 232 ++ .../dataProvider/dataProvider.component.ts | 385 +++ .../dataProvider/dataProvider.module.ts | 51 + .../dataProvider/dataProvider.service.ts | 162 ++ .../dataProvider/datasetsTab.component.ts | 48 + .../dataProvider/datasourcesTab.component.ts | 50 + .../organizationsTab.component.ts | 54 + .../dataProvider/projectsTab.component.ts | 49 + .../dataProvider/publicationsTab.component.ts | 50 + .../relatedDatasourcesTab.component.ts | 122 + .../dataProvider/statisticsTab.component.ts | 78 + .../dataset/dataset-routing.module.ts | 18 + .../dataset/dataset.component.html | 328 +++ .../landingPages/dataset/dataset.component.ts | 172 ++ .../landingPages/dataset/dataset.module.ts | 37 + .../landingPages/dataset/dataset.service.ts | 220 ++ .../htmlProjectReport-routing.module.ts | 15 + .../htmlProjectReport.component.ts | 222 ++ .../htmlProjectReport.module.ts | 28 + .../htmlProjectReport.service.ts | 25 + .../landing-utils/addThis.component.ts | 40 + .../landing-utils/citeThis/citation.class.ts | 110 + .../citeThis/citeThis.component.ts | 102 + .../landing-utils/citeThis/citeThis.module.ts | 23 + .../landing-utils/fundedBy.component.ts | 131 + .../landing-utils/landing.module.ts | 28 + .../landing-utils/metrics.component.ts | 224 ++ .../landing-utils/metrics.module.ts | 26 + .../landing-utils/parsingFunctions.class.ts | 455 ++++ .../landing-utils/publishedIn.component.ts | 71 + .../landing-utils/resultLanding.module.ts | 27 + .../searchingProjectsInTab.component.ts | 122 + .../searchingProjectsInTab.module.ts | 31 + .../landing-utils/showAuthors.component.ts | 65 + .../showIdentifiers.component.ts | 94 + .../landing-utils/showSubjects.component.ts | 57 + .../landing-utils/showTitle.component.ts | 66 + .../landing-utils/tabPaging.component.ts | 24 + .../landing-utils/tabTable.component.ts | 99 + .../organization-routing.module.ts | 18 + .../organization/organization.component.html | 195 ++ .../organization/organization.component.ts | 489 ++++ .../organization/organization.module.ts | 52 + .../project/project-routing.module.ts | 18 + .../project/project.component.html | 382 +++ .../landingPages/project/project.component.ts | 360 +++ .../landingPages/project/project.module.ts | 45 + .../landingPages/project/project.service.ts | 207 ++ .../project/projectService.module.ts | 20 + .../publication/publication-routing.module.ts | 18 + .../publication/publication.component.html | 547 ++++ .../publication/publication.component.ts | 312 +++ .../publication/publication.module.ts | 30 + .../publication/publication.service.ts | 357 +++ .../software/software-routing.module.ts | 15 + .../software/software.component.html | 305 +++ .../software/software.component.ts | 172 ++ .../landingPages/software/software.module.ts | 36 + .../landingPages/software/software.service.ts | 220 ++ .../src/app/login/adminLoginGuard.guard.ts | 45 + portal-4cli/src/app/login/freeGuard.guard.ts | 36 + portal-4cli/src/app/login/loginGuard.guard.ts | 33 + .../src/app/login/user-routing.module.ts | 15 + portal-4cli/src/app/login/user.component.html | 54 + portal-4cli/src/app/login/user.component.ts | 119 + portal-4cli/src/app/login/user.module.ts | 22 + .../src/app/login/userMini.component.ts | 140 ++ .../src/app/login/utils/guardHelper.class.ts | 19 + .../src/app/login/utils/helper.class.ts | 253 ++ .../src/app/reload/reload-routing.module.ts | 16 + .../src/app/reload/reload.component.ts | 53 + portal-4cli/src/app/reload/reload.module.ts | 29 + ...ancedSearchDataProviders-routing.module.ts | 18 + .../advancedSearchDataProviders.component.ts | 153 ++ .../advancedSearchDataProviders.module.ts | 29 + .../advancedSearchDatasets-routing.module.ts | 19 + .../advancedSearchDatasets.component.ts | 161 ++ .../advanced/advancedSearchDatasets.module.ts | 29 + ...ancedSearchOrganizations-routing.module.ts | 19 + .../advancedSearchOrganizations.component.ts | 161 ++ .../advancedSearchOrganizations.module.ts | 29 + .../advancedSearchProjects-routing.module.ts | 19 + .../advancedSearchProjects.component.ts | 162 ++ .../advanced/advancedSearchProjects.module.ts | 29 + ...vancedSearchPublications-routing.module.ts | 19 + .../advancedSearchPublications.component.ts | 160 ++ .../advancedSearchPublications.module.ts | 29 + .../advancedSearchSoftware-routing.module.ts | 16 + .../advancedSearchSoftware.component.ts | 161 ++ .../advanced/advancedSearchSoftware.module.ts | 29 + .../compatibleDataProviders-routing.module.ts | 19 + .../compatibleDataProviders.component.ts | 186 ++ .../compatibleDataProviders.module.ts | 32 + ...atibleDataProvidersTable-routing.module.ts | 19 + .../compatibleDataProvidersTable.component.ts | 196 ++ .../compatibleDataProvidersTable.module.ts | 32 + .../entityRegistries-routing.module.ts | 19 + .../entityRegistries.component.ts | 178 ++ .../dataProviders/entityRegistries.module.ts | 32 + .../entityRegistriesTable-routing.module.ts | 19 + .../entityRegistriesTable.component.ts | 206 ++ .../entityRegistriesTable.module.ts | 32 + .../dataProviders/journals-routing.module.ts | 19 + .../dataProviders/journals.component.ts | 181 ++ .../dataProviders/journals.module.ts | 32 + .../journalsTable-routing.module.ts | 19 + .../dataProviders/journalsTable.component.ts | 191 ++ .../dataProviders/journalsTable.module.ts | 32 + .../find/mainSearch-routing.module.ts | 16 + .../app/searchPages/find/mainSearch.module.ts | 41 + .../searchPages/find/search.component.html | 241 ++ .../app/searchPages/find/search.component.ts | 400 +++ .../advancedSearchForm.component.html | 56 + .../advancedSearchForm.component.ts | 95 + .../searchUtils/advancedSearchForm.module.ts | 26 + .../advancedSearchPage.component.html | 61 + .../advancedSearchPage.component.ts | 254 ++ .../searchUtils/advancedSearchPage.module.ts | 33 + .../searchUtils/browseEntities.component.ts | 96 + .../searchUtils/browseEntities.module.ts | 31 + .../browseStatistic.component.html | 50 + .../searchUtils/browseStatistic.component.ts | 42 + .../searchUtils/dateFilter.component.ts | 73 + .../searchUtils/dateFilter.module.ts | 20 + .../searchUtils/searchDownload.component.ts | 112 + .../searchUtils/searchDownload.module.ts | 24 + .../searchUtils/searchFilter.component.html | 67 + .../searchUtils/searchFilter.component.ts | 144 ++ .../searchUtils/searchFilter.module.ts | 24 + .../searchFilterModal.component.ts | 104 + .../searchUtils/searchForm.component.ts | 52 + .../searchUtils/searchForm.module.ts | 23 + .../searchUtils/searchHelperClasses.class.ts | 89 + .../searchUtils/searchPage.component.html | 126 + .../searchUtils/searchPage.component.ts | 515 ++++ .../searchUtils/searchPage.module.ts | 40 + .../searchPageTableView.component.html | 196 ++ .../searchPageTableView.component.ts | 274 ++ .../searchUtils/searchPageTableView.module.ts | 53 + .../searchUtils/searchPaging.component.ts | 58 + .../searchUtils/searchPaging.module.ts | 23 + .../searchUtils/searchResult.component.html | 124 + .../searchUtils/searchResult.component.ts | 52 + .../searchUtils/searchResults.module.ts | 29 + .../searchUtils/searchUtils.class.ts | 10 + .../searchUtils/tabResult.component.html | 122 + .../searchUtils/tabResult.component.ts | 31 + .../searchUtils/tabResult.module.ts | 23 + .../searchDataProviders-routing.module.ts | 19 + .../simple/searchDataProviders.module.ts | 33 + .../simple/searchDataproviders.component.ts | 360 +++ .../simple/searchDatasets-routing.module.ts | 19 + .../simple/searchDatasets.component.ts | 275 ++ .../simple/searchDatasets.module.ts | 33 + .../searchOrganizations-routing.module.ts | 19 + .../simple/searchOrganizations.component.ts | 175 ++ .../simple/searchOrganizations.module.ts | 32 + .../simple/searchProjects-routing.module.ts | 19 + .../simple/searchProjects.component.ts | 213 ++ .../simple/searchProjects.module.ts | 33 + .../searchPublications-routing.module.ts | 19 + .../simple/searchPublications.component.ts | 308 +++ .../simple/searchPublications.module.ts | 33 + .../simple/searchSoftware-routing.module.ts | 15 + .../simple/searchSoftware.component.ts | 275 ++ .../simple/searchSoftware.module.ts | 33 + .../services/dataProvidersService.module.ts | 20 + .../app/services/datasetsService.module.ts | 20 + .../src/app/services/metrics.service.ts | 82 + .../src/app/services/organization.service.ts | 180 ++ .../services/organizationService.module.ts | 20 + .../services/organizationsService.module.ts | 20 + .../app/services/projectsService.module.ts | 20 + .../services/publicationsService.module.ts | 20 + .../services/refineFieldResults.service.ts | 66 + .../refineFieldResultsService.module.ts | 20 + .../src/app/services/reports.service.ts | 56 + .../src/app/services/reportsService.module.ts | 20 + .../services/searchDataproviders.service.ts | 433 ++++ .../app/services/searchDatasets.service.ts | 314 +++ .../services/searchOrganizations.service.ts | 191 ++ .../app/services/searchProjects.service.ts | 242 ++ .../services/searchPublications.service.ts | 431 ++++ .../app/services/searchSoftware.service.ts | 315 +++ .../servicesUtils/refineResults.class.ts | 62 + .../app/services/softwareService.module.ts | 20 + portal-4cli/src/app/shared/shared.module.ts | 45 + .../sharedComponents/bottom.component.html | 79 + .../app/sharedComponents/bottom.component.ts | 10 + .../cookie-law/cookie-law.component.ts | 148 ++ .../cookie-law/cookie-law.css | 77 + .../cookie-law/cookie-law.html | 23 + .../cookie-law/cookie-law.module.ts | 25 + .../cookie-law/cookie-law.service.ts | 57 + .../app/sharedComponents/cookie-law/icons.ts | 13 + .../feedback/feedback.component.ts | 51 + .../navigationBar.component.html | 202 ++ .../navigationBar.component.ts | 70 + .../sharedComponents.module.ts | 29 + .../src/app/test/test-routing.module.ts | 14 + portal-4cli/src/app/test/test.component.ts | 61 + portal-4cli/src/app/test/test.module.ts | 19 + .../src/app/utils/altmetrics.component.ts | 43 + portal-4cli/src/app/utils/altmetrics.js | 8 + .../src/app/utils/altmetrics.module.ts | 20 + .../src/app/utils/autoComplete.component.css | 35 + .../configuration/configuration.service.ts | 50 + .../app/utils/entities/dataProviderInfo.ts | 124 + .../src/app/utils/entities/datasetInfo.ts | 44 + .../src/app/utils/entities/entities.module.ts | 24 + portal-4cli/src/app/utils/entities/metrics.ts | 8 + .../app/utils/entities/organizationInfo.ts | 12 + .../src/app/utils/entities/projectInfo.ts | 23 + .../src/app/utils/entities/publication.ts | 7 + .../src/app/utils/entities/publicationInfo.ts | 55 + .../src/app/utils/entities/searchResult.ts | 30 + .../src/app/utils/entities/softwareInfo.ts | 44 + .../entitiesAutoComplete.component.ts | 280 +++ .../entitiesAutoComplete.module.ts | 21 + .../entitySearch.service.ts | 238 ++ .../entitySearchService.module.ts | 18 + .../src/app/utils/errorMessages.component.ts | 51 + .../src/app/utils/errorMessages.module.ts | 19 + portal-4cli/src/app/utils/exportCSV.class.ts | 131 + .../fetchDataproviders.class.ts | 291 +++ .../fetchDatasets.class.ts | 253 ++ .../fetchOrganizations.class.ts | 76 + .../fetchProjects.class.ts | 209 ++ .../fetchPublications.class.ts | 233 ++ .../fetchSoftware.class.ts | 253 ++ .../src/app/utils/helper/helper.component.ts | 47 + .../src/app/utils/helper/helper.module.ts | 25 + .../src/app/utils/helper/helper.service.ts | 26 + .../app/utils/helper/helperService.module.ts | 20 + portal-4cli/src/app/utils/iframe.component.ts | 21 + portal-4cli/src/app/utils/iframe.module.ts | 19 + .../utils/metaTags/openaireMetaTags.class.ts | 21 + portal-4cli/src/app/utils/modal/alert.ts | 111 + .../src/app/utils/modal/alertModal.module.ts | 17 + .../src/app/utils/modal/loading.component.ts | 56 + .../app/utils/modal/loadingModal.module.ts | 19 + .../src/app/utils/modal/modal.module.ts | 13 + .../src/app/utils/modal/open.component.ts | 57 + .../app/utils/modal/selectModal.component.ts | 79 + .../src/app/utils/modal/selectModal.module.ts | 19 + .../my-date-picker.focus.directive.ts | 26 + ...y-date-picker.input.auto.fill.directive.ts | 69 + .../src/app/utils/my-date-picker/index.ts | 7 + .../utils/my-date-picker/interfaces/index.ts | 15 + .../interfaces/my-calendar-day.interface.ts | 9 + .../my-calendar-view-changed.interface.ts | 8 + .../interfaces/my-date-model.interface.ts | 8 + .../interfaces/my-date-range.interface.ts | 6 + .../interfaces/my-date.interface.ts | 5 + .../interfaces/my-day-labels.interface.ts | 3 + .../my-input-auto-fill.interface.ts | 5 + .../my-input-field-changed.interface.ts | 5 + .../my-input-focus-blur.interface.ts | 4 + .../interfaces/my-locale.interface.ts | 5 + .../interfaces/my-month-labels.interface.ts | 3 + .../interfaces/my-month.interface.ts | 5 + .../interfaces/my-options.interface.ts | 48 + .../interfaces/my-week.interface.ts | 6 + .../interfaces/my-weekday.interface.ts | 4 + .../my-date-picker.component.css | 461 ++++ .../my-date-picker.component.html | 61 + .../my-date-picker.component.spec.ts | 2209 +++++++++++++++++ .../my-date-picker.component.ts | 677 +++++ .../my-date-picker/my-date-picker.module.ts | 14 + .../services/my-date-picker.locale.service.ts | 232 ++ .../services/my-date-picker.util.service.ts | 169 ++ .../src/app/utils/number-utils.class.ts | 31 + portal-4cli/src/app/utils/paging.module.ts | 28 + .../app/utils/pagingFormatter.component.ts | 64 + .../utils/pagingFormatterNoLoad.component.ts | 76 + .../app/utils/pipes/claimsDatatable.pipe.ts | 48 + .../pipes/contentProvidersDatatable.pipe.ts | 107 + .../src/app/utils/pipes/safeHTML.pipe.ts | 13 + .../src/app/utils/piwik/piwik.service.ts | 70 + .../app/utils/piwik/piwikService.module.ts | 21 + .../piwik/previousRouteRecorder.guard.ts | 17 + .../utils/properties/openaireProperties.ts | 397 +++ .../src/app/utils/properties/searchFields.ts | 159 ++ .../app/utils/properties/searchFields_new.ts | 164 ++ .../app/utils/properties/searchFields_old.ts | 164 ++ .../src/app/utils/routerHelper.class.ts | 34 + .../app/utils/showDataProviders.component.ts | 61 + .../ISVocabularies.service.ts | 110 + .../staticAutoComplete.component.ts | 300 +++ .../staticAutoComplete.module.ts | 22 + .../src/app/utils/string-utils.class.ts | 129 + portal-4cli/src/assets/Home_24white.svg | 1 + portal-4cli/src/assets/OA DISCOVER_A.png | Bin 0 -> 24028 bytes portal-4cli/src/assets/OA DISCOVER_B.png | Bin 0 -> 39239 bytes portal-4cli/src/assets/closedAccess.png | Bin 0 -> 3607 bytes portal-4cli/src/assets/common/80x15.png | Bin 0 -> 410 bytes portal-4cli/src/assets/common/Home-icon.png | Bin 0 -> 3119 bytes .../src/assets/common/Logo_Horizontal.png | Bin 0 -> 12549 bytes .../common/Logo_Horizontal_white_small.png | Bin 0 -> 4630 bytes portal-4cli/src/assets/common/Symbol.png | Bin 0 -> 8018 bytes portal-4cli/src/assets/common/custom.css | 1111 +++++++++ .../src/assets/common/ec_logo_inv_small.png | Bin 0 -> 4060 bytes portal-4cli/src/assets/common/jquery.js | 5 + portal-4cli/src/assets/common/theme.css | 9 + .../src/assets/common/uikit-icons-max.js | 4 + portal-4cli/src/assets/common/uikit.js | 5 + portal-4cli/src/assets/dataset.png | Bin 0 -> 4229 bytes portal-4cli/src/assets/datasource.png | Bin 0 -> 4186 bytes portal-4cli/src/assets/discover-custom.css | 511 ++++ portal-4cli/src/assets/external-link.svg | 1 + portal-4cli/src/assets/favicon.ico | Bin 0 -> 32988 bytes portal-4cli/src/assets/formImage.jpg | Bin 0 -> 112058 bytes portal-4cli/src/assets/globe_tech.jpg | Bin 0 -> 270491 bytes portal-4cli/src/assets/home.jpeg | Bin 0 -> 373503 bytes portal-4cli/src/assets/home2.jpeg | Bin 0 -> 267070 bytes portal-4cli/src/assets/icon_external.png | Bin 0 -> 193 bytes portal-4cli/src/assets/jquery/jquery.min.js | 5 + portal-4cli/src/assets/loading.gif | Bin 0 -> 18691 bytes portal-4cli/src/assets/lock.svg | 1 + .../src/assets/logo/android-icon-144x144.png | Bin 0 -> 9912 bytes .../src/assets/logo/android-icon-192x192.png | Bin 0 -> 13470 bytes .../src/assets/logo/android-icon-36x36.png | Bin 0 -> 2597 bytes .../src/assets/logo/android-icon-48x48.png | Bin 0 -> 3202 bytes .../src/assets/logo/android-icon-72x72.png | Bin 0 -> 4587 bytes .../src/assets/logo/android-icon-96x96.png | Bin 0 -> 6040 bytes .../src/assets/logo/apple-icon-114x114.png | Bin 0 -> 7100 bytes .../src/assets/logo/apple-icon-120x120.png | Bin 0 -> 7612 bytes .../src/assets/logo/apple-icon-144x144.png | Bin 0 -> 9912 bytes .../src/assets/logo/apple-icon-152x152.png | Bin 0 -> 10778 bytes .../src/assets/logo/apple-icon-180x180.png | Bin 0 -> 13742 bytes .../src/assets/logo/apple-icon-57x57.png | Bin 0 -> 3762 bytes .../src/assets/logo/apple-icon-60x60.png | Bin 0 -> 3955 bytes .../src/assets/logo/apple-icon-72x72.png | Bin 0 -> 4587 bytes .../src/assets/logo/apple-icon-76x76.png | Bin 0 -> 4817 bytes .../assets/logo/apple-icon-precomposed.png | Bin 0 -> 13959 bytes portal-4cli/src/assets/logo/apple-icon.png | Bin 0 -> 13959 bytes portal-4cli/src/assets/logo/browserconfig.xml | 2 + portal-4cli/src/assets/logo/favicon-16x16.png | Bin 0 -> 1276 bytes portal-4cli/src/assets/logo/favicon-32x32.png | Bin 0 -> 1952 bytes portal-4cli/src/assets/logo/favicon-96x96.png | Bin 0 -> 6040 bytes portal-4cli/src/assets/logo/favicon.ico | Bin 0 -> 1150 bytes portal-4cli/src/assets/logo/manifest.json | 41 + .../src/assets/logo/ms-icon-144x144.png | Bin 0 -> 9912 bytes .../src/assets/logo/ms-icon-150x150.png | Bin 0 -> 10516 bytes .../src/assets/logo/ms-icon-310x310.png | Bin 0 -> 31751 bytes portal-4cli/src/assets/logo/ms-icon-70x70.png | Bin 0 -> 4461 bytes portal-4cli/src/assets/newlogo.png | Bin 0 -> 18584 bytes portal-4cli/src/assets/openAccess.png | Bin 0 -> 3638 bytes portal-4cli/src/assets/organization.png | Bin 0 -> 4613 bytes portal-4cli/src/assets/project.png | Bin 0 -> 3963 bytes portal-4cli/src/assets/projects_search.jpg | Bin 0 -> 577088 bytes portal-4cli/src/assets/providers_search.jpg | Bin 0 -> 352337 bytes portal-4cli/src/assets/publication.png | Bin 0 -> 5412 bytes portal-4cli/src/assets/sc39.png | Bin 0 -> 3076 bytes portal-4cli/src/assets/search_data.jpg | Bin 0 -> 365638 bytes portal-4cli/src/assets/search_general.jpg | Bin 0 -> 494855 bytes portal-4cli/src/assets/search_general_2.jpg | Bin 0 -> 2430434 bytes portal-4cli/src/assets/search_general_3.jpg | Bin 0 -> 314407 bytes portal-4cli/src/assets/search_journals.jpg | Bin 0 -> 405553 bytes .../src/assets/search_organizations.jpg | Bin 0 -> 456265 bytes portal-4cli/src/assets/search_pubs_1.jpg | Bin 0 -> 514279 bytes portal-4cli/src/assets/search_registries.jpg | Bin 0 -> 629939 bytes portal-4cli/src/assets/sitemap.xml | 103 + portal-4cli/src/assets/unlock.svg | 1 + .../src/environments/environment.prod.ts | 3 + portal-4cli/src/environments/environment.ts | 8 + portal-4cli/src/index.html | 129 + portal-4cli/src/main.server.ts | 1 + portal-4cli/src/main.ts | 13 + portal-4cli/src/polyfills.ts | 72 + portal-4cli/src/styles.css | 1 + portal-4cli/src/tsconfig.app.json | 15 + portal-4cli/src/tsconfig.server.json | 21 + portal-4cli/static.paths.ts | 15 + portal-4cli/tsconfig.json | 19 + portal-4cli/webpack.server.config.js | 42 + 477 files changed, 39821 insertions(+) create mode 100644 portal-4cli/.angular-cli.json create mode 100644 portal-4cli/README.md create mode 100644 portal-4cli/package.json create mode 100644 portal-4cli/prerender.ts create mode 100644 portal-4cli/server.ts create mode 100644 portal-4cli/src/angular2-meta.ts create mode 100644 portal-4cli/src/app/app.component.ts create mode 100755 portal-4cli/src/app/app.module.ts create mode 100644 portal-4cli/src/app/app.server.module.ts create mode 100644 portal-4cli/src/app/claims/claim-utils/claim.ts create mode 100644 portal-4cli/src/app/claims/claim-utils/claimContextSearchForm.component.ts create mode 100644 portal-4cli/src/app/claims/claim-utils/claimContextSearchForm.module.ts create mode 100644 portal-4cli/src/app/claims/claim-utils/claimEntities.class.ts create mode 100644 portal-4cli/src/app/claims/claim-utils/claimProjectSearchForm.component.ts create mode 100644 portal-4cli/src/app/claims/claim-utils/claimProjectSearchForm.module.ts create mode 100644 portal-4cli/src/app/claims/claim-utils/claimResultSearchForm.component.html create mode 100644 portal-4cli/src/app/claims/claim-utils/claimResultSearchForm.component.ts create mode 100644 portal-4cli/src/app/claims/claim-utils/claimResultSearchForm.module.ts create mode 100644 portal-4cli/src/app/claims/claim-utils/displayClaims/displayClaims.component.html create mode 100644 portal-4cli/src/app/claims/claim-utils/displayClaims/displayClaims.component.ts create mode 100644 portal-4cli/src/app/claims/claim-utils/displayClaims/displayClaims.module.ts create mode 100644 portal-4cli/src/app/claims/claim-utils/entityFormatter/claimEntityFormatter.component.ts create mode 100644 portal-4cli/src/app/claims/claim-utils/entityFormatter/claimEntityFormatter.module.ts create mode 100644 portal-4cli/src/app/claims/claim-utils/entityFormatter/projectTitleFormatter.component.ts create mode 100644 portal-4cli/src/app/claims/claim-utils/entityFormatter/publicationTitleFormatter.component.ts create mode 100644 portal-4cli/src/app/claims/claim-utils/service/claims.service.ts create mode 100644 portal-4cli/src/app/claims/claim-utils/service/claimsService.module.ts create mode 100644 portal-4cli/src/app/claims/claim-utils/service/contexts.service.ts create mode 100644 portal-4cli/src/app/claims/claim-utils/service/contextsService.module.ts create mode 100644 portal-4cli/src/app/claims/claim-utils/service/customOptions.class.ts create mode 100644 portal-4cli/src/app/claims/claim-utils/service/searchCrossref.service.ts create mode 100644 portal-4cli/src/app/claims/claim-utils/service/searchCrossrefService.module.ts create mode 100644 portal-4cli/src/app/claims/claim-utils/service/searchDatacite.service.ts create mode 100644 portal-4cli/src/app/claims/claim-utils/service/searchDataciteService.module.ts create mode 100644 portal-4cli/src/app/claims/claim-utils/service/searchOrcid.service.ts create mode 100644 portal-4cli/src/app/claims/claim-utils/startOver.component.ts create mode 100644 portal-4cli/src/app/claims/claim-utils/startOver.module.ts create mode 100644 portal-4cli/src/app/claims/claim.module.ts create mode 100644 portal-4cli/src/app/claims/claim/claim.component.html create mode 100644 portal-4cli/src/app/claims/claimsAdmin/claimsAdmin-routing.module.ts create mode 100644 portal-4cli/src/app/claims/claimsAdmin/claimsAdmin.component.ts create mode 100644 portal-4cli/src/app/claims/claimsAdmin/claimsAdmin.module.ts create mode 100644 portal-4cli/src/app/claims/claimsByToken/claimsByToken-routing.module.ts create mode 100644 portal-4cli/src/app/claims/claimsByToken/claimsByToken.component.ts create mode 100644 portal-4cli/src/app/claims/claimsByToken/claimsByToken.module.ts create mode 100644 portal-4cli/src/app/claims/claimsByToken/claimsByToken.service.ts create mode 100644 portal-4cli/src/app/claims/directLinking/directLinking-routing.module.ts create mode 100644 portal-4cli/src/app/claims/directLinking/directLinking.component.html create mode 100644 portal-4cli/src/app/claims/directLinking/directLinking.component.ts create mode 100644 portal-4cli/src/app/claims/directLinking/directLinking.module.ts create mode 100644 portal-4cli/src/app/claims/linking/bulkClaim/bulkClaim.component.ts create mode 100644 portal-4cli/src/app/claims/linking/bulkClaim/bulkClaim.module.ts create mode 100644 portal-4cli/src/app/claims/linking/bulkLinking.component.ts create mode 100644 portal-4cli/src/app/claims/linking/bulkLinking.module.ts create mode 100644 portal-4cli/src/app/claims/linking/insertClaim/insertClaim.component.ts create mode 100644 portal-4cli/src/app/claims/linking/insertClaim/insertClaim.module.ts create mode 100644 portal-4cli/src/app/claims/linking/linking-routing.module.ts create mode 100644 portal-4cli/src/app/claims/linking/linking.component.ts create mode 100644 portal-4cli/src/app/claims/linking/linkingGeneric.component.html create mode 100644 portal-4cli/src/app/claims/linking/linkingGeneric.component.ts create mode 100644 portal-4cli/src/app/claims/linking/linkingGeneric.module.ts create mode 100644 portal-4cli/src/app/claims/linking/selected/selectedContexts.component.ts create mode 100644 portal-4cli/src/app/claims/linking/selected/selectedContexts.module.ts create mode 100644 portal-4cli/src/app/claims/linking/selected/selectedProjects.component.ts create mode 100644 portal-4cli/src/app/claims/linking/selected/selectedProjects.module.ts create mode 100644 portal-4cli/src/app/claims/linking/selected/selectedResults.component.ts create mode 100644 portal-4cli/src/app/claims/linking/selected/selectedResults.module.ts create mode 100644 portal-4cli/src/app/claims/myClaims/myClaims-routing.module.ts create mode 100644 portal-4cli/src/app/claims/myClaims/myClaims.component.ts create mode 100644 portal-4cli/src/app/claims/myClaims/myClaims.module.ts create mode 100644 portal-4cli/src/app/claims/myClaimsDemo.component.ts create mode 100644 portal-4cli/src/app/deposit/datasets/depositBySubject.component.ts create mode 100644 portal-4cli/src/app/deposit/datasets/depositBySubjectResult-routing.module.ts create mode 100644 portal-4cli/src/app/deposit/datasets/depositBySubjectResult.component.html create mode 100644 portal-4cli/src/app/deposit/datasets/depositBySubjectResult.component.ts create mode 100644 portal-4cli/src/app/deposit/datasets/depositBySubjectResults.module.ts create mode 100644 portal-4cli/src/app/deposit/datasets/depositDatasets-routing.module.ts create mode 100644 portal-4cli/src/app/deposit/datasets/depositDatasets.component.ts create mode 100644 portal-4cli/src/app/deposit/datasets/depositDatasets.module.ts create mode 100644 portal-4cli/src/app/deposit/datasets/depositDatasetsResult.component.ts create mode 100644 portal-4cli/src/app/deposit/datasets/depositDatasetsResults-routing.module.ts create mode 100644 portal-4cli/src/app/deposit/datasets/depositDatasetsResults.module.ts create mode 100644 portal-4cli/src/app/deposit/deposit.component.html create mode 100644 portal-4cli/src/app/deposit/deposit.component.ts create mode 100644 portal-4cli/src/app/deposit/deposit.module.ts create mode 100644 portal-4cli/src/app/deposit/depositResult.component.ts create mode 100644 portal-4cli/src/app/deposit/publications/depositPublications-routing.module.ts create mode 100644 portal-4cli/src/app/deposit/publications/depositPublications.component.ts create mode 100644 portal-4cli/src/app/deposit/publications/depositPublications.module.ts create mode 100644 portal-4cli/src/app/deposit/publications/depositPublicationsResult-routing.module.ts create mode 100644 portal-4cli/src/app/deposit/publications/depositPublicationsResult.component.ts create mode 100644 portal-4cli/src/app/deposit/publications/depositPublicationsResults.module.ts create mode 100644 portal-4cli/src/app/error/error-routing.module.ts create mode 100644 portal-4cli/src/app/error/error.module.ts create mode 100644 portal-4cli/src/app/error/errorPage.component.ts create mode 100644 portal-4cli/src/app/error/isRouteEnabled.guard.ts create mode 100644 portal-4cli/src/app/home/home-routing.module.ts create mode 100644 portal-4cli/src/app/home/home.component.html create mode 100644 portal-4cli/src/app/home/home.component.ts create mode 100644 portal-4cli/src/app/home/home.module.ts create mode 100644 portal-4cli/src/app/landingPages/dataProvider/dataProvider-routing.module.ts create mode 100644 portal-4cli/src/app/landingPages/dataProvider/dataProvider.component.html create mode 100644 portal-4cli/src/app/landingPages/dataProvider/dataProvider.component.ts create mode 100644 portal-4cli/src/app/landingPages/dataProvider/dataProvider.module.ts create mode 100644 portal-4cli/src/app/landingPages/dataProvider/dataProvider.service.ts create mode 100644 portal-4cli/src/app/landingPages/dataProvider/datasetsTab.component.ts create mode 100644 portal-4cli/src/app/landingPages/dataProvider/datasourcesTab.component.ts create mode 100644 portal-4cli/src/app/landingPages/dataProvider/organizationsTab.component.ts create mode 100644 portal-4cli/src/app/landingPages/dataProvider/projectsTab.component.ts create mode 100644 portal-4cli/src/app/landingPages/dataProvider/publicationsTab.component.ts create mode 100644 portal-4cli/src/app/landingPages/dataProvider/relatedDatasourcesTab.component.ts create mode 100644 portal-4cli/src/app/landingPages/dataProvider/statisticsTab.component.ts create mode 100644 portal-4cli/src/app/landingPages/dataset/dataset-routing.module.ts create mode 100644 portal-4cli/src/app/landingPages/dataset/dataset.component.html create mode 100644 portal-4cli/src/app/landingPages/dataset/dataset.component.ts create mode 100644 portal-4cli/src/app/landingPages/dataset/dataset.module.ts create mode 100644 portal-4cli/src/app/landingPages/dataset/dataset.service.ts create mode 100644 portal-4cli/src/app/landingPages/htmlProjectReport/htmlProjectReport-routing.module.ts create mode 100644 portal-4cli/src/app/landingPages/htmlProjectReport/htmlProjectReport.component.ts create mode 100644 portal-4cli/src/app/landingPages/htmlProjectReport/htmlProjectReport.module.ts create mode 100644 portal-4cli/src/app/landingPages/htmlProjectReport/htmlProjectReport.service.ts create mode 100644 portal-4cli/src/app/landingPages/landing-utils/addThis.component.ts create mode 100644 portal-4cli/src/app/landingPages/landing-utils/citeThis/citation.class.ts create mode 100644 portal-4cli/src/app/landingPages/landing-utils/citeThis/citeThis.component.ts create mode 100644 portal-4cli/src/app/landingPages/landing-utils/citeThis/citeThis.module.ts create mode 100644 portal-4cli/src/app/landingPages/landing-utils/fundedBy.component.ts create mode 100644 portal-4cli/src/app/landingPages/landing-utils/landing.module.ts create mode 100644 portal-4cli/src/app/landingPages/landing-utils/metrics.component.ts create mode 100644 portal-4cli/src/app/landingPages/landing-utils/metrics.module.ts create mode 100644 portal-4cli/src/app/landingPages/landing-utils/parsingFunctions.class.ts create mode 100644 portal-4cli/src/app/landingPages/landing-utils/publishedIn.component.ts create mode 100644 portal-4cli/src/app/landingPages/landing-utils/resultLanding.module.ts create mode 100644 portal-4cli/src/app/landingPages/landing-utils/searchingProjectsInTab.component.ts create mode 100644 portal-4cli/src/app/landingPages/landing-utils/searchingProjectsInTab.module.ts create mode 100644 portal-4cli/src/app/landingPages/landing-utils/showAuthors.component.ts create mode 100644 portal-4cli/src/app/landingPages/landing-utils/showIdentifiers.component.ts create mode 100644 portal-4cli/src/app/landingPages/landing-utils/showSubjects.component.ts create mode 100644 portal-4cli/src/app/landingPages/landing-utils/showTitle.component.ts create mode 100644 portal-4cli/src/app/landingPages/landing-utils/tabPaging.component.ts create mode 100644 portal-4cli/src/app/landingPages/landing-utils/tabTable.component.ts create mode 100644 portal-4cli/src/app/landingPages/organization/organization-routing.module.ts create mode 100644 portal-4cli/src/app/landingPages/organization/organization.component.html create mode 100644 portal-4cli/src/app/landingPages/organization/organization.component.ts create mode 100644 portal-4cli/src/app/landingPages/organization/organization.module.ts create mode 100644 portal-4cli/src/app/landingPages/project/project-routing.module.ts create mode 100644 portal-4cli/src/app/landingPages/project/project.component.html create mode 100644 portal-4cli/src/app/landingPages/project/project.component.ts create mode 100644 portal-4cli/src/app/landingPages/project/project.module.ts create mode 100644 portal-4cli/src/app/landingPages/project/project.service.ts create mode 100644 portal-4cli/src/app/landingPages/project/projectService.module.ts create mode 100644 portal-4cli/src/app/landingPages/publication/publication-routing.module.ts create mode 100644 portal-4cli/src/app/landingPages/publication/publication.component.html create mode 100644 portal-4cli/src/app/landingPages/publication/publication.component.ts create mode 100644 portal-4cli/src/app/landingPages/publication/publication.module.ts create mode 100644 portal-4cli/src/app/landingPages/publication/publication.service.ts create mode 100644 portal-4cli/src/app/landingPages/software/software-routing.module.ts create mode 100644 portal-4cli/src/app/landingPages/software/software.component.html create mode 100644 portal-4cli/src/app/landingPages/software/software.component.ts create mode 100644 portal-4cli/src/app/landingPages/software/software.module.ts create mode 100644 portal-4cli/src/app/landingPages/software/software.service.ts create mode 100644 portal-4cli/src/app/login/adminLoginGuard.guard.ts create mode 100644 portal-4cli/src/app/login/freeGuard.guard.ts create mode 100644 portal-4cli/src/app/login/loginGuard.guard.ts create mode 100644 portal-4cli/src/app/login/user-routing.module.ts create mode 100644 portal-4cli/src/app/login/user.component.html create mode 100644 portal-4cli/src/app/login/user.component.ts create mode 100644 portal-4cli/src/app/login/user.module.ts create mode 100644 portal-4cli/src/app/login/userMini.component.ts create mode 100644 portal-4cli/src/app/login/utils/guardHelper.class.ts create mode 100644 portal-4cli/src/app/login/utils/helper.class.ts create mode 100644 portal-4cli/src/app/reload/reload-routing.module.ts create mode 100644 portal-4cli/src/app/reload/reload.component.ts create mode 100644 portal-4cli/src/app/reload/reload.module.ts create mode 100644 portal-4cli/src/app/searchPages/advanced/advancedSearchDataProviders-routing.module.ts create mode 100644 portal-4cli/src/app/searchPages/advanced/advancedSearchDataProviders.component.ts create mode 100644 portal-4cli/src/app/searchPages/advanced/advancedSearchDataProviders.module.ts create mode 100644 portal-4cli/src/app/searchPages/advanced/advancedSearchDatasets-routing.module.ts create mode 100644 portal-4cli/src/app/searchPages/advanced/advancedSearchDatasets.component.ts create mode 100644 portal-4cli/src/app/searchPages/advanced/advancedSearchDatasets.module.ts create mode 100644 portal-4cli/src/app/searchPages/advanced/advancedSearchOrganizations-routing.module.ts create mode 100644 portal-4cli/src/app/searchPages/advanced/advancedSearchOrganizations.component.ts create mode 100644 portal-4cli/src/app/searchPages/advanced/advancedSearchOrganizations.module.ts create mode 100644 portal-4cli/src/app/searchPages/advanced/advancedSearchProjects-routing.module.ts create mode 100644 portal-4cli/src/app/searchPages/advanced/advancedSearchProjects.component.ts create mode 100644 portal-4cli/src/app/searchPages/advanced/advancedSearchProjects.module.ts create mode 100644 portal-4cli/src/app/searchPages/advanced/advancedSearchPublications-routing.module.ts create mode 100644 portal-4cli/src/app/searchPages/advanced/advancedSearchPublications.component.ts create mode 100644 portal-4cli/src/app/searchPages/advanced/advancedSearchPublications.module.ts create mode 100644 portal-4cli/src/app/searchPages/advanced/advancedSearchSoftware-routing.module.ts create mode 100644 portal-4cli/src/app/searchPages/advanced/advancedSearchSoftware.component.ts create mode 100644 portal-4cli/src/app/searchPages/advanced/advancedSearchSoftware.module.ts create mode 100644 portal-4cli/src/app/searchPages/dataProviders/compatibleDataProviders-routing.module.ts create mode 100644 portal-4cli/src/app/searchPages/dataProviders/compatibleDataProviders.component.ts create mode 100644 portal-4cli/src/app/searchPages/dataProviders/compatibleDataProviders.module.ts create mode 100644 portal-4cli/src/app/searchPages/dataProviders/compatibleDataProvidersTable-routing.module.ts create mode 100644 portal-4cli/src/app/searchPages/dataProviders/compatibleDataProvidersTable.component.ts create mode 100644 portal-4cli/src/app/searchPages/dataProviders/compatibleDataProvidersTable.module.ts create mode 100644 portal-4cli/src/app/searchPages/dataProviders/entityRegistries-routing.module.ts create mode 100644 portal-4cli/src/app/searchPages/dataProviders/entityRegistries.component.ts create mode 100644 portal-4cli/src/app/searchPages/dataProviders/entityRegistries.module.ts create mode 100644 portal-4cli/src/app/searchPages/dataProviders/entityRegistriesTable-routing.module.ts create mode 100644 portal-4cli/src/app/searchPages/dataProviders/entityRegistriesTable.component.ts create mode 100644 portal-4cli/src/app/searchPages/dataProviders/entityRegistriesTable.module.ts create mode 100644 portal-4cli/src/app/searchPages/dataProviders/journals-routing.module.ts create mode 100644 portal-4cli/src/app/searchPages/dataProviders/journals.component.ts create mode 100644 portal-4cli/src/app/searchPages/dataProviders/journals.module.ts create mode 100644 portal-4cli/src/app/searchPages/dataProviders/journalsTable-routing.module.ts create mode 100644 portal-4cli/src/app/searchPages/dataProviders/journalsTable.component.ts create mode 100644 portal-4cli/src/app/searchPages/dataProviders/journalsTable.module.ts create mode 100644 portal-4cli/src/app/searchPages/find/mainSearch-routing.module.ts create mode 100644 portal-4cli/src/app/searchPages/find/mainSearch.module.ts create mode 100644 portal-4cli/src/app/searchPages/find/search.component.html create mode 100644 portal-4cli/src/app/searchPages/find/search.component.ts create mode 100644 portal-4cli/src/app/searchPages/searchUtils/advancedSearchForm.component.html create mode 100644 portal-4cli/src/app/searchPages/searchUtils/advancedSearchForm.component.ts create mode 100644 portal-4cli/src/app/searchPages/searchUtils/advancedSearchForm.module.ts create mode 100644 portal-4cli/src/app/searchPages/searchUtils/advancedSearchPage.component.html create mode 100644 portal-4cli/src/app/searchPages/searchUtils/advancedSearchPage.component.ts create mode 100644 portal-4cli/src/app/searchPages/searchUtils/advancedSearchPage.module.ts create mode 100644 portal-4cli/src/app/searchPages/searchUtils/browseEntities.component.ts create mode 100644 portal-4cli/src/app/searchPages/searchUtils/browseEntities.module.ts create mode 100644 portal-4cli/src/app/searchPages/searchUtils/browseStatistic.component.html create mode 100644 portal-4cli/src/app/searchPages/searchUtils/browseStatistic.component.ts create mode 100644 portal-4cli/src/app/searchPages/searchUtils/dateFilter.component.ts create mode 100644 portal-4cli/src/app/searchPages/searchUtils/dateFilter.module.ts create mode 100644 portal-4cli/src/app/searchPages/searchUtils/searchDownload.component.ts create mode 100644 portal-4cli/src/app/searchPages/searchUtils/searchDownload.module.ts create mode 100644 portal-4cli/src/app/searchPages/searchUtils/searchFilter.component.html create mode 100644 portal-4cli/src/app/searchPages/searchUtils/searchFilter.component.ts create mode 100644 portal-4cli/src/app/searchPages/searchUtils/searchFilter.module.ts create mode 100644 portal-4cli/src/app/searchPages/searchUtils/searchFilterModal.component.ts create mode 100644 portal-4cli/src/app/searchPages/searchUtils/searchForm.component.ts create mode 100644 portal-4cli/src/app/searchPages/searchUtils/searchForm.module.ts create mode 100644 portal-4cli/src/app/searchPages/searchUtils/searchHelperClasses.class.ts create mode 100644 portal-4cli/src/app/searchPages/searchUtils/searchPage.component.html create mode 100644 portal-4cli/src/app/searchPages/searchUtils/searchPage.component.ts create mode 100644 portal-4cli/src/app/searchPages/searchUtils/searchPage.module.ts create mode 100644 portal-4cli/src/app/searchPages/searchUtils/searchPageTableView.component.html create mode 100644 portal-4cli/src/app/searchPages/searchUtils/searchPageTableView.component.ts create mode 100644 portal-4cli/src/app/searchPages/searchUtils/searchPageTableView.module.ts create mode 100644 portal-4cli/src/app/searchPages/searchUtils/searchPaging.component.ts create mode 100644 portal-4cli/src/app/searchPages/searchUtils/searchPaging.module.ts create mode 100644 portal-4cli/src/app/searchPages/searchUtils/searchResult.component.html create mode 100644 portal-4cli/src/app/searchPages/searchUtils/searchResult.component.ts create mode 100644 portal-4cli/src/app/searchPages/searchUtils/searchResults.module.ts create mode 100644 portal-4cli/src/app/searchPages/searchUtils/searchUtils.class.ts create mode 100644 portal-4cli/src/app/searchPages/searchUtils/tabResult.component.html create mode 100644 portal-4cli/src/app/searchPages/searchUtils/tabResult.component.ts create mode 100644 portal-4cli/src/app/searchPages/searchUtils/tabResult.module.ts create mode 100644 portal-4cli/src/app/searchPages/simple/searchDataProviders-routing.module.ts create mode 100644 portal-4cli/src/app/searchPages/simple/searchDataProviders.module.ts create mode 100644 portal-4cli/src/app/searchPages/simple/searchDataproviders.component.ts create mode 100644 portal-4cli/src/app/searchPages/simple/searchDatasets-routing.module.ts create mode 100644 portal-4cli/src/app/searchPages/simple/searchDatasets.component.ts create mode 100644 portal-4cli/src/app/searchPages/simple/searchDatasets.module.ts create mode 100644 portal-4cli/src/app/searchPages/simple/searchOrganizations-routing.module.ts create mode 100644 portal-4cli/src/app/searchPages/simple/searchOrganizations.component.ts create mode 100644 portal-4cli/src/app/searchPages/simple/searchOrganizations.module.ts create mode 100644 portal-4cli/src/app/searchPages/simple/searchProjects-routing.module.ts create mode 100644 portal-4cli/src/app/searchPages/simple/searchProjects.component.ts create mode 100644 portal-4cli/src/app/searchPages/simple/searchProjects.module.ts create mode 100644 portal-4cli/src/app/searchPages/simple/searchPublications-routing.module.ts create mode 100644 portal-4cli/src/app/searchPages/simple/searchPublications.component.ts create mode 100644 portal-4cli/src/app/searchPages/simple/searchPublications.module.ts create mode 100644 portal-4cli/src/app/searchPages/simple/searchSoftware-routing.module.ts create mode 100644 portal-4cli/src/app/searchPages/simple/searchSoftware.component.ts create mode 100644 portal-4cli/src/app/searchPages/simple/searchSoftware.module.ts create mode 100644 portal-4cli/src/app/services/dataProvidersService.module.ts create mode 100644 portal-4cli/src/app/services/datasetsService.module.ts create mode 100644 portal-4cli/src/app/services/metrics.service.ts create mode 100644 portal-4cli/src/app/services/organization.service.ts create mode 100644 portal-4cli/src/app/services/organizationService.module.ts create mode 100644 portal-4cli/src/app/services/organizationsService.module.ts create mode 100644 portal-4cli/src/app/services/projectsService.module.ts create mode 100644 portal-4cli/src/app/services/publicationsService.module.ts create mode 100644 portal-4cli/src/app/services/refineFieldResults.service.ts create mode 100644 portal-4cli/src/app/services/refineFieldResultsService.module.ts create mode 100644 portal-4cli/src/app/services/reports.service.ts create mode 100644 portal-4cli/src/app/services/reportsService.module.ts create mode 100644 portal-4cli/src/app/services/searchDataproviders.service.ts create mode 100644 portal-4cli/src/app/services/searchDatasets.service.ts create mode 100644 portal-4cli/src/app/services/searchOrganizations.service.ts create mode 100644 portal-4cli/src/app/services/searchProjects.service.ts create mode 100644 portal-4cli/src/app/services/searchPublications.service.ts create mode 100644 portal-4cli/src/app/services/searchSoftware.service.ts create mode 100644 portal-4cli/src/app/services/servicesUtils/refineResults.class.ts create mode 100644 portal-4cli/src/app/services/softwareService.module.ts create mode 100644 portal-4cli/src/app/shared/shared.module.ts create mode 100644 portal-4cli/src/app/sharedComponents/bottom.component.html create mode 100644 portal-4cli/src/app/sharedComponents/bottom.component.ts create mode 100644 portal-4cli/src/app/sharedComponents/cookie-law/cookie-law.component.ts create mode 100644 portal-4cli/src/app/sharedComponents/cookie-law/cookie-law.css create mode 100644 portal-4cli/src/app/sharedComponents/cookie-law/cookie-law.html create mode 100644 portal-4cli/src/app/sharedComponents/cookie-law/cookie-law.module.ts create mode 100644 portal-4cli/src/app/sharedComponents/cookie-law/cookie-law.service.ts create mode 100644 portal-4cli/src/app/sharedComponents/cookie-law/icons.ts create mode 100644 portal-4cli/src/app/sharedComponents/feedback/feedback.component.ts create mode 100644 portal-4cli/src/app/sharedComponents/navigationBar.component.html create mode 100644 portal-4cli/src/app/sharedComponents/navigationBar.component.ts create mode 100644 portal-4cli/src/app/sharedComponents/sharedComponents.module.ts create mode 100644 portal-4cli/src/app/test/test-routing.module.ts create mode 100644 portal-4cli/src/app/test/test.component.ts create mode 100644 portal-4cli/src/app/test/test.module.ts create mode 100644 portal-4cli/src/app/utils/altmetrics.component.ts create mode 100644 portal-4cli/src/app/utils/altmetrics.js create mode 100644 portal-4cli/src/app/utils/altmetrics.module.ts create mode 100644 portal-4cli/src/app/utils/autoComplete.component.css create mode 100644 portal-4cli/src/app/utils/configuration/configuration.service.ts create mode 100644 portal-4cli/src/app/utils/entities/dataProviderInfo.ts create mode 100644 portal-4cli/src/app/utils/entities/datasetInfo.ts create mode 100644 portal-4cli/src/app/utils/entities/entities.module.ts create mode 100644 portal-4cli/src/app/utils/entities/metrics.ts create mode 100644 portal-4cli/src/app/utils/entities/organizationInfo.ts create mode 100644 portal-4cli/src/app/utils/entities/projectInfo.ts create mode 100644 portal-4cli/src/app/utils/entities/publication.ts create mode 100644 portal-4cli/src/app/utils/entities/publicationInfo.ts create mode 100644 portal-4cli/src/app/utils/entities/searchResult.ts create mode 100644 portal-4cli/src/app/utils/entities/softwareInfo.ts create mode 100644 portal-4cli/src/app/utils/entitiesAutoComplete/entitiesAutoComplete.component.ts create mode 100644 portal-4cli/src/app/utils/entitiesAutoComplete/entitiesAutoComplete.module.ts create mode 100644 portal-4cli/src/app/utils/entitiesAutoComplete/entitySearch.service.ts create mode 100644 portal-4cli/src/app/utils/entitiesAutoComplete/entitySearchService.module.ts create mode 100644 portal-4cli/src/app/utils/errorMessages.component.ts create mode 100644 portal-4cli/src/app/utils/errorMessages.module.ts create mode 100644 portal-4cli/src/app/utils/exportCSV.class.ts create mode 100644 portal-4cli/src/app/utils/fetchEntitiesClasses/fetchDataproviders.class.ts create mode 100644 portal-4cli/src/app/utils/fetchEntitiesClasses/fetchDatasets.class.ts create mode 100644 portal-4cli/src/app/utils/fetchEntitiesClasses/fetchOrganizations.class.ts create mode 100644 portal-4cli/src/app/utils/fetchEntitiesClasses/fetchProjects.class.ts create mode 100644 portal-4cli/src/app/utils/fetchEntitiesClasses/fetchPublications.class.ts create mode 100644 portal-4cli/src/app/utils/fetchEntitiesClasses/fetchSoftware.class.ts create mode 100644 portal-4cli/src/app/utils/helper/helper.component.ts create mode 100644 portal-4cli/src/app/utils/helper/helper.module.ts create mode 100644 portal-4cli/src/app/utils/helper/helper.service.ts create mode 100644 portal-4cli/src/app/utils/helper/helperService.module.ts create mode 100644 portal-4cli/src/app/utils/iframe.component.ts create mode 100644 portal-4cli/src/app/utils/iframe.module.ts create mode 100644 portal-4cli/src/app/utils/metaTags/openaireMetaTags.class.ts create mode 100644 portal-4cli/src/app/utils/modal/alert.ts create mode 100644 portal-4cli/src/app/utils/modal/alertModal.module.ts create mode 100644 portal-4cli/src/app/utils/modal/loading.component.ts create mode 100644 portal-4cli/src/app/utils/modal/loadingModal.module.ts create mode 100644 portal-4cli/src/app/utils/modal/modal.module.ts create mode 100644 portal-4cli/src/app/utils/modal/open.component.ts create mode 100644 portal-4cli/src/app/utils/modal/selectModal.component.ts create mode 100644 portal-4cli/src/app/utils/modal/selectModal.module.ts create mode 100644 portal-4cli/src/app/utils/my-date-picker/directives/my-date-picker.focus.directive.ts create mode 100644 portal-4cli/src/app/utils/my-date-picker/directives/my-date-picker.input.auto.fill.directive.ts create mode 100644 portal-4cli/src/app/utils/my-date-picker/index.ts create mode 100644 portal-4cli/src/app/utils/my-date-picker/interfaces/index.ts create mode 100644 portal-4cli/src/app/utils/my-date-picker/interfaces/my-calendar-day.interface.ts create mode 100644 portal-4cli/src/app/utils/my-date-picker/interfaces/my-calendar-view-changed.interface.ts create mode 100644 portal-4cli/src/app/utils/my-date-picker/interfaces/my-date-model.interface.ts create mode 100644 portal-4cli/src/app/utils/my-date-picker/interfaces/my-date-range.interface.ts create mode 100644 portal-4cli/src/app/utils/my-date-picker/interfaces/my-date.interface.ts create mode 100644 portal-4cli/src/app/utils/my-date-picker/interfaces/my-day-labels.interface.ts create mode 100644 portal-4cli/src/app/utils/my-date-picker/interfaces/my-input-auto-fill.interface.ts create mode 100644 portal-4cli/src/app/utils/my-date-picker/interfaces/my-input-field-changed.interface.ts create mode 100644 portal-4cli/src/app/utils/my-date-picker/interfaces/my-input-focus-blur.interface.ts create mode 100644 portal-4cli/src/app/utils/my-date-picker/interfaces/my-locale.interface.ts create mode 100644 portal-4cli/src/app/utils/my-date-picker/interfaces/my-month-labels.interface.ts create mode 100644 portal-4cli/src/app/utils/my-date-picker/interfaces/my-month.interface.ts create mode 100644 portal-4cli/src/app/utils/my-date-picker/interfaces/my-options.interface.ts create mode 100644 portal-4cli/src/app/utils/my-date-picker/interfaces/my-week.interface.ts create mode 100644 portal-4cli/src/app/utils/my-date-picker/interfaces/my-weekday.interface.ts create mode 100644 portal-4cli/src/app/utils/my-date-picker/my-date-picker.component.css create mode 100644 portal-4cli/src/app/utils/my-date-picker/my-date-picker.component.html create mode 100644 portal-4cli/src/app/utils/my-date-picker/my-date-picker.component.spec.ts create mode 100644 portal-4cli/src/app/utils/my-date-picker/my-date-picker.component.ts create mode 100644 portal-4cli/src/app/utils/my-date-picker/my-date-picker.module.ts create mode 100644 portal-4cli/src/app/utils/my-date-picker/services/my-date-picker.locale.service.ts create mode 100644 portal-4cli/src/app/utils/my-date-picker/services/my-date-picker.util.service.ts create mode 100644 portal-4cli/src/app/utils/number-utils.class.ts create mode 100644 portal-4cli/src/app/utils/paging.module.ts create mode 100644 portal-4cli/src/app/utils/pagingFormatter.component.ts create mode 100644 portal-4cli/src/app/utils/pagingFormatterNoLoad.component.ts create mode 100644 portal-4cli/src/app/utils/pipes/claimsDatatable.pipe.ts create mode 100644 portal-4cli/src/app/utils/pipes/contentProvidersDatatable.pipe.ts create mode 100644 portal-4cli/src/app/utils/pipes/safeHTML.pipe.ts create mode 100644 portal-4cli/src/app/utils/piwik/piwik.service.ts create mode 100644 portal-4cli/src/app/utils/piwik/piwikService.module.ts create mode 100644 portal-4cli/src/app/utils/piwik/previousRouteRecorder.guard.ts create mode 100644 portal-4cli/src/app/utils/properties/openaireProperties.ts create mode 100644 portal-4cli/src/app/utils/properties/searchFields.ts create mode 100644 portal-4cli/src/app/utils/properties/searchFields_new.ts create mode 100644 portal-4cli/src/app/utils/properties/searchFields_old.ts create mode 100644 portal-4cli/src/app/utils/routerHelper.class.ts create mode 100644 portal-4cli/src/app/utils/showDataProviders.component.ts create mode 100644 portal-4cli/src/app/utils/staticAutoComplete/ISVocabularies.service.ts create mode 100644 portal-4cli/src/app/utils/staticAutoComplete/staticAutoComplete.component.ts create mode 100644 portal-4cli/src/app/utils/staticAutoComplete/staticAutoComplete.module.ts create mode 100644 portal-4cli/src/app/utils/string-utils.class.ts create mode 100644 portal-4cli/src/assets/Home_24white.svg create mode 100644 portal-4cli/src/assets/OA DISCOVER_A.png create mode 100644 portal-4cli/src/assets/OA DISCOVER_B.png create mode 100644 portal-4cli/src/assets/closedAccess.png create mode 100644 portal-4cli/src/assets/common/80x15.png create mode 100644 portal-4cli/src/assets/common/Home-icon.png create mode 100644 portal-4cli/src/assets/common/Logo_Horizontal.png create mode 100644 portal-4cli/src/assets/common/Logo_Horizontal_white_small.png create mode 100644 portal-4cli/src/assets/common/Symbol.png create mode 100644 portal-4cli/src/assets/common/custom.css create mode 100644 portal-4cli/src/assets/common/ec_logo_inv_small.png create mode 100644 portal-4cli/src/assets/common/jquery.js create mode 100644 portal-4cli/src/assets/common/theme.css create mode 100644 portal-4cli/src/assets/common/uikit-icons-max.js create mode 100644 portal-4cli/src/assets/common/uikit.js create mode 100644 portal-4cli/src/assets/dataset.png create mode 100644 portal-4cli/src/assets/datasource.png create mode 100644 portal-4cli/src/assets/discover-custom.css create mode 100644 portal-4cli/src/assets/external-link.svg create mode 100644 portal-4cli/src/assets/favicon.ico create mode 100644 portal-4cli/src/assets/formImage.jpg create mode 100644 portal-4cli/src/assets/globe_tech.jpg create mode 100644 portal-4cli/src/assets/home.jpeg create mode 100644 portal-4cli/src/assets/home2.jpeg create mode 100644 portal-4cli/src/assets/icon_external.png create mode 100644 portal-4cli/src/assets/jquery/jquery.min.js create mode 100644 portal-4cli/src/assets/loading.gif create mode 100644 portal-4cli/src/assets/lock.svg create mode 100644 portal-4cli/src/assets/logo/android-icon-144x144.png create mode 100644 portal-4cli/src/assets/logo/android-icon-192x192.png create mode 100644 portal-4cli/src/assets/logo/android-icon-36x36.png create mode 100644 portal-4cli/src/assets/logo/android-icon-48x48.png create mode 100644 portal-4cli/src/assets/logo/android-icon-72x72.png create mode 100644 portal-4cli/src/assets/logo/android-icon-96x96.png create mode 100644 portal-4cli/src/assets/logo/apple-icon-114x114.png create mode 100644 portal-4cli/src/assets/logo/apple-icon-120x120.png create mode 100644 portal-4cli/src/assets/logo/apple-icon-144x144.png create mode 100644 portal-4cli/src/assets/logo/apple-icon-152x152.png create mode 100644 portal-4cli/src/assets/logo/apple-icon-180x180.png create mode 100644 portal-4cli/src/assets/logo/apple-icon-57x57.png create mode 100644 portal-4cli/src/assets/logo/apple-icon-60x60.png create mode 100644 portal-4cli/src/assets/logo/apple-icon-72x72.png create mode 100644 portal-4cli/src/assets/logo/apple-icon-76x76.png create mode 100644 portal-4cli/src/assets/logo/apple-icon-precomposed.png create mode 100644 portal-4cli/src/assets/logo/apple-icon.png create mode 100644 portal-4cli/src/assets/logo/browserconfig.xml create mode 100644 portal-4cli/src/assets/logo/favicon-16x16.png create mode 100644 portal-4cli/src/assets/logo/favicon-32x32.png create mode 100644 portal-4cli/src/assets/logo/favicon-96x96.png create mode 100644 portal-4cli/src/assets/logo/favicon.ico create mode 100644 portal-4cli/src/assets/logo/manifest.json create mode 100644 portal-4cli/src/assets/logo/ms-icon-144x144.png create mode 100644 portal-4cli/src/assets/logo/ms-icon-150x150.png create mode 100644 portal-4cli/src/assets/logo/ms-icon-310x310.png create mode 100644 portal-4cli/src/assets/logo/ms-icon-70x70.png create mode 100644 portal-4cli/src/assets/newlogo.png create mode 100644 portal-4cli/src/assets/openAccess.png create mode 100644 portal-4cli/src/assets/organization.png create mode 100644 portal-4cli/src/assets/project.png create mode 100644 portal-4cli/src/assets/projects_search.jpg create mode 100644 portal-4cli/src/assets/providers_search.jpg create mode 100644 portal-4cli/src/assets/publication.png create mode 100644 portal-4cli/src/assets/sc39.png create mode 100644 portal-4cli/src/assets/search_data.jpg create mode 100644 portal-4cli/src/assets/search_general.jpg create mode 100644 portal-4cli/src/assets/search_general_2.jpg create mode 100644 portal-4cli/src/assets/search_general_3.jpg create mode 100644 portal-4cli/src/assets/search_journals.jpg create mode 100644 portal-4cli/src/assets/search_organizations.jpg create mode 100644 portal-4cli/src/assets/search_pubs_1.jpg create mode 100644 portal-4cli/src/assets/search_registries.jpg create mode 100644 portal-4cli/src/assets/sitemap.xml create mode 100644 portal-4cli/src/assets/unlock.svg create mode 100644 portal-4cli/src/environments/environment.prod.ts create mode 100644 portal-4cli/src/environments/environment.ts create mode 100644 portal-4cli/src/index.html create mode 100644 portal-4cli/src/main.server.ts create mode 100644 portal-4cli/src/main.ts create mode 100644 portal-4cli/src/polyfills.ts create mode 100644 portal-4cli/src/styles.css create mode 100644 portal-4cli/src/tsconfig.app.json create mode 100644 portal-4cli/src/tsconfig.server.json create mode 100644 portal-4cli/static.paths.ts create mode 100644 portal-4cli/tsconfig.json create mode 100644 portal-4cli/webpack.server.config.js diff --git a/portal-4cli/.angular-cli.json b/portal-4cli/.angular-cli.json new file mode 100644 index 00000000..a1364d22 --- /dev/null +++ b/portal-4cli/.angular-cli.json @@ -0,0 +1,106 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "project": { + "name": "ng-universal-demo" + }, + "apps": [ + { + "root": "src", + "outDir": "dist/browser", + "assets": [ + "assets", + "favicon.ico" + ], + "index": "index.html", + "main": "main.ts", + "polyfills": "polyfills.ts", + "test": "test.ts", + "tsconfig": "tsconfig.app.json", + "testTsconfig": "tsconfig.spec.json", + "prefix": "app", + "styles": [ + "styles.css" + ], + "scripts": [], + "environmentSource": "environments/environment.ts", + "environments": { + "dev": "environments/environment.ts", + "prod": "environments/environment.prod.ts" + } + }, + { + "platform": "server", + "root": "src", + "outDir": "dist/server", + "assets": [ + "assets", + "favicon.ico" + ], + "index": "index.html", + "main": "main.server.ts", + "test": "test.ts", + "tsconfig": "tsconfig.server.json", + "testTsconfig": "tsconfig.spec.json", + "prefix": "app", + "styles": [ + "styles.css" + ], + "scripts": [], + "environmentSource": "environments/environment.ts", + "environments": { + "dev": "environments/environment.ts", + "prod": "environments/environment.prod.ts" + } + } + ], + "e2e": { + "protractor": { + "config": "./protractor.conf.js" + } + }, + "lint": [ + { + "project": "src/tsconfig.app.json", + "exclude": "**/node_modules/**" + }, + { + "project": "src/tsconfig.spec.json", + "exclude": "**/node_modules/**" + }, + { + "project": "e2e/tsconfig.e2e.json", + "exclude": "**/node_modules/**" + } + ], + "test": { + "karma": { + "config": "./karma.conf.js" + } + }, + "defaults": { + "styleExt": "css", + "component": { + "spec": false, + "inlineStyle": true, + "inlineTemplate": true + }, + "directive": { + "spec": false + }, + "class": { + "spec": false + }, + "guard": { + "spec": false + }, + "module": { + "spec": false + }, + "pipe": { + "spec": false + }, + "service": { + "spec": false + } + } + } \ No newline at end of file diff --git a/portal-4cli/README.md b/portal-4cli/README.md new file mode 100644 index 00000000..96e55e90 --- /dev/null +++ b/portal-4cli/README.md @@ -0,0 +1,54 @@ +# Angular Universal & Anguar-CLI minimal starter + +> This demo is built following the [Angular-CLI Wiki guide](https://github.com/angular/angular-cli/wiki/stories-universal-rendering) + +We're utilizing packages from the [Angular Universal @nguniversal](https://github.com/angular/universal) repo, such as [ng-module-map-ngfactory-loader](https://github.com/angular/universal/tree/master/modules/module-map-ngfactory-loader) to enable Lazy Loading. + +--- + +## Static or Dynamic +This repo demonstrates the use of 2 different forms of Server Side Rendering. + +**Static** Also known as "prerendering" +* Happens at build time +* Renders your application and replaces the dist index.html with a version rendered at the route `/`. + +**Dynamic** +* Happens at runtime +* Uses `ngExpressEngine` to render you application on the fly at the requested url. + +--- + +## Installation +* `npm install` or `yarn` + +--- + +## Development (Client-side only rendering) +* run `npm run start` which will start `ng serve` (project served at the standard: localhost:4200) + +--- + +## Production + +Depending on whether you're publishing dynamic or static prerendering, run the build command, and then serve up your dist folder assets. + +> **NOTE**: To deploy your **Static** site to a static hosting platform you will have to deploy the *`dist/browser`* folder, rather than the usual *`dist`* + +ie: `npm run build:dynamic` or `npm run build:static`. All of the files that need to be served will be found within the `/dist` folder. + + + +--- + +## Testing Universal (dynamic or static) builds -Locally- + +**Dynamic** : **`npm run start:dynamic`** + +Compiles your application and spins up a Node Express to dynamically serve your Universal application on `http://localhost:4000`. + +**Static** : **`npm run start:static`** + +- Compiles your application and prerenders your applications files, spinning up a demo http-server so you can view it on `http://127.0.0.1:8080` + + diff --git a/portal-4cli/package.json b/portal-4cli/package.json new file mode 100644 index 00000000..37d4027b --- /dev/null +++ b/portal-4cli/package.json @@ -0,0 +1,57 @@ +{ + "name": "openaire-search", + "version": "1.0.0", + "license": "Openaire", + "contributors": [ + "Argiro Kokogiannaki ", + "Konstantina Galouni " + ], + "scripts": { + "ng": "ng", + "start": "ng serve --disable-host-check", + "start:dynamic": "npm run build:dynamic && npm run serve:dynamic", + "start:static": "npm run build:static && npm run serve:static", + "build": "ng build", + "build:client-and-server-bundles": "ng build --prod -sm --stats-json && ng build --prod --app 1 --output-hashing=false", + "build:static": "npm run build:client-and-server-bundles && npm run webpack:server && npm run generate:static", + "build:dynamic": "npm run build:client-and-server-bundles && npm run webpack:server", + "generate:static": "cd dist && node prerender", + "webpack:server": "webpack --config webpack.server.config.js --progress --colors", + "serve:static": "cd dist/browser && http-server", + "serve:dynamic": "node dist/server" + }, + "private": true, + "dependencies": { + "@angular/animations": "^4.2.4", + "@angular/common": "^4.2.4", + "@angular/compiler": "^4.2.4", + "@angular/core": "^4.2.4", + "@angular/forms": "^4.2.4", + "@angular/http": "^4.2.4", + "@angular/platform-browser": "^4.2.4", + "@angular/platform-browser-dynamic": "^4.2.4", + "@angular/platform-server": "^4.2.4", + "@angular/router": "^4.2.4", + "@nguniversal/express-engine": "^1.0.0-beta.3", + "@nguniversal/module-map-ngfactory-loader": "^1.0.0-beta.3", + "angular2-datatable": "^0.6.0", + "citation-js": "^0.3.4", + "clipboard": "^1.5.16", + "core-js": "^2.4.1", + "rxjs": "^5.4.2", + "ts-md5": "^1.2.0", + "wikidata-sdk": "^5.2.9", + "zone.js": "^0.8.14" + }, + "devDependencies": { + "@angular/cli": "^1.3.0", + "@angular/compiler-cli": "^4.2.4", + "@angular/language-service": "^4.2.4", + "@types/node": "^8.0.30", + "cpy-cli": "^1.0.1", + "http-server": "^0.10.0", + "reflect-metadata": "^0.1.10", + "ts-loader": "^2.3.7", + "typescript": "~2.3.3" + } +} diff --git a/portal-4cli/prerender.ts b/portal-4cli/prerender.ts new file mode 100644 index 00000000..5ddb8cd4 --- /dev/null +++ b/portal-4cli/prerender.ts @@ -0,0 +1,45 @@ +// Load zone.js for the server. +import 'zone.js/dist/zone-node'; +import 'reflect-metadata'; +import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs'; +import { join } from 'path'; + +import { enableProdMode } from '@angular/core'; +// Faster server renders w/ Prod mode (dev mode never needed) +enableProdMode(); + +// Express Engine +import { ngExpressEngine } from '@nguniversal/express-engine'; +// Import module map for lazy loading +import { provideModuleMap } from '@nguniversal/module-map-ngfactory-loader'; +import { renderModuleFactory } from '@angular/platform-server'; +import { ROUTES } from './static.paths'; + +// * NOTE :: leave this as require() since this file is built Dynamically from webpack +const { AppServerModuleNgFactory, LAZY_MODULE_MAP } = require('./dist/server/main.bundle'); + +const BROWSER_FOLDER = join(process.cwd(), 'browser'); + +// Load the index.html file containing referances to your application bundle. +const index = readFileSync(join('browser', 'index.html'), 'utf8'); + +let previousRender = Promise.resolve(); + +// Iterate each route path +ROUTES.forEach(route => { + var fullPath = join(BROWSER_FOLDER, route); + + // Make sure the directory structure is there + if(!existsSync(fullPath)){ + mkdirSync(fullPath); + } + + // Writes rendered HTML to index.html, replacing the file if it already exists. + previousRender = previousRender.then(_ => renderModuleFactory(AppServerModuleNgFactory, { + document: index, + url: route, + extraProviders: [ + provideModuleMap(LAZY_MODULE_MAP) + ] + })).then(html => writeFileSync(join(fullPath, 'index.html'), html)); +}); diff --git a/portal-4cli/server.ts b/portal-4cli/server.ts new file mode 100644 index 00000000..6aeb0faa --- /dev/null +++ b/portal-4cli/server.ts @@ -0,0 +1,58 @@ +import 'zone.js/dist/zone-node'; +import 'reflect-metadata'; +import { renderModuleFactory } from '@angular/platform-server'; +import { enableProdMode } from '@angular/core'; + +import * as express from 'express'; +import { join } from 'path'; +import { readFileSync } from 'fs'; + +// Faster server renders w/ Prod mode (dev mode never needed) +enableProdMode(); + +// Express server +const app = express(); + +const PORT = process.env.PORT || 4000; +const DIST_FOLDER = join(process.cwd(), 'dist'); + +// Our index.html we'll use as our template +const template = readFileSync(join(DIST_FOLDER, 'browser', 'index.html')).toString(); + +// * NOTE :: leave this as require() since this file is built Dynamically from webpack +const { AppServerModuleNgFactory, LAZY_MODULE_MAP } = require('./dist/server/main.bundle'); + +// Express Engine +import { ngExpressEngine } from '@nguniversal/express-engine'; +// Import module map for lazy loading +import { provideModuleMap } from '@nguniversal/module-map-ngfactory-loader'; + +// Our Universal express-engine (found @ https://github.com/angular/universal/tree/master/modules/express-engine) +app.engine('html', ngExpressEngine({ + bootstrap: AppServerModuleNgFactory, + providers: [ + provideModuleMap(LAZY_MODULE_MAP) + ] +})); + +app.set('view engine', 'html'); +app.set('views', join(DIST_FOLDER, 'browser')); + +/* - Example Express Rest API endpoints - + app.get('/api/**', (req, res) => { }); +*/ + +// Server static files from /browser +app.get('*.*', express.static(join(DIST_FOLDER, 'browser'), { + maxAge: '1y' +})); + +// ALl regular routes use the Universal engine +app.get('*', (req, res) => { + res.render('index', { req }); +}); + +// Start up the Node server +app.listen(PORT, () => { + console.log(`Node Express server listening on http://localhost:${PORT}`); +}); diff --git a/portal-4cli/src/angular2-meta.ts b/portal-4cli/src/angular2-meta.ts new file mode 100644 index 00000000..a1d0ddc0 --- /dev/null +++ b/portal-4cli/src/angular2-meta.ts @@ -0,0 +1,220 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import {Injectable, Inject} from '@angular/core'; +// es6-modules are used here +import { ɵgetDOM as getDOM} from '@angular/platform-browser'; +import {DOCUMENT} from '@angular/platform-browser'; +/** + * Represent meta element. + * + * ### Example + * + * ```ts + * { name: 'application-name', content: 'Name of my application' }, + * { name: 'description', content: 'A description of the page', id: 'desc' } + * // ... + * // Twitter + * { name: 'twitter:title', content: 'Content Title' } + * // ... + * // Google+ + * { itemprop: 'name', content: 'Content Title' }, + * { itemprop: 'description', content: 'Content Title' } + * // ... + * // Facebook / Open Graph + * { property: 'fb:app_id', content: '123456789' }, + * { property: 'og:title', content: 'Content Title' } + * ``` + * + * @experimental + */ +export interface MetaDefinition { + charset?: string; + content?: string; + httpEquiv?: string; + id?: string; + itemprop?: string; + name?: string; + property?: string; + scheme?: string; + url?: string; + [prop: string]: string; +} + +/** + * A service that can be used to get and add meta tags. + * + * @experimental + */ +@Injectable() +export class Meta { + private _dom: any = getDOM(); + constructor( @Inject(DOCUMENT) private _document: any) { } + /** + * Sets the title of the page + */ + setTitle(title: string) { + this._document.title = title + } + /** + * Adds a new meta tag to the dom. + * + * ### Example + * + * ```ts + * const name: MetaDefinition = {name: 'application-name', content: 'Name of my application'}; + * const desc: MetaDefinition = {name: 'description', content: 'A description of the page'}; + * const tags: HTMLMetaElement[] = this.meta.addTags([name, desc]); + * ``` + * + * @param tags + * @returns {HTMLMetaElement[]} + */ + addTags(...tags: Array): HTMLMetaElement[] { + const presentTags = this._flattenArray(tags); + if (presentTags.length === 0) return []; + return presentTags.map((tag: MetaDefinition) => this._addInternal(tag)); + } + + /** + * Gets the meta tag by the given selector. Returns element or null + * if there's no such meta element. + * + * ### Example + * + * ```ts + * const meta: HTMLMetaElement = this.meta.getTag('name=description'); + * const twitterMeta: HTMLMetaElement = this.meta.getTag('name="twitter:title"'); + * const fbMeta: HTMLMetaElement = this.meta.getTag('property="fb:app_id"'); + * ``` + * + * @param selector + * @returns {HTMLMetaElement} + */ + // getTag(selector: string): HTMLMetaElement { + // if (!selector) return null; + // return this._dom.query(`meta[${selector}]`); + // } + getTag(attrSelector: string): HTMLMetaElement|null { + if (!attrSelector) return null; + return this._dom.querySelector(this._document, `meta[${attrSelector}]`); +} + + /** + * Updates the meta tag with the given selector. + * + * * ### Example + * + * ```ts + * const meta: HTMLMetaElement = this.meta.updateTag('name=description', {name: 'description', + * content: 'New description'}); + * console.log(meta.content); // 'New description' + * ``` + * + * @param selector + * @param tag updated tag definition + * @returns {HTMLMetaElement} + */ + updateTag(selector: string, tag: MetaDefinition): HTMLMetaElement { + const meta: HTMLMetaElement = this.getTag(selector); + if (!meta) { + // create element if it doesn't exist + return this._addInternal(tag); + } + return this._prepareMetaElement(tag, meta); + } + + updateMeta(name, content) { + const head = this._document.head; + let childNodesAsList = this._dom.childNodesAsList(head); + let metaEl = childNodesAsList.find(el => el['attribs'] ? el['attribs'].name == name : false); + if (metaEl) metaEl['attribs'].content = content; + } + updateProperty(property, content) { + const head = this._document.head; + let childNodesAsList = this._dom.childNodesAsList(head); + let metaEl = childNodesAsList.find(el => el['attribs'] ? el['attribs'].property == property : false); + if (metaEl) metaEl['attribs'].content = content; + } + + /** + * Removes meta tag with the given selector from the dom. + * + * ### Example + * + * ```ts + * this.meta.removeTagBySelector('name=description'); + * ``` + * + * @param selector + */ + removeTagBySelector(selector: string): void { + const meta: HTMLMetaElement = this.getTag(selector); + this.removeTagElement(meta); + } + + /** + * Removes given meta element from the dom. + * + * ### Example + * ```ts + * const elem: HTMLMetaElement = this.meta.getTag('name=description'); + * this.meta.removeTagElement(elem); + * ``` + * + * @param meta meta element + */ + removeTagElement(meta: HTMLMetaElement): void { + if (meta) { + this._removeMetaElement(meta); + } + } + + private _addInternal(tag: MetaDefinition): HTMLMetaElement { + const meta: HTMLMetaElement = this._createMetaElement(); + this._prepareMetaElement(tag, meta); + this._appendMetaElement(meta); + return meta; + } + + private _createMetaElement(): HTMLMetaElement { + return this._dom.createElement('meta') as HTMLMetaElement; + } + + private _prepareMetaElement(tag: MetaDefinition, el: HTMLMetaElement): HTMLMetaElement { + Object.keys(tag).forEach((prop: string) => this._dom.setAttribute(el, prop, tag[prop])); + return el; + } + + // private _appendMetaElement(meta: HTMLMetaElement): void { + // const head = this._dom.getElementsByTagName(this._dom.defaultDoc(), 'head')[0]; + // this._dom.appendChild(head, meta); + // } + private _appendMetaElement(meta: HTMLMetaElement): void { + const head = this._document.head; + this._dom.appendChild(head, meta); + } + private _removeMetaElement(meta: HTMLMetaElement): void { + const head = this._dom.parentElement(meta); + this._dom.removeChild(head, meta); + } + + private _flattenArray(input: any[], out: any[] = []): any[] { + if (input) { + for (let i = 0; i < input.length; i++) { + const item: any = input[i]; + if (Array.isArray(item)) { + this._flattenArray(item, out); + } else if (item) { + out.push(item); + } + } + } + return out; + } +} diff --git a/portal-4cli/src/app/app.component.ts b/portal-4cli/src/app/app.component.ts new file mode 100644 index 00000000..01d1078c --- /dev/null +++ b/portal-4cli/src/app/app.component.ts @@ -0,0 +1,56 @@ +import { Component, Directive, ElementRef, Renderer, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core'; +import { ConfigurationService } from './utils/configuration/configuration.service'; +import {Observable} from 'rxjs/Observable'; + +@Component({ + //changeDetection: ChangeDetectionStrategy.Default, + //encapsulation: ViewEncapsulation.Emulated, + selector: 'app-root', + styles: [` + `], + template: ` + + + + + +
+
+ + +
+
+ + + + OpenAIRE uses cookies in order to function properly.
+ Cookies are small pieces of data that websites store in your browser to allow us to give you the best browsing experience possible. + By using the OpenAIRE portal you accept our use of cookies. Read more + + +
+ + +` + +}) +export class AppComponent { + isClient:boolean = false; + constructor(private config: ConfigurationService) {} + + ngOnInit() { + + if (typeof document !== 'undefined') { + try{ + this.isClient = true; + }catch (e) { + } + } + } +} diff --git a/portal-4cli/src/app/app.module.ts b/portal-4cli/src/app/app.module.ts new file mode 100755 index 00000000..cecf15cd --- /dev/null +++ b/portal-4cli/src/app/app.module.ts @@ -0,0 +1,78 @@ +import { NgModule } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { SharedModule } from './shared/shared.module'; +import { BrowserModule } from '@angular/platform-browser'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { APP_BASE_HREF, CommonModule } from '@angular/common'; +import { HttpModule } from '@angular/http'; +import { RouterModule } from '@angular/router'; +import { AppComponent } from './app.component'; +import {SharedComponentsModule} from './sharedComponents/sharedComponents.module'; //navbar +import { CookieLawModule } from './sharedComponents/cookie-law/cookie-law.module'; +import {Meta} from '../angular2-meta'; +// import { ErrorModule } from './error/error.module'; +import { ConfigurationService } from './utils/configuration/configuration.service'; +import { ErrorPageComponent } from './error/errorPage.component'; + +@NgModule({ + + imports: [ + SharedModule, + NoopAnimationsModule, + CommonModule, + HttpModule, + SharedComponentsModule, + CookieLawModule, + BrowserModule.withServerTransition({appId: 'my-app'}), + RouterModule.forRoot([ + { path: '', loadChildren: './home/home.module#HomeModule'}, + { path: 'home', loadChildren: './home/home.module#HomeModule'}, + { path: 'search/publication', loadChildren: './landingPages/publication/publication.module#PublicationModule' }, + { path: 'search/dataset', loadChildren: './landingPages/dataset/dataset.module#DatasetModule' }, + { path: 'search/software', loadChildren: './landingPages/software/software.module#SoftwareModule' }, + { path: 'search/project', loadChildren: './landingPages/project/project.module#ProjectModule' }, + { path: 'search/dataprovider', loadChildren: '././landingPages/dataProvider/dataProvider.module#DataProviderModule' }, + { path: 'search/organization', loadChildren: './landingPages/organization/organization.module#OrganizationModule' }, + { path: 'participate/deposit-datasets', loadChildren: './deposit/datasets/depositDatasets.module#DepositDatasetsModule' }, + { path: 'participate/deposit-datasets-result', loadChildren: './deposit/datasets/depositDatasetsResults.module#DepositDatasetsResultsModule' }, + { path: 'participate/deposit-subject-result', loadChildren: './deposit/datasets/depositBySubjectResults.module#DepositBySubjectResultsModule' }, + { path: 'participate/deposit-publications', loadChildren: './deposit/publications/depositPublications.module#DepositPublicationsModule' }, + { path: 'participate/deposit-publications-result', loadChildren: './deposit/publications/depositPublicationsResults.module#DepositPublicationsResultsModule' }, + { path: 'search/find', loadChildren: './searchPages/find/mainSearch.module#MainSearchModule' }, + { path: 'search/find/publications', loadChildren: './searchPages/simple/searchPublications.module#SearchPublicationsModule' }, + { path: 'search/find/datasets', loadChildren: './searchPages/simple/searchDatasets.module#SearchDatasetsModule' }, + { path: 'search/find/software', loadChildren: './searchPages/simple/searchSoftware.module#SearchSoftwareModule' }, + { path: 'search/find/projects', loadChildren: './searchPages/simple/searchProjects.module#SearchProjectsModule' }, + { path: 'search/find/dataproviders', loadChildren: './searchPages/simple/searchDataProviders.module#SearchDataProvidersModule' }, + { path: 'search/find/organizations', loadChildren: './searchPages/simple/searchOrganizations.module#SearchOrganizationsModule' }, + { path: 'search/content-providers', loadChildren: './searchPages/dataProviders/compatibleDataProviders.module#CompatibleDataProvidersModule' }, + { path: 'search/content-providers-table', loadChildren: './searchPages/dataProviders/compatibleDataProvidersTable.module#CompatibleDataProvidersTableModule' }, + { path: 'search/entity-registries', loadChildren: './searchPages/dataProviders/entityRegistries.module#EntityRegistriesModule' }, + { path: 'search/entity-registries-table', loadChildren: './searchPages/dataProviders/entityRegistriesTable.module#EntityRegistriesTableModule' }, + { path: 'search/journals', loadChildren: './searchPages/dataProviders/journals.module#JournalsModule' }, + { path: 'search/journals-table', loadChildren: './searchPages/dataProviders/journalsTable.module#JournalsTableModule' }, + { path: 'search/advanced/publications', loadChildren: './searchPages/advanced/advancedSearchPublications.module#AdvancedSearchPublicationsModule' }, + { path: 'search/advanced/datasets', loadChildren: './searchPages/advanced/advancedSearchDatasets.module#AdvancedSearchDatasetsModule' }, + { path: 'search/advanced/software', loadChildren: './searchPages/advanced/advancedSearchSoftware.module#AdvancedSearchSoftwareModule' }, + { path: 'search/advanced/organizations', loadChildren: './searchPages/advanced/advancedSearchOrganizations.module#AdvancedSearchOrganizationsModule' }, + { path: 'search/advanced/dataproviders', loadChildren: './searchPages/advanced/advancedSearchDataProviders.module#AdvancedSearchDataProvidersModule' }, + { path: 'search/advanced/projects', loadChildren: './searchPages/advanced/advancedSearchProjects.module#AdvancedSearchProjectsModule' }, + { path: 'project-report', loadChildren: './landingPages/htmlProjectReport/htmlProjectReport.module#HtmlProjectReportModule' }, + { path: 'myclaims', loadChildren: './claims/myClaims/myClaims.module#MyClaimsModule' }, + { path: 'claims', loadChildren: './claims/claimsAdmin/claimsAdmin.module#ClaimsAdminModule' }, + { path: 'participate/claim', loadChildren: './claims/linking/linkingGeneric.module#LinkingGenericModule' }, + { path: 'participate/direct-claim', loadChildren: './claims/directLinking/directLinking.module#DirectLinkingModule' }, + { path: 'claims-project-manager', loadChildren: './claims/claimsByToken/claimsByToken.module#ClaimsByTokenModule' }, + { path: 'user-info', loadChildren: './login/user.module#UserModule' }, + { path: 'error', component: ErrorPageComponent }, + { path: '**',pathMatch: 'full',component: ErrorPageComponent } + + + ]), + ], + declarations: [ AppComponent, ErrorPageComponent ], + exports: [ AppComponent ], + providers:[ Meta, ConfigurationService], + bootstrap: [AppComponent] +}) +export class AppModule {} diff --git a/portal-4cli/src/app/app.server.module.ts b/portal-4cli/src/app/app.server.module.ts new file mode 100644 index 00000000..79602ec8 --- /dev/null +++ b/portal-4cli/src/app/app.server.module.ts @@ -0,0 +1,20 @@ +import {NgModule} from '@angular/core'; +import {ServerModule} from '@angular/platform-server'; +import {ModuleMapLoaderModule} from '@nguniversal/module-map-ngfactory-loader'; + +import {AppModule} from './app.module'; +import {AppComponent} from './app.component'; + +@NgModule({ + imports: [ + // The AppServerModule should import your AppModule followed + // by the ServerModule from @angular/platform-server. + AppModule, + ServerModule, + ModuleMapLoaderModule, + ], + // Since the bootstrapped component is not inherited from your + // imported AppModule, it needs to be repeated here. + bootstrap: [AppComponent], +}) +export class AppServerModule {} diff --git a/portal-4cli/src/app/claims/claim-utils/claim.ts b/portal-4cli/src/app/claims/claim-utils/claim.ts new file mode 100644 index 00000000..b5378c5f --- /dev/null +++ b/portal-4cli/src/app/claims/claim-utils/claim.ts @@ -0,0 +1,15 @@ +export class Claim { + id: string; + sourceType: string; + targetType: string; + sourceId: string; + targetId: string; + date: string; + DOI: string; + project: Project + userMail: string; + +} +export class Project{ + +} diff --git a/portal-4cli/src/app/claims/claim-utils/claimContextSearchForm.component.ts b/portal-4cli/src/app/claims/claim-utils/claimContextSearchForm.component.ts new file mode 100644 index 00000000..8d1a8740 --- /dev/null +++ b/portal-4cli/src/app/claims/claim-utils/claimContextSearchForm.component.ts @@ -0,0 +1,343 @@ +import {Component, Input,Output, EventEmitter, ViewChild} from '@angular/core'; +import {Observable} from 'rxjs/Observable'; +import { Router} from '@angular/router'; +import {ContextsService} from './service/contexts.service'; +import {ClaimContext} from './claimEntities.class'; +import { StaticAutoCompleteComponent } from '../../utils/staticAutoComplete/staticAutoComplete.component'; +declare var UIkit:any; +import {Session} from '../../login/utils/helper.class'; +import {ErrorCodes} from '../../login/utils/guardHelper.class'; + +@Component({ + // moduleId: module.id, + selector: 'claim-contexts-search-form', + template: ` + +
+
Search for Communities
+ + + + + +
+ + + + + +
+ + +
Or Browse through categories
+ + + +
+ + ` + +}) +export class ClaimContextSearchFormComponent { +// @Input() public inline:boolean = false ; // for claimed started from landing pages +public showComponent:boolean = true ; // for claimed started from landing pages +@Input() public selectedList; +//The following need to be kept in case we have to save the current state +@Input() public projects; +@Input() public results; +@Input() public inlineEntity; +public selectedCommunityId:string = "0"; +public selectedCategoryId:string ="0"; +// @Output() contextSelected = new EventEmitter(); + +@ViewChild (StaticAutoCompleteComponent) autocomplete : StaticAutoCompleteComponent ; + +public query = ''; +public filteredList = []; +public communities:any; +public selectedCommunityLabel:string = "Community:"; + +public categories:any; +public selectedCategoryLabel:string ="Category:"; +public concepts = []; +public conceptsClass = []; +public conceptsClassDisplay = []; +public conceptsCategoryLoading = []; +public warningMessage = ""; +public infoMessage = ""; +public loading:boolean = false; +public error:boolean = false; + +ngOnInit() { + this.getCommunities(); +} +constructor(private _contextService: ContextsService,private router: Router) { + +} + +select($event){ + var item = $event.value; + this.addNewContext( this.selectedCommunityLabel, this.selectedCategoryLabel, item); + } +isSelected(id):boolean{ + for (var _i = 0; _i < this.selectedList.length; _i++) { + let item = this.selectedList[_i]; + if(item.concept.id == id){ + return true; + // this.warningMessage = "Concept already in selected list"; + } + } + return false; +} + addNewContext(community,category,concept){ + var context: ClaimContext= { community: community, category: category, concept: concept }; + var found:boolean = false; + this.warningMessage = ""; + if (!this.isSelected(context.concept.id)) { + + this.selectedList.push(context); + UIkit.notification({ + message : 'A new concept is selected.', + status : 'info', + timeout : 1000, + pos : 'top-center' + }); + + }else{ + UIkit.notification({ + message : 'The concept is already on your list.', + status : 'warning', + timeout : 1000, + pos : 'top-center' + }); + } +} + +getCommunities () { + if(!Session.isValidAndRemove()){ + this.saveStateAndRedirectLogin(); + + }else{ + this.loading = true; + var token=Session.getUserJwt(); + this._contextService.getCommunities().subscribe( + data => { + this.communities = data.communities; + this.loading = false; + }, + err => { + console.log(err); + this.loading = false; + this.error = true; + } + ); + } + } + getCategories () { + this.loading = true; + this.categories=[]; + if(this.selectedCommunityId != '0'){ + if(!Session.isValidAndRemove()){ + this.saveStateAndRedirectLogin(); + + }else{ + var token=Session.getUserJwt(); + this._contextService.getCategories(this.selectedCommunityId).subscribe( + data => { + + this.categories = (Array.isArray(data.category))? data.category:[data.category]; + this.concepts = []; + this.addCommunityInConcepts(); + this.filteredList = []; + if (this.query !== ""){ + var event = {value: ""}; + event.value = this.query; + } + this.loading = false; + }, + err => { + console.log(err); + this.loading = false; + } + ); + } + } + } + getConcepts () { + this.loading = true; + if(this.selectedCategoryId != '0'){ + if(!Session.isValidAndRemove()){ + this.saveStateAndRedirectLogin(); + }else{ + this.concepts = []; + var token=Session.getUserJwt(); + this._contextService.getConcepts(this.selectedCategoryId, "",true).subscribe( + data => { + + this.concepts =data; + this.addCommunityInConcepts(); + if (this.query !== ""){ + var event = {value: ""}; + event.value = this.query; + // this.filter(event); + } + this.loading = false; + }, + err => { + console.log(err); + this.loading = false; + } + ); + } + }else{ + this.concepts=[]; + this.loading = false; + } + } + displaySubcategory(id) { + if(this.conceptsClassDisplay[id] != null){ + this.conceptsClassDisplay[id] = !this.conceptsClassDisplay[id]; + + }else{ + this.conceptsClassDisplay[id] = true; + } + } + browseConcepts (categoryId) { + if(!Session.isValidAndRemove()){ + this.saveStateAndRedirectLogin(); + }else{ + if(this.conceptsClass[categoryId] != null){ + this.conceptsClassDisplay[categoryId] = !this.conceptsClassDisplay[categoryId]; + return; + }else{ + this.conceptsClassDisplay[categoryId] = true; + } + this.conceptsClass[categoryId] = []; + var token=Session.getUserJwt(); + this.conceptsCategoryLoading[categoryId] = true; + this._contextService.getConcepts(categoryId, "",false).subscribe( + data => { + var concepts = (Array.isArray(data))? data:[data]; + for(var i=0;i { + console.log(err); + this.conceptsCategoryLoading[categoryId] = false; + } + ); + } + + } + communityChanged(){ + console.log(this.selectedCommunityId +" "); + this.warningMessage = ""; + this.infoMessage = ""; + for(var i = 0; i< this.communities.length; i++){ + if(this.communities[i].id==this.selectedCommunityId){ + this.selectedCommunityLabel = this.communities[i].label; + break; + } + } + this.selectedCategoryId = "0"; + this.selectedCategoryLabel="Select Category:"; + this.getCategories(); + } + categoryChanged(){ + this.warningMessage = ""; + this.infoMessage = ""; + for(var i = 0; i< this.categories.length; i++){ + if(this.categories[i].id==this.selectedCategoryId){ + this.selectedCategoryLabel = this.categories[i].label; + break; + } + } + this.getConcepts(); + } +addCommunityInConcepts(){ + this.concepts.push({"id":this.selectedCommunityId, "label":this.selectedCommunityLabel}); + this.autocomplete.updateList(this.concepts); +} +saveStateAndRedirectLogin(){ + if(this.projects != null){ + localStorage.setItem("projects", JSON.stringify(this.projects)); + } + localStorage.setItem("contexts", JSON.stringify(this.selectedList)); + if(this.results != null){ + localStorage.setItem("results", JSON.stringify(this.results)); + } + if(this.inlineEntity != null){ + localStorage.setItem("inlineEntity", JSON.stringify(this.inlineEntity)); + } + + this.router.navigate(['/user-info'], { queryParams: { "errorCode": ErrorCodes.NOT_VALID, "redirectUrl": this.router.url } }); +} +} diff --git a/portal-4cli/src/app/claims/claim-utils/claimContextSearchForm.module.ts b/portal-4cli/src/app/claims/claim-utils/claimContextSearchForm.module.ts new file mode 100644 index 00000000..345d2c93 --- /dev/null +++ b/portal-4cli/src/app/claims/claim-utils/claimContextSearchForm.module.ts @@ -0,0 +1,20 @@ +import { NgModule } from '@angular/core'; + +import { SharedModule } from '../../shared/shared.module'; +import { ClaimContextSearchFormComponent } from './claimContextSearchForm.component'; + import{ContextsServiceModule} from './service/contextsService.module'; + import {StaticAutocompleteModule} from '../../utils/staticAutoComplete/staticAutoComplete.module'; + import { RouterModule } from '@angular/router'; + +@NgModule({ + imports: [ + SharedModule,RouterModule, + ContextsServiceModule, + StaticAutocompleteModule + + ], + declarations: [ + ClaimContextSearchFormComponent + ], exports: [ClaimContextSearchFormComponent ] +}) +export class ClaimContextSearchFormModule { } diff --git a/portal-4cli/src/app/claims/claim-utils/claimEntities.class.ts b/portal-4cli/src/app/claims/claim-utils/claimEntities.class.ts new file mode 100644 index 00000000..7d866cea --- /dev/null +++ b/portal-4cli/src/app/claims/claim-utils/claimEntities.class.ts @@ -0,0 +1,100 @@ +//Classes used in linking / inlinelinking when selecting an entity +export class ClaimResult{ + public id: string; + public type: string; + public source: string; + public title: string; + public url: string; + public result: any; + public accessRights: string = "OPEN"; + public embargoEndDate: string; + public date: string; + public authors: string[] =[]; + public publisher: string; + public description: string; + public resourceType:string; + + public static generateResult(item, itemId,itemSource,itemType, itemUrl, itemTitle, date, accessmode){ + + var result: ClaimResult = new ClaimResult(); + result.id = itemId; + result.type = itemType; + result.source = itemSource; + + result.title = (Array.isArray(itemTitle) && itemTitle.length > 0 )?itemTitle[0]:itemTitle; + result.url = itemUrl; + result.accessRights = 'OPEN'; + result.date = date; + result.result = item; + if(item.publisher){ + result.publisher = item.publisher; + } + + if(itemSource == 'datacite'){ + + result.publisher = item.attributes['container-title']; + if(item.attributes.author){ + result.authors =[] + for(var i=0; i< item.attributes.author.length; i++){ + result.authors.push((item.attributes.author[i].family)?item.attributes.author[i].family+', '+item.attributes.author[i].given:item.attributes.author[i].literal); + } + } + + // result = {id: itemId, type :itemType, source : itemSource, title: itemTitle,url: itemUrl, result: item, accessRights: 'OPEN', embargoEndDate: this.nextDate, date : date}; + }else if (itemSource == 'openaire'){ + //TODO put right access rights + // result = {id:itemId, type :itemType, source : itemSource, title: itemTitle,url: itemUrl, result: item, accessRights: accessMode, embargoEndDate: this.nextDate, date: date}; + // result = {id:itemId, type :itemType, source : itemSource, title: itemTitle,url: itemUrl, result: item, accessRights: accessmode, embargoEndDate: this.nextDate, date : date}; + result.embargoEndDate = accessmode; + + }else if(itemSource == 'crossref'){ + date = (date == null) ? null : date.substring(0,10); + result.date = date; + result.resourceType = item.type; + result.description = item.abstract; + if(item.author){ + result.authors =[] + for(var i=0; i< item.author.length; i++){ + result.authors.push(item.author[i].family +" "+ item.author[i].given ); + } + } + // result = {id: itemId, type :itemType, source : itemSource, title: itemTitle,url: itemUrl, result: item, accessRights: 'OPEN', embargoEndDate: this.nextDate, date: date}; + }else if (itemSource == 'orcid'){ + date = (date == null) ? null : date + "-01.-01" + result.date = date; + if(item['work-type']){ + result.resourceType = item.type; + + } + if(item.contributors){ + result.authors =[] + for(var i=0; i< item.contributors.length; i++){ + result.authors.push(item.contributors[i]); + } + } + + } + return result; + } +} +export class ClaimProject{ + public funderId: string; + public funderName: string; + public projectId: string; + public projectName: string; + public projectAcronym: string; + public startDate: string; + public endDate: string; + public code: string; + public jurisdiction: string; + public fundingLevel0: string; + + +} + +export class ClaimContext{ + public community: string; + public category: string; + public concept:any; + +} diff --git a/portal-4cli/src/app/claims/claim-utils/claimProjectSearchForm.component.ts b/portal-4cli/src/app/claims/claim-utils/claimProjectSearchForm.component.ts new file mode 100644 index 00000000..d6a7c1fb --- /dev/null +++ b/portal-4cli/src/app/claims/claim-utils/claimProjectSearchForm.component.ts @@ -0,0 +1,194 @@ +import {Component, Input,Output, ElementRef, EventEmitter, ViewChild} from '@angular/core'; +import {Observable} from 'rxjs/Observable'; +import {SearchProjectsService} from '../../services/searchProjects.service'; +import {ProjectService} from '../../landingPages/project/project.service'; +// import {ModalLoading} from '../../utils/modal/loading.component'; +import { Subject } from 'rxjs/Subject'; +import {ClaimProject} from './claimEntities.class'; +declare var UIkit:any; +@Component({ + selector: 'claim-projects-search-form', + // styleUrls: ['/autoComplete.component.css'], + + template: ` +
+
+ + +
+ Search for projects +
+ + +
+
+ + + +
+ ` + +}) +export class ClaimProjectsSearchFormComponent { + ngOnInit() { + this.getFunders(); + } + // @ViewChild (ModalLoading) loading : ModalLoading ; + + // @Input() public inline: boolean = false ; // for claimed started from landing pages + public query = ''; + @Input() public selectedProjects=[] ; + public elementRef; + + public funders:string[]; + public selectedFunderId:string ="0"; + selectedFunderName:string ="Select funder:"; + @Output() projectSelected = new EventEmitter(); + + public projects:string[]; + public warningMessage = ""; + public infoMessage = ""; + + // public searchTermStream = new Subject(); + // filtered: Observable<{}> = this.searchTermStream + // .debounceTime(300).distinctUntilChanged() + // .switchMap((term: string) => this._projectService.searchForProjectsObs(term, this.selectedFunderId)); + public tries:number = 0 ; + public keywordlimit = 3; + +constructor(private _service: ProjectService, private _projectService: SearchProjectsService, myElement: ElementRef) { + this.elementRef = myElement; +} + + +// search() { +// console.info("heeere "+this.query ); +// this.infoMessage = ""; +// // this.filtered = []; +// if(this.query == ""){ +// this.tries = 0; +// this.warningMessage = ""; +// } else if(this.query && this.query.length < this.keywordlimit){ +// this.tries++; +// if(this.tries == this.keywordlimit -1 ){ +// this.warningMessage = "Type at least " + this.keywordlimit + " characters"; +// this.tries = 0; +// } +// }else{ +// console.info("doo the search "+this.query ); +// +// this.tries = 0; +// this.warningMessage = ""; +// this.searchTermStream.next(this.query); +// +// } +// +// } +select(item){ + this.query = ""; + // this.searchTermStream.next(this.query); //clear + item = item.value; + var project: ClaimProject = new ClaimProject(); + project.funderId = (this.selectedFunderId=="0")?item.funderId:this.selectedFunderId; + project.funderName = (this.selectedFunderId=="0")?item.funderName:this.selectedFunderName; + project.projectId = item.id; + project.projectName = item.projectName; + project.projectAcronym = item.projectAcronym; + project.startDate = item.startDate; + project.endDate = item.endDate; + project.code = item.code; + project.jurisdiction = item.jurisdiction; + project.fundingLevel0 = item.fundingLevel0; + + console.log(item); + + + // this._service.getProjectDates(project.projectId).subscribe( + // data => { + // project.startDate = data.startDate; + // project.endDate = data.endDate; + // }, + // err => console.log(err) + // ); + var index:number =this.selectedProjects.indexOf(project); + var found:boolean = false; + this.warningMessage = ""; + + for (var _i = 0; _i < this.selectedProjects.length; _i++) { + let item = this.selectedProjects[_i]; + if(item.projectId == project.projectId){ + found=true; + this.warningMessage = "Project already in selected list"; + } + } + + if (!found) { + this.selectedProjects.push(project); + this.projectSelected.emit({ + value: true + }); + UIkit.notification({ + message : 'A new project is selected.', + status : 'info', + timeout : 1000, + pos : 'top-center' + }); + }else{ + UIkit.notification({ + message : 'The project is already on your list.', + status : 'warning', + timeout : 1000, + pos : 'top-center' + }); + } + +} +showItem(item):string{ + return ((item.field[1]['@value'])?item.field[1]['@value']+" - ":"" ) + item.field[3]['@value']; +} +remove(item){ + var index:number =this.selectedProjects.indexOf(item); + if (index > -1) { + this.selectedProjects.splice(index, 1); + } + +} +handleClick(event){ + var clickedComponent = event.target; + var inside = false; + do { + if (clickedComponent === this.elementRef.nativeElement) { + inside = true; + } + clickedComponent = clickedComponent.parentNode; + } while (clickedComponent); + +} +getFunders () { + console.info("Getting Funders...."); + this._projectService.getFunders().subscribe( + data => { + this.funders = data[1]; + console.log("this.funders"); + }, + err => console.log(err) + ); + } + + getProjects () { + if(this.selectedFunderId != '0'){ + + } + } +funderChanged(funderId:string, funderName:string){ + this.selectedFunderId = funderId; + this.selectedFunderName = funderName; + console.info("Selected funder:"+this.selectedFunderId+ ' name:'+funderName ); + +} + +} diff --git a/portal-4cli/src/app/claims/claim-utils/claimProjectSearchForm.module.ts b/portal-4cli/src/app/claims/claim-utils/claimProjectSearchForm.module.ts new file mode 100644 index 00000000..660cb500 --- /dev/null +++ b/portal-4cli/src/app/claims/claim-utils/claimProjectSearchForm.module.ts @@ -0,0 +1,27 @@ +import { NgModule } from '@angular/core'; + +import { SharedModule } from '../../shared/shared.module'; +import { CommonModule } from '@angular/common'; + +import {ClaimProjectsSearchFormComponent} from './claimProjectSearchForm.component'; +// import {LoadingModalModule} from '../../utils/modal/loadingModal.module'; + +import {ProjectServiceModule} from '../../landingPages/project/projectService.module'; +import {ProjectsServiceModule} from '../../services/projectsService.module'; +import {EntitiesAutocompleteModule} from '../../utils/entitiesAutoComplete/entitiesAutoComplete.module'; + + @NgModule({ + imports: [ + SharedModule, CommonModule, + // LoadingModalModule, + ProjectServiceModule, ProjectsServiceModule, EntitiesAutocompleteModule + ], + providers:[ + ], + declarations: [ + ClaimProjectsSearchFormComponent + + ], + exports: [ClaimProjectsSearchFormComponent ] +}) +export class ClaimProjectsSearchFormModule { } diff --git a/portal-4cli/src/app/claims/claim-utils/claimResultSearchForm.component.html b/portal-4cli/src/app/claims/claim-utils/claimResultSearchForm.component.html new file mode 100644 index 00000000..218ea6f3 --- /dev/null +++ b/portal-4cli/src/app/claims/claim-utils/claimResultSearchForm.component.html @@ -0,0 +1,188 @@ +
+
Search for research results
+ + + + + +
+
+ + +
+
+ + + + +
+
+ +
+
+
+
    +
  • +
    + {{item.title}} + {{item.title}} + +
    + + + +
  • +
+
+
+
+
+
+ + + + +
+
+ +
+
+
+
    +
  • +
    + {{result['title'].name}} + {{result['title'].name}} + +
    + + + + +
  • +
+
+
+
+
+
+ + + +
No results found
+ +
+ Results for + {{authorGivenName}} {{authorFamilyName}} - {{authorId}} : + +
Not the author you are looking for? + + + + + + + +
+ + +
+
+ +
+ +
+
+
    +
  • +
    + {{item['work-title']['title'].value}} + +
    + + + +
  • +
+
No results found
+
+
+
+
+
+ + + + +
+
+
+ +
+
+
+
    +
  • +
    + {{item.attributes.title}} + {{item.attributes.title}} + + +
    + + + +
  • +
+ +
+
+
+
+ + + + +
+
+
+ +
+
+
+
    +
  • +
    + {{result['title'].name}} + {{result['title'].name}} + + + +
    + + + + +
  • +
+
+
+
+
diff --git a/portal-4cli/src/app/claims/claim-utils/claimResultSearchForm.component.ts b/portal-4cli/src/app/claims/claim-utils/claimResultSearchForm.component.ts new file mode 100644 index 00000000..26b6cd4d --- /dev/null +++ b/portal-4cli/src/app/claims/claim-utils/claimResultSearchForm.component.ts @@ -0,0 +1,587 @@ +import {Component, Input, Output, EventEmitter} from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import {SearchCrossrefService} from '../claim-utils/service/searchCrossref.service'; +import {SearchOrcidService} from '../claim-utils/service/searchOrcid.service'; +import {SearchPublicationsService} from '../../services/searchPublications.service'; +import { SearchDataciteService } from '../claim-utils/service/searchDatacite.service'; +import {SearchDatasetsService} from '../../services/searchDatasets.service'; + +import { ErrorCodes} from '../../utils/properties/openaireProperties'; +import {ClaimResult} from '../claim-utils/claimEntities.class'; +import{DOI} from '../../utils/string-utils.class'; +declare var UIkit:any; + +@Component({ + selector: 'claim-result-search-form', + templateUrl: 'claimResultSearchForm.component.html', + +}) +export class ClaimResultSearchFormComponent { + constructor (private _searchDataciteService: SearchDataciteService, private _searchDatasetsService:SearchDatasetsService, + private _searchCrossrefService: SearchCrossrefService,private _searchOrcidService: SearchOrcidService, private _searchPublicationsService: SearchPublicationsService, + private route: ActivatedRoute) { + var myDate = new Date(); + this.todayDate = myDate.getFullYear()+ "-" +(myDate.getMonth() + 1) + "-" + myDate.getDate() ; + this.nextDate = (myDate.getFullYear()+100)+ "-" +(myDate.getMonth() + 1) + "-" + myDate.getDate() ; + + } + ngOnInit() { + if(this.keyword !=null && this.keyword.length > 0){ + this.search(false); + } +} + + + page : number = 1; + size:number = 5; + navigateTo: string = "Search"; + source: string = "datacite"; + type : string = "dataset"; + showSearchResults:boolean=false; + // searchType ="publication"; + @Input() public select:boolean = true ; + @Input() public keyword:string = ''; + @Input() public selectedResults:ClaimResult[]; + // @Output() datasetsChange = new EventEmitter(); + // @Output() publicationsChange = new EventEmitter(); + + // @Output() resultsChange = new EventEmitter(); + + public errorCodes:ErrorCodes = new ErrorCodes(); + + dataciteResults=[]; + dataciteResultsNum:number = null; + // dataciteResultsNum : Observable = null; + dataciteStatus = this.errorCodes.NONE; + datacitePage : number = 1; + + openaireData=[]; + openaireDataNum:number = 0 ; + openaireDataStatus = this.errorCodes.NONE; + openaireDataPage : number = 1; + + public warningMessage = ""; + public infoMessage = ""; + + public todayDate = ''; + public nextDate = ''; + public DOIs:string[] = []; + sub: any; + public searchSource:string = "openaire" + public activeTab:string = "openairePub" + + + crossrefResults=[]; + crossrefResultsNum : number = null; + crossrefPage : number = 1; + crossrefStatus:number = this.errorCodes.NONE; + + openairePubs = []; + openairePubsNum: number ; + openairePubsPage : number = 1; + openairePubsStatus:number = this.errorCodes.NONE; + + orcidResults: string[]; + orcidResultsNum: number ; + totalPages: number; + orcidResultsToShow: string[]; + orcidPage : number = 1; + orcidStatus:number = this.errorCodes.NONE; + authorId: string; + selectAuthorId: string = "0"; + authorGivenName: string; + authorFamilyName: string; + + authorIds: string[]; + authorGivenNames: string[]; + authorFamilyNames: string[]; + + authorsNum : number ; + + reloadOpenaire:boolean = true; + reloadCrossref:boolean = false; + reloadDatacite:boolean = false; + reloadOrcid:boolean = false; + + + + + search(sourceChanged){ + this.warningMessage = ""; + this.infoMessage = ""; + if(!sourceChanged){ + this.DOIs = DOI.getDOIsFromString(this.keyword); + this.reloadOpenaire = true; + this.reloadCrossref = true; + this.reloadDatacite = true; + this.reloadOrcid = true; + } + if((this.searchSource == "all" || this.searchSource == "openaire") && this.reloadOpenaire){ + this.searchOpenairePubs(this.keyword, this.size, 1); + this.searchOpenaireData(this.keyword,this.size,1); + this.reloadOpenaire = false; + } + if((this.searchSource == "all" || this.searchSource == "crossref")&&this.reloadCrossref){ + this.getCrossrefResults(this.keyword, this.size,1); + this.reloadCrossref = false; + } + if((this.searchSource == "all" || this.searchSource == "datacite")&& this.reloadDatacite){ + this.searchDatacite(this.keyword,this.size,1); + this.reloadDatacite = false; + } + if((this.searchSource == "all" || this.searchSource == "orcid")&& this.reloadOrcid){ + this.searchOrcid(this.keyword); + this.reloadOrcid = false; + } + this.showSearchResults = true; + + } + +private getCrossrefResults (term: string, size : number, page : number) { + this.crossrefStatus = this.errorCodes.LOADING; + if( this.DOIs.length > 0 ){ + this._searchCrossrefService.searchCrossrefByDOIs(this.DOIs).subscribe( + data => { + if(data != null) { + this.crossrefResults = data.items; + this.crossrefPage=page; + this.crossrefResultsNum = data['total-results']; + if(data.items == 0){ + this._searchCrossrefService.searchCrossrefResults(term, size, page).subscribe( + data => { + if(data != null) { + this.crossrefResults = data.items; + this.crossrefPage=page; + this.crossrefResultsNum = data['total-results']; + this.crossrefStatus = this.errorCodes.DONE; + + }else{ + this.crossrefStatus = this.errorCodes.ERROR; + } + }, + err =>{ + console.log(err.status); + this.crossrefStatus = this.errorCodes.ERROR; + } + + ); + }else{ + this.crossrefStatus = this.errorCodes.DONE; + } + } + }, + err => { + //console.log(err); + this._searchCrossrefService.searchCrossrefResults(term, size, page).subscribe( + data => { + this.crossrefResults = data.items; + this.crossrefPage=page; + this.crossrefResultsNum = data['total-results']; + this.crossrefStatus = this.errorCodes.DONE; + + }, + err => { + console.log(err.status); + this.crossrefStatus = this.errorCodes.ERROR; + } + + ); + } + ); + + }else{ + + + this._searchCrossrefService.searchCrossrefResults(term, size, page).subscribe( + data => { + if(data != null) { + this.crossrefResults = data.items; + this.crossrefPage=page; + this.crossrefResultsNum = data['total-results']; + this.crossrefStatus = this.errorCodes.DONE; + + }else{ + this.crossrefStatus = this.errorCodes.ERROR; + } + + }, + err => { + console.log(err.status); + this.crossrefStatus = this.errorCodes.ERROR; + } + ); + } + } + private searchOpenairePubs(term: string, size : number, page : number) { + + if(this.DOIs.length > 0 ){ + this.openairePubsStatus = this.errorCodes.LOADING; + this._searchPublicationsService.searchPublicationsByDois(this.DOIs, null, page, size, []).subscribe( + data => { + if(data != null) { + this.openairePubsPage=page; + this.openairePubsNum = data[0]; + this.openairePubs = data[1]; + this.openairePubsStatus = this.errorCodes.DONE; + if(this.openairePubsNum == 0){ + this.openairePubsStatus = this.errorCodes.NONE; + } + }else { + this.openairePubsStatus = this.errorCodes.ERROR; + } + }, + err => { + this.openairePubsStatus = this.errorCodes.ERROR; + console.log(err.status); + } + ); + }else{ + this.openairePubsStatus = this.errorCodes.LOADING; + this._searchPublicationsService.searchPublications('q='+term, null, page, size, []).subscribe( + data => { + if(data != null) { + this.openairePubsPage=page; + this.openairePubsNum = data[0]; + this.openairePubs = data[1]; + this.openairePubsStatus = this.errorCodes.DONE; + if(this.openairePubsNum == 0){ + this.openairePubsStatus = this.errorCodes.NONE; + } + }else { + this.openairePubsStatus = this.errorCodes.ERROR; + } + }, + err => { + this.openairePubsStatus = this.errorCodes.ERROR; + console.log(err.status); + } + ); + } + } + + private searchOrcid (term: string) { + if(this.DOIs.length > 0){ + this.orcidStatus = this.errorCodes.NONE; + return; + } + this.orcidStatus = this.errorCodes.LOADING; + this.authorIds = new Array(); + this.authorGivenNames = new Array(); + this.authorFamilyNames = new Array(); + + this.getOrcidAuthor(term); + + console.info('searchOrcid in searchOrcid file'); + } + + private readData(data: any) { + this.authorIds.push(data[2].path); + + if(data[0] != null) { + this.authorGivenNames.push(data[0].value); + } else { + this.authorGivenNames.push(""); + } + if(data[1] != null) { + this.authorFamilyNames.push(data[1].value); + } else { + this.authorFamilyNames.push(""); + } + } + + private getOrcidAuthor (term: string) { + this.orcidResultsNum = null; + + //passing structures in order to fill them in service + this._searchOrcidService.searchOrcidAuthor(term, this.authorIds, + this.authorGivenNames, this.authorFamilyNames).subscribe( + data => { + if(data != null && data == true) { + this.getOrcidResultsByIndex(0); + } + + this.orcidStatus = this.errorCodes.NONE; + + }, + err => this.errorHandler(err, term) + + ); + } + + private errorHandler(err: any, term: string) { + if(err.status == 404){ + this.getOrcidAuthors(term); + } else { + this.orcidStatus = this.errorCodes.ERROR; + console.log(err.status); + + } + } + + private getOrcidAuthors (term: string) { + this.orcidResultsNum = null; + this.selectAuthorId = "0"; + this.orcidStatus = this.errorCodes.LOADING; + //passing structures in order to fill them in service + this._searchOrcidService.searchOrcidAuthors(term, this.authorIds, + this.authorGivenNames, this.authorFamilyNames).subscribe( + data => { + if(data != null && data == true) { + this.getOrcidResultsByIndex(0); + }else{ + this.orcidStatus = this.errorCodes.ERROR; + } + + }, + err => { + this.orcidStatus = this.errorCodes.ERROR; + console.log(err.status); + } + ); + } + + + private getOrcidResultsByIndex (index:number) { + if(this.authorIds.length > index) { + this.orcidStatus = this.errorCodes.LOADING; + let id = this.authorIds[index]; + this.authorGivenName = this.authorGivenNames[index]; + this.authorFamilyName = this.authorFamilyNames[index]; + this.getOrcidResultsById(id); + } + } + private getOrcidResultsById (id:string) { + if(id=="0"){ + return; + } + var index = this.authorIds.indexOf(id); + this.authorGivenName = this.authorGivenNames[index]; + this.authorFamilyName = this.authorFamilyNames[index]; + this.authorId = id; + console.info("getOrcidResultsById: "+id); + this.orcidStatus = this.errorCodes.LOADING; + this._searchOrcidService.searchOrcidPublications(id).subscribe( + data => { + if(data != null) { + this.orcidResults=data['orcid-work']; + this.orcidResultsNum = data['orcid-work'].length; + this.orcidPage = 1; + if((this.orcidResultsNum % this.size) == 0){ + this.totalPages=parseInt(''+(this.orcidResultsNum/this.size)); + } else{ + this.totalPages=parseInt(''+(this.orcidResultsNum/this.size+1)); + } + + this.orcidResultsToShow = this.orcidResults.slice(0,10); + + this.orcidStatus = this.errorCodes.DONE; + if(this.orcidResultsNum == 0){ + this.orcidStatus = this.errorCodes.NONE; + } + } else { + this.orcidResultsNum = 0; + this.totalPages=0; + this.orcidStatus = this.errorCodes.NONE; + } + + }, + err => { + console.log(err.status); + this.orcidStatus = this.errorCodes.ERROR; + } + ); + + + } + +/* +Is it USED??? +private remove(item){ + this.warningMessage = ""; + this.infoMessage = ""; + var index:number =this.selectedResults.indexOf(item); + item.selected=false; + if (index > -1) { + this.selectedResults.splice(index, 1); + // this.publicationsChange.emit({ + // value: this.selectedResults + // }); + } + + }*/ +private crossrefPageChange($event) { + this.crossrefPage=$event.value; + this.crossrefResults=[]; + console.log("Crossref chaenged "+this.crossrefPage); + this.getCrossrefResults(this.keyword,this.size,this.crossrefPage); +} +private orcidPageChange($event) { + this.orcidPage=$event.value; + this.orcidResultsToShow=[]; + this.orcidResultsToShow = this.orcidResults.slice(($event.value-1)*this.size, $event.value*this.size); +} +private openairePubsPageChange($event) { + this.openairePubsPage=$event.value; + this.searchOpenairePubs(this.keyword,this.size,this.openairePubsPage); +} +datacitePageChange($event) { + this.datacitePage=$event.value; + this.dataciteResults=[]; + this.searchDatacite(this.keyword,10,this.datacitePage); + this.warningMessage = ""; + this.infoMessage = ""; + +} +openaireDataPageChange($event) { + this.openaireDataPage=$event.value; + this.openaireData=[]; + this.searchOpenaireData(this.keyword,10,this.openaireDataPage); + this.warningMessage = ""; + this.infoMessage = ""; + +} + + + private isSelected(id:string){ + + var found:boolean = false; + this.warningMessage = ""; + for (var _i = 0; _i < this.selectedResults.length; _i++) { + let item = this.selectedResults[_i]; + if(item.id == id){ + found=true; + this.warningMessage = "Publication already in selected list"; + } + } + return found; + + + } + // isSelected(id:string){ + // + // var found:boolean = false; + // this.warningMessage = ""; + // for (var _i = 0; _i < this.selectedResults.length; _i++) { + // let item = this.selectedResults[_i]; + // if(item.id == id){ + // found=true; + // break; + // } + // } + // return found; + // } + private searchDatacite (term: string, size : number, page : number) { + this.getDataciteResults(term,size,page); + this.warningMessage = ""; + this.infoMessage = ""; + + } + private searchOpenaireData (term: string, size : number, page : number) { + if(this.DOIs.length > 0 ){ + this.openaireDataStatus = this.errorCodes.LOADING; + this._searchDatasetsService.searchDatasetsByDois(this.DOIs, null, page, size, []).subscribe( + data => { + if(data != null) { + this.openaireDataPage=page; + this.openaireDataNum = data[0]; + this.openaireData = data[1]; + this.openaireDataStatus = this.errorCodes.DONE; + if(this.openaireDataNum == 0){ + this.openaireDataStatus = this.errorCodes.NONE; + } + } + }, + err => { + this.openaireDataStatus = this.errorCodes.ERROR; + console.log(err.status); + } + ); + }else{ + this._searchDatasetsService.searchDatasets('q='+term+'', null, page, size, []).subscribe( + data => { + if(data != null) { + this.openaireDataPage=page; + this.openaireDataNum = data[0]; + this.openaireData = data[1]; + this.openaireDataStatus = this.errorCodes.DONE; + if(this.openaireDataNum == 0){ + this.openaireDataStatus = this.errorCodes.NONE; + } + } + }, + err => { + this.openaireDataStatus = this.errorCodes.ERROR; + console.log(err.status); + } + ); + } + this.warningMessage = ""; + this.infoMessage = ""; + + } + private getDataciteResults (term: string, size : number, page : number) { + this._searchDataciteService.searchDataciteResults(term, size, page).subscribe( + data => { + this.dataciteResults = data.data; + this.datacitePage=page; + this.dataciteResultsNum = data.meta.total; + this.dataciteStatus = this.errorCodes.DONE; + + + }, + err => { + this.dataciteStatus = this.errorCodes.ERROR; + console.log(err); + } + + ); + } + + add(item, itemId,itemSource,itemType, itemUrl, itemTitle, date, accessmode){ + + console.log(' adding ' + itemType + " From " + itemSource+" "+ itemTitle); + var result: ClaimResult = ClaimResult.generateResult(item, itemId,itemSource,itemType, itemUrl, itemTitle, date, accessmode); + + + if (itemSource == 'orcid'){ + if(result.authors.length ==0 ){ + result.authors.push(this.authorGivenName + ', '+ this.authorFamilyName); + } + } + var found:boolean = this.isSelected( result.id); + + this.warningMessage = ""; + if (!found) { + this.selectedResults.push(result); + + UIkit.notification({ + message : 'A new research result is selected.', + status : 'info', + timeout : 1000, + pos : 'top-center' + }); + + + }else{ + this.warningMessage = "Research Data already in selected list"; + UIkit.notification({ + message : 'The research result is already on your list.', + status : 'warning', + timeout : 1000, + pos : 'top-center' + }); + } + + } + + public searchSourceChanged(source){ + this.searchSource = source; + this.activeTab = (source == "openaire" || source == "all")?"openairePub":source; + if(this.keyword && this.keyword.length > 0){ + this.search(true); + } + } + public clickTab(tab){ + this.activeTab = tab; + } +} diff --git a/portal-4cli/src/app/claims/claim-utils/claimResultSearchForm.module.ts b/portal-4cli/src/app/claims/claim-utils/claimResultSearchForm.module.ts new file mode 100644 index 00000000..201c91b2 --- /dev/null +++ b/portal-4cli/src/app/claims/claim-utils/claimResultSearchForm.module.ts @@ -0,0 +1,29 @@ +import { NgModule } from '@angular/core'; + +import { SharedModule } from '../../shared/shared.module'; +import { CommonModule } from '@angular/common'; +import {ClaimResultSearchFormComponent} from './claimResultSearchForm.component'; + +import {SearchDataciteServiceModule} from './service/searchDataciteService.module'; + +import {SearchCrossrefServiceModule} from './service/searchCrossrefService.module'; +import {SearchOrcidService} from './service/searchOrcid.service'; + +import {PublicationsServiceModule} from '../../services/publicationsService.module'; +import {DatasetsServiceModule} from '../../services/datasetsService.module'; +import {PagingModule } from '../../utils/paging.module'; + + @NgModule({ + imports: [ + SharedModule, CommonModule, PublicationsServiceModule, DatasetsServiceModule, PagingModule, SearchCrossrefServiceModule, SearchDataciteServiceModule + ], + providers:[ + SearchOrcidService + ], + declarations: [ + ClaimResultSearchFormComponent + + ], + exports: [ClaimResultSearchFormComponent ] +}) +export class ClaimResultSearchFormModule { } diff --git a/portal-4cli/src/app/claims/claim-utils/displayClaims/displayClaims.component.html b/portal-4cli/src/app/claims/claim-utils/displayClaims/displayClaims.component.html new file mode 100644 index 00000000..7a64cc39 --- /dev/null +++ b/portal-4cli/src/app/claims/claim-utils/displayClaims/displayClaims.component.html @@ -0,0 +1,110 @@ + +
+ +
+
+ +
+
+ + +
+ Filter By: +
+
+ + + + +
+ +
+
+ +
+ +
+ +
+ Show + + + Showing {{(size*page - size +1)}} to {{(size*page>resultsNum)?resultsNum:(size*page)}} of {{resultsNum}} claims + +
+
+ + +
+ An Error occured. +
+
+ You are not allowed to access this page. +
+
+ User session is not valid. Please login again. +
+ + + +
+
+
+ You have selected {{selected.length}} claim(s) +
+
+
+ +
+ +
+
+ + +
+
No entries found.
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + +
Research Result Link to Claimed by Claimed Date
{{claim.userMail}}{{claim.date}}
+
+ +
+ + + + diff --git a/portal-4cli/src/app/claims/claim-utils/displayClaims/displayClaims.component.ts b/portal-4cli/src/app/claims/claim-utils/displayClaims/displayClaims.component.ts new file mode 100644 index 00000000..26cacfb7 --- /dev/null +++ b/portal-4cli/src/app/claims/claim-utils/displayClaims/displayClaims.component.ts @@ -0,0 +1,486 @@ +import {Component, ViewChild, Input} from '@angular/core'; +import {Location} from '@angular/common'; +import {Observable} from 'rxjs/Observable'; +import {ActivatedRoute, Router} from '@angular/router'; +import {ClaimsService} from '../service/claims.service'; +import {ModalLoading} from '../../../utils/modal/loading.component'; +import {AlertModal} from '../../../utils/modal/alert'; +import {Session} from '../../../login/utils/helper.class'; + + +@Component({ + selector: 'displayClaims', + templateUrl: 'displayClaims.component.html', + providers:[ ClaimsService] + +}) +export class DisplayClaimsComponent { + constructor (private _claimService: ClaimsService, private route: ActivatedRoute, private _router:Router, private location: Location) { + } + + ngOnInit() { + this.sub = this.route.queryParams.subscribe(params => { + if( this.myClaims){ + this.fetchBy = "User"; + this.fetchId = Session.getUserEmail(); + }else{ + + this.fetchBy = params['fetchBy']; + this.fetchBy = (this.types.indexOf(this.fetchBy) != -1)? this.fetchBy:'All'; + this.fetchId = params['fetchId']; + this.fetchId = this.fetchId?this.fetchId:''; + + } + + let page = (params['page']=== undefined)?1:+params['page']; + let size = (params['size']=== undefined)?10:+params['size']; + + this.keyword = (params['keyword']?params['keyword']:""); + this.inputkeyword = this.keyword; + this.page = ( page <= 0 ) ? 1 : page; + this.size = ( size <= 0 ) ? 10 : size; + this.entityTypes = []//(params['types']?params['types']:[]); + this.setTypes(params['types']); // check the appropriate checkboxes + this.setSortby(params['sort']); + this.getClaims(); + + }); + + } + ngOnDestroy() { + this.sub.unsubscribe(); + } + sub: any; + //string because comes as input from component directive + @Input() enableDelete: boolean = false; + @Input() showUserEmail: boolean = true; + @Input() myClaims: boolean= false ; + @Input() isAdmin:boolean = false; + page : number; + size:number; + sizes = [10,20,30,50]; + keyword:string; // the keyword string to give to the request as parameter + inputkeyword:string; // the string written in the input field (keyword=inputkeyword when its length is bigger than 3 and the user stops typing) + lengths = [10,20,30,50]; + types = ["All","Project","Context","Result","User"]; + @Input() fetchBy:string; + @Input() fetchId:string; + + navigateTo: string = "Claims"; + resultsNum: number ; + claims: string[]; + + @ViewChild (ModalLoading) loading : ModalLoading ; + + //checkboxes: + publicationCB = false; + datasetCB = false; + contextCB = false; + projectCB = false; + entityTypes : string[] =[] ; + + descending = true; + sortby = "date"; + + selected=[]; + deleteMessage:string = ""; + showErrorMessage:boolean = false; + showForbiddenMessage:boolean = false; + userValidMessage:string = ""; + + //params for pagingFormatter to use when navigate to page + params; + @ViewChild(AlertModal) alert; + + claimsDeleted:number = 0; + + getClaims () { + if(!Session.isValidAndRemove()){ + this.userValidMessage = "User session has expired. Please login again."; + + }else{ + var token=Session.getUserJwt(); + this.selected=[]; + var types = ''; + this.showErrorMessage = false; + this.showForbiddenMessage = false; + for (var type of this.entityTypes){ + types+=(types.length>0?'&':'')+"types="+type; + } + if(this.fetchBy =="Project" ){ + this._claimService.getClaimsByProject(this.size,this.page,this.fetchId,this.keyword,this.sortby,this.descending, types).subscribe( + data => { + this.claims = data.data; + this.resultsNum= data.total; + }, + err => { + this.handleErrors(err); + } + ); + }else if(this.fetchBy =="User"){ + this._claimService.getClaimsByUser(this.size,this.page,this.fetchId,this.keyword,this.sortby,this.descending, types).subscribe( + data => { + this.claims = data.data; + this.resultsNum= data.total; + }, + err => { + this.handleErrors(err); + } + ); + }else if(this.fetchBy =="Result"){ + this._claimService.getClaimsByResult(this.size,this.page,this.fetchId,this.keyword,this.sortby,this.descending, types).subscribe( + data => { + this.claims = data.data; + this.resultsNum= data.total; + }, + err => { + this.handleErrors(err); + } + ); + }else if(this.fetchBy =="Context"){ + this._claimService.getClaimsBycontext(this.size,this.page,this.fetchId,this.keyword,this.sortby,this.descending, types).subscribe( + data => { + this.claims = data.data; + this.resultsNum= null; + this.resultsNum= data.total;//data.length; //TODO get the total results num + }, + err => { + this.handleErrors(err); + } + ); + }else{ + this._claimService.getClaims(this.size,this.page,this.keyword,this.sortby,this.descending, types).subscribe( + data => { + this.claims = data.data; + this.resultsNum = null; + this.resultsNum= data.total;//data.length; //TODO get the total results num + }, + err => { + this.handleErrors(err); + } + ); + } + } +} +handleErrors(err){ + + this.showErrorMessage = true; + try{ + var error = err.json() + var code = error.code; + if(code == 403){ + this.showErrorMessage = false; + this.showForbiddenMessage = true; + } + }catch (e) { + console.log("Couldn't parse answer as json") + this.showErrorMessage = true; + } + +} + + goTo(page:number = 1){ + + this.page = page; + + this.location.go(location.pathname,this.getParametersString()); + this.getClaims(); + } + getParameters(){ + var params = {} + if(this.myClaims){ + params={ page: this.page, size: this.size, types: this.entityTypes, keyword : this.keyword, sort: this.getSortby() }; + }else{ + params={ page: this.page, size: this.size, types: this.entityTypes, fetchBy: this.fetchBy, fetchId:this.fetchId, keyword : this.keyword, sort: this.getSortby() }; + } + return params; + } + + getParametersString(){ + var params=''; + params+=(this.page==1?"":(params.length>0?'&':'')+"page="+this.page); + params+=(this.size==10?"":(params.length>0?'&':'')+"size="+this.size); + // params+=(this.entityTypes==''?"":(params.length>0?'&':'')+"types="+this.entityTypes); + var types=""; + for (var type of this.entityTypes){ + types+=(types.length>0?',':'')+type; + } + params+=(types.length>0)?"types="+types:""; + + if(this.isAdmin ){ + params+=(this.fetchBy=='All'?"":(params.length>0?'&':'')+"fetchBy="+this.fetchBy); + params+=(this.fetchId==''?"":(params.length>0?'&':'')+"fetchId="+this.fetchId); + } + params+=(this. getSortby()=='datedesc'?"":(params.length>0?'&':'')+"sort="+this. getSortby()); + params+=(this.keyword==''?"":(params.length>0?'&':'')+"keyword="+this.keyword); + return params; + } + changeSize(size: number ){ + this.goTo(); + } + + clearFilters(){ + this.keyword = ''; + this.inputkeyword = ''; + this.publicationCB = false; + this.projectCB = false; + this.datasetCB = false; + this.contextCB = false; + this.entityTypes = []; + this.goTo(); + } + + changeOrderby(sortby:string){ + if(sortby==this.sortby){ + this.descending = !this.descending; + }else{ + this.sortby = sortby; + this.descending = false; + } + this.goTo(); + } + setSortby(sortby:string){ + if(!sortby|| sortby == "datedesc"){ + this.descending = true; + this.sortby = "date"; + }else if(sortby == "dateasc"){ + this.descending = false; + this.sortby = "date"; + }else if(sortby == "userasc"){ + this.descending = false; + this.sortby = "user"; + }else if(sortby == "userdesc"){ + this.descending = true; + this.sortby = "user"; + }if(sortby =="sourceasc"){ + this.descending = false; + this.sortby = "source"; + }else if(sortby == "sourcedesc"){ + this.descending = true; + this.sortby = "source"; + }else if(sortby == "targetasc"){ + this.descending = false; + this.sortby = "target"; + }else if(sortby == "targetdesc"){ + this.descending = true; + this.sortby = "target"; + } + } + getSortby():string{ + if(this.descending){ + return this.sortby+"desc"; + }else{ + return this.sortby+"asc"; + } + + } + changeType(){ + this.entityTypes = []; + if(this.publicationCB){ + this.entityTypes.push('publication'); + } + if(this.datasetCB){ + this.entityTypes.push('dataset'); + } + if(this.projectCB){ + this.entityTypes.push('project'); + } + if(this.contextCB){ + this.entityTypes.push('context'); + } + + this.goTo(); + } + setTypes(types:string){ + if(!types){ + return; + } + if(types.length > 0){ + this.entityTypes = []; + if(types.indexOf("publication")!=-1){ + this.publicationCB = true; + this.entityTypes.push("publication"); + } + if(types.indexOf("dataset")!=-1){ + this.datasetCB = true; + this.entityTypes.push("dataset"); + } + if(types.indexOf("project")!=-1){ + this.projectCB = true; + this.entityTypes.push("project"); + } + if(types.indexOf("context")!=-1){ + this.contextCB = true; + this.entityTypes.push("context"); + } + } + if(this.publicationCB && this.datasetCB && this.contextCB && this.projectCB){ + this.entityTypes=[]; + } + } + changekeyword(){ + + if(this.inputkeyword.length >= 3 || this.inputkeyword.length == 0 ){ + this.keyword = this.inputkeyword; + this.page = 1; + this.goTo(); + } + + } + select(item:any,event){ + this.deleteMessage=""; + var value = event.currentTarget.checked; + if(value){ + this.selected.push(item); + }else{ + for (var _i = 0; _i < this.selected.length; _i++) { + let claim = this.selected[_i]; + if(claim['id'] == item.id){ + this.selected.splice(_i, 1); + } + } + + + } + } + selectAll(event){ + var value = event.currentTarget.checked; + if(value){ + this.selected = []; + for (var _i = 0; _i < this.claims.length; _i++) { + let claim = this.claims[_i]; + this.selected.push(claim); + } + this.deleteMessage = ""; + }else{ + this.selected = []; + this.deleteMessage=""; + } + } + + isSelected(id:string){ + for (var _i = 0; _i < this.selected.length; _i++) { + let claim = this.selected[_i]; + if(claim['id'] == id){ + return true; + } + } + return false; + } + + + confirmOpen(){ + if(this.selected.length <= 0){ + + }else{ + this.alert.cancelButton = true; + this.alert.okButton = true; + this.alert.alertTitle = "Delete "+this.selected.length+" claim(s)"; + this.alert.message = this.selected.length+" claims will be deleted. Do you want to proceed? "; + this.alert.okButtonText = "Yes"; + this.alert.cancelButtonText = "No"; + this.alert.open(); + } + } + confirmClose(data){ + this.delete(); + } + delete(){ + this.deleteMessage=""; + this.loading.open(); + this.claimsDeleted = 0; + var ids = []; + for (var i = 0; i < this.selected.length; i++){ + var id =this.selected[i].id; + ids.push(id); + // var selected =this.selected[i].id; + // console.warn("Deleting claim with id:"+id); + // this.deleteById(id); + //TODO for multiple concurrent + } + this.batchDeleteById(ids); + } + + deleteById(id:string){ + if(!Session.isValidAndRemove()){ + this.userValidMessage = "User session has expired. Please login again."; + + }else{ + var token=Session.getUserJwt(); + console.log("Deleting claim with id:"+id); + // this._claimService.deleteClaimById(id); + this._claimService.deleteClaimById(id).subscribe( + res => { + console.log('Delete response'+res.code ); + console.log("Deleted claim with id:"+ id); + //remove this claim from the + let newClaims=this.claims; + for (var _i = 0; _i < this.claims.length; _i++) { + let claim = this.claims[_i]; + if(claim['id'] == id){ + newClaims.splice(_i, 1); + } + } + //TODO should call getClaims??? + this.claimsDeleted++; + this.claims = newClaims; + if(this.claimsDeleted == this.selected.length){ + this.resultsNum = this.resultsNum - this.selected.length; + this.loading.close(); + this.selected = []; + } + + + }); + } + } + batchDeleteById(ids:string[]){ + if(!Session.isValidAndRemove()){ + this.userValidMessage = "User session has expired. Please login again."; + + }else{ + var token=Session.getUserJwt(); + console.warn("Deleting claim with ids:"+ids); + this._claimService.deleteBulk(ids).subscribe( + res => { + console.info('Delete response'+res.code ); + console.warn("Deleted ids:"+ res.deletedIds); + console.warn("Not found ids:"+ res.notFoundIds); + //remove this claim from the + let newClaims=this.claims; + for(var id of res.deletedIds){ + for (var _i = 0; _i < this.claims.length; _i++) { + let claim = this.claims[_i]; + if(claim['id'] == id){ + newClaims.splice(_i, 1); + } + } + for (var _i = 0; _i < this.selected.length; _i++) { + let claim = this.selected[_i]; + if(claim['id'] == id){ + this.selected.splice(_i, 1); + } + } + } + this.claims = newClaims; + this.resultsNum = this.resultsNum - res.deletedIds.length; + this.loading.close(); + if(res.deletedIds.length>0){ + this.deleteMessage=this.deleteMessage+'
'+res.deletedIds.length+' claim(s) successfully deleted.
'; + } + if(res.notFoundIds.length>0){ + this.deleteMessage=this.deleteMessage+'
'+res.notFoundIds.length+' claim(s) couldn\'t be deleted.
'; + } + }, err => { + console.log(err); + this.showErrorMessage = true; + this.loading.close(); + + }); + } + } + pageChange($event) { + var page:number = +$event.value + this.goTo(page); + } +} diff --git a/portal-4cli/src/app/claims/claim-utils/displayClaims/displayClaims.module.ts b/portal-4cli/src/app/claims/claim-utils/displayClaims/displayClaims.module.ts new file mode 100644 index 00000000..4c8e0bb0 --- /dev/null +++ b/portal-4cli/src/app/claims/claim-utils/displayClaims/displayClaims.module.ts @@ -0,0 +1,26 @@ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import {ClaimServiceModule} from '../service/claimsService.module'; +import {DisplayClaimsComponent} from './displayClaims.component'; +import {LoadingModalModule} from '../../../utils/modal/loadingModal.module'; +import {AlertModalModule} from '../../../utils/modal/alertModal.module'; +import {ClaimEntityFormatterModule} from '../entityFormatter/claimEntityFormatter.module'; +import {PagingModule } from '../../../utils/paging.module'; +import {HelperModule} from '../../../utils/helper/helper.module'; + + @NgModule({ + imports: [ + CommonModule, FormsModule, ClaimServiceModule, LoadingModalModule, AlertModalModule, +ClaimEntityFormatterModule, PagingModule, HelperModule + + ], + declarations: [ + DisplayClaimsComponent + + ], + exports: [ + DisplayClaimsComponent + ] +}) +export class DisplayClaimsModule { } diff --git a/portal-4cli/src/app/claims/claim-utils/entityFormatter/claimEntityFormatter.component.ts b/portal-4cli/src/app/claims/claim-utils/entityFormatter/claimEntityFormatter.component.ts new file mode 100644 index 00000000..5055b32f --- /dev/null +++ b/portal-4cli/src/app/claims/claim-utils/entityFormatter/claimEntityFormatter.component.ts @@ -0,0 +1,39 @@ +import {Component, Input} from '@angular/core'; + +//Usage Example " " + +//externalUrl +@Component({ + selector: 'claim-entity', + template: ` +
+ + +
+
+ + +
+
+ + +
+
+ + {{entity.title}} +
+ ` +}) + +export class ClaimEntityFormatter { + @Input() entity: string[]; + @Input() type: string; + + constructor () {} + + ngOnInit() { + + } + + +} diff --git a/portal-4cli/src/app/claims/claim-utils/entityFormatter/claimEntityFormatter.module.ts b/portal-4cli/src/app/claims/claim-utils/entityFormatter/claimEntityFormatter.module.ts new file mode 100644 index 00000000..01a1d0ac --- /dev/null +++ b/portal-4cli/src/app/claims/claim-utils/entityFormatter/claimEntityFormatter.module.ts @@ -0,0 +1,24 @@ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { RouterModule } from '@angular/router'; + +import {ProjectTitleFormatter} from './projectTitleFormatter.component'; +import {PublicationTitleFormatter} from './publicationTitleFormatter.component'; +import {ClaimEntityFormatter} from './claimEntityFormatter.component'; + + @NgModule({ + imports: [ + CommonModule, RouterModule + ], + declarations: [ + ProjectTitleFormatter, PublicationTitleFormatter, ClaimEntityFormatter + + ], + providers: [ ], + exports: [ + ProjectTitleFormatter, PublicationTitleFormatter, ClaimEntityFormatter + + ] +}) +export class ClaimEntityFormatterModule { } diff --git a/portal-4cli/src/app/claims/claim-utils/entityFormatter/projectTitleFormatter.component.ts b/portal-4cli/src/app/claims/claim-utils/entityFormatter/projectTitleFormatter.component.ts new file mode 100644 index 00000000..b1b95aa1 --- /dev/null +++ b/portal-4cli/src/app/claims/claim-utils/entityFormatter/projectTitleFormatter.component.ts @@ -0,0 +1,25 @@ +import {Component, Input} from '@angular/core'; +import {OpenaireProperties} from '../../../utils/properties/openaireProperties'; +import {RouterHelper} from '../../../utils/routerHelper.class'; + +//Usage Example " " + +@Component({ + selector: 'project-title', + template: ` + + {{project['name']}} ({{project['funderName']}}) + + ` +}) + +export class ProjectTitleFormatter { + @Input() project: string[]; + public url:string; + public routerHelper:RouterHelper = new RouterHelper(); + constructor () {} + + ngOnInit() { + this.url = OpenaireProperties.getsearchLinkToProject() + "?projectId=" + this.project["openaireId"]; + } +} diff --git a/portal-4cli/src/app/claims/claim-utils/entityFormatter/publicationTitleFormatter.component.ts b/portal-4cli/src/app/claims/claim-utils/entityFormatter/publicationTitleFormatter.component.ts new file mode 100644 index 00000000..321e440d --- /dev/null +++ b/portal-4cli/src/app/claims/claim-utils/entityFormatter/publicationTitleFormatter.component.ts @@ -0,0 +1,26 @@ +import {Component, Input} from '@angular/core'; + +//Usage Example " " + +@Component({ + selector: 'publication-title', + template: ` + + {{title}} + {{title}} + + ` +}) + +export class PublicationTitleFormatter { + @Input() title: string[]; + @Input() url: string[]; + + constructor () {} + + ngOnInit() { + + } + + +} diff --git a/portal-4cli/src/app/claims/claim-utils/service/claims.service.ts b/portal-4cli/src/app/claims/claim-utils/service/claims.service.ts new file mode 100644 index 00000000..58ce364c --- /dev/null +++ b/portal-4cli/src/app/claims/claim-utils/service/claims.service.ts @@ -0,0 +1,148 @@ +import {Injectable} from '@angular/core'; +import {URLSearchParams } from '@angular/http'; +import {Http, Response} from '@angular/http'; +import {Observable} from 'rxjs/Observable'; +// import {Claim} from '../claim'; +import {OpenaireProperties} from '../../../utils/properties/openaireProperties'; +import 'rxjs/add/observable/of'; +import 'rxjs/add/operator/do'; +import 'rxjs/add/operator/share'; +import { } from '../../../shared/cache.service'; +import { CustomOptions } from './customOptions.class'; +@Injectable() +export class ClaimsService { + private baseUrl; + constructor(private http: Http ) { + this.baseUrl = OpenaireProperties.getClaimsAPIURL(); + } + + private getClaimRequest(size : number, page : number, url :string, fromCache:boolean):any { + console.info('ClaimsService: Claims request: '+url); + let key = url; + return this.http.get((fromCache && OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url, CustomOptions.getAuthOptions()) + .map(request => request.json()) + .do(request => console.info("Get claims: offset = "+(size*(page-1)) + " limit ="+size )) + .catch(this.handleError); + } + getClaims( size : number, page : number, keyword:string, sortby: string, descending: boolean, types: string):any { + console.info('ClaimsService: getClaims ' ); + console.info('ClaimsService: Types : '+types ); + let url = this.baseUrl +"claims"+"?offset="+(size*(page-1) + "&limit="+size)+"&keyword="+keyword+"&sortby="+sortby+"&descending="+descending+"&"+types; + return this.getClaimRequest(size,page,url,true); + + } + getClaimsByUser( size : number, page : number, user:string, keyword:string, sortby: string, descending: boolean, types: string):any { + console.info('ClaimsService: getClaims for user : '+user); + let url = this.baseUrl +"users/claims"+"?offset="+(size*(page-1) + "&limit="+size)+"&keyword="+keyword+"&sortby="+sortby+"&descending="+descending+"&"+types; + return this.getClaimRequest(size,page,url,false); + + } + getClaimsBycontext( size : number, page : number, contextId:string, keyword:string, sortby: string, descending: boolean, types: string ):any { + console.info('ClaimsService: getClaims for context : '+contextId); + let url = this.baseUrl +"contexts/"+contextId+"/claims"+"?offset="+(size*(page-1) + "&limit="+size)+"&keyword="+keyword+"&sortby="+sortby+"&descending="+descending+"&"+types; + return this.getClaimRequest(size,page,url,true); + + } + getClaimsByResult( size : number, page : number, resultId:string, keyword:string, sortby: string, descending: boolean, types: string ):any { + console.info('ClaimsService: getClaims for result : '+resultId); + let url = this.baseUrl +"results/"+resultId+"/claims"+"?offset="+(size*(page-1) + "&limit="+size)+"&keyword="+keyword+"&sortby="+sortby+"&descending="+descending+"&"+types; + return this.getClaimRequest(size,page,url,true); + + } + getClaimsByProject( size : number, page : number, projectId:string, keyword:string, sortby: string, descending: boolean, types: string ):any { + console.info('ClaimsService: getClaims for project : '+projectId); + let url = this.baseUrl +"projects/"+projectId+"/claims"+"?offset="+(size*(page-1) + "&limit="+size)+"&keyword="+keyword+"&sortby="+sortby+"&descending="+descending+"&"+types; + return this.getClaimRequest(size,page,url,true); + } + + deleteClaimById(claimId:string ):any{ + console.warn('Trying to delete claim with id : '+claimId); + let url = this.baseUrl +"claims/"+claimId; + // let headers = new Headers({ 'Content-Type': 'application/json' }); + // let options = new RequestOptions({ headers: headers }); + return this.http.delete( url, CustomOptions.getAuthOptionsWithBody()).map(request => request.json()) + // .do(request => console.info("After delete" )) + .catch(this.handleError); + + } + deleteBulk(claimIds:string[]):any{ + + console.warn('Trying to delete claims with ids : '+claimIds); + var url = ""; + + for(var claimId of claimIds){ + url=url+(url.length >0 ?"&":"")+"claimId="+claimId; + } + url= this.baseUrl +"claims/bulk?"+url; + + // let headers = new Headers({ 'Content-Type': 'application/json' }); + // let options = new RequestOptions({ headers: headers }); + return this.http.delete( url, CustomOptions.getAuthOptions()).map(request => request.json()) + // .do(request => console.info("After delete" )) + .catch(this.handleError); + + } + insertBulkClaims(claims):any{ + console.warn('Trying toinsert claims : '+claims); + let url = this.baseUrl +"claims/bulk"; + let body = JSON.stringify( claims ); + console.warn('Json body: : '+body); + // let headers = new Headers({ 'Content-Type': 'application/json' }); + // let options = new RequestOptions({ headers: headers }); + return this.http.post(url, body, CustomOptions.getAuthOptionsWithBody()) + .map(res => res.json()) + .do(request => console.info("Insert Response:"+request.status) ) + .catch(this.handleError); + + } + insertClaim(claim):any{ + console.warn('Trying toinsert claim : '+claim); + let url = this.baseUrl +"claims"; + let body = JSON.stringify( claim ); + // let headers = new Headers({ 'Content-Type': 'application/json' }); + // let options = new RequestOptions({ headers: headers }); + return this.http.post(url, body, CustomOptions.getAuthOptionsWithBody()) + .map(res => res.json()) + .do(request => console.info("Insert Response:"+request.status) ) + .catch(this.handleError); + + } + insertDirectRecords(records):any{ + console.warn('Trying to feedrecords : '+records); + let url = this.baseUrl +"feed/bulk"; + let body = JSON.stringify( records ); + console.warn('Json body: : '+body); + // let headers = new Headers({ 'Content-Type': 'application/json' }); + // let options = new RequestOptions({ headers: headers }); + return this.http.post(url, body, CustomOptions.getAuthOptionsWithBody()) + .map(res => res.json()) + .do(request => console.info("Insert Response:"+request) ) + .catch(this.handleError); + + } + private handleError (error: Response) { + // in a real world app, we may send the error to some remote logging infrastructure + // instead of just logging it to the console + console.log(error); + return Observable.throw(error || 'Server error'); + } + + getClaim(id:string):any { + let url = this.baseUrl+"claims/"+id; + return new Promise((resolve, reject) => { + this.http.get(url) + .map(res => res.json()) + .subscribe( + data => { + resolve(data.data); + }, + err => { + reject(err); + } + ) + ; + }); + } + + +} diff --git a/portal-4cli/src/app/claims/claim-utils/service/claimsService.module.ts b/portal-4cli/src/app/claims/claim-utils/service/claimsService.module.ts new file mode 100644 index 00000000..d38d0f8d --- /dev/null +++ b/portal-4cli/src/app/claims/claim-utils/service/claimsService.module.ts @@ -0,0 +1,23 @@ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import {ClaimsService} from './claims.service'; + + +@NgModule({ + imports: [ + CommonModule, FormsModule + ], + declarations: [ + ], + providers:[ + ClaimsService, + +], + exports: [ + ] +}) + + +export class ClaimServiceModule { } diff --git a/portal-4cli/src/app/claims/claim-utils/service/contexts.service.ts b/portal-4cli/src/app/claims/claim-utils/service/contexts.service.ts new file mode 100644 index 00000000..77170819 --- /dev/null +++ b/portal-4cli/src/app/claims/claim-utils/service/contexts.service.ts @@ -0,0 +1,85 @@ +import {Injectable} from '@angular/core'; +import {Jsonp, URLSearchParams, RequestOptions, Headers} from '@angular/http'; +import {Http, Response} from '@angular/http'; +import {Observable} from 'rxjs/Observable'; +import {Claim} from '../claim'; +import {OpenaireProperties} from '../../../utils/properties/openaireProperties'; +import {AutoCompleteValue} from '../../../searchPages/searchUtils/searchHelperClasses.class'; +import 'rxjs/add/observable/of'; +import 'rxjs/add/operator/do'; +import 'rxjs/add/operator/share'; +import { } from '../../../shared/cache.service'; +import { COOKIE } from '../../../login/utils/helper.class'; +@Injectable() +export class ContextsService { + private baseUrl; + constructor(private http: Http ) { + this.baseUrl = OpenaireProperties.getClaimsAPIURL(); + } + + public getCommunities():any { + let url = this.baseUrl + 'communities'; + let key = url; + + + console.info('ContextsService: request communities '+url); + return this.http.get( (OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url, this.getAuthOptions()) + .map(request => request.json().data) + // .do(request => console.info("Get claims: offset = ")) + .catch(this.handleError); + } + public getCategories(communityId :string):any { + console.info('ContextsService: request categories for community with id '+communityId); + let url= this.baseUrl + 'communities/' + communityId + '/categories'; + let key = url; + + + return this.http.get( (OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url, this.getAuthOptions()) + .map(request => request.json().data) + // .do(request => console.info("Get claims: offset = " )) + .catch(this.handleError);; + } + public getConcepts(categoryId :string, keyword: string, parsing:boolean):any { + console.info('ContextsService: request concept for category with id '+categoryId + ' and keyword '+ keyword); + let url= this.baseUrl + 'categories/' + categoryId+ "/concepts"; + let key = url+"_parsing="+parsing; + + + return this.http.get( (OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url, this.getAuthOptions()) + .map(request => request.json().data) + .catch(this.handleError) + .map(res => (parsing)?this.parse(res.concept):res.concept); + // .do(res => console.info("Result is "+ res.length )); + } + parse (data: any):AutoCompleteValue[] { + var array:AutoCompleteValue[] =[] + if(!Array.isArray(data) && data.id && data.label){ + var value:AutoCompleteValue = new AutoCompleteValue(); + value.id = data.id; + value.label = data.label; + array.push(value); + } + for(var i = 0; i < data.length; i++){ + var value:AutoCompleteValue = new AutoCompleteValue(); + value.id = data[i].id; + value.label = data[i].label; + array.push(value); + } + + return array; + + } + + private handleError (error: Response) { + // in a real world app, we may send the error to some remote logging infrastructure + // instead of just logging it to the console + console.log(error); + return Observable.throw(error || 'Server error'); + } + private getAuthOptions():RequestOptions{ + let headers = new Headers(); + headers.append('X-XSRF-TOKEN', COOKIE.getCookie(COOKIE.cookieName_id)); + let options = new RequestOptions({ headers: headers, withCredentials:true }); + return options; + } +} diff --git a/portal-4cli/src/app/claims/claim-utils/service/contextsService.module.ts b/portal-4cli/src/app/claims/claim-utils/service/contextsService.module.ts new file mode 100644 index 00000000..6bd55ced --- /dev/null +++ b/portal-4cli/src/app/claims/claim-utils/service/contextsService.module.ts @@ -0,0 +1,20 @@ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import {ContextsService} from './contexts.service'; + + +@NgModule({ + imports: [ + CommonModule, FormsModule + ], + declarations: [ + ], + providers:[ + ContextsService +], + exports: [ + ] +}) +export class ContextsServiceModule { } diff --git a/portal-4cli/src/app/claims/claim-utils/service/customOptions.class.ts b/portal-4cli/src/app/claims/claim-utils/service/customOptions.class.ts new file mode 100644 index 00000000..7796c45e --- /dev/null +++ b/portal-4cli/src/app/claims/claim-utils/service/customOptions.class.ts @@ -0,0 +1,19 @@ +import { RequestOptions, Headers} from '@angular/http'; +import { COOKIE } from '../../../login/utils/helper.class'; + + +export class CustomOptions{ + public static getAuthOptionsWithBody():RequestOptions{ + let headers = new Headers(); + headers.append('Content-Type', 'application/json'); + headers.append('X-XSRF-TOKEN', COOKIE.getCookie(COOKIE.cookieName_id)); + let options = new RequestOptions({ headers: headers, withCredentials:true }); + return options; + } + public static getAuthOptions():RequestOptions{ + let headers = new Headers(); + headers.append('X-XSRF-TOKEN', COOKIE.getCookie(COOKIE.cookieName_id)); + let options = new RequestOptions({ headers: headers, withCredentials:true }); + return options; + } +} diff --git a/portal-4cli/src/app/claims/claim-utils/service/searchCrossref.service.ts b/portal-4cli/src/app/claims/claim-utils/service/searchCrossref.service.ts new file mode 100644 index 00000000..a65e0dd4 --- /dev/null +++ b/portal-4cli/src/app/claims/claim-utils/service/searchCrossref.service.ts @@ -0,0 +1,67 @@ +import {Injectable} from '@angular/core'; +import {Http, Response} from '@angular/http'; +import {Observable} from 'rxjs/Observable'; +import {OpenaireProperties} from '../../../utils/properties/openaireProperties'; +import 'rxjs/add/observable/of'; +import 'rxjs/add/operator/do'; +import 'rxjs/add/operator/share'; +@Injectable() +export class SearchCrossrefService { + constructor( private http: Http ) {} + + + searchCrossrefResults (term: string, size : number, page : number):any { + let url = OpenaireProperties.getSearchCrossrefAPIURL()+'?query='+term+'&rows='+size+'&offset='+(size*(page-1)); + let key = url; + + return this.http.get( (OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(request => request.json().message) + .do(items => console.log("Crossref Results: total results = "+items['total-results']+" keyword = "+term)); + //.catch(this.handleError); + + } + searchCrossrefByDOIs(DOIs: string[]):any { + /* + $request ="http://api.crossref.org/works"."?filter="; + foreach($dois as $doi){ + $request.="doi:".urlencode( trim($doi)).","; + } + */ + var doisParams = ""; + for(var i =0 ;i < DOIs.length; i++){ + doisParams+=(doisParams.length > 0?",":"")+'doi:'+DOIs[i]; + } + let url = OpenaireProperties.getSearchCrossrefAPIURL()+'?filter='+doisParams; + let key = url; + + + return this.http.get( (OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(request => request.json().message) + .do(items => console.log("Crossref Results: total results = "+items['total-results']+" for doi = "+doisParams)); + //.catch(this.handleError); + + } + searchCrossrefByMultipleDOIs(dois: string[]):any { + let url = OpenaireProperties.getSearchCrossrefAPIURL()+'?filter=doi:'; + for(var i=0; i request.json().message) + .do(items => console.log("Crossref Results: total results = "+items['total-results'])); + //.catch(this.handleError); + + } + + private handleError (error: Response) { + // in a real world app, we may send the error to some remote logging infrastructure + // instead of just logging it to the console + console.log(error); + return Observable.throw(error || 'Server error'); + } + +} diff --git a/portal-4cli/src/app/claims/claim-utils/service/searchCrossrefService.module.ts b/portal-4cli/src/app/claims/claim-utils/service/searchCrossrefService.module.ts new file mode 100644 index 00000000..798acdb3 --- /dev/null +++ b/portal-4cli/src/app/claims/claim-utils/service/searchCrossrefService.module.ts @@ -0,0 +1,20 @@ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import {SearchCrossrefService} from './searchCrossref.service'; + + +@NgModule({ + imports: [ + CommonModule, FormsModule + ], + declarations: [ + ], + providers:[ + SearchCrossrefService +], + exports: [ + ] +}) +export class SearchCrossrefServiceModule { } diff --git a/portal-4cli/src/app/claims/claim-utils/service/searchDatacite.service.ts b/portal-4cli/src/app/claims/claim-utils/service/searchDatacite.service.ts new file mode 100644 index 00000000..46b43032 --- /dev/null +++ b/portal-4cli/src/app/claims/claim-utils/service/searchDatacite.service.ts @@ -0,0 +1,50 @@ +import {Injectable} from '@angular/core'; +import {Http, Response} from '@angular/http'; +import {Observable} from 'rxjs/Observable'; +import {OpenaireProperties} from '../../../utils/properties/openaireProperties'; +import 'rxjs/add/observable/of'; +import 'rxjs/add/operator/do'; +import 'rxjs/add/operator/share'; +@Injectable() +export class SearchDataciteService { + constructor(private http: Http ) {} + + searchDataciteResults (term: string, size : number, page : number):any { + console.info("In search datacite results "+term); + let url = OpenaireProperties.getSearchDataciteAPIURL()+'?query='+term+'&rows='+size+'&start='+(size*(page-1)); + let key = url; + + return this.http.get( (OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(request => request.json()) + .do(items => console.info(items)) + .do(items => console.log("Datacite Results: total results = "+items.meta.total+" keyword = "+term)); + //.catch(this.handleError); + } + getDataciteResultByDOI (doi: string):any { + console.info("Fetch datacite resultt by DOI: "+doi); + let url = OpenaireProperties.getSearchDataciteAPIURL()+'/'+doi; + let key = url; + + return this.http.get( (OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(request => request.json()) + .do(items => console.info(items)); + // .do(items => console.log("Datacite Results: total results = "+items.meta.total+" doi = "+doi)) + + //.catch(this.handleError); + } + + + private handleError (error: Response) { + // in a real world app, we may send the error to some remote logging infrastructure + // instead of just logging it to the console + console.log(error); + return Observable.throw(error || 'Server error'); + } + private extractData(res: Response) { + if (res.status < 200 || res.status >= 300) { + throw new Error('Bad response status: ' + res.status); + } + let body = res.json(); + return body.data || { }; + } +} diff --git a/portal-4cli/src/app/claims/claim-utils/service/searchDataciteService.module.ts b/portal-4cli/src/app/claims/claim-utils/service/searchDataciteService.module.ts new file mode 100644 index 00000000..659ca2e3 --- /dev/null +++ b/portal-4cli/src/app/claims/claim-utils/service/searchDataciteService.module.ts @@ -0,0 +1,20 @@ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import {SearchDataciteService} from './searchDatacite.service'; + + +@NgModule({ + imports: [ + CommonModule, FormsModule + ], + declarations: [ + ], + providers:[ + SearchDataciteService +], + exports: [ + ] +}) +export class SearchDataciteServiceModule { } diff --git a/portal-4cli/src/app/claims/claim-utils/service/searchOrcid.service.ts b/portal-4cli/src/app/claims/claim-utils/service/searchOrcid.service.ts new file mode 100644 index 00000000..a9a60fcb --- /dev/null +++ b/portal-4cli/src/app/claims/claim-utils/service/searchOrcid.service.ts @@ -0,0 +1,126 @@ +import {Injectable} from '@angular/core'; +import {URLSearchParams} from '@angular/http'; +import {Http, Response} from '@angular/http'; +import { Headers, RequestOptions } from '@angular/http'; +import {Observable} from 'rxjs/Observable'; +import {OpenaireProperties} from '../../../utils/properties/openaireProperties'; +import 'rxjs/add/observable/of'; +import 'rxjs/add/operator/do'; +import 'rxjs/add/operator/share'; + +@Injectable() +export class SearchOrcidService { + constructor( private http: Http ) {} + + + searchOrcidAuthor (term: string, authorIds: string[], + authorGivenNames: string[], authorFamilyNames: string[]):any { + console.info("In searchOrcidAuthor: "+term); + + var headers = new Headers(); + headers.append('Accept', 'application/orcid+json'); + + let url = OpenaireProperties.getSearchOrcidURL()+term+'/orcid-bio'; + let key = url; + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url, { headers: headers }) + .map(res => res.json()['orcid-profile']) + .map(res => [res['orcid-bio']['personal-details']['given-names'], + res['orcid-bio']['personal-details']['family-name'], + res['orcid-identifier']]) + .map(res => this.parseOrcidAuthor(res, authorIds, authorGivenNames, authorFamilyNames)); + } + + searchOrcidAuthors (term: string, authorIds: string[], + authorGivenNames: string[], authorFamilyNames: string[]):any { + console.info("In search Orcid authors for keyword: "+term); + + var headers = new Headers(); + headers.append('Accept', 'application/orcid+json'); + + let url = OpenaireProperties.getSearchOrcidURL()+'search/orcid-bio?defType=edismax&q='+term+'&qf=given-name^1.0+family-name^2.0+other-names^1.0+credit-name^1.0&start=0&rows=10'; + let key = url; + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url, { headers: headers }) + .map(res => res.json()['orcid-search-results']['orcid-search-result']) + .map(res => this.parseOrcidAuthors(res, authorIds, authorGivenNames, authorFamilyNames)); + + } + + searchOrcidPublications (id: string):any { + console.info("In search Orcid publications for author: "+id); + + var headers = new Headers(); + headers.append('Accept', 'application/orcid+json'); + + let url = OpenaireProperties.getSearchOrcidURL()+id+'/orcid-works'; + let key = url; + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url, { headers: headers }) + .map(res => res.json()['orcid-profile']['orcid-activities']['orcid-works']); + //.map(res => res['orcid-work']); + } + + + parseOrcidAuthor (data: any, authorIds: string[], + authorGivenNames: string[], authorFamilyNames: string[]):any { + + if(data[2] != null) { + authorIds.push(data[2].path); + + if(data[0] != null) { + authorGivenNames.push(data[0].value); + } else { + authorGivenNames.push(""); + } + if(data[1] != null) { + authorFamilyNames.push(data[1].value); + } else { + authorFamilyNames.push(""); + } + + return true; + } + + return false; + } + + parseOrcidAuthors (data: any, authorIds: string[], + authorGivenNames: string[], authorFamilyNames: string[]):any { + let ret: boolean = false; + let mydata: any; + let length: number; + + if(data != null) { + length = data.length!=undefined ? data.length : 1; + + for(let i=0; i Clear All + + + `, + +}) +export class StartOverComponent { + constructor () { + + + } + ngOnInit() { + +} + + + // @Input() public inlineEntity = null; + @Input() public type:string; + @Input() public linkTo:string; + @Input() public results; + @Input() public projects; + @Input() public contexts; + + @ViewChild(AlertModal) alertApplyAll; + + confirmOpen(){ + this.alertApplyAll.cancelButton = true; + this.alertApplyAll.okButton = true; + this.alertApplyAll.alertTitle = "Remove selected"; + this.alertApplyAll.message = "This action will delete every selected entity (projects, communities, research results). Do you wish to continue?"; + this.alertApplyAll.okButtonText = "Yes"; + this.alertApplyAll.cancelButtonText = "No"; + this.alertApplyAll.open(); + } + confirmClose(data){ + this.startOver(); + } + startOver(){ + if(this.type != null && this.linkTo != null){ + console.log("inline"); + if(this.linkTo == "project"){ + this.projects.splice(0, this.projects.length); + }else if(this.linkTo == "context"){ + this.contexts.splice(0, this.contexts.length); + }else if(this.linkTo == "result"){ + this.results.splice(0, this.results.length); + } + }else{ + console.log("generic"); + this.results.splice(0, this.results.length); + this.projects.splice(0, this.projects.length); + this.contexts.splice(0, this.contexts.length); + } + console.log("projects:"+this.projects.length +" contexts:"+this.contexts.length + " results:"+this.results.length ); + } + +} diff --git a/portal-4cli/src/app/claims/claim-utils/startOver.module.ts b/portal-4cli/src/app/claims/claim-utils/startOver.module.ts new file mode 100644 index 00000000..bde3d0a2 --- /dev/null +++ b/portal-4cli/src/app/claims/claim-utils/startOver.module.ts @@ -0,0 +1,16 @@ +import { NgModule } from '@angular/core'; +import { SharedModule } from '../../shared/shared.module'; +import { CommonModule } from '@angular/common'; +import {StartOverComponent} from './startOver.component'; +import {AlertModalModule} from '../../utils/modal/alertModal.module'; + + @NgModule({ + imports: [ + SharedModule, CommonModule, AlertModalModule + ], + declarations: [ + StartOverComponent + ], + exports: [StartOverComponent ] +}) +export class StartOverModule { } diff --git a/portal-4cli/src/app/claims/claim.module.ts b/portal-4cli/src/app/claims/claim.module.ts new file mode 100644 index 00000000..113e8597 --- /dev/null +++ b/portal-4cli/src/app/claims/claim.module.ts @@ -0,0 +1,68 @@ +// import { NgModule} from '@angular/core'; +// import { CommonModule } from '@angular/common'; +// import { FormsModule } from '@angular/forms'; +// // +// import {UtilsModule} from '../utils/utils.module'; +// import {ServicesModule} from '../services/services.module'; +// +// import { ClaimsService} from '../services/claims.service'; +// //main +// import {ClaimComponent} from './claim/claim.component'; +// import {ClaimsAdminComponent} from './claims/claimsAdmin.component'; +// import {MyClaimsComponent} from './myClaims/myClaims.component'; +// import {LinkingHomeComponent} from './linking/linkingHome.component'; +// import {LinkingComponent} from './linking/linking.component'; +// import { BulkLinkingComponent } from './linking/bulkLinking.component'; +// +// import {BulkClaimComponent} from './linking/bulkClaim/bulkClaim.component'; +// import {ClaimsComponent} from './claim-utils/claims.component'; +// +// import {ClaimContextComponent} from './claim-utils/claimContext.component'; +// import {ClaimProjectsComponent} from './claim-utils/claimProject.component'; +// import {ClaimResultComponent} from './claim-utils/claimResult.component'; +// import {ClaimPublicationComponent} from './claim-utils/claimPublication.component'; +// import {ClaimDatasetComponent} from './claim-utils/claimDataset.component'; +// +// import {ClaimInsertComponent} from './linking/insertClaim/insertClaim.component'; +// +// import {ClaimSelectedContextsComponent} from './linking/selected/selectedContexts.component'; +// import {ClaimSelectedComponent} from './linking/selected/selected.component'; +// import {ClaimSelectedDatasetsComponent} from './linking/selected/selectedDatasets.component'; +// import {ClaimSelectedResultsComponent} from './linking/selected/selectedResults.component'; +// import {ClaimSelectedProjectsComponent} from './linking/selected/selectedProjects.component'; +// import {ClaimSelectedPublicationsComponent} from './linking/selected/selectedPublications.component'; +// +// import {LinkingGenericComponent} from './linking/linkingGeneric.component'; +// +// import {InlineClaimContextComponent} from './inlineClaims/inlineClaimContext.component'; +// import {InlineClaimProjectComponent} from './inlineClaims/inlineClaimProject.component'; +// import {InlineClaimResultComponent} from './inlineClaims/inlineClaimResult.component'; +// import {ClaimEntityFormatter} from '../utils/claimEntityFormatter.component'; +// +// import { Claim } from '../utils/entities/claim'; +// //helpers +// +// import { ClaimRoutingModule } from './claim-routing.module'; +// @NgModule({ +// imports: [ +// CommonModule, FormsModule, +// UtilsModule, +// ServicesModule, +// ClaimRoutingModule +// +// ], +// declarations: [ +// ClaimsAdminComponent, MyClaimsComponent, ClaimComponent, ClaimsComponent, +// BulkLinkingComponent, LinkingComponent, LinkingHomeComponent, LinkingGenericComponent, +// InlineClaimContextComponent, InlineClaimProjectComponent, InlineClaimResultComponent, ClaimSelectedComponent, +// ClaimContextComponent, ClaimSelectedContextsComponent, ClaimInsertComponent, ClaimProjectsComponent, ClaimSelectedProjectsComponent, +// ClaimResultComponent, ClaimSelectedPublicationsComponent, ClaimSelectedDatasetsComponent, ClaimSelectedResultsComponent, ClaimPublicationComponent, +// ClaimDatasetComponent, BulkClaimComponent, +// ClaimEntityFormatter +// ], +// providers: [ ClaimsService ], +// exports: [ +// InlineClaimContextComponent, InlineClaimProjectComponent, InlineClaimResultComponent +// ] +// }) +// export class ClaimModule { } diff --git a/portal-4cli/src/app/claims/claim/claim.component.html b/portal-4cli/src/app/claims/claim/claim.component.html new file mode 100644 index 00000000..338d0097 --- /dev/null +++ b/portal-4cli/src/app/claims/claim/claim.component.html @@ -0,0 +1,10 @@ + diff --git a/portal-4cli/src/app/claims/claimsAdmin/claimsAdmin-routing.module.ts b/portal-4cli/src/app/claims/claimsAdmin/claimsAdmin-routing.module.ts new file mode 100644 index 00000000..f915d2e9 --- /dev/null +++ b/portal-4cli/src/app/claims/claimsAdmin/claimsAdmin-routing.module.ts @@ -0,0 +1,16 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { AdminLoginGuard} from'../../login/adminLoginGuard.guard'; + +import { ClaimsAdminComponent } from './claimsAdmin.component'; +import {PreviousRouteRecorder} from'../../utils/piwik/previousRouteRecorder.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + RouterModule.forChild([ + { path: '', component: ClaimsAdminComponent, canActivate: [IsRouteEnabled, AdminLoginGuard], + data: {redirect: '/error'}, canDeactivate: [PreviousRouteRecorder]}]) + ] +}) +export class ClaimsAdminRoutingModule { } diff --git a/portal-4cli/src/app/claims/claimsAdmin/claimsAdmin.component.ts b/portal-4cli/src/app/claims/claimsAdmin/claimsAdmin.component.ts new file mode 100644 index 00000000..08b3dc11 --- /dev/null +++ b/portal-4cli/src/app/claims/claimsAdmin/claimsAdmin.component.ts @@ -0,0 +1,38 @@ +import {Component, ViewChild, Input} from '@angular/core'; +import {Location} from '@angular/common'; +import {Observable} from 'rxjs/Observable'; +import { Meta} from '../../../angular2-meta'; + +@Component({ + selector: 'claims-admin', + template: ` +
+
+
+ +
+
+
+
+
+ Claims Administrator +
+ +
+
+
+
+ + `, + +}) +export class ClaimsAdminComponent { + constructor ( private _meta: Meta ) { + this._meta.setTitle("OpenAIRE | Claims Administrator"); + } + ngOnInit() { + } +} diff --git a/portal-4cli/src/app/claims/claimsAdmin/claimsAdmin.module.ts b/portal-4cli/src/app/claims/claimsAdmin/claimsAdmin.module.ts new file mode 100644 index 00000000..947bc901 --- /dev/null +++ b/portal-4cli/src/app/claims/claimsAdmin/claimsAdmin.module.ts @@ -0,0 +1,25 @@ +import { NgModule } from '@angular/core'; + +import { SharedModule } from '../../shared/shared.module'; +import { ClaimsAdminComponent } from './claimsAdmin.component'; +import { ClaimsAdminRoutingModule } from './claimsAdmin-routing.module'; +// import{ClaimServiceModule} from '../claim-utils/service/claimsService.module'; +import {DisplayClaimsModule} from '../claim-utils/displayClaims/displayClaims.module'; +import { AdminLoginGuard} from'../../login/adminLoginGuard.guard'; +import {PreviousRouteRecorder} from '../../utils/piwik/previousRouteRecorder.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + SharedModule, + ClaimsAdminRoutingModule, + // ClaimServiceModule, + DisplayClaimsModule + + ], + providers:[AdminLoginGuard, PreviousRouteRecorder,IsRouteEnabled], + declarations: [ + ClaimsAdminComponent + ] +}) +export class ClaimsAdminModule { } diff --git a/portal-4cli/src/app/claims/claimsByToken/claimsByToken-routing.module.ts b/portal-4cli/src/app/claims/claimsByToken/claimsByToken-routing.module.ts new file mode 100644 index 00000000..3d50376a --- /dev/null +++ b/portal-4cli/src/app/claims/claimsByToken/claimsByToken-routing.module.ts @@ -0,0 +1,15 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { LoginGuard} from'../../login/loginGuard.guard'; +import { ClaimsByTokenComponent } from './claimsByToken.component'; +import {PreviousRouteRecorder} from'../../utils/piwik/previousRouteRecorder.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + RouterModule.forChild([ + { path: '', component: ClaimsByTokenComponent, canActivate: [IsRouteEnabled, LoginGuard], + data: {redirect: '/error'}, canDeactivate: [PreviousRouteRecorder]}]) + ] +}) +export class ClaimsByTokenRoutingModule { } diff --git a/portal-4cli/src/app/claims/claimsByToken/claimsByToken.component.ts b/portal-4cli/src/app/claims/claimsByToken/claimsByToken.component.ts new file mode 100644 index 00000000..955210d4 --- /dev/null +++ b/portal-4cli/src/app/claims/claimsByToken/claimsByToken.component.ts @@ -0,0 +1,433 @@ +import {Component, ViewChild, Input} from '@angular/core'; +import {Location} from '@angular/common'; +import {Observable} from 'rxjs/Observable'; +import {ActivatedRoute, Params} from '@angular/router'; +import {ClaimsByTokenService} from './claimsByToken.service'; + +import {ModalSelect} from '../../utils/modal/selectModal.component'; +import {ModalLoading} from '../../utils/modal/loading.component'; + +import {Session} from '../../login/utils/helper.class'; + +import {RouterHelper} from '../../utils/routerHelper.class'; +import { Meta} from '../../../angular2-meta'; +import {ClaimsDatatablePipe} from '../../utils/pipes/claimsDatatable.pipe'; + +//import {DataTable} from "angular2-datatable"; + +@Component({ + selector: 'claims-project-manager', + template: ` +
+
+
+
+ + +
+
+ + +

Oops! Your email does not give you the authority to view claims for the selected project. Please contact the administrators.

+
+
+ +
+
+ Claims Administrator + + {{project['name']}} ({{project['funderName']}}) + + +
+

Pending Claims

+ +
+
No pending claims found.
+
+ +
+ +
+
+ +
+
+ + + {{totalPendingResults.count}} pending claims, page {{activePendingPage.page}} of {{totalPages(totalPendingResults.count)}} + + + + + + + + + + + + + + + + + + + + + +
Research ResultClaimed ByClaimed DateApprove
{{claim1.userMail}}{{claim1.date}} + + + +
+
+ +
*Note that claims you did not approved or disapproved are considered as right (but not curated)
+ + +

Already Curated Claims

+ +
+
No curated claims found.
+
+ +
+ +
+
+ +
+
+ + + {{totalCuratedResults.count}} curated claims, page {{activeCuratedPage.page}} of {{totalPages(totalCuratedResults.count)}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Research ResultClaimed byClaimed DateCurated byCuration DateApproved
{{claim.userMail}}{{claim.date}}{{claim.curatedBy}}{{claim.curationDate}} + + + + + +
+
+ + + +
+ +
+
+
+
+ `, + +}) +export class ClaimsByTokenComponent { + public token: string = ""; + public sub: any; + public project: any; + private claims:any = []; + public pending_claims: any = []; + public curated_claims: any = []; + public selectedRight: Set; + public selectedWrong: Set; + public editable: Set; + public contact_person: string[] = ["Konstantina", "Argiro", "Katerina"]; + + // when 'valid' show proper claims, when 'invalid' show no matched entry-wanna retry + public accessStatus: string;// = "empty"; + + public rowsOnPage = 5; + public sortOrder = "asc"; + public filterQuery:string = ""; + public filterQuery2:string = ""; + + public activePendingPage:any = {page: 1}; + public totalPendingResults:any = {count: 0}; + public activeCuratedPage:any = {page: 1}; + public totalCuratedResults:any = {count: 0}; + + + @ViewChild('mf1') table1: any;//DataTable; + @ViewChild('mf2') table2: any;//DataTable; + @ViewChild('filtered1') filteredItems1; + + + @ViewChild (ModalSelect) selectModal : ModalSelect; + @ViewChild (ModalLoading) loading : ModalLoading ; + + public routerHelper:RouterHelper = new RouterHelper(); + + constructor ( private route: ActivatedRoute, private claimsByTokenService: ClaimsByTokenService, private _meta: Meta) { + + } + ngOnInit() { + this.sub = this.route.queryParams.subscribe(params => { + this.token = params['token']; + this.selectedRight = new Set(); + this.selectedWrong = new Set(); + this.editable = new Set(); + //this.openSelect(); + //this.setMessageSelect("Please select your identity:"); + //this.setOptionsSelect(this.contact_person); + this.validateJWTandToken(); + this.updateTitle("Claims For Project Managers"); + } + ); + } + +refreshTable(table:any, $event:any, whichTable: string) { + if(whichTable == "pending") { + this.activePendingPage.page = $event.value; + } else if(whichTable == 'curated') { + this.activeCuratedPage.page = $event.value; + } + table.mfActivePage=$event.value; + table.setPage(table.mfActivePage, this.rowsOnPage); +} + +public sortByClaimDate1 = (claim: any) => { + return new Date(claim.date); +} + +public sortByCurationDate1 = (claim: any) => { + return new Date(claim.curationDate); +} + +public sortByTitle1 = (claim: any) => { + if(claim.targetType != 'project') { + return claim.target.title; + } else { + return claim.source.title; + } +} + +public sortByClaimDate2 = (claim: any) => { + return new Date(claim.date); +} + +public sortByCurationDate2 = (claim: any) => { + console.info(new Date(claim.curationDate)); + return new Date(claim.curationDate); +} + +public sortByTitle2= (claim: any) => { + if(claim.targetType != 'project') { + return claim.target.title; + } else { + return claim.source.title; + } +} + + + validateJWTandToken() { + var jwtToken=Session.getUserJwt(); + if(this.token) { + this.claimsByTokenService.getClaims(this.token, jwtToken).subscribe( + data => { + this.closeLoading(); + this.accessStatus = "valid"; + //console.info(data); + this.claims = data.data; + for(let claim of this.claims) { + if(claim.targetType == "project") { + this.project = claim.target; + } else { + this.project = claim.source; + } + if(claim.curatedBy) { + this.curated_claims.push(claim); + } else { + this.pending_claims.push(claim); + } + } + + this.totalPendingResults.count = this.pending_claims.length; + this.totalCuratedResults.count = this.curated_claims.length; + + this.updateTitle("Claims For Project Managers - "+this.project.name); + }, + err => { + this.accessStatus = "invalid"; + console.log(err); + } + ); + } else { + this.accessStatus = "invalid"; + } + } + + selectApprove(id:string, event) { + var value = event.currentTarget.checked; + if(value){ + this.selectedRight.add(id); + this.selectedWrong.delete(id); + console.info(this.selectedRight); + }else{ + this.selectedRight.delete(id); + console.info(this.selectedRight); + } + } + + selectDisapprove(id:string,event) { + var value = event.currentTarget.checked; + if(value){ + this.selectedWrong.add(id); + this.selectedRight.delete(id); + }else{ + this.selectedWrong.delete(id); + } + } + + isSelectedRight(id:string) { + return this.selectedRight.has(id); + } + + isSelectedWrong(id:string) { + return this.selectedWrong.has(id); + } + + isRight(claim: any) { + //claim.approved = true; + if(this.isSelectedRight(claim.id)) { + return true; + } else if(claim.approved == true && !this.isSelectedWrong(claim.id)) { + return true; + } + + return false; + } + + isWrong(claim: any) { + if(this.isSelectedWrong(claim.id)) { + return true; + } else if(claim.approved == false && !this.isSelectedRight(claim.id)) { + return true; + } + + return false; + } + + saveChanges() { + console.info("Changes Saved!"); + var jwtToken=Session.getUserJwt(); + + this.claimsByTokenService.updateClaimsCuration(this.selectedRight, this.selectedWrong).subscribe( + data => { + console.info(data); + }, + err => { + console.log(err); + } + ); + + } + + public closeLoading(){ + if(this.loading){ + this.loading.close(); + } + } + + curatorSelected(selected: string) { + console.info("selected curator: "+selected); + } + + public openSelect(){ + if(this.selectModal){ + this.selectModal.open(); + } + } + + public setMessageSelect(message: string){ + if(this.selectModal){ + this.selectModal.message = message; + } + } + + public setOptionsSelect(options: string[]){ + if(this.selectModal){ + this.selectModal.options = options; + } + } + + totalPages(totalResults: number): number { + let totalPages:any = totalResults/(this.rowsOnPage); + if(!(Number.isInteger(totalPages))) { + totalPages = (parseInt(totalPages, 10) + 1); + } + return totalPages; + } + + updateTitle(title:string){ + var _prefix ="OpenAIRE | "; + var _title = _prefix + ((title.length> 50 ) ?title.substring(0,50):title); + this._meta.setTitle(_title ); + } + +} diff --git a/portal-4cli/src/app/claims/claimsByToken/claimsByToken.module.ts b/portal-4cli/src/app/claims/claimsByToken/claimsByToken.module.ts new file mode 100644 index 00000000..9f5827b5 --- /dev/null +++ b/portal-4cli/src/app/claims/claimsByToken/claimsByToken.module.ts @@ -0,0 +1,49 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import {DataTableModule} from "angular2-datatable"; + +import { SharedModule } from '../../shared/shared.module'; +import { ClaimsByTokenComponent } from './claimsByToken.component'; +import { ClaimsByTokenService } from './claimsByToken.service'; +import { ClaimsByTokenRoutingModule } from './claimsByToken-routing.module'; +import {ClaimEntityFormatterModule} from '../claim-utils/entityFormatter/claimEntityFormatter.module'; +// import{ClaimServiceModule} from '../claim-utils/service/claimsService.module'; +//import {DisplayClaimsModule} from '../claim-utils/displayClaims/displayClaims.module'; +import {SelectModalModule} from '../../utils/modal/selectModal.module'; +import {LoadingModalModule} from '../../utils/modal/loadingModal.module'; + +import {LoginGuard} from'../../login/loginGuard.guard'; + +import {PagingModule} from '../../utils/paging.module'; +import {ClaimsDatatablePipe} from '../../utils/pipes/claimsDatatable.pipe'; +import {PreviousRouteRecorder} from '../../utils/piwik/previousRouteRecorder.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + + +@NgModule({ + imports: [ + RouterModule, + DataTableModule, + SharedModule, + ClaimsByTokenRoutingModule, + ClaimEntityFormatterModule, + SelectModalModule, + LoadingModalModule, + PagingModule + // ClaimServiceModule, + //DisplayClaimsModule + + ], + providers:[ + ClaimsByTokenService, + LoginGuard, PreviousRouteRecorder, IsRouteEnabled + ], + declarations: [ + ClaimsByTokenComponent, ClaimsDatatablePipe + ], + exports: [ + ClaimsByTokenComponent, ClaimsDatatablePipe + ] +}) +export class ClaimsByTokenModule { } diff --git a/portal-4cli/src/app/claims/claimsByToken/claimsByToken.service.ts b/portal-4cli/src/app/claims/claimsByToken/claimsByToken.service.ts new file mode 100644 index 00000000..ab75c85a --- /dev/null +++ b/portal-4cli/src/app/claims/claimsByToken/claimsByToken.service.ts @@ -0,0 +1,77 @@ +import {Injectable} from '@angular/core'; +import {Http, Response} from '@angular/http'; +import {Jsonp, URLSearchParams,ResponseOptions, RequestOptions, Headers} from '@angular/http'; +import {Observable} from 'rxjs/Observable'; +import {OpenaireProperties} from '../../utils/properties/openaireProperties'; +import 'rxjs/add/operator/do'; + +import { CustomOptions } from '../claim-utils/service/customOptions.class'; + +@Injectable() +export class ClaimsByTokenService { + + constructor(private http: Http ) {} + + getClaims(token: string, jwtToken: string):any { + console.info("getClaims in service"); + + let url = OpenaireProperties.getClaimsAPIURL()+"project/claims?projectToken="+token; + + let key = url; + + return this.http.get(url, CustomOptions.getAuthOptions()) + //.map(res => res.text()) + .map(request => request.json()); + + } + + +/* + getClaims(email: string, token: string, user_token: string):any { + let url = OpenaireProperties.getClaimsAPIURL(); // What else? + let body = JSON.stringify( {"email": email, "token": token} ); + console.warn('Json body: : '+body); + let headers = new Headers({ 'Content-Type': 'application/json' }); + let options = new RequestOptions({ headers: headers }); + return this.http.post(url, body, options) + .map(res => res.json()) + .do(request => console.info("Insert Response:"+request.status) ) + .catch(this.handleError); + } +*/ + + updateClaimsCuration( selectedRight: Set, selectedWrong: Set) { + let url = OpenaireProperties.getClaimsAPIURL() + "curate/bulk"; + let claimsCurationInfo: any = []; //e.g.: [{"id":"2","approved":true},{"id":"1","approved":true}] + + selectedRight.forEach(function(selected) { + console.info(selected); + let claimCurationInfo: {"id": string, "approved": boolean} = {"id": selected, "approved": true}; + claimsCurationInfo.push(claimCurationInfo); + }); + + selectedWrong.forEach(function(selected) { + let claimCurationInfo: any = {"id": selected, "approved": false}; + claimsCurationInfo.push(claimCurationInfo); + }); + + console.info("\n\n"+claimsCurationInfo); + + + let body = JSON.stringify( claimsCurationInfo ); + console.warn('Json body: : '+body); + let headers = new Headers({ 'Content-Type': 'application/json' }); + let options = new RequestOptions({ headers: headers }); + return this.http.post(url, body, CustomOptions.getAuthOptionsWithBody()) + .map(res => res.json()) + .do(request => console.info("Insert Response:"+request.status) ) + .catch(this.handleError); + } + + private handleError (error: Response) { + // in a real world app, we may send the error to some remote logging infrastructure + // instead of just logging it to the console + console.log(error); + return Observable.throw(error || 'Server error'); + } +} diff --git a/portal-4cli/src/app/claims/directLinking/directLinking-routing.module.ts b/portal-4cli/src/app/claims/directLinking/directLinking-routing.module.ts new file mode 100644 index 00000000..e9ed1f35 --- /dev/null +++ b/portal-4cli/src/app/claims/directLinking/directLinking-routing.module.ts @@ -0,0 +1,19 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { LoginGuard} from'../../login/loginGuard.guard'; + +import { DirectLinkingComponent } from './directLinking.component'; +import {PreviousRouteRecorder} from'../../utils/piwik/previousRouteRecorder.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + RouterModule.forChild([ + { path: '', component: DirectLinkingComponent, canActivate: [IsRouteEnabled, LoginGuard], data: { + redirect: '/error' + }, canDeactivate: [PreviousRouteRecorder]}, + + ]) + ] +}) +export class DirectLinkingRoutingModule { } diff --git a/portal-4cli/src/app/claims/directLinking/directLinking.component.html b/portal-4cli/src/app/claims/directLinking/directLinking.component.html new file mode 100644 index 00000000..c997eb3d --- /dev/null +++ b/portal-4cli/src/app/claims/directLinking/directLinking.component.html @@ -0,0 +1,118 @@ +
+
+
+ +
+
+ Link +
+
+ +
+
+ +
+ +
+ +
+ + +
+
+ Link {{(type=="project")?'Project':' Research result'}}: +
+
+ +
+ +
+
+
+ {{displayedResult.title}} + {{displayedResult.title}} +
+ + +
+ +
+ +
+ {{projects[0].funderName}} | {{projects[0].projectName}} {{(projects[0].projectAcronym)?'('+projects[0].projectAcronym+')':''}} + +
+ + + +
+ + + + + + + +
+
+ + +
+ +
+
+ + + +
+
+ +
+ +
+
+
+
diff --git a/portal-4cli/src/app/claims/directLinking/directLinking.component.ts b/portal-4cli/src/app/claims/directLinking/directLinking.component.ts new file mode 100644 index 00000000..567909a3 --- /dev/null +++ b/portal-4cli/src/app/claims/directLinking/directLinking.component.ts @@ -0,0 +1,188 @@ +import {Component, Input} from '@angular/core'; +import {Observable} from 'rxjs/Observable'; +import {ActivatedRoute, Router} from '@angular/router'; +import {EntitiesSearchService} from '../../utils/entitiesAutoComplete/entitySearch.service'; +import {ClaimProject, ClaimResult} from '../claim-utils/claimEntities.class'; +import {SearchPublicationsService} from '../../services/searchPublications.service'; +import {SearchDatasetsService} from '../../services/searchDatasets.service'; +import { Meta} from '../../../angular2-meta'; + +@Component({ + selector: 'directLinking', + templateUrl: 'directLinking.component.html' +}) +export class DirectLinkingComponent { + contexts=[]; + projects=[]; + + results = []; + + linkType:string ="project"; // link type (selected in home page) : project, context, software, etc + /* url Parameters for inline linking */ + id:string = null; //entity id + type:string = null; // entity type (publication or dataset) + linkTo:string = null; // entity type (project or context or result) + + entityTypes=["dataset", "publication", "project","context"]; + inlineResult:ClaimResult =null; + displayedResult:ClaimResult =null; + sub:any =null; + show:string="claim"; //{claim,result} + validInput:boolean = null;//'true; + constructor ( private _router: Router, private route: ActivatedRoute, private entitySearch:EntitiesSearchService, + private publicationsSearch:SearchPublicationsService, private datasetsSearch:SearchDatasetsService, private _meta: Meta) { + this._meta.setTitle("OpenAIRE | Direct Linking"); + } + ngOnInit() { + if(localStorage.getItem("projects")){ + this.projects = JSON.parse(localStorage.getItem("projects")); + } + if(localStorage.getItem("contexts")){ + this.contexts = JSON.parse(localStorage.getItem("contexts")); + } + if(localStorage.getItem("results")){ + this.results = JSON.parse(localStorage.getItem("results")); + } + if(localStorage.getItem("results")){ + this.results = JSON.parse(localStorage.getItem("results")); + } + if(localStorage.getItem("inlineEntity")){ + this.inlineResult = JSON.parse(localStorage.getItem("inlineEntity")); + } + + localStorage.removeItem("projects"); + localStorage.removeItem("contexts"); + localStorage.removeItem("results"); + localStorage.removeItem("inlineEntity"); + + this.sub = this.route.queryParams.subscribe(params => { + this.id = params['id']; + this.type = params['type']; + this.linkTo = params['linkTo']; + if(this.type!=null && this.linkTo!=null){ + this.type = (this.entityTypes.indexOf(this.type) != -1)? this.type:'publication'; + this.linkTo = (this.entityTypes.indexOf(this.linkTo) != -1 || this.linkTo == "result")? this.linkTo:'project'; + this.show = (this.linkTo != "result")?"claim":"result"; + this.linkType = this.linkTo; + var isInlineResult:boolean = false; // is a link result - result + if((this.type == "publication" || this.type == "dataset") && ((this.linkTo == "publication" || this.linkTo == "dataset") || this.linkTo == "result" )){ + isInlineResult = true; + } + if(this.type == "project"){ + this.linkType = "project"; + this.getProjectById(this.id); + }else if(this.type == "publication"){ + this.getPublicationById(this.id,isInlineResult); + }else if(this.type == "dataset"){ + this.getDatasetById(this.id,isInlineResult); + }else{ + this.validInput = this.isValidInput(null); + } + + }else{ + this.validInput = this.isValidInput(null); + + } + + }); + } + isValidInput(result){ + if(result == null){ + return false; + }else if(this.type == "project" && this.linkTo != "result"){ + return false; + }else if(["dataset","publication"].indexOf(this.type) != -1 && (["project","context","result"].indexOf(this.linkTo) == -1)){ + return false; + }else if(["project","dataset","publication"].indexOf(this.type) == -1){ + return false; + }else{ + return true; + } + } + getProjectById(id:string){ + this.sub = this.entitySearch.fetchByType(id,"project").subscribe( + data => { + console.log(data); + var item =data[0]; + var project: ClaimProject = new ClaimProject(); + project.funderId = item.funderId; + project.funderName = item.funderName; + project.projectId = id; + project.projectName = item.projectName; + project.projectAcronym = item.projectAcronym; + project.startDate = item.startDate; + project.endDate = item.endDate; + project.code = item.code; + project.jurisdiction = item.jurisdiction; + project.fundingLevel0 = item.fundingLevel0; + + this.projects.push( project); + this.validInput = this.isValidInput(project); + + }, + err => { + this.validInput = this.isValidInput(null); + console.log("An error occured") + }); + } + getPublicationById(id:string, isInlineResult:boolean){ + + this.sub = this.publicationsSearch.searchPublicationById(id).subscribe( + data => { + var item =data[0]; + var result: ClaimResult = new ClaimResult(); + result.id=id; + result.type="publication"; + result.source="openaire"; + result.title = item['title'].name; + result.url= item['title'].url; + result.result = item; + result.accessRights = item['title'].accessMode; + result.date = item.year; + this.displayedResult = result; + if(isInlineResult){ + this.inlineResult = result; + }else{ + this.results.push( result); + } + this.validInput = this.isValidInput(result); + }, + err => { + this.validInput = this.isValidInput(null); + console.log("An error occured") + }); + } + getDatasetById(id:string, isInlineResult:boolean){ + this.sub = this.datasetsSearch.searchDatasetById(id).subscribe( + data => { + var item =data[0]; + var result: ClaimResult = new ClaimResult(); + result.id=id; + result.type="dataset"; + result.source="openaire"; + result.title = item['title'].name; + result.url= item['title'].url; + result.result = item; + result.accessRights = item['title'].accessMode; + result.date = item.year; this.displayedResult = result; + if(isInlineResult){ + this.inlineResult = result; + }else{ + this.results.push( result); + } + this.validInput = this.isValidInput(result); + }, + err => { + this.validInput = this.isValidInput(null); + console.log("An error occured") + }); + + } + + + + + + + +} diff --git a/portal-4cli/src/app/claims/directLinking/directLinking.module.ts b/portal-4cli/src/app/claims/directLinking/directLinking.module.ts new file mode 100644 index 00000000..aa5ab421 --- /dev/null +++ b/portal-4cli/src/app/claims/directLinking/directLinking.module.ts @@ -0,0 +1,39 @@ +import { NgModule } from '@angular/core'; + +import { SharedModule } from '../../shared/shared.module'; +import { DirectLinkingComponent } from './directLinking.component'; +import { DirectLinkingRoutingModule } from './directLinking-routing.module'; + +import {SelectedProjectsModule} from '../linking/selected/selectedProjects.module'; +import {SelectedContextsModule} from '../linking/selected/selectedContexts.module'; +import {SelectedPublicationsModule} from '../linking/selected/selectedResults.module'; +import {InsertClaimsModule} from '../linking/insertClaim/insertClaim.module'; +import {StartOverModule} from '../claim-utils/startOver.module'; + +import {EntitySearchServiceModule} from '../../utils/entitiesAutoComplete/entitySearchService.module'; +import {PublicationsServiceModule} from '../../services/publicationsService.module'; +import {DatasetsServiceModule} from '../../services/datasetsService.module'; +import {LoginGuard} from'../../login/loginGuard.guard'; +import {PreviousRouteRecorder} from '../../utils/piwik/previousRouteRecorder.guard'; +import {HelperModule} from '../../utils/helper/helper.module'; +import {ClaimContextSearchFormModule} from '../claim-utils/claimContextSearchForm.module'; +import {ClaimProjectsSearchFormModule} from '../claim-utils/claimProjectSearchForm.module'; +import {ClaimResultSearchFormModule} from '../claim-utils/claimResultSearchForm.module'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + + +@NgModule({ + imports: [ + SharedModule, + DirectLinkingRoutingModule,SelectedProjectsModule, SelectedContextsModule, SelectedPublicationsModule, InsertClaimsModule, + EntitySearchServiceModule, PublicationsServiceModule, DatasetsServiceModule, StartOverModule, HelperModule, + ClaimContextSearchFormModule, ClaimProjectsSearchFormModule, ClaimResultSearchFormModule + + + ], + providers:[LoginGuard, PreviousRouteRecorder, IsRouteEnabled], + declarations: [ + DirectLinkingComponent + ], exports:[DirectLinkingComponent] +}) +export class DirectLinkingModule { } diff --git a/portal-4cli/src/app/claims/linking/bulkClaim/bulkClaim.component.ts b/portal-4cli/src/app/claims/linking/bulkClaim/bulkClaim.component.ts new file mode 100644 index 00000000..bc9ea125 --- /dev/null +++ b/portal-4cli/src/app/claims/linking/bulkClaim/bulkClaim.component.ts @@ -0,0 +1,256 @@ +import {Component, Input, Output, EventEmitter,ViewChild} from '@angular/core'; +import {Observable} from 'rxjs/Observable'; +import {SearchCrossrefService} from '../../claim-utils/service/searchCrossref.service'; +import {SearchDataciteService} from '../../claim-utils/service/searchDatacite.service'; + +import {ModalLoading} from '../../../utils/modal/loading.component'; +import {Dates, DOI} from '../../../utils/string-utils.class'; +import {OpenaireProperties} from '../../../utils/properties/openaireProperties'; +import {ClaimResult} from '../../claim-utils/claimEntities.class'; + + +@Component({ + selector: 'bulk-claim', + template: ` +
+
+ + + + + + + +
Upload a DOI csv file:
+ + + + + + + +
+ + + +
+ ` + +}) +//[(ngModel)]="date" +export class BulkClaimComponent { + filesToUpload: Array; + navigateTo: string = "Search"; + source: string = "crossref"; + type : string = "publication"; + resultsFromSearch:number; + @Input() public select:boolean = true ; + @Input() public results; + + allIds:string[] = []; + foundIds:string[] = []; + duplicateIds:string[] = []; + notFoundIds:string[] = []; + noValidIds:string[] = []; + showReport:boolean = false; + showInfo :boolean = false; + @ViewChild (ModalLoading) loading : ModalLoading ; + errorMessage = ""; + infoMEssage = ""; + enableUpload:boolean = true; + constructor(private _searchCrossrefService: SearchCrossrefService, private _searchDataciteService: SearchDataciteService) { + this.filesToUpload = []; + } + ngOnInit() {} + + upload() { + this.enableUpload = false; + this.showReport = false; + this.errorMessage = ""; + if(this.filesToUpload.length == 0){ + this.errorMessage = "There is no selected file to upload."; + return ; + } + this.loading.open(); + + this.makeFileRequest(OpenaireProperties.getUploadServiceUrl(), [], this.filesToUpload).then((result) => { + var rows = (result as any).split('\n'); // I have used space, you can use any thing. + var i = 0; + this.duplicateIds = []; + this.allIds = []; + this.foundIds = []; + this.noValidIds = []; + this.results.slice(0,this.results.length); + this.notFoundIds = []; + + for(i=0;i-1){ + this.duplicateIds.push(id); + }else{ + this.allIds.push(id); + this.fetchResult(id,accessMode,embargoDate); + } + }else{ + this.noValidIds.push(id); + } + } + + } + + }, (error) => { + this.enableUpload = true; + console.log(error); + this.loading.close(); + this.errorMessage = "An error occured while uploading..."; + }); + } + private removeDoubleQuotes(value){ + if(value.indexOf('"')== 0){ + value = value.substring(1,value.length); + } + var index =+value.indexOf('"'); + if(index == (value.length - 1) || index == (value.length - 2) ){ + value = value.substring(0,index); + } + return value; + } + private validateAccessMode(value){ + var accessModes = ["OPEN", "CLOSED", "EMBARGO"]; + if(accessModes.indexOf(value) > -1){ + return true; + } + + return false; + } + + fileChangeEvent(fileInput: any){ + this.filesToUpload = > fileInput.target.files; + } + + makeFileRequest(url: string, params: Array, files: Array) { + return new Promise((resolve, reject) => { + var formData: any = new FormData(); + var xhr = new XMLHttpRequest(); + for(var 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); + }); + } + + fetchResult(id:string,accessMode:string,date:string){ + this._searchCrossrefService.searchCrossrefByDOIs([id]).subscribe( + data => { + + var crossrefResult = data.items[0]; + if(data.items.length > 0){ + this.foundIds.push(id); + var result: ClaimResult = ClaimResult.generateResult(crossrefResult, id,"crossref","publication", crossrefResult.URL, crossrefResult.title, crossrefResult.created['date-time'], accessMode); + result.embargoEndDate = date; + this.results.push(result); + this.endOfFetching(); + }else{ + this.searchInDatacite(id,accessMode,date); + // this.notFoundIds.push(id); + } + }, + err => { + console.log(err); + this.notFoundIds.push(id); + this.endOfFetching(); + } + ); + } + searchInDatacite(id:string,accessMode:string,date:string){ + this._searchDataciteService.getDataciteResultByDOI(id).subscribe( + item => { + var dataciteResult = item.data; + + if(dataciteResult != null && dataciteResult.attributes!= null ){ + + this.foundIds.push(id); + var result: ClaimResult = ClaimResult.generateResult(dataciteResult, id,"datacite","dataset", 'http://dx.doi.org/'+dataciteResult.attributes.doi, dataciteResult.attributes.title, dataciteResult.attributes.published, accessMode); + result.embargoEndDate = date; + this.results.push(result); + }else{ + this.notFoundIds.push(id); + } + this.endOfFetching(); + }, + err => { + console.log(err); + this.notFoundIds.push(id); + this.endOfFetching(); + } + ); + } + endOfFetching(){ + if(this.allIds.length == this.foundIds.length+this.notFoundIds.length+ this.duplicateIds.length ){ + this.showReport = true; + this.enableUpload = true; + this.loading.close(); + + } + + } +} diff --git a/portal-4cli/src/app/claims/linking/bulkClaim/bulkClaim.module.ts b/portal-4cli/src/app/claims/linking/bulkClaim/bulkClaim.module.ts new file mode 100644 index 00000000..7f35a46f --- /dev/null +++ b/portal-4cli/src/app/claims/linking/bulkClaim/bulkClaim.module.ts @@ -0,0 +1,17 @@ +import { NgModule } from '@angular/core'; + +import { SharedModule } from '../../../shared/shared.module'; +import {LoadingModalModule} from '../../../utils/modal/loadingModal.module'; +import {BulkClaimComponent} from './bulkClaim.component'; +import {SearchCrossrefServiceModule} from '../../claim-utils/service/searchCrossrefService.module'; +import {SearchDataciteServiceModule} from '../../claim-utils/service/searchDataciteService.module'; + +@NgModule({ + imports: [ + SharedModule, LoadingModalModule, SearchCrossrefServiceModule + ], + declarations: [ +BulkClaimComponent + ], exports:[ BulkClaimComponent] +}) +export class BulkClaimModule { } diff --git a/portal-4cli/src/app/claims/linking/bulkLinking.component.ts b/portal-4cli/src/app/claims/linking/bulkLinking.component.ts new file mode 100644 index 00000000..96e32dcf --- /dev/null +++ b/portal-4cli/src/app/claims/linking/bulkLinking.component.ts @@ -0,0 +1,16 @@ +// import {Component, Input} from '@angular/core'; +// import {Observable} from 'rxjs/Observable'; +// +// @Component({ +// selector: 'bulk-linking', +// //providers: [MdRadioDispatcher], +// template: ` +// +// ` +// +// }) +// //[(ngModel)]="date" +// export class BulkLinkingComponent { +// constructor () { +// } +// } diff --git a/portal-4cli/src/app/claims/linking/bulkLinking.module.ts b/portal-4cli/src/app/claims/linking/bulkLinking.module.ts new file mode 100644 index 00000000..55c71221 --- /dev/null +++ b/portal-4cli/src/app/claims/linking/bulkLinking.module.ts @@ -0,0 +1,20 @@ +// import { NgModule } from '@angular/core'; +// +// import { SharedModule } from '../../shared/shared.module'; +// import { BulkLinkingComponent } from './bulkLinking.component'; +// import { BulkLinkingRoutingModule } from './bulkLinking-routing.module'; +// import {LinkingGenericModule} from './linkingGeneric.module'; +// import {BulkClaimModule} from './bulkClaim/bulkClaim.module'; +// @NgModule({ +// imports: [ +// SharedModule, +// BulkLinkingRoutingModule, +// LinkingGenericModule, +// BulkClaimModule +// +// ], +// declarations: [ +// BulkLinkingComponent +// ], exports:[BulkLinkingComponent] +// }) +// export class BulkLinkingModule { } diff --git a/portal-4cli/src/app/claims/linking/insertClaim/insertClaim.component.ts b/portal-4cli/src/app/claims/linking/insertClaim/insertClaim.component.ts new file mode 100644 index 00000000..a916c757 --- /dev/null +++ b/portal-4cli/src/app/claims/linking/insertClaim/insertClaim.component.ts @@ -0,0 +1,369 @@ +import {Component, Input, Output, EventEmitter, ViewChild} from '@angular/core'; +import {Observable} from 'rxjs/Observable'; +import {Router} from '@angular/router'; +import {ClaimsService} from '../../claim-utils/service/claims.service'; + +import {ModalLoading} from '../../../utils/modal/loading.component'; +import {AlertModal} from '../../../utils/modal/alert'; +import {Md5} from 'ts-md5/dist/md5'; +import {Session} from '../../../login/utils/helper.class'; +import {ErrorCodes} from '../../../login/utils/guardHelper.class'; + +@Component({ + selector: 'claim-insert', + template: ` +
+ +
There are {{insertedClaims.length}} claims, follow the link to manage your claims
+
+
+ +
+ + + + + + + ` +}) +export class ClaimInsertComponent { + constructor (private claimService: ClaimsService, private _router:Router) {} + ngOnInit() { + // console.info("Inlineentity:" +(this.inlineEntity)?this.inlineEntity+(this.inlineEntity.id)?this.inlineEntity.id:"no id":"null"+ + " show "+ (!this.claiming && this.showButton) ); + } + + + @Input() public contexts; + @Input() public projects; + @Input() public results; + @Input() public showButton:boolean = true; + @Input() show='claim'; + @Input() inlineEntity = null; // the entity from the landing page + @Output() showChange = new EventEmitter(); + + @ViewChild (ModalLoading) loading : ModalLoading ; + @ViewChild(AlertModal) alert; + + public claiming =false; + public error = false; + public errorMessage = ""; + public warningMessage = ""; + public claimsTODO:number = 0; + public claims:number = 0; + + private servicesRespond:number = 0; + private insertedClaims=[]; + private errorInClaims=[]; + private insertedRecords=[]; + private errorInRecords=[]; +public validateInsertions(){ + // console.info("Inlineentity:" +(this.inlineEntity)?this.inlineEntity+(this.inlineEntity.id)?this.inlineEntity.id:"no id":"null"+ + " show "+ (!this.claiming && this.showButton) ); + if(this.validate()){ + if(this.validateDates()){ + this.insertActions(); + return true; + } + } + return +} +private insertActions(){ + this.servicesRespond = 0; + this.insertedClaims=[]; + this.errorInClaims=[]; + this.insertedRecords=[]; + this.errorInRecords=[]; + if(!Session.isValidAndRemove()){ + this.showButton = false; + localStorage.setItem("projects", JSON.stringify(this.projects)); + localStorage.setItem("contexts", JSON.stringify(this.contexts)); + localStorage.setItem("results", JSON.stringify(this.results)); + if(this.inlineEntity != null){ + localStorage.setItem("inlineEntity", JSON.stringify(this.inlineEntity)); + } + + this._router.navigate(['/user-info'], { queryParams: { "errorCode": ErrorCodes.NOT_VALID, "redirectUrl": this._router.url} }); + + }else{ + this.claiming = true; + var user=Session.getUserEmail(); + this.loading.open(); + var claims = []; + var directclaims = []; + if(this.results){ + console.info("results: "+this.results.length); + + for (var i = 0; i < this.results.length; i++) { + var result=this.results[i]; + if(["crossref","datacite","orcid"].indexOf(result.source) != -1){ + directclaims.push({"id":result.id, "record":this.createDirectClaim(result,this.projects,this.contexts)}); + } + if(this.contexts){ + for (var j = 0; j < this.contexts.length; j++) { + var context = this.contexts[j]; + var claim = this.createContextClaim(result, context, user); + claims.push(claim); + } + } + if(this.projects){ + for (var k = 0; k < this.projects.length; k++) { + var project = this.projects[k]; + var projectClaim = this.createProjectClaim(result, project, user); + claims.push(projectClaim); + } + } + if(this.inlineEntity != null){ + var resultClaim = this.createResultClaim(this.inlineEntity, result, user); + claims.push(resultClaim); + } + + } + } + //first call direct index service - when call is done (success or error) call isertBulkClaims method to insert claims in DB + console.info("\n\ndirectclaims: "+directclaims.length+"\n\n"); + this.claimService.insertDirectRecords(directclaims).subscribe( + data => { + this.insertedRecords = data.insertedIds; + + this.errorInRecords = data.errorInClaims; + this.isertBulkClaims(claims); + }, + err => { + err=err.json(); + if(err.insertedIds && err.insertedIds.length >0){ + this.insertedRecords = err.insertedIds; + } + if(err.errorInClaims && err.errorInClaims.length >0){ + this.errorInRecords = err.errorInClaims; + } + this.isertBulkClaims(claims); + } + ); + + } + +} + +private isertBulkClaims(claims){ + console.info("try to insert "+claims.length+" claims"); + this.claimService.insertBulkClaims(claims).subscribe( + data => { + this.insertedClaims = data.insertedIds; + this.errorInClaims = data.errorInClaims; + this.afterclaimsInsertion(); + }, + err => { + err=err.json(); + if(err.insertedIds && err.insertedIds.length >0){ + this.insertedClaims = err.insertedIds; + } + if(err.errorInClaims && err.errorInClaims.length >0){ + this.errorInClaims = err.errorInClaims; + } + this.afterclaimsInsertion(); + } + ); +} +private validate(){ + this.warningMessage = ""; + this.errorMessage = ""; + if( this.results && this.results.length == 0){ + this.warningMessage = "There are no research results selected."; + }else if((!this.contexts|| this.contexts.length==0 )&&(!this.projects|| this.projects.length==0 )&& ( this.inlineEntity == null)){ + this.warningMessage = "There are no projects or communities to link."; + // }else if (this.inline && !this.inlineEntity){ + // this.errorMessage = "No inline entity"; + // console.log(this.inline + " "+ this.inlineEntity); + }else{ + return true; + } + return false; +} +private validateDates(){ + if(this.projects){ + for (var k = 0; k < this.projects.length; k++) { + var project = this.projects[k]; + console.info(project.startDate+" "+project.endDate + " "+project.projectAcronym); + if(this.results){ + for (var i = 0; i < this.results.length; i++) { + var result = this.results[i]; + if(result.date && result.date != null){ + console.info("Date :"+ result.date + " & embargoEndDate :" +result.embargoEndDate ); + if((project.startDate && result.date < project.startDate) || ( project.endDate && result.date > (project.endDate+5)) ){ + this.confirmOpen(); + return false; + } + } + } + } + + + } + } + if(this.results){ + for (var i = 0; i < this.results.length; i++) { + var result = this.results[i]; + if(result.date && result.date != null){ + console.info("Date :"+ result.date + " & embargoEndDate :" +result.embargoEndDate ); + if((result.embargoEndDate && result.embargoEndDate != null) && result.date >result.embargoEndDate ){ + this.confirmOpen(); + return false; + } + } + } + } + + return true; +} +private afterclaimsInsertion(){ + + // this.servicesRespond++; + // if(this.servicesRespond == 2){ + this.loading.close(); + this.claiming = false; + + if(this.errorInClaims.length == 0 && this.insertedClaims.length > 0 && this.errorInRecords.length == 0){ + + this._router.navigate( ['/myclaims'] ); + this.showChange.emit({ + value: this.show + }); + }else{ + this.errorsInClaimsInsertion(); + } + // } +} +private errorsInClaimsInsertion(){ + this.errorMessage = ""; + this.loading.close(); + this.error = true; + this.claiming = false; + this.showButton = false; + var text ="" + console.log("Errors: this.errorInRecords.length: "+this.errorInRecords.length+" - this.errorInClaims.length: "+this.errorInClaims.length); + if(this.errorInRecords.length>0){ + text+="
The following records couldn't automatically inserted to the Openaire Info space:
    "; + for(var i=0; i< this.errorInRecords.length ; i++){ + for(var k=0; k< this.results.length ; k++){ + if(this.results[k].id == this.errorInRecords[i]){ + text+="
  • "+this.results[i].title+" from "+this.results[i].source+"
  • "; + } + } + } + text+="
"; + + } + if(this.errorInClaims.length > 0){ + text+="
The following links couldn't be saved:
    "; + for(var i=0; i< this.errorInClaims.length ; i++){ + // var claim = { claimedBy : user, sourceId : context.concept.id, sourceType : "context", sourceCollectedFrom:"openaire", sourceAccessRights:"OPEN", sourceEmbargoEndDate:"no", targetId : result.id , targetType : result.type, targetCollectedFrom: result.source, targetAccessRights:result.accessRights, targetEmbargoEndDate: (result.embargoEndDate == null?"":result.embargoEndDate)}; + + text+="
  • "+this.errorInClaims[i].sourceType+": "+this.errorInClaims[i].sourceId +"(from "+this.errorInClaims[i].sourceCollectedFrom+") link to "+this.errorInClaims[i].targetType+": "+this.errorInClaims[i].targetId +"(from "+this.errorInClaims[i].targetCollectedFrom+")
  • "; + + } + text+="
"; + } + this.errorMessage+="
An error occured:
"+text; + console.log(text); + // if(this.inline){ + // this.show = "error"; + // this.showChange.emit({ + // value: this.show + // }); + // } + +} + + + + private createContextClaim(result:any, context:any, user:any){ + var claim = { claimedBy : user, sourceId : context.concept.id, sourceType : "context", sourceCollectedFrom:"openaire", sourceAccessRights:"OPEN", sourceEmbargoEndDate:"no", targetId : result.id , targetType : result.type, targetCollectedFrom: result.source, targetAccessRights:result.accessRights, targetEmbargoEndDate: (result.embargoEndDate == null?"":result.embargoEndDate)}; + return claim; + } + private createProjectClaim(result:any, project:any, user:any){ + //project.projectId + // var dummyID = "dummyID"; + var claim = { claimedBy : user, sourceId : project.projectId, sourceType : "project", sourceCollectedFrom:"openaire", sourceAccessRights:"OPEN", sourceEmbargoEndDate:"", targetId : result.id , targetType : result.type, targetCollectedFrom: result.source, targetAccessRights:result.accessRights, targetEmbargoEndDate: (result.embargoEndDate == null?"":result.embargoEndDate)}; + return claim; + } + private createResultClaim(inlineResult:any, result:any, user:any){ + var claim = { claimedBy : user, sourceId : result.id, sourceType : result.type, sourceCollectedFrom: result.source, sourceAccessRights: result.accessRights, sourceEmbargoEndDate: result.embargoEndDate, targetId : inlineResult.id , targetType : inlineResult.type, targetCollectedFrom: inlineResult.source, targetAccessRights: inlineResult.accessRights, targetEmbargoEndDate: (inlineResult.embargoEndDate == null?"":inlineResult.embargoEndDate)}; + return claim; + } +createDirectClaim(result, projects, contexts){ + var entity = {}; + var md5_id = Md5.hashStr(result.id); + entity["originalId"]="userclaim___::"+md5_id; + entity["openaireId"]="userclaim___::"+md5_id; + entity["title"]=result.title; + entity["title"] =(Array.isArray(result.title) && result.title.length > 0 )?result.title[0]:result.title; + + if(result.authors && result.authors.length > 0){ + entity["authors"]=result.authors; + } + if(result.publisher){ + entity["publisher"]=result.publisher; + } + if(result.description){ + entity["description"]=result.description; + } + // entity["language"]=""; no info + entity["type"]=result.type; + if(result.source == "crossref" || result.source == "datacite"){ + entity["pids"]= [];//{type:string, value:string}[]; + entity["pids"].push({type:"doi",value:result.id}) + } + entity["licenseCode"]=result.accessRights; + if(result.accessRights == "EMBARGO"){ + entity["embargoEndDate"]=result.embargoEndDate; + } + if(result.type =="publication"){ + entity["resourceType"]="0001"; + }else{ + entity["resourceType"]="0021"; + } + entity["url"]=result.url; + entity["hostedById"]="openaire____::1256f046-bf1f-4afc-8b47-d0b147148b18"; + if(result.source == "crossref"){ + entity["collectedFromId"]="openaire____::crossref"; + }else if(result.source == "datacite"){ + entity["collectedFromId"]="openaire____::datacite"; + }else if(result.source == "orcid"){ + entity["collectedFromId"]="openaire____::orcid"; + }else if(result.source == "orpenaire"){ + entity["collectedFromId"]="openaire____::driver"; + } + + if(projects.length>0){ + entity["linksToProjects"]=[]; + for(var i =0; i < projects.length; i++){ + // "info:eu-repo/grantAgreement/EC/FP7/283595/EU//OpenAIREplus", + entity["linksToProjects"].push("info:eu-repo/grantAgreement/"+projects[i].funderName+"/"+projects[i].fundingLevel0+"/"+projects[i].code+"/"+projects[i].jurisdiction+"/"+projects[i].projectName+"/"+projects[i].projectAcronym); + } + } + if(contexts.length > 0){ + entity["contexts"]=[]; + for(var i =0; i < contexts.length; i++){ + entity["contexts"].push(contexts[i].concept.id); + } + } + var json = JSON.stringify(entity); + console.log("\nJSON:\n"+json); + return entity; + + + +} + confirmOpen(){ + this.alert.cancelButton = true; + this.alert.okButton = true; + this.alert.alertTitle = "Invalid dates"; + this.alert.message = "There is a research result whose publication date is after project end date or before project start date. Or embargo end date of a research result is before research result's publication date."; + this.alert.okButtonText = "Proceed anyway"; + this.alert.cancelButtonText = "Cancel"; + this.alert.open(); + } + confirmClose(data){ + this.insertActions(); + } +} diff --git a/portal-4cli/src/app/claims/linking/insertClaim/insertClaim.module.ts b/portal-4cli/src/app/claims/linking/insertClaim/insertClaim.module.ts new file mode 100644 index 00000000..6b2c4bb0 --- /dev/null +++ b/portal-4cli/src/app/claims/linking/insertClaim/insertClaim.module.ts @@ -0,0 +1,16 @@ +import { NgModule } from '@angular/core'; + +import { SharedModule } from '../../../shared/shared.module'; +import {AlertModalModule} from '../../../utils/modal/alertModal.module'; +import {LoadingModalModule} from '../../../utils/modal/loadingModal.module'; +import {ClaimInsertComponent} from './insertClaim.component'; +import {ClaimServiceModule} from '../../claim-utils/service/claimsService.module'; + +@NgModule({ + imports: [ + SharedModule, AlertModalModule, LoadingModalModule, ClaimServiceModule + ], + declarations: [ClaimInsertComponent], + exports:[ ClaimInsertComponent] +}) +export class InsertClaimsModule { } diff --git a/portal-4cli/src/app/claims/linking/linking-routing.module.ts b/portal-4cli/src/app/claims/linking/linking-routing.module.ts new file mode 100644 index 00000000..2660b77f --- /dev/null +++ b/portal-4cli/src/app/claims/linking/linking-routing.module.ts @@ -0,0 +1,19 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { LoginGuard} from'../../login/loginGuard.guard'; + +import { LinkingGenericComponent } from './linkingGeneric.component'; +import {PreviousRouteRecorder} from'../../utils/piwik/previousRouteRecorder.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + RouterModule.forChild([ + { path: '', component: LinkingGenericComponent, canActivate: [IsRouteEnabled, LoginGuard], data: { + redirect: '/error' + }, canDeactivate: [PreviousRouteRecorder]}, + + ]) + ] +}) +export class LinkingRoutingModule { } diff --git a/portal-4cli/src/app/claims/linking/linking.component.ts b/portal-4cli/src/app/claims/linking/linking.component.ts new file mode 100644 index 00000000..dbf7a23f --- /dev/null +++ b/portal-4cli/src/app/claims/linking/linking.component.ts @@ -0,0 +1,16 @@ +// import {Component, Input} from '@angular/core'; +// import {Observable} from 'rxjs/Observable'; +// import {LinkingGenericComponent} from './linkingGeneric.component'; +// +// @Component({ +// selector: 'linking', +// template: ` +// +// ` +// +// }) +// export class LinkingComponent { +// constructor () { +// } +// +// } diff --git a/portal-4cli/src/app/claims/linking/linkingGeneric.component.html b/portal-4cli/src/app/claims/linking/linkingGeneric.component.html new file mode 100644 index 00000000..218b2a68 --- /dev/null +++ b/portal-4cli/src/app/claims/linking/linkingGeneric.component.html @@ -0,0 +1,144 @@ +
+
+
+ +
+
+ Link +
+ +
+ +
+
+ +
+ + + + + + + + + + + + +
+ +
    +
  • + + +
  • +
  • + + +
  • + + +
+
+ + + + + +
+
+
+ + + + + + + + + + + + +
+ + +
+
+
+ + +
+ + + + +
+ +
+ + + + +
+ +
+
+
diff --git a/portal-4cli/src/app/claims/linking/linkingGeneric.component.ts b/portal-4cli/src/app/claims/linking/linkingGeneric.component.ts new file mode 100644 index 00000000..379b8677 --- /dev/null +++ b/portal-4cli/src/app/claims/linking/linkingGeneric.component.ts @@ -0,0 +1,117 @@ +import {Component, Input} from '@angular/core'; +import {Observable} from 'rxjs/Observable'; +import {ActivatedRoute, Router} from '@angular/router'; +import {EntitiesSearchService} from '../../utils/entitiesAutoComplete/entitySearch.service'; +import {ClaimProject, ClaimResult} from '../claim-utils/claimEntities.class'; +import {SearchPublicationsService} from '../../services/searchPublications.service'; +import {SearchDatasetsService} from '../../services/searchDatasets.service'; +import { Meta} from '../../../angular2-meta'; +declare var UIkit:any; + +@Component({ + selector: 'linking-generic', + templateUrl: 'linkingGeneric.component.html' + +}) +export class LinkingGenericComponent { + + @Input() bulkMode: boolean = false; + sourceType:string; + targetType:string; + step:number = 1; + contexts=[]; + projects=[]; + results = []; + show = "project"; + date='8-6-2016'; + keyword: string = ""; + linkType:string ="project"; // link type (selected in home page) : project, context, software, etc + /* url Parameters for inline linking */ + id:string = null; //entity id + type:string = null; // entity type (publication or research data) + linkTo:string = null; // entity type (project or context or result) + + entityTypes=["dataset", "publication", "project","context"]; + inlineResult:ClaimResult =null; + sub:any =null; + constructor ( private _router: Router, private route: ActivatedRoute, private entitySearch:EntitiesSearchService, + private publicationsSearch:SearchPublicationsService, private datasetsSearch:SearchDatasetsService, private _meta: Meta) { + this._meta.setTitle("OpenAIRE | Linking"); + } + ngOnInit() { + if( typeof localStorage !== 'undefined') { + if(localStorage.getItem("projects")){ + this.projects = JSON.parse(localStorage.getItem("projects")); + + } + if(localStorage.getItem("contexts")){ + this.contexts = JSON.parse(localStorage.getItem("contexts")); + } + if(localStorage.getItem("results")){ + this.results = JSON.parse(localStorage.getItem("results")); + + } + localStorage.removeItem("projects"); + localStorage.removeItem("contexts"); + localStorage.removeItem("results"); + } + } + + next(){ + + if((this.show == 'result' && this.keyword == '')||(this.show == 'dataset' || this.show == 'publication')){ + this.show='claim'; + + } + } + prev(){ + if(this.show == 'claim'){ + this.show='result'; + } + } + + + resultsChange($event) { + this.results=$event.value; + } + + projectsChange($event) { + this.projects=$event.value; + } + + linkTypeChange($event) { + + this.linkType =$event.value; + this.show="result"; + if(this.bulkMode){ + this.show="claim"; + } + } + + showChange($event) { + this.show=$event.value; + this.showChangedType($event.value); + } + + showChangedType(type:string) { + this.show=type; + if(this.show == 'project' || this.show == 'context' || this.show == 'software'){ + this.linkType = this.show; + } + } + + canProceedToMetadata(){ + if(this.results.length == 0){ + + UIkit.notification({ + message : 'No research results selected!
Please select research results to link with projects and/ or ommunities.', + status : 'warning', + timeout : 1000, + pos : 'top-center' + }); + }else{ + this.show = 'claim'; + this.step = 3; + } + } +} diff --git a/portal-4cli/src/app/claims/linking/linkingGeneric.module.ts b/portal-4cli/src/app/claims/linking/linkingGeneric.module.ts new file mode 100644 index 00000000..d9627a23 --- /dev/null +++ b/portal-4cli/src/app/claims/linking/linkingGeneric.module.ts @@ -0,0 +1,37 @@ +import { NgModule } from '@angular/core'; + +import { SharedModule } from '../../shared/shared.module'; +import {SelectedProjectsModule} from './selected/selectedProjects.module'; +import {SelectedContextsModule} from './selected/selectedContexts.module'; +import {SelectedPublicationsModule} from './selected/selectedResults.module'; +import {InsertClaimsModule} from './insertClaim/insertClaim.module'; +import {LinkingGenericComponent} from './linkingGeneric.component'; +import {EntitySearchServiceModule} from '../../utils/entitiesAutoComplete/entitySearchService.module'; +import {PublicationsServiceModule} from '../../services/publicationsService.module'; +import {DatasetsServiceModule} from '../../services/datasetsService.module'; +import { LinkingRoutingModule } from './linking-routing.module'; +import {StartOverModule} from '../claim-utils/startOver.module'; +import {LoginGuard} from'../../login/loginGuard.guard'; +import {PreviousRouteRecorder} from '../../utils/piwik/previousRouteRecorder.guard'; +import {ClaimContextSearchFormModule} from '../claim-utils/claimContextSearchForm.module'; +import {ClaimProjectsSearchFormModule} from '../claim-utils/claimProjectSearchForm.module'; +import {BulkClaimModule} from './bulkClaim/bulkClaim.module'; +import {ClaimResultSearchFormModule} from '../claim-utils/claimResultSearchForm.module'; +import {HelperModule} from '../../utils/helper/helper.module'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + SharedModule, SelectedProjectsModule, SelectedContextsModule, + SelectedPublicationsModule, + InsertClaimsModule, + EntitySearchServiceModule, PublicationsServiceModule, DatasetsServiceModule, LinkingRoutingModule, StartOverModule, + ClaimContextSearchFormModule, ClaimProjectsSearchFormModule, BulkClaimModule, ClaimResultSearchFormModule, HelperModule + ], + providers:[LoginGuard, PreviousRouteRecorder, IsRouteEnabled], + declarations: [ + LinkingGenericComponent + ], exports:[ + LinkingGenericComponent ] +}) +export class LinkingGenericModule { } diff --git a/portal-4cli/src/app/claims/linking/selected/selectedContexts.component.ts b/portal-4cli/src/app/claims/linking/selected/selectedContexts.component.ts new file mode 100644 index 00000000..c45f571e --- /dev/null +++ b/portal-4cli/src/app/claims/linking/selected/selectedContexts.component.ts @@ -0,0 +1,90 @@ +import {Component, Input,Output, EventEmitter} from '@angular/core'; +import {ClaimContext} from '../../claim-utils/claimEntities.class'; + +@Component({ + selector: 'claim-selected-contexts', + template: ` + + + +
+ + +
+

Selected Communities ({{contexts.length}})

+
    +
  • + {{context.community }} > {{context.category}} > {{context.concept.label}} + + +
  • +
+
+
There are no selected communities
+
+ + + + ` +}) +export class ClaimSelectedContextsComponent { + ngOnInit() { + var myDate = new Date(); + this.todayDate=( myDate.getFullYear()+ "-" +myDate.getMonth() + 1) + "-" + myDate.getDate() ; + this.nextDate= ( (myDate.getFullYear()+100)+ "-" +myDate.getMonth() + 1) + "-" + myDate.getDate() ; + //2015-05-01 + // if(this.linkType == "context"){ + this.showsearch = true + // }else{ + // this.showsearch = false; + // } +} + + + @Input() contexts:ClaimContext[]; + //The following need to be kept in case we have to save the current state + @Input() public projects; + @Input() public results; + @Input() public inlineEntity; + @Input() componentClass:string = ""; //"" or "col-sm-6" for horizontal display (besides projects) + @Input() show='home'; + @Input() title='Communities'; + @Input() linkType:string = "project"; + + @Input() hideType; + @Input() bulkMode:boolean = false; + @Output() showChange = new EventEmitter(); + + showsearch:boolean = false; + + todayDate = ''; + nextDate = ''; + + showType(type){ + if(type != this.show){ + this.show = type; + this.showChange.emit({ + value: this.show + }); + } + } + + + removeContext(item:any){ + var index:number =this.contexts.indexOf(item); + if (index > -1) { + this.contexts.splice(index, 1); + } + + } + contextSelected($event) { + // this.showsearch = false; + } + +} diff --git a/portal-4cli/src/app/claims/linking/selected/selectedContexts.module.ts b/portal-4cli/src/app/claims/linking/selected/selectedContexts.module.ts new file mode 100644 index 00000000..08d3d059 --- /dev/null +++ b/portal-4cli/src/app/claims/linking/selected/selectedContexts.module.ts @@ -0,0 +1,16 @@ +import { NgModule } from '@angular/core'; + +import { SharedModule } from '../../../shared/shared.module'; +import {ClaimSelectedContextsComponent} from './selectedContexts.component'; +// import {ClaimContextSearchFormModule} from '../../claim-utils/claimContextSearchForm.module'; + + @NgModule({ + imports: [ + SharedModule, + // ClaimContextSearchFormModule + ], + declarations: [ + ClaimSelectedContextsComponent + ], exports:[ClaimSelectedContextsComponent] +}) +export class SelectedContextsModule { } diff --git a/portal-4cli/src/app/claims/linking/selected/selectedProjects.component.ts b/portal-4cli/src/app/claims/linking/selected/selectedProjects.component.ts new file mode 100644 index 00000000..5850f11b --- /dev/null +++ b/portal-4cli/src/app/claims/linking/selected/selectedProjects.component.ts @@ -0,0 +1,88 @@ +import {Component, Input,Output, EventEmitter} from '@angular/core'; +import {ClaimProject} from '../../claim-utils/claimEntities.class'; +import {RouterHelper} from '../../../utils/routerHelper.class'; + +@Component({ + selector: 'claim-selected-projects', + template: ` + + +
+ + + +
There are no selected projects
+
+ + + + ` +}) +export class ClaimSelectedProjectsComponent { + + +ngOnInit() { + var myDate = new Date(); + this.todayDate=( myDate.getFullYear()+ "-" +myDate.getMonth() + 1) + "-" + myDate.getDate() ; + this.nextDate= ( (myDate.getFullYear()+100)+ "-" +myDate.getMonth() + 1) + "-" + myDate.getDate() ; + // if(this.linkType == "project"){ + this.showsearch = true + // }else{ + // this.showsearch = false; + // } + //2015-05-01 +} + + +@Input() projects: ClaimProject[]; +@Input() show='home'; +@Input() title='Projects'; +@Input() linkType:string = "project"; +@Input() hideType; +@Input() bulkMode:boolean = false; +@Input() linkToResults:boolean = true; +@Output() projectsChange = new EventEmitter(); +@Output() showChange = new EventEmitter(); +showsearch:boolean = false; + +todayDate = ''; +nextDate = ''; +public routerHelper:RouterHelper = new RouterHelper(); + +removeProject(item:any){ + var index:number =this.projects.indexOf(item); + if (index > -1) { + this.projects.splice(index, 1); + } + this.projectsChange.emit({ + value: this.projects + }); +} +showType(type){ +if(type != this.show){ + this.show = type; + this.showChange.emit({ + value: this.show + }); +} +} +projectSelected($event) { + // this.showsearch = false; +} + + +} diff --git a/portal-4cli/src/app/claims/linking/selected/selectedProjects.module.ts b/portal-4cli/src/app/claims/linking/selected/selectedProjects.module.ts new file mode 100644 index 00000000..e3d96ef7 --- /dev/null +++ b/portal-4cli/src/app/claims/linking/selected/selectedProjects.module.ts @@ -0,0 +1,18 @@ + +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import { SharedModule } from '../../../shared/shared.module'; +import {ClaimSelectedProjectsComponent} from './selectedProjects.component'; +// import {ClaimProjectsSearchFormModule} from '../../claim-utils/claimProjectSearchForm.module'; + + @NgModule({ + imports: [ + SharedModule, RouterModule, + // ClaimProjectsSearchFormModule + ], + declarations: [ + ClaimSelectedProjectsComponent + ], exports:[ClaimSelectedProjectsComponent] +}) +export class SelectedProjectsModule { } diff --git a/portal-4cli/src/app/claims/linking/selected/selectedResults.component.ts b/portal-4cli/src/app/claims/linking/selected/selectedResults.component.ts new file mode 100644 index 00000000..a33abc1f --- /dev/null +++ b/portal-4cli/src/app/claims/linking/selected/selectedResults.component.ts @@ -0,0 +1,224 @@ +import {Component, Input,Output, EventEmitter, ViewChild} from '@angular/core'; +import {AlertModal} from '../../../utils/modal/alert'; +import {ClaimResult} from '../../claim-utils/claimEntities.class'; +import {IMyOptions, IMyDateModel} from '../../../utils/my-date-picker/interfaces/index'; +import {Dates} from '../../../utils/string-utils.class'; + +@Component({ + selector: 'claim-selected-results', + template: ` + + + + + +
+
There are no selected research results
+
+

{{title}} ({{results.length}})

+ + + + + + + + + + + + + + + + + + +
Research Result Change type and access mode
+
+ + {{pub.title}} + {{pub.title}} + +
+ + Publisher: {{pub.publisher}} + Journal: {{pub.result['journal-title'].value}} + ({{pub.date.substring(0,4)}}) + +
Authors: {{author}}{{(i < (pub.authors.slice(0,10).length-1))?"; ":""}}{{(i == pub.authors.slice(0,10).length-1 && pub.authors.length > 10)?"...":""}}
+ + + +
Editors: {{author.family}} {{author.given}}{{(i < (pub.result.editor.slice(0,10).length-1))?"; ":""}}{{(i == pub.result.editor.slice(0,10).length-1 && pub.result.editor.length > 10)?"...":""}}
+ + +
Authors: {{author}}{{(i < (pub.result.authors.slice(0,10).length-1))?"; ":""}}{{(i == pub.result.authors.slice(0,10).length-1 && pub.result.authors.length > 10)?"...":""}}
+ + + + + + +
{{pub.source}} + {{pub.accessRights}} + {{pub.type}} +
+
+ + + + + + + + Currently you cannot change metadata from OpenAIRE + +
+
+ + +
+
+
+ + + ` + +}) +export class ClaimSelectedResultsComponent { + ngOnInit() { + var myDate = new Date(); + this.nextDate = { date: { year: myDate.getFullYear()+10, month: (myDate.getMonth()+1), day: myDate.getDate() } }; + //2015-05-01 + +} + + @Input() results: ClaimResult[]; + @Input() title:string = "Research Results"; + @Input() showAccessRights:boolean = false; + @Input() bulkMode:boolean = false; + // @Output()resultsChange = new EventEmitter(); + @Input() showSearch:boolean = false; + nextDate = {}; + @ViewChild(AlertModal) alertApplyAll; + +public commonAccessRights = "OPEN"; // for access rights- changes when user apply a change to every result +public commonEmbargoEndDate; // for access rights: embargoEndDate - changes when user apply a change to every result +public commonType; // for research result type - changes when user apply a change to every result +public typeChanged:boolean = true; // +accessTypes = ["OPEN","CLOSED","EMBARGO","RESTRICTED"]; +private myDatePickerOptions: IMyOptions = { + // other options... + dateFormat: 'yyyy-mm-dd', + selectionTxtFontSize: '15px', + height:'28px', + width: '100%', + editableDateField: false, + showClearDateBtn: false + }; + + + removePublication(item:any){ + var index:number =this.results.indexOf(item); + if (index > -1) { + this.results.splice(index, 1); + } + // this.resultsChange.emit({ + // value: this.results + // }); + } + + + onDateChanged (event:any, item:any) { + item.embargoEndDate = Dates.getDateFromString(event.formatted); + if(this.results.length > 1 ){ + this.commonAccessRights = "EMBARGO"; + this.commonEmbargoEndDate = item.embargoEndDate; + this.confirmOpen(false,"Do you wish to apply the change to every result?"); + } + + } + onTypeChanged (event:any, item:any) { + item.type =(event); + if(this.results.length > 1 ){ + this.commonType = item.type; + this.confirmOpen(true, "Do you wish to apply the change to every result?"); + } + + } + // resultsChanged($event) { + // this.results=$event.value; + // this.resultsChange.emit({ + // value: this.results + // }); + // } + /* The following methods: + *typeChanged + *confirmOpen + *confirmClose + implement the functionality: change accessRights of a publication - apply to all if asked */ + accessRightsTypeChanged (type:any, item:any) { + item.accessRights = type; + if(this.results.length > 1 ){ + this.commonAccessRights = type; + if(this.commonAccessRights != "EMBARGO"){ + this.commonEmbargoEndDate = item.embargoEndDate; + this.confirmOpen(false, "Do you wish to apply the change to every result?"); + } + } + + } + confirmOpen(type: boolean, message: string){ + this.typeChanged = type; + this.alertApplyAll.cancelButton = true; + this.alertApplyAll.okButton = true; + this.alertApplyAll.alertTitle = "Change metadata"; + this.alertApplyAll.message = "Do you wish to apply the change to every result?"; + this.alertApplyAll.okButtonText = "Yes"; + this.alertApplyAll.cancelButtonText = "No"; + this.alertApplyAll.open(); + } + confirmClose(data){ + if(this.typeChanged){ + + for (var i = 0; i < this.results.length; i++) { + if(this.results[i].source != 'openaire' ){ + this.results[i].type = this.commonType; + } + } + + }else{ + for (var i = 0; i < this.results.length; i++) { + if(this.results[i].source != 'openaire' ){ + this.results[i].accessRights = this.commonAccessRights; + if(this.commonAccessRights == "EMBARGO"){ + this.results[i].embargoEndDate = this.commonEmbargoEndDate; + } + } + } + } + } +} diff --git a/portal-4cli/src/app/claims/linking/selected/selectedResults.module.ts b/portal-4cli/src/app/claims/linking/selected/selectedResults.module.ts new file mode 100644 index 00000000..0b12fb2d --- /dev/null +++ b/portal-4cli/src/app/claims/linking/selected/selectedResults.module.ts @@ -0,0 +1,21 @@ +import { NgModule } from '@angular/core'; + +import { SharedModule } from '../../../shared/shared.module'; +import {ClaimSelectedResultsComponent} from './selectedResults.component'; +import {AlertModalModule} from '../../../utils/modal/alertModal.module'; +import { MyDatePickerModule } from '../../../utils/my-date-picker/my-date-picker.module'; +// import {BulkClaimModule} from '../bulkClaim/bulkClaim.module'; +// import {ClaimResultSearchFormModule} from '../../claim-utils/claimResultSearchForm.module'; + +@NgModule({ + imports: [ + SharedModule, + AlertModalModule, + MyDatePickerModule, + // BulkClaimModule, ClaimResultSearchFormModule, + ], + declarations: [ + ClaimSelectedResultsComponent + ], exports:[ClaimSelectedResultsComponent] +}) +export class SelectedPublicationsModule { } diff --git a/portal-4cli/src/app/claims/myClaims/myClaims-routing.module.ts b/portal-4cli/src/app/claims/myClaims/myClaims-routing.module.ts new file mode 100644 index 00000000..a5f99f5f --- /dev/null +++ b/portal-4cli/src/app/claims/myClaims/myClaims-routing.module.ts @@ -0,0 +1,16 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { LoginGuard} from'../../login/loginGuard.guard'; + +import { MyClaimsComponent } from './myClaims.component'; +import {PreviousRouteRecorder} from'../../utils/piwik/previousRouteRecorder.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + RouterModule.forChild([ + { path: '', component: MyClaimsComponent, canActivate: [IsRouteEnabled, LoginGuard], + data: {redirect: '/error'}, canDeactivate: [PreviousRouteRecorder]}]) + ] +}) +export class MyClaimsRoutingModule { } diff --git a/portal-4cli/src/app/claims/myClaims/myClaims.component.ts b/portal-4cli/src/app/claims/myClaims/myClaims.component.ts new file mode 100644 index 00000000..f3d5adc3 --- /dev/null +++ b/portal-4cli/src/app/claims/myClaims/myClaims.component.ts @@ -0,0 +1,36 @@ +import {Component, Input} from '@angular/core'; +import {Observable} from 'rxjs/Observable'; +import { Meta} from '../../../angular2-meta'; + + +@Component({ + selector: 'my-claims', + template: ` +
+
+
+ +
+
+ My Claims +
+ +
+
+
+
+` + +}) + export class MyClaimsComponent { + constructor ( private _meta: Meta ) { + this._meta.setTitle("OpenAIRE | My Claims"); + } + ngOnInit() { + + } + +} diff --git a/portal-4cli/src/app/claims/myClaims/myClaims.module.ts b/portal-4cli/src/app/claims/myClaims/myClaims.module.ts new file mode 100644 index 00000000..e7f0199b --- /dev/null +++ b/portal-4cli/src/app/claims/myClaims/myClaims.module.ts @@ -0,0 +1,25 @@ +import { NgModule } from '@angular/core'; + +import { SharedModule } from '../../shared/shared.module'; +import { MyClaimsComponent } from './myClaims.component'; +import { MyClaimsRoutingModule } from './myClaims-routing.module'; +// import{ClaimServiceModule} from '../claim-utils/service/claimsService.module'; +import {DisplayClaimsModule} from '../claim-utils/displayClaims/displayClaims.module'; +import {LoginGuard} from'../../login/loginGuard.guard'; +import {PreviousRouteRecorder} from '../../utils/piwik/previousRouteRecorder.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + SharedModule, + MyClaimsRoutingModule, + // ClaimServiceModule, + DisplayClaimsModule + + ], + providers:[LoginGuard, PreviousRouteRecorder, IsRouteEnabled], + declarations: [ + MyClaimsComponent + ] +}) +export class MyClaimsModule { } diff --git a/portal-4cli/src/app/claims/myClaimsDemo.component.ts b/portal-4cli/src/app/claims/myClaimsDemo.component.ts new file mode 100644 index 00000000..6490a59c --- /dev/null +++ b/portal-4cli/src/app/claims/myClaimsDemo.component.ts @@ -0,0 +1,51 @@ +// import {Component, Input} from '@angular/core'; +// import {Observable} from 'rxjs/Observable'; +// import { Router } from '@angular/router'; +// +// +// +// @Component({ +// selector: 'my-claims-demo', +// template: ` +//
+// +//
+// +// +// +//

Extra parameters for claims admin

+// +// +// +// +// +// +// +//
+//
+// +// +// +// ` +// //(click)="changeOrderby('target')" +// //od_______908::3a5b2885656a91307156325644e73b92 +// +// }) +// export class MyClaimsDemoComponent { +// constructor ( private _router: Router ) { +// } +// user:string="argirok@di.uoa.gr"; +// ngOnInit() { +// +// } +// goToPub(id: number){ +// this._router.navigate( ['Publication', { articleId: id}] ); +// } +// } diff --git a/portal-4cli/src/app/deposit/datasets/depositBySubject.component.ts b/portal-4cli/src/app/deposit/datasets/depositBySubject.component.ts new file mode 100644 index 00000000..17a17268 --- /dev/null +++ b/portal-4cli/src/app/deposit/datasets/depositBySubject.component.ts @@ -0,0 +1,34 @@ +import {Component, Input} from '@angular/core'; +import {Observable} from 'rxjs/Observable'; +import { Router } from '@angular/router'; +import {OpenaireProperties} from '../../utils/properties/openaireProperties'; + + + +@Component({ + selector: 'deposit-by-subject', + template: ` +
+ +

Or search for domain specific repositories

+ +
+ + + +
+
+ ` +}) + +export class DepositBySubjectComponent { + @Input() subjectKeyword: string=''; + + constructor (private _router: Router) { } + + public search() { + this._router.navigate( ['participate/deposit-subject-result'], { queryParams: { "q": this.subjectKeyword } } ); + } +} diff --git a/portal-4cli/src/app/deposit/datasets/depositBySubjectResult-routing.module.ts b/portal-4cli/src/app/deposit/datasets/depositBySubjectResult-routing.module.ts new file mode 100644 index 00000000..e336d37b --- /dev/null +++ b/portal-4cli/src/app/deposit/datasets/depositBySubjectResult-routing.module.ts @@ -0,0 +1,19 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import { DepositBySubjectResultComponent } from './depositBySubjectResult.component'; +import {FreeGuard} from'../../login/freeGuard.guard'; +import {PreviousRouteRecorder} from'../../utils/piwik/previousRouteRecorder.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + RouterModule.forChild([ + { path: '', component: DepositBySubjectResultComponent, canActivate: [FreeGuard, IsRouteEnabled], data: { + redirect: '/error' + },canDeactivate: [PreviousRouteRecorder] } + + ]) + ] +}) +export class DepositBySubjectResultsRoutingModule { } diff --git a/portal-4cli/src/app/deposit/datasets/depositBySubjectResult.component.html b/portal-4cli/src/app/deposit/datasets/depositBySubjectResult.component.html new file mode 100644 index 00000000..940b4b58 --- /dev/null +++ b/portal-4cli/src/app/deposit/datasets/depositBySubjectResult.component.html @@ -0,0 +1,79 @@ + +
+
+
+ +
+
+ Deposit {{requestFor}} +
+ +
+
+ + + +
+
+ Keywords: {{subject}} + +
+
+
+ +
+
+ +
+ + + + +
+

Please use the information/contacts shown below to deposit your {{requestFor}}.

+ +
+ +
+
+ {{fetchDataproviders.searchUtils.totalResults}} content providers, page {{fetchDataproviders.searchUtils.page}} of {{(totalPages())}} +
+ + + +
+ +
+ No content providers found with classification "{{subject}}". +
+
+ An error occured. +
+ +
+ + You can still deposit your {{requestFor}} in + OpenAIRE's Zenodo catch-all repository () + hosted by CERN. +
+
+ +
+ + + +
+
+
+
diff --git a/portal-4cli/src/app/deposit/datasets/depositBySubjectResult.component.ts b/portal-4cli/src/app/deposit/datasets/depositBySubjectResult.component.ts new file mode 100644 index 00000000..438db3c1 --- /dev/null +++ b/portal-4cli/src/app/deposit/datasets/depositBySubjectResult.component.ts @@ -0,0 +1,127 @@ +import {Component, Input} from '@angular/core'; +import {Observable} from 'rxjs/Observable'; +import {OpenaireProperties, ErrorCodes} from '../../utils/properties/openaireProperties'; +import { Router } from '@angular/router'; +import { ActivatedRoute } from '@angular/router'; +import { FetchDataproviders } from '../../utils/fetchEntitiesClasses/fetchDataproviders.class'; +import { SearchDataprovidersService } from '../../services/searchDataproviders.service'; + +import {OrganizationService} from '../../services/organization.service'; +import { Meta} from '../../../angular2-meta'; + +import {RouterHelper} from '../../utils/routerHelper.class'; +import {PiwikService} from '../../utils/piwik/piwik.service'; + +@Component({ + selector: 'deposit-by-subject-result', + templateUrl: 'depositBySubjectResult.component.html' +}) + +export class DepositBySubjectResultComponent { + @Input() compatibility: string = ''; + + // Type of entity: Publication or Research Data + @Input() requestFor: string = "Research Data"; + @Input() subject: string = ""; + + public newSubject: string= ""; + + public fetchDataproviders : FetchDataproviders; + public linkToSearchDataproviders = ""; + + // url of Zenodo + public zenodo: string; + + public page: number = 1; + + public status: number; + + public routerHelper:RouterHelper = new RouterHelper(); + public errorCodes:ErrorCodes = new ErrorCodes(); + + sub: any; + piwiksub: any; + + constructor ( private _router: Router, + private route: ActivatedRoute, + private _searchDataprovidersService: SearchDataprovidersService, + private _meta: Meta, private _piwikService:PiwikService) { + + this.zenodo = OpenaireProperties.getZenodoURL(); + this.fetchDataproviders = new FetchDataproviders(this._searchDataprovidersService); + + this.status = this.errorCodes.LOADING; + this.updateTitle("Deposit "+this.requestFor); + this.updateDescription("Openaire, repositories, open access, content provider, compatibility, organization, deposit "+ this.requestFor); + this.updateUrl(OpenaireProperties.getBaseLink()+this._router.url); + if(OpenaireProperties.isPiwikTrackEnabled() && (typeof document !== 'undefined')){ + this.piwiksub = this._piwikService.trackView("Deposit "+this.requestFor).subscribe(); + } + } + + + + ngOnInit() { + console.info('depositResult init'); + + this.sub = this.route.queryParams.subscribe(params => { + this.subject = params['q']; + this.newSubject = this.subject; + this.searchDataproviders(); + }); + } + + // ngDoCheck() { + // if(this.organizationId == "" || this.organizationId == undefined) { + // this.organizationId = ""; + // this.status = this.errorCodes.ERROR; + // } + // } + + ngOnDestroy() { + this.sub.unsubscribe(); + if(this.piwiksub){ + this.piwiksub.unsubscribe(); + } + } + + public totalPages(): number { + let totalPages:any = this.fetchDataproviders.searchUtils.totalResults/(this.fetchDataproviders.searchUtils.size); + if(!(Number.isInteger(totalPages))) { + totalPages = (parseInt(totalPages, 10) + 1); + } + return totalPages; + } + + public searchDataproviders() { + this.subject = this.newSubject; + this.fetchDataproviders.getResultsBySubjectsForDeposit( (this.subject =="")?"*":this.subject, this.requestFor, this.page, 10); + this.linkToSearchDataproviders = OpenaireProperties.getLinkToSearchDataProviders(); + } + + public goToDeposit() { + if(this.requestFor == "Publications") { + this._router.navigate( ['participate/deposit-publications'] ); + } else if(this.requestFor == "Research Data") { + this._router.navigate( ['participate/deposit-datasets'] ); + } + } + public pageChange($event) { + this.page = +$event.value; + this.searchDataproviders(); + } + + private updateDescription(description:string){ + this._meta.updateMeta("description", description); + this._meta.updateProperty("og:description", description); + } + private updateTitle(title:string){ + var _prefix ="OpenAIRE | "; + var _title = _prefix + ((title.length> 50 ) ?title.substring(0,50):title); + this._meta.setTitle(_title ); + this._meta.updateProperty("og:title",_title); + } + private updateUrl(url:string){ + this._meta.updateProperty("og:url", url); + } +} diff --git a/portal-4cli/src/app/deposit/datasets/depositBySubjectResults.module.ts b/portal-4cli/src/app/deposit/datasets/depositBySubjectResults.module.ts new file mode 100644 index 00000000..3a27275c --- /dev/null +++ b/portal-4cli/src/app/deposit/datasets/depositBySubjectResults.module.ts @@ -0,0 +1,34 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import { DepositBySubjectResultComponent } from './depositBySubjectResult.component'; + +import {DepositBySubjectResultsRoutingModule} from './depositBySubjectResult-routing.module'; +import {DepoditModule} from '../deposit.module'; +import {FreeGuard} from'../../login/freeGuard.guard'; +import {PreviousRouteRecorder} from '../../utils/piwik/previousRouteRecorder.guard'; +import {PagingModule } from '../../utils/paging.module'; +import {DataProvidersServiceModule} from '../../services/dataProvidersService.module'; +import {SearchResultsModule } from '../../searchPages/searchUtils/searchResults.module'; +import {HelperModule} from '../../utils/helper/helper.module'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + CommonModule, FormsModule, + DepoditModule, + DepositBySubjectResultsRoutingModule, SearchResultsModule, DataProvidersServiceModule, PagingModule, + HelperModule + ], + declarations: [ + + DepositBySubjectResultComponent + + ], + exports: [ + DepositBySubjectResultComponent + ], + providers: [FreeGuard,PreviousRouteRecorder, IsRouteEnabled] +}) +export class DepositBySubjectResultsModule { } diff --git a/portal-4cli/src/app/deposit/datasets/depositDatasets-routing.module.ts b/portal-4cli/src/app/deposit/datasets/depositDatasets-routing.module.ts new file mode 100644 index 00000000..0fd8260b --- /dev/null +++ b/portal-4cli/src/app/deposit/datasets/depositDatasets-routing.module.ts @@ -0,0 +1,20 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import { DepositDatasetsComponent } from './depositDatasets.component'; +import { DepositDatasetsResultComponent } from './depositDatasetsResult.component'; +import {FreeGuard} from'../../login/freeGuard.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; +import {PreviousRouteRecorder} from'../../utils/piwik/previousRouteRecorder.guard'; + +@NgModule({ + imports: [ + RouterModule.forChild([ + { path: '', component: DepositDatasetsComponent, canActivate: [FreeGuard, IsRouteEnabled], data: { + redirect: '/error' + },canDeactivate: [PreviousRouteRecorder] } + + ]) + ] +}) +export class DepositDatasetsRoutingModule { } diff --git a/portal-4cli/src/app/deposit/datasets/depositDatasets.component.ts b/portal-4cli/src/app/deposit/datasets/depositDatasets.component.ts new file mode 100644 index 00000000..4c468aeb --- /dev/null +++ b/portal-4cli/src/app/deposit/datasets/depositDatasets.component.ts @@ -0,0 +1,21 @@ +import {Component} from '@angular/core'; + +@Component({ + selector: 'deposit-datasets', + template: ` +
+
+
+ +
+ +
+
+
+
+ ` +}) + +export class DepositDatasetsComponent { + +} diff --git a/portal-4cli/src/app/deposit/datasets/depositDatasets.module.ts b/portal-4cli/src/app/deposit/datasets/depositDatasets.module.ts new file mode 100644 index 00000000..3612863c --- /dev/null +++ b/portal-4cli/src/app/deposit/datasets/depositDatasets.module.ts @@ -0,0 +1,29 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import { DepositDatasetsComponent } from './depositDatasets.component'; +import { DepositDatasetsResultComponent } from './depositDatasetsResult.component'; +import {DepositDatasetsRoutingModule} from './depositDatasets-routing.module'; +import {DepoditModule} from '../deposit.module'; +import {FreeGuard} from'../../login/freeGuard.guard'; +import {PreviousRouteRecorder} from '../../utils/piwik/previousRouteRecorder.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + CommonModule, FormsModule, + DepoditModule, + DepositDatasetsRoutingModule + ], + declarations: [ + + DepositDatasetsComponent + + ], + exports: [ + DepositDatasetsComponent + ], + providers: [FreeGuard,PreviousRouteRecorder, IsRouteEnabled] +}) +export class DepositDatasetsModule { } diff --git a/portal-4cli/src/app/deposit/datasets/depositDatasetsResult.component.ts b/portal-4cli/src/app/deposit/datasets/depositDatasetsResult.component.ts new file mode 100644 index 00000000..edbe92db --- /dev/null +++ b/portal-4cli/src/app/deposit/datasets/depositDatasetsResult.component.ts @@ -0,0 +1,14 @@ +import {Component} from '@angular/core'; + +@Component({ + selector: 'deposit-datasets-result', + template: ` + + + + ` +}) + +export class DepositDatasetsResultComponent { + +} diff --git a/portal-4cli/src/app/deposit/datasets/depositDatasetsResults-routing.module.ts b/portal-4cli/src/app/deposit/datasets/depositDatasetsResults-routing.module.ts new file mode 100644 index 00000000..fb59803e --- /dev/null +++ b/portal-4cli/src/app/deposit/datasets/depositDatasetsResults-routing.module.ts @@ -0,0 +1,18 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import {PreviousRouteRecorder} from'../../utils/piwik/previousRouteRecorder.guard'; +import { DepositDatasetsResultComponent } from './depositDatasetsResult.component'; +import {FreeGuard} from'../../login/freeGuard.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + RouterModule.forChild([ + { path: '', component: DepositDatasetsResultComponent, canActivate: [FreeGuard, IsRouteEnabled], data: { + redirect: '/error' + },canDeactivate: [PreviousRouteRecorder] } + + ]) + ] +}) +export class DepositDatasetsResultsRoutingModule { } diff --git a/portal-4cli/src/app/deposit/datasets/depositDatasetsResults.module.ts b/portal-4cli/src/app/deposit/datasets/depositDatasetsResults.module.ts new file mode 100644 index 00000000..6fc3d2e8 --- /dev/null +++ b/portal-4cli/src/app/deposit/datasets/depositDatasetsResults.module.ts @@ -0,0 +1,29 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import { DepositDatasetsResultComponent } from './depositDatasetsResult.component'; + +import {DepositDatasetsResultsRoutingModule} from './depositDatasetsResults-routing.module'; +import {DepoditModule} from '../deposit.module'; +import {FreeGuard} from'../../login/freeGuard.guard'; +import {PreviousRouteRecorder} from '../../utils/piwik/previousRouteRecorder.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + CommonModule, FormsModule, + DepoditModule, + DepositDatasetsResultsRoutingModule + ], + declarations: [ + + DepositDatasetsResultComponent, + + ], + exports: [ + DepositDatasetsResultComponent, + ], + providers: [FreeGuard,PreviousRouteRecorder, IsRouteEnabled] +}) +export class DepositDatasetsResultsModule { } diff --git a/portal-4cli/src/app/deposit/deposit.component.html b/portal-4cli/src/app/deposit/deposit.component.html new file mode 100644 index 00000000..8415b1e8 --- /dev/null +++ b/portal-4cli/src/app/deposit/deposit.component.html @@ -0,0 +1,56 @@ +
+
+ Deposit {{requestFor}} +
+
+ +
+
+ +
+
+

+ + Are you a grant recipient from the following: H2020; FP7 with SC39; or ERC? + + Then you are required to publish in + open access (). + One way to do this is to deposit your {{requestFor}} into an + open access repository (). +

+

+ Click the following to find more information: + FP7 guidelines (), + H2020 guidelines (), + ERC guidelines () OR + ask a question () to OpenAIRE’s national representative. +

+
+

Locate repository via your institution

+ +
+
+ + +
+ + +
+
+ +
+
+

Or locate repository in map

+
+ +
+
+
+ +
+ +
diff --git a/portal-4cli/src/app/deposit/deposit.component.ts b/portal-4cli/src/app/deposit/deposit.component.ts new file mode 100644 index 00000000..04565a11 --- /dev/null +++ b/portal-4cli/src/app/deposit/deposit.component.ts @@ -0,0 +1,91 @@ +import {Component, Input} from '@angular/core'; +import {Observable} from 'rxjs/Observable'; +import { Router } from '@angular/router'; +import {OpenaireProperties} from '../utils/properties/openaireProperties'; +import { Meta} from '../../angular2-meta'; +import {PiwikService} from '../utils/piwik/piwik.service'; + + +@Component({ + selector: 'deposit', + templateUrl: 'deposit.component.html' +}) + +export class DepositComponent { + @Input() compatibility: string = ''; + @Input() mapUrl: string = null; // optional in case i-frame is needed + @Input() searchBySubjects: boolean = false; // optional: in case search by subjects is needed + + + public status: number; + + // Type of entity: Publication or Research Data + @Input() requestFor: string = "Publications"; + + // url's needed for information text + public openAccess: string; + public openAccessRepo: string; + public fp7Guidlines: string; + public h2020Guidlines: string; + public ercGuidlines: string; + public helpdesk: string; + + // Id of the new selected organization to be searched + public selectedId: string = ""; + + public warningMessage: string = ""; + + piwiksub:any; + + constructor (private _router: Router, private _meta: Meta, private _piwikService:PiwikService) { + + this.openAccess = OpenaireProperties.getOpenAccess(); + this.openAccessRepo = OpenaireProperties.getOpenAccessRepo(); + this.fp7Guidlines = OpenaireProperties.getFP7Guidlines(); + this.h2020Guidlines = OpenaireProperties.getH2020Guidlines(); + this.ercGuidlines = OpenaireProperties.getERCGuidlines(); + this.helpdesk = OpenaireProperties.getHelpdesk(); + this.updateTitle("Deposit "+this.requestFor); + this.updateDescription("Openaire, repositories, open access, content provider, compatibility, organization, deposit "+ this.requestFor); + this.updateUrl(OpenaireProperties.getBaseLink()+this._router.url); + if(OpenaireProperties.isPiwikTrackEnabled() && (typeof document !== 'undefined')){ + this.piwiksub = this._piwikService.trackView("Deposit "+this.requestFor).subscribe(); + } + } + ngOnDestroy() { + if(this.piwiksub){ + this.piwiksub.unsubscribe(); + } + } + + public organizationSelected(id: string) { + console.info("organization selected"); + if(id && id.length > 0){ + if(this.requestFor == "Publications") { + this._router.navigate( ['participate/deposit-publications-result'], { queryParams: { "organizationId": id } } ); + } else if(this.requestFor == "Research Data") { + this._router.navigate( ['participate/deposit-datasets-result'], { queryParams: { "organizationId": id } } ); + } + } else { + this.warningMessage = "No organization selected"; + } + } + + public valueChanged($event){ + this.selectedId = $event.value; + } + + private updateDescription(description:string){ + this._meta.updateMeta("description", description); + this._meta.updateProperty("og:description", description); + } + private updateTitle(title:string){ + var _prefix ="OpenAIRE | "; + var _title = _prefix + ((title.length> 50 ) ?title.substring(0,50):title); + this._meta.setTitle(_title ); + this._meta.updateProperty("og:title",_title); + } + private updateUrl(url:string){ + this._meta.updateProperty("og:url", url); + } +} diff --git a/portal-4cli/src/app/deposit/deposit.module.ts b/portal-4cli/src/app/deposit/deposit.module.ts new file mode 100644 index 00000000..6fa8149c --- /dev/null +++ b/portal-4cli/src/app/deposit/deposit.module.ts @@ -0,0 +1,45 @@ +/* Common Component of deposit for both research data & ppublications*/ + +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { RouterModule } from '@angular/router'; + +import { DepositComponent } from './deposit.component'; +import { DepositResultComponent } from './depositResult.component'; +import {EntitiesAutocompleteModule} from '../utils/entitiesAutoComplete/entitiesAutoComplete.module'; +import {DataProvidersServiceModule} from '../services/dataProvidersService.module'; +import {OrganizationServiceModule} from '../services/organizationService.module'; +import {SearchResultsModule } from '../searchPages/searchUtils/searchResults.module'; +import {PiwikServiceModule} from '../utils/piwik/piwikService.module'; +import {HelperModule} from '../utils/helper/helper.module'; +import { DepositBySubjectComponent } from './datasets/depositBySubject.component'; +import {IFrameModule} from '../utils/iframe.module'; + + + + @NgModule({ + imports: [ + CommonModule, FormsModule, + RouterModule, + EntitiesAutocompleteModule, + DataProvidersServiceModule, + OrganizationServiceModule, + SearchResultsModule, + PiwikServiceModule, + HelperModule, + IFrameModule + ], + declarations: [ + DepositComponent, + DepositResultComponent, + DepositBySubjectComponent + ], + exports: [ + DepositComponent, + DepositResultComponent + ], + providers: [ + ] +}) +export class DepoditModule { } diff --git a/portal-4cli/src/app/deposit/depositResult.component.ts b/portal-4cli/src/app/deposit/depositResult.component.ts new file mode 100644 index 00000000..be15f886 --- /dev/null +++ b/portal-4cli/src/app/deposit/depositResult.component.ts @@ -0,0 +1,284 @@ +import {Component, Input} from '@angular/core'; +import {Observable} from 'rxjs/Observable'; +import {OpenaireProperties, ErrorCodes} from '../utils/properties/openaireProperties'; +import { Router } from '@angular/router'; +import { ActivatedRoute } from '@angular/router'; +import { FetchDataproviders } from '../utils/fetchEntitiesClasses/fetchDataproviders.class'; +import { SearchDataprovidersService } from '../services/searchDataproviders.service'; + +import {OrganizationService} from '../services/organization.service'; +import { Meta} from '../../angular2-meta'; + +import {RouterHelper} from '../utils/routerHelper.class'; +import {PiwikService} from '../utils/piwik/piwik.service'; + +@Component({ + selector: 'deposit-result', + template: ` +
+
+
+ +
+
+ Deposit {{requestFor}} +
+ +
+ +
+ + + +
+

Locate repository via your institution

+ +
+
+ + +
+ + +
+
+ + +
+

+ content providers for institution: + + {{organization['name']}} () + + {{organization['name']}} +

+ + +
+ +
+

Please use the information/contacts shown below to deposit your {{requestFor}}.

+ + + + +
+ + +
+
+ + An error occured. + + No content providers found for institution: + + {{organization['name']}} () + + {{organization['name']}} + . +
+
+ No organization with ID: {{organizationId}} found. +
+
+ An error occured. +
+ + Service temprorarily unavailable. Please try again later. + +
+ No ID for organization. +
+ + You can still deposit your {{requestFor}} in + OpenAIRE's Zenodo catch-all repository () + hosted by CERN. +
+
+ +
+ + +
+
+
+
+ + ` +}) + +export class DepositResultComponent { + @Input() compatibility: string = ''; + + // Type of entity: Publication or Research Data + @Input() requestFor: string = "Publications"; + + public organization: {"name": string, "url": string}; + public organizationId: string = ""; + + // Id of the new selected organization to be searched + public selectedId: string = ""; + + public status: number; + public warningMessage: string = ""; + + public fetchDataproviders : FetchDataproviders; + public linkToSearchDataproviders: string = ""; + + // url of Zenodo + public zenodo: string; + + public routerHelper:RouterHelper = new RouterHelper(); + public errorCodes:ErrorCodes = new ErrorCodes(); + + sub: any; piwiksub: any; + + constructor ( private _router: Router, + private route: ActivatedRoute, + private _searchDataprovidersService: SearchDataprovidersService, + private _organizationService: OrganizationService, + private _meta: Meta, private _piwikService:PiwikService) { + + this.zenodo = OpenaireProperties.getZenodoURL(); + this.fetchDataproviders = new FetchDataproviders(this._searchDataprovidersService); + + this.status = this.errorCodes.LOADING; + this.updateTitle("Deposit "+this.requestFor); + this.updateDescription("Openaire, repositories, open access, content provider, compatibility, organization, deposit "+ this.requestFor); + this.updateUrl(OpenaireProperties.getBaseLink()+this._router.url); + if(OpenaireProperties.isPiwikTrackEnabled() && (typeof document !== 'undefined')){ + this.piwiksub = this._piwikService.trackView("Deposit "+this.requestFor).subscribe(); + } + } + + ngOnInit() { + console.info('depositResult init'); + + this.sub = this.route.queryParams.subscribe(params => { + this.organizationId = params['organizationId']; + console.info("Id is :"+this.organizationId); + if(this.organizationId){ + this.getOrganizationInfo(); + } + this.selectedId = ""; + }); + } + + ngDoCheck() { + if(this.organizationId == "" || this.organizationId == undefined) { + this.organizationId = ""; + this.status = this.errorCodes.ERROR; + } + } + + ngOnDestroy() { + this.sub.unsubscribe(); + if(this.piwiksub){ + this.piwiksub.unsubscribe(); + } + } + + private searchDataproviders() { + // if(this.organization != undefined) { + // this.fetchDataproviders.getResults(this.organization.name, false, 1, 10); + // } else if(this.organizationId != undefined) { + this.fetchDataproviders.getResultsForDeposit( this.organizationId,this.requestFor, 1, 10); + //} + this.linkToSearchDataproviders = OpenaireProperties.getLinkToSearchDataProviders(); + } + + private getOrganizationInfo () { + console.info("inside getOrganizationInfo of component"); + + this._organizationService.getOrganizationInfo(this.organizationId).subscribe( + data => { + if(data == null) { + this.status = this.errorCodes.NOT_FOUND; + } else { + this.organization = data.title; + this.status = this.errorCodes.DONE; + this.searchDataproviders(); + } + }, + err => { + //console.log(err) + + if(err.status == '404') { + this.status = this.errorCodes.NOT_FOUND; + console.info("not found"); + } else if(err.status == '500') { + this.status = this.errorCodes.ERROR; + console.info("error"); + } else { + this.status = this.errorCodes.NOT_AVAILABLE; + console.info("not available"); + } + } + ); + } + + public goToDeposit() { + if(this.requestFor == "Publications") { + this._router.navigate( ['participate/deposit-publications'] ); + } else if(this.requestFor == "Research Data") { + this._router.navigate( ['participate/deposit-datasets'] ); + } + } + + public valueChanged($event){ + this.selectedId = $event.value; + } + + public organizationSelected(id: string) { + console.info("organization selected"); + if(id && id.length > 0 && id != this.organizationId){ + this.organization = null; + this.status = this.errorCodes.LOADING; + + if(this.requestFor == "Publications") { + this._router.navigate( ['participate/deposit-publications-result'], { queryParams: { "organizationId": id } } ); + } else if(this.requestFor == "Research Data") { + this._router.navigate( ['participate/deposit-datasets-result'], { queryParams: { "organizationId": id } } ); + } + } else { + this.warningMessage = "No new organization selected"; + } + } + + private updateDescription(description:string){ + this._meta.updateMeta("description", description); + this._meta.updateProperty("og:description", description); + } + private updateTitle(title:string){ + var _prefix ="OpenAIRE | "; + var _title = _prefix + ((title.length> 50 ) ?title.substring(0,50):title); + this._meta.setTitle(_title ); + this._meta.updateProperty("og:title",_title); + } + private updateUrl(url:string){ + this._meta.updateProperty("og:url", url); + } +} diff --git a/portal-4cli/src/app/deposit/publications/depositPublications-routing.module.ts b/portal-4cli/src/app/deposit/publications/depositPublications-routing.module.ts new file mode 100644 index 00000000..bead0e18 --- /dev/null +++ b/portal-4cli/src/app/deposit/publications/depositPublications-routing.module.ts @@ -0,0 +1,18 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import {PreviousRouteRecorder} from'../../utils/piwik/previousRouteRecorder.guard'; +import { DepositPublicationsComponent } from './depositPublications.component'; +import {FreeGuard} from'../../login/freeGuard.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + RouterModule.forChild([ + { path: '', component: DepositPublicationsComponent, canActivate: [FreeGuard, IsRouteEnabled], data: { + redirect: '/error' + }, canDeactivate: [PreviousRouteRecorder] } + + ]) + ] +}) +export class DepositPublicationsRoutingModule { } diff --git a/portal-4cli/src/app/deposit/publications/depositPublications.component.ts b/portal-4cli/src/app/deposit/publications/depositPublications.component.ts new file mode 100644 index 00000000..77ff9a23 --- /dev/null +++ b/portal-4cli/src/app/deposit/publications/depositPublications.component.ts @@ -0,0 +1,21 @@ +import {Component} from '@angular/core'; + +@Component({ + selector: 'deposit-publications', + template: ` +
+
+
+ +
+ +
+
+
+
+ ` +}) + +export class DepositPublicationsComponent { + public mapUrl ="https://beta.openaire.eu/stats/markers-demo.html"; +} diff --git a/portal-4cli/src/app/deposit/publications/depositPublications.module.ts b/portal-4cli/src/app/deposit/publications/depositPublications.module.ts new file mode 100644 index 00000000..ebe668c6 --- /dev/null +++ b/portal-4cli/src/app/deposit/publications/depositPublications.module.ts @@ -0,0 +1,27 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import { DepositPublicationsComponent } from './depositPublications.component'; + +import {DepositPublicationsRoutingModule} from './depositPublications-routing.module'; +import {DepoditModule} from '../deposit.module'; +import {FreeGuard} from'../../login/freeGuard.guard'; +import {PreviousRouteRecorder} from '../../utils/piwik/previousRouteRecorder.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + CommonModule, FormsModule, + DepoditModule, + DepositPublicationsRoutingModule + ], + declarations: [ + DepositPublicationsComponent + ], + exports: [ + DepositPublicationsComponent, + ], + providers: [FreeGuard,PreviousRouteRecorder, IsRouteEnabled] +}) +export class DepositPublicationsModule { } diff --git a/portal-4cli/src/app/deposit/publications/depositPublicationsResult-routing.module.ts b/portal-4cli/src/app/deposit/publications/depositPublicationsResult-routing.module.ts new file mode 100644 index 00000000..0d5dd77a --- /dev/null +++ b/portal-4cli/src/app/deposit/publications/depositPublicationsResult-routing.module.ts @@ -0,0 +1,18 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import {PreviousRouteRecorder} from'../../utils/piwik/previousRouteRecorder.guard'; +import { DepositPublicationsResultComponent } from './depositPublicationsResult.component'; +import {FreeGuard} from'../../login/freeGuard.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + RouterModule.forChild([ + { path: '', component: DepositPublicationsResultComponent, canActivate: [FreeGuard, IsRouteEnabled], data: { + redirect: '/error' + }, canDeactivate: [PreviousRouteRecorder] } + + ]) + ] +}) +export class DepositPublicationsResultRoutingModule { } diff --git a/portal-4cli/src/app/deposit/publications/depositPublicationsResult.component.ts b/portal-4cli/src/app/deposit/publications/depositPublicationsResult.component.ts new file mode 100644 index 00000000..c7da81eb --- /dev/null +++ b/portal-4cli/src/app/deposit/publications/depositPublicationsResult.component.ts @@ -0,0 +1,12 @@ +import {Component} from '@angular/core'; + +@Component({ + selector: 'deposit-publications-result', + template: ` + + ` +}) + +export class DepositPublicationsResultComponent { + +} diff --git a/portal-4cli/src/app/deposit/publications/depositPublicationsResults.module.ts b/portal-4cli/src/app/deposit/publications/depositPublicationsResults.module.ts new file mode 100644 index 00000000..1b5c45fc --- /dev/null +++ b/portal-4cli/src/app/deposit/publications/depositPublicationsResults.module.ts @@ -0,0 +1,27 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import { DepositPublicationsResultComponent } from './depositPublicationsResult.component'; + +import {DepositPublicationsResultRoutingModule} from './depositPublicationsResult-routing.module'; +import {DepoditModule} from '../deposit.module'; +import {FreeGuard} from'../../login/freeGuard.guard'; +import {PreviousRouteRecorder} from '../../utils/piwik/previousRouteRecorder.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + CommonModule, FormsModule, + DepoditModule, + DepositPublicationsResultRoutingModule + ], + declarations: [ + DepositPublicationsResultComponent + ], + exports: [ + DepositPublicationsResultComponent + ], + providers: [FreeGuard,PreviousRouteRecorder, IsRouteEnabled] +}) +export class DepositPublicationsResultsModule { } diff --git a/portal-4cli/src/app/error/error-routing.module.ts b/portal-4cli/src/app/error/error-routing.module.ts new file mode 100644 index 00000000..abb3c8f4 --- /dev/null +++ b/portal-4cli/src/app/error/error-routing.module.ts @@ -0,0 +1,16 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import { ErrorPageComponent } from './errorPage.component'; +import {PreviousRouteRecorder} from'../utils/piwik/previousRouteRecorder.guard'; + +@NgModule({ + imports: [ + RouterModule.forChild([ + { path: '', component: ErrorPageComponent,canDeactivate: [PreviousRouteRecorder] }, + { path: '**', component: ErrorPageComponent,canDeactivate: [PreviousRouteRecorder] }, + + ]) + ] +}) +export class ErrorRoutingModule { } diff --git a/portal-4cli/src/app/error/error.module.ts b/portal-4cli/src/app/error/error.module.ts new file mode 100644 index 00000000..ee45d823 --- /dev/null +++ b/portal-4cli/src/app/error/error.module.ts @@ -0,0 +1,14 @@ +// import { NgModule} from '@angular/core'; +// import { CommonModule } from '@angular/common'; +// import { FormsModule } from '@angular/forms'; +// +// import { ErrorPageComponent } from './errorPage.component'; +// import { ErrorRoutingModule } from './error-routing.module'; +// import {PreviousRouteRecorder} from '../utils/piwik/previousRouteRecorder.guard'; +// +// @NgModule({ +// imports: [CommonModule, FormsModule, ErrorRoutingModule], +// providers:[PreviousRouteRecorder], +// declarations: [ErrorPageComponent] +// }) +// export class ErrorModule { } diff --git a/portal-4cli/src/app/error/errorPage.component.ts b/portal-4cli/src/app/error/errorPage.component.ts new file mode 100644 index 00000000..30029577 --- /dev/null +++ b/portal-4cli/src/app/error/errorPage.component.ts @@ -0,0 +1,55 @@ +import { Component, Input } from '@angular/core'; +import { Location } from '@angular/common'; +import { Meta} from '../../angular2-meta'; +import {ActivatedRoute} from '@angular/router'; + +@Component({ + selector: 'error', + template: ` +
+
+
+ +
+

+ Bad karma: we can't find that page! +

+
+ +

+ You asked for {{page}}, but despite our computers looking very hard, we could not find it. What happened ? +

+ +
    +
  • the link you clicked to arrive here has a typo in it
  • +
  • or somehow we removed that page, or gave it another name
  • +
  • or, quite unlikely for sure, maybe you typed it yourself and there was a little mistake ?
  • +
+ +
+
+
+
+ ` +}) + +export class ErrorPageComponent { + public page: string; + + constructor (private _location: Location, private _meta: Meta,private route: ActivatedRoute) { + this._meta.setTitle("OpenAIRE | Error page"); + this.page = _location.path(true); + //this.page = _router.url; + //this.page = location.href; + } + ngOnInit() { + this.route.queryParams.subscribe(data => { + + + this.page = data['page']; + if(!this.page){ + this.page = this._location.path(true); + } + }); + } +} diff --git a/portal-4cli/src/app/error/isRouteEnabled.guard.ts b/portal-4cli/src/app/error/isRouteEnabled.guard.ts new file mode 100644 index 00000000..c8566a5b --- /dev/null +++ b/portal-4cli/src/app/error/isRouteEnabled.guard.ts @@ -0,0 +1,23 @@ +import { Injectable } from '@angular/core'; +import { Router,CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot} from '@angular/router'; +import {Observable} from 'rxjs/Observable'; + +import { ConfigurationService } from '../utils/configuration/configuration.service'; + +@Injectable() +export class IsRouteEnabled implements CanActivate { + + constructor(private router: Router, private config: ConfigurationService) {} + + canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable | boolean { + let customRedirect = route.data['redirect']; + console.log("In IsRouteEnabled"); + console.log(state.url.split("?")[0].substring(1)); + let isEnabled = this.config.isPageEnabled(state.url.split("?")[0].substring(1)); + let redirect = !!customRedirect ? customRedirect : '/error'; + isEnabled.filter(enabled => !enabled) + .subscribe(() => this.router.navigate([redirect], { queryParams: { "page": state.url } })); + + return isEnabled; + } +} diff --git a/portal-4cli/src/app/home/home-routing.module.ts b/portal-4cli/src/app/home/home-routing.module.ts new file mode 100644 index 00000000..6ba740bd --- /dev/null +++ b/portal-4cli/src/app/home/home-routing.module.ts @@ -0,0 +1,16 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import{HomeComponent} from './home.component'; +import {FreeGuard} from'../login/freeGuard.guard'; +import {PreviousRouteRecorder} from '../utils/piwik/previousRouteRecorder.guard'; + +@NgModule({ + imports: [ + RouterModule.forChild([ + { path: '', component: HomeComponent, canActivate: [FreeGuard], canDeactivate: [PreviousRouteRecorder] } + + ]) + ] +}) +export class HomeRoutingModule { } diff --git a/portal-4cli/src/app/home/home.component.html b/portal-4cli/src/app/home/home.component.html new file mode 100644 index 00000000..a1b1e1c4 --- /dev/null +++ b/portal-4cli/src/app/home/home.component.html @@ -0,0 +1,65 @@ + + + +
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+

+ {{publicationsSize.number}} {{publicationsSize.size}} publications +

+
+
+
+
+

+ {{datasetsSize.number}} {{datasetsSize.size}} research data +

+
+
+
+
+

+ {{datasourcesSize.number}} {{datasourcesSize.size}} data sources +

+
+
+
+
+

+ {{fundersSize.number}} {{fundersSize.size}} funders +

+
+
+
+
+ all linked together +
+
+
+
+
+
+
+
+ +
+ +
diff --git a/portal-4cli/src/app/home/home.component.ts b/portal-4cli/src/app/home/home.component.ts new file mode 100644 index 00000000..217b6bdc --- /dev/null +++ b/portal-4cli/src/app/home/home.component.ts @@ -0,0 +1,182 @@ +import {Component, Input, Output, EventEmitter, ViewChild, ChangeDetectionStrategy, ViewEncapsulation} from '@angular/core'; +import {Observable} from 'rxjs/Observable'; +import {ActivatedRoute, Router} from '@angular/router'; +import {Location} from '@angular/common'; + +import { Meta, MetaDefinition} from '../../angular2-meta'; +import {SearchPublicationsService} from '../services/searchPublications.service'; +import {SearchDataprovidersService} from '../services/searchDataproviders.service'; +import {SearchProjectsService} from '../services/searchProjects.service'; +import {SearchDatasetsService} from '../services/searchDatasets.service'; +import {SearchOrganizationsService} from '../services/searchOrganizations.service'; + +import {OpenaireProperties} from '../utils/properties/openaireProperties'; +import {SearchFields} from '../utils/properties/searchFields'; +import {ErrorCodes} from '../utils/properties/openaireProperties'; +import {RouterHelper} from '../utils/routerHelper.class'; +import {NumberUtils} from '../utils/number-utils.class'; +import {RefineFieldResultsService} from '../services/refineFieldResults.service'; +import {PiwikService} from '../utils/piwik/piwik.service'; +import { ConfigurationService } from '../utils/configuration/configuration.service'; + +@Component({ + selector: 'home', + templateUrl: 'home.component.html', +}) +export class HomeComponent { + public piwiksub: any; + public subfunders: any; + + public pageTitle = "OpenAIRE" + public keyword:string = ""; + + public searchFields:SearchFields = new SearchFields(); + public errorCodes:ErrorCodes = new ErrorCodes(); + public routerHelper:RouterHelper = new RouterHelper(); + + public publicationsSize:any = null; + public datasetsSize:any = null; + public fundersSize:any = null; + public projectsSize:any = null; + public datasourcesSize:any = null; + + showPublications:boolean= false; + showDatasets:boolean= false; + showProjects:boolean= false; + showDataProviders:boolean= false; + +public subPub;public subData;public subProjects;public subOrg; public subDataPr; + + constructor ( + private route: ActivatedRoute, + private _router: Router, + private _searchPublicationsService: SearchPublicationsService, + private _searchDataprovidersService: SearchDataprovidersService, + private _searchProjectsService: SearchProjectsService, + private _searchDatasetsService: SearchDatasetsService, + private _searchOrganizationsService: SearchOrganizationsService, + private _refineFieldResultsService:RefineFieldResultsService, + private location: Location, private _meta: Meta,private _piwikService:PiwikService, + private config: ConfigurationService) { + + var description = "open access, research, scientific publication, European Commission, EC, FP7, ERC, Horizon 2020, H2020, search, projects "; + + var title = "OpenAIRE"; + + var url = OpenaireProperties.getBaseLink()+this._router.url; + this._meta.setTitle(title); + this._meta.updateMeta("description", description); + this._meta.updateProperty("og:description", description); + this._meta.updateProperty("og:title", title); + this._meta.updateProperty("og:url", url); + + const entityOne = this.config.isEntityEnabled("publication"); + const entityTwo = this.config.isEntityEnabled("dataset"); + const entityThree = this.config.isEntityEnabled("project"); + const entityFour = this.config.isEntityEnabled("datasource"); + const example = Observable.zip(entityOne,entityTwo,entityThree,entityFour); + + //wait until all observables have emitted a value then emit all as an array + example.subscribe(data => { + this.showPublications = data[0]; + this.showDatasets = data[1]; + this.showProjects = data[2]; + this.showDataProviders = data[3]; + this.getNumbers(); + }); + if(OpenaireProperties.isPiwikTrackEnabled() && (typeof document !== 'undefined')){ + this.piwiksub = this._piwikService.trackView("OpenAIRE").subscribe(); + } + + } + + public ngOnInit() { + } + public ngOnDestroy() { + if(this.piwiksub){ + this.piwiksub.unsubscribe(); + } + if(this.subfunders){ + this.subfunders.unsubscribe(); + } + if(this.subPub){ + this.subPub.unsubscribe(); + } + if(this.subData){ + this.subData.unsubscribe(); + } + // if(this.subProjects){ + // this.subProjects.unsubscribe(); + // } + // if(this.subOrg){ + // this.subOrg.unsubscribe(); + // } + if(this.subDataPr){ + this.subDataPr.unsubscribe(); + } + + } + + private getNumbers() { + if(this.showPublications){ + this.subPub = this._searchPublicationsService.numOfSearchPublications("").subscribe( + data => { + console.log("Count results: "+data); + if(data && data != null && data > 0 ){ + this.publicationsSize = NumberUtils.roundNumber(data); + console.log("After round"); + + } + }, + err => { + console.log(err); + } + ); + } + if(this.showDatasets){ + this.subData = this._searchDatasetsService.numOfSearchDatasets("").subscribe( + data => { + if(data && data != null && data > 0 ){ + this.datasetsSize = NumberUtils.roundNumber(data); + } + }, + err => { + console.log(err); + } + ); + } + if(this.showProjects){ + this.subfunders = this._refineFieldResultsService.getRefineFieldsResultsByEntityName(["funder"],"project").subscribe( + data => { + + console.info("Funders: "+data[1][0].title+ " values "+data[1][0].values.length+"]"); + console.info("Projects: "+data[0]); + + if(data[0] && data[0] > 0 ){ + this.projectsSize = NumberUtils.roundNumber(data[0]); + } + if(data[1].length > 0 && data[1][0].filterId == "funder" && data[1][0].values ){ + this.fundersSize = NumberUtils.roundNumber(data[1][0].values.length); + } + + }, + err => { + console.log(err); + }); + } + if(this.showDataProviders){ + this.subDataPr = this._searchDataprovidersService.numOfSearchDataproviders("").subscribe( + data => { + if(data && data != null && data > 0 ){ + this.datasourcesSize = NumberUtils.roundNumber(data); + } + + }, + err => { + console.log(err); + + } + ); + } + } +} diff --git a/portal-4cli/src/app/home/home.module.ts b/portal-4cli/src/app/home/home.module.ts new file mode 100644 index 00000000..61bbdc21 --- /dev/null +++ b/portal-4cli/src/app/home/home.module.ts @@ -0,0 +1,45 @@ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { RouterModule } from '@angular/router'; + +import{HomeRoutingModule} from './home-routing.module'; +import{HomeComponent} from './home.component'; + + +import {DataProvidersServiceModule} from '../services/dataProvidersService.module'; +import {DatasetsServiceModule} from '../services/datasetsService.module'; +import {ProjectsServiceModule} from '../services/projectsService.module'; +import {PublicationsServiceModule} from '../services/publicationsService.module'; +import {OrganizationsServiceModule} from '../services/organizationsService.module'; +import {SearchFormModule} from '../searchPages/searchUtils/searchForm.module'; +import {FreeGuard} from'../login/freeGuard.guard'; +import {PiwikServiceModule} from '../utils/piwik/piwikService.module'; +import {PreviousRouteRecorder} from '../utils/piwik/previousRouteRecorder.guard'; +import {RefineFieldResultsServiceModule} from '../services/refineFieldResultsService.module'; +import {HelperModule} from '../utils/helper/helper.module'; + +@NgModule({ + imports: [ + CommonModule, FormsModule, RouterModule, + RefineFieldResultsServiceModule, + DataProvidersServiceModule, DatasetsServiceModule, ProjectsServiceModule, + PublicationsServiceModule, + OrganizationsServiceModule, + SearchFormModule, + PiwikServiceModule, + HomeRoutingModule, + HelperModule + + ], + declarations: [ + HomeComponent + ], + providers:[ + FreeGuard, PreviousRouteRecorder + ], + exports: [ + HomeComponent + ] +}) +export class HomeModule { } diff --git a/portal-4cli/src/app/landingPages/dataProvider/dataProvider-routing.module.ts b/portal-4cli/src/app/landingPages/dataProvider/dataProvider-routing.module.ts new file mode 100644 index 00000000..7aaf631c --- /dev/null +++ b/portal-4cli/src/app/landingPages/dataProvider/dataProvider-routing.module.ts @@ -0,0 +1,18 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import { DataProviderComponent } from './dataProvider.component'; +import {FreeGuard} from'../../login/freeGuard.guard'; +import {PreviousRouteRecorder} from'../../utils/piwik/previousRouteRecorder.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + RouterModule.forChild([ + { path: '', component: DataProviderComponent, canActivate: [FreeGuard, IsRouteEnabled], data: { + redirect: '/error' + },canDeactivate: [PreviousRouteRecorder] } + ]) +] +}) +export class DataProviderRoutingModule { } diff --git a/portal-4cli/src/app/landingPages/dataProvider/dataProvider.component.html b/portal-4cli/src/app/landingPages/dataProvider/dataProvider.component.html new file mode 100644 index 00000000..9e552a06 --- /dev/null +++ b/portal-4cli/src/app/landingPages/dataProvider/dataProvider.component.html @@ -0,0 +1,232 @@ +
+
+
+ +
+ + + + +
+ +
+ + +
{{dataProviderInfo.officialName}}
+ + {{dataProviderInfo.type}} + {{dataProviderInfo.compatibility}} + + + + +
+ + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+

Latest Research Result Timeline

+ +

Research Result Types

+ +
+ + +
+ +

Funders in Research Results of content provider

+ + +
+
+

Projects with most Publications

+ +
+
+
+

Projects with most Research Data

+ +
+
+
+
+ + + + + + + + + +
+ +
+ +
+
+
+ Share - Bookmark +
+
+
+
+
+
+
diff --git a/portal-4cli/src/app/landingPages/dataProvider/dataProvider.component.ts b/portal-4cli/src/app/landingPages/dataProvider/dataProvider.component.ts new file mode 100644 index 00000000..155960ee --- /dev/null +++ b/portal-4cli/src/app/landingPages/dataProvider/dataProvider.component.ts @@ -0,0 +1,385 @@ +import {Component, ViewChild, ElementRef} from '@angular/core'; +import {Observable} from 'rxjs/Observable'; +import {DataProviderService} from './dataProvider.service'; +import {DataProviderInfo} from '../../utils/entities/dataProviderInfo'; +import {ActivatedRoute, Router} from '@angular/router'; +import { Meta} from '../../../angular2-meta'; +import { FetchPublications } from '../../utils/fetchEntitiesClasses/fetchPublications.class'; +import { SearchPublicationsService } from '../../services/searchPublications.service'; +import { FetchDatasets } from '../../utils/fetchEntitiesClasses/fetchDatasets.class'; +import { SearchDatasetsService } from '../../services/searchDatasets.service'; +import { FetchProjects } from '../../utils/fetchEntitiesClasses/fetchProjects.class'; +import { SearchProjectsService } from '../../services/searchProjects.service'; +import { FetchDataproviders } from '../../utils/fetchEntitiesClasses/fetchDataproviders.class'; +import { SearchDataprovidersService } from '../../services/searchDataproviders.service'; +import { RelatedDatasourcesTabComponent } from './relatedDatasourcesTab.component'; +import {OpenaireProperties, ErrorCodes} from '../../utils/properties/openaireProperties'; +import {RouterHelper} from '../../utils/routerHelper.class'; +import {PiwikService} from '../../utils/piwik/piwik.service'; + +import 'rxjs/add/operator/switch'; +import 'rxjs/add/operator/switchMap'; + +@Component({ + selector: 'dataprovider', + templateUrl: 'dataProvider.component.html', + }) + +export class DataProviderComponent { + public dataProviderInfo: DataProviderInfo; + public datasourceId: string; + + // Message variables + public warningMessage = ""; + public errorMessage = ""; + public showLoading: boolean = true; + + // Variable to specify requests with either collectedFrom or hostedBy + public paramsForSearchLink = {}; + + // Metrics tab variables + public metricsClicked: boolean; + public viewsFrameUrl: string; + public downloadsFrameUrl: string; + public totalViews: number; + public totalDownloads: number; + public pageViews: number; + + // Statistics tab variables + public statsClicked: boolean = false; + public docsTimelineUrl: string; + public docsTypesUrl:string; + public docsFunderUrl:string; + public dataProjectsUrl:string ; + public pubsProjectsUrl:string; + + // Variables for publications, research data, projects, content providers, related content providers tabs + public fetchPublications : FetchPublications; + public fetchDatasets: FetchDatasets; + public fetchProjects: FetchProjects; + public fetchDataproviders: FetchDataproviders; + public fetchAggregatorsPublications: FetchPublications; + public fetchAggregatorsDatasets: FetchDatasets; + + public loadingRelatedDatasources: boolean = true; + + // Active tab variable for responsiveness - show tabs only if main request is completed + public activeTab: string = ""; + public showTabs:boolean = false; + + public routerHelper:RouterHelper = new RouterHelper(); + public errorCodes:ErrorCodes = new ErrorCodes(); + + // Request results of each tab only the one time (first time tab is clicked) + private reloadPublications: boolean = true; + private reloadDatasets: boolean = true; + private reloadProjects: boolean = true; + private reloadDataproviders: boolean = true; + private reloadRelatedDatasources: boolean = true; + + private nativeElement : Node; + + sub: any; + piwiksub: any; + subInfo: any; + relatedDatasourcesSub: any; + + constructor (private element: ElementRef, + private _dataproviderService: DataProviderService, + private _piwikService:PiwikService, + private route: ActivatedRoute, + private _meta: Meta, + private _router: Router, + private _searchPublicationsService: SearchPublicationsService, + private _searchDatasetsService: SearchDatasetsService, + private _searchProjectsService: SearchProjectsService, + private _searchDataprovidersService: SearchDataprovidersService) { + this.fetchPublications = new FetchPublications(this._searchPublicationsService); + this.fetchDatasets = new FetchDatasets(this._searchDatasetsService); + this.fetchProjects = new FetchProjects(this._searchProjectsService); + this.fetchDataproviders = new FetchDataproviders(this._searchDataprovidersService); + + this.updateUrl(OpenaireProperties.getBaseLink()+this._router.url); + } + + ngOnInit() { + this.sub = this.route.queryParams.subscribe(data => { + this.updateTitle("Content provider"); + this.updateDescription("Content provider, search, repositories, open access"); + this.datasourceId = data['datasourceId']; + if(this.datasourceId){ + this.getDataProviderInfo(this.datasourceId); + }else{ + // console.info("Content Provider id not found"); + } + + if (typeof document !== 'undefined') { + this.element.nativeElement.scrollIntoView(); + } + }); + } + + ngOnDestroy() { + this.sub.unsubscribe(); + if(this.piwiksub){ + this.piwiksub.unsubscribe(); + } + if(this.subInfo) { + this.subInfo.unsubscribe(); + } + + if(this.relatedDatasourcesSub) { + this.relatedDatasourcesSub.unsubscribe(); + } + } + private getDataProviderInfo(id:string) { + this.warningMessage = ''; + this.errorMessage="" + this.showLoading = true; + + this.showTabs = false ; + if(this.datasourceId==null || this.datasourceId==''){ + this.showLoading = false; + this.warningMessage="No valid datasource id"; + }else{ + this.subInfo = this._dataproviderService.getDataproviderInfo(this.datasourceId).subscribe( + data => { + this.dataProviderInfo = data; + this.initTabs(); + this.showTabs = true ; + this.updateTitle(this.dataProviderInfo.title.name); + this.updateDescription("Content provider, search, repositories, open access,"+this.dataProviderInfo.title.name); + if(OpenaireProperties.isPiwikTrackEnabled() && (typeof document !== 'undefined')){ + this.piwiksub = this._piwikService.trackView(this.dataProviderInfo.title.name).subscribe(); + } + + this.showLoading = false; + + if(this.dataProviderInfo.tabs != undefined && this.dataProviderInfo.tabs.length > 0) { + this.activeTab = this.dataProviderInfo.tabs[0].name; + } + }, + err => { + console.log(err); + // console.info("error"); + this.errorMessage = 'No dataProvider found'; + this.showLoading = false; + } + ); + } + } + + private updateDescription(description:string){ + this._meta.updateMeta("description", description); + this._meta.updateProperty("og:description", description); + } + private updateTitle(title:string){ + var _prefix ="OpenAIRE | "; + var _title = _prefix + ((title.length> 50 ) ?title.substring(0,50):title); + this._meta.setTitle(_title ); + this._meta.updateProperty("og:title",_title); + } + private updateUrl(url:string){ + this._meta.updateProperty("og:url", url); + } + + private initTabs(){ + + if(this.dataProviderInfo.tabs != undefined && this.dataProviderInfo.tabs.length > 0) { + this.reloadPublications = true; + this.reloadDatasets = true; + this.reloadProjects = true; + this.reloadDataproviders = true; + this.reloadRelatedDatasources = true; + this.statsClicked = false; + + this.search(this.dataProviderInfo.tabs[0].content, 1, 10); + this.count(1, 0); + + this.metricsClicked = false; + + this.viewsFrameUrl = OpenaireProperties.getFramesAPIURL()+'merge.php?com=query&data=[{"query":"dtsrcRepoViews","dtsrcName":"'+this.datasourceId+'","table":"","fields":[{"fld":"sum","agg":"sum","type":"column","yaxis":1,"c":false}],"xaxis":{"name":"month","agg":"sum"},"group":"","color":"","type":"chart","size":30,"sort":"xaxis","xStyle":{"r":-30,"s":"0","l":"-","ft":"-","wt":"-"},"title":"","subtitle":"","xaxistitle":"","yaxisheaders":["Monthly views"],"generalxaxis":"","theme":0,"in":[]}]&info_types=["column"]&stacking=&steps=false&fontFamily=Courier&spacing=[5,0,0,0]&style=[{"color":"rgba(0, 0, 0, 1)","size":"18"},{"color":"rgba(0, 0, 0, 1)","size":"18"},{"color":"000000","size":""},{"color":"000000","size":""}]&backgroundColor=rgba(255,255,255,1)&colors[]=rgba(124, 181, 236, 1)&colors[]=rgba(67, 67, 72, 1)&colors[]=rgba(144, 237, 125, 1)&colors[]=rgba(247, 163, 92, 1)&colors[]=rgba(128, 133, 233, 1)&colors[]=rgba(241, 92, 128, 1)&colors[]=rgba(228, 211, 84, 1)&colors[]=rgba(43, 144, 143, 1)&colors[]=rgba(244, 91, 91, 1)&colors[]=rgba(145, 232, 225, 1)&xlinew=0&ylinew=1&legends=true&tooltips=true&persistent=false'; + /*this.viewsFrameUrl = OpenaireProperties.getFramesAPIURL()+'merge.php?com=query&data=[{"query":"dtsrcOpenAIRETimeline", "dtsrcName":"'+this.datasourceId+'", "table":"","fields":[{"fld":"sum","agg":"sum","type":"column","yaxis":1,"c":false}],"xaxis":{"name":"month","agg":"sum"},"group":"","color":"","type":"chart","size":30,"sort":"xaxis","xStyle":{"r":-30,"s":"0","l":"-","ft":"-","wt":"-"},"title":"","subtitle":"","xaxistitle":"OpenAIRE","yaxisheaders":["Monthly views"],"generalxaxis":"","theme":0,"in":[],"filters":[{"name":"","values":[""],"to":"-1"}]},{"query":"dtsrcRepoTimeline", "dtsrcName":"'+this.datasourceId+'", "table":"","fields":[{"fld":"sum","agg":"sum","type":"column","yaxis":1,"c":false}],"xaxis":{"name":"month","agg":"sum"},"group":" ","color":"","type":"chart","size":30,"sort":"xaxis","xStyle":{"r":-30,"s":"0","l":"-","ft":"-","wt":"-"},"title":"","subtitle":"","xaxistitle":"Repository","yaxisheaders":[""],"generalxaxis":"","theme":0,"in":[],"filters":[{"name":"","values":[""],"to":"-1"}]}]&info_types=["column","column"]&stacking=normal&steps=false&fontFamily=Courier&spacing=[5,0,0,0]&style=[{"color":"rgba(0, 0, 0, 1)","size":"18"},{"color":"rgba(0, 0, 0, 1)","size":"18"},{"color":"000000","size":""},{"color":"000000","size":""}]&backgroundColor=rgba(255,255,255,1)&colors[]=rgba(124, 181, 236, 1)&colors[]=rgba(67, 67, 72, 1)&colors[]=rgba(144, 237, 125, 1)&colors[]=rgba(247, 163, 92, 1)&colors[]=rgba(128, 133, 233, 1)&colors[]=rgba(241, 92, 128, 1)&colors[]=rgba(228, 211, 84, 1)&colors[]=rgba(43, 144, 143, 1)&colors[]=rgba(244, 91, 91, 1)&colors[]=rgba(145, 232, 225, 1)&xlinew=0&ylinew=1&legends=true&tooltips=true'; + */ + + this.downloadsFrameUrl = OpenaireProperties.getFramesAPIURL()+'merge.php?com=query&data=[{"query":"dtsrcRepoDownloads","dtsrcName":"'+this.datasourceId+'","table":"","fields":[{"fld":"sum","agg":"sum","type":"column","yaxis":1,"c":false}],"xaxis":{"name":"month","agg":"sum"},"group":"","color":"","type":"chart","size":30,"sort":"xaxis","xStyle":{"r":-30,"s":"0","l":"-","ft":"-","wt":"-"},"title":"","subtitle":"","xaxistitle":"","yaxisheaders":["Monthly downloads"],"generalxaxis":"","theme":0,"in":[]}]&info_types=["column"]&stacking=&steps=false&fontFamily=Courier&spacing=[5,0,0,0]&style=[{"color":"rgba(0, 0, 0, 1)","size":"18"},{"color":"rgba(0, 0, 0, 1)","size":"18"},{"color":"000000","size":""},{"color":"000000","size":""}]&backgroundColor=rgba(255,255,255,1)&colors[]=rgba(124, 181, 236, 1)&colors[]=rgba(67, 67, 72, 1)&colors[]=rgba(144, 237, 125, 1)&colors[]=rgba(247, 163, 92, 1)&colors[]=rgba(128, 133, 233, 1)&colors[]=rgba(241, 92, 128, 1)&colors[]=rgba(228, 211, 84, 1)&colors[]=rgba(43, 144, 143, 1)&colors[]=rgba(244, 91, 91, 1)&colors[]=rgba(145, 232, 225, 1)&xlinew=0&ylinew=1&legends=true&tooltips=true&persistent=false'; + /* + this.downloadsFrameUrl = OpenaireProperties.getFramesAPIURL()+'merge.php?com=query&data=[{"query":"dtsrcDownloadsTimeline","dtsrcName":"'+this.datasourceId+'","table":"","fields":[{"fld":"sum","agg":"sum","type":"chart","yaxis":1,"c":false}],"xaxis":{"name":"month","agg":"sum"},"group":"","color":"","type":"chart","size":30,"sort":"xaxis","xStyle":{"r":-30,"s":"0","l":"-","ft":"-","wt":"-"},"title":"","subtitle":"","xaxistitle":"","yaxisheaders":["Monthly downloads"],"generalxaxis":"","theme":0,"in":[]}]&info_types=["spline"]&stacking=&steps=false&fontFamily=Courier&spacing=[5,0,0,0]&style=[{"color":"rgba(0, 0, 0, 1)","size":"18"},{"color":"rgba(0, 0, 0, 1)","size":"18"},{"color":"000000","size":""},{"color":"000000","size":""}]&backgroundColor=rgba(255,255,255,1)&colors[]=rgba(124, 181, 236, 1)&colors[]=rgba(67, 67, 72, 1)&colors[]=rgba(144, 237, 125, 1)&colors[]=rgba(247, 163, 92, 1)&colors[]=rgba(128, 133, 233, 1)&colors[]=rgba(241, 92, 128, 1)&colors[]=rgba(228, 211, 84, 1)&colors[]=rgba(43, 144, 143, 1)&colors[]=rgba(244, 91, 91, 1)&colors[]=rgba(145, 232, 225, 1)&xlinew=0&ylinew=1&legends=true&tooltips=true'; + */ + + this.docsTimelineUrl ='https://beta.openaire.eu/stats/chart.php?com=query&persistent=false&data={"query":"dtsrcYear","dtsrcName":"'+this.datasourceId+'","table": "result", "fields": [{"fld": "number", "agg": "count", "type": "line", "yaxis":1, "c":true}], "xaxis":{"name": "year", "agg": "avg"}, "group": "", "color": "", "type": "chart", "size":30, "sort": "xaxis", "xStyle":{"r": -30, "s": "-", "l": "-", "ft": "-", "wt": "-"}, "yaxisheaders": [""], "fieldsheaders": ["Research Results"], "in": [{"f":0, "text": "Yearly"}], "filters": [{"name":"year","max":"2016","min":"1997"},{"name": "result_datasources-datasource-name", "values":[""], "to": "-1"}],"having": [], "incfilters": [], "inchaving": [], "title": "", "subtitle": "", "xaxistitle": "Year"}&w=600&h=250'; + this.docsTypesUrl = 'https://beta.openaire.eu/stats/chart.php?com=query&persistent=false&data={"query":"dtsrcPubs","dtsrcName":"'+this.datasourceId+'", "table": "result", "fields": [{"fld": "number", "agg": "count", "type": "pie", "yaxis":1, "c":false}], "xaxis":{"name": "result_classifications-type", "agg": "avg"}, "group": "", "color": "", "type": "chart", "size":30, "sort": "xaxis", "xStyle":{"r": "-", "s": "-", "l": "-", "ft": "-", "wt": "-"}, "yaxisheaders": [""], "fieldsheaders": ["Research Results"], "in": [], "filters": [{"name": "result_datasources-datasource-name", "values": [""], "to": "-1"}], "having": [], "incfilters": [], "inchaving": [], "title": "", "subtitle": "", "xaxistitle": ""}&w=600&h=250'; + this.docsFunderUrl =' https://beta.openaire.eu/stats/chart.php?com=query&persistent=false&data={"query":"dtsrcPubsFund","dtsrcName":"'+this.datasourceId+'", "table": "result", "fields": [{"fld": "number", "agg": "count", "type": "pie", "yaxis":1, "c":false}], "xaxis":{"name": "result_classifications-type", "agg": "avg"}, "group": "", "color": "", "type": "chart", "size":30, "sort": "xaxis", "xStyle":{"r": "-", "s": "-", "l": "-", "ft": "-", "wt": "-"}, "yaxisheaders": [""], "fieldsheaders": ["Research Results"], "in": [], "filters": [{"name": "result_datasources-datasource-name", "values": [""], "to": "-1"}], "having": [], "incfilters": [], "inchaving": [], "title": "", "subtitle": "", "xaxistitle": ""}&w=600&h=250'; + this.dataProjectsUrl ='https://beta.openaire.eu/stats/chart.php?com=query&persistent=false&data={"query":"dtsrcProjData","dtsrcName":"'+this.datasourceId+'", "table": "result", "fields": [{"fld": "number", "agg": "count", "type": "bar", "yaxis":1, "c":false}], "xaxis":{"name": "result_classifications-type", "agg": "avg"}, "group": "", "color": "", "type": "chart", "size":30, "sort": "xaxis", "xStyle":{"r": "-", "s": "-", "l": "-", "ft": "-", "wt": "-"}, "yaxisheaders": [""], "fieldsheaders": ["Research Data"], "in": [], "filters": [{"name": "result_datasources-datasource-name", "values": [""], "to": "-1"}], "having": [], "incfilters": [], "inchaving": [], "title": "", "subtitle": "", "xaxistitle": ""}&w=600&h=250'; + this.pubsProjectsUrl ='https://beta.openaire.eu/stats/chart.php?com=query&persistent=false&data={"query":"dtsrcProjPubs","dtsrcName":"'+this.datasourceId+'", "table": "result", "fields": [{"fld": "number", "agg": "count", "type": "bar", "yaxis":1, "c":false}], "xaxis":{"name": "result_classifications-type", "agg": "avg"}, "group": "", "color": "", "type": "chart", "size":30, "sort": "xaxis", "xStyle":{"r": "-", "s": "-", "l": "-", "ft": "-", "wt": "-"}, "yaxisheaders": [""], "fieldsheaders": ["Publications"], "in": [], "filters": [{"name": "result_datasources-datasource-name", "values": [""], "to": "-1"}], "having": [], "incfilters": [], "inchaving": [], "title": "", "subtitle": "", "xaxistitle": ""}&w=600&h=250'; + + //if({"name": "Publications", "content": "publicationsTab"} in this.dataProviderInfo.tabs) { + //if(this.dataProviderInfo.tabs.some(function (tab) { + // return tab.name === 'Publications'; + //})) { + // this.relatedDataprovidersResultsType = 'publications'; + this.fetchAggregatorsPublications = new FetchPublications(this._searchPublicationsService); + //} else { + // this.relatedDataprovidersResultsType = 'datasets'; + this.fetchAggregatorsDatasets = new FetchDatasets(this._searchDatasetsService); + //} + } + if(this.dataProviderInfo.resultsBy == "collectedFrom") { + //this.paramsForSearchLink = "?collectedFrom="+this.datasourceId+"&co=and"; + this.paramsForSearchLink = this.routerHelper.createQueryParams(['collectedFrom', 'co'], [this.datasourceId, 'and']); + } else if (this.dataProviderInfo.resultsBy == "hostedBy") { + //this.paramsForSearchLink = "?hostedBy="+this.datasourceId+"&ho=and"; + this.paramsForSearchLink = this.routerHelper.createQueryParams(['hostedBy', 'ho'], [this.datasourceId, 'and']); + } + + } + + private count(page: number, size: number) { + for(let i=1; i {}, + err => {}, + () => { this.preprocessRelatedDatasources(); } + ) + + this.fetchAggregatorsPublications.getAggregatorResults(this.datasourceId, page, size); + this.fetchAggregatorsDatasets.getAggregatorResults(this.datasourceId, page, size); + } else { + this.loadingRelatedDatasources = false; + } + + + this.reloadRelatedDatasources = false; + } + + private countRelatedDatasources(page: number, size: number) { + this.fetchAggregatorsPublications.getAggregatorResults(this.datasourceId, page, size); + this.fetchAggregatorsDatasets.getAggregatorResults(this.datasourceId, page, size); + } + + + private preprocessRelatedDatasources() { + if( this.fetchAggregatorsPublications.searchUtils.status == this.errorCodes.DONE || + this.fetchAggregatorsDatasets.searchUtils.status == this.errorCodes.DONE ) { + this.dataProviderInfo.relatedDatasources = new Map(); + } + for(let result of this.fetchAggregatorsPublications.results) { + if(!this.dataProviderInfo.relatedDatasources.has(result.id)) { + this.dataProviderInfo.relatedDatasources.set(result.id, {"name": result.name, "countPublications": result.count, "countDatasets": "0"}); + } else { + this.dataProviderInfo.relatedDatasources.get(result.id).countPublications = parseInt(this.dataProviderInfo.relatedDatasources.get(result.id).countPublications + result.count)+""; + } + } + + for(let result of this.fetchAggregatorsDatasets.results) { + if(!this.dataProviderInfo.relatedDatasources.has(result.id)) { + this.dataProviderInfo.relatedDatasources.set(result.id, {"name": result.name, "countPublications": "0", "countDatasets": result.count}); + } else { + this.dataProviderInfo.relatedDatasources.get(result.id).countDatasets = parseInt(this.dataProviderInfo.relatedDatasources.get(result.id).countDatasets + result.count)+""; + } + } + this.loadingRelatedDatasources = false; + } + + public metricsResults($event) { + this.totalViews = $event.totalViews; + this.totalDownloads = $event.totalDownloads; + this.pageViews = $event.pageViews; + } +} diff --git a/portal-4cli/src/app/landingPages/dataProvider/dataProvider.module.ts b/portal-4cli/src/app/landingPages/dataProvider/dataProvider.module.ts new file mode 100644 index 00000000..d1f7abba --- /dev/null +++ b/portal-4cli/src/app/landingPages/dataProvider/dataProvider.module.ts @@ -0,0 +1,51 @@ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { RouterModule } from '@angular/router'; + +import {IFrameModule} from '../../utils/iframe.module'; +import {ErrorMessagesModule} from '../../utils/errorMessages.module'; +// import { ResultLandingModule } from '../resultLanding.module'; +import {TabResultModule } from '../../searchPages/searchUtils/tabResult.module'; +import {MetricsModule} from '../landing-utils/metrics.module'; +import {LandingModule} from '../landing-utils/landing.module'; +import {PagingModule} from '../../utils/paging.module'; + +import {PublicationsTabComponent} from './publicationsTab.component'; +import {DatasetsTabComponent} from './datasetsTab.component'; +import {StatisticsTabComponent} from './statisticsTab.component'; +import {ProjectsTabComponent} from './projectsTab.component'; +import {DatasourcesTabComponent} from './datasourcesTab.component'; +import {OrganizationsTabComponent} from './organizationsTab.component'; +import {RelatedDatasourcesTabComponent} from './relatedDatasourcesTab.component'; +// import {TabsComponent} from './tabs.component'; + +import {DataProviderComponent} from './dataProvider.component'; +import {DataProviderService} from './dataProvider.service'; +import {DataProvidersServiceModule} from '../../services/dataProvidersService.module'; +import {DatasetsServiceModule} from '../../services/datasetsService.module'; +import {ProjectsServiceModule} from '../../services/projectsService.module'; +import {PublicationsServiceModule} from '../../services/publicationsService.module'; + +import { DataProviderRoutingModule } from './dataProvider-routing.module'; +import {FreeGuard} from'../../login/freeGuard.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: + [CommonModule, FormsModule, RouterModule,DataProviderRoutingModule, + TabResultModule, IFrameModule, ErrorMessagesModule, MetricsModule, LandingModule, + DataProvidersServiceModule, DatasetsServiceModule, ProjectsServiceModule, PublicationsServiceModule, + PagingModule], + declarations: + [PublicationsTabComponent, DatasetsTabComponent, StatisticsTabComponent, ProjectsTabComponent, DatasourcesTabComponent, OrganizationsTabComponent, + RelatedDatasourcesTabComponent, DataProviderComponent + ], + providers:[ + DataProviderService, FreeGuard, IsRouteEnabled], + exports: [ + DataProviderComponent + ] + +}) +export class DataProviderModule { } diff --git a/portal-4cli/src/app/landingPages/dataProvider/dataProvider.service.ts b/portal-4cli/src/app/landingPages/dataProvider/dataProvider.service.ts new file mode 100644 index 00000000..4b549e8d --- /dev/null +++ b/portal-4cli/src/app/landingPages/dataProvider/dataProvider.service.ts @@ -0,0 +1,162 @@ +import {Injectable} from '@angular/core'; +import {Http, Response} from '@angular/http'; +import {Observable} from 'rxjs/Observable'; +import {DataProviderInfo} from '../../utils/entities/dataProviderInfo'; +import {OpenaireProperties} from '../../utils/properties/openaireProperties'; +import 'rxjs/add/observable/of'; +import 'rxjs/add/operator/do'; +import 'rxjs/add/operator/share'; + + +@Injectable() +export class DataProviderService { + + constructor(private http: Http ) {} + + dataProviderInfo: DataProviderInfo; + + getDataproviderInfo (id: string):any { + console.info("getDataProviderInfo in service"); + let url = OpenaireProperties.getSearchAPIURLLast() + 'datasources/' +id +"?format=json"; + let key = url; + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()) + .map(res => res['result']['metadata']['oaf:entity']) + .map(res => [res['oaf:datasource'], + res['oaf:datasource']['datasourcetype'], + res['oaf:datasource']['openairecompatibility'], + res['oaf:datasource']['accessinfopackage'], + res['oaf:datasource']['rels']['rel'] + ]) + .map(res => this.parseDataProviderInfo(res)); + + } + + private handleError (error: Response) { + // in a real world app, we may send the error to some remote logging infrastructure + // instead of just logging it to the console + console.log(error); + return Observable.throw(error || 'Server error'); + } + + parseDataProviderInfo (data: any):any { + this.dataProviderInfo = new DataProviderInfo(); + + if(data[0] != null) { + this.dataProviderInfo.title = {"name": (data[0].englishname)?data[0].englishname: data[0].officialname, "url": data[0].websiteurl}; + this.dataProviderInfo.officialName = data[0].officialname; + var originalId =(data[0].originalId)?data[0].originalId:""; + if(originalId && originalId != ""){ + if(originalId.indexOf("opendoar____::") != -1){ + this.dataProviderInfo.openDoarURL = "http://www.opendoar.org/find.php?format=full&rID="+originalId.split("opendoar____::")[1]; + + }else if (originalId.indexOf("re3data_____::") != -1){ + this.dataProviderInfo.r3DataURL = "http://service.re3data.org/repository/"+originalId.split("re3data_____::")[1]; + } + } + + } + + if(data[1] != null) { + this.dataProviderInfo.type = data[1].classname; + + if(data[1].classid == "entityregistry" || data[1].classid == "entityregistry::projects" || data[1].classid == "entityregistry::repositories") { + this.dataProviderInfo.registry = true; + } else { + this.dataProviderInfo.registry = false; + } + + if(this.dataProviderInfo.tabs == undefined) { + this.dataProviderInfo.tabs = new Array<{"name": string, "content": string}>(); + } + + if(this.dataProviderInfo.tabsInTypes.publicationsTab.has(data[1].classid)) { + this.dataProviderInfo.tabs.push({"name": "Publications", "content": "publicationsTab"}); + } + if(this.dataProviderInfo.tabsInTypes.datasetsTab.has(data[1].classid)) { + this.dataProviderInfo.tabs.push({"name": "Research Data", "content": "datasetsTab"}); + } + + if(this.dataProviderInfo.tabsInTypes.projectsTab.has(data[1].classid)) { + this.dataProviderInfo.tabs.push({"name": "Projects", "content": "projectsTab"}); + } + if(this.dataProviderInfo.tabsInTypes.datasourcesTab.has(data[1].classid)) { + this.dataProviderInfo.tabs.push({"name": "Content Providers", "content": "datasourcesTab"}); + } + this.dataProviderInfo.tabs.push({"name": "Organizations", "content": "organizationsTab"}); + + if(this.dataProviderInfo.tabsInTypes.relatedDatasourcesTab.has(data[1].classid)) { + this.dataProviderInfo.tabs.push({"name": "Related Content Providers", "content": "relatedDatasourcesTab"}); + } + + if(this.dataProviderInfo.tabsInTypes.statisticsTab.has(data[1].classid)) { + this.dataProviderInfo.tabs.push({"name": "Statistics", "content": "statisticsTab"}); + } + + this.dataProviderInfo.tabs.push({"name": "Metrics", "content": "metricsTab"}); + + if(this.dataProviderInfo.resultTypes.collectedFrom.has(data[1].classid)) { + this.dataProviderInfo.resultsBy = "collectedFrom"; + } else if(this.dataProviderInfo.resultTypes.hostedBy.has(data[1].classid)) { + this.dataProviderInfo.resultsBy = "hostedBy"; + } + } + + if(!this.dataProviderInfo.registry) { + if(data[2] != null) { + this.dataProviderInfo.compatibility = data[2].classname; + } + + if(data[3] != null) { + let oaiPmhURL: string; + if(Array.isArray(data[3])) { + oaiPmhURL = data[3][0]; + } + else { + oaiPmhURL = data[3]; + } + + if(oaiPmhURL != '' && oaiPmhURL != 'unknown') { + this.dataProviderInfo.oaiPmhURL = oaiPmhURL; + } + } + } + + if(data[4] != null) { + let mydata; + let counter = 0; + let countriesSet: Set; + let length = data[4].length!=undefined ? data[4].length : 1; + + for(let i=0; i(); + this.dataProviderInfo.countries = new Array(); + countriesSet = new Set(); + } + + this.dataProviderInfo.organizations[counter] = {"name": "", "id": ""}; + this.dataProviderInfo.organizations[counter]['name'] = mydata.legalname; + this.dataProviderInfo.organizations[counter]['id'] = /*OpenaireProperties.getsearchLinkToOrganization()+*/mydata['to'].content; + + if(mydata.country != '' && mydata['country'].classname != '') { + if(!countriesSet.has(mydata['country'].classname)) { + this.dataProviderInfo.countries.push(mydata['country'].classname); + countriesSet.add(mydata['country'].classname); + } + } + + counter++; + } + } + } + } + + return this.dataProviderInfo; + } +} diff --git a/portal-4cli/src/app/landingPages/dataProvider/datasetsTab.component.ts b/portal-4cli/src/app/landingPages/dataProvider/datasetsTab.component.ts new file mode 100644 index 00000000..d75edae7 --- /dev/null +++ b/portal-4cli/src/app/landingPages/dataProvider/datasetsTab.component.ts @@ -0,0 +1,48 @@ +import {Component, Input} from '@angular/core'; +import { FetchDatasets } from '../../utils/fetchEntitiesClasses/fetchDatasets.class'; + +import {OpenaireProperties, ErrorCodes} from '../../utils/properties/openaireProperties'; + +@Component({ + selector: 'datasetsTab', + template: ` + + + + + + + ` +}) + +export class DatasetsTabComponent { + @Input() paramsForSearchLink = {}; + @Input() fetchDatasets : FetchDatasets; + public linkToSearchDatasets = ""; + public errorCodes:ErrorCodes = new ErrorCodes(); + + constructor () {} + + ngOnInit() { + this.linkToSearchDatasets = OpenaireProperties.getLinkToAdvancedSearchDatasets(); + } + + ngOnDestroy() {} +} diff --git a/portal-4cli/src/app/landingPages/dataProvider/datasourcesTab.component.ts b/portal-4cli/src/app/landingPages/dataProvider/datasourcesTab.component.ts new file mode 100644 index 00000000..4db8adf8 --- /dev/null +++ b/portal-4cli/src/app/landingPages/dataProvider/datasourcesTab.component.ts @@ -0,0 +1,50 @@ +import {Component, Input} from '@angular/core'; +import { FetchDataproviders } from '../../utils/fetchEntitiesClasses/fetchDataproviders.class'; + +import {OpenaireProperties, ErrorCodes} from '../../utils/properties/openaireProperties'; + +@Component({ + selector: 'datasourcesTab', + template: ` + + + + + + + ` +}) + +export class DatasourcesTabComponent { + + @Input() paramsForSearchLink = {}; + @Input() fetchDataproviders : FetchDataproviders; + public linkToSearchDataproviders = ""; + public errorCodes:ErrorCodes = new ErrorCodes(); + + constructor () {} + + ngOnInit() { + this.linkToSearchDataproviders = OpenaireProperties.getLinkToAdvancedSearchDataProviders(); + } + + ngOnDestroy() {} +} diff --git a/portal-4cli/src/app/landingPages/dataProvider/organizationsTab.component.ts b/portal-4cli/src/app/landingPages/dataProvider/organizationsTab.component.ts new file mode 100644 index 00000000..c666fdae --- /dev/null +++ b/portal-4cli/src/app/landingPages/dataProvider/organizationsTab.component.ts @@ -0,0 +1,54 @@ +import {Component, Input} from '@angular/core'; + +@Component({ + selector: 'organizationsTab', + template: ` + + +
+
+ {{organizations.length}} organizations, page {{organizationsPage}} of {{totalPages(organizations.length)}} + +
+ +
+

+ + + {{item['name']}} + +

+

+ {{item['name']}} +

+
+
+ ` +}) + +export class OrganizationsTabComponent { + + @Input() organizations: {"name": string, "id": string}[]; + public organizationsPage: number = 1; + public pageSize: number = 10; + + constructor () {} + + ngOnInit() {} + + ngOnDestroy() {} + + totalPages(totalResults: number): number { + let totalPages:any = totalResults/this.pageSize; + if(!(Number.isInteger(totalPages))) { + totalPages = (parseInt(totalPages, this.pageSize) + 1); + } + return totalPages; + } + + updateOrganizationsPage($event) { + this.organizationsPage = $event.value; + } +} diff --git a/portal-4cli/src/app/landingPages/dataProvider/projectsTab.component.ts b/portal-4cli/src/app/landingPages/dataProvider/projectsTab.component.ts new file mode 100644 index 00000000..4102e285 --- /dev/null +++ b/portal-4cli/src/app/landingPages/dataProvider/projectsTab.component.ts @@ -0,0 +1,49 @@ +import {Component, Input} from '@angular/core'; + +import { FetchProjects } from '../../utils/fetchEntitiesClasses/fetchProjects.class'; + +import {OpenaireProperties, ErrorCodes} from '../../utils/properties/openaireProperties'; + +@Component({ + selector: 'projectsTab', + template: ` + + + + + + + ` +}) + +export class ProjectsTabComponent { + + @Input() paramsForSearchLink = {}; + @Input() fetchProjects : FetchProjects; + public linkToSearchProjects = ""; + public errorCodes:ErrorCodes = new ErrorCodes(); + + constructor () {} + + ngOnInit() { + this.linkToSearchProjects = OpenaireProperties.getLinkToAdvancedSearchProjects(); + } + + ngOnDestroy() {} +} diff --git a/portal-4cli/src/app/landingPages/dataProvider/publicationsTab.component.ts b/portal-4cli/src/app/landingPages/dataProvider/publicationsTab.component.ts new file mode 100644 index 00000000..156e48e6 --- /dev/null +++ b/portal-4cli/src/app/landingPages/dataProvider/publicationsTab.component.ts @@ -0,0 +1,50 @@ +import {Component, Input} from '@angular/core'; +import { FetchPublications } from '../../utils/fetchEntitiesClasses/fetchPublications.class'; + +import {OpenaireProperties, ErrorCodes} from '../../utils/properties/openaireProperties'; + +@Component({ + selector: 'publicationsTab', + template: ` + + + + + + + + + ` +}) + +export class PublicationsTabComponent { + @Input() paramsForSearchLink = {};//: string = ""; + @Input() fetchPublications : FetchPublications; + public linkToSearchPublications = ""; + public errorCodes:ErrorCodes = new ErrorCodes(); + + constructor () {} + + ngOnInit() { + this.linkToSearchPublications = OpenaireProperties.getLinkToAdvancedSearchPublications();//+this.paramsForSearchLink; + } + + ngOnDestroy() {} +} diff --git a/portal-4cli/src/app/landingPages/dataProvider/relatedDatasourcesTab.component.ts b/portal-4cli/src/app/landingPages/dataProvider/relatedDatasourcesTab.component.ts new file mode 100644 index 00000000..da85f597 --- /dev/null +++ b/portal-4cli/src/app/landingPages/dataProvider/relatedDatasourcesTab.component.ts @@ -0,0 +1,122 @@ +import {Component, Input} from '@angular/core'; + +import { FetchPublications } from '../../utils/fetchEntitiesClasses/fetchPublications.class'; +import { FetchDatasets } from '../../utils/fetchEntitiesClasses/fetchDatasets.class'; + +import {OpenaireProperties, ErrorCodes} from '../../utils/properties/openaireProperties'; +import {RouterHelper} from '../../utils/routerHelper.class'; +import { Observable } from 'rxjs/Observable'; + +@Component({ + selector: 'relatedDatasourcesTab', + template: ` + + + + + + +
+
+ {{results.size}} related content providers, page {{page}} of {{totalPages(results.size)}} + +
+ + + + + + + + + + + + + + + + + + + + + + + +
Content Provider Name + Number of Publications + + Number of Research Data +
+ + {{results.get(id).name}} + + + + {{results.get(id).countPublications}} + + - + + {{results.get(id).countDatasets}} + + -
+
+ ` +}) + +export class RelatedDatasourcesTabComponent { + @Input() dataproviderId: string; + @Input() fetchPublications : FetchPublications; + @Input() fetchDatasets : FetchDatasets; + // true: preprocessing is not over + @Input() loading: boolean = true; + // Εvery content provider's id is a single key of a map + @Input() results: Map; + + public linkToSearchPublications: string = ""; + public linkToSearchResearchData: string = ""; + + public routerHelper:RouterHelper = new RouterHelper(); + public errorCodes:ErrorCodes = new ErrorCodes(); + + public page: number = 1; + public pageSize: number = 10; + + constructor () {} + + ngOnInit() { + this.linkToSearchPublications = OpenaireProperties.getLinkToAdvancedSearchPublications();//+"?&hostedBy=";//+ +"&ho=and&collectedFrom="+ +"&co=and"; + this.linkToSearchResearchData = OpenaireProperties.getLinkToAdvancedSearchDatasets(); + } + + ngOnDestroy() {} + + totalPages(totalResults: number): number { + let totalPages:any = totalResults/this.pageSize; + if(!(Number.isInteger(totalPages))) { + totalPages = (parseInt(totalPages, this.pageSize) + 1); + } + return totalPages; + } + + updatePage($event) { + this.page = $event.value; + } +} diff --git a/portal-4cli/src/app/landingPages/dataProvider/statisticsTab.component.ts b/portal-4cli/src/app/landingPages/dataProvider/statisticsTab.component.ts new file mode 100644 index 00000000..4aae1f91 --- /dev/null +++ b/portal-4cli/src/app/landingPages/dataProvider/statisticsTab.component.ts @@ -0,0 +1,78 @@ +import {Component, Input} from '@angular/core'; +import { SearchDatasetsComponent } from '../../searchPages/simple/searchDatasets.component'; +import { SearchPublicationsComponent } from '../../searchPages/simple/searchPublications.component'; +import {OpenaireProperties, ErrorCodes} from '../../utils/properties/openaireProperties'; + +@Component({ + selector: 'statisticsTab', + template: ` +
+ + + + +
+

Latest Documents Timeline

+ +

Documents Types

+ +
+ + +
+
+

Funders in content providers Publications

+ +

Projects with most Publications

+ + +
+
+
+

Projects with most Research Data

+ + +
+
+
+
+ ` +}) + +export class StatisticsTabComponent { + + @Input() statistics; + @Input() id; + @Input() searchDatasetsComponent : SearchDatasetsComponent; + @Input() searchPublicationsComponent : SearchPublicationsComponent; + @Input() show : boolean = false; + + private docsTimelineUrl: string; + private docsTypesUrl:string; + private docsFunderUrl:string; + private dataProjectsUrl:string ; + private pubsProjectsUrl:string; + public errorCodes:ErrorCodes = new ErrorCodes(); + + constructor () {} + + ngOnInit() { + + this.docsTimelineUrl ='https://beta.openaire.eu/stats/chart.php?com=query&persistent=false&data={"query":"dtsrcYear","dtsrcName":"'+this.id+'","table": "result", "fields": [{"fld": "number", "agg": "count", "type": "line", "yaxis":1, "c":true}], "xaxis":{"name": "year", "agg": "avg"}, "group": "", "color": "", "type": "chart", "size":30, "sort": "xaxis", "xStyle":{"r": "-", "s": "-", "l": "-", "ft": "-", "wt": "-"}, "yaxisheaders": [""], "fieldsheaders": ["Documents"], "in": [{"f":0, "text": "Yearly"}], "filters": [{"name":"year","max":"2016","min":"1997"},{"name": "result_datasources-datasource-name", "values":[""], "to": "-1"}],"having": [], "incfilters": [], "inchaving": [], "title": "", "subtitle": "", "xaxistitle": "Year"}&w=600&h=250'; + this.docsTypesUrl = 'https://beta.openaire.eu/stats/chart.php?com=query&persistent=false&data={"query":"dtsrcPubs","dtsrcName":"'+this.id+'", "table": "result", "fields": [{"fld": "number", "agg": "count", "type": "pie", "yaxis":1, "c":false}], "xaxis":{"name": "result_classifications-type", "agg": "avg"}, "group": "", "color": "", "type": "chart", "size":30, "sort": "xaxis", "xStyle":{"r": "-", "s": "-", "l": "-", "ft": "-", "wt": "-"}, "yaxisheaders": [""], "fieldsheaders": ["Documents"], "in": [], "filters": [{"name": "result_datasources-datasource-name", "values": [""], "to": "-1"}], "having": [], "incfilters": [], "inchaving": [], "title": "", "subtitle": "", "xaxistitle": ""}&w=600&h=250'; + this.docsFunderUrl =' https://beta.openaire.eu/stats/chart.php?com=query&persistent=false&data={"query":"dtsrcPubsFund","dtsrcName":"'+this.id+'", "table": "result", "fields": [{"fld": "number", "agg": "count", "type": "pie", "yaxis":1, "c":false}], "xaxis":{"name": "result_classifications-type", "agg": "avg"}, "group": "", "color": "", "type": "chart", "size":30, "sort": "xaxis", "xStyle":{"r": "-", "s": "-", "l": "-", "ft": "-", "wt": "-"}, "yaxisheaders": [""], "fieldsheaders": ["Documents"], "in": [], "filters": [{"name": "result_datasources-datasource-name", "values": [""], "to": "-1"}], "having": [], "incfilters": [], "inchaving": [], "title": "", "subtitle": "", "xaxistitle": ""}&w=600&h=250'; + this.dataProjectsUrl ='https://beta.openaire.eu/stats/chart.php?com=query&persistent=false&data={"query":"dtsrcProjData","dtsrcName":"'+this.id+'", "table": "result", "fields": [{"fld": "number", "agg": "count", "type": "bar", "yaxis":1, "c":false}], "xaxis":{"name": "result_classifications-type", "agg": "avg"}, "group": "", "color": "", "type": "chart", "size":30, "sort": "xaxis", "xStyle":{"r": "-", "s": "-", "l": "-", "ft": "-", "wt": "-"}, "yaxisheaders": [""], "fieldsheaders": ["Datasets"], "in": [], "filters": [{"name": "result_datasources-datasource-name", "values": [""], "to": "-1"}], "having": [], "incfilters": [], "inchaving": [], "title": "", "subtitle": "", "xaxistitle": ""}&w=600&h=250'; + this.pubsProjectsUrl ='https://beta.openaire.eu/stats/chart.php?com=query&persistent=false&data={"query":"dtsrcProjPubs","dtsrcName":"'+this.id+'", "table": "result", "fields": [{"fld": "number", "agg": "count", "type": "bar", "yaxis":1, "c":false}], "xaxis":{"name": "result_classifications-type", "agg": "avg"}, "group": "", "color": "", "type": "chart", "size":30, "sort": "xaxis", "xStyle":{"r": "-", "s": "-", "l": "-", "ft": "-", "wt": "-"}, "yaxisheaders": [""], "fieldsheaders": ["Publications"], "in": [], "filters": [{"name": "result_datasources-datasource-name", "values": [""], "to": "-1"}], "having": [], "incfilters": [], "inchaving": [], "title": "", "subtitle": "", "xaxistitle": ""}&w=600&h=250'; + } + + ngOnDestroy() {} +} diff --git a/portal-4cli/src/app/landingPages/dataset/dataset-routing.module.ts b/portal-4cli/src/app/landingPages/dataset/dataset-routing.module.ts new file mode 100644 index 00000000..ae8bf7aa --- /dev/null +++ b/portal-4cli/src/app/landingPages/dataset/dataset-routing.module.ts @@ -0,0 +1,18 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import { DatasetComponent } from './dataset.component'; +import {FreeGuard} from'../../login/freeGuard.guard'; +import {PreviousRouteRecorder} from'../../utils/piwik/previousRouteRecorder.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + RouterModule.forChild([ + { path: '', component: DatasetComponent, canActivate: [FreeGuard, IsRouteEnabled], data: { + redirect: '/error' + },canDeactivate: [PreviousRouteRecorder] } + ]) +] +}) +export class DatasetRoutingModule { } diff --git a/portal-4cli/src/app/landingPages/dataset/dataset.component.html b/portal-4cli/src/app/landingPages/dataset/dataset.component.html new file mode 100644 index 00000000..3abcee28 --- /dev/null +++ b/portal-4cli/src/app/landingPages/dataset/dataset.component.html @@ -0,0 +1,328 @@ +
+
+
+ +
+ + + + + +
+
+ + {{datasetInfo.types.join(", ")}} + {{datasetInfo.title.accessMode}} + + + Record in preview + + + + +
+ + ({{datasetInfo.date}}) +
+ +
    +
  • Publisher: {{datasetInfo.publisher}}
  • + +
  • Embargo end date: {{datasetInfo.embargoEndDate}}
  • +
  • + +
  • +
  • + + +
  • +
+ +
+ {{datasetInfo.description}} +
+ +
+ + +
+ + + + + + + + + +
+
+
+ No related research results available +
+
+ +
+
{{provenanceaction}}
+ + +
+
+
+ +
+
+ No similar research results available +
+
+ +
+
+
+ + + + + + + +
+ +
+
+ +
+
+ Share - Bookmark + +
+ + + + + + +
+
+
+
+
+
diff --git a/portal-4cli/src/app/landingPages/dataset/dataset.component.ts b/portal-4cli/src/app/landingPages/dataset/dataset.component.ts new file mode 100644 index 00000000..b1c5829b --- /dev/null +++ b/portal-4cli/src/app/landingPages/dataset/dataset.component.ts @@ -0,0 +1,172 @@ +import {Component, ViewChild, ElementRef} from '@angular/core'; +import {Observable} from 'rxjs/Observable'; +import {DatasetService} from './dataset.service'; +import {DatasetInfo} from '../../utils/entities/datasetInfo'; +import {ActivatedRoute, Router} from '@angular/router'; +import {OpenaireProperties} from '../../utils/properties/openaireProperties' +import {RouterHelper} from '../../utils/routerHelper.class'; +import { Meta} from '../../../angular2-meta'; +import {PiwikService} from '../../utils/piwik/piwik.service'; + +@Component({ + selector: 'dataset', + templateUrl: 'dataset.component.html', +}) + +export class DatasetComponent { + public datasetInfo: DatasetInfo; + public datasetId : string ; + + // APP BOX variables + public showAllCollectedFrom: boolean = false; + public showAllDownloadFrom: boolean = false; + public showAllPublishedIn: boolean = false; + + // Metrics tab variables + public metricsClicked: boolean; + public viewsFrameUrl: string; + public downloadsFrameUrl: string; + public totalViews: number; + public totalDownloads: number; + public pageViews: number; + + // Active tab variable for responsiveness + public activeTab: string = "Related Research Results"; + + // Map counting variable + public relatedResearchResultsNum: number = 0; + + // Message variables + public warningMessage = ""; + public errorMessage = ""; + public showLoading: boolean = true; + + public routerHelper:RouterHelper = new RouterHelper(); + + private result ; + sub: any; piwiksub: any; infoSub: any; + + constructor (private element: ElementRef, + private _datasetService: DatasetService, + private _piwikService:PiwikService, + private route: ActivatedRoute, + private _meta: Meta, + private _router: Router) { + this.updateUrl(OpenaireProperties.getBaseLink()+this._router.url); + } + + ngOnInit() { + this.sub = this.route.queryParams.subscribe(params => { + this.datasetInfo = null; + this.updateTitle("Dataset"); + this.updateDescription("Dataset, search, open access"); + + this.datasetId = params['datasetId']; + console.info("Id is :"+this.datasetId); + + if(this.datasetId){ + this.getDatasetInfo(this.datasetId); + }else{ + this.showLoading = false; + this.warningMessage="No valid research data id"; + } + + this.metricsClicked = false; + + this.viewsFrameUrl = OpenaireProperties.getFramesAPIURL()+'merge.php?com=query&data=[{"query":"resRepoViews", "resTitle":"'+this.datasetId+'", "table":"","fields":[{"fld":"sum","agg":"sum","type":"column","yaxis":1,"c":false}],"xaxis":{"name":"month","agg":"sum"},"group":" ","color":"","type":"chart","size":30,"sort":"xaxis","xStyle":{"r":-30,"s":"0","l":"-","ft":"-","wt":"-"},"title":"","subtitle":"","xaxistitle":"Repository","yaxisheaders":["Monthly views"],"generalxaxis":"","theme":0,"in":[],"filters":[{"name":"","values":[""],"to":"-1"}]}]&info_types=["column"]&stacking=normal&steps=false&fontFamily=Courier&spacing=[5,0,0,0]&style=[{"color":"rgba(0, 0, 0, 1)","size":"18"},{"color":"rgba(0, 0, 0, 1)","size":"18"},{"color":"000000","size":""},{"color":"000000","size":""}]&backgroundColor=rgba(255,255,255,1)&colors[]=rgba(67, 67, 72, 1)&colors[]=rgba(144, 237, 125, 1)&colors[]=rgba(247, 163, 92, 1)&colors[]=rgba(128, 133, 233, 1)&colors[]=rgba(241, 92, 128, 1)&colors[]=rgba(228, 211, 84, 1)&colors[]=rgba(43, 144, 143, 1)&colors[]=rgba(244, 91, 91, 1)&colors[]=rgba(145, 232, 225, 1)&xlinew=0&ylinew=1&legends=true&tooltips=true&persistent=false'; + /*this.viewsFrameUrl = OpenaireProperties.getFramesAPIURL()+'merge.php?com=query&data=[{"query":"resViewsTimeline", "resTitle":"'+this.datasetId+'", "table":"","fields":[{"fld":"sum","agg":"sum","type":"column","yaxis":1,"c":false}],"xaxis":{"name":"month","agg":"sum"},"group":" ","color":"","type":"chart","size":30,"sort":"xaxis","xStyle":{"r":-30,"s":"0","l":"-","ft":"-","wt":"-"},"title":"","subtitle":"","xaxistitle":"Repository","yaxisheaders":["Monthly views"],"generalxaxis":"","theme":0,"in":[],"filters":[{"name":"","values":[""],"to":"-1"}]}]&info_types=["column"]&stacking=normal&steps=false&fontFamily=Courier&spacing=[5,0,0,0]&style=[{"color":"rgba(0, 0, 0, 1)","size":"18"},{"color":"rgba(0, 0, 0, 1)","size":"18"},{"color":"000000","size":""},{"color":"000000","size":""}]&backgroundColor=rgba(255,255,255,1)&colors[]=rgba(124, 181, 236, 1)&colors[]=rgba(67, 67, 72, 1)&colors[]=rgba(144, 237, 125, 1)&colors[]=rgba(247, 163, 92, 1)&colors[]=rgba(128, 133, 233, 1)&colors[]=rgba(241, 92, 128, 1)&colors[]=rgba(228, 211, 84, 1)&colors[]=rgba(43, 144, 143, 1)&colors[]=rgba(244, 91, 91, 1)&colors[]=rgba(145, 232, 225, 1)&xlinew=0&ylinew=1&legends=true&tooltips=true&persistent=false'; + */ + + this.downloadsFrameUrl = OpenaireProperties.getFramesAPIURL()+'merge.php?com=query&data=[{"query":"resRepoDownloads", "resTitle":"'+this.datasetId+'", "table":"","fields":[{"fld":"sum","agg":"sum","type":"column","yaxis":1,"c":false}],"xaxis":{"name":"month","agg":"sum"},"group":" ","color":"","type":"chart","size":30,"sort":"xaxis","xStyle":{"r":-30,"s":"0","l":"-","ft":"-","wt":"-"},"title":"","subtitle":"","xaxistitle":"Repository","yaxisheaders":["Monthly downloads"],"generalxaxis":"","theme":0,"in":[],"filters":[{"name":"","values":[""],"to":"-1"}]}]&info_types=["column"]&stacking=normal&steps=false&fontFamily=Courier&spacing=[5,0,0,0]&style=[{"color":"rgba(0, 0, 0, 1)","size":"18"},{"color":"rgba(0, 0, 0, 1)","size":"18"},{"color":"000000","size":""},{"color":"000000","size":""}]&backgroundColor=rgba(255,255,255,1)&colors[]=rgba(67, 67, 72, 1)&colors[]=rgba(144, 237, 125, 1)&colors[]=rgba(247, 163, 92, 1)&colors[]=rgba(128, 133, 233, 1)&colors[]=rgba(241, 92, 128, 1)&colors[]=rgba(228, 211, 84, 1)&colors[]=rgba(43, 144, 143, 1)&colors[]=rgba(244, 91, 91, 1)&colors[]=rgba(145, 232, 225, 1)&xlinew=0&ylinew=1&legends=true&tooltips=true&persistent=false'; + /*this.downloadsFrameUrl = OpenaireProperties.getFramesAPIURL()+'merge.php?com=query&data=[{"query":"resRepoDownloadTimeline", "resTitle":"'+this.datasetId+'", "table":"","fields":[{"fld":"sum","agg":"sum","type":"column","yaxis":1,"c":false}],"xaxis":{"name":"month","agg":"sum"},"group":" ","color":"","type":"chart","size":30,"sort":"xaxis","xStyle":{"r":-30,"s":"0","l":"-","ft":"-","wt":"-"},"title":"","subtitle":"","xaxistitle":"Repository","yaxisheaders":["Monthly downloads"],"generalxaxis":"","theme":0,"in":[],"filters":[{"name":"","values":[""],"to":"-1"}]}]&info_types=["column"]&stacking=normal&steps=false&fontFamily=Courier&spacing=[5,0,0,0]&style=[{"color":"rgba(0, 0, 0, 1)","size":"18"},{"color":"rgba(0, 0, 0, 1)","size":"18"},{"color":"000000","size":""},{"color":"000000","size":""}]&backgroundColor=rgba(255,255,255,1)&colors[]=rgba(67, 67, 72, 1)&colors[]=rgba(144, 237, 125, 1)&colors[]=rgba(247, 163, 92, 1)&colors[]=rgba(128, 133, 233, 1)&colors[]=rgba(241, 92, 128, 1)&colors[]=rgba(228, 211, 84, 1)&colors[]=rgba(43, 144, 143, 1)&colors[]=rgba(244, 91, 91, 1)&colors[]=rgba(145, 232, 225, 1)&xlinew=0&ylinew=1&legends=true&tooltips=true'; + */ + if (typeof document !== 'undefined') { + this.element.nativeElement.scrollIntoView(); + } + }); + + } + + ngOnDestroy() { + this.sub.unsubscribe(); + if(this.piwiksub){ + this.piwiksub.unsubscribe(); + } + if(this.infoSub) { + this.infoSub.unsubscribe(); + } + } + + private getDatasetInfo(id:string) { + this.warningMessage = ''; + this.errorMessage="" + this.showLoading = true; + + this.infoSub = this._datasetService.getDatasetInfo(id).subscribe( + data => { + this.datasetInfo = data; + this.updateTitle(this.datasetInfo.title.name); + this.updateDescription("Dataset, search, repositories, open access,"+this.datasetInfo.title.name); + if(OpenaireProperties.isPiwikTrackEnabled() && (typeof document !== 'undefined')){ + this.piwiksub = this._piwikService.trackView(this.datasetInfo.title.name).subscribe(); + } + + this.result = [] + this.result = {id: id, type :"dataset", source : "openaire", title: this.datasetInfo.title,url: '', result: '', accessRights: this.datasetInfo.title.accessMode, embargoEndDate: ''}; + + let relatedResearchResultsNum = 0; + if(this.datasetInfo.relatedResearchResults != undefined) { + this.datasetInfo.relatedResearchResults.forEach(function (value, key, map) { + relatedResearchResultsNum += value.length; + }); + } + this.relatedResearchResultsNum = relatedResearchResultsNum; + + this.showLoading = false; + }, + err => { + console.log(err) + console.info("error"); + + this.errorMessage = 'No research data found'; + this.showLoading = false; + } + ); + } + + // showChange($event) { + // this.showAllReferences=$event.value; + // } + + public metricsResults($event) { + this.totalViews = $event.totalViews; + this.totalDownloads = $event.totalDownloads; + this.pageViews = $event.pageViews; + } + + private updateDescription(description:string){ + this._meta.updateMeta("description", description); + this._meta.updateProperty("og:description", description); + } + private updateTitle(title:string){ + var _prefix ="OpenAIRE | "; + var _title = _prefix + ((title.length> 50 ) ?title.substring(0,50):title); + this._meta.setTitle(_title ); + this._meta.updateProperty("og:title",_title); + } + private updateUrl(url:string){ + this._meta.updateProperty("og:url", url); + } + + public buildCurationTooltip() { + let tooltipContent: string = "
"; + + tooltipContent += "

Record in preview

"; + tooltipContent += "

Bibliographic record accepted by the system, but not yet processed by
OpenAIRE tools for information quality improvement and de-duplication

"; + + return tooltipContent; + } + public getKeys( map) { + return Array.from(map.keys()); + } +} diff --git a/portal-4cli/src/app/landingPages/dataset/dataset.module.ts b/portal-4cli/src/app/landingPages/dataset/dataset.module.ts new file mode 100644 index 00000000..90c0ded6 --- /dev/null +++ b/portal-4cli/src/app/landingPages/dataset/dataset.module.ts @@ -0,0 +1,37 @@ +//import {MaterialModule} from '@angular/material'; +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { SharedModule } from '../../shared/shared.module'; +import { RouterModule } from '@angular/router'; + +import { DatasetService} from './dataset.service'; +import { DatasetComponent } from './dataset.component'; +import { DatasetRoutingModule } from './dataset-routing.module'; +import {MetricsModule} from '../landing-utils/metrics.module'; +import {IFrameModule} from '../../utils/iframe.module'; +import {AltMetricsModule} from '../../utils/altmetrics.module'; +import {CiteThisModule} from '../landing-utils/citeThis/citeThis.module'; + +import { ResultLandingModule } from '../landing-utils/resultLanding.module'; +import { LandingModule } from '../landing-utils/landing.module'; +import {FreeGuard} from'../../login/freeGuard.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + //MaterialModule.forRoot(), + CommonModule, FormsModule,SharedModule, RouterModule, LandingModule, CiteThisModule, + ResultLandingModule, DatasetRoutingModule, MetricsModule, IFrameModule, AltMetricsModule + ], + declarations: [ + DatasetComponent + ], + providers:[ + DatasetService, FreeGuard, IsRouteEnabled + ], + exports: [ + DatasetComponent + ] +}) +export class DatasetModule { } diff --git a/portal-4cli/src/app/landingPages/dataset/dataset.service.ts b/portal-4cli/src/app/landingPages/dataset/dataset.service.ts new file mode 100644 index 00000000..9074d326 --- /dev/null +++ b/portal-4cli/src/app/landingPages/dataset/dataset.service.ts @@ -0,0 +1,220 @@ +import {Injectable} from '@angular/core'; +import {Http, Response} from '@angular/http'; +import {Observable} from 'rxjs/Observable'; +import {DatasetInfo} from '../../utils/entities/datasetInfo'; +import {OpenaireProperties} from '../../utils/properties/openaireProperties'; +import 'rxjs/add/observable/of'; +import 'rxjs/add/operator/do'; +import 'rxjs/add/operator/share'; + +import { ParsingFunctions } from '../landing-utils/parsingFunctions.class'; + +@Injectable() +export class DatasetService { + + constructor(private http: Http ) { + this.parsingFunctions = new ParsingFunctions(); + } + + public parsingFunctions: ParsingFunctions; + datasetInfo: DatasetInfo; + + getDatasetInfo (id: string):any { + console.info("getDatasetInfo in service"); + + let url = OpenaireProperties. getSearchAPIURLLast()+'datasets/'+id+"?format=json"; + let key = url; + + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()) + .do(res => console.info(res['result']['metadata']['oaf:entity'])) + .map(res => [res['result']['header']['dri:status'], res['result']['metadata']['oaf:entity']['oaf:result']]) + .map(res => [res[1], + res[1]['title'], + res[1]['rels']['rel'], + res[1]['children'], + res[1]['pid'], + res[1]['subject'], + res[1]['bestaccessright'], + res[1]['collectedfrom'], + res[1]['context'], + //res[1]['resulttype'], + res[0], + res[1]['creator'] + ]).map(res => this.parseDatasetInfo(res)); + } + + private handleError (error: Response) { + // in a real world app, we may send the error to some remote logging infrastructure + // instead of just logging it to the console + console.log(error); + return Observable.throw(error || 'Server error'); + } + + parseDatasetInfo (data: any):any { + this.datasetInfo = new DatasetInfo(); + + if(data[0] != null) { + var date:string = (data[0].dateofacceptance)+""; // transform to string in case it is an integer + this.datasetInfo.date = (date && (date).indexOf('-') !== -1)?date.split('-')[0]:date; + this.datasetInfo.dateofacceptance = data[0].dateofacceptance; + this.datasetInfo.publisher = data[0].publisher; + if(!Array.isArray(data[0].description)) { + this.datasetInfo.description = data[0].description; + } else { + this.datasetInfo.description = data[0].description[0]; + } + this.datasetInfo.embargoEndDate = data[0].embargoenddate; + } + this.datasetInfo.title = {"name": "", "url": "", "accessMode": ""}; + if(data[0]['bestaccessright'].hasOwnProperty("classid")) { + this.datasetInfo.title.accessMode = data[0]['bestaccessright'].classid; + } + if(data[1] != null) { + if(Array.isArray(data[1])) { + this.datasetInfo.title['name'] = data[1][0].content; + } else { + this.datasetInfo.title['name'] = data[1].content; + } + } + + if(data[2] != null) { + let relation; + let length = data[2].length!=undefined ? data[2].length : 1; + + for(let i=0; i(); + this.datasetInfo.publishedIn = new Map() + + this.datasetInfo.types = new Array(); + let types = new Set(); + + let counter = 0; + let instance; + + let length = data[3]['instance'].length!=undefined ? data[3]['instance'].length : 1; + + for(let i=0; i, Map] = this.parsingFunctions.parseAllSubjects(data[5]); + this.datasetInfo.subjects = subjectResults[0]; + this.datasetInfo.otherSubjects = subjectResults[1]; + this.datasetInfo.classifiedSubjects = subjectResults[2]; + } + + // if(data[6] != null) { + // this.datasetInfo.bestaccessright = data[6].classid; + // } + + // if(data[7] != null) { + // this.datasetInfo.collectedFrom = this.parsingFunctions.parseCollectedFrom(data[7]); + // } + + // null argument is for journal + this.datasetInfo.downloadFrom = this.parsingFunctions.addPublisherToDownloadFrom( + this.datasetInfo.downloadFrom, this.datasetInfo.publisher, + null, this.datasetInfo.identifiers, this.datasetInfo.title); + + if(data[8] != null) { + this.datasetInfo.contexts = this.parsingFunctions.parseContexts(data[8]); + } + + // if(data[9] != null && this.datasetInfo.type == undefined) { + // if(data[9].hasOwnProperty('classname')) { + // this.datasetInfo.type = data[9].classname; + // } + // } + + if(data[9] != null && data[9] == "under curation") { + this.datasetInfo.underCurationMessage = true; + } else { + this.datasetInfo.underCurationMessage = false; + } + + if(data[10] != null) { + if(this.datasetInfo.authors == undefined) { + this.datasetInfo.authors = new Array(); + } + + let authors = data[10]; + let length = Array.isArray(authors) ? authors.length : 1; + for(let i=0; i +
+
+ +
+ + + +
+

{{header1}}

+

{{header2}}

+ +
+ +
+ +
+ + +
+
+
+
+
+ + ` + }) +export class HtmlProjectReportComponent{ + private projectId: string; + private totalResults: number = 10; + private resultsType: string = "publication"; + + public header1: string = ""; + public header2: string = ""; + public htmlResult: string = ""; + + public sub: any; piwiksub: any; + public subHTML: any; + public subHTMLInfo: any; + + public warningMessage: string = ""; + public errorMessage: string = ""; + public showLoading: boolean = true; + + constructor ( private route: ActivatedRoute, + private htmlService: HtmlProjectReportService, + private _piwikService:PiwikService, + private _projectService: ProjectService, + private _meta: Meta, private _router: Router) { + this.updateUrl(OpenaireProperties.getBaseLink()+this._router.url); + } + + ngOnInit() { + this.sub = this.route.queryParams.subscribe(params => { + this.projectId = params['projectId']; + + if (params['size'] == parseInt(params['size'], 10)) { + this.totalResults = params['size']; + } else { + this.showLoading = false; + this.warningMessage="Requested size is not an integer"; + } +console.info(params['type']); + if(params['type'] && (params['type'] == "dataset" || params['type'] == "publication")){ + this.resultsType = (params['type'] == "dataset") ? 'research data' : params['type']; + this.updateTitle("Project's "+this.resultsType+" report"); + this.updateDescription("project, project "+ this.resultsType +" report, funding, open access, publications, research data"); + } else { + this.showLoading = false; + this.warningMessage="Requested type should be publication or research data"; + } + + //showLoading is true if no warnings + if(this.showLoading) { + if(this.projectId) { + this.createHeaders(); + } else { + this.showLoading = false; + this.warningMessage="No valid project id"; + } + } + }); + } + + ngOnDestroy() { + this.sub.unsubscribe(); + if(this.piwiksub){ + this.piwiksub.unsubscribe(); + } + if(this.subHTML) { + this.subHTML.unsubscribe(); + } + if(this.subHTMLInfo) { + this.subHTMLInfo.unsubscribe(); + } + } + + private createHeaders() { + this.subHTMLInfo = this._projectService.getHTMLInfo(this.projectId).subscribe( + data => { + this.createHeader1(data); + if(data.acronym) { + this.updateTitle(data.acronym+" "+this.resultsType+" report"); + } else if(data.title){ + this.updateTitle(data.title+" "+this.resultsType+" report"); + } + if(OpenaireProperties.isPiwikTrackEnabled() && (typeof document !== 'undefined')){ + this.piwiksub = this._piwikService.trackView(((data.acronym)?data.acronym:data.title)+" "+this.resultsType+" report").subscribe(); + } + }, + err => { + console.log(err); + this.createClipboard(); + } + ); + + this.header2 = this.totalResults+((this.resultsType == "publication")?" publications":" research data"); + } + + private createClipboard() { + let intro: string = ''; + intro += ''; + intro += ''; + intro += ''+this.header1+'' + intro += ''; + + if (typeof window !== 'undefined') { + this.subHTML = this.htmlService.getHTML(this.projectId, this.totalResults, this.resultsType).subscribe( + data => { + let body: string = intro+'

'+this.header1+'

'+this.header2+'

'+data+''; + this.htmlResult = data; + + let clipboard; + let Clipboard; + Clipboard = require('clipboard'); + clipboard = new Clipboard('.clipBtn', { + /*target: function(trigger) { + return document.getElementById("clipboard"); + }*/ + text: function(trigger) { + return body;//document.getElementById("clipboard").getAttribute('innerHTML');//"aaaa"+tmp+"oo"; + } + }); + + this.showLoading = false; + }, + err => { + console.log(err); + this.errorMessage = 'Service not available'; + this.showLoading = false; + } + ); + } + } + + createHeader1(data: {"title": string, "acronym": string, "callIdentifier": string}) { + this.header1 = ((this.resultsType == "publication")?"Publications":"Research Data") + " of Project "; + + if(data != undefined) { + if(data.title != undefined && data.title != "") { + this.header1 += data.title; + } + if((data.title != undefined && data.title != "") && + ((data.acronym != undefined && data.acronym != "") || + (data.callIdentifier != undefined && data.callIdentifier != ""))) { + this.header1 += "("; + } + if(data.acronym != undefined && data.acronym != "") { + this.header1 += data.acronym + " - "; + } + if(data.callIdentifier != undefined && data.callIdentifier != "") { + this.header1 += data.callIdentifier; + } + if((data.title != undefined && data.title != "") && + ((data.acronym != undefined && data.acronym != "") || + (data.callIdentifier != undefined && data.callIdentifier != ""))) { + this.header1 += ")"; + } + } + + this.createClipboard(); + } + + public copied() { + UIkit.notification({ + message : 'Raw html is copied. Please paste it on an html file.', + status : 'success', + timeout : 3000, + pos : 'top-center' + }); + } + + private updateDescription(description:string){ + this._meta.updateMeta("description", description); + this._meta.updateProperty("og:description", description); + } + private updateTitle(title:string){ + var _prefix ="OpenAIRE | "; + var _title = _prefix + ((title.length> 50 ) ?title.substring(0,50):title); + this._meta.setTitle(_title ); + this._meta.updateProperty("og:title",_title); + } + private updateUrl(url:string){ + this._meta.updateProperty("og:url", url); + } +} diff --git a/portal-4cli/src/app/landingPages/htmlProjectReport/htmlProjectReport.module.ts b/portal-4cli/src/app/landingPages/htmlProjectReport/htmlProjectReport.module.ts new file mode 100644 index 00000000..8fea6ec1 --- /dev/null +++ b/portal-4cli/src/app/landingPages/htmlProjectReport/htmlProjectReport.module.ts @@ -0,0 +1,28 @@ +//import {MaterialModule} from '@angular/material'; +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { ProjectServiceModule} from '../project/projectService.module'; + + +import {HtmlProjectReportService} from './htmlProjectReport.service'; +import {HtmlProjectReportComponent} from './htmlProjectReport.component'; +import { HtmlProjectReportRoutingModule } from './htmlProjectReport-routing.module'; +import {FreeGuard} from'../../login/freeGuard.guard'; +import {PiwikServiceModule} from '../../utils/piwik/piwikService.module'; + +@NgModule({ + imports: [ + CommonModule, FormsModule, HtmlProjectReportRoutingModule, ProjectServiceModule,PiwikServiceModule + ], + declarations: [ + HtmlProjectReportComponent + ], + providers:[ + HtmlProjectReportService, FreeGuard + ], + exports: [ + HtmlProjectReportComponent + ] +}) +export class HtmlProjectReportModule { } diff --git a/portal-4cli/src/app/landingPages/htmlProjectReport/htmlProjectReport.service.ts b/portal-4cli/src/app/landingPages/htmlProjectReport/htmlProjectReport.service.ts new file mode 100644 index 00000000..de681974 --- /dev/null +++ b/portal-4cli/src/app/landingPages/htmlProjectReport/htmlProjectReport.service.ts @@ -0,0 +1,25 @@ +import {Injectable} from '@angular/core'; +import {Http, Response} from '@angular/http'; +import {Observable} from 'rxjs/Observable'; +import {OpenaireProperties} from '../../utils/properties/openaireProperties'; +import 'rxjs/add/operator/do'; + +@Injectable() +export class HtmlProjectReportService { + + constructor(private http: Http ) {} + + getHTML(id: string, size: number, type:string):any { + console.info("getHTML in service"); + + let resultTypeId: string = (type == "research data") ? 'dataset' : type; + let requestType: string = (resultTypeId == "dataset") ? 'datasets' : 'publications'; + //let url = OpenaireProperties. getSearchAPIURLLast() + 'publications/' +id+"?format=json"; + let url = OpenaireProperties.getCsvAPIURL(); + url += 'resources?format=html&page=0&size='+size+'&type='+requestType+'&query=(((oaftype exact result) and (resulttypeid exact '+resultTypeId+')) and (relprojectid exact "'+id+'"))'; + let key = url; + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.text()); + } +} diff --git a/portal-4cli/src/app/landingPages/landing-utils/addThis.component.ts b/portal-4cli/src/app/landingPages/landing-utils/addThis.component.ts new file mode 100644 index 00000000..52951668 --- /dev/null +++ b/portal-4cli/src/app/landingPages/landing-utils/addThis.component.ts @@ -0,0 +1,40 @@ +import {Component, ElementRef, Input} from '@angular/core'; +import {ActivatedRoute} from '@angular/router'; + + interface addthis { + layers: refresh; + } + interface refresh { + refresh: Function; + } + declare var addthis: addthis; + +// +@Component({ + selector: 'addThis', + template: ` +
+ ` +}) +export class AddThisComponent { + private sub:any; + + + constructor(private route: ActivatedRoute) { + + } + ngOnInit() { + this.sub = this.route.queryParams.subscribe(data => { + + if (typeof document !== 'undefined') { + try{ + addthis.layers.refresh(); + }catch (e) { + } + } + }); + + } + + +} diff --git a/portal-4cli/src/app/landingPages/landing-utils/citeThis/citation.class.ts b/portal-4cli/src/app/landingPages/landing-utils/citeThis/citation.class.ts new file mode 100644 index 00000000..3a8f42d8 --- /dev/null +++ b/portal-4cli/src/app/landingPages/landing-utils/citeThis/citation.class.ts @@ -0,0 +1,110 @@ +export class Citation{ + public templates:string[]=["bibtex","chicago","ieee","science","apa","cell","harvard","mla","nature","acm"]; + + bibtex:string =` `; + ieee_csl:string =` `; + chicago_csl:string =` `; + science_csl:string =' '; + cell_csl:string =' '; + mla_csl:string =' '; + nature_csl:string =' '; +//nature_csl:string =' '; + acm_csl:string =' '; + + public getOptionsBy(template:string):any{ + if(template == "bibtex"){ + var options:any ={ // Subsequent calls + format: 'string', + type: 'string', + style: 'bibtex' + } + return options; + }else if(template == "apa"){ + var options:any ={ // Subsequent calls + format: 'string', + type: 'string', + style: 'citation-apa' + } + return options; + }else if(template == "harvard"){ + var options:any ={ // Subsequent calls + format: 'string', + type: 'string', + style: 'citation-harvard1' + } + return options; + }else if(template == "chicago"){ + var options:any ={ // Subsequent calls + format: 'string', + type: 'string', + style: 'citation-chicago', + template:this.chicago_csl + } + return options; + }else if(template == "ieee"){ + var options:any ={ // Subsequent calls + format: 'string', + type: 'string', + style: 'citation-ieee', + template:this.ieee_csl + } + return options; + }else if(template == "science"){ + var options:any ={ // Subsequent calls + format: 'string', + type: 'string', + style: 'citation-science', + template:this.science_csl + } + return options; + }else if(template == "cell"){ + var options:any ={ // Subsequent calls + format: 'string', + type: 'string', + style: 'citation-cell', + template:this.cell_csl + } + return options; + }else if(template == "mla"){ + var options:any ={ // Subsequent calls + format: 'string', + type: 'string', + style: 'citation-mla', + template:this.mla_csl + } + return options; + }else if(template == "nature"){ + var options:any ={ // Subsequent calls + format: 'string', + type: 'string', + style: 'citation-nature', + template:this.nature_csl + } + return options; + }else if(template == "acm"){ + var options:any ={ // Subsequent calls + format: 'string', + type: 'string', + style: 'citation-acm', + template:this.acm_csl + } + return options; + } + + + } + +} +export class CitationData{ + public id:string; + public type:string; + public title:string; + public DOI:string; + public "container-title":string; + public publisher:string; + public author:{given:string, family:string, 'parse-names':boolean}[] =[]; + public issued:any[] =[];//{"date-parts":string[]}[] =[]; + public date:string; + public authors:string[] =[]; + +} diff --git a/portal-4cli/src/app/landingPages/landing-utils/citeThis/citeThis.component.ts b/portal-4cli/src/app/landingPages/landing-utils/citeThis/citeThis.component.ts new file mode 100644 index 00000000..4a7b4676 --- /dev/null +++ b/portal-4cli/src/app/landingPages/landing-utils/citeThis/citeThis.component.ts @@ -0,0 +1,102 @@ +import {Component, ElementRef, Input} from '@angular/core'; +import {ActivatedRoute} from '@angular/router'; +import {Citation, CitationData} from './citation.class'; + +// +@Component({ + selector: 'citeThis', + template: ` + +
+
+
Cite this {{type}}
+
+ +
{{citationText}}
+
+
+
+ ` +}) +export class CiteThisComponent { + private sub:any; + public selectedStyle:string; + public citationText:string; + public citation:Citation = new Citation(); + // public cite: any; + @Input() result: any; + @Input() id: string; + @Input() type: string="article"; + + public data;//= '[ { "id": "Q23571040", "type": "apple", "title": "Correlation of the Base Strengths of Amines 1", "DOI": "10.1021/ja01577a030", "author": [ { "given": "H. K.", "family": "Hall" } ], "issued": [ { "date-parts": [ "1957", "1", "1" ] } ], "container-title": "Journal of the American Chemical Society", "volume": "79", "issue": "20", "page": "5441-5444" } ]'; + + + constructor(private route: ActivatedRoute) { + this.selectedStyle = this.citation.templates[0]; + } + + ngOnInit() { + if(typeof window !== 'undefined') { + this.parseData(); + // var Cite = require('citation-js'); + // this.cite = new Cite(this.data,this.citation.getOptionsBy(this.selectedStyle)); + // this.citationText = this.cite.get(this.citation.getOptionsBy(this.selectedStyle)); + } + } + parseData(){ + var citationData:CitationData = new CitationData(); + + citationData.id = this.id; + if(this.result.types != undefined && this.result.types.length > 0 && this.result.types[0]){ + citationData.type = this.result.types[0].toLowerCase(); + }else if(this.result.type != undefined ){ + citationData.type = this.result.type.toLowerCase(); + } + if(this.result.title && this.result.title.name){ + citationData.title = this.result.title.name; + } + if(this.result.journal && this.result.journal.journal){ + citationData["container-title"] = this.result.journal.journal; + } + if(this.result.publisher){ + citationData.publisher = this.result.publisher; + } + if( this.result.authors){ + citationData.author = []; + var max_length = (this.result.authors.length > 10)?10:this.result.authors.length; + for (var i =0 ;i < max_length; i++){ + if(this.result.authors[i] && this.result.authors[i].indexOf(", ") !== -1){ + citationData.author.push({given:this.result.authors[i].split(", ")[0], family:this.result.authors[i].split(", ")[1], 'parse-names':true}); + }else{ + citationData.author.push({given:"", family:this.result.authors[i], 'parse-names':true}); + } + citationData.authors.push(this.result.authors[i]); + } + } + if(this.result.dateofacceptance != undefined){ + citationData.issued = []; + var date:string = (this.result.dateofacceptance)+""; // transform to string in case it is an integer + var dateArray:string[] = (date && (date).indexOf('-') !== -1)?date.split('-'):[date]; + if(dateArray.length < 3){ + dateArray.push["01"]; + dateArray.push["01"]; + } + citationData.issued.push({"date-parts":[dateArray[0],dateArray[1], dateArray[2]]}); + if(this.result.date ){ + citationData.date = this.result.date ; + } + } + + + this.data = JSON.stringify(citationData); + console.log(this.data); + + } + styleChanged(){ + // this.citationText = this.cite.get(this.citation.getOptionsBy(this.selectedStyle)); + + } + +} diff --git a/portal-4cli/src/app/landingPages/landing-utils/citeThis/citeThis.module.ts b/portal-4cli/src/app/landingPages/landing-utils/citeThis/citeThis.module.ts new file mode 100644 index 00000000..4a14a36a --- /dev/null +++ b/portal-4cli/src/app/landingPages/landing-utils/citeThis/citeThis.module.ts @@ -0,0 +1,23 @@ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + + import {CiteThisComponent} from './citeThis.component'; + +@NgModule({ + imports: [ + + CommonModule, FormsModule + ], + declarations: [ + CiteThisComponent + ], + providers:[ + + ], + exports: [ + + CiteThisComponent + ] +}) +export class CiteThisModule { } diff --git a/portal-4cli/src/app/landingPages/landing-utils/fundedBy.component.ts b/portal-4cli/src/app/landingPages/landing-utils/fundedBy.component.ts new file mode 100644 index 00000000..637ff787 --- /dev/null +++ b/portal-4cli/src/app/landingPages/landing-utils/fundedBy.component.ts @@ -0,0 +1,131 @@ +import {Component, Input, ElementRef} from '@angular/core'; +import {OpenaireProperties} from '../../utils/properties/openaireProperties'; + +@Component({ + selector: 'fundedBy', + template: ` +
+
Funded By
+
+
+ + + + {{item['funderShortname']?item['funderShortname']:item['funderName']}} + [no funder available] + | {{ item['acronym']?item['acronym']:item['title']}} + + + + + {{item['funderShortname']?item['funderShortname']:item['funderName']}} + [no funder available] + | {{ item['acronym']?item['acronym']:item['title']}} + + + + + {{item['funderShortname']?item['funderShortname']:item['funderName']}} + [no funder available] + | {{ item['acronym']?item['acronym']:item['title']}} + + + + + {{item['funderShortname']?item['funderShortname']:item['funderName']}} + [no funder available] + | {{ item['acronym']?item['acronym']:item['title']}} + + + + + + + +
+
+
+ + View less + +
+
...
+
+ + View more + +
+
+ ` + }) + +export class FundedByComponent { + @Input() fundedByProjects: { "id": string, "acronym": string, "title": string, + "funderShortname": string, "funderName": string, + "funding": string, "code": string, "provenanceAction": string, + "inline": boolean }[]; + public showAll: boolean = false; + + constructor (private element: ElementRef) {} + + ngOnInit() {} + + public buildFundingTooltip(item: { "id": string, "acronym": string, "title": string, + "funderShortname": string, "funderName": string, + "funding": string, "code": string, "provenanceAction": string, inline: boolean}) { + let tooltipContent: string = "
"; + + if(item.title) { + tooltipContent += "
"+item.title+"
"; + } + + if(item.code || item.funderName || item.funderShortname || item.funding) { + tooltipContent += "

"; + } + + if(item.code) { + tooltipContent += "

Project Code: "+item.code+"
"; + } + if(item.funderName || item.funderShortname) { + tooltipContent += "
Funder: "; + if(item.funderName && item.funderShortname) { + tooltipContent += item.funderName + " ("+ item.funderShortname +")"; + } else if(item.funderName) { + tooltipContent += item.funderName; + } else { + tooltipContent += item.funderShortname; + } + tooltipContent += "
"; + } + + if(item.funding) { + tooltipContent += "
Funding: "+ item.funding + "
"; + } + + if(item.code || item.funderName || item.funderShortname || item.funding) { + tooltipContent += "

"; + } + + if(item.provenanceAction == 'Repository') { + tooltipContent += "Provided by Repository"; + } else if(item.provenanceAction == 'Algorithm') { + tooltipContent += "Inferred by Algorithm"; + } else if(item.provenanceAction == 'USer') { + tooltipContent += "Claimed by User"; + } + + tooltipContent+="
" + return tooltipContent; + } + + public scroll() { + console.info("scroll into view"); + if (typeof document !== 'undefined') { + this.element.nativeElement.scrollIntoView(); + } + } +} diff --git a/portal-4cli/src/app/landingPages/landing-utils/landing.module.ts b/portal-4cli/src/app/landingPages/landing-utils/landing.module.ts new file mode 100644 index 00000000..a7ae76f1 --- /dev/null +++ b/portal-4cli/src/app/landingPages/landing-utils/landing.module.ts @@ -0,0 +1,28 @@ +/* This module contains all common components for all landing pages */ + +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { RouterModule } from '@angular/router'; + +import {TabPagingComponent} from './tabPaging.component'; +import {ShowTitleComponent} from './showTitle.component'; +import {AddThisComponent} from './addThis.component'; +import {PiwikServiceModule} from '../../utils/piwik/piwikService.module'; +import {PreviousRouteRecorder} from'../../utils/piwik/previousRouteRecorder.guard'; + +@NgModule({ + imports: [ + CommonModule, FormsModule, RouterModule, PiwikServiceModule + ], + declarations: [ + TabPagingComponent, ShowTitleComponent, AddThisComponent + ], + providers:[ + PreviousRouteRecorder + ], + exports: [ + TabPagingComponent, ShowTitleComponent, AddThisComponent + ] +}) +export class LandingModule { } diff --git a/portal-4cli/src/app/landingPages/landing-utils/metrics.component.ts b/portal-4cli/src/app/landingPages/landing-utils/metrics.component.ts new file mode 100644 index 00000000..b4c75833 --- /dev/null +++ b/portal-4cli/src/app/landingPages/landing-utils/metrics.component.ts @@ -0,0 +1,224 @@ +import {Component, Input, Output, EventEmitter} from '@angular/core'; +import {Metrics} from '../../utils/entities/metrics'; +import {MetricsService } from '../../services/metrics.service'; +import {ErrorCodes} from '../../utils/properties/openaireProperties'; + +import { Subscription } from 'rxjs/Subscription'; + +@Component({ + selector: 'metrics', + template: ` + + + + + + + + + +
+
Project metrics are derived from aggregating individual research results metrics.
+
+
+ +
{{pageViews}}
+
views in OpenAIRE
+ + + +
+
+
+
+ +
{{metrics.totalViews}} + + ( {{metrics.totalOpenaireViews}} from OpenAIRE ) +
+
views in local repository
+ + + + + +
+
+
+
+ +
{{metrics.totalDownloads}} + + ( {{metrics.totalOpenaireDownloads}} from OpenAIRE ) +
+
downloads in local repository
+ + + + + + +
+
+ +
+ +

The information is available from the following content providers:

+ + + + + + + + + + + + + + + +
FromNumber Of ViewsNumber Of Downloads
+ + {{metrics.infos.get(key).name}} + + + {{metrics.infos.get(key).numOfViews}} + + ( {{metrics.infos.get(key).openaireViews}} from OpenAIRE ) + + + {{metrics.infos.get(key).numOfDownloads}} + + ( {{metrics.infos.get(key).openaireDownloads}} from OpenAIRE ) + +
+ ` + }) + +export class MetricsComponent { + @Output() metricsResults = new EventEmitter(); + @Input() id: string; + @Input() entityType: string; + @Input() entity: string; + //@Input() name: string = ""; + @Input() pageViews: number = 0; + + public metrics: Metrics; + public errorCodes:ErrorCodes; + private sub: Subscription; + + public status: number; + + constructor (private _metricsService: MetricsService) {} + + ngOnInit() { + this.errorCodes = new ErrorCodes(); + this.status = this.errorCodes.LOADING; + this.getMetrics(); + } + + ngOnDestroy() { + this.sub.unsubscribe(); + } + + private getMetrics() { + //if(this.id == undefined || this.id == "") { + // console.log("supplied id in metrics is not acceptable"); + //} + //if(this.type == undefined || this.type == "") { + // console.log("supplied id in metrics is not acceptable"); + //} + + this.sub = this._metricsService.getMetrics(this.id, this.entityType).subscribe( + data => { + this.metrics = data; + this.status = this.errorCodes.DONE; + + this.metricsResults.emit({ + totalViews: this.metrics.totalViews, + totalDownloads: this.metrics.totalDownloads, + pageViews: this.metrics.pageViews + }); + }, + err => { + console.log(err); + if(err.status == '404') { + this.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.status = this.errorCodes.ERROR; + } else { + this.status = this.errorCodes.NOT_AVAILABLE; + } + this.metricsResults.emit({ + totalViews: 0, + totalDownloads: 0 + }); + } + ); + } +} diff --git a/portal-4cli/src/app/landingPages/landing-utils/metrics.module.ts b/portal-4cli/src/app/landingPages/landing-utils/metrics.module.ts new file mode 100644 index 00000000..3fb241b4 --- /dev/null +++ b/portal-4cli/src/app/landingPages/landing-utils/metrics.module.ts @@ -0,0 +1,26 @@ +/* This module contains all common components for all landing pages */ + +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + + import {MetricsComponent} from './metrics.component'; + import { MetricsService } from '../../services/metrics.service'; + + import {ErrorMessagesModule} from '../../utils/errorMessages.module'; + +@NgModule({ + imports: [ + CommonModule, FormsModule, ErrorMessagesModule + ], + declarations: [ + MetricsComponent + ], + providers:[ + MetricsService + ], + exports: [ + MetricsComponent + ] +}) +export class MetricsModule { } diff --git a/portal-4cli/src/app/landingPages/landing-utils/parsingFunctions.class.ts b/portal-4cli/src/app/landingPages/landing-utils/parsingFunctions.class.ts new file mode 100644 index 00000000..e3c7f2be --- /dev/null +++ b/portal-4cli/src/app/landingPages/landing-utils/parsingFunctions.class.ts @@ -0,0 +1,455 @@ +import {OpenaireProperties} from '../../utils/properties/openaireProperties'; + +export class ParsingFunctions { + + constructor () {} + + public ngOnDestroy() {} + + public parseFundingByProjects(fundedByProjects: { "id": string, "acronym": string, "title": string, + "funderShortname": string, "funderName": string, + "funding": string, "code": string, + "provenanceAction": string, "inline": boolean + }[], + relation: any, projectsProvenanceVocabulary: any): + { "id": string, "acronym": string, "title": string, + "funderShortname": string, "funderName": string, + "funding": string, "code": string, + "provenanceAction": string, "inline": boolean + }[] { + if(fundedByProjects == undefined) { + fundedByProjects = new Array<{"id": string, "acronym": string, "title": string, + "funderShortname": string, "funderName": string, + "funding": string, "code": string, + "provenanceAction": string, "inline": boolean + }>(); + } + + let fundedByProject: { "id": string, "acronym": string, "title": string, + "funderShortname": string, "funderName": string, + "funding": string, "code": string, + "provenanceAction": string, "inline": boolean + } = { "id": "", "acronym": "", "title": "", + "funderShortname": "", "funderName": "", + "funding": "", "code": "", "provenanceAction": "", "inline": false + }; + + if(relation.title != 'unidentified') { + fundedByProject['id'] = relation['to'].content; + fundedByProject['acronym'] = relation.acronym; + fundedByProject['title'] = relation.title; + fundedByProject['code'] = relation.code; + + if(relation.provenanceaction in projectsProvenanceVocabulary) { + fundedByProject['provenanceAction'] = projectsProvenanceVocabulary[relation.provenanceaction]; + } + } else { + fundedByProject['id'] = ""; + fundedByProject['acronym'] = ""; + fundedByProject['title'] = ""; + fundedByProject['code'] = ""; + fundedByProject['provenanceAction'] = ""; + } + + if(relation.hasOwnProperty("funding")) { + let funding: {"funderName": string, "funderShortname": string, "stream": string}; + funding = this.parseFundingTrees(relation.funding); + + if(funding.funderName) { + fundedByProject['funderName'] = funding.funderName; + } + if(funding.funderShortname) { + fundedByProject['funderShortname'] = funding.funderShortname; + } + if(funding.stream) { + fundedByProject['funding'] = funding.stream; + } + } + fundedByProjects.push(fundedByProject); + return fundedByProjects; + } + + // publication & research data : for fundedByProjects | project landing : for funding + public parseFundingTrees(fundingTree: any): {"funderName": string, "funderShortname": string, "stream": string} { + let funding: {"funderName": string, "funderShortname": string, "stream": string} = {"funderName": "", "funderShortname": "", "stream": ""}; + let length = Array.isArray(fundingTree) ? fundingTree.length : 1; + + for(let i=0; i(); + + let collected; + let length = Array.isArray(_collectedFrom) ? _collectedFrom.length : 1; + for(let i=0; i, + publisher: string, journal:{"journal": string, "issn": string, "lissn": string}, + identifiers: Map, title: { "name": string, "url": string, "accessMode": string}) { + if( publisher && identifiers != null && identifiers.has('doi')) { + if( downloadFrom == null) { + downloadFrom = new Map(); + } + + let key: string; + if(journal && journal.journal) { + key = publisher + "/ "+journal['journal']; + } else { + key = publisher; + } + downloadFrom.set(key, {"url": null, "accessMode": null, "bestAccessMode": null}); + + let url = OpenaireProperties.getDoiURL()+identifiers.get("doi")[0]; + + downloadFrom.get(key)['url'] = new Array(); + downloadFrom.get(key)['accessMode'] = new Array(); + + downloadFrom.get(key)['url'][0] = url; + downloadFrom.get(key)['accessMode'][0] = ""; + + if(title != undefined && title['url'] == "") { + title['url'] = url; + } + } + return downloadFrom; + } + + // publication & dataset landing : for downloadFrom + parseDownloadFrom(downloadFrom: Map, instance: any, url: string) + { + let key: string = instance['hostedby'].name; + + if(key) { + this.addUrlAndAccessMode(downloadFrom, instance, key, url); + } + } + + // publication & dataset landing : for publishedIn + parsePublishedIn(publishedIn: Map, instance: any, result: any, url: string, counter: number): number { + if(result != null && result.hasOwnProperty("source")) { + let key: string; + if(Array.isArray(result.source)) { + if(counter==result.source.length) { + counter--; + } + key = result['source'][counter]; + } else { + key = result['source']; + } + + if(key) { + this.addUrlAndAccessMode(publishedIn, instance, key, url); + counter++; + } + } + return counter; + } + + // publication & dataset landing : for downloadFrom and publishedIn + addUrlAndAccessMode(mapStructure: Map, instance: any, key: string, url: string) { + if(!mapStructure.has(key)) { + mapStructure.set(key, {"url": null, "accessMode": null, "bestAccessMode": null}); + } + + if(mapStructure.get(key)['url'] == null) { + mapStructure.get(key)['url'] = new Array(); + } + + if(url) { + mapStructure.get(key)['url'].push(url); + } + + if(mapStructure.get(key)['accessMode'] == null) { + mapStructure.get(key)['accessMode'] = new Array(); + } + + if(instance.hasOwnProperty("licence")) { + if(url) { + mapStructure.get(key)['accessMode'].push(instance['licence'].classid); + } + + if(this.changeBestAccessMode(mapStructure.get(key)['bestAccessMode'], instance['licence'])) { + mapStructure.get(key)['bestAccessMode'] = instance['licence'].classid; + } + } else if(url) { + mapStructure.get(key)['accessMode'].push(""); + } + } + + // publication & dataset landing : for downloadFrom and publishedIn + changeBestAccessMode(currentAccessMode: string, accessMode: any): boolean { + if(!accessMode) { + return false; + } + accessMode = accessMode.classid; + + switch (currentAccessMode) { + case null: + return true; + case "CLOSED": + if( accessMode == "OPEN" || + accessMode == "EMBARGO" || + accessMode == "RESTRICTED") { + return true; + } + return false; + case "RESTRICTED": + if( accessMode == "OPEN" || + accessMode == "EMBARGO") { + return true; + } + return false; + case "EMBARGO": + if(accessMode == "OPEN") { + return true; + } + return false; + } + return false; + } + + // publication & dataset landing : for relatedResearchResults + parseRelatedResearchResults(relatedResearchResults_1: Map, relation: any, provenanceAction: string) : + Map { + + // if(relatedResearchResults == undefined) { +let relatedResearchResults = new Map(); + // } + + if(!relatedResearchResults.has(provenanceAction)) { + relatedResearchResults.set(provenanceAction, + new Array<{ "name": string, "id": string, "date": string, + "trust": number, "class": string }>()); + } + relatedResearchResults.get(provenanceAction).push(this.parseRelatedOrSimilarResearchResult(relation)); + + return relatedResearchResults; + } + + // publication & dataset landing : for similarResearchResults + parseSimilarResearchResults(similarResearchResults: { "name": string, "id": string, "date": string, + "trust": number, "class": string}[], relation: any) : + { "name": string, "id": string, "date": string, "trust": number, "class": string }[] { + if(similarResearchResults == undefined) { + similarResearchResults = new Array<{"name": string, "id": string, "date": string, + "trust": number, "class": string}>(); + } + similarResearchResults.push(this.parseRelatedOrSimilarResearchResult(relation)); + return similarResearchResults; + } + + // publication & dataset landing : for relatedResearchResults and similarResearchResults + parseRelatedOrSimilarResearchResult(relation: any): {"name": string, "id": string, "date": string, "trust": number, "class": string} { + let researchResult: {"name": string, "id": string, "date": string, "trust": number, "class": string} + = {"name": "", "id": "", "date": "", "trust": null, "class": ""} + + if(relation['resulttype'].classname == "publication") { + researchResult['class'] = "publication"; + } else if(relation['resulttype'].classname == "dataset") { + researchResult['class'] = "dataset"; + } else { + researchResult['class'] = "software"; + } + + researchResult['id'] = relation['to'].content; + let titleName = Array.isArray(relation['title']) ? relation['title'][0].content : relation['title'].content; + researchResult['name'] = titleName; + var date:string = ((Array.isArray(relation.dateofacceptance))?(relation.dateofacceptance[0]):(relation.dateofacceptance))+""; // transform to string in case it is an integer + researchResult['date'] = (date && (date).indexOf('-') !== -1)?date.split('-')[0]:date; + //researchResult['date'] = relation.dateofacceptance.substring(0,4);; + researchResult['trust'] = Math.round(relation.trust*100); + return researchResult; + } + + // publication & dataset landing : for identifiers + parseIdentifiers(pid: any): Map { + let identifiers = new Map(); + + if(pid.hasOwnProperty("classname") && pid['classname'] != "") { + if(pid.classname == "doi" || pid.classname == "pmc" || pid.classname == "handle") { + if(!identifiers.has(pid.classname)) { + identifiers.set(pid.classname, new Array()); + } + + identifiers.get(pid.classname).push(pid.content); + } + } else { + for(let i=0; i()); + } + identifiers.get(pid[i].classname).push(pid[i].content); + } + } + } + return identifiers; + } + + // publication & dataset landing : for subjects and otherSubjects and classifiedSubjects + parseAllSubjects(_subjects: any): [string[], Map, Map] { + let subjects: string[]; + let otherSubjects: Map; + let classifiedSubjects: Map; + + let subject; + let length = Array.isArray(_subjects) ? _subjects.length : 1; + + for(let i=0; i(); + } + + if(!classifiedSubjects.has(subject.classname)) { + classifiedSubjects.set(subject.classname, new Array()); + } + + classifiedSubjects.get(subject.classname).push(subject.content); + } else { + if(subject.classid == "keyword") { + if(subjects == undefined) { + subjects = new Array(); + } + + subjects.push(subject.content); + } else { + if(otherSubjects == undefined) { + otherSubjects = new Map(); + } + + if(!otherSubjects.has(subject.classname)) { + otherSubjects.set(subject.classname, new Array()); + } + otherSubjects.get(subject.classname).push(subject.content); + } + } + } + } + return [subjects, otherSubjects, classifiedSubjects]; + } + + parseContexts(_contexts: any): {"labelContext": string, "labelCategory": string, + "labelConcept": string, inline:boolean}[] { + let contexts = new Array<{"labelContext": string, "labelCategory": string, + "labelConcept": string, inline:boolean}>(); + + let position = 0; + let labels = ""; + let context; + let length = Array.isArray(_contexts) ? _contexts.length : 1; + for(let i=0; i, instance: any) { + if(instance.hasOwnProperty("instancetype") && instance['instancetype'].classname) { + if(!uniqueTypes.has(instance['instancetype'].classname)) { + types.push(instance['instancetype'].classname); + uniqueTypes.add(instance['instancetype'].classname); + } + } + } +} diff --git a/portal-4cli/src/app/landingPages/landing-utils/publishedIn.component.ts b/portal-4cli/src/app/landingPages/landing-utils/publishedIn.component.ts new file mode 100644 index 00000000..7a4f47be --- /dev/null +++ b/portal-4cli/src/app/landingPages/landing-utils/publishedIn.component.ts @@ -0,0 +1,71 @@ +import {Component, Input, ElementRef} from '@angular/core'; +import {OpenaireProperties} from '../../utils/properties/openaireProperties'; + +@Component({ + selector: 'publishedIn', + template: ` +
+
Published in
+
+
+ + + {{key}} + + + [{{i+1}}] + + + + + {{key}} + + + {{key}} + + +
+
+
+ + View less + +
+
...
+
+ + View more + +
+
+ ` + }) + +export class PublishedInComponent { + //key is name + @Input() publishedIn: Map; + + public showAll: boolean = false; + + constructor (private element: ElementRef) {} + + ngOnInit() {} + + public scroll() { + console.info("scroll into view"); + if (typeof document !== 'undefined') { + this.element.nativeElement.scrollIntoView(); + } + } + public getKeys( map) { + return Array.from(map.keys()); + } +} diff --git a/portal-4cli/src/app/landingPages/landing-utils/resultLanding.module.ts b/portal-4cli/src/app/landingPages/landing-utils/resultLanding.module.ts new file mode 100644 index 00000000..e0607303 --- /dev/null +++ b/portal-4cli/src/app/landingPages/landing-utils/resultLanding.module.ts @@ -0,0 +1,27 @@ +/* This module contains all common components for Publication & Daasets Landing Pages */ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { RouterModule } from '@angular/router'; +import {PagingModule} from '../../utils/paging.module'; + +import {ShowAuthorsComponent} from './showAuthors.component'; +import {ShowIdentifiersComponent} from './showIdentifiers.component'; +import {ShowSubjectsComponent} from './showSubjects.component'; +import {TabTableComponent} from './tabTable.component'; +import {FundedByComponent} from './fundedBy.component'; +import {PublishedInComponent} from './publishedIn.component'; +@NgModule({ + imports: [ + CommonModule, FormsModule, RouterModule, PagingModule + ], + declarations: [ + ShowAuthorsComponent,ShowIdentifiersComponent,ShowSubjectsComponent, TabTableComponent, FundedByComponent, PublishedInComponent + ], + providers:[ + ], + exports: [ + ShowAuthorsComponent,ShowIdentifiersComponent,ShowSubjectsComponent, TabTableComponent, FundedByComponent, PublishedInComponent + ] +}) +export class ResultLandingModule { } diff --git a/portal-4cli/src/app/landingPages/landing-utils/searchingProjectsInTab.component.ts b/portal-4cli/src/app/landingPages/landing-utils/searchingProjectsInTab.component.ts new file mode 100644 index 00000000..c96d23ba --- /dev/null +++ b/portal-4cli/src/app/landingPages/landing-utils/searchingProjectsInTab.component.ts @@ -0,0 +1,122 @@ +import {Component, Input} from '@angular/core'; +import {ActivatedRoute} from '@angular/router'; + +import { FetchProjects } from '../../utils/fetchEntitiesClasses/fetchProjects.class'; +import { SearchProjectsService } from '../../services/searchProjects.service'; + +import {OpenaireProperties, ErrorCodes} from '../../utils/properties/openaireProperties'; +import {StringUtils} from '../../utils/string-utils.class'; +import {RouterHelper} from '../../utils/routerHelper.class'; + +@Component({ + selector: 'searchingProjectsTab', + template: ` + + + + +
+ +
+
+
+ +
+
+
    +
  • + + + + {{value.name}} ({{value.number}}) + +
  • + +
  • Filtered {{fetchProjects.searchUtils.totalResults}} results of {{fetchProjects.searchUtils.totalResultsNoFilters}} total results
  • +
  • +
+ + + +
+
+ ` +}) + +export class SearchingProjectsTabComponent { + @Input() fetchProjects : FetchProjects; + @Input() organizationId:string = ""; + public page :number = 1; + public size :number = 10; + public linkToSearchProjects: string; + + public routerHelper:RouterHelper = new RouterHelper(); + public errorCodes:ErrorCodes = new ErrorCodes(); + + private filterQuery:string = ""; + + constructor (private route: ActivatedRoute, + private _searchProjectsService: SearchProjectsService) { + } + + + ngOnInit() { + + if(this.organizationId) { + this.linkToSearchProjects = OpenaireProperties.getLinkToAdvancedSearchProjects();//+"?organization="+this.organizationId+"or=and";; + if(this.fetchProjects.searchUtils.totalResults > 0) { + this.search(false,""); + } + } + } + + + private search(refine:boolean, filterQuery:string){ + var refineFields:string [] = ["funder"]; + this.fetchProjects.getResultsForOrganizations(this.organizationId, filterQuery, this.page, this.size,(refine)?refineFields:[]); + } + + public pageChange($event) { + this.page=$event.value; + this.search(false, this.filterQuery); + } + + public filterChange($event) { + console.log("Filter Changed"); + this.updateFilters(); + //this.search(true, this.filterQuery); + this.search(false, this.filterQuery); + } + + private updateFilters (){ + this.filterQuery = ""; + for (let filter of this.fetchProjects.filters){ + var filterLimits=""; + for (let value of filter.values){ + if(value.selected == true){ + //filterLimits+=((filterLimits.length == 0)?'':',') +'"'+ StringUtils.URIEncode(value.id)+'"'; + filterLimits+=((filterLimits.length == 0)?'':' or ')+filter.filterId+' exact '; + filterLimits+='"'+ StringUtils.URIEncode(value.id)+'"'; + } + } + if(filterLimits.length > 0){ + //this.filterQuery+=' and '+filter.filterId + ' exact '+ filterLimits + ' '; + this.filterQuery+=' and ( ' + filterLimits + ' ) '; + } + + } + console.log("Filter Changed"+this.filterQuery); + + } +} diff --git a/portal-4cli/src/app/landingPages/landing-utils/searchingProjectsInTab.module.ts b/portal-4cli/src/app/landingPages/landing-utils/searchingProjectsInTab.module.ts new file mode 100644 index 00000000..e3d7a061 --- /dev/null +++ b/portal-4cli/src/app/landingPages/landing-utils/searchingProjectsInTab.module.ts @@ -0,0 +1,31 @@ +/* This module contains all common components for all landing pages */ + +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { RouterModule } from '@angular/router'; + +import { ProjectsServiceModule} from '../../services/projectsService.module'; +import { TabResultModule } from '../../searchPages/searchUtils/tabResult.module'; +import { SearchingProjectsTabComponent} from './searchingProjectsInTab.component'; + +import {PagingModule } from '../../utils/paging.module'; +import {ErrorMessagesModule} from '../../utils/errorMessages.module'; + +@NgModule({ + imports: [ + RouterModule, CommonModule, FormsModule, + ProjectsServiceModule, TabResultModule, + PagingModule, ErrorMessagesModule + ], + declarations: [ + SearchingProjectsTabComponent + ], + providers:[ + ], + exports: [ + + SearchingProjectsTabComponent + ] +}) +export class SearchingProjectsTabModule { } diff --git a/portal-4cli/src/app/landingPages/landing-utils/showAuthors.component.ts b/portal-4cli/src/app/landingPages/landing-utils/showAuthors.component.ts new file mode 100644 index 00000000..d4dcc85e --- /dev/null +++ b/portal-4cli/src/app/landingPages/landing-utils/showAuthors.component.ts @@ -0,0 +1,65 @@ +import {Component, Input, ElementRef} from '@angular/core'; +import {RouterHelper} from '../../utils/routerHelper.class'; + +@Component({ + selector: 'showAuthors', + template: ` + + + + + {{author}} + ; + + ... + + + + {{author}} + ; + + + + + view all {{authors.length}} authors + + + + View less authors + + + + ` + + }) + +export class ShowAuthorsComponent { + @Input() authors: { [key: string]: string }[]; + @Input() searchPage:string ="publications" + + public showAll: boolean = false; + public routerHelper:RouterHelper = new RouterHelper(); + + constructor (private element: ElementRef) { + } + + ngOnInit() { + } + + public quote(params: string):string { + return '"'+params+'"'; + } + + public scroll() { + console.info("scroll into view"); + if (typeof document !== 'undefined') { + this.element.nativeElement.scrollIntoView(); + } + } +} diff --git a/portal-4cli/src/app/landingPages/landing-utils/showIdentifiers.component.ts b/portal-4cli/src/app/landingPages/landing-utils/showIdentifiers.component.ts new file mode 100644 index 00000000..687b5204 --- /dev/null +++ b/portal-4cli/src/app/landingPages/landing-utils/showIdentifiers.component.ts @@ -0,0 +1,94 @@ +import {Component, Input, ElementRef} from '@angular/core'; +import {OpenaireProperties} from '../../utils/properties/openaireProperties'; + +@Component({ + selector: 'showIdentifiers', + template: ` + + + View less identifiers + + + + + + + {{key}}: {{item}}{{key}}: {{item}}{{key}}: {{item}}{{", "}} + ... + + + + + + + view all {{countIdentifiers()}} identifiers + + + + View less identifiers + + + + ` + }) + +export class ShowIdentifiersComponent { + @Input() identifiers: Map; + public doiURL: string; + public pmcURL: string; + public handleURL: string; + public showAll: boolean = false; + public sizeOfIdentifiers: number = -1; + public sizeOfPreviousIdentifiers: number = -1; + public pageSize: number = 10; + + constructor (private element: ElementRef) { + this.doiURL = OpenaireProperties.getDoiURL(); + this.pmcURL = OpenaireProperties.getPmcURL(); + this.handleURL = OpenaireProperties.getHandleURL(); + } + + ngOnInit() {} + + public countIdentifiers(): number { + if(this.sizeOfIdentifiers < 0) { + let num: number = 0; + if(this.identifiers != undefined) { + this.identifiers.forEach(function (value, key, map) { + num += value.length; + }); + } + this.sizeOfIdentifiers = num; + } + return this.sizeOfIdentifiers; + } + + public countSizeOfPreviousIdentifiers(index: number): number { + let num: number = 0; + let i: number = 0; + if(this.identifiers != undefined) { + this.identifiers.forEach(function (value, key, map) { + if(i < index) { + num += value.length; + } + i++; + }); + } + this.sizeOfPreviousIdentifiers= num; + return num; + } + + public scroll() { + console.info("scroll into view"); + if (typeof document !== 'undefined') { + this.element.nativeElement.scrollIntoView(); + } + } + public getKeys( map) { + return Array.from(map.keys()); + } +} diff --git a/portal-4cli/src/app/landingPages/landing-utils/showSubjects.component.ts b/portal-4cli/src/app/landingPages/landing-utils/showSubjects.component.ts new file mode 100644 index 00000000..e3f4faa5 --- /dev/null +++ b/portal-4cli/src/app/landingPages/landing-utils/showSubjects.component.ts @@ -0,0 +1,57 @@ +import {Component, Input} from '@angular/core'; + +@Component({ + selector: 'showSubjects', + template: ` +
+ +
+ Subject: + + {{subjects.join(" | ")}} +
    +
  • +
    + {{key}}: {{otherSubjects.get(key).join(" | ")}} +
    +
  • + +
+
+ +
+
+
+ Classified by OpenAIRE into +
+ {{key}}: {{classifiedSubjects.get(key).join(" | ")}} +
+
+
+
+
+ ` + + }) + +export class ShowSubjectsComponent { + @Input() subjects: string[]; + @Input() otherSubjects: Map; + @Input() classifiedSubjects: Map; + // private showClassifiedSbj: boolean = false; + + constructor () { + } + + ngOnInit() { + } + public getKeys( map) { + return Array.from(map.keys()); + } +} diff --git a/portal-4cli/src/app/landingPages/landing-utils/showTitle.component.ts b/portal-4cli/src/app/landingPages/landing-utils/showTitle.component.ts new file mode 100644 index 00000000..a458aae9 --- /dev/null +++ b/portal-4cli/src/app/landingPages/landing-utils/showTitle.component.ts @@ -0,0 +1,66 @@ +import {Component, Input} from '@angular/core'; +import {ActivatedRoute} from '@angular/router'; + +@Component({ + selector: 'showTitle', + template: ` +

+ + + + + + + [no title available] + + + + + + + [no title available] + +

+ + ` + + }) + +export class ShowTitleComponent { + @Input() title: { [key: string]: string }; + @Input() iconClass:string; + + sub: any; + + constructor (private route: ActivatedRoute) {} + + ngOnInit() { + this.sub = this.route.queryParams.subscribe( + params => { + console.info("onInit showTitle"); + + if(this.title['accessMode'] == undefined) { + this.title['accessMode'] = ""; + } + } + ); + } + + ngOnDestroy() { + console.info("onDestroy showTitle"); + this.sub.unsubscribe(); + } +} diff --git a/portal-4cli/src/app/landingPages/landing-utils/tabPaging.component.ts b/portal-4cli/src/app/landingPages/landing-utils/tabPaging.component.ts new file mode 100644 index 00000000..f0671764 --- /dev/null +++ b/portal-4cli/src/app/landingPages/landing-utils/tabPaging.component.ts @@ -0,0 +1,24 @@ +import {Component, Input, Output, EventEmitter} from '@angular/core'; + +@Component({ + selector: 'tabPaging', + template: ` + + ` + }) + +export class TabPagingComponent { + @Input() showAll: boolean; + @Input() length: number; + @Output() changeShowAll: EventEmitter = new EventEmitter(); + + constructor () { + } + + ngOnInit() { + } +} diff --git a/portal-4cli/src/app/landingPages/landing-utils/tabTable.component.ts b/portal-4cli/src/app/landingPages/landing-utils/tabTable.component.ts new file mode 100644 index 00000000..83e51e77 --- /dev/null +++ b/portal-4cli/src/app/landingPages/landing-utils/tabTable.component.ts @@ -0,0 +1,99 @@ +import {Component, Input} from '@angular/core'; +import {RouterHelper} from '../../utils/routerHelper.class'; +import {OpenaireProperties} from '../../utils/properties/openaireProperties'; +//import {PagingModule} from '../utils/paging.module'; + +@Component({ + selector: 'tabTable', + template: ` +
+ {{info.length}} research results, page {{page}} of {{totalPages(info.length)}} + +
+ + + + + + + + + +
+ + (Publication) + (Dataset) + (Software) + + + + + {{item['name']}} + + + + {{item['name']}} + + + + + + {{item['name']}} + + +

{{item['name']}}

+ + ({{item['date']}}) + +
+
+
{{item['trust']}}%
+ +
+
+

No trust available

+
+
+ ` + + }) + +export class TabTableComponent { + @Input() info: { "name": string, "url": string, "date": string, "trust": number}[];//Map; + + public routerHelper:RouterHelper = new RouterHelper(); + public searchLinkToPublication: string; + public searchLinkToDataset: string; + + public page: number = 1; + public pageSize: number = 10; + + constructor () { + } + + ngOnInit() { + this.searchLinkToPublication = OpenaireProperties.getsearchLinkToPublication(); + this.searchLinkToDataset = OpenaireProperties.getsearchLinkToDataset(); + } + + totalPages(totalResults: number): number { + let totalPages:any = totalResults/this.pageSize; + if(!(Number.isInteger(totalPages))) { + totalPages = (parseInt(totalPages, this.pageSize) + 1); + } + return totalPages; + } + + updatePage($event) { + this.page = $event.value; + } +} diff --git a/portal-4cli/src/app/landingPages/organization/organization-routing.module.ts b/portal-4cli/src/app/landingPages/organization/organization-routing.module.ts new file mode 100644 index 00000000..0111f624 --- /dev/null +++ b/portal-4cli/src/app/landingPages/organization/organization-routing.module.ts @@ -0,0 +1,18 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import { OrganizationComponent } from './organization.component'; +import {FreeGuard} from'../../login/freeGuard.guard'; +import {PreviousRouteRecorder} from'../../utils/piwik/previousRouteRecorder.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + RouterModule.forChild([ + { path: '', component: OrganizationComponent, canActivate: [FreeGuard, IsRouteEnabled], data: { + redirect: '/error' + },canDeactivate: [PreviousRouteRecorder] } + ]) +] +}) +export class OrganizationRoutingModule { } diff --git a/portal-4cli/src/app/landingPages/organization/organization.component.html b/portal-4cli/src/app/landingPages/organization/organization.component.html new file mode 100644 index 00000000..a4b748e3 --- /dev/null +++ b/portal-4cli/src/app/landingPages/organization/organization.component.html @@ -0,0 +1,195 @@ + diff --git a/portal-4cli/src/app/landingPages/organization/organization.component.ts b/portal-4cli/src/app/landingPages/organization/organization.component.ts new file mode 100644 index 00000000..1e02b02d --- /dev/null +++ b/portal-4cli/src/app/landingPages/organization/organization.component.ts @@ -0,0 +1,489 @@ +import {Component, ViewChild, ElementRef} from '@angular/core'; +import {Observable} from 'rxjs/Observable'; +import {Subject} from 'rxjs/Subject'; +import {ActivatedRoute, Router} from '@angular/router'; + +import {OrganizationService} from '../../services/organization.service'; +import {OrganizationInfo} from '../../utils/entities/organizationInfo'; +import {ReportsService} from '../../services/reports.service'; +import {FetchPublications} from '../../utils/fetchEntitiesClasses/fetchPublications.class'; +import {FetchProjects} from '../../utils/fetchEntitiesClasses/fetchProjects.class'; +import {FetchDataproviders} from '../../utils/fetchEntitiesClasses/fetchDataproviders.class'; +import {SearchPublicationsService} from '../../services/searchPublications.service'; +import {SearchDataprovidersService} from '../../services/searchDataproviders.service'; +import {SearchProjectsService} from '../../services/searchProjects.service'; +import { Meta} from '../../../angular2-meta'; +import {OpenaireProperties, ErrorCodes} from '../../utils/properties/openaireProperties'; +import {SearchingProjectsTabComponent} from '../landing-utils/searchingProjectsInTab.component'; +import {RouterHelper} from '../../utils/routerHelper.class'; + +import {ModalLoading} from '../../utils/modal/loading.component'; +import {AlertModal} from '../../utils/modal/alert'; +import {PiwikService} from '../../utils/piwik/piwik.service'; +import {StringUtils} from '../../utils/string-utils.class'; + +@Component({ + selector: 'organization', + templateUrl: 'organization.component.html', +}) + +export class OrganizationComponent { + public organizationInfo: OrganizationInfo; + public organizationId: string; + + // Message variables + public warningMessage = ""; + public errorMessage = ""; + public showLoading: boolean = true; + + // CSV variables + public downloadURLAPI: string; + public csvProjectParamsHead: string; + public csvPublicationParamsHead: string; + public csvParamsTail: string; + + // Active tab variable for responsiveness + public activeTab: string = "Publications"; + + // Variables for publications, projects, dataproviders tabs + public fetchPublications: FetchPublications; + public linkToSearchPublications: string = ""; + public fetchProjects: FetchProjects; + public fetchDataproviders : FetchDataproviders; + public linkToSearchDataproviders:string = ""; + //public projectFunders:string[] = []; + + // Variables for projects query (query results only if projects tab is clicked) + public projectsClicked: boolean = false; + @ViewChild (SearchingProjectsTabComponent) searchingProjectsTabComponent : SearchingProjectsTabComponent ; + + @ViewChild (ModalLoading) loading : ModalLoading ; + // Alert box when CSV: Project Publications for a funder is requested + @ViewChild('AlertModalApplyAll') alertApplyAll; + // Alert box when something is wrong with CSV requests + @ViewChild('AlertModalCsvError') alertCsvError; + + public routerHelper:RouterHelper = new RouterHelper(); + public errorCodes:ErrorCodes = new ErrorCodes(); + + //private projectsNum: number = 0; + //private fundersSet: Set; + //private emptyFundersSet: boolean = true; + + // Request results for content providers only the one time (first time tab is clicked) + private reloadDataproviders: boolean = true; + + // Helper variables to specify funder in downloadPublicationsFile function + private funder: string; + private funderId: string; + private funderCountPublications: number; + sub: any; + infoSub: any; + piwiksub: any; + downloadFileSub: any; + downloadFilePiwikSub: any; + countProjectsSub: any; + countPublSub: any; + downloadProjectPublSub: any; + + //private ngUnsubscribe: Subject = new Subject(); + + constructor (private element: ElementRef, + private _organizationService: OrganizationService, + private _piwikService:PiwikService, + private route: ActivatedRoute, + private _searchDataprovidersService: SearchDataprovidersService, + private _reportsService: ReportsService, + private _searchPublicationsService: SearchPublicationsService, + private _searchProjectsService: SearchProjectsService, private _meta: Meta, + private _router: Router) { + + this.fetchPublications = new FetchPublications(this._searchPublicationsService); + this.fetchProjects = new FetchProjects(this._searchProjectsService); + this.fetchDataproviders = new FetchDataproviders(this._searchDataprovidersService); + this.updateUrl(OpenaireProperties.getBaseLink()+this._router.url); + } + + ngOnInit() { + console.info('organization init'); + this.sub = this.route.queryParams.subscribe(params => { + this.organizationInfo=null; + this.updateTitle("Organization"); + this.updateDescription("Organization, country, projects, search, repositories, open access"); + this.projectsClicked = false; + + this.organizationId = params['organizationId']; + console.info("Id is :"+this.organizationId); + + if(this.organizationId){ + this.getOrganizationInfo(); + }else{ + this.showLoading = false; + this.warningMessage="No valid organization id"; + } + + if (typeof document !== 'undefined') { + this.element.nativeElement.scrollIntoView(); + } + + this.csvParamsTail = '" and relorganizationid exact "'+this.organizationId+'" ))'; + + }); + + this.downloadURLAPI = OpenaireProperties.getCsvAPIURL(); + this.csvProjectParamsHead = 'format=csv&type=projects&page=0&query=( (oaftype exact project)and (funder exact "'; + //this.csvPublicationParamsHead = 'format=csv-special&type=publications&page=0&query=((((oaftype exact result) and (resulttypeid exact publication)) and (funderid exact '; + } + + + ngOnDestroy() { + this.sub.unsubscribe(); + if(this.piwiksub){ + this.piwiksub.unsubscribe(); + } + if(this.infoSub) { + this.infoSub.unsubscribe(); + } + if(this.downloadFileSub) { + this.downloadFileSub.unsubscribe(); + } + if(this.downloadFilePiwikSub) { + this.downloadFilePiwikSub.unsubscribe(); + } + if(this.countProjectsSub) { + this.countProjectsSub.unsubscribe(); + } + if(this.countPublSub) { + this.countPublSub.unsubscribe(); + } + if(this.downloadProjectPublSub) { + this.downloadProjectPublSub.unsubscribe(); + } + + /* + this.ngUnsubscribe.next(); + this.ngUnsubscribe.complete(); + */ + } + + private getOrganizationInfo () { + + this.warningMessage = ''; + this.errorMessage="" + this.showLoading = true; + + this.infoSub = this._organizationService.getOrganizationInfo(this.organizationId).subscribe( + data => { + if(data == null) { + this.showLoading = false; + this.errorMessage = 'No organization found'; + } else { + this.organizationInfo = data; + this.updateTitle(this.organizationInfo.title.name); + this.updateDescription("Organization, country, projects, search, repositories, open access"+this.organizationInfo.title.name); + if(OpenaireProperties.isPiwikTrackEnabled() && (typeof document !== 'undefined')){ + this.piwiksub = this._piwikService.trackView(this.organizationInfo.title.name).subscribe(); + } + var refineFields:string [] = ["funder"]; + + this.searchPublications(); + + this.fetchProjects.getResultsForOrganizations(this.organizationId, "", 1, 0,refineFields); + + this.fetchDataproviders.getNumForEntity("organization", this.organizationId); + + this.showLoading = false; + + /*let projectsNum = 0; + + if(this.organizationInfo.projects != undefined) { + this.fundersSet = new Set(); + this.organizationInfo.projects.forEach(function (value, key, map) { + projectsNum += value.length; + this.fundersSet.add(key); + }.bind(this)); + } + + this.projectsNum = projectsNum;*/ + } + }, + err => { + console.log(err) + + this.errorMessage = 'No organization found'; + this.showLoading = false; + } + ); + } +/* + private getMetrics() { + console.info("getOrganizationMetrics: component"); + this._organizationService.getMetrics(this.organizationId).subscribe( + data => { + this.metrics = data; + }, + err => { + console.log(err); + } + ); + } +*/ +/* + private handleClick(funder: string) { + if(this.emptyFundersSet) { + this.fundersSet.clear(); + this.emptyFundersSet = false; + } + + if(this.fundersSet.has(funder)) { + this.fundersSet.delete(funder); + + if(this.fundersSet.size == 0) { + this.organizationInfo.projects.forEach(function (value, key, map) { + this.fundersSet.add(key); + }.bind(this)); + this.emptyFundersSet = true; + } + console.info(funder+" funder deleted"); + } else { + this.fundersSet.add(funder); + console.info(funder+" funder added"); + } + } +*/ + //private getProjectsData(key: string): any { + //return this.projectsData; + //} + + private searchPublications() { + this.fetchPublications.getResultsForEntity("organization", this.organizationId, 1, 10); + this.linkToSearchPublications = OpenaireProperties.getLinkToAdvancedSearchPublications();// + "?project=" + this.projectId+"&pr=and"; + if(this.fetchPublications.searchUtils.totalResults > 0) { + //this.activeTab = "Publications"; + } else { + //this.projectsClicked = true; + } + } + + private searchDataproviders() { + this.fetchDataproviders.getResultsForEntity("organization", this.organizationId, 1, 10); + this.linkToSearchDataproviders = OpenaireProperties.getLinkToAdvancedSearchDataProviders(); + + if(this.fetchDataproviders.searchUtils.totalResults > 0) { + this.reloadDataproviders = false; + //this.activeTab = "Content Providers"; + } else { + + } + } + + public searchDataprovidersInit() { + if(this.reloadDataproviders && this.fetchDataproviders.searchUtils.totalResults > 0) { + this.searchDataproviders(); + } + } + + public downloadFile(url:string){ + console.log("Downloading file: "+ url); + + this.openLoading(); + this.setMessageLoading("Downloading CSV file"); + + this.downloadFileSub = this._reportsService.downloadCSVFile(url).subscribe( + data => { + this.closeLoading(); + window.open(window.URL.createObjectURL(data)); + if(OpenaireProperties.isPiwikTrackEnabled() && (typeof document !== 'undefined')){ + this.downloadFilePiwikSub = this._piwikService.trackDownload(url).subscribe(); + } + }, + err => { + console.log("Error downloading the file."); + this.closeLoading(); + this.confirmOpenCsvError(); + }, + () => console.log('Completed file download.')); + } + + private downloadPublicationsFile(funder: string, funderId:string, count:number){ + console.log("Downloading publications file"); + + this.openLoading(); + this.setMessageLoading("Downloading CSV file"); + + let response: string[] = []; + let totalResponse: string = ""; + let projects = []; + let counter: number = count; + let title: boolean = false; + + this.countProjectsSub = this._searchProjectsService.getProjectsForOrganizations(this.organizationId,' and (funder exact "'+ funderId + '" ) ',1,count,[]).subscribe( + data => + { + projects = data[1]; + for(let index=0; index < projects.length; index++) { + this.countPublSub = this._searchPublicationsService.numOfEntityPublications(projects[index].id, "project").subscribe( + data => + { + // let index: number = this.organizationInfo.projects.get(funder).indexOf(project); + + let url: string; + if(index == 0 || !title) { + url = this.downloadURLAPI+"projects/"+projects[index].id+"/publications?format=csv-special&size="+data; + } else { + url = this.downloadURLAPI+"projects/"+projects[index].id+"/publications?format=csv-special-notitle&size="+data; + } + + if(data == 0) { // if no publications for this project + counter--; + response[index] = ""; + if(counter == 0) { + for(let i=0; i + { + counter--; + response[index] = data; + + if(counter == 0) { + for(let i=0; i { + console.log("Error downloading the file."); + this.closeLoading(); + this.confirmOpenCsvError(); + }, + () => console.log('Completed file download.') + ); + } + }, + err => console.log("Error getting number of publications for project.")); + }//); + + }, + err => { + console.log("Error getting projects project."); + this.closeLoading(); + this.confirmOpenCsvError(); + } + ); + + // let counter: number = this.organizationInfo.projects.get(funder).length; + // + // for(let project of this.organizationInfo.projects.get(funder)) { + // this._searchPublicationsService.numOfEntityPublications(project.id, "projects/").subscribe( + // data => + // { + // let index: number = this.organizationInfo.projects.get(funder).indexOf(project); + // + // let url: string; + // if(index == 0) { + // url = this.downloadURLAPI+"projects/"+project.id+"/publications?format=csv-special&size="+data; + // } else { + // url = this.downloadURLAPI+"projects/"+project.id+"/publications?format=csv-special-notitle&size="+data; + // } + // + // this._reportsService.getCSVResponse(url).subscribe( + // data => + // { + // counter--; + // + // response[index] = data; + // + // if(counter == 0) { + // for(let i=0; i console.log("Error downloading the file."), + // () => console.log('Completed file download.')); + // }, + // error => console.log("Error getting number of publications for project.")); + // }//); + } + + private updateDescription(description:string){ + this._meta.updateMeta("description", description); + this._meta.updateProperty("og:description", description); + } + private updateTitle(title:string){ + var _prefix ="OpenAIRE | "; + var _title = _prefix + ((title.length> 50 ) ?title.substring(0,50):title); + this._meta.setTitle(_title ); + this._meta.updateProperty("og:title",_title); + } + private updateUrl(url:string){ + this._meta.updateProperty("og:url", url); + } + + private openLoading(){ + if(this.loading){ + this.loading.open(); + } + } + private closeLoading(){ + if(this.loading){ + this.loading.close(); + } + } + private setMessageLoading(message: string){ + if(this.loading){ + this.loading.message = message; + } + } + + public confirmOpenApplyAll(funder: string, funderId:string, funderCountPublications:number){ + this.alertApplyAll.cancelButton = true; + this.alertApplyAll.okButton = true; + this.alertApplyAll.alertTitle = "CSV FILE"; + this.alertApplyAll.message = "Do you wish to download a CSV file? Note that this process may take a while."; + this.alertApplyAll.okButtonText = "Yes"; + this.alertApplyAll.cancelButtonText = "No"; + this.alertApplyAll.open(); + + this.funder = funder; + this.funderId = funderId; + this.funderCountPublications = funderCountPublications; + } + public confirmCloseApplyAll(data){ + this.downloadPublicationsFile(this.funder, this.funderId, this.funderCountPublications); + } + + public confirmOpenCsvError(){ + this.alertCsvError.cancelButton = false; + this.alertCsvError.okButton = true; + this.alertCsvError.alertTitle = "ERROR DOWNLOADING CSV FILE"; + this.alertCsvError.message = "There was an error in csv downloading. Please try again later."; + this.alertCsvError.okButtonText = "OK"; + this.alertCsvError.open(); + } + + encodeURI(input: string): string { + return StringUtils.URIEncode(input); + } +} diff --git a/portal-4cli/src/app/landingPages/organization/organization.module.ts b/portal-4cli/src/app/landingPages/organization/organization.module.ts new file mode 100644 index 00000000..3e8e6f1d --- /dev/null +++ b/portal-4cli/src/app/landingPages/organization/organization.module.ts @@ -0,0 +1,52 @@ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { RouterModule } from '@angular/router'; + +import {LoadingModalModule} from '../../utils/modal/loadingModal.module'; +import {AlertModalModule} from '../../utils/modal/alertModal.module'; +import {ErrorMessagesModule} from '../../utils/errorMessages.module'; + +import { OrganizationServiceModule} from '../../services/organizationService.module'; +// import { ProjectsServiceModule} from '../../services/projectsService.module'; +import { OrganizationComponent } from './organization.component'; +import { OrganizationRoutingModule } from './organization-routing.module'; + +import { LandingModule } from '../landing-utils/landing.module'; +import {TabResultModule } from '../../searchPages/searchUtils/tabResult.module'; +import {DataProvidersServiceModule} from '../../services/dataProvidersService.module'; +import {ReportsServiceModule} from '../../services/reportsService.module'; +import {PublicationsServiceModule} from '../../services/publicationsService.module'; +import {ProjectsServiceModule} from '../../services/projectsService.module'; + +import { SearchingProjectsTabModule} from '../landing-utils/searchingProjectsInTab.module'; +import {FreeGuard} from'../../login/freeGuard.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + CommonModule, FormsModule, RouterModule, + LoadingModalModule, AlertModalModule, ErrorMessagesModule, + LandingModule, + OrganizationRoutingModule, + TabResultModule, + DataProvidersServiceModule, + ReportsServiceModule, + OrganizationServiceModule, + SearchingProjectsTabModule, + OrganizationServiceModule, + PublicationsServiceModule, + ProjectsServiceModule + + ], + declarations: [ + OrganizationComponent, + ], + providers:[ + FreeGuard, IsRouteEnabled + ], + exports: [ + OrganizationComponent + ] +}) +export class OrganizationModule { } diff --git a/portal-4cli/src/app/landingPages/project/project-routing.module.ts b/portal-4cli/src/app/landingPages/project/project-routing.module.ts new file mode 100644 index 00000000..4fa87efe --- /dev/null +++ b/portal-4cli/src/app/landingPages/project/project-routing.module.ts @@ -0,0 +1,18 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import { ProjectComponent } from './project.component'; +import {FreeGuard} from'../../login/freeGuard.guard'; +import {PreviousRouteRecorder} from'../../utils/piwik/previousRouteRecorder.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + RouterModule.forChild([ + { path: '', component: ProjectComponent, canActivate: [FreeGuard, IsRouteEnabled], data: { + redirect: '/error' + },canDeactivate: [PreviousRouteRecorder] } + ]) + ] +}) +export class ProjectRoutingModule { } diff --git a/portal-4cli/src/app/landingPages/project/project.component.html b/portal-4cli/src/app/landingPages/project/project.component.html new file mode 100644 index 00000000..33e79633 --- /dev/null +++ b/portal-4cli/src/app/landingPages/project/project.component.html @@ -0,0 +1,382 @@ +
+
+
+ +
+ + + + +
+
+ +

+ + {{projectName}} + {{projectName}} + ({{projectInfo.contractNum}}) +

+
{{projectInfo.title}} ({{projectInfo.contractNum}})
+ + Project + {{projectInfo.funder}} + Open Access mandate + Special Clause 39 + + +
+ +
+ + +
+
+ + + + + + + + +
+ + + + + +
+ + + + +
+ +
+

Research Results

+ +

Access Mode of Research Results

+ +

By Datasource of Research Results

+ +
+
+
+
+ + + + + + + + + +
+ +
+
+ +
+
+ Share - Bookmark +
+
+
+ Application Box +
+ + +
+ + +
+
+ + +
+
+
+
diff --git a/portal-4cli/src/app/landingPages/project/project.component.ts b/portal-4cli/src/app/landingPages/project/project.component.ts new file mode 100644 index 00000000..39597b62 --- /dev/null +++ b/portal-4cli/src/app/landingPages/project/project.component.ts @@ -0,0 +1,360 @@ +import {Component, ViewChild, ElementRef} from '@angular/core'; +import {Observable} from 'rxjs/Observable'; +import {ActivatedRoute, Params, Router} from '@angular/router'; +import {ProjectService} from './project.service'; +import {ProjectInfo} from '../../utils/entities/projectInfo'; +import {RouterHelper} from '../../utils/routerHelper.class'; + +import { FetchPublications } from '../../utils/fetchEntitiesClasses/fetchPublications.class'; +import { SearchPublicationsService } from '../../services/searchPublications.service'; +import { FetchDatasets } from '../../utils/fetchEntitiesClasses/fetchDatasets.class'; +import { SearchDatasetsService } from '../../services/searchDatasets.service'; +import { FetchSoftware } from '../../utils/fetchEntitiesClasses/fetchSoftware.class'; +import { SearchSoftwareService } from '../../services/searchSoftware.service'; + +import {ModalLoading} from '../../utils/modal/loading.component'; + +import {ReportsService} from '../../services/reports.service'; +import {OpenaireProperties, ErrorCodes} from '../../utils/properties/openaireProperties'; +import { Meta} from '../../../angular2-meta'; + +import {PiwikService} from '../../utils/piwik/piwik.service'; + +@Component({ + selector: 'project', + templateUrl: 'project.component.html', + }) +export class ProjectComponent{ + public projectInfo: ProjectInfo; + public projectId : string ; + public projectName: string; + + // Metrics tab variables + public metricsClicked: boolean; + public viewsFrameUrl: string; + public downloadsFrameUrl: string; + private totalViews: number; + private totalDownloads: number; + private pageViews: number; + + // Statistics tab variables + public statsClicked: boolean; + public chartScientificResultsUrl: string; + public chartAccessModeUrl: string; + public chartDatasourcesUrl: string; + + // HTML variables in APP BOX + public publications_dynamic: string; + public datasets_dynamic: string; + + public project ; + + // CSV variables + public downloadURLAPI: string; + public csvParams: string; + public csvParamsDatasets: string; + + // Message variables + public warningMessage = ""; + public errorMessage = ""; + public showLoading: boolean = true; + + // Active tab variable for responsiveness + public activeTab: string = "Publications"; + + // Request results for research data and software only the one time (first time tab is clicked) + private reloadDatasets: boolean = true; + private reloadSoftware: boolean = true; + + // Variables for publications, research data, software tabs + public fetchPublications : FetchPublications; + public linkToSearchPublications = ""; + public fetchDatasets : FetchDatasets; + public linkToSearchDatasets = ""; + public fetchSoftware: FetchSoftware; + public linkToSearchSoftware = ""; + + public routerHelper:RouterHelper = new RouterHelper(); + public errorCodes:ErrorCodes = new ErrorCodes(); + + @ViewChild (ModalLoading) loading : ModalLoading ; + // Alert box when something is wrong with CSV requests + @ViewChild('AlertModalCsvError') alertCsvError; + + sub: any; piwiksub: any; infoSub: any; downloadFilePiwikSub: any; + + constructor ( private element: ElementRef, + private _projectService: ProjectService, + private _piwikService:PiwikService, + private route: ActivatedRoute, + private _searchPublicationsService: SearchPublicationsService, + private _searchDatasetsService: SearchDatasetsService, + private _searchSoftwareService: SearchSoftwareService, + private _reportsService: ReportsService, private _meta: Meta, + private _router: Router) { + this.updateUrl(OpenaireProperties.getBaseLink()+this._router.url); + } + + ngOnInit() { + this.sub = this.route.queryParams.subscribe(params => { + this.metricsClicked = false; + this.statsClicked = false; + this.fetchPublications = new FetchPublications( this._searchPublicationsService); + this.fetchDatasets = new FetchDatasets(this._searchDatasetsService); + this.fetchSoftware = new FetchSoftware(this._searchSoftwareService); + + this.updateTitle("Project"); + this.updateDescription("project, funding, open access, publications, research data, software"); + + this.projectId = params['projectId']; + if(this.projectId){ + this.publications_dynamic = + ""; + + this.datasets_dynamic = + ""; + + this.getProjectInfo(this.projectId); + this.searchPublications(); + this.fetchDatasets.getNumForEntity("project", this.projectId); + this.fetchSoftware.getNumForEntity("project", this.projectId); + }else{ + this.showLoading = false; + this.warningMessage="No valid project id"; + } + + this.downloadURLAPI = OpenaireProperties.getCsvAPIURL(); + + this.createClipboard(); + this.csvParams = "format=csv-special&page=0&type=publications&query=(((oaftype exact result) and (resulttypeid exact publication)) and (relprojectid exact "+this.projectId+"))&size="; + this.csvParamsDatasets = "format=csv-special&page=0&type=datasets&query=(((oaftype exact result) and (resulttypeid exact dataset)) and (relprojectid exact "+this.projectId+"))&size="; + + if (typeof document !== 'undefined') { + this.element.nativeElement.scrollIntoView(); + } + }); +} + + + ngOnDestroy() { + this.sub.unsubscribe(); + if(this.piwiksub){ + this.piwiksub.unsubscribe(); + } + if(this.infoSub) { + this.infoSub.unsubscribe(); + } + if(this.downloadFilePiwikSub) { + this.downloadFilePiwikSub.unsubscribe(); + } + } + + private createClipboard() { + if(typeof window !== 'undefined') { + + let publ_clipboard, datasets_clipboard; + let Clipboard; + Clipboard = require('clipboard'); + publ_clipboard = new Clipboard('.publ_clipboard_btn'); + datasets_clipboard = new Clipboard('.datasets_clipboard_btn'); + } + } + + private searchPublications() { + this.fetchPublications.getResultsForEntity("project", this.projectId, 1, 10); + this.linkToSearchPublications = OpenaireProperties.getLinkToAdvancedSearchPublications();// + "?project=" + this.projectId+"&pr=and"; + if(this.fetchPublications.searchUtils.totalResults > 0) { + //this.activeTab = "Publications"; + } else { + //this.searchDatasetsInit(); + } + } + + private searchDatasets() { + this.fetchDatasets.getResultsForEntity("project", this.projectId, 1, 10); + this.linkToSearchDatasets = OpenaireProperties.getLinkToAdvancedSearchDatasets();// + "?project=" + this.projectId+"&pr=and"; + + this.reloadDatasets = false; + //this.activeTab = "Research Data"; + } + + private searchSoftware() { + this.fetchSoftware.getResultsForEntity("project", this.projectId, 1, 10); + this.linkToSearchSoftware = OpenaireProperties.getLinkToAdvancedSearchSoftware(); + this.reloadSoftware = false; + } + + public searchDatasetsInit() { + console.info("searchDatasetsInit"); + if(this.reloadDatasets && this.fetchDatasets.searchUtils.totalResults > 0) { + this.searchDatasets(); + } else if(this.fetchDatasets.searchUtils.totalResults == 0) { + //this.statsClicked=true; + //this.activeTab = "Statistics"; + } + } + + public searchSoftwareInit() { + console.info("searchSoftwareInit"); + if(this.reloadSoftware && this.fetchSoftware.searchUtils.totalResults > 0) { + this.searchSoftware(); + } + } + + private getProjectInfo (id:string) { + this.warningMessage = ''; + this.errorMessage="" + this.showLoading = true; + + this.infoSub = this._projectService.getProjectInfo(id).subscribe( + data => { + this.projectInfo = data; + + this.projectName = this.projectInfo.acronym; + if(this.projectName == undefined || this.projectName == '') { + this.projectName = this.projectInfo.title; + } + this.updateTitle(this.projectName); + this.updateDescription("project, funding, open access, publications, research data, "+this.projectName+ ","+this.projectInfo.funder); + if(OpenaireProperties.isPiwikTrackEnabled() && (typeof document !== 'undefined')){ + this.piwiksub = this._piwikService.trackView(this.projectName).subscribe(); + } + + this.project= { funderId: "", funderName: this.projectInfo.funder, projectId: this.projectId, projectName: this.projectInfo.title, projectAcronym: this.projectInfo.acronym, startDate: this.projectInfo.startDate, endDate: this.projectInfo.endDate }; + + this.viewsFrameUrl = OpenaireProperties.getFramesAPIURL()+'merge.php?com=query&data=[{"query":"projRepoViews","projTitle":"'+this.projectId+'","table":"","fields":[{"fld":"sum","agg":"sum","type":"column","yaxis":1,"c":false}],"xaxis":{"name":"month","agg":"sum"},"group":"","color":"","type":"chart","size":30,"sort":"xaxis","xStyle":{"r":-30,"s":"0","l":"-","ft":"-","wt":"-"},"title":"","subtitle":"","xaxistitle":"","yaxisheaders":["Monthly views"],"generalxaxis":"","theme":0,"in":[]}]&info_types=["column"]&stacking=&steps=false&fontFamily=Courier&spacing=[5,0,0,0]&style=[{"color":"rgba(0, 0, 0, 1)","size":"18"},{"color":"rgba(0, 0, 0, 1)","size":"18"},{"color":"000000","size":""},{"color":"000000","size":""}]&backgroundColor=rgba(255,255,255,1)&colors[]=rgba(124, 181, 236, 1)&colors[]=rgba(67, 67, 72, 1)&colors[]=rgba(144, 237, 125, 1)&colors[]=rgba(247, 163, 92, 1)&colors[]=rgba(128, 133, 233, 1)&colors[]=rgba(241, 92, 128, 1)&colors[]=rgba(228, 211, 84, 1)&colors[]=rgba(43, 144, 143, 1)&colors[]=rgba(244, 91, 91, 1)&colors[]=rgba(145, 232, 225, 1)&xlinew=0&ylinew=1&legends=true&tooltips=true&persistent=false'; + + this.downloadsFrameUrl = OpenaireProperties.getFramesAPIURL()+'merge.php?com=query&data=[{"query":"projRepoDownloads","projTitle":"'+this.projectId+'","table":"","fields":[{"fld":"sum","agg":"sum","type":"column","yaxis":1,"c":false}],"xaxis":{"name":"month","agg":"sum"},"group":"","color":"","type":"chart","size":30,"sort":"xaxis","xStyle":{"r":-30,"s":"0","l":"-","ft":"-","wt":"-"},"title":"","subtitle":"","xaxistitle":"","yaxisheaders":["Monthly downloads"],"generalxaxis":"","theme":0,"in":[]}]&info_types=["column"]&stacking=&steps=false&fontFamily=Courier&spacing=[5,0,0,0]&style=[{"color":"rgba(0, 0, 0, 1)","size":"18"},{"color":"rgba(0, 0, 0, 1)","size":"18"},{"color":"000000","size":""},{"color":"000000","size":""}]&backgroundColor=rgba(255,255,255,1)&colors[]=rgba(124, 181, 236, 1)&colors[]=rgba(67, 67, 72, 1)&colors[]=rgba(144, 237, 125, 1)&colors[]=rgba(247, 163, 92, 1)&colors[]=rgba(128, 133, 233, 1)&colors[]=rgba(241, 92, 128, 1)&colors[]=rgba(228, 211, 84, 1)&colors[]=rgba(43, 144, 143, 1)&colors[]=rgba(244, 91, 91, 1)&colors[]=rgba(145, 232, 225, 1)&xlinew=0&ylinew=1&legends=true&tooltips=true&persistent=false'; + + //stats tab charts + this.chartScientificResultsUrl='https://beta.openaire.eu/stats/chart.php?com=query&persistent=false&data={"query":"projScient","projTitle":"'+this.projectId+'", "table": "result", "fields": [{"fld": "number", "agg": "count", "type": "spline", "yaxis":1, "c":false}], "xaxis":{"name": "result_classifications-type", "agg": "avg"}, "group": "", "color": "", "type": "chart", "size":30, "sort": "xaxis", "xStyle":{"r": "-", "s": "-", "l": "-", "ft": "-", "wt": "-"}, "yaxisheaders": [""], "fieldsheaders": ["Research Results"], "in": [], "filters": [{"name": "result_datasources-datasource-name", "values": [" "], "to": "-1"}], "having": [], "incfilters": [], "inchaving": [], "title": "", "subtitle": "", "xaxistitle": ""}&w=600&h=250'; + this.chartAccessModeUrl='https://beta.openaire.eu/stats/chart.php?com=query&persistent=false&data={"query":"projOA","projTitle":"'+this.projectId+'", "table": "result", "fields": [{"fld": "number", "agg": "count", "type": "pie", "yaxis":1, "c":false}], "xaxis":{"name": "result_classifications-type", "agg": "avg"}, "group": "", "color": "", "type": "chart", "size":30, "sort": "xaxis", "xStyle":{"r": "-", "s": "-", "l": "-", "ft": "-", "wt": "-"}, "yaxisheaders": [""], "fieldsheaders": ["Research Results"], "in": [], "filters": [{"name": "result_datasources-datasource-name", "values": [" "], "to": "-1"}], "having": [], "incfilters": [], "inchaving": [], "title": "", "subtitle": "", "xaxistitle": ""}&w=600&h=250'; + this.chartDatasourcesUrl= 'https://beta.openaire.eu/stats/chart.php?com=query&persistent=false&data={"query":"projPubsRepos","projTitle":"'+this.projectId+'", "table": "result", "fields": [{"fld": "number", "agg": "count", "type": "bar", "yaxis":1, "c":false}], "xaxis":{"name": "result_classifications-type", "agg": "avg"}, "group": "", "color": "", "type": "chart", "size":30, "sort": "xaxis", "xStyle":{"r": "-", "s": "-", "l": "-", "ft": "-", "wt": "-"}, "yaxisheaders": [""], "fieldsheaders": ["Research Results"], "in": [], "filters": [{"name": "result_datasources-datasource-name", "values": [" "], "to": "-1"}], "having": [], "incfilters": [], "inchaving": [], "title": "", "subtitle": "", "xaxistitle": ""}&w=600&h=250'; + + this.showLoading = false; + }, + err => { + console.log(err); + this.errorMessage = 'No project found'; + this.showLoading = false; + } + ); + } + + public downloadfile(url:string){ + this.openLoading(); + this.setMessageLoading("Downloading CSV file"); + + this._reportsService.downloadCSVFile(url).subscribe( + data => { + this.closeLoading(); + window.open(window.URL.createObjectURL(data)); + if(OpenaireProperties.isPiwikTrackEnabled() && (typeof document !== 'undefined')){ + this.downloadFilePiwikSub = this._piwikService.trackDownload(url).subscribe(); + } + }, + error => { + console.log("Error downloading the file."); + this.closeLoading(); + this.confirmOpenCsvError(); + }, + () => console.log('Completed file download.') + ); + } + +/* + showHTML(){ + let info:string = "

Publications of Project "; + + if(this.projectInfo.title != undefined && this.projectInfo.title != "") { + info += this.projectInfo.title; + } + if((this.projectInfo.title != undefined && this.projectInfo.title != "") && + ((this.projectInfo.acronym != undefined && this.projectInfo.acronym != "") || + (this.projectInfo.callIdentifier != undefined && this.projectInfo.callIdentifier != ""))) { + info += "("; + } + if(this.projectInfo.acronym != undefined && this.projectInfo.acronym != "") { + info += this.projectInfo.acronym + " - "; + } + if(this.projectInfo.callIdentifier != undefined && this.projectInfo.callIdentifier != "") { + info += this.projectInfo.callIdentifier; + } + if((this.projectInfo.title != undefined && this.projectInfo.title != "") && + ((this.projectInfo.acronym != undefined && this.projectInfo.acronym != "") || + (this.projectInfo.callIdentifier != undefined && this.projectInfo.callIdentifier != ""))) { + info += ")"; + } + info +="

"; + info += "

"+this.fetchPublications.searchUtils.totalResults+" publications

"; + + let htmlParams = 'resources?format=html&page=0&size='+this.fetchPublications.searchUtils.totalResults+'&type=publications&query=(((oaftype exact result) and (resulttypeid exact publication)) and (relprojectid exact "'+this.projectId+'"))'; + this._reportsService.downloadHTMLFile(this.downloadURLAPI+htmlParams, info) + .subscribe(data => this.funct(data), + error => console.log("Error downloading the file."), + () => console.log('Completed file download.')); + } + + funct(data) { + var win = window.open(window.URL.createObjectURL(data)); + } +*/ + public metricsResults($event) { + this.totalViews = $event.totalViews; + this.totalDownloads = $event.totalDownloads; + this.pageViews = $event.pageViews; + } + + private updateDescription(description:string){ + this._meta.updateMeta("description", description); + this._meta.updateProperty("og:description", description); + } + private updateTitle(title:string){ + var _prefix ="OpenAIRE | "; + var _title = _prefix + ((title.length> 50 ) ?title.substring(0,50):title); + this._meta.setTitle(_title ); + this._meta.updateProperty("og:title",_title); + } + private updateUrl(url:string){ + this._meta.updateProperty("og:url", url); + } + + private openLoading(){ + if(this.loading){ + this.loading.open(); + } + } + private closeLoading(){ + if(this.loading){ + this.loading.close(); + } + } + private setMessageLoading(message: string){ + if(this.loading){ + this.loading.message = message; + } + } + + public confirmOpenCsvError(){ + this.alertCsvError.cancelButton = false; + this.alertCsvError.okButton = true; + this.alertCsvError.alertTitle = "ERROR DOWNLOADING CSV FILE"; + this.alertCsvError.message = "There was an error in csv downloading. Please try again later."; + this.alertCsvError.okButtonText = "OK"; + this.alertCsvError.open(); + } +} diff --git a/portal-4cli/src/app/landingPages/project/project.module.ts b/portal-4cli/src/app/landingPages/project/project.module.ts new file mode 100644 index 00000000..e77d471e --- /dev/null +++ b/portal-4cli/src/app/landingPages/project/project.module.ts @@ -0,0 +1,45 @@ +//import {MaterialModule} from '@angular/material'; +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { RouterModule } from '@angular/router'; + +import { ProjectServiceModule} from './projectService.module'; +// import {HtmlProgressReportService} from './htmlProgressReport.service'; +import{LoadingModalModule} from '../../utils/modal/loadingModal.module'; +import {AlertModalModule} from '../../utils/modal/alertModal.module'; +import {ErrorMessagesModule} from '../../utils/errorMessages.module'; + +import { ProjectComponent } from './project.component'; +import { ProjectRoutingModule } from './project-routing.module'; +import {IFrameModule} from '../../utils/iframe.module'; +import {MetricsModule} from '../landing-utils/metrics.module'; +import {ReportsServiceModule} from '../../services/reportsService.module'; +import {PublicationsServiceModule} from '../../services/publicationsService.module'; +import {DatasetsServiceModule} from '../../services/datasetsService.module'; +import {SoftwareServiceModule} from '../../services/softwareService.module'; +import {TabResultModule } from '../../searchPages/searchUtils/tabResult.module'; +import { LandingModule } from '../landing-utils/landing.module'; +import {FreeGuard} from'../../login/freeGuard.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + CommonModule, FormsModule, RouterModule, LandingModule, + ProjectRoutingModule, LoadingModalModule, AlertModalModule, ErrorMessagesModule, + TabResultModule, IFrameModule, MetricsModule, ReportsServiceModule, + PublicationsServiceModule, DatasetsServiceModule, SoftwareServiceModule, ProjectServiceModule + ], + declarations: [ + ProjectComponent + ], + providers:[ + // ProjectService, + // HtmlProgressReportService + FreeGuard, IsRouteEnabled + ], + exports: [ + ProjectComponent + ] +}) +export class ProjectModule { } diff --git a/portal-4cli/src/app/landingPages/project/project.service.ts b/portal-4cli/src/app/landingPages/project/project.service.ts new file mode 100644 index 00000000..57b57d90 --- /dev/null +++ b/portal-4cli/src/app/landingPages/project/project.service.ts @@ -0,0 +1,207 @@ +import {Injectable} from '@angular/core'; +import {Http, Response} from '@angular/http'; +import {Observable} from 'rxjs/Observable'; +import {ProjectInfo} from '../../utils/entities/projectInfo'; +import {OpenaireProperties} from '../../utils/properties/openaireProperties'; +import 'rxjs/add/observable/of'; +import 'rxjs/add/operator/do'; +import 'rxjs/add/operator/share'; + +import { ParsingFunctions } from '../landing-utils/parsingFunctions.class'; + +@Injectable() +export class ProjectService { + + constructor(private http: Http ) { + this.parsingFunctions = new ParsingFunctions(); + } + + public parsingFunctions: ParsingFunctions; + projectInfo: ProjectInfo; + + getProjectInfo (id: string):any { + console.info("getProjectInfo in service"); + + let url = OpenaireProperties. getSearchAPIURLLast() + 'projects/'+id+"?format=json"; + let key = url; + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()) + .map(res => res['result']['metadata']['oaf:entity']['oaf:project']) + .map(res => [res, + res['fundingtree'], + res['rels']['rel']]) + .map(res => this.parseProjectInfo(res)); + + } + + /* + get project strtDate and endDate + */ + getProjectDates (id: string):any { + + let url = OpenaireProperties. getSearchAPIURLLast()+'projects/'+id+"?format=json"; + let key = url+'_projectDates'; + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()) + .map(res => res['result']['metadata']['oaf:entity']['oaf:project']) + .map(res => [res, + res['fundingtree'], + res['rels']['rel']]) + .map(res => this.parseProjectDates(id,res)) + + } + + getHTMLInfo(id: string): any { + let url = OpenaireProperties. getSearchAPIURLLast() + 'projects/'+id+"?format=json"; + let key = url; + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()) + .map(res => res['result']['metadata']['oaf:entity']['oaf:project']) + .map(res => this.parseHTMLInfo(res)); + } + + private handleError (error: Response) { + // in a real world app, we may send the error to some remote logging infrastructure + // instead of just logging it to the console + console.log(error); + return Observable.throw(error || 'Server error'); + } + + parseHTMLInfo (data: any):any { + let htmlInfo: {"title": string, "acronym": string, "callIdentifier": string}; + + if(data != null) { + htmlInfo = {"title": data.title, "acronym": data.acronym, "callIdentifier": data.callidentifier}; + } + return htmlInfo; + } + + parseProjectInfo (data: any):any { + this.projectInfo = new ProjectInfo(); + + if(data[0] != null) { + this.projectInfo.acronym = data[0].acronym; + if(Array.isArray(data[0]['title'])) { + this.projectInfo.title = data[0].title[0]; + } else { + this.projectInfo.title = data[0].title; + } + this.projectInfo.callIdentifier = data[0].callidentifier; + this.projectInfo.contractNum = data[0].code; + this.projectInfo.startDate = data[0].startdate; + this.projectInfo.endDate = data[0].enddate; + this.projectInfo.openAccessMandate = data[0].oamandatepublications; + this.projectInfo.specialClause39 = data[0].ecsc39; + } + if(data[1] != null) { + /* + if(data[1]['funder'] != null) { + this.projectInfo.funder = data[1]['funder'].shortname; + } + + let funding; + this.projectInfo.funding = ""; + + if(data[1]['funding_level_2'] != null) { + funding = data[1]['funding_level_2'].id; + } else if(data[1]['funding_level_1'] != null) { + funding = data[1]['funding_level_1'].id; + } else if(data[1]['funding_level_0'] != null) { + funding = data[1]['funding_level_0'].id; + } + + if(funding != undefined) { + funding = funding.split("::"); + for(let i=1; i(); + + let acronym: string = ""; + let name: string = ""; + let id: string = ""; + + if(!Array.isArray(data[2])) { + if(data[2].hasOwnProperty("legalshortname")) { + acronym = data[2].legalshortname; + } + if(data[2].hasOwnProperty("legalname")) { + name = data[2].legalname; + } + if(!acronym && !name){ + // acronym is displayed with link and name only in tooltip + acronym = "[no title available]"; + } + + if(data[2].hasOwnProperty("to")) { + id = data[2]['to'].content; + } + + this.projectInfo.organizations.push({"acronym": acronym, "name": name, "id": id}); + } else { + for(let i=0; i +
+
+ +
+ + + + +
+
+ + {{publicationInfo.types.join(", ")}} + {{publicationInfo.languages.join(", ")}} + {{publicationInfo.title.accessMode}} + + + + Record in preview + + + + + +
+ + ({{publicationInfo.date}}) +
+ +
    +
  • Publisher: {{publicationInfo.publisher}}
  • +
  • + Journal: + {{publicationInfo.journal['journal']}} + + ( + + + issn: {{publicationInfo.journal['issn']}} + + + lissn: {{publicationInfo.journal['lissn']}} + + + ) + +
  • + +
  • Embargo end date: {{publicationInfo.embargoEndDate}}
  • +
  • + +
  • +
  • + + +
  • +
+ +
+ {{publicationInfo.description}} +
+ + +
+ + +
+ + + + + + + + + + + + + + +
+
+
+ No references available +
+ +
+ + +
+ {{publicationInfo.references.length}} references, page {{referencesPage}} of {{totalPages(publicationInfo.references.length)}} + +
+ +
+

+ + {{item['name']}} + +

+

+ {{item['name']}} +

+
+ + + + + +
+
+ +
+
+ No related research results available +
+
+
+
{{provenanceaction}}
+ + +
+
+
+ + +
+
+ No similar research results available +
+
+ + +
+
+ +
+
+ No related organizations available +
+
+
+ {{publicationInfo.organizations.length}} organizations, page {{organizationsPage}} of {{totalPages(publicationInfo.organizations.length)}} + +
+ + + + + + + + + +
+ + {{organization['name']}} + ( + {{organization.shortname}} + ) + +

+ {{organization['name']}} + ( + {{organization.shortname}} + ) +

+
{{organization.country}}
+
Website url: + {{organization.websiteUrl}} +
+
+
+
{{organization['trust']}}%
+ +
+
+

no trust available

+
+
+ + +
+
+ +
+
+ {{bioentitiesNum}} bioentities, page {{bioentitiesPage}} of {{totalPages(bioentitiesNum)}} + +
+ + + + + + + + + + + + + +
+ + + {{keyIn}} + + + + {{key}} +
+
+
+
+ {{publicationInfo.software.length}} software results, page {{softwarePage}} of {{totalPages(publicationInfo.software.length)}} + +
+ + + + + + + + +
+ + + {{item.name}} + + +
+
+
+ + + + + + + + +
+ +
+
+ +
+
+ Share - Bookmark + +
+ + + + +
+
+
+
+
+
diff --git a/portal-4cli/src/app/landingPages/publication/publication.component.ts b/portal-4cli/src/app/landingPages/publication/publication.component.ts new file mode 100644 index 00000000..b44a14c6 --- /dev/null +++ b/portal-4cli/src/app/landingPages/publication/publication.component.ts @@ -0,0 +1,312 @@ +import {Component, ViewChild, ElementRef} from '@angular/core'; +import {Observable} from 'rxjs/Observable'; +import {PublicationService} from './publication.service'; +import {PublicationInfo} from '../../utils/entities/publicationInfo'; +import {ActivatedRoute, Router} from '@angular/router'; +import {OpenaireProperties} from '../../utils/properties/openaireProperties'; +import {RouterHelper} from '../../utils/routerHelper.class'; +import {PiwikService} from '../../utils/piwik/piwik.service'; + +import { Meta} from '../../../angular2-meta'; + + + +@Component({ + selector: 'publication', + templateUrl: 'publication.component.html', + +}) + +export class PublicationComponent { + public publicationInfo: PublicationInfo; + public articleId: string; + + // APP BOX variables + public showAllCollectedFrom: boolean = false; + public showAllDownloadFrom: boolean = false; + + // Metrics tab variables + public metricsClicked: boolean; + public viewsFrameUrl: string; + public downloadsFrameUrl: string; + public totalViews: number; + public totalDownloads: number; + public pageViews: number; + + // Custom tab paging variables + public referencesPage: number = 1; + public organizationsPage: number = 1; + public softwarePage: number = 1; + public bioentitiesPage: number = 1; + public pageSize: number = 10; + /* + public startt: number = 0; + public stopp: number = 0; + */ + + // Active tab variable for responsiveness + public activeTab: string = "References"; + + // Map counting variables + public bioentitiesNum: number = 0; + public relatedResearchResultsNum: number = 0; + + // Message variables + public warningMessage = ""; + public errorMessage = ""; + public showLoading: boolean = true; + + public routerHelper:RouterHelper = new RouterHelper(); + + private doi: string; + private result; + sub: any; piwiksub: any; infoSub: any; + + constructor ( private element: ElementRef, + private _publicationService: PublicationService, + private _piwikService:PiwikService, + private route: ActivatedRoute, private _meta: Meta, + private _router: Router) { + this.updateUrl(OpenaireProperties.getBaseLink()+this._router.url); + } + + ngOnInit() { + this.sub = this.route.queryParams.subscribe(data => { + this.publicationInfo = null; + this.updateTitle("Publication"); + this.updateDescription("Publication, open access, collected from"); + + this.articleId = data['articleId']; + console.info("Article id is :"+this.articleId); + + this.metricsClicked = false; + + if(this.articleId){ + + this.getPublicationInfo(this.articleId); + // if (typeof document !== 'undefined') { + // switcher(UIkit); + // } + }else{ + this.showLoading = false; + this.warningMessage="No valid publication id"; + } + + this.viewsFrameUrl = OpenaireProperties.getFramesAPIURL()+'merge.php?com=query&data=[{"query":"resRepoViews", "resTitle":"'+this.articleId+'", "table":"","fields":[{"fld":"sum","agg":"sum","type":"column","yaxis":1,"c":false}],"xaxis":{"name":"month","agg":"sum"},"group":" ","color":"","type":"chart","size":30,"sort":"xaxis","xStyle":{"r":-30,"s":"0","l":"-","ft":"-","wt":"-"},"title":"","subtitle":"","xaxistitle":"Repository","yaxisheaders":["Monthly views"],"generalxaxis":"","theme":0,"in":[],"filters":[{"name":"","values":[""],"to":"-1"}]}]&info_types=["column"]&stacking=normal&steps=false&fontFamily=Courier&spacing=[5,0,0,0]&style=[{"color":"rgba(0, 0, 0, 1)","size":"18"},{"color":"rgba(0, 0, 0, 1)","size":"18"},{"color":"000000","size":""},{"color":"000000","size":""}]&backgroundColor=rgba(255,255,255,1)&colors[]=rgba(67, 67, 72, 1)&colors[]=rgba(144, 237, 125, 1)&colors[]=rgba(247, 163, 92, 1)&colors[]=rgba(128, 133, 233, 1)&colors[]=rgba(241, 92, 128, 1)&colors[]=rgba(228, 211, 84, 1)&colors[]=rgba(43, 144, 143, 1)&colors[]=rgba(244, 91, 91, 1)&colors[]=rgba(145, 232, 225, 1)&xlinew=0&ylinew=1&legends=true&tooltips=true&persistent=false'; + + this.downloadsFrameUrl = OpenaireProperties.getFramesAPIURL()+'merge.php?com=query&data=[{"query":"resRepoDownloads", "resTitle":"'+this.articleId+'", "table":"","fields":[{"fld":"sum","agg":"sum","type":"column","yaxis":1,"c":false}],"xaxis":{"name":"month","agg":"sum"},"group":" ","color":"","type":"chart","size":30,"sort":"xaxis","xStyle":{"r":-30,"s":"0","l":"-","ft":"-","wt":"-"},"title":"","subtitle":"","xaxistitle":"Repository","yaxisheaders":["Monthly downloads"],"generalxaxis":"","theme":0,"in":[],"filters":[{"name":"","values":[""],"to":"-1"}]}]&info_types=["column"]&stacking=normal&steps=false&fontFamily=Courier&spacing=[5,0,0,0]&style=[{"color":"rgba(0, 0, 0, 1)","size":"18"},{"color":"rgba(0, 0, 0, 1)","size":"18"},{"color":"000000","size":""},{"color":"000000","size":""}]&backgroundColor=rgba(255,255,255,1)&colors[]=rgba(67, 67, 72, 1)&colors[]=rgba(144, 237, 125, 1)&colors[]=rgba(247, 163, 92, 1)&colors[]=rgba(128, 133, 233, 1)&colors[]=rgba(241, 92, 128, 1)&colors[]=rgba(228, 211, 84, 1)&colors[]=rgba(43, 144, 143, 1)&colors[]=rgba(244, 91, 91, 1)&colors[]=rgba(145, 232, 225, 1)&xlinew=0&ylinew=1&legends=true&tooltips=true&persistent=false'; + + if (typeof document !== 'undefined') { + this.element.nativeElement.scrollIntoView(); + } + }); + } + + ngOnDestroy() { + this.sub.unsubscribe(); + if(this.piwiksub){ + this.piwiksub.unsubscribe(); + } + if(this.infoSub) { + this.infoSub.unsubscribe(); + } + } + + private getPublicationInfo(id:string) { + this.warningMessage = ''; + this.errorMessage="" + this.showLoading = true; + + this.infoSub = this._publicationService.getPublicationInfo(this.articleId).subscribe( + data => { + this.publicationInfo = data; + + // this.result = [] + // this.result = {id: id, type :"dataset", source : "openaire", title: this.publicationInfo.title,url: '', result: '', accessRights: this.publicationInfo.bestaccessright, embargoEndDate: ''}; + this.updateTitle(this.publicationInfo.title.name); + this.updateDescription("Dataset, search, repositories, open access,"+this.publicationInfo.title.name); + if(OpenaireProperties.isPiwikTrackEnabled() && (typeof document !== 'undefined')){ + this.piwiksub = this._piwikService.trackView(this.publicationInfo.title.name).subscribe(); + } + + let bioentitiesNum = 0; + if(this.publicationInfo.bioentities != undefined) { + this.publicationInfo.bioentities.forEach(function (value, key, map) { + bioentitiesNum += value.size; + }); + } + this.bioentitiesNum = bioentitiesNum; + + let relatedResearchResultsNum = 0; + if(this.publicationInfo.relatedResearchResults != undefined) { + this.publicationInfo.relatedResearchResults.forEach(function (value, key, map) { + relatedResearchResultsNum += value.length; + }); + } + this.relatedResearchResultsNum = relatedResearchResultsNum; + + this.result = {id: this.articleId, type :"publication", source : "openaire", title: this.publicationInfo.title,url: '', result: '', accessRights: this.publicationInfo.title.accessMode, embargoEndDate: ''}; + // this.result.push(result_); + + if(this.publicationInfo.identifiers != undefined && this.publicationInfo.identifiers.has('doi')) { + this.doi = this.publicationInfo.identifiers.get('doi')[0]; + } + + this.showLoading = false; + + if(this.publicationInfo.references) { + this.activeTab = "References"; + } else if(this.publicationInfo.relatedResearchResults) { + this.activeTab = "Related Research Results"; + } else if(this.publicationInfo.similarResearchResults) { + this.activeTab = "Similar Research Results"; + } else if(this.publicationInfo.organizations) { + this.activeTab = "Related Organizations"; + } else if(this.publicationInfo.bioentities) { + this.activeTab = "bioentities"; + } else if(this.publicationInfo.software) { + this.activeTab = "Software"; + } else { + this.activeTab = "Metrics"; + this.metricsClicked = true; + } + console.info("activeTab is "+this.activeTab); + }, + err => { + console.log(err); + console.info("error"); + + this.errorMessage = 'No publication found'; + this.showLoading = false; + } + ); + } + + public metricsResults($event) { + this.totalViews = $event.totalViews; + this.totalDownloads = $event.totalDownloads; + this.pageViews = $event.pageViews; + } + + public buildCurationTooltip() { + let tooltipContent: string = "
"; + + tooltipContent += "

Record in preview

"; + tooltipContent += "

Bibliographic record accepted by the system, but not yet processed by
OpenAIRE tools for information quality improvement and de-duplication

"; + + return tooltipContent+= "
"; + } + + private updateDescription(description:string){ + this._meta.updateMeta("description", description); + this._meta.updateProperty("og:description", description); + } + private updateTitle(title:string){ + var _prefix ="OpenAIRE | "; + var _title = _prefix + ((title.length> 50 ) ?title.substring(0,50):title); + this._meta.setTitle(_title ); + this._meta.updateProperty("og:title",_title); + } + + private updateUrl(url:string){ + this._meta.updateProperty("og:url", url); + } + + public totalPages(totalResults: number): number { + let totalPages:any = totalResults/this.pageSize; + if(!(Number.isInteger(totalPages))) { + totalPages = (parseInt(totalPages, this.pageSize) + 1); + } + return totalPages; + } + + public updateReferencesPage($event) { + this.referencesPage = $event.value; + } + + public updateOrganizationsPage($event) { + this.organizationsPage = $event.value; + } + + public updateSoftwarePage($event) { + this.softwarePage = $event.value; + } + + public updateBioentitiesPage($event) { + this.bioentitiesPage = $event.value; + } + + public keysToArray(bioentities: Map) : string[] { + let keys: string[] = []; + bioentities.forEach(function (value, key, map) { + keys.push(key); + }); + return keys; + } + public getKeys( map) { + return Array.from(map.keys()); + } +/* + start(i: number, bioentitiesPage: number) { + let sum = 0; + let index=0; + let retValue = 0; + let valuesToPage = this.pageSize*bioentitiesPage; + let valuesToPreviousPage = valuesToPage - this.pageSize; + + if(bioentitiesPage == 1) { + return 0; + } + + this.publicationInfo.bioentities.forEach(function (value, key, map) { + sum += map.get(key).size; + + if(index == i) { + if(sum <= valuesToPreviousPage) { + retValue = 0; + } else if((sum-map.get(key).size) >= valuesToPage){ + retValue = 0; + } else { + if(map.get(key).size < (sum - valuesToPreviousPage)) { + retValue = 0; + } else { + retValue = map.get(key).size - (sum - valuesToPreviousPage); + } + } + } + index++; + }); + this.startt = retValue; + return retValue; + } + + stop(i: number, bioentitiesPage: number) { + let sum = 0; + let index=0; + let retValue = 0; + let valuesToPage = this.pageSize*bioentitiesPage; + let valuesToPreviousPage = valuesToPage - this.pageSize; + + this.publicationInfo.bioentities.forEach(function (value, key, map) { + sum += map.get(key).size; + if(index == i) { + if(sum <= valuesToPreviousPage) { + retValue = 0; + } else if((sum - map.get(key).size) >= valuesToPage){ + retValue = 0; + } else { + if(sum < valuesToPage) { + retValue = map.get(key).size; + } else { + retValue = map.get(key).size - (sum - valuesToPage); + } + } + } + index++; + }); + this.stopp = retValue; + return retValue; + } +*/ + +} diff --git a/portal-4cli/src/app/landingPages/publication/publication.module.ts b/portal-4cli/src/app/landingPages/publication/publication.module.ts new file mode 100644 index 00000000..cfa5337a --- /dev/null +++ b/portal-4cli/src/app/landingPages/publication/publication.module.ts @@ -0,0 +1,30 @@ +//import {MaterialModule} from '@angular/material'; +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { SharedModule } from '../../shared/shared.module'; +import { RouterModule } from '@angular/router'; + +import { PublicationService} from './publication.service'; +import { PublicationComponent } from './publication.component'; +import { PublicationRoutingModule } from './publication-routing.module'; +import {MetricsModule} from '../landing-utils/metrics.module'; +import {IFrameModule} from '../../utils/iframe.module'; +import {AltMetricsModule} from '../../utils/altmetrics.module'; +import {CiteThisModule} from '../landing-utils/citeThis/citeThis.module'; +import {PagingModule} from '../../utils/paging.module'; + +import { ResultLandingModule } from '../landing-utils/resultLanding.module'; +import { LandingModule } from '../landing-utils/landing.module'; +import {FreeGuard} from'../../login/freeGuard.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + CommonModule, FormsModule, LandingModule,SharedModule, RouterModule, CiteThisModule, PagingModule, + ResultLandingModule, PublicationRoutingModule, IFrameModule, MetricsModule, AltMetricsModule], + declarations: [PublicationComponent], + providers:[PublicationService, FreeGuard, IsRouteEnabled], + exports: [PublicationComponent] +}) +export class PublicationModule { } diff --git a/portal-4cli/src/app/landingPages/publication/publication.service.ts b/portal-4cli/src/app/landingPages/publication/publication.service.ts new file mode 100644 index 00000000..bf270bc6 --- /dev/null +++ b/portal-4cli/src/app/landingPages/publication/publication.service.ts @@ -0,0 +1,357 @@ + +import {Injectable} from '@angular/core'; +import {Http, Response} from '@angular/http'; +import {Observable} from 'rxjs/Observable'; +import {PublicationInfo} from '../../utils/entities/publicationInfo'; +import {OpenaireProperties} from '../../utils/properties/openaireProperties'; +import 'rxjs/add/observable/of'; +import 'rxjs/add/operator/do'; +import 'rxjs/add/operator/share'; + + +import { ParsingFunctions } from '../landing-utils/parsingFunctions.class'; + +@Injectable() +export class PublicationService { + + constructor(private http: Http ) { + this.parsingFunctions = new ParsingFunctions(); + } + + public parsingFunctions: ParsingFunctions; + publicationInfo: PublicationInfo; + + getPublicationInfo (id: string):any { + console.info("getPublicationInfo in service"); + let url = OpenaireProperties. getSearchAPIURLLast() + 'publications/' +id+"?format=json"; + let key = url; + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()) + .map(res => [res['result']['header']['dri:status'], res['result']['metadata']['oaf:entity']]) + .map(res => [ res[1]['oaf:result'], + res[1]['oaf:result']['title'], + res[1]['oaf:result']['rels']['rel'], + res[1]['oaf:result']['children'], + res[1]['oaf:result']['pid'], + res[1]['oaf:result']['journal'], + res[1]['oaf:result']['language'], + res[1]['oaf:result']['subject'], + res[1]['oaf:result']['bestaccessright'], + res[1]['oaf:result']['collectedfrom'], + (res[1]['extraInfo']!= undefined && res[1]['extraInfo']['citations']!= undefined)? res[1]['extraInfo']['citations']['citation']:null, + res[1]['oaf:result']['context'], + res[0], + res[1]['oaf:result']['creator'] + ]) + .map(res => this.parsePublicationInfo(res)); + } + + private handleError (error: Response) { + // in a real world app, we may send the error to some remote logging infrastructure + // instead of just logging it to the console + console.log(error); + return Observable.throw(error || 'Server error'); + } + + parsePublicationInfo (data: any):any { + this.publicationInfo = new PublicationInfo(); + + if(data[0] != null) { + var date:string = (data[0].dateofacceptance)+""; // transform to string in case it is an integer + this.publicationInfo.date = (date && (date).indexOf('-') !== -1)?date.split('-')[0]:date; + this.publicationInfo.dateofacceptance = data[0].dateofacceptance; + this.publicationInfo.publisher = data[0].publisher; + if(!Array.isArray(data[0].description)) { + this.publicationInfo.description = data[0].description; + } else { + this.publicationInfo.description = data[0].description[0]; + } + this.publicationInfo.embargoEndDate = data[0].embargoenddate; + } + + this.publicationInfo.title = {"name": "", "url": "", "accessMode": ""}; + if(data[0]['bestaccessright'].hasOwnProperty("classid")) { + this.publicationInfo.title.accessMode = data[0]['bestaccessright'].classid; + } + + if(data[1] != null) { + if(Array.isArray(data[1])) { + this.publicationInfo.title['name'] = data[1][0].content; + } else { + this.publicationInfo.title['name'] = data[1].content; + } + } + + if(data[2] != null) { + let relation; + let length = Array.isArray(data[2]) ? data[2].length : 1; + + for(let i=0; i(); + // } + // + // this.publicationInfo.authors[relation.ranking-1] = {"name": "", "id": ""}; + // this.publicationInfo.authors[relation.ranking-1]['name'] = relation.fullname; + /*} else*/ if(relation['to'].class == "isProducedBy") { + this.publicationInfo.fundedByProjects = this.parsingFunctions.parseFundingByProjects(this.publicationInfo.fundedByProjects, relation, this.publicationInfo.projectsProvenanceVocabulary); + } else if(relation['to'].class == "isRelatedTo") { + let provenanceAction: string; + if(relation.provenanceaction in this.publicationInfo.researchResultsProvenanceVocabulary) { + provenanceAction = this.publicationInfo.researchResultsProvenanceVocabulary[relation.provenanceaction]; + } else { + provenanceAction = "Other"; + } + + this.publicationInfo.relatedResearchResults = this.parsingFunctions.parseRelatedResearchResults(this.publicationInfo.relatedResearchResults, relation, provenanceAction); + } else if(relation['to'].class == "hasAmongTopNSimilarDocuments") { + this.publicationInfo.similarResearchResults = this.parsingFunctions.parseSimilarResearchResults(this.publicationInfo.similarResearchResults, relation); + } else if(relation['to'].class == "hasAuthorInstitution") { + this.publicationInfo.organizations = this.parseRelatedOrganizations(this.publicationInfo.organizations, relation); + } + } + } + } + + if(data[3] != null) { + if(data[3].hasOwnProperty("instance")) { + this.publicationInfo.downloadFrom = new Map(); + this.publicationInfo.publishedIn = new Map(); + + this.publicationInfo.types = new Array(); + let types = new Set(); + + let counter = 0; + let instance; + + let length = Array.isArray(data[3]['instance']) ? data[3]['instance'].length : 1; + + for(let i=0; i>, { "name": string, "url": string}[]] = this.parseBioentitiesAndSoftware(data[3]); + this.publicationInfo.bioentities = externalResults[0]; + this.publicationInfo.software = externalResults[1]; + } + } + + if(data[4] != null) { + this.publicationInfo.identifiers = this.parsingFunctions.parseIdentifiers(data[4]); + } + + if(data[5] != null) { + this.publicationInfo.journal = {"journal": "", "issn": "", "lissn": ""} + + this.publicationInfo.journal['journal'] = data[5].content; + this.publicationInfo.journal['issn'] = data[5].issn; + this.publicationInfo.journal['lissn'] = data[5].lissn; + } + + if(data[6] != null) { + this.publicationInfo.languages = new Array(); + + if(!Array.isArray(data[6])) { + if(data[6].classname != "Undetermined" && data[6].classname) { + this.publicationInfo.languages.push(data[6].classname); + } + } else { + for(let i=0; i, Map] = this.parsingFunctions.parseAllSubjects(data[7]); + this.publicationInfo.subjects = subjectResults[0]; + this.publicationInfo.otherSubjects = subjectResults[1]; + this.publicationInfo.classifiedSubjects = subjectResults[2]; + } + + // if(data[8] != null) { + // this.publicationInfo.bestaccessright = data[8].classid; + // } + + // if(data[9] != null) { + // this.publicationInfo.collectedFrom = this.parsingFunctions.parseCollectedFrom(data[9]); + // } + + this.publicationInfo.downloadFrom = this.parsingFunctions.addPublisherToDownloadFrom( + this.publicationInfo.downloadFrom, this.publicationInfo.publisher, + this.publicationInfo.journal, this.publicationInfo.identifiers, + this.publicationInfo.title); + + if(data[10] != null) { + this.publicationInfo.references = this.parseReferences(data[10]); + } + + if(data[11] != null) { + this.publicationInfo.contexts = this.parsingFunctions.parseContexts(data[11]); + } + + if(data[12] != null && data[12] == "under curation") { + this.publicationInfo.underCurationMessage = true; + } else { + this.publicationInfo.underCurationMessage = false; + } + + if(data[13] != null) { + if(this.publicationInfo.authors == undefined) { + this.publicationInfo.authors = new Array(); + } + + let authors = data[13]; + let length = Array.isArray(authors) ? authors.length : 1; + + for(let i=0; i(); + } + + let organization: { "name": string, "shortname": string, + "id": string, "websiteUrl": string, + "country": string, "trust": number + } = { + "name": "", "shortname": "", + "id": "", "websiteUrl": "", + "country": "", "trust": null + }; + + organization.id = relation['to'].content; + organization.name = relation.legalname; + organization.shortname = relation.legalshortname; + organization.websiteUrl = relation.websiteurl; + if(relation.country) { + organization.country = relation.country.classname; + } + if(relation.trust) { + organization.trust = Math.round(relation.trust*100); + } + + organizations.push(organization); + return organizations; + } + + parseBioentitiesAndSoftware(children: any) : [Map>, { "name": string, "url": string}[]] { + let bioentities: Map>; + let software: {"name": string, "url": string}[]; + + let length = Array.isArray(children['externalreference']) ? children['externalreference'].length : 1; + + let externalreference; + for(let i=0; i>(); + } + + if(!bioentities.has(externalreference.sitename)) { + bioentities.set(externalreference.sitename, new Map()); + } + bioentities.get(externalreference.sitename).set(externalreference.refidentifier, externalreference.url); + + } else if(externalreference['qualifier'].classid == "software") { + + if(software == undefined) { + software = new Array<{"name": string, "url": string}>(); + } + + software.push({"name": externalreference.sitename, "url": externalreference.url}); + } + } + } + + return [bioentities, software]; + } + + parseReferences(citations: any): {"name": string, "url": string}[] { + let references = new Array<{"name": string, "url": string}>(); + + let citation; + let length = Array.isArray(citations) ? citations.length : 1; + for(let i=0; i +
+
+ +
+ + + + + +
+
+ + {{softwareInfo.types.join(", ")}} + {{softwareInfo.title.accessMode}} + + + Record in preview + + + + +
+ + ({{softwareInfo.date}}) +
+ +
    +
  • Publisher: {{softwareInfo.publisher}}
  • + +
  • Embargo end date: {{softwareInfo.embargoEndDate}}
  • +
  • + +
  • +
  • + + +
  • +
+ +
+ {{softwareInfo.description}} +
+ + + + + + + + + + + +
+
+
+ No related research results available +
+
+
+
{{provenanceaction}}
+ + +
+
+
+ +
+
+ No similar research results available +
+
+ +
+
+
+ + + + + + + +
+ +
+
+ +
+
+ Share - Bookmark + +
+ + + + + +
+
+
+
+
+
diff --git a/portal-4cli/src/app/landingPages/software/software.component.ts b/portal-4cli/src/app/landingPages/software/software.component.ts new file mode 100644 index 00000000..9e2456b3 --- /dev/null +++ b/portal-4cli/src/app/landingPages/software/software.component.ts @@ -0,0 +1,172 @@ +import {Component, ViewChild, ElementRef} from '@angular/core'; +import {Observable} from 'rxjs/Observable'; +import {SoftwareService} from './software.service'; +import {SoftwareInfo} from '../../utils/entities/softwareInfo'; +import {ActivatedRoute, Router} from '@angular/router'; +import {OpenaireProperties} from '../../utils/properties/openaireProperties' +import {RouterHelper} from '../../utils/routerHelper.class'; +import { Meta} from '../../../angular2-meta'; +import {PiwikService} from '../../utils/piwik/piwik.service'; + +@Component({ + selector: 'software', + templateUrl: 'software.component.html', +}) + +export class SoftwareComponent { + public softwareInfo: SoftwareInfo; + public softwareId : string ; + + // APP BOX variables + public showAllCollectedFrom: boolean = false; + public showAllDownloadFrom: boolean = false; + public showAllPublishedIn: boolean = false; + + // Metrics tab variables + public metricsClicked: boolean; + public viewsFrameUrl: string; + public downloadsFrameUrl: string; + public totalViews: number; + public totalDownloads: number; + public pageViews: number; + + // Active tab variable for responsiveness + public activeTab: string = "Related Research Results"; + + // Map counting variable + public relatedResearchResultsNum: number = 0; + + // Message variables + public warningMessage = ""; + public errorMessage = ""; + public showLoading: boolean = true; + + public routerHelper:RouterHelper = new RouterHelper(); + + private result ; + sub: any; piwiksub: any; infoSub: any; + + constructor (private element: ElementRef, + private _softwareService: SoftwareService, + private _piwikService:PiwikService, + private route: ActivatedRoute, + private _meta: Meta, + private _router: Router) { + this.updateUrl(OpenaireProperties.getBaseLink()+this._router.url); + } + + ngOnInit() { + this.sub = this.route.queryParams.subscribe(params => { + this.softwareInfo = null; + this.updateTitle("Software"); + this.updateDescription("Software, search, open access"); + + this.softwareId = params['softwareId']; + console.info("Id is :"+this.softwareId); + + if(this.softwareId){ + this.getSoftwareInfo(this.softwareId); + }else{ + this.showLoading = false; + this.warningMessage="No valid software id"; + } + + this.metricsClicked = false; + + this.viewsFrameUrl = OpenaireProperties.getFramesAPIURL()+'merge.php?com=query&data=[{"query":"resRepoViews", "resTitle":"'+this.softwareId+'", "table":"","fields":[{"fld":"sum","agg":"sum","type":"column","yaxis":1,"c":false}],"xaxis":{"name":"month","agg":"sum"},"group":" ","color":"","type":"chart","size":30,"sort":"xaxis","xStyle":{"r":-30,"s":"0","l":"-","ft":"-","wt":"-"},"title":"","subtitle":"","xaxistitle":"Repository","yaxisheaders":["Monthly views"],"generalxaxis":"","theme":0,"in":[],"filters":[{"name":"","values":[""],"to":"-1"}]}]&info_types=["column"]&stacking=normal&steps=false&fontFamily=Courier&spacing=[5,0,0,0]&style=[{"color":"rgba(0, 0, 0, 1)","size":"18"},{"color":"rgba(0, 0, 0, 1)","size":"18"},{"color":"000000","size":""},{"color":"000000","size":""}]&backgroundColor=rgba(255,255,255,1)&colors[]=rgba(67, 67, 72, 1)&colors[]=rgba(144, 237, 125, 1)&colors[]=rgba(247, 163, 92, 1)&colors[]=rgba(128, 133, 233, 1)&colors[]=rgba(241, 92, 128, 1)&colors[]=rgba(228, 211, 84, 1)&colors[]=rgba(43, 144, 143, 1)&colors[]=rgba(244, 91, 91, 1)&colors[]=rgba(145, 232, 225, 1)&xlinew=0&ylinew=1&legends=true&tooltips=true&persistent=false'; + /*this.viewsFrameUrl = OpenaireProperties.getFramesAPIURL()+'merge.php?com=query&data=[{"query":"resViewsTimeline", "resTitle":"'+this.softwareId+'", "table":"","fields":[{"fld":"sum","agg":"sum","type":"column","yaxis":1,"c":false}],"xaxis":{"name":"month","agg":"sum"},"group":" ","color":"","type":"chart","size":30,"sort":"xaxis","xStyle":{"r":-30,"s":"0","l":"-","ft":"-","wt":"-"},"title":"","subtitle":"","xaxistitle":"Repository","yaxisheaders":["Monthly views"],"generalxaxis":"","theme":0,"in":[],"filters":[{"name":"","values":[""],"to":"-1"}]}]&info_types=["column"]&stacking=normal&steps=false&fontFamily=Courier&spacing=[5,0,0,0]&style=[{"color":"rgba(0, 0, 0, 1)","size":"18"},{"color":"rgba(0, 0, 0, 1)","size":"18"},{"color":"000000","size":""},{"color":"000000","size":""}]&backgroundColor=rgba(255,255,255,1)&colors[]=rgba(124, 181, 236, 1)&colors[]=rgba(67, 67, 72, 1)&colors[]=rgba(144, 237, 125, 1)&colors[]=rgba(247, 163, 92, 1)&colors[]=rgba(128, 133, 233, 1)&colors[]=rgba(241, 92, 128, 1)&colors[]=rgba(228, 211, 84, 1)&colors[]=rgba(43, 144, 143, 1)&colors[]=rgba(244, 91, 91, 1)&colors[]=rgba(145, 232, 225, 1)&xlinew=0&ylinew=1&legends=true&tooltips=true&persistent=false'; + */ + + this.downloadsFrameUrl = OpenaireProperties.getFramesAPIURL()+'merge.php?com=query&data=[{"query":"resRepoDownloads", "resTitle":"'+this.softwareId+'", "table":"","fields":[{"fld":"sum","agg":"sum","type":"column","yaxis":1,"c":false}],"xaxis":{"name":"month","agg":"sum"},"group":" ","color":"","type":"chart","size":30,"sort":"xaxis","xStyle":{"r":-30,"s":"0","l":"-","ft":"-","wt":"-"},"title":"","subtitle":"","xaxistitle":"Repository","yaxisheaders":["Monthly downloads"],"generalxaxis":"","theme":0,"in":[],"filters":[{"name":"","values":[""],"to":"-1"}]}]&info_types=["column"]&stacking=normal&steps=false&fontFamily=Courier&spacing=[5,0,0,0]&style=[{"color":"rgba(0, 0, 0, 1)","size":"18"},{"color":"rgba(0, 0, 0, 1)","size":"18"},{"color":"000000","size":""},{"color":"000000","size":""}]&backgroundColor=rgba(255,255,255,1)&colors[]=rgba(67, 67, 72, 1)&colors[]=rgba(144, 237, 125, 1)&colors[]=rgba(247, 163, 92, 1)&colors[]=rgba(128, 133, 233, 1)&colors[]=rgba(241, 92, 128, 1)&colors[]=rgba(228, 211, 84, 1)&colors[]=rgba(43, 144, 143, 1)&colors[]=rgba(244, 91, 91, 1)&colors[]=rgba(145, 232, 225, 1)&xlinew=0&ylinew=1&legends=true&tooltips=true&persistent=false'; + /*this.downloadsFrameUrl = OpenaireProperties.getFramesAPIURL()+'merge.php?com=query&data=[{"query":"resRepoDownloadTimeline", "resTitle":"'+this.softwareId+'", "table":"","fields":[{"fld":"sum","agg":"sum","type":"column","yaxis":1,"c":false}],"xaxis":{"name":"month","agg":"sum"},"group":" ","color":"","type":"chart","size":30,"sort":"xaxis","xStyle":{"r":-30,"s":"0","l":"-","ft":"-","wt":"-"},"title":"","subtitle":"","xaxistitle":"Repository","yaxisheaders":["Monthly downloads"],"generalxaxis":"","theme":0,"in":[],"filters":[{"name":"","values":[""],"to":"-1"}]}]&info_types=["column"]&stacking=normal&steps=false&fontFamily=Courier&spacing=[5,0,0,0]&style=[{"color":"rgba(0, 0, 0, 1)","size":"18"},{"color":"rgba(0, 0, 0, 1)","size":"18"},{"color":"000000","size":""},{"color":"000000","size":""}]&backgroundColor=rgba(255,255,255,1)&colors[]=rgba(67, 67, 72, 1)&colors[]=rgba(144, 237, 125, 1)&colors[]=rgba(247, 163, 92, 1)&colors[]=rgba(128, 133, 233, 1)&colors[]=rgba(241, 92, 128, 1)&colors[]=rgba(228, 211, 84, 1)&colors[]=rgba(43, 144, 143, 1)&colors[]=rgba(244, 91, 91, 1)&colors[]=rgba(145, 232, 225, 1)&xlinew=0&ylinew=1&legends=true&tooltips=true'; + */ + if (typeof document !== 'undefined') { + this.element.nativeElement.scrollIntoView(); + } + }); + + } + + ngOnDestroy() { + this.sub.unsubscribe(); + if(this.piwiksub){ + this.piwiksub.unsubscribe(); + } + if(this.infoSub) { + this.infoSub.unsubscribe(); + } + } + + private getSoftwareInfo(id:string) { + this.warningMessage = ''; + this.errorMessage="" + this.showLoading = true; + + this.infoSub = this._softwareService.getSoftwareInfo(id).subscribe( + data => { + this.softwareInfo = data; + this.updateTitle(this.softwareInfo.title.name); + this.updateDescription("Software, search, repositories, open access,"+this.softwareInfo.title.name); + if(OpenaireProperties.isPiwikTrackEnabled() && (typeof document !== 'undefined')){ + this.piwiksub = this._piwikService.trackView(this.softwareInfo.title.name).subscribe(); + } + + this.result = [] + this.result = {id: id, type :"software", source : "openaire", title: this.softwareInfo.title,url: '', result: '', accessRights: this.softwareInfo.title.accessMode, embargoEndDate: ''}; + + let relatedResearchResultsNum = 0; + if(this.softwareInfo.relatedResearchResults != undefined) { + this.softwareInfo.relatedResearchResults.forEach(function (value, key, map) { + relatedResearchResultsNum += value.length; + }); + } + this.relatedResearchResultsNum = relatedResearchResultsNum; + + this.showLoading = false; + }, + err => { + console.log(err) + console.info("error"); + + this.errorMessage = 'No software found'; + this.showLoading = false; + } + ); + } + + // showChange($event) { + // this.showAllReferences=$event.value; + // } + + public metricsResults($event) { + this.totalViews = $event.totalViews; + this.totalDownloads = $event.totalDownloads; + this.pageViews = $event.pageViews; + } + + private updateDescription(description:string){ + this._meta.updateMeta("description", description); + this._meta.updateProperty("og:description", description); + } + private updateTitle(title:string){ + var _prefix ="OpenAIRE | "; + var _title = _prefix + ((title.length> 50 ) ?title.substring(0,50):title); + this._meta.setTitle(_title ); + this._meta.updateProperty("og:title",_title); + } + private updateUrl(url:string){ + this._meta.updateProperty("og:url", url); + } + + public buildCurationTooltip() { + let tooltipContent: string = "
"; + + tooltipContent += "

Record in preview

"; + tooltipContent += "

Bibliographic record accepted by the system, but not yet processed by
OpenAIRE tools for information quality improvement and de-duplication

"; + + return tooltipContent; + } + public getKeys( map) { + return Array.from(map.keys()); + } +} diff --git a/portal-4cli/src/app/landingPages/software/software.module.ts b/portal-4cli/src/app/landingPages/software/software.module.ts new file mode 100644 index 00000000..572909d3 --- /dev/null +++ b/portal-4cli/src/app/landingPages/software/software.module.ts @@ -0,0 +1,36 @@ +//import {MaterialModule} from '@angular/material'; +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import { RouterModule } from '@angular/router'; + +import { SoftwareService } from './software.service'; +import { SoftwareComponent } from './software.component'; +import { SoftwareRoutingModule } from './software-routing.module'; +import { MetricsModule } from '../landing-utils/metrics.module'; +import { IFrameModule } from '../../utils/iframe.module'; +import { AltMetricsModule } from '../../utils/altmetrics.module'; +import { CiteThisModule } from '../landing-utils/citeThis/citeThis.module'; +import { PagingModule } from '../../utils/paging.module'; + +import { ResultLandingModule } from '../landing-utils/resultLanding.module'; +import { LandingModule } from '../landing-utils/landing.module'; +import { FreeGuard } from'../../login/freeGuard.guard'; + +@NgModule({ + imports: [ + CommonModule, FormsModule, LandingModule, RouterModule, CiteThisModule, PagingModule, + ResultLandingModule, SoftwareRoutingModule, IFrameModule, MetricsModule, AltMetricsModule + ], + declarations: [ + SoftwareComponent + ], + providers:[ + SoftwareService, FreeGuard + ], + exports: [ + SoftwareComponent + ] +}) +export class SoftwareModule { } diff --git a/portal-4cli/src/app/landingPages/software/software.service.ts b/portal-4cli/src/app/landingPages/software/software.service.ts new file mode 100644 index 00000000..118a92cd --- /dev/null +++ b/portal-4cli/src/app/landingPages/software/software.service.ts @@ -0,0 +1,220 @@ +import {Injectable} from '@angular/core'; +import {Http, Response} from '@angular/http'; +import {Observable} from 'rxjs/Observable'; +import {SoftwareInfo} from '../../utils/entities/softwareInfo'; +import {OpenaireProperties} from '../../utils/properties/openaireProperties'; +import 'rxjs/add/observable/of'; +import 'rxjs/add/operator/do'; +import 'rxjs/add/operator/share'; + +import { ParsingFunctions } from '../landing-utils/parsingFunctions.class'; + +@Injectable() +export class SoftwareService { + + constructor(private http: Http ) { + this.parsingFunctions = new ParsingFunctions(); + } + + public parsingFunctions: ParsingFunctions; + softwareInfo: SoftwareInfo; + + getSoftwareInfo (id: string):any { + console.info("getSoftwareInfo in service"); + + let url = OpenaireProperties. getSearchAPIURLLast()+'software/'+id+"?format=json"; + let key = url; + + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()) + .do(res => console.info(res['result']['metadata']['oaf:entity'])) + .map(res => [res['result']['header']['dri:status'], res['result']['metadata']['oaf:entity']['oaf:result']]) + .map(res => [res[1], + res[1]['title'], + res[1]['rels']['rel'], + res[1]['children'], + res[1]['pid'], + res[1]['subject'], + res[1]['bestaccessright'], + res[1]['collectedfrom'], + res[1]['context'], + //res[1]['resulttype'], + res[0], + res[1]['creator'] + ]).map(res => this.parseSoftwareInfo(res)); + } + + private handleError (error: Response) { + // in a real world app, we may send the error to some remote logging infrastructure + // instead of just logging it to the console + console.log(error); + return Observable.throw(error || 'Server error'); + } + + parseSoftwareInfo (data: any):any { + this.softwareInfo = new SoftwareInfo(); + + if(data[0] != null) { + var date:string = (data[0].dateofacceptance)+""; // transform to string in case it is an integer + this.softwareInfo.date = (date && (date).indexOf('-') !== -1)?date.split('-')[0]:date; + this.softwareInfo.dateofacceptance = data[0].dateofacceptance; + this.softwareInfo.publisher = data[0].publisher; + if(!Array.isArray(data[0].description)) { + this.softwareInfo.description = data[0].description; + } else { + this.softwareInfo.description = data[0].description[0]; + } + this.softwareInfo.embargoEndDate = data[0].embargoenddate; + } + this.softwareInfo.title = {"name": "", "url": "", "accessMode": ""}; + if(data[0]['bestaccessright'].hasOwnProperty("classid")) { + this.softwareInfo.title.accessMode = data[0]['bestaccessright'].classid; + } + if(data[1] != null) { + if(Array.isArray(data[1])) { + this.softwareInfo.title['name'] = data[1][0].content; + } else { + this.softwareInfo.title['name'] = data[1].content; + } + } + + if(data[2] != null) { + let relation; + let length = data[2].length!=undefined ? data[2].length : 1; + + for(let i=0; i(); + this.softwareInfo.publishedIn = new Map() + + this.softwareInfo.types = new Array(); + let types = new Set(); + + let counter = 0; + let instance; + + let length = data[3]['instance'].length!=undefined ? data[3]['instance'].length : 1; + + for(let i=0; i, Map] = this.parsingFunctions.parseAllSubjects(data[5]); + this.softwareInfo.subjects = subjectResults[0]; + this.softwareInfo.otherSubjects = subjectResults[1]; + this.softwareInfo.classifiedSubjects = subjectResults[2]; + } + + // if(data[6] != null) { + // this.softwareInfo.bestaccessright = data[6].classid; + // } + + // if(data[7] != null) { + // this.softwareInfo.collectedFrom = this.parsingFunctions.parseCollectedFrom(data[7]); + // } + + // null argument is for journal + this.softwareInfo.downloadFrom = this.parsingFunctions.addPublisherToDownloadFrom( + this.softwareInfo.downloadFrom, this.softwareInfo.publisher, + null, this.softwareInfo.identifiers, this.softwareInfo.title); + + if(data[8] != null) { + this.softwareInfo.contexts = this.parsingFunctions.parseContexts(data[8]); + } + + // if(data[9] != null && this.softwareInfo.type == undefined) { + // if(data[9].hasOwnProperty('classname')) { + // this.softwareInfo.type = data[9].classname; + // } + // } + + if(data[9] != null && data[9] == "under curation") { + this.softwareInfo.underCurationMessage = true; + } else { + this.softwareInfo.underCurationMessage = false; + } + + if(data[10] != null) { + if(this.softwareInfo.authors == undefined) { + this.softwareInfo.authors = new Array(); + } + + let authors = data[10]; + let length = Array.isArray(authors) ? authors.length : 1; + + for(let i=0; i | boolean { + var user; + var loggedIn = false; + var isAdmin = false; + var errorCode = ErrorCodes.NOT_LOGGIN; + + if(Session.isLoggedIn()){ + loggedIn = true; + if(!Session.isValidAndRemove()){ + loggedIn = false; + errorCode = ErrorCodes.NOT_VALID; + }else { + isAdmin = Session.isAdminUser(); + if(!isAdmin){ + errorCode = ErrorCodes.NOT_ADMIN; + } + } + }else{ + errorCode =ErrorCodes.NOT_LOGGIN; + } + + if(!loggedIn){ + // this.guardHelper.redirect("/user-info",errorCode,state.url); + this.router.navigate(['/user-info'], { queryParams: { "errorCode": errorCode, "redirectUrl": state.url } }); + + return false; + }else if(!isAdmin){ + // this.guardHelper.redirect("/user-info",errorCode,state.url); + this.router.navigate(['/user-info'], { queryParams: { "errorCode": errorCode, "redirectUrl": state.url } }); + return false; + }else{ + return true; + } + } +} diff --git a/portal-4cli/src/app/login/freeGuard.guard.ts b/portal-4cli/src/app/login/freeGuard.guard.ts new file mode 100644 index 00000000..316ff266 --- /dev/null +++ b/portal-4cli/src/app/login/freeGuard.guard.ts @@ -0,0 +1,36 @@ +import { Injectable } from '@angular/core'; +import { Router,CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot} from '@angular/router'; +import {Observable} from 'rxjs/Observable'; +import {Session} from './utils/helper.class'; +import {ErrorCodes} from './utils/guardHelper.class'; + +@Injectable() +export class FreeGuard implements CanActivate { + + constructor(private router: Router) {} + + canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable | boolean { + var user; + var valid = true; + var loggedIn = false; + var errorCode = ErrorCodes.NOT_LOGGIN; + + if(Session.isLoggedIn()){ + loggedIn = true; + if(!Session.isValidAndRemove()){ + loggedIn = false; + valid = false; + errorCode = ErrorCodes.NOT_VALID; + } + } + + if(!valid){ + // this.guardHelper.redirect("/user-info",errorCode,state.url); + + this.router.navigate(['/user-info'], { queryParams: { "errorCode": errorCode, "redirectUrl": state.url } }); + return false; + } + return true; + + } +} diff --git a/portal-4cli/src/app/login/loginGuard.guard.ts b/portal-4cli/src/app/login/loginGuard.guard.ts new file mode 100644 index 00000000..59999519 --- /dev/null +++ b/portal-4cli/src/app/login/loginGuard.guard.ts @@ -0,0 +1,33 @@ +import { Injectable } from '@angular/core'; +import { Router,CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot} from '@angular/router'; +import {Observable} from 'rxjs/Observable'; +import {Session} from './utils/helper.class'; +import {ErrorCodes} from './utils/guardHelper.class'; + +@Injectable() +export class LoginGuard implements CanActivate { + + constructor(private router: Router) {} + + canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable | boolean { + var user; + var loggedIn = false; + var errorCode = ErrorCodes.NOT_LOGGIN; + if(Session.isLoggedIn()){ + loggedIn = true; + if(!Session.isValidAndRemove()){ + loggedIn = false; + errorCode = ErrorCodes.NOT_VALID; + } + }else{ + errorCode = ErrorCodes.NOT_LOGGIN; + } + if(!loggedIn){ + // this.guardHelper.redirect("/user-info",errorCode,state.url); + this.router.navigate(['/user-info'], { queryParams: { "errorCode": errorCode, "redirectUrl": state.url } }); + return false; + }else{ + return true; + } + } +} diff --git a/portal-4cli/src/app/login/user-routing.module.ts b/portal-4cli/src/app/login/user-routing.module.ts new file mode 100644 index 00000000..6bbadb82 --- /dev/null +++ b/portal-4cli/src/app/login/user-routing.module.ts @@ -0,0 +1,15 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import { UserComponent } from './user.component'; +import {PreviousRouteRecorder} from '../utils/piwik/previousRouteRecorder.guard'; + +@NgModule({ + imports: [ + RouterModule.forChild([ + { path: '', component: UserComponent, canDeactivate: [PreviousRouteRecorder]}, + + ]) + ] +}) +export class UserRoutingModule { } diff --git a/portal-4cli/src/app/login/user.component.html b/portal-4cli/src/app/login/user.component.html new file mode 100644 index 00000000..fc699009 --- /dev/null +++ b/portal-4cli/src/app/login/user.component.html @@ -0,0 +1,54 @@ + +
+
+
+ +
+ + + +
+ The requested page requires authentication. Please sign in. + + Sign in + +
+
+ You are not authorized to use the requested page +
+
+ The session has expired. Please sign in again or continue browsing as a guest. + + Sign in + +
+
{{errorMessage}}
+ +
+
+ Hello {{user.fullname}}! +
+ +
+
+
+
+
diff --git a/portal-4cli/src/app/login/user.component.ts b/portal-4cli/src/app/login/user.component.ts new file mode 100644 index 00000000..2babc40e --- /dev/null +++ b/portal-4cli/src/app/login/user.component.ts @@ -0,0 +1,119 @@ +import {Component, ElementRef} from '@angular/core'; +import {Observable} from 'rxjs/Observable'; +import {ActivatedRoute, Router} from '@angular/router'; + +// import {LoginService} from './login.service'; +import {User,Session} from './utils/helper.class'; +import {RouterHelper} from '../utils/routerHelper.class'; +import { Meta} from '../../angular2-meta'; +import {OpenaireProperties} from '../utils/properties/openaireProperties'; + +@Component({ + selector: 'user', + templateUrl: 'user.component.html' + }) + +export class UserComponent { + public user: User; + public loggedIn: boolean = false; + public server: boolean = true; + public errorMessage: string; + public username: string = ""; + public password: string = ""; + private sub:any;private sublogin:any; + public errorCode: string = ""; + public redirectUrl: string = ""; + public routerHelper:RouterHelper = new RouterHelper(); + public loginUrl= OpenaireProperties.getLoginURL(); + + constructor( private router: Router, + private route: ActivatedRoute, private _meta: Meta ) { + this._meta.setTitle("OpenAIRE | Login"); + } + + ngOnInit() { + if( typeof document !== 'undefined') { + this.server = false; + } + this.loggedIn = Session.isLoggedIn(); + this.user = Session.getUser(); + this.errorMessage = ""; + this.sub = this.route.queryParams.subscribe(params => { + this.errorCode = params["errorCode"]; + this.redirectUrl = params["redirectUrl"]; + this.loggedIn = Session.isLoggedIn(); + this.user = Session.getUser(); + this.errorMessage = ""; + if(this.loggedIn){ + this.redirect(); + } + }); + } + ngOnDestroy(){ + this.sub.unsubscribe(); + if(this.sublogin){ + this.sublogin.unsubscribe(); + } + } + logout(){ + if(Session.isLoggedIn()){ + Session.removeUser(); + } + this.loggedIn = false; + this.user = new User(); + this.username = ""; + this.password = ""; + this.redirect(); + + } + redirect(){ + if(this.redirectUrl && this.redirectUrl != null && this.redirectUrl != ""){ + this.redirectUrl = decodeURIComponent(this.redirectUrl); + var baseUrl = this.redirectUrl; + var queryParams = ""; + var paramsArray =[]; + var valuesArray =[]; + if(this.redirectUrl.indexOf('?') != -1){ + baseUrl = this.redirectUrl.split('?')[0]; + queryParams = this.redirectUrl.split('?')[1]; + } + if(queryParams != ""){ + var queryParamsArray = queryParams.split('&'); + for(var i = 0; i < queryParamsArray.length; i++){ + paramsArray.push(queryParamsArray[i].split("=")[0]); + valuesArray.push(queryParamsArray[i].split("=")[1]); + } + this.router.navigate([baseUrl], { queryParams: this.routerHelper.createQueryParams(paramsArray,valuesArray)}); + }else{ + this.router.navigate([baseUrl]); + } + }else{ + this.router.navigate(['/']); + } + } + // login() { + // this.sublogin =this._loginService.authenticate(/*this.user*/this.username, this.password).subscribe( + // data => { + // this.user = data; + // this.loggedIn = true; + // this.username = ""; + // this.password = ""; + // this.errorCode = ""; + // this.redirect(); + // + // }, + // err => { + // console.log(err); + // if(err.status == "404") { + // this.errorMessage = "Wrong username"; + // } else if(err.status == "401") { + // this.errorMessage = "Wrong password"; + // } + // this.username = ""; + // this.password = ""; + // this.errorCode = ""; + // + // } + // ); + // } +} diff --git a/portal-4cli/src/app/login/user.module.ts b/portal-4cli/src/app/login/user.module.ts new file mode 100644 index 00000000..f306984c --- /dev/null +++ b/portal-4cli/src/app/login/user.module.ts @@ -0,0 +1,22 @@ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import {UserComponent } from './user.component'; +import { UserRoutingModule } from './user-routing.module'; +import {PreviousRouteRecorder} from '../utils/piwik/previousRouteRecorder.guard'; + +// import {LoginService} from './login.service'; +@NgModule({ + imports: [ + CommonModule, FormsModule, + UserRoutingModule + + ], + providers:[PreviousRouteRecorder], + declarations: [ +UserComponent + +] +}) +export class UserModule { } diff --git a/portal-4cli/src/app/login/userMini.component.ts b/portal-4cli/src/app/login/userMini.component.ts new file mode 100644 index 00000000..9a122516 --- /dev/null +++ b/portal-4cli/src/app/login/userMini.component.ts @@ -0,0 +1,140 @@ +import {Component, ElementRef, Input} from '@angular/core'; +import {Observable} from 'rxjs/Observable'; +import {ActivatedRoute, Router} from '@angular/router'; +import {Location} from '@angular/common'; +// import {LoginService} from './login.service'; +import {User,Session} from './utils/helper.class'; +import {RouterHelper} from '../utils/routerHelper.class'; +import {OpenaireProperties} from '../utils/properties/openaireProperties'; +import {StringUtils} from '../utils/string-utils.class'; + +@Component({ + selector: 'user-mini', + template: ` + + +
  • + + + {{user.fullname+" "}} + + + Sign in | Register + + + + +
  • + + ` +}) + +export class UserMiniComponent { + public user: User; + public loggedIn: boolean = false; + public isAuthorized: boolean = false; + @Input() public mobileView:boolean = false ; + public server: boolean = true; + public routerHelper:RouterHelper = new RouterHelper(); + + public redirectUrl: string = ""; + private baseUrl = "user-info"; + sub:any; + constructor( private router: Router, private route: ActivatedRoute, private location: Location) {} + + ngOnInit() { + if( typeof document !== 'undefined') { + this.server = false; + } + this.initialize(); + this.sub = this.route.queryParams.subscribe(params => { + this.initialize(); + }); + } + ngOnDestroy(){ + this.sub.unsubscribe(); + } + initialize(){ + this.redirectUrl = this.location.path(); + if(Session.isLoggedIn()){ + if(Session.isUserValid()){ + this.loggedIn = Session.isLoggedIn(); + this.user = Session.getUser(); + if(Session.isAdminUser()){ + this.isAuthorized = true; + }else { + this.isAuthorized = false; + } + + }else{ + Session.removeUser(); + this.loggedIn = false; + this.isAuthorized = false; + this.user = null; + } + }else { + this.loggedIn = false; + this.isAuthorized = false; + this.user = null; + } + + } + gotoUserPage(){ + this.redirectUrl = this.location.path(); + if(this.redirectUrl && this.redirectUrl != null && this.redirectUrl != "" && this.redirectUrl !="user-info"){ + this.router.navigate([this.baseUrl], { queryParams: this.routerHelper.createQueryParam("redirectUrl",this.redirectUrl )}); + }else{ + this.router.navigate([this.baseUrl]); + } + } + logOut(){ + if(Session.isLoggedIn()){ + Session.removeUser(); + console.log("Redirect to "+location.href); + window.location.href = OpenaireProperties.getLogoutURL()+ StringUtils.URIEncode(location.href); + + } + this.loggedIn = false; + this.isAuthorized = false; + this.user = new User(); + } + + logIn(){ + Session.setCurrentUrl(location.pathname); + Session.setCurrentParameters(location.search); + window.location.href = OpenaireProperties.getLoginURL(); + } + + onClick(id: string) { + var el: HTMLElement = document.getElementById(id); + el.classList.remove('uk-open'); + } + +} diff --git a/portal-4cli/src/app/login/utils/guardHelper.class.ts b/portal-4cli/src/app/login/utils/guardHelper.class.ts new file mode 100644 index 00000000..2bee44e6 --- /dev/null +++ b/portal-4cli/src/app/login/utils/guardHelper.class.ts @@ -0,0 +1,19 @@ + +import { Router} from '@angular/router'; + +// export class GuardHelper{ +// constructor(private router: Router) {} +// +// redirect(url:string, errorCode:number, redirectUrl:string){ +// this.router.navigate([url], { queryParams: { "errorCode": errorCode, "redirectUrl": redirectUrl } }); +// +// } +// +// } +export class ErrorCodes { + public static NOT_LOGGIN:number =1; + public static NOT_ADMIN:number =2; + public static NOT_VALID:number =3; + +} + diff --git a/portal-4cli/src/app/login/utils/helper.class.ts b/portal-4cli/src/app/login/utils/helper.class.ts new file mode 100644 index 00000000..779d78f3 --- /dev/null +++ b/portal-4cli/src/app/login/utils/helper.class.ts @@ -0,0 +1,253 @@ +import {StringUtils} from '../../utils/string-utils.class'; +import {OpenaireProperties} from '../../utils/properties/openaireProperties'; + + +export class User { + email:string; + firstname: string; + lastname: string; + id: string; + fullname: string; + expirationDate: number; + role:string[]; + jwt:string; + +} + +export class Session{ + // public static setUser(user:User): User { + // + // localStorage.setItem("user", JSON.stringify(user)); + // + // return user; + // } + public static removeUser() { + if(Session.isLoggedIn()){ + localStorage.removeItem("user"); + COOKIE.deleteCookie(COOKIE.cookieName_id) + } + } + public static getUser():User { + if(Session.isLoggedIn()){ + return JSON.parse(localStorage.getItem("user")); + }else{ + return null; + } + } + public static isLoggedIn(): boolean { + var loggedIn:boolean = false; + var user:User = null; + var cookie= COOKIE.getCookie(COOKIE.cookieName_u); + if( typeof localStorage !== 'undefined') { + if(localStorage.getItem("user")) { + user = JSON.parse(localStorage.getItem("user")); + if(user && (user.fullname != null || user.lastname !=null || user.firstname !=null)){ + + loggedIn = true; + }else if(cookie != null && this.getUserFromCookie()!= null){ + loggedIn = true + }else{ + loggedIn = false; + } + }else{ + if(cookie != null && this.getUserFromCookie()!= null){ + loggedIn = true + }else{ + loggedIn = false; + } + + } + }else{ + loggedIn = false; + } + return loggedIn; + } + public static getUserFromCookie():User{ + var cookie= COOKIE.getCookie(COOKIE.cookieName_u); + if(cookie != null){ + var user:User = MyJWT.parseUserInfo(cookie); + if( typeof localStorage !== 'undefined') { + localStorage.setItem("user", JSON.stringify(user)); + if(user && user.email && Session.isRegisteredUser()){ + COOKIE.deleteCookie(COOKIE.cookieName_u); // delete cookie to avoid transfer through requests + return user; + }else{ + return null; + } + }else{ + return null; + } + }else{ + return null; + } + } + public static getUserJwt():string { + if(Session.isLoggedIn()){ + return Session.getUser().jwt; + }else{ + return null; + } + + } + public static getUserEmail():string { + if(Session.isLoggedIn()){ + return Session.getUser().email; + }else{ + return null; + } + + } + public static getCurrentUrl():string { + if( typeof localStorage !== 'undefined') { + return localStorage.getItem("url"); + } + return ""; + + } + public static setCurrentUrl(url:string) { + if( typeof localStorage !== 'undefined') { + localStorage.setItem("url", url); + } + } + public static getCurrentParameters():any { + if( typeof localStorage !== 'undefined') { + var params = localStorage.getItem("params"); + var object = null; + if(params.split("&").length > 0){ + object = {}; + } + for(var i=0; i 1)? params.substring(1):""); + } + } + public static isAdminUser():boolean { + var isAdmin = false; + if(Session.isLoggedIn()){ + var claimRoles = ["urn:mace:openminted.eu:aai.openminted.eu:group:OpenAIRE+Curator+-+Claim","urn:mace:openminted.eu:aai.openminted.eu:group:OpenAIRE+Portal+Administrator"] + console.log(Session.getUser().role); + for (var i = 0; i < claimRoles.length; i++) { + if ((Session.getUser().role).indexOf(claimRoles[i]) > -1) { + isAdmin = true; + break; + } + } + // console.log("Is admin:"+ isAdmin) + return (isAdmin); + } + // console.log("Is admin:"+ isAdmin) + return (isAdmin); + } + public static isRegisteredUser():boolean { + var isRegisteredUser = false; + if(Session.isLoggedIn()){ + var claimRoles = ["urn:mace:openminted.eu:aai.openminted.eu:group:Registered+User"]; + for (var i = 0; i < claimRoles.length; i++) { + console.log(Session.getUser().role); + if ((Session.getUser().role).indexOf(claimRoles[i]) > -1) { + isRegisteredUser = true; + break; + } + } + // console.log("Is isRegisteredUser:"+ isRegisteredUser) + return (isRegisteredUser); + } + // console.log("Is isRegisteredUser:"+ isRegisteredUser) + return (isRegisteredUser); + } + public static isUserValid() { + if(Session.isLoggedIn()){ + var expires = Session.getUser().expirationDate; + var now = new Date().getTime() / 1000; + // console.log(" is still valid ? "+(now +0 < expires) +" Remaining:"+ (expires - (now+0))+ " now is:"+now + "expires at:"+expires); + return now +0 < expires; + } + return false; + } + public static isValidAndRemove() { + if(Session.isLoggedIn()){ + if(!Session.isUserValid()){ + Session.removeUser(); + return false; + }else{ + return true; + } + }else{ + return false; + } + } + +} +export class MyJWT{ + private static validateJWTFormat(data){ + if(data != null && (data.indexOf(".") !=-1 && data.split('.').length == 3)){ + return true; + } + return false; + } + private static getPayload(data){ + var payload = data.split('.')[1]; + return StringUtils.b64DecodeUnicode(payload); + } + public static parseUserInfo(data: any): User { + if(this.validateJWTFormat(data)){ + var info = JSON.parse(this.getPayload(data)); + }else{ + return null; + } + var user: User = new User(); + + user.firstname = (StringUtils.URIDecode(info.firstname)).replace("+"," "); + user.lastname = (StringUtils.URIDecode(info.lastname)).replace("+"," "); + user.email = info.email; + // user.id = info.userId; + user.fullname = (StringUtils.URIDecode(info.fullname)).replace("+"," "); + user.role =JSON.parse( StringUtils.URIDecode(info.role)); + // console.log("User Role is:"); + // console.log(user.role) + user.jwt = data; + user.expirationDate = info.exp; + localStorage.setItem("user", JSON.stringify(user)); + return user; + } + +} + export class COOKIE{ + public static cookieName_u:string="XCsrfToken"; + public static cookieName_id:string="AccessToken"; + + public static getCookie(name: string) : string { + if(typeof document == 'undefined'){ + return null; + } + let ca: Array = document.cookie.split(';'); + let caLen: number = ca.length; + let cookieName = `${name}=`; + let c: string; + + for (let i: number = 0; i < caLen; i += 1) { + c = ca[i].replace(/^\s+/g, ''); + if (c.indexOf(cookieName) == 0) { + return c.substring(cookieName.length, c.length); + } + } + return null; + } + public static deleteCookie(name) { + this.setCookie(name, '', -1); + } + public static setCookie(name: string, value: string, expireDays: number, path: string = '/') { + let d:Date = new Date(); + d.setTime(d.getTime() + expireDays * 24 * 60 * 60 * 1000); + let expires:string = `expires=${d.toUTCString()}`; + // let cpath:string = path ? `; path=${path}` : ''; + document.cookie = name+'='+value+'; path='+path+'; domain='+OpenaireProperties.getCookieDomain()+';'; + } +} diff --git a/portal-4cli/src/app/reload/reload-routing.module.ts b/portal-4cli/src/app/reload/reload-routing.module.ts new file mode 100644 index 00000000..f304da05 --- /dev/null +++ b/portal-4cli/src/app/reload/reload-routing.module.ts @@ -0,0 +1,16 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import{ReloadComponent} from './reload.component'; +import {FreeGuard} from'../login/freeGuard.guard'; +import {PreviousRouteRecorder} from '../utils/piwik/previousRouteRecorder.guard'; + +@NgModule({ + imports: [ + RouterModule.forChild([ + { path: '', component: ReloadComponent, canActivate: [FreeGuard], canDeactivate: [PreviousRouteRecorder] } + + ]) + ] +}) +export class ReloadRoutingModule { } diff --git a/portal-4cli/src/app/reload/reload.component.ts b/portal-4cli/src/app/reload/reload.component.ts new file mode 100644 index 00000000..eac98f96 --- /dev/null +++ b/portal-4cli/src/app/reload/reload.component.ts @@ -0,0 +1,53 @@ +import {Component, Input, Output, EventEmitter, ViewChild} from '@angular/core'; +import {Observable} from 'rxjs/Observable'; +import {ActivatedRoute, Router} from '@angular/router'; +import {Location} from '@angular/common'; + +import {OpenaireProperties} from '../utils/properties/openaireProperties'; +import {ErrorCodes} from '../utils/properties/openaireProperties'; +import {RouterHelper} from '../utils/routerHelper.class'; +import {Session} from '../login/utils/helper.class'; + +@Component({ + selector: 'reload', + template: ` +
    +
    +
    +
    + Go to initial page.... +
    +
    +
    +
    + ` +}) +export class ReloadComponent { + + constructor ( + private route: ActivatedRoute, + private _router: Router, + private location: Location + ) { + + } + + public ngOnInit() { + + var url = Session.getCurrentUrl(); + if(url && url != null && url != ""){ + Session.setCurrentUrl(""); + var paramsObject = Session.getCurrentParameters(); + Session.setCurrentParameters(""); + if(paramsObject && paramsObject != null){ + this._router.navigate([url],{ queryParams: paramsObject}); + }else{ + this._router.navigate([url]); + } + }else{ + this._router.navigate(['/']); + + } + } + +} diff --git a/portal-4cli/src/app/reload/reload.module.ts b/portal-4cli/src/app/reload/reload.module.ts new file mode 100644 index 00000000..2b7e8469 --- /dev/null +++ b/portal-4cli/src/app/reload/reload.module.ts @@ -0,0 +1,29 @@ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { RouterModule } from '@angular/router'; + +import{ReloadRoutingModule } from './reload-routing.module'; +import{ReloadComponent} from './reload.component'; + + + import {FreeGuard} from'../login/freeGuard.guard'; +import {PreviousRouteRecorder} from '../utils/piwik/previousRouteRecorder.guard'; + +@NgModule({ + imports: [ + CommonModule, FormsModule, RouterModule, + ReloadRoutingModule + + ], + declarations: [ + ReloadComponent + ], + providers:[ + FreeGuard, PreviousRouteRecorder + ], + exports: [ + ReloadComponent + ] +}) +export class ReloadModule { } diff --git a/portal-4cli/src/app/searchPages/advanced/advancedSearchDataProviders-routing.module.ts b/portal-4cli/src/app/searchPages/advanced/advancedSearchDataProviders-routing.module.ts new file mode 100644 index 00000000..1225ed7a --- /dev/null +++ b/portal-4cli/src/app/searchPages/advanced/advancedSearchDataProviders-routing.module.ts @@ -0,0 +1,18 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import {PreviousRouteRecorder} from '../../utils/piwik/previousRouteRecorder.guard'; +import{AdvancedSearchDataProvidersComponent} from './advancedSearchDataProviders.component'; +import {FreeGuard} from'../../login/freeGuard.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + RouterModule.forChild([ + { path: '', component: AdvancedSearchDataProvidersComponent, canActivate: [FreeGuard, IsRouteEnabled], data: { + redirect: '/error' + }, canDeactivate: [PreviousRouteRecorder] } + + ]) + ] +}) +export class AdvancedSearchDataProvidersRoutingModule { } diff --git a/portal-4cli/src/app/searchPages/advanced/advancedSearchDataProviders.component.ts b/portal-4cli/src/app/searchPages/advanced/advancedSearchDataProviders.component.ts new file mode 100644 index 00000000..85f620eb --- /dev/null +++ b/portal-4cli/src/app/searchPages/advanced/advancedSearchDataProviders.component.ts @@ -0,0 +1,153 @@ +import {Component, Input, ViewChild} from '@angular/core'; +import {Observable} from 'rxjs/Observable'; +import { Router, ActivatedRoute} from '@angular/router'; +import {Filter, Value,AdvancedField} from '../searchUtils/searchHelperClasses.class'; +import {SearchDataprovidersService} from '../../services/searchDataproviders.service'; +import {SearchResult} from '../../utils/entities/searchResult'; +import {OpenaireProperties, ErrorCodes} from '../../utils/properties/openaireProperties'; +import {AdvancedSearchPageComponent} from '../searchUtils/advancedSearchPage.component'; +import {SearchFields} from '../../utils/properties/searchFields'; +import {SearchUtilsClass } from '../searchUtils/searchUtils.class'; + + + +@Component({ + selector: 'advanced-search-dataprovider', + template: ` + + + + ` + }) + +export class AdvancedSearchDataProvidersComponent { + private errorCodes: ErrorCodes; + + public results =[]; + public filters =[]; + public searchUtils:SearchUtilsClass = new SearchUtilsClass(); + public searchFields:SearchFields = new SearchFields(); + + public fieldIds: string[] = this.searchFields.DATASOURCE_ADVANCED_FIELDS; + public fieldIdsMap= this.searchFields.DATASOURCE_FIELDS; + public selectedFields:AdvancedField[] = []; + + @ViewChild (AdvancedSearchPageComponent) searchPage : AdvancedSearchPageComponent ; + public resourcesQuery = "(oaftype exact datasource)"; + public csvParams: string; + public disableForms: boolean = false; + public loadPaging: boolean = true; + public oldTotalResults: number = 0; + + constructor (private route: ActivatedRoute, private _searchDataProvidersService: SearchDataprovidersService ) { + this.results =[]; + this.errorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + this.searchUtils.baseUrl = OpenaireProperties.searchLinkToAdvancedDataProviders; + console.info("Con -base url:"+this.searchUtils.baseUrl ); + + } + ngOnInit() { + this.sub = this.route.queryParams.subscribe(params => { + if(params['page'] && this.searchUtils.page != params['page']) { + this.loadPaging = false; + this.oldTotalResults = this.searchUtils.totalResults; + } + + let page = (params['page']=== undefined)?0:+params['page']; + this.searchUtils.page = ( page < 1 ) ? 1 : page; + this.searchPage.fieldIds = this.fieldIds; + this.selectedFields =[]; + this.searchPage.selectedFields = this.selectedFields; + this.searchPage.fieldIdsMap = this.fieldIdsMap; + this.searchPage.getSelectedFiltersFromUrl(params); + this.getResults(this.searchPage.createQueryParameters(), this.searchUtils.page, this.searchUtils.size); + }); + } + ngOnDestroy() { + this.sub.unsubscribe(); + } + sub: any; + public getResults(parameters:string, page: number, size: number){ + if(parameters!= null && parameters != '' ) { + this.csvParams ="&type=datasources&query=( "+this.resourcesQuery + "and (" + parameters + "))"; + }else{ + this.csvParams ="&type=datasources&query="+this.resourcesQuery; + } + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + //this.searchPage.openLoading(); + this.disableForms = true; + this.results = []; + this.searchUtils.totalResults = 0; + + console.info("Advanced Search for Content Providers: Execute search query "+parameters); + this._searchDataProvidersService.advancedSearchDataproviders(parameters, page, size).subscribe( + data => { + this.searchUtils.totalResults = data[0]; + console.info("Adv Search Content Providers total="+this.searchUtils.totalResults); + this.results = data[1]; + this.searchPage.updateBaseUrlWithParameters(); + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + //this.searchPage.closeLoading(); + this.disableForms = false; + + if(this.searchUtils.status == this.errorCodes.DONE) { + // Page out of limit + let totalPages:any = this.searchUtils.totalResults/(this.searchUtils.size); + if(!(Number.isInteger(totalPages))) { + totalPages = (parseInt(totalPages, 10) + 1); + } + if(totalPages < page) { + this.searchUtils.totalResults = 0; + this.searchUtils.status = this.errorCodes.OUT_OF_BOUND; + } + } + }, + err => { + console.log(err); + console.info("error"); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = errorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.NOT_AVAILABLE; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + //this.searchPage.closeLoading(); + this.disableForms = false; + } + ); + } + + public queryChanged($event) { + this.loadPaging = true; + + var parameters = $event.value; + this.getResults(parameters, this.searchUtils.page,this.searchUtils.size); + console.info("queryChanged: Execute search query "+parameters); + + } + + +} diff --git a/portal-4cli/src/app/searchPages/advanced/advancedSearchDataProviders.module.ts b/portal-4cli/src/app/searchPages/advanced/advancedSearchDataProviders.module.ts new file mode 100644 index 00000000..77d474b3 --- /dev/null +++ b/portal-4cli/src/app/searchPages/advanced/advancedSearchDataProviders.module.ts @@ -0,0 +1,29 @@ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import{ AdvancedSearchDataProvidersRoutingModule} from './advancedSearchDataProviders-routing.module'; +import{AdvancedSearchDataProvidersComponent} from './advancedSearchDataProviders.component'; + + +import {DataProvidersServiceModule} from '../../services/dataProvidersService.module'; + import {AdvancedSearchPageModule} from '../searchUtils/advancedSearchPage.module'; + import {FreeGuard} from'../../login/freeGuard.guard'; + import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + CommonModule, FormsModule, + DataProvidersServiceModule, + AdvancedSearchDataProvidersRoutingModule, AdvancedSearchPageModule + + ], + declarations: [ + AdvancedSearchDataProvidersComponent + ], + providers:[FreeGuard, IsRouteEnabled], + exports: [ + AdvancedSearchDataProvidersComponent + ] +}) +export class AdvancedSearchDataProvidersModule { } diff --git a/portal-4cli/src/app/searchPages/advanced/advancedSearchDatasets-routing.module.ts b/portal-4cli/src/app/searchPages/advanced/advancedSearchDatasets-routing.module.ts new file mode 100644 index 00000000..6217c5da --- /dev/null +++ b/portal-4cli/src/app/searchPages/advanced/advancedSearchDatasets-routing.module.ts @@ -0,0 +1,19 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import{AdvancedSearchDatasetsComponent} from './advancedSearchDatasets.component'; +import {FreeGuard} from'../../login/freeGuard.guard'; +import {PreviousRouteRecorder} from '../../utils/piwik/previousRouteRecorder.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + RouterModule.forChild([ + { path: '', component: AdvancedSearchDatasetsComponent, canActivate: [FreeGuard, IsRouteEnabled], data: { + redirect: '/error' + }, canDeactivate: [PreviousRouteRecorder] } + + ]) + ] +}) +export class AdvancedSearchDatasetsRoutingModule { } diff --git a/portal-4cli/src/app/searchPages/advanced/advancedSearchDatasets.component.ts b/portal-4cli/src/app/searchPages/advanced/advancedSearchDatasets.component.ts new file mode 100644 index 00000000..d5a41f05 --- /dev/null +++ b/portal-4cli/src/app/searchPages/advanced/advancedSearchDatasets.component.ts @@ -0,0 +1,161 @@ +import {Component, Input, ViewChild} from '@angular/core'; +import {Observable} from 'rxjs/Observable'; +import { Router, ActivatedRoute} from '@angular/router'; +import {Filter, Value,AdvancedField} from '../searchUtils/searchHelperClasses.class'; +import {SearchDatasetsService} from '../../services/searchDatasets.service'; +import {SearchResult} from '../../utils/entities/searchResult'; +import {OpenaireProperties, ErrorCodes} from '../../utils/properties/openaireProperties'; +import {AdvancedSearchPageComponent} from '../searchUtils/advancedSearchPage.component'; +import {SearchFields} from '../../utils/properties/searchFields'; +import {SearchUtilsClass } from '../searchUtils/searchUtils.class'; + + +@Component({ + selector: 'advanced-search-datasets', + template: ` + + + + ` + }) + +export class AdvancedSearchDatasetsComponent { + private errorCodes: ErrorCodes; + + public results =[]; + public filters =[]; + + public searchUtils:SearchUtilsClass = new SearchUtilsClass(); + public searchFields:SearchFields = new SearchFields(); + + public fieldIds: string[] = this.searchFields.RESULT_ADVANCED_FIELDS; + public fieldIdsMap= this.searchFields.RESULT_FIELDS; + public selectedFields:AdvancedField[] = []; + + @ViewChild (AdvancedSearchPageComponent) searchPage : AdvancedSearchPageComponent ; + public resourcesQuery = "( (oaftype exact result) and (resulttypeid exact dataset) )"; + public csvParams: string; + public disableForms: boolean = false; + public loadPaging: boolean = true; + public oldTotalResults: number = 0; + + constructor (private route: ActivatedRoute, private _searchDatasetsService: SearchDatasetsService ) { + this.results =[]; + this.errorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + this.searchUtils.baseUrl = OpenaireProperties.searchLinkToAdvancedDatasets; + + + + } + ngOnInit() { + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + this.sub = this.route.queryParams.subscribe(params => { + if(params['page'] && this.searchUtils.page != params['page']) { + this.loadPaging = false; + this.oldTotalResults = this.searchUtils.totalResults; + } + + let page = (params['page']=== undefined)?1:+params['page']; + this.searchUtils.page = ( page <= 0 ) ? 1 : page; + this.searchPage.fieldIds = this.fieldIds; + this.selectedFields =[]; + this.searchPage.selectedFields = this.selectedFields; + this.searchPage.fieldIdsMap = this.fieldIdsMap; + this.searchPage.getSelectedFiltersFromUrl(params); + this.getResults(this.searchPage.createQueryParameters(), this.searchUtils.page, this.searchUtils.size); + + }); + } + ngOnDestroy() { + this.sub.unsubscribe(); + } + sub: any; + public getResults(parameters:string, page: number, size: number){ + if(parameters!= null && parameters != '' ) { + this.csvParams ="&type=datasets&query=( "+this.resourcesQuery + "and (" + parameters + "))"; + }else{ + this.csvParams ="&type=datasets&query="+this.resourcesQuery; + } + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + //this.searchPage.openLoading(); + this.disableForms = true; + this.results = []; + this.searchUtils.totalResults = 0; + + console.info("Advanced Search for Research Data: Execute search query "+parameters); + this._searchDatasetsService.advancedSearchDatasets(parameters, page, size).subscribe( + data => { + this.searchUtils.totalResults = data[0]; + console.info("search Research Data total="+this.searchUtils.totalResults); + this.results = data[1]; + this.searchPage.updateBaseUrlWithParameters(); + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + //this.searchPage.closeLoading(); + this.disableForms = false; + + if(this.searchUtils.status == this.errorCodes.DONE) { + // Page out of limit!!! + let totalPages:any = this.searchUtils.totalResults/(this.searchUtils.size); + if(!(Number.isInteger(totalPages))) { + totalPages = (parseInt(totalPages, 10) + 1); + } + if(totalPages < page) { + this.searchUtils.totalResults = 0; + this.searchUtils.status = this.errorCodes.OUT_OF_BOUND; + } + } + }, + err => { + console.log(err); + console.info("error"); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = errorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.NOT_AVAILABLE; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + + //this.searchPage.closeLoading(); + this.disableForms = false; + } + ); + } + private setFilters(){ + //TODO set filters from + } + + public queryChanged($event) { + this.loadPaging = true; + + var parameters = $event.value; + this.getResults(parameters, this.searchUtils.page,this.searchUtils.size); + console.info("queryChanged: Execute search query "+parameters); + + } + + +} diff --git a/portal-4cli/src/app/searchPages/advanced/advancedSearchDatasets.module.ts b/portal-4cli/src/app/searchPages/advanced/advancedSearchDatasets.module.ts new file mode 100644 index 00000000..b68d2582 --- /dev/null +++ b/portal-4cli/src/app/searchPages/advanced/advancedSearchDatasets.module.ts @@ -0,0 +1,29 @@ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import{ AdvancedSearchDatasetsRoutingModule} from './advancedSearchDatasets-routing.module'; +import{AdvancedSearchDatasetsComponent} from './advancedSearchDatasets.component'; + + +import {DatasetsServiceModule} from '../../services/datasetsService.module'; + import {AdvancedSearchPageModule} from '../searchUtils/advancedSearchPage.module'; + import {FreeGuard} from'../../login/freeGuard.guard'; + import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + CommonModule, FormsModule, + DatasetsServiceModule, + AdvancedSearchDatasetsRoutingModule, AdvancedSearchPageModule + + ], + declarations: [ + AdvancedSearchDatasetsComponent + ], + providers:[FreeGuard, IsRouteEnabled], + exports: [ + AdvancedSearchDatasetsComponent + ] +}) +export class AdvancedSearchDatasetsModule { } diff --git a/portal-4cli/src/app/searchPages/advanced/advancedSearchOrganizations-routing.module.ts b/portal-4cli/src/app/searchPages/advanced/advancedSearchOrganizations-routing.module.ts new file mode 100644 index 00000000..541dc659 --- /dev/null +++ b/portal-4cli/src/app/searchPages/advanced/advancedSearchOrganizations-routing.module.ts @@ -0,0 +1,19 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import{AdvancedSearchOrganizationsComponent} from './advancedSearchOrganizations.component'; +import {FreeGuard} from'../../login/freeGuard.guard'; +import {PreviousRouteRecorder} from '../../utils/piwik/previousRouteRecorder.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + RouterModule.forChild([ + { path: '', component: AdvancedSearchOrganizationsComponent , canActivate: [FreeGuard, IsRouteEnabled], data: { + redirect: '/error' + },canDeactivate: [PreviousRouteRecorder]} + + ]) + ] +}) +export class AdvancedSearchOrganizationsRoutingModule { } diff --git a/portal-4cli/src/app/searchPages/advanced/advancedSearchOrganizations.component.ts b/portal-4cli/src/app/searchPages/advanced/advancedSearchOrganizations.component.ts new file mode 100644 index 00000000..dffde579 --- /dev/null +++ b/portal-4cli/src/app/searchPages/advanced/advancedSearchOrganizations.component.ts @@ -0,0 +1,161 @@ +import {Component, Input, ViewChild} from '@angular/core'; +import {Observable} from 'rxjs/Observable'; +import { Router, ActivatedRoute} from '@angular/router'; +import {Filter, Value,AdvancedField} from '../searchUtils/searchHelperClasses.class'; +import {SearchOrganizationsService} from '../../services/searchOrganizations.service'; +import {SearchResult} from '../../utils/entities/searchResult'; +import {OpenaireProperties, ErrorCodes} from '../../utils/properties/openaireProperties'; +import {AdvancedSearchPageComponent} from '../searchUtils/advancedSearchPage.component'; +import {SearchFields} from '../../utils/properties/searchFields'; +import {SearchUtilsClass } from '../searchUtils/searchUtils.class'; + + +@Component({ + selector: 'advanced-search-organizations', + template: ` + + + + ` + }) + +export class AdvancedSearchOrganizationsComponent { + private errorCodes: ErrorCodes; + + public results =[]; + public filters =[]; + public searchUtils:SearchUtilsClass = new SearchUtilsClass(); + public searchFields:SearchFields = new SearchFields(); + + public fieldIds: string[] = this.searchFields.ORGANIZATION_ADVANCED_FIELDS; + public fieldIdsMap = this.searchFields.ORGANIZATION_FIELDS; + public selectedFields:AdvancedField[] = []; + public csvParams: string; + public disableForms: boolean = false; + public loadPaging: boolean = true; + public oldTotalResults: number = 0; + + @ViewChild (AdvancedSearchPageComponent) searchPage : AdvancedSearchPageComponent ; + +public resourcesQuery = "(oaftype exact organization)"; + constructor (private route: ActivatedRoute, private _searchOrganizationsService: SearchOrganizationsService ) { + this.results =[]; + this.errorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + this.searchUtils.baseUrl = OpenaireProperties.searchLinkToAdvancedOrganizations; + + + + } + ngOnInit() { + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + + this.sub = this.route.queryParams.subscribe(params => { + if(params['page'] && this.searchUtils.page != params['page']) { + this.loadPaging = false; + this.oldTotalResults = this.searchUtils.totalResults; + } + + let page = (params['page']=== undefined)?1:+params['page']; + this.searchUtils.page = ( page <= 0 ) ? 1 : page; + this.searchPage.fieldIds = this.fieldIds; + this.selectedFields =[]; + this.searchPage.selectedFields = this.selectedFields; + this.searchPage.fieldIdsMap = this.fieldIdsMap; + this.searchPage.getSelectedFiltersFromUrl(params); + this.getResults(this.searchPage.createQueryParameters(), this.searchUtils.page, this.searchUtils.size); + + }); + } + ngOnDestroy() { + this.sub.unsubscribe(); + } + sub: any; + public getResults(parameters:string, page: number, size: number){ + if(parameters!= null && parameters != '' ) { + this.csvParams ="&type=organizations&query=( "+this.resourcesQuery + "and (" + parameters + "))"; + }else{ + this.csvParams ="&type=organizations&query="+this.resourcesQuery; + } + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + //this.searchPage.openLoading(); + this.disableForms = true; + this.results = []; + this.searchUtils.totalResults = 0; + + console.info("Advanced Search for Organizations: Execute search query "+parameters); + this._searchOrganizationsService.advancedSearchOrganizations(parameters, page, size).subscribe( + data => { + this.searchUtils.totalResults = data[0]; + console.info("search Organizations total="+this.searchUtils.totalResults); + this.results = data[1]; + this.searchPage.updateBaseUrlWithParameters(); + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + //this.searchPage.closeLoading(); + this.disableForms = false; + + if(this.searchUtils.status == this.errorCodes.DONE) { + // Page out of limit!!! + let totalPages:any = this.searchUtils.totalResults/(this.searchUtils.size); + if(!(Number.isInteger(totalPages))) { + totalPages = (parseInt(totalPages, 10) + 1); + } + if(totalPages < page) { + this.searchUtils.totalResults = 0; + this.searchUtils.status = this.errorCodes.OUT_OF_BOUND; + } + } + }, + err => { + console.log(err); + console.info("error"); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = errorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.NOT_AVAILABLE; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + + //this.searchPage.closeLoading(); + this.disableForms = false; + } + ); + } + private setFilters(){ + //TODO set filters from + } + + public queryChanged($event) { + this.loadPaging = true; + + var parameters = $event.value; + this.getResults(parameters, this.searchUtils.page,this.searchUtils.size); + console.info("queryChanged: Execute search query "+parameters); + + } + + +} diff --git a/portal-4cli/src/app/searchPages/advanced/advancedSearchOrganizations.module.ts b/portal-4cli/src/app/searchPages/advanced/advancedSearchOrganizations.module.ts new file mode 100644 index 00000000..85432402 --- /dev/null +++ b/portal-4cli/src/app/searchPages/advanced/advancedSearchOrganizations.module.ts @@ -0,0 +1,29 @@ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import{ AdvancedSearchOrganizationsRoutingModule} from './advancedSearchOrganizations-routing.module'; +import{AdvancedSearchOrganizationsComponent} from './advancedSearchOrganizations.component'; + + +import {OrganizationsServiceModule} from '../../services/organizationsService.module'; + import {AdvancedSearchPageModule} from '../searchUtils/advancedSearchPage.module'; + import {FreeGuard} from'../../login/freeGuard.guard'; + import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + CommonModule, FormsModule, + OrganizationsServiceModule, + AdvancedSearchOrganizationsRoutingModule, AdvancedSearchPageModule + + ], + declarations: [ + AdvancedSearchOrganizationsComponent + ], + providers:[FreeGuard, IsRouteEnabled], + exports: [ + AdvancedSearchOrganizationsComponent + ] +}) +export class AdvancedSearchOrganizationsModule { } diff --git a/portal-4cli/src/app/searchPages/advanced/advancedSearchProjects-routing.module.ts b/portal-4cli/src/app/searchPages/advanced/advancedSearchProjects-routing.module.ts new file mode 100644 index 00000000..6056b75b --- /dev/null +++ b/portal-4cli/src/app/searchPages/advanced/advancedSearchProjects-routing.module.ts @@ -0,0 +1,19 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import{AdvancedSearchProjectsComponent} from './advancedSearchProjects.component'; +import {FreeGuard} from'../../login/freeGuard.guard'; +import {PreviousRouteRecorder} from '../../utils/piwik/previousRouteRecorder.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + RouterModule.forChild([ + { path: '', component: AdvancedSearchProjectsComponent, canActivate: [FreeGuard, IsRouteEnabled], data: { + redirect: '/error' + }, canDeactivate: [PreviousRouteRecorder] } + + ]) + ] +}) +export class AdvancedSearchProjectsRoutingModule { } diff --git a/portal-4cli/src/app/searchPages/advanced/advancedSearchProjects.component.ts b/portal-4cli/src/app/searchPages/advanced/advancedSearchProjects.component.ts new file mode 100644 index 00000000..bf1af211 --- /dev/null +++ b/portal-4cli/src/app/searchPages/advanced/advancedSearchProjects.component.ts @@ -0,0 +1,162 @@ +import {Component, Input, ViewChild} from '@angular/core'; +import {Observable} from 'rxjs/Observable'; +import { Router, ActivatedRoute} from '@angular/router'; +import {Filter, Value,AdvancedField} from '../searchUtils/searchHelperClasses.class'; +import {SearchProjectsService} from '../../services/searchProjects.service'; +import {SearchResult} from '../../utils/entities/searchResult'; +import {OpenaireProperties, ErrorCodes} from '../../utils/properties/openaireProperties'; +import {AdvancedSearchPageComponent} from '../searchUtils/advancedSearchPage.component'; +import {SearchFields} from '../../utils/properties/searchFields'; +import {SearchUtilsClass } from '../searchUtils/searchUtils.class'; + +@Component({ + selector: 'advanced-search-projects', + template: ` + + + + ` + }) + +export class AdvancedSearchProjectsComponent { + private errorCodes: ErrorCodes; + + public results =[]; + public filters =[]; + + public searchUtils:SearchUtilsClass = new SearchUtilsClass(); + public searchFields:SearchFields = new SearchFields(); + + public fieldIds: string[] = this.searchFields.PROJECT_ADVANCED_FIELDS; + public fieldIdsMap = this.searchFields.PROJECT_FIELDS; + public selectedFields:AdvancedField[] = []; + + @ViewChild (AdvancedSearchPageComponent) searchPage : AdvancedSearchPageComponent ; + public resourcesQuery = "(oaftype exact project)"; + public csvParams: string; + public disableForms: boolean = false; + public loadPaging: boolean = true; + public oldTotalResults: number = 0; + + constructor (private route: ActivatedRoute, private _searchProjectsService: SearchProjectsService ) { + + this.results =[]; + this.errorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + this.searchUtils.baseUrl = OpenaireProperties.searchLinkToAdvancedProjects; + + + + } + ngOnInit() { + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + this.sub = this.route.queryParams.subscribe(params => { + if(params['page'] && this.searchUtils.page != params['page']) { + this.loadPaging = false; + this.oldTotalResults = this.searchUtils.totalResults; + } + + let page = (params['page']=== undefined)?1:+params['page']; + this.searchUtils.page = ( page <= 0 ) ? 1 : page; + this.searchPage.fieldIds = this.fieldIds; + this.selectedFields =[]; + this.searchPage.selectedFields = this.selectedFields; + this.searchPage.fieldIdsMap = this.fieldIdsMap; + this.searchPage.getSelectedFiltersFromUrl(params); + this.getResults(this.searchPage.createQueryParameters(), this.searchUtils.page, this.searchUtils.size); + + }); + } + ngOnDestroy() { + this.sub.unsubscribe(); + } + sub: any; + public getResults(parameters:string, page: number, size: number){ + if(parameters!= null && parameters != '' ) { + this.csvParams ="&type=projects&query=( "+this.resourcesQuery + "and (" + parameters + "))"; + }else{ + this.csvParams ="&type=projects&query="+this.resourcesQuery; + } + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + //this.searchPage.openLoading(); + this.disableForms = true; + this.results = []; + this.searchUtils.totalResults = 0; + + console.info("Advanced Search for Publications: Execute search query "+parameters); + this._searchProjectsService.advancedSearchProjects(parameters, page, size).subscribe( + data => { + this.searchUtils.totalResults = data[0]; + console.info("Advanced Search for Projects total="+this.searchUtils.totalResults); + this.results = data[1]; + this.searchPage.updateBaseUrlWithParameters(); + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + //this.searchPage.closeLoading(); + this.disableForms = false; + + if(this.searchUtils.status == this.errorCodes.DONE) { + // Page out of limit!!! + let totalPages:any = this.searchUtils.totalResults/(this.searchUtils.size); + if(!(Number.isInteger(totalPages))) { + totalPages = (parseInt(totalPages, 10) + 1); + } + if(totalPages < page) { + this.searchUtils.totalResults = 0; + this.searchUtils.status = this.errorCodes.OUT_OF_BOUND; + } + } + }, + err => { + console.log(err); + console.info("error"); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = errorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.NOT_AVAILABLE; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + + //this.searchPage.closeLoading(); + this.disableForms = false; + + } + ); + } + private setFilters(){ + //TODO set filters from + } + + public queryChanged($event) { + this.loadPaging = true; + + var parameters = $event.value; + this.getResults(parameters, this.searchUtils.page,this.searchUtils.size); + console.info("queryChanged: Execute search query "+parameters); + + } + + +} diff --git a/portal-4cli/src/app/searchPages/advanced/advancedSearchProjects.module.ts b/portal-4cli/src/app/searchPages/advanced/advancedSearchProjects.module.ts new file mode 100644 index 00000000..cb81a43d --- /dev/null +++ b/portal-4cli/src/app/searchPages/advanced/advancedSearchProjects.module.ts @@ -0,0 +1,29 @@ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import{ AdvancedSearchProjectsRoutingModule} from './advancedSearchProjects-routing.module'; +import{AdvancedSearchProjectsComponent} from './advancedSearchProjects.component'; + + +import {ProjectsServiceModule} from '../../services/projectsService.module'; + import {AdvancedSearchPageModule} from '../searchUtils/advancedSearchPage.module'; + import {FreeGuard} from'../../login/freeGuard.guard'; + import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + CommonModule, FormsModule, + ProjectsServiceModule, + AdvancedSearchProjectsRoutingModule, AdvancedSearchPageModule + + ], + declarations: [ + AdvancedSearchProjectsComponent + ], + providers:[FreeGuard, IsRouteEnabled], + exports: [ + AdvancedSearchProjectsComponent + ] +}) +export class AdvancedSearchProjectsModule { } diff --git a/portal-4cli/src/app/searchPages/advanced/advancedSearchPublications-routing.module.ts b/portal-4cli/src/app/searchPages/advanced/advancedSearchPublications-routing.module.ts new file mode 100644 index 00000000..3a467df9 --- /dev/null +++ b/portal-4cli/src/app/searchPages/advanced/advancedSearchPublications-routing.module.ts @@ -0,0 +1,19 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import{AdvancedSearchPublicationsComponent} from './advancedSearchPublications.component'; +import {FreeGuard} from'../../login/freeGuard.guard'; +import {PreviousRouteRecorder} from '../../utils/piwik/previousRouteRecorder.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + RouterModule.forChild([ + { path: '', component: AdvancedSearchPublicationsComponent, canActivate: [FreeGuard, IsRouteEnabled], data: { + redirect: '/error' + }, canDeactivate: [PreviousRouteRecorder] } + + ]) + ] +}) +export class AdvancedSearchPublicationsRoutingModule { } diff --git a/portal-4cli/src/app/searchPages/advanced/advancedSearchPublications.component.ts b/portal-4cli/src/app/searchPages/advanced/advancedSearchPublications.component.ts new file mode 100644 index 00000000..8f0cfa26 --- /dev/null +++ b/portal-4cli/src/app/searchPages/advanced/advancedSearchPublications.component.ts @@ -0,0 +1,160 @@ +import {Component, Input, ViewChild} from '@angular/core'; +import {Observable} from 'rxjs/Observable'; +import { Router, ActivatedRoute} from '@angular/router'; +import {Filter, Value,AdvancedField} from '../searchUtils/searchHelperClasses.class'; +import {SearchPublicationsService} from '../../services/searchPublications.service'; +import {SearchResult} from '../../utils/entities/searchResult'; +import {OpenaireProperties, ErrorCodes} from '../../utils/properties/openaireProperties'; +import {AdvancedSearchPageComponent} from '../searchUtils/advancedSearchPage.component'; +import {SearchFields} from '../../utils/properties/searchFields'; +import {SearchUtilsClass } from '../searchUtils/searchUtils.class'; + + +@Component({ + selector: 'advanced-search-publications', + template: ` + + + ` + }) + +export class AdvancedSearchPublicationsComponent { + private errorCodes: ErrorCodes; + + public results =[]; + public filters =[]; + + public searchUtils:SearchUtilsClass = new SearchUtilsClass(); + public searchFields:SearchFields = new SearchFields(); + + public fieldIds: string[] = this.searchFields.RESULT_ADVANCED_FIELDS; + public fieldIdsMap= this.searchFields.RESULT_FIELDS; + public selectedFields:AdvancedField[] = []; + public resourcesQuery = "((oaftype exact result) and (resulttypeid exact publication))"; + public csvParams: string; + public disableForms: boolean = false; + public loadPaging: boolean = true; + public oldTotalResults: number = 0; + + @ViewChild (AdvancedSearchPageComponent) searchPage : AdvancedSearchPageComponent ; + + + constructor (private route: ActivatedRoute, private _searchPublicationsService: SearchPublicationsService ) { + + this.results =[]; + this.errorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + this.searchUtils.baseUrl = OpenaireProperties.searchLinkToAdvancedPublications; + + + + } + ngOnInit() { + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + this.sub = this.route.queryParams.subscribe(params => { + if(params['page'] && this.searchUtils.page != params['page']) { + this.loadPaging = false; + this.oldTotalResults = this.searchUtils.totalResults; + } + + let page = (params['page']=== undefined)?1:+params['page']; + this.searchUtils.page = ( page <= 0 ) ? 1 : page; + this.searchPage.fieldIds = this.fieldIds; + this.selectedFields =[]; + this.searchPage.selectedFields = this.selectedFields; + this.searchPage.fieldIdsMap = this.fieldIdsMap; + + this.searchPage.getSelectedFiltersFromUrl(params); + this.getResults(this.searchPage.createQueryParameters(), this.searchUtils.page, this.searchUtils.size); + }); + } + ngOnDestroy() { + this.sub.unsubscribe(); + } + sub: any; + public getResults(parameters:string, page: number, size: number){ + if(parameters!= null && parameters != '' ) { + this.csvParams ="&type=publications&query=("+this.resourcesQuery +" and (" + parameters + "))"; + }else{ + this.csvParams ="&type=publications&query="+this.resourcesQuery; + } + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + //this.searchPage.openLoading(); + this.disableForms = true; + this.results = []; + this.searchUtils.totalResults = 0; + + console.info("Advanced Search for Publications: Execute search query "+parameters); + this._searchPublicationsService.advancedSearchPublications(parameters, page, size).subscribe( + data => { + this.searchUtils.totalResults = data[0]; + console.info("searchPubl total="+this.searchUtils.totalResults); + this.results = data[1]; + this.searchPage.updateBaseUrlWithParameters(); + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + //this.searchPage.closeLoading(); + this.disableForms = false; + + if(this.searchUtils.status == this.errorCodes.DONE) { + // Page out of limit!!! + let totalPages:any = this.searchUtils.totalResults/(this.searchUtils.size); + if(!(Number.isInteger(totalPages))) { + totalPages = (parseInt(totalPages, 10) + 1); + } + if(totalPages < page) { + this.searchUtils.totalResults = 0; + this.searchUtils.status = this.errorCodes.OUT_OF_BOUND; + } + } + }, + err => { + console.log(err); + console.info("error"); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.NOT_AVAILABLE; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + + //this.searchPage.closeLoading(); + this.disableForms = false; + + } + ); + } + + public queryChanged($event) { + this.loadPaging = true; + + var parameters = $event.value; + this.getResults(parameters, this.searchUtils.page,this.searchUtils.size); + console.info("queryChanged: Execute search query "+parameters); + + } + + +} diff --git a/portal-4cli/src/app/searchPages/advanced/advancedSearchPublications.module.ts b/portal-4cli/src/app/searchPages/advanced/advancedSearchPublications.module.ts new file mode 100644 index 00000000..4e6a230d --- /dev/null +++ b/portal-4cli/src/app/searchPages/advanced/advancedSearchPublications.module.ts @@ -0,0 +1,29 @@ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import{ AdvancedSearchPublicationsRoutingModule} from './advancedSearchPublications-routing.module'; +import{AdvancedSearchPublicationsComponent} from './advancedSearchPublications.component'; + + +import {PublicationsServiceModule} from '../../services/publicationsService.module'; + import {AdvancedSearchPageModule} from '../searchUtils/advancedSearchPage.module'; + import {FreeGuard} from'../../login/freeGuard.guard'; + import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + CommonModule, FormsModule, + PublicationsServiceModule, + AdvancedSearchPublicationsRoutingModule, AdvancedSearchPageModule + + ], + declarations: [ + AdvancedSearchPublicationsComponent + ], + providers:[FreeGuard, IsRouteEnabled], + exports: [ + AdvancedSearchPublicationsComponent + ] +}) +export class AdvancedSearchPublicationsModule { } diff --git a/portal-4cli/src/app/searchPages/advanced/advancedSearchSoftware-routing.module.ts b/portal-4cli/src/app/searchPages/advanced/advancedSearchSoftware-routing.module.ts new file mode 100644 index 00000000..95183ca0 --- /dev/null +++ b/portal-4cli/src/app/searchPages/advanced/advancedSearchSoftware-routing.module.ts @@ -0,0 +1,16 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import{AdvancedSearchSoftwareComponent} from './advancedSearchSoftware.component'; +import {FreeGuard} from'../../login/freeGuard.guard'; +import {PreviousRouteRecorder} from '../../utils/piwik/previousRouteRecorder.guard'; + +@NgModule({ + imports: [ + RouterModule.forChild([ + { path: '', component: AdvancedSearchSoftwareComponent, canActivate: [FreeGuard],canDeactivate: [PreviousRouteRecorder] } + + ]) + ] +}) +export class AdvancedSearchSoftwareRoutingModule { } diff --git a/portal-4cli/src/app/searchPages/advanced/advancedSearchSoftware.component.ts b/portal-4cli/src/app/searchPages/advanced/advancedSearchSoftware.component.ts new file mode 100644 index 00000000..73275cea --- /dev/null +++ b/portal-4cli/src/app/searchPages/advanced/advancedSearchSoftware.component.ts @@ -0,0 +1,161 @@ +import {Component, Input, ViewChild} from '@angular/core'; +import {Observable} from 'rxjs/Observable'; +import { Router, ActivatedRoute} from '@angular/router'; +import {Filter, Value,AdvancedField} from '../searchUtils/searchHelperClasses.class'; +import {SearchSoftwareService} from '../../services/searchSoftware.service'; +import {SearchResult} from '../../utils/entities/searchResult'; +import {OpenaireProperties, ErrorCodes} from '../../utils/properties/openaireProperties'; +import {AdvancedSearchPageComponent} from '../searchUtils/advancedSearchPage.component'; +import {SearchFields} from '../../utils/properties/searchFields'; +import {SearchUtilsClass } from '../searchUtils/searchUtils.class'; + + +@Component({ + selector: 'advanced-search-software', + template: ` + + + + ` + }) + +export class AdvancedSearchSoftwareComponent { + private errorCodes: ErrorCodes; + + public results =[]; + public filters =[]; + + public searchUtils:SearchUtilsClass = new SearchUtilsClass(); + public searchFields:SearchFields = new SearchFields(); + + public fieldIds: string[] = this.searchFields.RESULT_ADVANCED_FIELDS; + public fieldIdsMap= this.searchFields.RESULT_FIELDS; + public selectedFields:AdvancedField[] = []; + + @ViewChild (AdvancedSearchPageComponent) searchPage : AdvancedSearchPageComponent ; + public resourcesQuery = "( (oaftype exact result) and (resulttypeid exact software) )"; + public csvParams: string; + public disableForms: boolean = false; + public loadPaging: boolean = true; + public oldTotalResults: number = 0; + + constructor (private route: ActivatedRoute, private _searchSoftwareService: SearchSoftwareService ) { + this.results =[]; + this.errorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + this.searchUtils.baseUrl = OpenaireProperties.searchLinkToAdvancedSoftware; + + + + } + ngOnInit() { + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + this.sub = this.route.queryParams.subscribe(params => { + if(params['page'] && this.searchUtils.page != params['page']) { + this.loadPaging = false; + this.oldTotalResults = this.searchUtils.totalResults; + } + + let page = (params['page']=== undefined)?1:+params['page']; + this.searchUtils.page = ( page <= 0 ) ? 1 : page; + this.searchPage.fieldIds = this.fieldIds; + this.selectedFields =[]; + this.searchPage.selectedFields = this.selectedFields; + this.searchPage.fieldIdsMap = this.fieldIdsMap; + this.searchPage.getSelectedFiltersFromUrl(params); + this.getResults(this.searchPage.createQueryParameters(), this.searchUtils.page, this.searchUtils.size); + + }); + } + ngOnDestroy() { + this.sub.unsubscribe(); + } + sub: any; + public getResults(parameters:string, page: number, size: number){ + if(parameters!= null && parameters != '' ) { + this.csvParams ="&type=software&query=( "+this.resourcesQuery + "and (" + parameters + "))"; + }else{ + this.csvParams ="&type=software&query="+this.resourcesQuery; + } + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + //this.searchPage.openLoading(); + this.disableForms = true; + this.results = []; + this.searchUtils.totalResults = 0; + + console.info("Advanced Search for Software: Execute search query "+parameters); + this._searchSoftwareService.advancedSearchSoftware(parameters, page, size).subscribe( + data => { + this.searchUtils.totalResults = data[0]; + console.info("search Software total="+this.searchUtils.totalResults); + this.results = data[1]; + this.searchPage.updateBaseUrlWithParameters(); + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + //this.searchPage.closeLoading(); + this.disableForms = false; + + if(this.searchUtils.status == this.errorCodes.DONE) { + // Page out of limit!!! + let totalPages:any = this.searchUtils.totalResults/(this.searchUtils.size); + if(!(Number.isInteger(totalPages))) { + totalPages = (parseInt(totalPages, 10) + 1); + } + if(totalPages < page) { + this.searchUtils.totalResults = 0; + this.searchUtils.status = this.errorCodes.OUT_OF_BOUND; + } + } + }, + err => { + console.log(err); + console.info("error"); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = errorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.NOT_AVAILABLE; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + + //this.searchPage.closeLoading(); + this.disableForms = false; + } + ); + } + private setFilters(){ + //TODO set filters from + } + + public queryChanged($event) { + this.loadPaging = true; + + var parameters = $event.value; + this.getResults(parameters, this.searchUtils.page,this.searchUtils.size); + console.info("queryChanged: Execute search query "+parameters); + + } + + +} diff --git a/portal-4cli/src/app/searchPages/advanced/advancedSearchSoftware.module.ts b/portal-4cli/src/app/searchPages/advanced/advancedSearchSoftware.module.ts new file mode 100644 index 00000000..c5c276ff --- /dev/null +++ b/portal-4cli/src/app/searchPages/advanced/advancedSearchSoftware.module.ts @@ -0,0 +1,29 @@ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import{ AdvancedSearchSoftwareRoutingModule} from './advancedSearchSoftware-routing.module'; +import{AdvancedSearchSoftwareComponent} from './advancedSearchSoftware.component'; + + +import {SoftwareServiceModule} from '../../services/softwareService.module'; + import {AdvancedSearchPageModule} from '../searchUtils/advancedSearchPage.module'; + import {FreeGuard} from'../../login/freeGuard.guard'; + +@NgModule({ + imports: [ + CommonModule, FormsModule, + SoftwareServiceModule, + AdvancedSearchSoftwareRoutingModule, AdvancedSearchPageModule + + ], + declarations: [ + AdvancedSearchSoftwareComponent + ], + providers:[FreeGuard + ], + exports: [ + AdvancedSearchSoftwareComponent + ] +}) +export class AdvancedSearchSoftwareModule { } diff --git a/portal-4cli/src/app/searchPages/dataProviders/compatibleDataProviders-routing.module.ts b/portal-4cli/src/app/searchPages/dataProviders/compatibleDataProviders-routing.module.ts new file mode 100644 index 00000000..5c8b5cba --- /dev/null +++ b/portal-4cli/src/app/searchPages/dataProviders/compatibleDataProviders-routing.module.ts @@ -0,0 +1,19 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import{SearchCompatibleDataprovidersComponent} from './compatibleDataProviders.component'; +import {FreeGuard} from'../../login/freeGuard.guard'; +import {PreviousRouteRecorder} from '../../utils/piwik/previousRouteRecorder.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + RouterModule.forChild([ + { path: '', component: SearchCompatibleDataprovidersComponent, canActivate: [FreeGuard, IsRouteEnabled], data: { + redirect: '/error' + }, canDeactivate: [PreviousRouteRecorder] } + + ]) + ] +}) +export class CompatibleDataProvidersRoutingModule { } diff --git a/portal-4cli/src/app/searchPages/dataProviders/compatibleDataProviders.component.ts b/portal-4cli/src/app/searchPages/dataProviders/compatibleDataProviders.component.ts new file mode 100644 index 00000000..4e842e97 --- /dev/null +++ b/portal-4cli/src/app/searchPages/dataProviders/compatibleDataProviders.component.ts @@ -0,0 +1,186 @@ +import {Component, Input, ViewChild} from '@angular/core'; +import { ActivatedRoute} from '@angular/router'; + +import { Filter, Value} from '../searchUtils/searchHelperClasses.class'; + +import {SearchDataprovidersService} from '../../services/searchDataproviders.service'; +import {SearchResult} from '../../utils/entities/searchResult'; +import {OpenaireProperties, ErrorCodes} from '../../utils/properties/openaireProperties'; +import {SearchFields} from '../../utils/properties/searchFields'; +import {SearchPageComponent } from '../searchUtils/searchPage.component'; +import {SearchUtilsClass } from '../searchUtils/searchUtils.class'; + +@Component({ + selector: 'search-content-providers', + template: ` + + + + + + ` + +}) +export class SearchCompatibleDataprovidersComponent { + private errorCodes: ErrorCodes; + public results =[]; + public filters =[]; + public baseUrl:string; + public searchUtils:SearchUtilsClass = new SearchUtilsClass(); + public sub: any; public subResults: any; + public _location:Location; + public searchFields:SearchFields = new SearchFields(); + public refineFields: string[] = this.searchFields.COMPATIBLE_DATAPROVIDER_FIELDS; + public fieldIdsMap= this.searchFields.DATASOURCE_FIELDS; + public _prefixQueryFields: {field:string,opName:string,opValue:string,values:string[]}[] =[{field:"compatibility",opName:"cm",opValue:"not", values:["UNKNOWN","hostedBy","notCompatible"]},{field:"type",opName:"tp",opValue:"not",values: ["other"]}]; + // ["entityregistry","entityregistry::projects","entityregistry::repositories"]}]; + public _prefixQuery: string = ""; + + public CSV: any = { "columnNames": [ "Title", "Type", "Coutries", "Compatibility" ], + "export":[] + }; + public CSVDownloaded = false; + public resourcesQuery = '&query=((oaftype exact datasource) not(datasourcecompatibilityid = UNKNOWN) not(datasourcecompatibilityid = notCompatible) not(datasourcetypeuiid = other) not(datasourcetypeuiid exact "pubsrepository::journal") not(datasourcetypeuiid exact "aggregator::pubsrepository::journals"))'; + public csvParams: string; + public disableForms: boolean = false; + + @ViewChild (SearchPageComponent) searchPage : SearchPageComponent ; + + constructor (private route: ActivatedRoute, private _searchDataprovidersService: SearchDataprovidersService ) { + this.errorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + this.baseUrl = OpenaireProperties.getLinkToSearchCompatibleDataProviders(); + for(var i = 0; i < this._prefixQueryFields.length; i++ ){ + for(var j =0; j < this._prefixQueryFields[i].values.length; j++){ + this._prefixQuery+="&" + this._prefixQueryFields[i].field + "=" + + this._prefixQueryFields[i].values[j] + "&" + + this._prefixQueryFields[i].opName + "=" + this._prefixQueryFields[i].opValue; + } + } + this._prefixQuery+="&"; + } + + public ngOnInit() { + this.searchPage.refineFields = this.refineFields; + this.searchPage.fieldIdsMap = this.fieldIdsMap; + this.sub = this.route.queryParams.subscribe(params => { + this.searchUtils.keyword = (params['keyword']?params['keyword']:''); + this.searchUtils.page = (params['page']=== undefined)?1:+params['page']; + this.filters = this.createFilters(); + var queryParameters = this.searchPage.getIndexQueryParametersFromUrl(params); + console.info("|"+queryParameters+"|"); + this._getResults(queryParameters, false, this.searchUtils.page, this.searchUtils.size); + }); + } + + public ngOnDestroy() { + if(this.sub){ + this.sub.unsubscribe(); + } + if(this.subResults){ + this.subResults.unsubscribe(); + } } + private _getResults(parameters:string,refine:boolean, page: number, size: number){ + this.csvParams = parameters+this.resourcesQuery+"&type=datasources"; + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + //this.searchPage.openLoading(); + this.disableForms = true; + this.results = []; + this.searchUtils.totalResults = 0; + + this.subResults = this._searchDataprovidersService.searchCompatibleDataproviders(parameters,(refine)?this.searchPage.getRefineFieldsQuery():null, page, size, []).subscribe( + data => { + this.searchUtils.totalResults = data[0]; + console.info("search Content Providers: [Parameters:"+parameters+" ] [total results:"+this.searchUtils.totalResults+"]"); + this.results = data[1]; + this.searchPage.checkSelectedFilters(this.filters); + this.searchPage.updateBaseUrlWithParameters(this.filters); + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + //this.searchPage.closeLoading(); + this.disableForms = false; + + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + + //this.searchPage.closeLoading(); + this.disableForms = false; + + } + ); + } + private setFilters(){ + //TODO set filters from + } + + public queryChanged($event) { + var parameters = $event.index; + console.info("queryChanged: Execute search query "+parameters); + + this._getResults(parameters, false, this.searchUtils.page, this.searchUtils.size); + } + private createFilters():Filter[] { + var filter_names=["Type","Compatibility Level"]; + var filter_ids=["datasourcetypeuiid","datasourcecompatibilityname"]; + var searchFields = new SearchFields(); + var filter_original_ids = searchFields.COMPATIBLE_DATAPROVIDER_FIELDS; + var value_names=[ + /*[ + "Institutional Publication Repository","Thematic Publication Repository", "Other Publication Repository", + "Institutional Repositories Aggregators", + "Thematic Repositories Aggregators", "Other Repositories Aggregators", + "Data Repositories", "Data Repositories Aggregators", "Journals", "Journals Aggregators", "CRIS Systems", "Publication Catalogues"], + */ + [ + "Institutional Repository", "Thematic Repository", "Publication Repository", + "Institutional Repository Aggregator", + "Thematic Repositories Aggregators", "Publication Repository Aggregator", + "Data Repository", "Data Repository Aggregator", "CRIS Systems", "Publication Catalogue"], + ["OpenAIRE Basic (DRIVER OA)","OpenAIRE 2.0 (EC funding)", "OpenAIRE 2.0+ (DRIVER OA, EC funding)", "OpenAIRE 3.0 (OA, funding)","OpenAIRE Data (funded, referenced datasets)"]]; + + var value_original_ids=[ + ["pubsrepository::institutional","pubsrepository::thematic", "pubsrepository::unknown", "aggregator::pubsrepository::institutional","aggregator::pubsrepository::thematic","aggregator::pubsrepository::unknown", + "datarepository::unknown", "aggregator::datarepository", "cris", "pubscatalogue::unknown"], + //["driver","openaire2.0", "driver-openaire2.0", "openaire3.0","openaire2.0_data"] + ["OpenAIRE Basic (DRIVER OA)","OpenAIRE 2.0 (EC funding)", "OpenAIRE 2.0+ (DRIVER OA, EC funding)", "OpenAIRE 3.0 (OA, funding)","OpenAIRE Data (funded, referenced datasets)"]]; + var filters: Filter[] =[]; + for(var i =0 ; i < filter_names.length;i++){ + var values:Value[] = []; + for(var j =0 ; j < value_names[i].length;j++){ + var value:Value = {name: value_names[i][j], id: value_original_ids[i][j], number:j, selected:false} + values.push(value); + } + var filter:Filter = {title: filter_names[i], filterId: filter_ids[i], originalFilterId: filter_original_ids[i], values : values, countSelectedValues:0, "filterOperator": 'or' }; + filters.push(filter); + } + return filters; + } +} diff --git a/portal-4cli/src/app/searchPages/dataProviders/compatibleDataProviders.module.ts b/portal-4cli/src/app/searchPages/dataProviders/compatibleDataProviders.module.ts new file mode 100644 index 00000000..d5c3082e --- /dev/null +++ b/portal-4cli/src/app/searchPages/dataProviders/compatibleDataProviders.module.ts @@ -0,0 +1,32 @@ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import{ CompatibleDataProvidersRoutingModule} from './compatibleDataProviders-routing.module'; +import{SearchCompatibleDataprovidersComponent} from './compatibleDataProviders.component'; + +import {SearchResultsModule } from '../searchUtils/searchResults.module'; + +import {DataProvidersServiceModule} from '../../services/dataProvidersService.module'; +import {SearchFormModule} from '../searchUtils/searchForm.module'; +//import {SearchFilterModalModule} from '../searchUtils/searchFilterModal.module'; +import {SearchPageModule} from '../searchUtils/searchPage.module'; +import {FreeGuard} from'../../login/freeGuard.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + CommonModule, FormsModule, + DataProvidersServiceModule, + SearchFormModule, SearchResultsModule, CompatibleDataProvidersRoutingModule, SearchPageModule + + ], + declarations: [ + SearchCompatibleDataprovidersComponent + ], + providers:[FreeGuard, IsRouteEnabled], + exports: [ + SearchCompatibleDataprovidersComponent + ] +}) +export class CompatibleDataProvidersModule { } diff --git a/portal-4cli/src/app/searchPages/dataProviders/compatibleDataProvidersTable-routing.module.ts b/portal-4cli/src/app/searchPages/dataProviders/compatibleDataProvidersTable-routing.module.ts new file mode 100644 index 00000000..b00ad1ad --- /dev/null +++ b/portal-4cli/src/app/searchPages/dataProviders/compatibleDataProvidersTable-routing.module.ts @@ -0,0 +1,19 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import{SearchCompatibleDataprovidersTableComponent} from './compatibleDataProvidersTable.component'; +import {FreeGuard} from'../../login/freeGuard.guard'; +import {PreviousRouteRecorder} from '../../utils/piwik/previousRouteRecorder.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + RouterModule.forChild([ + { path: '', component: SearchCompatibleDataprovidersTableComponent, canActivate: [FreeGuard, IsRouteEnabled], data: { + redirect: '/error' + }, canDeactivate: [PreviousRouteRecorder] } + + ]) + ] +}) +export class CompatibleDataProvidersTableRoutingModule { } diff --git a/portal-4cli/src/app/searchPages/dataProviders/compatibleDataProvidersTable.component.ts b/portal-4cli/src/app/searchPages/dataProviders/compatibleDataProvidersTable.component.ts new file mode 100644 index 00000000..3b4e7c4f --- /dev/null +++ b/portal-4cli/src/app/searchPages/dataProviders/compatibleDataProvidersTable.component.ts @@ -0,0 +1,196 @@ +import {Component, Input, ViewChild} from '@angular/core'; +import { ActivatedRoute} from '@angular/router'; + +import { Filter, Value} from '../searchUtils/searchHelperClasses.class'; + +import {SearchDataprovidersService} from '../../services/searchDataproviders.service'; +import {SearchResult} from '../../utils/entities/searchResult'; +import {OpenaireProperties, ErrorCodes} from '../../utils/properties/openaireProperties'; +import {SearchFields} from '../../utils/properties/searchFields'; +import {SearchPageTableViewComponent } from '../searchUtils/searchPageTableView.component'; +import {SearchUtilsClass } from '../searchUtils/searchUtils.class'; + +@Component({ + selector: 'search-content-providers-table', + template: ` + + + + ` + +}) +export class SearchCompatibleDataprovidersTableComponent { + private errorCodes: ErrorCodes; + + public results =[]; + public filters =[]; + public baseUrl:string; + public searchUtils:SearchUtilsClass = new SearchUtilsClass(); + public sub: any; public subResults: any; + public _location:Location; + public searchFields:SearchFields = new SearchFields(); + public refineFields: string[] = this.searchFields.COMPATIBLE_DATAPROVIDER_FIELDS; + + /*public CSV: any = { "columnNames": [ "Title", "Type", "Coutries", "Compatibility" ], + "export":[] + }; + public CSVDownloaded = false; + public csvParams: string; + public resourcesQuery = "&query=((oaftype exact datasource) not(datasourcecompatibilityid = UNKNOWN) not(datasourcecompatibilityid = notCompatible) not(datasourcetypeuiid = other))";*/ + + public disableForms: boolean = false; + + @ViewChild (SearchPageTableViewComponent) searchPage : SearchPageTableViewComponent ; + + constructor (private route: ActivatedRoute, private _searchDataprovidersService: SearchDataprovidersService ) { + this.errorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + this.baseUrl = OpenaireProperties.getLinkToSearchCompatibleDataProvidersTable(); + } + + public ngOnInit() { + this.searchPage.refineFields = this.refineFields; + this.sub = this.route.queryParams.subscribe(params => { + this.searchUtils.keyword = (params['keyword']?params['keyword']:''); + //this.searchUtils.page = (params['page']=== undefined)?1:+params['page']; + this.filters = this.createFilters(); + this.searchPage.getParametersFromUrl(params); + this._getResults(); + }); + } + + public ngOnDestroy() { + if(this.sub){ + this.sub.unsubscribe(); + } + if(this.subResults){ + this.subResults.unsubscribe(); + } } + private _getResults(){ + //this.csvParams = this.resourcesQuery+"&type=datasources"; + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + this.disableForms = true; + this.results = []; + this.searchUtils.totalResults = 0; + + let size: number = 0; + this.subResults = this._searchDataprovidersService.searchCompatibleDataprovidersTable().subscribe( + data => { + size = data; + if(size > 0) { + this.subResults = this._searchDataprovidersService.searchCompatibleDataproviders("", null, 1, size, []).subscribe( + data => { + this.searchUtils.totalResults = data[0]; + console.info("search Content Providers [total results:"+this.searchUtils.totalResults+"]"); + this.results = data[1]; + + this.searchPage.checkSelectedFilters(this.filters); + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + this.disableForms = false; + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + + this.disableForms = false; + + } + ); + } else { + this.searchPage.checkSelectedFilters(this.filters); + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.NONE; + this.disableForms = false; + } + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + } + ); + + } + private setFilters(){ + //TODO set filters from + } + + private createFilters():Filter[] { + var filter_names=["Type","Compatibility Level"]; + var filter_ids=["datasourcetypeuiid","datasourcecompatibilityname"]; + var searchFields = new SearchFields(); + var filter_original_ids = searchFields.COMPATIBLE_DATAPROVIDER_FIELDS; + var value_names=[ + /*[ + "Institutional Publication Repository","Thematic Publication Repository", "Other Publication Repository", + "Institutional Repositories Aggregators", + "Thematic Repositories Aggregators", "Other Repositories Aggregators", + "Data Repositories", "Data Repositories Aggregators", "Journals", "Journals Aggregators", "CRIS Systems", "Publication Catalogues"], + */ + [ + "Institutional Repository", "Thematic Repository", "Publication Repository", + "Institutional Repository Aggregator", + "Thematic Repositories Aggregators", "Publication Repository Aggregator", + "Data Repository", "Data Repository Aggregator", "CRIS Systems", "Publication Catalogue"], + + + + + ["OpenAIRE Basic (DRIVER OA)","OpenAIRE 2.0 (EC funding)", "OpenAIRE 2.0+ (DRIVER OA, EC funding)", "OpenAIRE 3.0 (OA, funding)","OpenAIRE Data (funded, referenced datasets)"]]; + + var value_original_ids=[ + ["pubsrepository::institutional","pubsrepository::thematic", "pubsrepository::unknown", "aggregator::pubsrepository::institutional","aggregator::pubsrepository::thematic","aggregator::pubsrepository::unknown", + "datarepository::unknown", "aggregator::datarepository", "cris", "pubscatalogue::unknown"], + //["driver","openaire2.0", "driver-openaire2.0", "openaire3.0","openaire2.0_data"] + ["OpenAIRE Basic (DRIVER OA)","OpenAIRE 2.0 (EC funding)", "OpenAIRE 2.0+ (DRIVER OA, EC funding)", "OpenAIRE 3.0 (OA, funding)","OpenAIRE Data (funded, referenced datasets)"]]; + var filters: Filter[] =[]; + for(var i =0 ; i < filter_names.length;i++){ + var values:Value[] = []; + for(var j =0 ; j < value_names[i].length;j++){ + var value:Value = {name: value_names[i][j], id: value_original_ids[i][j], number:j, selected:false} + values.push(value); + } + var filter:Filter = {title: filter_names[i], filterId: filter_ids[i], originalFilterId: filter_original_ids[i], values : values, countSelectedValues:0, "filterOperator": 'or' }; + filters.push(filter); + } + return filters; + } +} diff --git a/portal-4cli/src/app/searchPages/dataProviders/compatibleDataProvidersTable.module.ts b/portal-4cli/src/app/searchPages/dataProviders/compatibleDataProvidersTable.module.ts new file mode 100644 index 00000000..1efcace5 --- /dev/null +++ b/portal-4cli/src/app/searchPages/dataProviders/compatibleDataProvidersTable.module.ts @@ -0,0 +1,32 @@ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import{ CompatibleDataProvidersTableRoutingModule} from './compatibleDataProvidersTable-routing.module'; +import{SearchCompatibleDataprovidersTableComponent} from './compatibleDataProvidersTable.component'; + +//import {DatasourceTableViewModule } from '../searchUtils/datasourceTableView.module'; + +import {DataProvidersServiceModule} from '../../services/dataProvidersService.module'; +import {SearchFormModule} from '../searchUtils/searchForm.module'; +//import {SearchFilterModalModule} from '../searchUtils/searchFilterModal.module'; +import {SearchPageTableViewModule} from '../searchUtils/searchPageTableView.module'; +import {FreeGuard} from'../../login/freeGuard.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + CommonModule, FormsModule, + DataProvidersServiceModule, + SearchFormModule, CompatibleDataProvidersTableRoutingModule, SearchPageTableViewModule + + ], + declarations: [ + SearchCompatibleDataprovidersTableComponent + ], + providers:[FreeGuard, IsRouteEnabled], + exports: [ + SearchCompatibleDataprovidersTableComponent + ] +}) +export class CompatibleDataProvidersTableModule { } diff --git a/portal-4cli/src/app/searchPages/dataProviders/entityRegistries-routing.module.ts b/portal-4cli/src/app/searchPages/dataProviders/entityRegistries-routing.module.ts new file mode 100644 index 00000000..35e6b8bc --- /dev/null +++ b/portal-4cli/src/app/searchPages/dataProviders/entityRegistries-routing.module.ts @@ -0,0 +1,19 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import{SearchEntityRegistriesComponent} from './entityRegistries.component'; +import {FreeGuard} from'../../login/freeGuard.guard'; +import {PreviousRouteRecorder} from '../../utils/piwik/previousRouteRecorder.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + RouterModule.forChild([ + { path: '', component: SearchEntityRegistriesComponent, canActivate: [FreeGuard, IsRouteEnabled], data: { + redirect: '/error' + }, canDeactivate: [PreviousRouteRecorder] } + + ]) + ] +}) +export class EntityRegistriesRoutingModule { } diff --git a/portal-4cli/src/app/searchPages/dataProviders/entityRegistries.component.ts b/portal-4cli/src/app/searchPages/dataProviders/entityRegistries.component.ts new file mode 100644 index 00000000..d3652b04 --- /dev/null +++ b/portal-4cli/src/app/searchPages/dataProviders/entityRegistries.component.ts @@ -0,0 +1,178 @@ +import {Component, Input, ViewChild} from '@angular/core'; +import { ActivatedRoute} from '@angular/router'; + +import { Filter, Value} from '../searchUtils/searchHelperClasses.class'; + +import {SearchDataprovidersService} from '../../services/searchDataproviders.service'; +import {SearchResult} from '../../utils/entities/searchResult'; +import {OpenaireProperties, ErrorCodes} from '../../utils/properties/openaireProperties'; +import {SearchFields} from '../../utils/properties/searchFields'; +import {SearchPageComponent } from '../searchUtils/searchPage.component'; +import {SearchUtilsClass } from '../searchUtils/searchUtils.class'; + +@Component({ + selector: 'search-entity-registries', + template: ` + + + + + ` + +}) +export class SearchEntityRegistriesComponent { + private errorCodes: ErrorCodes; + + public results =[]; + public filters =[]; + public baseUrl:string; + public searchUtils:SearchUtilsClass = new SearchUtilsClass(); + public sub: any; public subResults: any; + public _location:Location; + public searchFields:SearchFields = new SearchFields(); + public refineFields: string[] = this.searchFields.ENTITY_REGISTRIES_FIELDS; + public fieldIdsMap= this.searchFields.DATASOURCE_FIELDS; + public _prefixQueryFields: {field:string,opName:string,opValue:string,values:string[]}[] =[ + {field:"type",opName:"tp",opValue:"and",values: ["other"]}]; + // ["entityregistry","entityregistry::projects","entityregistry::repositories"]}]; + public _prefixQuery: string = ""; + + public CSV: any = { "columnNames": [ "Title", "Type", "Coutries", "Compatibility" ], + "export":[] + }; + public CSVDownloaded = false; + public disableForms: boolean = false; + + @ViewChild (SearchPageComponent) searchPage : SearchPageComponent ; + public resourcesQuery = "&query=((oaftype exact datasource) and(datasourcetypeuiid = other))"; + public csvParams: string; + + constructor (private route: ActivatedRoute, private _searchDataprovidersService: SearchDataprovidersService ) { + this.errorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + this.baseUrl = OpenaireProperties.getLinkToSearchEntityRegistries(); + for(var i = 0; i < this._prefixQueryFields.length; i++ ){ + for(var j =0; j < this._prefixQueryFields[i].values.length; j++){ + this._prefixQuery+="&" + this._prefixQueryFields[i].field + "=" + + this._prefixQueryFields[i].values[j] + "&" + + this._prefixQueryFields[i].opName + "=" + this._prefixQueryFields[i].opValue; + } + } + this._prefixQuery+="&"; + } + + public ngOnInit() { + this.searchPage.refineFields = this.refineFields; + this.searchPage.fieldIdsMap = this.fieldIdsMap; + this.sub = this.route.queryParams.subscribe(params => { + this.searchUtils.keyword = (params['keyword']?params['keyword']:''); + this.searchUtils.page = (params['page']=== undefined)?1:+params['page']; + this.filters = this.createFilters(); + + var queryParameters = this.searchPage.getIndexQueryParametersFromUrl(params); + this._getResults(queryParameters, false, this.searchUtils.page, this.searchUtils.size); + }); + } + + public ngOnDestroy() { + if(this.sub){ + this.sub.unsubscribe(); + } + if(this.subResults){ + this.subResults.unsubscribe(); + } } + private _getResults(parameters:string,refine:boolean, page: number, size: number){ + this.csvParams = parameters+this.resourcesQuery+"&type=datasources"; + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + //this.searchPage.openLoading(); + this.disableForms = true; + this.results = []; + this.searchUtils.totalResults = 0; + + this.subResults = this._searchDataprovidersService.searchEntityRegistries(parameters,(refine)?this.searchPage.getRefineFieldsQuery():null, page, size, []).subscribe( + data => { + this.searchUtils.totalResults = data[0]; + console.info("search Entity Registries: [Parameters:"+parameters+" ] [total results:"+this.searchUtils.totalResults+"]"); + this.results = data[1]; + this.searchPage.checkSelectedFilters(this.filters); + this.searchPage.updateBaseUrlWithParameters(this.filters); + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + //this.searchPage.closeLoading(); + this.disableForms = false; + + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + + //this.searchPage.closeLoading(); + this.disableForms = false; + + } + ); + } + private setFilters(){ + //TODO set filters from + } + + public queryChanged($event) { + var parameters = $event.index; + console.info("queryChanged: Execute search query "+parameters); + this._getResults(parameters, false, this.searchUtils.page, this.searchUtils.size); + } + private createFilters():Filter[] { + var filter_names=["Type","Compatibility Level"]; + var filter_ids=["datasourcetypename","datasourcecompatibilityname"]; + var searchFields = new SearchFields(); + var filter_original_ids = searchFields.ENTITY_REGISTRIES_FIELDS; + var value_names=[ + ["Funder","Registry of repositories","Scholarly Comm. Infrastructure","Registry","Information Space","Web Source"], + + ["OpenAIRE Basic (DRIVER OA)","OpenAIRE 2.0 (EC funding)", "OpenAIRE 2.0+ (DRIVER OA, EC funding)", "OpenAIRE 3.0 (OA, funding)","OpenAIRE Data (funded, referenced datasets)"]]; + + var value_original_ids=[ + ["Funder database","Registry of repositories","Scholarly Comm. Infrastructure","Registry","Information Space","Web Source"], + //["entityregistry::projects","entityregistry::repositories","scholarcomminfra","entityregistry","infospace","websource"], + //["driver","openaire2.0", "driver-openaire2.0", "openaire3.0","openaire2.0_data"] + ["OpenAIRE Basic (DRIVER OA)","OpenAIRE 2.0 (EC funding)", "OpenAIRE 2.0+ (DRIVER OA, EC funding)", "OpenAIRE 3.0 (OA, funding)","OpenAIRE Data (funded, referenced datasets)"]]; + + var filters: Filter[] =[]; + for(var i =0 ; i < filter_names.length;i++){ + var values:Value[] = []; + for(var j =0 ; j < value_names[i].length;j++){ + var value:Value = {name: value_names[i][j], id: value_original_ids[i][j], number:j, selected:false} + values.push(value); + } + var filter:Filter = {title: filter_names[i], filterId: filter_ids[i], originalFilterId: filter_original_ids[i], values : values, countSelectedValues:0, "filterOperator": 'or' }; + filters.push(filter); + } + return filters; + } +} diff --git a/portal-4cli/src/app/searchPages/dataProviders/entityRegistries.module.ts b/portal-4cli/src/app/searchPages/dataProviders/entityRegistries.module.ts new file mode 100644 index 00000000..f1a2a277 --- /dev/null +++ b/portal-4cli/src/app/searchPages/dataProviders/entityRegistries.module.ts @@ -0,0 +1,32 @@ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import{ EntityRegistriesRoutingModule} from './entityRegistries-routing.module'; +import{SearchEntityRegistriesComponent} from './entityRegistries.component'; + +import {SearchResultsModule } from '../searchUtils/searchResults.module'; + +import {DataProvidersServiceModule} from '../../services/dataProvidersService.module'; +import {SearchFormModule} from '../searchUtils/searchForm.module'; +//import {SearchFilterModalModule} from '../searchUtils/searchFilterModal.module'; +import {SearchPageModule} from '../searchUtils/searchPage.module'; +import {FreeGuard} from'../../login/freeGuard.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + CommonModule, FormsModule, + DataProvidersServiceModule, + SearchFormModule, SearchResultsModule, EntityRegistriesRoutingModule, SearchPageModule + + ], + declarations: [ + SearchEntityRegistriesComponent + ], + providers:[FreeGuard, IsRouteEnabled], + exports: [ + SearchEntityRegistriesComponent + ] +}) +export class EntityRegistriesModule { } diff --git a/portal-4cli/src/app/searchPages/dataProviders/entityRegistriesTable-routing.module.ts b/portal-4cli/src/app/searchPages/dataProviders/entityRegistriesTable-routing.module.ts new file mode 100644 index 00000000..64986745 --- /dev/null +++ b/portal-4cli/src/app/searchPages/dataProviders/entityRegistriesTable-routing.module.ts @@ -0,0 +1,19 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import{SearchEntityRegistriesTableComponent} from './entityRegistriesTable.component'; +import {FreeGuard} from'../../login/freeGuard.guard'; +import {PreviousRouteRecorder} from '../../utils/piwik/previousRouteRecorder.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + RouterModule.forChild([ + { path: '', component: SearchEntityRegistriesTableComponent, canActivate: [FreeGuard, IsRouteEnabled], data: { + redirect: '/error' + }, canDeactivate: [PreviousRouteRecorder] } + + ]) + ] +}) +export class EntityRegistriesTableRoutingModule { } diff --git a/portal-4cli/src/app/searchPages/dataProviders/entityRegistriesTable.component.ts b/portal-4cli/src/app/searchPages/dataProviders/entityRegistriesTable.component.ts new file mode 100644 index 00000000..c4c5a453 --- /dev/null +++ b/portal-4cli/src/app/searchPages/dataProviders/entityRegistriesTable.component.ts @@ -0,0 +1,206 @@ +import {Component, Input, ViewChild} from '@angular/core'; +import { ActivatedRoute} from '@angular/router'; + +import { Filter, Value} from '../searchUtils/searchHelperClasses.class'; + +import {SearchDataprovidersService} from '../../services/searchDataproviders.service'; +import {SearchResult} from '../../utils/entities/searchResult'; +import {OpenaireProperties, ErrorCodes} from '../../utils/properties/openaireProperties'; +import {SearchFields} from '../../utils/properties/searchFields'; +import {SearchPageTableViewComponent } from '../searchUtils/searchPageTableView.component'; +import {SearchUtilsClass } from '../searchUtils/searchUtils.class'; + +@Component({ + selector: 'search-entity-registries-table', + template: ` + + + + + ` + +}) +export class SearchEntityRegistriesTableComponent { + private errorCodes: ErrorCodes; + + public results =[]; + public filters =[]; + public baseUrl:string; + public searchUtils:SearchUtilsClass = new SearchUtilsClass(); + public sub: any; public subResults: any; + public _location:Location; + public searchFields:SearchFields = new SearchFields(); + public refineFields: string[] = this.searchFields.ENTITY_REGISTRIES_FIELDS; + public disableForms: boolean = false; + + @ViewChild (SearchPageTableViewComponent) searchPage : SearchPageTableViewComponent ; + + constructor (private route: ActivatedRoute, private _searchDataprovidersService: SearchDataprovidersService ) { + this.errorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + } + + public ngOnInit() { + this.searchPage.refineFields = this.refineFields; + this.sub = this.route.queryParams.subscribe(params => { + this.searchUtils.keyword = (params['keyword']?params['keyword']:''); + //this.searchUtils.page = (params['page']=== undefined)?1:+params['page']; + this.filters = this.createFilters(); + + this.searchPage.getParametersFromUrl(params); + this._getResults("", false, this.searchUtils.page); + }); + } + + public ngOnDestroy() { + if(this.sub){ + this.sub.unsubscribe(); + } + if(this.subResults){ + this.subResults.unsubscribe(); + } } + private _getResults(parameters:string,refine:boolean, page: number){ + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + this.disableForms = true; + this.results = []; + this.searchUtils.totalResults = 0; + + let size: number = 0; + this.subResults = this._searchDataprovidersService.searchEntityRegistriesTable().subscribe( + data => { + size = data; + if(size > 0) { + this.subResults = this._searchDataprovidersService.searchEntityRegistries("",null, page, size, []).subscribe( + data => { + this.searchUtils.totalResults = data[0]; + console.info("search Entity Registries [total results:"+this.searchUtils.totalResults+"]"); + this.results = data[1]; + this.searchPage.checkSelectedFilters(this.filters); + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + this.disableForms = false; + + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + + this.disableForms = false; + + } + ); + } else { + this.searchPage.checkSelectedFilters(this.filters); + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.NONE; + this.disableForms = false; + } + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + } + ); +/* + this.subResults = this._searchDataprovidersService.searchEntityRegistries(parameters,(refine)?this.searchPage.getRefineFieldsQuery():null, page, size, []).subscribe( + data => { + this.searchUtils.totalResults = data[0]; + console.info("search Entity Registries: [Parameters:"+parameters+" ] [total results:"+this.searchUtils.totalResults+"]"); + this.results = data[1]; + this.searchPage.checkSelectedFilters(this.filters); + this.searchPage.updateBaseUrlWithParameters(this.filters); + var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = errorCodes.NONE; + } + //this.searchPage.closeLoading(); + this.disableForms = false; + + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = errorCodes.ERROR; + //this.searchPage.closeLoading(); + this.disableForms = false; + + } + ); +*/ + } + private setFilters(){ + //TODO set filters from + } + + + private createFilters():Filter[] { + var filter_names=["Type","Compatibility Level"]; + var filter_ids=["datasourcetypename","datasourcecompatibilityname"]; + var searchFields = new SearchFields(); + var filter_original_ids = searchFields.ENTITY_REGISTRIES_FIELDS; + var value_names=[ + ["Funder database","Registry of repositories","Scholarly Comm. Infrastructure","Registry","Information Space","Web Source"], + + ["OpenAIRE Basic (DRIVER OA)","OpenAIRE 2.0 (EC funding)", "OpenAIRE 2.0+ (DRIVER OA, EC funding)", "OpenAIRE 3.0 (OA, funding)","OpenAIRE Data (funded, referenced datasets)"]]; + + var value_original_ids=[ + ["Funder database","Registry of repositories","Scholarly Comm. Infrastructure","Registry","Information Space","Web Source"], + //["entityregistry::projects","entityregistry::repositories","scholarcomminfra","entityregistry","infospace","websource"], + //["driver","openaire2.0", "driver-openaire2.0", "openaire3.0","openaire2.0_data"] + ["OpenAIRE Basic (DRIVER OA)","OpenAIRE 2.0 (EC funding)", "OpenAIRE 2.0+ (DRIVER OA, EC funding)", "OpenAIRE 3.0 (OA, funding)","OpenAIRE Data (funded, referenced datasets)"]]; + + var filters: Filter[] =[]; + for(var i =0 ; i < filter_names.length;i++){ + var values:Value[] = []; + for(var j =0 ; j < value_names[i].length;j++){ + var value:Value = {name: value_names[i][j], id: value_original_ids[i][j], number:j, selected:false} + values.push(value); + } + var filter:Filter = {title: filter_names[i], filterId: filter_ids[i], originalFilterId: filter_original_ids[i], values : values, countSelectedValues:0, "filterOperator": 'or' }; + filters.push(filter); + } + return filters; + } +} diff --git a/portal-4cli/src/app/searchPages/dataProviders/entityRegistriesTable.module.ts b/portal-4cli/src/app/searchPages/dataProviders/entityRegistriesTable.module.ts new file mode 100644 index 00000000..9d9b824c --- /dev/null +++ b/portal-4cli/src/app/searchPages/dataProviders/entityRegistriesTable.module.ts @@ -0,0 +1,32 @@ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import{ EntityRegistriesTableRoutingModule} from './entityRegistriesTable-routing.module'; +import{SearchEntityRegistriesTableComponent} from './entityRegistriesTable.component'; + +//import {DatasourceTableViewModule } from '../searchUtils/datasourceTableView.module'; + +import {DataProvidersServiceModule} from '../../services/dataProvidersService.module'; +import {SearchFormModule} from '../searchUtils/searchForm.module'; +//import {SearchFilterModalModule} from '../searchUtils/searchFilterModal.module'; +import {SearchPageTableViewModule} from '../searchUtils/searchPageTableView.module'; +import {FreeGuard} from'../../login/freeGuard.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + CommonModule, FormsModule, + DataProvidersServiceModule, + SearchFormModule, EntityRegistriesTableRoutingModule, SearchPageTableViewModule + + ], + declarations: [ + SearchEntityRegistriesTableComponent + ], + providers:[FreeGuard, IsRouteEnabled], + exports: [ + SearchEntityRegistriesTableComponent + ] +}) +export class EntityRegistriesTableModule { } diff --git a/portal-4cli/src/app/searchPages/dataProviders/journals-routing.module.ts b/portal-4cli/src/app/searchPages/dataProviders/journals-routing.module.ts new file mode 100644 index 00000000..d9c3de9d --- /dev/null +++ b/portal-4cli/src/app/searchPages/dataProviders/journals-routing.module.ts @@ -0,0 +1,19 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import{SearchJournalsComponent} from './journals.component'; +import {FreeGuard} from'../../login/freeGuard.guard'; +import {PreviousRouteRecorder} from '../../utils/piwik/previousRouteRecorder.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + RouterModule.forChild([ + { path: '', component: SearchJournalsComponent, canActivate: [FreeGuard, IsRouteEnabled], data: { + redirect: '/error' + }, canDeactivate: [PreviousRouteRecorder] } + + ]) + ] +}) +export class JournalsRoutingModule { } diff --git a/portal-4cli/src/app/searchPages/dataProviders/journals.component.ts b/portal-4cli/src/app/searchPages/dataProviders/journals.component.ts new file mode 100644 index 00000000..265d0126 --- /dev/null +++ b/portal-4cli/src/app/searchPages/dataProviders/journals.component.ts @@ -0,0 +1,181 @@ +import {Component, Input, ViewChild} from '@angular/core'; +import { ActivatedRoute} from '@angular/router'; + +import { Filter, Value} from '../searchUtils/searchHelperClasses.class'; + +import {SearchDataprovidersService} from '../../services/searchDataproviders.service'; +import {SearchResult} from '../../utils/entities/searchResult'; +import {OpenaireProperties, ErrorCodes} from '../../utils/properties/openaireProperties'; +import {SearchFields} from '../../utils/properties/searchFields'; +import {SearchPageComponent } from '../searchUtils/searchPage.component'; +import {SearchUtilsClass } from '../searchUtils/searchUtils.class'; + +@Component({ + selector: 'search-journals', + template: ` + + + + ` + +}) +export class SearchJournalsComponent { + private errorCodes: ErrorCodes; + + public results =[]; + public filters =[]; + public baseUrl:string; + public searchUtils:SearchUtilsClass = new SearchUtilsClass(); + public sub: any; public subResults: any; + public _location:Location; + public searchFields:SearchFields = new SearchFields(); + public refineFields: string[] = this.searchFields.JOURNAL_FIELDS; + public fieldIdsMap= this.searchFields.DATASOURCE_FIELDS; + public _prefixQueryFields: {field:string,opName:string,opValue:string,values:string[]}[] =[{field:"compatibility",opName:"cm",opValue:"not", values:["UNKNOWN","hostedBy","notCompatible"]},{field:"type",opName:"tp",opValue:"not",values: ["other"]}]; + // ["entityregistry","entityregistry::projects","entityregistry::repositories"]}]; + public _prefixQuery: string = ""; + + public CSV: any = { "columnNames": [ "Title", "Type", "Coutries", "Compatibility" ], + "export":[] + }; + public CSVDownloaded = false; + public resourcesQuery = '&query=((oaftype exact datasource) not(datasourcecompatibilityid = UNKNOWN) not(datasourcecompatibilityid = notCompatible) and (datasourcetypeuiid exact "pubsrepository::journal" or datasourcetypeuiid exact "aggregator::pubsrepository::journals" ))'; + //"&query=((oaftype exact datasource) not(datasourcecompatibilityid = UNKNOWN) not(datasourcecompatibilityid = notCompatible) not(datasourcetypeuiid = other))"; + public csvParams: string; + public disableForms: boolean = false; + + @ViewChild (SearchPageComponent) searchPage : SearchPageComponent ; + + constructor (private route: ActivatedRoute, private _searchDataprovidersService: SearchDataprovidersService ) { + this.errorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + this.baseUrl = OpenaireProperties.getLinkToSearchJournals(); + for(var i = 0; i < this._prefixQueryFields.length; i++ ){ + for(var j =0; j < this._prefixQueryFields[i].values.length; j++){ + this._prefixQuery+="&" + this._prefixQueryFields[i].field + "=" + + this._prefixQueryFields[i].values[j] + "&" + + this._prefixQueryFields[i].opName + "=" + this._prefixQueryFields[i].opValue; + } + } + this._prefixQuery+="&"; + } + + public ngOnInit() { + this.searchPage.refineFields = this.refineFields; + this.searchPage.fieldIdsMap = this.fieldIdsMap; + this.sub = this.route.queryParams.subscribe(params => { + this.searchUtils.keyword = (params['keyword']?params['keyword']:''); + this.searchUtils.page = (params['page']=== undefined)?1:+params['page']; + this.filters = this.createFilters(); + var queryParameters = this.searchPage.getIndexQueryParametersFromUrl(params); + console.info("|"+queryParameters+"|"); + this._getResults(queryParameters, false, this.searchUtils.page, this.searchUtils.size); + }); + } + + public ngOnDestroy() { + if(this.sub){ + this.sub.unsubscribe(); + } + if(this.subResults){ + this.subResults.unsubscribe(); + } } + private _getResults(parameters:string,refine:boolean, page: number, size: number){ + this.csvParams = parameters+this.resourcesQuery+"&type=datasources"; + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + //this.searchPage.openLoading(); + this.disableForms = true; + this.results = []; + this.searchUtils.totalResults = 0; + + this.subResults = this._searchDataprovidersService.searchJournals(parameters,(refine)?this.searchPage.getRefineFieldsQuery():null, page, size, []).subscribe( + data => { + this.searchUtils.totalResults = data[0]; + console.info("search Journals: [Parameters:"+parameters+" ] [total results:"+this.searchUtils.totalResults+"]"); + this.results = data[1]; + this.searchPage.checkSelectedFilters(this.filters); + this.searchPage.updateBaseUrlWithParameters(this.filters); + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + //this.searchPage.closeLoading(); + this.disableForms = false; + + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + + //this.searchPage.closeLoading(); + this.disableForms = false; + + } + ); + } + private setFilters(){ + //TODO set filters from + } + + public queryChanged($event) { + var parameters = $event.index; + console.info("queryChanged: Execute search query "+parameters); + + this._getResults(parameters, false, this.searchUtils.page, this.searchUtils.size); + } + private createFilters():Filter[] { + var filter_names=["Type","Compatibility Level"]; + var filter_ids=["datasourcetypeuiid","datasourcecompatibilityname"]; + var searchFields = new SearchFields(); + var filter_original_ids = searchFields.JOURNAL_FIELDS; + var value_names=[ + /*[ + "Institutional Publication Repository","Thematic Publication Repository", "Other Publication Repository", + "Institutional Repositories Aggregators", + "Thematic Repositories Aggregators", "Other Repositories Aggregators", + "Data Repositories", "Data Repositories Aggregators", "Journals", "Journals Aggregators", "CRIS Systems", "Publication Catalogues"], + */ + ["Journal", "Journal Aggregator\/Publisher"], + ["OpenAIRE Basic (DRIVER OA)","OpenAIRE 2.0 (EC funding)", "OpenAIRE 2.0+ (DRIVER OA, EC funding)", "OpenAIRE 3.0 (OA, funding)","OpenAIRE Data (funded, referenced datasets)"]]; + + var value_original_ids=[ + ["pubsrepository::journal", "aggregator::pubsrepository::journals"], + //["driver","openaire2.0", "driver-openaire2.0", "openaire3.0","openaire2.0_data"] + ["OpenAIRE Basic (DRIVER OA)","OpenAIRE 2.0 (EC funding)", "OpenAIRE 2.0+ (DRIVER OA, EC funding)", "OpenAIRE 3.0 (OA, funding)","OpenAIRE Data (funded, referenced datasets)"]]; + var filters: Filter[] =[]; + for(var i =0 ; i < filter_names.length;i++){ + var values:Value[] = []; + for(var j =0 ; j < value_names[i].length;j++){ + var value:Value = {name: value_names[i][j], id: value_original_ids[i][j], number:j, selected:false} + values.push(value); + } + var filter:Filter = {title: filter_names[i], filterId: filter_ids[i], originalFilterId: filter_original_ids[i], values : values, countSelectedValues:0, "filterOperator": 'or' }; + filters.push(filter); + } + return filters; + } +} diff --git a/portal-4cli/src/app/searchPages/dataProviders/journals.module.ts b/portal-4cli/src/app/searchPages/dataProviders/journals.module.ts new file mode 100644 index 00000000..c8c76b1e --- /dev/null +++ b/portal-4cli/src/app/searchPages/dataProviders/journals.module.ts @@ -0,0 +1,32 @@ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import{ JournalsRoutingModule} from './journals-routing.module'; +import{SearchJournalsComponent} from './journals.component'; + +import {SearchResultsModule } from '../searchUtils/searchResults.module'; + +import {DataProvidersServiceModule} from '../../services/dataProvidersService.module'; +import {SearchFormModule} from '../searchUtils/searchForm.module'; +//import {SearchFilterModalModule} from '../searchUtils/searchFilterModal.module'; +import {SearchPageModule} from '../searchUtils/searchPage.module'; +import {FreeGuard} from'../../login/freeGuard.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + CommonModule, FormsModule, + DataProvidersServiceModule, + SearchFormModule, SearchResultsModule, JournalsRoutingModule, SearchPageModule + + ], + declarations: [ + SearchJournalsComponent + ], + providers:[FreeGuard, IsRouteEnabled], + exports: [ + SearchJournalsComponent + ] +}) +export class JournalsModule { } diff --git a/portal-4cli/src/app/searchPages/dataProviders/journalsTable-routing.module.ts b/portal-4cli/src/app/searchPages/dataProviders/journalsTable-routing.module.ts new file mode 100644 index 00000000..de701dcd --- /dev/null +++ b/portal-4cli/src/app/searchPages/dataProviders/journalsTable-routing.module.ts @@ -0,0 +1,19 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import{SearchJournalsTableComponent} from './journalsTable.component'; +import {FreeGuard} from'../../login/freeGuard.guard'; +import {PreviousRouteRecorder} from '../../utils/piwik/previousRouteRecorder.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + RouterModule.forChild([ + { path: '', component: SearchJournalsTableComponent, canActivate: [FreeGuard, IsRouteEnabled], data: { + redirect: '/error' + } , canDeactivate: [PreviousRouteRecorder] } + + ]) + ] +}) +export class JournalsTableRoutingModule { } diff --git a/portal-4cli/src/app/searchPages/dataProviders/journalsTable.component.ts b/portal-4cli/src/app/searchPages/dataProviders/journalsTable.component.ts new file mode 100644 index 00000000..4322a268 --- /dev/null +++ b/portal-4cli/src/app/searchPages/dataProviders/journalsTable.component.ts @@ -0,0 +1,191 @@ +import {Component, Input, ViewChild} from '@angular/core'; +import { ActivatedRoute} from '@angular/router'; + +import { Filter, Value} from '../searchUtils/searchHelperClasses.class'; + +import {SearchDataprovidersService} from '../../services/searchDataproviders.service'; +import {SearchResult} from '../../utils/entities/searchResult'; +import {OpenaireProperties, ErrorCodes} from '../../utils/properties/openaireProperties'; +import {SearchFields} from '../../utils/properties/searchFields'; +import {SearchPageTableViewComponent } from '../searchUtils/searchPageTableView.component'; +import {SearchUtilsClass } from '../searchUtils/searchUtils.class'; + +@Component({ + selector: 'search-journals-table', + template: ` + + + + ` + +}) +export class SearchJournalsTableComponent { + private errorCodes: ErrorCodes; + + public results =[]; + public filters =[]; + public baseUrl:string; + public searchUtils:SearchUtilsClass = new SearchUtilsClass(); + public sub: any; public subResults: any; + public _location:Location; + public searchFields:SearchFields = new SearchFields(); + public refineFields: string[] = this.searchFields.JOURNAL_FIELDS; + + /*public CSV: any = { "columnNames": [ "Title", "Type", "Coutries", "Compatibility" ], + "export":[] + }; + public CSVDownloaded = false; + public csvParams: string; + public resourcesQuery = "&query=((oaftype exact datasource) not(datasourcecompatibilityid = UNKNOWN) not(datasourcecompatibilityid = notCompatible) not(datasourcetypeuiid = other))";*/ + + public disableForms: boolean = false; + + @ViewChild (SearchPageTableViewComponent) searchPage : SearchPageTableViewComponent ; + + constructor (private route: ActivatedRoute, private _searchDataprovidersService: SearchDataprovidersService ) { + this.errorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + this.baseUrl = OpenaireProperties.getLinkToSearchJournalsTable(); + } + + public ngOnInit() { + this.searchPage.refineFields = this.refineFields; + this.sub = this.route.queryParams.subscribe(params => { + this.searchUtils.keyword = (params['keyword']?params['keyword']:''); + //this.searchUtils.page = (params['page']=== undefined)?1:+params['page']; + this.filters = this.createFilters(); + this.searchPage.getParametersFromUrl(params); + this._getResults(); + }); + } + + public ngOnDestroy() { + if(this.sub){ + this.sub.unsubscribe(); + } + if(this.subResults){ + this.subResults.unsubscribe(); + } } + private _getResults(){ + //this.csvParams = this.resourcesQuery+"&type=datasources"; + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + this.disableForms = true; + this.results = []; + this.searchUtils.totalResults = 0; + + let size: number = 0; + this.subResults = this._searchDataprovidersService.searchJournalsTable().subscribe( + data => { + size = data; + if(size > 0) { + this.subResults = this._searchDataprovidersService.searchJournals("", null, 1, size, []).subscribe( + data => { + this.searchUtils.totalResults = data[0]; + console.info("search Journals [total results:"+this.searchUtils.totalResults+"]"); + this.results = data[1]; + + this.searchPage.checkSelectedFilters(this.filters); + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + this.disableForms = false; + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + + this.disableForms = false; + + } + ); + } else { + this.searchPage.checkSelectedFilters(this.filters); + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.NONE; + this.disableForms = false; + } + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + } + ); + + } + private setFilters(){ + //TODO set filters from + } + + private createFilters():Filter[] { + var filter_names=["Type","Compatibility Level"]; + var filter_ids=["datasourcetypeuiid","datasourcecompatibilityname"]; + var searchFields = new SearchFields(); + var filter_original_ids = searchFields.JOURNAL_FIELDS; + var value_names=[ + /*[ + "Institutional Publication Repository","Thematic Publication Repository", "Other Publication Repository", + "Institutional Repositories Aggregators", + "Thematic Repositories Aggregators", "Other Repositories Aggregators", + "Data Repositories", "Data Repositories Aggregators", "Journals", "Journals Aggregators", "CRIS Systems", "Publication Catalogues"], + */ + ["Journal", "Journal Aggregator\/Publisher"], + + + + + ["OpenAIRE Basic (DRIVER OA)","OpenAIRE 2.0 (EC funding)", "OpenAIRE 2.0+ (DRIVER OA, EC funding)", "OpenAIRE 3.0 (OA, funding)","OpenAIRE Data (funded, referenced datasets)"]]; + + var value_original_ids=[ + ["pubsrepository::journal", "aggregator::pubsrepository::journals"], + //["driver","openaire2.0", "driver-openaire2.0", "openaire3.0","openaire2.0_data"] + ["OpenAIRE Basic (DRIVER OA)","OpenAIRE 2.0 (EC funding)", "OpenAIRE 2.0+ (DRIVER OA, EC funding)", "OpenAIRE 3.0 (OA, funding)","OpenAIRE Data (funded, referenced datasets)"]]; + var filters: Filter[] =[]; + for(var i =0 ; i < filter_names.length;i++){ + var values:Value[] = []; + for(var j =0 ; j < value_names[i].length;j++){ + var value:Value = {name: value_names[i][j], id: value_original_ids[i][j], number:j, selected:false} + values.push(value); + } + var filter:Filter = {title: filter_names[i], filterId: filter_ids[i], originalFilterId: filter_original_ids[i], values : values, countSelectedValues:0, "filterOperator": 'or' }; + filters.push(filter); + } + return filters; + } +} diff --git a/portal-4cli/src/app/searchPages/dataProviders/journalsTable.module.ts b/portal-4cli/src/app/searchPages/dataProviders/journalsTable.module.ts new file mode 100644 index 00000000..307dcb89 --- /dev/null +++ b/portal-4cli/src/app/searchPages/dataProviders/journalsTable.module.ts @@ -0,0 +1,32 @@ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import{ JournalsTableRoutingModule} from './journalsTable-routing.module'; +import{SearchJournalsTableComponent} from './journalsTable.component'; + +//import {DatasourceTableViewModule } from '../searchUtils/datasourceTableView.module'; + +import {DataProvidersServiceModule} from '../../services/dataProvidersService.module'; +import {SearchFormModule} from '../searchUtils/searchForm.module'; +//import {SearchFilterModalModule} from '../searchUtils/searchFilterModal.module'; +import {SearchPageTableViewModule} from '../searchUtils/searchPageTableView.module'; +import {FreeGuard} from'../../login/freeGuard.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + CommonModule, FormsModule, + DataProvidersServiceModule, + SearchFormModule, JournalsTableRoutingModule, SearchPageTableViewModule + + ], + declarations: [ + SearchJournalsTableComponent + ], + providers:[FreeGuard, IsRouteEnabled], + exports: [ + SearchJournalsTableComponent + ] +}) +export class JournalsTableModule { } diff --git a/portal-4cli/src/app/searchPages/find/mainSearch-routing.module.ts b/portal-4cli/src/app/searchPages/find/mainSearch-routing.module.ts new file mode 100644 index 00000000..69df52f5 --- /dev/null +++ b/portal-4cli/src/app/searchPages/find/mainSearch-routing.module.ts @@ -0,0 +1,16 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import{SearchComponent} from './search.component'; +import {FreeGuard} from'../../login/freeGuard.guard'; +import {PreviousRouteRecorder} from '../../utils/piwik/previousRouteRecorder.guard'; + +@NgModule({ + imports: [ + RouterModule.forChild([ + { path: '', component: SearchComponent, canActivate: [FreeGuard], canDeactivate: [PreviousRouteRecorder] } + + ]) + ] +}) +export class MainSearchRoutingModule { } diff --git a/portal-4cli/src/app/searchPages/find/mainSearch.module.ts b/portal-4cli/src/app/searchPages/find/mainSearch.module.ts new file mode 100644 index 00000000..fe01546d --- /dev/null +++ b/portal-4cli/src/app/searchPages/find/mainSearch.module.ts @@ -0,0 +1,41 @@ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { RouterModule } from '@angular/router'; + +import{MainSearchRoutingModule} from './mainSearch-routing.module'; +import{SearchComponent} from './search.component'; + +import {SearchResultsModule } from '../searchUtils/searchResults.module'; + +import {DataProvidersServiceModule} from '../../services/dataProvidersService.module'; +import {DatasetsServiceModule} from '../../services/datasetsService.module'; +import {SoftwareServiceModule} from '../../services/softwareService.module'; +import {ProjectsServiceModule} from '../../services/projectsService.module'; +import {PublicationsServiceModule} from '../../services/publicationsService.module'; +import {OrganizationsServiceModule} from '../../services/organizationsService.module'; +import {BrowseEntitiesModule} from '../searchUtils/browseEntities.module'; +import {SearchFormModule} from '../searchUtils/searchForm.module'; +//import {SearchFilterModalModule} from '../searchUtils/searchFilterModal.module'; +import {FreeGuard} from'../../login/freeGuard.guard'; +import {PiwikServiceModule} from '../../utils/piwik/piwikService.module'; +import {PreviousRouteRecorder} from '../../utils/piwik/previousRouteRecorder.guard'; + +@NgModule({ + imports: [ + CommonModule, FormsModule, RouterModule, + DataProvidersServiceModule, DatasetsServiceModule, SoftwareServiceModule, ProjectsServiceModule, + PublicationsServiceModule, OrganizationsServiceModule, + BrowseEntitiesModule, SearchFormModule, SearchResultsModule, MainSearchRoutingModule, PiwikServiceModule + + ], + declarations: [ + SearchComponent + ], + providers:[FreeGuard, PreviousRouteRecorder + ], + exports: [ + SearchComponent + ] +}) +export class MainSearchModule { } diff --git a/portal-4cli/src/app/searchPages/find/search.component.html b/portal-4cli/src/app/searchPages/find/search.component.html new file mode 100644 index 00000000..16d936d9 --- /dev/null +++ b/portal-4cli/src/app/searchPages/find/search.component.html @@ -0,0 +1,241 @@ + + +
    +
    +
    +
    + +
    +
    +
    + +
    +
    +
    +
    +
    + + + + + +
    + +
    +
    +
    +
    diff --git a/portal-4cli/src/app/searchPages/find/search.component.ts b/portal-4cli/src/app/searchPages/find/search.component.ts new file mode 100644 index 00000000..056c34e1 --- /dev/null +++ b/portal-4cli/src/app/searchPages/find/search.component.ts @@ -0,0 +1,400 @@ +import {Component, Input, Output, EventEmitter, ViewChild, ChangeDetectionStrategy, ViewEncapsulation} from '@angular/core'; +import {Observable} from 'rxjs/Observable'; +import {ActivatedRoute, Router} from '@angular/router'; +import {Location} from '@angular/common'; + +import { Meta, MetaDefinition} from '../../../angular2-meta'; + +import { FetchPublications } from '../../utils/fetchEntitiesClasses/fetchPublications.class'; +import { FetchDataproviders } from '../../utils/fetchEntitiesClasses/fetchDataproviders.class'; +import { FetchProjects } from '../../utils/fetchEntitiesClasses/fetchProjects.class'; +import { FetchDatasets } from '../../utils/fetchEntitiesClasses/fetchDatasets.class'; +import { FetchSoftware } from '../../utils/fetchEntitiesClasses/fetchSoftware.class'; +import { FetchOrganizations } from '../../utils/fetchEntitiesClasses/fetchOrganizations.class'; + +import {SearchPublicationsService} from '../../services/searchPublications.service'; +import {SearchDataprovidersService} from '../../services/searchDataproviders.service'; +import {SearchProjectsService} from '../../services/searchProjects.service'; +import {SearchDatasetsService} from '../../services/searchDatasets.service'; +import {SearchSoftwareService} from '../../services/searchSoftware.service'; +import {SearchOrganizationsService} from '../../services/searchOrganizations.service'; + +import {OpenaireProperties} from '../../utils/properties/openaireProperties'; +import {SearchFields} from '../../utils/properties/searchFields'; +import {ErrorCodes} from '../../utils/properties/openaireProperties'; +import {RouterHelper} from '../../utils/routerHelper.class'; +import {RefineFieldResultsService} from '../../services/refineFieldResults.service'; +import {PiwikService} from '../../utils/piwik/piwik.service'; +import { ConfigurationService } from '../../utils/configuration/configuration.service'; + +@Component({ + changeDetection: ChangeDetectionStrategy.Default, + encapsulation: ViewEncapsulation.Emulated, + selector: 'search-find', + templateUrl: 'search.component.html' +}) +export class SearchComponent { + public sub: any; piwiksub: any; + public reloadPublications: boolean; + public reloadDatasets: boolean; + public reloadSoftware: boolean; + public reloadProjects: boolean; + public reloadDataproviders: boolean; + public reloadOrganizations: boolean; + + + public pageTitle = "Search in OpenAIRE" + public keyword:string = ""; + public publications:string[]; + public datasets:string[]; + public software:string[]; + public projectsTab:string[]; + public dataproviders:string[]; + public organizations:string[]; + + public activeTab = "publications"; + public linkToSearchPublications = ""; + public linkToSearchProjects = ""; + public linkToSearchDataproviders = ""; + public linkToSearchDatasets = ""; + public linkToSearchSoftware = ""; + public linkToSearchOrganizations = ""; + + public fetchPublications : FetchPublications; + public fetchDataproviders : FetchDataproviders; + public fetchProjects : FetchProjects; + public fetchDatasets: FetchDatasets; + public fetchSoftware: FetchSoftware; + public fetchOrganizations: FetchOrganizations; + + public searchFields:SearchFields = new SearchFields(); + public errorCodes:ErrorCodes = new ErrorCodes(); + public routerHelper:RouterHelper = new RouterHelper(); + + public publicationsSize:any = null; + public datasetsSize:any = null; + public softwareSize:any = null; + public fundersSize:any = null; + public projectsSize:any = null; + public datasourcesSize:any = null; + showPublications:boolean= false; + showDatasets:boolean= false; + showSoftware:boolean=false; + showProjects:boolean= false; + showDataProviders:boolean= false; + showOrganizations:boolean= false; +public subPub;public subData;public subProjects;public subOrg; public subDataPr; + constructor ( private route: ActivatedRoute, + private _router: Router, + private _searchPublicationsService: SearchPublicationsService, + private _searchDataprovidersService: SearchDataprovidersService, + private _searchProjectsService: SearchProjectsService, + private _searchDatasetsService: SearchDatasetsService, + private _searchSoftwareService: SearchSoftwareService, + private _searchOrganizationsService: SearchOrganizationsService, + private _refineFieldResultsService:RefineFieldResultsService, + private location: Location, private _meta: Meta,private _piwikService:PiwikService, + private config: ConfigurationService ) { + this.fetchPublications = new FetchPublications(this._searchPublicationsService); + this.fetchDataproviders = new FetchDataproviders(this._searchDataprovidersService); + this.fetchProjects = new FetchProjects(this._searchProjectsService); + this.fetchDatasets = new FetchDatasets( this._searchDatasetsService); + this.fetchSoftware = new FetchSoftware(this._searchSoftwareService); + this.fetchOrganizations = new FetchOrganizations( this._searchOrganizationsService); + + var description = "open access, research, scientific publication, European Commission, EC, FP7, ERC, Horizon 2020, H2020, search, projects "; + + var title = "OpenAIRE | Search publications, research data, projects... | OpenAIRE"; + + var url = OpenaireProperties.getBaseLink()+this._router.url; + this._meta.setTitle(title); + this._meta.updateMeta("description", description); + this._meta.updateProperty("og:description", description); + this._meta.updateProperty("og:title", title); + this._meta.updateProperty("og:url", url); + if(OpenaireProperties.isPiwikTrackEnabled() && (typeof document !== 'undefined')){ + this.piwiksub = this._piwikService.trackView("OpenAIRE |Search publications, research data, projects...").subscribe(); + + } + + + + } + + public ngOnInit() { + const entityOne = this.config.isEntityEnabled("publication"); + const entityTwo = this.config.isEntityEnabled("dataset"); + const entityThree = this.config.isEntityEnabled("project"); + const entityFour = this.config.isEntityEnabled("organization"); + const entityFive = this.config.isEntityEnabled("datasource"); + const entitySix = this.config.isEntityEnabled("software"); + const example = Observable.zip(entityOne,entityTwo,entityThree,entityFour,entityFive,entitySix); + +//wait until all observables have emitted a value then emit all as an array + this.sub = this.route.queryParams.subscribe(params => { + const subscribe = example.subscribe(data => { + this.showPublications = data[0]; + this.showDatasets = data[1]; + this.showProjects = data[2]; + this.showOrganizations = data[3]; + this.showDataProviders = data[4]; + this.showSoftware = data[5]; + console.log(data) + this.keyword = (params['keyword'])?params['keyword']:""; + if(this.keyword !=null && this.keyword.length > 0){ + this.reloadTabs(); + //if showPublications == false will set another entity as the first + if(this.showPublications){ + this.activeTab = "publications"; + this.searchPublications(); + }else if(this.showDatasets){ + this.activeTab = "research data"; + this.searchDatasets(); + }else if(this.showSoftware){ + this.activeTab = "software"; + this.searchSoftware(); + }else if(this.showProjects){ + this.activeTab = "projects"; + this.searchProjects(); + }else if(this.showDataProviders){ + this.activeTab = "content providers"; + this.searchDataProviders(); + }else if(this.showOrganizations){ + this.activeTab = "organizations"; + this.searchOrganizations(); + } + this.count(); + } + }); + }); + + } + public ngOnDestroy() { + this.sub.unsubscribe(); + if(this.piwiksub){ + this.piwiksub.unsubscribe(); +} + if(this.keyword !=null && this.keyword.length > 0){ + if(this.subPub){ + this.subPub.unsubscribe(); + } + if(this.subData){ + this.subData.unsubscribe(); + } + if(this.subProjects){ + this.subProjects.unsubscribe(); + } + if(this.subOrg){ + this.subOrg.unsubscribe(); + } + if(this.subDataPr){ + this.subDataPr.unsubscribe(); + } + + } + } + public searchPublications() { + this.activeTab = "publications"; + if( this.reloadPublications && + this.fetchPublications.searchUtils.status != this.errorCodes.NONE && + this.fetchPublications.searchUtils.status != this.errorCodes.ERROR) { + this.reloadPublications = false; + this.fetchPublications.getResultsByKeyword(this.keyword, 1, 10); + this.linkToSearchPublications = OpenaireProperties.getLinkToSearchPublications();// + "?keyword=" + this.keyword; + } + } + public searchDatasets() { + this.activeTab = "research data"; + if(this.reloadDatasets && + this.fetchDatasets.searchUtils.status != this.errorCodes.NONE && + this.fetchDatasets.searchUtils.status != this.errorCodes.ERROR) { + this.reloadDatasets = false; + this.fetchDatasets.getResultsByKeyword(this.keyword, 1, 10); + this.linkToSearchDatasets = OpenaireProperties.getLinkToSearchDatasets();// + "?keyword=" + this.keyword; + } + } + public searchSoftware() { + this.activeTab = "software"; + if(this.reloadSoftware && + ( this.fetchSoftware.searchUtils.status == this.errorCodes.LOADING || + this.fetchSoftware.searchUtils.status == this.errorCodes.DONE )) { + this.reloadSoftware = false; + this.fetchSoftware.getResultsByKeyword(this.keyword, 1, 10); + this.linkToSearchSoftware = OpenaireProperties.getLinkToSearchSoftware();// + "?keyword=" + this.keyword; + } + } + public searchProjects() { + this.activeTab = "projects"; + if(this.reloadProjects && + this.fetchProjects.searchUtils.status != this.errorCodes.NONE && + this.fetchProjects.searchUtils.status != this.errorCodes.ERROR) { + this.reloadProjects = false; + this.fetchProjects.getResultsByKeyword(this.keyword, 1, 10); + this.linkToSearchProjects = OpenaireProperties.getLinkToSearchProjects();// + "?keyword=" + this.keyword; + } + } + public searchDataProviders() { + this.activeTab = "content providers"; + if( this.reloadDataproviders && + this.fetchDataproviders.searchUtils.status != this.errorCodes.NONE && + this.fetchDataproviders.searchUtils.status != this.errorCodes.ERROR) { + this.reloadDataproviders = false; + this.fetchDataproviders.getResultsByKeyword(this.keyword, 1, 10); + this.linkToSearchDataproviders = OpenaireProperties.getLinkToSearchDataProviders();// + "?keyword=" + this.keyword; + } + } + public searchOrganizations() { + this.activeTab = "organizations"; + if( this.reloadOrganizations && + this.fetchOrganizations.searchUtils.status != this.errorCodes.NONE && + this.fetchOrganizations.searchUtils.status != this.errorCodes.ERROR) { + this.reloadOrganizations = false; + this.fetchOrganizations.getResultsByKeyword(this.keyword, 1, 10); + this.linkToSearchOrganizations = OpenaireProperties.getLinkToSearchOrganizations();// + "?keyword=" + this.keyword; + } + } + + + public keywordChanged($event){ + + this.keyword = $event.value; + console.info("Search Find: search with keyword \"" + this.keyword + "\"" ); + this.location.go(location.pathname,"?keyword=" + this.keyword); + this.reloadTabs(); + if(this.activeTab == "publications") { + this.searchPublications(); + } + if(this.activeTab == "projects") { + this.searchProjects(); + } + if(this.activeTab == "content providers") { + this.searchDataProviders(); + } + if(this.activeTab == "research data") { + this.searchDatasets(); + } + if(this.activeTab == "software") { + this.searchSoftware(); + } + if(this.activeTab == "organizations") { + this.searchOrganizations(); + } + + this.count(); + } + + private count() { + if(this.activeTab != "publications" && this.showPublications){ + this.fetchPublications.searchUtils.status = this.errorCodes.LOADING; + this.fetchPublications.results = []; + this.subPub = this._searchPublicationsService.numOfSearchPublications(this.keyword).subscribe( + data => { + console.log("Count results: "+data); + this.fetchPublications.searchUtils.totalResults = data; + this.fetchPublications.searchUtils.status = this.errorCodes.DONE; + if(this.fetchPublications.searchUtils.totalResults == 0) { + this.fetchPublications.searchUtils.status = this.errorCodes.NONE; + } + }, + err => { + console.log(err); + this.fetchPublications.searchUtils.status = this.errorCodes.ERROR; + } + ); + } + if(this.activeTab != "research data" && this.showDatasets){ + this.fetchDatasets.searchUtils.status = this.errorCodes.LOADING; + this.fetchDatasets.results = []; + this.subData = this._searchDatasetsService.numOfSearchDatasets(this.keyword).subscribe( + data => { + this.fetchDatasets.searchUtils.totalResults = data; + this.fetchDatasets.searchUtils.status = this.errorCodes.DONE; + if(this.fetchDatasets.searchUtils.totalResults == 0) { + this.fetchDatasets.searchUtils.status = this.errorCodes.NONE; + } + }, + err => { + console.log(err); + this.fetchDatasets.searchUtils.status = this.errorCodes.ERROR; + } + ); + } + if(this.activeTab != "software" && this.showSoftware){ + this.fetchSoftware.searchUtils.status = this.errorCodes.LOADING; + this.fetchSoftware.results = []; + this.subData = this._searchSoftwareService.numOfSearchSoftware(this.keyword).subscribe( + data => { + this.fetchSoftware.searchUtils.totalResults = data; + this.fetchSoftware.searchUtils.status = this.errorCodes.DONE; + if(this.fetchSoftware.searchUtils.totalResults == 0) { + this.fetchSoftware.searchUtils.status = this.errorCodes.NONE; + } + }, + err => { + console.log(err); + if(err.status == '404') { + this.fetchSoftware.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.fetchSoftware.searchUtils.status = this.errorCodes.ERROR; + } else { + this.fetchSoftware.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + //this.fetchSoftware.searchUtils.status = this.errorCodes.ERROR; + } + ); + } + if(this.activeTab != "projects" && this.showProjects){ + this.fetchProjects.searchUtils.status = this.errorCodes.LOADING; + this.fetchProjects.results = []; + this.subProjects = this._searchProjectsService.numOfSearchProjects(this.keyword).subscribe( + data => { + this.fetchProjects.searchUtils.totalResults = data; + this.fetchProjects.searchUtils.status = this.errorCodes.DONE; + if(this.fetchProjects.searchUtils.totalResults == 0) { + this.fetchProjects.searchUtils.status = this.errorCodes.NONE; + } + }, + err => { + console.log(err); + this.fetchProjects.searchUtils.status = this.errorCodes.ERROR; + } + ); + } + if(this.activeTab != "content providers" && this.showDataProviders){ + this.fetchDataproviders.results = []; + this.fetchDataproviders.getNumForSearch(this.keyword); + } + if(this.activeTab != "organizations" && this.showOrganizations){ + this.fetchOrganizations.searchUtils.status = this.errorCodes.LOADING; + this.fetchOrganizations.results = []; + this.subOrg = this._searchOrganizationsService.numOfSearchOrganizations(this.keyword).subscribe( + data => { + this.fetchOrganizations.searchUtils.totalResults = data; + this.fetchOrganizations.searchUtils.status = this.errorCodes.DONE; + if(this.fetchOrganizations.searchUtils.totalResults == 0) { + this.fetchOrganizations.searchUtils.status = this.errorCodes.NONE; + } + }, + err => { + console.log(err); + this.fetchOrganizations.searchUtils.status = this.errorCodes.ERROR; + + } + ); + } + + + } + + private reloadTabs() { + this.reloadPublications = true; + this.reloadDatasets = true; + this.reloadSoftware = true; + this.reloadProjects = true; + this.reloadDataproviders = true; + this.reloadOrganizations = true; + } + + + +} diff --git a/portal-4cli/src/app/searchPages/searchUtils/advancedSearchForm.component.html b/portal-4cli/src/app/searchPages/searchUtils/advancedSearchForm.component.html new file mode 100644 index 00000000..938ca3cd --- /dev/null +++ b/portal-4cli/src/app/searchPages/searchUtils/advancedSearchForm.component.html @@ -0,0 +1,56 @@ + +
    + + + + + + + + + + + + + + + + +
    Search for: + + + + + + + + Yes
    +
    + + No
    +
    +
    + + + + + + + + +
    +
    + +
    + +
    diff --git a/portal-4cli/src/app/searchPages/searchUtils/advancedSearchForm.component.ts b/portal-4cli/src/app/searchPages/searchUtils/advancedSearchForm.component.ts new file mode 100644 index 00000000..1e7ef861 --- /dev/null +++ b/portal-4cli/src/app/searchPages/searchUtils/advancedSearchForm.component.ts @@ -0,0 +1,95 @@ +import {Component, Input, Output, EventEmitter, ElementRef} from '@angular/core'; +import {Observable} from 'rxjs/Observable'; +import { Subject } from 'rxjs/Subject'; + +import {AdvancedField, OPERATOR} from '../searchUtils/searchHelperClasses.class'; +import {SearchFields} from '../../utils/properties/searchFields'; +import {Dates} from '../../utils/string-utils.class'; + +@Component({ + selector: 'advanced-search-form', + templateUrl: 'advancedSearchForm.component.html' +}) +export class AdvancedSearchFormComponent { + @Input() entityType; + @Input() fieldIds: string[]; + @Input() fieldIdsMap; + @Input() selectedFields:AdvancedField[]; + @Input() isDisabled: boolean = false; + + @Output() queryChange = new EventEmitter(); + newFieldId:string; + newFieldName:string; + fieldList:{[id:string]:any[]} = {}; + public searchFields:SearchFields = new SearchFields(); + + public operators: [{name:string, id:string}] = this.searchFields.ADVANCED_SEARCH_OPERATORS; + constructor () { + } + + ngOnInit() { + for(var i = 0; i < this.fieldIds.length; i++){ + this.fieldList[this.fieldIds[i]]=[]; + } + this.newFieldId = this.fieldIds[0]; + this.newFieldName = this.fieldIdsMap[this.newFieldId].name; + } + + queryChanged() { + this.queryChange.emit({ + // selectedFields: this.selectedFields, + // selectedQuantifiers: this.selectedQuantifiers, + // keywords: this.keywords + }); + } + + addField() { + this.newFieldId = this.fieldIds[0]; + var type = this.fieldIdsMap[this.newFieldId].type; + if(type == "boolean"){ + this.selectedFields.push(new AdvancedField(this.newFieldId,this.fieldIdsMap[this.newFieldId].param, this.fieldIdsMap[this.newFieldId].name, type, "true", "and")); + }else{ + this.selectedFields.push(new AdvancedField(this.newFieldId, this.fieldIdsMap[this.newFieldId].param,this.fieldIdsMap[this.newFieldId].name, type, "", "and")); + } + + } + + removeField(index: number) { + this.selectedFields.splice(index, 1); + + } + + fieldOperatorChanged(index: number, operatorId: string, operatorName: string) { + this.selectedFields[index].operatorId = operatorId; + this.selectedFields[index].operatorName = operatorName; + } + validateDate(index: number, value: string){ + this.selectedFields[index].valid = Dates.isValidYear(value); + } + + fieldIdsChanged(index: number, fieldId:string ) { + console.log("Field index::"+index + " " + this.selectedFields[index].id + " function id:" +fieldId); + + var id= this.fieldIds[0]; + this.selectedFields[index].name = this.fieldIdsMap[id].name; + this.selectedFields[index].type = this.fieldIdsMap[id].type; + this.selectedFields[index].value = ""; + this.selectedFields[index].param = this.fieldIdsMap[id].param; + + var id =fieldId;//this.selectedFields[index].id; + this.selectedFields[index].name = this.fieldIdsMap[id].name; + this.selectedFields[index].type = this.fieldIdsMap[id].type; + this.selectedFields[index].value = ""; + this.selectedFields[index].param = this.fieldIdsMap[id].param; + if(this.fieldIdsMap[id].type == "boolean"){ + this.selectedFields[index].value = "true"; + } + } + valueChanged($event,index:number){ + this.selectedFields[index].value = $event.value; + } + listUpdated($event,fieldId:number){ + this.fieldList[fieldId] = $event.value; + } + +} diff --git a/portal-4cli/src/app/searchPages/searchUtils/advancedSearchForm.module.ts b/portal-4cli/src/app/searchPages/searchUtils/advancedSearchForm.module.ts new file mode 100644 index 00000000..1ee2f437 --- /dev/null +++ b/portal-4cli/src/app/searchPages/searchUtils/advancedSearchForm.module.ts @@ -0,0 +1,26 @@ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import{AdvancedSearchFormComponent} from './advancedSearchForm.component'; +import {EntitiesAutocompleteModule} from '../../utils/entitiesAutoComplete/entitiesAutoComplete.module'; +import {StaticAutocompleteModule} from '../../utils/staticAutoComplete/staticAutoComplete.module'; +import {DateFilterModule} from './dateFilter.module'; + + +@NgModule({ + imports: [ + CommonModule, FormsModule, EntitiesAutocompleteModule, StaticAutocompleteModule, DateFilterModule + ], + declarations: [ + AdvancedSearchFormComponent, +], + + providers:[ + ], + exports: [ + AdvancedSearchFormComponent + + ] +}) +export class AdvancedSearchFormModule { } diff --git a/portal-4cli/src/app/searchPages/searchUtils/advancedSearchPage.component.html b/portal-4cli/src/app/searchPages/searchUtils/advancedSearchPage.component.html new file mode 100644 index 00000000..e27fa9ed --- /dev/null +++ b/portal-4cli/src/app/searchPages/searchUtils/advancedSearchPage.component.html @@ -0,0 +1,61 @@ +
    +
    +
    +
    +
    + {{pageTitle}} +
    +
    + Simple search + + + + +
    + +
    +
    + +
    +
    + +
    + + + +
    + + +
    +
    + +
    + + + +
    +
    + + +
    + +
    + +
    + +
    +
    +
    + +
    +
    +
    diff --git a/portal-4cli/src/app/searchPages/searchUtils/advancedSearchPage.component.ts b/portal-4cli/src/app/searchPages/searchUtils/advancedSearchPage.component.ts new file mode 100644 index 00000000..a668f7af --- /dev/null +++ b/portal-4cli/src/app/searchPages/searchUtils/advancedSearchPage.component.ts @@ -0,0 +1,254 @@ +import {Component, Input, ViewChild, Output, EventEmitter} from '@angular/core'; +import {Observable} from 'rxjs/Observable'; +import {Location} from '@angular/common'; +import { Router} from '@angular/router'; +import {Filter, Value,AdvancedField} from '../searchUtils/searchHelperClasses.class'; +import {SearchResult} from '../../utils/entities/searchResult'; +import {SearchFields} from '../../utils/properties/searchFields'; +import {SearchUtilsClass} from './searchUtils.class'; +import {ModalLoading} from '../../utils/modal/loading.component'; +import {StringUtils, Dates} from '../../utils/string-utils.class'; +import { Meta} from '../../../angular2-meta'; +import {OpenaireProperties} from '../../utils/properties/openaireProperties'; +import {PiwikService} from '../../utils/piwik/piwik.service'; + +@Component({ + selector: 'advanced-search-page', + templateUrl: 'advancedSearchPage.component.html' +}) +export class AdvancedSearchPageComponent { + @Input() pageTitle = ""; + @Input() results = []; + @Input() type; + @Input() entityType; + @Input() searchUtils:SearchUtilsClass = new SearchUtilsClass(); + @Input() fieldIds: string[]; + @Input() fieldIdsMap;//:{ [key:string]:{ name:string, operator:string, type:string, indexField:string, equalityOperator:string }} ; + @Input() selectedFields:AdvancedField[]; + @Input() simpleSearchUrl: string; + @ViewChild (ModalLoading) loading : ModalLoading ; + @Input() csvParams: string; + @Input() csvPath: string; + @Input() simpleSearchLink: string = ""; + @Input() disableForms:boolean = false; + @Input() loadPaging: boolean = true; + @Input() oldTotalResults: number = 0; + + piwiksub: any; + public parameterNames:string[] =[]; + public parameterValues:string[] =[]; + + public baseURLWithParameters:string = ''; + + @Output() queryChange = new EventEmitter(); + constructor (private location: Location, private _meta: Meta, private _piwikService:PiwikService, private router: Router) { + } + + ngOnInit() { + this.updateTitle("Advanced search "+this.pageTitle); + this.updateDescription("Openaire, search, repositories, open access, type, content provider, funder, project, "+ this.pageTitle); + if(typeof window !== 'undefined') { + this.updateUrl(OpenaireProperties.getBaseLink()+location.pathname); + } + + this.searchUtils.baseUrl = "/" + this.searchUtils.baseUrl; + this.updateBaseUrlWithParameters(); + if(OpenaireProperties.isPiwikTrackEnabled() && (typeof document !== 'undefined')){ + this.piwiksub = this._piwikService.trackView(this.pageTitle).subscribe(); + } + } + + ngOnDestroy() { + if(this.piwiksub){ + this.piwiksub.unsubscribe(); +} + } + updateDescription(description:string){ + this._meta.updateMeta("description", description); + this._meta.updateProperty("og:description", description); + } + updateTitle(title:string){ + var _prefix ="OpenAIRE | "; + var _title = _prefix + ((title.length> 50 ) ?title.substring(0,50):title); + this._meta.setTitle(_title ); + this._meta.updateProperty("og:title",_title); + } + updateUrl(url:string){ + this._meta.updateProperty("og:url", url); + } + + public getSelectedFiltersFromUrl(params){ + for(var i=0; i< this.fieldIds.length ; i++){ + + var fieldId = this.fieldIds[i]; + var fieldparam = (this.fieldIdsMap[fieldId])?this.fieldIdsMap[fieldId].param:""; + if(!this.fieldIdsMap[fieldId]){ + + console.error("Field: "+fieldId +" not found in fieldIds map"); + } + + var operatorId = this.getOperatorParameter(fieldparam); + if(params[fieldparam] != undefined && params[operatorId] != undefined) { + var values:string [] = StringUtils.URIDecode(params[fieldparam]).split(/,(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/,-1); + var operators:string [] = (StringUtils.URIDecode(params[operatorId])).split(/,(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/,-1); + if(values.length == operators.length){ + for(var j=0; j< values.length ; j++){ + if(this.fieldIdsMap[fieldId].type == "date"){ + var value:string =StringUtils.unquote(values[j]); + var validDates:boolean = true; + var dateField:AdvancedField = new AdvancedField(fieldId,fieldparam,this.fieldIdsMap[fieldId].name,this.fieldIdsMap[fieldId].type,value,operators[j]) ; + if(value.indexOf("range") != -1){ + dateField.dateValue.type="range"; + if(value.length < 26 ){ + validDates =false; + }else{ + if(!Dates.isValidDate(value.substring(5,15)) || !Dates.isValidDate(value.substring(16,26))){ + validDates =false; + }else { + dateField.dateValue.from = Dates.getDateFromString(value.substring(5,15)); + dateField.dateValue.to = Dates.getDateFromString(value.substring(16,26)); + } + } + // "rangeYYYY-MM-DD:YYYY-MM-DD" + }else{ + dateField.dateValue.setDatesByType(value); + } + if(validDates){ + this.selectedFields.push(dateField); + } + + }else{ + this.selectedFields.push(new AdvancedField(fieldId,fieldparam,this.fieldIdsMap[fieldId].name,this.fieldIdsMap[fieldId].type,StringUtils.unquote(values[j]),operators[j]) ); + } + } + } + } + } + if(this.selectedFields.length == 0){ + this.selectedFields.push(new AdvancedField(this.fieldIds[0],fieldparam,this.fieldIdsMap[this.fieldIds[0]].name,this.fieldIdsMap[this.fieldIds[0]].type,"","and")); + } + } + private createUrlParameters(includePage:boolean){ + var params=""; + this.parameterNames.splice(0,this.parameterNames.length); + this.parameterValues.splice(0,this.parameterValues.length); + var fields: { [key:string]:{ values:string[], operators:string[] }}={}; + for(var i = 0; i< this.selectedFields.length; i++){ + if(this.fieldIdsMap[this.selectedFields[i].id] != undefined && (this.selectedFields[i].value.length > 0 || this.selectedFields[i].type == "date" )){ + if(!fields[this.selectedFields[i].id]){ + fields[this.selectedFields[i].id] = {values:[], operators:[]}; + fields[this.selectedFields[i].id].values =[]; + fields[this.selectedFields[i].id].operators =[]; + } + if(this.selectedFields[i].type == "date"){ + if(this.selectedFields[i].dateValue.type == "range"){ + fields[this.selectedFields[i].id].values.push(StringUtils.quote(StringUtils.URIEncode("range"+Dates.getDateToString(this.selectedFields[i].dateValue.from)+":"+Dates.getDateToString(this.selectedFields[i].dateValue.to)))); + }else{ + fields[this.selectedFields[i].id].values.push(StringUtils.quote(StringUtils.URIEncode(this.selectedFields[i].dateValue.type))); + } + }else{ + fields[this.selectedFields[i].id].values.push(StringUtils.quote(StringUtils.URIEncode(this.selectedFields[i].value))); + } + fields[this.selectedFields[i].id].operators.push(this.selectedFields[i].operatorId); + + } + } + for(var i = 0; i< this.fieldIds.length; i++){ + if(fields[this.fieldIds[i]]){ + + params+="&"+this.fieldIdsMap[this.fieldIds[i]].param+"="+fields[this.fieldIds[i]].values.join()+ + "&"+this.getOperatorParameter(this.fieldIdsMap[this.fieldIds[i]].param)+"="+fields[this.fieldIds[i]].operators.join() + this.parameterNames.push(this.fieldIdsMap[this.fieldIds[i]].param); + this.parameterValues.push(fields[this.fieldIds[i]].values.join()); + this.parameterNames.push(this.getOperatorParameter(this.fieldIdsMap[this.fieldIds[i]].param)); + this.parameterValues.push(fields[this.fieldIds[i]].operators.join()); + } + } + if(includePage && this.searchUtils.page != 1){ + params += "&page="+this.searchUtils.page; + } + return '?'+params; + } + public createQueryParameters(){ + var params=""; + var countParams = 0; + for(var i = 0; i< this.selectedFields.length; i++){ + if(this.fieldIdsMap[this.selectedFields[i].id] != undefined && (this.selectedFields[i].value != "" ||this.selectedFields[i].type == "date")){ + console.log("createQueryParameters::"+this.selectedFields[i].type); + if(this.selectedFields[i].type == "date"){ + if(this.selectedFields[i].dateValue.type != "any"){ + params += (countParams == 0 ? "" : this.selectedFields[i].operatorId) + " " + this.selectedFields[i].id + this.fieldIdsMap[this.selectedFields[i].id].equalityOperator+ '"' + StringUtils.URIEncode(Dates.getDateToString(this.selectedFields[i].dateValue.from)) + " " + + StringUtils.URIEncode(Dates.getDateToString(this.selectedFields[i].dateValue.to)) + '"' + " "; + } + }else{ + if(this.selectedFields[i].id == "q"){ + var op = ""; + // if() + params += (countParams == 0 ? "" : this.selectedFields[i].operatorId) + " " + '"' + StringUtils.URIEncode(this.selectedFields[i].value) + '"' + " "; + }else if(countParams == 0 && this.selectedFields[i].operatorId == "not"){ + params += " "+ this.selectedFields[i].id + " <> "+'"' + StringUtils.URIEncode(this.selectedFields[i].value) +'"' + " "; + }else{ + params += (countParams == 0 ? "" : this.selectedFields[i].operatorId + " " ) + this.selectedFields[i].id + this.fieldIdsMap[this.selectedFields[i].id].equalityOperator+'"' + encodeURIComponent(this.selectedFields[i].value) +'"' + " "; + + } + } + countParams++; + } + } + + return params; + + } + clearFilters(){ + } + + goTo(page:number = 1){ + this.searchUtils.page = page; + var urlParameters = this.createUrlParameters(true); + var queryParameters = this.createQueryParameters(); + this.location.go(location.pathname,urlParameters); + this.queryChange.emit({ + value: queryParameters + }); + /* Code For Piwik*/ + if (typeof localStorage !== 'undefined') { + console.log("In PreviousRouteRecorder : "+this.router.url ); + localStorage.setItem('previousRoute', this.router.url); + } + if(OpenaireProperties.isPiwikTrackEnabled() && (typeof document !== 'undefined')){ + this.piwiksub = this._piwikService.trackView(this.pageTitle).subscribe(); + } + /* End Piwik Code */ + } + + queryChanged($event) { + + this.goTo(1); + } + pageChanged($event) { + this.searchUtils.page = +$event.value; + this.goTo(this.searchUtils.page); + } + /* + * Update the url with proper parameters. This is used as base url in Paging Component + */ + public updateBaseUrlWithParameters(){ + this.baseURLWithParameters = this.searchUtils.baseUrl + this.createUrlParameters(false); + } + getOperatorParameter(parameter:string):string{ + if(parameter.length > 2){ + return parameter.substring(0,2); + }else if(parameter == "q"){ + return "op"; + }else{ + return parameter+"Op"; + } + } + // for loading + public openLoading(){ + this.loading.open(); + } + public closeLoading(){ + this.loading.close(); + } +} diff --git a/portal-4cli/src/app/searchPages/searchUtils/advancedSearchPage.module.ts b/portal-4cli/src/app/searchPages/searchUtils/advancedSearchPage.module.ts new file mode 100644 index 00000000..df34b56c --- /dev/null +++ b/portal-4cli/src/app/searchPages/searchUtils/advancedSearchPage.module.ts @@ -0,0 +1,33 @@ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { RouterModule } from '@angular/router'; + +import{AdvancedSearchPageComponent} from './advancedSearchPage.component'; +import{SearchResultsModule} from './searchResults.module'; +import{LoadingModalModule} from '../../utils/modal/loadingModal.module'; +import {ReportsServiceModule} from '../../services/reportsService.module'; +import {SearchDownloadModule} from './searchDownload.module'; +import{SearchPagingModule} from './searchPaging.module'; + +import {AdvancedSearchFormModule} from '../searchUtils/advancedSearchForm.module'; +import {PiwikServiceModule} from '../../utils/piwik/piwikService.module'; +import {PreviousRouteRecorder} from '../../utils/piwik/previousRouteRecorder.guard'; +import {HelperModule} from '../../utils/helper/helper.module'; + +@NgModule({ + imports: [ + CommonModule, FormsModule, RouterModule, SearchResultsModule, LoadingModalModule, ReportsServiceModule, SearchPagingModule, AdvancedSearchFormModule, SearchDownloadModule, PiwikServiceModule, HelperModule + ], + declarations: [ + AdvancedSearchPageComponent, +], + + providers:[ + PreviousRouteRecorder + ], + exports: [ + AdvancedSearchPageComponent, + ] +}) +export class AdvancedSearchPageModule { } diff --git a/portal-4cli/src/app/searchPages/searchUtils/browseEntities.component.ts b/portal-4cli/src/app/searchPages/searchUtils/browseEntities.component.ts new file mode 100644 index 00000000..36cc7bbe --- /dev/null +++ b/portal-4cli/src/app/searchPages/searchUtils/browseEntities.component.ts @@ -0,0 +1,96 @@ +import {Component, Input, ViewChild} from '@angular/core'; +import { ActivatedRoute} from '@angular/router'; +import {Location} from '@angular/common'; + +import { Filter, Value} from '../searchUtils/searchHelperClasses.class'; + +import {RefineFieldResultsService} from '../../services/refineFieldResults.service'; +import {OpenaireProperties, ErrorCodes} from '../../utils/properties/openaireProperties'; +import {SearchFields} from '../../utils/properties/searchFields'; +import {SearchPageComponent } from '../searchUtils/searchPage.component'; +import {SearchUtilsClass} from '../searchUtils/searchUtils.class'; + +@Component({ + selector: 'browse-entities', + template: ` +
    + + + +
    +
    + +
    +
    +
    +` + +}) +export class BrowseEntitiesComponent { + public searchFields:SearchFields = new SearchFields(); + public filters =[]; + @Input() public baseUrl:string = ""; + @Input() public entityName:string = ""; + @Input() public refineFields: string[] ;//= this.searchFields.RESULT_REFINE_FIELDS; + public sub: any; + public errorCodes:ErrorCodes = new ErrorCodes(); + public status = this.errorCodes.LOADING; + public fieldIdsMap=this.searchFields.RESULT_REFINE_FIELDS; + + constructor ( private _refineFieldsService: RefineFieldResultsService ) { + // this.baseUrl = OpenaireProperties.getLinkToSearchPublications(); + + } + + public ngOnInit() { + for(var i=0; i < this.searchFields.HIDDEN_FIELDS.length; i++){ + var index = this.refineFields.indexOf(this.searchFields.HIDDEN_FIELDS[i]) ; + if(index > -1){ + this.refineFields.splice(index,1); + + } + } + this.getStats(); + } + + public ngOnDestroy() { + if(this.sub){ + this.sub.unsubscribe(); + } + } + + +private getStats(){ + + this.status = this.errorCodes.LOADING; + this.sub = this._refineFieldsService.getRefineFieldsResultsByEntityName(this.refineFields,this.entityName).subscribe( + data => { + console.info("Get Stats for "+this.entityName+ ": [Total:"+data[0]+" ] [fields: "+data[1].length+"]"); + this.filters = data[1]; + this.status = this.errorCodes.DONE; + if(data[0] == 0 ){ + this.status = this.errorCodes.NONE; + } + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //this.status = this.errorCodes.ERROR; + if(err.status == '404') { + this.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.status = this.errorCodes.ERROR; + } else { + this.status = this.errorCodes.NOT_AVAILABLE; + } + } + ); +} +} diff --git a/portal-4cli/src/app/searchPages/searchUtils/browseEntities.module.ts b/portal-4cli/src/app/searchPages/searchUtils/browseEntities.module.ts new file mode 100644 index 00000000..2d8d3cda --- /dev/null +++ b/portal-4cli/src/app/searchPages/searchUtils/browseEntities.module.ts @@ -0,0 +1,31 @@ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { RouterModule } from '@angular/router'; + +import {RefineFieldResultsServiceModule} from '../../services/refineFieldResultsService.module'; + +import {BrowseEntitiesComponent} from './browseEntities.component'; +import {BrowseStatisticComponent} from './browseStatistic.component'; + +import {ErrorMessagesModule} from '../../utils/errorMessages.module'; + +@NgModule({ + imports: [ + CommonModule, FormsModule, ErrorMessagesModule, + RefineFieldResultsServiceModule, RouterModule + ], + declarations: [ + BrowseEntitiesComponent, + BrowseStatisticComponent + +], + + providers:[ + ], + exports: [ + BrowseEntitiesComponent, + BrowseStatisticComponent + ] +}) +export class BrowseEntitiesModule { } diff --git a/portal-4cli/src/app/searchPages/searchUtils/browseStatistic.component.html b/portal-4cli/src/app/searchPages/searchUtils/browseStatistic.component.html new file mode 100644 index 00000000..3eb79bc6 --- /dev/null +++ b/portal-4cli/src/app/searchPages/searchUtils/browseStatistic.component.html @@ -0,0 +1,50 @@ + + {{filter.title}} + + + + + + + diff --git a/portal-4cli/src/app/searchPages/searchUtils/browseStatistic.component.ts b/portal-4cli/src/app/searchPages/searchUtils/browseStatistic.component.ts new file mode 100644 index 00000000..485e6d97 --- /dev/null +++ b/portal-4cli/src/app/searchPages/searchUtils/browseStatistic.component.ts @@ -0,0 +1,42 @@ +import {Component, Input, ViewChild} from '@angular/core'; +import { ActivatedRoute} from '@angular/router'; +import {Location} from '@angular/common'; + +import { Filter, Value} from '../searchUtils/searchHelperClasses.class'; + +import {RefineFieldResultsService} from '../../services/refineFieldResults.service'; +import {OpenaireProperties, ErrorCodes} from '../../utils/properties/openaireProperties'; +import {SearchFields} from '../../utils/properties/searchFields'; +import {SearchPageComponent } from '../searchUtils/searchPage.component'; +import {SearchUtilsClass} from '../searchUtils/searchUtils.class'; +import {RouterHelper} from '../../utils/routerHelper.class'; +@Component({ + selector: 'browse-statistic', + templateUrl: 'browseStatistic.component.html' + +}) +export class BrowseStatisticComponent { + + @Input() public baseUrl:string = ""; + @Input() public filter:any = ""; + private _maxCharacters = 30; + public viewAll = false; + public routerHelper:RouterHelper = new RouterHelper(); + constructor () { + + } + + public ngOnInit() { + + + } + + quote(str:string){ + return '"'+str+'"'; + } + + private _formatName(value){ + return value.name+" ";//(((value.name+" ("+value.number+")").length >this._maxCharacters)?(value.name.substring(0,(this._maxCharacters - (" ("+value.number+")").length - ('...').length))+"..."):value.name) + } + +} diff --git a/portal-4cli/src/app/searchPages/searchUtils/dateFilter.component.ts b/portal-4cli/src/app/searchPages/searchUtils/dateFilter.component.ts new file mode 100644 index 00000000..f03eb76a --- /dev/null +++ b/portal-4cli/src/app/searchPages/searchUtils/dateFilter.component.ts @@ -0,0 +1,73 @@ +import {Component, Input, Output, EventEmitter} from '@angular/core'; +import {Observable} from 'rxjs/Observable'; + +import { Filter, Value, DateValue} from './searchHelperClasses.class'; +import {IMyOptions, IMyDateModel} from '../../utils/my-date-picker/interfaces/index'; +// import {IMyDateModel} from '../../../utils/my-date-picker/interfaces/my-date-model.interface'; +import {Dates} from '../../utils/string-utils.class'; + +@Component({ + selector: 'date-filter', + template: ` + + +
    + + + + +
    + + From + + To
    +
    + ` + +}) + +export class DateFilterComponent { + + @Input() dateValue = new DateValue("any"); + @Input() filterId; + + private myDatePickerOptions: IMyOptions = { + // other options... + dateFormat: 'yyyy-mm-dd', + selectionTxtFontSize: '15px', + height:'28px', + width: '100%', + editableDateField: false, + showClearDateBtn: false + }; + + // Initialized to specific date (09.10.2018). + public from;//: Object = { date: { year: 2018, month: 10, day: 9 } }; + public to;//: Object = { date: { year: 2018, month: 10, day: 9 } }; + +constructor() { + this.updateDefaultRangeDates(this.dateValue.from,this.dateValue.to); +} +updateDefaultRangeDates(df:Date,dt:Date){ + this.from = { date: { year: df.getFullYear(), month: (df.getMonth()+1), day: df.getDate() } }; + this.to = { date: { year: dt.getFullYear(), month: (dt.getMonth()+1), day: dt.getDate() } }; + } +typeChanged(type:string){ + this.dateValue.setDatesByType(type); + this.updateDefaultRangeDates(this.dateValue.from, this.dateValue.to); +} + +onFromDateChanged(event: IMyDateModel) { + this.dateValue.from = Dates.getDateFromString(event.formatted); + +} +onToDateChanged(event: IMyDateModel) { + this.dateValue.to = Dates.getDateFromString(event.formatted); + +}} diff --git a/portal-4cli/src/app/searchPages/searchUtils/dateFilter.module.ts b/portal-4cli/src/app/searchPages/searchUtils/dateFilter.module.ts new file mode 100644 index 00000000..0c5dca82 --- /dev/null +++ b/portal-4cli/src/app/searchPages/searchUtils/dateFilter.module.ts @@ -0,0 +1,20 @@ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { MyDatePickerModule } from '../../utils/my-date-picker/my-date-picker.module'; +import {DateFilterComponent} from './dateFilter.component'; +@NgModule({ + imports: [ + CommonModule, FormsModule, MyDatePickerModule + ], + declarations: [ + DateFilterComponent +], + + providers:[ + ], + exports: [ + DateFilterComponent + ] +}) +export class DateFilterModule { } diff --git a/portal-4cli/src/app/searchPages/searchUtils/searchDownload.component.ts b/portal-4cli/src/app/searchPages/searchUtils/searchDownload.component.ts new file mode 100644 index 00000000..55df68d0 --- /dev/null +++ b/portal-4cli/src/app/searchPages/searchUtils/searchDownload.component.ts @@ -0,0 +1,112 @@ +import {Component, Input, Output, EventEmitter, ViewChild} from '@angular/core'; +import {Observable} from 'rxjs/Observable'; +import {AlertModal} from '../../utils/modal/alert'; +import {OpenaireProperties} from '../../utils/properties/openaireProperties'; +import {ReportsService} from '../../services/reports.service'; +import {ModalLoading} from '../../utils/modal/loading.component'; +import {PiwikService} from '../../utils/piwik/piwik.service'; + +@Component({ + selector: 'search-download', + template: ` + + + + (CSV) + + + + + + ` +}) + +export class SearchDownloadComponent { + @Input() totalResults:number = 0; + @Input() csvParams: string; + @Input() type: string; + @ViewChild(AlertModal) alertApplyAll; + private downloadURLAPI: string; + + sub: any; + downloadFilePiwikSub: any; + + @ViewChild (ModalLoading) loading : ModalLoading ; + // Alert box when something is wrong with CSV requests + @ViewChild('AlertModalCsvError') alertCsvError; + + constructor ( private _reportsService: ReportsService, private _piwikService:PiwikService) {} + + ngOnInit() { + this.downloadURLAPI = OpenaireProperties.getCsvAPIURL(); + } + + ngOnDestroy() { + if(this.sub) { + this.sub.unsubscribe(); + } + if(this.downloadFilePiwikSub) { + this.downloadFilePiwikSub.unsubscribe(); + } + } + + denialOfDownload() { + this.alertApplyAll.isOpen = true; + this.alertApplyAll.cancelButton = true; + this.alertApplyAll.okButton = false; + this.alertApplyAll.alertTitle = "Download Results in CSV"; + this.alertApplyAll.message = "Sorry, but the results are too many! Use the api instead!"; + this.alertApplyAll.cancelButtonText = "Ok"; + + console.info("denial of Download"); + + } + downloadfile(url:string,filename:string){ + console.log("Downloading file: "+ url); + this.openLoading(); + this.setMessageLoading("Downloading CSV file"); + + this._reportsService.downloadCSVFile(url).subscribe( + data => { + this.closeLoading(); + window.open(window.URL.createObjectURL(data),filename+".csv"); + if(OpenaireProperties.isPiwikTrackEnabled() && (typeof document !== 'undefined')){ + this.downloadFilePiwikSub = this._piwikService.trackDownload(url).subscribe(); + } + }, + error => { + console.log("Error downloading the file."); + this.closeLoading(); + this.confirmOpenCsvError(); + }, + () => console.log('Completed file download.') + ); + } + + + public openLoading(){ + if(this.loading){ + this.loading.open(); + } + } + public closeLoading(){ + if(this.loading){ + this.loading.close(); + } + } + public setMessageLoading(message: string){ + if(this.loading){ + this.loading.message = message; + } + } + + public confirmOpenCsvError(){ + this.alertCsvError.cancelButton = false; + this.alertCsvError.okButton = true; + this.alertCsvError.alertTitle = "ERROR DOWNLOADING CSV FILE"; + this.alertCsvError.message = "There was an error in csv downloading. Please try again later."; + this.alertCsvError.okButtonText = "OK"; + this.alertCsvError.open(); + } + +} diff --git a/portal-4cli/src/app/searchPages/searchUtils/searchDownload.module.ts b/portal-4cli/src/app/searchPages/searchUtils/searchDownload.module.ts new file mode 100644 index 00000000..1275de01 --- /dev/null +++ b/portal-4cli/src/app/searchPages/searchUtils/searchDownload.module.ts @@ -0,0 +1,24 @@ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import {SearchDownloadComponent} from './searchDownload.component'; +import {LoadingModalModule} from '../../utils/modal/loadingModal.module'; +import {AlertModalModule} from '../../utils/modal/alertModal.module'; + +@NgModule({ + imports: [ + CommonModule, FormsModule, LoadingModalModule, AlertModalModule + ], + declarations: [ + SearchDownloadComponent +], + + providers:[ + ], + exports: [ + SearchDownloadComponent + + ] +}) +export class SearchDownloadModule { } diff --git a/portal-4cli/src/app/searchPages/searchUtils/searchFilter.component.html b/portal-4cli/src/app/searchPages/searchUtils/searchFilter.component.html new file mode 100644 index 00000000..fdf83db7 --- /dev/null +++ b/portal-4cli/src/app/searchPages/searchUtils/searchFilter.component.html @@ -0,0 +1,67 @@ + +
      +
    • +
      {{_formatTitle(filter.title,filter.values.length)}} +
      + +
    • +
    diff --git a/portal-4cli/src/app/searchPages/searchUtils/searchFilter.component.ts b/portal-4cli/src/app/searchPages/searchUtils/searchFilter.component.ts new file mode 100644 index 00000000..a120673c --- /dev/null +++ b/portal-4cli/src/app/searchPages/searchUtils/searchFilter.component.ts @@ -0,0 +1,144 @@ +import {Component, Input, Output, EventEmitter} from '@angular/core'; +import {Observable} from 'rxjs/Observable'; + +import { Filter, Value} from './searchHelperClasses.class'; +import {Open} from '../../utils/modal/open.component'; + +@Component({ + selector: 'search-filter', + templateUrl: 'searchFilter.component.html' +}) + +export class SearchFilterComponent { + + @Input() filter:Filter; + @Input() showResultCount:boolean = true; + @Input() isDisabled:boolean = false; + @Input() addShowMore:boolean = true; + + public showAll:boolean = false; + public _maxCharacters:number =28; + + @Output() toggleModal = new EventEmitter(); + + @Output() modalChange = new EventEmitter(); + + + public isOpen:boolean=false; + + filterModalChange() { + console.info("Modal Changed"); + this.modalChange.emit({ + value: true + }); + //this.close(); + } + + constructor () { + } + + ngOnInit() { + + } + public _formatTitle(title,length){ + return (((title+" ("+length+")").length >this._maxCharacters)?(title.substring(0,(this._maxCharacters - (" ("+length+")").length - ('...').length))+"..."):title+" ("+((length >= 99)?length+"+":length)+")") + } + private _formatName(value){ + return value.name;//(((value.name+" ("+value.number+")").length >this._maxCharacters)?(value.name.substring(0,(this._maxCharacters - (" ("+value.number+")").length - ('...').length))+"..."):value.name) + } + toggleShowAll(){ + this.showAll = !this.showAll; + if(this.showAll == false) { + this.reorderFilterValues(); + } + } + + filterChange(selected:boolean){ + console.info("filter change: "+selected); + if(selected){ + this.filter.countSelectedValues++; + // this.reorderFilterValues(); + }else{ + this.filter.countSelectedValues--; + // this.reorderFilterValues(); + } + } + getSelectedValues(filter):any{ + var selected = []; + if(filter.countSelectedValues >0){ + for (var i=0; i < filter.values.length; i++){ + if(filter.values[i].selected){ + selected.push(filter.values[i]); + } + } + } + return selected; + + } + getNotSelectedValues(filter):any{ + var notSselected = []; + if(filter.countSelectedValues >0){ + for (var i=0; i < filter.values.length; i++){ + if(!filter.values[i].selected){ + notSselected.push(filter.values[i]); + } + } + }else { + notSselected = filter.values; + } + return notSselected; + } + reorderFilterValues() { + for(let value of this.filter.values) { + if(value.selected) { + let index: number = this.filter.values.indexOf(value); + let selectedValue:Value = this.filter.values[index]; + + this.filter.values.splice(index, 1); + this.filter.values.splice(0, 0, selectedValue); + } + } + } +// sliceSelected() { +// let values: Value[] = []; +// +// for(let value of this.filter.values) { +// if(value.selected) { +// let index: number = this.filter.values.indexOf(value); +// let selectedValue:Value = this.filter.values[index]; +// +// this.filter.values.splice(index, 1); +// this.filter.values.splice(0, 0, selectedValue); +// } +// } + + + toggle() { + this.toggleModal.emit({ + value: this.filter + }); + } + + + open() { + this.isOpen = true; + } + + close() { + this.isOpen = false; + } + + filterChange2(selected:boolean){ + + console.info("filter change2"); + if(selected){ + this.filter.countSelectedValues++; + // this.reorderFilterValues(); + }else{ + this.filter.countSelectedValues--; + // this.reorderFilterValues(); + } + this.close(); + } + +} diff --git a/portal-4cli/src/app/searchPages/searchUtils/searchFilter.module.ts b/portal-4cli/src/app/searchPages/searchUtils/searchFilter.module.ts new file mode 100644 index 00000000..3cc6792b --- /dev/null +++ b/portal-4cli/src/app/searchPages/searchUtils/searchFilter.module.ts @@ -0,0 +1,24 @@ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import {SearchFilterComponent} from './searchFilter.component'; +import{SearchFilterModalComponent} from './searchFilterModal.component'; +import {ModalModule} from '../../utils/modal/modal.module'; + +@NgModule({ + imports: [ + CommonModule, FormsModule, ModalModule + ], + declarations: [ + SearchFilterComponent, SearchFilterModalComponent +], + + providers:[ + ], + exports: [ + SearchFilterComponent, SearchFilterModalComponent + + ] +}) +export class SearchFilterModule { } diff --git a/portal-4cli/src/app/searchPages/searchUtils/searchFilterModal.component.ts b/portal-4cli/src/app/searchPages/searchUtils/searchFilterModal.component.ts new file mode 100644 index 00000000..bb0ed624 --- /dev/null +++ b/portal-4cli/src/app/searchPages/searchUtils/searchFilterModal.component.ts @@ -0,0 +1,104 @@ +import {Component, ViewEncapsulation, ComponentRef, ElementRef, Input, EventEmitter, Output} from '@angular/core'; +// import { DynamicComponentLoader} from '@angular/core'; + +import {Open} from '../../utils/modal/open.component'; +import { Filter} from './searchHelperClasses.class'; + +@Component({ + selector: 'modal-search-filter', + template: ` + + + `, + encapsulation: ViewEncapsulation.None, +}) +/** + * API to an open search filter window. + */ +export class SearchFilterModalComponent{ + @Input() filter: Filter; + @Input() showResultCount:boolean = true; + @Output() modalChange = new EventEmitter(); + + public isOpen:boolean=false; + + constructor( public _elementRef: ElementRef){} + + filterModalChange(selected:boolean) { + console.info("Modal Changed"); + this.filterChange(selected); + this.modalChange.emit({ + value: selected + }); + this.close(); + } + filterChange(selected:boolean){ + if(selected){ + this.filter.countSelectedValues++; + // this.reorderFilterValues(); + }else{ + this.filter.countSelectedValues--; + // this.reorderFilterValues(); + } + } + getSelectedValues(filter):any{ + var selected = []; + if(filter.countSelectedValues >0){ + for (var i=0; i < filter.values.length; i++){ + if(filter.values[i].selected){ + selected.push(filter.values[i]); + } + } + } + return selected; + + } + getNotSelectedValues(filter):any{ + var notSselected = []; + if(filter.countSelectedValues >0){ + for (var i=0; i < filter.values.length; i++){ + if(!filter.values[i].selected){ + notSselected.push(filter.values[i]); + } + } + }else { + notSselected = filter.values; + } + return notSselected; + } + + open() { + this.isOpen = true; + } + + close() { + this.isOpen = false; + } + +} diff --git a/portal-4cli/src/app/searchPages/searchUtils/searchForm.component.ts b/portal-4cli/src/app/searchPages/searchUtils/searchForm.component.ts new file mode 100644 index 00000000..0a6ba9a8 --- /dev/null +++ b/portal-4cli/src/app/searchPages/searchUtils/searchForm.component.ts @@ -0,0 +1,52 @@ +import {Component, Input, Output, EventEmitter} from '@angular/core'; +import {Observable} from 'rxjs/Observable'; +import {RouterHelper} from '../../utils/routerHelper.class'; +import {Router} from '@angular/router'; + +@Component({ + selector: 'search-form', + template: ` + +
    + + + +
    + ` +}) + +export class SearchFormComponent { + @Input() isDisabled: boolean = false; + @Input() keyword: string = ''; + @Input() generalSearch: boolean = false; + @Input() placeholderText: string = "Type keywords"; + @Input() link: boolean = false; + public routerHelper:RouterHelper = new RouterHelper(); + + @Output() keywordChange = new EventEmitter(); + + constructor (private _router:Router) { + } + + ngOnInit() { + + } + + keywordChanged() { + console.info("inside form: "+this.keyword); + this.keywordChange.emit({ + value: this.keyword + }); + } + goTo() { + this._router.navigate(['/search/find'], { queryParams: this.routerHelper.createQueryParam('keyword',this.keyword) }); + } +} diff --git a/portal-4cli/src/app/searchPages/searchUtils/searchForm.module.ts b/portal-4cli/src/app/searchPages/searchUtils/searchForm.module.ts new file mode 100644 index 00000000..21a9d9b1 --- /dev/null +++ b/portal-4cli/src/app/searchPages/searchUtils/searchForm.module.ts @@ -0,0 +1,23 @@ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { RouterModule } from '@angular/router'; + +import{SearchFormComponent} from './searchForm.component'; + +@NgModule({ + imports: [ + CommonModule, FormsModule, RouterModule + ], + declarations: [ + SearchFormComponent +], + + providers:[ + ], + exports: [ + SearchFormComponent + + ] +}) +export class SearchFormModule { } diff --git a/portal-4cli/src/app/searchPages/searchUtils/searchHelperClasses.class.ts b/portal-4cli/src/app/searchPages/searchUtils/searchHelperClasses.class.ts new file mode 100644 index 00000000..c09b3440 --- /dev/null +++ b/portal-4cli/src/app/searchPages/searchUtils/searchHelperClasses.class.ts @@ -0,0 +1,89 @@ +import {Dates} from '../../utils/string-utils.class'; +export class Filter{ + public title: string; // eg Type + public filterId: string; // type (name in url parameter) + public originalFilterId: string; // (in index) + public countSelectedValues: number = 0; + public values: Value[] = []; + public filterOperator: string ='or'; + + +} + +export class Value{ + public name: string; //eg Article, Journal + public id: string; //0001 + public selected: boolean = false; + public number: number = 0; + +} +export class AdvancedField{ + public id: string; // + public param:string; + public name: string; // + public type: string = "keyword"; //keyword, static or dynamic + public value: string = ''; + public operatorId: string; + public operatorName: string =""; + public valid: boolean = true; + public dateValue:DateValue = new DateValue("any"); + + constructor(id:string,param:string,name:string, type:string, value:string,operator:string){ + this.id = id; + this.param = param; + this.name = name; + this.type = type; + this.value = value; + this.operatorId = operator; + // this.operatorName = "AND"; + + } +} +export class DateValue{ + public types = ["any","range","1mon","2mon","3mon","6mon","12mon","2year","5year","10year"]; + public typesTitle = ["any","in the specified date range","in the last month","in the last 2 months","in the last 3 months","in the last 6 months","in the last year","in the last 2 years","in the last 5 years","in the last 10 years"]; + public type: string ; + public from:Date = new Date(); + public to:Date = new Date(); + constructor(type:string = "any"){ + this.setDatesByType(type); + } + public setDatesByType(type:string){ + if(this.types.indexOf(type) == -1){ + type=this.types[0]; + } + this.type = type; + this.to = Dates.getDateToday(); + if(this.type == "range" || this.type == "any"){ // for type "any" just to initiate with values + this.from = Dates.getDateXMonthsAgo(1); + }else if(this.type == "1mon"){ + this.from = Dates.getDateXMonthsAgo(1); + }else if(this.type == "2mon"){ + this.from = Dates.getDateXMonthsAgo(2); + }else if(this.type == "3mon"){ + this.from = Dates.getDateXMonthsAgo(3); + }else if(this.type == "6mon"){ + this.from = Dates.getDateXMonthsAgo(6); + }else if(this.type == "12mon"){ + this.from = Dates.getDateXMonthsAgo(12); + }else if(this.type == "2year"){ + this.from = Dates.getDateXYearsAgo(2); + }else if(this.type == "5year"){ + this.from = Dates.getDateXYearsAgo(5); + }else if(this.type == "10year"){ + this.from = Dates.getDateXYearsAgo(10); + } + } + +} +export class OPERATOR{ + public static AND: string ="and"; + public static OR: string ="or"; + public static NOT: string ="not"; + +} + +export class AutoCompleteValue{ + public id: string; + public label: string; +} diff --git a/portal-4cli/src/app/searchPages/searchUtils/searchPage.component.html b/portal-4cli/src/app/searchPages/searchUtils/searchPage.component.html new file mode 100644 index 00000000..2c6aa29b --- /dev/null +++ b/portal-4cli/src/app/searchPages/searchUtils/searchPage.component.html @@ -0,0 +1,126 @@ +
    +
    +
    +
    + +
    +
    +
    + +
    +
    + + More search options + + + +
    + Keywords: + + + {{filter.title}}: + + , + + + + + + Clear All + +
    + +
    + +
    +
    +
    + +
    +
    + + + +
    +
    + +
    Filter By:
    + +
    +
    + +
    +
    + + +
    +
    + + +
    + + +
    + +
    + +
    + +
    + + + + + + + + +
    + +
    + + +
    + +
    + +
    + + + +
    + +
    + + + + + + + + + +
    + +
    + +
    + +
    +
    +
    +
    +
    +
    diff --git a/portal-4cli/src/app/searchPages/searchUtils/searchPage.component.ts b/portal-4cli/src/app/searchPages/searchUtils/searchPage.component.ts new file mode 100644 index 00000000..c25a7bd4 --- /dev/null +++ b/portal-4cli/src/app/searchPages/searchUtils/searchPage.component.ts @@ -0,0 +1,515 @@ +import {Component, Input, ViewChild, Output, EventEmitter,ElementRef} from '@angular/core'; +import {Observable} from 'rxjs/Observable'; +import {Location} from '@angular/common'; +import { Router} from '@angular/router'; + +import { Filter, Value} from './searchHelperClasses.class'; +import {SearchResult} from '../../utils/entities/searchResult'; +import {SearchFields} from '../../utils/properties/searchFields'; +import {SearchUtilsClass} from './searchUtils.class'; +import {DOI, StringUtils} from '../../utils/string-utils.class'; +import {ModalLoading} from '../../utils/modal/loading.component'; +import { Meta} from '../../../angular2-meta'; +import{SearchFilterComponent} from './searchFilter.component'; +import {SearchFilterModalComponent} from './searchFilterModal.component'; +import {OpenaireProperties} from '../../utils/properties/openaireProperties'; +import { ErrorCodes} from '../../utils/properties/openaireProperties'; +import {PiwikService} from '../../utils/piwik/piwik.service'; + + +@Component({ + selector: 'search-page', + templateUrl: 'searchPage.component.html' + +}) +export class SearchPageComponent { + @Input() pageTitle = ""; + @Input() formPlaceholderText = "Type Keywords..."; + @Input() results = []; + @Input() filters = []; + @Input() type:string = ""; + @Input() entityType: string = ""; + @Input() searchUtils:SearchUtilsClass = new SearchUtilsClass(); + @Output() queryChange = new EventEmitter(); + @Input() baseUrl:string = ''; + @Input() showResultCount:boolean = true; + @Input() showRefine:boolean = true; + @Input() refineFields = []; + @Input() csvParams: string; + @Input() csvPath: string; + @Input() advancedSearchLink: string = ""; + @Input() tableViewLink: string; + @Input() disableForms: boolean = false; + @Input() loadPaging: boolean = true; + @Input() oldTotalResults: number = 0; + @Input() tableView: boolean = false; + @Input() searchFormClass: string = "searchForm"; + @ViewChild (ModalLoading) loading : ModalLoading ; + public fieldIdsMap;//: { [key:string]:{ name:string, operator:string, type:string, indexField:string, equalityOperator:string }}; + private searchFieldsHelper:SearchFields = new SearchFields(); + private queryParameters: Map = new Map(); + private baseURLWithParameters:string = ''; + private sub: any; piwiksub: any; + public countFilters= 0; + public parameterNames:string[] =[]; + public parameterValues:string[] =[]; + public showUnknownFilters:boolean = false; // when a filter exists in query but has no results, so no filters returned from the query + //@ViewChild (SearchFilterModalComponent) searchFilterModal : SearchFilterModalComponent ; + public currentFilter: Filter; + + constructor (private location: Location , private _meta: Meta,private element: ElementRef,private _piwikService:PiwikService, private router: Router) { + } + + ngOnInit() { + if (typeof document !== 'undefined') { + this.element.nativeElement.scrollIntoView(); + } + this.updateBaseUrlWithParameters(this.filters); + this.updateTitle(this.pageTitle); + this.updateDescription("Openaire, search, repositories, open access, type, content provider, funder, project, " + this.type + "," +this.pageTitle); + if(typeof window !== 'undefined') { + this.updateUrl(OpenaireProperties.getBaseLink()+location.pathname); + } + if(typeof document !== 'undefined' && OpenaireProperties.isPiwikTrackEnabled()){ + this.piwiksub = this._piwikService.trackView(this.pageTitle).subscribe(); + } + } + ngAfterViewChecked(){ + + } + ngOnDestroy() { + if(this.piwiksub){ + this.piwiksub.unsubscribe(); + } + } + toggleModal($event) { + this.currentFilter = $event.value; + //this.searchFilterModal.open(); + } + + updateDescription(description:string){ + this._meta.updateMeta("description", description); + this._meta.updateProperty("og:description", description); + } + updateTitle(title:string){ + var _prefix ="OpenAIRE | "; + var _title = _prefix + ((title.length> 50 ) ?title.substring(0,50):title); + this._meta.setTitle(_title ); + this._meta.updateProperty("og:title",_title); + } + updateUrl(url:string){ + this._meta.updateProperty("og:url", url); + } + + public getQueryParametersFromUrl(params){ + // var parameters = ""; + var allFqs = ""; + + this.queryParameters = new Map(); + + for(var i=0; i< this.refineFields.length ; i++){ + var filterId = this.refineFields[i]; + + if(params[filterId] != undefined) { + this.queryParameters[filterId]=StringUtils.URIDecode(params[filterId]); + + let values = (StringUtils.URIDecode(this.queryParameters[filterId])).split(/,(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/,-1); + var countvalues = 0; + var fq = ""; + for(let value of values) { + countvalues++; + var paramId = this.fieldIdsMap[filterId].param; + // parameters+='&' + paramId+ '='+ value;//+"&" + this.fieldIdsMap[paramId].operator + "="+((countvalues == 1)?"and":"or"); + fq+=(fq.length > 0 ? " " + "or" + " ":"" ) + filterId +" exact " +StringUtils.URIEncode(value); + } + if(countvalues > 0){ + fq="&fq="+fq; + } + allFqs += fq; + } + } + var keyword = params['keyword']; + var doiQuery = ""; + var keywordQuery = ""; + if((keyword && keyword.length > 0)){ + if((this.type == 'publications' ||this.type == 'research data')){ + var DOIs:string[] = DOI.getDOIsFromString(keyword); + var doisParams = ""; + + for(var i =0 ;i < DOIs.length; i++){ + doisParams+=(doisParams.length > 0?"&":"")+'doi="'+ DOIs[i]+'"'; + } + if(doisParams.length > 0){ + doiQuery += "&"+doisParams; + }else { + keywordQuery += "&q="+StringUtils.URIEncode(keyword); + } + }else{ + keywordQuery += "&q="+StringUtils.URIEncode(keyword); + + } + } + return (doiQuery.length > 0 ? doiQuery:keywordQuery) + allFqs; + } + public getIndexQueryParametersFromUrl(params){ + // var parameters = ""; + var allFqs = ""; + + for(var i=0; i< this.refineFields.length ; i++){ + var filterId = this.refineFields[i]; + var fq = ""; + if(params[filterId] != undefined) { + this.queryParameters[filterId]=decodeURIComponent(params[filterId]); + let values = (decodeURIComponent(this.queryParameters[filterId])).split(/,(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/,-1); + var countvalues = 0 + for(let value of values) { + countvalues++; + // parameters+= ((countvalues == 1)?" and (":" or ")+ filterId+ '='+ value; + fq+=(fq.length > 0 ? " " + "or" + " ":"" ) + filterId + " exact " + value;//StringUtils.quote(value); + } + // parameters+= " ) "; + if(countvalues > 0){ + fq="&fq="+fq; + } + allFqs += fq; + } + + } + var keyword = params['keyword']; + var doiQuery = ""; + var keywordQuery = ""; + if((keyword && keyword.length > 0)){ + if((this.type == 'publications' ||this.type == 'research data')){ + var DOIs:string[] = DOI.getDOIsFromString(keyword); + var doisParams = ""; + + for(var i =0 ;i < DOIs.length; i++){ + doisParams+=(doisParams.length > 0?"&":"")+'doi="'+ DOIs[i]+'"'; + } + if(doisParams.length > 0){ + doiQuery += "&"+doisParams; + } + }else{ + keywordQuery += "and ("+StringUtils.quote(StringUtils.URIEncode(keyword)) +")"; + + } + } + return (doiQuery.length > 0 ? doiQuery:keywordQuery) + allFqs; + +} + /* + * Mark as check the new filters that are selected, when you get them from search + */ + public checkSelectedFilters(filters:Filter[]){ + this.filters = filters; + for(var i=0; i< filters.length ; i++){ + var filter:Filter = filters[i]; + filter.countSelectedValues = 0; + if(this.queryParameters[filter.filterId] != undefined) { + let values = (decodeURIComponent(this.queryParameters[filter.filterId])).split(/,(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/,-1); + for(let filterValue of filter.values) { + if(values.indexOf(StringUtils.quote(filterValue.id)) > -1) { + filterValue.selected = true; + filter.countSelectedValues++; + }else{ + filterValue.selected = false; + + } + } + }else{ + for(let filterValue of filter.values) { + filterValue.selected = false; + } + } + } + + return filters; + } + /* + * Update the url with proper parameters. This is used as base url in Paging Component + */ + public updateBaseUrlWithParameters(filters:Filter[]){ + this.baseURLWithParameters = this.baseUrl + this.createUrlParameters(filters,false); + + } + + /* + * + */ + private createUrlParameters(filters:Filter[], includePage:boolean){ + var allLimits="";//location.search.slice(1); + this.queryParameters = new Map(); + this.parameterNames.splice(0,this.parameterNames.length); + this.parameterValues.splice(0,this.parameterValues.length); + + for (let filter of filters){ + var filterLimits=""; + if(filter.countSelectedValues > 0){ + for (let value of filter.values){ + if(value.selected == true){ + filterLimits+=((filterLimits.length == 0)?'':',') +'"'+ StringUtils.URIEncode(value.id)+'"'; + } + } + this.queryParameters[filter.filterId]=filterLimits; + if(filterLimits.length > 0){ + this.parameterNames.push(filter.filterId); + this.parameterValues.push(filterLimits); + } + allLimits+=(allLimits.length==0?"?":"&")+((filterLimits.length == 0 )?'':filter.filterId + '='+ filterLimits) ; + } + } + if(this.searchUtils.keyword.length > 0 ){ + allLimits+=(allLimits.length==0?"?":"&")+'keyword=' + this.searchUtils.keyword; + this.parameterNames.push("keyword"); + this.parameterValues.push(this.searchUtils.keyword); + } + if(this.searchUtils.page != 1 && includePage){ + allLimits+=((allLimits.length == 0)?'?':'&') + 'page=' + this.searchUtils.page; + } + + return allLimits; + } + /* + * + */ + private createSearchQueryParameters(filters:Filter[]){ + var allFqs = ""; + for (let filter of filters){ + if(filter.countSelectedValues > 0){ + var fq = ""; + var count_selected=0; + for (let value of filter.values){ + if(value.selected == true){ + count_selected++; + fq+=(fq.length > 0 ? " " + filter.filterOperator + " ":"" ) + filter.filterId + " exact " + StringUtils.quote(StringUtils.URIEncode(value.id)); + } + } + fq="&fq="+fq; + allFqs += fq; + } + } + var doiQuery = ""; + var keywordQuery = ""; + if((this.searchUtils.keyword && this.searchUtils.keyword.length > 0)){ + if((this.type == 'publications' ||this.type == 'research data')){ + var DOIs:string[] = DOI.getDOIsFromString(this.searchUtils.keyword); + var doisParams = ""; + + for(var i =0 ;i < DOIs.length; i++){ + doisParams+=(doisParams.length > 0?"&":"")+'doi="'+ DOIs[i]+'"'; + } + if(doisParams.length > 0){ + doiQuery += "&"+doisParams; + }else{ + keywordQuery += "&q="+StringUtils.URIEncode(this.searchUtils.keyword); + } + }else{ + keywordQuery += "&q="+StringUtils.URIEncode(this.searchUtils.keyword); + } + } + + return (doiQuery.length > 0 ? doiQuery:keywordQuery) + allFqs; + + } + private createIndexQueryParameters(filters:Filter[]){ + var allFqs = ""; + for (let filter of filters){ + if(filter.countSelectedValues > 0){ + var count_selected=0; + var fq = ""; + for (let value of filter.values){ + if(value.selected == true){ + count_selected++; + fq+=(fq.length > 0 ? " " + filter.filterOperator + " ":"" ) + filter.filterId + " exact " + StringUtils.quote(StringUtils.URIEncode(value.id)); + } + } + if(count_selected > 0){ + fq="&fq="+fq; + allFqs += fq; + } + } + } + var doiQuery = ""; + var keywordQuery = ""; + if((this.searchUtils.keyword && this.searchUtils.keyword.length > 0)){ + if((this.type == 'publications' ||this.type == 'research data')){ + var DOIs:string[] = DOI.getDOIsFromString(this.searchUtils.keyword); + var doisParams = ""; + for(var i =0 ;i < DOIs.length; i++){ + doisParams+=(doisParams.length > 0?"&":"")+'doi="'+ DOIs[i]+'"'; + } + if(doisParams.length > 0){ + doiQuery += "&"+doisParams; + } + }else{ + keywordQuery += " and ("+StringUtils.quote(StringUtils.URIEncode(this.searchUtils.keyword)) +")" + + } + } + return (doiQuery.length > 0 ? doiQuery:keywordQuery) + allFqs; + + } + public isFiltered(){ + var filtered=false; + this.showUnknownFilters = false; + for (let filter of this.filters){ + if(filter.countSelectedValues > 0){ + filtered = true; + break; + } + } + if(this.searchUtils.keyword.length > 0 ){ + filtered = true; + } + var errorCodes:ErrorCodes = new ErrorCodes(); + if(this.queryParameters.keys() && this.searchUtils.totalResults == 0 && this.searchUtils.status !=errorCodes.LOADING ){ + this.showUnknownFilters = true; + } + return filtered; + } + private clearKeywords(){ + if(this.searchUtils.keyword.length > 0 ){ + this.searchUtils.keyword =''; + } + this.goTo(1); + } + private clearFilters(){ + for (var i =0 ; i < this.filters.length; i++){ + for (var j=0; j < this.filters[i].countSelectedValues; j++){ + if(this.filters[i].values[j].selected){ + this.filters[i].values[j].selected = false; + } + this.filters[i].countSelectedValues = 0; + } + } + this.clearKeywords(); + + } + private removeFilter(value:Value,filter:Filter){ + filter.countSelectedValues--; + if(value.selected == true){ + value.selected = false; + } + this.goTo(1); + + } + goTo(page:number = 1){ + this.searchUtils.page = page; + console.info("searchUtils.page goto = "+this.searchUtils.page); + var urlParameters = this.createUrlParameters(this.filters,true); + console.info("urlParams : "+urlParameters); + this.updateBaseUrlWithParameters(this.filters); + var queryParameters = this.createSearchQueryParameters(this.filters); + console.info("queryParams : "+queryParameters); + var indexQuery = this.createIndexQueryParameters(this.filters); + + this.location.go(location.pathname,urlParameters); +/* Code For Piwik*/ + if (typeof localStorage !== 'undefined') { + console.log("In PreviousRouteRecorder : "+this.router.url ); + localStorage.setItem('previousRoute', this.router.url); + } + if(OpenaireProperties.isPiwikTrackEnabled() && (typeof document !== 'undefined')){ + this.piwiksub = this._piwikService.trackView(this.pageTitle).subscribe(); + } + /* End Piwik Code */ + this.queryChange.emit({ + value: queryParameters, + index:indexQuery + + }); + if (typeof document !== 'undefined') { + this.element.nativeElement.scrollIntoView(); + } + } + filterChanged($event){ + console.info("filter Changed"); + this.goTo(1); + } + keywordChanged($event) { + this.searchUtils.keyword = $event.value; + this.goTo(1); + } + + /* + * Get A sub-array of this.refineFields array, which contains the ids of the selected filters + */ + public getSelectedFilters():string[] { + var selected:string[] = []; + for(var i=0; i < this.filters.length; i++){ + var filter:Filter = this.filters[i]; + if(filter.countSelectedValues > 0){ + selected.push(filter.filterId); + } + } + return selected; + } + /* + * Get A sub-array of this.refineFields array, which contains the ids of the selected parameters + */ + private getSelectedParameters():string[] { + var selected:string[] = []; + var params:string[] = Object.keys(this.queryParameters); + for(var i=0; i < params.length; i++){ + if(this.refineFields.indexOf(params[i]) > -1){ + selected.push(params[i]); + } + } + return selected; + } + /* + * Get A sub-array of this.refineFields array, which hides hidden fields (e.g Funding level 0,1,2,..), and contains those that depend on another fields (e.g Funding level 0 if Funder is selected ) + */ + public getFields():string[] { + var selected_filters:string[] = this.getSelectedFilters(); + if(selected_filters.length == 0){ + selected_filters = this.getSelectedParameters(); + } + var fields:string[] = []; + for(var i =0 ; i < this.refineFields.length;i++){ + var dependentTo = this.searchFieldsHelper.DEPENDENT_FIELDS[this.refineFields[i]]; + + //if filter is not marked as hidden OR it is hidden but it is dependent to a field that it IS selected + if(this.searchFieldsHelper.HIDDEN_FIELDS.indexOf(this.refineFields[i]) == -1 || (selected_filters.indexOf(dependentTo) != -1) || (selected_filters.indexOf(this.refineFields[i]) != -1) ){ + fields.push(this.refineFields[i]); + } + } + return fields; + } + /* + * Get a query string of all fields, that want to get from search (e.g. &fields=funderid&fields=projectstartyear&...)) + */ + public getRefineFieldsQuery():string{ + + var fields:string[] = this.getFields(); + var fieldsStr = "" + for(var i =0 ; i < fields.length ;i++){ + fieldsStr+="&fields="+fields[i]; + } + return "&refine=true"+fieldsStr; + } + + // for loading + public openLoading(){ + if(this.loading){ + this.loading.open(); + } + } + public closeLoading(){ + if(this.loading){ + this.loading.close(); + } + } + getSelectedValues(filter):any{ + var selected = []; + if(filter.countSelectedValues >0){ + for (var i=0; i < filter.values.length; i++){ + if(filter.values[i].selected){ + selected.push(filter.values[i]); + } + } + } + return selected; + + } +} diff --git a/portal-4cli/src/app/searchPages/searchUtils/searchPage.module.ts b/portal-4cli/src/app/searchPages/searchUtils/searchPage.module.ts new file mode 100644 index 00000000..39fc78fd --- /dev/null +++ b/portal-4cli/src/app/searchPages/searchUtils/searchPage.module.ts @@ -0,0 +1,40 @@ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { RouterModule } from '@angular/router'; + +import{SearchPageComponent} from './searchPage.component'; +import{SearchFormModule} from './searchForm.module'; +import{SearchResultsModule} from './searchResults.module'; +//import{DatasourceTableViewModule} from './datasourceTableView.module'; +//import{SearchFilterComponent} from './searchFilter.component'; +//import{SearchFilterModalComponent} from './searchFilterModal.component'; +import {SearchFilterModule} from './searchFilter.module'; +import{LoadingModalModule} from '../../utils/modal/loadingModal.module'; +import {ReportsServiceModule} from '../../services/reportsService.module'; +import{SearchPagingModule} from './searchPaging.module'; +import {SearchDownloadModule} from './searchDownload.module'; +import {ModalModule} from '../../utils/modal/modal.module'; +import {PiwikServiceModule} from '../../utils/piwik/piwikService.module'; +import {PreviousRouteRecorder} from '../../utils/piwik/previousRouteRecorder.guard'; +import {HelperModule} from '../../utils/helper/helper.module'; + + +@NgModule({ + imports: [ + CommonModule, FormsModule,RouterModule, SearchFormModule, SearchResultsModule, + LoadingModalModule, ReportsServiceModule, + SearchPagingModule, SearchDownloadModule, ModalModule, SearchFilterModule, PiwikServiceModule, HelperModule + ], + declarations: [ + SearchPageComponent +], + + providers:[ + PreviousRouteRecorder + ], + exports: [ + SearchPageComponent + ] +}) +export class SearchPageModule { } diff --git a/portal-4cli/src/app/searchPages/searchUtils/searchPageTableView.component.html b/portal-4cli/src/app/searchPages/searchUtils/searchPageTableView.component.html new file mode 100644 index 00000000..266c2136 --- /dev/null +++ b/portal-4cli/src/app/searchPages/searchUtils/searchPageTableView.component.html @@ -0,0 +1,196 @@ +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + Keywords: {{searchUtils.keyword}} + + + {{filter.title}}: + {{value.name}} + , + + + + + + Clear All + +
    +
    +
    +
    +
    + + + +
    + +
    + + +
    +
    + +
    Filter By:
    + +
    +
    + +
    +
    + +
    +
    + + +
    + +
    +
    +
    + + {{searchUtils.totalResults}} content providers, page {{searchUtils.page}} of {{(totalPages())}} + + + + +
    +
    + +
    +

    + + + + + +

    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + +
    Name + + + + + Type + + + + + Country + + + + + Institution + + + + + Compatibility + + + + +
    + + + + + [no title available] + + + + {{dataprovider.type}} + - + + {{country}}{{(i < ( dataprovider['countries'].slice(0,5).length-1))?", ":""}}{{(i == dataprovider['countries'].slice(0,5).length-1 && dataprovider['countries'].length > 5)?"...":""}} + - + + + {{org.name}}{{org.name}}{{(i < ( dataprovider['organizations'].slice(0,5).length-1))?", ":""}}{{(i == dataprovider['organizations'].slice(0,5).length-1 && dataprovider['organizations'].length > 5)?"...":""}} + + - + + {{dataprovider.compatibility}} + - +
    +
    + +
    +
    + + {{searchUtils.totalResults}} content providers, page {{searchUtils.page}} of {{(totalPages())}} + + + + +
    +
    + + + +
    + +
    +

    + + + + + +

    + + +
    +
    + + +
    + +
    +
    +
    diff --git a/portal-4cli/src/app/searchPages/searchUtils/searchPageTableView.component.ts b/portal-4cli/src/app/searchPages/searchUtils/searchPageTableView.component.ts new file mode 100644 index 00000000..2de14356 --- /dev/null +++ b/portal-4cli/src/app/searchPages/searchUtils/searchPageTableView.component.ts @@ -0,0 +1,274 @@ +import {Component, Input, ViewChild, Output, EventEmitter} from '@angular/core'; +import {Observable} from 'rxjs/Observable'; +import {Location} from '@angular/common'; +import { Filter, Value} from './searchHelperClasses.class'; +import {SearchResult} from '../../utils/entities/searchResult'; +import {SearchFields} from '../../utils/properties/searchFields'; +import {SearchUtilsClass} from './searchUtils.class'; +import {DOI, StringUtils} from '../../utils/string-utils.class'; +import {ModalLoading} from '../../utils/modal/loading.component'; +import { Meta} from '../../../angular2-meta'; +import{SearchFilterComponent} from './searchFilter.component'; +import {SearchFilterModalComponent} from './searchFilterModal.component'; +import { ErrorCodes} from '../../utils/properties/openaireProperties'; +import {OpenaireProperties} from '../../utils/properties/openaireProperties'; +import {ContentProvidersDatatablePipe} from '../../utils/pipes/contentProvidersDatatable.pipe'; +import {PiwikService} from '../../utils/piwik/piwik.service'; + +@Component({ + selector: 'search-page-table', + templateUrl:'searchPageTableView.component.html' + }) +export class SearchPageTableViewComponent { + @Input() pageTitle = ""; + @Input() results; + @Input() filters = []; + @Input() type:string = ""; + @Input() entityType: string = ""; + @Input() searchUtils:SearchUtilsClass;// = new SearchUtilsClass(); + //@Output() downloadClick = new EventEmitter(); + @Input() showResultCount:boolean = true; + @Input() showRefine:boolean = true; + @Input() refineFields = []; + //@Input() csvParams: string; + //@Input() csvPath: string; + @Input() searchViewLink: string; + @Input() disableForms: boolean = false; + @Input() searchFormClass: string = "searchForm"; +@Input() formPlaceholderText = "Type Keywords..."; + @ViewChild (ModalLoading) loading : ModalLoading ; + private searchFieldsHelper:SearchFields = new SearchFields(); + private queryParameters: Map = new Map(); + private sub: any; + public countFilters= 0; + public parameterNames:string[] =[]; + public parameterValues:string[] =[]; + + public triggerPipe: boolean = false; + + public rowsOnPage:number = 10; + @ViewChild('mf') table: any;//DataTable; + + @ViewChild (SearchFilterModalComponent) searchFilterModal : SearchFilterModalComponent ; + public currentFilter: Filter; + public errorCodes:ErrorCodes = new ErrorCodes(); + piwiksub: any; + constructor (private location: Location , private _meta: Meta, private _piwikService:PiwikService) { + } + + ngOnInit() { + this.updateTitle(this.pageTitle); + this.updateDescription("Openaire, search, repositories, open access, type, content provider, funder, project, " + this.type + "," +this.pageTitle); + if(typeof window !== 'undefined') { + this.updateUrl(OpenaireProperties.getBaseLink()+location.pathname); + } + if(OpenaireProperties.isPiwikTrackEnabled() && (typeof document !== 'undefined')){ + this.piwiksub = this._piwikService.trackView(this.pageTitle).subscribe(); + } + } + ngOnDestroy() { + if(this.piwiksub){ + this.piwiksub.unsubscribe(); +} + } + public sortByOrganization = (dataprovider: any) => { + if(dataprovider.organizations && dataprovider.organizations.length > 0) { + return dataprovider.organizations[0].name.toUpperCase(); + } + return "-"; + } + + totalPages(): number { + let totalPages:any = this.searchUtils.totalResults/(this.rowsOnPage); + if(!(Number.isInteger(totalPages))) { + totalPages = (parseInt(totalPages, 10) + 1); + } + return totalPages; + } + + refreshTable(page:number) { + this.searchUtils.page=page; + //this.table.mfActivePage=$event.value; + this.table.setPage(this.searchUtils.page, this.rowsOnPage); + } + + toggleModal($event) { + this.currentFilter = $event.value; + this.searchFilterModal.open(); + } + + updateDescription(description:string){ + this._meta.updateMeta("description", description); + this._meta.updateProperty("og:description", description); + } + updateTitle(title:string){ + var _prefix ="OpenAIRE | "; + var _title = _prefix + ((title.length> 50 ) ?title.substring(0,50):title); + this._meta.setTitle(_title ); + this._meta.updateProperty("og:title",_title); + } + updateUrl(url:string){ + this._meta.updateProperty("og:url", url); + } + +public getParametersFromUrl(params) { + for(var i=0; i< this.refineFields.length ; i++) { + var filterId = this.refineFields[i]; + if(params[filterId] != undefined) { + if(this.queryParameters == undefined){ + this.queryParameters = new Map(); + } + this.queryParameters[filterId]=decodeURIComponent(params[filterId]); + } + } +} + /* + * Mark as check the new filters that are selected, when you get them from search + */ + public checkSelectedFilters(filters:Filter[]){ + + this.filters = filters; + for(var i=0; i< filters.length ; i++){ + var filter:Filter = filters[i]; + filter.countSelectedValues = 0; + + if(this.queryParameters[filter.filterId] != undefined) { + let values = (decodeURIComponent(this.queryParameters[filter.filterId])).split(/,(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/,-1); + for(let filterValue of filter.values) { + if(values.indexOf(StringUtils.quote(filterValue.id)) > -1) { + filterValue.selected = true; + filter.countSelectedValues++; + }else{ + filterValue.selected = false; + } + } + }else{ + for(let filterValue of filter.values) { + filterValue.selected = false; + } + } + } + + return filters; + } + + /* + * + */ + private createUrlParameters(filters:Filter[], includePage:boolean){ + var allLimits="";//location.search.slice(1); + this.parameterNames.splice(0,this.parameterNames.length); + this.parameterValues.splice(0,this.parameterValues.length); + + for (let filter of filters){ + var filterLimits=""; + if(filter.countSelectedValues > 0){ + for (let value of filter.values){ + if(value.selected == true){ + filterLimits+=((filterLimits.length == 0)?'':',') +'"'+ StringUtils.URIEncode(value.id)+'"'; + } + } + this.queryParameters[filter.filterId]=filterLimits; + if(filterLimits.length > 0){ + this.parameterNames.push(filter.filterId); + this.parameterValues.push(filterLimits); + } + allLimits+=(allLimits.length==0?"?":"&")+((filterLimits.length == 0 )?'':filter.filterId + '='+ filterLimits) ; + } + } + if(this.searchUtils.keyword.length > 0 ){ + allLimits+=(allLimits.length==0?"?":"&")+'keyword=' + this.searchUtils.keyword; + this.parameterNames.push("keyword"); + this.parameterValues.push(this.searchUtils.keyword); + } + + //if(this.searchUtils.page != 1 && includePage){ + // allLimits+=((allLimits.length == 0)?'?':'&') + 'page=' + this.searchUtils.page; + //} + + return allLimits; + } + + public isFiltered(){ + var filtered=false; + for (let filter of this.filters){ + if(filter.countSelectedValues > 0){ + filtered = true; + break; + } + } + if(this.searchUtils.keyword.length > 0 ){ + filtered = true; + } + return filtered; + } + private clearKeywords(){ + if(this.searchUtils.keyword.length > 0 ){ + this.searchUtils.keyword =''; + } + this.goTo(1, true); + } + private clearFilters(){ + for (var i =0 ; i < this.filters.length; i++) { + for (var j=0; j < this.filters[i].values.length; j++) { + if(this.filters[i].values[j].selected) { + this.filters[i].values[j].selected = false; + } + } + this.filters[i].countSelectedValues = 0; + } + this.clearKeywords(); + + } + + private removeFilter(value:Value,filter:Filter){ + filter.countSelectedValues--; + if(value.selected == true){ + value.selected = false; + } + this.goTo(1, true); + } + goTo(page:number = 1, triggerPipe:boolean = true){ + this.refreshTable(page); + if(triggerPipe) { + this.triggerPipe = !this.triggerPipe; + } + + var urlParameters = this.createUrlParameters(this.filters,true); + this.location.go(location.pathname,urlParameters); + } + + filterChanged($event){ + console.info("filter Changed"); + this.goTo(1, true); + } + keywordChanged($event) { + this.searchUtils.keyword = $event.value; + this.goTo(1, true); + } +/* + downloadClicked($event) { + if($event.value == true) { + var queryParameters = this.createSearchQueryParameters(this.filters); + + this.downloadClick.emit({ + value: queryParameters + }); + } + } +*/ + + + getSelectedValues(filter):any{ + var selected = []; + if(filter.countSelectedValues >0){ + for (var i=0; i < filter.values.length; i++){ + if(filter.values[i].selected){ + selected.push(filter.values[i]); + } + } + } + return selected; + + } +} diff --git a/portal-4cli/src/app/searchPages/searchUtils/searchPageTableView.module.ts b/portal-4cli/src/app/searchPages/searchUtils/searchPageTableView.module.ts new file mode 100644 index 00000000..2586914e --- /dev/null +++ b/portal-4cli/src/app/searchPages/searchUtils/searchPageTableView.module.ts @@ -0,0 +1,53 @@ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { RouterModule } from '@angular/router'; + +import{SearchPageTableViewComponent} from './searchPageTableView.component'; +import{SearchFormModule} from './searchForm.module'; +import{SearchResultsModule} from './searchResults.module'; +//import{DatasourceTableViewModule} from './datasourceTableView.module'; +//import{SearchFilterComponent} from './searchFilter.component'; +//import{SearchFilterModalComponent} from './searchFilterModal.component'; +import {SearchFilterModule} from './searchFilter.module'; +import{LoadingModalModule} from '../../utils/modal/loadingModal.module'; +import {ReportsServiceModule} from '../../services/reportsService.module'; +import{SearchPagingModule} from './searchPaging.module'; +import {SearchDownloadModule} from './searchDownload.module'; +import {ModalModule} from '../../utils/modal/modal.module'; +import {PagingModule} from '../../utils/paging.module'; +import {DataTableModule} from "angular2-datatable"; +import {ContentProvidersDatatablePipe} from '../../utils/pipes/contentProvidersDatatable.pipe'; + +import {PiwikServiceModule} from '../../utils/piwik/piwikService.module'; +import {PreviousRouteRecorder} from '../../utils/piwik/previousRouteRecorder.guard'; + +import {HelperModule} from '../../utils/helper/helper.module'; +import {ErrorMessagesModule} from '../../utils/errorMessages.module'; + +@NgModule({ + imports: [ + CommonModule, FormsModule,RouterModule, SearchFormModule, SearchResultsModule, LoadingModalModule, + ReportsServiceModule, SearchPagingModule, SearchDownloadModule, ModalModule, PagingModule, + DataTableModule, SearchFilterModule, PiwikServiceModule, HelperModule, ErrorMessagesModule + ], + declarations: [ + SearchPageTableViewComponent//, + //SearchFilterComponent, + //SearchFilterModalComponent + , + ContentProvidersDatatablePipe +], + + providers:[ + PreviousRouteRecorder + ], + exports: [ + SearchPageTableViewComponent//, + //SearchFilterComponent, + //SearchFilterModalComponent + , + ContentProvidersDatatablePipe + ] +}) +export class SearchPageTableViewModule { } diff --git a/portal-4cli/src/app/searchPages/searchUtils/searchPaging.component.ts b/portal-4cli/src/app/searchPages/searchUtils/searchPaging.component.ts new file mode 100644 index 00000000..5044baa3 --- /dev/null +++ b/portal-4cli/src/app/searchPages/searchUtils/searchPaging.component.ts @@ -0,0 +1,58 @@ +import {Component, Input, Output, EventEmitter} from '@angular/core'; +import {Observable} from 'rxjs/Observable'; +import {ErrorCodes} from '../../utils/properties/openaireProperties'; + +@Component({ + selector: 'search-paging', + template: ` +
    +
    + {{searchUtils.totalResults}} {{type}}, page {{searchUtils.page}} of {{(totalPages(searchUtils.totalResults))}} +
    +
    + {{oldTotalResults}} {{type}}, page {{searchUtils.page}} of {{(totalPages(oldTotalResults))}} +
    +
    + +
    +
    + +
    +
    + ` +}) + +export class SearchPagingComponent { + @Input() searchUtils; + @Input() results; + @Input() baseUrl; + @Input() type; + @Input() parameterNames:string[]; + @Input() parameterValues:string[]; + + @Input() loadPaging: boolean = true; + @Input() oldTotalResults: number = 0; + + public totalResults: number = 0; + public errorCodes:ErrorCodes = new ErrorCodes(); + + // @Input() totalResults:number = 0; + constructor () {} + + ngOnInit() { + // this.totalResults = this.searchUtils.totalResults; + // if(!this.loadPaging && this.totalResults == 0) { + // this.totalResults = this.oldTotalResults; + // } + } + + totalPages(totalResults: number): number { + let totalPages:any = totalResults/(this.searchUtils.size); + if(!(Number.isInteger(totalPages))) { + totalPages = (parseInt(totalPages, 10) + 1); + } + return totalPages; + } + + +} diff --git a/portal-4cli/src/app/searchPages/searchUtils/searchPaging.module.ts b/portal-4cli/src/app/searchPages/searchUtils/searchPaging.module.ts new file mode 100644 index 00000000..4a403bd1 --- /dev/null +++ b/portal-4cli/src/app/searchPages/searchUtils/searchPaging.module.ts @@ -0,0 +1,23 @@ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import{SearchPagingComponent} from './searchPaging.component'; +import{PagingModule} from '../../utils/paging.module'; + +@NgModule({ + imports: [ + CommonModule, FormsModule, PagingModule + ], + declarations: [ + SearchPagingComponent +], + + providers:[ + ], + exports: [ + SearchPagingComponent + + ] +}) +export class SearchPagingModule { } diff --git a/portal-4cli/src/app/searchPages/searchUtils/searchResult.component.html b/portal-4cli/src/app/searchPages/searchUtils/searchResult.component.html new file mode 100644 index 00000000..47e73654 --- /dev/null +++ b/portal-4cli/src/app/searchPages/searchUtils/searchResult.component.html @@ -0,0 +1,124 @@ + diff --git a/portal-4cli/src/app/searchPages/searchUtils/searchResult.component.ts b/portal-4cli/src/app/searchPages/searchUtils/searchResult.component.ts new file mode 100644 index 00000000..cca7ba9f --- /dev/null +++ b/portal-4cli/src/app/searchPages/searchUtils/searchResult.component.ts @@ -0,0 +1,52 @@ +import {Component, Input} from '@angular/core'; +import {SearchResult} from '../../utils/entities/searchResult'; +import {OpenaireProperties, ErrorCodes} from '../../utils/properties/openaireProperties'; +import {RouterHelper} from '../../utils/routerHelper.class'; + +@Component({ + selector: 'search-result', + templateUrl:'searchResult.component.html' +}) + +export class SearchResultComponent { + @Input() results: SearchResult[]; + @Input() status: number; + @Input() type: string; + @Input() showLoading: boolean = false; + @Input() showSubjects: boolean = false; + @Input() custom_class: string = "search-results"; + + public urlParam: string; + public linkToAdvancedSearchPage: string; + public errorCodes:ErrorCodes = new ErrorCodes(); + public routerHelper:RouterHelper = new RouterHelper(); + public errorMessage: string = "No results found"; + + constructor () {} + + ngOnInit() { + if(this.type == "publication") { + this.linkToAdvancedSearchPage = OpenaireProperties.getLinkToAdvancedSearchPublications(); + this.urlParam = "articleId"; + } else if(this.type == "dataset") { + this.linkToAdvancedSearchPage = OpenaireProperties.getLinkToAdvancedSearchDatasets(); + this.urlParam = "datasetId"; + } else if(this.type == "software") { + this.linkToAdvancedSearchPage = OpenaireProperties.getLinkToAdvancedSearchSoftware(); + this.urlParam = "softwareId"; + } else if(this.type == "project") { + this.linkToAdvancedSearchPage = OpenaireProperties.getLinkToAdvancedSearchProjects(); + this.urlParam = "projectId"; + } else if(this.type == "organization") { + this.linkToAdvancedSearchPage = OpenaireProperties.getLinkToAdvancedSearchOrganizations(); + this.urlParam = "organizationId"; + } else if(this.type == "dataprovider") { + this.linkToAdvancedSearchPage = OpenaireProperties.getLinkToAdvancedSearchDataProviders(); + this.urlParam = "datasourceId"; + } + } + + public quote(params: string):string { + return '"'+params+'"'; + } +} diff --git a/portal-4cli/src/app/searchPages/searchUtils/searchResults.module.ts b/portal-4cli/src/app/searchPages/searchUtils/searchResults.module.ts new file mode 100644 index 00000000..0ca38971 --- /dev/null +++ b/portal-4cli/src/app/searchPages/searchUtils/searchResults.module.ts @@ -0,0 +1,29 @@ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { RouterModule } from '@angular/router'; + +import {ErrorMessagesModule} from '../../utils/errorMessages.module'; + +import {SearchResult} from '../../utils/entities/searchResult'; +import {SearchResultComponent} from './searchResult.component'; + +@NgModule({ + imports: [ + CommonModule, FormsModule, + RouterModule, ErrorMessagesModule + ], + declarations: [ + SearchResultComponent, + +], + + providers:[ + ], + exports: [ + + SearchResultComponent + + ] +}) +export class SearchResultsModule { } diff --git a/portal-4cli/src/app/searchPages/searchUtils/searchUtils.class.ts b/portal-4cli/src/app/searchPages/searchUtils/searchUtils.class.ts new file mode 100644 index 00000000..da9fb9cb --- /dev/null +++ b/portal-4cli/src/app/searchPages/searchUtils/searchUtils.class.ts @@ -0,0 +1,10 @@ +export class SearchUtilsClass{ + page:number = 1; + size:number = 10; + status:number = 1; + keyword:string = ""; + baseUrl:string = ""; + totalResults = 0; + totalResultsNoFilters:number; // for organization landing - tab with projects + +} diff --git a/portal-4cli/src/app/searchPages/searchUtils/tabResult.component.html b/portal-4cli/src/app/searchPages/searchUtils/tabResult.component.html new file mode 100644 index 00000000..da14e703 --- /dev/null +++ b/portal-4cli/src/app/searchPages/searchUtils/tabResult.component.html @@ -0,0 +1,122 @@ + diff --git a/portal-4cli/src/app/searchPages/searchUtils/tabResult.component.ts b/portal-4cli/src/app/searchPages/searchUtils/tabResult.component.ts new file mode 100644 index 00000000..39576e56 --- /dev/null +++ b/portal-4cli/src/app/searchPages/searchUtils/tabResult.component.ts @@ -0,0 +1,31 @@ +import {Component, Input} from '@angular/core'; +import {SearchResult} from '../../utils/entities/searchResult'; +import {ErrorCodes} from '../../utils/properties/openaireProperties'; +import {RouterHelper} from '../../utils/routerHelper.class'; + +@Component({ + selector: 'tab-result', + templateUrl: 'tabResult.component.html' + }) + +export class TabResultComponent { + @Input() results: SearchResult[]; + @Input() status: number; + @Input() type: string; + @Input() urlParam: string; + @Input() showLoading: boolean = false; + @Input() showOrganizations: boolean = true; + + public errorCodes:ErrorCodes = new ErrorCodes(); + public routerHelper:RouterHelper = new RouterHelper(); + public errorMessage: string = "No results found"; + constructor () { + + } + + ngOnInit() {} + + public quote(params: string):string { + return '"'+params+'"'; + } +} diff --git a/portal-4cli/src/app/searchPages/searchUtils/tabResult.module.ts b/portal-4cli/src/app/searchPages/searchUtils/tabResult.module.ts new file mode 100644 index 00000000..589b5623 --- /dev/null +++ b/portal-4cli/src/app/searchPages/searchUtils/tabResult.module.ts @@ -0,0 +1,23 @@ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import {SearchResult} from '../../utils/entities/searchResult'; +import {TabResultComponent} from './tabResult.component'; +import {RouterModule} from '@angular/router'; + +@NgModule({ + imports: [ + CommonModule, FormsModule, + RouterModule + ], + declarations: [ + TabResultComponent, + ], + providers:[ + ], + exports: [ + TabResultComponent + ] +}) +export class TabResultModule { } diff --git a/portal-4cli/src/app/searchPages/simple/searchDataProviders-routing.module.ts b/portal-4cli/src/app/searchPages/simple/searchDataProviders-routing.module.ts new file mode 100644 index 00000000..c268a082 --- /dev/null +++ b/portal-4cli/src/app/searchPages/simple/searchDataProviders-routing.module.ts @@ -0,0 +1,19 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import{SearchDataprovidersComponent} from './searchDataproviders.component'; +import {FreeGuard} from'../../login/freeGuard.guard'; +import {PreviousRouteRecorder} from '../../utils/piwik/previousRouteRecorder.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + RouterModule.forChild([ + { path: '', component: SearchDataprovidersComponent, canActivate: [FreeGuard, IsRouteEnabled], data: { + redirect: '/error' + }, canDeactivate: [PreviousRouteRecorder] } + + ]) + ] +}) +export class SearchDataProvidersRoutingModule { } diff --git a/portal-4cli/src/app/searchPages/simple/searchDataProviders.module.ts b/portal-4cli/src/app/searchPages/simple/searchDataProviders.module.ts new file mode 100644 index 00000000..45f1ef1b --- /dev/null +++ b/portal-4cli/src/app/searchPages/simple/searchDataProviders.module.ts @@ -0,0 +1,33 @@ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import{ SearchDataProvidersRoutingModule} from './searchDataProviders-routing.module'; +import{SearchDataprovidersComponent} from './searchDataproviders.component'; + +import {SearchResultsModule } from '../searchUtils/searchResults.module'; + +import {DataProvidersServiceModule} from '../../services/dataProvidersService.module'; +import {SearchFormModule} from '../searchUtils/searchForm.module'; +//import {SearchFilterModalModule} from '../searchUtils/searchFilterModal.module'; +import {SearchPageModule} from '../searchUtils/searchPage.module'; +import {FreeGuard} from'../../login/freeGuard.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + CommonModule, FormsModule, + + DataProvidersServiceModule, + SearchFormModule, SearchResultsModule, SearchDataProvidersRoutingModule, SearchPageModule + + ], + declarations: [ + SearchDataprovidersComponent + ], + providers:[FreeGuard, IsRouteEnabled], + exports: [ + SearchDataprovidersComponent + ] +}) +export class SearchDataProvidersModule { } diff --git a/portal-4cli/src/app/searchPages/simple/searchDataproviders.component.ts b/portal-4cli/src/app/searchPages/simple/searchDataproviders.component.ts new file mode 100644 index 00000000..8e57cd16 --- /dev/null +++ b/portal-4cli/src/app/searchPages/simple/searchDataproviders.component.ts @@ -0,0 +1,360 @@ +import {Component, Input, ViewChild} from '@angular/core'; +import { ActivatedRoute} from '@angular/router'; +import {Location} from '@angular/common'; +import { Filter, Value} from '../searchUtils/searchHelperClasses.class'; +import {SearchDataprovidersService} from '../../services/searchDataproviders.service'; +import {SearchResult} from '../../utils/entities/searchResult'; +import {OpenaireProperties, ErrorCodes} from '../../utils/properties/openaireProperties'; +import {SearchFields} from '../../utils/properties/searchFields'; +import {SearchPageComponent } from '../searchUtils/searchPage.component'; +import {SearchUtilsClass } from '../searchUtils/searchUtils.class'; + +@Component({ + selector: 'search-dataproviders', + template: ` + + + + + ` +}) +export class SearchDataprovidersComponent { + private errorCodes: ErrorCodes; + + public results =[]; + public filters =[]; + public totalResults:number = 0 ; + public baseUrl:string; + public searchUtils:SearchUtilsClass = new SearchUtilsClass(); + public sub: any; public subResults: any; + public _location:Location; + public searchFields:SearchFields = new SearchFields(); + public refineFields: string[] = this.searchFields.DATASOURCE_REFINE_FIELDS; + public fieldIdsMap= this.searchFields.DATASOURCE_FIELDS; + public CSV: any = { "columnNames": [ "Title", "Type", "Coutries", "Compatibility" ], + "export":[] + }; + public CSVDownloaded = false; + public csvParams: string; + + public disableForms: boolean = false; + public loadPaging: boolean = true; + public oldTotalResults: number = 0; + + @ViewChild (SearchPageComponent) searchPage : SearchPageComponent ; + + constructor (private route: ActivatedRoute, private _searchDataprovidersService: SearchDataprovidersService ) { + this.errorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + this.searchUtils.page =1; + this.baseUrl = OpenaireProperties.getLinkToSearchDataProviders(); + } + + public ngOnInit() { + this.searchPage.refineFields = this.refineFields; + this.searchPage.fieldIdsMap = this.fieldIdsMap; + var firstLoad =true; + + this.sub = this.route.queryParams.subscribe(params => { + if(params['page'] && this.searchUtils.page != params['page']) { + this.loadPaging = false; + this.oldTotalResults = this.searchUtils.totalResults; + } + + this.searchUtils.keyword = (params['keyword']?params['keyword']:''); + var refine = true; + if(this.searchUtils.page != ((params['page']=== undefined)?1:+params['page']) && this.filters && !firstLoad){ + refine = false; + + } + firstLoad = false; + this.searchUtils.page = (params['page']=== undefined)?1:+params['page']; + + var queryParameters = this.searchPage.getQueryParametersFromUrl(params); + this._getResults(queryParameters, refine, this.searchUtils.page, this.searchUtils.size); + }); + } + + public ngOnDestroy() { + if(this.sub){ + this.sub.unsubscribe(); + } + if(this.subResults){ + this.subResults.unsubscribe(); + } + } + + public getNumForEntity(entity: string, id:string) { + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + + if(id != "" && entity != "") { + + this._searchDataprovidersService.numOfEntityDataproviders(id, entity).subscribe( + data => { + this.searchUtils.totalResults = data; + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + } + ); + } + } + + public getNumForSearch(keyword: string) { + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + + this._searchDataprovidersService.numOfDataproviders(keyword).subscribe( + data => { + this.searchUtils.totalResults = data; + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + } + ); + } + +public getResultsForDeposit(id:string, type:string, page: number, size: number){ + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.status = errorCodes.LOADING; + if(id != "") { + + this._searchDataprovidersService.searchDataprovidersForDeposit(id,type, page, size).subscribe( + data => { + this.searchUtils.totalResults = data[0]; + console.info("search Dataproviders forDeposit: [id:"+id+", type:"+type+" ] [total results:"+this.totalResults+"]"); + this.results = data[1]; + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + } + ); + } +} + public getResultsForEntity(entity:string, id:string, page: number, size: number){ + var parameters = ""; + + if(entity == "organization") { + parameters = "organizations/"+id; + } + + if(parameters != "") { + + this._searchDataprovidersService.searchDataprovidersForEntity(parameters, page, size).subscribe( + data => { + this.searchUtils.totalResults = data[0]; + console.info("search Dataproviders for "+entity+": [Parameters:"+parameters+" ] [total results:"+this.searchUtils.totalResults+"]"); + this.results = data[1]; + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + } + ); + } + } + + public getResultsForDataproviders(id:string, page: number, size: number){ + + this._searchDataprovidersService.getDataProvidersforEntityRegistry(id, page, size).subscribe( + data => { + this.searchUtils.totalResults = data[0]; + console.info("search Dataproviders for Entity Registry: [Id:"+id+" ] [total results:"+this.searchUtils.totalResults+"]"); + this.results = data[1]; + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + } + ); + } + + public getResults(keyword:string,refine:boolean, page: number, size: number){ + var parameters = ""; + if(keyword.length > 0){ + parameters = "q="+ keyword; + } + this._getResults(parameters,refine,page,this.searchUtils.size); + } + private _getResults(parameters:string,refine:boolean, page: number, size: number){ + this.csvParams = parameters; + + // if(!refine && !this.searchPage){ + // this.searchPage = new SearchPageComponent(this._location); + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + + //this.searchPage.openLoading(); + this.disableForms = true; + this.results = []; + this.searchUtils.totalResults = 0; + + this.subResults = this._searchDataprovidersService.searchDataproviders(parameters,(refine)?this.searchPage.getRefineFieldsQuery():null, page, size, this.searchPage.getFields()).subscribe( + data => { + this.searchUtils.totalResults = data[0]; + console.info("search Content Providers: [Parameters:"+parameters+" ] [total results:"+this.searchUtils.totalResults+"]"); + this.results = data[1]; + if(refine){ + this.filters = data[2]; + } + this.searchPage.checkSelectedFilters(this.filters); + // this.filters = this.searchPage.checkSelectedFilters(data[2]); + this.searchPage.updateBaseUrlWithParameters(this.filters); + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + //this.searchPage.closeLoading(); + this.disableForms = false; + + if(this.searchUtils.status == this.errorCodes.DONE) { + // Page out of limit!!! + let totalPages:any = this.searchUtils.totalResults/(this.searchUtils.size); + if(!(Number.isInteger(totalPages))) { + totalPages = (parseInt(totalPages, 10) + 1); + } + if(totalPages < page) { + this.searchUtils.totalResults = 0; + this.searchUtils.status = this.errorCodes.OUT_OF_BOUND; + } + } + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + + //this.searchPage.closeLoading(); + this.disableForms = false; + } + ); + } + + private setFilters(){ + //TODO set filters from + } + + public queryChanged($event) { + this.loadPaging = true; + + var parameters = $event.value; + this._getResults(parameters, true, this.searchUtils.page, this.searchUtils.size); + } +} diff --git a/portal-4cli/src/app/searchPages/simple/searchDatasets-routing.module.ts b/portal-4cli/src/app/searchPages/simple/searchDatasets-routing.module.ts new file mode 100644 index 00000000..6e970898 --- /dev/null +++ b/portal-4cli/src/app/searchPages/simple/searchDatasets-routing.module.ts @@ -0,0 +1,19 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import{SearchDatasetsComponent} from './searchDatasets.component'; +import {FreeGuard} from'../../login/freeGuard.guard'; +import {PreviousRouteRecorder} from '../../utils/piwik/previousRouteRecorder.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + RouterModule.forChild([ + { path: '', component: SearchDatasetsComponent, canActivate: [FreeGuard, IsRouteEnabled], data: { + redirect: '/error' + }, canDeactivate: [PreviousRouteRecorder] } + + ]) + ] +}) +export class SearchDatasetsRoutingModule { } diff --git a/portal-4cli/src/app/searchPages/simple/searchDatasets.component.ts b/portal-4cli/src/app/searchPages/simple/searchDatasets.component.ts new file mode 100644 index 00000000..60a8099a --- /dev/null +++ b/portal-4cli/src/app/searchPages/simple/searchDatasets.component.ts @@ -0,0 +1,275 @@ +import {Component, Input, ViewChild} from '@angular/core'; +import { ActivatedRoute} from '@angular/router'; +import {Location} from '@angular/common'; +import { Filter, Value} from '../searchUtils/searchHelperClasses.class'; + +import {SearchDatasetsService} from '../../services/searchDatasets.service'; +import {SearchResult} from '../../utils/entities/searchResult'; +import {OpenaireProperties, ErrorCodes} from '../../utils/properties/openaireProperties'; +import {SearchFields} from '../../utils/properties/searchFields'; +import {SearchPageComponent } from '../searchUtils/searchPage.component'; +import {SearchUtilsClass } from '../searchUtils/searchUtils.class'; +import {DOI} from '../../utils/string-utils.class'; + +@Component({ + selector: 'search-datasets', + template: ` + + + + ` +}) + +export class SearchDatasetsComponent { + private errorCodes: ErrorCodes; + + public results =[]; + public filters: Filter[] =[]; + // public totalResults:number = 0 ; + public baseUrl:string; + + public searchUtils:SearchUtilsClass = new SearchUtilsClass(); + private sub: any; + private subResults: any; + private searchFields:SearchFields = new SearchFields(); + public refineFields: string[] = this.searchFields.RESULT_REFINE_FIELDS; + public fieldIdsMap=this.searchFields.RESULT_FIELDS; + private urlParams : Map; + private _location:Location; + public csvParams: string; + public disableForms: boolean = false; + public loadPaging: boolean = true; + public oldTotalResults: number = 0; + + @ViewChild (SearchPageComponent) searchPage : SearchPageComponent ; + constructor (private route: ActivatedRoute, private _searchDatasetsService: SearchDatasetsService ) { + + this.errorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + this.searchUtils.page =1; + this.baseUrl = OpenaireProperties.getLinkToSearchDatasets(); + + } + + public ngOnInit() { + this.searchPage.refineFields = this.refineFields; + this.searchPage.fieldIdsMap = this.fieldIdsMap; + this.searchPage.type = "research data"; + var firstLoad =true; + this.sub = this.route.queryParams.subscribe(params => { + if(params['page'] && this.searchUtils.page != params['page']) { + this.loadPaging = false; + this.oldTotalResults = this.searchUtils.totalResults; + } + + this.searchUtils.keyword = (params['keyword']?params['keyword']:''); + var refine = true; + if(this.searchUtils.page != ((params['page']=== undefined)?1:+params['page']) && this.filters && !firstLoad){ + refine = false; + } + firstLoad = false; + this.searchUtils.page = (params['page']=== undefined)?1:+params['page']; + + var queryParameters = this.searchPage.getQueryParametersFromUrl(params); + this._getResults(queryParameters, refine, this.searchUtils.page, this.searchUtils.size); + + }); + } + + public ngOnDestroy() { + if(this.sub){ + this.sub.unsubscribe(); + } + if(this.subResults){ + this.subResults.unsubscribe(); + } + } + + +public getResultsForEntity(entity:string, id:string, page: number, size: number){ + var parameters = ""; + + if(entity == "project") { + parameters = "projects/"+id; + } + + if(parameters != "") { + + this._searchDatasetsService.searchDatasetsForEntity(parameters, page, size).subscribe( + data => { + this.searchUtils.totalResults = data[0]; + console.info("search Research Data for "+entity+": [Parameters:"+parameters+" ] [total results:"+this.searchUtils.totalResults+"]"); + this.results = data[1]; + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + } + ); + } +} + +public getResultsForDataproviders(id:string, resultsFrom:string, page: number, size: number){ + var parameters; + if(resultsFrom == "collectedFrom") { + parameters = "datasets?fq=collectedfromdatasourceid exact "+'"'+id+'"'; + } else if(resultsFrom == "hostedBy") { + parameters = "datasets?fq=resulthostingdatasourceid exact "+'"'+id+'"'; + } + + if(parameters != "") { + + this._searchDatasetsService.searchDatasetsForDataproviders(parameters, page, size).subscribe( + data => { + this.searchUtils.totalResults = data[0]; + console.info("search Research Data for Dataproviders: [Parameters:"+parameters+" ] [total results:"+this.searchUtils.totalResults+"]"); + this.results = data[1]; + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + } + ); + } +} + +public getResults(keyword:string,refine:boolean, page: number, size: number){ + var parameters = ""; + if(keyword.length > 0){ + var DOIs:string[] = DOI.getDOIsFromString(keyword); + var doisParams = ""; + for(var i =0 ;i < DOIs.length; i++){ + doisParams+=(doisParams.length > 0?"&":"")+'doi="'+ DOIs[i]+'"'; + } + if(doisParams.length > 0){ + parameters += "&"+doisParams; + }else{ + parameters = "q=" + keyword; + } + } + this._getResults(parameters,refine,page,size); +} +private _getResults(parameters:string,refine:boolean, page: number, size: number){ + this.csvParams = parameters; + + // if(!refine && !this.searchPage){ + // this.searchPage = new SearchPageComponent(this._location); + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + //this.searchPage.openLoading(); + this.disableForms = true; + this.results = []; + this.searchUtils.totalResults = 0; + + this.subResults = this._searchDatasetsService.searchDatasets(parameters,(refine)?this.searchPage.getRefineFieldsQuery():null, page, size, this.searchPage.getFields()).subscribe( + data => { + this.searchUtils.totalResults = data[0]; + console.info("search Research Data: [Parameters:"+parameters+" ] [total results:"+this.searchUtils.totalResults+"]"); + this.results = data[1]; + if(refine){ + this.filters = data[2]; + } + this.searchPage.checkSelectedFilters(this.filters); + this.searchPage.updateBaseUrlWithParameters(this.filters); + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + //this.searchPage.closeLoading(); + this.disableForms = false; + + if(this.searchUtils.status == this.errorCodes.DONE) { + // Page out of limit!!! + let totalPages:any = this.searchUtils.totalResults/(this.searchUtils.size); + if(!(Number.isInteger(totalPages))) { + totalPages = (parseInt(totalPages, 10) + 1); + } + if(totalPages < page) { + this.searchUtils.totalResults = 0; + this.searchUtils.status = this.errorCodes.OUT_OF_BOUND; + } + } + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + + //this.searchPage.closeLoading(); + this.disableForms = false; + } + ); +} + + + + private setFilters(){ + //TODO set filters from + } + + public queryChanged($event) { + this.loadPaging = true; + + var parameters = $event.value; + //this.getResults(parameters, this.searchUtils.page, this.searchUtils.size, "searchPage"); + this._getResults(parameters, true, this.searchUtils.page, this.searchUtils.size); + } +} diff --git a/portal-4cli/src/app/searchPages/simple/searchDatasets.module.ts b/portal-4cli/src/app/searchPages/simple/searchDatasets.module.ts new file mode 100644 index 00000000..7bb43a80 --- /dev/null +++ b/portal-4cli/src/app/searchPages/simple/searchDatasets.module.ts @@ -0,0 +1,33 @@ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import{ SearchDatasetsRoutingModule} from './searchDatasets-routing.module'; +import{SearchDatasetsComponent} from './searchDatasets.component'; + +import {SearchResultsModule } from '../searchUtils/searchResults.module'; + +import {DatasetsServiceModule} from '../../services/datasetsService.module'; +import {SearchFormModule} from '../searchUtils/searchForm.module'; +//import {SearchFilterModalModule} from '../searchUtils/searchFilterModal.module'; +import {SearchPageModule} from '../searchUtils/searchPage.module'; +import {FreeGuard} from'../../login/freeGuard.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + CommonModule, FormsModule, + + DatasetsServiceModule, + SearchFormModule, SearchResultsModule, SearchDatasetsRoutingModule, SearchPageModule + + ], + declarations: [ + SearchDatasetsComponent + ], + providers:[FreeGuard, IsRouteEnabled], + exports: [ + SearchDatasetsComponent + ] +}) +export class SearchDatasetsModule { } diff --git a/portal-4cli/src/app/searchPages/simple/searchOrganizations-routing.module.ts b/portal-4cli/src/app/searchPages/simple/searchOrganizations-routing.module.ts new file mode 100644 index 00000000..a2b4ad8c --- /dev/null +++ b/portal-4cli/src/app/searchPages/simple/searchOrganizations-routing.module.ts @@ -0,0 +1,19 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import{SearchOrganizationsComponent} from './searchOrganizations.component'; +import {FreeGuard} from'../../login/freeGuard.guard'; +import {PreviousRouteRecorder} from '../../utils/piwik/previousRouteRecorder.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + RouterModule.forChild([ + { path: '', component: SearchOrganizationsComponent, canActivate: [FreeGuard, IsRouteEnabled], data: { + redirect: '/error' + }, canDeactivate: [PreviousRouteRecorder] } + + ]) + ] +}) +export class SearchOrganizationsRoutingModule { } diff --git a/portal-4cli/src/app/searchPages/simple/searchOrganizations.component.ts b/portal-4cli/src/app/searchPages/simple/searchOrganizations.component.ts new file mode 100644 index 00000000..12c5d7ec --- /dev/null +++ b/portal-4cli/src/app/searchPages/simple/searchOrganizations.component.ts @@ -0,0 +1,175 @@ +import {Component, Input, ViewChild} from '@angular/core'; +import { ActivatedRoute} from '@angular/router'; +import {Location} from '@angular/common'; +import { Filter, Value} from '../searchUtils/searchHelperClasses.class'; +import {SearchOrganizationsService} from '../../services/searchOrganizations.service'; +import {SearchResult} from '../../utils/entities/searchResult'; +import {OpenaireProperties, ErrorCodes} from '../../utils/properties/openaireProperties'; +import {SearchFields} from '../../utils/properties/searchFields'; +import {SearchPageComponent } from '../searchUtils/searchPage.component'; +import {SearchUtilsClass } from '../searchUtils/searchUtils.class'; + +@Component({ + selector: 'search-organizations', + template: ` + + + + + ` + +}) +export class SearchOrganizationsComponent { + private errorCodes: ErrorCodes; + + public results =[]; + public filters =[]; + public baseUrl:string; + public searchUtils:SearchUtilsClass = new SearchUtilsClass(); + public sub: any; + public subResults: any; + public searchFields:SearchFields = new SearchFields(); + public refineFields: string[] = this.searchFields.ORGANIZATION_REFINE_FIELDS; + public fieldIdsMap = this.searchFields.ORGANIZATION_FIELDS; + public urlParams : Map; + public _location:Location; + public csvParams: string; + public disableForms: boolean = false; + public loadPaging: boolean = true; + public oldTotalResults: number = 0; + + @ViewChild (SearchPageComponent) searchPage : SearchPageComponent ; + + constructor (private route: ActivatedRoute, private _searchOrganizationsService: SearchOrganizationsService ) { + + this.errorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + this.searchUtils.page =1; + this.baseUrl = OpenaireProperties.getLinkToSearchOrganizations(); + + } + + public ngOnInit() { + this.searchPage.refineFields = this.refineFields; + this.searchPage.fieldIdsMap = this.fieldIdsMap; + var firstLoad = true; + this.sub = this.route.queryParams.subscribe(params => { + if(params['page'] && this.searchUtils.page != params['page']) { + this.loadPaging = false; + this.oldTotalResults = this.searchUtils.totalResults; + } + + this.searchUtils.keyword = (params['keyword']?params['keyword']:''); + var refine = true; + if(this.searchUtils.page != ((params['page']=== undefined)?1:+params['page']) && this.filters && !firstLoad){ + refine = false; + + } + firstLoad = false; + this.searchUtils.page = (params['page']=== undefined)?1:+params['page']; + + var queryParameters = this.searchPage.getQueryParametersFromUrl(params); + this._getResults(queryParameters, refine, this.searchUtils.page, this.searchUtils.size); + }); + } + + public ngOnDestroy() { + if(this.sub){ + this.sub.unsubscribe(); + } + if(this.subResults){ + this.subResults.unsubscribe(); + } + } + + + public getResults(keyword:string,refine:boolean, page: number, size: number){ + var parameters = ""; + if(keyword.length > 0){ + parameters = "q=" + keyword; + } + this._getResults(parameters,refine,page,this.searchUtils.size); + } + private _getResults(parameters:string,refine:boolean, page: number, size: number){ + this.csvParams = parameters; + + // if(!refine && !this.searchPage){ + // this.searchPage = new SearchPageComponent(this._location); + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + //this.searchPage.openLoading(); + this.disableForms = true; + this.results = []; + this.searchUtils.totalResults = 0; + + this.subResults = this._searchOrganizationsService.searchOrganizations(parameters,(refine)?this.searchPage.getRefineFieldsQuery():null, page, size, this.searchPage.getFields()).subscribe( + data => { + this.searchUtils.totalResults = data[0]; + console.info("search Organizations: [Parameters:"+parameters+" ] [total results:"+this.searchUtils.totalResults+"]"); + this.results = data[1]; + if(refine){ + this.filters = data[2]; + } + this.searchPage.checkSelectedFilters(this.filters); + this.searchPage.updateBaseUrlWithParameters(this.filters); + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + //this.searchPage.closeLoading(); + this.disableForms = false; + + if(this.searchUtils.status == this.errorCodes.DONE) { + // Page out of limit!!! + let totalPages:any = this.searchUtils.totalResults/(this.searchUtils.size); + if(!(Number.isInteger(totalPages))) { + totalPages = (parseInt(totalPages, 10) + 1); + } + if(totalPages < page) { + this.searchUtils.totalResults = 0; + this.searchUtils.status = this.errorCodes.OUT_OF_BOUND; + } + } + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + + //this.searchPage.closeLoading(); + this.disableForms = false; + } + ); + } + + + public queryChanged($event) { + this.loadPaging = true; + + var parameters = $event.value; + console.info("queryChanged: Execute search query "+parameters); + this._getResults(parameters, true, this.searchUtils.page, this.searchUtils.size); + } +} diff --git a/portal-4cli/src/app/searchPages/simple/searchOrganizations.module.ts b/portal-4cli/src/app/searchPages/simple/searchOrganizations.module.ts new file mode 100644 index 00000000..ca4c57d8 --- /dev/null +++ b/portal-4cli/src/app/searchPages/simple/searchOrganizations.module.ts @@ -0,0 +1,32 @@ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import{ SearchOrganizationsRoutingModule} from './searchOrganizations-routing.module'; +import{SearchOrganizationsComponent} from './searchOrganizations.component'; + +import {SearchResultsModule } from '../searchUtils/searchResults.module'; + +import {OrganizationsServiceModule} from '../../services/organizationsService.module'; +import {SearchFormModule} from '../searchUtils/searchForm.module'; +import {SearchPageModule} from '../searchUtils/searchPage.module'; +import {FreeGuard} from'../../login/freeGuard.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + CommonModule, FormsModule, + + OrganizationsServiceModule, + SearchFormModule, SearchResultsModule, SearchOrganizationsRoutingModule, SearchPageModule + + ], + declarations: [ + SearchOrganizationsComponent + ], + providers:[FreeGuard, IsRouteEnabled], + exports: [ + SearchOrganizationsComponent + ] +}) +export class SearchOrganizationsModule { } diff --git a/portal-4cli/src/app/searchPages/simple/searchProjects-routing.module.ts b/portal-4cli/src/app/searchPages/simple/searchProjects-routing.module.ts new file mode 100644 index 00000000..37ad2a39 --- /dev/null +++ b/portal-4cli/src/app/searchPages/simple/searchProjects-routing.module.ts @@ -0,0 +1,19 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import{SearchProjectsComponent} from './searchProjects.component'; +import {FreeGuard} from'../../login/freeGuard.guard'; +import {PreviousRouteRecorder} from '../../utils/piwik/previousRouteRecorder.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + RouterModule.forChild([ + { path: '', component: SearchProjectsComponent, canActivate: [FreeGuard, IsRouteEnabled], data: { + redirect: '/error' + }, canDeactivate: [PreviousRouteRecorder] } + + ]) + ] +}) +export class SearchProjectsRoutingModule { } diff --git a/portal-4cli/src/app/searchPages/simple/searchProjects.component.ts b/portal-4cli/src/app/searchPages/simple/searchProjects.component.ts new file mode 100644 index 00000000..0c7bbb5f --- /dev/null +++ b/portal-4cli/src/app/searchPages/simple/searchProjects.component.ts @@ -0,0 +1,213 @@ +import {Component, Input, ViewChild} from '@angular/core'; +import { ActivatedRoute} from '@angular/router'; +import {Location} from '@angular/common'; +import { Filter, Value} from '../searchUtils/searchHelperClasses.class'; +import {SearchProjectsService} from '../../services/searchProjects.service'; +import {SearchResult} from '../../utils/entities/searchResult'; +import {OpenaireProperties, ErrorCodes} from '../../utils/properties/openaireProperties'; +import {SearchFields} from '../../utils/properties/searchFields'; +import {SearchPageComponent } from '../searchUtils/searchPage.component'; +import {SearchUtilsClass } from '../searchUtils/searchUtils.class'; + +@Component({ + selector: 'search-projects', + template: ` + + + + ` + +}) +export class SearchProjectsComponent { + private errorCodes: ErrorCodes; + + public results =[]; + public filters: Filter[] =[]; + public baseUrl:string; + public searchUtils:SearchUtilsClass = new SearchUtilsClass(); + public sub: any; + public subResults: any; + public searchFields:SearchFields = new SearchFields(); + public refineFields: string[] = this.searchFields.PROJECT_REFINE_FIELDS; + public fieldIdsMap = this.searchFields.PROJECT_FIELDS; + public urlParams : Map; + public _location:Location; + public csvParams: string; + public disableForms: boolean = false; + public loadPaging: boolean = true; + public oldTotalResults: number = 0; + + @ViewChild (SearchPageComponent) searchPage : SearchPageComponent ; + + constructor (private route: ActivatedRoute, private _searchProjectsService: SearchProjectsService) { + console.info(" constructor SearchProjectsComponent "+this.refineFields.length); + + this.errorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + this.searchUtils.page =1; + this.baseUrl = OpenaireProperties.getLinkToSearchProjects(); + + } + + public ngOnInit() { + this.searchPage.refineFields = this.refineFields; + this.searchPage.fieldIdsMap = this.fieldIdsMap; + console.info(" ngOnInit SearchProjectsComponent "+this.refineFields.length); + //get refine field filters from url parameters + var firstLoad = true; + this.sub = this.route.queryParams.subscribe(params => { + if(params['page'] && this.searchUtils.page != params['page']) { + this.loadPaging = false; + this.oldTotalResults = this.searchUtils.totalResults; + } + + //get keyword from url parameters + this.searchUtils.keyword = (params['keyword']?params['keyword']:''); + var refine = true; + if(this.searchUtils.page != ((params['page']=== undefined)?1:+params['page']) && this.filters && !firstLoad){ + refine = false; + + } + firstLoad = false; + //get page from url parameters + this.searchUtils.page = (params['page']=== undefined)?1:+params['page']; + var queryParameters = this.searchPage.getQueryParametersFromUrl(params); + this._getResults(queryParameters, refine, this.searchUtils.page, this.searchUtils.size); + }); + } + + public ngOnDestroy() { + if(this.sub){ + this.sub.unsubscribe(); + } + if(this.subResults){ + this.subResults.unsubscribe(); + } + } + + public getResults(keyword:string,refine:boolean, page: number, size: number){ + var parameters = ""; + if(keyword.length > 0){ + parameters = "q="+keyword; + } + this._getResults(parameters,refine,page,this.searchUtils.size); + } + private _getResults(parameters:string,refine:boolean, page: number, size: number){ + this.csvParams = parameters; + + // if(!refine && !this.searchPage){ + // this.searchPage = new SearchPageComponent(this._location); + // } + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + //this.searchPage.openLoading(); + this.disableForms = true; + this.results = []; + this.searchUtils.totalResults = 0; + + this.subResults = this._searchProjectsService.searchProjects(parameters,(refine)?this.searchPage.getRefineFieldsQuery():null, page, size, this.searchPage.getFields()).subscribe( + data => { + this.searchUtils.totalResults = data[0]; + console.info("search Projects: [Parameters:"+parameters+" ] [total results:"+this.searchUtils.totalResults+"]"); + this.results = data[1]; + if(refine){ + this.filters = data[2]; + } + this.searchPage.checkSelectedFilters(this.filters); + // this.filters = this.searchPage.checkSelectedFilters(data[2]); + this.searchPage.updateBaseUrlWithParameters(this.filters); + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + //this.searchPage.closeLoading(); + this.disableForms = false; + + if(this.searchUtils.status == this.errorCodes.DONE) { + // Page out of limit!!! + let totalPages:any = this.searchUtils.totalResults/(this.searchUtils.size); + if(!(Number.isInteger(totalPages))) { + totalPages = (parseInt(totalPages, 10) + 1); + } + if(totalPages < page) { + this.searchUtils.totalResults = 0; + this.searchUtils.status = this.errorCodes.OUT_OF_BOUND; + } + } + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + + //this.searchPage.closeLoading(); + this.disableForms = false; + } + ); + } + + public getResultsForDataproviders(id:string, page: number, size: number){ + + this._searchProjectsService.getProjectsforDataProvider(id, page, size).subscribe( + data => { + this.searchUtils.totalResults = data[0]; + console.info("search Projects for Dataproviders: [Id:"+id+" ] [total results:"+this.searchUtils.totalResults+"]"); + this.results = data[1]; + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + } + ); + } + + + public queryChanged($event) { + this.loadPaging = true; + + this.urlParams = undefined; + var parameters = $event.value; + this._getResults(parameters, true, this.searchUtils.page, this.searchUtils.size); + } + +} diff --git a/portal-4cli/src/app/searchPages/simple/searchProjects.module.ts b/portal-4cli/src/app/searchPages/simple/searchProjects.module.ts new file mode 100644 index 00000000..6a6d68ef --- /dev/null +++ b/portal-4cli/src/app/searchPages/simple/searchProjects.module.ts @@ -0,0 +1,33 @@ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import{ SearchProjectsRoutingModule} from './searchProjects-routing.module'; +import{SearchProjectsComponent} from './searchProjects.component'; + +import {SearchResultsModule } from '../searchUtils/searchResults.module'; + +import {ProjectsServiceModule} from '../../services/projectsService.module'; +import {SearchFormModule} from '../searchUtils/searchForm.module'; +//import {SearchFilterModalModule} from '../searchUtils/searchFilterModal.module'; +import {SearchPageModule} from '../searchUtils/searchPage.module'; +import {FreeGuard} from'../../login/freeGuard.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + CommonModule, FormsModule, + + ProjectsServiceModule, + SearchFormModule, SearchResultsModule, SearchProjectsRoutingModule, SearchPageModule + + ], + declarations: [ + SearchProjectsComponent + ], + providers:[FreeGuard, IsRouteEnabled], + exports: [ + SearchProjectsComponent + ] +}) +export class SearchProjectsModule { } diff --git a/portal-4cli/src/app/searchPages/simple/searchPublications-routing.module.ts b/portal-4cli/src/app/searchPages/simple/searchPublications-routing.module.ts new file mode 100644 index 00000000..97bebe07 --- /dev/null +++ b/portal-4cli/src/app/searchPages/simple/searchPublications-routing.module.ts @@ -0,0 +1,19 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import{SearchPublicationsComponent} from './searchPublications.component'; +import {FreeGuard} from'../../login/freeGuard.guard'; +import {PreviousRouteRecorder} from '../../utils/piwik/previousRouteRecorder.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + RouterModule.forChild([ + { path: '', component: SearchPublicationsComponent, canActivate: [FreeGuard, IsRouteEnabled], data: { + redirect: '/error' + }, canDeactivate: [PreviousRouteRecorder] } + + ]) + ] +}) +export class SearchPublicationsRoutingModule { } diff --git a/portal-4cli/src/app/searchPages/simple/searchPublications.component.ts b/portal-4cli/src/app/searchPages/simple/searchPublications.component.ts new file mode 100644 index 00000000..2d667f14 --- /dev/null +++ b/portal-4cli/src/app/searchPages/simple/searchPublications.component.ts @@ -0,0 +1,308 @@ +import {Component, Input, ViewChild} from '@angular/core'; +import { ActivatedRoute} from '@angular/router'; +import {Location} from '@angular/common'; + +import { Filter, Value} from '../searchUtils/searchHelperClasses.class'; + +import {SearchPublicationsService} from '../../services/searchPublications.service'; +import {SearchResult} from '../../utils/entities/searchResult'; +import {OpenaireProperties, ErrorCodes} from '../../utils/properties/openaireProperties'; +import {SearchFields} from '../../utils/properties/searchFields'; +import {SearchPageComponent } from '../searchUtils/searchPage.component'; +import {SearchUtilsClass} from '../searchUtils/searchUtils.class'; +import {DOI} from '../../utils/string-utils.class'; + +@Component({ + selector: 'search-publications', + template: ` + + + + + ` + +}) +export class SearchPublicationsComponent { + private errorCodes: ErrorCodes; + + public results =[]; + public filters =[]; + public searchUtils:SearchUtilsClass = new SearchUtilsClass(); + public baseUrl:string = ""; + public sub: any; + public subResults: any; + public searchFields:SearchFields = new SearchFields(); + public refineFields: string[] = this.searchFields.RESULT_REFINE_FIELDS; + public fieldIdsMap=this.searchFields.RESULT_FIELDS; + //: { [key:string] :{ name:string, operator:string, type:string, indexField:string, equalityOperator:string }} = this.searchFields.PUBLICATION_FIELDS_MAP; + public urlParams : Map; + @ViewChild (SearchPageComponent) searchPage : SearchPageComponent ; + public _location:Location; + + public CSV: any = { "columnNames": ["Title", "Authors", "Publication Year", "DOI", + /*"Download From", "Publication type", "Journal",*/ + "Funder", "Project Name (GA Number)", "Access"], + "export":[] + }; + public CSVDownloaded = false; + public csvParams: string; + public disableForms: boolean = false; + public loadPaging: boolean = true; + public oldTotalResults: number = 0; + + constructor (private route: ActivatedRoute, private _searchPublicationsService: SearchPublicationsService ) { + this.errorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + this.searchUtils.page =1; + this.baseUrl = OpenaireProperties.getLinkToSearchPublications(); + + } + + public ngOnInit() { + this.searchPage.refineFields = this.refineFields; + this.searchPage.fieldIdsMap = this.fieldIdsMap; + this.searchPage.type = "publications"; + var firstLoad =true; + this.sub = this.route.queryParams.subscribe(params => { + if(params['page'] && this.searchUtils.page != params['page']) { + this.loadPaging = false; + this.oldTotalResults = this.searchUtils.totalResults; + } + + this.searchUtils.keyword = (params['keyword']?params['keyword']:''); + var refine = true; + if(this.searchUtils.page != ((params['page']=== undefined)?1:+params['page']) && this.filters && !firstLoad){ + refine = false; + + } + firstLoad = false; + this.searchUtils.page = (params['page']=== undefined)?1:+params['page']; + var queryParameters = this.searchPage.getQueryParametersFromUrl(params); + this._getResults(queryParameters, refine, this.searchUtils.page, this.searchUtils.size); + }); + } + + public ngOnDestroy() { + if(this.sub){ + this.sub.unsubscribe(); + } + if(this.subResults){ + this.subResults.unsubscribe(); + } + } + +public getResultsForEntity(entity:string, id:string, page: number, size: number){ + var parameters = ""; + + if(entity == "project") { + parameters = "projects/"+id; + } + + if(parameters != "") { + + this._searchPublicationsService.searchPublicationsForEntity(parameters, page, size).subscribe( + data => { + this.searchUtils.totalResults = data[0]; + console.info("search Publications for "+entity+": [Parameters:"+parameters+" ] [total results:"+this.searchUtils.totalResults+"]"); + this.results = data[1]; + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + } + ); + } +} + +public getResultsForDataproviders(id:string, resultsFrom:string, page: number, size: number){ + var parameters; + if(resultsFrom == "collectedFrom") { + parameters = "publications?fq=collectedfromdatasourceid exact "+'"'+id+'"'; + } else if(resultsFrom == "hostedBy") { + parameters = "publications?fq=resulthostingdatasourceid exact "+'"'+id+'"'; + } + + if(parameters != "") { + + this._searchPublicationsService.searchPublicationsForDataproviders(parameters, page, size).subscribe( + data => { + this.searchUtils.totalResults = data[0]; + console.info("search Publications for Dataproviders: [Parameters:"+parameters+" ] [total results:"+this.searchUtils.totalResults+"]"); + this.results = data[1]; + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + } + ); + } +} + +public getResults(keyword:string,refine:boolean, page: number, size: number){ + var parameters = ""; + if(keyword.length > 0){ + var DOIs:string[] = DOI.getDOIsFromString(keyword); + var doisParams = ""; + + for(var i =0 ;i < DOIs.length; i++){ + doisParams+=(doisParams.length > 0?"&":"")+'doi="'+ DOIs[i]+'"'; + } + if(doisParams.length > 0){ + parameters += "&"+doisParams; + }else{ + parameters = "q=" + keyword; + } + } + this._getResults(parameters,refine,page,size); +} + +private _getResults(parameters:string,refine:boolean, page: number, size: number){ + this.csvParams = parameters; + + // if(!refine && !this.searchPage){ + // this.searchPage = new SearchPageComponent(this._location); + // } + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + //this.searchPage.openLoading(); + this.disableForms = true; + this.results = []; + this.searchUtils.totalResults = 0; + + this.subResults = this._searchPublicationsService.searchPublications(parameters,(refine)?this.searchPage.getRefineFieldsQuery():null, page, size, this.searchPage.getFields()).subscribe( + data => { + this.searchUtils.totalResults = data[0]; + console.info("search Publications: [Parameters:"+parameters+" ] [total results:"+this.searchUtils.totalResults+"]"); + this.results = data[1]; + if(refine){ + this.filters = data[2]; + } + this.searchPage.checkSelectedFilters(this.filters); + this.searchPage.updateBaseUrlWithParameters(this.filters); + + //var errorCodes:ErrorCodes = new ErrorCodes(); + + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + //this.searchPage.closeLoading(); + this.disableForms = false; + + if(this.searchUtils.status == this.errorCodes.DONE) { + // Page out of limit!!! + let totalPages:any = this.searchUtils.totalResults/(this.searchUtils.size); + if(!(Number.isInteger(totalPages))) { + totalPages = (parseInt(totalPages, 10) + 1); + } + if(totalPages < page) { + this.searchUtils.totalResults = 0; + this.searchUtils.status = this.errorCodes.OUT_OF_BOUND; + } + } + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + + //this.searchPage.closeLoading(); + this.disableForms = false; + + } + ); +} +/* +public getAggregatorResults(id:string, page: number, size: number){ + this.subResults = this._searchPublicationsService.searchAggregators('&fq=collectedfromdatasourceid exact "'+id+'"',"&refine=true&fields=resulthostingdatasource" , page, size).subscribe( + data => { + this.results = data; + + var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = errorCodes.NONE; + } + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = errorCodes.ERROR; + } + ); +}*/ + + public queryChanged($event) { + this.loadPaging = true; + + var parameters = $event.value; + console.info("queryChanged: Execute search query "+parameters); + console.info("Search Pubs::page "+this.searchUtils.page); + this._getResults(parameters, true, this.searchUtils.page, this.searchUtils.size); + } + + +} diff --git a/portal-4cli/src/app/searchPages/simple/searchPublications.module.ts b/portal-4cli/src/app/searchPages/simple/searchPublications.module.ts new file mode 100644 index 00000000..784e29ac --- /dev/null +++ b/portal-4cli/src/app/searchPages/simple/searchPublications.module.ts @@ -0,0 +1,33 @@ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import{ SearchPublicationsRoutingModule} from './searchPublications-routing.module'; +import{SearchPublicationsComponent} from './searchPublications.component'; + +import {SearchResultsModule } from '../searchUtils/searchResults.module'; + +import {PublicationsServiceModule} from '../../services/publicationsService.module'; +import {SearchFormModule} from '../searchUtils/searchForm.module'; +//import {SearchFilterModalModule} from '../searchUtils/searchFilterModal.module'; +import {SearchPageModule} from '../searchUtils/searchPage.module'; +import {FreeGuard} from'../../login/freeGuard.guard'; +import {IsRouteEnabled} from '../../error/isRouteEnabled.guard'; + +@NgModule({ + imports: [ + CommonModule, FormsModule, + + PublicationsServiceModule, + SearchFormModule, SearchResultsModule, SearchPublicationsRoutingModule, SearchPageModule + + ], + declarations: [ + SearchPublicationsComponent + ], + providers:[FreeGuard, IsRouteEnabled], + exports: [ + SearchPublicationsComponent + ] +}) +export class SearchPublicationsModule { } diff --git a/portal-4cli/src/app/searchPages/simple/searchSoftware-routing.module.ts b/portal-4cli/src/app/searchPages/simple/searchSoftware-routing.module.ts new file mode 100644 index 00000000..0ec1e843 --- /dev/null +++ b/portal-4cli/src/app/searchPages/simple/searchSoftware-routing.module.ts @@ -0,0 +1,15 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import {SearchSoftwareComponent} from './searchSoftware.component'; +import {FreeGuard} from'../../login/freeGuard.guard'; +import {PreviousRouteRecorder} from '../../utils/piwik/previousRouteRecorder.guard'; +@NgModule({ + imports: [ + RouterModule.forChild([ + { path: '', component: SearchSoftwareComponent, canActivate: [FreeGuard], canDeactivate: [PreviousRouteRecorder] } + + ]) + ] +}) +export class SearchSoftwareRoutingModule { } diff --git a/portal-4cli/src/app/searchPages/simple/searchSoftware.component.ts b/portal-4cli/src/app/searchPages/simple/searchSoftware.component.ts new file mode 100644 index 00000000..5e6e89c5 --- /dev/null +++ b/portal-4cli/src/app/searchPages/simple/searchSoftware.component.ts @@ -0,0 +1,275 @@ +import {Component, Input, ViewChild} from '@angular/core'; +import { ActivatedRoute} from '@angular/router'; +import {Location} from '@angular/common'; +import { Filter, Value} from '../searchUtils/searchHelperClasses.class'; + +import {SearchSoftwareService} from '../../services/searchSoftware.service'; +import {SearchResult} from '../../utils/entities/searchResult'; +import {OpenaireProperties, ErrorCodes} from '../../utils/properties/openaireProperties'; +import {SearchFields} from '../../utils/properties/searchFields'; +import {SearchPageComponent } from '../searchUtils/searchPage.component'; +import {SearchUtilsClass } from '../searchUtils/searchUtils.class'; +import {DOI} from '../../utils/string-utils.class'; + +@Component({ + selector: 'search-software', + template: ` + + + + ` +}) + +export class SearchSoftwareComponent { + private errorCodes: ErrorCodes; + + public results =[]; + public filters: Filter[] =[]; + // public totalResults:number = 0 ; + public baseUrl:string; + + public searchUtils:SearchUtilsClass = new SearchUtilsClass(); + private sub: any; + private subResults: any; + private searchFields:SearchFields = new SearchFields(); + public refineFields: string[] = this.searchFields.RESULT_REFINE_FIELDS; + public fieldIdsMap=this.searchFields.RESULT_FIELDS; + private urlParams : Map; + private _location:Location; + public csvParams: string; + public disableForms: boolean = false; + public loadPaging: boolean = true; + public oldTotalResults: number = 0; + + @ViewChild (SearchPageComponent) searchPage : SearchPageComponent ; + constructor (private route: ActivatedRoute, private _searchSoftwareService: SearchSoftwareService ) { + + this.errorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + this.searchUtils.page =1; + this.baseUrl = OpenaireProperties.getLinkToSearchSoftware(); + + } + + public ngOnInit() { + this.searchPage.refineFields = this.refineFields; + this.searchPage.fieldIdsMap = this.fieldIdsMap; + this.searchPage.type = "software"; + var firstLoad =true; + this.sub = this.route.queryParams.subscribe(params => { + if(params['page'] && this.searchUtils.page != params['page']) { + this.loadPaging = false; + this.oldTotalResults = this.searchUtils.totalResults; + } + + this.searchUtils.keyword = (params['keyword']?params['keyword']:''); + var refine = true; + if(this.searchUtils.page != ((params['page']=== undefined)?1:+params['page']) && this.filters && !firstLoad){ + refine = false; + } + firstLoad = false; + this.searchUtils.page = (params['page']=== undefined)?1:+params['page']; + + var queryParameters = this.searchPage.getQueryParametersFromUrl(params); + this._getResults(queryParameters, refine, this.searchUtils.page, this.searchUtils.size); + + }); + } + + public ngOnDestroy() { + if(this.sub){ + this.sub.unsubscribe(); + } + if(this.subResults){ + this.subResults.unsubscribe(); + } + } + + +public getResultsForEntity(entity:string, id:string, page: number, size: number){ + var parameters = ""; + + if(entity == "project") { + parameters = "projects/"+id; + } + + if(parameters != "") { + + this._searchSoftwareService.searchSoftwareForEntity(parameters, page, size).subscribe( + data => { + this.searchUtils.totalResults = data[0]; + console.info("search Software for "+entity+": [Parameters:"+parameters+" ] [total results:"+this.searchUtils.totalResults+"]"); + this.results = data[1]; + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + } + ); + } +} + +public getResultsForDataproviders(id:string, resultsFrom:string, page: number, size: number){ + var parameters; + if(resultsFrom == "collectedFrom") { + parameters = "software?fq=collectedfromdatasourceid exact "+'"'+id+'"'; + } else if(resultsFrom == "hostedBy") { + parameters = "software?fq=resulthostingdatasourceid exact "+'"'+id+'"'; + } + + if(parameters != "") { + + this._searchSoftwareService.searchSoftwareForDataproviders(parameters, page, size).subscribe( + data => { + this.searchUtils.totalResults = data[0]; + console.info("search Software for Dataproviders: [Parameters:"+parameters+" ] [total results:"+this.searchUtils.totalResults+"]"); + this.results = data[1]; + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + } + ); + } +} + +public getResults(keyword:string,refine:boolean, page: number, size: number){ + var parameters = ""; + if(keyword.length > 0){ + var DOIs:string[] = DOI.getDOIsFromString(keyword); + var doisParams = ""; + for(var i =0 ;i < DOIs.length; i++){ + doisParams+=(doisParams.length > 0?"&":"")+'doi="'+ DOIs[i]+'"'; + } + if(doisParams.length > 0){ + parameters += "&"+doisParams; + }else{ + parameters = "q=" + keyword; + } + } + this._getResults(parameters,refine,page,size); +} +private _getResults(parameters:string,refine:boolean, page: number, size: number){ + this.csvParams = parameters; + + // if(!refine && !this.searchPage){ + // this.searchPage = new SearchPageComponent(this._location); + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + //this.searchPage.openLoading(); + this.disableForms = true; + this.results = []; + this.searchUtils.totalResults = 0; + + this.subResults = this._searchSoftwareService.searchSoftware(parameters,(refine)?this.searchPage.getRefineFieldsQuery():null, page, size, this.searchPage.getFields()).subscribe( + data => { + this.searchUtils.totalResults = data[0]; + console.info("search Software: [Parameters:"+parameters+" ] [total results:"+this.searchUtils.totalResults+"]"); + this.results = data[1]; + if(refine){ + this.filters = data[2]; + } + this.searchPage.checkSelectedFilters(this.filters); + this.searchPage.updateBaseUrlWithParameters(this.filters); + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + //this.searchPage.closeLoading(); + this.disableForms = false; + + if(this.searchUtils.status == this.errorCodes.DONE) { + // Page out of limit!!! + let totalPages:any = this.searchUtils.totalResults/(this.searchUtils.size); + if(!(Number.isInteger(totalPages))) { + totalPages = (parseInt(totalPages, 10) + 1); + } + if(totalPages < page) { + this.searchUtils.totalResults = 0; + this.searchUtils.status = this.errorCodes.OUT_OF_BOUND; + } + } + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + + //this.searchPage.closeLoading(); + this.disableForms = false; + } + ); +} + + + + private setFilters(){ + //TODO set filters from + } + + public queryChanged($event) { + this.loadPaging = true; + + var parameters = $event.value; + //this.getResults(parameters, this.searchUtils.page, this.searchUtils.size, "searchPage"); + this._getResults(parameters, true, this.searchUtils.page, this.searchUtils.size); + } +} diff --git a/portal-4cli/src/app/searchPages/simple/searchSoftware.module.ts b/portal-4cli/src/app/searchPages/simple/searchSoftware.module.ts new file mode 100644 index 00000000..227cb49d --- /dev/null +++ b/portal-4cli/src/app/searchPages/simple/searchSoftware.module.ts @@ -0,0 +1,33 @@ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import{ SearchSoftwareRoutingModule} from './searchSoftware-routing.module'; +import{SearchSoftwareComponent} from './searchSoftware.component'; + +import {SearchResultsModule } from '../searchUtils/searchResults.module'; + +import {SoftwareServiceModule} from '../../services/softwareService.module'; +import {SearchFormModule} from '../searchUtils/searchForm.module'; +//import {SearchFilterModalModule} from '../searchUtils/searchFilterModal.module'; +import {SearchPageModule} from '../searchUtils/searchPage.module'; +import {FreeGuard} from'../../login/freeGuard.guard'; + +@NgModule({ + imports: [ + CommonModule, FormsModule, + + SoftwareServiceModule, + SearchFormModule, SearchResultsModule, SearchSoftwareRoutingModule, SearchPageModule + + ], + declarations: [ + SearchSoftwareComponent + ], + providers:[FreeGuard + ], + exports: [ + SearchSoftwareComponent + ] +}) +export class SearchSoftwareModule { } diff --git a/portal-4cli/src/app/services/dataProvidersService.module.ts b/portal-4cli/src/app/services/dataProvidersService.module.ts new file mode 100644 index 00000000..88e7b6df --- /dev/null +++ b/portal-4cli/src/app/services/dataProvidersService.module.ts @@ -0,0 +1,20 @@ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import {SearchDataprovidersService} from './searchDataproviders.service'; + + +@NgModule({ + imports: [ + CommonModule, FormsModule + ], + declarations: [ + ], + providers:[ + SearchDataprovidersService +], + exports: [ + ] +}) +export class DataProvidersServiceModule { } diff --git a/portal-4cli/src/app/services/datasetsService.module.ts b/portal-4cli/src/app/services/datasetsService.module.ts new file mode 100644 index 00000000..e5298338 --- /dev/null +++ b/portal-4cli/src/app/services/datasetsService.module.ts @@ -0,0 +1,20 @@ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import {SearchDatasetsService} from './searchDatasets.service'; + + +@NgModule({ + imports: [ + CommonModule, FormsModule + ], + declarations: [ + ], + providers:[ + SearchDatasetsService +], + exports: [ + ] +}) +export class DatasetsServiceModule { } diff --git a/portal-4cli/src/app/services/metrics.service.ts b/portal-4cli/src/app/services/metrics.service.ts new file mode 100644 index 00000000..b3b79b98 --- /dev/null +++ b/portal-4cli/src/app/services/metrics.service.ts @@ -0,0 +1,82 @@ +import {Injectable} from '@angular/core'; +import {Http, Response} from '@angular/http'; +import {Observable} from 'rxjs/Observable'; +import {Metrics} from '../utils/entities/metrics'; +import {OpenaireProperties} from '../utils/properties/openaireProperties'; +import 'rxjs/add/operator/do'; +import { } from '../shared/cache.service'; +@Injectable() +export class MetricsService { + metrics: Metrics; + + constructor(private http: Http ) {} + + getMetrics (id: string, entityType: string):any { + console.info("getMetrics in service"); + //let url = OpenaireProperties. getSearchAPIURLLast() + 'publications/' +id+"?format=json"; + let url = OpenaireProperties.getMetricsAPIURL()+entityType+"/"+id+"/clicks"; + let key = url; + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()) + .map(res => this.parseMetrics(res["downloads"], res["views"], res["total_downloads"], res["total_views"], + res["total_openaire_views"], res["total_openaire_downloads"], res["pageviews"])); + } + + + parseMetrics(downloads: any, views: any, totalDownloads: string, totalViews: string, + totalOpenaireViews: string, totalOpenaireDownloads: string, pageViews: string): any { + this.metrics = new Metrics(); + + this.metrics.totalDownloads = totalDownloads; + this.metrics.totalViews = totalViews; + this.metrics.totalOpenaireViews = totalOpenaireViews; + this.metrics.totalOpenaireDownloads = totalOpenaireDownloads; + this.metrics.pageViews = pageViews; + + this.metrics.infos = new Map(); + + for(let i=0; i res.json()) + .map(res => res['results'][0]) + //.map(res => res[0]['result']['metadata']['oaf:entity']['oaf:organization']) + //.map(res => [res, res['rels']['rel']]) + .map(res => this.parseOrganizationInfo(res)); + + + } +/* + getMetrics (id: string):any { + console.info("getOrganizationMetrics in service"); + //let url = OpenaireProperties. getSearchAPIURLLast() + 'publications/' +id+"?format=json"; + let url = OpenaireProperties.getMetricsAPIURL()+"organizations/"+id+"/clicks"; + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()) + .map(res => res['views']); + } +*/ + private handleError (error: Response) { + // in a real world app, we may send the error to some remote logging infrastructure + // instead of just logging it to the console + console.log(error); + return Observable.throw(error || 'Server error'); + } + + parseOrganizationInfo (data: any):any { + console.info("parseOrganizationInfo"); + this.organizationInfo = new OrganizationInfo(); + + let organization; + let relations; + + if(data != null) { + organization = data['result']['metadata']['oaf:entity']['oaf:organization']; + relations = data['result']['metadata']['oaf:entity']['oaf:organization']['rels']['rel']; + } else { + return null; + } + + if(organization != null) { + + if(organization.hasOwnProperty("websiteurl")) { + this.organizationInfo.title = {"name": organization.legalshortname, "url": organization.websiteurl}; + } else { + this.organizationInfo.title = {"name": organization.legalshortname, "url": ''}; + } + + this.organizationInfo.name = organization.legalname; + + if(this.organizationInfo.title.name == '') { + this.organizationInfo.title.name = this.organizationInfo.name; + } + + if(organization.hasOwnProperty("country")) { + this.organizationInfo.country = organization['country'].classname; + } + } + +//Comment Parsing Projects info +/* + if(data[1] != null) { + + let counter; + let length = relations.length!=undefined ? relations.length : 1; + + for(let i=0; i(); + } + + if(!this.organizationInfo.projects.has(relation['funding']['funder'].name)) { + this.organizationInfo.projects.set(relation['funding']['funder'].name, + new Array<{ "name": string, "id": string, "code": string, + "acronym": string, "funder": string, "funderId": string, + "fundingStream": string, "fundingLevel1": string, "fundingLevel2": string, + "sc39": string, "startDate": string, "endDate": string }>()); + } + + counter = this.organizationInfo.projects.get(relation['funding']['funder'].name).length; + this.organizationInfo.projects.get(relation['funding']['funder'].name)[counter] = + { "name": "", "id": "", "code": "", + "acronym": "", "funder": "", "funderId": "", + "fundingStream": "", "fundingLevel1": "", "fundingLevel2": "", + "sc39": "", "startDate": "", "endDate": "" }; + + //let url = ""; + if(relation['to'].content != null && relation['to'].content != "") { + this.organizationInfo.projects.get(relation['funding']['funder'].name)[counter]['id'] = relation['to'].content; + //url = OpenaireProperties.getsearchLinkToProject()+relation['to'].content; + } + this.organizationInfo.projects.get(relation['funding']['funder'].name)[counter]['name'] = relation.title; + //this.organizationInfo.projects.get(relation['funding']['funder'].name)[counter]['url'] = url; + this.organizationInfo.projects.get(relation['funding']['funder'].name)[counter]['code'] = relation.code; + this.organizationInfo.projects.get(relation['funding']['funder'].name)[counter]['acronym'] = relation.acronym; + + this.organizationInfo.projects.get(relation['funding']['funder'].name)[counter]['funder'] = relation['funding']['funder'].shortname; + this.organizationInfo.projects.get(relation['funding']['funder'].name)[counter]['funderId'] = relation['funding']['funder'].id; + if(relation['funding'].hasOwnProperty("funding_level_0")) { + this.organizationInfo.projects.get(relation['funding']['funder'].name)[counter]['fundingStream'] = relation['funding']['funding_level_0'].name; + } + if(relation['funding'].hasOwnProperty("funding_level_1")) { + this.organizationInfo.projects.get(relation['funding']['funder'].name)[counter]['fundingLevel1'] = relation['funding']['funding_level_1'].name; + } + if(relation['funding'].hasOwnProperty("funding_level_2")) { + this.organizationInfo.projects.get(relation['funding']['funder'].name)[counter]['fundingLevel2'] = relation['funding']['funding_level_2'].name; + } + //this.organizationInfo.projects.get(relation['funding']['funder'].name)[counter]['sc39'] = + //this.organizationInfo.projects.get(relation['funding']['funder'].name)[counter]['startDate'] = + //this.organizationInfo.projects.get(relation['funding']['funder'].name)[counter]['endDate'] = + } + } + + } + + + } /*else if(relation['to'].class == "isProvidedBy") { + + if(this.organizationInfo.dataProviders == undefined) { + this.organizationInfo.dataProviders = new Array<{ "name": string, "url": string, "type": string, "websiteUrl": string , "organizations": {"name": string, "url": string}[]}>(); + } + + counter = this.organizationInfo.dataProviders.length; + this.organizationInfo.dataProviders[counter] = { "name": "", "url": "", "type": "", "websiteUrl": "", "organizations": [] } + + let url=""; + if(relation['to'].content != null && relation['to'].content != "") { + url = OpenaireProperties.getsearchLinkToDataProvider()+relation['to'].content; + } + this.organizationInfo.dataProviders[counter]['name'] = relation.officialname; + this.organizationInfo.dataProviders[counter]['url'] = url; + if(relation.hasOwnProperty("datasourcetype")) { + this.organizationInfo.dataProviders[counter]['type'] = relation['datasourcetype'].classname; + } + this.organizationInfo.dataProviders[counter]['websiteUrl'] = relation.websiteurl; + }*/ +/* -----> + } + } + } +*/ + return this.organizationInfo; + + } + +} diff --git a/portal-4cli/src/app/services/organizationService.module.ts b/portal-4cli/src/app/services/organizationService.module.ts new file mode 100644 index 00000000..ee150c3e --- /dev/null +++ b/portal-4cli/src/app/services/organizationService.module.ts @@ -0,0 +1,20 @@ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import {OrganizationService} from './organization.service'; + + +@NgModule({ + imports: [ + CommonModule, FormsModule + ], + declarations: [ + ], + providers:[ + OrganizationService +], + exports: [ + ] +}) +export class OrganizationServiceModule { } diff --git a/portal-4cli/src/app/services/organizationsService.module.ts b/portal-4cli/src/app/services/organizationsService.module.ts new file mode 100644 index 00000000..0810f680 --- /dev/null +++ b/portal-4cli/src/app/services/organizationsService.module.ts @@ -0,0 +1,20 @@ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import {SearchOrganizationsService} from './searchOrganizations.service'; + + +@NgModule({ + imports: [ + CommonModule, FormsModule + ], + declarations: [ + ], + providers:[ + SearchOrganizationsService +], + exports: [ + ] +}) +export class OrganizationsServiceModule { } diff --git a/portal-4cli/src/app/services/projectsService.module.ts b/portal-4cli/src/app/services/projectsService.module.ts new file mode 100644 index 00000000..117f5ca7 --- /dev/null +++ b/portal-4cli/src/app/services/projectsService.module.ts @@ -0,0 +1,20 @@ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import {SearchProjectsService} from './searchProjects.service'; + + +@NgModule({ + imports: [ + CommonModule, FormsModule + ], + declarations: [ + ], + providers:[ + SearchProjectsService +], + exports: [ + ] +}) +export class ProjectsServiceModule { } diff --git a/portal-4cli/src/app/services/publicationsService.module.ts b/portal-4cli/src/app/services/publicationsService.module.ts new file mode 100644 index 00000000..ab371386 --- /dev/null +++ b/portal-4cli/src/app/services/publicationsService.module.ts @@ -0,0 +1,20 @@ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import {SearchPublicationsService} from './searchPublications.service'; + + +@NgModule({ + imports: [ + CommonModule, FormsModule + ], + declarations: [ + ], + providers:[ + SearchPublicationsService +], + exports: [ + ] +}) +export class PublicationsServiceModule { } diff --git a/portal-4cli/src/app/services/refineFieldResults.service.ts b/portal-4cli/src/app/services/refineFieldResults.service.ts new file mode 100644 index 00000000..71d3fe50 --- /dev/null +++ b/portal-4cli/src/app/services/refineFieldResults.service.ts @@ -0,0 +1,66 @@ +import {Injectable} from '@angular/core'; +import {Http, Response} from '@angular/http'; +import {Observable} from 'rxjs/Observable'; +import {AutoCompleteValue} from '../searchPages/searchUtils/searchHelperClasses.class'; +import {OpenaireProperties} from '../utils/properties/openaireProperties'; +import 'rxjs/add/observable/of'; +import 'rxjs/add/operator/do'; +import 'rxjs/add/operator/share'; +import { } from '../shared/cache.service'; +import {RefineResultsUtils} from './servicesUtils/refineResults.class'; + +@Injectable() +export class RefineFieldResultsService { + // scoobydoo.di.uoa.gr:8181/dnet-functionality-services-2.0.0-SNAPSHOT/rest/v2/api/projects?refine=true&fields=funderid&page=1&size=0 + constructor(private http: Http ) {} + getRefineFieldsResultsByEntityName(fields:string[], entityName:string):any{ + let url = OpenaireProperties.getSearchAPIURLForEntity(entityName)+"?format=json&refine=true&page=1&size=0"; + for(var i=0; i < fields.length; i++){ + url += "&fields="+fields[i]; + } + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()) + + .map(res => [res['meta'].total, RefineResultsUtils.parse(res['refineResults'],fields, entityName)]); + + } + getRefineFieldResultsByFieldName(fieldName:string, entityName:string):any{ + let link = OpenaireProperties.getSearchAPIURLForEntity(entityName)+"?fields="+fieldName + "&format=json"; + return this.getField(link,fieldName) + + } + + getField (link:string,fieldName:string):any{ + let url = link+"&refine=true&page=1&size=0"; + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()) + .map(res => res['refineResults']) + .map(res => this.parse(res,fieldName)); + + } + parse(data: any,fieldName:string):any { + var values:AutoCompleteValue[] = []; + if(data){ + let field = data[fieldName]; + for(let i=0; i new Blob([res['_body']], { type: 'text/csv' })); + } + getCSVResponse(url: string){ + var headers = new Headers(); + headers.append('responseType', 'arraybuffer'); + return this.http.get(url) + .map(res => res['_body']); + } + downloadHTMLFile(url: string, info: string){ + var headers = new Headers(); + headers.append('responseType', 'arraybuffer'); + return this.http.get(url) + .map(res => this.addInfo(res, info)) + .map(res => new Blob([res['_body']], { type: 'text/html' })) + .do(res => console.log(res)) + } + + addInfo(res:any, info:string) { + /* + var para = res.document.createElement("P"); // Create a

    element + var t = res.document.createTextNode("This is a paragraph"); // Create a text node + para.appendChild(t); // Append the text to

    + res.document.body.appendChild(para); + */ + res['_body'] = info+res['_body']; + return res; + } + + private handleError (error: Response) { + // in a real world app, we may send the error to some remote logging infrastructure + // instead of just logging it to the console + console.log(error); + return Observable.throw(error || 'Server error'); + } + + +} diff --git a/portal-4cli/src/app/services/reportsService.module.ts b/portal-4cli/src/app/services/reportsService.module.ts new file mode 100644 index 00000000..0d637dad --- /dev/null +++ b/portal-4cli/src/app/services/reportsService.module.ts @@ -0,0 +1,20 @@ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import {ReportsService} from './reports.service'; + + +@NgModule({ + imports: [ + CommonModule, FormsModule + ], + declarations: [ + ], + providers:[ + ReportsService +], + exports: [ + ] +}) +export class ReportsServiceModule { } diff --git a/portal-4cli/src/app/services/searchDataproviders.service.ts b/portal-4cli/src/app/services/searchDataproviders.service.ts new file mode 100644 index 00000000..3f05580a --- /dev/null +++ b/portal-4cli/src/app/services/searchDataproviders.service.ts @@ -0,0 +1,433 @@ +import {Injectable} from '@angular/core'; +import {Http, Response} from '@angular/http'; +import {Observable} from 'rxjs/Observable'; +import {OpenaireProperties} from '../utils/properties/openaireProperties'; +import {SearchResult} from '../utils/entities/searchResult'; +import {RefineResultsUtils} from './servicesUtils/refineResults.class'; +import 'rxjs/add/observable/of'; +import 'rxjs/add/operator/do'; +import 'rxjs/add/operator/share'; +import { } from '../shared/cache.service'; +import {StringUtils} from '../utils/string-utils.class'; +@Injectable() +export class SearchDataprovidersService { + constructor(private http: Http ) {} + + searchDataproviders (params: string, refineParams:string, page: number, size: number, refineFields:string[] ):any { + + let link = OpenaireProperties. getSearchAPIURLLast()+"datasources"; + + let url = link+"?"; + if(params!= null && params != '' ) { + url += params; + } + if(refineParams!= null && refineParams != '' ) { + url += refineParams; + } + url += "&page="+(page-1)+"&size="+size+"&format=json"; + + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()) + //.do(res => console.info(res)) + .map(res => [res['meta'].total, this.parseResults(res['results']),RefineResultsUtils.parse(res['refineResults'],refineFields, "datasource")]); + } + //((oaftype exact datasource) and(collectedfromdatasourceid exact "openaire____::47ce9e9f4fad46e732cff06419ecaabb")) + advancedSearchDataproviders (params: string, page: number, size: number ):any { + let url = OpenaireProperties.getSearchResourcesAPIURL(); + var basicQuery = "(oaftype exact datasource) " + url += "?query="; + if(params!= null && params != '' ) { + url +=" ( "+basicQuery+ " ) " +" and (" + params + ")"; + }else{ + url +=" ( "+basicQuery+ " ) "; + } + + url += "&page="+(page-1)+"&size="+size+"&format=json"; + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()) + //.do(res => console.info(res)) + .map(res => [res['meta'].total, this.parseResults(res['results'])]) + } + + searchCompatibleDataprovidersTable ():any { + let size: number = 0; + let url: string= OpenaireProperties.getSearchResourcesAPIURL(); + url += '?query=((oaftype exact datasource) not(datasourcecompatibilityid = UNKNOWN) not(datasourcecompatibilityid = notCompatible) not(datasourcetypeuiid = other) not(datasourcetypeuiid exact "pubsrepository::journal") not(datasourcetypeuiid exact "aggregator::pubsrepository::journals"))'; + url += "&page=0&size=0&format=json"; + + + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url).map(res => res.json()) + + .map(res => res['meta'].total); + } + + searchCompatibleDataproviders (params: string,refineParams:string, page: number, size: number, refineFields:string[] ):any { + console.info("in search Compatible Dataproviders service function"); + let url: string = OpenaireProperties.getSearchResourcesAPIURL(); + url += '?query=((oaftype exact datasource) not(datasourcecompatibilityid = UNKNOWN) not(datasourcecompatibilityid = notCompatible) not(datasourcetypeuiid = other) not(datasourcetypeuiid exact "pubsrepository::journal") not(datasourcetypeuiid exact "aggregator::pubsrepository::journals"))'; + if(params!= null && params != '' ) { + url += params; + } + if(refineParams!= null && refineParams != '' ) { + url += refineParams; + } + url += "&page="+(page-1)+"&size="+size+"&format=json"; + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()) + //.do(res => console.info(res)) + .map(res => [res['meta'].total, this.parseResults(res['results']),RefineResultsUtils.parse(res['refineResults'],refineFields, "datasource")]); + } + + searchEntityRegistriesTable ():any { + let size: number = 0; + let url: string= OpenaireProperties.getSearchResourcesAPIURL(); + url += "?query=((oaftype exact datasource) and(datasourcetypeuiid = other))"; + url += "&page=0&size=0&format=json"; + + + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url).map(res => res.json()) + .map(res => res['meta'].total); + } + + searchEntityRegistries (params: string,refineParams:string, page: number, size: number, refineFields:string[] ):any { + let url = OpenaireProperties.getSearchResourcesAPIURL(); + url += "?query=((oaftype exact datasource) and(datasourcetypeuiid = other))"; + if(params!= null && params != '' ) { + url += params; + } + if(refineParams!= null && refineParams != '' ) { + url += refineParams; + } + url += "&page="+(page-1)+"&size="+size+"&format=json"; + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()) + //.do(res => console.info(res)) + .map(res => [res['meta'].total, this.parseResults(res['results']),RefineResultsUtils.parse(res['refineResults'],refineFields, "datasource")]); + } + + searchJournalsTable ():any { + let size: number = 0; + let url: string= OpenaireProperties.getSearchResourcesAPIURL(); + url += '?query=((oaftype exact datasource) not(datasourcecompatibilityid = UNKNOWN) not(datasourcecompatibilityid = notCompatible) and (datasourcetypeuiid exact "pubsrepository::journal" or datasourcetypeuiid exact "aggregator::pubsrepository::journals" ))'; + url += "&page=0&size=0&format=json"; + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url).map(res => res.json()) + .map(res => res['meta'].total); + } + + searchJournals (params: string,refineParams:string, page: number, size: number, refineFields:string[] ):any { + console.info("in search Journals service function"); + let url: string = OpenaireProperties.getSearchResourcesAPIURL(); + //url += "?query=((oaftype exact datasource) not(datasourcecompatibilityid = UNKNOWN) not(datasourcecompatibilityid = notCompatible) not(datasourcetypeuiid = other))" + url += '?query=((oaftype exact datasource) not(datasourcecompatibilityid = UNKNOWN) not(datasourcecompatibilityid = notCompatible) and (datasourcetypeuiid exact "pubsrepository::journal" or datasourcetypeuiid exact "aggregator::pubsrepository::journals" ))'; + + if(params!= null && params != '' ) { + url += params; + } + if(refineParams!= null && refineParams != '' ) { + url += refineParams; + } + url += "&page="+(page-1)+"&size="+size+"&format=json"; + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()) + //.do(res => console.info(res)) + .map(res => [res['meta'].total, this.parseResults(res['results']),RefineResultsUtils.parse(res['refineResults'],refineFields, "datasource")]); + } + + searchDataprovidersForDeposit (id: string,type:string, page: number, size: number):any { + let link = OpenaireProperties.getSearchResourcesAPIURL(); + var compatibilities = ""; + if(type == "Research Data"){ + compatibilities = " and (datasourcecompatibilityid <> UNKNOWN) and (datasourcecompatibilityid = openaire2.0_data)" + }else if(type == "Publications"){ + compatibilities = " and (datasourcecompatibilityid <> UNKNOWN) and (datasourcecompatibilityid <> openaire2.0_data)" + } + let url = link+"?query=(((deletedbyinference = false) AND (oaftype exact datasource)) "+((compatibilities && compatibilities.length > 0)?" "+compatibilities+" ":"")+") and (relorganizationid exact "+id+")"; + url += "&page="+(page-1)+"&size="+size+"&format=json"; + + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()) + .map(res => [res['meta'].total, this.parseResults(res['results'])]); + } + searchDataProvidersBySubjects(keyword:string, type:string, page: number, size: number):any { + let link = OpenaireProperties.getSearchResourcesAPIURL(); + var compatibilities = ""; + if(type == "Research Data"){ + compatibilities = " and (datasourcecompatibilityid <> UNKNOWN) and (datasourcecompatibilityid = openaire2.0_data)" + }else if(type == "Publications"){ + compatibilities = " and (datasourcecompatibilityid <> UNKNOWN) and (datasourcecompatibilityid <> openaire2.0_data)" + } + let url = link+"?query=(((deletedbyinference = false) AND (oaftype exact datasource)) "+((compatibilities && compatibilities.length > 0)?" "+ + compatibilities+" ":"")+") "+ + " and (datasourcesubject all "+'"'+keyword+'"'+") " ; + url += "&page="+(page-1)+"&size="+size+"&format=json"; + + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()) + .map(res => [res['meta'].total, this.parseResults(res['results'])]); + + } + + getDataProvidersforEntityRegistry(datasourceId: string, page: number, size: number ):any { + let url = OpenaireProperties.getSearchResourcesAPIURL(); + var basicQuery = "(oaftype exact datasource) " + url += "?query="; + if(datasourceId!= null && datasourceId != '' ) { + url +=" ( "+basicQuery+ " ) " +" and (collectedfromdatasourceid exact \"" + datasourceId + "\")"; + }else{ + url +=" ( "+basicQuery+ " ) "; + } + + url += "&page="+(page-1)+"&size="+size+"&format=json"; + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()) + .map(res => [res['meta'].total, this.parseResults(res['results'])]); + } + searchDataprovidersForEntity (params: string, page: number, size: number):any { + let link = OpenaireProperties. getSearchAPIURLLast(); + let url = link+params+"/datasources?format=json"; + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()) + .map(res => [res['meta'].total, this.parseResults(res['results'])]); + } +/* + searchDataprovidersCSV (params: string, refineParams:string, page: number, size: number):any { + + let link = OpenaireProperties. getSearchAPIURLLast()+"datasources"; + + let url = link+"?"; + if(params!= null && params != '' ) { + url += params; + } + if(refineParams!= null && refineParams != '' ) { + url += refineParams; + } + url += "&page="+(page-1)+"&size="+size+"&format=json"; + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()) + //.do(res => console.info(res)) + + .map(res => this.parseResultsCSV(res['results'])); + } +*/ +/* + searchEntityRegistriesCSV (params: string,refineParams:string, page: number, size: number):any { + let url = OpenaireProperties.getSearchResourcesAPIURL(); + url += "?query=((oaftype exact datasource) and(datasourcetypeuiid = other))" + if(params!= null && params != '' ) { + url += params; + } + if(refineParams!= null && refineParams != '' ) { + url += refineParams; + } + url += "&page="+(page - 1)+"&size="+size+"&format=json"; + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()) + //.do(res => console.info(res)) + + .map(res => this.parseResultsCSV(res['results'])); + } +*/ +/* + searchCompatibleDataprovidersCSV (params: string,refineParams:string, page: number, size: number):any { + let url = OpenaireProperties.getSearchResourcesAPIURL(); + url += "?query=((oaftype exact datasource) not(datasourcecompatibilityid = UNKNOWN) not(datasourcecompatibilityid = notCompatible) not(datasourcetypeuiid = other))" + if(params!= null && params != '' ) { + url += params; + } + if(refineParams!= null && refineParams != '' ) { + url += refineParams; + } + url += "&page="+(page - 1)+"&size="+size+"&format=json"; + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()) + //.do(res => console.info(res)) + + .map(res => this.parseResultsCSV(res['results'])); + } +*/ + + + parseResults(data: any): SearchResult[] { + let results: SearchResult[] = []; + + let length = Array.isArray(data) ? data.length : 1; + + for(let i=0; i = new Set(); + + let relLength = Array.isArray(resData['rels']['rel']) ? resData['rels']['rel'].length : 1; + + for(let i=0; i res.json()) + .map(res => res.total); + } + + numOfEntityDataproviders(id: string, entity: string):any { + var parameters = ""; + if(entity == "organization") { + parameters = "organizations/"+id+"/datasources/count"; + } + + let url = OpenaireProperties.getSearchAPIURLLast()+parameters+"?format=json"; + return this.numOfDataproviders(url); + } + + numOfSearchDataproviders(params: string):any { + let url: string = OpenaireProperties.getSearchAPIURLLast()+"datasources/count?format=json"; + if(params != "") { + url += "&q=" + params; + } + + return this.numOfDataproviders(url); + } +/* + private quote(word: any): string { + return '"'+word+'"'; + } +*/ +} diff --git a/portal-4cli/src/app/services/searchDatasets.service.ts b/portal-4cli/src/app/services/searchDatasets.service.ts new file mode 100644 index 00000000..beef7822 --- /dev/null +++ b/portal-4cli/src/app/services/searchDatasets.service.ts @@ -0,0 +1,314 @@ +import {Injectable} from '@angular/core'; +import {Http, Response} from '@angular/http'; +import {Observable} from 'rxjs/Observable'; +import {OpenaireProperties} from '../utils/properties/openaireProperties'; +import {SearchResult} from '../utils/entities/searchResult'; +import {RefineResultsUtils} from './servicesUtils/refineResults.class'; +import 'rxjs/add/observable/of'; +import 'rxjs/add/operator/do'; +import 'rxjs/add/operator/share'; +import { } from '../shared/cache.service'; +@Injectable() +export class SearchDatasetsService { + private sizeOfDescription: number = 270; + + constructor(private http: Http ) {} + + searchDatasets (params: string, refineParams:string, page: number, size: number, refineFields:string[] ):any { + + let link = OpenaireProperties.getSearchAPIURLLast()+"datasets"; + + let url = link+"?"; + if(params!= null && params != '' ) { + url += params; + } + if(refineParams!= null && refineParams != '' ) { + url += refineParams; + } + url += "&page="+ (page-1) +"&size="+size+"&format=json"; + + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()) + //.do(res => console.info(res)) + .map(res => [res['meta'].total, this.parseResults(res['results']),RefineResultsUtils.parse(res['refineResults'],refineFields, "dataset")]); + } + searchDatasetById (id: string ):any { + + let url = OpenaireProperties.getSearchAPIURLLast()+"datasets/"+id+"?format=json"; + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()) + .map(res => this.parseResults(res)); + } + + searchAggregators (id: string, params: string, refineParams:string, page: number, size: number ):any { + + let link = OpenaireProperties.getSearchAPIURLLast()+"datasets"; + + let url = link+"?"+"&format=json"; + if(params!= null && params != '' ) { + url += params; + } + if(refineParams!= null && refineParams != '' ) { + url += refineParams; + } + url += "&page="+(page-1)+"&size="+size; + + + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()) + .map(res => this.parseRefineResults(id, res['refineResults'])) + } + + searchDatasetsByDois (DOIs: string[], refineParams:string, page: number, size: number, refineFields:string[] ):any { + let link = OpenaireProperties.getSearchAPIURLLast()+"datasets"; + let url = link+"?"; + var doisParams = ""; + + for(var i =0 ;i < DOIs.length; i++){ + doisParams+=(doisParams.length > 0?"&":"")+'doi="'+ DOIs[i]+'"'; + } + if(doisParams.length > 0){ + url += "&"+doisParams; + + } + if(refineParams!= null && refineParams != '' ) { + url += refineParams; + } + url += "&page="+ (page-1) +"&size="+size+"&format=json"; + + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()) + //.do(res => console.info(res)) + + .map(res => [res['meta'].total, this.parseResults(res['results']),RefineResultsUtils.parse(res['refineResults'],refineFields, "dataset")]); + } + advancedSearchDatasets (params: string, page: number, size: number ):any { + let url = OpenaireProperties.getSearchResourcesAPIURL(); + var basicQuery = "(oaftype exact result) and (resulttypeid exact dataset) " + url += "?query="; + if(params!= null && params != '' ) { + url +=" ( "+basicQuery+ " ) " +" and (" + params + ")"; + }else{ + url +=" ( "+basicQuery+ " ) "; + } + + url += "&page="+(page-1)+"&size="+size; + url += "&format=json"; + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()) + //.do(res => console.info(res)) + .map(res => [res['meta'].total, this.parseResults(res['results'])]); + } + searchDatasetsForEntity (params: string, page: number, size: number):any { + let link = OpenaireProperties.getSearchAPIURLLast(); + let url = link+params+"/datasets"+"?format=json"; + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()) + .map(res => [res['meta'].total, this.parseResults(res['results'])]); + } + + searchDatasetsForDataproviders(params: string, page: number, size: number):any { + let link = OpenaireProperties.getSearchAPIURLLast(); + let url = link+params+ "&page="+(page-1)+"&size="+size + "&format=json"; + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()) + .map(res => [res['meta'].total, this.parseResults(res['results'])]); + } + + parseResults(data: any): SearchResult[] { + let results: SearchResult[] = []; + + let length = Array.isArray(data) ? data.length : 1; + + for(let i=0; i(); + } + + result['authors'].push({"name": relation.fullname, "id": relation['to'].content}); + } else */if(relation['to'].class == "isProducedBy") { + result['projects'] = this.parseProjects(result['projects'], relation); + } + } + } + } + + if(resData.hasOwnProperty("creator") && resData['creator'] != null) { + if(result['authors'] == undefined) { + result['authors'] = new Array(); + } + + let authors = resData['creator']; + let length = Array.isArray(authors) ? authors.length : 1; + + for(let i=0; i this.sizeOfDescription) { + result.description = result.description.substring(0, this.sizeOfDescription)+"..."; + } + + result.embargoEndDate = resData.embargoenddate; + + if(!Array.isArray(resData.publisher)) { + result.publisher = resData.publisher; + } else { + for(let i=0; i(); + } + + let countProjects = projects.length; + + projects[countProjects] = { + "id": "", "acronym": "", "title": "", + "funderShortname": "", "funderName": "", + "code": "" + } + + if(relation.title != 'unidentified') { + projects[countProjects]['id'] = + /*OpenaireProperties.getsearchLinkToProject() + */relation['to'].content; + projects[countProjects]['acronym'] = relation.acronym; + projects[countProjects]['title'] = relation.title; + projects[countProjects]['code'] = relation.code; + } else { + projects[countProjects]['id'] = ""; + projects[countProjects]['acronym'] = ""; + projects[countProjects]['title'] = ""; + projects[countProjects]['code'] = ""; + } + + if(relation.hasOwnProperty("funding")) { + let fundingLength = Array.isArray(relation['funding']) ? relation['funding'].length : 1; + + for(let z=0; z res.json()) + .map(res => res.total); + } + + numOfEntityDatasets(id: string, entity: string):any { + var parameters = ""; + + if(entity == "project") { + parameters = "projects/"+id+"/datasets/count"; + } + + let url = OpenaireProperties.getSearchAPIURLLast()+parameters+"?format=json"; + return this.numOfDatasets(url); + } + + numOfSearchDatasets(params: string):any { + let url = OpenaireProperties.getSearchAPIURLLast()+"datasets/count?format=json"; + if(params != "") { + url += "&q=" + params; + } + return this.numOfDatasets(url); + } +} diff --git a/portal-4cli/src/app/services/searchOrganizations.service.ts b/portal-4cli/src/app/services/searchOrganizations.service.ts new file mode 100644 index 00000000..5da21881 --- /dev/null +++ b/portal-4cli/src/app/services/searchOrganizations.service.ts @@ -0,0 +1,191 @@ +import {Injectable} from '@angular/core'; +import {Http, Response} from '@angular/http'; +import {Observable} from 'rxjs/Observable'; +import 'rxjs/add/observable/of'; +import 'rxjs/add/operator/do'; +import 'rxjs/add/operator/share'; +import { } from '../shared/cache.service'; +import {OpenaireProperties} from '../utils/properties/openaireProperties'; +import {SearchResult} from '../utils/entities/searchResult'; +import {RefineResultsUtils} from './servicesUtils/refineResults.class'; + +@Injectable() +export class SearchOrganizationsService { + + constructor(private http: Http ) {} + + parseResultsForDeposit(data: any): {"name": string, "id": string}[] { + let results: {"name": string, "id": string}[] = []; + + let length = Array.isArray(data) ? data.length : 1; + + for(let i=0; i res.json()) + //.do(res => console.info(res)) + + .map(res => [res['meta'].total, this.parseResults(res['results']),RefineResultsUtils.parse(res['refineResults'],refineFields, "organization")]); + } + advancedSearchOrganizations (params: string, page: number, size: number ):any { + let url = OpenaireProperties.getSearchResourcesAPIURL(); + var basicQuery = "(oaftype exact organization) " + url += "?query="; + if(params!= null && params != '' ) { + url +=" ( "+basicQuery+ " ) " +" and (" + params + ")"; + }else{ + url +=" ( "+basicQuery+ " ) "; + } + + url += "&page="+(page-1)+"&size="+size; + url += "&format=json"; + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()) + //.do(res => console.info(res)) + + .map(res => [res['meta'].total, this.parseResults(res['results'])]); + } + parseResults(data: any): SearchResult[] { + let results: SearchResult[] = []; + + let length = Array.isArray(data) ? data.length : 1; + + for(let i=0; i(); + } + + let countProjects = result['projects'].length; + + result['projects'][countProjects] = { + "id": "", "acronym": "", "title": "", + "funderShortname": "", "funderName": "", + "code": "" + } + + if(relation.title != 'unidentified') { + result['projects'][countProjects]['id'] = + /*OpenaireProperties.getsearchLinkToProject() + */relation['to'].content; + result['projects'][countProjects]['acronym'] = relation.acronym; + result['projects'][countProjects]['title'] = relation.title; + result['projects'][countProjects]['code'] = relation.code; + } else { + result['projects'][countProjects]['id'] = ""; + result['projects'][countProjects]['acronym'] = ""; + result['projects'][countProjects]['title'] = ""; + result['projects'][countProjects]['code'] = ""; + } + + if(relation.hasOwnProperty("funding")) { + let fundingLength = Array.isArray(relation['funding']) ? relation['funding'].length : 1; + + for(let z=0; z res.json()) + .map(res => res.total); + } + + numOfEntityOrganizations(id: string, entity: string):any { + // currently not used - if used fix entity comparison below + var parameters: string = ""; + if(entity == "organization") { + parameters = "organizations/"+id+"/organizations/count"; + } + + let url = OpenaireProperties.getSearchAPIURLLast()+parameters+"?format=json"; + return this.numOfOrganizations(url); + } + + numOfSearchOrganizations(params: string):any { + let url = OpenaireProperties.getSearchAPIURLLast()+"organizations/count?format=json"; + if(params != "") { + url += "&q=" + params; + } + return this.numOfOrganizations(url); + } +} diff --git a/portal-4cli/src/app/services/searchProjects.service.ts b/portal-4cli/src/app/services/searchProjects.service.ts new file mode 100644 index 00000000..4bfc5e6d --- /dev/null +++ b/portal-4cli/src/app/services/searchProjects.service.ts @@ -0,0 +1,242 @@ +import {Injectable} from '@angular/core'; +import {Http, Response} from '@angular/http'; +import {Observable} from 'rxjs/Observable'; +import 'rxjs/add/observable/of'; +import 'rxjs/add/operator/do'; +import 'rxjs/add/operator/share'; +import { } from '../shared/cache.service'; +import {OpenaireProperties} from '../utils/properties/openaireProperties'; +import {SearchResult} from '../utils/entities/searchResult'; +import {RefineResultsUtils} from './servicesUtils/refineResults.class'; + +@Injectable() +export class SearchProjectsService { + private sizeOfDescription: number = 270; + + constructor(private http: Http ) {} + + searchProjects (params: string, refineParams:string, page: number, size: number, refineFields:string[] ):any { + + console.info("In searchProjects"); + + let link = OpenaireProperties.getSearchAPIURLLast()+"projects"; + + let url = link+"?"; + if(params!= null && params != '' ) { + url += params; + } + if(refineParams!= null && refineParams != '' ) { + url += refineParams; + } + url += "&page="+(page-1)+"&size="+size + "&format=json"; + + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()) + //.do(res => console.info(res)) + .map(res => [res['meta'].total, this.parseResults(res['results']),RefineResultsUtils.parse(res['refineResults'],refineFields, "project")]); + } + getProjectsforDataProvider (datasourceId: string, page: number, size: number ):any { + let url = OpenaireProperties.getSearchResourcesAPIURL(); + var basicQuery = "(oaftype exact project) " + url += "?query="; + if(datasourceId!= null && datasourceId != '' ) { + url +=" ( "+basicQuery+ " ) " +" and (collectedfromdatasourceid exact \"" + datasourceId + "\")"; + }else{ + url +=" ( "+basicQuery+ " ) "; + } + + url += "&page="+(page-1)+"&size="+size; + url += "&format=json"; + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()) + .map(res => [res['meta'].total, this.parseResults(res['results'])]); + } + advancedSearchProjects (params: string, page: number, size: number ):any { + let url = OpenaireProperties.getSearchResourcesAPIURL(); + var basicQuery = "(oaftype exact project) " + url += "?query="; + if(params!= null && params != '' ) { + url +=" ( "+basicQuery+ " ) " +" and (" + params + ")"; + }else{ + url +=" ( "+basicQuery+ " ) "; + } + + url += "&page="+(page-1)+"&size="+size; + url += "&format=json"; + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()) + //.do(res => console.info(res)) + .map(res => [res['meta'].total, this.parseResults(res['results'])]); + } + getProjectsForOrganizations (organizationId: string, filterquery: string, page: number, size: number, refineFields:string[] ):any { + let url = OpenaireProperties.getSearchResourcesAPIURL(); + var basicQuery = "(oaftype exact project) " + url += "?query="; + if(filterquery!= null && filterquery != '' ) { + url +="( ( "+basicQuery+ " ) and (relorganizationid exact \"" + organizationId + "\")"+" " + filterquery + ")"; + }else{ + url +=" (( "+basicQuery+ " ) " +" and (relorganizationid exact \"" + organizationId + "\"))"; + } + if(refineFields!= null && refineFields.length > 0 ) { + url +="&refine=true"; + for(let i=0; i< refineFields.length ; i++ ){ + url +="&fields="+refineFields[i]; + } + } + url += "&page="+(page-1)+"&size="+size; + url += "&format=json"; + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()) + //.do(res => console.info(res)) + .map(res => [res['meta'].total, this.parseResults(res['results']),RefineResultsUtils.parse(res['refineResults'],refineFields, "project")]); + } + getFunders():any { + let url = OpenaireProperties.getSearchAPIURLLast()+"projects?refine=true&fields=funder&size=0"+ "&format=json";; + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()) + .map(res => [res['meta'].total, res['refineResults']['funder']]); + + + } + + searchForProjectsObs(keyword:string, funderId:string):any { + let url = 'search?action=search&sTransformer=projects_openaire&query='+ + '%28oaftype+exact+project%29+and+%28%28projecttitle+%3D+%22'+keyword+'%22%29+or+%28projectacronym+%3D+%22'+keyword+'%22%29+or+%28projectcode+%3D+%22'+keyword+'%22%29%29+and+%28funder+exact+'+funderId+'%29&size=10&locale=en_GB&format=json'; + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url).toPromise() + .then(request =>{ + return (request.json().response.results)?request.json().response.results.result:request.json().response.result; + + }) ; + } + parseResults(data: any): SearchResult[] { + let results: SearchResult[] = []; + + let length = Array.isArray(data) ? data.length : 1; + + for(let i=0; i(); + } + + let countOrganizations = result['organizations'].length; + + result['organizations'][countOrganizations] = { "name": "", "id": "" } + + result['organizations'][countOrganizations]['id'] = + /*OpenaireProperties.getsearchLinkToOrganization() + */relation['to'].content; + if(relation.legalshortname) { + result['organizations'][countOrganizations]['name'] = relation.legalshortname; + } else { + result['organizations'][countOrganizations]['name'] = relation.legalname; + } + } + } + } + } + if(resData.hasOwnProperty("fundingtree")) { + if(result['funders'] == undefined) { + result['funders'] = new Array< + {"funderShortname": string, "funderName": string}>(); + } + + let fundingLength = Array.isArray(resData['fundingtree']) ? resData['fundingtree'].length : 1; + + for(let z=0; z res.json()) + .map(res => res.total); + } + + numOfEntityProjects(id: string, entity: string):any { + //let url = OpenaireProperties.getSearchAPIURLLast()+params+(params.indexOf("?") == -1 ?"?":"&")+"format=json"; + var parameters: string = ""; + if(entity == "organization") { + parameters = "organizations/"+id+"/projects/count"; + } + + let url = OpenaireProperties.getSearchAPIURLLast()+parameters+ "?format=json"; + + return this.numOfProjects(url); + } + + numOfSearchProjects(params: string):any { + let url = OpenaireProperties.getSearchAPIURLLast()+"projects/count?format=json"; + if(params != "") { + url += "&q=" + params; + } + return this.numOfProjects(url); + } +} diff --git a/portal-4cli/src/app/services/searchPublications.service.ts b/portal-4cli/src/app/services/searchPublications.service.ts new file mode 100644 index 00000000..6962450f --- /dev/null +++ b/portal-4cli/src/app/services/searchPublications.service.ts @@ -0,0 +1,431 @@ +import {Injectable} from '@angular/core'; +import {Http, Response} from '@angular/http'; +import {Observable} from 'rxjs/Observable'; +import 'rxjs/add/observable/of'; +import 'rxjs/add/operator/do'; +import 'rxjs/add/operator/share'; +import { } from '../shared/cache.service'; + +import {OpenaireProperties} from '../utils/properties/openaireProperties'; +import {SearchResult} from '../utils/entities/searchResult'; +import {RefineResultsUtils} from './servicesUtils/refineResults.class'; + +@Injectable() +export class SearchPublicationsService { + private sizeOfDescription: number = 270; + + constructor(private http: Http ) {} + + searchPublications (params: string, refineParams:string, page: number, size: number, refineFields:string[] ):any { + let link = OpenaireProperties.getSearchAPIURLLast()+"publications"; + + let url = link+"?"; + if(params!= null && params != '' ) { + url += params; + } + if(refineParams!= null && refineParams != '' ) { + url += refineParams; + } + url += "&page="+(page-1)+"&size="+size+"&format=json"; + + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()) + // .do(res => console.info(res)) + .map(res => [res['meta'].total, this.parseResults(res['results']),RefineResultsUtils.parse(res['refineResults'],refineFields, "publication")]); + } + searchPublicationById (id: string ):any { + + let url = OpenaireProperties.getSearchAPIURLLast()+"publications/"+id+"?format=json"; + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()) + .map(res => this.parseResults(res)); + } + + searchAggregators (id: string, params: string, refineParams:string, page: number, size: number ):any { + + let link = OpenaireProperties.getSearchAPIURLLast()+"publications"; + + let url = link+"?"+"&format=json"; + if(params!= null && params != '' ) { + url += params; + } + if(refineParams!= null && refineParams != '' ) { + url += refineParams; + } + url += "&page="+(page-1)+"&size="+size; + + + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()) + .map(res => this.parseRefineResults(id, res['refineResults'])); + } + + searchPublicationsByDois (DOIs: string[], refineParams:string, page: number, size: number, refineFields:string[] ):any { + + let link = OpenaireProperties.getSearchAPIURLLast()+"publications"; + + let url = link+"?"+"&format=json&"; + var doisParams = ""; + + for(var i =0 ;i < DOIs.length; i++){ + doisParams+=(doisParams.length > 0?"&":"")+'doi="'+ DOIs[i]+'"'; + } + if(doisParams.length > 0){ + url +="&"+doisParams; + + } + if(refineParams!= null && refineParams != '' ) { + url += refineParams; + } + url += "&page="+(page-1)+"&size="+size; + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()) + //.do(res => console.info(res)) + .map(res => [res['meta'].total, this.parseResults(res['results']),RefineResultsUtils.parse(res['refineResults'],refineFields, "publication")]); + } + + advancedSearchPublications (params: string, page: number, size: number ):any { + let url = OpenaireProperties.getSearchResourcesAPIURL(); + var basicQuery = "(oaftype exact result) and (resulttypeid exact publication) "; + url += "?query="; + if(params!= null && params != '' ) { + url +=" ( "+basicQuery+ " ) " +" and (" + params + ")"; + }else{ + url +=" ( "+basicQuery+ " ) "; + } + + url += "&page="+(page-1)+"&size="+size; + url += "&format=json"; + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()) + //.do(res => console.info(res)) + + .map(res => [res['meta'].total, this.parseResults(res['results'])]); + } + searchPublicationsForEntity (params: string, page: number, size: number):any { + let link = OpenaireProperties.getSearchAPIURLLast(); + let url = link+params+"/publications"+ "?format=json"; + url += "&page="+(page-1)+"&size="+size; + + + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()) + .map(res => [res['meta'].total, this.parseResults(res['results'])]); + } + + searchPublicationsForDataproviders(params: string, page: number, size: number):any { + let link = OpenaireProperties.getSearchAPIURLLast(); + let url = link+params+ "&page="+(page-1)+"&size="+size + "&format=json"; + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()) + .map(res => [res['meta'].total, this.parseResults(res['results'])]); + } +/* + searchPublicationsCSV (params: string, refineParams:string, page: number, size: number):any { + + let link = OpenaireProperties.getSearchAPIURLLast()+"publications"; + + let url = link+"?"; + if(params!= null && params != '' ) { + url += params; + } + if(refineParams!= null && refineParams != '' ) { + url += refineParams; + } + url += "&page="+(page-1)+"&size="+size+ "&format=json"; + + + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()) + //.do(res => console.info(res)) + + .map(res => this.parseResultsCSV(res['results'])); + } +*/ + + parseResults(data: any): SearchResult[] { + let results: SearchResult[] = []; + + let length = Array.isArray(data) ? data.length : 1; + + for(let i=0; i(); + } + + result['authors'].push({"name": relation.fullname, "id": relation['to'].content}); + } else */if(relation['to'].class == "isProducedBy") { + result['projects'] = this.parseProjects(result['projects'], relation); + } + } + } + } + + if(resData.hasOwnProperty("creator") && resData['creator'] != null) { + if(result['authors'] == undefined) { + result['authors'] = new Array(); + } + + let authors = resData['creator']; + let length = Array.isArray(authors) ? authors.length : 1; + + for(let i=0; i this.sizeOfDescription) { + result.description = result.description.substring(0, this.sizeOfDescription) + "..."; + } + + + result.embargoEndDate = resData.embargoenddate; + + results.push(result); + } + + return results; + } + + parseProjects(projects: { "id": string, "acronym": string, "title": string, + "funderShortname": string, "funderName": string, + "code": string }[], relation: any ) : { + "id": string, "acronym": string, "title": string, + "funderShortname": string, "funderName": string, + "code": string }[] { + if(projects == undefined) { + projects = new Array< + { "id": string, "acronym": string, "title": string, + "funderShortname": string, "funderName": string, + "code": string + }>(); + } + + let countProjects = projects.length; + + projects[countProjects] = { + "id": "", "acronym": "", "title": "", + "funderShortname": "", "funderName": "", + "code": "" + } + + if(relation.title != 'unidentified') { + projects[countProjects]['id'] = + /*OpenaireProperties.getsearchLinkToProject() + */relation['to'].content; + projects[countProjects]['acronym'] = relation.acronym; + projects[countProjects]['title'] = relation.title; + projects[countProjects]['code'] = relation.code; + } else { + projects[countProjects]['id'] = ""; + projects[countProjects]['acronym'] = ""; + projects[countProjects]['title'] = ""; + projects[countProjects]['code'] = ""; + } + + if(relation.hasOwnProperty("funding")) { + let fundingLength = Array.isArray(relation['funding']) ? relation['funding'].length : 1; + + for(let z=0; z res.json()) + .map(res => res.total); + } + + numOfEntityPublications(id: string, entity: string):any { + var parameters: string = ""; + if(entity == "project") { + parameters = "projects/"+id+"/publications/count"; + } + let url = OpenaireProperties.getSearchAPIURLLast()+parameters+"?format=json"; + return this.numOfPublications(url); + } + + numOfSearchPublications(params: string):any { + let url = OpenaireProperties.getSearchAPIURLLast()+"publications/count?format=json"; + if(params != "") { + url += "&q=" + params; + } + return this.numOfPublications(url); + } +/* + private quote(word: any): string { + return '"'+word+'"'; + } +*/ +} diff --git a/portal-4cli/src/app/services/searchSoftware.service.ts b/portal-4cli/src/app/services/searchSoftware.service.ts new file mode 100644 index 00000000..c8e0a4e8 --- /dev/null +++ b/portal-4cli/src/app/services/searchSoftware.service.ts @@ -0,0 +1,315 @@ +import {Injectable} from '@angular/core'; +import {Http, Response} from '@angular/http'; +import {Observable} from 'rxjs/Observable'; +import {OpenaireProperties} from '../utils/properties/openaireProperties'; +import {SearchResult} from '../utils/entities/searchResult'; +import {RefineResultsUtils} from './servicesUtils/refineResults.class'; +import 'rxjs/add/observable/of'; +import 'rxjs/add/operator/do'; +import 'rxjs/add/operator/share'; +import { } from '../shared/cache.service'; +@Injectable() +export class SearchSoftwareService { + private sizeOfDescription: number = 270; + + constructor(private http: Http ) {} + + searchSoftware (params: string, refineParams:string, page: number, size: number, refineFields:string[] ):any { + + let link = OpenaireProperties.getSearchAPIURLLast()+"software"; + + let url = link+"?"; + if(params!= null && params != '' ) { + url += params; + } + if(refineParams!= null && refineParams != '' ) { + url += refineParams; + } + url += "&page="+ (page-1) +"&size="+size+"&format=json"; + + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()) + //.do(res => console.info(res)) + .map(res => [res['meta'].total, this.parseResults(res['results']),RefineResultsUtils.parse(res['refineResults'],refineFields, "software")]); + } + searchSoftwareById (id: string ):any { + + let url = OpenaireProperties.getSearchAPIURLLast()+"software/"+id+"?format=json"; + + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()) + .map(res => this.parseResults(res)); + } + + searchAggregators (id: string, params: string, refineParams:string, page: number, size: number ):any { + + let link = OpenaireProperties.getSearchAPIURLLast()+"software"; + + let url = link+"?"+"&format=json"; + if(params!= null && params != '' ) { + url += params; + } + if(refineParams!= null && refineParams != '' ) { + url += refineParams; + } + url += "&page="+(page-1)+"&size="+size; + + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()) + .map(res => this.parseRefineResults(id, res['refineResults'])) + } + + searchSoftwareByDois (DOIs: string[], refineParams:string, page: number, size: number, refineFields:string[] ):any { + let link = OpenaireProperties.getSearchAPIURLLast()+"software"; + let url = link+"?"; + var doisParams = ""; + + for(var i =0 ;i < DOIs.length; i++){ + doisParams+=(doisParams.length > 0?"&":"")+'doi="'+ DOIs[i]+'"'; + } + if(doisParams.length > 0){ + url += "&"+doisParams; + + } + if(refineParams!= null && refineParams != '' ) { + url += refineParams; + } + url += "&page="+ (page-1) +"&size="+size+"&format=json"; + + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()) + //.do(res => console.info(res)) + .map(res => [res['meta'].total, this.parseResults(res['results']),RefineResultsUtils.parse(res['refineResults'],refineFields, "software")]); + } + advancedSearchSoftware (params: string, page: number, size: number ):any { + let url = OpenaireProperties.getSearchResourcesAPIURL(); + var basicQuery = "(oaftype exact result) and (resulttypeid exact software) " + url += "?query="; + if(params!= null && params != '' ) { + url +=" ( "+basicQuery+ " ) " +" and (" + params + ")"; + }else{ + url +=" ( "+basicQuery+ " ) "; + } + + url += "&page="+(page-1)+"&size="+size; + url += "&format=json"; + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()) + //.do(res => console.info(res)) + .map(res => [res['meta'].total, this.parseResults(res['results'])]); + } + searchSoftwareForEntity (params: string, page: number, size: number):any { + let link = OpenaireProperties.getSearchAPIURLLast(); + let url = link+params+"/software"+"?format=json"; + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()) + .map(res => [res['meta'].total, this.parseResults(res['results'])]); + } + + searchSoftwareForDataproviders(params: string, page: number, size: number):any { + let link = OpenaireProperties.getSearchAPIURLLast(); + let url = link+params+ "&page="+(page-1)+"&size="+size + "&format=json"; + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()) + .map(res => [res['meta'].total, this.parseResults(res['results'])]); + } + + parseResults(data: any): SearchResult[] { + let results: SearchResult[] = []; + + let length = Array.isArray(data) ? data.length : 1; + + for(let i=0; i(); + } + + result['authors'].push({"name": relation.fullname, "id": relation['to'].content}); + } else */if(relation['to'].class == "isProducedBy") { + result['projects'] = this.parseProjects(result['projects'], relation); + } + } + } + } + + if(resData.hasOwnProperty("creator") && resData['creator'] != null) { + if(result['authors'] == undefined) { + result['authors'] = new Array(); + } + + let authors = resData['creator']; + let length = Array.isArray(authors) ? authors.length : 1; + + for(let i=0; i this.sizeOfDescription) { + result.description = result.description.substring(0, this.sizeOfDescription)+"..."; + } + + result.embargoEndDate = resData.embargoenddate; + + if(!Array.isArray(resData.publisher)) { + result.publisher = resData.publisher; + } else { + for(let i=0; i(); + } + + let countProjects = projects.length; + + projects[countProjects] = { + "id": "", "acronym": "", "title": "", + "funderShortname": "", "funderName": "", + "code": "" + } + + if(relation.title != 'unidentified') { + projects[countProjects]['id'] = + /*OpenaireProperties.getsearchLinkToProject() + */relation['to'].content; + projects[countProjects]['acronym'] = relation.acronym; + projects[countProjects]['title'] = relation.title; + projects[countProjects]['code'] = relation.code; + } else { + projects[countProjects]['id'] = ""; + projects[countProjects]['acronym'] = ""; + projects[countProjects]['title'] = ""; + projects[countProjects]['code'] = ""; + } + + if(relation.hasOwnProperty("funding")) { + let fundingLength = Array.isArray(relation['funding']) ? relation['funding'].length : 1; + + for(let z=0; z res.json()) + .map(res => res.total); + } + + numOfEntitySoftware(id: string, entity: string):any { + var parameters = ""; + + if(entity == "project") { + parameters = "projects/"+id+"/software/count"; + } + + let url = OpenaireProperties.getSearchAPIURLLast()+parameters+"?format=json"; + return this.numOfSoftware(url); + } + + numOfSearchSoftware(params: string):any { + let url = OpenaireProperties.getSearchAPIURLLast()+"software/count?format=json"; + if(params != "") { + url += "&q=" + params; + } + return this.numOfSoftware(url); + } +} diff --git a/portal-4cli/src/app/services/servicesUtils/refineResults.class.ts b/portal-4cli/src/app/services/servicesUtils/refineResults.class.ts new file mode 100644 index 00000000..b01b3a4f --- /dev/null +++ b/portal-4cli/src/app/services/servicesUtils/refineResults.class.ts @@ -0,0 +1,62 @@ + +import { Filter, Value} from '../../searchPages/searchUtils/searchHelperClasses.class'; +import { SearchFields} from '../../utils/properties/searchFields'; + + +export class RefineResultsUtils { + + + public static parse (data, fields:string[], entityType:string):Filter[] { + // var data = this.json.refineReuslts; + + var searchFields:SearchFields = new SearchFields(); + var filters:Filter[] = []; + if(data){ + for(let j=0; j +

    +
    +
    +
    +
    + + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + European Commission +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + OpenAIRE +
    + +
    + +
    +
    +
    +
    +
    +
    diff --git a/portal-4cli/src/app/sharedComponents/bottom.component.ts b/portal-4cli/src/app/sharedComponents/bottom.component.ts new file mode 100644 index 00000000..3ae13c03 --- /dev/null +++ b/portal-4cli/src/app/sharedComponents/bottom.component.ts @@ -0,0 +1,10 @@ +import { Component } from '@angular/core'; +import 'rxjs/Rx'; + +@Component({ + selector: 'bottom', + templateUrl: 'bottom.component.html' +}) +export class BottomComponent { + +} diff --git a/portal-4cli/src/app/sharedComponents/cookie-law/cookie-law.component.ts b/portal-4cli/src/app/sharedComponents/cookie-law/cookie-law.component.ts new file mode 100644 index 00000000..3a72e7d0 --- /dev/null +++ b/portal-4cli/src/app/sharedComponents/cookie-law/cookie-law.component.ts @@ -0,0 +1,148 @@ +/** + * angular2-cookie-law + * + * Copyright 2016-2017, @andreasonny83, All rights reserved. + * + * @author: @andreasonny83 + */ + +import { + Component, + OnInit, + ViewEncapsulation, + HostBinding, + Input, + Output, + EventEmitter, + animate, + state, + trigger, + style, + transition, + AnimationTransitionEvent, +} from '@angular/core'; + +import { + DomSanitizer, + SafeHtml, +} from '@angular/platform-browser'; + +import { + CookieLawService, +} from './cookie-law.service'; + +// import { +// closeIcon, +// } from './icons'; + +export type CookieLawPosition = 'top' | 'bottom'; +export type CookieLawAnimation = 'topIn' | 'bottomIn' | 'topOut' | 'bottomOut'; +export type CookieLawTarget = '_blank' | '_self'; + +@Component({ + selector: 'cookie-law', + // encapsulation: ViewEncapsulation.None, + animations: [ + trigger('state', [ + state('bottomOut', style({ transform: 'translateY(100%)' })), + state('topOut', style({ transform: 'translateY(-100%)' })), + state('*', style({ transform: 'translateY(0)' })), + + transition('void => topIn', [ + style({ transform: 'translateY(-100%)' }), + animate('1000ms ease-in-out'), + ]), + + transition('void => bottomIn', [ + style({ transform: 'translateY(100%)' }), + animate('1000ms ease-in-out'), + ]), + + transition('* => *', animate('1000ms ease-out')), + ]) + ], + styleUrls: [ './cookie-law.css' ], + templateUrl: './cookie-law.html', +}) +export class CookieLawComponent implements OnInit { + public cookieLawSeen: boolean; + + @Input('learnMore') + get learnMore() { return this._learnMore; } + set learnMore(value: string) { + this._learnMore = (value !== null && `${value}` !== 'false') ? value : null; + } + + @Input('target') + get target() { return this._target; } + set target(value: CookieLawTarget) { + this._target = (value !== null && `${value}` !== 'false' && + (`${value}` === '_blank' || `${value}` === '_self') + ) ? value : '_blank'; + } + + @Input('position') + get position() { return this._position; } + set position(value: CookieLawPosition) { + this._position = (value !== null && `${value}` !== 'false' && + (`${value}` === 'top' || `${value}` === 'bottom') + ) ? value : 'bottom'; + } + + @Output('isSeen') + private isSeenEvt: EventEmitter; + + @HostBinding('attr.seen') + public isSeen: boolean; + + private animation: CookieLawAnimation; + private closeSvg: SafeHtml; + private currentStyles: {}; + private _learnMore: string; + private _target: CookieLawTarget; + private _position: CookieLawPosition; + + constructor( + private _service: CookieLawService, + private domSanitizer: DomSanitizer, + ) { + this.isSeenEvt = new EventEmitter(); + this.animation = 'topIn'; + this._position = 'bottom'; + this.cookieLawSeen = this._service.seen(); + } + + ngOnInit(): void { + if (typeof document !== 'undefined') { + this.animation = this.position === 'bottom' ? 'bottomIn' : 'topIn'; + + this.closeSvg = ' ' ; + + if (this.cookieLawSeen) { + this.isSeen = true; + } + + this.currentStyles = { + 'top': this.position === 'top' ? '0' : null, + 'bottom': this.position === 'top' ? 'initial' : null, + }; + } + } + + afterDismissAnimation(evt: AnimationTransitionEvent) { + if (evt.toState === 'topOut' || + evt.toState === 'bottomOut') { + this.isSeen = true; + this.isSeenEvt.emit(this.isSeen); + } + } + + public dismiss(evt?: MouseEvent): void { + if (evt) { + evt.preventDefault(); + } + + this._service.storeCookie(); + this.animation = this.position === 'top' ? 'topOut' : 'bottomOut'; + } +} diff --git a/portal-4cli/src/app/sharedComponents/cookie-law/cookie-law.css b/portal-4cli/src/app/sharedComponents/cookie-law/cookie-law.css new file mode 100644 index 00000000..17e09689 --- /dev/null +++ b/portal-4cli/src/app/sharedComponents/cookie-law/cookie-law.css @@ -0,0 +1,77 @@ +.cookie-law-wrapper a { + color: #bbb; + -webkit-transition: color .2s; + transition: color .2s; +} +.cookie-law-wrapper a:hover { + color: #fff; +} +.cookie-law-wrapper a:hover svg { + fill: #fff; +} +.cookie-law-wrapper { + background: #333; + color: #bbb; + display: block; + /*font-family: Helvetica Neue,Helvetica,Arial,sans-serif; + font-size: 15px; + font-weight: 200; + line-height: 20px;*/ + position: fixed; + bottom: 0; + left: 0; + width: 100%; + z-index: 999999999; + font-smooth: always; + -webkit-font-smoothing: antialiased; + text-align: center; +} +.dismiss { + display: block; + box-sizing: border-box; + padding: 10px; + position: absolute; + top: 0; + right: 10px; + text-decoration: none; + line-height: 20px; +} +.dismiss svg { + display: block; + fill: #bbb; + width: 20px; + height: 20px; + -webkit-transition: fill .2s; + transition: fill .2s; +} +.copy { + box-sizing: border-box; + padding: 10px 60px 10px 10px; +} +.copy span { + color: #fff; + /*font-weight: 400;*/ +} +.copy a { + text-decoration: underline; +} +.copy a:active, .copy a:hover { + outline: 0; +} + +@media (min-width: 600px) { + /* For bigger devices: */ + .copy { + padding: 20px 60px 20px 20px; + /*font-size: 18px; + line-height: 24px;*/ + } + .dismiss { + top: 10px; + right: 15px; + } + .dismiss svg { + width: 24px; + height: 24px; + } +} diff --git a/portal-4cli/src/app/sharedComponents/cookie-law/cookie-law.html b/portal-4cli/src/app/sharedComponents/cookie-law/cookie-law.html new file mode 100644 index 00000000..ccccbba4 --- /dev/null +++ b/portal-4cli/src/app/sharedComponents/cookie-law/cookie-law.html @@ -0,0 +1,23 @@ + + + + + + + ` + }) + + export class ErrorMessagesComponent { + @Input() status: Array; + @Input() type: string; + + public errorCodes:ErrorCodes; + + constructor () {} + + ngOnInit() { + this.errorCodes = new ErrorCodes(); + console.info("ngOnInit"); + if(!this.status) { + this.status = [this.errorCodes.LOADING]; + } + } + + ngOnDestroy() {} + + public checkErroCode(code: number) { + return function(status: number) { + return (status == code); + } + } + } diff --git a/portal-4cli/src/app/utils/errorMessages.module.ts b/portal-4cli/src/app/utils/errorMessages.module.ts new file mode 100644 index 00000000..9f7315af --- /dev/null +++ b/portal-4cli/src/app/utils/errorMessages.module.ts @@ -0,0 +1,19 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import {ErrorMessagesComponent} from './errorMessages.component'; + + +@NgModule({ + imports: [ + CommonModule, FormsModule + ], + declarations: [ + ErrorMessagesComponent + ], + exports: [ + ErrorMessagesComponent + ] +}) +export class ErrorMessagesModule { } diff --git a/portal-4cli/src/app/utils/exportCSV.class.ts b/portal-4cli/src/app/utils/exportCSV.class.ts new file mode 100644 index 00000000..c5e39a33 --- /dev/null +++ b/portal-4cli/src/app/utils/exportCSV.class.ts @@ -0,0 +1,131 @@ + + + +export class ExportCSVComponent { + stockData : any = + { + "columnNames": + ["Symbol", "Company", "Price"], + "export": +/* + [ + { + Symbol: "AAPL", + Company: "Apple Inc.", + Price: "132.54" + }, + { + Symbol: "INTC", + Company: "Intel Corporation", + Price: "33.45" + }, + { + Symbol: "GOOG", + Company: "Google Inc", + Price: "554.52" + }, + ], +*/ + + [ + [ + "AAPL", + "Apple Inc.", + "132.54" + ], + [ + "INTC", + "Intel Corporation", + "33.45" + ], + [ + "GOOG", + "Google Inc", + "554.52" + ], + ], + + + "columnDelimiter": ',', + "lineDelimiter": '\n' + }; + + data: any = this.stockData; + filename: string; + linkname: string = "Download CSV"; + + constructor () { + } + + ngOnInit() { + } + + public static convertArrayOfObjectsToCSV(args) { + console.info("convertArrayOfObjectsToCSV"); + + var result, ctr, keys, columnDelimiter, lineDelimiter, data; + + data = args.export || null; + + if (data == null || !data.length) { + return null; + } + + columnDelimiter = args.columnDelimiter || ','; + lineDelimiter = args.lineDelimiter || '\n'; + + //keys = Object.keys(data[0]); + keys = args.columnNames; + + result = ''; + result += keys.join(columnDelimiter); + result += lineDelimiter; +/* + data.forEach(function(item) { + ctr = 0; + keys.forEach(function(key) { + if (ctr > 0) result += columnDelimiter; + result += item[key]; + ctr++; + }); + result += lineDelimiter; + }); +*/ + + for(let line of data) { + ctr = 0; + for(let column of line) { + if (ctr > 0) result += columnDelimiter; + result += column; + ctr++; + } + result += lineDelimiter; + } + + return result; + } + + public static downloadCSV(data: any, filenameArg: string) { + console.info("downloadCSV"); + + var encodedData, filename, link; + + var csv = this.convertArrayOfObjectsToCSV(data); + if (csv == null) return; + + filename = filenameArg || 'export.csv'; + + if (!csv.match(/^data:text\/csv/i)) { + csv = 'data:text/csv;charset=utf-8,' + csv; + } + encodedData = encodeURI(csv); + + //link = document.createElement('a'); + link = document.getElementsByTagName('a'); + link[0].setAttribute('href', encodedData); + link[0].setAttribute('download', filename); + //document.body.appendChild(link); + link[0].click(); + //document.body.removeChild(link); + } +} diff --git a/portal-4cli/src/app/utils/fetchEntitiesClasses/fetchDataproviders.class.ts b/portal-4cli/src/app/utils/fetchEntitiesClasses/fetchDataproviders.class.ts new file mode 100644 index 00000000..1ef9125c --- /dev/null +++ b/portal-4cli/src/app/utils/fetchEntitiesClasses/fetchDataproviders.class.ts @@ -0,0 +1,291 @@ +import {SearchDataprovidersService} from '../../services/searchDataproviders.service'; +import { ErrorCodes} from '../../utils/properties/openaireProperties'; +import {SearchUtilsClass } from '../../searchPages/searchUtils/searchUtils.class'; + +export class FetchDataproviders { + private errorCodes: ErrorCodes; + + public results =[]; + public searchUtils:SearchUtilsClass = new SearchUtilsClass(); + public sub: any; public subResults: any; + public CSV: any = { "columnNames": [ "Title", "Type", "Coutries", "Compatibility" ], + "export":[] + }; + public CSVDownloaded = false; + public csvParams: string; + + + constructor ( private _searchDataprovidersService: SearchDataprovidersService ) { + this.errorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + } + + + public ngOnDestroy() { + if(this.sub){ + this.sub.unsubscribe(); + } + if(this.subResults){ + this.subResults.unsubscribe(); + } + } + + public getResultsByKeyword(keyword:string, page: number, size: number){ + var parameters = ""; + if(keyword.length > 0){ + parameters = "q=" + keyword; + } + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + + + this.subResults = this._searchDataprovidersService.searchDataproviders(parameters,null, page, size,[]).subscribe( + data => { + this.searchUtils.totalResults = data[0]; + console.info("search Content Providers: [Parameters:"+parameters+" ] [total results:"+this.searchUtils.totalResults+"]"); + this.results = data[1]; + + //ar errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + } + ); + } + + public getNumForEntity(entity: string, id:string) { + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + + if(id != "" && entity != "") { + + this._searchDataprovidersService.numOfEntityDataproviders(id, entity).subscribe( + data => { + this.searchUtils.totalResults = data; + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + } + ); + } + } + + public getNumForSearch(keyword: string) { + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + + this._searchDataprovidersService.numOfSearchDataproviders(keyword).subscribe( + data => { + this.searchUtils.totalResults = data; + this.searchUtils.status = this.errorCodes.DONE; + + if(this.searchUtils.totalResults == 0) { + this.searchUtils.status = this.errorCodes.NONE; + } + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + } + ); + } + +public getResultsForDeposit(id:string, type:string, page: number, size: number){ + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + + if(id != "") { + + this._searchDataprovidersService.searchDataprovidersForDeposit(id,type, page, size).subscribe( + data => { + this.searchUtils.totalResults = data[0]; + console.info("search Dataproviders forDeposit: [id:"+id+", type:"+type+" ] [total results:"+this.searchUtils.totalResults+"]"); + this.results = data[1]; + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + } + ); + } +} +public getResultsBySubjectsForDeposit(subject:string, type:string, page: number, size: number){ + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + this._searchDataprovidersService.searchDataProvidersBySubjects(subject,type, page, size).subscribe( + data => { + this.searchUtils.totalResults = data[0]; + console.info("search Dataproviders forDeposit: [subject:"+subject+", type:"+type+" ] [total results:"+this.searchUtils.totalResults+"]"); + this.results = data[1]; + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + } + ); + +} + public getResultsForEntity(entity:string, id:string, page: number, size: number){ + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + + var parameters = ""; + + if(entity == "organization") { + parameters = "organizations/"+id; + } + + if(parameters != "") { + + this._searchDataprovidersService.searchDataprovidersForEntity(parameters, page, size).subscribe( + data => { + this.searchUtils.totalResults = data[0]; + console.info("search Dataproviders for "+entity+": [Parameters:"+parameters+" ] [total results:"+this.searchUtils.totalResults+"]"); + this.results = data[1]; + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + } + ); + } + } + + public getResultsForDataproviders(id:string, page: number, size: number){ + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + + this._searchDataprovidersService.getDataProvidersforEntityRegistry(id, page, size).subscribe( + data => { + this.searchUtils.totalResults = data[0]; + console.info("search Dataproviders for Entity Registry: [Id:"+id+" ] [total results:"+this.searchUtils.totalResults+"]"); + this.results = data[1]; + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + } + ); + } +} diff --git a/portal-4cli/src/app/utils/fetchEntitiesClasses/fetchDatasets.class.ts b/portal-4cli/src/app/utils/fetchEntitiesClasses/fetchDatasets.class.ts new file mode 100644 index 00000000..9e6916b6 --- /dev/null +++ b/portal-4cli/src/app/utils/fetchEntitiesClasses/fetchDatasets.class.ts @@ -0,0 +1,253 @@ +import {SearchDatasetsService} from '../../services/searchDatasets.service'; +import { ErrorCodes} from '../../utils/properties/openaireProperties'; +import {SearchUtilsClass } from '../../searchPages/searchUtils/searchUtils.class'; +import {DOI} from '../../utils/string-utils.class'; +import {Subject} from 'rxjs/Subject'; + +export class FetchDatasets{ + private errorCodes: ErrorCodes; + + public results =[]; + public requestComplete: Subject; + + public searchUtils:SearchUtilsClass = new SearchUtilsClass(); + private sub: any; + private subResults: any; + + public csvParams: string; + + constructor ( private _searchDatasetsService: SearchDatasetsService ) { + + this.errorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + + this.requestComplete = new Subject(); + } + + + + public ngOnDestroy() { + if(this.sub){ + this.sub.unsubscribe(); + } + if(this.subResults){ + this.subResults.unsubscribe(); + } + } + + + public getResultsByKeyword(keyword:string, page: number, size: number){ + var parameters = ""; + if(keyword.length > 0){ + var DOIs:string[] = DOI.getDOIsFromString(keyword); + var doisParams = ""; + + for(var i =0 ;i < DOIs.length; i++){ + doisParams+=(doisParams.length > 0?"&":"")+'doi="'+ DOIs[i]+'"'; + } + if(doisParams.length > 0){ + parameters += "&"+doisParams; + }else{ + parameters = "q=" + keyword; + } + } + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + + this.subResults = this._searchDatasetsService.searchDatasets(parameters,null, page, size, []).subscribe( + data => { + this.searchUtils.totalResults = data[0]; + console.info("search Research Data: [Parameters:"+parameters+" ] [total results:"+this.searchUtils.totalResults+"]"); + this.results = data[1]; + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + } + ); + } + +public getNumForEntity(entity:string, id:string){ + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + + + if(id != "" && entity != "") { + this._searchDatasetsService.numOfEntityDatasets(id, entity).subscribe( + data => { + this.searchUtils.totalResults = data; + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + } + ); + } +} + +public getResultsForEntity(entity:string, id:string, page: number, size: number){ + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + + var parameters = ""; + + if(entity == "project") { + parameters = "projects/"+id; + } + + if(parameters != "") { + + this._searchDatasetsService.searchDatasetsForEntity(parameters, page, size).subscribe( + data => { + this.searchUtils.totalResults = data[0]; + console.info("search Research Data for "+entity+": [Parameters:"+parameters+" ] [total results:"+this.searchUtils.totalResults+"]"); + this.results = data[1]; + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + } + ); + } +} + +public getResultsForDataproviders(id:string, resultsFrom:string, page: number, size: number){ + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + + var parameters; + if(resultsFrom == "collectedFrom") { + parameters = "datasets?fq=collectedfromdatasourceid exact "+'"'+id+'"'; + } else if(resultsFrom == "hostedBy") { + parameters = "datasets?fq=resulthostingdatasourceid exact "+'"'+id+'"'; + } + + if(parameters != "") { + + this._searchDatasetsService.searchDatasetsForDataproviders(parameters, page, size).subscribe( + data => { + this.searchUtils.totalResults = data[0]; + console.info("search Research Data for Dataproviders: [Parameters:"+parameters+" ] [total results:"+this.searchUtils.totalResults+"]"); + this.results = data[1]; + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + } + ); + } +} + +public getAggregatorResults(id:string, page: number, size: number){ + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + + this.subResults = this._searchDatasetsService.searchAggregators(id, '&fq=collectedfromdatasourceid exact "'+id+'"',"&refine=true&fields=resulthostingdatasource" , page, size).subscribe( + data => { + this.results = data; + this.searchUtils.totalResults = this.results.length; + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + + this.requestComplete.complete(); + }, + err => { + console.log(err); + console.info("status: "+err.status); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + + this.requestComplete.complete(); + } + ); +} + +} diff --git a/portal-4cli/src/app/utils/fetchEntitiesClasses/fetchOrganizations.class.ts b/portal-4cli/src/app/utils/fetchEntitiesClasses/fetchOrganizations.class.ts new file mode 100644 index 00000000..07cb4c61 --- /dev/null +++ b/portal-4cli/src/app/utils/fetchEntitiesClasses/fetchOrganizations.class.ts @@ -0,0 +1,76 @@ + import {SearchOrganizationsService} from '../../services/searchOrganizations.service'; + import { ErrorCodes} from '../../utils/properties/openaireProperties'; + import {SearchUtilsClass } from '../../searchPages/searchUtils/searchUtils.class'; + +export class FetchOrganizations { + private errorCodes: ErrorCodes; + + public results =[]; + + public searchUtils:SearchUtilsClass = new SearchUtilsClass(); + public sub: any; + public subResults: any; + + + + constructor ( private _searchOrganizationsService: SearchOrganizationsService ) { + + this.errorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + + } + + + public ngOnDestroy() { + if(this.sub){ + this.sub.unsubscribe(); + } + if(this.subResults){ + this.subResults.unsubscribe(); + } + } + + + public getResultsByKeyword(keyword:string , page: number, size: number){ + var parameters = ""; + if(keyword.length > 0){ + parameters = "q=" + keyword; + } + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + + this.subResults = this._searchOrganizationsService.searchOrganizations(parameters, null, page, size, []).subscribe( + data => { + this.searchUtils.totalResults = data[0]; + console.info("search Organizations: [Parameters:"+parameters+" ] [total results:"+this.searchUtils.totalResults+"]"); + this.results = data[1]; + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + } + ); + } + + +} diff --git a/portal-4cli/src/app/utils/fetchEntitiesClasses/fetchProjects.class.ts b/portal-4cli/src/app/utils/fetchEntitiesClasses/fetchProjects.class.ts new file mode 100644 index 00000000..d31a3232 --- /dev/null +++ b/portal-4cli/src/app/utils/fetchEntitiesClasses/fetchProjects.class.ts @@ -0,0 +1,209 @@ +import {SearchProjectsService} from '../../services/searchProjects.service'; +import {ErrorCodes} from '../../utils/properties/openaireProperties'; +import {SearchUtilsClass } from '../../searchPages/searchUtils/searchUtils.class'; + +export class FetchProjects{ + private errorCodes: ErrorCodes; + + public results =[]; + + public filters; // for getResultsForOrganizations + public funders:any = []; // for getResultsForOrganizations // this is filled with the initial query - before filtering + + public sub: any; + public subResults: any; + public searchUtils:SearchUtilsClass = new SearchUtilsClass(); + + + constructor (private _searchProjectsService: SearchProjectsService) { + this.errorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + + } + + public ngOnDestroy() { + if(this.sub){ + this.sub.unsubscribe(); + } + if(this.subResults){ + this.subResults.unsubscribe(); + } + } + + public getResultsByKeyword(keyword:string, page: number, size: number){ + var parameters = ""; + if(keyword.length > 0){ + parameters = "q=" + keyword; + } + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + + this.subResults = this._searchProjectsService.searchProjects(parameters, null, page, size, []).subscribe( + data => { + this.searchUtils.totalResults = data[0]; + console.info("search Projects: [Parameters:"+parameters+" ] [total results:"+this.searchUtils.totalResults+"]"); + this.results = data[1]; + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + } + ); + } + + public getResultsForDataproviders(id:string, page: number, size: number){ + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + + this._searchProjectsService.getProjectsforDataProvider(id, page, size).subscribe( + data => { + this.searchUtils.totalResults = data[0]; + console.info("search Projects for Dataproviders: [Id:"+id+" ] [total results:"+this.searchUtils.totalResults+"]"); + this.results = data[1]; + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + } + ); + } + + public getNumForEntity(entity: string, id:string) { + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + + if(id != "" && entity != "") { + + this._searchProjectsService.numOfEntityProjects(id, entity).subscribe( + data => { + this.searchUtils.totalResults = data; + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + } + ); + } + } + + public getResultsForOrganizations(organizationId:string, filterquery:string, page: number, size: number, refineFields:string[]){ + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + + this._searchProjectsService.getProjectsForOrganizations(organizationId,filterquery, page, size,refineFields).subscribe( + data => { + this.searchUtils.totalResults = data[0]; // the results can be filtered so this number can be no total results + console.info("search Projects for Organization: [Id:"+organizationId+" ] [total results:"+this.searchUtils.totalResults+"]"); + this.results = data[1]; + if(refineFields && refineFields.length > 0){ + this.filters = data[2]; + filterquery = decodeURIComponent(filterquery); + for(var i = 0; i < this.filters.length; i++){ + if(filterquery.indexOf(this.filters[i].filterId) !== -1){ + console.log("this.filters[i].filterId:"+this.filters[i].filterId); + for(var j = 0; j < this.filters[i].values.length; j++){ + console.log("this.filters[i].values[j].id:"+this.filters[i].values[j].id); + if(filterquery.indexOf(this.filters[i].values[j].id) !== -1){ + this.filters[i].values[j].selected = true; + } + } + } + } + } + + if(filterquery == ""){ + this.searchUtils.totalResultsNoFilters = this.searchUtils.totalResults; + this.funders = []; + for(var i = 0; i < this.filters.length; i++){ + console.log("this.filters[i].filterId:"+this.filters[i].filterId); + if(this.filters[i].filterId == "funder"){ + this.funders = (this.filters[i].values); + + } + } + console.log(" this.funders:"+ this.funders); + + } + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + } + ); + } + + +} diff --git a/portal-4cli/src/app/utils/fetchEntitiesClasses/fetchPublications.class.ts b/portal-4cli/src/app/utils/fetchEntitiesClasses/fetchPublications.class.ts new file mode 100644 index 00000000..9e6959f1 --- /dev/null +++ b/portal-4cli/src/app/utils/fetchEntitiesClasses/fetchPublications.class.ts @@ -0,0 +1,233 @@ + +import {SearchPublicationsService} from '../../services/searchPublications.service'; +import {ErrorCodes} from '../../utils/properties/openaireProperties'; +import {SearchFields} from '../../utils/properties/searchFields'; + import {SearchUtilsClass } from '../../searchPages/searchUtils/searchUtils.class'; +import {DOI} from '../../utils/string-utils.class'; +import {Subject} from 'rxjs/Subject'; + +export class FetchPublications { + private errorCodes: ErrorCodes; + + public results =[]; + + public requestComplete: Subject; + + // public filters =[]; + public searchUtils:SearchUtilsClass = new SearchUtilsClass(); + // public baseUrl:string = ""; + public sub: any; + public subResults: any; + public searchFields:SearchFields = new SearchFields(); + // public refineFields: string[] = this.searchFields.RESULT_REFINE_FIELDS; + // public fieldIdsMap=this.searchFields.RESULT_FIELDS; + //: { [key:string] :{ name:string, operator:string, type:string, indexField:string, equalityOperator:string }} = this.searchFields.PUBLICATION_FIELDS_MAP; + + public CSV: any = { "columnNames": ["Title", "Authors", "Publication Year", "DOI", + /*"Download From", "Publication type", "Journal",*/ + "Funder", "Project Name (GA Number)", "Access"], + "export":[] + }; + public CSVDownloaded = false; + public csvParams: string; + + constructor ( private _searchPublicationsService: SearchPublicationsService ) { + this.errorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + // this.baseUrl = OpenaireProperties.getLinkToSearchPublications(); + + this.requestComplete = new Subject(); + } + + + public ngOnDestroy() { + if(this.sub){ + this.sub.unsubscribe(); + } + if(this.subResults){ + this.subResults.unsubscribe(); + } + } + + public getResultsByKeyword(keyword:string, page: number, size: number){ + var parameters = ""; + if(keyword.length > 0){ + var DOIs:string[] = DOI.getDOIsFromString(keyword); + var doisParams = ""; + + for(var i =0 ;i < DOIs.length; i++){ + doisParams+=(doisParams.length > 0?"&":"")+'doi="'+ DOIs[i]+'"'; + } + if(doisParams.length > 0){ + parameters += "&"+doisParams; + }else{ + parameters = "q=" + keyword; + } + } + + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + + this.subResults = this._searchPublicationsService.searchPublications(parameters,null, page, size, []).subscribe( + data => { + this.searchUtils.totalResults = data[0]; + console.info("search Publications: [Parameters:"+parameters+" ] [total results:"+this.searchUtils.totalResults+"]"); + this.results = data[1]; + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + } + ); + } + +public getResultsForEntity(entity:string, id:string, page: number, size: number){ + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + + var parameters = ""; + if(entity == "project") { + parameters = "projects/"+id; + } else if(entity == "organization") { + parameters = "organizations/"+id; + } + + if(parameters != "") { + this._searchPublicationsService.searchPublicationsForEntity(parameters, page, size).subscribe( + data => { + this.searchUtils.totalResults = data[0]; + + console.info("search Publications for "+entity+": [Parameters:"+parameters+" ] [total results:"+this.searchUtils.totalResults+"]"); + this.results = data[1]; + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + } + ); + } +} + +public getResultsForDataproviders(id:string, resultsFrom:string, page: number, size: number){ + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + + var parameters; + if(resultsFrom == "collectedFrom") { + parameters = "publications?fq=collectedfromdatasourceid exact "+'"'+id+'"'; + } else if(resultsFrom == "hostedBy") { + parameters = "publications?fq=resulthostingdatasourceid exact "+'"'+id+'"'; + } + + if(parameters != "") { + + this._searchPublicationsService.searchPublicationsForDataproviders(parameters, page, size).subscribe( + data => { + this.searchUtils.totalResults = data[0]; + console.info("search Publications for Dataproviders: [Parameters:"+parameters+" ] [total results:"+this.searchUtils.totalResults+"]"); + this.results = data[1]; + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + } + ); + } +} + +public getAggregatorResults(id:string, page: number, size: number){ + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + + this.subResults = this._searchPublicationsService.searchAggregators(id, '&fq=collectedfromdatasourceid exact "'+id+'"',"&refine=true&fields=resulthostingdatasource" , page, size).subscribe( + data => { + this.results = data; + this.searchUtils.totalResults = this.results.length; + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + + this.requestComplete.complete(); + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + + this.requestComplete.complete(); + } + ); +} + + +} diff --git a/portal-4cli/src/app/utils/fetchEntitiesClasses/fetchSoftware.class.ts b/portal-4cli/src/app/utils/fetchEntitiesClasses/fetchSoftware.class.ts new file mode 100644 index 00000000..9dbc37d6 --- /dev/null +++ b/portal-4cli/src/app/utils/fetchEntitiesClasses/fetchSoftware.class.ts @@ -0,0 +1,253 @@ +import {SearchSoftwareService} from '../../services/searchSoftware.service'; +import { ErrorCodes} from '../../utils/properties/openaireProperties'; +import {SearchUtilsClass } from '../../searchPages/searchUtils/searchUtils.class'; +import {DOI} from '../../utils/string-utils.class'; +import {Subject} from 'rxjs/Subject'; + +export class FetchSoftware{ + private errorCodes: ErrorCodes; + + public results =[]; + public requestComplete: Subject; + + public searchUtils:SearchUtilsClass = new SearchUtilsClass(); + private sub: any; + private subResults: any; + + public csvParams: string; + + constructor ( private _searchSoftwareService: SearchSoftwareService ) { + + this.errorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + + this.requestComplete = new Subject(); + } + + + + public ngOnDestroy() { + if(this.sub){ + this.sub.unsubscribe(); + } + if(this.subResults){ + this.subResults.unsubscribe(); + } + } + + + public getResultsByKeyword(keyword:string, page: number, size: number){ + var parameters = ""; + if(keyword.length > 0){ + var DOIs:string[] = DOI.getDOIsFromString(keyword); + var doisParams = ""; + + for(var i =0 ;i < DOIs.length; i++){ + doisParams+=(doisParams.length > 0?"&":"")+'doi="'+ DOIs[i]+'"'; + } + if(doisParams.length > 0){ + parameters += "&"+doisParams; + }else{ + parameters = "q=" + keyword; + } + } + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + + this.subResults = this._searchSoftwareService.searchSoftware(parameters,null, page, size, []).subscribe( + data => { + this.searchUtils.totalResults = data[0]; + console.info("search Software: [Parameters:"+parameters+" ] [total results:"+this.searchUtils.totalResults+"]"); + this.results = data[1]; + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + } + ); + } + +public getNumForEntity(entity:string, id:string){ + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + + + if(id != "" && entity != "") { + this._searchSoftwareService.numOfEntitySoftware(id, entity).subscribe( + data => { + this.searchUtils.totalResults = data; + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + } + ); + } +} + +public getResultsForEntity(entity:string, id:string, page: number, size: number){ + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + + var parameters = ""; + + if(entity == "project") { + parameters = "projects/"+id; + } + + if(parameters != "") { + + this._searchSoftwareService.searchSoftwareForEntity(parameters, page, size).subscribe( + data => { + this.searchUtils.totalResults = data[0]; + console.info("search Software for "+entity+": [Parameters:"+parameters+" ] [total results:"+this.searchUtils.totalResults+"]"); + this.results = data[1]; + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + } + ); + } +} + +public getResultsForDataproviders(id:string, resultsFrom:string, page: number, size: number){ + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + + var parameters; + if(resultsFrom == "collectedFrom") { + parameters = "software?fq=collectedfromdatasourceid exact "+'"'+id+'"'; + } else if(resultsFrom == "hostedBy") { + parameters = "software?fq=resulthostingdatasourceid exact "+'"'+id+'"'; + } + + if(parameters != "") { + + this._searchSoftwareService.searchSoftwareForDataproviders(parameters, page, size).subscribe( + data => { + this.searchUtils.totalResults = data[0]; + console.info("search Software for Dataproviders: [Parameters:"+parameters+" ] [total results:"+this.searchUtils.totalResults+"]"); + this.results = data[1]; + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + }, + err => { + console.log(err); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + } + ); + } +} + +public getAggregatorResults(id:string, page: number, size: number){ + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.LOADING; + + this.subResults = this._searchSoftwareService.searchAggregators(id, '&fq=collectedfromdatasourceid exact "'+id+'"',"&refine=true&fields=resulthostingdatasource" , page, size).subscribe( + data => { + this.results = data; + this.searchUtils.totalResults = this.results.length; + + //var errorCodes:ErrorCodes = new ErrorCodes(); + this.searchUtils.status = this.errorCodes.DONE; + if(this.searchUtils.totalResults == 0 ){ + this.searchUtils.status = this.errorCodes.NONE; + } + + this.requestComplete.complete(); + }, + err => { + console.log(err); + console.info("status: "+err.status); + //TODO check erros (service not available, bad request) + // if( ){ + // this.searchUtils.status = ErrorCodes.ERROR; + // } + //var errorCodes:ErrorCodes = new ErrorCodes(); + //this.searchUtils.status = errorCodes.ERROR; + if(err.status == '404') { + this.searchUtils.status = this.errorCodes.NOT_FOUND; + } else if(err.status == '500') { + this.searchUtils.status = this.errorCodes.ERROR; + } else { + this.searchUtils.status = this.errorCodes.NOT_AVAILABLE; + } + + this.requestComplete.complete(); + } + ); +} + +} diff --git a/portal-4cli/src/app/utils/helper/helper.component.ts b/portal-4cli/src/app/utils/helper/helper.component.ts new file mode 100644 index 00000000..66c3c70c --- /dev/null +++ b/portal-4cli/src/app/utils/helper/helper.component.ts @@ -0,0 +1,47 @@ +import { Component, Input } from '@angular/core'; +import 'rxjs/Rx'; +import {HelperService} from './helper.service'; +import {OpenaireProperties} from '../properties/openaireProperties'; + +@Component({ + selector: 'helper', + template: ` +
    +
    +
    +
    +` +}) +export class HelperComponent { + texts=[]; + @Input() style:boolean = false; + @Input() position:string = 'right'; + @Input() styleName:string = ''; + sub:any; + + constructor ( + private _service: HelperService + ) { + } + + ngOnInit() { + if(OpenaireProperties.isHelperEnabled() && location){ + this.sub = this._service.getHelper(location.pathname).subscribe( + data => { + this.texts =(data && data.content && data.content[this.position] )? data.content[this.position]:[]; + }, + err => { + console.log(err); + + } + ); + } + } + ngOnDestroy() { + if(this.sub){ + this.sub.unsubscribe(); + } + } + + +} diff --git a/portal-4cli/src/app/utils/helper/helper.module.ts b/portal-4cli/src/app/utils/helper/helper.module.ts new file mode 100644 index 00000000..93752d19 --- /dev/null +++ b/portal-4cli/src/app/utils/helper/helper.module.ts @@ -0,0 +1,25 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +// import { RouterModule } from "@angular/router"; + +import {HelperComponent} from './helper.component'; +// import {HelperServiceModule} from './helperService.module'; +import {HelperService} from './helper.service'; + + +@NgModule({ + imports: [ + CommonModule, FormsModule, + // RouterModule//,HelperServiceModule + ], + declarations: [ + HelperComponent + ], + providers:[HelperService], + exports: [ + HelperComponent + ] +}) +export class HelperModule{ } diff --git a/portal-4cli/src/app/utils/helper/helper.service.ts b/portal-4cli/src/app/utils/helper/helper.service.ts new file mode 100644 index 00000000..013ad903 --- /dev/null +++ b/portal-4cli/src/app/utils/helper/helper.service.ts @@ -0,0 +1,26 @@ +import {Injectable} from '@angular/core'; +import {Http, Response} from '@angular/http'; +import {Observable} from 'rxjs/Observable'; +import 'rxjs/add/observable/of'; +import 'rxjs/add/operator/do'; +import 'rxjs/add/operator/share'; + +import { OpenaireProperties } from '../../utils/properties/openaireProperties'; + +@Injectable() +export class HelperService { + constructor(private http: Http ) {} + + getHelper (router: string):any { + console.info("get router helpText for : "+router); + + let url = OpenaireProperties.getHelperPageUrl() + '?q=' + router; + + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .map(res => res.json()); + + } + + + +} diff --git a/portal-4cli/src/app/utils/helper/helperService.module.ts b/portal-4cli/src/app/utils/helper/helperService.module.ts new file mode 100644 index 00000000..475fd82d --- /dev/null +++ b/portal-4cli/src/app/utils/helper/helperService.module.ts @@ -0,0 +1,20 @@ +import { NgModule} from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import {HelperService} from './helper.service'; + + +@NgModule({ + imports: [ + CommonModule, FormsModule + ], + declarations: [ + ], + providers:[ + HelperService +], + exports: [ + ] +}) +export class HelperServiceModule { } diff --git a/portal-4cli/src/app/utils/iframe.component.ts b/portal-4cli/src/app/utils/iframe.component.ts new file mode 100644 index 00000000..302f6431 --- /dev/null +++ b/portal-4cli/src/app/utils/iframe.component.ts @@ -0,0 +1,21 @@ +import {Component, ElementRef, Input} from '@angular/core'; +import { SafeResourceUrl, DomSanitizer } from '@angular/platform-browser'; +//Usage :: ` +@Component({ + selector: 'i-frame', + template: ` + + ` +}) +export class IFrameComponent { + public safeUrl: SafeResourceUrl; + @Input() url ; + @Input() width = '100%'; + @Input() height = '300'; + constructor(private sanitizer: DomSanitizer) { + } + ngOnInit() { + this.safeUrl = this.sanitizer.bypassSecurityTrustResourceUrl(this.url); + console.info("URL:" + this.safeUrl); + } +} diff --git a/portal-4cli/src/app/utils/iframe.module.ts b/portal-4cli/src/app/utils/iframe.module.ts new file mode 100644 index 00000000..702e5ab5 --- /dev/null +++ b/portal-4cli/src/app/utils/iframe.module.ts @@ -0,0 +1,19 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import {IFrameComponent} from './iframe.component'; + + +@NgModule({ + imports: [ + CommonModule, FormsModule + ], + declarations: [ + IFrameComponent + ], + exports: [ + IFrameComponent + ] +}) +export class IFrameModule { } diff --git a/portal-4cli/src/app/utils/metaTags/openaireMetaTags.class.ts b/portal-4cli/src/app/utils/metaTags/openaireMetaTags.class.ts new file mode 100644 index 00000000..3b78aa42 --- /dev/null +++ b/portal-4cli/src/app/utils/metaTags/openaireMetaTags.class.ts @@ -0,0 +1,21 @@ +import {Meta} from '../../../angular2-meta'; + +export class OpenaireMetaTags{ + + constructor (private _meta: Meta ) { + } + + updateDescription(description:string){ + this._meta.updateMeta("description", description); + this._meta.updateProperty("og:description", description); + } + updateTitle(title:string){ + var _prefix ="OpenAIRE | "; + var _title = _prefix + ((title.length> 50 ) ?title.substring(0,50):title); + this._meta.setTitle(_title ); + this._meta.updateProperty("og:title",_title); + } + updateUrl(url:string){ + this._meta.updateProperty("og:url", url); + } +} diff --git a/portal-4cli/src/app/utils/modal/alert.ts b/portal-4cli/src/app/utils/modal/alert.ts new file mode 100644 index 00000000..c7155cd8 --- /dev/null +++ b/portal-4cli/src/app/utils/modal/alert.ts @@ -0,0 +1,111 @@ +import {Component, ViewEncapsulation, ComponentRef, ElementRef, Input, EventEmitter, Output} from '@angular/core'; +// import { DynamicComponentLoader} from '@angular/core'; + +import {Open} from './open.component'; + +@Component({ + selector: 'modal-alert', + template: ` + + + + `, + encapsulation: ViewEncapsulation.None, +}) +/** + * API to an open alert window. + */ +export class AlertModal{ + /** + * Caption for the title. + */ + public alertTitle:string; + /** + * Describes if the alert contains Ok Button. + * The default Ok button will close the alert and emit the callback. + * Defaults to true. + */ + public okButton:boolean = true; + /** + * Caption for the OK button. + * Default: Ok + */ + public okButtonText:string= 'Ok'; + /** + * Describes if the alert contains cancel Button. + * The default Cancelbutton will close the alert. + * Defaults to true. + */ + public cancelButton:boolean = true; + /** + * Caption for the Cancel button. + * Default: Cancel + */ + public cancelButtonText:string = 'Cancel'; + /** + * if the alertMessage is true it will show the contentString inside alert body. + */ + public alertMessage:boolean = true; + /** + * Some message/content can be set in message which will be shown in alert body. + */ + public message:string; + /** + * if the value is true alert footer will be visible or else it will be hidden. + */ + public alertFooter:boolean= true; + /** + * shows alert header if the value is true. + */ + public alertHeader:boolean = true; + /** + * if the value is true alert will be visible or else it will be hidden. + */ + public isOpen:boolean=false; + /** + * Emitted when a ok button was clicked + * or when Ok method is called. + */ + @Output() public alertOutput:EventEmitter = new EventEmitter(); + constructor( public _elementRef: ElementRef){} + /** + * Opens a alert window creating backdrop. + */ + open(){ + this.isOpen= true; + } + /** + * ok method closes the modal and emits modalOutput. + */ + ok(){ + this.isOpen = false; + this.alertOutput.emit(true); + } + /** + * cancel method closes the moda. + */ + cancel(){ + this.isOpen = false; + } +} diff --git a/portal-4cli/src/app/utils/modal/alertModal.module.ts b/portal-4cli/src/app/utils/modal/alertModal.module.ts new file mode 100644 index 00000000..d39e168d --- /dev/null +++ b/portal-4cli/src/app/utils/modal/alertModal.module.ts @@ -0,0 +1,17 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import {AlertModal} from './alert'; +import {ModalModule} from './modal.module'; + +@NgModule({ + imports: [ CommonModule, FormsModule, ModalModule ], + declarations: [ + AlertModal + ], + exports: [ + AlertModal + ] +}) +export class AlertModalModule { } diff --git a/portal-4cli/src/app/utils/modal/loading.component.ts b/portal-4cli/src/app/utils/modal/loading.component.ts new file mode 100644 index 00000000..55a5501e --- /dev/null +++ b/portal-4cli/src/app/utils/modal/loading.component.ts @@ -0,0 +1,56 @@ +import {Component, ViewEncapsulation, ComponentRef, ElementRef, Input, EventEmitter, Output} from '@angular/core'; + +@Component({ + selector: 'modal-loading', + template: ` + +
    +
    + + +
    +
    +

    {{message}}

    +
    +
    +
    + +
    + +
    + + `, + encapsulation: ViewEncapsulation.None, +}) +/** + * API to an open alert window. + */ +export class ModalLoading{ + +@Input() public message:string ="Loading"; + + /** + * if the value is true alert will be visible or else it will be hidden. + */ + public isOpen:boolean=false; + /** + * Emitted when a ok button was clicked + * or when Ok method is called. + */ + @Output() public alertOutput:EventEmitter = new EventEmitter(); + constructor( public _elementRef: ElementRef){} + /** + * Opens a alert window creating backdrop. + */ + open(){ + this.isOpen= true; + } + + close(){ + this.isOpen = false; + } +} diff --git a/portal-4cli/src/app/utils/modal/loadingModal.module.ts b/portal-4cli/src/app/utils/modal/loadingModal.module.ts new file mode 100644 index 00000000..6edf5c4a --- /dev/null +++ b/portal-4cli/src/app/utils/modal/loadingModal.module.ts @@ -0,0 +1,19 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + + import {ModalLoading} from './loading.component'; +import {ModalModule} from './modal.module'; + +//helpers + +@NgModule({ + imports: [ CommonModule, FormsModule,ModalModule ], + declarations: [ + ModalLoading + ], + exports: [ + ModalLoading + ] +}) +export class LoadingModalModule { } diff --git a/portal-4cli/src/app/utils/modal/modal.module.ts b/portal-4cli/src/app/utils/modal/modal.module.ts new file mode 100644 index 00000000..fd48478c --- /dev/null +++ b/portal-4cli/src/app/utils/modal/modal.module.ts @@ -0,0 +1,13 @@ +/* common components of modal components */ +import { NgModule } from '@angular/core'; +import {Open} from './open.component'; +@NgModule({ + imports: [ ], + declarations: [ + Open + ], + exports: [ + Open + ] +}) +export class ModalModule { } diff --git a/portal-4cli/src/app/utils/modal/open.component.ts b/portal-4cli/src/app/utils/modal/open.component.ts new file mode 100644 index 00000000..fb9f011e --- /dev/null +++ b/portal-4cli/src/app/utils/modal/open.component.ts @@ -0,0 +1,57 @@ +import {Directive, Input, HostBinding} from '@angular/core'; + +// todo: add animate +// todo: add init and on change +@Directive({selector: '[open]'}) +export class Open { + @HostBinding('style.display') + public display:string; + @HostBinding('class.in') + @HostBinding('attr.aria-expanded') + public isExpanded:boolean = true; + + @Input() + public set open(value:boolean) { + this.isExpanded = value; + this.toggle(); + } + + public get open():boolean { + return this.isExpanded; + } + + constructor() { + } + init() { + this.isExpanded = false; + this.display = 'none'; + } + toggle() { + if (this.isExpanded) { + this.hide(); + } else { + this.show(); + } + } + + hide() { + this.isExpanded = false; + this.display = 'none'; + if (typeof document !== 'undefined') { + let backDrop = document.getElementsByClassName("modal-backdrop"); + if(backDrop.length>0){ + document.body.removeChild(backDrop[0]); + } + } + } + + show() { + if (typeof document !== 'undefined') { + // let backDrop = document.createElement('div'); + // backDrop.className="modal-backdrop fade in"; + // document.body.appendChild(backDrop); + } + this.isExpanded = true; + this.display = 'block'; + } +} diff --git a/portal-4cli/src/app/utils/modal/selectModal.component.ts b/portal-4cli/src/app/utils/modal/selectModal.component.ts new file mode 100644 index 00000000..78330b76 --- /dev/null +++ b/portal-4cli/src/app/utils/modal/selectModal.component.ts @@ -0,0 +1,79 @@ +import {Component, ViewEncapsulation, ComponentRef, ElementRef, Input, EventEmitter, Output} from '@angular/core'; + +@Component({ + selector: 'modal-select', + template: ` +
    +
    + +
    + + `, + encapsulation: ViewEncapsulation.None, +}) +/** + * API to an open alert window. + */ +export class ModalSelect{ + +@Input() public message:string ="Loading"; +@Input() public options:string[] = []; + +public selected: string; + + /** + * if the value is true alert will be visible or else it will be hidden. + */ + public isOpen:boolean=false; + /** + * Emitted when a ok button was clicked + * or when Ok method is called. + */ + @Output() public alertOutput:EventEmitter = new EventEmitter(); + constructor( public _elementRef: ElementRef){} + /** + * Opens a alert window creating backdrop. + */ + open(){ + this.isOpen= true; + } + + close(){ + this.isOpen = false; + if(!this.selected) { + this.selected = this.options[0]; + } + this.alertOutput.emit(this.selected); + } + +} diff --git a/portal-4cli/src/app/utils/modal/selectModal.module.ts b/portal-4cli/src/app/utils/modal/selectModal.module.ts new file mode 100644 index 00000000..971a7dd7 --- /dev/null +++ b/portal-4cli/src/app/utils/modal/selectModal.module.ts @@ -0,0 +1,19 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + + import {ModalSelect} from './selectModal.component'; +import {ModalModule} from './modal.module'; + +//helpers + +@NgModule({ + imports: [ CommonModule, FormsModule,ModalModule ], + declarations: [ + ModalSelect + ], + exports: [ + ModalSelect + ] +}) +export class SelectModalModule { } diff --git a/portal-4cli/src/app/utils/my-date-picker/directives/my-date-picker.focus.directive.ts b/portal-4cli/src/app/utils/my-date-picker/directives/my-date-picker.focus.directive.ts new file mode 100644 index 00000000..5508ea6c --- /dev/null +++ b/portal-4cli/src/app/utils/my-date-picker/directives/my-date-picker.focus.directive.ts @@ -0,0 +1,26 @@ +import { Directive, ElementRef, Renderer, AfterViewInit, Input } from "@angular/core"; + +@Directive({ + selector: "[mydpfocus]" +}) + +export class FocusDirective implements AfterViewInit { + @Input("mydpfocus") value: string; + + constructor(private el: ElementRef, private renderer: Renderer) {} + + // Focus to element: if value 0 = don't set focus, 1 = set only focus, 2 = set focus and set cursor position + ngAfterViewInit() { + if (this.value === "0") { + return; + } + + this.renderer.invokeElementMethod(this.el.nativeElement, "focus", []); + + // Set cursor position at the end of text if input element + if (this.value === "2") { + let len = this.el.nativeElement.value.length; + this.el.nativeElement.setSelectionRange(len, len); + } + } +} \ No newline at end of file diff --git a/portal-4cli/src/app/utils/my-date-picker/directives/my-date-picker.input.auto.fill.directive.ts b/portal-4cli/src/app/utils/my-date-picker/directives/my-date-picker.input.auto.fill.directive.ts new file mode 100644 index 00000000..ef1a1501 --- /dev/null +++ b/portal-4cli/src/app/utils/my-date-picker/directives/my-date-picker.input.auto.fill.directive.ts @@ -0,0 +1,69 @@ +import { Directive, ElementRef, Renderer, Input, HostListener } from "@angular/core"; +import { IMyInputAutoFill } from "../interfaces/my-input-auto-fill.interface"; + +@Directive({ + selector: "[myinputautofill]" +}) + +export class InputAutoFillDirective { + @Input("myinputautofill") opts: IMyInputAutoFill; + + constructor(private el: ElementRef, private rndr: Renderer) {} + + @HostListener("keyup", ["$event"]) onKeyUp(evt: KeyboardEvent) { + if (!this.opts.enabled || evt.keyCode === 8 || evt.keyCode === 46) { + return; + } + + let val: string = this.getInputValue(); + let ews: boolean = this.endsWith(val, this.opts.separator); + let parts: Array = val.split(this.opts.separator); + let idx: number = parts.length - 1; + + if (val.indexOf(this.opts.separator + this.opts.separator) !== -1) { + return; + } + + if (!ews && (val.length === this.getPartLength(0) || val.length === this.getPartLength(0) + this.getPartLength(1) + this.opts.separator.length)) { + this.setInputValue(val + this.opts.separator); + } + else if (ews && parts[idx - 1].length < this.getPartLength(idx - 1) && this.isNumber(parts[idx - 1]) && (this.isDay(idx - 1) || this.isMonth(idx - 1))) { + this.setInputValue(this.insertPos(val, val.length - 2, "0")); + } + else if (parts[idx].length < this.getPartLength(idx) && this.isNumber(parts[idx]) && (Number(parts[idx]) > 3 && this.isDay(idx) || Number(parts[idx]) > 1 && this.isMonth(idx))) { + this.setInputValue(this.insertPos(val, val.length - 1, "0") + (idx < 2 ? this.opts.separator : "")); + } + } + + private endsWith(val: string, suffix: string): boolean { + return val.indexOf(suffix, val.length - suffix.length) !== -1; + } + + private insertPos(str: string, idx: number, val: string): string { + return str.substr(0, idx) + val + str.substr(idx); + } + + private getPartLength(idx: number): number { + return this.opts.formatParts[idx].length; + } + + private isNumber(val: string): boolean { + return val.match(/[1-9]/) !== null; + } + + private isDay(idx: number): boolean { + return this.opts.formatParts[idx].indexOf("d") !== -1; + } + + private isMonth(idx: number): boolean { + return this.opts.formatParts[idx].indexOf("m") !== -1 && this.opts.formatParts[idx].length === 2; + } + + private getInputValue(): string { + return this.el.nativeElement.value; + } + + private setInputValue(val: string): void { + this.rndr.setElementProperty(this.el.nativeElement, "value", val); + } +} \ No newline at end of file diff --git a/portal-4cli/src/app/utils/my-date-picker/index.ts b/portal-4cli/src/app/utils/my-date-picker/index.ts new file mode 100644 index 00000000..55613d2b --- /dev/null +++ b/portal-4cli/src/app/utils/my-date-picker/index.ts @@ -0,0 +1,7 @@ +export * from "./services/my-date-picker.locale.service"; +export * from "./services/my-date-picker.util.service"; +export * from "./directives/my-date-picker.focus.directive"; +export * from "./directives/my-date-picker.input.auto.fill.directive"; +export * from "./my-date-picker.component"; +export * from "./my-date-picker.module"; +export * from "./interfaces/index"; \ No newline at end of file diff --git a/portal-4cli/src/app/utils/my-date-picker/interfaces/index.ts b/portal-4cli/src/app/utils/my-date-picker/interfaces/index.ts new file mode 100644 index 00000000..ab34b252 --- /dev/null +++ b/portal-4cli/src/app/utils/my-date-picker/interfaces/index.ts @@ -0,0 +1,15 @@ +export * from "./my-date.interface"; +export * from "./my-date-range.interface"; +export * from "./my-day-labels.interface"; +export * from "./my-month-labels.interface"; +export * from "./my-month.interface"; +export * from "./my-calendar-day.interface"; +export * from "./my-week.interface"; +export * from "./my-options.interface"; +export * from "./my-locale.interface"; +export * from "./my-date-model.interface"; +export * from "./my-input-field-changed.interface"; +export * from "./my-input-focus-blur.interface"; +export * from "./my-weekday.interface"; +export * from "./my-calendar-view-changed.interface"; +export * from "./my-input-auto-fill.interface"; \ No newline at end of file diff --git a/portal-4cli/src/app/utils/my-date-picker/interfaces/my-calendar-day.interface.ts b/portal-4cli/src/app/utils/my-date-picker/interfaces/my-calendar-day.interface.ts new file mode 100644 index 00000000..d554243a --- /dev/null +++ b/portal-4cli/src/app/utils/my-date-picker/interfaces/my-calendar-day.interface.ts @@ -0,0 +1,9 @@ +import { IMyDate } from "./my-date.interface"; + +export interface IMyCalendarDay { + dateObj: IMyDate; + cmo: number; + currDay: boolean; + dayNbr: number; + disabled: boolean; +} \ No newline at end of file diff --git a/portal-4cli/src/app/utils/my-date-picker/interfaces/my-calendar-view-changed.interface.ts b/portal-4cli/src/app/utils/my-date-picker/interfaces/my-calendar-view-changed.interface.ts new file mode 100644 index 00000000..9b9baa5e --- /dev/null +++ b/portal-4cli/src/app/utils/my-date-picker/interfaces/my-calendar-view-changed.interface.ts @@ -0,0 +1,8 @@ +import { IMyWeekday } from "./my-weekday.interface"; + +export interface IMyCalendarViewChanged { + year: number; + month: number; + first: IMyWeekday; + last: IMyWeekday; +} diff --git a/portal-4cli/src/app/utils/my-date-picker/interfaces/my-date-model.interface.ts b/portal-4cli/src/app/utils/my-date-picker/interfaces/my-date-model.interface.ts new file mode 100644 index 00000000..35aa7535 --- /dev/null +++ b/portal-4cli/src/app/utils/my-date-picker/interfaces/my-date-model.interface.ts @@ -0,0 +1,8 @@ +import { IMyDate } from "./my-date.interface"; + +export interface IMyDateModel { + date: IMyDate; + jsdate: Date; + formatted: string; + epoc: number; +} diff --git a/portal-4cli/src/app/utils/my-date-picker/interfaces/my-date-range.interface.ts b/portal-4cli/src/app/utils/my-date-picker/interfaces/my-date-range.interface.ts new file mode 100644 index 00000000..e24b319b --- /dev/null +++ b/portal-4cli/src/app/utils/my-date-picker/interfaces/my-date-range.interface.ts @@ -0,0 +1,6 @@ +import { IMyDate } from "./my-date.interface"; + +export interface IMyDateRange { + begin: IMyDate; + end: IMyDate; +} diff --git a/portal-4cli/src/app/utils/my-date-picker/interfaces/my-date.interface.ts b/portal-4cli/src/app/utils/my-date-picker/interfaces/my-date.interface.ts new file mode 100644 index 00000000..99f00796 --- /dev/null +++ b/portal-4cli/src/app/utils/my-date-picker/interfaces/my-date.interface.ts @@ -0,0 +1,5 @@ +export interface IMyDate { + year: number; + month: number; + day: number; +} diff --git a/portal-4cli/src/app/utils/my-date-picker/interfaces/my-day-labels.interface.ts b/portal-4cli/src/app/utils/my-date-picker/interfaces/my-day-labels.interface.ts new file mode 100644 index 00000000..f2fcfa24 --- /dev/null +++ b/portal-4cli/src/app/utils/my-date-picker/interfaces/my-day-labels.interface.ts @@ -0,0 +1,3 @@ +export interface IMyDayLabels { + [day: string]: string; +} \ No newline at end of file diff --git a/portal-4cli/src/app/utils/my-date-picker/interfaces/my-input-auto-fill.interface.ts b/portal-4cli/src/app/utils/my-date-picker/interfaces/my-input-auto-fill.interface.ts new file mode 100644 index 00000000..695afa92 --- /dev/null +++ b/portal-4cli/src/app/utils/my-date-picker/interfaces/my-input-auto-fill.interface.ts @@ -0,0 +1,5 @@ +export interface IMyInputAutoFill { + separator: string; + formatParts: Array; + enabled: boolean; +} diff --git a/portal-4cli/src/app/utils/my-date-picker/interfaces/my-input-field-changed.interface.ts b/portal-4cli/src/app/utils/my-date-picker/interfaces/my-input-field-changed.interface.ts new file mode 100644 index 00000000..c93530b6 --- /dev/null +++ b/portal-4cli/src/app/utils/my-date-picker/interfaces/my-input-field-changed.interface.ts @@ -0,0 +1,5 @@ +export interface IMyInputFieldChanged { + value: string; + dateFormat: string; + valid: boolean; +} diff --git a/portal-4cli/src/app/utils/my-date-picker/interfaces/my-input-focus-blur.interface.ts b/portal-4cli/src/app/utils/my-date-picker/interfaces/my-input-focus-blur.interface.ts new file mode 100644 index 00000000..99678cbb --- /dev/null +++ b/portal-4cli/src/app/utils/my-date-picker/interfaces/my-input-focus-blur.interface.ts @@ -0,0 +1,4 @@ +export interface IMyInputFocusBlur { + reason: number; + value: string; +} diff --git a/portal-4cli/src/app/utils/my-date-picker/interfaces/my-locale.interface.ts b/portal-4cli/src/app/utils/my-date-picker/interfaces/my-locale.interface.ts new file mode 100644 index 00000000..25d268ba --- /dev/null +++ b/portal-4cli/src/app/utils/my-date-picker/interfaces/my-locale.interface.ts @@ -0,0 +1,5 @@ +import { IMyOptions } from "./my-options.interface"; + +export interface IMyLocales { + [lang: string]: IMyOptions; +} \ No newline at end of file diff --git a/portal-4cli/src/app/utils/my-date-picker/interfaces/my-month-labels.interface.ts b/portal-4cli/src/app/utils/my-date-picker/interfaces/my-month-labels.interface.ts new file mode 100644 index 00000000..0eede49b --- /dev/null +++ b/portal-4cli/src/app/utils/my-date-picker/interfaces/my-month-labels.interface.ts @@ -0,0 +1,3 @@ +export interface IMyMonthLabels { + [month: number]: string; +} \ No newline at end of file diff --git a/portal-4cli/src/app/utils/my-date-picker/interfaces/my-month.interface.ts b/portal-4cli/src/app/utils/my-date-picker/interfaces/my-month.interface.ts new file mode 100644 index 00000000..846a23eb --- /dev/null +++ b/portal-4cli/src/app/utils/my-date-picker/interfaces/my-month.interface.ts @@ -0,0 +1,5 @@ +export interface IMyMonth { + monthTxt: string; + monthNbr: number; + year: number; +} \ No newline at end of file diff --git a/portal-4cli/src/app/utils/my-date-picker/interfaces/my-options.interface.ts b/portal-4cli/src/app/utils/my-date-picker/interfaces/my-options.interface.ts new file mode 100644 index 00000000..89c26bea --- /dev/null +++ b/portal-4cli/src/app/utils/my-date-picker/interfaces/my-options.interface.ts @@ -0,0 +1,48 @@ +import { IMyDayLabels } from "./my-day-labels.interface"; +import { IMyMonthLabels } from "./my-month-labels.interface"; +import { IMyDate } from "./my-date.interface"; +import { IMyDateRange } from "./my-date-range.interface"; + +export interface IMyOptions { + dayLabels?: IMyDayLabels; + monthLabels?: IMyMonthLabels; + dateFormat?: string; + showTodayBtn?: boolean; + todayBtnTxt?: string; + firstDayOfWeek?: string; + sunHighlight?: boolean; + markCurrentDay?: boolean; + disableUntil?: IMyDate; + disableSince?: IMyDate; + disableDays?: Array; + enableDays?: Array; + disableDateRange?: IMyDateRange; + disableWeekends?: boolean; + showWeekNumbers?: boolean; + height?: string; + width?: string; + selectionTxtFontSize?: string; + inline?: boolean; + showClearDateBtn?: boolean; + alignSelectorRight?: boolean; + openSelectorTopOfInput?: boolean; + indicateInvalidDate?: boolean; + editableDateField?: boolean; + editableMonthAndYear?: boolean; + disableHeaderButtons?: boolean; + minYear?: number; + maxYear?: number; + componentDisabled?: boolean; + inputValueRequired?: boolean; + showSelectorArrow?: boolean; + showInputField?: boolean; + openSelectorOnInputClick?: boolean; + inputAutoFill?: boolean; + ariaLabelInputField?: string; + ariaLabelClearDate?: string; + ariaLabelOpenCalendar?: string; + ariaLabelPrevMonth?: string; + ariaLabelNextMonth?: string; + ariaLabelPrevYear?: string; + ariaLabelNextYear?: string; +} diff --git a/portal-4cli/src/app/utils/my-date-picker/interfaces/my-week.interface.ts b/portal-4cli/src/app/utils/my-date-picker/interfaces/my-week.interface.ts new file mode 100644 index 00000000..be7bca16 --- /dev/null +++ b/portal-4cli/src/app/utils/my-date-picker/interfaces/my-week.interface.ts @@ -0,0 +1,6 @@ +import { IMyCalendarDay } from "./my-calendar-day.interface"; + +export interface IMyWeek { + week: Array; + weekNbr: number; +} \ No newline at end of file diff --git a/portal-4cli/src/app/utils/my-date-picker/interfaces/my-weekday.interface.ts b/portal-4cli/src/app/utils/my-date-picker/interfaces/my-weekday.interface.ts new file mode 100644 index 00000000..da1df557 --- /dev/null +++ b/portal-4cli/src/app/utils/my-date-picker/interfaces/my-weekday.interface.ts @@ -0,0 +1,4 @@ +export interface IMyWeekday { + number: number; + weekday: string; +} diff --git a/portal-4cli/src/app/utils/my-date-picker/my-date-picker.component.css b/portal-4cli/src/app/utils/my-date-picker/my-date-picker.component.css new file mode 100644 index 00000000..3c21416d --- /dev/null +++ b/portal-4cli/src/app/utils/my-date-picker/my-date-picker.component.css @@ -0,0 +1,461 @@ +.mydp { + min-width: 30px; + border-radius: 2px; + line-height: 1.1; + display: inline-block; + position: relative; +} + +.mydp * { + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; + font-family: Arial, Helvetica, sans-serif; + padding: 0; + margin: 0; +} + +.mydp .selector { + margin-top: 2px; + margin-left: -1px; + position: absolute; + width: 252px; + padding: 0; + border: 1px solid #CCC; + border-radius: 2px; + z-index: 100; + animation: selectorfadein 0.1s; +} + +.mydp .selector:focus { + border: 1px solid #ADD8E6; + outline: none; +} + +@keyframes selectorfadein { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +.mydp .selectorarrow { + background: #FAFAFA; + margin-top: 12px; + padding: 0; +} + +.mydp .selectorarrow:after, +.mydp .selectorarrow:before { + bottom: 100%; + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +.mydp .selectorarrow:after { + border-color: rgba(250, 250, 250, 0); + border-bottom-color: #FAFAFA; + border-width: 10px; + margin-left: -10px; +} + +.mydp .selectorarrow:before { + border-color: rgba(204, 204, 204, 0); + border-bottom-color: #CCC; + border-width: 11px; + margin-left: -11px; +} + +.mydp .selectorarrow:focus:before { + border-bottom-color: #ADD8E6; +} + +.mydp .selectorarrowleft:after, +.mydp .selectorarrowleft:before { + left: 24px; +} + +.mydp .selectorarrowright:after, +.mydp .selectorarrowright:before { + left: 224px; +} + +.mydp .alignselectorright { + right: -1px; +} + +.mydp .selectiongroup { + position: relative; + display: table; + border: none; + border-spacing: 0; + background-color: #FFF; +} + +.mydp .selection { + outline: none; + background-color: #FFF; + display: table-cell; + position: absolute; + width: 100%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + text-align: center; +} + +.mydp .invaliddate, +.mydp .invalidmonth, +.mydp .invalidyear { + background-color: #F1DEDE; +} + +.mydp ::-ms-clear { + display: none; +} + +.mydp .selbtngroup { + position: relative; + vertical-align: middle; + white-space: nowrap; + width: 1%; + display: table-cell; + font-size: 0; +} + +.mydp .btnpicker, +.mydp .btnclear { + height: 100%; + width: 30px; + border: none; + padding: 0; + outline: 0; + font: inherit; + -moz-user-select: none; +} + +.mydp .btnleftborder { + border-left: 1px solid #CCC; +} + +.mydp .btnpickerenabled, +.mydp .btnclearenabled, +.mydp .headertodaybtnenabled, +.mydp .headerbtnenabled { + cursor: pointer; +} + +.mydp .btnpickerdisabled, +.mydp .btncleardisabled, +.mydp .headertodaybtndisabled, +.mydp .headerbtndisabled { + cursor: not-allowed; +} + +.mydp .headerbtndisabled { + opacity: 0.4; +} + +.mydp .btnpicker, +.mydp .btnclear, +.mydp .headertodaybtn { + background: #FFF; +} + +.mydp .header { + width: 100%; + height: 30px; + background-color: #FAFAFA; +} + +.mydp .header td { + vertical-align: middle; + border: none; + line-height: 0; +} + +.mydp .header td:nth-child(1) { + padding-left: 4px; +} + +.mydp .header td:nth-child(2) { + text-align: center; +} + +.mydp .header td:nth-child(3) { + padding-right: 4px; +} + +.mydp .caltable { + table-layout: fixed; + width: 100%; + background-color: #FFF; + font-size: 14px; +} + +.mydp .caltable, +.mydp .weekdaytitle, +.mydp .daycell { + border-collapse: collapse; + color: #003366; + line-height: 1.1; +} + +.mydp .weekdaytitle, +.mydp .daycell { + padding: 5px; + text-align: center; +} + +.mydp .weekdaytitle { + background-color: #DDD; + font-size: 12px; + font-weight: bold; + vertical-align: middle; + max-width: 36px; + overflow: hidden; + white-space: nowrap; +} + +.mydp .weekdaytitleweeknbr { + width: 20px; + border-right: 1px solid #BBB; +} + +.mydp .daycell { + cursor: pointer; + height: 30px; +} + +.mydp .daycell div { + background-color: inherit; + vertical-align: middle; +} + +.mydp .daycell div span { + vertical-align: middle; +} + +.mydp .daycellweeknbr { + font-size: 10px; + border-right: 1px solid #CCC; + cursor: default; + color: #000; +} + +.mydp .inlinedp { + position: relative; + margin-top: -1px; +} + +.mydp .prevmonth { + color: #CCC; +} + +.mydp .nextmonth { + color: #CCC; +} + +.mydp .disabled { + cursor: default !important; + color: #CCC !important; + background: #FBEFEF !important; +} + +.mydp .sunday { + color: #C30000; +} + +.mydp .sundayDim { + opacity: 0.5; +} + +.mydp .currmonth { + background-color: #F6F6F6; + font-weight: bold; +} + +.mydp .currday { + text-decoration: underline; +} + +.mydp .selectedday div { + border: 1px solid #004198; + background-color: #8EBFFF !important; + border-radius: 2px; +} + +.mydp .headerbtncell { + background-color: #FAFAFA; + display: table-cell; + vertical-align: middle; +} + +.mydp .headerbtn, +.mydp .headerlabelbtn { + background: #FAFAFA; + border: none; + height: 22px; +} + +.mydp .headerbtn { + width: 16px; +} + +.mydp .headerlabelbtn { + font-size: 14px; +} + +.mydp, +.mydp .headertodaybtn, +.mydp .monthinput, +.mydp .yearinput { + border: 1px solid #CCC; +} + +.mydp .btnpicker, +.mydp .btnclear, +.mydp .headerbtn, +.mydp .headermonthtxt, +.mydp .headeryeartxt, +.mydp .headertodaybtn, +.mydp .selection { + color: #000; +} + +.mydp .headertodaybtn { + padding: 0 4px; + border-radius: 2px; + font-size: 11px; + height: 22px; + min-width: 60px; + max-width: 70px; + overflow: hidden; + white-space: nowrap; +} + +.mydp button::-moz-focus-inner { + border: 0; +} + +.mydp .headermonthtxt, +.mydp .headeryeartxt { + text-align: center; + display: table-cell; + vertical-align: middle; + font-size: 14px; + height: 26px; + width: 40px; + max-width: 40px; + overflow: hidden; + white-space: nowrap; +} + +.mydp .btnclear:focus, +.mydp .btnpicker:focus, +.mydp .headertodaybtn:focus { + background: #ADD8E6; +} + +.mydp .headerbtn:focus, +.mydp .monthlabel:focus, +.mydp .yearlabel:focus { + color: #ADD8E6; + outline: none; +} + +.mydp .daycell:focus { + outline: 1px solid #CCC; +} + +.mydp .icon-mydpcalendar, +.mydp .icon-mydpremove { + font-size: 16px; +} + +.mydp .icon-mydpleft, +.mydp .icon-mydpright { + color: #222; + font-size: 20px; +} + +.mydp table { + display: table; + border-spacing: 0; +} + +.mydp table td { + padding: 0; +} + +.mydp table, +.mydp th, +.mydp td { + border: none; +} + +.mydp .btnpickerenabled:hover, +.mydp .btnclearenabled:hover, +.mydp .headertodaybtnenabled:hover, +.mydp .tablesingleday:hover { + background-color: #8BDAF4; +} + +.mydp .monthlabel, +.mydp .yearlabel { + cursor: pointer; +} + +.mydp .yearinput, +.mydp .monthinput { + width: 40px; + height: 22px; + text-align: center; + font-weight: bold; + outline: none; + border-radius: 2px; +} + +.mydp .headerbtnenabled:hover, +.mydp .monthlabel:hover, +.mydp .yearlabel:hover { + color: #8BDAF4; +} + +@font-face { + font-family: 'mydatepicker'; + src: url('data:application/octet-stream;base64,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') format('truetype'); + font-weight: normal; + font-style: normal; +} + +.mydp .mydpicon { + font-family: 'mydatepicker'; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.mydp .icon-mydpright:before { + content: "\e800"; +} + +.mydp .icon-mydpleft:before { + content: "\e801"; +} + +.mydp .icon-mydpcalendar:before { + content: "\e802"; +} + +.mydp .icon-mydpremove:before { + content: "\e805"; +} diff --git a/portal-4cli/src/app/utils/my-date-picker/my-date-picker.component.html b/portal-4cli/src/app/utils/my-date-picker/my-date-picker.component.html new file mode 100644 index 00000000..9b7280e0 --- /dev/null +++ b/portal-4cli/src/app/utils/my-date-picker/my-date-picker.component.html @@ -0,0 +1,61 @@ +
    +
    + +
    + + +
    +
    +
    + + + + + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    + + +
    +
    +
    +
    + + + + + + + + +
    #{{d}}
    {{w.weekNbr}} +
    + {{d.dateObj.day}} +
    +
    +
    +
    diff --git a/portal-4cli/src/app/utils/my-date-picker/my-date-picker.component.spec.ts b/portal-4cli/src/app/utils/my-date-picker/my-date-picker.component.spec.ts new file mode 100644 index 00000000..83801d58 --- /dev/null +++ b/portal-4cli/src/app/utils/my-date-picker/my-date-picker.component.spec.ts @@ -0,0 +1,2209 @@ +// // +// +// import {ComponentFixture, TestBed} from '@angular/core/testing'; +// import {By} from '@angular/platform-browser'; +// import {DebugElement} from '@angular/core'; +// import {MyDatePicker} from './my-date-picker.component'; +// import {FocusDirective} from './directives/my-date-picker.focus.directive'; +// import {InputAutoFillDirective} from './directives/my-date-picker.input.auto.fill.directive'; +// +// let comp: MyDatePicker; +// let fixture: ComponentFixture; +// let de: DebugElement; +// let el: HTMLElement; +// +// let PREVMONTH: string = '.header tr td:first-child div .headerbtncell:first-child .headerbtn'; +// let NEXTMONTH: string = '.header tr td:first-child div .headerbtncell:last-child .headerbtn'; +// let PREVYEAR: string = '.header tr td:last-child div .headerbtncell:first-child .headerbtn'; +// let NEXTYEAR: string = '.header tr td:last-child div .headerbtncell:last-child .headerbtn'; +// +// function getDateString(date:any):string { +// return date.getFullYear() + '-' + ((date.getMonth() + 1) < 10 ? '0' + (date.getMonth() + 1) : (date.getMonth() + 1)) + '-' + (date.getDate() < 10 ? '0' + date.getDate() : date.getDate()); +// } +// +// function getElement(id:string):DebugElement { +// return de.query(By.css(id)); +// } +// +// function getElements(id:string):Array { +// return de.queryAll(By.css(id)); +// } +// +// describe('MyDatePicker', () => { +// beforeEach(() => { +// TestBed.configureTestingModule({ +// declarations: [MyDatePicker, FocusDirective, InputAutoFillDirective], +// }); +// +// fixture = TestBed.createComponent(MyDatePicker); +// +// comp = fixture.componentInstance; +// +// de = fixture.debugElement.query(By.css('.mydp')); +// el = de.nativeElement; +// }); +// +// it('set valid date', () => { +// comp.selectionDayTxt = '2016-08-22'; +// fixture.detectChanges(); +// let selection = getElement('.selection'); +// expect(selection.nativeElement.value).toContain('2016-08-22'); +// }); +// +// it('open/close selector', () => { +// fixture.detectChanges(); +// let btnpicker = getElement('.btnpicker'); +// let selector = getElement('.selector'); +// expect(selector).toBe(null); +// +// btnpicker.nativeElement.click(); +// fixture.detectChanges(); +// selector = getElement('.selector'); +// expect(selector).not.toBe(null); +// +// btnpicker.nativeElement.click(); +// fixture.detectChanges(); +// selector = getElement('.selector'); +// expect(selector).toBe(null); +// }); +// +// it('select current day from the selector and clear', () => { +// let date = new Date(); +// comp.selectedMonth = {monthTxt: '', monthNbr: date.getMonth() + 1, year: date.getFullYear()}; +// +// fixture.detectChanges(); +// let btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// fixture.detectChanges(); +// let currday = getElement('.currday'); +// expect(currday).not.toBe(null); +// +// currday.nativeElement.click(); +// +// let dateStr = getDateString(date); +// fixture.detectChanges(); +// let selection = getElement('.selection'); +// expect(selection.nativeElement.value).toContain(dateStr); +// +// fixture.detectChanges(); +// let btnclear = getElement('.btnclear'); +// btnclear.nativeElement.click(); +// expect(selection.nativeElement.value).toContain(''); +// }); +// +// it('select/unselect current day from the selector', () => { +// let date = new Date(); +// comp.selectedMonth = {monthTxt: '', monthNbr: date.getMonth() + 1, year: date.getFullYear()}; +// +// fixture.detectChanges(); +// let btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// fixture.detectChanges(); +// let currday = getElement('.currday'); +// expect(currday).not.toBe(null); +// +// currday.nativeElement.click(); +// +// let dateStr = getDateString(date); +// fixture.detectChanges(); +// let selection = getElement('.selection'); +// expect(selection.nativeElement.value).toContain(dateStr); +// +// fixture.detectChanges(); +// btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// +// fixture.detectChanges(); +// let selectedday = getElement('.selectedday'); +// expect(selectedday).not.toBe(null); +// +// fixture.detectChanges(); +// currday = getElement('.currday'); +// expect(currday).not.toBe(null); +// currday.nativeElement.click(); +// +// fixture.detectChanges(); +// selectedday = getElement('.selectedday'); +// expect(selectedday).toBe(null); +// +// fixture.detectChanges(); +// selection = getElement('.selection'); +// expect(selection.nativeElement.value).toBe(''); +// }); +// +// it('select today button', () => { +// let date = new Date(); +// +// fixture.detectChanges(); +// let btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// fixture.detectChanges(); +// let today = getElement('.headertodaybtn'); +// expect(today).not.toBe(null); +// +// today.nativeElement.click(); +// +// let dateStr = getDateString(date); +// fixture.detectChanges(); +// let selection = getElement('.selection'); +// expect(selection.nativeElement.value).toContain(dateStr); +// +// fixture.detectChanges(); +// let btnclear = getElement('.btnclear'); +// btnclear.nativeElement.click(); +// expect(selection.nativeElement.value).toContain(''); +// }); +// +// it('select previous month', () => { +// comp.selectedMonth = {monthTxt: '', monthNbr: 5, year: 2016}; +// +// fixture.detectChanges(); +// let btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// fixture.detectChanges(); +// let prevmonth = getElement('.header tr td:first-child .headerbtn:first-child'); +// expect(prevmonth).not.toBe(null); +// +// prevmonth.nativeElement.click(); +// +// expect(comp.visibleMonth.monthTxt).toBe('Apr'); +// expect(comp.visibleMonth.monthNbr).toBe(4); +// expect(comp.visibleMonth.year).toBe(2016); +// }); +// +// it('select next month', () => { +// comp.selectedMonth = {monthTxt: '', monthNbr: 5, year: 2016}; +// +// fixture.detectChanges(); +// let btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// fixture.detectChanges(); +// let nextmonth = getElement(NEXTMONTH); +// expect(nextmonth).not.toBe(null); +// +// nextmonth.nativeElement.click(); +// +// expect(comp.visibleMonth.monthTxt).toBe('Jun'); +// expect(comp.visibleMonth.monthNbr).toBe(6); +// expect(comp.visibleMonth.year).toBe(2016); +// }); +// +// it('select previous month january change year', () => { +// comp.selectedMonth = {monthTxt: '', monthNbr: 1, year: 2016}; +// +// fixture.detectChanges(); +// let btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// fixture.detectChanges(); +// let prevmonth = getElement(PREVMONTH); +// expect(prevmonth).not.toBe(null); +// +// prevmonth.nativeElement.click(); +// +// expect(comp.visibleMonth.year).toBe(2015); +// }); +// +// it('select next month december change year', () => { +// comp.selectedMonth = {monthTxt: '', monthNbr: 12, year: 2016}; +// +// fixture.detectChanges(); +// let btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// fixture.detectChanges(); +// let nextmonth = getElement(NEXTMONTH); +// expect(nextmonth).not.toBe(null); +// +// nextmonth.nativeElement.click(); +// +// expect(comp.visibleMonth.year).toBe(2017); +// }); +// +// it('select previous month from selector', () => { +// comp.selectedMonth = {monthTxt: '', monthNbr: 5, year: 2016}; +// +// fixture.detectChanges(); +// let btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// comp.parseOptions(); +// +// fixture.detectChanges(); +// let prevmonth = getElement(PREVMONTH); +// expect(prevmonth).not.toBe(null); +// +// prevmonth.nativeElement.click(); +// expect(comp.visibleMonth.monthNbr).toBe(4); +// expect(comp.visibleMonth.monthTxt).toBe('Apr'); +// +// prevmonth.nativeElement.click(); +// expect(comp.visibleMonth.monthNbr).toBe(3); +// expect(comp.visibleMonth.monthTxt).toBe('Mar'); +// }); +// +// it('select next month from selector', () => { +// comp.selectedMonth = {monthTxt: '', monthNbr: 5, year: 2016}; +// +// fixture.detectChanges(); +// let btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// comp.parseOptions(); +// +// fixture.detectChanges(); +// let nextmonth = getElement(NEXTMONTH); +// expect(nextmonth).not.toBe(null); +// +// nextmonth.nativeElement.click(); +// expect(comp.visibleMonth.monthNbr).toBe(6); +// expect(comp.visibleMonth.monthTxt).toBe('Jun'); +// +// nextmonth.nativeElement.click(); +// expect(comp.visibleMonth.monthNbr).toBe(7); +// expect(comp.visibleMonth.monthTxt).toBe('Jul'); +// }); +// +// it('select previous year', () => { +// comp.selectedMonth = {monthTxt: '', monthNbr: 5, year: 2016}; +// +// fixture.detectChanges(); +// let btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// comp.parseOptions(); +// +// fixture.detectChanges(); +// let prevyear = getElement(PREVYEAR); +// expect(prevyear).not.toBe(null); +// +// prevyear.nativeElement.click(); +// fixture.detectChanges(); +// let yearLabel = getElement('.headeryeartxt .headerlabelbtn'); +// expect(yearLabel).not.toBe(null); +// expect(yearLabel.nativeElement.textContent).toBe('2015'); +// }); +// +// it('select next year', () => { +// comp.selectedMonth = {monthTxt: '', monthNbr: 5, year: 2016}; +// +// fixture.detectChanges(); +// let btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// comp.parseOptions(); +// +// fixture.detectChanges(); +// let nextyear = getElement(NEXTYEAR); +// expect(nextyear).not.toBe(null); +// +// nextyear.nativeElement.click(); +// +// fixture.detectChanges(); +// let yearLabel = getElement('.headeryeartxt .headerlabelbtn'); +// expect(yearLabel).not.toBe(null); +// expect(yearLabel.nativeElement.textContent).toBe('2017'); +// }); +// +// it('test calendar year 2016 month one by one - next month button', () => { +// comp.selectedMonth = {monthTxt: '', monthNbr: 1, year: 2016}; +// +// comp.options = {firstDayOfWeek: 'mo'}; +// +// comp.parseOptions(); +// +// fixture.detectChanges(); +// let btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// fixture.detectChanges(); +// let monthlabel = getElement('.monthlabel'); +// expect(monthlabel).not.toBe(null); +// expect(monthlabel.nativeElement.textContent.trim()).toBe('Jan'); +// +// fixture.detectChanges(); +// let yearlabel = getElement('.yearlabel'); +// expect(yearlabel).not.toBe(null); +// expect(yearlabel.nativeElement.textContent.trim()).toBe('2016'); +// +// comp.generateCalendar(1, 2016, true); +// +// let beginDate: Array = ['28', '1', '29', '28', '25', '30', '27', '1', '29', '26', '31', '28']; +// let endDate: Array = ['7', '13', '10', '8', '5', '10', '7', '11', '9', '6', '11', '8']; +// +// let i: number = 0; +// do { +// fixture.detectChanges(); +// let currmonth = getElements('.caltable tbody tr td'); +// expect(currmonth).not.toBe(null); +// expect(currmonth.length).toBe(42); +// +// expect(currmonth[0]).not.toBe(null); +// expect(currmonth[0].nativeElement.textContent.trim()).toBe(beginDate[i]); +// +// expect(currmonth[41]).not.toBe(null); +// expect(currmonth[41].nativeElement.textContent.trim()).toBe(endDate[i]); +// +// comp.nextMonth(); +// +// i++; +// } while (i < 12) +// }); +// +// it('test calendar year 2016 month one by one - previous month button', () => { +// comp.selectedMonth = {monthTxt: '', monthNbr: 12, year: 2016}; +// +// comp.options = {firstDayOfWeek: 'mo'}; +// +// comp.parseOptions(); +// +// fixture.detectChanges(); +// let btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// fixture.detectChanges(); +// let monthlabel = getElement('.monthlabel'); +// expect(monthlabel).not.toBe(null); +// expect(monthlabel.nativeElement.textContent.trim()).toBe('Dec'); +// +// fixture.detectChanges(); +// let yearlabel = getElement('.yearlabel'); +// expect(yearlabel).not.toBe(null); +// expect(yearlabel.nativeElement.textContent.trim()).toBe('2016'); +// +// comp.generateCalendar(12, 2016, true); +// +// let beginDate: Array = ['28', '1', '29', '28', '25', '30', '27', '1', '29', '26', '31', '28']; +// let endDate: Array = ['7', '13', '10', '8', '5', '10', '7', '11', '9', '6', '11', '8']; +// +// let i: number = 11; +// do { +// fixture.detectChanges(); +// let currmonth = getElements('.caltable tbody tr td'); +// expect(currmonth).not.toBe(null); +// expect(currmonth.length).toBe(42); +// +// expect(currmonth[0]).not.toBe(null); +// expect(currmonth[0].nativeElement.textContent.trim()).toBe(beginDate[i]); +// +// expect(currmonth[41]).not.toBe(null); +// expect(currmonth[41].nativeElement.textContent.trim()).toBe(endDate[i]); +// +// comp.prevMonth(); +// +// i--; +// } while (i >= 0) +// }); +// +// // options +// it('options - dayLabels', () => { +// comp.selectedMonth = {monthTxt: '', monthNbr: 5, year: 2016}; +// comp.options = {dayLabels: {su: '1', mo: '2', tu: '3', we: '4', th: '5', fr: '6', sa: '7'}, firstDayOfWeek: 'su'}; +// +// comp.parseOptions(); +// +// fixture.detectChanges(); +// let btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// fixture.detectChanges(); +// let ths = getElements('.caltable thead tr th'); +// expect(ths.length).toBe(7); +// for(let i in ths) { +// let el = ths[i]; +// expect(parseInt(el.nativeElement.textContent)).toBe(parseInt(i) + 1); +// } +// }); +// +// it('options - monthLabels', () => { +// comp.selectedMonth = {monthTxt: '', monthNbr: 1, year: 2016}; +// comp.options = {monthLabels: { 1: '1', 2: '2', 3: '3', 4: '4', 5: '5', 6: '6', 7: '7', 8: '8', 9: '9', 10: '10', 11: '11', 12: '12' }}; +// +// comp.parseOptions(); +// +// fixture.detectChanges(); +// let btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// fixture.detectChanges(); +// let nextmonth = getElement(NEXTMONTH); +// expect(nextmonth).not.toBe(null); +// +// for(let i = 1; i <= 12; i++) { +// fixture.detectChanges(); +// let monthLabel = getElement('.headermonthtxt .headerlabelbtn'); +// expect(parseInt(monthLabel.nativeElement.textContent)).toBe(i); +// nextmonth.nativeElement.click(); +// } +// }); +// +// it('options - date format', () => { +// comp.options = {dateFormat: 'dd.mm.yyyy', indicateInvalidDate: true}; +// +// comp.parseOptions(); +// +// let value = {target:{value:'2016-08-22'}}; +// comp.userDateInput(value); +// expect(comp.invalidDate).toBe(true); +// +// fixture.detectChanges(); +// let invaliddate = getElement('.invaliddate'); +// expect(invaliddate).not.toBe(null); +// +// value = {target:{value:'2016-08-2'}}; +// comp.userDateInput(value); +// expect(comp.invalidDate).toBe(true); +// +// value = {target:{value:'16.09/2016'}}; +// comp.userDateInput(value); +// expect(comp.invalidDate).toBe(true); +// +// value = {target:{value:'2016-08-xx'}}; +// comp.userDateInput(value); +// expect(comp.invalidDate).toBe(true); +// +// value = {target:{value:'16.09.999'}}; +// comp.userDateInput(value); +// expect(comp.invalidDate).toBe(true); +// +// value = {target:{value:'16.09.19999'}}; +// comp.userDateInput(value); +// expect(comp.invalidDate).toBe(true); +// +// value = {target:{value:'16.09.2016'}}; +// comp.userDateInput(value); +// expect(comp.invalidDate).toBe(false); +// +// comp.options = {dateFormat: 'dd mmm yyyy', indicateInvalidDate: true}; +// +// comp.parseOptions(); +// +// value = {target:{value:'2016-08-22'}}; +// comp.userDateInput(value); +// expect(comp.invalidDate).toBe(true); +// +// value = {target:{value:'22 Aug 2016'}}; +// comp.userDateInput(value); +// expect(comp.invalidDate).toBe(false); +// }); +// +// it('options - show today button', () => { +// comp.selectedMonth = {monthTxt: '', monthNbr: 1, year: 2016}; +// +// comp.parseOptions(); +// +// fixture.detectChanges(); +// let btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// fixture.detectChanges(); +// let headertodaybtn = getElement('.headertodaybtn'); +// expect(headertodaybtn).not.toBe(null); +// +// btnpicker.nativeElement.click(); +// +// comp.options = {showTodayBtn: false}; +// comp.parseOptions(); +// +// fixture.detectChanges(); +// btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// fixture.detectChanges(); +// headertodaybtn = getElement('.headertodaybtn'); +// expect(headertodaybtn).toBe(null); +// +// btnpicker.nativeElement.click(); +// +// comp.options = {showTodayBtn: true}; +// comp.parseOptions(); +// +// fixture.detectChanges(); +// btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// fixture.detectChanges(); +// headertodaybtn = getElement('.headertodaybtn'); +// expect(headertodaybtn).not.toBe(null); +// }); +// +// it('options - today button text', () => { +// comp.selectedMonth = {monthTxt: '', monthNbr: 1, year: 2016}; +// comp.options = {todayBtnTxt: 'test text'}; +// +// comp.parseOptions(); +// +// fixture.detectChanges(); +// let btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// fixture.detectChanges(); +// let headertodaybtn = getElement('.headertodaybtn'); +// expect(headertodaybtn).not.toBe(null); +// expect(headertodaybtn.nativeElement.textContent).toBe('test text'); +// }); +// +// it('options - first day of week', () => { +// comp.selectedMonth = {monthTxt: '', monthNbr: 5, year: 2016}; +// comp.options = {firstDayOfWeek: 'tu'}; +// +// comp.parseOptions(); +// +// fixture.detectChanges(); +// let btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// fixture.detectChanges(); +// let first = getElement('.caltable thead tr th:first-child'); +// expect(first).not.toBe(null); +// expect(first.nativeElement.textContent).toBe('Tue'); +// +// let last = getElement('.caltable thead tr th:last-child'); +// expect(last).not.toBe(null); +// expect(last.nativeElement.textContent).toBe('Mon'); +// }); +// +// it('options - sunday highlight', () => { +// comp.selectedMonth = {monthTxt: '', monthNbr: 5, year: 2016}; +// comp.options = {sunHighlight: true}; +// +// comp.parseOptions(); +// +// fixture.detectChanges(); +// let btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// fixture.detectChanges(); +// let sunday = getElement('.sunday'); +// expect(sunday).not.toBe(null); +// +// btnpicker.nativeElement.click(); +// +// comp.options = {sunHighlight: false}; +// +// comp.parseOptions(); +// +// fixture.detectChanges(); +// btnpicker.nativeElement.click(); +// +// comp.parseOptions(); +// +// fixture.detectChanges(); +// sunday = getElement('.sunday'); +// expect(sunday).toBe(null); +// }); +// +// it('options - current day marked', () => { +// comp.options = {markCurrentDay: true}; +// +// comp.parseOptions(); +// +// fixture.detectChanges(); +// let btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// fixture.detectChanges(); +// let currday = getElement('.currday'); +// expect(currday).not.toBe(null); +// +// btnpicker.nativeElement.click(); +// +// comp.options = {markCurrentDay: false}; +// +// comp.parseOptions(); +// +// fixture.detectChanges(); +// btnpicker.nativeElement.click(); +// +// comp.parseOptions(); +// +// fixture.detectChanges(); +// currday = getElement('.currday'); +// expect(currday).toBe(null); +// }); +// +// it('options - editable month and year', () => { +// comp.selectedMonth = {monthTxt: '', monthNbr: 5, year: 2016}; +// comp.options = {editableMonthAndYear: true}; +// +// comp.parseOptions(); +// +// fixture.detectChanges(); +// let btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// fixture.detectChanges(); +// let montlabel = getElement('.headermonthtxt .headerlabelbtn'); +// expect(montlabel).not.toBe(null); +// montlabel.nativeElement.click(); +// +// fixture.detectChanges(); +// let monthinput = getElement('.monthinput'); +// expect(monthinput).not.toBe(null); +// +// comp.userMonthInput({target:{value:'jan'}}); +// +// fixture.detectChanges(); +// montlabel = getElement('.headermonthtxt .headerlabelbtn'); +// expect(montlabel).not.toBe(null); +// expect(montlabel.nativeElement.textContent).toBe('Jan'); +// +// +// fixture.detectChanges(); +// let yearlabel = getElement('.headeryeartxt .headerlabelbtn'); +// expect(yearlabel).not.toBe(null); +// yearlabel.nativeElement.click(); +// +// fixture.detectChanges(); +// let yearinput = getElement('.yearinput'); +// expect(yearinput).not.toBe(null); +// +// comp.userYearInput({target:{value:'2019'}}); +// +// fixture.detectChanges(); +// yearlabel = getElement('.headeryeartxt .headerlabelbtn'); +// expect(yearlabel).not.toBe(null); +// expect(yearlabel.nativeElement.textContent).toBe('2019'); +// }); +// +// it('options - disable header buttons', () => { +// comp.selectedMonth = {monthTxt: '', monthNbr: 5, year: 2016}; +// comp.options = { +// disableHeaderButtons: true, +// disableUntil: {year: 2016, month: 4, day: 10} +// }; +// +// comp.parseOptions(); +// +// fixture.detectChanges(); +// let btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// fixture.detectChanges(); +// let montlabel = getElement('.headermonthtxt .headerlabelbtn'); +// expect(montlabel).not.toBe(null); +// expect(montlabel.nativeElement.textContent).toBe('May'); +// +// fixture.detectChanges(); +// let prevmonth = getElement(PREVMONTH); +// expect(prevmonth).not.toBe(null); +// prevmonth.nativeElement.click(); +// +// fixture.detectChanges(); +// montlabel = getElement('.headermonthtxt .headerlabelbtn'); +// expect(montlabel).not.toBe(null); +// expect(montlabel.nativeElement.textContent).toBe('Apr'); +// +// fixture.detectChanges(); +// let headerbtndisabled = getElements('.headerbtndisabled'); +// expect(headerbtndisabled).not.toBe(null); +// expect(headerbtndisabled.length).toBe(2); +// +// prevmonth.nativeElement.click(); +// +// fixture.detectChanges(); +// montlabel = getElement('.headermonthtxt .headerlabelbtn'); +// expect(montlabel).not.toBe(null); +// expect(montlabel.nativeElement.textContent).toBe('Apr'); +// +// fixture.detectChanges(); +// let prevyear = getElement(PREVYEAR); +// expect(prevyear).not.toBe(null); +// prevyear.nativeElement.click(); +// +// fixture.detectChanges(); +// let yearlabel = getElement('.headeryeartxt .headerlabelbtn'); +// expect(yearlabel).not.toBe(null); +// expect(yearlabel.nativeElement.textContent).toBe('2016'); +// +// btnpicker.nativeElement.click(); +// +// +// comp.options = { +// disableHeaderButtons: true, +// disableSince: {year: 2016, month: 7, day: 10} +// }; +// +// comp.parseOptions(); +// +// fixture.detectChanges(); +// btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// fixture.detectChanges(); +// montlabel = getElement('.headermonthtxt .headerlabelbtn'); +// expect(montlabel).not.toBe(null); +// expect(montlabel.nativeElement.textContent).toBe('May'); +// +// fixture.detectChanges(); +// let nextmonth = getElement(NEXTMONTH); +// expect(nextmonth).not.toBe(null); +// nextmonth.nativeElement.click(); +// +// fixture.detectChanges(); +// montlabel = getElement('.headermonthtxt .headerlabelbtn'); +// expect(montlabel).not.toBe(null); +// expect(montlabel.nativeElement.textContent).toBe('Jun'); +// +// fixture.detectChanges(); +// headerbtndisabled = getElements('.headerbtndisabled'); +// expect(headerbtndisabled).not.toBe(null); +// expect(headerbtndisabled.length).toBe(2); +// +// prevmonth.nativeElement.click(); +// +// fixture.detectChanges(); +// montlabel = getElement('.headermonthtxt .headerlabelbtn'); +// expect(montlabel).not.toBe(null); +// expect(montlabel.nativeElement.textContent).toBe('Jun'); +// +// fixture.detectChanges(); +// let nextyear = getElement(NEXTYEAR); +// expect(nextyear).not.toBe(null); +// nextyear.nativeElement.click(); +// +// fixture.detectChanges(); +// yearlabel = getElement('.headeryeartxt .headerlabelbtn'); +// expect(yearlabel).not.toBe(null); +// expect(yearlabel.nativeElement.textContent).toBe('2016'); +// }); +// +// it('options - min year', () => { +// comp.visibleMonth = {monthTxt: 'May', monthNbr: 5, year: 2016}; +// comp.options = {minYear: 2000}; +// +// comp.parseOptions(); +// +// fixture.detectChanges(); +// let btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// fixture.detectChanges(); +// let yearlabel = getElement('.headeryeartxt .headerlabelbtn'); +// expect(yearlabel).not.toBe(null); +// yearlabel.nativeElement.click(); +// +// fixture.detectChanges(); +// let yearinput = getElement('.yearinput'); +// expect(yearinput).not.toBe(null); +// +// comp.userYearInput({target:{value:1999}}); +// +// fixture.detectChanges(); +// let invalidyear = getElement('.invalidyear'); +// expect(invalidyear).not.toBe(null); +// +// comp.userYearInput({target:{value:2000}}); +// +// fixture.detectChanges(); +// yearlabel = getElement('.headeryeartxt .headerlabelbtn'); +// expect(yearlabel).not.toBe(null); +// expect(yearlabel.nativeElement.textContent).toBe('2000'); +// }); +// +// it('options - max year', () => { +// comp.visibleMonth = {monthTxt: 'May', monthNbr: 5, year: 2016}; +// comp.options = {maxYear: 2020}; +// +// comp.parseOptions(); +// +// fixture.detectChanges(); +// let btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// fixture.detectChanges(); +// let yearlabel = getElement('.headeryeartxt .headerlabelbtn'); +// expect(yearlabel).not.toBe(null); +// yearlabel.nativeElement.click(); +// +// fixture.detectChanges(); +// let yearinput = getElement('.yearinput'); +// expect(yearinput).not.toBe(null); +// +// comp.userYearInput({target:{value:2021}}); +// +// fixture.detectChanges(); +// let invalidyear = getElement('.invalidyear'); +// expect(invalidyear).not.toBe(null); +// +// comp.userYearInput({target:{value:2020}}); +// +// fixture.detectChanges(); +// yearlabel = getElement('.headeryeartxt .headerlabelbtn'); +// expect(yearlabel).not.toBe(null); +// expect(yearlabel.nativeElement.textContent).toBe('2020'); +// }); +// +// it('options - disable until', () => { +// comp.selectedMonth = {monthTxt: '', monthNbr: 10, year: 2016}; +// comp.options = {disableUntil: {year: 2016, month: 10, day: 5}}; +// +// comp.parseOptions(); +// +// fixture.detectChanges(); +// let btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// comp.generateCalendar(10, 2016, true); +// +// fixture.detectChanges(); +// let disabled = getElements('tr .disabled'); +// expect(disabled).not.toBe(null); +// expect(disabled.length).toBe(10); +// +// let firstDisabled = disabled[0]; +// expect(firstDisabled.nativeElement.textContent.trim()).toBe('26'); +// +// let lastDisabled = disabled[disabled.length - 1]; +// expect(lastDisabled.nativeElement.textContent.trim()).toBe('5'); +// +// fixture.detectChanges(); +// lastDisabled.nativeElement.click(); +// let selection = getElement('.selection'); +// expect(selection.nativeElement.value).toBe(''); +// +// fixture.detectChanges(); +// let selectableDays = getElements('.tablesingleday'); +// expect(selectableDays).not.toBe(null); +// expect(selectableDays.length).toBe(26); +// +// selectableDays[0].nativeElement.click(); +// fixture.detectChanges(); +// selection = getElement('.selection'); +// expect(selection.nativeElement.value).toContain('2016-10-06'); +// }); +// +// it('options - disable since', () => { +// comp.selectedMonth = {monthTxt: '', monthNbr: 10, year: 2016}; +// comp.options = {disableSince: {year: 2016, month: 10, day: 30}}; +// +// comp.parseOptions(); +// +// fixture.detectChanges(); +// let btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// comp.generateCalendar(10, 2016, true); +// +// fixture.detectChanges(); +// let disabled = getElements('tr .disabled'); +// expect(disabled).not.toBe(null); +// expect(disabled.length).toBe(8); +// +// let firstDisabled = disabled[0]; +// expect(firstDisabled.nativeElement.textContent.trim()).toBe('30'); +// +// let lastDisabled = disabled[disabled.length - 1]; +// expect(lastDisabled.nativeElement.textContent.trim()).toBe('6'); +// +// fixture.detectChanges(); +// lastDisabled.nativeElement.click(); +// let selection = getElement('.selection'); +// expect(selection.nativeElement.value).toBe(''); +// +// fixture.detectChanges(); +// let selectableDays = getElements('.tablesingleday'); +// expect(selectableDays).not.toBe(null); +// expect(selectableDays.length).toBe(29); +// +// selectableDays[5].nativeElement.click(); +// +// fixture.detectChanges(); +// selection = getElement('.selection'); +// expect(selection.nativeElement.value).toContain('2016-10-06'); +// }); +// +// it('options - disable days one by one', () => { +// comp.selectedMonth = {monthTxt: '', monthNbr: 10, year: 2016}; +// comp.options = {disableDays: [{year: 2016, month: 10, day: 5}, {year: 2016, month: 10, day: 10}]}; +// +// comp.parseOptions(); +// +// fixture.detectChanges(); +// let btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// comp.generateCalendar(10, 2016, true); +// +// fixture.detectChanges(); +// let disabled = getElements('tr .disabled'); +// expect(disabled).not.toBe(null); +// expect(disabled.length).toBe(2); +// +// let firstDisabled = disabled[0]; +// expect(firstDisabled.nativeElement.textContent.trim()).toBe('5'); +// +// let lastDisabled = disabled[1]; +// expect(lastDisabled.nativeElement.textContent.trim()).toBe('10'); +// }); +// +// it('options - enable disabled days one by one', () => { +// comp.selectedMonth = {monthTxt: '', monthNbr: 1, year: 2017}; +// comp.options = { +// dateFormat: 'dd.mm.yyyy', +// disableDateRange: {begin: {year: 2017, month: 1, day: 1}, end: {year: 2017, month: 1, day: 31}}, +// enableDays: [{year: 2017, month: 1, day: 5}, {year: 2017, month: 1, day: 6}, {year: 2017, month: 1, day: 7}, {year: 2017, month: 1, day: 8}] +// }; +// +// comp.parseOptions(); +// +// fixture.detectChanges(); +// let btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// comp.generateCalendar(1, 2017, true); +// +// fixture.detectChanges(); +// let disabled = getElements('tr .disabled'); +// expect(disabled).not.toBe(null); +// expect(disabled.length).toBe(27); +// +// let firstDisabled = disabled[0]; +// expect(firstDisabled.nativeElement.textContent.trim()).toBe('1'); +// +// let lastDisabled = disabled[disabled.length - 1]; +// expect(lastDisabled.nativeElement.textContent.trim()).toBe('31'); +// +// fixture.detectChanges(); +// let alldates = getElements('.caltable .daycell'); +// expect(alldates).not.toBe(null); +// expect(alldates.length).toBe(42); +// +// fixture.detectChanges(); +// let firstEnabled = alldates[10]; +// firstEnabled.nativeElement.click(); +// +// fixture.detectChanges(); +// let selection = getElement('.selection'); +// expect(selection).not.toBe(null); +// expect(selection.nativeElement.value).toBe('05.01.2017'); +// }); +// +// it('options - disable range', () => { +// comp.selectedMonth = {monthTxt: '', monthNbr: 10, year: 2016}; +// comp.options = {disableDateRange: {begin: {year: 2016, month: 10, day: 5}, end: {year: 2016, month: 10, day: 10}}}; +// +// comp.parseOptions(); +// +// fixture.detectChanges(); +// let btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// comp.generateCalendar(10, 2016, true); +// +// fixture.detectChanges(); +// let disabled = getElements('tr .disabled'); +// expect(disabled).not.toBe(null); +// expect(disabled.length).toBe(6); +// +// let firstDisabled = disabled[0]; +// expect(firstDisabled.nativeElement.textContent.trim()).toBe('5'); +// +// let lastDisabled = disabled[disabled.length - 1]; +// expect(lastDisabled.nativeElement.textContent.trim()).toBe('10'); +// btnpicker.nativeElement.click(); +// +// +// comp.options = {disableDateRange: {begin: {}, end: {}}}; +// +// comp.parseOptions(); +// +// fixture.detectChanges(); +// btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// comp.generateCalendar(10, 2016, true); +// +// fixture.detectChanges(); +// disabled = getElements('tr .disabled'); +// expect(disabled).not.toBe(null); +// expect(disabled.length).toBe(0); +// }); +// +// it('options - disable today - today button disabled', () => { +// comp.selectedMonth = {monthTxt: '', monthNbr: 10, year: 2016}; +// +// let date = new Date(); +// comp.options = {disableDays: [{year: date.getFullYear(), month: date.getMonth() + 1, day: date.getDate()}]}; +// +// comp.parseOptions(); +// +// fixture.detectChanges(); +// let btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// comp.generateCalendar(10, 2016, true); +// +// fixture.detectChanges(); +// let headertodaybtn = getElement('.headertodaybtn'); +// expect(headertodaybtn).not.toBe(null); +// expect(headertodaybtn.properties['disabled']).toBe(true); +// +// fixture.detectChanges(); +// headertodaybtn.nativeElement.click(); +// let selector = getElement('.selector'); +// expect(selector).not.toBe(null); +// +// btnpicker.nativeElement.click(); +// +// comp.options = {disableDays: []}; +// comp.parseOptions(); +// +// fixture.detectChanges(); +// btnpicker.nativeElement.click(); +// comp.generateCalendar(10, 2016, true); +// +// fixture.detectChanges(); +// headertodaybtn = getElement('.headertodaybtn'); +// expect(headertodaybtn).not.toBe(null); +// expect(headertodaybtn.properties['disabled']).toBe(false); +// +// headertodaybtn.nativeElement.click(); +// +// fixture.detectChanges(); +// let selection = getElement('.selection'); +// expect(selection).not.toBe(null); +// expect(selection.nativeElement.value).toBe(getDateString(date)); +// }); +// +// it('options - disable weekends', () => { +// comp.selectedMonth = {monthTxt: '', monthNbr: 10, year: 2016}; +// comp.options = {firstDayOfWeek: 'mo', disableWeekends: true}; +// +// comp.parseOptions(); +// +// fixture.detectChanges(); +// let btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// comp.generateCalendar(10, 2016, true); +// +// fixture.detectChanges(); +// let disabled = getElements('tr .disabled'); +// expect(disabled).not.toBe(null); +// expect(disabled.length).toBe(12); +// +// let firstDisabled = disabled[0]; +// expect(firstDisabled.nativeElement.textContent.trim()).toBe('1'); +// +// let secondDisabled = disabled[1]; +// expect(secondDisabled.nativeElement.textContent.trim()).toBe('2'); +// +// let lastDisabled = disabled[disabled.length - 1]; +// expect(lastDisabled.nativeElement.textContent.trim()).toBe('6'); +// +// fixture.detectChanges(); +// firstDisabled.nativeElement.click(); +// let selection = getElement('.selection'); +// expect(selection.nativeElement.value).toBe(''); +// +// fixture.detectChanges(); +// secondDisabled.nativeElement.click(); +// selection = getElement('.selection'); +// expect(selection.nativeElement.value).toBe(''); +// +// fixture.detectChanges(); +// let selectableDays = getElements('.tablesingleday'); +// expect(selectableDays).not.toBe(null); +// expect(selectableDays.length).toBe(21); +// +// selectableDays[0].nativeElement.click(); +// +// fixture.detectChanges(); +// selection = getElement('.selection'); +// expect(selection.nativeElement.value).toContain('2016-10-03'); +// }); +// +// it('options - inline', () => { +// comp.selectedMonth = {monthTxt: '', monthNbr: 10, year: 2016}; +// comp.options = {inline: true}; +// +// comp.parseOptions(); +// +// fixture.detectChanges(); +// let selector = getElement('.selector'); +// expect(selector).not.toBe(null); +// +// fixture.detectChanges(); +// let selectiongroup = getElement('.selectiongroup'); +// expect(selectiongroup).toBe(null); +// }); +// +// it('options - show clear date button', () => { +// let date = new Date(); +// comp.selectedMonth = {monthTxt: '', monthNbr: date.getMonth() + 1, year: date.getFullYear()}; +// +// fixture.detectChanges(); +// let btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// fixture.detectChanges(); +// let currday = getElement('.currday'); +// expect(currday).not.toBe(null); +// +// currday.nativeElement.click(); +// +// fixture.detectChanges(); +// let btnclear = getElement('.btnclear'); +// expect(btnclear).not.toBe(null); +// +// btnclear.nativeElement.click(); +// +// comp.options = {showClearDateBtn: true}; +// comp.parseOptions(); +// +// fixture.detectChanges(); +// btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// fixture.detectChanges(); +// currday = getElement('.currday'); +// expect(currday).not.toBe(null); +// +// currday.nativeElement.click(); +// +// fixture.detectChanges(); +// btnclear = getElement('.btnclear'); +// expect(btnclear).not.toBe(null); +// btnclear.nativeElement.click(); +// +// btnclear.nativeElement.click(); +// +// +// comp.options = {showClearDateBtn: false}; +// comp.parseOptions(); +// +// fixture.detectChanges(); +// btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// fixture.detectChanges(); +// currday = getElement('.currday'); +// expect(currday).not.toBe(null); +// +// currday.nativeElement.click(); +// +// fixture.detectChanges(); +// btnclear = getElement('.btnclear'); +// expect(btnclear).toBe(null); +// }); +// +// it('options - height', () => { +// comp.selectedMonth = {monthTxt: '', monthNbr: 10, year: 2016}; +// comp.options = {height: '50px'}; +// +// comp.parseOptions(); +// +// fixture.detectChanges(); +// let selection = getElement('.selection'); +// expect(selection).not.toBe(null); +// expect(selection.styles['height']).toBe('50px'); +// }); +// +// it('options - width', () => { +// comp.selectedMonth = {monthTxt: '', monthNbr: 10, year: 2016}; +// comp.options = {width: '300px'}; +// +// comp.parseOptions(); +// +// fixture.detectChanges(); +// expect(de).not.toBe(null); +// expect(de.styles['width']).toBe('300px'); +// +// comp.options = {width: '20%'}; +// +// comp.parseOptions(); +// +// fixture.detectChanges(); +// expect(de).not.toBe(null); +// expect(de.styles['width']).toBe('20%'); +// }); +// +// it('options - selection text font size', () => { +// comp.selectedMonth = {monthTxt: '', monthNbr: 10, year: 2016}; +// comp.options = {selectionTxtFontSize: '10px'}; +// +// comp.parseOptions(); +// +// fixture.detectChanges(); +// let selection = getElement('.selection'); +// expect(selection).not.toBe(null); +// expect(selection.styles['font-size']).toBe('10px'); +// }); +// +// it('options - align selector right', () => { +// comp.selectedMonth = {monthTxt: '', monthNbr: 10, year: 2016}; +// comp.options = {alignSelectorRight: true}; +// +// fixture.detectChanges(); +// let btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// comp.parseOptions(); +// +// fixture.detectChanges(); +// let alignselectorright = getElement('.alignselectorright'); +// expect(alignselectorright).not.toBe(null); +// +// comp.options = {alignSelectorRight: false}; +// +// comp.parseOptions(); +// +// fixture.detectChanges(); +// alignselectorright = getElement('.alignselectorright'); +// expect(alignselectorright).toBe(null); +// }); +// +// it('options - open selector top of input', () => { +// comp.selectedMonth = {monthTxt: '', monthNbr: 10, year: 2016}; +// comp.options = {openSelectorTopOfInput: true, height: '30px'}; +// +// comp.parseOptions(); +// +// fixture.detectChanges(); +// let btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// let value: string = comp.getSelectorTopPosition(); +// expect(value).not.toBe(null); +// expect(value).toBe('32px'); +// +// btnpicker.nativeElement.click(); +// +// +// comp.options = {openSelectorTopOfInput: false}; +// +// comp.parseOptions(); +// +// fixture.detectChanges(); +// btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// value = comp.getSelectorTopPosition(); +// expect(value).toBe(undefined); +// +// +// btnpicker.nativeElement.click(); +// +// comp.options = {}; +// +// comp.parseOptions(); +// +// fixture.detectChanges(); +// btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// value = comp.getSelectorTopPosition(); +// expect(value).toBe(undefined); +// }); +// +// it('options - indicate invalid date', () => { +// comp.selectedMonth = {monthTxt: '', monthNbr: 10, year: 2016}; +// comp.options = {indicateInvalidDate: true, dateFormat: 'dd.mm.yyyy'}; +// +// comp.parseOptions(); +// +// comp.userDateInput({target:{value:'2016-08-22'}}); +// fixture.detectChanges(); +// let invaliddate = getElement('.invaliddate'); +// expect(invaliddate).not.toBe(null); +// +// comp.userDateInput({target:{value:'2016-08-xx'}}); +// fixture.detectChanges(); +// invaliddate = getElement('.invaliddate'); +// expect(invaliddate).not.toBe(null); +// +// comp.userDateInput({target:{value:'2016-08-99'}}); +// fixture.detectChanges(); +// invaliddate = getElement('.invaliddate'); +// expect(invaliddate).not.toBe(null); +// +// comp.userDateInput({target:{value:'10.10.2016'}}); +// fixture.detectChanges(); +// invaliddate = getElement('.invaliddate'); +// expect(invaliddate).toBe(null); +// }); +// +// it('options - disableUntil input dates validation', ()=> { +// comp.options = { +// indicateInvalidDate: true, +// dateFormat: 'dd.mm.yyyy', +// disableUntil:{year: 2016, month: 11, day: 4} +// }; +// +// comp.parseOptions(); +// +// comp.userDateInput({target:{value:'11.12.2015'}}); +// fixture.detectChanges(); +// let invaliddate = getElement('.invaliddate'); +// expect(invaliddate).not.toBe(null); +// +// comp.userDateInput({target:{value:'11.06.2016'}}); +// fixture.detectChanges(); +// invaliddate = getElement('.invaliddate'); +// expect(invaliddate).not.toBe(null); +// +// comp.userDateInput({target:{value:'04.11.2016'}}); +// fixture.detectChanges(); +// invaliddate = getElement('.invaliddate'); +// expect(invaliddate).not.toBe(null); +// +// comp.userDateInput({target:{value:'05.11.2016'}}); +// fixture.detectChanges(); +// invaliddate = getElement('.invaliddate'); +// expect(invaliddate).toBe(null); +// +// comp.options = { +// indicateInvalidDate: true, +// dateFormat: 'dd.mm.yyyy', +// disableUntil:{year: 0, month: 0, day: 0} +// }; +// +// comp.parseOptions(); +// +// comp.userDateInput({target:{value:'11.12.2015'}}); +// fixture.detectChanges(); +// invaliddate = getElement('.invaliddate'); +// expect(invaliddate).toBe(null); +// }); +// +// it('options - disableSince input dates validation', ()=> { +// comp.options = { +// indicateInvalidDate: true, +// dateFormat: 'dd.mm.yyyy', +// disableSince:{year: 2016, month: 11, day: 22} +// }; +// +// comp.parseOptions(); +// +// comp.userDateInput({target:{value:'08.12.2017'}}); +// fixture.detectChanges(); +// let invaliddate = getElement('.invaliddate'); +// expect(invaliddate).not.toBe(null); +// +// comp.userDateInput({target:{value:'08.12.2016'}}); +// fixture.detectChanges(); +// invaliddate = getElement('.invaliddate'); +// expect(invaliddate).not.toBe(null); +// +// comp.userDateInput({target:{value:'23.11.2016'}}); +// fixture.detectChanges(); +// invaliddate = getElement('.invaliddate'); +// expect(invaliddate).not.toBe(null); +// +// comp.userDateInput({target:{value:'21.11.2016'}}); +// fixture.detectChanges(); +// invaliddate = getElement('.invaliddate'); +// expect(invaliddate).toBe(null); +// +// comp.options = { +// indicateInvalidDate: true, +// dateFormat: 'dd.mm.yyyy', +// disableSince:{year: 0, month: 0, day: 0} +// }; +// +// comp.parseOptions(); +// +// comp.userDateInput({target:{value:'11.12.2015'}}); +// fixture.detectChanges(); +// invaliddate = getElement('.invaliddate'); +// expect(invaliddate).toBe(null); +// }); +// +// it('options - disable weekends input date validation', () => { +// comp.selectedMonth = {monthTxt: '', monthNbr: 11, year: 2016}; +// comp.options = { +// indicateInvalidDate: true, +// dateFormat: 'dd.mm.yyyy', +// disableWeekends: true, +// firstDayOfWeek: 'mo' +// }; +// +// comp.parseOptions(); +// +// comp.userDateInput({target:{value:'05.11.2016'}}); +// fixture.detectChanges(); +// let invaliddate = getElement('.invaliddate'); +// expect(invaliddate).not.toBe(null); +// +// comp.userDateInput({target:{value:'06.11.2016'}}); +// fixture.detectChanges(); +// invaliddate = getElement('.invaliddate'); +// expect(invaliddate).not.toBe(null); +// +// comp.userDateInput({target:{value:'12.11.2016'}}); +// fixture.detectChanges(); +// invaliddate = getElement('.invaliddate'); +// expect(invaliddate).not.toBe(null); +// +// comp.userDateInput({target:{value:'13.11.2016'}}); +// fixture.detectChanges(); +// invaliddate = getElement('.invaliddate'); +// expect(invaliddate).not.toBe(null); +// +// comp.userDateInput({target:{value:'19.11.2016'}}); +// fixture.detectChanges(); +// invaliddate = getElement('.invaliddate'); +// expect(invaliddate).not.toBe(null); +// +// comp.userDateInput({target:{value:'20.11.2016'}}); +// fixture.detectChanges(); +// invaliddate = getElement('.invaliddate'); +// expect(invaliddate).not.toBe(null); +// +// comp.userDateInput({target:{value:'26.11.2016'}}); +// fixture.detectChanges(); +// invaliddate = getElement('.invaliddate'); +// expect(invaliddate).not.toBe(null); +// +// comp.userDateInput({target:{value:'27.11.2016'}}); +// fixture.detectChanges(); +// invaliddate = getElement('.invaliddate'); +// expect(invaliddate).not.toBe(null); +// +// comp.userDateInput({target:{value:'04.11.2016'}}); +// fixture.detectChanges(); +// invaliddate = getElement('.invaliddate'); +// expect(invaliddate).toBe(null); +// }); +// +// it('options - disableDays input date validation', () => { +// comp.selectedMonth = {monthTxt: '', monthNbr: 11, year: 2016}; +// comp.options = { +// indicateInvalidDate: true, +// dateFormat: 'dd.mm.yyyy', +// disableDays: [ +// {year: 2016, month: 11, day: 1}, +// {year: 2016, month: 11, day: 3}, +// {year: 2016, month: 11, day: 5}, +// {year: 2016, month: 11, day: 7} +// ], +// firstDayOfWeek: 'mo' +// }; +// +// comp.parseOptions(); +// +// comp.userDateInput({target:{value:'01.11.2016'}}); +// fixture.detectChanges(); +// let invaliddate = getElement('.invaliddate'); +// expect(invaliddate).not.toBe(null); +// +// comp.userDateInput({target:{value:'03.11.2016'}}); +// fixture.detectChanges(); +// invaliddate = getElement('.invaliddate'); +// expect(invaliddate).not.toBe(null); +// +// comp.userDateInput({target:{value:'05.11.2016'}}); +// fixture.detectChanges(); +// invaliddate = getElement('.invaliddate'); +// expect(invaliddate).not.toBe(null); +// +// comp.userDateInput({target:{value:'07.11.2016'}}); +// fixture.detectChanges(); +// invaliddate = getElement('.invaliddate'); +// expect(invaliddate).not.toBe(null); +// +// comp.userDateInput({target:{value:'02.11.2016'}}); +// fixture.detectChanges(); +// invaliddate = getElement('.invaliddate'); +// expect(invaliddate).toBe(null); +// }); +// +// it('options - disable component', () => { +// comp.selectedMonth = {monthTxt: '', monthNbr: 10, year: 2016}; +// comp.options = {componentDisabled: true}; +// comp.parseOptions(); +// +// fixture.detectChanges(); +// let btnpicker = getElement('.btnpicker'); +// +// btnpicker.nativeElement.click(); +// fixture.detectChanges(); +// +// let selector = getElement('.selector'); +// expect(selector).toBe(null); +// +// fixture.detectChanges(); +// let selection = getElement('.selection'); +// +// selection.nativeElement.value = '2016-11-14'; +// +// fixture.detectChanges(); +// expect(selection.nativeElement.value).toContain(''); +// }); +// +// it('options - editable date field', () => { +// comp.selectedMonth = {monthTxt: '', monthNbr: 10, year: 2016}; +// comp.options = {editableDateField: false}; +// comp.parseOptions(); +// +// fixture.detectChanges(); +// let selection = getElement('.selection'); +// +// selection.nativeElement.value = '2016-11-14'; +// +// fixture.detectChanges(); +// expect(selection.nativeElement.value).toContain(''); +// +// comp.options = {editableDateField: true}; +// comp.parseOptions(); +// +// fixture.detectChanges(); +// selection = getElement('.selection'); +// +// selection.nativeElement.value = '2016-11-14'; +// +// fixture.detectChanges(); +// expect(selection.nativeElement.value).toContain('2016-11-14'); +// }); +// +// it('options - click input to open selector', () => { +// +// let selection: DebugElement, +// selector: DebugElement; +// +// comp.selectedMonth = {monthTxt: '', monthNbr: 10, year: 2016}; +// comp.options = {editableDateField: true}; +// comp.parseOptions(); +// +// fixture.detectChanges(); +// selection = getElement('.selection'); +// +// selection.nativeElement.click(); +// +// fixture.detectChanges(); +// selector = getElement('.selector'); +// expect(selector).toBe(null); +// +// comp.options = {editableDateField: false, openSelectorOnInputClick: true}; +// comp.parseOptions(); +// +// fixture.detectChanges(); +// selection = getElement('.selection'); +// +// selection.nativeElement.click(); +// +// fixture.detectChanges(); +// selector = getElement('.selector'); +// expect(selector).not.toBe(null); +// }); +// +// it('options - input field value required', () => { +// comp.selectedMonth = {monthTxt: '', monthNbr: 10, year: 2016}; +// comp.options = {}; +// comp.parseOptions(); +// +// fixture.detectChanges(); +// let selection = getElement('.selection'); +// expect(selection).not.toBe(null); +// expect(selection.properties['required']).toBe(false); +// +// comp.options = {inputValueRequired: true}; +// comp.parseOptions(); +// +// fixture.detectChanges(); +// selection = getElement('.selection'); +// expect(selection).not.toBe(null); +// expect(selection.properties['required']).toBe(true); +// +// comp.options = {inputValueRequired: false}; +// comp.parseOptions(); +// +// fixture.detectChanges(); +// selection = getElement('.selection'); +// expect(selection).not.toBe(null); +// expect(selection.properties['required']).toBe(false); +// }); +// +// it('options - show selector arrow', () => { +// comp.selectedMonth = {monthTxt: '', monthNbr: 10, year: 2016}; +// comp.options = {}; +// comp.parseOptions(); +// +// fixture.detectChanges(); +// let btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// fixture.detectChanges(); +// let selectorarrow = getElement('.selectorarrow'); +// expect(selectorarrow).not.toBe(null); +// btnpicker.nativeElement.click(); +// +// +// comp.options = {showSelectorArrow: false}; +// comp.parseOptions(); +// +// fixture.detectChanges(); +// btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// fixture.detectChanges(); +// selectorarrow = getElement('.selectorarrow'); +// expect(selectorarrow).toBe(null); +// btnpicker.nativeElement.click(); +// +// +// comp.options = {showSelectorArrow: true}; +// comp.parseOptions(); +// +// fixture.detectChanges(); +// btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// fixture.detectChanges(); +// selectorarrow = getElement('.selectorarrow'); +// expect(selectorarrow).not.toBe(null); +// btnpicker.nativeElement.click(); +// }); +// +// it('options - show input field', () => { +// comp.selectedMonth = {monthTxt: '', monthNbr: 10, year: 2016}; +// comp.options = {}; +// comp.parseOptions(); +// +// fixture.detectChanges(); +// let selection = getElement('.selection'); +// expect(selection).not.toBe(null); +// +// +// comp.options = {showInputField: false}; +// comp.parseOptions(); +// +// fixture.detectChanges(); +// selection = getElement('.selection'); +// expect(selection).toBe(null); +// +// +// comp.options = {showInputField: true}; +// comp.parseOptions(); +// +// fixture.detectChanges(); +// selection = getElement('.selection'); +// expect(selection).not.toBe(null); +// }); +// +// it('options - input auto fill', () => { +// comp.options = {inputAutoFill: false}; +// comp.parseOptions(); +// +// fixture.detectChanges(); +// let selection = getElement('.selection'); +// expect(selection).not.toBe(null); +// +// fixture.detectChanges(); +// selection.nativeElement.value = '2016-2-1'; +// fixture.nativeElement.querySelector('.selection').dispatchEvent(new Event('keyup')); +// +// fixture.detectChanges(); +// selection = getElement('.selection'); +// expect(selection.nativeElement.value).toBe('2016-2-1'); +// +// +// comp.options = {inputAutoFill: true}; +// comp.parseOptions(); +// +// fixture.detectChanges(); +// selection.nativeElement.value = ''; +// +// fixture.detectChanges(); +// selection.nativeElement.value = '2016-1-'; +// fixture.nativeElement.querySelector('.selection').dispatchEvent(new Event('keyup')); +// +// fixture.detectChanges(); +// selection = getElement('.selection'); +// expect(selection.nativeElement.value).toBe('2016-01-'); +// +// fixture.detectChanges(); +// selection.nativeElement.value = '2016-01-9'; +// fixture.nativeElement.querySelector('.selection').dispatchEvent(new Event('keyup')); +// +// fixture.detectChanges(); +// selection = getElement('.selection'); +// expect(selection.nativeElement.value).toBe('2016-01-09'); +// }); +// +// it('options - show week numbers', () => { +// comp.selectedMonth = {monthTxt: '', monthNbr: 1, year: 2017}; +// comp.options = {showWeekNumbers: false}; +// comp.parseOptions(); +// +// fixture.detectChanges(); +// let btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// fixture.detectChanges(); +// let weekdaytitleweeknbr = getElement('.weekdaytitleweeknbr'); +// expect(weekdaytitleweeknbr).toBe(null); +// +// fixture.detectChanges(); +// let daycellweeknbr = getElements('.daycellweeknbr'); +// expect(daycellweeknbr.length).toBe(0); +// +// btnpicker.nativeElement.click(); +// +// +// comp.options = {showWeekNumbers: true}; +// comp.parseOptions(); +// +// fixture.detectChanges(); +// btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// fixture.detectChanges(); +// weekdaytitleweeknbr = getElement('.weekdaytitleweeknbr'); +// expect(weekdaytitleweeknbr).not.toBe(null); +// +// fixture.detectChanges(); +// daycellweeknbr = getElements('.daycellweeknbr'); +// expect(daycellweeknbr.length).toBe(6); +// +// expect(daycellweeknbr[0].nativeElement.textContent.trim()).toBe('52'); +// expect(daycellweeknbr[1].nativeElement.textContent.trim()).toBe('1'); +// expect(daycellweeknbr[2].nativeElement.textContent.trim()).toBe('2'); +// expect(daycellweeknbr[3].nativeElement.textContent.trim()).toBe('3'); +// expect(daycellweeknbr[4].nativeElement.textContent.trim()).toBe('4'); +// expect(daycellweeknbr[5].nativeElement.textContent.trim()).toBe('5'); +// +// fixture.detectChanges(); +// let prevyear = getElement(PREVYEAR); +// expect(prevyear).not.toBe(null); +// prevyear.nativeElement.click(); +// +// fixture.detectChanges(); +// daycellweeknbr = getElements('.daycellweeknbr'); +// expect(daycellweeknbr.length).toBe(6); +// +// expect(daycellweeknbr[0].nativeElement.textContent.trim()).toBe('53'); +// expect(daycellweeknbr[1].nativeElement.textContent.trim()).toBe('1'); +// expect(daycellweeknbr[2].nativeElement.textContent.trim()).toBe('2'); +// expect(daycellweeknbr[3].nativeElement.textContent.trim()).toBe('3'); +// expect(daycellweeknbr[4].nativeElement.textContent.trim()).toBe('4'); +// expect(daycellweeknbr[5].nativeElement.textContent.trim()).toBe('5'); +// +// prevyear.nativeElement.click(); +// +// fixture.detectChanges(); +// daycellweeknbr = getElements('.daycellweeknbr'); +// expect(daycellweeknbr.length).toBe(6); +// +// expect(daycellweeknbr[0].nativeElement.textContent.trim()).toBe('1'); +// expect(daycellweeknbr[1].nativeElement.textContent.trim()).toBe('2'); +// expect(daycellweeknbr[2].nativeElement.textContent.trim()).toBe('3'); +// expect(daycellweeknbr[3].nativeElement.textContent.trim()).toBe('4'); +// expect(daycellweeknbr[4].nativeElement.textContent.trim()).toBe('5'); +// expect(daycellweeknbr[5].nativeElement.textContent.trim()).toBe('6'); +// }); +// +// it('options - aria label texts', () => { +// comp.selectedDate = comp.parseSelectedDate('2017-10-11'); +// comp.parseOptions(); +// +// fixture.detectChanges(); +// let btnpicker = getElement('.btnpicker'); +// expect(btnpicker).not.toBe(null); +// expect(btnpicker.nativeElement.attributes['aria-label'].textContent).toBe('Open Calendar'); +// +// btnpicker.nativeElement.click(); +// +// fixture.detectChanges(); +// let selection = getElement('.selection'); +// expect(selection).not.toBe(null); +// expect(selection.nativeElement.attributes['aria-label'].textContent).toBe('Date input field'); +// +// fixture.detectChanges(); +// let btnclear = getElement('.btnclear'); +// expect(btnclear).not.toBe(null); +// expect(btnclear.nativeElement.attributes['aria-label'].textContent).toBe('Clear Date'); +// +// +// fixture.detectChanges(); +// let prevmonth = getElement(PREVMONTH); +// expect(prevmonth).not.toBe(null); +// expect(prevmonth.nativeElement.attributes['aria-label'].textContent).toBe('Previous Month'); +// +// fixture.detectChanges(); +// let nextmonth = getElement(NEXTMONTH); +// expect(nextmonth).not.toBe(null); +// expect(nextmonth.nativeElement.attributes['aria-label'].textContent).toBe('Next Month'); +// +// fixture.detectChanges(); +// let prevyear = getElement(PREVYEAR); +// expect(prevyear).not.toBe(null); +// expect(prevyear.nativeElement.attributes['aria-label'].textContent).toBe('Previous Year'); +// +// fixture.detectChanges(); +// let nextyear = getElement(NEXTYEAR); +// expect(nextyear).not.toBe(null); +// expect(nextyear.nativeElement.attributes['aria-label'].textContent).toBe('Next Year'); +// +// btnpicker.nativeElement.click(); +// +// comp.options = { +// ariaLabelInputField: 'text 1', +// ariaLabelClearDate: 'text 2', +// ariaLabelOpenCalendar: 'text 3', +// ariaLabelPrevMonth: 'text 4', +// ariaLabelNextMonth: 'text 5', +// ariaLabelPrevYear: 'text 6', +// ariaLabelNextYear: 'text 7' +// }; +// comp.parseOptions(); +// +// fixture.detectChanges(); +// btnpicker = getElement('.btnpicker'); +// expect(btnpicker).not.toBe(null); +// expect(btnpicker.nativeElement.attributes['aria-label'].textContent).toBe(comp.options.ariaLabelOpenCalendar); +// +// btnpicker.nativeElement.click(); +// +// fixture.detectChanges(); +// selection = getElement('.selection'); +// expect(selection).not.toBe(null); +// expect(selection.nativeElement.attributes['aria-label'].textContent).toBe(comp.options.ariaLabelInputField); +// +// fixture.detectChanges(); +// btnclear = getElement('.btnclear'); +// expect(btnclear).not.toBe(null); +// expect(btnclear.nativeElement.attributes['aria-label'].textContent).toBe(comp.options.ariaLabelClearDate); +// +// +// fixture.detectChanges(); +// prevmonth = getElement(PREVMONTH); +// expect(prevmonth).not.toBe(null); +// expect(prevmonth.nativeElement.attributes['aria-label'].textContent).toBe(comp.options.ariaLabelPrevMonth); +// +// fixture.detectChanges(); +// nextmonth = getElement(NEXTMONTH); +// expect(nextmonth).not.toBe(null); +// expect(nextmonth.nativeElement.attributes['aria-label'].textContent).toBe(comp.options.ariaLabelNextMonth); +// +// fixture.detectChanges(); +// prevyear = getElement(PREVYEAR); +// expect(prevyear).not.toBe(null); +// expect(prevyear.nativeElement.attributes['aria-label'].textContent).toBe(comp.options.ariaLabelPrevYear); +// +// fixture.detectChanges(); +// nextyear = getElement(NEXTYEAR); +// expect(nextyear).not.toBe(null); +// expect(nextyear.nativeElement.attributes['aria-label'].textContent).toBe(comp.options.ariaLabelNextYear); +// }); +// +// it('locale - use fr locale', () => { +// comp.selectedMonth = {monthTxt: '', monthNbr: 1, year: 2016}; +// comp.locale = 'fr'; +// +// comp.parseOptions(); +// +// fixture.detectChanges(); +// let btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// fixture.detectChanges(); +// let days = getElements('.caltable thead tr th'); +// expect(days.length).toBe(7); +// expect(days[0].nativeElement.textContent).toBe('Lun'); +// expect(days[1].nativeElement.textContent).toBe('Mar'); +// expect(days[2].nativeElement.textContent).toBe('Mer'); +// expect(days[3].nativeElement.textContent).toBe('Jeu'); +// expect(days[4].nativeElement.textContent).toBe('Ven'); +// expect(days[5].nativeElement.textContent).toBe('Sam'); +// expect(days[6].nativeElement.textContent).toBe('Dim'); +// +// fixture.detectChanges(); +// let nextmonth = getElement(NEXTMONTH); +// expect(nextmonth).not.toBe(null); +// +// fixture.detectChanges(); +// let monthLabel = getElement('.headermonthtxt .headerlabelbtn'); +// expect(monthLabel.nativeElement.textContent).toBe('Jan'); +// +// nextmonth.nativeElement.click(); +// fixture.detectChanges(); +// monthLabel = getElement('.headermonthtxt .headerlabelbtn'); +// expect(monthLabel.nativeElement.textContent).toBe('Fév'); +// +// nextmonth.nativeElement.click(); +// fixture.detectChanges(); +// monthLabel = getElement('.headermonthtxt .headerlabelbtn'); +// expect(monthLabel.nativeElement.textContent).toBe('Mar'); +// +// nextmonth.nativeElement.click(); +// fixture.detectChanges(); +// monthLabel = getElement('.headermonthtxt .headerlabelbtn'); +// expect(monthLabel.nativeElement.textContent).toBe('Avr'); +// +// nextmonth.nativeElement.click(); +// fixture.detectChanges(); +// monthLabel = getElement('.headermonthtxt .headerlabelbtn'); +// expect(monthLabel.nativeElement.textContent).toBe('Mai'); +// +// nextmonth.nativeElement.click(); +// fixture.detectChanges(); +// monthLabel = getElement('.headermonthtxt .headerlabelbtn'); +// expect(monthLabel.nativeElement.textContent).toBe('Juin'); +// +// nextmonth.nativeElement.click(); +// fixture.detectChanges(); +// monthLabel = getElement('.headermonthtxt .headerlabelbtn'); +// expect(monthLabel.nativeElement.textContent).toBe('Juil'); +// +// nextmonth.nativeElement.click(); +// fixture.detectChanges(); +// monthLabel = getElement('.headermonthtxt .headerlabelbtn'); +// expect(monthLabel.nativeElement.textContent).toBe('Aoû'); +// +// nextmonth.nativeElement.click(); +// fixture.detectChanges(); +// monthLabel = getElement('.headermonthtxt .headerlabelbtn'); +// expect(monthLabel.nativeElement.textContent).toBe('Sep'); +// +// nextmonth.nativeElement.click(); +// fixture.detectChanges(); +// monthLabel = getElement('.headermonthtxt .headerlabelbtn'); +// expect(monthLabel.nativeElement.textContent).toBe('Oct'); +// +// nextmonth.nativeElement.click(); +// fixture.detectChanges(); +// monthLabel = getElement('.headermonthtxt .headerlabelbtn'); +// expect(monthLabel.nativeElement.textContent).toBe('Nov'); +// +// nextmonth.nativeElement.click(); +// fixture.detectChanges(); +// monthLabel = getElement('.headermonthtxt .headerlabelbtn'); +// expect(monthLabel.nativeElement.textContent).toBe('Déc'); +// +// fixture.detectChanges(); +// let headertodaybtn = getElement('.headertodaybtn'); +// expect(headertodaybtn).not.toBe(null); +// expect(headertodaybtn.nativeElement.textContent).toBe('Aujourd\'hui'); +// +// fixture.detectChanges(); +// let firstDayOfWeek = getElement('.caltable thead tr th:first-child'); +// expect(firstDayOfWeek).not.toBe(null); +// expect(firstDayOfWeek.nativeElement.textContent).toBe('Lun'); +// +// fixture.detectChanges(); +// let sunday = getElement('.sunday'); +// expect(sunday).not.toBe(null); +// +// comp.userDateInput({target:{value:'10/10/2016'}}); +// expect(comp.invalidDate).toBe(false); +// +// fixture.detectChanges(); +// let invaliddate = getElement('.invaliddate'); +// expect(invaliddate).toBe(null); +// }); +// +// it('selDate - initially selected date - string', () => { +// let date: string = '2017-10-11'; +// comp.selectedDate = comp.parseSelectedDate(date); +// +// comp.parseOptions(); +// +// fixture.detectChanges(); +// let selection = getElement('.selection'); +// expect(selection).not.toBe(null); +// expect(selection.nativeElement.value).toContain('2017-10-11'); +// +// +// fixture.detectChanges(); +// let btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// fixture.detectChanges(); +// let selectedday = getElement('.selectedday div span'); +// expect(selectedday).not.toBe(null); +// expect(selectedday.nativeElement.textContent).toContain('11'); +// +// fixture.detectChanges(); +// let monthLabel = getElement('.headermonthtxt .headerlabelbtn'); +// expect(monthLabel).not.toBe(null); +// expect(monthLabel.nativeElement.textContent).toBe('Oct'); +// +// fixture.detectChanges(); +// let yearLabel = getElement('.headeryeartxt .headerlabelbtn'); +// expect(yearLabel).not.toBe(null); +// expect(yearLabel.nativeElement.textContent).toBe('2017'); +// }); +// +// it('selDate - initially selected date - object', () => { +// let date: Object = {year: 2017, month: 10, day: 11}; +// comp.selectedDate = comp.parseSelectedDate(date); +// +// comp.parseOptions(); +// +// fixture.detectChanges(); +// let selection = getElement('.selection'); +// expect(selection).not.toBe(null); +// expect(selection.nativeElement.value).toContain('2017-10-11'); +// expect(comp.selectionDayTxt).toContain('2017-10-11'); +// +// fixture.detectChanges(); +// let btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// fixture.detectChanges(); +// let selectedday = getElement('.selectedday div span'); +// expect(selectedday).not.toBe(null); +// expect(selectedday.nativeElement.textContent).toContain('11'); +// +// fixture.detectChanges(); +// let monthLabel = getElement('.headermonthtxt .headerlabelbtn'); +// expect(monthLabel).not.toBe(null); +// expect(monthLabel.nativeElement.textContent).toBe('Oct'); +// +// fixture.detectChanges(); +// let yearLabel = getElement('.headeryeartxt .headerlabelbtn'); +// expect(yearLabel).not.toBe(null); +// expect(yearLabel.nativeElement.textContent).toBe('2017'); +// }); +// +// it('defaultMonth - initially selected month', () => { +// comp.selectedMonth = comp.parseSelectedMonth('2019-08'); +// +// fixture.detectChanges(); +// let btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// fixture.detectChanges(); +// let monthLabel = getElement('.headermonthtxt .headerlabelbtn'); +// expect(monthLabel).not.toBe(null); +// expect(monthLabel.nativeElement.textContent).toBe('Aug'); +// +// fixture.detectChanges(); +// let yearLabel = getElement('.headeryeartxt .headerlabelbtn'); +// expect(yearLabel).not.toBe(null); +// expect(yearLabel.nativeElement.textContent).toBe('2019'); +// }); +// +// it('placeholder - placeholder text', () => { +// comp.placeholder = ''; +// +// fixture.detectChanges(); +// let selection = getElement('.selection'); +// expect(selection).not.toBe(null); +// expect(selection.properties['placeholder']).toBe(''); +// +// comp.placeholder = 'Select date'; +// +// fixture.detectChanges(); +// selection = getElement('.selection'); +// expect(selection).not.toBe(null); +// expect(selection.properties['placeholder']).toBe(comp.placeholder); +// +// +// }); +// +// it('locale - use id locale', () => { +// comp.selectedMonth = {monthTxt: '', monthNbr: 1, year: 2016}; +// comp.locale = 'id'; +// +// comp.parseOptions(); +// +// fixture.detectChanges(); +// let btnpicker = getElement('.btnpicker'); +// btnpicker.nativeElement.click(); +// +// fixture.detectChanges(); +// let days = getElements('.caltable thead tr th'); +// expect(days.length).toBe(7); +// expect(days[0].nativeElement.textContent).toBe('Min'); +// expect(days[1].nativeElement.textContent).toBe('Sen'); +// expect(days[2].nativeElement.textContent).toBe('Sel'); +// expect(days[3].nativeElement.textContent).toBe('Rab'); +// expect(days[4].nativeElement.textContent).toBe('Kam'); +// expect(days[5].nativeElement.textContent).toBe('Jum'); +// expect(days[6].nativeElement.textContent).toBe('Sab'); +// +// fixture.detectChanges(); +// let nextmonth = getElement(NEXTMONTH); +// expect(nextmonth).not.toBe(null); +// +// fixture.detectChanges(); +// let monthLabel = getElement('.headermonthtxt .headerlabelbtn'); +// expect(monthLabel.nativeElement.textContent).toBe('Jan'); +// +// nextmonth.nativeElement.click(); +// fixture.detectChanges(); +// monthLabel = getElement('.headermonthtxt .headerlabelbtn'); +// expect(monthLabel.nativeElement.textContent).toBe('Feb'); +// +// nextmonth.nativeElement.click(); +// fixture.detectChanges(); +// monthLabel = getElement('.headermonthtxt .headerlabelbtn'); +// expect(monthLabel.nativeElement.textContent).toBe('Mar'); +// +// nextmonth.nativeElement.click(); +// fixture.detectChanges(); +// monthLabel = getElement('.headermonthtxt .headerlabelbtn'); +// expect(monthLabel.nativeElement.textContent).toBe('Apr'); +// +// nextmonth.nativeElement.click(); +// fixture.detectChanges(); +// monthLabel = getElement('.headermonthtxt .headerlabelbtn'); +// expect(monthLabel.nativeElement.textContent).toBe('Mei'); +// +// nextmonth.nativeElement.click(); +// fixture.detectChanges(); +// monthLabel = getElement('.headermonthtxt .headerlabelbtn'); +// expect(monthLabel.nativeElement.textContent).toBe('Jun'); +// +// nextmonth.nativeElement.click(); +// fixture.detectChanges(); +// monthLabel = getElement('.headermonthtxt .headerlabelbtn'); +// expect(monthLabel.nativeElement.textContent).toBe('Jul'); +// +// nextmonth.nativeElement.click(); +// fixture.detectChanges(); +// monthLabel = getElement('.headermonthtxt .headerlabelbtn'); +// expect(monthLabel.nativeElement.textContent).toBe('Ags'); +// +// nextmonth.nativeElement.click(); +// fixture.detectChanges(); +// monthLabel = getElement('.headermonthtxt .headerlabelbtn'); +// expect(monthLabel.nativeElement.textContent).toBe('Sep'); +// +// nextmonth.nativeElement.click(); +// fixture.detectChanges(); +// monthLabel = getElement('.headermonthtxt .headerlabelbtn'); +// expect(monthLabel.nativeElement.textContent).toBe('Okt'); +// +// nextmonth.nativeElement.click(); +// fixture.detectChanges(); +// monthLabel = getElement('.headermonthtxt .headerlabelbtn'); +// expect(monthLabel.nativeElement.textContent).toBe('Nov'); +// +// nextmonth.nativeElement.click(); +// fixture.detectChanges(); +// monthLabel = getElement('.headermonthtxt .headerlabelbtn'); +// expect(monthLabel.nativeElement.textContent).toBe('Des'); +// +// fixture.detectChanges(); +// let headertodaybtn = getElement('.headertodaybtn'); +// expect(headertodaybtn).not.toBe(null); +// expect(headertodaybtn.nativeElement.textContent).toBe('Hari ini'); +// +// fixture.detectChanges(); +// let firstDayOfWeek = getElement('.caltable thead tr th:first-child'); +// expect(firstDayOfWeek).not.toBe(null); +// expect(firstDayOfWeek.nativeElement.textContent).toBe('Min'); +// +// fixture.detectChanges(); +// let sunday = getElement('.sunday'); +// expect(sunday).not.toBe(null); +// +// comp.userDateInput({target:{value:'10-10-2016'}}); +// expect(comp.invalidDate).toBe(false); +// +// fixture.detectChanges(); +// let invaliddate = getElement('.invaliddate'); +// expect(invaliddate).toBe(null); +// }); +// +// }); diff --git a/portal-4cli/src/app/utils/my-date-picker/my-date-picker.component.ts b/portal-4cli/src/app/utils/my-date-picker/my-date-picker.component.ts new file mode 100644 index 00000000..389a5be3 --- /dev/null +++ b/portal-4cli/src/app/utils/my-date-picker/my-date-picker.component.ts @@ -0,0 +1,677 @@ +import { Component, Input, Output, EventEmitter, OnChanges, SimpleChanges, ElementRef, ViewEncapsulation, ChangeDetectorRef, Renderer, forwardRef } from "@angular/core"; +import { ControlValueAccessor, NG_VALUE_ACCESSOR } from "@angular/forms"; +import { IMyDate, IMyDateRange, IMyMonth, IMyCalendarDay, IMyWeek, IMyDayLabels, IMyMonthLabels, IMyOptions, IMyDateModel, IMyInputAutoFill, IMyInputFieldChanged, IMyCalendarViewChanged, IMyInputFocusBlur } from "./interfaces/index"; +import { LocaleService } from "./services/my-date-picker.locale.service"; +import { UtilService } from "./services/my-date-picker.util.service"; + +// webpack1_ +declare var require: any; +// declare var myDpStyles: string = require("./my-date-picker.component.css"); +// declare var myDpTpl: string = require("./my-date-picker.component.html"); +// webpack2_ + +export const MYDP_VALUE_ACCESSOR: any = { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => MyDatePicker), + multi: true +}; + +@Component({ + selector: "my-date-picker", + styleUrls: ['my-date-picker.component.css'], + templateUrl: 'my-date-picker.component.html', + providers: [LocaleService, UtilService, MYDP_VALUE_ACCESSOR], + encapsulation: ViewEncapsulation.None +}) + +export class MyDatePicker implements OnChanges, ControlValueAccessor { + @Input() options: any; + @Input() locale: string; + @Input() defaultMonth: string; + @Input() selDate: string; + @Input() placeholder: string; + @Input() selector: number; + @Output() dateChanged: EventEmitter = new EventEmitter(); + @Output() inputFieldChanged: EventEmitter = new EventEmitter(); + @Output() calendarViewChanged: EventEmitter = new EventEmitter(); + @Output() calendarToggle: EventEmitter = new EventEmitter(); + @Output() inputFocusBlur: EventEmitter = new EventEmitter(); + + onChangeCb: (_: any) => void = () => { }; + onTouchedCb: () => void = () => { }; + + showSelector: boolean = false; + visibleMonth: IMyMonth = {monthTxt: "", monthNbr: 0, year: 0}; + selectedMonth: IMyMonth = {monthTxt: "", monthNbr: 0, year: 0}; + selectedDate: IMyDate = {year: 0, month: 0, day: 0}; + weekDays: Array = []; + dates: Array = []; + selectionDayTxt: string = ""; + invalidDate: boolean = false; + disableTodayBtn: boolean = false; + dayIdx: number = 0; + weekDayOpts: Array = ["su", "mo", "tu", "we", "th", "fr", "sa"]; + autoFillOpts: IMyInputAutoFill = {separator: "", formatParts: [], enabled: true}; + + editMonth: boolean = false; + invalidMonth: boolean = false; + editYear: boolean = false; + invalidYear: boolean = false; + + prevMonthDisabled: boolean = false; + nextMonthDisabled: boolean = false; + prevYearDisabled: boolean = false; + nextYearDisabled: boolean = false; + + PREV_MONTH: number = 1; + CURR_MONTH: number = 2; + NEXT_MONTH: number = 3; + + MIN_YEAR: number = 1000; + MAX_YEAR: number = 9999; + + // Default options + opts: IMyOptions = { + dayLabels: {}, + monthLabels: {}, + dateFormat: "", + showTodayBtn: true, + todayBtnTxt: "", + firstDayOfWeek: "", + sunHighlight: true, + markCurrentDay: true, + disableUntil: {year: 0, month: 0, day: 0}, + disableSince: {year: 0, month: 0, day: 0}, + disableDays: > [], + enableDays: > [], + disableDateRange: {begin: {year: 0, month: 0, day: 0}, end: {year: 0, month: 0, day: 0}}, + disableWeekends: false, + showWeekNumbers: false, + height: "34px", + width: "100%", + selectionTxtFontSize: "18px", + inline: false, + showClearDateBtn: true, + alignSelectorRight: false, + openSelectorTopOfInput: false, + indicateInvalidDate: true, + editableDateField: true, + editableMonthAndYear: true, + disableHeaderButtons: true, + minYear: this.MIN_YEAR, + maxYear: this.MAX_YEAR, + componentDisabled: false, + inputValueRequired: false, + showSelectorArrow: true, + showInputField: true, + openSelectorOnInputClick: false, + inputAutoFill: true, + ariaLabelInputField: "Date input field", + ariaLabelClearDate: "Clear Date", + ariaLabelOpenCalendar: "Open Calendar", + ariaLabelPrevMonth: "Previous Month", + ariaLabelNextMonth: "Next Month", + ariaLabelPrevYear: "Previous Year", + ariaLabelNextYear: "Next Year" + }; + + constructor(public elem: ElementRef, private renderer: Renderer, private cdr: ChangeDetectorRef, private localeService: LocaleService, private utilService: UtilService) { + this.setLocaleOptions(); + renderer.listenGlobal("document", "click", (event: any) => { + if (this.showSelector && event.target && this.elem.nativeElement !== event.target && !this.elem.nativeElement.contains(event.target)) { + this.showSelector = false; + this.calendarToggle.emit(4); + } + if (this.opts.editableMonthAndYear && event.target && this.elem.nativeElement.contains(event.target)) { + this.resetMonthYearEdit(); + } + }); + } + + setLocaleOptions(): void { + let opts: IMyOptions = this.localeService.getLocaleOptions(this.locale); + Object.keys(opts).forEach((k) => { + (this.opts)[k] = opts[k]; + }); + } + + setOptions(): void { + if (this.options !== undefined) { + Object.keys(this.options).forEach((k) => { + (this.opts)[k] = this.options[k]; + }); + } + if (this.opts.minYear < this.MIN_YEAR) { + this.opts.minYear = this.MIN_YEAR; + } + if (this.opts.maxYear > this.MAX_YEAR) { + this.opts.maxYear = this.MAX_YEAR; + } + + let separator: string = this.utilService.getDateFormatSeparator(this.opts.dateFormat); + this.autoFillOpts = {separator: separator, formatParts: this.opts.dateFormat.split(separator), enabled: this.opts.inputAutoFill}; + } + + getComponentWidth(): string { + if (this.opts.showInputField) { + return this.opts.width; + } + else if (this.selectionDayTxt.length > 0 && this.opts.showClearDateBtn) { + return "60px"; + } + else { + return "30px"; + } + } + + getSelectorTopPosition(): string { + if (this.opts.openSelectorTopOfInput) { + return this.elem.nativeElement.children[0].offsetHeight + "px"; + } + } + + resetMonthYearEdit(): void { + this.editMonth = false; + this.editYear = false; + this.invalidMonth = false; + this.invalidYear = false; + } + + editMonthClicked(event: any): void { + event.stopPropagation(); + if (this.opts.editableMonthAndYear) { + this.editMonth = true; + } + } + + editYearClicked(event: any): void { + event.stopPropagation(); + if (this.opts.editableMonthAndYear) { + this.editYear = true; + } + } + + userDateInput(event: any): void { + this.invalidDate = false; + if (event.target.value.length === 0) { + this.clearDate(); + } + else { + let date: IMyDate = this.utilService.isDateValid(event.target.value, this.opts.dateFormat, this.opts.minYear, this.opts.maxYear, this.opts.disableUntil, this.opts.disableSince, this.opts.disableWeekends, this.opts.disableDays, this.opts.disableDateRange, this.opts.monthLabels, this.opts.enableDays); + if (date.day !== 0 && date.month !== 0 && date.year !== 0) { + this.selectDate(date); + } + else { + this.invalidDate = true; + } + } + if (this.invalidDate) { + this.inputFieldChanged.emit({value: event.target.value, dateFormat: this.opts.dateFormat, valid: !(event.target.value.length === 0 || this.invalidDate)}); + this.onChangeCb(""); + this.onTouchedCb(); + } + } + + onFocusInput(event: any): void { + this.inputFocusBlur.emit({reason: 1, value: event.target.value}); + } + + lostFocusInput(event: any): void { + this.selectionDayTxt = event.target.value; + this.onTouchedCb(); + this.inputFocusBlur.emit({reason: 2, value: event.target.value}); + } + + userMonthInput(event: any): void { + if (event.keyCode === 13 || event.keyCode === 37 || event.keyCode === 39) { + return; + } + + this.invalidMonth = false; + + let m: number = this.utilService.isMonthLabelValid(event.target.value, this.opts.monthLabels); + if (m !== -1) { + this.editMonth = false; + if (m !== this.visibleMonth.monthNbr) { + this.visibleMonth = {monthTxt: this.monthText(m), monthNbr: m, year: this.visibleMonth.year}; + this.generateCalendar(m, this.visibleMonth.year, true); + } + } + else { + this.invalidMonth = true; + } + } + + userYearInput(event: any): void { + if (event.keyCode === 13 || event.keyCode === 37 || event.keyCode === 39) { + return; + } + + this.invalidYear = false; + + let y: number = this.utilService.isYearLabelValid(Number(event.target.value), this.opts.minYear, this.opts.maxYear); + if (y !== -1) { + this.editYear = false; + if (y !== this.visibleMonth.year) { + this.visibleMonth = {monthTxt: this.visibleMonth.monthTxt, monthNbr: this.visibleMonth.monthNbr, year: y}; + this.generateCalendar(this.visibleMonth.monthNbr, y, true); + } + } + else { + this.invalidYear = true; + } + } + + isTodayDisabled(): void { + this.disableTodayBtn = this.utilService.isDisabledDay(this.getToday(), this.opts.disableUntil, this.opts.disableSince, this.opts.disableWeekends, this.opts.disableDays, this.opts.disableDateRange, this.opts.enableDays); + } + + parseOptions(): void { + if (this.locale) { + this.setLocaleOptions(); + } + this.setOptions(); + this.isTodayDisabled(); + this.dayIdx = this.weekDayOpts.indexOf(this.opts.firstDayOfWeek); + if (this.dayIdx !== -1) { + let idx: number = this.dayIdx; + for (let i = 0; i < this.weekDayOpts.length; i++) { + this.weekDays.push(this.opts.dayLabels[this.weekDayOpts[idx]]); + idx = this.weekDayOpts[idx] === "sa" ? 0 : idx + 1; + } + } + } + + writeValue(value: Object): void { + if (value && value["date"]) { + this.updateDateValue(this.parseSelectedDate(value["date"]), false); + } + else if (value === "") { + this.updateDateValue({year: 0, month: 0, day: 0}, true); + } + } + + registerOnChange(fn: any): void { + this.onChangeCb = fn; + } + + registerOnTouched(fn: any): void { + this.onTouchedCb = fn; + } + + ngOnChanges(changes: SimpleChanges): void { + if (changes.hasOwnProperty("selector") && changes["selector"].currentValue > 0) { + this.openBtnClicked(); + } + + if (changes.hasOwnProperty("placeholder")) { + this.placeholder = changes["placeholder"].currentValue; + } + + if (changes.hasOwnProperty("locale")) { + this.locale = changes["locale"].currentValue; + } + + if (changes.hasOwnProperty("options")) { + this.options = changes["options"].currentValue; + } + + this.weekDays.length = 0; + this.parseOptions(); + + if (changes.hasOwnProperty("defaultMonth")) { + let dm: string = changes["defaultMonth"].currentValue; + if (dm !== null && dm !== undefined && dm !== "") { + this.selectedMonth = this.parseSelectedMonth(dm); + } + else { + this.selectedMonth = {monthTxt: "", monthNbr: 0, year: 0}; + } + } + + if (changes.hasOwnProperty("selDate")) { + let sd: any = changes["selDate"]; + if (sd.currentValue !== null && sd.currentValue !== undefined && sd.currentValue !== "" && Object.keys(sd.currentValue).length !== 0) { + this.selectedDate = this.parseSelectedDate(sd.currentValue); + setTimeout(() => { + this.onChangeCb(this.getDateModel(this.selectedDate)); + }); + } + else { + // Do not clear on init + if (!sd.isFirstChange()) { + this.clearDate(); + } + } + } + if (this.opts.inline) { + this.setVisibleMonth(); + } + else if (this.showSelector) { + this.generateCalendar(this.visibleMonth.monthNbr, this.visibleMonth.year, false); + } + } + + removeBtnClicked(): void { + // Remove date button clicked + this.clearDate(); + if (this.showSelector) { + this.calendarToggle.emit(3); + } + this.showSelector = false; + } + + openBtnClicked(): void { + // Open selector button clicked + this.showSelector = !this.showSelector; + if (this.showSelector) { + this.setVisibleMonth(); + this.calendarToggle.emit(1); + } + else { + this.calendarToggle.emit(3); + } + } + + setVisibleMonth(): void { + // Sets visible month of calendar + let y: number = 0, m: number = 0; + if (!this.utilService.isInitializedDate(this.selectedDate)) { + if (this.selectedMonth.year === 0 && this.selectedMonth.monthNbr === 0) { + let today: IMyDate = this.getToday(); + y = today.year; + m = today.month; + } else { + y = this.selectedMonth.year; + m = this.selectedMonth.monthNbr; + } + } + else { + y = this.selectedDate.year; + m = this.selectedDate.month; + } + this.visibleMonth = {monthTxt: this.opts.monthLabels[m], monthNbr: m, year: y}; + + // Create current month + this.generateCalendar(m, y, true); + } + + prevMonth(): void { + // Previous month from calendar + let d: Date = this.getDate(this.visibleMonth.year, this.visibleMonth.monthNbr, 1); + d.setMonth(d.getMonth() - 1); + + let y: number = d.getFullYear(); + let m: number = d.getMonth() + 1; + + this.visibleMonth = {monthTxt: this.monthText(m), monthNbr: m, year: y}; + this.generateCalendar(m, y, true); + } + + nextMonth(): void { + // Next month from calendar + let d: Date = this.getDate(this.visibleMonth.year, this.visibleMonth.monthNbr, 1); + d.setMonth(d.getMonth() + 1); + + let y: number = d.getFullYear(); + let m: number = d.getMonth() + 1; + + this.visibleMonth = {monthTxt: this.monthText(m), monthNbr: m, year: y}; + this.generateCalendar(m, y, true); + } + + prevYear(): void { + // Previous year from calendar + this.visibleMonth.year--; + this.generateCalendar(this.visibleMonth.monthNbr, this.visibleMonth.year, true); + } + + nextYear(): void { + // Next year from calendar + this.visibleMonth.year++; + this.generateCalendar(this.visibleMonth.monthNbr, this.visibleMonth.year, true); + } + + todayClicked(): void { + // Today button clicked + let today: IMyDate = this.getToday(); + this.selectDate(today); + if (this.opts.inline && today.year !== this.visibleMonth.year || today.month !== this.visibleMonth.monthNbr) { + this.visibleMonth = {monthTxt: this.opts.monthLabels[today.month], monthNbr: today.month, year: today.year}; + this.generateCalendar(today.month, today.year, true); + } + } + + cellClicked(cell: any): void { + // Cell clicked on the calendar + if (cell.cmo === this.PREV_MONTH) { + // Previous month day + this.prevMonth(); + } + else if (cell.cmo === this.CURR_MONTH) { + // Current month day - if date is already selected clear it + if (cell.dateObj.year === this.selectedDate.year && cell.dateObj.month === this.selectedDate.month && cell.dateObj.day === this.selectedDate.day) { + this.clearDate(); + } + else { + this.selectDate(cell.dateObj); + } + } + else if (cell.cmo === this.NEXT_MONTH) { + // Next month day + this.nextMonth(); + } + this.resetMonthYearEdit(); + } + + cellKeyDown(event: any, cell: any) { + // Cell keyboard handling + if ((event.keyCode === 13 || event.keyCode === 32) && !cell.disabled) { + event.preventDefault(); + this.cellClicked(cell); + } + } + + clearDate(): void { + // Clears the date and notifies parent using callbacks and value accessor + let date: IMyDate = {year: 0, month: 0, day: 0}; + this.dateChanged.emit({date: date, jsdate: null, formatted: "", epoc: 0}); + this.onChangeCb(""); + this.onTouchedCb(); + this.updateDateValue(date, true); + } + + selectDate(date: IMyDate): void { + // Date selected, notifies parent using callbacks and value accessor + let dateModel: IMyDateModel = this.getDateModel(date); + this.dateChanged.emit(dateModel); + this.onChangeCb(dateModel); + this.onTouchedCb(); + this.updateDateValue(date, false); + if (this.showSelector) { + this.calendarToggle.emit(2); + } + this.showSelector = false; + } + + updateDateValue(date: IMyDate, clear: boolean): void { + // Updates date values + this.selectedDate = date; + this.selectionDayTxt = clear ? "" : this.formatDate(date); + this.inputFieldChanged.emit({value: this.selectionDayTxt, dateFormat: this.opts.dateFormat, valid: !clear}); + this.invalidDate = false; + } + + getDateModel(date: IMyDate): IMyDateModel { + // Creates a date model object from the given parameter + return {date: date, jsdate: this.getDate(date.year, date.month, date.day), formatted: this.formatDate(date), epoc: Math.round(this.getTimeInMilliseconds(date) / 1000.0)}; + } + + preZero(val: string): string { + // Prepend zero if smaller than 10 + return parseInt(val) < 10 ? "0" + val : val; + } + + formatDate(val: any): string { + // Returns formatted date string, if mmm is part of dateFormat returns month as a string + let formatted: string = this.opts.dateFormat.replace("yyyy", val.year).replace("dd", this.preZero(val.day)); + return this.opts.dateFormat.indexOf("mmm") !== -1 ? formatted.replace("mmm", this.monthText(val.month)) : formatted.replace("mm", this.preZero(val.month)); + } + + monthText(m: number): string { + // Returns month as a text + return this.opts.monthLabels[m]; + } + + monthStartIdx(y: number, m: number): number { + // Month start index + let d = new Date(); + d.setDate(1); + d.setMonth(m - 1); + d.setFullYear(y); + let idx = d.getDay() + this.sundayIdx(); + return idx >= 7 ? idx - 7 : idx; + } + + daysInMonth(m: number, y: number): number { + // Return number of days of current month + return new Date(y, m, 0).getDate(); + } + + daysInPrevMonth(m: number, y: number): number { + // Return number of days of the previous month + let d: Date = this.getDate(y, m, 1); + d.setMonth(d.getMonth() - 1); + return this.daysInMonth(d.getMonth() + 1, d.getFullYear()); + } + + isCurrDay(d: number, m: number, y: number, cmo: number, today: IMyDate): boolean { + // Check is a given date the today + return d === today.day && m === today.month && y === today.year && cmo === this.CURR_MONTH; + } + + getToday(): IMyDate { + let date: Date = new Date(); + return {year: date.getFullYear(), month: date.getMonth() + 1, day: date.getDate()}; + } + + getTimeInMilliseconds(date: IMyDate): number { + return this.getDate(date.year, date.month, date.day).getTime(); + } + + getDayNumber(date: IMyDate): number { + // Get day number: su=0, mo=1, tu=2, we=3 ... + let d: Date = this.getDate(date.year, date.month, date.day); + return d.getDay(); + } + + getWeekday(date: IMyDate): string { + // Get weekday: su, mo, tu, we ... + return this.weekDayOpts[this.getDayNumber(date)]; + } + + getDate(year: number, month: number, day: number): Date { + // Creates a date object from given year, month and day + return new Date(year, month - 1, day, 0, 0, 0, 0); + } + + sundayIdx(): number { + // Index of Sunday day + return this.dayIdx > 0 ? 7 - this.dayIdx : 0; + } + + generateCalendar(m: number, y: number, notifyChange: boolean): void { + this.dates.length = 0; + let today: IMyDate = this.getToday(); + let monthStart: number = this.monthStartIdx(y, m); + let dInThisM: number = this.daysInMonth(m, y); + let dInPrevM: number = this.daysInPrevMonth(m, y); + + let dayNbr: number = 1; + let cmo: number = this.PREV_MONTH; + for (let i = 1; i < 7; i++) { + let week: Array = []; + if (i === 1) { + // First week + let pm = dInPrevM - monthStart + 1; + // Previous month + for (let j = pm; j <= dInPrevM; j++) { + let date: IMyDate = {year: y, month: m - 1, day: j}; + week.push({dateObj: date, cmo: cmo, currDay: this.isCurrDay(j, m, y, cmo, today), dayNbr: this.getDayNumber(date), disabled: this.utilService.isDisabledDay(date, this.opts.disableUntil, this.opts.disableSince, this.opts.disableWeekends, this.opts.disableDays, this.opts.disableDateRange, this.opts.enableDays)}); + } + + cmo = this.CURR_MONTH; + // Current month + let daysLeft: number = 7 - week.length; + for (let j = 0; j < daysLeft; j++) { + let date: IMyDate = {year: y, month: m, day: dayNbr}; + week.push({dateObj: date, cmo: cmo, currDay: this.isCurrDay(dayNbr, m, y, cmo, today), dayNbr: this.getDayNumber(date), disabled: this.utilService.isDisabledDay(date, this.opts.disableUntil, this.opts.disableSince, this.opts.disableWeekends, this.opts.disableDays, this.opts.disableDateRange, this.opts.enableDays)}); + dayNbr++; + } + } + else { + // Rest of the weeks + for (let j = 1; j < 8; j++) { + if (dayNbr > dInThisM) { + // Next month + dayNbr = 1; + cmo = this.NEXT_MONTH; + } + let date: IMyDate = {year: y, month: cmo === this.CURR_MONTH ? m : m + 1, day: dayNbr}; + week.push({dateObj: date, cmo: cmo, currDay: this.isCurrDay(dayNbr, m, y, cmo, today), dayNbr: this.getDayNumber(date), disabled: this.utilService.isDisabledDay(date, this.opts.disableUntil, this.opts.disableSince, this.opts.disableWeekends, this.opts.disableDays, this.opts.disableDateRange, this.opts.enableDays)}); + dayNbr++; + } + } + let weekNbr: number = this.opts.showWeekNumbers && this.opts.firstDayOfWeek === "mo" ? this.utilService.getWeekNumber(week[0].dateObj) : 0; + this.dates.push({week: week, weekNbr: weekNbr}); + } + + this.setHeaderBtnDisabledState(m, y); + + if (notifyChange) { + // Notify parent + this.calendarViewChanged.emit({year: y, month: m, first: {number: 1, weekday: this.getWeekday({year: y, month: m, day: 1})}, last: {number: dInThisM, weekday: this.getWeekday({year: y, month: m, day: dInThisM})}}); + } + } + + parseSelectedDate(selDate: any): IMyDate { + // Parse selDate value - it can be string or IMyDate object + let date: IMyDate = {day: 0, month: 0, year: 0}; + if (typeof selDate === "string") { + let sd: string = selDate; + date.day = this.utilService.parseDatePartNumber(this.opts.dateFormat, sd, "dd"); + + date.month = this.opts.dateFormat.indexOf("mmm") !== -1 + ? this.utilService.parseDatePartMonthName(this.opts.dateFormat, sd, "mmm", this.opts.monthLabels) + : this.utilService.parseDatePartNumber(this.opts.dateFormat, sd, "mm"); + + date.year = this.utilService.parseDatePartNumber(this.opts.dateFormat, sd, "yyyy"); + } + else if (typeof selDate === "object") { + date = selDate; + } + this.selectionDayTxt = this.formatDate(date); + return date; + } + + parseSelectedMonth(ms: string): IMyMonth { + return this.utilService.parseDefaultMonth(ms); + } + + setHeaderBtnDisabledState(m: number, y: number): void { + let dpm: boolean = false; + let dpy: boolean = false; + let dnm: boolean = false; + let dny: boolean = false; + if (this.opts.disableHeaderButtons) { + dpm = this.utilService.isMonthDisabledByDisableUntil({year: m === 1 ? y - 1 : y, month: m === 1 ? 12 : m - 1, day: this.daysInMonth(m === 1 ? 12 : m - 1, m === 1 ? y - 1 : y)}, this.opts.disableUntil); + dpy = this.utilService.isMonthDisabledByDisableUntil({year: y - 1, month: m, day: this.daysInMonth(m, y - 1)}, this.opts.disableUntil); + dnm = this.utilService.isMonthDisabledByDisableSince({year: m === 12 ? y + 1 : y, month: m === 12 ? 1 : m + 1, day: 1}, this.opts.disableSince); + dny = this.utilService.isMonthDisabledByDisableSince({year: y + 1, month: m, day: 1}, this.opts.disableSince); + } + this.prevMonthDisabled = m === 1 && y === this.opts.minYear || dpm; + this.prevYearDisabled = y - 1 < this.opts.minYear || dpy; + this.nextMonthDisabled = m === 12 && y === this.opts.maxYear || dnm; + this.nextYearDisabled = y + 1 > this.opts.maxYear || dny; + } +} diff --git a/portal-4cli/src/app/utils/my-date-picker/my-date-picker.module.ts b/portal-4cli/src/app/utils/my-date-picker/my-date-picker.module.ts new file mode 100644 index 00000000..a638a905 --- /dev/null +++ b/portal-4cli/src/app/utils/my-date-picker/my-date-picker.module.ts @@ -0,0 +1,14 @@ +import { CommonModule } from "@angular/common"; +import { FormsModule } from "@angular/forms"; +import { NgModule } from "@angular/core"; +import { MyDatePicker } from "./my-date-picker.component"; +import { FocusDirective } from "./directives/my-date-picker.focus.directive"; +import { InputAutoFillDirective } from "./directives/my-date-picker.input.auto.fill.directive"; + +@NgModule({ + imports: [CommonModule, FormsModule], + declarations: [MyDatePicker, FocusDirective, InputAutoFillDirective], + exports: [MyDatePicker, FocusDirective, InputAutoFillDirective] +}) +export class MyDatePickerModule { +} diff --git a/portal-4cli/src/app/utils/my-date-picker/services/my-date-picker.locale.service.ts b/portal-4cli/src/app/utils/my-date-picker/services/my-date-picker.locale.service.ts new file mode 100644 index 00000000..44c209e9 --- /dev/null +++ b/portal-4cli/src/app/utils/my-date-picker/services/my-date-picker.locale.service.ts @@ -0,0 +1,232 @@ +import { Injectable } from "@angular/core"; +import { IMyLocales, IMyOptions } from "../interfaces/index"; + +@Injectable() +export class LocaleService { + private locales: IMyLocales = { + "en": { + dayLabels: {su: "Sun", mo: "Mon", tu: "Tue", we: "Wed", th: "Thu", fr: "Fri", sa: "Sat"}, + monthLabels: { 1: "Jan", 2: "Feb", 3: "Mar", 4: "Apr", 5: "May", 6: "Jun", 7: "Jul", 8: "Aug", 9: "Sep", 10: "Oct", 11: "Nov", 12: "Dec" }, + dateFormat: "yyyy-mm-dd", + todayBtnTxt: "Today", + firstDayOfWeek: "mo", + sunHighlight: true, + }, + "he": { + dayLabels: {su: "רא", mo: "שנ", tu: "של", we: "רב", th: "חמ", fr: "שי", sa: "שב"}, + monthLabels: { 1: "ינו", 2: "פבר", 3: "מרץ", 4: "אפר", 5: "מאי", 6: "יונ", 7: "יול", 8: "אוג", 9: "ספט", 10: "אוק", 11: "נוב", 12: "דצמ" }, + dateFormat: "dd/mm/yyyy", + todayBtnTxt: "היום", + firstDayOfWeek: "su", + sunHighlight: false + }, + "ja": { + dayLabels: {su: "日", mo: "月", tu: "火", we: "水", th: "木", fr: "金", sa: "土"}, + monthLabels: {1: "1月", 2: "2月", 3: "3月", 4: "4月", 5: "5月", 6: "6月", 7: "7月", 8: "8月", 9: "9月", 10: "10月", 11: "11月", 12: "12月"}, + dateFormat: "yyyy.mm.dd", + todayBtnTxt: "今日", + sunHighlight: false + }, + "fr": { + dayLabels: {su: "Dim", mo: "Lun", tu: "Mar", we: "Mer", th: "Jeu", fr: "Ven", sa: "Sam"}, + monthLabels: {1: "Jan", 2: "Fév", 3: "Mar", 4: "Avr", 5: "Mai", 6: "Juin", 7: "Juil", 8: "Aoû", 9: "Sep", 10: "Oct", 11: "Nov", 12: "Déc"}, + dateFormat: "dd/mm/yyyy", + todayBtnTxt: "Aujourd'hui", + firstDayOfWeek: "mo", + sunHighlight: true, + }, + "fi": { + dayLabels: {su: "Su", mo: "Ma", tu: "Ti", we: "Ke", th: "To", fr: "Pe", sa: "La"}, + monthLabels: {1: "Tam", 2: "Hel", 3: "Maa", 4: "Huh", 5: "Tou", 6: "Kes", 7: "Hei", 8: "Elo", 9: "Syy", 10: "Lok", 11: "Mar", 12: "Jou"}, + dateFormat: "dd.mm.yyyy", + todayBtnTxt: "Tänään", + firstDayOfWeek: "mo", + sunHighlight: true, + }, + "es": { + dayLabels: {su: "Do", mo: "Lu", tu: "Ma", we: "Mi", th: "Ju", fr: "Vi", sa: "Sa"}, + monthLabels: {1: "Ene", 2: "Feb", 3: "Mar", 4: "Abr", 5: "May", 6: "Jun", 7: "Jul", 8: "Ago", 9: "Sep", 10: "Oct", 11: "Nov", 12: "Dic"}, + dateFormat: "dd.mm.yyyy", + todayBtnTxt: "Hoy", + firstDayOfWeek: "mo", + sunHighlight: true, + }, + "hu": { + dayLabels: {su: "Vas", mo: "Hét", tu: "Kedd", we: "Sze", th: "Csü", fr: "Pén", sa: "Szo"}, + monthLabels: { 1: "Jan", 2: "Feb", 3: "Már", 4: "Ápr", 5: "Máj", 6: "Jún", 7: "Júl", 8: "Aug", 9: "Szep", 10: "Okt", 11: "Nov", 12: "Dec" }, + dateFormat: "yyyy-mm-dd", + todayBtnTxt: "Ma", + firstDayOfWeek: "mo", + sunHighlight: true + }, + "sv": { + dayLabels: {su: "Sön", mo: "Mån", tu: "Tis", we: "Ons", th: "Tor", fr: "Fre", sa: "Lör"}, + monthLabels: { 1: "Jan", 2: "Feb", 3: "Mar", 4: "Apr", 5: "Maj", 6: "Jun", 7: "Jul", 8: "Aug", 9: "Sep", 10: "Okt", 11: "Nov", 12: "Dec" }, + dateFormat: "yyyy-mm-dd", + todayBtnTxt: "Idag", + firstDayOfWeek: "mo", + sunHighlight: false + }, + "nl": { + dayLabels: {su: "Zon", mo: "Maa", tu: "Din", we: "Woe", th: "Don", fr: "Vri", sa: "Zat"}, + monthLabels: { 1: "Jan", 2: "Feb", 3: "Mar", 4: "Apr", 5: "Mei", 6: "Jun", 7: "Jul", 8: "Aug", 9: "Sep", 10: "Okt", 11: "Nov", 12: "Dec" }, + dateFormat: "dd-mm-yyyy", + todayBtnTxt: "Vandaag", + firstDayOfWeek: "mo", + sunHighlight: false + }, + "ru": { + dayLabels: {su: "Вс", mo: "Пн", tu: "Вт", we: "Ср", th: "Чт", fr: "Пт", sa: "Сб"}, + monthLabels: { 1: "Янв", 2: "Фев", 3: "Март", 4: "Апр", 5: "Май", 6: "Июнь", 7: "Июль", 8: "Авг", 9: "Сент", 10: "Окт", 11: "Ноя", 12: "Дек" }, + dateFormat: "dd.mm.yyyy", + todayBtnTxt: "Сегодня", + firstDayOfWeek: "mo", + sunHighlight: true + }, + "uk": { + dayLabels: {su: "Нд", mo: "Пн", tu: "Вт", we: "Ср", th: "Чт", fr: "Пт", sa: "Сб"}, + monthLabels: { 1: "Січ", 2: "Лют", 3: "Бер", 4: "Кві", 5: "Тра", 6: "Чер", 7: "Лип", 8: "Сер", 9: "Вер", 10: "Жов", 11: "Лис", 12: "Гру" }, + dateFormat: "dd.mm.yyyy", + todayBtnTxt: "Сьогодні", + firstDayOfWeek: "mo", + sunHighlight: true + }, + "no": { + dayLabels: {su: "Søn", mo: "Man", tu: "Tir", we: "Ons", th: "Tor", fr: "Fre", sa: "Lør"}, + monthLabels: { 1: "Jan", 2: "Feb", 3: "Mar", 4: "Apr", 5: "Mai", 6: "Jun", 7: "Jul", 8: "Aug", 9: "Sep", 10: "Okt", 11: "Nov", 12: "Des" }, + dateFormat: "dd.mm.yyyy", + todayBtnTxt: "I dag", + firstDayOfWeek: "mo", + sunHighlight: false + }, + "tr": { + dayLabels: {su: "Paz", mo: "Pzt", tu: "Sal", we: "Çar", th: "Per", fr: "Cum", sa: "Cmt"}, + monthLabels: { 1: "Oca", 2: "Şub", 3: "Mar", 4: "Nis", 5: "May", 6: "Haz", 7: "Tem", 8: "Ağu", 9: "Eyl", 10: "Eki", 11: "Kas", 12: "Ara" }, + dateFormat: "dd.mm.yyyy", + todayBtnTxt: "Bugün", + firstDayOfWeek: "mo", + sunHighlight: false + }, + "pt-br": { + dayLabels: {su: "Dom", mo: "Seg", tu: "Ter", we: "Qua", th: "Qui", fr: "Sex", sa: "Sab"}, + monthLabels: { 1: "Jan", 2: "Fev", 3: "Mar", 4: "Abr", 5: "Mai", 6: "Jun", 7: "Jul", 8: "Ago", 9: "Set", 10: "Out", 11: "Nov", 12: "Dez" }, + dateFormat: "dd/mm/yyyy", + todayBtnTxt: "Hoje", + firstDayOfWeek: "su", + sunHighlight: true + }, + "de": { + dayLabels: {su: "So", mo: "Mo", tu: "Di", we: "Mi", th: "Do", fr: "Fr", sa: "Sa"}, + monthLabels: { 1: "Jan", 2: "Feb", 3: "Mär", 4: "Apr", 5: "Mai", 6: "Jun", 7: "Jul", 8: "Aug", 9: "Sep", 10: "Okt", 11: "Nov", 12: "Dez" }, + dateFormat: "dd.mm.yyyy", + todayBtnTxt: "Heute", + firstDayOfWeek: "mo", + sunHighlight: true + }, + "it": { + dayLabels: { su: "Dom", mo: "Lun", tu: "Mar", we: "Mer", th: "Gio", fr: "Ven", sa: "Sab" }, + monthLabels: { 1: "Gen", 2: "Feb", 3: "Mar", 4: "Apr", 5: "Mag", 6: "Giu", 7: "Lug", 8: "Ago", 9: "Set", 10: "Ott", 11: "Nov", 12: "Dic" }, + dateFormat: "dd/mm/yyyy", + todayBtnTxt: "Oggi", + firstDayOfWeek: "mo", + sunHighlight: true + }, + "it-ch": { + dayLabels: { su: "Dom", mo: "Lun", tu: "Mar", we: "Mer", th: "Gio", fr: "Ven", sa: "Sab" }, + monthLabels: { 1: "Gen", 2: "Feb", 3: "Mar", 4: "Apr", 5: "Mag", 6: "Giu", 7: "Lug", 8: "Ago", 9: "Set", 10: "Ott", 11: "Nov", 12: "Dic" }, + dateFormat: "dd.mm.yyyy", + todayBtnTxt: "Oggi", + firstDayOfWeek: "mo", + sunHighlight: true + }, + "pl": { + dayLabels: { su: "Nie", mo: "Pon", tu: "Wto", we: "Śro", th: "Czw", fr: "Pią", sa: "Sob" }, + monthLabels: { 1: "Sty", 2: "Lut", 3: "Mar", 4: "Kwi", 5: "Maj", 6: "Cze", 7: "Lip", 8: "Sie", 9: "Wrz", 10: "Paź", 11: "Lis", 12: "Gru" }, + dateFormat: "yyyy-mm-dd", + todayBtnTxt: "Dzisiaj", + firstDayOfWeek: "mo", + sunHighlight: true, + }, + "my": { + dayLabels: {su: "တနင်္ဂနွေ", mo: "တနင်္လာ", tu: "အင်္ဂါ", we: "ဗုဒ္ဓဟူး", th: "ကြသပတေး", fr: "သောကြာ", sa: "စနေ"}, + monthLabels: { 1: "ဇန်နဝါရီ", 2: "ဖေဖော်ဝါရီ", 3: "မတ်", 4: "ဧပြီ", 5: "မေ", 6: "ဇွန်", 7: "ဇူလိုင်", 8: "ဩဂုတ်", 9: "စက်တင်ဘာ", 10: "အောက်တိုဘာ", 11: "နိုဝင်ဘာ", 12: "ဒီဇင်ဘာ" }, + dateFormat: "yyyy-mm-dd", + todayBtnTxt: "ယနေ့", + firstDayOfWeek: "mo", + sunHighlight: true, + }, + "sk": { + dayLabels: { su: "Ne", mo: "Po", tu: "Ut", we: "St", th: "Št", fr: "Pi", sa: "So" }, + monthLabels: { 1: "Jan", 2: "Feb", 3: "Mar", 4: "Apr", 5: "Máj", 6: "Jún", 7: "Júl", 8: "Aug", 9: "Sep", 10: "Okt", 11: "Nov", 12: "Dec" }, + dateFormat: "dd.mm.yyyy", + todayBtnTxt: "Dnes", + firstDayOfWeek: "mo", + sunHighlight: true, + }, + "sl": { + dayLabels: { su: "Ned", mo: "Pon", tu: "Tor", we: "Sre", th: "Čet", fr: "Pet", sa: "Sob" }, + monthLabels: { 1: "Jan", 2: "Feb", 3: "Mar", 4: "Apr", 5: "Maj", 6: "Jun", 7: "Jul", 8: "Avg", 9: "Sep", 10: "Okt", 11: "Nov", 12: "Dec" }, + dateFormat: "dd. mm. yyyy", + todayBtnTxt: "Danes", + firstDayOfWeek: "mo", + sunHighlight: true, + }, + "zh-cn": { + dayLabels: {su: "日", mo: "一", tu: "二", we: "三", th: "四", fr: "五", sa: "六"}, + monthLabels: { 1: "1月", 2: "2月", 3: "3月", 4: "4月", 5: "5月", 6: "6月", 7: "7月", 8: "8月", 9: "9月", 10: "10月", 11: "11月", 12: "12月" }, + dateFormat: "yyyy-mm-dd", + todayBtnTxt: "今天", + firstDayOfWeek: "mo", + sunHighlight: true, + }, + "ro": { + dayLabels: {su: "du", mo: "lu", tu: "ma", we: "mi", th: "jo", fr: "vi", sa: "sa"}, + monthLabels: { 1: "ian", 2: "feb", 3: "mart", 4: "apr", 5: "mai", 6: "iun", 7: "iul", 8: "aug", 9: "sept", 10: "oct", 11: "nov", 12: "dec" }, + dateFormat: "dd.mm.yyyy", + todayBtnTxt: "Astăzi", + firstDayOfWeek: "mo", + sunHighlight: true, + }, + "ca": { + dayLabels: {su: "dg", mo: "dl", tu: "dt", we: "dc", th: "dj", fr: "dv", sa: "ds"}, + monthLabels: {1: "Gen", 2: "Febr", 3: "Març", 4: "Abr", 5: "Maig", 6: "Juny", 7: "Jul", 8: "Ag", 9: "Set", 10: "Oct", 11: "Nov", 12: "Des"}, + dateFormat: "dd.mm.yyyy", + todayBtnTxt: "Avui", + firstDayOfWeek: "mo", + sunHighlight: true, + }, + "id": { + dayLabels: {su: "Min", mo: "Sen", tu: "Sel", we: "Rab", th: "Kam", fr: "Jum", sa: "Sab"}, + monthLabels: {1: "Jan", 2: "Feb", 3: "Mar", 4: "Apr", 5: "Mei", 6: "Jun", 7: "Jul", 8: "Ags", 9: "Sep", 10: "Okt", 11: "Nov", 12: "Des"}, + dateFormat: "dd-mm-yyyy", + todayBtnTxt: "Hari ini", + firstDayOfWeek: "su", + sunHighlight: true + }, + "en-au": { + dayLabels: {su: "Sun", mo: "Mon", tu: "Tue", we: "Wed", th: "Thu", fr: "Fri", sa: "Sat"}, + monthLabels: { 1: "Jan", 2: "Feb", 3: "Mar", 4: "Apr", 5: "May", 6: "Jun", 7: "Jul", 8: "Aug", 9: "Sep", 10: "Oct", 11: "Nov", 12: "Dec" }, + dateFormat: "dd/mm/yyyy", + todayBtnTxt: "Today", + firstDayOfWeek: "mo", + sunHighlight: true + }, + "am-et": { + dayLabels: {su: "እሑድ", mo: "ሰኞ", tu: "ማክሰኞ", we: "ረቡዕ", th: "ሐሙስ", fr: "ዓርብ", sa: "ቅዳሜ"}, + monthLabels: { 1: "ጃንዩ", 2: "ፌብሩ", 3: "ማርች", 4: "ኤፕረ", 5: "ሜይ", 6: "ጁን", 7: "ጁላይ", 8: "ኦገስ", 9: "ሴፕቴ", 10: "ኦክተ", 11: "ኖቬም", 12: "ዲሴም" }, + dateFormat: "yyyy-mm-dd", + todayBtnTxt: "ዛሬ", + firstDayOfWeek: "mo", + sunHighlight: true + } + }; + + getLocaleOptions(locale: string): IMyOptions { + if (locale && this.locales.hasOwnProperty(locale)) { + // User given locale + return this.locales[locale]; + } + // Default: en + return this.locales["en"]; + } +} diff --git a/portal-4cli/src/app/utils/my-date-picker/services/my-date-picker.util.service.ts b/portal-4cli/src/app/utils/my-date-picker/services/my-date-picker.util.service.ts new file mode 100644 index 00000000..98b51bca --- /dev/null +++ b/portal-4cli/src/app/utils/my-date-picker/services/my-date-picker.util.service.ts @@ -0,0 +1,169 @@ +import { Injectable } from "@angular/core"; +import { IMyDate } from "../interfaces/my-date.interface"; +import { IMyDateRange } from "../interfaces/my-date-range.interface"; +import { IMyMonth } from "../interfaces/my-month.interface"; +import { IMyMonthLabels } from "../interfaces/my-month-labels.interface"; + +@Injectable() +export class UtilService { + isDateValid(dateStr: string, dateFormat: string, minYear: number, maxYear: number, disableUntil: IMyDate, disableSince: IMyDate, disableWeekends: boolean, disableDays: Array, disableDateRange: IMyDateRange, monthLabels: IMyMonthLabels, enableDays: Array): IMyDate { + let returnDate: IMyDate = {day: 0, month: 0, year: 0}; + let daysInMonth: Array = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + let isMonthStr: boolean = this.getDatePartIndex(dateFormat, "mmm") !== -1; + + if (dateStr.length !== dateFormat.length) { + return returnDate; + } + + let separator: string = this.getDateFormatSeparator(dateFormat); + + let parts: Array = dateStr.split(separator); + if (parts.length !== 3) { + return returnDate; + } + + let day: number = this.parseDatePartNumber(dateFormat, dateStr, "dd"); + let month: number = isMonthStr ? this.parseDatePartMonthName(dateFormat, dateStr, "mmm", monthLabels) : this.parseDatePartNumber(dateFormat, dateStr, "mm"); + let year: number = this.parseDatePartNumber(dateFormat, dateStr, "yyyy"); + + if (day !== -1 && month !== -1 && year !== -1) { + if (year < minYear || year > maxYear || month < 1 || month > 12) { + return returnDate; + } + + let date: IMyDate = {year: year, month: month, day: day}; + + if (this.isDisabledDay(date, disableUntil, disableSince, disableWeekends, disableDays, disableDateRange, enableDays)) { + return returnDate; + } + + if (year % 400 === 0 || (year % 100 !== 0 && year % 4 === 0)) { + daysInMonth[1] = 29; + } + + if (day < 1 || day > daysInMonth[month - 1]) { + return returnDate; + } + + // Valid date + return date; + } + return returnDate; + } + + getDateFormatSeparator(dateFormat: string): string { + return dateFormat.replace(/[dmy]/g, "")[0]; + } + + isMonthLabelValid(monthLabel: string, monthLabels: IMyMonthLabels): number { + for (let key = 1; key <= 12; key++) { + if (monthLabel.toLowerCase() === monthLabels[key].toLowerCase()) { + return key; + } + } + return -1; + } + + isYearLabelValid(yearLabel: number, minYear: number, maxYear: number): number { + if (yearLabel >= minYear && yearLabel <= maxYear) { + return yearLabel; + } + return -1; + } + + parseDatePartNumber(dateFormat: string, dateString: string, datePart: string): number { + let pos: number = this.getDatePartIndex(dateFormat, datePart); + if (pos !== -1) { + let value: string = dateString.substring(pos, pos + datePart.length); + if (!/^\d+$/.test(value)) { + return -1; + } + return parseInt(value); + } + return -1; + } + + parseDatePartMonthName(dateFormat: string, dateString: string, datePart: string, monthLabels: IMyMonthLabels): number { + let pos: number = this.getDatePartIndex(dateFormat, datePart); + if (pos !== -1) { + return this.isMonthLabelValid(dateString.substring(pos, pos + datePart.length), monthLabels); + } + return -1; + } + + getDatePartIndex(dateFormat: string, datePart: string): number { + return dateFormat.indexOf(datePart); + } + + parseDefaultMonth(monthString: string): IMyMonth { + let month: IMyMonth = {monthTxt: "", monthNbr: 0, year: 0}; + if (monthString !== "") { + let split = monthString.split(monthString.match(/[^0-9]/)[0]); + month.monthNbr = split[0].length === 2 ? parseInt(split[0]) : parseInt(split[1]); + month.year = split[0].length === 2 ? parseInt(split[1]) : parseInt(split[0]); + } + return month; + } + + isDisabledDay(date: IMyDate, disableUntil: IMyDate, disableSince: IMyDate, disableWeekends: boolean, disableDays: Array, disableDateRange: IMyDateRange, enableDays: Array): boolean { + for (let obj of enableDays) { + if (obj.year === date.year && obj.month === date.month && obj.day === date.day) { + return false; + } + } + + let dateMs: number = this.getTimeInMilliseconds(date); + if (this.isInitializedDate(disableUntil) && dateMs <= this.getTimeInMilliseconds(disableUntil)) { + return true; + } + + if (this.isInitializedDate(disableSince) && dateMs >= this.getTimeInMilliseconds(disableSince)) { + return true; + } + + if (disableWeekends) { + let dayNbr = this.getDayNumber(date); + if (dayNbr === 0 || dayNbr === 6) { + return true; + } + } + + for (let obj of disableDays) { + if (obj.year === date.year && obj.month === date.month && obj.day === date.day) { + return true; + } + } + + if (this.isInitializedDate(disableDateRange.begin) && this.isInitializedDate(disableDateRange.end) && dateMs >= this.getTimeInMilliseconds(disableDateRange.begin) && dateMs <= this.getTimeInMilliseconds(disableDateRange.end)) { + return true; + } + return false; + } + + getWeekNumber(date: IMyDate): number { + let d: Date = new Date(date.year, date.month - 1, date.day, 0, 0, 0, 0); + d.setDate(d.getDate() + (d.getDay() === 0 ? -3 : 4 - d.getDay())); + return Math.round(((d.getTime() - new Date(d.getFullYear(), 0, 4).getTime()) / 86400000) / 7) + 1; + } + + isMonthDisabledByDisableUntil(date: IMyDate, disableUntil: IMyDate): boolean { + return this.isInitializedDate(disableUntil) && this.getTimeInMilliseconds(date) <= this.getTimeInMilliseconds(disableUntil); + } + + isMonthDisabledByDisableSince(date: IMyDate, disableSince: IMyDate): boolean { + return this.isInitializedDate(disableSince) && this.getTimeInMilliseconds(date) >= this.getTimeInMilliseconds(disableSince); + } + + isInitializedDate(date: IMyDate): boolean { + return date.year !== 0 && date.month !== 0 && date.day !== 0; + } + + getTimeInMilliseconds(date: IMyDate): number { + return new Date(date.year, date.month - 1, date.day, 0, 0, 0, 0).getTime(); + } + + getDayNumber(date: IMyDate): number { + let d: Date = new Date(date.year, date.month - 1, date.day, 0, 0, 0, 0); + return d.getDay(); + } +} \ No newline at end of file diff --git a/portal-4cli/src/app/utils/number-utils.class.ts b/portal-4cli/src/app/utils/number-utils.class.ts new file mode 100644 index 00000000..bc6e25ce --- /dev/null +++ b/portal-4cli/src/app/utils/number-utils.class.ts @@ -0,0 +1,31 @@ + +export class NumberUtils{ + + + + public static roundNumber(num: number):any { + console.log("Trying to round number: "+ num); + var roundNum = null; + if(num >= 1000000){ + num=num/1000000; + num= Math.round(num); + roundNum = { "number": num, "size": "mi" }; + }else if( num >= 10000){ + num=num/1000; + num= Math.round(num); + roundNum = { "number": num, "size": "K" }; + }else if (num >= 100) { + num=num/100; + num= Math.round(num); + num=num*100; + roundNum = { "number": num, "size": "" }; + }else{ + roundNum = { "number": num, "size": "" }; + } + console.log("Rounded number: "+ roundNum.number + " "+ roundNum.size); + return roundNum; + } + + + +} diff --git a/portal-4cli/src/app/utils/paging.module.ts b/portal-4cli/src/app/utils/paging.module.ts new file mode 100644 index 00000000..dbf53c87 --- /dev/null +++ b/portal-4cli/src/app/utils/paging.module.ts @@ -0,0 +1,28 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { RouterModule } from '@angular/router'; + +import {pagingFormatterNoLoad} from './pagingFormatterNoLoad.component'; + +import {PagingFormatter} from './pagingFormatter.component'; + + +@NgModule({ + imports: [ + CommonModule, FormsModule, RouterModule + ], + declarations: [ + pagingFormatterNoLoad, + PagingFormatter, + + + ], + exports: [ + pagingFormatterNoLoad, + PagingFormatter, + + + ] +}) +export class PagingModule { } diff --git a/portal-4cli/src/app/utils/pagingFormatter.component.ts b/portal-4cli/src/app/utils/pagingFormatter.component.ts new file mode 100644 index 00000000..f199aaa9 --- /dev/null +++ b/portal-4cli/src/app/utils/pagingFormatter.component.ts @@ -0,0 +1,64 @@ +import {Component, Input} from '@angular/core'; +import {Router} from '@angular/router'; +import {DomSanitizer} from '@angular/platform-browser'; +//Usage Example +import {RouterHelper} from './routerHelper.class'; + +@Component({ + selector: 'paging', + template: ` + + + + ` +}) + +export class PagingFormatter { + @Input() currentPage: number = 1; + @Input() size: number=10; + @Input() totalResults: number = 10; + @Input() baseUrl:string=""; + @Input() parameterNames:string[]; + @Input() parameterValues:string[]; + + public routerHelper:RouterHelper = new RouterHelper(); + + constructor ( private _router: Router, private sanitizer:DomSanitizer) { + } + + ngOnInit() { + + } + getTotalPages(){ + var i:number =parseInt(''+(this.totalResults/this.size)); + return (((this.totalResults/this.size) == i )? i :(i+1)) ; + } + + // onPage(pageNum: number){ + // return this.sanitizer.bypassSecurityTrustUrl( this.baseUrl+((this.baseUrl.indexOf("?") > -1 )?'&':'?')+ "page=" + (pageNum)); + // + // } +} diff --git a/portal-4cli/src/app/utils/pagingFormatterNoLoad.component.ts b/portal-4cli/src/app/utils/pagingFormatterNoLoad.component.ts new file mode 100644 index 00000000..2ae49f49 --- /dev/null +++ b/portal-4cli/src/app/utils/pagingFormatterNoLoad.component.ts @@ -0,0 +1,76 @@ +import {Component, Input, Output, EventEmitter} from '@angular/core'; + + +//Usage Example + +@Component({ + selector: 'paging-no-load', + template: ` + + + ` +}) + +export class pagingFormatterNoLoad { + @Input() public currentPage: number = 1; + // @Input() public navigateTo: string; + @Input() public term: string=''; + @Input() public size: number=10; + @Input() public totalResults: number = 10; + // @Input() public params; + + @Output() pageChange = new EventEmitter(); + + constructor () { + } + + ngOnInit() { + console.info("In paging -- CurrentPage:"+this.currentPage+" "+"total Pages = "+this.getTotalPages() +" Results num:"+this.totalResults); + } + getTotalPages(){ + var i= this.totalResults/this.size; + var integerI=parseInt(''+i); + return parseInt(''+((i==integerI)?i:i+1)); + } + onPrev(){ + this.currentPage=this.currentPage-1; + this.pageChange.emit({ + value: this.currentPage + }); + + } + + onNext(){ + + this.currentPage=this.currentPage+1; + this.pageChange.emit({ + value: this.currentPage + }); + } + onPage(pageNum: number){ + + this.currentPage=pageNum; + this.pageChange.emit({ + value: this.currentPage + }); + } +} diff --git a/portal-4cli/src/app/utils/pipes/claimsDatatable.pipe.ts b/portal-4cli/src/app/utils/pipes/claimsDatatable.pipe.ts new file mode 100644 index 00000000..d05ca549 --- /dev/null +++ b/portal-4cli/src/app/utils/pipes/claimsDatatable.pipe.ts @@ -0,0 +1,48 @@ +import { Pipe, PipeTransform} from '@angular/core' + + +@Pipe({ + name: 'claimsDatatable' +}) +export class ClaimsDatatablePipe implements PipeTransform { + + transform(array: any[], args: any[]): any { + let query: string = args[0]; + let counter:any = args[1]; + let active: any = args[2]; + + active.page = 1; + + if (query) { + var result = array.filter(row=>this.filterAll(row, query)); + counter.count = result.length; + return result; + } + return array; + } + + filterAll(row: any, query: string) { + if(row.userMail.indexOf(query) > -1) { + return true; + } + if(row.targetType != 'project' && row.target.title.indexOf(query) > -1) { + return true; + } + if(row.sourceType != 'project' && row.source.title.indexOf(query) > -1) { + return true; + } + if(row.date.indexOf(query) > -1) { + return true; + } + + if(row.curatedBy != null && row.curatedBy.indexOf(query) > -1) { + return true; + } + + if(row.curationDate != null && row.curationDate.indexOf(query) > -1) { + return true; + } + + return false; + } +} diff --git a/portal-4cli/src/app/utils/pipes/contentProvidersDatatable.pipe.ts b/portal-4cli/src/app/utils/pipes/contentProvidersDatatable.pipe.ts new file mode 100644 index 00000000..6041d590 --- /dev/null +++ b/portal-4cli/src/app/utils/pipes/contentProvidersDatatable.pipe.ts @@ -0,0 +1,107 @@ +import { Pipe, PipeTransform} from '@angular/core'; +import { Filter, Value} from '../../searchPages/searchUtils/searchHelperClasses.class'; +import { SearchUtilsClass } from '../../searchPages/searchUtils/searchUtils.class'; +import { ErrorCodes} from '../properties/openaireProperties'; + +@Pipe({ + name: 'contentProvidersDatatable' +}) +export class ContentProvidersDatatablePipe implements PipeTransform { + + transform(array: any[], args: any[]): any { + if(array.length > 0) { + let searchUtils: SearchUtilsClass = args[0]; + let filters:Filter[] = args[1]; + + + var errorCodes:ErrorCodes = new ErrorCodes(); + searchUtils.status = errorCodes.LOADING; + + var result = array.filter(row=>this.filterAll(row, searchUtils.keyword.toLowerCase(), filters)); + + searchUtils.totalResults = result.length; + + var errorCodes:ErrorCodes = new ErrorCodes(); + searchUtils.status = errorCodes.DONE; + if(searchUtils.totalResults == 0 ){ + searchUtils.status = errorCodes.NONE; + } + return result; + } + return []; + } + + filterAll(row: any, query: string, filters:Filter[]) { + let returnValue: boolean = false; + + if(query) { + if(row.title.name.toLowerCase().indexOf(query) > -1) { + returnValue = true; + } + + if(row.type.toLowerCase().indexOf(query) > -1) { + returnValue = true; + } + + if(row.countries && row.countries.length > 0) { + for(let country of row.countries) { + if(country.toLowerCase().indexOf(query) > -1) { + returnValue = true; + break; + } + } + } + + if(row.compatibility && row.compatibility.toLowerCase().indexOf(query) > -1) { + returnValue = true; + } + + if(row.organizations && row.organizations.length > 0) { + for(let organization of row.organizations) { + if(organization.name.toLowerCase().indexOf(query) > -1) { + returnValue = true; + break; + } + } + } + + if(!returnValue) { + return false; + } + } + + for (let filter of filters){ + if(filter.countSelectedValues > 0){ + for (let value of filter.values){ + if(value.selected == true){ + + // make it generic in future commit + let field:string = ""; + if(filter.title == "Type") { + field = "type"; + } else if(filter.title == "Compatibility Level") { + field = "compatibility"; + } + + if(row[field] == value.name) { + returnValue = true; + if(filter.filterOperator == "or") { + break; + } + } else { + if(filter.filterOperator == "and") { + return false; + } + returnValue = false; + } + } + } + if(!returnValue) { + return false; + } + } + } + + return true; + } +} diff --git a/portal-4cli/src/app/utils/pipes/safeHTML.pipe.ts b/portal-4cli/src/app/utils/pipes/safeHTML.pipe.ts new file mode 100644 index 00000000..5912a07c --- /dev/null +++ b/portal-4cli/src/app/utils/pipes/safeHTML.pipe.ts @@ -0,0 +1,13 @@ +//our root app component +import { Pipe, PipeTransform} from '@angular/core' + +import { DomSanitizer } from '@angular/platform-browser' + + +@Pipe({ name: 'safeHtml'}) +export class SafeHtmlPipe implements PipeTransform { + constructor(private sanitized: DomSanitizer) {} + transform(value) { + return this.sanitized.bypassSecurityTrustHtml(value); + } +} diff --git a/portal-4cli/src/app/utils/piwik/piwik.service.ts b/portal-4cli/src/app/utils/piwik/piwik.service.ts new file mode 100644 index 00000000..c3c17746 --- /dev/null +++ b/portal-4cli/src/app/utils/piwik/piwik.service.ts @@ -0,0 +1,70 @@ +import {Injectable} from '@angular/core'; +import {Http, Response, Headers, RequestOptions, URLSearchParams} from '@angular/http'; +import {Observable} from 'rxjs/Observable'; +import 'rxjs/add/observable/of'; +import 'rxjs/add/operator/do'; +import 'rxjs/add/operator/share'; +import {Location} from '@angular/common'; + +import {OpenaireProperties} from '../properties/openaireProperties'; +import {StringUtils} from '../string-utils.class'; + + +@Injectable() +export class PiwikService { + private piwikbaseUrl:string = ""; + constructor(private http: Http, private location: Location ) {} + + trackView (title):any { + + var ua = this.getUserAgent(); + var referrer = this.getReferrer(); + if(typeof location !== 'undefined'){ + var url = OpenaireProperties.getPiwikBaseURL()+"&rec=1&url="+StringUtils.URIEncode(location.href)+"&action_name="+StringUtils.URIEncode(title)+ + ((ua != null && ua.length > 0)?('&ua='+StringUtils.URIEncode(ua)):'')+ + ((referrer != null && referrer.length > 0)?('&urlref='+StringUtils.URIEncode(referrer)):''); + console.log("Piwik - View: " + url); + + return this.http.get( url); + // .do(request => console.info("Piwik request completed" )); + + } + } + trackDownload (downloadURL):any { + var ua = this.getUserAgent(); + var referrer = this.getReferrer(); + var url = OpenaireProperties.getPiwikBaseURL()+"&rec=1&url="+StringUtils.URIEncode(downloadURL)+"&download="+StringUtils.URIEncode(downloadURL)+ + ((ua != null && ua.length > 0)?('&ua='+StringUtils.URIEncode(ua)):'')+ + ((referrer != null && referrer.length > 0)?('&urlref='+StringUtils.URIEncode(referrer)):''); + console.log("Piwik - trackDownload: "+url); + + return this.http.get( url) + .do(request => console.info("Piwik request completed" )); + + } + private getUserAgent(){ + if (typeof navigator !== 'undefined') { + console.log("navigator.userAgent:" + navigator.userAgent); + return navigator.userAgent; + + }else{ + return null; + } + } + private getReferrer(){ + var referrer = ""; + if (typeof document !== 'undefined') { + console.log("document.referrer:" + document.referrer); + referrer = document.referrer; + + } + if((referrer == null || referrer.length == 0)&&typeof localStorage !== 'undefined'){ + + referrer =localStorage.getItem('previousRoute'); + } + return referrer; + } + parse(data:any){ + } + +} diff --git a/portal-4cli/src/app/utils/piwik/piwikService.module.ts b/portal-4cli/src/app/utils/piwik/piwikService.module.ts new file mode 100644 index 00000000..0cfe47e3 --- /dev/null +++ b/portal-4cli/src/app/utils/piwik/piwikService.module.ts @@ -0,0 +1,21 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import {PiwikService} from './piwik.service'; + + +@NgModule({ + imports: [ + CommonModule, FormsModule, + + ], + declarations: [ + + ], + providers: [ PiwikService ], + exports: [ + + ] +}) +export class PiwikServiceModule{ } diff --git a/portal-4cli/src/app/utils/piwik/previousRouteRecorder.guard.ts b/portal-4cli/src/app/utils/piwik/previousRouteRecorder.guard.ts new file mode 100644 index 00000000..ae62b524 --- /dev/null +++ b/portal-4cli/src/app/utils/piwik/previousRouteRecorder.guard.ts @@ -0,0 +1,17 @@ + +import { Injectable } from '@angular/core'; +import { CanDeactivate, Router} from '@angular/router'; +import {Observable} from 'rxjs/Observable'; + +@Injectable() // do not forget to register this class as a provider +export class PreviousRouteRecorder implements CanDeactivate { + constructor(private router: Router) { + } + canDeactivate(component: any): Observable | boolean { + if (typeof localStorage !== 'undefined') { + console.log("In PreviousRouteRecorder : "+this.router.url ); + localStorage.setItem('previousRoute', this.router.url); + } + return true; + } +} diff --git a/portal-4cli/src/app/utils/properties/openaireProperties.ts b/portal-4cli/src/app/utils/properties/openaireProperties.ts new file mode 100644 index 00000000..3a623a83 --- /dev/null +++ b/portal-4cli/src/app/utils/properties/openaireProperties.ts @@ -0,0 +1,397 @@ +export class OpenaireProperties { + private static productionMode:boolean = false; + + //base url + private static baseLink = "https://demo.openaire.eu"; + + //landing Pages + private static baseSearchLink="/"; + private static searchLinkToPublication = "search/publication?articleId="; + private static searchLinkToProject = "search/project?projectId="; + private static searchLinkToDataProvider = "search/dataprovider?datasourceId="; + private static searchLinkToDataset = "search/dataset?datasetId="; + private static searchLinkToOrganization = "search/organization?organizationId="; + //Search pages + private static searchLinkToPublications = "search/find/publications"; + private static searchLinkToDataProviders = "search/find/dataproviders"; + private static searchLinkToProjects = "search/find/projects"; + private static searchLinkToDatasets = "search/find/datasets"; + private static searchLinkToSoftware = "search/find/software"; + private static searchLinkToOrganizations = "search/find/organizations"; + private static searchLinkToPeople = "search/find/people"; + public static searchLinkToCompatibleDataProviders = "search/content-providers"; + public static searchLinkToCompatibleDataProvidersTable = "search/content-providers-table"; + public static searchLinkToEntityRegistriesDataProviders = "search/entity-registries"; + public static searchLinkToEntityRegistriesDataProvidersTable = "search/entity-registries-table"; + public static searchLinkToJournals = "search/journals"; + public static searchLinkToJournalsTable = "search/journals-table"; + + //Advanced Search for pages + public static searchLinkToAdvancedPublications = "search/advanced/publications"; + public static searchLinkToAdvancedProjects = "search/advanced/projects"; + public static searchLinkToAdvancedDatasets = "search/advanced/datasets"; + public static searchLinkToAdvancedSoftware = "search/advanced/software"; + public static searchLinkToAdvancedDataProviders = "search/advanced/dataproviders"; + public static searchLinkToAdvancedOrganizations = "search/advanced/organizations"; + public static searchLinkToAdvancedPeople = "search/advanced/people"; + + + private static metricsAPIURL = "https://beta.services.openaire.eu/usagestats/"; + private static framesAPIURL = "https://beta.openaire.eu/stats3/"; + + private static loginAPIURL = "http://rudie.di.uoa.gr:8080/dnet%2Dopenaire%2Dusers%2D1.0.0%2DSNAPSHOT/api/users/authenticates" + //"http://scoobydoo.di.uoa.gr:8080/uoa-user-management-1.0.0-SNAPSHOT/api/users/authenticates"; + private static loginAPIURL_pm = "https://beta.services.openaire.eu/uoa-user-management/api/users/authenticates"; + + private static claimsAPIURL = "http://scoobydoo.di.uoa.gr:8080/dnet-claims-service-2.0.0-SNAPSHOT/rest/claimsService/"; + private static claimsAPIURL_pm = "https://beta.services.openaire.eu/claims/rest/claimsService/"; + + private static searchAPIURLLAst_pm = "https://beta.services.openaire.eu/search/v2/api/"; + private static searchAPIURLLAst = "https://beta.services.openaire.eu/search/v2/api/"; +// private static searchAPIURLLAst = "http://scoobydoo.di.uoa.gr:8080/dnet-functionality-services-2.0.0-SNAPSHOT/rest/v2/api/"; + + private static searchResourcesAPIURL_pm = "https://beta.services.openaire.eu/search/v2/api/resources"; + private static searchResourcesAPIURL = "https://beta.services.openaire.eu/search/v2/api/resources"; + // private static searchResourcesAPIURL = "http://scoobydoo.di.uoa.gr:8080/dnet-functionality-services-2.0.0-SNAPSHOT/rest/v2/api/resources"; + + + private static csvAPIURL_pm = "https://beta.services.openaire.eu/search/v2/api/";//publications?format=csv + // private static csvAPIURL = "http://rudie.di.uoa.gr:8080/dnet-functionality-services-2.0.0-SNAPSHOT/rest/v2/api/";//publications?format=csv + + private static csvAPIURL = "https://beta.services.openaire.eu/search/v2/api/";//publications?format=csv + + private static searchCrossrefAPIURL = "https://api.crossref.org/works"; + // private static searchDataciteAPIURL = "https://search.datacite.org/api"; + private static searchDataciteAPIURL = "https://api.datacite.org/works"; + + private static searchOrcidURL = "https://pub.orcid.org/"; + + // Identifiers + private static pmidURL = "http://www.ncbi.nlm.nih.gov/pubmed/"; + private static doiURL = "https://dx.doi.org/"; + private static cordisURL = "http://cordis.europa.eu/projects/"; + private static pmcURL = "http://europepmc.org/articles/"; + private static handleURL = "http://hdl.handle.net/"; + + // Zenodo's url + private static zenodo = "https://zenodo.org/"; + // Open access link + private static openAccess = "https://www.openaire.eu/support/faq#article-id-234"; + // Open access repository link + private static openAccessRepo = "https://www.openaire.eu/support/faq#article-id-310"; + // FP7 link + private static fp7Guidlines = "https://www.openaire.eu/open-access-in-fp7-seventh-research-framework-programme"; + // H2020 link + private static h2020Guidlines = "https://www.openaire.eu/oa-publications/h2020/open-access-in-horizon-2020"; + // ERC Guidlines + private static ercGuidlines = "http://erc.europa.eu/sites/default/files/document/file/ERC_Open_Access_Guidelines-revised_2014.pdf"; + // helpdesk link + private static helpdesk = "https://www.openaire.eu/support/helpdesk"; + + private static uploadService_pm = "https://demo.openaire.eu/upload"; + private static uploadService = "http://scoobydoo.di.uoa.gr:8000/upload"; + + private static vocabulariesAPI ="https://beta.services.openaire.eu/provision/mvc/vocabularies/"; + + private static piwikBaseUrl =" https://analytics.openaire.eu/piwik.php?idsite=6"; + private static enablePiwikTrack:boolean = false; + + private static loginUrl ="http://mpagasas.di.uoa.gr:8080/dnet-openaire-users-1.0.0-SNAPSHOT/openid_connect_login"; + private static loginUrl_pm ="https://beta.services.openaire.eu/uoa-user-management/openid_connect_login"; + + private static logoutUrl ="https://aai.openminted.eu/proxy/saml2/idp/SingleLogoutService.php?ReturnTo="; + private static logoutUrl_pm ="https://aai.openminted.eu/proxy/saml2/idp/SingleLogoutService.php?ReturnTo="; + + private static cookieDomain =".di.uoa.gr"; + private static cookieDomain_pm =".openaire.eu"; + + private static feedbackmail ="openaire.test@gmail.com"; + + private static helperPageUrl ="http://scoobydoo.di.uoa.gr:16000/api/page/route"; + private static enableHelper:boolean = false; + + private static cache ="http://scoobydoo.di.uoa.gr:3000/get?url="; + private static useCache:boolean = true; + + public static getBaseLink():string{ + return this.baseLink; + } + + //landing Pages' getters + public static getsearchLinkToPublication():string{ + return this.baseSearchLink + this.searchLinkToPublication; + } + public static getsearchLinkToDataset():string{ + return this.baseSearchLink + this.searchLinkToDataset; + } + public static getsearchLinkToProject():string{ + return this.baseSearchLink + this.searchLinkToProject; + } + + public static getsearchLinkToOrganization():string{ + return this.searchLinkToOrganization; + } + public static getsearchLinkToDataProvider():string{ + return this.searchLinkToDataProvider; + } + //searchPages + public static getLinkToSearchPublications():string{ + return this.baseSearchLink + this.searchLinkToPublications; + } + public static getLinkToSearchProjects():string{ + return this.baseSearchLink + this.searchLinkToProjects; + } + public static getLinkToSearchDataProviders():string{ + return this.baseSearchLink + this.searchLinkToDataProviders; + } + public static getLinkToSearchCompatibleDataProviders():string{ + return this.baseSearchLink + this.searchLinkToCompatibleDataProviders; + } + public static getLinkToSearchCompatibleDataProvidersTable():string{ + return this.baseSearchLink + this.searchLinkToCompatibleDataProvidersTable; + } + public static getLinkToSearchEntityRegistries():string{ + return this.baseSearchLink + this.searchLinkToEntityRegistriesDataProviders; + } + public static getLinkToSearchEntityRegistriesTable():string{ + return this.baseSearchLink + this.searchLinkToEntityRegistriesDataProvidersTable; + } + public static getLinkToSearchJournals():string{ + return this.baseSearchLink + this.searchLinkToJournals; + } + public static getLinkToSearchJournalsTable():string{ + return this.baseSearchLink + this.searchLinkToJournalsTable; + } + public static getLinkToSearchDatasets():string{ + return this.baseSearchLink + this.searchLinkToDatasets; + } + public static getLinkToSearchSoftware():string{ + return this.baseSearchLink + this.searchLinkToSoftware; + } + public static getLinkToSearchOrganizations():string{ + return this.baseSearchLink + this.searchLinkToOrganizations; + } + public static getLinkToSearchPeople():string{ + return this.baseSearchLink + this.searchLinkToPeople; + } + + //Advanced searchPages + public static getLinkToAdvancedSearchPublications():string{ + return this.baseSearchLink + this.searchLinkToAdvancedPublications; + } + public static getLinkToAdvancedSearchProjects():string{ + return this.baseSearchLink + this.searchLinkToAdvancedProjects; + } + public static getLinkToAdvancedSearchDataProviders():string{ + return this.baseSearchLink + this.searchLinkToAdvancedDataProviders; + } + public static getLinkToAdvancedSearchDatasets():string{ + return this.baseSearchLink + this.searchLinkToAdvancedDatasets; + } + public static getLinkToAdvancedSearchSoftware():string{ + return this.baseSearchLink + this.searchLinkToAdvancedSoftware; + } + public static getLinkToAdvancedSearchOrganizations():string{ + return this.baseSearchLink + this.searchLinkToAdvancedOrganizations; + } + public static getLinkToAdvancedSearchPeople():string{ + return this.baseSearchLink + this.searchLinkToAdvancedPeople; + } + + // Services - APIs' getters + // public static getSearchAPIURL():string{ + // return this.searchAPIURL; + // } + // Services - APIs' getters + public static getCsvAPIURL(): string { + if(this.productionMode){ + return this.csvAPIURL_pm; + }else{ + return this.csvAPIURL; + } + // return this.csvAPIURL; + } + + public static getFramesAPIURL(): string { + return this.framesAPIURL; + } + + public static getMetricsAPIURL(): string { + return this.metricsAPIURL; + } + + public static getLoginAPIURL(): string { + if(this.productionMode){ + return this.loginAPIURL_pm; + }else{ + return this.loginAPIURL; + } + // return this.loginAPIURL; + } + + public static getSearchAPIURLLast():string{ + if(this.productionMode){ + return this.searchAPIURLLAst_pm; + }else{ + return this.searchAPIURLLAst; + } + // return this.searchAPIURLLAst; + } + //query using full query: + // + public static getSearchResourcesAPIURL():string{ + if(this.productionMode){ + return this.searchResourcesAPIURL_pm; + }else{ + return this.searchResourcesAPIURL; + } + // return this.searchResourcesAPIURL; + } + public static getSearchAPIURLForEntity(entityType:string):string{ + var suffix = ""; + if(entityType == "project"){ + suffix="projects/"; + }else if(entityType == "publication"){ + suffix="publications/"; + }else if(entityType == "dataset"){ + suffix="datasets/"; + } else if(entityType == "software"){ + suffix="software/"; + }else if(entityType == "organization"){ + suffix="organizations/"; + }else if(entityType == "dataprovider"){ + suffix="datasources/"; + }else if(entityType == "person"){ + suffix="people/"; + } + return (this.productionMode?this.searchAPIURLLAst_pm:this.searchAPIURLLAst) + suffix; + } + + public static getClaimsAPIURL():string{ + if(this.productionMode){ + return this.claimsAPIURL_pm; + }else{ + return this.claimsAPIURL; + } + } + public static getSearchCrossrefAPIURL():string{ + return this.searchCrossrefAPIURL; + } + public static getSearchDataciteAPIURL():string{ + return this.searchDataciteAPIURL; + } + public static getSearchOrcidURL():string{ + return this.searchOrcidURL; + } + + // Identifiers' getters + public static getPmidURL():string{ + return this.pmidURL; + } + public static getDoiURL():string{ + return this.doiURL; + } + public static getCordisURL():string{ + return this.cordisURL; + } + public static getPmcURL():string{ + return this.pmcURL; + } + public static getHandleURL():string{ + return this.handleURL; + } + + // Zenodo's getter + public static getZenodoURL():string{ + return this.zenodo; + } + // Open access getter + public static getOpenAccess():string{ + return this.openAccess; + } + // Open access repository getter + public static getOpenAccessRepo():string{ + return this.openAccessRepo; + } + // FP7 link getter + public static getFP7Guidlines():string{ + return this.fp7Guidlines; + } + // H2020 link getter + public static getH2020Guidlines():string{ + return this.h2020Guidlines; + } + // ERC Guidlines getter + public static getERCGuidlines():string{ + return this.ercGuidlines; + } + // helpdesk link getter + public static getHelpdesk():string{ + return this.helpdesk; + } + + + //upload service for bulk claim - upload csv file + public static getUploadServiceUrl():string{ + if(this.productionMode){ + return this.uploadService_pm; + }else{ + return this.uploadService; + } + } + //vocabularies API + public static getVocabulariesAPI():string{ + return this.vocabulariesAPI; + } + public static getPiwikBaseURL():string{ + return this.piwikBaseUrl; + } + public static isPiwikTrackEnabled():boolean{ + return this.enablePiwikTrack; + } + public static getLoginURL():string{ + if(this.productionMode){ + return this.loginUrl_pm; + }else{ + return this.loginUrl; + } + } + public static getLogoutURL():string{ + if(this.productionMode){ + return this.logoutUrl_pm; + }else{ + return this.logoutUrl; + } + } + public static getCookieDomain():string{ + if(this.productionMode){ + return this.cookieDomain_pm; + }else{ + return this.cookieDomain; + } + } + public static getFeedbackMail():string{ + return this.feedbackmail; + } + public static getHelperPageUrl():string{ + return this.helperPageUrl; + } + public static isHelperEnabled():boolean{ + return this.enableHelper; + } + public static getCacheUrl():string{ + return this.cache; + } + public static isCacheEnabled():boolean{ + return this.useCache; + } +} +export class ErrorCodes { + public LOADING = 0; + public DONE = 1; + public NONE = 2; + public ERROR = 3; + public NOT_AVAILABLE = 4; + public OUT_OF_BOUND = 5; + public NOT_FOUND = 6; +} diff --git a/portal-4cli/src/app/utils/properties/searchFields.ts b/portal-4cli/src/app/utils/properties/searchFields.ts new file mode 100644 index 00000000..42589c28 --- /dev/null +++ b/portal-4cli/src/app/utils/properties/searchFields.ts @@ -0,0 +1,159 @@ +export class SearchFields { + //main Entities + //RESULTS + //Used for datasets and publications + //In case Datasets should display different fields, use seperate tables for fields + public RESULT_REFINE_FIELDS = [ + "relfunder", + "relfundinglevel0_id","relfundinglevel1_id","relfundinglevel2_id", + "relproject","resultacceptanceyear", + "resultbestaccessright", "instancetypename", "resultlanguagename", "community","resulthostingdatasource"]; + + public RESULT_ADVANCED_FIELDS:string[] = ["q","resulttitle","resultauthor","resultpublisher","instancetypename", + "resultlanguagename", "community","relprojectid", "relfunder", + "relfundinglevel0_id","relfundinglevel1_id","relfundinglevel2_id", + "resultdateofacceptance","resultbestaccessright","pid","resulthostingdatasourceid","collectedfromdatasourceid", "relorganizationid"]; + public RESULT_FIELDS: { [key:string]:FieldDetails}={ + ["q"]:{name:"All fields", type:"keyword", param:"q", equalityOperator: "="}, + ["resulttitle"]:{name:"Title", type:"keyword", param:"title", equalityOperator: "="}, + ["resultauthor"]:{name:"Author", type:"keyword", param:"author", equalityOperator: "="}, + ["resultpublisher"]:{name:"Publisher", type:"keyword", param:"publisher", equalityOperator: "="}, + ["pid"]:{name:"PID", type:"keyword", param:"pid", equalityOperator: " = "}, + ["resulthostingdatasourceid"]:{name:"Hosting Content Provider", type:"entity", param:"hostedBy", equalityOperator: " exact "}, + ["resulthostingdatasource"]:{name:"Content Provider", type:"refine", param:"hostedBy", equalityOperator: " exact "}, + ["instancetypename"]:{name:"Type", type:"vocabulary", param:"type", equalityOperator: " exact "}, + // ["instancetypenameid"]:{name:"Type", type:"vocabulary", param:"type", equalityOperator: " exact "}, + ["resultlanguagename"]:{name:"Language", type:"vocabulary", param:"lang", equalityOperator: " exact "}, + // ["resultlanguageid"]:{name:"Language", type:"vocabulary", param:"lang", equalityOperator: " exact "}, + ["community"]:{name:"Community", type:"refine", param:"community", equalityOperator: " exact "}, + ["relproject"]:{name:"Project", type:"refine", param:"project", equalityOperator: " exact "}, + ["relprojectid"]:{name:"Project", type:"entity", param:"project", equalityOperator: " exact "}, + ["relfunder"]:{name:"Funder", type:"refine", param:"funder", equalityOperator: " exact "}, + ["relfundinglevel0_id"]:{name:"Funding Stream", type:"refine", param:"funderlv0", equalityOperator: " exact "}, + ["relfundinglevel1_id"]:{name:"Funding Substream level 1", type:"refine", param:"funderlv1", equalityOperator: " exact "}, + ["relfundinglevel2_id"]:{name:"Funding Substream level 2", type:"refine", param:"funderlv2", equalityOperator: " exact "}, + ["resultacceptanceyear"]:{name:"Publication Date", type:"keyword", param:"year", equalityOperator: " exact "}, + ["resultdateofacceptance"]:{name:"Publication Date", type:"date", param:"date", equalityOperator: " within "}, + ["resultbestaccessright"]:{name:"Access Mode", type:"vocabulary", param:"access", equalityOperator: " exact "}, + // ["resultbestaccessright"]:{name:"Access Mode", type:"refine", param:"access", equalityOperator: " exact "}, + ["collectedfrom"]:{name:"Content Provider", type:"refine", param:"datasource", equalityOperator: " exact "}, + ["relorganizationid"]:{name:"Organization", type:"entity", param:"organization", equalityOperator: " exact "}, + ["collectedfromdatasourceid"]:{name:"Collected from Content Provider", type:"entity", param:"collectedFrom", equalityOperator: " exact "} + }; + + //PROJECT + + public PROJECT_REFINE_FIELDS:string[] = ["funder","fundinglevel0_id","fundinglevel1_id", + "fundinglevel2_id","projectstartyear","projectendyear","projectecsc39"]; + public PROJECT_ADVANCED_FIELDS:string[] = ["q","projectacronym","projecttitle","projectkeywords", + "funder", "fundinglevel0_id","fundinglevel1_id", "fundinglevel2_id", + "projectstartdate","projectenddate","projectecsc39", + "projectcode_nt","relorganizationid", "collectedfromdatasourceid"]; + public PROJECT_FIELDS: { [key:string]:FieldDetails}={ + ["q"]:{name:"All fields", type:"keyword", param:"q", equalityOperator: "="}, + ["projectacronym"]:{name:"Acronym", type:"keyword", param:"acronym", equalityOperator: "="}, + ["projecttitle"]:{name:"Title", type:"keyword", param:"title", equalityOperator: "="}, + ["projectkeywords"]:{name:"Keywords", type:"keyword", param:"keywords", equalityOperator: "="}, + + ["funder"]:{name:"Funder", type:"refine", param:"funder", equalityOperator: " exact "}, + ["fundinglevel0_id"]:{name:"Funding Stream", type:"refine", param:"funderlv0", equalityOperator: " exact "}, + ["fundinglevel1_id"]:{name:"Funding Substream level 1", type:"refine", param:"funderlv1", equalityOperator: " exact "}, + ["fundinglevel2_id"]:{name:"Funding Substream level 2", type:"refine", param:"funderlv2", equalityOperator: " exact "}, + ["projectstartyear"]:{name:"Start Year", type:"year", param:"startyear", equalityOperator: " exact "}, + ["projectendyear"]:{name:"End Year", type:"year", param:"endyear", equalityOperator: " exact "}, + ["projectstartdate"]:{name:"Start Date", type:"date", param:"startdate", equalityOperator: " within "}, + ["projectenddate"]:{name:"End Date", type:"date", param:"enddate", equalityOperator: " within "}, + ["projectecsc39"]:{name:"Special Clause 39", type:"boolean", param:"sc39", equalityOperator: " exact "}, + ["projectcode_nt"]:{name:"Project Code", type:"keyword", param:"code", equalityOperator: " exact "}, + ["relorganizationid"]:{name:"Organization", type:"entity", param:"organization", equalityOperator: " exact "}, + ["collectedfromdatasourceid"]:{name:"Collected from Content Provider", type:"entity", param:"collectedFrom", equalityOperator: " exact "} + + }; + + //DATAPROVIDERS + + public DATASOURCE_REFINE_FIELDS:string[] = ["datasourcetypeuiname", "datasourceodlanguages", "datasourceodcontenttypes", + "datasourcecompatibilityname"]; + public DATASOURCE_ADVANCED_FIELDS:string[] = ["q", "datasourceofficialname", + "datasourceenglishname","datasourceodsubjects", "datasourcetypename","datasourceodlanguages", + "datasourceodcontenttypes", "datasourcecompatibilityname","relorganizationid", "collectedfromdatasourceid"]; + + public DATASOURCE_FIELDS: { [key:string]:FieldDetails}={ + ["q"]:{name:"All fields", type:"keyword", param:"q", equalityOperator: "="}, + ["datasourceofficialname"]:{name:"English name", type:"keyword", param:"officialname", equalityOperator: "="}, + ["datasourceenglishname"]:{name:"Title", type:"keyword", param:"engname", equalityOperator: "="}, + ["datasourceodsubjects"]:{name:"Subject", type:"keyword", param:"subjects", equalityOperator: "="}, + ["datasourcetypeuiid"]:{name:"Type", type:"refine", param:"type", equalityOperator: " exact "}, + ["datasourcetypeuiname"]:{name:"Type", type:"refine", param:"type", equalityOperator: " exact "}, + ["datasourcetypename"]:{name:"Type", type:"vocabulary", param:"type", equalityOperator: " exact "}, + ["datasourceodlanguages"]:{name:"Language", type:"vocabulary", param:"lang", equalityOperator: " exact "}, + ["datasourceodcontenttypes"]:{name:"Content", type:"refine", param:"content", equalityOperator: " exact "}, + ["datasourcecompatibilityid"]:{name:"Compatibility Level", type:"refine", param:"compatibility", equalityOperator: " exact "}, + ["datasourcecompatibilityname"]:{name:"Compatibility Level", type:"vocabulary", param:"compatibility", equalityOperator: " exact "}, + ["relorganizationid"]:{name:"Organization", type:"entity", param:"organization", equalityOperator: " exact "}, + ["collectedfromdatasourceid"]:{name:"Collected from Content Provider", type:"entity", param:"collectedFrom", equalityOperator: " exact "} + }; + + public COMPATIBLE_DATAPROVIDER_FIELDS:string[] = ["datasourcetypeuiid","datasourcecompatibilityname"]; + public ENTITY_REGISTRIES_FIELDS:string[] = ["datasourcetypename","datasourcecompatibilityname"]; + public JOURNAL_FIELDS:string[] = ["datasourcetypeuiid","datasourcecompatibilityname"]; + + //ORGANIZATION + + public ORGANIZATION_REFINE_FIELDS:string[] = ["organizationcountryname"] + public ORGANIZATION_ADVANCED_FIELDS:string[] = ["q", "organizationlegalname","organizationlegalshortname","organizationcountryname"]; + + public ORGANIZATION_FIELDS: { [key:string]:FieldDetails}={ + ["q"]:{name:"All fields", type:"keyword", param:"q", equalityOperator: "="}, + ["organizationlegalname"]:{name:"Legal Name", type:"keyword", param:"name", equalityOperator: "="}, + ["organizationlegalshortname"]:{name:"Legal Short Name", type:"keyword", param:"shortname", equalityOperator: "="}, + ["organizationcountryname"]:{name:"Country", type:"vocabulary", param:"country", equalityOperator: "="}, + // ["organizationcountryname"]:{name:"Country", type:"refine", param:"country", equalityOperator: "="} + }; + public ORGANIZATION_INDEX:string[] = ["organizationcountryname"]//,"organizationeclegalbody"]; + public ADVANCED_SEARCH_ORGANIZATION_PARAM:string[] = ["q","contenttype","compatibility","country","type"]; + public ORGANIZATION_INDEX_PARAM_MAP:{ [key:string]:string } = {["organizationlegalname"]:"contenttype", ["organizationlegalshortname"]:"type", + ["organizationcountryname"]:"country"};//,["organizationeclegalbody"]:"type"}; + public ORGANIZATION_FIELDS_MAP: { [key:string]:{ name:string, operator:string, type:string, indexField:string , equalityOperator:string}} ={ + ["q"]:{name:"All fields",operator:"op", type:"keyword", indexField:null, equalityOperator: "="}, + ["contenttype"]:{name:"Legal Name",operator:"cn", type:"keyword" , indexField:"organizationlegalname", equalityOperator: "="}, + ["compatibility"]:{name:"Legal Short Name",operator:"cm", type:"keyword", indexField:"organizationlegalshortname", equalityOperator: "="}, + ["country"]:{name:"Country",operator:"cu", type:"vocabulary", indexField:"organizationcountryname", equalityOperator: " exact "}, + ["type"]:{name:"Type",operator:"tp", type:"refine", indexField:"organizationeclegalbody", equalityOperator: " exact "}, + + }; + + + + public HIDDEN_FIELDS:string[] = ["fundinglevel0_id","fundinglevel1_id","fundinglevel2_id", + "relfundinglevel0_id","relfundinglevel1_id","relfundinglevel2_id"]; + + public DEPENDENT_FIELDS: { [key:string]:string } = {["fundinglevel0_id"]:"funder", + ["fundinglevel1_id"]:"fundinglevel0_id", ["fundinglevel2_id"]:"fundinglevel1_id", ["relfundinglevel0_id"]:"relfunder", + ["relfundinglevel1_id"]:"relfundinglevel0_id", ["relfundinglevel2_id"]:"relfundinglevel1_id"}; + + + public ADVANCED_SEARCH_OPERATORS:[{name:string, id:string}] = [{name:"AND",id:"and"},{name:"OR",id:"or"},{name:"NOT",id:"not"}]; + + constructor (){ + } + getFieldName(fieldId:string,fieldType:string):string{ + if(fieldType == "publication" || fieldType == "dataset" || fieldType == "software"){ + return this.RESULT_FIELDS[fieldId].name; + }else if(fieldType == "project"){ + return this.PROJECT_FIELDS[fieldId].name; + }else if(fieldType == "organization"){ + return this.ORGANIZATION_FIELDS[fieldId].name; + }else if(fieldType == "datasource" || fieldType == "dataprovider"){ + return this.DATASOURCE_FIELDS[fieldId].name; + }else{ + return "UNDEFINED"; + } + } +} +class FieldDetails{ + name:string; + type:string; + param:string; + equalityOperator:string; + } diff --git a/portal-4cli/src/app/utils/properties/searchFields_new.ts b/portal-4cli/src/app/utils/properties/searchFields_new.ts new file mode 100644 index 00000000..e89edcd1 --- /dev/null +++ b/portal-4cli/src/app/utils/properties/searchFields_new.ts @@ -0,0 +1,164 @@ +export class SearchFields { + //main Entities + //RESULTS + //Used for datasets and publications + //In case Datasets should display different fields, use seperate tables for fields + public RESULT_REFINE_FIELDS = ["instancetypename", "resultlanguagename", "community","relproject", "relfunder", + "relfundinglevel0_id","relfundinglevel1_id","relfundinglevel2_id", + "resultacceptanceyear","resultbestlicense"];//,"collectedfrom"]; + + public RESULT_ADVANCED_FIELDS:string[] = ["q","resulttitle","relperson","resultpublisher","instancetypenameid", + "resultlanguageid", "community","relprojectid", "relfunder", + "relfundinglevel0_id","relfundinglevel1_id","relfundinglevel2_id", + "resultacceptanceyear","resultbestlicenseid","pid","resulthostingdatasourceid","collectedfromdatasourceid","relpersonid"]; + public RESULT_FIELDS: { [key:string]:FieldDetails}={ + ["q"]:{name:"All fields", type:"keyword", param:"q", equalityOperator: "="}, + ["resulttitle"]:{name:"Title", type:"keyword", param:"title", equalityOperator: "="}, + ["relperson"]:{name:"Author", type:"keyword", param:"author", equalityOperator: "="}, + ["resultpublisher"]:{name:"Publisher", type:"keyword", param:"publisher", equalityOperator: "="}, + ["pid"]:{name:"PID", type:"keyword", param:"pid", equalityOperator: " = "}, + ["resulthostingdatasourceid"]:{name:"Hosting Data Provider", type:"entity", param:"hostedBy", equalityOperator: " exact "}, + ["relpersonid"]:{name:"Person", type:"entity", param:"person", equalityOperator: " exact "}, + ["instancetypename"]:{name:"Type", type:"refine", param:"type", equalityOperator: " exact "}, + ["instancetypenameid"]:{name:"Type", type:"vocabulary", param:"type", equalityOperator: " exact "}, + ["resultlanguagename"]:{name:"Language", type:"refine", param:"lang", equalityOperator: " exact "}, + ["resultlanguageid"]:{name:"Language", type:"vocabulary", param:"lang", equalityOperator: " exact "}, + ["community"]:{name:"Community", type:"refine", param:"community", equalityOperator: " exact "}, + ["relproject"]:{name:"Project", type:"refine", param:"project", equalityOperator: " exact "}, + ["relprojectid"]:{name:"Project", type:"entity", param:"project", equalityOperator: " exact "}, + ["relfunder"]:{name:"Funder", type:"refine", param:"funder", equalityOperator: " exact "}, + ["relfundinglevel0_id"]:{name:"Funding Stream", type:"refine", param:"funderlv0", equalityOperator: " exact "}, + ["relfundinglevel1_id"]:{name:"Funding Substream level 1", type:"refine", param:"funderlv1", equalityOperator: " exact "}, + ["relfundinglevel2_id"]:{name:"Funding Substream level 2", type:"refine", param:"funderlv2", equalityOperator: " exact "}, + ["resultacceptanceyear"]:{name:"Year", type:"year", param:"year", equalityOperator: " exact "}, + ["resultbestlicense"]:{name:"Access Mode", type:"refine", param:"access", equalityOperator: " exact "}, + ["resultbestlicenseid"]:{name:"Access Mode", type:"vocabulary", param:"access", equalityOperator: " exact "}, + ["collectedfrom"]:{name:"Content Provider", type:"refine", param:"datasource", equalityOperator: " exact "}, + ["collectedfromdatasourceid"]:{name:"Collected from Content Provider", type:"entity", param:"collectedFrom", equalityOperator: " exact "} + }; + + //PROJECT + + public PROJECT_REFINE_FIELDS:string[] = ["funder","fundinglevel0_id","fundinglevel1_id", + "fundinglevel2_id","projectstartyear","projectendyear","projectecsc39"]; + public PROJECT_ADVANCED_FIELDS:string[] = ["q","projectacronym","projecttitle","projectkeywords", + "funder", "fundinglevel0_id","fundinglevel1_id", "fundinglevel2_id", + "projectstartyear","projectendyear","projectecsc39", + "projectcode","relorganizationid", "collectedfromdatasourceid"]; + public PROJECT_FIELDS: { [key:string]:FieldDetails}={ + ["q"]:{name:"All fields", type:"keyword", param:"q", equalityOperator: "="}, + ["projectacronym"]:{name:"Acronym", type:"keyword", param:"acronym", equalityOperator: "="}, + ["projecttitle"]:{name:"Title", type:"keyword", param:"title", equalityOperator: "="}, + ["projectkeywords"]:{name:"Keywords", type:"keyword", param:"keywords", equalityOperator: "="}, + + ["funder"]:{name:"Funder", type:"refine", param:"funder", equalityOperator: " exact "}, + ["fundinglevel0_id"]:{name:"Funding Stream", type:"refine", param:"funderlv0", equalityOperator: " exact "}, + ["fundinglevel1_id"]:{name:"Funding Substream level 1", type:"refine", param:"funderlv1", equalityOperator: " exact "}, + ["fundinglevel2_id"]:{name:"Funding Substream level 2", type:"refine", param:"funderlv2", equalityOperator: " exact "}, + ["projectstartyear"]:{name:"Start Year", type:"year", param:"startyear", equalityOperator: " exact "}, + ["projectendyear"]:{name:"End Year", type:"year", param:"endyear", equalityOperator: " exact "}, + + ["projectecsc39"]:{name:"Special Clause 39", type:"boolean", param:"sc39", equalityOperator: " exact "}, + ["projectcode"]:{name:"Project Code", type:"keyword", param:"code", equalityOperator: " exact "}, + ["relorganizationid"]:{name:"Organization", type:"entity", param:"organization", equalityOperator: " exact "}, + ["collectedfromdatasourceid"]:{name:"Collected from Content Provider", type:"entity", param:"collectedFrom", equalityOperator: " exact "} + + }; + + //DATAPROVIDERS + + public DATASOURCE_REFINE_FIELDS:string[] = ["datasourcetypeuiname", "datasourceodlanguages", "datasourceodcontenttypes", + "datasourcecompatibilityname"]; + public DATASOURCE_ADVANCED_FIELDS:string[] = ["q", "datasourceofficialname", + "datasourceenglishname","datasourceodsubjects", "datasourcetypeid","datasourceodlanguages", + "datasourceodcontenttypes", "datasourcecompatibilityid","relorganizationid", "collectedfromdatasourceid"]; + + public DATASOURCE_FIELDS: { [key:string]:FieldDetails}={ + ["q"]:{name:"All fields", type:"keyword", param:"q", equalityOperator: "="}, + ["datasourceofficialname"]:{name:"English name", type:"keyword", param:"officialname", equalityOperator: "="}, + ["datasourceenglishname"]:{name:"Title", type:"keyword", param:"engname", equalityOperator: "="}, + ["datasourceodsubjects"]:{name:"Subject", type:"keyword", param:"subjects", equalityOperator: "="}, + ["datasourcetypeuiid"]:{name:"Type", type:"refine", param:"type", equalityOperator: " exact "}, + ["datasourcetypeuiname"]:{name:"Type", type:"refine", param:"type", equalityOperator: " exact "}, + ["datasourcetypeid"]:{name:"Type", type:"vocabulary", param:"type", equalityOperator: " exact "}, + ["datasourceodlanguages"]:{name:"Language", type:"vocabulary", param:"lang", equalityOperator: " exact "}, + ["datasourceodcontenttypes"]:{name:"Content", type:"refine", param:"content", equalityOperator: " exact "}, + ["datasourcecompatibilityid"]:{name:"Compatibility Level", type:"vocabulary", param:"compatibility", equalityOperator: " exact "}, + ["datasourcecompatibilityname"]:{name:"Compatibility Level", type:"refine", param:"compatibility", equalityOperator: " exact "}, + ["relorganizationid"]:{name:"Organization", type:"entity", param:"organization", equalityOperator: " exact "}, + ["collectedfromdatasourceid"]:{name:"Collected from Content Provider", type:"entity", param:"collectedFrom", equalityOperator: " exact "} + + }; + + public COMPATIBLE_DATAPROVIDER_FIELDS:string[] = ["datasourcetypeuiid","datasourcecompatibilityid"]; + public ENTITY_REGISTRIES_FIELDS:string[] = ["datasourcetypeid","datasourcecompatibilityid"]; + + //ORGANIZATION + + public ORGANIZATION_REFINE_FIELDS:string[] = ["organizationcountryname"] + public ORGANIZATION_ADVANCED_FIELDS:string[] = ["q", + "organizationlegalname","organizationlegalshortname","organizationcountryid"]; + + public ORGANIZATION_FIELDS: { [key:string]:FieldDetails}={ + ["q"]:{name:"All fields", type:"keyword", param:"q", equalityOperator: "="}, + ["organizationlegalname"]:{name:"Legal Name", type:"keyword", param:"name", equalityOperator: "="}, + ["organizationlegalshortname"]:{name:"Legal Short Name", type:"keyword", param:"shortname", equalityOperator: "="}, + ["organizationcountryid"]:{name:"Country", type:"vocabulary", param:"country", equalityOperator: "="}, + ["organizationcountryname"]:{name:"Country", type:"refine", param:"country", equalityOperator: "="} + }; + public ORGANIZATION_INDEX:string[] = ["organizationcountryname"]//,"organizationeclegalbody"]; + public ADVANCED_SEARCH_ORGANIZATION_PARAM:string[] = ["q","contenttype","compatibility","country","type"]; + public ORGANIZATION_INDEX_PARAM_MAP:{ [key:string]:string } = {["organizationlegalname"]:"contenttype", ["organizationlegalshortname"]:"type", + ["organizationcountryname"]:"country"};//,["organizationeclegalbody"]:"type"}; + public ORGANIZATION_FIELDS_MAP: { [key:string]:{ name:string, operator:string, type:string, indexField:string , equalityOperator:string}} ={ + ["q"]:{name:"All fields",operator:"op", type:"keyword", indexField:null, equalityOperator: "="}, + ["contenttype"]:{name:"Legal Name",operator:"cn", type:"keyword" , indexField:"organizationlegalname", equalityOperator: "="}, + ["compatibility"]:{name:"Legal Short Name",operator:"cm", type:"keyword", indexField:"organizationlegalshortname", equalityOperator: "="}, + ["country"]:{name:"Country",operator:"cu", type:"vocabulary", indexField:"organizationcountryname", equalityOperator: " exact "}, + ["type"]:{name:"Type",operator:"tp", type:"refine", indexField:"organizationeclegalbody", equalityOperator: " exact "}, + + }; + + //PERSON + public PERSON_REFINE_FIELDS:string[] = []; + public PERSON_ADVANCED_FIELDS:string[] = ["q","personsecondnames","personfirstname","personfullname"]; + public PERSON_FIELDS: { [key:string]:FieldDetails}={ + ["q"]:{name:"All fields", type:"keyword", param:"q", equalityOperator: "="}, + ["personsecondnames"]:{name:"Surname", type:"keyword", param:"surname", equalityOperator: "="}, + ["personfirstname"]:{name:"First Name",type:"keyword", param:"name", equalityOperator: "="}, + ["personfullname"]:{name:"Full name", type:"keyword", param:"fullname", equalityOperator: "="} + }; + + + public HIDDEN_FIELDS:string[] = ["fundinglevel0_id","fundinglevel1_id","fundinglevel2_id", + "relfundinglevel0_id","relfundinglevel1_id,relfundinglevel2_id"]; + + public DEPENDENT_FIELDS: { [key:string]:string } = {["fundinglevel0_id"]:"funder", + ["fundinglevel1_id"]:"fundinglevel0_id", ["fundinglevel2_id"]:"fundinglevel1_id", ["relfundinglevel0_id"]:"relfunder", + ["relfundinglevel1_id"]:"relfundinglevel0_id", ["relfundinglevel2_id"]:"relfundinglevel1_id"}; + + + public ADVANCED_SEARCH_OPERATORS:[{name:string, id:string}] = [{name:"AND",id:"and"},{name:"OR",id:"or"},{name:"NOT",id:"not"}]; + + constructor (){ + } + getFieldName(fieldId:string,fieldType:string):string{ + if(fieldType == "publication" || fieldType == "dataset"){ + return this.RESULT_FIELDS[fieldId].name; + }else if(fieldType == "project"){ + return this.PROJECT_FIELDS[fieldId].name; + }else if(fieldType == "organization"){ + return this.ORGANIZATION_FIELDS[fieldId].name; + }else if(fieldType == "datasource"){ + return this.DATASOURCE_FIELDS[fieldId].name; + }else{ + return "UNDEFINED"; + } + } +} +class FieldDetails{ + name:string; + type:string; + param:string; + equalityOperator:string; + } diff --git a/portal-4cli/src/app/utils/properties/searchFields_old.ts b/portal-4cli/src/app/utils/properties/searchFields_old.ts new file mode 100644 index 00000000..9c74982a --- /dev/null +++ b/portal-4cli/src/app/utils/properties/searchFields_old.ts @@ -0,0 +1,164 @@ +export class SearchFields { + //main Entities + //RESULTS + //Used for datasets and publications + //In case Datasets should display different fields, use seperate tables for fields + public RESULT_REFINE_FIELDS = ["instancetypename", "resultlanguagename", "community","relproject", "relfunderid", + "relfundinglevel0_id","relfundinglevel1_id","relfundinglevel2_id", + "resultacceptanceyear","resultbestlicense"];//,"collectedfrom"]; + + public RESULT_ADVANCED_FIELDS:string[] = ["q","resulttitle","relperson","resultpublisher","instancetypenameid", + "resultlanguageid", "community","relprojectid", "relfunderid", + "relfundinglevel0_id","relfundinglevel1_id","relfundinglevel2_id", + "resultacceptanceyear","resultbestlicenseid","pid","resulthostingdatasourceid","collectedfromdatasourceid","relpersonid"]; + public RESULT_FIELDS: { [key:string]:FieldDetails}={ + ["q"]:{name:"All fields", type:"keyword", param:"q", equalityOperator: "="}, + ["resulttitle"]:{name:"Title", type:"keyword", param:"title", equalityOperator: "="}, + ["relperson"]:{name:"Author", type:"keyword", param:"author", equalityOperator: "="}, + ["resultpublisher"]:{name:"Publisher", type:"keyword", param:"publisher", equalityOperator: "="}, + ["pid"]:{name:"PID", type:"keyword", param:"pid", equalityOperator: " = "}, + ["resulthostingdatasourceid"]:{name:"Hosting Data Provider", type:"entity", param:"hostedBy", equalityOperator: " exact "}, + ["relpersonid"]:{name:"Person", type:"entity", param:"person", equalityOperator: " exact "}, + ["instancetypename"]:{name:"Type", type:"refine", param:"type", equalityOperator: " exact "}, + ["instancetypenameid"]:{name:"Type", type:"vocabulary", param:"type", equalityOperator: " exact "}, + ["resultlanguagename"]:{name:"Language", type:"refine", param:"lang", equalityOperator: " exact "}, + ["resultlanguageid"]:{name:"Language", type:"vocabulary", param:"lang", equalityOperator: " exact "}, + ["community"]:{name:"Community", type:"refine", param:"community", equalityOperator: " exact "}, + ["relproject"]:{name:"Project", type:"refine", param:"project", equalityOperator: " exact "}, + ["relprojectid"]:{name:"Project", type:"entity", param:"project", equalityOperator: " exact "}, + ["relfunderid"]:{name:"Funder", type:"refine", param:"funder", equalityOperator: " exact "}, + ["relfundinglevel0_id"]:{name:"Funding Stream", type:"refine", param:"funderlv0", equalityOperator: " exact "}, + ["relfundinglevel1_id"]:{name:"Funding Substream level 1", type:"refine", param:"funderlv1", equalityOperator: " exact "}, + ["relfundinglevel2_id"]:{name:"Funding Substream level 2", type:"refine", param:"funderlv2", equalityOperator: " exact "}, + ["resultacceptanceyear"]:{name:"Year", type:"year", param:"year", equalityOperator: " exact "}, + ["resultbestlicense"]:{name:"Access Mode", type:"refine", param:"access", equalityOperator: " exact "}, + ["resultbestlicenseid"]:{name:"Access Mode", type:"vocabulary", param:"access", equalityOperator: " exact "}, + ["collectedfrom"]:{name:"Content Provider", type:"refine", param:"datasource", equalityOperator: " exact "}, + ["collectedfromdatasourceid"]:{name:"Collected from Content Provider", type:"entity", param:"collectedFrom", equalityOperator: " exact "} + }; + + //PROJECT + + public PROJECT_REFINE_FIELDS:string[] = ["funderid","fundinglevel0_id","fundinglevel1_id", + "fundinglevel2_id","projectstartyear","projectendyear","projectecsc39"]; + public PROJECT_ADVANCED_FIELDS:string[] = ["q","projectacronym","projecttitle","projectkeywords", + "funderid", "fundinglevel0_id","fundinglevel1_id", "fundinglevel2_id", + "projectstartyear","projectendyear","projectecsc39", + "projectcode","relorganizationid", "collectedfromdatasourceid"]; + public PROJECT_FIELDS: { [key:string]:FieldDetails}={ + ["q"]:{name:"All fields", type:"keyword", param:"q", equalityOperator: "="}, + ["projectacronym"]:{name:"Acronym", type:"keyword", param:"acronym", equalityOperator: "="}, + ["projecttitle"]:{name:"Title", type:"keyword", param:"title", equalityOperator: "="}, + ["projectkeywords"]:{name:"Keywords", type:"keyword", param:"keywords", equalityOperator: "="}, + + ["funderid"]:{name:"Funder", type:"refine", param:"funder", equalityOperator: " exact "}, + ["fundinglevel0_id"]:{name:"Funding Stream", type:"refine", param:"funderlv0", equalityOperator: " exact "}, + ["fundinglevel1_id"]:{name:"Funding Substream level 1", type:"refine", param:"funderlv1", equalityOperator: " exact "}, + ["fundinglevel2_id"]:{name:"Funding Substream level 2", type:"refine", param:"funderlv2", equalityOperator: " exact "}, + ["projectstartyear"]:{name:"Start Year", type:"year", param:"startyear", equalityOperator: " exact "}, + ["projectendyear"]:{name:"End Year", type:"year", param:"endyear", equalityOperator: " exact "}, + + ["projectecsc39"]:{name:"Special Clause 39", type:"boolean", param:"sc39", equalityOperator: " exact "}, + ["projectcode"]:{name:"Project Code", type:"keyword", param:"code", equalityOperator: " exact "}, + ["relorganizationid"]:{name:"Organization", type:"entity", param:"organization", equalityOperator: " exact "}, + ["collectedfromdatasourceid"]:{name:"Collected from Content Provider", type:"entity", param:"collectedFrom", equalityOperator: " exact "} + + }; + + //DATAPROVIDERS + + public DATASOURCE_REFINE_FIELDS:string[] = ["datasourcetypeuiname", "datasourceodlanguages", "datasourceodcontenttypes", + "datasourcecompatibilityname"]; + public DATASOURCE_ADVANCED_FIELDS:string[] = ["q", "datasourceofficialname", + "datasourceenglishname","datasourceodsubjects", "datasourcetypeid","datasourceodlanguages", + "datasourceodcontenttypes", "datasourcecompatibilityid","relorganizationid", "collectedfromdatasourceid"]; + + public DATASOURCE_FIELDS: { [key:string]:FieldDetails}={ + ["q"]:{name:"All fields", type:"keyword", param:"q", equalityOperator: "="}, + ["datasourceofficialname"]:{name:"English name", type:"keyword", param:"officialname", equalityOperator: "="}, + ["datasourceenglishname"]:{name:"Title", type:"keyword", param:"engname", equalityOperator: "="}, + ["datasourceodsubjects"]:{name:"Subject", type:"keyword", param:"subjects", equalityOperator: "="}, + ["datasourcetypeuiid"]:{name:"Type", type:"refine", param:"type", equalityOperator: " exact "}, + ["datasourcetypeuiname"]:{name:"Type", type:"refine", param:"type", equalityOperator: " exact "}, + ["datasourcetypeid"]:{name:"Type", type:"vocabulary", param:"type", equalityOperator: " exact "}, + ["datasourceodlanguages"]:{name:"Language", type:"vocabulary", param:"lang", equalityOperator: " exact "}, + ["datasourceodcontenttypes"]:{name:"Content", type:"refine", param:"content", equalityOperator: " exact "}, + ["datasourcecompatibilityid"]:{name:"Compatibility Level", type:"vocabulary", param:"compatibility", equalityOperator: " exact "}, + ["datasourcecompatibilityname"]:{name:"Compatibility Level", type:"refine", param:"compatibility", equalityOperator: " exact "}, + ["relorganizationid"]:{name:"Organization", type:"entity", param:"organization", equalityOperator: " exact "}, + ["collectedfromdatasourceid"]:{name:"Collected from Content Provider", type:"entity", param:"collectedFrom", equalityOperator: " exact "} + + }; + + public COMPATIBLE_DATAPROVIDER_FIELDS:string[] = ["datasourcetypeuiid","datasourcecompatibilityid"]; + public ENTITY_REGISTRIES_FIELDS:string[] = ["datasourcetypeid","datasourcecompatibilityid"]; + + //ORGANIZATION + + public ORGANIZATION_REFINE_FIELDS:string[] = ["organizationcountryname"] + public ORGANIZATION_ADVANCED_FIELDS:string[] = ["q", + "organizationlegalname","organizationlegalshortname","organizationcountryid"]; + + public ORGANIZATION_FIELDS: { [key:string]:FieldDetails}={ + ["q"]:{name:"All fields", type:"keyword", param:"q", equalityOperator: "="}, + ["organizationlegalname"]:{name:"Legal Name", type:"keyword", param:"name", equalityOperator: "="}, + ["organizationlegalshortname"]:{name:"Legal Short Name", type:"keyword", param:"shortname", equalityOperator: "="}, + ["organizationcountryid"]:{name:"Country", type:"vocabulary", param:"country", equalityOperator: "="}, + ["organizationcountryname"]:{name:"Country", type:"refine", param:"country", equalityOperator: "="} + }; + public ORGANIZATION_INDEX:string[] = ["organizationcountryname"]//,"organizationeclegalbody"]; + public ADVANCED_SEARCH_ORGANIZATION_PARAM:string[] = ["q","contenttype","compatibility","country","type"]; + public ORGANIZATION_INDEX_PARAM_MAP:{ [key:string]:string } = {["organizationlegalname"]:"contenttype", ["organizationlegalshortname"]:"type", + ["organizationcountryname"]:"country"};//,["organizationeclegalbody"]:"type"}; + public ORGANIZATION_FIELDS_MAP: { [key:string]:{ name:string, operator:string, type:string, indexField:string , equalityOperator:string}} ={ + ["q"]:{name:"All fields",operator:"op", type:"keyword", indexField:null, equalityOperator: "="}, + ["contenttype"]:{name:"Legal Name",operator:"cn", type:"keyword" , indexField:"organizationlegalname", equalityOperator: "="}, + ["compatibility"]:{name:"Legal Short Name",operator:"cm", type:"keyword", indexField:"organizationlegalshortname", equalityOperator: "="}, + ["country"]:{name:"Country",operator:"cu", type:"vocabulary", indexField:"organizationcountryname", equalityOperator: " exact "}, + ["type"]:{name:"Type",operator:"tp", type:"refine", indexField:"organizationeclegalbody", equalityOperator: " exact "}, + + }; + + //PERSON + public PERSON_REFINE_FIELDS:string[] = []; + public PERSON_ADVANCED_FIELDS:string[] = ["q","personsecondnames","personfirstname","personfullname"]; + public PERSON_FIELDS: { [key:string]:FieldDetails}={ + ["q"]:{name:"All fields", type:"keyword", param:"q", equalityOperator: "="}, + ["personsecondnames"]:{name:"Surname", type:"keyword", param:"surname", equalityOperator: "="}, + ["personfirstname"]:{name:"First Name",type:"keyword", param:"name", equalityOperator: "="}, + ["personfullname"]:{name:"Full name", type:"keyword", param:"fullname", equalityOperator: "="} + }; + + + public HIDDEN_FIELDS:string[] = ["fundinglevel0_id","fundinglevel1_id","fundinglevel2_id", + "relfundinglevel0_id","relfundinglevel1_id,relfundinglevel2_id"]; + + public DEPENDENT_FIELDS: { [key:string]:string } = {["fundinglevel0_id"]:"funderid", + ["fundinglevel1_id"]:"fundinglevel0_id", ["fundinglevel2_id"]:"fundinglevel1_id", ["relfundinglevel0_id"]:"relfunderid", + ["relfundinglevel1_id"]:"relfundinglevel0_id", ["relfundinglevel2_id"]:"relfundinglevel1_id"}; + + + public ADVANCED_SEARCH_OPERATORS:[{name:string, id:string}] = [{name:"AND",id:"and"},{name:"OR",id:"or"},{name:"NOT",id:"not"}]; + + constructor (){ + } + getFieldName(fieldId:string,fieldType:string):string{ + if(fieldType == "publication" || fieldType == "dataset"){ + return this.RESULT_FIELDS[fieldId].name; + }else if(fieldType == "project"){ + return this.PROJECT_FIELDS[fieldId].name; + }else if(fieldType == "organization"){ + return this.ORGANIZATION_FIELDS[fieldId].name; + }else if(fieldType == "datasource"){ + return this.DATASOURCE_FIELDS[fieldId].name; + }else{ + return "UNDEFINED"; + } + } +} +class FieldDetails{ + name:string; + type:string; + param:string; + equalityOperator:string; + } diff --git a/portal-4cli/src/app/utils/routerHelper.class.ts b/portal-4cli/src/app/utils/routerHelper.class.ts new file mode 100644 index 00000000..fecaf296 --- /dev/null +++ b/portal-4cli/src/app/utils/routerHelper.class.ts @@ -0,0 +1,34 @@ + + + +export class RouterHelper { + //Use this class function to create queryParams Objects in format {key1:value1} or {key1:value1,key2:value2,key3:value3,...} for multiple parameters + constructor(){} + // Link + public createQueryParam(key:string,value:string){ + var obj ={}; + obj[key]=value; + return obj; + + } + public createQueryParamsPaging(keys:string[],values:string[],pageParameter:string,pageValue:number){ + var obj = this.createQueryParams(keys, values); + obj[pageParameter] = ""+pageValue; + return obj; + + } + public createQueryParams(keys:string[],values:string[]){ + var obj ={}; + if(!keys || !values || keys.length != values.length){ + return obj; + }else{ + for(var i=0; i< keys.length; i++){ + obj[keys[i]]=values[i]; + } + } + return obj; + + } + + +} diff --git a/portal-4cli/src/app/utils/showDataProviders.component.ts b/portal-4cli/src/app/utils/showDataProviders.component.ts new file mode 100644 index 00000000..6b377d38 --- /dev/null +++ b/portal-4cli/src/app/utils/showDataProviders.component.ts @@ -0,0 +1,61 @@ +// import {Component, Input} from '@angular/core'; +// +// @Component({ +// selector: 'showDataProviders', +// template: ` +// +//
    +// No content providers available +//
    +//
    +// +// +//
    +// ` +// }) +// +// // Possibly should be deleted. Not used anywhere. +// export class ShowDataProvidersComponent { +// @Input() dataProviders: { "name": string, "url": string, "type": string, "websiteUrl": string, +// "organizations": {"name": string, "url": string}[]}[]; +// +// constructor () { +// } +// +// ngOnInit() {} +// } diff --git a/portal-4cli/src/app/utils/staticAutoComplete/ISVocabularies.service.ts b/portal-4cli/src/app/utils/staticAutoComplete/ISVocabularies.service.ts new file mode 100644 index 00000000..7ec5902e --- /dev/null +++ b/portal-4cli/src/app/utils/staticAutoComplete/ISVocabularies.service.ts @@ -0,0 +1,110 @@ +import {Injectable} from '@angular/core'; +import {Http, Response} from '@angular/http'; +import {Observable} from 'rxjs/Observable'; +import {AutoCompleteValue} from '../../searchPages/searchUtils/searchHelperClasses.class'; +import 'rxjs/add/observable/of'; +import 'rxjs/add/operator/do'; +import 'rxjs/add/operator/share'; + +import {OpenaireProperties} from '../../utils/properties/openaireProperties'; + +@Injectable() +export class ISVocabulariesService { + private api =OpenaireProperties.getVocabulariesAPI(); + constructor(private http: Http ) {} + + getVocabularyByType(field:string,entity:string):any{ + console.log("getVocabulary field: "+ field + " for entity: "+ entity); + var file = ""; + var vocabulary = ""; + if( field == "lang"){ + // file="languages.json"; + // return this.getVocabularyFromFile(file); + vocabulary = "dnet:languages.json"; + return this.getVocabularyFromService(vocabulary); + }else if ( field == "type" && (entity == "publication")){ + // file = "publicationTypes.json"; + // return this.getVocabularyFromFile(file); + vocabulary = "dnet:publication_resource.json"; + return this.getVocabularyFromService(vocabulary); + + }else if ( field == "type" && (entity == "dataset")){ + // file = "dnet:dataCite_resource.json"; + // return this.getVocabularyFromFile(file); + vocabulary = "dnet:dataCite_resource.json"; + return this.getVocabularyFromService(vocabulary); + + }else if( field == "access" && (entity == "publication" || entity == "dataset")){ + // file= "accessMode.json"; + // return this.getVocabularyFromFile(file); + vocabulary = "dnet:access_modes.json"; + return this.getVocabularyFromService(vocabulary); + + } else if( (field == "type") && (entity == "dataprovider")){ + // file = "dataProviderType.json"; + // return this.getVocabularyFromFile(file); + vocabulary = "dnet:datasource_typologies.json"; + return this.getVocabularyFromService(vocabulary); + + } else if( field == "compatibility" && (entity == "dataprovider")){ + // file = "dataProviderCompatibility.json"; + // return this.getVocabularyFromFile(file); + vocabulary = "dnet:datasourceCompatibilityLevel.json"; + return this.getVocabularyFromService(vocabulary); + + } else if( field == "country" ){ + // file = "countries.json"; + // return this.getVocabularyFromFile(file); + vocabulary = "dnet:countries.json"; + return this.getVocabularyFromService(vocabulary); + + } + return null; + + } + // getVocabularyFromFile (file:string):AutoCompleteValue[] { + // var lang = JSON.parse(JSON.stringify(require('../utils/vocabularies/'+file))); + // return this.parse(lang["terms"]); + // } + getVocabularyFromService (vocabularyName:string):any { + let url = this.api + vocabularyName; + console.log(url); + + // return this.http.get(url).toPromise() + // .then(request => + // { + // request = request.json()['terms']; + // var results:AutoCompleteValue[] = this.parse(request); + // console.log("Get vocabulary : "+ vocabularyName+ " - get " +results.length+ "results"); + // return results; + // }); + return this.http.get((OpenaireProperties.isCacheEnabled())? (OpenaireProperties.getCacheUrl()+encodeURIComponent(url)): url) + .do(res => console.log(res)) + .map(res => res.json()) + .map(res => res['terms']) + .do(res => console.log(res)) + .map(res => this.parse(res)) + .do(res => console.log(res)) + .catch(this.handleError); + + } + + parse (data: any):AutoCompleteValue[] { + var array:AutoCompleteValue[] =[] + for(var i = 0; i < data.length; i++){ + var value:AutoCompleteValue = new AutoCompleteValue(); + value.id = data[i].englishName;//data[i].code; + value.label = data[i].englishName; + array.push(value); + } + + return array; + + } +private handleError (error: Response) { + // in a real world app, we may send the error to some remote logging infrastructure + // instead of just logging it to the console + console.log(error); + return Observable.throw(error || 'Server error'); + } +} diff --git a/portal-4cli/src/app/utils/staticAutoComplete/staticAutoComplete.component.ts b/portal-4cli/src/app/utils/staticAutoComplete/staticAutoComplete.component.ts new file mode 100644 index 00000000..bb90dcac --- /dev/null +++ b/portal-4cli/src/app/utils/staticAutoComplete/staticAutoComplete.component.ts @@ -0,0 +1,300 @@ +import {Component, ElementRef, Input, Output, EventEmitter, OnChanges, SimpleChange} from '@angular/core'; +import {Value} from '../../searchPages/searchUtils/searchHelperClasses.class'; +import {ISVocabulariesService} from './ISVocabularies.service'; +import {RefineFieldResultsService} from '../../services/refineFieldResults.service'; +//Usage example +// + +@Component({ + selector: 'static-autocomplete', + styleUrls: ['../autoComplete.component.css'], + host: { + '(document:click)': 'handleClick($event)', + }, + template: ` + + + {{showItem(item)}} + + + + + +
    +
      +
    • + Loading... + {{results}} results found: + No results found +
    • +
    • + {{showItem(item)}} +
    • +
    +
    +
    + + ` +}) +export class StaticAutoCompleteComponent implements OnChanges{ + @Input() placeHolderMessage = "Search for entries"; + @Input() title = "Autocomplete"; + @Output() addItem = new EventEmitter(); // when selected list changes update parent component + @Output() selectedValueChanged = new EventEmitter(); // when changed a method for filtering will be called + @Output() listUpdated = new EventEmitter(); // when changed a method for filtering will be called + @Input() public list = []; // the entries resulted after filtering function + @Input() public filtered = []; // the entries resulted after filtering function + @Input() public selected = []; // the entries selected from user + @Input() public keywordlimit = 3; // the minimum length of keyword + @Input() public showSelected = true; // the minimum length of keyword + @Input() public multipleSelections:boolean = true; + @Input() public allowDuplicates:boolean = false; + @Input() public selectedValue:string = ''; + @Input() public vocabularyId:string ; + @Input() public fieldName:string ; + @Input() public entityName:string ; + @Input() public fieldId:string ; + + @Input() public keyword = ''; + @Input() public type = 'search' //search, result, context, project + public warningMessage = ""; + public infoMessage = ""; + public showLoading:boolean = false; + public tries = 0; + public showInput = true; + public sub; + public done = false; + public results = 0; + public focus:boolean = false; + public currentFieldId: string ; + constructor ( private _vocabulariesService: ISVocabulariesService,private _refineService: RefineFieldResultsService, private myElement: ElementRef) { + this.currentFieldId=this.fieldId; + + } + ngOnDestroy(){ + if(this.sub && this.sub != undefined){ + this.sub.unsubscribe(); + } + } + + ngOnChanges(changes: {[propKey: string]: SimpleChange}) { + if(this.currentFieldId!=this.fieldId){ //this is going to be called when + this.currentFieldId=this.fieldId; + this.initialize(); + } + } + private initialize(){ + + this.showInput = true; + if(this.list == undefined || this.list.length == 0){ + this.showLoading = true; + + if(this.vocabularyId){ + // this.list = this._vocabulariesService.getVocabularyByType(this.vocabularyId, this.entityName); + // this.afterListFetchedActions(); + this.sub = this._vocabulariesService.getVocabularyByType(this.vocabularyId, this.entityName).subscribe( + data => { + this.list = data; + this.afterListFetchedActions(); + + }, + err => { + console.log(err); + this.warningMessage = "An Error occured..." + } + ); + }else if(this.fieldName && this.entityName){ + // this.list = this._refineService.getRefineFieldResultsByFieldName(this.fieldName,this.entityName); + this.sub = this._refineService.getRefineFieldResultsByFieldName(this.fieldName,this.entityName).subscribe( + data => { + this.list = data; + this.afterListFetchedActions(); + + }, + err => { + console.log(err); + this.warningMessage = "An Error occured..." + } + ); + }else{ + this.showLoading = false; + + } + }else{ + this.afterListFetchedActions(); + } + + } + public updateList(list){ // used in claim context autocomplete + this.list = list; + this.afterListFetchedActions() + } + private afterListFetchedActions(){ + this.showLoading = false; + this.getSelectedNameFromGivenId(); + this.listUpdated.emit({ + value: this.list + }); + if(this.list == null || this.list.length == 0 ){ + this.warningMessage = "No results available"; + return; + } + this.done = true; + if(this.keyword != ""){ + this.filter(); + } + + } + filter() { + this.focus = true; + if(this.done){ + this.infoMessage = ""; + this.filtered = []; + if(this.keyword == ""){ + var cut = 10; + if(this.list.length < 5){ + cut = this.list.length; + } + this.results = this.list.length; + this.filtered =this.list.slice(0, cut); + this.tries = 0; + this.warningMessage = ""; + // } else if(this.keyword && this.keyword.length < this.keywordlimit){ + // this.tries++; + // if(this.tries == this.keywordlimit -1 ){ + // this.warningMessage = "Type at least " + this.keywordlimit + " characters"; + // this.tries = 0; + // } + }else{ + this.tries = 0; + this.warningMessage = ""; + this.filtered = this.list.filter(function(el){ + return el.label.toLowerCase().indexOf(this.keyword.toLowerCase()) > -1; + }.bind(this)); + var cut = 10; + if(this.filtered .length < 5){ + cut = this.list.length; + } + this.results = this.filtered.length; + this.filtered =this.filtered.slice(0, cut); + } + } + } + remove(item:any){ + var index:number =this.checkIfExists(item,this.selected); + if (index > -1) { + this.selected.splice(index, 1); + } + if(!this.multipleSelections && this.selected.length == 0 ){ + this.showInput = true; + this.selectedValue = ""; + this.selectedValueChanged.emit({ + value: this.selectedValue + }); + + + } + } + select(item:any){ + // console.log("select"+this.selected.length + item.id + " "+ item.label); + + if(this.multipleSelections){ + var index:number =this.checkIfExists(item,this.selected); + if (index > -1 && !this.allowDuplicates) { + this.keyword = ""; + this.filtered.splice(0, this.filtered.length); + return; + } + else{ + this.selected.push(item); + this.keyword = ""; + this.filtered.splice(0, this.filtered.length); + this.addItem.emit({ + value: item + }); + } + }else{ + this.selected.splice(0, this.selected.length); + this.selected.push(item); + this.filtered.splice(0, this.filtered.length); + this.keyword = ""; + this.showInput = false; + this.selectedValue = item.id; + this.selectedValueChanged.emit({ + value: this.selectedValue + }); + + } + + } + private checkIfExists(item:any,list):number{ + + if(item.concept && item.concept.id ){ + + for (var _i = 0; _i < list.length; _i++) { + let itemInList = list[_i]; + if(item.concept.id == itemInList.concept.id){ + return _i; + } + } + }else if(item.id){ + for (var _i = 0; _i < list.length; _i++) { + let itemInList = list[_i]; + if(item.id == itemInList.id){ + return _i; + } + } + } + return -1; + + } + showItem(item:any):string{ + + if (item.name){ //search + return item.name; + }else if( item.concept && item.concept.label){ //context + return item.concept.label; + }else if (item.label){ //simple + return item.label; + } + + } + truncate(str:string, size:number):string{ + if(str == null){return "";} + return (str.length > size)?str.substr(0,size)+'...':str; + } + private getSelectedNameFromGivenId(){ + if(this.list == null ){ + return; + } + this.showInput = true; + for( var i = 0; i < this.list.length; i++){ + if(this.list[i].id == this.selectedValue){ + this.selectedValue = this.list[i].label; + this.selected.push(this.list[i]); + this.showInput = false; + return; + + } + } + } + + handleClick(event){ + var clickedComponent = event.target; + var inside = false; + do { + if (clickedComponent === this.myElement.nativeElement) { + inside = true; + } + clickedComponent = clickedComponent.parentNode; + } while (clickedComponent); + if(!inside){ + this.focus =false; + this.filtered.splice(0, this.filtered.length); + } + } + +} diff --git a/portal-4cli/src/app/utils/staticAutoComplete/staticAutoComplete.module.ts b/portal-4cli/src/app/utils/staticAutoComplete/staticAutoComplete.module.ts new file mode 100644 index 00000000..1c876a15 --- /dev/null +++ b/portal-4cli/src/app/utils/staticAutoComplete/staticAutoComplete.module.ts @@ -0,0 +1,22 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; + +import {StaticAutoCompleteComponent} from './staticAutoComplete.component'; +import {RefineFieldResultsServiceModule} from '../../services/refineFieldResultsService.module'; +import {ISVocabulariesService} from './ISVocabularies.service'; + + +@NgModule({ + imports: [ + CommonModule, FormsModule, RefineFieldResultsServiceModule + ], + declarations: [ + StaticAutoCompleteComponent + ], + exports: [ + StaticAutoCompleteComponent + ], + providers:[ ISVocabulariesService] +}) +export class StaticAutocompleteModule { } diff --git a/portal-4cli/src/app/utils/string-utils.class.ts b/portal-4cli/src/app/utils/string-utils.class.ts new file mode 100644 index 00000000..ece1ce3e --- /dev/null +++ b/portal-4cli/src/app/utils/string-utils.class.ts @@ -0,0 +1,129 @@ +export class Dates { + public static isValidYear(yearString){ + // First check for the pattern + if(!/^\d{4}$/.test(yearString)) + return false; + var year = parseInt(yearString, 10); + + // Check the ranges of month and year + if(year < 1000 || year > 3000 ) + return false; + return true; + } + //format YYYY-MM-DD + public static isValidDate(dateString:string) + { + // First check for the pattern + if(!/^\d{4}\-\d{1,2}\-\d{1,2}$/.test(dateString)) + return false; + + // Parse the date parts to integers + var parts = dateString.split("-"); + var day = parseInt(parts[2], 10); + var month = parseInt(parts[1], 10); + var year = parseInt(parts[0], 10); + if(!this.isValidYear(parts[0])){ + return false; + } + + // Check the ranges of month and year + if( month == 0 || month > 12) + return false; + + var monthLength = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]; + + // Adjust for leap years + if(year % 400 == 0 || (year % 100 != 0 && year % 4 == 0)) + monthLength[1] = 29; + + // Check the range of the day + return day > 0 && day <= monthLength[month - 1]; + + } + public static getDateToday():Date{ + var myDate = new Date(); + return myDate; + + } + public static getDateToString(myDate:Date):string{ + var date:string = myDate.getFullYear()+ "-" ; + date+=((myDate.getMonth() + 1)<10)?"0"+(myDate.getMonth() + 1):(myDate.getMonth() + 1) ; + date+="-"; + date+= (myDate.getDate() <10 )? "0"+myDate.getDate():myDate.getDate() ; + return date; + + } + public static getDateXMonthsAgo(x:number):Date{ + var myDate = new Date(); + myDate.setMonth(myDate.getMonth() - x); + return myDate; + + } + public static getDateXYearsAgo(x:number):Date{ + var myDate = new Date(); + myDate.setFullYear(myDate.getFullYear() - x); + return myDate; + + } + public static getDateFromString(date:string):Date{ + + var myDate = new Date(); + myDate.setFullYear(+date.substring(0,4)); + myDate.setMonth(+date.substring(5,7)-1); + myDate.setDate(+date.substring(8,11)) + return myDate; + + } + +} + +export class DOI{ + + public static getDOIsFromString(str:string):string[]{ + var DOIs:string[] = []; + var words:string[] = str.split(" "); + + for(var i=0; i< words.length; i++){ + if(DOI.isValidDOI(words[i]) && DOIs.indexOf(words[i]) == -1){ + DOIs.push(words[i]); + } + } + return DOIs; + } + public static isValidDOI(str:string):boolean{ + + var exp1 = /\b(10[.][0-9]{4,}(?:[.][0-9]+)*\/(?:(?!["&\'<>])\S)+)\b/g + var exp2 = /\b(10[.][0-9]{4,}(?:[.][0-9]+)*\/(?:(?!["&\'<>])[[:graph:]])+)\b/g + if(str.match(exp1)!=null || str.match(exp2)!=null){ + // console.log("It's a DOI"); + return true; + } + return false; + + } +} +export class StringUtils{ + public static quote(params: string):string { + return '"'+params+'"'; + } + + public static unquote(params: string):string { + if(params.length > 2 && (params[0]=='"' && params[params.length-1]=='"') || (params[0]=="'" && params[params.length-1]=="'")){ + params= params.substring(1, params.length-1); + } + return params; + } + public static URIEncode(params: string):string { + return encodeURIComponent(params); + } + public static URIDecode(params: string):string { + return decodeURIComponent(params); + } + public static b64DecodeUnicode(str) { + return decodeURIComponent(Array.prototype.map.call(atob(str), function(c) { + return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2); + }).join('')); + } + + +} diff --git a/portal-4cli/src/assets/Home_24white.svg b/portal-4cli/src/assets/Home_24white.svg new file mode 100644 index 00000000..db4e815d --- /dev/null +++ b/portal-4cli/src/assets/Home_24white.svg @@ -0,0 +1 @@ + diff --git a/portal-4cli/src/assets/OA DISCOVER_A.png b/portal-4cli/src/assets/OA DISCOVER_A.png new file mode 100644 index 0000000000000000000000000000000000000000..e8c097c5df496bee6074c83ba25e1dda4f68b165 GIT binary patch literal 24028 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 P0#&ZGm% zn@UxakkK_K<%^|e=OX((NBnK2cA(bLWzp5tWRhj*EfuKVrBX{>f=_es^GSDu~I8F$ioq#(7&Cj^o#gI!xrb zy37spPTLk2%lzoxxG5%P3VW3^5xKZ1`t0j#c|8V&N}HINx)k%@g2qkIWgB8$w8cYk zB$(lkRkfA%%s#;)U$favZgJqz1Q9y^B#t4;E9v#FI3}g*-20Vu*tmRL$5dsWjy$ED z6dzL`<(~Dia%T{p`zj+15Uf>Gc#s%z@Xn7{u{R-Ea=s}F8Anw)gvcbSFW&LFu|o8Z zF5cudrRl$%_~>l75=hJPE$zKW+*aRv8^$H(!%0uCMrwshqVXNLEPi$_ZS}Igflx;i z^65xsrtS8R%PL+#X~goJ`B#(DcoC1kMHef~9UXM|3Ly)6M^=xkx!0bJa{}Ni51uGm{eD57*XGGfPdS$>lW_RP zfFj?Sa;Bim8*KJG1>?NDinX%k<9en#`DkNLp7za& zlr~T&8KJ9x60}fK@Qmi(jBht7`gIPY7(hg#(GEL5E*(C}P)EIDV8^49-};uV+KGun z;N*#KVljE{EWSKDnsnjDAOFE^V6%^er|IfezFl*=E=v$Rt1rMpA~(}g|LetDamWec z)GE}8$mw#wzPH0CO>4?ob%JL%_>cZz^VLn8Sr@viKm=-TVSr-L)?x=nQZBc0m zpYU9sG&%Kdnk&e}@~QM1X|mEkyba#MrE)?#sd^nD&w2upCfa3sj3#6lcM)By9fGVF zxoTaM`F1a86KrFpu~R1IQ8knuxKKY_91X(9r;sdMl74B{gPtIbIRWk$2(o5tXPgo; z!)md52VXWsL2Pnb%$|F-??X_OS8xaI#ZQ=V>L02DbffD)Kj6)U0%4#+Gw$3%O&Qzy z`{~aS$d$j==Usa#(pV{mR<&6rLd4KipS^ksz!>O=3etl*PI{7wgy7IPIBq*(!NvFo z{FMSNr!?^$=;~*t0CG2zIRd)zZ4>w%g-Z4hvz5zP^!x!re2K@!G{n;F*IwhAZggt)vcM@Rn;+k)>3y@lg6&o@tu@u~2l>*y zS}e)_RpONnw`BteevB&2n&4a5e_6el9<;j+iA~-gk$GD zeX-=qqti6bC!&^?6eBeg&xR{kE)5YOB#c!(u>ZZ=`2X`z4U z^@|+?LHk)7lW~+JmvG}_Jb4sGmls?fn|Eo% zPyWh%ieVX1bwBRy=nPU6CCWAt@`c=p!{Gv*FP-WAoz-C0X`FLG*0$xNyj3QZpaom; zx!BR+X~}5+czQz_nX#y$(YMpYZBK9eI21`u>7nAOlT0mDD~e8>B;iu-6mvG~EVdnN zeu*?i!0dX@qB`am5E3R@;7Q5@y`ryT$;R!%B*h~&>%@8-+r-`BzTDCzGO|1ulq^GVa>sl)Ui|`9Zo*xd=0PVS5^YDUYen>i5D{~ zAx9l`Qt(L`TY=FUI=b<##|6-@#ouJBx&ji$_V=o!q8$o=Z6rHVfS3HDkt;Gb+Zyhh zGZCi5uoQ?`@-m&ViJJ|@h=`S6BMOsnXFtOrv=-#If3&88lm{i_W#TfqG+j@=g`_TG zua{qZXj8erYTVtEtYGs*c#^8wI7&e=X|^xe@IF3iR(5>E2E8&TNMjRL_S~*oU%qlB zHf0CD43OTn4_*mnbrJaalS=1&zvK^vEBZI?uSdr71{6m1Xn*Rf&MeZGd2%%7p*4-u z2e|Xldlh#&ZWyMbrk3ImK#e_m%wCq)Ap^&v8%aJOjCRnEuG58{rh}IjZx`#Wbzj|# z!zyg`n{QP?mpVN)2W@)kAG$04^9g0^r250i#7`CFe9;a*4I-Z0O&`@f>KO|U+2*APxEqk{CCc} z77o-jI-g|;($-QP4_q(%Js(V2=7a4M%s$a?H@SK!Kg!VA9p$_9qs&>d{bN6Rv=SocTXA!eM}~y0$d`ZpjPC3l*m&`Kdq_w%d0F4NuRZHtJThNHx(O@yQX|cLhE{ zvBWcz`|Mv7HpxD38(}H4C7IgfGRjY+5u4mC;6=jgx1Eh&ev7@xl`J+SvU2Zrkr1HI^EF^%)RT=wesyVq|pk70ig$kGntfzv0YK0x6jYvAB@9Ecp;QMg9sv-8ZX^7S`$ zq>@P}ZTH=XB`cb0e04i5HAa9Lw*ambhqr_J%G--l|NG)w62c^Nu-+l)AZUe7{5A3hL75P43e(B1AF$?pX$9V|{bv+n0S_ED_io^ZBG^BDtrP zy=HFhen@^48HfsTA1@};q4Zn^g$we^;hH**62w%-p3Vko9b9eBRcm&cviu!^GqF2G zjt+n0Hdx)(>CI+aDn&*Dej(?XJv8?a#Ec9l7E1!f?xh!`wQQmV7sP)0wN~nbi<&xJ z+Qt$Yzs6BeVaI#|F_H;Asea)l5i8Hz^&R3yQ>@;ePhzDd8l4SA%+FaS!E-zEDNLW` z1?rQNXv=3d&ym_wQ{d4n#ux1{)#~;Z`~$ve&B4^AC5$*Glhxm|!$^BZ5f2JJ;=llT zn>sqT=&Y;K^11ndHuyyksXQ!PBGXscyIC=CDMU=TLb6A?$mhQYXQN(z*4rS-?J~ki zREKYe1lW5&^(}QZu@$HeA>Cscc|dkEpyzMn>_i)>2hjpe<$|dZ@9Nx)6WMm z-0`H%SW10CBxlbSyxMolwSUCD60Hf*;PvtS+r{67iS1<(He}q}<#Am#XQs!D^&FpX zowPEF%$|3@FCnhu$Yb%HB;a8enIFblbkl@D=)BSYF2D?7=AW{>M!XK~>B|^OZz{(z z{g=b@-!{Yol}jWxx`QnQyY*9W1)OF}wmljic6QrgKv!SrQ2NyPpqeaEYhAt?IHW)$ zt6wGNn9pN;Wjih?7yW$cQRYG)-N^ho`IqRvxMXtQxizv&&dNYpqn^66#+=r_Pf%|* zfAje(SRVsJBqiSyY$QR9$v&|ApuY=(-iJ{`Z-ST`gZ|R_e9_bTzuY zew3;eC7F&5p6Sm%1&`yWe6%7Ejx<_$#GrVZYXvL5(ZMU5kd}xQK1M7k^;brB5T#GD zWH}KWcL#fyp4U)=obOS_cCtuaY6p`gTSU;}aF^%aw1 zm&f)yUffuEernN)!d4s|BlXD!n#~!MGLdw+47$2JY_O~H;nm-4>4J&p|SI&B?S9|xaNpLfpo9Eq|*42WpOU_FBo2sytu-c#bQYq>~fqSKFRrA9d z2PKF!1?b_s_}gWof#Saazdq&_j8}R?wBchWW2hrx4@O4C?&L67Ri}2%ONyhQO zWN!2?zWjtVdysInB(A}~8`DdOJ~r#u`P!l> zS!aTV;3f7SHFdpPUJb9?xppV`#50W(P_}7n!5&N_&CQ zdn_Qce&!(mIG?zA$Abd4p%KQYK*=BhWi5KwbXE@;lxfS(L|TW$6brK+5LNcHt!L!L z6xG0bUI$oh^B70yuqCzr&W{%lsgTNO4;^_qZhAC$R%m1NIuk2N@GS7NH-GZNb}HUb zU4~P|w{e?rir6xRifLwRQPb@_T_saW@Oq-pDa|^C@QjPs>7V5RbKJJ<5^>vl zhW_){H4Z8Qrb)}2f?f%a6*TQWR7>)ihKX=D4Wlb-J_eBOpKg2LH%6Xv@euzgP{;`& zL)do5t=-^s-|E37jnB>_s^!gyx?$ksnh~G`@|EoPxy8r4jrA#i&&%9>HpM;}{+W|< z-fEe|erohgv_62kOM-zy^#`VqsC3p@>3i6On!DH`YU`JX@j~O{8)Z2!HQatWuLMBP zH0FabXt~ne_LgAxaY;+RO}+BBOLJV%*`D2NpfzZ22U?*k~Wk|<%{6q z>Qs1<>;1mg@6ykdkak-W#DyRw0==@Q))kmLUz2YC;_JJM(?|a%o_9fa%tm)u{-V6o zlXVB@S+ONG8AX^l%s4Q$N+8<7Xz0lRsJLGJGOsWWa<>G(oJP+Kub*IIm6HR{!9%NA z1WhSSJwJY2U(2>tb-9<$`%|3h87Y2d>iG*MR`uyz+Vr7CxfwQsnk>G@qUSG>0XTwB zJBx6kwzt4@u0}JZ!`IbGOcdD2TitGJHxrfAx~xT=IJO_fA90-j?V~O3#k0BkghcSG z#X1q$`h2GFIbOQ=J*7j2?uvauxV6QR+wN!aoMRgb^crx=HwKunv+STr8ty#uxVV(O zvfacFkBtnUB=oqoDE){t>0Wt*=LM(tktXBI|Bx7E=Ki4j9IL)g?{{Ypdy$&p@{iZs z)BCeEOw|+R>lB!X$G~MPL{e^H*Y(^GF_?8(>5TwxZC z;IG^o?H;#{mJW86AH6R%N2a$CI(5dn>^#p*Vm*rfmmyH{cUh|`4|rOA6ytUAC`)WH z+ZA;zY>K$`)Ok?T6#!C^GVK{}+R!~Ft&Xwe*^dUCNu3O}mPfBiEj+HhcE%HS<5;pg- zatptC`#gSs?)x?Kn%BIpnb~Qm9U*&SHd0{5p;$13I~ z)8By`;FNT{*AX}{+thhkrGoZt*iQdwY^`l~!zK)0F4 zZE$ILAOFC5_q0vc&2SIV6@hY(R@A~4=q-cN?}yN@e$5Gd>G*Z<@y!@JkNZx$Xc(~hN_xC)ks`JBP$p^0 z^5_r=b_#5ZUy*xX?(dUx^s>V|Uco8XC0rkP!S$2)dHu~2+>{yixqeFbwX9g?6G;Q} zhhJA@Sp0Wg!^}3O90zYIl@c;9-Ype?|6O4#EzRR8eZg2j7ji?!P*x-^cuper(Wsvy zxfVbkdB#de5T zbvt-{08|@H40A6-?6H9e9PJGH%>)n+>?4>mUHRy3tUK4R({1k-f#`M57DR`hGVDY zi*>8T5&5jtKSEbp{06+6J>Flah7Zj0#7ls>#Up<>xbOA#&7Bf)kIcmfo7K4(j@|G7 zm-=+=qo+m7B&a*9Tb})1QM`M(s(Tt^eY>%t>l^^=Tfnsn@C)hKIZ=O{z!Pe>L7;b0VGbpHwsJOEw z$`<|2Q+4MR$_Cy-`>T(Ux~KPSG9)9e=3Btl5L0bNpE1D!Do%a+e9Gk1T?((PosH=6 znP(2})jl`8yPvYVQTtO!s_tfEc_#oRsTHZUgzRA#NBZl9cd*#+UR59)ooxee5tJO& zstWzRhfad6IUj^i9o}Hf4Q-p8bZO)q(YQnNv-hut-IY-&+DGBW${cuOUv>PE*#k6J z?Ze01`#4TDj_eK=O!g|tlQ#7a(+U|!kCiZgkiorE zM00;79(ATX%L0QvzmH)qxMD@FAunbDj-5^?lSp%qK1;G*7u?}>gaz>MkIn>I%E>ap zEgJ0s)^^dwWt4LKZK#upF{Li~qqP7Dy49&9Qu~c!OLS|KYv!5`!!G^LNPWQQcBq6V zxWnUdUHWk8692DFtBZpimd#G-+twT2_eoCo&I1f_M021U)s^5FTIz7(;ChVzhmA}` z9T(`eOeeL`{R!iGPu%a;9$K`SbNqwlbH7Co+Z#{y`-i^8+m^PpcAJl9kPKqIrTGgw z5X8swJQ5CXzaz-?UbAJO{H6R;&ITFMCITZK<5C7;T(j9FZf&Y7n`pQ9EVh-EbM}|uv>d63h|FAodXVb%-IZCkVplCi`wvu}ql>mfM zO4jlIpbYWVk+`)JWR{>kFyPO)V2^0a)y6HoM`X?2DJz+WX45GGiVRq-(Z3mP5=#MD zyTncD!**6Z*D&*1l3J2LNm2IYk)>{zN;>d01?&nQ6;gt##5@QwFqvhOM3U{&9+>Gj zJk0r8ZkmKxK$Il_*MY&_xy(Q^g&O(F|A?z|Z|AbN2P0#aq7f>-eWE9TE-trV{g>|* zCX_?8*f80ZGY%5>vT+@PYn@bDbHWnahnAB`7fy=f|WiDy>K!LaF z=ua7rbF*LwNpoU9cqHqxH;!k$okDUKm#( z7R1Z=Er6&Jemj|n#q7(vR#t2F3IQiTGj7CO3*!+}x<7#< zgBUf|W!nWFnpggE!bEO6ci{t zJJ@e1$(Zt6-ecKtz1h|#`B?h48dRM?Tl9N_uha}G73B>|P|fR3o?avRv^Vt3HQ4~h zhp`jM=t~=m;hE!^hLx%o7^ED=E-sb?t|{OQcT~RI^fy#{Hcn?Dg$Y6T*!#Xabr~D5Nm4~W z6(J^)G2iZIo#Ar0hyt=5zy>WU8&L+SH-guYt)W&uF1guHL7+>MHdSKjI+pbDi=dU1 zUzo4rMo{^T9kQ<}m5^`ImYXF}j36qAfv_^&(@!7CSCRO^ovWl<;7MO@b~7V}f~Y`k zMf(c95NvPzs0_I1FBjsmWMDwd@H-E1T3jt@Hk! zGOaxa%VyUbE*UDnUbjAx`EG5l0%R2h(@-S*DS5DE+_X`FQiLNRU0XYPJE&{pAmGdfbc?%1_Csq zl+z3;!4oi59E}nm!wQW3TAmo*?5GD`OEZg{1~X z)=^%Jvtmbo%hm$XfOVF~dRjwL2dHXMM+XVdJgp_C>K6OSUHn?n!h0}KE+Jg#`C)+j zq8T3nniP1#zAD{%Paw{Q$`Cz-ZqJH#N^&N!%msiXe?Mop)5mARy#GjPMHzGjq;47H zsD(8CSOdg}U8QwjMH7Yi&$x!;aciUf(^|{5(W6#mv$gJ#?P^PNWktYY(N50pv+W}#6{}kY zEmE9%7Dx$hy|BqLpOBEDwe9@D@|RC3r;4PHJz3Ua=A@O!S*}J$XLk>9|Q{+EZD)9l?K#xH~ruz<8GMx2(mS1PZk{o z>iRw>6FUj8$DlnJL|k+ap8{Hf1sCB%a>`#aC?Sda-?~^BJpvhJq%)Cp3ra}j88ys_ zeqPC|z@nZ%_Nx|Cc&Gj$xbRuXKI#M9_XZX*-Z^z!srFnWacb>w`4Q#Z}nk`qMM zxZ>tOTf#{KC& z_)Y~GF+dgqt8N-l``LJcA9N924}qVN+4$MV{;@3e)?02g`!ooUYkxhFBm%Z=XtEnt z@k3|o-Zvlc?FO_SxA&8dMbRoDr;9AW&ng5fUS0UF8&IoA-#k4aZM+_pt?Jc{l^rGl zqeYxCL$2zAKy@n=vNL2?cTXB8l$AK=0tWVn6G>WNBvdO}E-C5_)xb6U0E`r3HfBs*)K(?Z?S6-3m9{Bq;gBqh*For>Cu5B7l$4P8Xj2yt#1mhVA8jR zej2c=tUhx#Wm!W>YSFum{=l6#G)=Gd0D}cS6D1%8t}8M}^`(Sw%Nsz^6TrzF{VXN? z>wRJ@`1O_z(4>XW#F#=3ZmUaG^EJ@ZGuYdR-^#`#pyW$TC$s8NLT@ubYR2!40V{o2g4 zyTwB(th22eZk_D+-3kR4QgGqwY9CE6yQks1)=EFC+G_Y%JFJD{5J%cmKrN{D(=<^274Ucb!tyAq?DF5| z-r}R7iH{*VXCi5l7wm?MfI#gn`DsDet;T!zs4F_@xe6QRr-y4w8NiG)(~y}5^6`)0 zu9Bx;sBbql1`Rg!vea&_YdtOa)fcWpgd{oDw#&X>oc;A;rS~2b8G|;`eRI|R;r{{e CXvnPq literal 0 HcmV?d00001 diff --git a/portal-4cli/src/assets/OA DISCOVER_B.png b/portal-4cli/src/assets/OA DISCOVER_B.png new file mode 100644 index 0000000000000000000000000000000000000000..26d484664af1b90cfcdf92e99d30553b0da25465 GIT binary patch literal 39239 zcmZU51yB@D`|yE?qKHx+2#6waG=fqRiX8q9jz$nULK^ArP)b^kqdOHT0qIskTDn6T zX^^gOPr>&;^W6-CbG!TO)4Av;C-dyum0MRJ5Xd#ef8q)d2mu)cf^&2kAAIvEEx!l+ zBCz;R)fxifxQG40aYz@ngFx;;5aLgi9EO+2q)l}9T{-4dQulv6ej1ify%+&~9dWg| zAT;LMgft;@I9^Lm3vfBz*0+8uS#K8P^wO&3CkLNbzvjL zMDyJ>ip{UMF{XO=1Re~%{K)l|k+FfY?RVgVcsPwrq4R+!?Y8BoUyhIzXMHFC4(oRyZMhO3YT|VF>ua2j5)%!Wn(La~SBqFKp)Ud&z$Z#NQ67dHWfmk; zlc3AoEO|S^I|7Zm{jH=%{ixh^YQR$?t3XHZ?_Nkom>6*_#?a<~)$zrxPtY1owv7-M zzGgRk(%|B-<=vOzuB-%qx5}AafkPO27k)=>etw`NYh^2O@_Kjkv(}d$5%&tWWM45jxZkQhM} zbHgZT-r@b-q*Y1g4{7`eBhFzo(yz|A5kHVa*aBB;f&X2GOef3XacKw1xHEg=%JWEy zLoHbmB?F&K{BY0C+ko>DXMr zhE~Mt77l!}f#dvL=As5DKK-%qdx;YBE>}v2jwsATpR34FlltuX`44h<7B~&X`o@S{ z$zIi6G z+AV-joLFj49@C;ksA0^|m1}$h09KtbcSS$>GVtiuslp%jkp3 ztXVxxf9#yEwLS8t(^`Efc$`jH%;)^{mh}o(vjl)mc6K*cCz-!TS^vUs6`m+bU1y%) zu?{V&FRtf=ZvB^hIZCQQDW#o$Aia(>O8HE%ZR}XE4+M{$@D=?y5T5g;@w!C=pQzuR zu`deB`3@4r1SET}***nXzlf49&@>4;lN%Ql3B#Qe%WoJ`#=l6+AHwIH(-K4RmsK9B zKqzgM+5v?*^a0(IZ&w*JM{v*B7^PP%bU}aEkG%uqN8!^-Y4S!HdQL|c0I9D4Kk_wO({uj9^h8O@-EaOBB`%C<%uB zJ?dekFGkF@eJlRtCB`qRvVoA1Jm(*O^sm5cm5gl;#^@)|cnp>(mQMlatWyR{y(}%_ z0}M}^*%BhcDJBU& zJE*kZ=6UIQ8U%S!k1k{I71{}C0Pz{;s&_}W(xO6xSxH1h9z(Hd_ zk12tgrz>IDi@66GujseW(#LB5U4gU!HG^fX&_~wS5>|`@MXx_wzytwkg5avyIy`8U z?GjL^=Vy|89PKh!=Xps1BAME?$QL&H9?yD)3sE)jY5APVunXRFNe=-3CD8y+qOtZQ zC7XY8?KW}5#{g5+lq_H%nCtz&$UFwf1el?vw6%iO&20{h&#`1|k1(jMCui_CN8nmT z)%6=ZN;yN5u>t5o3ic+9-{hb+eoy)N0#@_B1P~-+222_if#=df z1<2z#^Qu}TB3qMn7nmVBDj0_9djt-joDs@SIW2F_b;^<(0K@=*(HsmzH!l3Wh6}j# z+CgCCL4++NwS_|mXDp(?8hKf{WG34A|VPUpc>hC*(isSQN{HY`29 zQv2depFMaUAq%>Vpa1hEfiVQ|Kdb439Lf9;Wp~Adn({rhzwB0yQ!aB z*GC}odjlXygk?+Na+o|lb04+X@25ZC#ij7i0@O2~Q;z}49QqmrF+{Euu8;n|?J(Cr zqV~A@@%acVA|hcu@z;E5nJ4`t*}dJv3g@N6o+#PWo(UPNKH-Z#zqU29y2;O3bL9$r zJ&N>V^6V5VLMFmT8O365>k3QTEFUm_9?@{d&%n20#MU2_O*swZ$OJhE z`T|ZL1Ss09&c6D&Ff-7xI(|_1v8HTMeD-&GL+9M}>gx9sC%>{fkF3|m+~1d+Y*bZl zSM6@DUZTC4>w;uH6NiLY^1JBg$XhQvlK5?o4qMUt^{?$V7XLsx zJuo&na38NYz2m+!aA|+_y66q9vM7Z!MhAL{5%VM~n+|M!=Kn&{kQ~6zam#hHsG_9W zx}VC(=0FXR>sLsvaX5N)e|kc_&HZ>O@zJj7QJ%Z&`?>m#WSVxNLGYt{~`QAe>-r{CO9=ci!4oa}DAr%kkOmLE&@IYswj?t8RuETfyHW5&;a zo!hMsJo%kp*7K28g!0yBab4Ulvcp;T!`S`Vi6iMJn0ngNRRy=htURJ)yOGmH&8;z7 zw>y)Yr9kuT&fO5 zs+;T_Yr-q=KzPouM$0#5@vQsahK$GEDsJ~UD~}59NKP4Rx(Ot@&+^K>w@((^x4@@_Ud4u+aUT;mv{@TATg;I^2ID)s``nSu!#e zKTwmhQl+DB&Z;@caV=8T!M~{D9VJ)K)AwmbA9-&|K*YR)2Nu>xuXZlO4yojKvYA*J#!!;^-DLP$=;G!m z@Q0mALLl`2#fYOm!oVd3sC$5E`wlw$S@b(ahn#XYJQ#E&;Vh&gao z9W8bSa+1ZuXHx5sPBsk2;(!jKk4&p`tlaeG99$)AY4$o}-sGr>Bd_o4KD$C?(>10t zVm&$zt)Hx##JHFqZNNa{GdLEv8Ohp-N&P5_Rosi{@L+j;^pE~gBAIMR1S7eB1t4#w zvHul{hcjFBlKSurzYahGPg}o!V7GCf-rdJ#>Si_vQvc4jc%@J(Wfg-oM8fYKvD3DS z`}50kZrlHdPh!c2K7id$_#-2zaQxJr*YM=a8IOfQCj9493xaUF$IGIsxH|C^<8Cc# z4Tt^N%F^|iJ4r{%;(zx*;=;wc$bjsn5dG+EDNoCSF-qh$(xtzv9z4!Z@Om z0fPw~W>u>1;6;&Oqu5zWG0BF6#c&tBu1Kic(T_~8ON)}jQ`BQ1r;VdC9$2sx3&r9x74s=FYENnGzg_9jYGDgFLyrF{slQ}4aJEc~ zjAbm>B&~nEcyR+4302cQQvw5RF?j?KVi3KvJY$Nk#y&Zzzt%7aYUO8%h(`~1@<&}@ z&5|H_MPiaLAQezFQaz7NM$vLgbRgw@1Wwog|4XNPfBVq_M#44T{Y7qzBS*mKlZ2lp3Bw8p^ttRviqHjH5(9cZJmc5o;o`grCbwE9X2o$jM6X8uPzX`Ljds zfsE1#Gf31U@Y|{<4uU#oL)=tEQ?uPx0ywc(an4^q{U+;u&NhigKEfx!ts@F(_2~2m zrLJBTgZ<%PQ;T@|uCb;Iv-`U3uG$$|g$l6pB;fekw75grJEDv@S;$4o1y+j{lNBV)ylFo{V)OYnhW1sZZ$KH&^Tn z4tJh?J=?_Z3x$JCAGSAqY3IBnHE-4vU`fH|p;4#%HT&s6w+o`v0HeOEo$hIjAB;OQ zk_rzMV|4(0JbI!I#X`A>uu23K zeN-@V3Yh)J>NjfUop(h$utZcJcJ7j&o4b!z?p1h;c;NRc`a@`CP?mO_NQJq((kIj6 zKSqC?SHlaS1k@a=o-972ed%z92qjO6H=Q0`$3iK+%~80}sK|nry}7GF{qBI%#z;Cn zYr|T|>6j$C!P0AeD>b#=i!MregzoQIh>Q*g_DZ3KSLpaD;DIC*ud)aT(N>P#p zC~pP6?ZWEZ^^6|%vpgB{;UUyJMf+9&cb7>;yZ@eu z8*aPlkMYxQsUl>Yg%O9>UgfMga(@P*QV_G*-z~M7?VDaHIiUF8=oMt^x9G9cPcP)e zjS>t_{kK6k`6JfqP(_uBi+1SM)o~{kvh?&QNY5`}BMSbmr8CGp&Sz z48KL_&w`@M?pA#D9W5sq&Y5Kza4UMJfP5xqMlHhj^{7-qbe%X|4^KwxN)#@Bk67}V z8SsZiGm`-DEFuosO`niv=hk-c+{KRd%;zvIE<_-gnR7ldS;E5d; zlgCDy?jo;rE6(O&P)A0<=DymI`6n$?hn!y-+wx~uOA_*nA%WCSE>A!4*pw*N5jqcr ziV@@IMD>5cLE`$ZDjryyGnSd`Oa5%9Z*39Z`T%+*23+A+U>{7+RdD{kEfy_1o?=xN zPrw56;(PvO#o;s8?muQW{g;7-WU~C>C1D2XeF0yPkC&(1@%##kV9fdpPsc=95XDSxdsYEhNeJMtd-nf8i z%)$2Z&e{u;l^L(ZH1fhOEuD_iO8Eea~b9RcIlAHz*sZuy=l^VcZwiqw~>K#N(3R^*4I; zZ%esYXii6C<4ps?=b$QPUR7!H!v;mMGMlrM9zyt(l8MY#C#z7tB08-aT*Z0Crwx-r zf^Apat2)Nk)K>cmqJP;0;aG0qKISSGqzc#peDvlne4)`o)?op{IMhYjc`zn_Y5dOF3&*1{H-?0?S1#2~W>dCOO6dt5N3kWxC8h zt3dC{xrs^TO=@h^NM_eTLuOvK`uJ46ROxrgguAHwzI_I1c;M#kzgKeEkg{W~V3vL< z;?;uL>S_*OL#>zTyCk7tDfsDn=X@;3Z`#w7v7;f)C8mhBSD=Ug=i@;f_1lXMD(0J) zgA}JEQ}ka&qzH{4PfnX0X`aUHxE~B0&8$N|9JrtSOcecox(5|)222Zuv>JffhN0t` z6rb)+rBz$z4CgYH=@WpK7l?zkmB@%}u(WApo?@9yqvCrv;p zu47vq?@MG=g|wId6)X~S4Fqm$xqH5n(eJuJBS0-k=F|?I)eTF;=2)vEv;^9M(K2V= zGO$g&SO^q|#t05ScSDRHtneCft=#{Xdk3$=fg5DLg8wZIDW19gGJJ);gaPMi;XhO3 zk_?NI`x2@v|NCh&=sUk4#UX5{(#ZN}>|6>uXWTV^=L!SO>|4NxGBryhYQ34~&v@;R0yI5$h=(zc6@ZUfubn?PwW?Nwhh%BY#*z#C1r^c#5!ZYoS4a@ z^P1ZupJLuC<(lQ6E!!CsQOaP;J>aivqpMU+XwD)Cmz54P8F`OiuK%IfDhuiTd!r#g zO;+K|(7$4(NVSxP4d2-I9+g&rUMNfgXfTyA6Yv)m{T~mcg_6*KamO!wB?`+13R4l) z#-_@;I#OFW_6us`!z5x=mZJVh<VcNp?J+NM$sz9Vbr2oCZn4ls zacFTdF!+1;`ttW}XCvq*Gh>Pc&y1GwRWAS|?qX&RuCi~a4K!}-H(00t-@3l8H(ie( z$4o!)12Gg)whh0-pCfATnb@BBOJpyMiOlrfE^4*GTX*h1;16UrGw3Htv;GIdh#m`~ z0}PdZ0pq#a+!hWTVZ=->{T=h043Ewf-jA}+i*Cd=o~Hz8Db0PZ4>6ROUs@Vt>@Buu z#E?Gx{U?gaSV?~|u(P%|uVTfY!@4`am6IqhamE2drT2r&#JL=vwy%EJ~NR;7g*a(jE<>I z5ML0|e%LI0pX-v@&dczBO*Op~xd*Bx0E+s5K25)0hI;~M>D#U4Gqg(b7kOBE^4|or zIpsgu6)w-Oc?NAL zXaI({{peA!Vbb;=q-72i7LpVqH(;|DNOc}u7$eW3U0$Vu96bk8^a=@pZ1kFq{37hg zgOQI#;3@tWeWvqKx4yy1a{M-w!0B)KF*CUoQFJZhe-W)!DwD%H&w(%$$#kX(plK}t zha&?F0qHZJWxiVkHOt?P$oK#maK*aP>dI=4`8yn+rwG!3bIp!VQ4MVBFEJ@7%vo9Dk!cqyCa>u7p@0#W zf<2v1a*FF8s)YP1f0Da|457{Qw*X9KEYr?Z;6NkXWmf;f`lzLlpCTv|KOQh_&fE2xAsV z(U>xUBe^Cq3C0>z`#1g~7lq(Vm_Ah{AK@7r8B<&H$6?HiqV56h)JKSF24bH{u3~=H zDv%Xp>M#YmUMnT$0OqnT)wg>*~p+=;T_>H--gubycJ;0uB^DVLST%!O(^08 z-V*E+xX+kvRF?Gt&8Fuq$X=tFN9nE{k%OB&cn+~MNSR|_1(#dbCxG1vF_GflAZ5AGq1JbUa;6k0R8HeE`wl z8$C#&6)F!;Tl~6XZC$weiSG(+d=tYgRb5D31EI@TIn5j)~LN*SbeWMKTlN?B=Xr+Q1MA(qnR^*B`)sT`8- zW$QAEpPvJ23w#cFFC;45`j;7c>1k#VGqN0v9lHzwOS#pTJYPnALehI0@I1;13XA$xPl+2w#&RE|5b;%$k} zlrB!rYGl*TL3+o%_j}`|zBAp_7$HZn3D8v5Y@A6Ur^$BU)ftCmXN9u4yYl@a{BOm( z74l!_HqtMhj{q+qqKBeG4_$ehuSq=$JyaO;ef@{v;P`a8FQj2Y33C=e-4KLa@h+R8 zq)3Js5A7>c5_9HMp5F*X;%l(E@md0;mMmVB)8GMVVBX;C9Yt01kV)H?Dtgvwk@@E& zlmXM3QL#Pc!oxS15-mj};b43Uf$;BqH9C>IfB$jx!Xhsm(u1`X;Gmt*=K2d+WhpnDL7p{Hs?aX%D1XCY0tTI$L4^*K6+T;+VXApD6Sf&!0g~Ud(uM{QH zi+Xngl+?dDXc9Gf1&>$gc8$tAK`Y6y8;r9zt^iTWsK8pZv>~!~6y9`E1b-ZZ6*{&% zDoe)!q#xOXQzkA6a`f8oJ++A;=_*L3TYX!*MN>PJgA_ka^TunZ>xCIRCl_2)2qipS*)xMi33TotkDgmxy0W-j3w9M1;va;M?` zZ2tGPfRsFVjyu((2n1?nckj53m_9Q$qua!9+{4 zIhehjuy{BHm4}GY21G@fcmB!g!uRNhdPc`V%!OWP%LPvmos^PCZGc>|w% zP0e{lz<6K;G2UV*swW!2!Qhw$()4I$yvK;_pvB`i59LGj6n;N97KqGcEK@9C&%rFT zHe-kGfN@CJ=G4X_m~IcLn0OY4>I(S7dlod%1K??f704J!ny~ty4_g1ZlG9?j3`2Z5 zmpw=fgBK6mYzfk%eiia(tUdgNc-W!YVq6ua{N=&V!$SpRJ_~E!G=M)hYIFr|dtbQg zC$@1x$R$b^kkQdh7dpL7fo-Y+mm5AKffS&QXduiWx0Pna)gtj{_iKD;YLUO^w)NUE zaKgBEo}5uBVx*7$kaQf^w1FFQFlg?I1wF`f72a@>HBrK`AosGC2=mSG@iFkm2$}!< zmyAn`gHkTj5VIA&hvlu^-lS`xvLzB9G$X$%z4-HFgXy7ki=%1TJ{L&-YN?&ay;92G zCA42)Qlur?paYo&;#6;U1fB;Wh~-rl$C*6YWo zOuN;`?sKQd6DPYtz*(?|H-l0A80azU2;B@D1^>R%0SWxp=vBQIv+ye0tZm=U(`7gq zn`X=n1a$7N*%AxOtKij!k$Fd~V4uaMsk%h>bL+0{9ts@PUEeIEJzC$GXEV18R?QcF z%~#AHi{bNs_yWW}(HoZ_-<0D9WL~rW25$-6(+58BH+gQ9buIk17h3(#YS8$3Wg|qt z8#J@4_Escs$48W)TxdoRn|t{d6??Ys$<79vF*@oc)7ye4+k3m6*6)4SsMhEOK*Sh| zSa{LDJmZujG;6v0;ILtUDdf=-K9`#;I~h6j14qDuU$HnuNDAmw=VaI@Rl`lze6=JwmnZRZ>9%)%wnwr9_t$sXL>9t^h1_P6#noxe(IFWf8%N;g(=94=fc(vuV8 zhO!4-A|voSJ4|dTr2+EPlY{k!B4>tRgt6pH0|R9zY$q<1tpnsF%K+j8FuTM z-pVhgelr26`{~B8PDvvDZtwtGb8$h7_kc;+i@b1BWBbshyDGHqqrygG{!MYa;y4mB zs-*tP^;_b6>e&}MrW{_&qp=U02>szL@DHHrYQMF5;uh?-?m6l{A3uM*QC{C@AlV}B z%cOz2J<}x{z9MRL*bOGfo21+!?r-(e>q9^|D-QREP-Fm^VV+ppqI1FXsA~=Q6j=>~ zBFOowy8XEe;np+QILstTqPVc*H({Q*x2*-ZZa_4!Rd?C^gi4Q7olMarhO$zHKX^AM zxTdL(RP@^`OWIMHf^;pLU$$!O{iY~V1x|9!0dzK0FI=sE1-WEbsh>qTA#*JxTW!O7 zl)XPkZEpHReyin4p$H-$2Ut4 z+)kf1MkU6L=*y*0FO>}z0;}GA#hLNuC$NtO>r^_*zr4Ds|?%S+1(l+KQWRN zXJYRMv4kmHoFbPb($8%EXY9jA^UVDq_gfQMa;({_7}#15s(fw&K9?TBz+K4)>f4p|y}iRLKaUoDvgIIk00f*0Ptp*xE2a1y43-ZPq8CHCLnT z^tJ2vKU@`}e%fdo^mUa2`O9VM*Ytb^Q-^tp|NO_$+e>8r9oT5Bo_v|Yzo`Y@H0$Mb zo2o`|39GQ3b?yA0>0(Yk4(e5$R?)4npXYZ z%ByOKWA&G;!6u~u;}8SSud}8K9B=~h3^0(xrGu71M!$W-dv2-uUXM;N=U4uwD20aN z7skw|hnbP+%Fri6KTAZJ-w+2n;yAn8r&QO#JL0}=c1C(IlBD+eDt*)?1`NEt#D7;z<1 z96aql@Rv!0xH{j(4C5&j9&X0%Iuu=;o*)_g{ z;L4Ux2k}WpCi1GYC1|?R-Du3CQcG-)jcvG;q!ke#ciTF3kmW<{Cdy(?z@M&5B4bOi zzuBs5g^=UKw7o8d9cpanDj7oAWNgRN+*k=h!^bbX*-axQ+)?}wH;RDz4RLTBg`^@& z1TW$)1q3pyaZE#9)|+y&M-OE_LH%t4W(dqq-W zcfyfLR8+79JITS)aw6;Q)I}iPIlXTzE-A+-$fg0YZLQ2vm$w?mW}4Bg3Bir7}g3#v58tw?|F~STzQ+m}{Z$G%ANa(_Y{;+JChj|YS zjJ_)6o5e=Q;|_+!vE9s(P9p1XcenzN1Qx2S?~s*iDa}-FT(F?(_$8 z|6klE7&SUb%S`IGZ|3ec4tw)!qO&zMUp~KwLT~y{)a*2`h0s9XC(M=JvFWx{HC#Uo zm8BAl)Q*n3*&xfB$GOi(9s%MQ1tAtUjTuhL z$|Ei{$|Rc?k4bg2F*00W3U+mTu|9|b#ZI}Cn7#!|*Vd}NIl1D+{*3&~7JyczxRSii zIw$sx)(#N*3bQo|;CHebj;*7B(Fymvc zjgg!2z(Hn$iq8}H|3f3r3{gS(%TDgqDVg*2c9tk47*xd9UTq#h#ORF=FAIeX5HjAh z<=Mk@@=xF$D$BEMmO>`WK-nNXTlK=atZQ*V{kMPx5fg5EIikEHD-g=_ z>FWics#47=E(r*1vdlNk=huLZ;;buy{74{dXzn*#E_m>$2mKb!08+zwf{>~5Nl4MpA%(2e$RLc zK3*i74RA&~ctM{$#lCiEikgiDYHiIYJn!&Q9vwUFWCBw3YrAHUgjX*`5KH@k(I9XV zIps)#KMu&&POT0zAv$E3^3hinAqCB$Uw)~+Zn!EHx zg;ICZ3*qKqTj#lhpy@r4T;}6}RwqrN4_Lb``cYN5_Omvy+$CZ@lZo6vLT`^5%%rGO zGklGlpEjGLQq43c#?&-p2ePqkM9{8?MQG6Wl%RI^Ad?7x^kZvDx6viZYi(g5r5xBXe0fLDlrRvmss)#Mp6XX+o z|I8N0!<`gnxN@(Gk7>u_Or{kf2Vz@{BLW>kGcdU1bJe3d+Na5vCwt7OALiLKSlovr zB%&AgB{XdK8(!M-RA0X*QwX{d0V@qH>l7pF6pz9h=*@#l9|-2o2S@Y!a^9Ajj>@(z z{ZTdT82<+!f#t9(a237XcVJu?tf*+9iZ@>zT1Q2CPx!8^g36$4FX$sHi$IP{ z&9+h&8AZb}zw?tzwJOa7I%XR`O2XkrdepRBRmu_CBNrbw{dO&1-Dw*VSmvQs3n9a{ z4hz~u^wjVkM}vL^t!_c09Q!>||BhEkwRoCHKRf!9`lcYcK?**0oAcX^{A^CPXsXELqmjg;|jKxxbL+3R1^;E!0GIsiwJsP|p); zDxV6wG1wdR-XLNbmRl;(RyQ-qf|i6maw~+a^|w^hzcn$Dv9~TM7Q-R@%F;CE7KvMF zuj)(kkTzFz*vL&KsXV@ZkvSatY}1xSnx68Fz~!)<9OCe4ddg!rLnd>ud?|*$W2Rqh zw_}cC;J;`?{wALs0-ENR#e^yWZ#!R*%|`Ooizq$iBqyH@ zw?y8q5}MT;u%y`)V!GeiDKG01va%r-N;>*%>?RHu1LlE9d+g{3B}|@#Ys%39c9{D` z)*SToV`pOTo$ykj@uQr3PEeoq38D>v`(bTn&ntpR&MTO>@1PpI9o6FF+kZus2re~x z#lCXV@lrF0N0m6CsitoGwG)$Bm+Kr1#VW=fmb&e*+gr}<@9m_y@4w~4OE6Nyt9>vC znhKqhJZczy4=6t~Rt6tzn ziBjFGKK@2H{&}?1aNgd+{KyFexfUT_C3IfFjcEbu{`t{(H{adjW6;$FbpRRm!tT*q7p!_rI=L zS9L9#!}z%7%XQp@OXHrX-k5YW)8B(G1aorJWe-2Nn`?GsNf|X{^wX z6-K<1Vew~uByfK}9rmd=pr#eJ=5Ei^=;s9wO=TlBBML~=GX|k<>8)`jy>UbN!+<=5 zI<(3K1mS!TA@0wNjKP}o*Uc=KCj{4~bEC)#k53Ej*S`C)Ee$s%%I2eRX%r(qe#H4N z@G;v}#cbk_PI%JJn;$pVV{Si*l=%Ff**KZl1OGAP<{WVyq{Bd|JE*tZBD1ah*qxZ> zFs`bitWq_+cQ%u+$TrW;czN>%VTGh4p|4dBF`L|*RrlEa?+wB}aGbZwyuq0T%3i*4 z>b=L^)U9U0mU-Mq)zCao-x^$aHMEG|%~im1Jx#>pEhXZYJpOXa6Z@1OY)!uRqz$V4 zRAZJa(o2%0h#^WL0aPTOIj2XzCJ${Wm6iIwtqgr0(^R+&aePo>vlxBoaqm0IFYF)2y5y{S% zBMGL=I38;+wGHU=NYaCB$zV#`jW^J|?K z0Zrd*f1vmWZwBl@K4(pAmVRwg`d+=7s2@ii(2$H}#)^!iZtifDZ z-3JppCa1U#Cn3j3I>pXsQk(^ZNjF2N z&?mej>bJ@{JPiT)^2O@wP;_;UDP!y)ru zWGhG_sfi{Ma!AY}^$i~_&e3n{CRWgZd?bX*?lmMHof>6XAK{Q0EaE~e8t?*f8KfS% z$rlfFbO`L8r0eZ(^Tqom@C>g?=vQpnpgu3;-VD)ENqjUd*CN?nBK;obd7moE@$0tq zNEYTRO>)6v!I$^H?b&bJqr7*=hbCU?2Y1qu+2s?(7`3nD79WcVy?8xG55;LZ%r4f{ z@)a;Mdka71kDLC*sKw?-1gE_#hv!k2wa39+H{!y1g)Kps=*6!#BE^C4-K~j-8sd?3 zkdHn;Hka~ln{`gDoPIqzEjFLbpP~E|tYZOj@OA8V?(w5<)#_3yWRve3s(wPP3%CyY z^CfTLhxpGExcRGTV6l3*v<&JoaJGh;w`kw1clg+RCB!1chkQqnhNx1AZs1D8(DEBksQ zR5J59=lH|V4nHX5G$61NJNKc`VbcClXB}a@xkDc(Ts}PiDCA(V)V2ehM;^*S1ti)m73!(BJH_%5z7-_#@N>EmPLL# z$*4wmjh%Szol^5Hlmbw9wn#1cy2Z65B>)q_&+^G$}QHF%f=(#*t;d7 zmTPKuYE~W-w|+g^5hs9<^~RBCT`D&F!k$rh`_d#4(xB?ividsVM=l6Pv7*ML`J`bE zYlnOxh<11L3fDvL{RGhMO&q>*tyF`KDcfSmbRyu^tV^tOZo_nLn)`1%!%1J&{(4F= z=C$BHRP%)_qcI*N`+t}&Q~_m)m{70D>t#VDjB*JKde{iR)%rzs=GUv_7mqiBHGR>m z)HJk}m&y8=PdS0;lHM)k?p*p>V7~OiY3zNspkCHEPWnZUZmauE?shm2?baz5uzw$A zS6n3C5&x}3IL{%HE^Au#eWyTgB8^1?a`1c6kDt!u?3m5$>Bz`@VtOkYJl5V)(;!W@ zlH`;uOoVM9jqAA3DUmI8Ws_o8u~F@Yx&2e_H*^ujdl$kkdC;lJz15Uqu9K>U+S135 z46ZK7%#6y}4NoKh+n~4(k<1v=^y zhF6J9`AaX#datUzJ>2X0Dh4&ZSb9Q8X~V>#4V(QT7aD#?Uc&mntdDg8gktb9GLbED zGvywFO@4hwjP2@V4nD5GE8(k(s}4^O#*#li8PbdbZ|&P&rPp5E79A?*B367^l2JHb z*btWBapl6}#ZrfE$AM`aD0D^4hnl?p+DiyOP;dF?6=bSa8YM(AA1;o}CA8bw8<`PB zYzV!YmU{D)IZXKVHf)hL;7N+~KY&YBImE83;_m+oEB-B>nHk74p<%S%Lt9g2kyMu2;r-FBl7UbfQ_mJrRMh12y{SP zq}ruUb79IY!;`I{wi;{1)?zlF_7>6<$sv8rcRIAEi&Q=sv$QcgLAI6t@asJ(Mg3Zt z{Q^~+R}IT?)#r}i=07dS9@9){k$&-De0t5b+NnywGZzew$mYX#jXzokFWaXSOk5$??3RQaO+9?Z3b`P z$gLjOms)84wj8-tle_qRR@>~l&Cyeirwjw5OGL%#cMQJGrl^gm%SU|26VW={&A59^ zM7Dv~BZbw_TK>ylW82y_sdB{DkR{aoyz$#})zC54;{eh5YUo3g(HXus@xcP}uB=B6 z<}y*f9L20#jxXnUiiifE71w;*?q8B@_D%~;BgRRsYD(4XkS8Me-d}Pu)|WLfaXa!Z z__i^l=pnCfVC#PW$+i=U_byjsLqhJdrdOqVsqo06{WM@h*_h^d^9hNGdROM-ZI&j{&wnD%qTNL*fYF{~0Gv>p>GF}T#3}2drnOaq z-Q=ny;!@_R3#Zdg6^u8Tu#!5Uhp%xuYuR>WB(OEga^EF!yUK9ExvMbk6gg%RD0Lif zxyW@TlK_}#_1G1iONp7SKT=tSkJEE}FO7e@a1kQeZo__=x=Ot-Sk*+cLP+ycdsL1C zQ*KAu+XAw-wrjDjJM!HVMGm7@(?R3Trl~wW@G>=gTxl zqn{3m7fqbL9OE-O73mVSy$(cDwrGz+0gde zrm{5m_8O@rp11=IvKWhc*)roL_N^*&j8_2A16ygngqC5i=NPYdsE|w3nZT=7UemjqX`>#u6lH5 zHB2X?Im(Nlv;Vg?H9XrcXxNw$c6D3}7mwrXcljYfi)e=07)m@pR0m~8$e9OofC|67=;NMOOWLO$q%uIF#L8oVacApJTL$1&CY%3;SXsU+^Af)t2%DD9%IBXTo3fCA&JU{ zDJzkCpJK0mt2Ei@KE|7sb~HsZh2n`!nwsi@8-q z1W8slkDc_5K6JOMs_BI8-jVNXobBCBd4moXSGjn&$A@Noe%U3x79O+;(l4TNgw{!X zfQ}zWEN;sutUEj=ow>(yJxLqCfcCA~^N$HzgyUP1h|h-AL@{HwKTMPyJvA=1OI?}= zbIRez8*~1j;*2Zy5{%fKc_U+I`8)&X(|tx!iBoR)EsY1;cDQheoJnf%VGxEji)&6M2Gy}X6rWKow=;%zXDRAmgx z_lAxm`&i--4*n~Gp}ibh`F<4TtZBvlp8;PYhBMu7-r|ztlU7=O@6|S+xTm2ssPj9g zw#C+OCqEA@agjDsS|!Cj{Io;8Vi>Pl%nko!GKEq0dWpfa;}fCL1nC(@LfJ?f9KT|dY4Mp-i^(%>Dp1{kYwvq*%O8!Hr^bIZp_dd$k0Y^5bW}+w@b-9;NYJGsnM(c1FhS%8v13WbMaPQMxh*quMh=KKUO`Ypk=MoOB) z`ap=sl|tc5%8UHGYsuc$3^ev7k0`DUJmIk^s(i;j*XUX`HLa#pJpYb~G$A|irBK3m zxB0{`bA-@=ONB4pcr4a$hmTatn=K_#^6v@LBDys(R1ir&rpIo^a=5Irc|r>PC?|!3 zH*cg>!cg4t+HMgpsG0)}8^QSPx6~ou^dDs^%=aX$!GnZCq`Y@RO>Lt&6na$i(9nG8 zAGL4`{V1zQ^oyNGh8I^(xYH`GT&WH*IF5b9X0al{Fd@V^*SYX>$E0H%_eJc58a0>W zE!!VLIbsHp08PNy1-9gomPnaowo+p%qY}A)vZlf zei8Lyt{H#4a{+G40DWd;9W3^GH&VTDO>aB)P-#7><#{t-XjYEttVZ`FpsGIMLR!;k zThYdy&SI2kZ&<;L1_H7wzBLVI0*air(jfY4)^46(UhQwws;*{#ZsL9}Y(~*ymIP~e z<*@rqV>81gr;E!yA2GpLMAS-IAzvo=?V051utNA8`^dmW<=AP;2q9yXEpzyT#H_Dd!}=HITtKUjr*?Mxl@Qn{Rcbf064dgWeVySb<< z=j-RQt;L6}!ONmUOboK{;Yqsx$JJMWMcI6BFCnF%v`C6{mvkwhES=INE{b$_3DPAk z-62Ygu%sYeQW6U+-JR0k;9I}{w-=YnALM03U^f@SbO$u6(h zDN#=-a4%ji&c)B7%~V;LjtCvC{A{x0z>68>aG#^%GKK49GSlMJuJ&k4G9JZ?)(G>h zYX+i)`J^dWW@np6o5DjTIFLF6Ohp9cX!T{Xg%XRaFAhXg^5njy$ZPWA@Y?rdy$eJ4 z%BQBd28w~8@NC^vDPLN4KAJwsR{BN#uH5Y$eS9PjM}I0>M{Fv+joDf*0DJu*U`HJg}wxCf{~7X>;`w z3z8XE^Yb>eNw_xG8fcn`rJs(!QqB!Ej;-Juzng_h8_x{+KK8rYVVFiA**ma0pgtZ$ zka{Y`>j&6$dhN0uHx$N?@^qW^QQRS)N8r^x|x_gquh*`z`?M4+d}5C_~)p<0sTn{FHS5HvL`SJH0XVXv36w zY$R-~uM}JNH?+K_o+U(esgp|_h#b<@%{9Yg`kzz}TpLiN*i-qp@MP6lV~pLQ`WB^( zMT7!TvF1;=^vM2PTdmUl5C??I!#XzU{yV>-8~AHj9rlc0UWv*N0hMa?w#;eYr)ZJZ zMt))jLXo8Mq4H)k|FHMSa^dBdg64Qt%N)4rnbq0tji?(mNy+Hwhm#j2%cE@1PgzQR zA@J#F9-T5hJu;oRO9bt@^%1}BnYq3SYOyykY<zwSP*Pi^)qW*RG5%xksh#HK@8;vjse$hgmUj{)Dn}(htobg^XQ?Jw zJu^u{t_6A<4fL-I?}T|}NCK{PCjy%!l2_}Dl%Kr2LnfT3aH7(eE3%G#~qSQ%IPgu0Y!Wi!vfAa99-oxqeZOfx7CLfJ`Q7H7#7N{2*VyC7};k&Cb3D>nGJxx4<$UIQzJ9o|BT4A}(S6(dcEvsZ?r# zLs**Iw(Kg42isc*A>Bo73$B!WobdscpO&8u0mu1Dg@DbS<98#92nVyDri|V`d%~sU z;F0i~blucgVZ3!mqY4h&&Sy51d>+JSjjRng^S}uO#~zJN$v?1!-=*xS@0V2@Q#FRA zfYoVTS_VO+dBi|*`2!Z6vrn*fGmF$4DXrS0oFPk*uU%W+pK-N1_B(w}nX6DxDt}Or zV`-gm*gHXgD{;lzs0P3>kLk7G&rJfzWT%0=&$HeJg2<4*ptp{;z$(pvE`XGU4 zJke)=Gk|r`B&XnD~-(jQeFZiLs6U*pn8*x2Qlj zJ!Y$44z5^!AmBN3!nC%t_Ia$F_%Ny8y%qc`=J1=F1ZiWkZ}?+|vX|#w1@XC@z~I3| zf_c-9o|&aKemwd5(7DE{gKSgYi0(3qtn}xI;}vvz#f%!epmHWJ_nNzO!JWBJn|^4U zQ+bJjsM57Y%)#EYm93)^piKh#-jJD(JJi+#7;#yS!f_D6$zXzU)vyjfU_BEvIo6OM z%uKc=o_&j4aL+d27gnehl(=hIzbgEO|JC)wN=?7kkCHE5xIdDX1p%$Ey@krV?(#ip z)j`geU+69uXbUUKiM3B@J^bRW?7kaatE!m_Z?tg;gadFv#a^}JS?1Cdo0M7nLSFwi zotv3aXq3TQ8{rMHl(E`4#J!pKYc-lA2DLisV$K&07x48E0YGGw?HQ_DWZ$;Ng=Y5bO@21a7lx_f1(eZTrKGwS zy*K8c!+KfybwhK@{ZZHn>NBSEH1q7W&n{~fb%`6E4dzN3k5F?>V=f*P%` z4v>+cklojqHXfu|QhMl1XHLoYacnbLFO}SMVrTXj)Ldkv^UD5ptFGvBD#rMwu;lK9 zkuWf&4sXF>FTQsbaQ215?rBV{b{mdGle%l`gFBGHPg8$)El)<-?>OALArKE%qF6CsB1ivskoknVY?nnfan zN%kAcPBYXqC7{BQ7JfRIAlR&M6 z7JIJq#xr%|6(Y%f)`*f)N{EbesaT6N0oanWkeZ9-I0#b%lZ`yzRyVq!W$LaG#RJ2= zhR$E^%hRZl0}kC8BC>OjEyenXiC$@2diB#zuGDhY(fzy0qW#+2G<8^uv-No98E&>vXp*bJuNgWC3FjaD`$+u-6$7V z(Xaa*U$LaFeI`xWV#7_l({a=q+m#(2b($){R_|Dhg+w|s+7r8WA*LRPxMwtvkTK-| zg9bc=FF^?2{@70f$0#rej@?w}MQV($sP~K`2TxD-<9N0l{RG&OHQt?_@vAHS#OhXO znmpCLGeaG3FH(oPFs{BQV~-SG=UDV)Y|T6&<%)fC{hyJ#W}cS4-(_wuy^m?kzeFs1sOCVvvyig42#jIbAH71hZs|;Ib7JB(`WSR6 zy6EQRSkglM!HmC_Qx#%`26Xx!RcdE${f0u-^3r;) zY13|+xI?4vQa4%GJlI^F7|B=9T@ACPjq7;IhL3!fb(7NB*>li%{4- z!$e66vwY}oY(pL^sti+*q97NYf|^cLj4*nauVWJ4?P}_ZmyOQ3V8>0m*GvWA@Xuu@ zY_i=-ua-Q=3}vW5Fz2@Yf*p;QSi5b0x{p!W&ayMBD$f3bXWy0GPlyv>vjF<)9BP~tp3Rn= zoF@n$sLVZ&Gu%#kfJpKPdyss8(b&fh;BU^0+xgG5v+R6&fJwL`_*oLW3hY(X7U_5~ zOrQgwCt=AdcN~)^aR_%xvQsJd5|}?>rxKuZ0~%%xtGsiqqXYz>jflK0tIhf5yz%JE z@vkhpS_mX!qPzw>Wjwv~7>7IgwAuN-fSEglj$S^+>%#~ze&FaS2Orfj30r?6NHh*v86Ff^Ct3L_S?u}Hf1c__8Z1|^!4L!#q{_8^dtcGM_FJ?s|;~YPlPN9gP z_LN>rha9xBtr6NpV)rTTC7gO$F-yqjemxf5ao!`hlf@+5JQneRxlO?}Sqj%gU93*6 z^r;gkY8q>{K<0q+1gjY%vXNIsQ`wCA{)Dcf9U;>^G#;tFe@8M))3)o8r?vImt5}G& z_{9B0Ri!2i{gyrQZl%mO8OW%r)}SbQT`KOcUf)l$6V~LumKKL@BF{H@%{hFWK8$fr zf{4z3%#Ua1V53=;odftU8*|5>SI@COeL;Y|<5&m<;m_AXR9~r&Tp?Sg_aa5?HzRyi zpF<%zIhL(5U%Z++gx};}+O}Kx)qJ<{-!krQeDZ;3HO_d-u+q+J?~7M`T?g{(+Te>| zRHk5cXloT5zhQ|kr;BaiK^!AqZhJIZ6f?DfrSw+0mAM5|pOLHcVFA9PO|-i%#- zh0R$+$nlGte~p-_`{faC8sE-%G+3;aa9VVFWjX zXuZbwobQ%eScg=l=wwl@Pn-c`y%be=nHPsE$nNWluq_LDjz&@%u)&1vPv0xlEYIvC z(CaSfdGC%J!o|$qO17mT((9B9_flj)A~R=r5~Qn)mtGx&RxHOv*mW)3>TBT`u0kX4 z@i)l7IH^eY>E_CyQrj2?Gppls^=zi`6$rFs;dY14GH#)Q&WGY-`B#!3oDi4vE5Q(3 z^h!DU-Xe3&Ik~Hy60AKL<*%3dShe>zaT`g~65g0&Kt@}Ksr3||hkUA3 zLqmpf$WyE{&F{(g49Tz9h4*-73&xDdpFVaG`&je2^Efu>^e~#Re&l2?dteSk)!QB) zA{Gkk`?xtce{|d;yBcrNKTTKJ7M7l~^&y41!JU1`gr~gokOrYo`3WI{>#n`WF)x() z6F>Qq=kvQP+m^x_|0l%2B-LO8iXE&q7acP zXUyMnXdP|GmJTxw)-Sg!tLZfFbk~@_bb9rWrhKE?B&T)sTKBg&%=Ux-Kp7L1J;Pp2 znN>mSL-QbF8XzuxVJeA0`2&qpADhyzC;&XKb6|#LWEdy3!xja$ppiObrqYsFb>Wm2bqt9;2S zuM*^lcW${WU_L^uh@$1A+fvRZ76Y>~p>4Lu*}kKQdz18BRXIewBe>vEJtO7PrKnnw z>lt#6eV!8&1)C&25*MpJY6#}~WQytNChrlxOwSCP6zDi`rdZ;0G!`x(YAaf>!@89V zl+I1!67Pm&!W8P4vrwL-mKavsHKU8!7qWkPPnvD5Zs{abUiAzSAJ)&i0)Sn>*!j3Z zPr5Q0rYqXNKe;aHj3$%eRJk5k-`H%}feu;-|DKM3JzS~4CfYN-Qu8N(7~`?t@$*~8ZYAWWu}+6Y)KzIShOf^wnqajvWh}hZo84_F>7%{~p}`n>b~7l* zu)+7XJ$wO~o-eTegAJi`eW{72a%LU#Zf0jc zGs+BC#cr|_GE6v*--D#%VH7D}vF(&_d0B)fNld2H2M=61-zb3I_%6Vw3RCtVY9>#` zN;rLiON#<=HntY*h@9cbpSStdM5I7t8r?eZSZnCvL^Ug6KWnTC^u7gHbN@TlTBJ|n z;oavd?~8?8RQz__FZ+*?%!7ic=Js|{SbXubas_%>}Z%OIK z@soZ|%>{ln{<#ywGKt~Ae&;pi8i3V3ol$%V7Ug8IqbvM!<2T&$rj6|TZbQUPgjw$_ zmEi?#+(a?snDHbpH&a#BvXk?txxpR01+T{dnixIdk=c$;DDANYNHz z&^PP#5~%WfZ>*`5_V@sm{MQ`;ad-LK=fn$;UvU`29Qe&MCvS3pYaCv|3u%BI6zLKD z08E}_2`&Xy*!0R`z5_?nPpIV;G6RN9yyO~g5P-|yL6Z|>nZGA;eHk%@5%y9GAsfo_69Y(^@sdtiR+jM z!V`xCv7U>hyhkF+ijm``C^Wne={xD)-Ivu%ZF5!t(&mZ;8C|(|C?$6a&!{`TBTPy% z=+`w49joc29a0x}i2 znw+AgwRIKaMOx%mBbL(B_x^{KBQvV6%d2|~?tB9A(IZVcNO`E$x%oQ^nZz-?+^p6U zIP+V{UeE2)b5AY$@7X5F2DJPNW2{;oAI88oB=NjE?BAo3WxSwe(~1M1(N?B z!&9=FBz53v^2R${0}7IWfzdqeLtomrD(^_KdaOY-TCGH7?a4_S9*r`rI{57N#QO=u z=m>yZTiR`=i1enoD$8QqN6=t&mkkW(VL_^a8*7eXLK}H*7~v#POiP>tpi_5AbhtgLDa==H~~Z<@10xmvSaNj;}td7jScm6sod^+4(K_omy% zX{TEe`VOA_BeUX8FXI`-~wcv(Wj(_q{Fy~DhAlJwu5WGfhDhMYm!#69Z1al)f`cbk~ zdO|dlln0fw-DGUL$B8~G{KqX{$LIx;ouj9k$1!8$y9qp^AOW_`^o+;%oc_ ziJrm(eZxA!u7K2S_9jJ|;iArLZAoa-RJ z@D|CHb`)4qxj9k0BZETh+%ZyTJ(s7m&E|o7yYzG-sh_#dVe_@?_o;ElLbW?6PwwP~ zaL7Pre*v)X*AoXYki3KSfvLf?)iG`T^)ksHTF_XhpPNLpBF^+_dY)lbB?nHhCiNBz zfsITdyE3||hYKXK5A;$W@qf=gr)!SO!=Le+0k$l2QO;I^eyg%5y*$fa6qdiZ+I ztG9cCacSpHrSCf~7GedQpIx-~xj}k$+8$@4?^HO=QmW||SdNP1SLGc}+=>vQXX(=q zpI>K6A=e!@GGIFiwWp9LWI|P829yZ-WaiqB8SjY?c5d(CcQmiWTs=-R|lx@<$e;(7WtebF2{EK#p{%e$eDf7_YPqSEyiY3x6$5{Hb;Uf6?!;*g1qIl7U8?B)IR0WQI8Y`pxJ!_}*bFB%{!eRE# zDJs(6uT5z(1Hc3(9In2k7IrN0resRywdAZ~Lh+^LlIKfT4KWTR6tNmi~&-Xo!-M$7C@T41Zfeb}32oUs+y2c7Co zCWbr5NrN?B@qB>t^V6w}i7{;@licp6icrQ5K|$EeV^yTRP+V}Q>`KnBB6|#=(4eEYKv#j z?#&58-oI{X`ODz;oKM1( zga?S%v$%PUL_fK%Dg~$k%Fl;f4`3IMqG2zu-H)!LdIRnrpaE_aeGfi_$(MxQ)s03X z?dT2lr60gW&JFpZ)56FNkYO*alL`g^y`atXYn$UQ)|O$u2%I}ddGEchDlZ4yui*Ed zZCcZzgJ6xA3pXJ%xdEkwX^U4?aGDEj8FvPRiQ5{Mx6NfCTz;^P5gafxbMPe?fp} zK|s|0^8>Tb?DdoO(6gm92TLb5;RWaNjerpkbXT!l%aHZeuVV|Bhfn8`=l&2~yrs_8uRu z>!*z{08GUF2-4h6@hHK0t3pG*C4jPocM?xvj+S}tCpWjxvYhoB@tr*}-Q}rgTHDXS07i3Vi?nsqsSn7`FT3K8XLkqP-`jF zHT|&PU#XnQw=_C`#Y;}}LWOgp%KV9P@E;wk$yceNMVmH~60e1@Y1PP9ruc2LXE-f+ zr~+O5vO9IMaptS*zU4V>T*N}9Nl1{$meA#}ke%>`B3mkEnJ3q72w+UBh;tmy+m3;? zH%a(}Iz$i()UpbRDmxW#)4G-{O>b96?NG4=8$;o~PQkSN(h9@H&t=790HE=IkNdDs zDq8cCd`zkLKFN2}Zuzu^Uyl)Q)3?b+V8Tkoj=lO(Sx2W*ZM7udZJ0hev(wn_)`@6i z_6?SF;4|7Nz6&3{%`OM=b^Bzy95?Hb-x}8UbF-Ok@cpAx!&m3oh)iQjA6Z_nU{sUq{|wIiuuv-%w5$ zZ#uH-ar`-#N^fwRemcW462whW#7oulUB~x@RpOpK2s2F-LJ$4Xi{v;SIPmgDB5{cN z$Vy1pml>!ai<)5s7k+p$=V_wj!nL1^rwm@Dav5~KoTz*ARc#N>?JOs{$iIAOu=1m7 z0BtoL(=!t=vRK^KvD(JC7qD}gKX-bdO6p9H&U1IT2kICGIs7=haJ496B3B6d!Wkz@ z%nGF>?GgC6l|%njhQFPQ>5M?1f$g`3Z&Y`~EsaR*98QXQO^|;iue)gbhAJ}^aH$>y zVwp%5BJUpO#Z39Z_d7Cdl@)W)Na*3NvTS~hZr?My z<5}NhM5|JjLP8ITer_gIry;N+j->M;)*$o&2;^} zG08Y#!;U-zPu-kJFG;rB=Op8~R@%64J$Dl+2RzsSLOz873{pqAdG@OX(Uu}%}2w^+O;nl zp15VsYY?i>DI*CSZNVwh7HJz^fjLgiaC+zc%|?=_AhJkPnl?B#) zrg7W~bc71M4zgTk!%}Td2Nk84NBut6biXRSzO*jhq6yNCn+54MJh0g?^2sCnkk?r| zGGEp{cii`CVOxQn*DQdoMtnM+zYSPiyF0V^ci2SZCx&(480Gj{!xLTyiS7Oow!ihTgV64ueh+FnK013 zWx(>BT(x-kWrtu9HT)tVRfjAFucbOG(qD09qhoH!oej)yjL}D65qrUHjD&@2Ia`O= zOmrd#6fil-r{#{*2!lxa(NN2mg?54IuoMzUZi@r12yuxEjf;RtKgh!OIL4!>ft(r1 zxAPtq>$+qRZ1rSzJ77XK=TxCd!9h&U#_J;>#@9Zr4@uK17PWfKkjf)4b`Ptdp7U%K z!wO@8e*))dko&|zS*}GoFAb?^Z1SOX%cOIMg@(DdMBHIl9MBuXk$Pski)lVT6dNVV z_0fFm%~esoTY*{-yEHkq;?K&KXSrewGRdZ<$976f>DPtb({=3|b^L`mF{dI|zIL3b z^Xokhkr_opSw82)5zjy~k(nWcgff7PJBfhU$?Jsvvurvhf93wI_*OjT{70lc;|)9V z=`GTF3)MQ_yB{8&{Y;aiVwjBSu)q*a!lH9H*0)Yz`0V3|JKG>R82s?8GP;ozp9M9V zu@~y&{!%9`=Y53_caX{;d9Pi&>~X8~?f4B0)i=V`#BQ5<6~l1H9aDEgKKb+Z^V-u$ z$tA!D4xDmM3NJbl>Gc{x1^yQ#{vmS%eL)SpmFUZaf55bNE zKmJC2wAp%r$0D`EYA>lIf%P!1J<5QM(Mw4fD5H1Q zYk83M#hv2puHrW}^7HG=)t=#oNuTF(ExtClTGq{w>3|-CBU_X1zovBfT1;P@n^MJI zTlg90`P40lTLmQ@4r|qgB7?%W?1Ws-PtF~2)C}WXoU`}ELHS%}?na;b`{fXy(0b`# zFA|GbA`lqz+Ur_0Tz4tkw|{@RHIrUIX?Pb4aD&<&Uo?sT?wN}7(tGZl;0N*bTA{5M zb~EkjKLkZXuPg72$y&or3}lmk{~_xPAt8?q%%9e7@Kt|muD2^$#7mjvtP9?6hO+1CIAe}3K!WTW_@OTEG6CA3t z9wL!I!@TiUH>iDck_a+;m8ydqV*viQl<`Tr!AF_Vc7xsvxrEe~ucfb{5(A#@o5-vU z;>m5)Veb4@Q^6R=TD)Yxm<^*9ddf=b7&$_I&&SsOF*_c&q0`xH$}6&LYZmPpetQsc zL2;grXVpIH8}3fH*EwKIXSopy?4i8s4iMGe4o9+Y0FeI&x{*G6hi2m8v?JOb@Oyp0 zxlL_Hqep_^P26}k6CZ7Ec2D=??Sq89_F>1 z8q;MJXlAKpR^$7ad)mEh=gV%-68y4np>WQs`{f)=rT|iorT5B=!M-IR%M`nR*>YAD z5I8`gVMQlL@@J#3@d{iTlxBI+S1PE4Bs>>>JQx0PDk!8;lkLauL=*S&-ag=q9ZsQU^7dxX^1RZ2LI#^YgE{hFu+Yyn#kI;(<{yS0L7S zq0=f|dfWianzCjj42zoH3(&nVOtM`%JWDJcP{METo_Y)0{}wsh&^_*A^!ebw^39Hy zT9QG*CDwxFyG??8KBC6}!)7{`kJG-a6FuZ9)B$!7&|yHF5be>bJZ!)kg^*^eGs*5) z`<(d8Q!u)LJRyhneQ2+@r{%Y5hhaZl;^A#h5&LsGYuQl;^$dsMG#uH8H7Z`F(?} z6~{~q2X$(Q{=&0G5k|}ojvfCrJhckfr&%S5-?N`yT%8$?jN=d-#VK0M762*Ka80?i zZV_>tTa-2*^)$x#!(zMnfD zt7;nTS}|C}S*s*xlvHQgi-G&syaMr3!uZ5m>{J7N_xa<{)f<_wi>=rWMaF*unS2s2 zWeFfjuq-8O-Um@diZd-T%4XZYsR>0>%XT83-_TahsMS->DZG0XgI6=Y{A4=8br$G- zW8}$483WneC1-IN`-%Zr^=D&@J|X_=C%5L;*dW`3?y1OPg&W0#4Aag3MM~xw07A+Y zkHNHD6RN~Lp6TbPFeG#nsusqsCBP8yi+e8Vb9Gpt(8F&HJGm2SZz^|!%!*1Keqz?Hd9b5E$MH4$CO&!r73O)H*EPI*iCk=$_EGwiq93Zz1J4Vx=vdoa(ogo zZ%cqHv!0BVcJo6nkeuwB|N{}+yC1lZnhT|8iZD)W`e-S#S zxlY%U!Z!=gpenCmO8dOHq#y4ME-Q;+N*&P^#lw6VUYEo<*5Fi(D=FN6J^Kc+s_QxJ z!|uJEk-}wYSgki~(%Y^$iBb1zsb*X02lpTz$ZS8`y4qLWwpMc#GJJmvtWV&oK3K`}*_-p*};W?;1Znw_Pjs1v~sZCw^`m#~{ zd`A3RZR6R;J_}L8->ANun*>Y`x-Q#7vazb-oiQPL3c+)Ma`onOv=qKbdlHsOXV}$Y zuXp8T!1zHi;e-I%b3MPTtyn~#4}aVahe<$)GvZl00|l?FhZ|QVu2Y=jZCf&az0NB_ zY`=*NOXnwrtZOfbZ$0Nt_NL0dkz0vi%*vixVG&i0)$1csVk^>p}7* z7-Ooil)j_CC?U4k1m#|vFE>ML2kfqJAh-6+Gv5erMD)hcI&~ifS^ULhR$_)|x4*AD zu^USAqX-JEPD_zU@of(Cty+7lK@t#hEE>q$VFwm}{#ge)VP9jJ&M`;W&yPoWExqE@ zo!djN5$D?s+C=i9Rund1Nx4jaIq_NFhNrxEUe_cVkJy!!9lgsFeKd)ZL+j);`7@5o^*4_v&JHZA4?dhC$X+)Y000KqF~Ga~T@%I(v8qCmNKV&>E-*2205P09WT`eEllfeX*9)HRYCbbCdw zw_KdQZHMI{zn4Z?TUv4ICBZsIMc{;*JEDVg9=J>=s!xSB)#y-VWG4X2001U4Fk7}6 zg1asnic)OIn^SNh@%9x9NOILrE~7FlH@wEdS+6K`;R6%ljaxB|D%b^$8e9rh__Deh zo);NBq8M9ACj)2qFXW(*&nMqAEDlcA$)bpxmPQvoq5YEU8uAs4UfZs+|7wu5wCh{- zo~(X_9#%@x{^w>a7PEqz>_H0ac?yPGJ1#2ZMbc6(N8yh;S6cq(fS<}%#Qct`nw{>k zVnZ?fix?~R*Uv1vfCs1a!cT6!DUlJ%-cmXW_{Ms8NbBYpskIUCigr>|MSy9TA`fR> z?Rbs%=g@qb0;S{MbyHPd$XcBkP!CI@hU%RX`U+rQaZ^ln1rJ_K$;0`a%=C)Q3O(}Z zGI<7St{mv))9$gjQ=8D%B;D2CW}`$~=C$2UB1`zm5(#Q0!N>RQLzTGnXab0A?2b&L zT!Q&`M0!PIR^&I38eIX5>JNvCQ>pSja$N+kDO<2PtG{ZG>b|uhWJq4jy&}YCaX%4| z3kWerMsG{6aXIy>3-&B=Z#z6OBKNWGa3HRf$M?&gpS>Wz>50W`Me;+fNizY%j>t(v zp%fV;H+YFi0yto&puiYI4o)nl7Lj8KCuobC@7rQ~@%X7sEe>IW@bfppOCP>Xhj6Km z_E9z{%ND6Gt-Bl#*M3KrN(F+NLbUf4>B`xUJ2h}SC$4>4$5DVC{h0Tr$HMejv1@UI zQ1SLYA4m}(DLz~al=EcDM?Vz+70nn7rNgi`o7@fPfKw{iQ1odnD8 zQ_0M~JZ5c|03@oXNMTgQl z@i3vZ&=c*qh?1W}8yvmPAA$w|Nsv#Z*RzaMw8#1cPK~~qY9peI zY1va}$@*xpk1y&4?dGkUDTsHH1#@qifdh`!kV=9PmKOa8(%$||H-km;h2_P&_?YHf zPqGiceYp|un8Po=2u;4UBaSfffsfp)ENl0Vv?~-XAFgG9|FsuVGK-XD4RA9`5Mo?{ zi{|T-l7G*j&OgUuiu3Q;@kQ1n%WiINlCV2NEYw1Hw}I^BH+06E~xYqjfZQ10B!;F>1X(PfUr2- zH?>pYsa#c3=B1QHpqHicJWMY_Ol1lXBkIWx^%GQhgV57TknhlUWSpENP47F=CO-8b zQW{2EJoy@loc!xAt-}lOS#+T|Sjsgf>lC?;6!tdN{-)yc@@oO1Jh!ouPAu~@ z)ZgLN*@&29)OwGDL`~X&xQb961xZ_4F2?zv%Y0_RvCiOU=DHIkhjPi5&NVcu3wlw; z7d!^_hlJvP{~UJwRhN4w9w8tsXB}9DQys+?7f|+`3><>$zNs5?C4UOLPVaZmc_g7; zXo;4}T4@!axupW@XM~#}#Rt}|M56h67w&(wE|j?YyTGUdPe$`A2XK^W);91Fra|O& z+rV3rhdzQHp&89@CvgoH57>XA)Alh~-0B?ROK`MXJ@t*Tr95x-eoRfZ=TR3k;slP9 zSvdF>hkhaad^2qPathW=@Onu2O<;^W^+h~5twoCekG_PtsAS5`ttg*6XFPC@2OgJd!u?Z{D(+-vGA9$T4t)ZO_B?Dp%2qS zDoo#rqCo{bE-K&0{Osv$Sy@XOsNC?ZH6ShXoj=4{vzc;3G=`NRi7Y*4w}mN|Hf5xiZq_lEVtvUG^l{2;Xa+ z59H-;NtD3*Khr5zU*Dr~cktBhHqTs**m^UJ&Dz&|5o;LOo75yu9Tw<~iNOgwK?!`$ z%O6V{6}2``vN{mG#IUH{bx$vS7X(5V ziA|IycV;A46Wdh0%g5#0`rFX4m*BppJxEXr$DxQ&<><@3O_ETvA9h~QpbjERr?Wzq zO~fOtD5Fy3NSv#yK1I#y1C2xF-zH_SI}K z?FF)$#?JR-hf?vfLC3Cl|DL-Gr&S4XkkkNh<;|O_k(!Tx_K;IUXx7FQ)mo(MLYPsU z#hwlB>_Tii`T1UwcaOSS3j5&}{e43Y1Y(^^ak^7m*pza+Qknu%&!34dq61Fx@pia* zyT3loemSTz%gfvEc(&>I&QK?EfCqoE95r7?jdbCqmjoff5fxea{^~KJij`1DE;lYlCju*2K#F zaoFkDnO6E60SJ(NN0PqnWl^Qq#vlFv*Yj*w>DtC{m{$w~*}O0`Zp)`p2H?5=*VU|c zvR`&qE;0SIj)CJ0gvCFvAI~1R1?m5%r+D4W&Z)x)<~73-FHRgLG!<;A@{x(g)qk#< zx_KU%AoTR8=F~&7@8;YPjLdpZ&UHC>Hi3s5SUJM(|GI>1=RIIb2E{2*mpCU*C;Bvb zNL(~np#!UZDd#>xe5k6v9dxeo61oy+V)O8iZ}->pd^c17oHRs52MS4_konFZG=Rt{S#Hyc`zEFO zZ>JE*L^%NykNoJ*yf;2hP^n4<0^fK04XbKHE-ZG@z(f4^BU!D))_Cl@Pqp}N5~U4> z>h}mVh|hfp`?m$e*HY&;5m5eFxwq)WJ0o;BuqF4x;~dFbuYlRu`N;EM%bSNadCP{} zJq9JacrZw4>q)jYG?9DLh8|w|p9o5FXye{IP}`AN_}M043&0@z1CGRXSp=9lB7b)4 zUyoe;5#oP>#eDF6Jq858X=*q$P2dnPI*#S)e9bX#zab623d^6CX9%4By2Sy>9zUq1)@2X{^YOe);`!%FM--_P&jgG z3=eFhRdD<=;9CW2EfY+?Vi3p(*%`_aOQ^72Q4%>Y#S3@ba)B7>)hXGe-uiYi@l-7~@9*n1L61}2 zQbE~$>Kjpaf{00Do&oM9)2&@bWEd*c6zcTJM8^1C4x~(I*+Mq-&@QO^eXdOm$J#%4 zQh_^$XN-i-*!*Ia0&9vg8gD}h0h~A$hvt3Iz!W!0}*gw8iFOe0c@eY4+cYiqC5OvoCdbEQGC@3D zFAC_S|GrEMtTBa9*KiQvJfcCB?}TZBQvyPn(LQxMw%!ln`e5~t^4Y(W3CT=Svj6=N zHLwj1>h>A(8_VwSFrwG#hVJJ~IjOML*|22+B#L)Oi>@dd6`b%8Pf3ALD!oCiwM4EO(iPjJOd zVJwADweOtWaveC+DM3iP8Lq!l_0h zZ^qpC5sMJEW)99cp!gpH6!#PQL3|ScB(i7iWw3SqAs>)KQVhD^Oa`Q~krbRDhloy# z$8!C5*FYrA(}=dvKvAzB7(0i<7{CVJ$DvmLHIGbd66KpFRNy84kAsn!s)Tb^i*|W^ zyuHd0iEh!ld!jd0LW8FM3DPS)JA)5#GR^W6sw28=>bx^v>$5i=~-$m0o5cq`oy+gYgc9kQ>C^{6*xDh_21pe z|H2Xew=yxVcjjSwJGsu^zjdbzL6^~!ZI~b<#*0^-#kL+xS1f45PdBEhmv;YeFQ&O> zYdtWV&&nx&F*eFpWrp#zfo(mkqVR5ne}*c_Q9awbW(;!3>if(4+q8>+@2#W&fx3%U z0jsaF_S>cusdu516@{cNv{YbVI@APSO5ct`O@yo`-@^XBX%Mn-Vm3ydXOOuZ_V4U0iOqI>Yk=dsmSzQ6rMUvpR9n3beFk&ad_?6BY6?dFxp;j|vpr2dp@ zVcvflt=*SV8L1kzf)@sx=mp7;!c@=e8Qwmkv!As5T@su6@2gd9Ml3x^u7!mw2EQ5 zSt>Vp*&B1Vx}xh7msD%=K@q|UD5IjD0ogy3&$ktESgRC6A=6tHCeCoGO>(4Y$v(+U zjtGui_&mXJp2!>U_l6th@6IeVFGh%4*T{Xl44kg4{kqCypzk<`K3sOlh_SLpOMCsx z8R<6s;&uDqU*WPcomQ!e42_IsGu7)Z@jy0-C(2yXcgg&aDa~hFZ*@c&6s`7+=t|80 zvi#3?nrD)zOU#Rlz10VKva`#7|7_x4$j+;LGhks#ILJnu%?;m{F#7xX_gz%tE;w0) zq5BgZV!|6WOfXfW6>o>Z_(4%coe|8n`K*PjX`#wJxDrq0-tE69>T3hD=&RuuK*9)B z2a_5$j5KvdT-K`9*oUn+3GRzYHuYH~aL`t~fAe5Frnl`MkHvB_rQ82lb?`|H(sMKC zTZV)U=j5I660k^0UXtYG!I5VtC*D>JD;(2iwBITJ9-mKzKwgm5T zia-Ck>YP|jW)&dy9Qunq81E6)yhX=9s}E^>Z4-Kzon>BR=BV`UhRtCUqstmv&Xw3& ze*wLL;~}ldGo6vjtDe@YuXw?DXBp&F^Rbmae~70y=sQ<~`3#xiP?tk3QyZdJA zXm2LprY}yFqH?|bcZ5`%5%|HOzN&=(gi^czud1t$O6m;bsK}wFP0XVVR~n+wA|iEG zW_H-PBq@p~kItA5TBWYYWe%QsA@l|QGKVy$-0u@L`!@E4=F|+U~86ViLd5|m*d&rW9l^V zgyT*#L%y*jcHCWlaTgZnLfsRG>6#~1Lrrp=%Y`3WuW^?gMQj#}@X*H~?E_6rpaJ>1 zJIP#)5M&{|1E%|jH_*hnk_f}Qvn8OgP32-pV z+h_ogRb+1v);BX*vsWbWd0K5gbM}<|H!S$~ zKaZawrLY$d{)Y!H<*ra&&Dx)26$1$td2Cx`V0zDRCpz7bLpf$#3A84%A>!qoU~y*q zvBCp8)JV^kC;2ic#QQ37=5~K%Nlc%kB3x{ulAT2d5aYWO6?%sT15tL^fO2mnjANEh z+*e(PjX|zt<0~4y$sM6_{Zl-&8gRfuqw`-2oCt#fz47|vm>~p(egWu}l2$3?6Xits zn`HtyP>s2(jHr@DuZB5nZ%Tc^Rx`^YrER1*Bgbx_F(|)*z7PL0zDz=TS9Z{z3HFD|psWE4 zHwCQ+Qza;Qd>Iuk5>gHnf&W(s*9TU}64F4ZsT_N=T_6mO^_G~!OrrS`$NwLfQ>9aa z5XNLsB&7av|6bk)e|Bi*sHUnKYBUz<(mm;vk<)E7ub~ikLlM$7aSNk`T?v=<;p@FT zbAw%FR|PQCs^&IdM52Y$&>0WgzvUSlBg?_pf`JPt_%d?*1aUeH8BYgv%H#|z7}0s4aFOZ__ z88ZUVM0?xo)bEBT13C{s@NbFmA}v*;S|{(*DGkFhdPBcHE1)xG3T9DT*=Sg^cPprs z>eI?~Q!tnlAWQrQYwFesy9&FNg~k0$%H-fx)^;k&bP37h#Y4o->B-y;>avA}+&2##Z3TjI(Dhr8T}d9qHrdpBN(jJrKR5ki$8oy|>brRY;9^UfZLvsiW!H8MoPljq3gZ841JS=$I#c+A1P1Xa^@!R5XEr)evD0n zrBH4ei`CsW!P`B5f1 z-bWqLDf#z^>Uq0-D2B5u?sPv1HA!35Up9l$LPWoU;K>9375@NH?|*~< literal 0 HcmV?d00001 diff --git a/portal-4cli/src/assets/closedAccess.png b/portal-4cli/src/assets/closedAccess.png new file mode 100644 index 0000000000000000000000000000000000000000..b1d033cee919e1a13057cce679875fedb0d65b0a GIT binary patch literal 3607 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 Ef-cvre*gdg literal 0 HcmV?d00001 diff --git a/portal-4cli/src/assets/common/Home-icon.png b/portal-4cli/src/assets/common/Home-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..6648060e3a1d5f12df6a71df6085ccfdc3d885dd GIT binary patch literal 3119 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 JPDHLkV1kx9)Jp&W literal 0 HcmV?d00001 diff --git a/portal-4cli/src/assets/common/Logo_Horizontal.png b/portal-4cli/src/assets/common/Logo_Horizontal.png new file mode 100644 index 0000000000000000000000000000000000000000..797a31bf0c08ba7276e93a6dc92d3acbf34050af GIT binary patch literal 12549 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 literal 0 HcmV?d00001 diff --git a/portal-4cli/src/assets/common/Logo_Horizontal_white_small.png b/portal-4cli/src/assets/common/Logo_Horizontal_white_small.png new file mode 100644 index 0000000000000000000000000000000000000000..e8a3a6acc61a79cdf51c77fbeeb8294dc065f0e5 GIT binary patch literal 4630 zcmV+x66x)UP)es5$00009a7bBm000o1 z000o10d$F+O8@{0PiaF#P*7-ZbZ>KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000L;NklqriK~d2bmm)z?R1lX|5I3ZT3R+Tqq7*f8qqb@U zcWhlSDu~gz#MU;&rCKFv#o!jyphl~LKr5g~P!Nr%2tJUVe*4EeS5HoU+r95q&3pGG zlRIJ(H3Uxii#wK?>CfquZQz;?iAz!!1`7+PaT1g zmj64ju>j9tU{7EX@J68R2y9=l?~il(>kf1%V=SwI)mef+92f=+0CoY|1FKB%J%E1z zYg>un4**76emU@BfrT;(=n2eE5d0}Xw}O2y1)j4_7oiJK4|FPHET008A}OW=B|W2j z_*BxR3H&WF&2!^kFR5Kl{qw_I9ph-%sC-y2>Gp(v9#>^>Rn+mn2Ic`n9c~ryFJLC{ zj>GQ+Ot#h7l5K^9fdgH+4j7Tcvt20v*yVp&!8g{wgp@V$XCz?D`WVs(#bp@P3H0e2ZNErVxMD1YVh4T1J0uqCCPs18O0&jJryc|(H! z-d4b7xUY0%bPq?tK+uG+8M(J{J=kDdqI<;s^7;Av-GL2a26)X8*ZO__Y1gN`iVYMO{SN1Y_f&u)2!CEiQkO%U=pC1}?I4fAfKtTl&EC zC&H^Y5ys-#hp z#z=ZJe005QuU#1MOi5=*I>Cgt($S6%-}0uTZIJY!q)C!q&k#mTV?y0)9IZakZfv69 z*GXEFl9J$%48a$HJxhZ3AJVfz!TVFAf5IssNy8KPMupu|XZV{O{-FfEog{r?^koiz zy5oCSQjZLQG)SsV8P5V&Z>yxvj#eY-3rAnwM8TH>_k?~b5&VFXRlgy_Z!8KsyL?g% z|8`({0{(BNuS>?%5U1BMJK&5I>vg#0cXxXG99O5_YyuDWn%7b?s)i=CeLT>|m46@f zu!2S3#o`+OPiO#6O|Uy6d;)xwk^Tt$r*uiP#4+}@3z%}DpZ#t#BZ@FlcVzJ151eNC zKEU(NnAv8QbjJife=%_=@FuXA3sTHY>2I3F$^i}nX5_eOy@LS@utO-{6oOynzu%bM`1$uaOIxB^##76 z#Ix0Yvo4ReCQXD}z(W$EWqGh0aI7uba^Z$B2YwR{cOl#9)<+hsO&C+^wd@Q#o;v_X z+2H3^=*~?|iCfntgcp4rx&)iUvAWb^1?^J&_cj*pd@KmEHYbjNJ5id;J)2me;P*}u z{CFpLfMW{CrlZ}y6%zaw(_@ni_k``VEd}_;0Y7!C?N2F!9Sl5^aXk6mzaj{Jqg@>w1;H{Pa1&3Xneo0sF^OU7TYfO!k+>h-5h>=t&2*XZ6DqPc+2$e+Znvq0@np& zYHLc}DH(#l!sTDG-+$A12Y#I0j?Kw9Z8q9YZR+E}2|(Kru=#Bc&y7JBUv0+df17DB z#$A6Djqf97r_?{k47@yeItENu2Gjp9=8E){^b<)(NE#p99Z9-2C#WMyvn2I%^h1Ns z{k)?Mb@(-shK08K+hs)wx*C3om6v3=o~I-Pj=F?^jZy+LF}0QSRp4uH-<#&n%?h-^ zIeknI^`COIa?lo7+25O{~#!wU~%T>be8k-Mz+dnU|zX}l{c4G5%lHdfMG8GLIc z{Z&%$0%6?utUM{DttajJGwpiw;}pK7_R_`IpIutf8Q(R~wK2+Y0}`$`iweG0(q_lI zzs-w>KCb?G4!=p#j|%iL&GF1}fv0g5%Ke`;Iq&NG@y(mNADG3xh{hK=t8(YTtw-<^%&@s3BV1dB?+E@k024#8ic3!CmH+?% M07*qoM6N<$g4Tq*yZ`_I literal 0 HcmV?d00001 diff --git a/portal-4cli/src/assets/common/Symbol.png b/portal-4cli/src/assets/common/Symbol.png new file mode 100644 index 0000000000000000000000000000000000000000..b58e78dca843ac5148a5ddbc6ad9001d21dd531b GIT binary patch literal 8018 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 P`%8}0Gt;fncEbE0A^aOC literal 0 HcmV?d00001 diff --git a/portal-4cli/src/assets/common/custom.css b/portal-4cli/src/assets/common/custom.css new file mode 100644 index 00000000..b9f88055 --- /dev/null +++ b/portal-4cli/src/assets/common/custom.css @@ -0,0 +1,1111 @@ +@import url('https://fonts.googleapis.com/css?family=Josefin+Sans|Raleway|Roboto|Roboto:900|Roboto+Condensed|Roboto+Mono|Roboto+Slab'); +@import url('https://fonts.googleapis.com/css?family=Open+Sans:300,400'); +@import url('https://fonts.googleapis.com/css?family=Merriweather|Merriweather+Sans'); +@import url('https://fonts.googleapis.com/css?family=Roboto+Slab'); +@import url('https://fonts.googleapis.com/css?family=Lora'); +@import url('https://fonts.googleapis.com/css?family=Raleway|Raleway+Dots'); + + +body { +font-family: 'Open Sans', sans-serif!important; +font-family: Raleway, sans-serif!important; +font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif!important; +font-size: 14px; +font-weight:normal!important; +} +h1, .uk-h1, h2, .uk-h2, h3, .uk-h3 { + font-family: 'Open Sans', sans-serif !important; + text-transform:none!important; + font-weight:300; +} +h4, .uk-h4, h5, .uk-h5 { + font-family: 'Open Sans', sans-serif !important; + font-weight:bold; +} + +h6, .uk-h6 { + font-family: 'Open Sans', sans-serif !important; + font-weight: normal; +} +h2, .uk-h2 { + font-size:36px; +} + +a, .uk-link { + color: #2D72D6; +} +a:hover, .uk-link:hover{ +color: #D53B23; +} + +.uk-badge, .badge, a.badge { border-radius: 2px;} + + +.hero_to_top { +} +.image-front-topbar { + margin-top:-40px; +} + +.tm-header { +/*padding-top:40px;*/ +} + +.tm-toolbar { +border-top: 5px solid #05007A; +position:relative; +color: #fff; +padding-top: 0px; +padding-bottom:0px; +background:rgba(255,255,255, 0.0); +z-index:10000; +/*background: linear-gradient(rgba(255,255,255,0), rgba(255,255,255,0)), url(/images/toolbar_bg.png);*/ + +} +.tm-toolbar .forimage { +background:rgba(255,255,255, 0.4); +} + +.uk-section-overlap { + /*margin-top:-40px!important;*/ +} +.uk-sticky{ +} + +.tm-header .uk-navbar-left {position:relative;z-index:9999!important;} +.tm-header .uk-logo {padding: 5px 10px 10px 10px; position:relative;z-index:1000!important;} +.tm-header .uk-navbar-transparent{ + /* background:rgba(255,255,255, 0.7);*/ + padding-top:4px; +} +.inner { + left:0px; + background-color: #05007A; + margin-top:-5px; +} +.tm-toolbar .uk-container { +padding-right:0px; +} + +.tm-toolbar ul.uk-subnav.uk-subnav-line{ + margin-top:-10px; + background-color: #05007A; + padding:10px 10px 0px 0px; + transform: skew(25deg); + margin-right:10px; +} + +.tm-toolbar .uk-subnav-line li { + padding:5px 25px 5px 25px; + /*transition: background 0.2s;*/ + /* display:inline-block;*/ + font-family:Roboto!important; + font-weight:900!important; + text-transform:uppercase!important; + font-size:12px!important; + opacity:1!important; + display:inline-block; +} +.tm-toolbar .uk-subnav-line > :before { + content: none; + display: block; + /* display: inline-block*/ + height: 10px; + vertical-align: middle +} + +.uk-subnav-line > :nth-child(n + 2):before { + margin-right: 10px; + border-left: 0px ; +} + +.tm-toolbar .uk-subnav-line li a{ + display: block; + text-decoration:none; + transform: skew(-25deg); + font-family:Roboto:900!important; + text-transform:uppercase!important; + font-size:13px!important; + opacity:1!important; + color:#fff!important; +} + + +.tm-toolbar .uk-subnav-line li:hover { + color:#05007A!important; + background:#fff; + display: block; +} + + +.tm-toolbar .uk-subnav-line .uk-active .home-hover li:hover, +li.uk-active.home-hover +{ + background:#05007A!important; +} + +.tm-toolbar .uk-dotnav, .tm-toolbar .uk-subnav { + margin-bottom:0px!important; +} + +.tm-toolbar .uk-subnav-line li a:hover, +.tm-toolbar .uk-subnav-line li:hover a { + display: block; + color:#05007A!important; +} + +.movetotop .uk-slidenav-position{ + /*top:-130px; + z-index:5;*/ +} + +.uk-navbar-container:not(.uk-navbar-transparent) { + background: #fff; + box-shadow: 2px 15px 50px rgba(41, 44, 61, .1); +} + +.uk-navbar-sticky { + box-shadow: 2px 15px 50px rgba(41, 44, 61, .1); +} + +.navbar .nav>li>.dropdown-menu, .uk-navbar-dropdown +{display: none; +position: absolute; +z-index: 1020; +box-sizing: border-box; +width: 200px; +padding: 25px; +background: #fff; +color: #4F5260; +border-radius: 2px; +box-shadow: 2px 15px 50px rgba(41, 44, 61, .1) +} + + +/* +.uk-light a, .uk-light .uk-link, +.uk-section-primary:not(.uk-preserve-color) a, .uk-section-primary:not(.uk-preserve-color) .uk-link, +.uk-section-secondary:not(.uk-preserve-color) a, .uk-section-secondary:not(.uk-preserve-color) .uk-link, +.uk-tile-primary:not(.uk-preserve-color) a, .uk-tile-primary:not(.uk-preserve-color) .uk-link, +.uk-tile-secondary:not(.uk-preserve-color) a, .uk-tile-secondary:not(.uk-preserve-color) .uk-link, +.uk-card-primary.uk-card-body a, .uk-card-primary.uk-card-body .uk-link, .uk-card-primary>:not([class*='uk-card-media']) a, +.uk-card-primary>:not([class*='uk-card-media']) .uk-link, .uk-card-secondary.uk-card-body a, +.uk-card-secondary.uk-card-body .uk-link, .uk-card-secondary>:not([class*='uk-card-media']) a, +.uk-card-secondary>:not([class*='uk-card-media']) .uk-link, .uk-overlay-primary a, .uk-overlay-primary .uk-link, +*/ +.uk-navbar-container:not(.uk-navbar-transparent) a, .uk-navbar-container:not(.uk-navbar-transparent) .uk-link, +.uk-offcanvas-bar a, .uk-offcanvas-bar .uk-link, .tm-toolbar a, .tm-toolbar .uk-link { + color: #292C3D +} + + +.uk-navbar-container:not(.uk-navbar-transparent) a, .uk-navbar-container:not(.uk-navbar-transparent) .uk-link, +.uk-offcanvas-bar a, .uk-offcanvas-bar .uk-link, .tm-toolbar a, .tm-toolbar .uk-link { +/*color:#292C3D; +color: #245BCC; +color: #2D72D6; +*/ +/* +font-size: 14px; +line-height: 18px; +*/ +} + +/*footer*/ +.footer-license { +font-size:11px!important; +line-height:16px!important; +} +.footer-license .uk-section-primary:not(.uk-preserve-color) a{ + color: #128DD5!important; + font-size:11px!important; +line-height:16px!important; + +} +.footer-license a:hover { + color: #D33A24; +} + +.uk-light .uk-navbar-nav>li>a, .uk-section-primary:not(.uk-preserve-color) .uk-navbar-nav>li>a, .uk-section-secondary:not(.uk-preserve-color) .uk-navbar-nav>li>a, .uk-card-primary.uk-card-body .uk-navbar-nav>li>a, .uk-card-primary>:not([class*='uk-card-media']) .uk-navbar-nav>li>a, .uk-card-secondary.uk-card-body .uk-navbar-nav>li>a, .uk-card-secondary>:not([class*='uk-card-media']) .uk-navbar-nav>li>a, .uk-overlay-primary .uk-navbar-nav>li>a, .uk-navbar-container:not(.uk-navbar-transparent) .uk-navbar-nav>li>a, .uk-offcanvas-bar .uk-navbar-nav>li>a, .tm-toolbar .uk-navbar-nav>li>a { +color:#292C3D;} + +.uk-light .uk-navbar-nav>li.uk-active>a, .uk-section-primary:not(.uk-preserve-color) .uk-navbar-nav>li.uk-active>a, .uk-section-secondary:not(.uk-preserve-color) .uk-navbar-nav>li.uk-active>a, .uk-card-primary.uk-card-body .uk-navbar-nav>li.uk-active>a, .uk-card-primary>:not([class*='uk-card-media']) .uk-navbar-nav>li.uk-active>a, .uk-card-secondary.uk-card-body .uk-navbar-nav>li.uk-active>a, .uk-card-secondary>:not([class*='uk-card-media']) .uk-navbar-nav>li.uk-active>a, .uk-overlay-primary .uk-navbar-nav>li.uk-active>a, .uk-navbar-container:not(.uk-navbar-transparent) .uk-navbar-nav>li.uk-active>a, .uk-offcanvas-bar .uk-navbar-nav>li.uk-active>a, .tm-toolbar .uk-navbar-nav>li.uk-active>a +color:#292C3D;} + +.uk-light .uk-navbar-nav>li>a::before, .uk-section-primary:not(.uk-preserve-color) .uk-navbar-nav>li>a::before, +.uk-section-secondary:not(.uk-preserve-color) .uk-navbar-nav>li>a::before, +.uk-card-primary.uk-card-body .uk-navbar-nav>li>a::before, +.uk-card-primary>:not([class*='uk-card-media']) .uk-navbar-nav>li>a::before, . +uk-card-secondary.uk-card-body .uk-navbar-nav>li>a::before, +.uk-card-secondary>:not([class*='uk-card-media']) .uk-navbar-nav>li>a::before, +.uk-overlay-primary .uk-navbar-nav>li>a::before, .uk-navbar-container:not(.uk-navbar-transparent) .uk-navbar-nav>li>a::before, +.uk-offcanvas-bar .uk-navbar-nav>li>a::before, .tm-toolbar .uk-navbar-nav>li>a::before { + +background-color: #128DD5; +} +.uk-navbar-nav>li>a::before { +/*height:2px;*/ +background-color: #128DD5!important; +} +.uk-light .uk-navbar-nav>li:hover>a, .uk-light .uk-navbar-nav>li>a:focus, .uk-light .uk-navbar-nav>li>a.uk-open, +.uk-section-primary:not(.uk-preserve-color) .uk-navbar-nav>li:hover>a, +.uk-section-primary:not(.uk-preserve-color) .uk-navbar-nav>li>a:focus, +.uk-section-primary:not(.uk-preserve-color) .uk-navbar-nav>li>a.uk-open, +.uk-section-secondary:not(.uk-preserve-color) .uk-navbar-nav>li:hover>a, +.uk-section-secondary:not(.uk-preserve-color) .uk-navbar-nav>li>a:focus, +.uk-section-secondary:not(.uk-preserve-color) .uk-navbar-nav>li>a.uk-open, +.uk-card-primary.uk-card-body .uk-navbar-nav>li:hover>a, .uk-card-primary.uk-card-body .uk-navbar-nav>li>a:focus, +.uk-card-primary.uk-card-body .uk-navbar-nav>li>a.uk-open, +.uk-card-primary>:not([class*='uk-card-media']) .uk-navbar-nav>li:hover>a, +.uk-card-primary>:not([class*='uk-card-media']) .uk-navbar-nav>li>a:focus, +.uk-card-primary>:not([class*='uk-card-media']) .uk-navbar-nav>li>a.uk-open, +.uk-card-secondary.uk-card-body .uk-navbar-nav>li:hover>a, +.uk-card-secondary.uk-card-body .uk-navbar-nav>li>a:focus, +.uk-card-secondary.uk-card-body .uk-navbar-nav>li>a.uk-open, +.uk-card-secondary>:not([class*='uk-card-media']) .uk-navbar-nav>li:hover>a, +.uk-card-secondary>:not([class*='uk-card-media']) .uk-navbar-nav>li>a:focus, +.uk-card-secondary>:not([class*='uk-card-media']) .uk-navbar-nav>li>a.uk-open, +.uk-overlay-primary .uk-navbar-nav>li:hover>a, .uk-overlay-primary .uk-navbar-nav>li>a:focus, +.uk-overlay-primary .uk-navbar-nav>li>a.uk-open, .uk-navbar-container:not(.uk-navbar-transparent) .uk-navbar-nav>li:hover>a, +.uk-navbar-container:not(.uk-navbar-transparent) .uk-navbar-nav>li>a:focus, +.uk-navbar-container:not(.uk-navbar-transparent) .uk-navbar-nav>li>a.uk-open, +.uk-offcanvas-bar .uk-navbar-nav>li:hover>a, .uk-offcanvas-bar .uk-navbar-nav>li>a:focus, +.uk-offcanvas-bar .uk-navbar-nav>li>a.uk-open, .tm-toolbar .uk-navbar-nav>li:hover>a, +.tm-toolbar .uk-navbar-nav>li>a:focus, .tm-toolbar .uk-navbar-nav>li>a.uk-open { +color: #128DD5; +} + +.uk-light .uk-navbar-nav > li:hover > a, .uk-light .uk-navbar-nav > li > a:focus, +.uk-light .uk-navbar-nav > li > a.uk-open, .uk-section-primary:not(.uk-preserve-color) .uk-navbar-nav > li:hover > a, +.uk-section-primary:not(.uk-preserve-color) .uk-navbar-nav > li > a:focus, +.uk-section-primary:not(.uk-preserve-color) .uk-navbar-nav > li > a.uk-open, +.uk-section-secondary:not(.uk-preserve-color) .uk-navbar-nav > li:hover > a, +.uk-section-secondary:not(.uk-preserve-color) .uk-navbar-nav > li > a:focus, +.uk-section-secondary:not(.uk-preserve-color) .uk-navbar-nav > li > a.uk-open, +.uk-card-primary.uk-card-body .uk-navbar-nav > li:hover > a, .uk-card-primary.uk-card-body .uk-navbar-nav > li > a:focus, +.uk-card-primary.uk-card-body .uk-navbar-nav > li > a.uk-open, .uk-card-primary > :not([class * ='uk-card-media']) .uk-navbar-nav > li:hover > a, +.uk-card-primary > :not([class * ='uk-card-media']) .uk-navbar-nav > li > a:focus, +.uk-card-primary > :not([class * ='uk-card-media']) .uk-navbar-nav > li > a.uk-open, +.uk-card-secondary.uk-card-body .uk-navbar-nav > li:hover > a, .uk-card-secondary.uk-card-body .uk-navbar-nav > li > a:focus, +.uk-card-secondary.uk-card-body .uk-navbar-nav > li > a.uk-open, .uk-card-secondary > :not([class * ='uk-card-media']) .uk-navbar-nav > li:hover > a, +.uk-card-secondary > :not([class * ='uk-card-media']) .uk-navbar-nav > li > a:focus, +.uk-card-secondary > :not([class * ='uk-card-media']) .uk-navbar-nav > li > a.uk-open, +.uk-overlay-primary .uk-navbar-nav > li:hover > a, .uk-overlay-primary .uk-navbar-nav > li > a:focus, +.uk-overlay-primary .uk-navbar-nav > li > a.uk-open, .uk-navbar-container:not(.uk-navbar-transparent) .uk-navbar-nav > li:hover > a, +.uk-navbar-container:not(.uk-navbar-transparent) .uk-navbar-nav > li > a:focus, +.uk-navbar-container:not(.uk-navbar-transparent) .uk-navbar-nav > li > a.uk-open, +.uk-offcanvas-bar .uk-navbar-nav > li:hover > a, .uk-offcanvas-bar .uk-navbar-nav > li > a:focus, +.uk-offcanvas-bar .uk-navbar-nav > li > a.uk-open, .tm-toolbar .uk-navbar-nav > li:hover > a, +.tm-toolbar .uk-navbar-nav > li > a:focus, .tm-toolbar .uk-navbar-nav > li > a.uk-open { + color: #128DD5!important; +} +.uk-light .uk-navbar-nav>li.uk-active>a, .uk-section-primary:not(.uk-preserve-color) .uk-navbar-nav>li.uk-active>a, .uk-section-secondary:not(.uk-preserve-color) .uk-navbar-nav>li.uk-active>a, .uk-card-primary.uk-card-body .uk-navbar-nav>li.uk-active>a, .uk-card-primary>:not([class*='uk-card-media']) .uk-navbar-nav>li.uk-active>a, .uk-card-secondary.uk-card-body .uk-navbar-nav>li.uk-active>a, .uk-card-secondary>:not([class*='uk-card-media']) .uk-navbar-nav>li.uk-active>a, .uk-overlay-primary .uk-navbar-nav>li.uk-active>a, .uk-navbar-container:not(.uk-navbar-transparent) .uk-navbar-nav>li.uk-active>a, .uk-offcanvas-bar .uk-navbar-nav>li.uk-active>a, .tm-toolbar .uk-navbar-nav>li.uk-active>a { + color: #128DD5!important; +} +.uk-light a:hover, .uk-light .uk-link:hover, +.uk-section-primary:not(.uk-preserve-color) a:hover, .uk-section-primary:not(.uk-preserve-color) .uk-link:hover, +.uk-section-secondary:not(.uk-preserve-color) a:hover, .uk-section-secondary:not(.uk-preserve-color) .uk-link:hover, +.uk-card-primary.uk-card-body a:hover, .uk-card-primary.uk-card-body .uk-link:hover, +.uk-card-primary>:not([class*='uk-card-media']) a:hover, .uk-card-primary>:not([class*='uk-card-media']) .uk-link:hover, +.uk-card-secondary.uk-card-body a:hover, .uk-card-secondary.uk-card-body .uk-link:hover, +.uk-card-secondary>:not([class*='uk-card-media']) a:hover, .uk-card-secondary>:not([class*='uk-card-media']) .uk-link:hover, +.uk-overlay-primary a:hover, .uk-overlay-primary .uk-link:hover, +.uk-navbar-container:not(.uk-navbar-transparent) a:hover, .uk-navbar-container:not(.uk-navbar-transparent) .uk-link:hover, +.uk-offcanvas-bar a:hover, .uk-offcanvas-bar .uk-link:hover, .tm-toolbar a:hover, .tm-toolbar .uk-link:hover { + color: #128DD5!important; +} + +.uk-navbar-dropdown-nav>li.uk-active>a { + color: #128DD5!important; +} +.uk-light .uk-navbar-nav > li > a:active, .uk-section-primary:not(.uk-preserve-color) .uk-navbar-nav > li > a:active, +.uk-section-secondary:not(.uk-preserve-color) .uk-navbar-nav > li > a:active, +.uk-card-primary.uk-card-body .uk-navbar-nav > li > a:active, .uk-card-primary > :not([class * ='uk-card-media']) .uk-navbar-nav > li > a:active, +.uk-card-secondary.uk-card-body .uk-navbar-nav > li > a:active, .uk-card-secondary > :not([class * ='uk-card-media']) .uk-navbar-nav > li > a:active, +.uk-overlay-primary .uk-navbar-nav > li > a:active, .uk-navbar-container:not(.uk-navbar-transparent) .uk-navbar-nav > li > a:active, +.uk-offcanvas-bar .uk-navbar-nav > li > a:active, .tm-toolbar .uk-navbar-nav > li > a:active { + color: #292C3D!important; +} + +.uk-light .uk-navbar-nav > li.uk-active > a, .uk-section-primary:not(.uk-preserve-color) .uk-navbar-nav > li.uk-active > a, +.uk-section-secondary:not(.uk-preserve-color) .uk-navbar-nav > li.uk-active > a, +.uk-card-primary.uk-card-body .uk-navbar-nav > li.uk-active > a, .uk-card-primary > :not([class * ='uk-card-media']) .uk-navbar-nav > li.uk-active > a, +.uk-card-secondary.uk-card-body .uk-navbar-nav > li.uk-active > a, +.uk-card-secondary > :not([class * ='uk-card-media']) .uk-navbar-nav > li.uk-active > a, +.uk-overlay-primary .uk-navbar-nav > li.uk-active > a, .uk-navbar-container:not(.uk-navbar-transparent) .uk-navbar-nav > li.uk-active > a, +.uk-offcanvas-bar .uk-navbar-nav > li.uk-active > a, .tm-toolbar .uk-navbar-nav > li.uk-active > a { + color: #292C3D!important; +} +.uk-light .uk-navbar-nav>li>a:active, .uk-section-primary:not(.uk-preserve-color) .uk-navbar-nav>li>a:active, .uk-section-secondary:not(.uk-preserve-color) .uk-navbar-nav>li>a:active, .uk-card-primary.uk-card-body .uk-navbar-nav>li>a:active, .uk-card-primary>:not([class*='uk-card-media']) .uk-navbar-nav>li>a:active, .uk-card-secondary.uk-card-body .uk-navbar-nav>li>a:active, .uk-card-secondary>:not([class*='uk-card-media']) .uk-navbar-nav>li>a:active, .uk-overlay-primary .uk-navbar-nav>li>a:active, .uk-navbar-container:not(.uk-navbar-transparent) .uk-navbar-nav>li>a:active, .uk-offcanvas-bar .uk-navbar-nav>li>a:active, .tm-toolbar .uk-navbar-nav>li>a:active { +color:#128DD5!important; +} + +.uk-navbar-dropdown-nav { + font-size:14px; +} +.uk-navbar-nav>li>a, .uk-navbar-item, .uk-navbar-toggle, .navbar .brand, .navbar-search, .navbar .nav>li>a { + font-size: 14px; + font-family: Roboto; + font-family: "Merriweather", serif; + font-family: 'Merriweather Sans', sans-serif; + font-family: 'Roboto Slab', serif; + font-size: 16px; + line-height: 23px; +text-transform:none; +color: rgba(0, 0, 0, 0.8)!important; + font-weight: 500 !important; +} +.uk-nav-default .uk-nav-header, +.uk-navbar-dropdown-nav .uk-nav-header { +color: #245CCF; +font-size:14px; +} + +.sidemenu .uk-h3{ + +padding-bottom: 15px; +font-weight: 300; +text-transform: none; +color:#040067; +} +.sidemenu .uk-nav, .uk-nav ul, .dropdown-menu { +font-weight: 300; +font-size: 14px; +color: #80828B; + +} +.sidemenu ul>li>ul, .sidemenu ul>li>ol, .sidemenu ol>li>ol, .sidemenu ol>li>ul{ +padding-left: 40px; +} +.sidemenu ul>li>ul a { +color: #80828B!important; +color: rgba(99, 104, 114, 0.8)!important; +} +.sidemenu ul>li>ul a:hover { +color: #D53B23!important; +} +.uk-nav-header:not(:first-child) {margin-top:10px;} +.uk-navbar-dropdown, .navbar .nav>li>.dropdown-menu { + background:#fff; +} +.uk-nav>li>a, +.uk-navbar-dropdown-nav>li>a, +.uk-navbar-dropdown-nav .uk-nav-sub a { + color:#292C3D; + font-weight:300; + padding:4px 0; +} +.uk-section-secondary:not(.uk-preserve-color) h3, +.uk-section-secondary:not(.uk-preserve-color) h3 a, +.uk-section-secondary:not(.uk-preserve-color) a:hover { color:#444!important;} + + +.uk-article-title { +font-size: 38px; +line-height: 1.1; +} + +.uk-text-meta { +font-size: 14px; +line-height: 1.4; +color: #90929D; +font-family: PT Serif; +font-weight: 400; +text-transform: none; +letter-spacing: 0; +font-style: italic; +} +.uk-card-default .uk-card-title { +color: #292C3D !important; + +} +.uk-light .uk-text-meta, .uk-section-primary:not(.uk-preserve-color) .uk-text-meta, .uk-section-secondary:not(.uk-preserve-color) .uk-text-meta, .uk-card-primary.uk-card-body .uk-text-meta, .uk-card-primary>:not([class*='uk-card-media']) .uk-text-meta, .uk-card-secondary.uk-card-body .uk-text-meta, .uk-card-secondary>:not([class*='uk-card-media']) .uk-text-meta, .uk-overlay-primary .uk-text-meta, .uk-navbar-container:not(.uk-navbar-transparent) .uk-text-meta, .uk-offcanvas-bar .uk-text-meta, .tm-toolbar .uk-text-meta{ +color: #90929D; +} + +.uk-text-primary {color: #040067!important;} +.uk-text-secondary {color: #00a0de!important;} +.uk-section-primary { + background: #040067; +} +.uk-section-secondary { + background: #00a0de; +} +.first_page_section { + /*position: relative;*/ + } +.first_page_section .uk-section>:last-child { +position: relative; +top: 50%; +transform: translateY(-50%); +} + +.first_page_section .first_page_banner_headline { + /*position: relative;*/ + font-family: 'Open Sans', sans-serif; + font-weight: 300; + color:#fff; + +} +.first_page_panel h3.uk-h1 { + color:#fff; +} +.first_page_panel { + border: 0px solid #e5e5e7!important; + padding:20px 20px!important; +/*width:100%!important;*/ + font-size:24pt!important; + padding:20px!important; + color:#fff; +} +.first_page_panel .banner_text_bottom { + font-size:20pt; + padding:20px; +} +.mainHdr {background-color: rgb(4, 0, 103)!important; +} + + +/*tabs*/ +.wk-tab::before { + content: ""; + position: absolute; + bottom: 0; + left: 20px; + right: 0; + border-bottom: 1px solid #e5e5e5; +} +.wk-tab>li.wk-active>a { +border-color: transparent transparent #1678CB transparent !important; +background:tranparent; +border-bottom: 2px solid #1678CB; +} +.wk-tab>*>a { + display: block; + text-align: center; + padding: 9px 20px; + color: #444!important; + border-bottom: 2px solid transparent; + font-size: 12px; + text-transform: uppercase; + -webkit-transition: color 0.1s ease-in-out; + transition: color 0.1s ease-in-out; + line-height: 20px; +} + +.wk-tab>li.wk-open>a, .wk-tab>li>a:focus, .wk-tab>li>a:hover { +border-color: transparent transparent #1678CB transparent !important; +background: transparent!important; +color: #1678CB!important; +outline: 0 +} + +.serviceicon .wk-panel h3{ text-transform: uppercase!important; font-weight: 700; font-size:12px; +} +.serviceicon .wk-panel:hover h3{ + color: #D53B23!important; +} +.serviceicon .wk-margin, +.serviceicon .wk-panel-teaser, .serviceicon .wk-panel-title {margin-bottom:10px;} +.serviceicon *+.wk-margin {margin-top:10px;} + +.key_message { + color: #128DD5!important; +} +.larger-font { + font-size:120%; +} + +.nspArt h4.nspHeader { +font-family: 'Open Sans', sans-serif !important; +font-weight: 400; +font-size: 16px; +margin: 0; +padding: 5px 0 5px 0; +} +.nspArt p, .nspArt ul, .nspArt ol, .nspArt dl, .nspArt pre, .nspArt address, .nspArt fieldset, .nspArt figure { + margin-top: 0px; + margin-bottom: 8px; +} +.nspArt p.nspText {margin-bottom:15px;} +.readon , .readon:link{ + margin: 0; + border: 1px solid #eaeaea; + overflow: visible; + font: inherit; + color: inherit; + text-transform: none; + display: inline-block; + box-sizing: border-box; + padding: 0 25px; + vertical-align: middle; + font-size: 13px; + line-height: 40px; + text-align: center; + text-decoration: none; + -webkit-transition: .1s ease-in-out; + transition: .1s ease-in-out; + -webkit-transition-property: color, background-color, border-color, box-shadow; + transition-property: color, background-color, border-color, box-shadow; + font-family: Roboto; + font-weight: normal; + text-transform: uppercase; + border-radius: 2px; + background-color: #fff; + color: #5b5b5b; + box-shadow: 0px 3px 12px rgba(0, 0, 0, 0.07); +} + +.readon:hover{ +background-color: #fff; +color: #00a0de; +box-shadow: 0 6px 50px rgba(0, 0, 0, 0.05); +} +.banner_text_white {font-weight: 300; font-size: 28px; color:white;} + + +/*custom classes */ +.partner_slider .wk-link-reset, .partner_slider .wk-link-reset a, .partner_slider .wk-link-reset a:focus, +.partner_slider .wk-link-reset a:hover, .partner_slider .wk-link-reset:focus, .partner_slider .wk-link-reset:hover { +color: black; +} +.dark-divider hr, .dark-divider .uk-hr { +border-top: 1px solid #6c6c6c; +} + +/*events*/ +.calendar h3{text-transform:none; font-weight:300; margin-bottom:5px; margin-top:5px;} +.mod_events_latest_table td { + padding-top:5px; + padding-bottom:5px; +} +.mod_events_latest_table td p{ + margin-bottom:10px; + margin-top:0px; +} + +.mod_events_latest_date { + width: 18%; + float: left; + position: relative; + color:#757575; + color:#fff; + font-size:12px!important; + background: #9c9c9c; + font-weight:400; + /* + border-radius: 1px; + -moz-border-radius: 1px; + -webkit-border-radius: 1px; + border: 1px solid #757575; + -moz-box-shadow: 0px 0px 3px #757575; + -webkit-box-shadow: 0px 0px 3px #757575; + box-shadow: 0px 0px 3px #757575; + */ + margin-right:8px; + margin-top:5px; + text-align:center; + padding:10px 0px; + line-height:20px; + +} +.mod_events_latest_date .larger_font { + font-size:28px!important; + font-weight:700!important;} + +.mod_events_latest_time { + //float: left; + position: relative; + width: 75%; + overflow:visible; + line-height:14px; + font-weight:400; + font-size:12px; + padding: 5px 0px; + margin-bottom: 8px; + text-transform:none; +} +.mod_events_latest_time { + font-size:12px; +} +.mod_events_latest_table td .content{ + font-size:12px!important; + font-weight:300; + text-transform:none; +} +.mod_events_latest_table td .hdr{ + font-size:14px!important; + line-height: 16px; + font-weight:400!important; + text-transform:none; +} +.mod_events_latest_rsslink a { +color: #767779; + +} +.mod_events_latest_rsslink{ +padding: 30; +line-height: 1.625; +background: 0; +color: #767779; +position: relative; +padding-right: 27px; +margin: 0; +border: 0; +overflow: visible; +font: inherit; +display: block; +box-sizing: border-box; +vertical-align: middle; +font-size: 13px; +display:inline-block; +text-decoration: none; +-webkit-transition: .1s ease-in-out; +transition: .1s ease-in-out; +-webkit-transition-property: color, background-color, border-color, box-shadow; +transition-property: color, background-color, border-color, box-shadow; +font-family: Roboto; +font-weight: normal; +text-transform: uppercase; +border-radius: 2px; +background-origin: border-box; +} +.mod_events_latest_rsslink a:hover { +color: #00a0de; + +} +.mod_events_latest_rsslink:hover::before { +background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2223%22%20height%3D%2211%22%20viewBox%3D%220%200%2023%2011%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Cpolyline%20fill%3D%22none%22%20stroke%3D%22%2300a0de%22%20points%3D%2217%201%2022%205.5%2017%2010%20%22%3E%3C%2Fpolyline%3E%0A%20%20%20%20%3Cline%20fill%3D%22none%22%20stroke%3D%22%2300a0de%22%20x1%3D%220%22%20y1%3D%225.5%22%20x2%3D%2222.4%22%20y2%3D%225.5%22%3E%3C%2Fline%3E%0A%3C%2Fsvg%3E"); +background-position: 100% 50%; + +} +.mod_events_latest_rsslink::before{ +content: ""; +position: absolute; +top: 0; +bottom: 0; +right: 0; +width: 22px; +background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2223%22%20height%3D%2211%22%20viewBox%3D%220%200%2023%2011%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Cpolyline%20fill%3D%22none%22%20stroke%3D%22%23767779%22%20points%3D%2217%201%2022%205.5%2017%2010%20%22%3E%3C%2Fpolyline%3E%0A%20%20%20%20%3Cline%20fill%3D%22none%22%20stroke%3D%22%23767779%22%20x1%3D%220%22%20y1%3D%225.5%22%20x2%3D%2222.4%22%20y2%3D%225.5%22%3E%3C%2Fline%3E%0A%3C%2Fsvg%3E"); +background-repeat: no-repeat; +background-position: calc(100% - 5px) 50%; +-webkit-transition: background-position .2s ease-out; +transition: background-position .2s ease-out; +} +.mod_events_latest_callink a, .mod_events_latest_callink a:hover{ + color: #fff!important; +} +.mod_events_latest_callink { +padding:0px; + margin:10px 0px; + background-color: #00a0de; + color: #fff!important; + display: inline-block; + box-sizing: border-box; +padding: 0 25px; +vertical-align: middle; +font-size: 13px; +line-height: 40px; +text-align: center; +text-decoration: none; +-webkit-transition: .1s ease-in-out; +transition: .1s ease-in-out; +-webkit-transition-property: color, background-color, border-color, box-shadow; +transition-property: color, background-color, border-color, box-shadow; +font-family: Roboto; +font-weight: normal; +text-transform: uppercase; +border-radius: 2px; +background-origin: border-box; +} + +.mod_events_latest_callink:hover { +background-color: #008ec5; +color: #fff!important; +} +/* news pro */ +.nspLinks ul li h4 { +font-weight: 400; +font-size: 16px; +line-height: 18px; +} +.nspLinks ul li p { + text-transform:none; + font-size: 14px; + font-weight:300; + margin:10px; +} +.readon-button{ +text-transform: none; +font-size: 14px; +line-height: 20px; +font-weight: 300; +font-family: 'Open Sans', sans-serif !important; +} +.readon-button:hover { +} +.newsletter .uk-h2 {font-size:28px!important;} +.newsletter .uk-icon { +padding-left: 10px; +padding-bottom: 15px; +vertical-align: middle; +} +.newsletter .el-title{ +display: inline-block; +fill: currentcolor; +margin-bottom:0; +} + +.newsletter .acymailing_mootoolsbutton a:link, +.newsletter .acymailing_mootoolsbutton a:visited { +background:none!important; +border:none!important; +text-shadow:none!important; +color: rgba(255, 255, 255, 0.5)!important; +font-size: 14px; +font-weight: 300; +line-height: 20px; +} + +.newsletter .acysubbuttons input.button, .newsletter .acysubbuttons .button { +padding: 0 15px!important; +line-height: 30px; +font-size: 13px; +border-radius: 2px; +margin: 0; +border: 0; +overflow: visible; +font-family: Roboto; +font-weight: normal; + +color: inherit; +text-transform: none; +display: inline-block; +box-sizing: border-box; +vertical-align: middle; +text-align: center; +text-decoration: none; +-webkit-transition: .1s ease-in-out; +transition: .1s ease-in-out; +-webkit-transition-property: color, background-color, border-color, box-shadow; +transition-property: color, background-color, border-color, box-shadow; +font-family: Roboto; +font-weight: normal; +text-transform: uppercase; +background-origin: border-box; +box-shadow: 0 3px 12px rgba(0, 0, 0, 0.07); +} + +.newsletter .acysubbuttons input.button:hover, .newsletter .acysubbuttons .button:hover { +color:#444; +background-color:#fff!important; +background-image:none!important; +} + +.newsletter .acysubbuttons input.button:hover, .newsletter .acysubbuttons .button:hover, +.newsletter .acysubbuttons button.validate:hover, .newsletter .acymailing_mootoolsbutton a:hover, +.newsletter .acymailing_mootoolsbutton a:active { +box-shadow:none!important; +-moz-box-shadow:none!important; +-webkit-box-shadow:none!important; +color: #00a0de!important; +box-shadow: 0 6px 50px rgba(0, 0, 0, 0.05)!important; +} +.acymailing_module a.acymailing_togglemodule { +font-size: 14px; +font-weight: 300; +color: rgba(255, 255, 255, 0.5)!important; +} + + +/*login button */ +#btl .btl-panel > span .btl-dropdown { border:3!important;} + +#btl .btl-panel > span{ + border: 0px!important; + background-color: transparent!important; + color:#444!important; + padding-right:30px; + padding-left:6px; + height:0px!important; + line-height:20px!important; + margin:0px !important; + box-shadow: 0px 0px 0px; + border-radius:0px!important; + display: inline-table!important; + text-transform:none!important; + font-size: 14px; + font-family: 'Roboto Slab', serif; + font-size: 16px; + line-height: 23px; + font-weight: 500 !important; +} +.loginLink { +text-transform:none!important; +color: rgba(0, 0, 0, 0.8)!important; +} + +/*.btl-panel { + background: url(../images/key_login.png) right 40% no-repeat; +}*/ +#btl-panel-login >span { + border: 5px solid #d0d0d0!important; +} +.uk-navbar-item .btlogin{ color: red!important; +} + +#btl .btl-panel > #btl-panel-profile { +color: #040067!important; +font-size: 13px !important; +font-family: Roboto; +} + +.btl-content-block { +-webkit-font-smoothing: antialiased; +background-attachment: scroll; +background-clip: border-box; +background-color: rgb(255, 255, 255); +background-image: none; +background-origin: padding-box; +background-size: auto; +border-bottom-left-radius: 2px; +border-bottom-right-radius: 2px; +border-top-left-radius: 2px; +border-top-right-radius: 2px; +box-shadow: rgba(41, 44, 61, 0.0980392) 2px 15px 50px 0px; +box-sizing: border-box; +color: rgb(79, 82, 96); +display: none; +height: auto; +margin-top: 0px; +padding-bottom: 25px; +padding-left: 25px; +padding-right: 25px; +padding-top: 25px; +position: absolute; +text-align: left; +text-rendering: optimizeLegibility; +} + +#btl-content #btl-content-profile #module-in-profile ul li img, +#btl-content #btl-content-profile #module-in-profile ul li a {padding-right: 5px!important;} + +#btl-content #btl-content-profile #module-in-profile ul li a { +-webkit-font-smoothing: antialiased; +-webkit-text-decoration-skip: objects; +/*background-color: rgba(0, 0, 0, 0);*/ +box-sizing: border-box; +color: rgb(41, 44, 61); +cursor: pointer; +display: block; +font-family: Roboto; +font-size: 14px; +font-weight: 300; +height: auto; +line-height: 20px; +list-style-image: none; +list-style-position: outside; +list-style-type: none; +padding-bottom: 6px; +padding-left: 0px; +padding-right: 0px; +padding-top: 6px; +text-align: left; +text-decoration: none; +text-rendering: optimizeLegibility; +width: auto; +} + +#module-in-profile ul li a:hover { +color: #128DD5 !important; +} + +/*FAQs*/ + +.searchifaq label { +font-family: Roboto, sans-serif; +font-weight:500; +font-size:16px; +color: #040067; +} +.btn, +.buttonifaq{ +margin-top:10px; +background-color: #fff; + color: #5b5b5b; + box-shadow: 0 3px 12px rgba(0,0,0,0.07); + display: inline-block; + border:none; + box-sizing: border-box; + padding: 0 25px; + vertical-align: middle; + font-size: 13px; + line-height: 40px; + text-align: center; + text-decoration: none; + -webkit-transition: .1s ease-in-out; + transition: .1s ease-in-out; + -webkit-transition-property: color,background-color,border-color,box-shadow; + transition-property: color,background-color,border-color,box-shadow; + font-family: Roboto; + font-weight: normal; + text-transform: uppercase; + border-radius: 2px; + background-origin: border-box; + } +.buttonifaq:hover{ background-color: #fff; + color: #00a0de; + box-shadow: 0 6px 50px rgba(0,0,0,0.05); +} +.ifaq h5.ifaq-item-header { +margin-bottom:10px; +margin-top:10px; +} +.ifaq-tpl-clean_blue_arrow .collapse-open .ifaq-item-header { +font-weight:normal; +} +.ifaq .uk-tab>*>a, .ifaq .nav-tabs>li>a { +text-align:left; +color: #2D72D6; +} +.ifaq .nav-tabs>li>a:hover { + border-color:transparent; + color: #D53B23; +} + +.ifaq .nav>li>a:hover, .ifaq .nav>li>a:focus { background:none;} + +.ifaq-tpl-clean_blue_arrow .ifaq-panel { +box-shadow:none; + border-bottom: 1px solid #eee; + +} + +.ifaq-tpl-clean_blue_arrow .ifaq-collapsible > a { +display: block; padding: 1px 0 1px 0px; +background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2213%22%20height%3D%2213%22%20viewBox%3D%220%200%2013%2013%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Crect%20fill%3D%22%236C6D74%22%20width%3D%2213%22%20height%3D%221%22%20x%3D%220%22%20y%3D%226%22%3E%3C%2Frect%3E%0A%20%20%20%20%3Crect%20fill%3D%22%236C6D74%22%20width%3D%221%22%20height%3D%2213%22%20x%3D%226%22%20y%3D%220%22%3E%3C%2Frect%3E%0A%3C%2Fsvg%3E"); +background-repeat: no-repeat; +background-position: 98% 50%; +} + +.ifaq-tpl-clean_blue_arrow .ifaq-collapsible { + text-shadow:none; + background:transparent; + box-shadow:none; + border-bottom: 1px solid #eee; +} +.ifaq-tpl-clean_blue_arrow .collapse-open, .ifaq-tpl-clean_blue_arrow .collapse-open > a { + background: transparent; + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2213%22%20height%3D%2213%22%20viewBox%3D%220%200%2013%2013%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Crect%20fill%3D%22%236C6D74%22%20width%3D%2213%22%20height%3D%221%22%20x%3D%220%22%20y%3D%226%22%3E%3C%2Frect%3E%0A%3C%2Fsvg%3E"); +background-repeat: no-repeat; + background-position: 98% 50%; +} +.ifaq-tpl-clean_blue_arrow .collapse-close:hover { + background:transparent; +} + +.ifaq-tpl-clean_blue_arrow .ifaq-collapsible > a:hover { +background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2213%22%20height%3D%2213%22%20viewBox%3D%220%200%2013%2013%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Crect%20fill%3D%22%236C6D74%22%20width%3D%2213%22%20height%3D%221%22%20x%3D%220%22%20y%3D%226%22%3E%3C%2Frect%3E%0A%20%20%20%20%3Crect%20fill%3D%22%236C6D74%22%20width%3D%221%22%20height%3D%2213%22%20x%3D%226%22%20y%3D%220%22%3E%3C%2Frect%3E%0A%3C%2Fsvg%3E"); + background-repeat: no-repeat; + background-position: 98% 50%; +} + +.ifaq-tpl-clean_blue_arrow .collapse-open > a:hover { +background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2213%22%20height%3D%2213%22%20viewBox%3D%220%200%2013%2013%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Crect%20fill%3D%22%236C6D74%22%20width%3D%2213%22%20height%3D%221%22%20x%3D%220%22%20y%3D%226%22%3E%3C%2Frect%3E%0A%3C%2Fsvg%3E"); +background-repeat: no-repeat; +background-position: 98% 50%; +} + +/*widget accordion */ +.wk-accordion, .wk-text-left {display:block!important;} + + +.faq .wk-accordion-title { + text-transform:none; + font-weight: 400; + font-size:16px; +} + +/* for DISCOVERY PORTAL */ +.discoverHrd {background-color: #f25f30!important;} + +.search_box_bg .uk-input, .search_box_bg .uk-input:focus { +background-color: rgba(255, 255, 255, 1.0)!important; +color: rgba(0, 0, 0, 1.0)!important; +} +.search_box_bg .uk-input::placeholder{ +color: rgba(0, 0, 0, 0.6)!important; +} + +.search_box_bg.uk-text-background{ +background-color: rgba(255, 255, 255, 0.7)!important; +font-size:28px!important; +font-weight: 500; +} +.search_box_bg .uk-grid-divider>:not(.uk-first-column)::before { +border-left-color: rgba(255, 255, 255, 0.6)!important; +} + +/*tags */ +.uk-label-arrow{ + display: inline-block; + height: 21px; + margin: 0 10px 0 0; + padding: 0 7px 0 14px; + white-space: nowrap; + position: relative; + + background-color: #5A9EDA; + + color: white; + font: normal 11px/21px Arial, Tahoma, sans-serif; + text-decoration: none; + + border-top: 1px solid #5A9EDA; + border-bottom: 1px solid #5A9EDA; + border-right: 1px solid #5A9EDA; + border-radius: 1px 3px 3px 1px; +} +.uk-label-arrow:before { + content: ''; + position: absolute; + top: 5px; + left: -6px; + width: 10px; + height: 10px; + + background-color: #5A9EDA; + border-left: 1px solid #5A9EDA; + border-bottom: 1px solid #5A9EDA; + border-radius: 0 0 0 2px; +} +.uk-label-arrow:before { + -webkit-transform: scale(1, 1.5) rotate(45deg); + -moz-transform: scale(1, 1.5) rotate(45deg); + -ms-transform: scale(1, 1.5) rotate(45deg); + transform: scale(1, 1.5) rotate(45deg); +} +.uk-label-arrow:after { + content: ''; + position: absolute; + top: 7px; + left: 1px; + width: 5px; + height: 5px; + background: #FFF; + border-radius: 4px; + border: 1px solid #5A9EDA; +} +.uk-label-arrow a:hover { + color: #FFF; + text-shadow: -1px -1px 0 rgba(153,102,51,0.3); +} +.featurednews.uk-card-default { +background: rgba(255,255,255, 0.6)!important; +color: black; +} + +.omtd_secondary > .uk-section-default, +.omtd_secondary.uk-section-default{ + background:#E7F3F2!important; +} \ No newline at end of file diff --git a/portal-4cli/src/assets/common/ec_logo_inv_small.png b/portal-4cli/src/assets/common/ec_logo_inv_small.png new file mode 100644 index 0000000000000000000000000000000000000000..60f14621a60281349a0fbda91a36181a7abc0d10 GIT binary patch literal 4060 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[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!k.call(a,"constructor")&&!k.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(!l.ownFirst)for(b in a)return k.call(a,b);for(b in a);return void 0===b||k.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(h)return h.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(f=a[b],b=a,a=f),n.isFunction(a)?(c=e.call(arguments,2),d=function(){return a.apply(b||this,c.concat(e.call(arguments)))},d.guid=a.guid=a.guid||n.guid++,d):void 0},now:function(){return+new Date},support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return n.inArray(a,b)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;e>b;b++)if(n.contains(d[b],this))return!0}));for(b=0;e>b;b++)n.find(a,d[b],c);return c=this.pushStack(e>1?n.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}if(f=d.getElementById(e[2]),f&&f.parentNode){if(f.id!==e[2])return A.find(a);this.length=1,this[0]=f}return this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b,c=n(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(n.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?n.inArray(this[0],n(a)):n.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return n.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||(e=n.uniqueSort(e)),D.test(a)&&(e=e.reverse())),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=!0,c||j.disable(),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.addEventListener?(d.removeEventListener("DOMContentLoaded",K),a.removeEventListener("load",K)):(d.detachEvent("onreadystatechange",K),a.detachEvent("onload",K))}function K(){(d.addEventListener||"load"===a.event.type||"complete"===d.readyState)&&(J(),n.ready())}n.ready.promise=function(b){if(!I)if(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll)a.setTimeout(n.ready);else if(d.addEventListener)d.addEventListener("DOMContentLoaded",K),a.addEventListener("load",K);else{d.attachEvent("onreadystatechange",K),a.attachEvent("onload",K);var c=!1;try{c=null==a.frameElement&&d.documentElement}catch(e){}c&&c.doScroll&&!function f(){if(!n.isReady){try{c.doScroll("left")}catch(b){return a.setTimeout(f,50)}J(),n.ready()}}()}return I.promise(b)},n.ready.promise();var L;for(L in n(l))break;l.ownFirst="0"===L,l.inlineBlockNeedsLayout=!1,n(function(){var a,b,c,e;c=d.getElementsByTagName("body")[0],c&&c.style&&(b=d.createElement("div"),e=d.createElement("div"),e.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(e).appendChild(b),"undefined"!=typeof b.style.zoom&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",l.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(e))}),function(){var a=d.createElement("div");l.deleteExpando=!0;try{delete a.test}catch(b){l.deleteExpando=!1}a=null}();var M=function(a){var b=n.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b},N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(O,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}n.data(a,b,c)}else c=void 0; +}return c}function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function R(a,b,d,e){if(M(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),"object"!=typeof b&&"function"!=typeof b||(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[n.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[n.camelCase(b)])):f=g,f}}function S(a,b,c){if(M(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.expando]:n.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){n.isArray(b)?b=b.concat(n.map(b,n.camelCase)):b in d?b=[b]:(b=n.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!Q(d):!n.isEmptyObject(d))return}(c||(delete g[h].data,Q(g[h])))&&(f?n.cleanData([a],!0):l.deleteExpando||g!=g.window?delete g[h]:g[h]=void 0)}}}n.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?n.cache[a[n.expando]]:a[n.expando],!!a&&!Q(a)},data:function(a,b,c){return R(a,b,c)},removeData:function(a,b){return S(a,b)},_data:function(a,b,c){return R(a,b,c,!0)},_removeData:function(a,b){return S(a,b,!0)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=n.data(f),1===f.nodeType&&!n._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));n._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){n.data(this,a)}):arguments.length>1?this.each(function(){n.data(this,a,b)}):f?P(f,a,n.data(f,a)):void 0},removeData:function(a){return this.each(function(){n.removeData(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=n._data(a,b),c&&(!d||n.isArray(c)?d=n._data(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return n._data(a,c)||n._data(a,c,{empty:n.Callbacks("once memory").add(function(){n._removeData(a,b+"queue"),n._removeData(a,c)})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},Z=/^(?:checkbox|radio)$/i,$=/<([\w:-]+)/,_=/^$|\/(?:java|ecma)script/i,aa=/^\s+/,ba="abbr|article|aside|audio|bdi|canvas|data|datalist|details|dialog|figcaption|figure|footer|header|hgroup|main|mark|meter|nav|output|picture|progress|section|summary|template|time|video";function ca(a){var b=ba.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}!function(){var a=d.createElement("div"),b=d.createDocumentFragment(),c=d.createElement("input");a.innerHTML="
    a",l.leadingWhitespace=3===a.firstChild.nodeType,l.tbody=!a.getElementsByTagName("tbody").length,l.htmlSerialize=!!a.getElementsByTagName("link").length,l.html5Clone="<:nav>"!==d.createElement("nav").cloneNode(!0).outerHTML,c.type="checkbox",c.checked=!0,b.appendChild(c),l.appendChecked=c.checked,a.innerHTML="",l.noCloneChecked=!!a.cloneNode(!0).lastChild.defaultValue,b.appendChild(a),c=d.createElement("input"),c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),a.appendChild(c),l.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!!a.addEventListener,a[n.expando]=1,l.attributes=!a.getAttribute(n.expando)}();var da={option:[1,""],legend:[1,"
    ","
    "],area:[1,"",""],param:[1,"",""],thead:[1,"","
    "],tr:[2,"","
    "],col:[2,"","
    "],td:[3,"","
    "],_default:l.htmlSerialize?[0,"",""]:[1,"X
    ","
    "]};da.optgroup=da.option,da.tbody=da.tfoot=da.colgroup=da.caption=da.thead,da.th=da.td;function ea(a,b){var c,d,e=0,f="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,ea(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function fa(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}var ga=/<|&#?\w+;/,ha=/r;r++)if(g=a[r],g||0===g)if("object"===n.type(g))n.merge(q,g.nodeType?[g]:g);else if(ga.test(g)){i=i||p.appendChild(b.createElement("div")),j=($.exec(g)||["",""])[1].toLowerCase(),m=da[j]||da._default,i.innerHTML=m[1]+n.htmlPrefilter(g)+m[2],f=m[0];while(f--)i=i.lastChild;if(!l.leadingWhitespace&&aa.test(g)&&q.push(b.createTextNode(aa.exec(g)[0])),!l.tbody){g="table"!==j||ha.test(g)?""!==m[1]||ha.test(g)?0:i:i.firstChild,f=g&&g.childNodes.length;while(f--)n.nodeName(k=g.childNodes[f],"tbody")&&!k.childNodes.length&&g.removeChild(k)}n.merge(q,i.childNodes),i.textContent="";while(i.firstChild)i.removeChild(i.firstChild);i=p.lastChild}else q.push(b.createTextNode(g));i&&p.removeChild(i),l.appendChecked||n.grep(ea(q,"input"),ia),r=0;while(g=q[r++])if(d&&n.inArray(g,d)>-1)e&&e.push(g);else if(h=n.contains(g.ownerDocument,g),i=ea(p.appendChild(g),"script"),h&&fa(i),c){f=0;while(g=i[f++])_.test(g.type||"")&&c.push(g)}return i=null,p}!function(){var b,c,e=d.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(l[b]=c in a)||(e.setAttribute(c,"t"),l[b]=e.attributes[c].expando===!1);e=null}();var ka=/^(?:input|select|textarea)$/i,la=/^key/,ma=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,na=/^(?:focusinfocus|focusoutblur)$/,oa=/^([^.]*)(?:\.(.+)|)/;function pa(){return!0}function qa(){return!1}function ra(){try{return d.activeElement}catch(a){}}function sa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)sa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=qa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=n.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return"undefined"==typeof n||a&&n.event.triggered===a.type?void 0:n.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(G)||[""],h=b.length;while(h--)f=oa.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=n.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=n.event.special[o]||{},l=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},i),(m=g[o])||(m=g[o]=[],m.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,l):m.push(l),n.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n.hasData(a)&&n._data(a);if(r&&(k=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=oa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;while(f--)g=m[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(k)&&(delete r.handle,n._removeData(a,"events"))}},trigger:function(b,c,e,f){var g,h,i,j,l,m,o,p=[e||d],q=k.call(b,"type")?b.type:b,r=k.call(b,"namespace")?b.namespace.split("."):[];if(i=m=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!na.test(q+n.event.triggered)&&(q.indexOf(".")>-1&&(r=q.split("."),q=r.shift(),r.sort()),h=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=r.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:n.makeArray(c,[b]),l=n.event.special[q]||{},f||!l.trigger||l.trigger.apply(e,c)!==!1)){if(!f&&!l.noBubble&&!n.isWindow(e)){for(j=l.delegateType||q,na.test(j+q)||(i=i.parentNode);i;i=i.parentNode)p.push(i),m=i;m===(e.ownerDocument||d)&&p.push(m.defaultView||m.parentWindow||a)}o=0;while((i=p[o++])&&!b.isPropagationStopped())b.type=o>1?j:l.bindType||q,g=(n._data(i,"events")||{})[b.type]&&n._data(i,"handle"),g&&g.apply(i,c),g=h&&i[h],g&&g.apply&&M(i)&&(b.result=g.apply(i,c),b.result===!1&&b.preventDefault());if(b.type=q,!f&&!b.isDefaultPrevented()&&(!l._default||l._default.apply(p.pop(),c)===!1)&&M(e)&&h&&e[q]&&!n.isWindow(e)){m=e[h],m&&(e[h]=null),n.event.triggered=q;try{e[q]()}catch(s){}n.event.triggered=void 0,m&&(e[h]=m)}return b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(n._data(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())a.rnamespace&&!a.rnamespace.test(g.namespace)||(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]","i"),va=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,wa=/\s*$/g,Aa=ca(d),Ba=Aa.appendChild(d.createElement("div"));function Ca(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function Da(a){return a.type=(null!==n.find.attr(a,"type"))+"/"+a.type,a}function Ea(a){var b=ya.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Fa(a,b){if(1===b.nodeType&&n.hasData(a)){var c,d,e,f=n._data(a),g=n._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)n.event.add(b,c,h[c][d])}g.data&&(g.data=n.extend({},g.data))}}function Ga(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!l.noCloneEvent&&b[n.expando]){e=n._data(b);for(d in e.events)n.removeEvent(b,d,e.handle);b.removeAttribute(n.expando)}"script"===c&&b.text!==a.text?(Da(b).text=a.text,Ea(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),l.html5Clone&&a.innerHTML&&!n.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&Z.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}}function Ha(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,m=0,o=a.length,p=o-1,q=b[0],r=n.isFunction(q);if(r||o>1&&"string"==typeof q&&!l.checkClone&&xa.test(q))return a.each(function(e){var f=a.eq(e);r&&(b[0]=q.call(this,e,f.html())),Ha(f,b,c,d)});if(o&&(k=ja(b,a[0].ownerDocument,!1,a,d),e=k.firstChild,1===k.childNodes.length&&(k=e),e||d)){for(i=n.map(ea(k,"script"),Da),h=i.length;o>m;m++)g=k,m!==p&&(g=n.clone(g,!0,!0),h&&n.merge(i,ea(g,"script"))),c.call(a[m],g,m);if(h)for(j=i[i.length-1].ownerDocument,n.map(i,Ea),m=0;h>m;m++)g=i[m],_.test(g.type||"")&&!n._data(g,"globalEval")&&n.contains(j,g)&&(g.src?n._evalUrl&&n._evalUrl(g.src):n.globalEval((g.text||g.textContent||g.innerHTML||"").replace(za,"")));k=e=null}return a}function Ia(a,b,c){for(var d,e=b?n.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||n.cleanData(ea(d)),d.parentNode&&(c&&n.contains(d.ownerDocument,d)&&fa(ea(d,"script")),d.parentNode.removeChild(d));return a}n.extend({htmlPrefilter:function(a){return a.replace(va,"<$1>")},clone:function(a,b,c){var d,e,f,g,h,i=n.contains(a.ownerDocument,a);if(l.html5Clone||n.isXMLDoc(a)||!ua.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(Ba.innerHTML=a.outerHTML,Ba.removeChild(f=Ba.firstChild)),!(l.noCloneEvent&&l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(d=ea(f),h=ea(a),g=0;null!=(e=h[g]);++g)d[g]&&Ga(e,d[g]);if(b)if(c)for(h=h||ea(a),d=d||ea(f),g=0;null!=(e=h[g]);g++)Fa(e,d[g]);else Fa(a,f);return d=ea(f,"script"),d.length>0&&fa(d,!i&&ea(a,"script")),d=h=e=null,f},cleanData:function(a,b){for(var d,e,f,g,h=0,i=n.expando,j=n.cache,k=l.attributes,m=n.event.special;null!=(d=a[h]);h++)if((b||M(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)m[e]?n.event.remove(d,e):n.removeEvent(d,e,g.handle);j[f]&&(delete j[f],k||"undefined"==typeof d.removeAttribute?d[i]=void 0:d.removeAttribute(i),c.push(f))}}}),n.fn.extend({domManip:Ha,detach:function(a){return Ia(this,a,!0)},remove:function(a){return Ia(this,a)},text:function(a){return Y(this,function(a){return void 0===a?n.text(this):this.empty().append((this[0]&&this[0].ownerDocument||d).createTextNode(a))},null,a,arguments.length)},append:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.appendChild(a)}})},prepend:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&n.cleanData(ea(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&n.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return Y(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(ta,""):void 0;if("string"==typeof a&&!wa.test(a)&&(l.htmlSerialize||!ua.test(a))&&(l.leadingWhitespace||!aa.test(a))&&!da[($.exec(a)||["",""])[1].toLowerCase()]){a=n.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(ea(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ha(this,arguments,function(b){var c=this.parentNode;n.inArray(this,a)<0&&(n.cleanData(ea(this)),c&&c.replaceChild(b,this))},a)}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=0,e=[],f=n(a),h=f.length-1;h>=d;d++)c=d===h?this:this.clone(!0),n(f[d])[b](c),g.apply(e,c.get());return this.pushStack(e)}});var Ja,Ka={HTML:"block",BODY:"block"};function La(a,b){var c=n(b.createElement(a)).appendTo(b.body),d=n.css(c[0],"display");return c.detach(),d}function Ma(a){var b=d,c=Ka[a];return c||(c=La(a,b),"none"!==c&&c||(Ja=(Ja||n("',t,e)};s.onerror=function(){return a(640,320)},s.onload=function(){120===s.width&&90===s.height?r?a(640,320):(r=!0,s.src="//img.youtube.com/vi/"+o+"/0.jpg"):a(s.width,s.height)},s.src="//img.youtube.com/vi/"+o+"/maxresdefault.jpg",t.stopImmediatePropagation()}}}},"lightbox"),t.mixin({events:{showitem:function(t){var e,i=this,o=this.getItem();if(e=o.source.match(/(\/\/.*?)vimeo\.[a-z]+\/([0-9]+).*?/)){var s=e[2],r=function(t,e){return i.setItem(o,'',t,e)};n({type:"GET",url:"http://vimeo.com/api/oembed.json?url="+encodeURI(o.source),jsonp:"callback",dataType:"jsonp"}).then(function(t){return r(t.width,t.height)}),t.stopImmediatePropagation()}}}},"lightbox")}}function qt(t){if(!qt.installed){var e=t.util,i=e.$,n=e.each,o=e.pointerEnter,s=e.pointerLeave,r=e.Transition,a={};t.component("notification",{functional:!0,args:["message","status"],defaults:{message:"",status:"",timeout:5e3,group:null,pos:"top-center",onClose:null,clsClose:"uk-notification-close"},created:function(){a[this.pos]||(a[this.pos]=i('
    ').appendTo(t.container)),this.$mount(i('
    \n \n
    '+this.message+"
    \n
    ").appendTo(a[this.pos].show())[0])},ready:function(){var t=this,e=parseInt(this.$el.css("margin-bottom"),10);r.start(this.$el.css({opacity:0,marginTop:-1*this.$el.outerHeight(),marginBottom:0}),{opacity:1,marginTop:0,marginBottom:e}).then(function(){t.timeout&&(t.timer=setTimeout(t.close,t.timeout),t.$el.on(o,function(){return clearTimeout(t.timer)}).on(s,function(){return t.timer=setTimeout(t.close,t.timeout)}))})},events:{click:function(t){i(t.target).closest('a[href="#"]').length&&t.preventDefault(),this.close()}},methods:{close:function(t){var e=this,i=function(){e.onClose&&e.onClose(),e.$el.trigger("close",[e]).remove(),a[e.pos].children().length||a[e.pos].hide()};this.timer&&clearTimeout(this.timer),t?i():r.start(this.$el,{opacity:0,marginTop:-1*this.$el.outerHeight(),marginBottom:0}).then(i)}}}),t.notification.closeAll=function(e,i){n(t.instances,function(t,n){"notification"!==n.$options.name||e&&e!==n.group||n.close(i)})}}}function Yt(t){function e(i){return t.getComponent(i,"sortable")||i.parentNode&&e(i.parentNode)}function i(){var t=setTimeout(function(){return r.trigger("click")},0),e=function(i){i.preventDefault(),i.stopPropagation(),clearTimeout(t),u(r,"click",e,!0)};c(r,"click",e,!0)}if(!Yt.installed){var n=t.mixin,o=t.util,s=o.$,r=o.docElement,a=o.extend,l=o.getDimensions,h=o.isWithin,c=o.on,u=o.off,d=o.offsetTop,f=o.pointerDown,p=o.pointerMove,g=o.pointerUp,m=o.promise,v=o.win;t.component("sortable",{mixins:[n.class],props:{group:String,animation:Number,threshold:Number,clsItem:String,clsPlaceholder:String,clsDrag:String,clsDragState:String,clsBase:String,clsNoDrag:String,clsEmpty:String,clsCustom:String,handle:String},defaults:{group:!1,animation:150,threshold:5,clsItem:"uk-sortable-item",clsPlaceholder:"uk-sortable-placeholder",clsDrag:"uk-sortable-drag",clsDragState:"uk-drag",clsBase:"uk-sortable",clsNoDrag:"uk-sortable-nodrag",clsEmpty:"uk-sortable-empty",clsCustom:"",handle:!1},init:function(){var t=this;["init","start","move","end"].forEach(function(e){var i=t[e];t[e]=function(e){e=e.originalEvent||e,t.scrollY=window.scrollY;var n=e.touches&&e.touches[0]||e,o=n.pageX,s=n.pageY;t.pos={x:o,y:s},i(e)}})},events:(w={},w[f]="init",w),update:{write:function(){var t=this;if(this.clsEmpty&&this.$el.toggleClass(this.clsEmpty,!this.$el.children().length),this.drag){this.drag.offset({top:this.pos.y+this.origin.top,left:this.pos.x+this.origin.left});var e=d(this.drag),i=e+this.drag[0].offsetHeight;e>0&&ewindow.innerHeight+this.scrollY&&setTimeout(function(){return v.scrollTop(t.scrollY+5)},5)}}},methods:{init:function(t){var e=s(t.target),i=this.$el.children().filter(function(e,i){return h(t.target,i)});!i.length||e.is(":input")||this.handle&&!h(e,this.handle)||t.button&&0!==t.button||h(e,"."+this.clsNoDrag)||(t.preventDefault(),t.stopPropagation(),this.touched=[this],this.placeholder=i,this.origin=a({target:e,index:this.placeholder.index()},this.pos),r.on(p,this.move),r.on(g,this.end),v.on("scroll",this.scroll),this.threshold||this.start(t))},start:function(e){this.drag=s(this.placeholder[0].outerHTML.replace(/^
  • $/i,"div>")).attr("uk-no-boot","").addClass(this.clsDrag+" "+this.clsCustom).css({boxSizing:"border-box",width:this.placeholder.outerWidth(),height:this.placeholder.outerHeight()}).css(this.placeholder.css(["paddingLeft","paddingRight","paddingTop","paddingBottom"])).appendTo(t.container),this.drag.children().first().height(this.placeholder.children().height());var i=l(this.placeholder),n=i.left,o=i.top;a(this.origin,{left:n-this.pos.x,top:o-this.pos.y}),this.placeholder.addClass(this.clsPlaceholder),this.$el.children().addClass(this.clsItem),r.addClass(this.clsDragState),this.$el.trigger("start",[this,this.placeholder,this.drag]),this.move(e)},move:function(t){if(!this.drag)return void((Math.abs(this.pos.x-this.origin.x)>this.threshold||Math.abs(this.pos.y-this.origin.y)>this.threshold)&&this.start(t));this.$emit();var i="mousemove"===t.type?t.target:document.elementFromPoint(this.pos.x-document.body.scrollLeft,this.pos.y-document.body.scrollTop),n=e(i),o=e(this.placeholder[0]),r=n!==o;if(n&&!h(i,this.placeholder)&&(!r||n.group&&n.group===o.group)){if(i=n.$el.is(i.parentNode)&&s(i)||n.$el.children().has(i),r)o.remove(this.placeholder);else if(!i.length)return;n.insert(this.placeholder,i),~this.touched.indexOf(n)||this.touched.push(n)}},scroll:function(){var t=window.scrollY;t!==this.scrollY&&(this.pos.y+=t-this.scrollY,this.scrollY=t,this.$emit())},end:function(t){if(r.off(p,this.move),r.off(g,this.end),v.off("scroll",this.scroll),!this.drag)return void("mouseup"!==t.type&&h(t.target,"a[href]")&&(location.href=s(t.target).closest("a[href]").attr("href")));i();var n=e(this.placeholder[0]);this===n?this.origin.index!==this.placeholder.index()&&this.$el.trigger("change",[this,this.placeholder,"moved"]):(n.$el.trigger("change",[n,this.placeholder,"added"]),this.$el.trigger("change",[this,this.placeholder,"removed"])),this.$el.trigger("stop",[this]),this.drag.remove(),this.drag=null,this.touched.forEach(function(t){return t.$el.children().removeClass(t.clsPlaceholder+" "+t.clsItem)}),r.removeClass(this.clsDragState)},insert:function(t,e){var i=this;this.$el.children().addClass(this.clsItem);var n=function(){e.length?!i.$el.has(t).length||t.prevAll().filter(e).length?t.insertBefore(e):t.insertAfter(e):i.$el.append(t)};this.animation?this.animate(n):n()},remove:function(t){this.$el.has(t).length&&(this.animation?this.animate(function(){return t.detach()}):t.detach())},animate:function(t){var e=this,i=[],n=this.$el.children().toArray().map(function(t){return t=s(t),i.push(a({position:"absolute",pointerEvents:"none",width:t.outerWidth(),height:t.outerHeight()},t.position())),t}),o={position:"",width:"",height:"",pointerEvents:"",top:"",left:""};t(),n.forEach(function(t){return t.stop()}),this.$el.children().css(o),this.$updateSync("update",!0),this.$el.css("min-height",this.$el.height());var r=n.map(function(t){return t.position()});m.all(n.map(function(t,n){return t.css(i[n]).animate(r[n],e.animation).promise()})).then(function(){e.$el.css("min-height","").children().css(o),e.$updateSync("update",!0)})}}});var w}}function Rt(t){if(!Rt.installed){var e,i=t.util,n=t.mixin,o=i.$,s=i.doc,r=i.fastdom,a=i.flipPosition,l=i.isTouch,h=i.isWithin,c=i.pointerDown,u=i.pointerEnter,d=i.pointerLeave;t.component("tooltip",{attrs:!0,mixins:[n.togglable,n.position],props:{delay:Number,container:Boolean,title:String},defaults:{pos:"top",title:"",delay:0,animation:["uk-animation-scale-up"],duration:100,cls:"uk-active",clsPos:"uk-tooltip",container:!0},computed:{container:function(){return o(!0===this.$props.container&&t.container||this.$props.container||t.container)}},connected:function(){var t=this;r.mutate(function(){return t.$el.removeAttr("title").attr("aria-expanded",!1)})},disconnected:function(){this.hide()},methods:{show:function(){var t=this;e!==this&&(e&&e.hide(),e=this,s.on("click."+this.$options.name,function(e){h(e.target,t.$el)||t.hide()}),clearTimeout(this.showTimer),this.tooltip=o('").appendTo(this.container),this.$el.attr("aria-expanded",!0),this.positionAt(this.tooltip,this.$el),this.origin="y"===this.getAxis()?a(this.dir)+"-"+this.align:this.align+"-"+a(this.dir),this.showTimer=setTimeout(function(){t.toggleElement(t.tooltip,!0),t.hideTimer=setInterval(function(){t.$el.is(":visible")||t.hide()},150)},this.delay))},hide:function(){this.$el.is("input")&&this.$el[0]===document.activeElement||(e=e!==this&&e||!1,clearTimeout(this.showTimer),clearInterval(this.hideTimer),this.$el.attr("aria-expanded",!1),this.toggleElement(this.tooltip,!1),this.tooltip&&this.tooltip.remove(),this.tooltip=!1,s.off("click."+this.$options.name))}},events:(f={blur:"hide"},f["focus "+u+" "+c]=function(t){t.type===c&&l(t)||this.show()},f[d]=function(t){l(t)||this.hide()},f)});var f}}function Ut(t){function e(t,e){return e.match(new RegExp("^"+t.replace(/\//g,"\\/").replace(/\*\*/g,"(\\/[^\\/]+)*").replace(/\*/g,"[^\\/]+").replace(/((?!\\))\?/g,"$1.")+"$","i"))}function i(t,e){for(var i=[],n=0;ni[t]?n.ratio(e,t,i[t]):e}),e},cover:function(e,i){var n=this;return e=this.fit(e,i),t.each(e,function(t){return e=e[t]0||navigator.pointerEnabled&&navigator.maxTouchPoints>0,de=ue?le?"touchstart":"pointerdown":"mousedown",fe=ue?le?"touchmove":"pointermove":"mousemove",pe=ue?le?"touchend":"pointerup":"mouseup",ge=ue&&he?"pointerenter":"mouseenter",me=ue&&he?"pointerleave":"mouseleave",ve=ue&&le?"touchcancel":"pointercancel",we=L("transition","transition-end"),ye=L("animation","animation-start"),be=L("animation","animation-end"),$e={reads:[],writes:[],measure:function(t){return this.reads.push(t),F(this),t},mutate:function(t){return this.writes.push(t),F(this),t},clear:function(t){return q(this.reads,t)||q(this.writes,t)}};Y.prototype={positions:[],position:null,init:function(){var t=this;this.positions=[],this.position=null;var e=!1;this.handler=function(i){e||setTimeout(function(){var n=Date.now(),o=t.positions.length;o&&n-t.positions[o-1].time>100&&t.positions.splice(0,o),t.positions.push({time:n,x:i.pageX,y:i.pageY}),t.positions.length>5&&t.positions.shift(),e=!1},5),e=!0},Gt.on("mousemove",this.handler)},cancel:function(){this.handler&&Gt.off("mousemove",this.handler)},movesTo:function(t){if(this.positions.length<2)return!1;var e=X(t),i=this.positions[this.positions.length-1],n=this.positions[0];if(e.left<=i.x&&i.x<=e.right&&e.top<=i.y&&i.y<=e.bottom)return!1;var o=[[{x:e.left,y:e.top},{x:e.right,y:e.bottom}],[{x:e.right,y:e.top},{x:e.left,y:e.bottom}]];return e.right<=i.x||(e.left>=i.x?(o[0].reverse(),o[1].reverse()):e.bottom<=i.y?o[0].reverse():e.top>=i.y&&o[1].reverse()),!!o.reduce(function(t,e){return t+(R(n,e[0])R(i,e[1]))},0)}};var xe={};xe.args=xe.created=xe.events=xe.init=xe.ready=xe.connected=xe.disconnected=xe.destroy=function(e,i){return e=e&&!t.isArray(e)?[e]:e,i?e?e.concat(i):t.isArray(i)?i:[i]:e},xe.update=function(e,i){return xe.args(e,t.isFunction(i)?{write:i}:i)},xe.props=function(e,i){return t.isArray(i)&&(i=i.reduce(function(t,e){return t[e]=String,t},{})),xe.methods(e,i)},xe.computed=xe.defaults=xe.methods=function(e,i){return i?e?t.extend(!0,{},e,i):i:e};var ke,Ce,Te,_e,Se,Ee=function(t,e){return T(e)?t:e},Ae={x:["width","left","right"],y:["height","top","bottom"]},Oe={};i(function(){var e,i,o,s=0,r=0;"MSGesture"in window&&(_e=new MSGesture,_e.target=document.body),n(document,"click",function(){return Se=!0},!0);var a=function(t){var e=t.velocityX>1?"Right":t.velocityX<-1?"Left":t.velocityY>1?"Down":t.velocityY<-1?"Up":null;e&&void 0!==Oe.el&&(Oe.el.trigger("swipe"),Oe.el.trigger("swipe"+e))};n(document,"MSGestureEnd",a),n(document,"gestureend",a),n(document,de,function(t){o=t.touches?t.touches[0]:t,e=Date.now(),i=e-(Oe.last||e),Oe.el=Vt("tagName"in o.target?o.target:o.target.parentNode),ke&&clearTimeout(ke),Oe.x1=o.pageX,Oe.y1=o.pageY,i>0&&i<=250&&(Oe.isDoubleTap=!0),Oe.last=e,!_e||"pointerdown"!==t.type&&"touchstart"!==t.type||_e.addPointer(t.pointerId),Se=t.button>0}),n(document,fe,function(t){o=t.touches?t.touches[0]:t,Oe.x2=o.pageX,Oe.y2=o.pageY,s+=Math.abs(Oe.x1-Oe.x2),r+=Math.abs(Oe.y1-Oe.y2)}),n(document,pe,function(){Oe.x2&&Math.abs(Oe.x1-Oe.x2)>30||Oe.y2&&Math.abs(Oe.y1-Oe.y2)>30?Te=setTimeout(function(){void 0!==Oe.el&&(Oe.el.trigger("swipe"),Oe.el.trigger("swipe"+et(Oe.x1,Oe.x2,Oe.y1,Oe.y2))),Oe={}},0):"last"in Oe&&(isNaN(s)||s<30&&r<30?Ce=setTimeout(function(){var e=t.Event("tap");e.cancelTouch=it,void 0!==Oe.el&&Oe.el.trigger(e),Oe.isDoubleTap?(void 0!==Oe.el&&Oe.el.trigger("doubleTap"),Oe={}):ke=setTimeout(function(){ke=null,void 0!==Oe.el&&(Oe.el.trigger("singleTap"),Se||Oe.el.trigger("click")),Oe={}},300)}):Oe={},s=r=0)}),n(document,ve,it),n(window,"scroll",it)});var De=!1;n(document,"touchstart",function(){return De=!0},!0),n(document,"click",function(){De=!1}),n(document,"touchcancel",function(){return De=!1},!0);var Ie=Object.freeze({win:Xt,doc:Gt,docElement:Qt,isRtl:Jt,isReady:e,ready:i,on:n,off:o,transition:s,Transition:Zt,animate:r,Animation:Kt,isJQuery:a,isWithin:l,attrFilter:h,removeClass:c,createEvent:u,isInView:d,getIndex:f,isVoidElement:p,Dimensions:ee,query:g,Observer:re,requestAnimationFrame:ae,hasPromise:ce,hasTouch:ue,pointerDown:de,pointerMove:fe,pointerUp:pe,pointerEnter:ge,pointerLeave:me,pointerCancel:ve,transitionend:we,animationstart:ye,animationend:be,getStyle:M,getCssVar:j,fastdom:$e,$:Vt,bind:m,hasOwn:v,promise:w,classify:y,hyphenate:b,camelize:$,isString:k,isNumber:C,isUndefined:T,isContextSelector:_,getContextSelectors:S,toJQuery:E,toNode:A,toBoolean:O,toNumber:D,toList:I,toMedia:N,coerce:B,toMs:P,swap:H,ajax:t.ajax,contains:t.contains,each:t.each,Event:t.Event,extend:t.extend,map:t.map,merge:t.merge,isArray:t.isArray,isNumeric:t.isNumeric,isFunction:t.isFunction,isPlainObject:t.isPlainObject,MouseTracker:Y,mergeOptions:U,position:V,getDimensions:X,offsetTop:G,flipPosition:tt,isTouch:nt}),Ne=function(t){this._init(t)};Ne.util=Ie,Ne.data="__uikit__",Ne.prefix="uk-",Ne.options={},Ne.instances={},Ne.elements=[],function(t){var e=t.data;t.use=function(t){if(!t.installed)return t.call(null,this),t.installed=!0,this},t.mixin=function(e,i){i=(k(i)?t.components[i]:i)||this,e=U({},e),e.mixins=i.options.mixins,delete i.options.mixins,i.options=U(e,i.options)},t.extend=function(t){t=t||{};var e=this,i=t.name||e.options.name,n=ot(i||"UIkitComponent");return n.prototype=Object.create(e.prototype),n.prototype.constructor=n,n.options=U(e.options,t),n.super=e,n.extend=e.extend,n},t.update=function(i,n,o){if(void 0===o&&(o=!1),i=u(i||"update"),!n)return void rt(t.instances,i);if(n=A(n),o)do{rt(n[e],i),n=n.parentNode}while(n);else st(n,function(t){return rt(t[e],i)})};var i;Object.defineProperty(t,"container",{get:function(){return i||document.body},set:function(t){i=t}})}(Ne),function(t){t.prototype._callHook=function(t){var e=this,i=this.$options[t];i&&i.forEach(function(t){return t.call(e)})},t.prototype._callReady=function(){this._isReady||(this._isReady=!0,this._callHook("ready"),this._callUpdate())},t.prototype._callConnected=function(){var e=this;this._connected||(~t.elements.indexOf(this.$options.el)||t.elements.push(this.$options.el),t.instances[this._uid]=this,this._initEvents(),this._callHook("connected"),this._connected=!0,this._initObserver(),this._isReady||i(function(){return e._callReady()}),this._callUpdate())},t.prototype._callDisconnected=function(){if(this._connected){this._observer&&(this._observer.disconnect(),this._observer=null);var e=t.elements.indexOf(this.$options.el);~e&&t.elements.splice(e,1),delete t.instances[this._uid],this._initEvents(!0),this._callHook("disconnected"),this._connected=!1}},t.prototype._callUpdate=function(t){var e=this;t=u(t||"update"),"update"===t.type&&(this._computeds={});var i=this.$options.update;i&&i.forEach(function(i,n){if("update"===t.type||i.events&&~i.events.indexOf(t.type)){if(t.sync)return i.read&&i.read.call(e,t),void(i.write&&i.write.call(e,t));i.read&&!~$e.reads.indexOf(e._frames.reads[n])&&(e._frames.reads[n]=$e.measure(function(){i.read.call(e,t),delete e._frames.reads[n]})),i.write&&!~$e.writes.indexOf(e._frames.writes[n])&&(e._frames.writes[n]=$e.mutate(function(){i.write.call(e,t),delete e._frames.writes[n]}))}})}}(Ne),function(e){var i=0;e.prototype.props={},e.prototype._init=function(t){t=t||{},t=this.$options=U(this.constructor.options,t,this),this.$el=null,this.$name=e.prefix+b(this.$options.name),this.$props={},this._uid=i++,this._initData(),this._initMethods(),this._initComputeds(),this._callHook("created"),this._frames={reads:{},writes:{}},t.el&&this.$mount(t.el)},e.prototype._initData=function(){var e=this,i=t.extend(!0,{},this.$options.defaults),n=this.$options.data||{},o=this.$options.args||[],s=this.$options.props||{};if(i){o.length&&t.isArray(n)&&(n=n.slice(0,o.length).reduce(function(e,i,n){return t.isPlainObject(i)?t.extend(e,i):e[o[n]]=i,e},{}));for(var r in i)e.$props[r]=e[r]=v(n,r)?B(s[r],n[r],e.$options.el):i[r]}},e.prototype._initMethods=function(){var t=this,e=this.$options.methods;if(e)for(var i in e)t[i]=m(e[i],t)},e.prototype._initComputeds=function(){var t=this,e=this.$options.computed;if(this._computeds={},e)for(var i in e)at(t,i,e[i])},e.prototype._initProps=function(e){var i=this;this._computeds={},t.extend(this.$props,e||this._getProps());var n=[this.$options.computed,this.$options.methods];for(var o in i.$props)ct(n,o)&&(i[o]=i.$props[o])},e.prototype._initEvents=function(t){var e=this,i=this.$options.events;i&&i.forEach(function(i){if(v(i,"handler"))lt(e,t,i);else for(var n in i)lt(e,t,i[n],n)})},e.prototype._initObserver=function(){var e=this;if(!this._observer&&this.$options.props&&this.$options.attrs&&re){var i=t.isArray(this.$options.attrs)?this.$options.attrs:Object.keys(this.$options.props).map(function(t){return b(t)});this._observer=new re(function(){var t=e._getProps();i.some(function(i){return!ut(t[i],e.$props[i])})&&e.$reset(t)}),this._observer.observe(this.$options.el,{attributes:!0,attributeFilter:i.concat([this.$name,"data-"+this.$name])})}},e.prototype._getProps=function(){var t,e,i={},n=this.$el[0],o=this.$options.args||[],s=this.$options.props||{},r=n.getAttribute(this.$name)||n.getAttribute("data-"+this.$name);if(!s)return i;for(t in s)if(e=b(t),n.hasAttribute(e)){var a=B(s[t],n.getAttribute(e),n);if("target"===e&&(!a||0===a.lastIndexOf("_",0)))continue;i[t]=a}if(!r)return i;if("{"===r[0])try{r=JSON.parse(r)}catch(t){console.warn("Invalid JSON."),r={}}else if(o.length&&!~r.indexOf(":")){l={},l[o[0]]=r,r=l;var l}else{var h={};r.split(";").forEach(function(t){var e=t.split(/:(.+)/),i=e[0],n=e[1];i&&n&&(h[i.trim()]=n.trim())}),r=h}for(t in r||{})e=$(t),void 0!==s[e]&&(i[e]=B(s[e],r[t],n));return i}}(Ne),function(t){var e=t.data;t.prototype.$mount=function(t){var i=this.$options.name;if(t[e]||(t[e]={}),t[e][i])return void console.warn('Component "'+i+'" is already mounted on element: ',t);t[e][i]=this,this.$el=Vt(t),this._initProps(),this._callHook("init"),document.documentElement.contains(t)&&this._callConnected()},t.prototype.$emit=function(t){this._callUpdate(t)},t.prototype.$emitSync=function(t){this._callUpdate(u(t||"update",!0,!1,{sync:!0}))},t.prototype.$update=function(e,i){t.update(e,this.$el,i)},t.prototype.$updateSync=function(t,e){this.$update(u(t||"update",!0,!1,{sync:!0}),e)},t.prototype.$reset=function(t){this._callDisconnected(),this._initProps(t),this._callConnected()},t.prototype.$destroy=function(t){void 0===t&&(t=!1);var i=this.$options.el;i&&this._callDisconnected(),this._callHook("destroy"),i&&i[e]&&(delete i[e][this.$options.name],Object.keys(i[e]).length||delete i[e],t&&this.$el.remove())}}(Ne),function(e){var i=e.data;e.components={},e.component=function(i,n){var o=$(i);return t.isPlainObject(n)?(n.name=o,n=e.extend(n)):n.options.name=o,e.components[o]=n,e[o]=function(i,n){for(var s=arguments.length,r=Array(s);s--;)r[s]=arguments[s];return t.isPlainObject(i)?new e.components[o]({data:i}):e.components[o].options.functional?new e.components[o]({data:[].concat(r)}):Vt(i).toArray().map(function(t){return e.getComponent(t,o)||new e.components[o]({el:t,data:n||{}})})[0]},e._initialized&&!n.options.functional&&$e.measure(function(){return e[o]("[uk-"+i+"],[data-uk-"+i+"]")}),e.components[o]},e.getComponents=function(t){return t&&(t=a(t)?t[0]:t)&&t[i]||{}},e.getComponent=function(t,i){return e.getComponents(t)[i]},e.connect=function(t){var n;if(t[i])for(n in t[i])t[i][n]._callConnected();for(var o=0;o',We='',ze='',qe='',Ye='',Re='',Ue='',Ve='',Xe='',Ge='',Qe='',Je='',Ze='',Ke='',ti='',ei={},ii=new DOMParser;return Ne.version="3.0.0-beta.22",function(t){t.mixin.class=He,t.mixin.modal=je,t.mixin.position=Le,t.mixin.togglable=Me}(Ne),function(t){var e,i,o,s=null,r=0;Xt.on("load",t.update).on("resize",function(e){o||(ae(function(){t.update(e),o=!1}),o=!0)}).on("scroll",function(n){null===s&&(s=0),s!==window.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 b+xTk$@ZU+LBx}MC00000NkvXXu0mjf9Z&b} literal 0 HcmV?d00001 diff --git a/portal-4cli/src/assets/datasource.png b/portal-4cli/src/assets/datasource.png new file mode 100644 index 0000000000000000000000000000000000000000..54417be8fcc6457e4c8659264bf803ddc035152d GIT binary patch literal 4186 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 literal 0 HcmV?d00001 diff --git a/portal-4cli/src/assets/discover-custom.css b/portal-4cli/src/assets/discover-custom.css new file mode 100644 index 00000000..20cad168 --- /dev/null +++ b/portal-4cli/src/assets/discover-custom.css @@ -0,0 +1,511 @@ + +.tm-toolbar .uk-subnav-line .custom-discover-li { + color:#05007A !important; + background:#fff; + display: block; +} +.tm-toolbar .uk-subnav-line .custom-discover-li a{ + color:#05007A !important; +} + +.custom-discover-toolbar ul.uk-subnav.uk-subnav-line{ + background-color: #f25f30 !important; + } + + .custom-discover-toolbar .inner { + background-color: #f25f30 !important; + } + + .custom-discover-toolbar{ + border-top-color:#f25f30 !important; + } +.custom-footer{ + position:relative; + bottom:0; + left:0; +} +.custom-external { + background: rgba(0, 0, 0, 0) url("/assets/external-link.svg") no-repeat scroll left 10%; + min-height: 15px; + background-size: 15px 15px; + padding-left: 16px; +} +h2 .custom-external { + min-height: 20px; + background-size: 20px 20px; + padding-left: 21px; + background: rgba(0, 0, 0, 0) url("/assets/external-link.svg") no-repeat scroll left center; + +} + +.pseudo-external{ + padding-left: 16px; +} + +.custom-navbar-toggle-icon, .custom-user-mini-panel{ + color:#444 !important +} +.custom-user-mini-panel a{ + color:rgb(36, 91, 204); +} +.custom-main-content{ + min-height: 550px; +} + +.custom-autocomplete .uk-nav-autocomplete > li > a:hover { + background: #00a8e6 none repeat scroll 0 0; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.05) inset; + color: #FFF; + outline: medium none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.1); +} + +.custom-autocomplete .uk-nav-navbar > li > a { + color: #444; +} +.custom-description-list-horizontal{ line-height:200%} +.uk-alert-default { + background: #fff none repeat scroll 0 0; + border: 1px solid #ddd; + border-radius: 4px; + color: #444; + height: 30px; + max-width: 100%; + padding: 4px 6px; + +} +.custom-hidden-dropdown-menu {position:static !important;} +.searchFilterBoxValues {overflow:auto; max-height:200px; } +.selected-filters-box {margin:5px; background-color:#F8F8F8; } +.search-form {margin:5px; } +.clickable { cursor:pointer; } +.search-filters .uk-accordion-title{ + font-size: 14px; + line-height: 18px; +} +.search-results { + min-height: 1100px; +} +.searchPaging { + min-height: 46px; +} +.helper-left-right { + margin-top: 75px; + max-width: 20%; +} + +@media (min-width: 960px) { + .float-children-right-at-medium > * { + float: right; + } +} + +@media (max-width: 959px) { + .margin-small-top-at-small { + margin-top: 10px !important; + } +} + +.other-results { + min-height: 300px; +} +.OPEN { + background: rgba(0, 0, 0, 0) url("/assets/unlock.svg") no-repeat scroll right top; + padding-right: 25px; + min-height: 20px; + background-size: 20px 20px; + font-weight: 400; + text-transform: none; +} + + +.EMBARGO, .CLOSED, .RESTRICTED { + background: rgba(0, 0, 0, 0) url("/assets/lock.svg") no-repeat scroll right top; + padding-right: 25px; + min-height: 20px; + background-size: 20px 20px; + font-weight: 400; + text-transform: none; +} + +.sc39 { + background: rgba(0, 0, 0, 0) url("/assets/sc39.png") no-repeat scroll right center; + padding-right: 24px; +} + +.projectIcon { + display: inline-table; +} + +.dateFilter .mydp{ + margin-top:5px; +} + + +/*.tooltip { + max-width: none; + background: rgba(100, 100, 100, 1); +}*/ +.tooltip-custom-font-size { + font-size: 120%; +} + +.custom-select-mini{ + max-width:170px !important; +} +.custom-icon { + line-height: unset; +} +/*.custom-tab-content-large{ + min-height: 800px; +} + */ +.custom-tab-content { + min-height: 250px; +} + +.custom-dataTable-content { + min-height: 600px; +} + +.custom-html-table-height { + height: 500px; +} + + + + +.filterItem span { +display: inline-flex; +} +.filterItem .filterName { +max-width: 71%; + +} +.browseFilters .filterItem .filterName { +max-width: 68%; +} + +.filterItem .filterNumber { +width: 20%; +} +.filterItem span { + +white-space: nowrap; +} +.browseFilters .filterItem span div { + /*min-width: 45px;*/ +} +.filterItem span div { +overflow: hidden; +text-overflow: ellipsis; +/*min-width: 81px;*/ +} + +.browseFilters{ +overflow-y: auto; +overflow-x: hidden; +max-height:265px; +} + + + +.custom-offcanvas-close { + position: relative; + right: 0; + top: 0; +} +.uk-link{ + color: #292C3D !important; +} +.uk-breadcrumb > :last-child > * { + color:#cbcbcb !important; +} +.uk-breadcrumb .uk-active a{ + color: #767779 !important; +} + +.publicationTitleIcon { + background: url("/assets/publication.png") no-repeat; +} +.datasetTitleIcon { + background: url("/assets/dataset.png") no-repeat; +} +.projectTitleIcon { + background: url("/assets/project.png") no-repeat; +} +.organizationTitleIcon { + background: url("/assets/organization.png") no-repeat; +} +.datasourceTitleIcon { + background: url("/assets/datasource.png") no-repeat; +} +.entityTitleIcon{ + background-repeat: :no-repeat; + content: ''; + display: inline-block; + height: 36px; + width: 42px; + vertical-align: middle; +} +.entityIcon{ + height: 15px; + width: 20px; + +} +/*.uk-tab{ + border-bottom: 1px #cbcbcb solid; +}*/ +.label-underCuration{ + background: #fef5d2 !important; +} + +.label-blue { + background:#d4f3ff; + color:#00a0de +} +.label-green { + background:#d1f6e8; + color:#01a566 +} +.label-yellow { + background:#fef5d2; + color:#cca607 +} +.label-red { + background:#fef0ef; + color:#f54f43 +} +.label-grey{ + background: #f8f8f8; + color: #666; +} +.label-orange{ + background: #fef5d2; +color: #f0506e; + +} + +.label-OPEN, .label-open { +background: #F25F2F; +color: #fff; } +.label-CLOSED, .label-EMBARGO, .label-RESTRICTED, .label-closed { +background: #0F0F0F; +color: #fff } + +.label-publication{ + background: #4687E6; + color: #fff} + +.label-dataset +{ background: #1e906c; +color: #fff} + +.label-project +{ background: #d0307f; +color: #fff} + +.label-dataprovider +{ background: #00a0de; +color: #fff} + +.label-organization +{ background: #fbcd0d; +color: #414141} + + + +.uk-tab { + display: -ms-flexbox; + display: -webkit-flex; + display: flex; + -ms-flex-wrap: wrap; + -webkit-flex-wrap: wrap; + flex-wrap: wrap; + margin-left: -20px; + padding: 0; + list-style: none; + position: relative; +} +.uk-tab::before { + content: ""; + position: absolute; + bottom: 0; + left: 20px; + right: 0; + border-bottom: 1px solid #e5e5e5; +} +.uk-tab-left::before { + border-bottom: none !important; +} +.mainPageSearchForm{ + background-image: url("./home2.jpeg"); background-color: rgb(255, 255, 255); box-sizing: border-box; min-height: calc(100vh - 412.767px); +} + +.searchForm, .generalSearchForm{ + background-image: url('./search_general_3.jpg'); box-sizing: border-box; height: 250px; +} +.publicationsSearchForm{ + background-image: url('./search_pubs_1.jpg'); box-sizing: border-box; height: 250px; +} +.projectsSearchForm{ + background-image: url('./projects_search.jpg'); box-sizing: border-box; height: 250px; +} +.organizationsSearchForm{ + background-image: url('./search_organizations.jpg'); box-sizing: border-box; height: 250px; +} +.datasetsSearchForm{ + background-image: url('./search_data.jpg'); box-sizing: border-box; height: 250px; +} +.softwareSearchForm{ + background-image: url('./search_data.jpg'); box-sizing: border-box; height: 250px; +} +.datasourcesSearchForm, .compatibleDatasourcesSearchForm, + .compatibleDatasourcesTableSearchForm { + background-image: url('./providers_search.jpg'); box-sizing: border-box; height: 250px; +} + .journalsSearchForm, .journalsTableSearchForm{ + background-image: url('./search_journals.jpg'); box-sizing: border-box; height: 250px; +} +.entityRegistriesSearchForm, .entityRegistriesTableSearchForm { + background-image: url('./search_registries.jpg'); box-sizing: border-box; height: 250px; +} + +.divider-table tbody td, .uk-table th { + border-bottom: 1px solid #E5E5E5; + } + + #feedback { + float: left; + position: fixed; + top: calc(50% - 47px); + right: 0; + z-index: 10000; + display: block; + + } + + #feedback a { + background: #666; + border-radius: 5px 0 0 5px; + box-shadow:none; + border: none!important; + display: block; + padding: 20px 12px; + transition: all .2s ease-in-out; + opacity:0.5; + + } + + #feedback a:hover { + padding-right: 20px; + } + +.descriptionText{ + Padding-left: 25px !important; + Border-left: 10px solid #fafafa; + display: inline-block; + position: relative; + top: calc(-0.1 * 1em); + vertical-align: middle; + margin-right: 10px; + border-left: 8px solid #e5e5e5; + margin-top: 8px; + +} + + +/* +li span { + display: inline-flex; +} + +.item span { + width: 100px; + margin-left: 1em; + white-space: nowrap; +} + +.item span div { + overflow: hidden; + text-overflow: ellipsis; +}*/ + +.custom-offcanvas-bar{ + background: grey !important; + width:100% !important; + +} +.custom-offcanvas-bar .filtersModal{ + color:grey !important; + +} +.list-horizontal{ + display: flex; + } +.list-horizontal span{ + margin-right:5px; + padding-left: 0px !important; + +} +.list-horizontal-line span { + margin-right: 5px; + border-right: 1px solid #f1f1f1; + padding-right: 5px; + +} + +.list-horizontal-line > span:last-child { + border-right:none; +} +body { + font-family: Raleway, Arial, sans-serif !important; +} +html { + color: #444 !important; +} + +h2, h4{ + font-weight: 400; + text-transform: none; +} +.linkdropdown{ + min-width:250px; +} +.uk-button-action{ + background-color: #D6352B; + color: #fff +} +.uk-pagination>.uk-active>* { + color: #fff !important; + background-color: #296EE9 !important; + +} +.uk-pagination>*>* { + color:#666 !important; +} +h2, .uk-h2{ + font-size:28px !important; +} +.app-box { + border: #e5e5e5 solid 1px; +} + +.uk-subnav-line li:hover .home-icon svg #home{ + fill: #05007A !important; + +} + svg #home{ + fill: white !important; + +} +.tm-toolbar .uk-subnav-line li a:hover, .tm-toolbar .uk-subnav-line li:hover a{ + display: block; + color: #d4d4d4 !important; +} + +.tm-toolbar .uk-subnav-line li:hover {display: block;} /* remove the others*/ + +.helper-grid>*{ + padding-left: 25px !important; +} diff --git a/portal-4cli/src/assets/external-link.svg b/portal-4cli/src/assets/external-link.svg new file mode 100644 index 00000000..c291d7e2 --- /dev/null +++ b/portal-4cli/src/assets/external-link.svg @@ -0,0 +1 @@ + diff --git a/portal-4cli/src/assets/favicon.ico b/portal-4cli/src/assets/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..151eca1baaa93b204ded4693423dac971f11d08d GIT binary patch literal 32988 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 NnkCRIfj^D}{tq}S<$C}C literal 0 HcmV?d00001 diff --git a/portal-4cli/src/assets/formImage.jpg b/portal-4cli/src/assets/formImage.jpg new file mode 100644 index 0000000000000000000000000000000000000000..16ca30fa4a94e9384c4bc39e33d685a6ca7ff5e6 GIT binary patch literal 112058 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�*?^?nsD=1UVzCo_QIjcM0*aS`xbpY4PzhL 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

      CFR^a21L65)iC%!| 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 PP8yq!aOds&pC|tZ404Cn literal 0 HcmV?d00001 diff --git a/portal-4cli/src/assets/home.jpeg b/portal-4cli/src/assets/home.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..655e923c9d088f3fa1b1f0c660a32ed0c97dba6e GIT binary patch literal 373503 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 z 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 z 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

      A`+h4DRJ&VMk6d))Rtj!fJ7=vN^~M?2 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�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 RyyPnBUrm0YqlM5k|Jfsy_e}r* literal 0 HcmV?d00001 diff --git a/portal-4cli/src/assets/home2.jpeg b/portal-4cli/src/assets/home2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..628aff7da36aec6e390034731685d683b98ae584 GIT binary patch literal 267070 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%0DGrmh0ys#%uBU58=*70u`?tCIipi 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

      !xQNuk8X{{Xun(pSXZ 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�pmEM(Py%i@;ru&Q-rsm|Acw2x+`SqpnV$OXS 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 z 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�tTdUPoX|T$j;HX(JivhvioAiODijo^JjCmjA_D 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 literal 0 HcmV?d00001 diff --git a/portal-4cli/src/assets/jquery/jquery.min.js b/portal-4cli/src/assets/jquery/jquery.min.js new file mode 100644 index 00000000..e8364758 --- /dev/null +++ b/portal-4cli/src/assets/jquery/jquery.min.js @@ -0,0 +1,5 @@ +/*! jQuery v1.12.4 | (c) jQuery Foundation | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="1.12.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return e.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!k.call(a,"constructor")&&!k.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(!l.ownFirst)for(b in a)return k.call(a,b);for(b in a);return void 0===b||k.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(h)return h.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(f=a[b],b=a,a=f),n.isFunction(a)?(c=e.call(arguments,2),d=function(){return a.apply(b||this,c.concat(e.call(arguments)))},d.guid=a.guid=a.guid||n.guid++,d):void 0},now:function(){return+new Date},support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return n.inArray(a,b)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;e>b;b++)if(n.contains(d[b],this))return!0}));for(b=0;e>b;b++)n.find(a,d[b],c);return c=this.pushStack(e>1?n.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}if(f=d.getElementById(e[2]),f&&f.parentNode){if(f.id!==e[2])return A.find(a);this.length=1,this[0]=f}return this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b,c=n(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(n.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?n.inArray(this[0],n(a)):n.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return n.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||(e=n.uniqueSort(e)),D.test(a)&&(e=e.reverse())),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=!0,c||j.disable(),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.addEventListener?(d.removeEventListener("DOMContentLoaded",K),a.removeEventListener("load",K)):(d.detachEvent("onreadystatechange",K),a.detachEvent("onload",K))}function K(){(d.addEventListener||"load"===a.event.type||"complete"===d.readyState)&&(J(),n.ready())}n.ready.promise=function(b){if(!I)if(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll)a.setTimeout(n.ready);else if(d.addEventListener)d.addEventListener("DOMContentLoaded",K),a.addEventListener("load",K);else{d.attachEvent("onreadystatechange",K),a.attachEvent("onload",K);var c=!1;try{c=null==a.frameElement&&d.documentElement}catch(e){}c&&c.doScroll&&!function f(){if(!n.isReady){try{c.doScroll("left")}catch(b){return a.setTimeout(f,50)}J(),n.ready()}}()}return I.promise(b)},n.ready.promise();var L;for(L in n(l))break;l.ownFirst="0"===L,l.inlineBlockNeedsLayout=!1,n(function(){var a,b,c,e;c=d.getElementsByTagName("body")[0],c&&c.style&&(b=d.createElement("div"),e=d.createElement("div"),e.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(e).appendChild(b),"undefined"!=typeof b.style.zoom&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",l.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(e))}),function(){var a=d.createElement("div");l.deleteExpando=!0;try{delete a.test}catch(b){l.deleteExpando=!1}a=null}();var M=function(a){var b=n.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b},N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(O,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}n.data(a,b,c)}else c=void 0; +}return c}function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function R(a,b,d,e){if(M(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),"object"!=typeof b&&"function"!=typeof b||(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[n.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[n.camelCase(b)])):f=g,f}}function S(a,b,c){if(M(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.expando]:n.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){n.isArray(b)?b=b.concat(n.map(b,n.camelCase)):b in d?b=[b]:(b=n.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!Q(d):!n.isEmptyObject(d))return}(c||(delete g[h].data,Q(g[h])))&&(f?n.cleanData([a],!0):l.deleteExpando||g!=g.window?delete g[h]:g[h]=void 0)}}}n.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?n.cache[a[n.expando]]:a[n.expando],!!a&&!Q(a)},data:function(a,b,c){return R(a,b,c)},removeData:function(a,b){return S(a,b)},_data:function(a,b,c){return R(a,b,c,!0)},_removeData:function(a,b){return S(a,b,!0)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=n.data(f),1===f.nodeType&&!n._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));n._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){n.data(this,a)}):arguments.length>1?this.each(function(){n.data(this,a,b)}):f?P(f,a,n.data(f,a)):void 0},removeData:function(a){return this.each(function(){n.removeData(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=n._data(a,b),c&&(!d||n.isArray(c)?d=n._data(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return n._data(a,c)||n._data(a,c,{empty:n.Callbacks("once memory").add(function(){n._removeData(a,b+"queue"),n._removeData(a,c)})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},Z=/^(?:checkbox|radio)$/i,$=/<([\w:-]+)/,_=/^$|\/(?:java|ecma)script/i,aa=/^\s+/,ba="abbr|article|aside|audio|bdi|canvas|data|datalist|details|dialog|figcaption|figure|footer|header|hgroup|main|mark|meter|nav|output|picture|progress|section|summary|template|time|video";function ca(a){var b=ba.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}!function(){var a=d.createElement("div"),b=d.createDocumentFragment(),c=d.createElement("input");a.innerHTML="

      AINY`MAAs?o-mtHPUI?)NaM`Hm!1=G;V3R(L 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 Cs!&M) literal 0 HcmV?d00001 diff --git a/portal-4cli/src/assets/globe_tech.jpg b/portal-4cli/src/assets/globe_tech.jpg new file mode 100644 index 0000000000000000000000000000000000000000..46f3c645520e02cb9da009cba598660d91ffecd2 GIT binary patch literal 270491 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

  • a",l.leadingWhitespace=3===a.firstChild.nodeType,l.tbody=!a.getElementsByTagName("tbody").length,l.htmlSerialize=!!a.getElementsByTagName("link").length,l.html5Clone="<:nav>"!==d.createElement("nav").cloneNode(!0).outerHTML,c.type="checkbox",c.checked=!0,b.appendChild(c),l.appendChecked=c.checked,a.innerHTML="",l.noCloneChecked=!!a.cloneNode(!0).lastChild.defaultValue,b.appendChild(a),c=d.createElement("input"),c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),a.appendChild(c),l.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!!a.addEventListener,a[n.expando]=1,l.attributes=!a.getAttribute(n.expando)}();var da={option:[1,""],legend:[1,"
    ","
    "],area:[1,"",""],param:[1,"",""],thead:[1,"","
    "],tr:[2,"","
    "],col:[2,"","
    "],td:[3,"","
    "],_default:l.htmlSerialize?[0,"",""]:[1,"X
    ","
    "]};da.optgroup=da.option,da.tbody=da.tfoot=da.colgroup=da.caption=da.thead,da.th=da.td;function ea(a,b){var c,d,e=0,f="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,ea(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function fa(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}var ga=/<|&#?\w+;/,ha=/r;r++)if(g=a[r],g||0===g)if("object"===n.type(g))n.merge(q,g.nodeType?[g]:g);else if(ga.test(g)){i=i||p.appendChild(b.createElement("div")),j=($.exec(g)||["",""])[1].toLowerCase(),m=da[j]||da._default,i.innerHTML=m[1]+n.htmlPrefilter(g)+m[2],f=m[0];while(f--)i=i.lastChild;if(!l.leadingWhitespace&&aa.test(g)&&q.push(b.createTextNode(aa.exec(g)[0])),!l.tbody){g="table"!==j||ha.test(g)?""!==m[1]||ha.test(g)?0:i:i.firstChild,f=g&&g.childNodes.length;while(f--)n.nodeName(k=g.childNodes[f],"tbody")&&!k.childNodes.length&&g.removeChild(k)}n.merge(q,i.childNodes),i.textContent="";while(i.firstChild)i.removeChild(i.firstChild);i=p.lastChild}else q.push(b.createTextNode(g));i&&p.removeChild(i),l.appendChecked||n.grep(ea(q,"input"),ia),r=0;while(g=q[r++])if(d&&n.inArray(g,d)>-1)e&&e.push(g);else if(h=n.contains(g.ownerDocument,g),i=ea(p.appendChild(g),"script"),h&&fa(i),c){f=0;while(g=i[f++])_.test(g.type||"")&&c.push(g)}return i=null,p}!function(){var b,c,e=d.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(l[b]=c in a)||(e.setAttribute(c,"t"),l[b]=e.attributes[c].expando===!1);e=null}();var ka=/^(?:input|select|textarea)$/i,la=/^key/,ma=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,na=/^(?:focusinfocus|focusoutblur)$/,oa=/^([^.]*)(?:\.(.+)|)/;function pa(){return!0}function qa(){return!1}function ra(){try{return d.activeElement}catch(a){}}function sa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)sa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=qa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=n.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return"undefined"==typeof n||a&&n.event.triggered===a.type?void 0:n.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(G)||[""],h=b.length;while(h--)f=oa.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=n.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=n.event.special[o]||{},l=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},i),(m=g[o])||(m=g[o]=[],m.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,l):m.push(l),n.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n.hasData(a)&&n._data(a);if(r&&(k=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=oa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;while(f--)g=m[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(k)&&(delete r.handle,n._removeData(a,"events"))}},trigger:function(b,c,e,f){var g,h,i,j,l,m,o,p=[e||d],q=k.call(b,"type")?b.type:b,r=k.call(b,"namespace")?b.namespace.split("."):[];if(i=m=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!na.test(q+n.event.triggered)&&(q.indexOf(".")>-1&&(r=q.split("."),q=r.shift(),r.sort()),h=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=r.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:n.makeArray(c,[b]),l=n.event.special[q]||{},f||!l.trigger||l.trigger.apply(e,c)!==!1)){if(!f&&!l.noBubble&&!n.isWindow(e)){for(j=l.delegateType||q,na.test(j+q)||(i=i.parentNode);i;i=i.parentNode)p.push(i),m=i;m===(e.ownerDocument||d)&&p.push(m.defaultView||m.parentWindow||a)}o=0;while((i=p[o++])&&!b.isPropagationStopped())b.type=o>1?j:l.bindType||q,g=(n._data(i,"events")||{})[b.type]&&n._data(i,"handle"),g&&g.apply(i,c),g=h&&i[h],g&&g.apply&&M(i)&&(b.result=g.apply(i,c),b.result===!1&&b.preventDefault());if(b.type=q,!f&&!b.isDefaultPrevented()&&(!l._default||l._default.apply(p.pop(),c)===!1)&&M(e)&&h&&e[q]&&!n.isWindow(e)){m=e[h],m&&(e[h]=null),n.event.triggered=q;try{e[q]()}catch(s){}n.event.triggered=void 0,m&&(e[h]=m)}return b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(n._data(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())a.rnamespace&&!a.rnamespace.test(g.namespace)||(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]","i"),va=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,wa=/\s*$/g,Aa=ca(d),Ba=Aa.appendChild(d.createElement("div"));function Ca(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function Da(a){return a.type=(null!==n.find.attr(a,"type"))+"/"+a.type,a}function Ea(a){var b=ya.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Fa(a,b){if(1===b.nodeType&&n.hasData(a)){var c,d,e,f=n._data(a),g=n._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)n.event.add(b,c,h[c][d])}g.data&&(g.data=n.extend({},g.data))}}function Ga(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!l.noCloneEvent&&b[n.expando]){e=n._data(b);for(d in e.events)n.removeEvent(b,d,e.handle);b.removeAttribute(n.expando)}"script"===c&&b.text!==a.text?(Da(b).text=a.text,Ea(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),l.html5Clone&&a.innerHTML&&!n.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&Z.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}}function Ha(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,m=0,o=a.length,p=o-1,q=b[0],r=n.isFunction(q);if(r||o>1&&"string"==typeof q&&!l.checkClone&&xa.test(q))return a.each(function(e){var f=a.eq(e);r&&(b[0]=q.call(this,e,f.html())),Ha(f,b,c,d)});if(o&&(k=ja(b,a[0].ownerDocument,!1,a,d),e=k.firstChild,1===k.childNodes.length&&(k=e),e||d)){for(i=n.map(ea(k,"script"),Da),h=i.length;o>m;m++)g=k,m!==p&&(g=n.clone(g,!0,!0),h&&n.merge(i,ea(g,"script"))),c.call(a[m],g,m);if(h)for(j=i[i.length-1].ownerDocument,n.map(i,Ea),m=0;h>m;m++)g=i[m],_.test(g.type||"")&&!n._data(g,"globalEval")&&n.contains(j,g)&&(g.src?n._evalUrl&&n._evalUrl(g.src):n.globalEval((g.text||g.textContent||g.innerHTML||"").replace(za,"")));k=e=null}return a}function Ia(a,b,c){for(var d,e=b?n.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||n.cleanData(ea(d)),d.parentNode&&(c&&n.contains(d.ownerDocument,d)&&fa(ea(d,"script")),d.parentNode.removeChild(d));return a}n.extend({htmlPrefilter:function(a){return a.replace(va,"<$1>")},clone:function(a,b,c){var d,e,f,g,h,i=n.contains(a.ownerDocument,a);if(l.html5Clone||n.isXMLDoc(a)||!ua.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(Ba.innerHTML=a.outerHTML,Ba.removeChild(f=Ba.firstChild)),!(l.noCloneEvent&&l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(d=ea(f),h=ea(a),g=0;null!=(e=h[g]);++g)d[g]&&Ga(e,d[g]);if(b)if(c)for(h=h||ea(a),d=d||ea(f),g=0;null!=(e=h[g]);g++)Fa(e,d[g]);else Fa(a,f);return d=ea(f,"script"),d.length>0&&fa(d,!i&&ea(a,"script")),d=h=e=null,f},cleanData:function(a,b){for(var d,e,f,g,h=0,i=n.expando,j=n.cache,k=l.attributes,m=n.event.special;null!=(d=a[h]);h++)if((b||M(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)m[e]?n.event.remove(d,e):n.removeEvent(d,e,g.handle);j[f]&&(delete j[f],k||"undefined"==typeof d.removeAttribute?d[i]=void 0:d.removeAttribute(i),c.push(f))}}}),n.fn.extend({domManip:Ha,detach:function(a){return Ia(this,a,!0)},remove:function(a){return Ia(this,a)},text:function(a){return Y(this,function(a){return void 0===a?n.text(this):this.empty().append((this[0]&&this[0].ownerDocument||d).createTextNode(a))},null,a,arguments.length)},append:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.appendChild(a)}})},prepend:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&n.cleanData(ea(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&n.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return Y(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(ta,""):void 0;if("string"==typeof a&&!wa.test(a)&&(l.htmlSerialize||!ua.test(a))&&(l.leadingWhitespace||!aa.test(a))&&!da[($.exec(a)||["",""])[1].toLowerCase()]){a=n.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(ea(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ha(this,arguments,function(b){var c=this.parentNode;n.inArray(this,a)<0&&(n.cleanData(ea(this)),c&&c.replaceChild(b,this))},a)}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=0,e=[],f=n(a),h=f.length-1;h>=d;d++)c=d===h?this:this.clone(!0),n(f[d])[b](c),g.apply(e,c.get());return this.pushStack(e)}});var Ja,Ka={HTML:"block",BODY:"block"};function La(a,b){var c=n(b.createElement(a)).appendTo(b.body),d=n.css(c[0],"display");return c.detach(),d}function Ma(a){var b=d,c=Ka[a];return c||(c=La(a,b),"none"!==c&&c||(Ja=(Ja||n("