From af8991b97a11ba5a40afe947e51f3eae373bc35d Mon Sep 17 00:00:00 2001 From: Ioannis Kalyvas Date: Mon, 28 May 2018 12:50:42 +0300 Subject: [PATCH] no message --- .../eu/eudat/data/dao/DatabaseAccess.java | 5 + .../context/DatabaseContext.java | 2 +- .../service/DatabaseService.java | 2 +- .../data/dao/entities/ContentDaoImpl.java | 2 +- .../eudat/data/dao/entities/DMPDaoImpl.java | 2 +- .../data/dao/entities/DMPProfileDaoImpl.java | 2 +- .../dao/entities/DataRepositoryDaoImpl.java | 2 +- .../data/dao/entities/DatasetDaoImpl.java | 4 +- .../entities/DatasetExternalDatasetDao.java | 13 + .../DatasetExternalDatasetDaoImpl.java | 55 + .../dao/entities/DatasetProfileDaoImpl.java | 2 +- .../data/dao/entities/DatasetServiceDao.java | 13 + .../dao/entities/DatasetServiceDaoImpl.java | 55 + .../dao/entities/ExternalDatasetDaoImpl.java | 2 +- .../data/dao/entities/InvitationDaoImpl.java | 2 +- .../dao/entities/OrganisationDaoImpl.java | 2 +- .../data/dao/entities/ProjectDaoImpl.java | 5 +- .../data/dao/entities/RegistryDaoImpl.java | 2 +- .../data/dao/entities/ResearcherDaoImpl.java | 2 +- .../data/dao/entities/ServiceDaoImpl.java | 2 +- .../data/dao/entities/UserDmpDaoImpl.java | 2 +- .../data/dao/entities/UserInfoDaoImpl.java | 2 +- .../data/dao/entities/UserRoleDaoImpl.java | 2 +- .../entities/security/CredentialDaoImpl.java | 2 +- .../entities/security/UserTokenDaoImpl.java | 2 +- .../eudat/data/entities/DataRepository.java | 16 +- .../java/eu/eudat/data/entities/Dataset.java | 70 +- .../data/entities/DatasetDataRepository.java | 90 + .../data/entities/DatasetExternalDataset.java | 47 +- .../eudat/data/entities/DatasetRegistry.java | 9 + .../eudat/data/entities/DatasetService.java | 45 +- .../eudat/data/entities/ExternalDataset.java | 12 +- .../java/eu/eudat/data/entities/Service.java | 17 +- .../java/eu/eudat/data/entities/UserInfo.java | 2 +- .../eudat/data/query/PaginationService.java | 4 +- .../eu/eudat/data/query/definition/Query.java | 26 +- .../query/definition/TableCriteriaQuery.java | 2 +- .../data/query/definition/TableQuery.java | 4 +- .../definition/helpers/ColumnOrderings.java | 4 +- .../dmp/DataManagementPlanTableRequest.java | 2 +- ...DataManagementPlanProfileTableRequest.java | 2 +- .../eudat/data/entities/DataRepository_.java | 2 +- .../entities/DatasetExternalDataset_.java | 5 +- .../eudat/data/entities/DatasetRegistry_.java | 1 + .../eudat/data/entities/DatasetService_.java | 5 +- .../eu/eudat/data/entities/Dataset_.java | 6 +- .../eudat/data/entities/ExternalDataset_.java | 2 +- .../eu/eudat/data/entities/Service_.java | 2 +- .../eu/eudat/queryable/QueryableList.java | 5 +- .../QueryableHibernateList.java | 10 +- .../NestedQuerySinglePredicate.java | 2 +- .../predicates/OrderByPredicate.java | 2 +- .../predicates/QueryablePredicate.java | 2 +- .../{ => jpa}/predicates/SelectPredicate.java | 2 +- .../{ => jpa}/predicates/SinglePredicate.java | 2 +- .../eu/eudat/queryable/QueryableList.class | Bin 4557 -> 4477 bytes .../QueryableHibernateList.class | Bin 24953 -> 0 bytes .../NestedQuerySinglePredicate.class | Bin 575 -> 0 bytes .../predicates/OrderByPredicate.class | Bin 476 -> 0 bytes .../predicates/QueryablePredicate.class | Bin 210 -> 0 bytes .../predicates/SelectPredicate.class | Bin 309 -> 0 bytes .../predicates/SinglePredicate.class | Bin 482 -> 0 bytes .../model/models/PrincipalBuilder.java | 7 + .../models/RecentActivityDataBuilder.java | 11 - .../eudat/controllers/CommonController.java | 20 +- .../main/java/eu/eudat/controllers/DMPs.java | 6 +- .../eudat/controllers/DataRepositories.java | 6 +- .../eudat/controllers/ExternalDatasets.java | 6 +- .../eu/eudat/controllers/Organisations.java | 6 +- .../java/eu/eudat/controllers/Registries.java | 5 +- .../eu/eudat/controllers/Researchers.java | 5 +- .../java/eu/eudat/controllers/Services.java | 6 +- .../eu/eudat/managers/CommonsManager.java | 25 + .../eu/eudat/managers/DashBoardManager.java | 20 +- .../managers/DataManagementPlanManager.java | 24 +- .../eu/eudat/managers/DatasetManager.java | 83 +- .../eu/eudat/managers/ProjectManager.java | 3 +- .../eu/eudat/managers/ResearcherManager.java | 2 +- .../dashboard/recent/RecentActivity.java | 28 +- .../dashboard/recent/RecentActivityData.java | 36 - .../eudat/models/dataset/DataRepository.java | 10 + .../java/eu/eudat/models/dataset/Dataset.java | 24 +- .../datasetwizard/DatasetWizardModel.java | 69 +- .../ExternalDatasetListingModel.java | 20 +- .../ExternalSourcesConfiguration.java | 72 + .../listingmodels/DatasetListingModel.java | 4 +- .../loginprovider/LoginProviderUser.java | 9 + .../java/eu/eudat/models/project/Project.java | 12 + .../eu/eudat/models/security/Principal.java | 9 + .../java/eu/eudat/proxy/config/UrlConfig.java | 19 + .../eudat/proxy/fetching/RemoteFetcher.java | 37 +- .../facebook/FacebookTokenValidator.java | 6 +- .../google/GoogleTokenValidator.java | 1 + .../linkedin/LinkedInTokenValidator.java | 1 + .../twitter/TwitterTokenValidator.java | 1 + .../operations/AuthenticationServiceImpl.java | 19 +- .../operations/DatabaseRepository.java | 4 + .../operations/DatabaseRepositoryImpl.java | 23 + .../ExternalDatasetType.java | 31 + .../eudat/utilities/builders/XmlBuilder.java | 6 + .../validators/ProjectModelValidator.java | 5 +- .../web/src/main/resources/ExternalUrls.xml | 74 +- .../src/main/resources/application.properties | 4 +- .../src/main/resources/messages.properties | 3 +- .../src/main/resources/messages_el.properties | 3 +- dmp-frontend/.angular-cli.json | 7 +- dmp-frontend/.editorconfig | 13 + dmp-frontend/.gitignore | 3 +- dmp-frontend/.vscode/launch.json | 35 - dmp-frontend/.vscode/settings.json | 3 - dmp-frontend/README.md | 5 +- dmp-frontend/e2e/app.e2e-spec.ts | 2 +- dmp-frontend/karma.conf.js | 33 + dmp-frontend/package-lock.json | 3445 +++++++++++--- dmp-frontend/package.json | 66 +- dmp-frontend/protractor.conf.js | 28 + .../add-researchers.component.ts | 39 - dmp-frontend/src/app/app-routing.module.ts | 6 +- dmp-frontend/src/app/app.module.ts | 52 +- .../available-profiles.component.ts | 54 - .../dataset-admin.routes.ts | 4 +- .../dataset-wizard.component.html | 235 +- .../dataset-wizard.component.scss | 36 +- .../dataset-wizard.component.ts | 150 +- .../src/app/datasets/dataset.module.ts | 85 +- .../src/app/datasets/dataset.routes.ts | 12 +- .../editor/dataset-editor.component.html | 40 +- .../editor/dataset-editor.component.ts | 21 +- .../listing/dataset-listing.component.ts | 3 +- .../dmp-profile-editor.component.ts | 261 +- .../app/dmp-profiles/dmp-profile.routes.ts | 8 +- dmp-frontend/src/app/dmps/dmps.module.ts | 141 +- dmp-frontend/src/app/dmps/dmps.routes.ts | 22 +- .../app/dmps/editor/dmp-editor.component.html | 228 +- .../app/dmps/editor/dmp-editor.component.scss | 14 +- .../app/dmps/editor/dmp-editor.component.ts | 38 +- .../dynamic-dmp-field-resolver.component.ts | 3 +- .../dynamic-field-project.component.ts | 117 +- .../dynamic-fields-project.component.ts | 45 +- .../dmps/listing/dmp-listing.component.html | 132 +- .../app/dmps/listing/dmp-listing.component.ts | 11 +- .../app/dmps/wizard/dmp-wizard.component.ts | 125 +- .../editor/dmp-wizard-editor.component.html | 8 +- .../editor/dmp-wizard-editor.component.ts | 289 +- .../dataset-wizard-listing.component.ts | 91 +- dmp-frontend/src/app/entities/common/rule.ts | 14 - .../src/app/entities/common/rulestyle.ts | 6 - .../src/app/entities/model/attribute.ts | 17 - dmp-frontend/src/app/entities/model/param.ts | 11 - .../src/app/entities/model/section.ts | 11 - dmp-frontend/src/app/entities/model/source.ts | 13 - .../autocomplete-remote.component.html | 4 +- ...ynamic-field-boolean-decision.component.ts | 25 +- .../dynamic-field-checkbox.ts | 19 +- .../dynamic-field-dropdown.ts | 23 +- .../dynamic-field-radiobox.component.ts | 24 +- .../dynamic-form-field.component.ts | 80 +- .../src/app/form/dynamic-fields/field-base.ts | 51 - .../dynamic-form-composite-field.ts | 7 +- .../dynamic-form-group.component.ts | 3 +- .../dynamic-form-section.ts | 4 +- .../src/app/form/dynamic-form.module.ts | 124 +- .../dynamic-form/dynamic-form.component.ts | 4 +- .../pprogress-bar/progress-bar.component.ts | 114 +- .../table-of-content-field.component.ts | 30 +- .../table-of-content-fieldset.component.ts | 4 +- .../table-of-content-group.component.ts | 10 +- .../table-of-content-section.component.ts | 10 +- dmp-frontend/src/app/guards/auth.guard.ts | 17 - .../help-content/help-content.component.ts | 57 - .../src/app/homepage/homepage.component.ts | 3 +- .../invitation-accepted.component.ts | 34 - .../app/invitation/invitation.component.ts | 65 - .../data-repository/DataRepositoryCriteria.ts | 4 + .../ExternalDatasetCriteria.ts | 6 +- .../criteria/registry/RegistryCriteria.ts | 4 + .../criteria/services/ServicesCriteria.ts | 4 + .../dataRepositories/DataRepositoryModel.ts | 45 +- .../src/app/models/datasets/DatasetModel.ts | 2 +- .../app/models/datasets/DatasetWizardModel.ts | 165 +- .../external-dataset/ExternalDatasetModel.ts | 63 +- .../ExternalSourcesConfiguration.ts | 8 + .../ExternalSourcesUrlModel.ts | 4 + .../src/app/models/login/Principal.ts | 5 +- .../models/projects/ProjectListingModel.ts | 4 +- .../src/app/models/projects/ProjectModel.ts | 119 +- .../src/app/models/registers/RegisterModel.ts | 22 + .../src/app/models/services/ServiceModel.ts | 21 + .../editor/project-editor.component.html | 160 +- .../editor/project-editor.component.scss | 16 +- .../editor/project-editor.component.ts | 31 +- .../listing/project-listing.component.ts | 3 +- .../src/app/projects/project.routes.ts | 9 +- .../src/app/projects/projects.module.ts | 70 +- .../src/app/services/auth/auth.service.ts | 230 +- .../external-sources-configuration.service.ts | 28 + .../external-sources.service.ts | 62 +- .../add-researchers.component.html | 0 .../add-researchers.component.ts | 38 + .../auto-complete.component.html | 29 +- .../auto-complete/auto-complete.component.ts | 169 +- .../available-profiles.component.html | 0 .../available-profiles.component.ts | 53 + .../dmp-criteria.component.html | 58 +- .../dmp-criteria.component.ts | 101 +- .../dmp-profile-criteria.component.ts | 67 +- .../datasets/datasets-criteria.component.html | 53 +- .../projects/projects-criteria.component.html | 67 +- .../external-item-listing.component.html | 20 + .../external-item-listing.component.scss | 3 + .../external-item-listing.component.ts | 55 + .../external-item.component.html | 4 + .../external-item.component.scss} | 0 .../external-item/external-item.component.ts | 44 + .../invitation-accepted.component.html} | 0 .../invitation-accepted.component.ts | 33 + .../invitation/invitation.component.html | 0 .../invitation/invitation.component.scss | 0 .../invitation/invitation.component.ts | 64 + .../navigation/navigation.component.css | 9 +- .../navigation/navigation.component.html | 5 +- .../navigation/navigation.component.ts | 63 +- .../src/app/shared/guards/auth.guard.ts | 19 + .../help-content/help-content.component.ts | 57 + .../app/shared/material/material.module.ts | 2 +- dmp-frontend/src/app/shared/shared.module.ts | 16 +- .../src/app/user-management/login.module.ts | 56 +- .../user-management/login/login.component.ts | 4 +- .../activity/recent-activity.component.html | 87 +- .../activity/recent-activity.component.ts | 10 +- .../roles/user-role-editor.component.ts | 253 +- .../app/users/components/users.component.ts | 199 +- dmp-frontend/src/app/users/users.module.ts | 68 +- dmp-frontend/src/app/users/users.routes.ts | 6 +- .../base-http.service.ts | 238 +- .../cite-http.module.ts | 28 +- .../visibility-rules/models/VisibilityRule.ts | 0 .../models/VisibilityRuleSource.ts | 0 .../models/VisibilityRulesContext.ts | 32 + .../visibility-rules.service.ts | 72 + .../models/VisibilityRulesContext.ts | 32 - .../visibility-rules.service.ts | 72 - dmp-frontend/src/assets/images/openDmps.png | Bin 0 -> 3322 bytes dmp-frontend/src/assets/lang/en.json | 564 +-- dmp-frontend/src/environments/environment.ts | 4 +- dmp-frontend/src/polyfills.ts | 39 +- dmp-frontend/src/tsconfig.spec.json | 3 +- dmp-frontend/tsconfig.json | 3 +- dmp-frontend/tslint.json | 13 +- dmp-frontend/yarn.lock | 4080 +++++++++++------ 250 files changed, 10471 insertions(+), 5551 deletions(-) create mode 100644 dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetExternalDatasetDao.java create mode 100644 dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetExternalDatasetDaoImpl.java create mode 100644 dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetServiceDao.java create mode 100644 dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetServiceDaoImpl.java create mode 100644 dmp-backend/data/src/main/java/eu/eudat/data/entities/DatasetDataRepository.java rename dmp-backend/queryable/src/main/java/eu/eudat/queryable/{ => jpa}/hibernatequeryablelist/QueryableHibernateList.java (98%) rename dmp-backend/queryable/src/main/java/eu/eudat/queryable/{ => jpa}/predicates/NestedQuerySinglePredicate.java (88%) rename dmp-backend/queryable/src/main/java/eu/eudat/queryable/{ => jpa}/predicates/OrderByPredicate.java (84%) rename dmp-backend/queryable/src/main/java/eu/eudat/queryable/{ => jpa}/predicates/QueryablePredicate.java (67%) rename dmp-backend/queryable/src/main/java/eu/eudat/queryable/{ => jpa}/predicates/SelectPredicate.java (63%) rename dmp-backend/queryable/src/main/java/eu/eudat/queryable/{ => jpa}/predicates/SinglePredicate.java (85%) delete mode 100644 dmp-backend/queryable/target/classes/eu/eudat/queryable/hibernatequeryablelist/QueryableHibernateList.class delete mode 100644 dmp-backend/queryable/target/classes/eu/eudat/queryable/predicates/NestedQuerySinglePredicate.class delete mode 100644 dmp-backend/queryable/target/classes/eu/eudat/queryable/predicates/OrderByPredicate.class delete mode 100644 dmp-backend/queryable/target/classes/eu/eudat/queryable/predicates/QueryablePredicate.class delete mode 100644 dmp-backend/queryable/target/classes/eu/eudat/queryable/predicates/SelectPredicate.class delete mode 100644 dmp-backend/queryable/target/classes/eu/eudat/queryable/predicates/SinglePredicate.class create mode 100644 dmp-backend/web/src/main/java/eu/eudat/managers/CommonsManager.java create mode 100644 dmp-backend/web/src/main/java/eu/eudat/models/externalurl/ExternalSourcesConfiguration.java create mode 100644 dmp-backend/web/src/main/java/eu/eudat/types/externalsourcetype/ExternalDatasetType.java create mode 100644 dmp-frontend/.editorconfig delete mode 100644 dmp-frontend/.vscode/launch.json delete mode 100644 dmp-frontend/.vscode/settings.json create mode 100644 dmp-frontend/karma.conf.js create mode 100644 dmp-frontend/protractor.conf.js delete mode 100644 dmp-frontend/src/app/add-researchers/add-researchers.component.ts delete mode 100644 dmp-frontend/src/app/available-profiles/available-profiles.component.ts delete mode 100644 dmp-frontend/src/app/entities/common/rule.ts delete mode 100644 dmp-frontend/src/app/entities/common/rulestyle.ts delete mode 100644 dmp-frontend/src/app/entities/model/attribute.ts delete mode 100644 dmp-frontend/src/app/entities/model/param.ts delete mode 100644 dmp-frontend/src/app/entities/model/section.ts delete mode 100644 dmp-frontend/src/app/entities/model/source.ts delete mode 100644 dmp-frontend/src/app/form/dynamic-fields/field-base.ts delete mode 100644 dmp-frontend/src/app/guards/auth.guard.ts delete mode 100644 dmp-frontend/src/app/help-content/help-content.component.ts delete mode 100644 dmp-frontend/src/app/invitation-accepted/invitation-accepted.component.ts delete mode 100644 dmp-frontend/src/app/invitation/invitation.component.ts create mode 100644 dmp-frontend/src/app/models/criteria/data-repository/DataRepositoryCriteria.ts create mode 100644 dmp-frontend/src/app/models/criteria/registry/RegistryCriteria.ts create mode 100644 dmp-frontend/src/app/models/criteria/services/ServicesCriteria.ts create mode 100644 dmp-frontend/src/app/models/external-sources/ExternalSourcesConfiguration.ts create mode 100644 dmp-frontend/src/app/models/external-sources/ExternalSourcesUrlModel.ts create mode 100644 dmp-frontend/src/app/services/external-sources/external-sources-configuration.service.ts rename dmp-frontend/src/app/{ => shared/components}/add-researchers/add-researchers.component.html (100%) create mode 100644 dmp-frontend/src/app/shared/components/add-researchers/add-researchers.component.ts rename dmp-frontend/src/app/{ => shared/components}/available-profiles/available-profiles.component.html (100%) create mode 100644 dmp-frontend/src/app/shared/components/available-profiles/available-profiles.component.ts create mode 100644 dmp-frontend/src/app/shared/components/external-items/external-item-listing/external-item-listing.component.html create mode 100644 dmp-frontend/src/app/shared/components/external-items/external-item-listing/external-item-listing.component.scss create mode 100644 dmp-frontend/src/app/shared/components/external-items/external-item-listing/external-item-listing.component.ts create mode 100644 dmp-frontend/src/app/shared/components/external-items/external-item/external-item.component.html rename dmp-frontend/src/app/{invitation-accepted/invitation-accepted.component.html => shared/components/external-items/external-item/external-item.component.scss} (100%) create mode 100644 dmp-frontend/src/app/shared/components/external-items/external-item/external-item.component.ts rename dmp-frontend/src/app/{invitation/invitation.component.scss => shared/components/invitation-accepted/invitation-accepted.component.html} (100%) create mode 100644 dmp-frontend/src/app/shared/components/invitation-accepted/invitation-accepted.component.ts rename dmp-frontend/src/app/{ => shared/components}/invitation/invitation.component.html (100%) create mode 100644 dmp-frontend/src/app/shared/components/invitation/invitation.component.scss create mode 100644 dmp-frontend/src/app/shared/components/invitation/invitation.component.ts create mode 100644 dmp-frontend/src/app/shared/guards/auth.guard.ts create mode 100644 dmp-frontend/src/app/shared/help-content/help-content.component.ts rename dmp-frontend/src/app/{ => utilities}/visibility-rules/models/VisibilityRule.ts (100%) rename dmp-frontend/src/app/{ => utilities}/visibility-rules/models/VisibilityRuleSource.ts (100%) create mode 100644 dmp-frontend/src/app/utilities/visibility-rules/models/VisibilityRulesContext.ts create mode 100644 dmp-frontend/src/app/utilities/visibility-rules/visibility-rules.service.ts delete mode 100644 dmp-frontend/src/app/visibility-rules/models/VisibilityRulesContext.ts delete mode 100644 dmp-frontend/src/app/visibility-rules/visibility-rules.service.ts create mode 100644 dmp-frontend/src/assets/images/openDmps.png diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/DatabaseAccess.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/DatabaseAccess.java index da687d10a..c3b5603a4 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/DatabaseAccess.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/DatabaseAccess.java @@ -5,6 +5,11 @@ import eu.eudat.queryable.queryableentity.DataEntity; public class DatabaseAccess { + + public DatabaseAccess(DatabaseService databaseService) { + this.databaseService = databaseService; + } + private DatabaseService databaseService; public DatabaseService getDatabaseService() { diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/databaselayer/context/DatabaseContext.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/databaselayer/context/DatabaseContext.java index 37e8d8595..c0a92f01c 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/databaselayer/context/DatabaseContext.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/databaselayer/context/DatabaseContext.java @@ -1,7 +1,7 @@ package eu.eudat.data.dao.databaselayer.context; import eu.eudat.queryable.QueryableList; -import eu.eudat.queryable.hibernatequeryablelist.QueryableHibernateList; +import eu.eudat.queryable.jpa.hibernatequeryablelist.QueryableHibernateList; import eu.eudat.queryable.queryableentity.DataEntity; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/databaselayer/service/DatabaseService.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/databaselayer/service/DatabaseService.java index 24737bceb..8f3487a40 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/databaselayer/service/DatabaseService.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/databaselayer/service/DatabaseService.java @@ -25,7 +25,7 @@ public class DatabaseService { } public QueryableList getQueryable(Set hints, Class tClass) { - return this.databaseCtx.getQueryable(tClass).setHints(hints); + return this.databaseCtx.getQueryable(tClass); } public T createOrUpdate(T item, Class tClass) { diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ContentDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ContentDaoImpl.java index 88635ae5e..7c68cb3ea 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ContentDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ContentDaoImpl.java @@ -18,7 +18,7 @@ public class ContentDaoImpl extends DatabaseAccess implements ContentDa @Autowired public ContentDaoImpl(DatabaseService databaseService) { - this.setDatabaseService(databaseService); + super(databaseService); } @Override diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DMPDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DMPDaoImpl.java index 480e9c243..f2b106fc9 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DMPDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DMPDaoImpl.java @@ -22,7 +22,7 @@ public class DMPDaoImpl extends DatabaseAccess implements DMPDao { @Autowired public DMPDaoImpl(DatabaseService databaseService) { - this.setDatabaseService(databaseService); + super(databaseService); } @Override diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DMPProfileDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DMPProfileDaoImpl.java index 911f78bdf..b1ee83a96 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DMPProfileDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DMPProfileDaoImpl.java @@ -19,7 +19,7 @@ public class DMPProfileDaoImpl extends DatabaseAccess implements DMP @Autowired public DMPProfileDaoImpl(DatabaseService databaseService) { - this.setDatabaseService(databaseService); + super(databaseService); } @Override diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DataRepositoryDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DataRepositoryDaoImpl.java index 772072d5e..546d5a2d8 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DataRepositoryDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DataRepositoryDaoImpl.java @@ -16,7 +16,7 @@ public class DataRepositoryDaoImpl extends DatabaseAccess implem @Autowired public DataRepositoryDaoImpl(DatabaseService databaseService) { - this.setDatabaseService(databaseService); + super(databaseService); } @Override diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetDaoImpl.java index 07dba9f09..1be6557ae 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetDaoImpl.java @@ -8,6 +8,7 @@ import eu.eudat.data.entities.UserInfo; import eu.eudat.queryable.QueryableList; import eu.eudat.queryable.types.FieldSelectionType; import eu.eudat.queryable.types.SelectionField; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.Arrays; @@ -17,8 +18,9 @@ import java.util.concurrent.CompletableFuture; @Component("datasetDao") public class DatasetDaoImpl extends DatabaseAccess implements DatasetDao { + @Autowired public DatasetDaoImpl(DatabaseService databaseService) { - this.setDatabaseService(databaseService); + super(databaseService); } @Override diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetExternalDatasetDao.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetExternalDatasetDao.java new file mode 100644 index 000000000..6947aeb75 --- /dev/null +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetExternalDatasetDao.java @@ -0,0 +1,13 @@ +package eu.eudat.data.dao.entities; + +import eu.eudat.data.dao.DatabaseAccessLayer; +import eu.eudat.data.entities.DatasetExternalDataset; + +import java.util.UUID; + +/** + * Created by ikalyvas on 5/22/2018. + */ +public interface DatasetExternalDatasetDao extends DatabaseAccessLayer { + +} diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetExternalDatasetDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetExternalDatasetDaoImpl.java new file mode 100644 index 000000000..25e1b09fa --- /dev/null +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetExternalDatasetDaoImpl.java @@ -0,0 +1,55 @@ +package eu.eudat.data.dao.entities; + +import eu.eudat.data.dao.DatabaseAccess; +import eu.eudat.data.dao.databaselayer.service.DatabaseService; +import eu.eudat.data.entities.DatasetExternalDataset; +import eu.eudat.data.entities.DatasetProfile; +import eu.eudat.queryable.QueryableList; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.UUID; +import java.util.concurrent.CompletableFuture; + +/** + * Created by ikalyvas on 5/22/2018. + */ +@Component("datasetExternalDatasetDao") +public class DatasetExternalDatasetDaoImpl extends DatabaseAccess implements DatasetExternalDatasetDao { + + @Autowired + public DatasetExternalDatasetDaoImpl(DatabaseService databaseService) { + super(databaseService); + } + + @Override + public DatasetExternalDataset createOrUpdate(DatasetExternalDataset item) { + return this.getDatabaseService().createOrUpdate(item,DatasetExternalDataset.class); + } + + @Override + public CompletableFuture createOrUpdateAsync(DatasetExternalDataset item) { + return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); + } + + @Override + public DatasetExternalDataset find(UUID id) { + return getDatabaseService().getQueryable(DatasetExternalDataset.class).where((builder, root) -> builder.equal(root.get("id"), id)).getSingle(); + } + + @Override + public DatasetExternalDataset find(UUID id, String hint) { + throw new UnsupportedOperationException(); + } + + + @Override + public void delete(DatasetExternalDataset item) { + this.getDatabaseService().delete(item); + } + + @Override + public QueryableList asQueryable() { + return this.getDatabaseService().getQueryable(DatasetExternalDataset.class); + } +} diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetProfileDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetProfileDaoImpl.java index e353738f4..a9bcfaa70 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetProfileDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetProfileDaoImpl.java @@ -16,7 +16,7 @@ public class DatasetProfileDaoImpl extends DatabaseAccess implem @Autowired public DatasetProfileDaoImpl(DatabaseService databaseService) { - this.setDatabaseService(databaseService); + super(databaseService); } @Override diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetServiceDao.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetServiceDao.java new file mode 100644 index 000000000..9af289d34 --- /dev/null +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetServiceDao.java @@ -0,0 +1,13 @@ +package eu.eudat.data.dao.entities; + +import eu.eudat.data.dao.DatabaseAccessLayer; +import eu.eudat.data.entities.DatasetProfile; +import eu.eudat.data.entities.DatasetService; + +import java.util.UUID; + +/** + * Created by ikalyvas on 5/22/2018. + */ +public interface DatasetServiceDao extends DatabaseAccessLayer { +} diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetServiceDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetServiceDaoImpl.java new file mode 100644 index 000000000..6ffcf1adf --- /dev/null +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/DatasetServiceDaoImpl.java @@ -0,0 +1,55 @@ +package eu.eudat.data.dao.entities; + +import eu.eudat.data.dao.DatabaseAccess; +import eu.eudat.data.dao.databaselayer.service.DatabaseService; +import eu.eudat.data.entities.DatasetExternalDataset; +import eu.eudat.data.entities.DatasetProfile; +import eu.eudat.data.entities.DatasetService; +import eu.eudat.queryable.QueryableList; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.UUID; +import java.util.concurrent.CompletableFuture; + +/** + * Created by ikalyvas on 5/22/2018. + */ +@Component("datasetServiceDao") +public class DatasetServiceDaoImpl extends DatabaseAccess implements DatasetServiceDao { + + @Autowired + public DatasetServiceDaoImpl(DatabaseService databaseService) { + super(databaseService); + } + + @Override + public DatasetService createOrUpdate(DatasetService item) { + return this.getDatabaseService().createOrUpdate(item, DatasetService.class); + } + + @Override + public CompletableFuture createOrUpdateAsync(DatasetService item) { + return CompletableFuture.supplyAsync(() -> this.createOrUpdate(item)); + } + + @Override + public DatasetService find(UUID id) { + return getDatabaseService().getQueryable(DatasetService.class).where((builder, root) -> builder.equal(root.get("id"), id)).getSingle(); + } + + @Override + public DatasetService find(UUID id, String hint) { + throw new UnsupportedOperationException(); + } + + @Override + public void delete(DatasetService item) { + this.getDatabaseService().delete(item); + } + + @Override + public QueryableList asQueryable() { + return this.getDatabaseService().getQueryable(DatasetService.class); + } +} diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ExternalDatasetDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ExternalDatasetDaoImpl.java index ac6ca4345..ee0242250 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ExternalDatasetDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ExternalDatasetDaoImpl.java @@ -17,7 +17,7 @@ public class ExternalDatasetDaoImpl extends DatabaseAccess impl @Autowired public ExternalDatasetDaoImpl(DatabaseService databaseService) { - this.setDatabaseService(databaseService); + super(databaseService); } @Override diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/InvitationDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/InvitationDaoImpl.java index 75b432d34..7b9e66332 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/InvitationDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/InvitationDaoImpl.java @@ -17,7 +17,7 @@ public class InvitationDaoImpl extends DatabaseAccess implements Inv @Autowired public InvitationDaoImpl(DatabaseService databaseService) { - this.setDatabaseService(databaseService); + super(databaseService); } @Override diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/OrganisationDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/OrganisationDaoImpl.java index 7169b7abb..57a82ea8f 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/OrganisationDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/OrganisationDaoImpl.java @@ -16,7 +16,7 @@ public class OrganisationDaoImpl extends DatabaseAccess implements @Autowired public OrganisationDaoImpl(DatabaseService databaseService) { - this.setDatabaseService(databaseService); + super(databaseService); } @Override diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ProjectDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ProjectDaoImpl.java index 5944ed139..cbd98f97e 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ProjectDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ProjectDaoImpl.java @@ -9,6 +9,7 @@ import eu.eudat.queryable.QueryableList; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import javax.persistence.criteria.JoinType; import java.util.UUID; import java.util.concurrent.CompletableFuture; @@ -17,7 +18,7 @@ public class ProjectDaoImpl extends DatabaseAccess implements ProjectDa @Autowired public ProjectDaoImpl(DatabaseService databaseService) { - this.setDatabaseService(databaseService); + super(databaseService); } @Override @@ -56,7 +57,7 @@ public class ProjectDaoImpl extends DatabaseAccess implements ProjectDa } public QueryableList getAuthenticated(QueryableList query, UserInfo principal) { - query.where((builder, root) -> builder.or(builder.equal(root.get("creationUser"), principal), builder.isMember(principal, root.join("dmps").get("users")))).distinct(); + query.where((builder, root) -> builder.or(builder.equal(root.get("creationUser"), principal), builder.isMember(principal, root.join("dmps", JoinType.LEFT).get("users")))).distinct(); return query; } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/RegistryDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/RegistryDaoImpl.java index 88f71d39f..f4bb048dc 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/RegistryDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/RegistryDaoImpl.java @@ -16,7 +16,7 @@ public class RegistryDaoImpl extends DatabaseAccess implements Registr @Autowired public RegistryDaoImpl(DatabaseService databaseService) { - this.setDatabaseService(databaseService); + super(databaseService); } @Override diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ResearcherDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ResearcherDaoImpl.java index 1bc8d4917..d9318903d 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ResearcherDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ResearcherDaoImpl.java @@ -16,7 +16,7 @@ public class ResearcherDaoImpl extends DatabaseAccess implements Res @Autowired public ResearcherDaoImpl(DatabaseService databaseService) { - this.setDatabaseService(databaseService); + super(databaseService); } @Override diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ServiceDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ServiceDaoImpl.java index 3e1efa753..cee85c95c 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ServiceDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/ServiceDaoImpl.java @@ -16,7 +16,7 @@ public class ServiceDaoImpl extends DatabaseAccess implements ServiceDa @Autowired public ServiceDaoImpl(DatabaseService databaseService) { - this.setDatabaseService(databaseService); + super(databaseService); } @Override diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/UserDmpDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/UserDmpDaoImpl.java index b987807a6..9f23d023f 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/UserDmpDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/UserDmpDaoImpl.java @@ -18,7 +18,7 @@ public class UserDmpDaoImpl extends DatabaseAccess implements UserDmpDa @Autowired public UserDmpDaoImpl(DatabaseService databaseService) { - this.setDatabaseService(databaseService); + super(databaseService); } @Override diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/UserInfoDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/UserInfoDaoImpl.java index b035f5cb6..7d601863c 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/UserInfoDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/UserInfoDaoImpl.java @@ -16,7 +16,7 @@ public class UserInfoDaoImpl extends DatabaseAccess implements UserInf @Autowired public UserInfoDaoImpl(DatabaseService databaseService) { - this.setDatabaseService(databaseService); + super(databaseService); } @Override diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/UserRoleDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/UserRoleDaoImpl.java index 2219d553f..c22a51747 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/UserRoleDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/UserRoleDaoImpl.java @@ -19,7 +19,7 @@ public class UserRoleDaoImpl extends DatabaseAccess implements UserRol @Autowired public UserRoleDaoImpl(DatabaseService databaseService) { - this.setDatabaseService(databaseService); + super(databaseService); } @Override diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/security/CredentialDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/security/CredentialDaoImpl.java index da8805328..6fa8c94e4 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/security/CredentialDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/security/CredentialDaoImpl.java @@ -16,7 +16,7 @@ public class CredentialDaoImpl extends DatabaseAccess implements Cre @Autowired public CredentialDaoImpl(DatabaseService databaseService) { - this.setDatabaseService(databaseService); + super(databaseService); } @Override diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/security/UserTokenDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/security/UserTokenDaoImpl.java index ef8849f43..4a1e9f0c9 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/security/UserTokenDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/security/UserTokenDaoImpl.java @@ -16,7 +16,7 @@ public class UserTokenDaoImpl extends DatabaseAccess implements UserT @Autowired public UserTokenDaoImpl(DatabaseService databaseService) { - this.setDatabaseService(databaseService); + super(databaseService); } @Override diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/DataRepository.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/DataRepository.java index afb696191..d33df2c01 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/DataRepository.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/DataRepository.java @@ -38,12 +38,8 @@ public class DataRepository implements Serializable, DataEntity datasets; + @OneToMany(mappedBy = "dataRepository", cascade = CascadeType.ALL, orphanRemoval = true) + private Set datasetDataRepositories; @Column(name = "\"Status\"", nullable = false) @@ -134,12 +130,12 @@ public class DataRepository implements Serializable, DataEntity getDatasets() { - return datasets; + public Set getDatasetDataRepositories() { + return datasetDataRepositories; } - public void setDatasets(Set datasets) { - this.datasets = datasets; + public void setDatasetDataRepositories(Set datasetDataRepositories) { + this.datasetDataRepositories = datasetDataRepositories; } @Override diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/Dataset.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/Dataset.java index 4e8431c7f..5cefc1137 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/Dataset.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/Dataset.java @@ -7,18 +7,19 @@ import org.hibernate.annotations.Type; import javax.persistence.*; import java.util.*; +import java.util.stream.Collectors; @Entity @Table(name = "\"Dataset\"") @NamedEntityGraphs({ @NamedEntityGraph( name = "datasetListingModel", - attributeNodes = {@NamedAttributeNode("services"), @NamedAttributeNode("dataRepositories"), @NamedAttributeNode("externalDatasets"), @NamedAttributeNode("registries"), + attributeNodes = {@NamedAttributeNode("services"), @NamedAttributeNode("datasetDataRepositories"), @NamedAttributeNode("datasetExternalDatasets"), @NamedAttributeNode("registries"), @NamedAttributeNode(value = "dmp", subgraph = "dmp"), @NamedAttributeNode("profile"), @NamedAttributeNode("creator")}, subgraphs = @NamedSubgraph(name = "dmp", attributeNodes = {@NamedAttributeNode("creator"), @NamedAttributeNode("users")})), @NamedEntityGraph( name = "datasetWizardModel", - attributeNodes = {@NamedAttributeNode("services"), @NamedAttributeNode("dataRepositories"), @NamedAttributeNode("externalDatasets"), @NamedAttributeNode("registries"), + attributeNodes = {@NamedAttributeNode("services"), @NamedAttributeNode("datasetDataRepositories"), @NamedAttributeNode("datasetExternalDatasets"), @NamedAttributeNode("registries"), @NamedAttributeNode("dmp"), @NamedAttributeNode("profile"), @NamedAttributeNode("creator")}), @NamedEntityGraph( name = "datasetRecentActivity", @@ -91,14 +92,6 @@ public class Dataset implements DataEntity { @Column(name = "\"Reference\"", columnDefinition = "xml", nullable = true) private String reference; - @OneToMany(fetch = FetchType.LAZY) - @JoinTable(name = "\"DatasetDataRepository\"", - joinColumns = {@JoinColumn(name = "\"Dataset\"", referencedColumnName = "\"ID\"")}, - inverseJoinColumns = {@JoinColumn(name = "\"DataRepository\"", referencedColumnName = "\"ID\"")} - ) - private Set dataRepositories; - - @OneToMany(fetch = FetchType.LAZY) @JoinTable(name = "\"DatasetRegistry\"", joinColumns = {@JoinColumn(name = "\"Dataset\"", referencedColumnName = "\"ID\"")}, @@ -107,19 +100,15 @@ public class Dataset implements DataEntity { private Set registries; - @OneToMany(fetch = FetchType.LAZY) - @JoinTable(name = "\"DatasetService\"", - joinColumns = {@JoinColumn(name = "\"Dataset\"", referencedColumnName = "\"ID\"")}, - inverseJoinColumns = {@JoinColumn(name = "\"Service\"", referencedColumnName = "\"ID\"")} - ) - private Set services; + @OneToMany(mappedBy = "dataset", cascade = CascadeType.ALL, orphanRemoval = true) + private Set datasetDataRepositories; - @OneToMany(fetch = FetchType.LAZY) - @JoinTable(name = "\"DatasetExternalDataset\"", - joinColumns = {@JoinColumn(name = "\"Dataset\"", referencedColumnName = "\"ID\"")}, - inverseJoinColumns = {@JoinColumn(name = "\"ExternalDataset\"", referencedColumnName = "\"Id\"")} - ) - private Set externalDatasets; + + @OneToMany(mappedBy = "dataset", cascade = CascadeType.ALL, orphanRemoval = true) + private Set services; + + @OneToMany(mappedBy = "dataset", cascade = CascadeType.ALL, orphanRemoval = true) + private Set datasetExternalDatasets; @Column(name = "\"Status\"", nullable = false) @@ -198,17 +187,14 @@ public class Dataset implements DataEntity { this.registries = registries; } - - public Set getServices() { + public Set getServices() { return services; } - - public void setServices(Set services) { + public void setServices(Set services) { this.services = services; } - public UUID getId() { return id; } @@ -269,16 +255,14 @@ public class Dataset implements DataEntity { } - public Set getDataRepositories() { - return dataRepositories; + public Set getDatasetDataRepositories() { + return datasetDataRepositories; } - - public void setDataRepositories(Set dataRepositories) { - this.dataRepositories = dataRepositories; + public void setDatasetDataRepositories(Set datasetDataRepositories) { + this.datasetDataRepositories = datasetDataRepositories; } - public String getReference() { return reference; } @@ -288,12 +272,12 @@ public class Dataset implements DataEntity { this.reference = reference; } - public Set getExternalDatasets() { - return externalDatasets; + public Set getDatasetExternalDatasets() { + return datasetExternalDatasets; } - public void setExternalDatasets(Set externalDatasets) { - this.externalDatasets = externalDatasets; + public void setDatasetExternalDatasets(Set datasetExternalDatasets) { + this.datasetExternalDatasets = datasetExternalDatasets; } public boolean isPublic() { @@ -307,11 +291,19 @@ public class Dataset implements DataEntity { @Override public void update(Dataset entity) { this.setRegistries(entity.getRegistries()); - this.setDataRepositories(entity.getDataRepositories()); + this.getDatasetDataRepositories().removeAll(this.getDatasetDataRepositories()); + this.getDatasetDataRepositories().addAll(entity.getDatasetDataRepositories().stream().map(item->{ + item.setDataset(this); + return item; + }).collect(Collectors.toList())); this.setDescription(entity.getDescription()); this.setLabel(entity.getLabel()); this.setProperties(entity.getProperties()); - this.setExternalDatasets(entity.getExternalDatasets()); + this.getDatasetExternalDatasets().removeAll(this.getDatasetExternalDatasets()); + this.getDatasetExternalDatasets().addAll(entity.getDatasetExternalDatasets().stream().map(item -> { + item.setDataset(this); + return item; + }).collect(Collectors.toList())); this.setStatus(entity.getStatus()); this.setProfile(entity.getProfile()); this.setModified(new Date()); diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/DatasetDataRepository.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/DatasetDataRepository.java new file mode 100644 index 000000000..6cc2ddafa --- /dev/null +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/DatasetDataRepository.java @@ -0,0 +1,90 @@ +package eu.eudat.data.entities; + +import eu.eudat.queryable.queryableentity.DataEntity; +import org.hibernate.annotations.GenericGenerator; +import org.hibernate.annotations.Type; + +import javax.persistence.*; +import java.util.UUID; + +/** + * Created by ikalyvas on 5/22/2018. + */ + +@Entity +@Table(name = "\"DatasetDataRepository\"") +public class DatasetDataRepository implements DataEntity { + + @Id + @GeneratedValue + @GenericGenerator(name = "uuid2", strategy = "uuid2") + @Column(name = "\"ID\"", updatable = false, nullable = false, columnDefinition = "BINARY(16)") + private UUID id; + + @ManyToOne + @JoinColumn(name = "\"Dataset\"", nullable = false) + private Dataset dataset; + + @ManyToOne + @JoinColumn(name = "\"DataRepository\"", nullable = false) + private DataRepository dataRepository; + + @Column(name = "\"Role\"") + private Integer role; + + + @Column(name = "\"Data\"") + private String data; + + public UUID getId() { + return id; + } + + public void setId(UUID id) { + this.id = id; + } + + public Dataset getDataset() { + return dataset; + } + + public void setDataset(Dataset dataset) { + this.dataset = dataset; + } + + public DataRepository getDataRepository() { + return dataRepository; + } + + public void setDataRepository(DataRepository dataRepository) { + this.dataRepository = dataRepository; + } + + public Integer getRole() { + return role; + } + + public void setRole(Integer role) { + this.role = role; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + @Override + public void update(DatasetDataRepository entity) { + this.dataset = entity.getDataset(); + this.dataRepository = entity.getDataRepository(); + this.role = entity.getRole(); + } + + @Override + public UUID getKeys() { + return this.id; + } +} diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/DatasetExternalDataset.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/DatasetExternalDataset.java index d0b32a46d..c9b27cc83 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/DatasetExternalDataset.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/DatasetExternalDataset.java @@ -1,5 +1,6 @@ package eu.eudat.data.entities; +import eu.eudat.queryable.queryableentity.DataEntity; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Type; @@ -9,7 +10,7 @@ import java.util.UUID; @Entity @Table(name = "\"DatasetExternalDataset\"") -public class DatasetExternalDataset { +public class DatasetExternalDataset implements DataEntity { @Id @GeneratedValue @@ -18,17 +19,21 @@ public class DatasetExternalDataset { private UUID id; - @Type(type = "org.hibernate.type.PostgresUUIDType") //DEPWARN dependency to Hibernate and PostgreSQL - @Column(name = "\"Dataset\"", nullable = false) - private UUID dataset; + @ManyToOne + @JoinColumn(name = "\"Dataset\"", nullable = false) + private Dataset dataset; - @Type(type = "org.hibernate.type.PostgresUUIDType") //DEPWARN dependency to Hibernate and PostgreSQL - @Column(name = "\"ExternalDataset\"", nullable = false) - private UUID externalDataset; + @ManyToOne + @JoinColumn(name = "\"ExternalDataset\"", nullable = false) + private ExternalDataset externalDataset; @Column(name = "\"Role\"") private Integer role; + @Column(name = "\"Data\"") + private String data; + + public UUID getId() { return id; } @@ -37,19 +42,19 @@ public class DatasetExternalDataset { this.id = id; } - public UUID getDataset() { + public Dataset getDataset() { return dataset; } - public void setDataset(UUID dataset) { + public void setDataset(Dataset dataset) { this.dataset = dataset; } - public UUID getExternalDataset() { + public ExternalDataset getExternalDataset() { return externalDataset; } - public void setExternalDataset(UUID externalDataset) { + public void setExternalDataset(ExternalDataset externalDataset) { this.externalDataset = externalDataset; } @@ -60,4 +65,24 @@ public class DatasetExternalDataset { public void setRole(Integer role) { this.role = role; } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + @Override + public void update(DatasetExternalDataset entity) { + this.dataset = entity.getDataset(); + this.externalDataset = entity.getExternalDataset(); + this.role = entity.getRole(); + } + + @Override + public UUID getKeys() { + return this.id; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/DatasetRegistry.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/DatasetRegistry.java index 5c4604369..271c2d685 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/DatasetRegistry.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/DatasetRegistry.java @@ -31,6 +31,9 @@ public class DatasetRegistry { @Column(name = "\"Role\"") private Integer role; + @Column(name = "\"Data\"") + private String data; + public UUID getId() { return id; } @@ -63,5 +66,11 @@ public class DatasetRegistry { this.role = role; } + public String getData() { + return data; + } + public void setData(String data) { + this.data = data; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/DatasetService.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/DatasetService.java index 1641415e9..25b4ef807 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/DatasetService.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/DatasetService.java @@ -1,6 +1,7 @@ package eu.eudat.data.entities; +import eu.eudat.queryable.queryableentity.DataEntity; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Type; @@ -11,7 +12,7 @@ import java.util.UUID; @Entity @Table(name = "\"DatasetService\"") -public class DatasetService { +public class DatasetService implements DataEntity { @Id @GeneratedValue @@ -20,17 +21,21 @@ public class DatasetService { private UUID id; - @Type(type = "org.hibernate.type.PostgresUUIDType") //DEPWARN dependency to Hibernate and PostgreSQL - @Column(name = "\"Dataset\"", nullable = false) - private UUID dataset; + @ManyToOne + @JoinColumn(name = "\"Dataset\"", nullable = false) + private Dataset dataset; - @Type(type = "org.hibernate.type.PostgresUUIDType") //DEPWARN dependency to Hibernate and PostgreSQL - @Column(name = "\"Service\"", nullable = false) - private UUID service; + @ManyToOne + @JoinColumn(name = "\"Service\"", nullable = false) + private Service service; @Column(name = "\"Role\"") private Integer role; + @Column(name = "\"Data\"") + private String data; + + public UUID getId() { return id; } @@ -39,19 +44,19 @@ public class DatasetService { this.id = id; } - public UUID getDataset() { + public Dataset getDataset() { return dataset; } - public void setDataset(UUID dataset) { + public void setDataset(Dataset dataset) { this.dataset = dataset; } - public UUID getService() { + public Service getService() { return service; } - public void setService(UUID service) { + public void setService(Service service) { this.service = service; } @@ -63,5 +68,23 @@ public class DatasetService { this.role = role; } + public String getData() { + return data; + } + public void setData(String data) { + this.data = data; + } + + @Override + public void update(DatasetService entity) { + this.dataset = entity.getDataset(); + this.service = entity.getService(); + this.role = entity.getRole(); + } + + @Override + public UUID getKeys() { + return this.id; + } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/ExternalDataset.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/ExternalDataset.java index f2e75a7ce..c81253944 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/ExternalDataset.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/ExternalDataset.java @@ -34,12 +34,8 @@ public class ExternalDataset implements DataEntity { @Column(name = "\"Modified\"", nullable = false) private Date modified; - @OneToMany(fetch = FetchType.LAZY) - @JoinTable(name = "\"DatasetExternalDataset\"", - joinColumns = {@JoinColumn(name = "\"ExternalDataset\"", referencedColumnName = "\"Id\"")}, - inverseJoinColumns = {@JoinColumn(name = "\"Dataset\"", referencedColumnName = "\"ID\"")} - ) - private Set datasets; + @OneToMany(mappedBy = "externalDataset", cascade = CascadeType.ALL, orphanRemoval = true) + private Set datasets; public UUID getId() { return id; @@ -89,11 +85,11 @@ public class ExternalDataset implements DataEntity { this.modified = modified; } - public Set getDatasets() { + public Set getDatasets() { return datasets; } - public void setDatasets(Set datasets) { + public void setDatasets(Set datasets) { this.datasets = datasets; } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/Service.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/Service.java index b1a484b8c..61f10ce5d 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/Service.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/Service.java @@ -39,12 +39,8 @@ public class Service implements DataEntity { private String definition; - @OneToMany(fetch = FetchType.LAZY) - @JoinTable(name = "\"DatasetService\"", - joinColumns = {@JoinColumn(name = "\"Service\"", referencedColumnName = "\"ID\"")}, - inverseJoinColumns = {@JoinColumn(name = "\"Dataset\"", referencedColumnName = "\"ID\"")} - ) - private Set datasets; + @OneToMany(mappedBy = "service", cascade = CascadeType.ALL, orphanRemoval = true) + private Set services; @Column(name = "\"Status\"", nullable = false) @@ -136,15 +132,14 @@ public class Service implements DataEntity { this.definition = definition; } - public Set getDatasets() { - return datasets; + public Set getServices() { + return services; } - public void setDatasets(Set datasets) { - this.datasets = datasets; + public void setServices(Set services) { + this.services = services; } - @Override public void update(Service entity) { diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/UserInfo.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/UserInfo.java index 3ff456f0e..7377898fc 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/UserInfo.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/UserInfo.java @@ -52,7 +52,7 @@ public class UserInfo implements DataEntity { @Type(type = "eu.eudat.typedefinition.XMLType") - @Column(name = "additionalinfo", columnDefinition = "xml", nullable = true) + @Column(name = "additionalinfo", nullable = true) private String additionalinfo; @OneToMany(fetch = FetchType.LAZY) diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/query/PaginationService.java b/dmp-backend/data/src/main/java/eu/eudat/data/query/PaginationService.java index 3ab1cab40..7ee93cd6f 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/query/PaginationService.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/query/PaginationService.java @@ -13,7 +13,7 @@ import java.util.Collection; * Created by ikalyvas on 3/21/2018. */ public class PaginationService { - public static QueryableList applyPaging(QueryableList items, TableQuery tableRequest) throws Exception { + public static QueryableList applyPaging(QueryableList items, TableQuery tableRequest) { if (tableRequest.getOrderings() != null) applyOrder(items, tableRequest); if (tableRequest.getLength() != null) items.take(tableRequest.getLength()); if (tableRequest.getOffset() != null) items.skip(tableRequest.getOffset()); @@ -22,7 +22,7 @@ public class PaginationService { return items; } - public static void applyOrder(QueryableList items, TableQuery tableRequest) throws Exception { + public static void applyOrder(QueryableList items, TableQuery tableRequest) { ColumnOrderings columnOrderings = tableRequest.getOrderings(); for (Ordering ordering : columnOrderings.getFieldOrderings()) { if (ordering.getOrderByType() == Ordering.OrderByType.ASC) diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/query/definition/Query.java b/dmp-backend/data/src/main/java/eu/eudat/data/query/definition/Query.java index f4596cbd1..aee35ca35 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/query/definition/Query.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/query/definition/Query.java @@ -11,6 +11,11 @@ public abstract class Query, T extends DataEntity> impleme public static class QueryBuilder, T extends DataEntity, Q extends Query> { private C criteria; private QueryableList query; + private Class tClass; + + public QueryBuilder(Class tClass) { + this.tClass = tClass; + } public QueryBuilder criteria(C criteria) { this.criteria = criteria; @@ -22,11 +27,18 @@ public abstract class Query, T extends DataEntity> impleme return this; } - public Q build(Class qClass) throws IllegalAccessException, InstantiationException { - Q q = qClass.newInstance(); - q.setCriteria(criteria); - q.setQuery(query); - return q; + public Q build() { + try { + Q q = tClass.newInstance(); + q.setCriteria(criteria); + q.setQuery(query); + return q; + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + return null; } } @@ -47,12 +59,12 @@ public abstract class Query, T extends DataEntity> impleme } @Override - public QueryableList collect() throws Exception { + public QueryableList collect() { return this.applyCriteria(); } @Override - public QueryableList collect(QueryableList repo) throws Exception { + public QueryableList collect(QueryableList repo) { this.query = repo; return this.applyCriteria(); } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/query/definition/TableCriteriaQuery.java b/dmp-backend/data/src/main/java/eu/eudat/data/query/definition/TableCriteriaQuery.java index 4dc6d43e2..5963e7a12 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/query/definition/TableCriteriaQuery.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/query/definition/TableCriteriaQuery.java @@ -8,5 +8,5 @@ import eu.eudat.queryable.queryableentity.DataEntity; * Created by ikalyvas on 3/21/2018. */ public interface TableCriteriaQuery, T extends DataEntity> extends CriteriaQuery { - QueryableList applyPaging(QueryableList items) throws Exception; + QueryableList applyPaging(QueryableList items) ; } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/query/definition/TableQuery.java b/dmp-backend/data/src/main/java/eu/eudat/data/query/definition/TableQuery.java index c3f9fe2a3..b2d87cbbb 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/query/definition/TableQuery.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/query/definition/TableQuery.java @@ -47,12 +47,12 @@ public abstract class TableQuery, T extends DataEntity collect() throws Exception { + public QueryableList collect() { return this.applyPaging(super.collect()); } @Override - public QueryableList collect(QueryableList repo) throws Exception { + public QueryableList collect(QueryableList repo) { return this.applyPaging(super.collect(repo)); } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/query/definition/helpers/ColumnOrderings.java b/dmp-backend/data/src/main/java/eu/eudat/data/query/definition/helpers/ColumnOrderings.java index 88f1dd2d5..b01f8078d 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/query/definition/helpers/ColumnOrderings.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/query/definition/helpers/ColumnOrderings.java @@ -16,7 +16,7 @@ public class ColumnOrderings { this.fields = fields; } - public Ordering[] getFieldOrderings() throws Exception { + public Ordering[] getFieldOrderings() { List orderings = new LinkedList<>(); for (String field : fields) { orderings.add(this.orderingFromString(field)); @@ -24,7 +24,7 @@ public class ColumnOrderings { return orderings.toArray(new Ordering[orderings.size()]); } - private Ordering orderingFromString(String field) throws Exception { + private Ordering orderingFromString(String field) { Ordering ordering = new Ordering(field); if (ordering.getFieldName().contains("+")) ordering.fieldName(ordering.getFieldName().replace("+", "")).orderByType(Ordering.OrderByType.ASC); diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/query/items/table/dmp/DataManagementPlanTableRequest.java b/dmp-backend/data/src/main/java/eu/eudat/data/query/items/table/dmp/DataManagementPlanTableRequest.java index 06d91959f..c595618c5 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/query/items/table/dmp/DataManagementPlanTableRequest.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/query/items/table/dmp/DataManagementPlanTableRequest.java @@ -32,7 +32,7 @@ public class DataManagementPlanTableRequest extends TableQuery applyPaging(QueryableList items) throws Exception { + public QueryableList applyPaging(QueryableList items) { return PaginationService.applyPaging(items, this); } } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/query/items/table/dmpprofile/DataManagementPlanProfileTableRequest.java b/dmp-backend/data/src/main/java/eu/eudat/data/query/items/table/dmpprofile/DataManagementPlanProfileTableRequest.java index a0def3e4b..c06cd3867 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/query/items/table/dmpprofile/DataManagementPlanProfileTableRequest.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/query/items/table/dmpprofile/DataManagementPlanProfileTableRequest.java @@ -22,7 +22,7 @@ public class DataManagementPlanProfileTableRequest extends TableQuery applyPaging(QueryableList items) throws Exception { + public QueryableList applyPaging(QueryableList items) { return PaginationService.applyPaging(items, this); } } diff --git a/dmp-backend/data/target/generated-sources/annotations/eu/eudat/data/entities/DataRepository_.java b/dmp-backend/data/target/generated-sources/annotations/eu/eudat/data/entities/DataRepository_.java index efb2645a7..be80e289b 100644 --- a/dmp-backend/data/target/generated-sources/annotations/eu/eudat/data/entities/DataRepository_.java +++ b/dmp-backend/data/target/generated-sources/annotations/eu/eudat/data/entities/DataRepository_.java @@ -13,11 +13,11 @@ public abstract class DataRepository_ { public static volatile SingularAttribute reference; public static volatile SingularAttribute created; + public static volatile SetAttribute datasetDataRepositories; public static volatile SingularAttribute modified; public static volatile SingularAttribute definition; public static volatile SingularAttribute id; public static volatile SingularAttribute label; - public static volatile SetAttribute datasets; public static volatile SingularAttribute abbreviation; public static volatile SingularAttribute uri; public static volatile SingularAttribute status; diff --git a/dmp-backend/data/target/generated-sources/annotations/eu/eudat/data/entities/DatasetExternalDataset_.java b/dmp-backend/data/target/generated-sources/annotations/eu/eudat/data/entities/DatasetExternalDataset_.java index de821ac35..60c917f57 100644 --- a/dmp-backend/data/target/generated-sources/annotations/eu/eudat/data/entities/DatasetExternalDataset_.java +++ b/dmp-backend/data/target/generated-sources/annotations/eu/eudat/data/entities/DatasetExternalDataset_.java @@ -9,10 +9,11 @@ import javax.persistence.metamodel.StaticMetamodel; @StaticMetamodel(DatasetExternalDataset.class) public abstract class DatasetExternalDataset_ { - public static volatile SingularAttribute externalDataset; + public static volatile SingularAttribute externalDataset; public static volatile SingularAttribute role; + public static volatile SingularAttribute data; public static volatile SingularAttribute id; - public static volatile SingularAttribute dataset; + public static volatile SingularAttribute dataset; } diff --git a/dmp-backend/data/target/generated-sources/annotations/eu/eudat/data/entities/DatasetRegistry_.java b/dmp-backend/data/target/generated-sources/annotations/eu/eudat/data/entities/DatasetRegistry_.java index b9e300158..3b7191526 100644 --- a/dmp-backend/data/target/generated-sources/annotations/eu/eudat/data/entities/DatasetRegistry_.java +++ b/dmp-backend/data/target/generated-sources/annotations/eu/eudat/data/entities/DatasetRegistry_.java @@ -11,6 +11,7 @@ public abstract class DatasetRegistry_ { public static volatile SingularAttribute registry; public static volatile SingularAttribute role; + public static volatile SingularAttribute data; public static volatile SingularAttribute id; public static volatile SingularAttribute dataset; diff --git a/dmp-backend/data/target/generated-sources/annotations/eu/eudat/data/entities/DatasetService_.java b/dmp-backend/data/target/generated-sources/annotations/eu/eudat/data/entities/DatasetService_.java index 935dd9496..e57164cba 100644 --- a/dmp-backend/data/target/generated-sources/annotations/eu/eudat/data/entities/DatasetService_.java +++ b/dmp-backend/data/target/generated-sources/annotations/eu/eudat/data/entities/DatasetService_.java @@ -10,9 +10,10 @@ import javax.persistence.metamodel.StaticMetamodel; public abstract class DatasetService_ { public static volatile SingularAttribute role; - public static volatile SingularAttribute service; + public static volatile SingularAttribute data; + public static volatile SingularAttribute service; public static volatile SingularAttribute id; - public static volatile SingularAttribute dataset; + public static volatile SingularAttribute dataset; } diff --git a/dmp-backend/data/target/generated-sources/annotations/eu/eudat/data/entities/Dataset_.java b/dmp-backend/data/target/generated-sources/annotations/eu/eudat/data/entities/Dataset_.java index 1c101f0a3..3a7abca14 100644 --- a/dmp-backend/data/target/generated-sources/annotations/eu/eudat/data/entities/Dataset_.java +++ b/dmp-backend/data/target/generated-sources/annotations/eu/eudat/data/entities/Dataset_.java @@ -15,14 +15,14 @@ public abstract class Dataset_ { public static volatile SingularAttribute dmp; public static volatile SingularAttribute created; public static volatile SingularAttribute profile; + public static volatile SetAttribute datasetDataRepositories; + public static volatile SetAttribute datasetExternalDatasets; public static volatile SingularAttribute description; public static volatile SingularAttribute label; public static volatile SetAttribute registries; - public static volatile SetAttribute services; + public static volatile SetAttribute services; public static volatile SingularAttribute uri; public static volatile SingularAttribute reference; - public static volatile SetAttribute externalDatasets; - public static volatile SetAttribute dataRepositories; public static volatile SingularAttribute isPublic; public static volatile SingularAttribute modified; public static volatile SingularAttribute id; diff --git a/dmp-backend/data/target/generated-sources/annotations/eu/eudat/data/entities/ExternalDataset_.java b/dmp-backend/data/target/generated-sources/annotations/eu/eudat/data/entities/ExternalDataset_.java index effd0cb50..0f66ab358 100644 --- a/dmp-backend/data/target/generated-sources/annotations/eu/eudat/data/entities/ExternalDataset_.java +++ b/dmp-backend/data/target/generated-sources/annotations/eu/eudat/data/entities/ExternalDataset_.java @@ -16,7 +16,7 @@ public abstract class ExternalDataset_ { public static volatile SingularAttribute modified; public static volatile SingularAttribute id; public static volatile SingularAttribute label; - public static volatile SetAttribute datasets; + public static volatile SetAttribute datasets; public static volatile SingularAttribute abbreviation; } diff --git a/dmp-backend/data/target/generated-sources/annotations/eu/eudat/data/entities/Service_.java b/dmp-backend/data/target/generated-sources/annotations/eu/eudat/data/entities/Service_.java index 83b3fa879..d95a11ff8 100644 --- a/dmp-backend/data/target/generated-sources/annotations/eu/eudat/data/entities/Service_.java +++ b/dmp-backend/data/target/generated-sources/annotations/eu/eudat/data/entities/Service_.java @@ -17,7 +17,7 @@ public abstract class Service_ { public static volatile SingularAttribute definition; public static volatile SingularAttribute id; public static volatile SingularAttribute label; - public static volatile SetAttribute datasets; + public static volatile SetAttribute services; public static volatile SingularAttribute abbreviation; public static volatile SingularAttribute uri; public static volatile SingularAttribute status; diff --git a/dmp-backend/queryable/src/main/java/eu/eudat/queryable/QueryableList.java b/dmp-backend/queryable/src/main/java/eu/eudat/queryable/QueryableList.java index 164ac1b2d..a3656d7a3 100644 --- a/dmp-backend/queryable/src/main/java/eu/eudat/queryable/QueryableList.java +++ b/dmp-backend/queryable/src/main/java/eu/eudat/queryable/QueryableList.java @@ -1,12 +1,11 @@ package eu.eudat.queryable; -import eu.eudat.queryable.predicates.*; +import eu.eudat.queryable.jpa.predicates.*; import eu.eudat.queryable.queryableentity.DataEntity; import eu.eudat.queryable.types.SelectionField; import javax.persistence.criteria.Subquery; import java.util.List; -import java.util.Set; import java.util.concurrent.CompletableFuture; public interface QueryableList { @@ -38,8 +37,6 @@ public interface QueryableList { QueryableList orderBy(OrderByPredicate predicate); - QueryableList setHints(Set hints); - QueryableList withHint(String hint); Long count(); diff --git a/dmp-backend/queryable/src/main/java/eu/eudat/queryable/hibernatequeryablelist/QueryableHibernateList.java b/dmp-backend/queryable/src/main/java/eu/eudat/queryable/jpa/hibernatequeryablelist/QueryableHibernateList.java similarity index 98% rename from dmp-backend/queryable/src/main/java/eu/eudat/queryable/hibernatequeryablelist/QueryableHibernateList.java rename to dmp-backend/queryable/src/main/java/eu/eudat/queryable/jpa/hibernatequeryablelist/QueryableHibernateList.java index 158b6ce41..7d11da36d 100644 --- a/dmp-backend/queryable/src/main/java/eu/eudat/queryable/hibernatequeryablelist/QueryableHibernateList.java +++ b/dmp-backend/queryable/src/main/java/eu/eudat/queryable/jpa/hibernatequeryablelist/QueryableHibernateList.java @@ -1,13 +1,12 @@ -package eu.eudat.queryable.hibernatequeryablelist; +package eu.eudat.queryable.jpa.hibernatequeryablelist; import eu.eudat.queryable.QueryableList; import eu.eudat.queryable.exceptions.NotSingleResultException; -import eu.eudat.queryable.predicates.*; +import eu.eudat.queryable.jpa.predicates.*; import eu.eudat.queryable.queryableentity.DataEntity; import eu.eudat.queryable.types.FieldSelectionType; import eu.eudat.queryable.types.SelectionField; -import javax.persistence.EntityGraph; import javax.persistence.EntityManager; import javax.persistence.TypedQuery; import javax.persistence.criteria.*; @@ -51,11 +50,6 @@ public class QueryableHibernateList implements QueryableLi return this; } - public QueryableList setHints(Set hints) { - this.hints = hints; - return this; - } - @Override public QueryableList withFields(List fields) { this.fields = fields; diff --git a/dmp-backend/queryable/src/main/java/eu/eudat/queryable/predicates/NestedQuerySinglePredicate.java b/dmp-backend/queryable/src/main/java/eu/eudat/queryable/jpa/predicates/NestedQuerySinglePredicate.java similarity index 88% rename from dmp-backend/queryable/src/main/java/eu/eudat/queryable/predicates/NestedQuerySinglePredicate.java rename to dmp-backend/queryable/src/main/java/eu/eudat/queryable/jpa/predicates/NestedQuerySinglePredicate.java index 5872bb07f..50eb825b0 100644 --- a/dmp-backend/queryable/src/main/java/eu/eudat/queryable/predicates/NestedQuerySinglePredicate.java +++ b/dmp-backend/queryable/src/main/java/eu/eudat/queryable/jpa/predicates/NestedQuerySinglePredicate.java @@ -1,4 +1,4 @@ -package eu.eudat.queryable.predicates; +package eu.eudat.queryable.jpa.predicates; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.Predicate; diff --git a/dmp-backend/queryable/src/main/java/eu/eudat/queryable/predicates/OrderByPredicate.java b/dmp-backend/queryable/src/main/java/eu/eudat/queryable/jpa/predicates/OrderByPredicate.java similarity index 84% rename from dmp-backend/queryable/src/main/java/eu/eudat/queryable/predicates/OrderByPredicate.java rename to dmp-backend/queryable/src/main/java/eu/eudat/queryable/jpa/predicates/OrderByPredicate.java index 1484500aa..9a83730e4 100644 --- a/dmp-backend/queryable/src/main/java/eu/eudat/queryable/predicates/OrderByPredicate.java +++ b/dmp-backend/queryable/src/main/java/eu/eudat/queryable/jpa/predicates/OrderByPredicate.java @@ -1,4 +1,4 @@ -package eu.eudat.queryable.predicates; +package eu.eudat.queryable.jpa.predicates; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.Order; diff --git a/dmp-backend/queryable/src/main/java/eu/eudat/queryable/predicates/QueryablePredicate.java b/dmp-backend/queryable/src/main/java/eu/eudat/queryable/jpa/predicates/QueryablePredicate.java similarity index 67% rename from dmp-backend/queryable/src/main/java/eu/eudat/queryable/predicates/QueryablePredicate.java rename to dmp-backend/queryable/src/main/java/eu/eudat/queryable/jpa/predicates/QueryablePredicate.java index b4e6cb9a4..288f4d5d5 100644 --- a/dmp-backend/queryable/src/main/java/eu/eudat/queryable/predicates/QueryablePredicate.java +++ b/dmp-backend/queryable/src/main/java/eu/eudat/queryable/jpa/predicates/QueryablePredicate.java @@ -1,4 +1,4 @@ -package eu.eudat.queryable.predicates; +package eu.eudat.queryable.jpa.predicates; /** * Created by ikalyvas on 2/7/2018. diff --git a/dmp-backend/queryable/src/main/java/eu/eudat/queryable/predicates/SelectPredicate.java b/dmp-backend/queryable/src/main/java/eu/eudat/queryable/jpa/predicates/SelectPredicate.java similarity index 63% rename from dmp-backend/queryable/src/main/java/eu/eudat/queryable/predicates/SelectPredicate.java rename to dmp-backend/queryable/src/main/java/eu/eudat/queryable/jpa/predicates/SelectPredicate.java index d6e561330..4b7b60980 100644 --- a/dmp-backend/queryable/src/main/java/eu/eudat/queryable/predicates/SelectPredicate.java +++ b/dmp-backend/queryable/src/main/java/eu/eudat/queryable/jpa/predicates/SelectPredicate.java @@ -1,4 +1,4 @@ -package eu.eudat.queryable.predicates; +package eu.eudat.queryable.jpa.predicates; public interface SelectPredicate { R applySelection(T item); diff --git a/dmp-backend/queryable/src/main/java/eu/eudat/queryable/predicates/SinglePredicate.java b/dmp-backend/queryable/src/main/java/eu/eudat/queryable/jpa/predicates/SinglePredicate.java similarity index 85% rename from dmp-backend/queryable/src/main/java/eu/eudat/queryable/predicates/SinglePredicate.java rename to dmp-backend/queryable/src/main/java/eu/eudat/queryable/jpa/predicates/SinglePredicate.java index 53f6f84fc..cdfde4b99 100644 --- a/dmp-backend/queryable/src/main/java/eu/eudat/queryable/predicates/SinglePredicate.java +++ b/dmp-backend/queryable/src/main/java/eu/eudat/queryable/jpa/predicates/SinglePredicate.java @@ -1,4 +1,4 @@ -package eu.eudat.queryable.predicates; +package eu.eudat.queryable.jpa.predicates; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.Predicate; diff --git a/dmp-backend/queryable/target/classes/eu/eudat/queryable/QueryableList.class b/dmp-backend/queryable/target/classes/eu/eudat/queryable/QueryableList.class index 8248c9bd4d442b355d44c18c0eed7cc52d12ba8d..0a843e149620e53e2181473acc8ace3fd4f8b8e2 100644 GIT binary patch delta 541 zcmZ9Jze@sP7{{OI&RzP#^i=yxvg(tCUYfF$IdkaNNgg8j5wJ}Dy< z$t(E9TD_#}0lkpGlEoV4Ido%Kr5{`}%5H#E!B3Ysi3e5@p|mY%QxKX%VOtflBJP_N zec6L_XAk4iklCYW$Mukrr3HO=9*=p_k)q^rEKrHt~1n~qeWb9Wja{+Tcxj{5M{w7TB^V}qv0?(xi$Y`TDN)RN+ZtLsM! zy?b(aWkzhXjvr>y?noNq1ck=GD_}zqAqwmf*qaEj%vc5==NRKStZ+^kyvjMrcnvIG eH`wY^j5lDDF1%AS3S{_qS++G;RAI|l-u?rIr-Ld0 delta 528 zcmeyXbXHmV)W2Q(7#J8#7(Cb++}Ii185vm1Gg6CE85x2nHi}NR=8&G~Z^#%6VM|S( z#csgGR-BrXnq0!j;0O}6W0IPz$SA^?GMS%A8_3h2JcUt;F%l;Ah*5{J4s^DaO zW{1h)Z1W+89O6`+=%>b*0W$Cqr}pFp?2U|RAdWRhFym|pLu#@wuj6D5E?ve#h%(j5 z0(^p#8#px>mq7#;Gj4`3dM0yoi!iQ0)u#p$oP3UZ6Jt3O+d7{0*ZW@6A`VPw!{&|_c#(##C{ z3@~v6Am5Nd1kN`C@{NJf1Cuue^UdIVb0FV>0l~Kf^Gzl@3d-u+G1$Y^IRM4&7#!hz QC!iZ3E^%gX0lUZ*0Q%p4vH$=8 diff --git a/dmp-backend/queryable/target/classes/eu/eudat/queryable/hibernatequeryablelist/QueryableHibernateList.class b/dmp-backend/queryable/target/classes/eu/eudat/queryable/hibernatequeryablelist/QueryableHibernateList.class deleted file mode 100644 index 9dfc2f717519d498cea0669a8ab7b01e83d31478..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24953 zcmc&+34B~t)j#KDl9y&)+cb0`K-;v0HqFw|(go5|x-WEZ($<0k(`4EVO=m(fffoEg zQ2_-}Q9w{p5m{6e6(}j<3PmZn;DQ^7h~O>?CmaOsV+muP^Vtd+%BP z_uO;NJ?|zDy}JLaL^R8KQx%=VC)>QBiYz{P81?cga#<*sMRHjzmnCvpDwkz)SuU3q zQL5pUHAK8F%IkSU6>sECa@THihjiE+6AJxuNz1qa>3FUXJWn|9 ziSk}PzlO^ALK%0Fw7#v1-_92c{ddUYJ8gcK&6mjYrBS|&-z}H-*nD}E=J6Fazc)%J z^OZKgFG{EI`)&S!%~wh156a*V38$;&?i#tfwu(Q@*9p(-yn7420NUjPjTG%fjGJQS>gk zyF1GJI3|~SY#ywl81I*dd*$vc!}vb_s&xID+0zfr~C4CmDQ|pii&hO}$w*aFn z(o1?`{rya%)X>(RSaN5pdWFWZ+3(y@k-k(a9j=on=O%OkjVXmhl0GiYk;yn<=~8OR zd#1|%f$av7;|ft}H{HOkx<8TJ*%RN;7w<}R#?o;pR;`s7NGEz)*8q9+TAuZ4{+jqe zYkZ(9mTp!2V%vM-t-T(N*7i)IT4F)3TFV?{x3NUp>wK;AvZ?HX+=*l-FyYfM|&6wB3?(ViB*+H!j0$(`wLrXzHJWjU*o z={U?C&{U*$?C6g};_~i9G7YjL17zFdG7ZOOzL_7O6W|k(@k}+jtza@gkxZl)FwJgI z&4rd%V7#{PX+TZZ!!VmVqBCtaCOND844(EB|W@>X@8-c_*_wP#d zGR+NkS!DuDsK6O4q3!%b8|kVNNyl~p?DF%v_Q+qBivjdPSZ}Z$9%%!M-Dd*>tz~U={RTfjxu49vOon7-cwFPpn_1n*e8=tqJ zL@hjm+1kuEY@!;UMg4n|olM(GB%c9NXDZn_(AO7FrdyY!cK7zg(~`I?ACSEjz`OFl zr%)lzCVqO;s1=vphpqMji?LzsD5iFH+CQ{ac6^b^&!LJ$yu=~yiYn?cvU!!dj>kL(@rl$(~|~jR`q(DaHf*dIG+mOXD3^$L)`HflH0FkWC2o)SN>R~ZG1t|DKKkc z$gqxgr(ahba*W`#Y`BU_FmLE{Ix?$7gZie;-($Kun`trJ@{~)4Hb+C3*8@w>Qw~@c zWXoL~tYRXTfaZa0?!{0$T-H`hhf;0Qb4kk4d&?ItX-l?>#Q`onyNUz6%ZQW|!#q}~ zfvOjQ>KM4s%3001bzC=Av}(%Y@UO}iy4bv^p#j#1bM0%fq}ZF1jXbJb8R5g!GRhKC z{i~84rmn&=O$eFg4zC?*>Jnb&R@(2Nb+GySOyhDm>PDuh7Rp4yMH&4HMZw&>NGjTb z{ji(W>{ruXg`U*0ecX)Nr+qho|?9lCI)yk6sx zSl_oaz9Tl!1N7~_ct36c_LywrGQ+SKj0WB?Bf@Yc`BtxTb$qs+nT$5ylt3-VHCKsP zHvhn@p0@fiT<1vnh`3WH1$vVo?I@OkW_fG9hKq1?1#Jyf__GIwt}C(O{#Ly=K`BQS zf|O|#{IcS5an<`si8|?V*;5*3etF~zLp=urSGseGNtfT#XJZ&@GdYZ5IyWCW&o>sF z;jU#a(OLi85J#4yU}&m*YcZ9x4EqhzQ(KuTFM6AdFBcOvzeW5HrH;B&wKleg>AYe( zWWk+d$^l@^XP%)I|U_686ba z>*jgsQe0m)Eb}`=%pp1)t^UQurY6669llw5>~&z8U%uCE{)YixM+)Z%K_;M@FPgy* z@}ZfG>Mk~AvbfU<0_0adl(D;35RxHf(AD_hgMUwK_x7$>eV+8Be#Y^tPMKAA43+zw zLK#@3N2RHCMcAFhWb&VUnToOSK%RkAG@GhQt?Ex?TCbC-0>naqDyYb4!z+;E*3U&b z$h=Mt^z_uvVOkQpv`<{}C zj~7OlWE@NhN@%KVE*OD|ZT$&M8$*@%D?cWW^Y&>u&cv|t{34urxj=ygI|JyMOnoKu zDs9GtT6^>2!mIVJpMkvJz^mWr@09geI~j}KoPp3J^I*OqmhKjHcgROurrq;95OGQq zc|pK;8Ii*%Y;@PF_!-w9RJErD`a0vw6LMtYXs=7gS%>N34IH|fe~6EOLC=uf74H&a z4qZ&|aOhofxs)z*=-qO6xm@}Qt$XQwhdxLja_If^0f&FYKgPkE#n`*_r~6{PYvbwe zR9FAV3jRqoKQ_|lpH}mU4*!gQZu2i3{v|(d^Aip|&%bi`N&YoeuBAow&O}WFb@@v)n+DO}?YWgt-S?pMrRp!vs z^jq7CI99n;;aIj+>ChkOkA-pZmS-_YypHo6YnWAq+Mi=ZEyuBj^J`2kA;ueY1(|7) zV~wyzqB2}~Q2w|t47tb z(|5$vo!vXJP`Vv!qE+WuldQ?%Fy{{uV0mmcy(&!V<#HU;oDj(3dphI2Y3#T0{WWFk z7n@Y6W0~8+G+B9xy1qERswLxHb-Po2@w#+(ELoRI#_N>ZhO@Ayfag^FZ>Z*D9cvoD zWLu4n)nqlpgsm2sur=MGw^^-7wB-$a=hP61!uHvYHN%>TC1@S*SSMJsY-_e-&9UY> z)`?gt)=3t^Gq>4Rn`6zh=7R^l9b%m9SPQUHDy&m%YoTK;;>Va4hA=GYJO|vE@ zYS#;^3Zd#bR&kd&9$LWg+#u|I$Z8luXGI@XK_!g}qpNV%G?q@`fQdG#jAN^Qfsbio z0rFB`!Wt;h!>zb5l{Ls|kP5i;cnmqr(HWIC{k9bW5smYzti{$694s}JuK;>(wikSb z^TO6rM95fgZx6nd#zGT-lBUh&qJY{lfMc03`PSv;2GMw&k7I`9&~kUI7w#%pv&$tA zOlLC2gY?lkq?e?6?rrP`Te zfYXgoc_L(1e+U`rPn?f*0v53f5~ov(`ubv+xrPSqO!bb)WGbf6pYaX_VAPGF(|{b9 z#Ze7~nX(C85h&=Cz4%^ub1Zv#l$N^u?o6A)whx`|xoy8^!HmwuL#;`m5$%N0o6}TG zC+BKY61B*Vz7&?1d$unCNIgD1&iv1+3AjxcFJGG#onZ3gZ`;h@yjP$Am zIth?7fM(jV9rOxy@E|1emFAcWW#VDNYwzbxc>4fsBB4&NqbOO_KD_QmDP^2R>_Z29 z)l<1OIPHp9zYgoig*rIxy?n!$0bN~-dV2h`ld91;Z)HXJ9f3+@QYM0rbx~LS+{lgz zvb$sb>*9N0u<*4Q6G^Iv5h_%A7Q{3#B&%=_nHHJ^IJ@@jSR`w#hatdpY^vi0)M_bboWu78Ur43oehS)l+$|AxX+ZE`x% zG2^vs2>Q}6iUFwwo>RRfBGY^W-HItU#+}Zrv@0VqaCO`wOjpZg4H7di@)q7XNLfpY z8A&D_81>_N(8(2Af<9>?PAYw5--$VQ$Jl)P&337{LaRQ5^>P z0|YB!o2ulP9gxkG!R*jO>;bi8s2LKL)9U-WBI2dBG63Q>mCzmAvgNCmt-{3 zJ5^RJyWx>b*00^LzI|24vNH{_z^+=W1U~(U?C3l-WEo}bAq)m$uWL0BtK)n7<#Anj z)uh)up_pB#h9gvw)I-R&);rb)tHa^BQl6W`vmKtnGaYW_;~kzZmA+{_#o?*k;P7#B zHyOnbZj^>ujH>)(-|r@p=cabWTi2-XF{pvYcEn^8i0}~I?LXO;Y^v9!Qo9DQ?{ror zaq3g;f#eq>9}Z$+=;>a(vFP%g9T0kSok|H#Ix!aODG2Wf0?)Tssb!qSU z0z9LN>pfqHXB1sCo>56sV^Qt)-oF$5Q26$qFTpcv;Hn?W;NJW9;5{nh-t!fBMy*)& zL*ZEcM0MP2zY6Urnd5yc-d#=C;Q3lS?WZ#QBU;$FkGSz(vbOD`vb!ka-5!Z6fqK8bfX(x<}ML>sf&%mkYg^01LvV5L_W zo14(~X}a04IUPSeZJZo7bHV1sJZ$vj`|!Eih+glftH4I8jfP-ei}hENFyz}hpGo@lto|1Z{MQ* z2>c&5NTbo`PO55Z8l*8y_tDrv8Yg{@9HiPZ3_QxBtpUkLC>vW0TU$cwXlX$D4QBG| z=yDpt*EC7E6k4W3yx(3g}~slrP7GTjNjzKqgKuL$XNfhXf#xVxM7 z85#E&8OMgo=&xIi(|Sm>0TOKtNHf-xW~?WTlOv7v($YvTUz&R$%^>_t$oiZR07S3P z%`k^8fhh{EPjPGc7tXzC`${;Qi8*Xe2b(wNVIy9&Fq`}6t45m`ev0)D2euK+dtIjK zX`RlZD8&NIhI?=hr?0_oH8bsxq)me;ZQnqfUZvl}-F@_}5Vqy{*v7$jM_#t~7hwB< z$Myj39;9y@w!Qc%+SWDRO_S7GZQ4(hbJwcx4J$C7=Jz}Id!$>g#QXC5b>IuevTsF^SfaeI0=ZGAh(x!Pzo6qyR;CZR%rB;Ba z3JHx7iG@BhJ;Qx4r+&rIcj*$)L^c17u+a*M6Zsx}-zXF`B0Jw~o`>1o6VNHsh<*Tq zK8~42^eEai+aKcYNAzP{uf?C0sh|qwyDs+p!kVUu5rA6JCz5 znL0=f7FP5$xrnd5g+}Y9L27j0HH+_yNPqk<$N#2%)I3NnvOeI%aXVeQwleI0ioh9B zxx)kmCqmv-g-q!Px)2$|Mey2hqYh+BDR^i)>) zUR&PS)Vz;o-a{u0;%^+$R=j9wu8r)Y*@0KJzif2$`yevK4@tdnY+p0(+B|Au{PWPXo+ zIQ(Id84sGWX1BT4Az@IUft46&n&nPGb8=fnZKSrs#|B_5hZN8&7R>*g(*El_p6E8=E1YgY^NZiXF}VQ;go^W1_e~aGaOCh0gr|T zN@!f7Oh{;G6A~I10w_)6DHw2C#% z>F*eUgG~mR3xK;U?5ANNDtpcwLF_@o7ys+2*6nHIX8b-{I!McOjHx_8qwx-V3e~X^ z``hIbdl1P+$RHTn3KNawQ3WK~WK1|fqa@HxxSLiE(kk6$qIo${y*yRFj2@u5F!t4w z-eTXfAFB>`ncJ4N%?GFkE z{#GMLh#>>G4$x@DcNxW(!mVZ-kF<&6y3JL57+G^(p+*>v(fKv}B|&n{=8e>OKecB~ zy4Lv@(D|3p`Ef}81a$rtbbj)%>I{XMEq9)|+4!!j-iUdI&shtvf=GEimGd3?Hu4D? z(Ofo29a0S0bjQ84d0WkveYEv!m_8jrb!qNtK=WHb^9-PQ7SQ|-(EOgd5!Cw;)-R(! zc^-yPC(@<4rC3|qG`gvg%aqp<52MQ!(n}kO^b#Xcy^uEPgu9v|##~+@367%!R#Wa- z%`;}D^#At}+z(eE+4g=U1@N?|Wv`g$0MXw7(cb~l^ML3DK=fk3dip(BT60#6v}rJ; zE#HcP^;mLT(>U5TlVJKAkF{nChEmeH79gT`V{MU^+KAbLVZEO&YyZtU9JwBNbc;A@ zThehq8V*CIg&mhkktB14fLufHm*bx4+_ZC#F})%-iS9cQp2YEOVLXAm*iac ze+m6{j>WH1hu*%~JWSgXS79|q8CyG527VT!gzA}qLT}^-=`Ff$I7nvz(nf>nnNpZ* zYLSTVl@u+pu`TUD{UX}j6}c1ojwrpwDJ-Qp-62@$67a9YSCz;L7jNh^4! zu^9-3N`sVrq+9>}=042(I zdP`Qf{)VcSKBFqR>y(82T#?x4yK=nM47H}OUcv1ie zH{KHM@+@JO0b(p|&H=)W!MeY;1oT%xsQ!F}X9=Sf5UwT25)(^El@3Ih9ULkcQvk+P zfYCsUc^d6z{qaYedCIejlxGzw4~%U&U`T&$71Cc@1^OE>&_4ji7=SSrcBp&;e+*#A z)>(EJ0jq##gi*9bu!Bbf+^lv9wUN9&A!rF*U!wTUG*gW&49^bn)nY5R(Dp0}J8!1- zg(%c?-%W|KnacA7hi+F55j31F#61qR5#O7u9GF`%1IN>GJOhqtCbjbkbTQAuui(t4 zU-MjLno=h4_YrdEI;p44Y~UT%^Z78fvGiRvFM8kXkJR%bBejuYq?#8sl55?Od=!jQ zJb9F?SLkA!kA9iXFrMrfHD%+?l*Ntx9>mP-%9xLA^9;hG=VX?Q@unI#p>Ev6>=x?E zqJdf2SeQns^CHyznNf)yK1=eH`@G$3bs>9Q0=7pqUXr zY)F4S57J++5A-+lfc|P81pP{~UZ(iVh_0%z19!zdk?Twlc?V`owth{LO$3$;Vgr`T zU4YhLkC#x+v*kStL1f0u2aRmUy z?ruI1_G=0~;WdSEZcSl?swrrx^g!Rhbd~ixsLwrw@9qb&1%AYvi3a2xZt-A+nG-Q0 zjfT9DnGiE6C&nfh8sgZAk$8sDP~gDfap7nM;CLv2tIf^aLWJQs&N8&&`$L9XawNtK zUk_$tnd);ebk6#cpl4c7jINSvosP)SQr$yi#^K_x9pzBi1JBUrxm14EF)r^MjOw=lg0Bb?8A}vv$fIMY;B@itbD>I zAd1yr#;bV^uQhi&x!c_B;vRK(0l$_1&%FDXX}y3y!Jjm(xA3jz?(^o|YW@P>VMaXQ J(R+}){~zYyB;No4 diff --git a/dmp-backend/queryable/target/classes/eu/eudat/queryable/predicates/NestedQuerySinglePredicate.class b/dmp-backend/queryable/target/classes/eu/eudat/queryable/predicates/NestedQuerySinglePredicate.class deleted file mode 100644 index ce9e6527f34b203542e12cf5adcedb0bf42fe481..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 575 zcmb`F&rZTX5XQejq=Lry243;PUN{g-IB4R@h}youvYj+bHf`PR8hH`VK8FV%z=tw! zL5YbGJaCv~X7bJCH-FwgUf%!=aTK8!;gE1FtI8~HEoWLu$Astp^;|y6CsDDjb?vxN zER@xbt(M~Q%enB{WNhP2+WWF}+XZKvTCBNZLO0QQA)U7Y@@1!x<1~#YTS-@{f8+MY z>G^UrVPuhu>1@u*#gpGDLN6)3ReYsQ813|i!_u=m&vudMA~(EV!k{?}VZ>gr&!iI% ujY!T6i|YG;wfMW9aME=63DhAFTHz%CY7_R*4)K17TId8@c@YklneHbhHNU3- diff --git a/dmp-backend/queryable/target/classes/eu/eudat/queryable/predicates/OrderByPredicate.class b/dmp-backend/queryable/target/classes/eu/eudat/queryable/predicates/OrderByPredicate.class deleted file mode 100644 index 04dd720925b7467f2b3f40da4e91853757f12099..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 476 zcmb_Z!A=4}41Gmp1IKj4L4Jh_AeCZ0?%us<-&He|?TcbT0b@@pRa06)q&yJ|F= z5Dpxgv@dPn>+9S5%PW9eTqGDII44}Hs`YA=Nr*3Niw zM)CbuG7ZM&;?jM+^Ro2m&AyJAYjzO&3$rSe4=(a=kIFyJvUGBoh~YT9YsIov#foRk zwP>GC{zHVpq6|*UgRxQYb$iA1$HP(MA7LbcCFIKUCWzaqr4_EeeXjZM6yd6w`%T^> b5IXT+0Cfo`=*IdqRvq+Wd}ayGTBQF0s6LqC diff --git a/dmp-backend/queryable/target/classes/eu/eudat/queryable/predicates/QueryablePredicate.class b/dmp-backend/queryable/target/classes/eu/eudat/queryable/predicates/QueryablePredicate.class deleted file mode 100644 index 018236f71b26d56575e700b61583111f835aa2ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 210 zcmX^0Z`VEs1_l!bPId-%b_Nbc2F~Ej^t{B9(xOyG1`V4KE1#^yvPAuy#JqHU|D>$c zg_W$iT?J1avhBFflNLNfriHFwF)4?mau! diff --git a/dmp-backend/queryable/target/classes/eu/eudat/queryable/predicates/SelectPredicate.class b/dmp-backend/queryable/target/classes/eu/eudat/queryable/predicates/SelectPredicate.class deleted file mode 100644 index 91ff6db664e2fdfcd51d9bad0d5e24a761970776..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 309 zcmZvYJqp4=5QX3P7mXqooW^2Oq$P5~o#* zC=?GK0)Ik&@+EnFdwv0Mj)M%N4Euyb-L`Hy^HN%)gAn5QW}zSSBe&u^+XbnOu<p#8k(K1E54mC z!~`|{T_TL~CVC^+)+OlU+}4$o%}!^lGZIcEvcysczK`OUdhUeVuXA_&!$de**}jh+ c5D2~WHGukr9rRPao3b7TDLzz&y>(^y4i&zeX8-^I diff --git a/dmp-backend/web/src/main/java/eu/eudat/builders/model/models/PrincipalBuilder.java b/dmp-backend/web/src/main/java/eu/eudat/builders/model/models/PrincipalBuilder.java index a53d1558e..2606ba2be 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/builders/model/models/PrincipalBuilder.java +++ b/dmp-backend/web/src/main/java/eu/eudat/builders/model/models/PrincipalBuilder.java @@ -17,6 +17,7 @@ public class PrincipalBuilder extends Builder { private UUID token; private String name; private Date expiresAt; + private String avatarUrl; private Set authorities; public PrincipalBuilder id(UUID id) { @@ -44,6 +45,11 @@ public class PrincipalBuilder extends Builder { return this; } + public PrincipalBuilder avatarUrl(String avatarUrl) { + this.avatarUrl = avatarUrl; + return this; + } + @Override public Principal build() { Principal principal = new Principal(); @@ -52,6 +58,7 @@ public class PrincipalBuilder extends Builder { principal.setExpiresAt(expiresAt); principal.setToken(token); principal.setId(id); + principal.setAvatarUrl(avatarUrl); return principal; } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/builders/model/models/RecentActivityDataBuilder.java b/dmp-backend/web/src/main/java/eu/eudat/builders/model/models/RecentActivityDataBuilder.java index 33b823027..630bd52eb 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/builders/model/models/RecentActivityDataBuilder.java +++ b/dmp-backend/web/src/main/java/eu/eudat/builders/model/models/RecentActivityDataBuilder.java @@ -13,7 +13,6 @@ public class RecentActivityDataBuilder extends Builder { private String label; private String id; private Date timestamp; - private Integer type; public String getLabel() { return label; @@ -42,22 +41,12 @@ public class RecentActivityDataBuilder extends Builder { return this; } - public Integer getType() { - return type; - } - - public RecentActivityDataBuilder type(Integer type) { - this.type = type; - return this; - } - @Override public RecentActivityData build() { RecentActivityData recentActivityData = new RecentActivityData(); recentActivityData.setLabel(label); recentActivityData.setTimestamp(timestamp); recentActivityData.setId(id); - recentActivityData.setType(type); return recentActivityData; } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/CommonController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/CommonController.java index 8aab23e44..25e8706db 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/CommonController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/CommonController.java @@ -2,8 +2,10 @@ package eu.eudat.controllers; import eu.eudat.dynamicproject.DynamicProjectConfiguration; import eu.eudat.dynamicproject.entities.Language; +import eu.eudat.managers.CommonsManager; +import eu.eudat.models.externalurl.ExternalSourcesConfiguration; import eu.eudat.models.helpers.responses.ResponseItem; -import eu.eudat.models.security.Principal; +import eu.eudat.proxy.config.configloaders.ConfigLoader; import eu.eudat.types.ApiMessageCode; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; @@ -21,10 +23,12 @@ import java.util.List; public class CommonController { private DynamicProjectConfiguration dynamicProjectConfiguration; + private ConfigLoader configLoader; @Autowired - public CommonController(DynamicProjectConfiguration dynamicProjectConfiguration) { + public CommonController(DynamicProjectConfiguration dynamicProjectConfiguration, ConfigLoader configLoader) { this.dynamicProjectConfiguration = dynamicProjectConfiguration; + this.configLoader = configLoader; } @RequestMapping(method = RequestMethod.GET, value = {"/language"}, produces = "application/json") @@ -38,4 +42,16 @@ public class CommonController { return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem>().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); } } + + @RequestMapping(method = RequestMethod.GET, value = {"/externalSourcesConfiguration"}, produces = "application/json") + public @ResponseBody + ResponseEntity> getExternalSourcesConfiguration() { + try { + ExternalSourcesConfiguration configuration = CommonsManager.getExternalSourcesConfiguration(configLoader); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE).payload(configuration)); + } catch (Exception ex) { + ex.printStackTrace(); + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); + } + } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java index 3c9f2aa31..de17ed3c3 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java @@ -8,6 +8,7 @@ import eu.eudat.data.query.items.item.dmp.DataManagementPlanCriteriaRequest; import eu.eudat.data.query.items.table.dmp.DataManagementPlanTableRequest; import eu.eudat.dynamicproject.DynamicProjectConfiguration; import eu.eudat.exceptions.datamanagementplan.DMPWithDatasetsException; +import eu.eudat.exceptions.security.UnauthorisedException; import eu.eudat.managers.DataManagementPlanManager; import eu.eudat.models.dmp.DataManagementPlan; import eu.eudat.models.helpermodels.Tuple; @@ -62,7 +63,10 @@ public class DMPs extends BaseController { eu.eudat.models.dmp.DataManagementPlan dataManagementPlan = new DataManagementPlanManager().getSingle(this.getApiContext().getOperationsContext().getDatabaseRepository().getDmpDao(), id, principal, this.dynamicProjectConfiguration); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE).payload(dataManagementPlan)); - } catch (Exception ex) { + }catch (UnauthorisedException ex) { + throw ex; + } + catch (Exception ex) { ex.printStackTrace(); return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage())); } diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/DataRepositories.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/DataRepositories.java index 58d764ae2..321561bd5 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/DataRepositories.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/DataRepositories.java @@ -26,9 +26,11 @@ public class DataRepositories extends BaseController { @RequestMapping(method = RequestMethod.GET, value = {"/external/datarepos"}, produces = "application/json") public @ResponseBody - ResponseEntity>>> listExternalDataRepositories(@RequestParam(value = "query", required = false) String query) { + ResponseEntity>>> listExternalDataRepositories( + @RequestParam(value = "query", required = false) String query,@RequestParam(value = "type", required = false) String type + ) { try { - List> remoteRepos = this.getApiContext().getOperationsContext().getRemoteFetcher().getRepositories(query); + List> remoteRepos = this.getApiContext().getOperationsContext().getRemoteFetcher().getRepositories(query,type); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>>().status(ApiMessageCode.NO_MESSAGE).payload(remoteRepos)); } catch (NoURLFound ex) { return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem>>().status(ApiMessageCode.ERROR_MESSAGE).message(ex.getMessage()).payload(null)); diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/ExternalDatasets.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/ExternalDatasets.java index 35a925fd1..b4da125f7 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/ExternalDatasets.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/ExternalDatasets.java @@ -1,8 +1,8 @@ package eu.eudat.controllers; +import eu.eudat.data.query.items.table.externaldataset.ExternalDatasetTableRequest; import eu.eudat.managers.ExternalDatasetManager; import eu.eudat.models.externaldataset.ExternalDatasetListingModel; -import eu.eudat.data.query.items.table.externaldataset.ExternalDatasetTableRequest; import eu.eudat.models.helpers.common.DataTableData; import eu.eudat.models.helpers.responses.ResponseItem; import eu.eudat.models.security.Principal; @@ -42,7 +42,9 @@ public class ExternalDatasets extends BaseController { @RequestMapping(method = RequestMethod.GET, value = {"/external/datasets"}, produces = "application/json") public @ResponseBody - ResponseEntity>> getWithExternal(@RequestParam(value = "query", required = false) String query, Principal principal) { + ResponseEntity>> getWithExternal( + @RequestParam(value = "query", required = false) String query, @RequestParam(value = "type", required = false) String type, Principal principal + ) { try { List dataTable = new ExternalDatasetManager().getWithExternal(this.getApiContext(), query, this.getApiContext().getOperationsContext().getRemoteFetcher()); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().payload(dataTable).status(ApiMessageCode.NO_MESSAGE)); diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/Organisations.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/Organisations.java index 0edc32915..f2f0c559c 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/Organisations.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/Organisations.java @@ -27,9 +27,11 @@ public class Organisations extends BaseController { @RequestMapping(method = RequestMethod.GET, value = {"/external/organisations"}, produces = "application/json") public @ResponseBody - ResponseEntity> listExternalOrganisations(@RequestParam(value = "query", required = false) String query) { + ResponseEntity> listExternalOrganisations( + @RequestParam(value = "query", required = false) String query,@RequestParam(value = "type", required = false) String type + ) { try { - List> remoteRepos = this.getApiContext().getOperationsContext().getRemoteFetcher().getOrganisations(query); + List> remoteRepos = this.getApiContext().getOperationsContext().getRemoteFetcher().getOrganisations(query,type); OrganisationsExternalSourcesModel projectsExternalSourcesModel = new OrganisationsExternalSourcesModel().fromExternalItem(remoteRepos); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(projectsExternalSourcesModel).status(ApiMessageCode.SUCCESS_MESSAGE)); } catch (NoURLFound ex) { diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/Registries.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/Registries.java index a8d09a76b..802e35b94 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/Registries.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/Registries.java @@ -27,9 +27,10 @@ public class Registries extends BaseController { @RequestMapping(method = RequestMethod.GET, value = {"/external/registries"}, produces = "application/json") public @ResponseBody - ResponseEntity> listExternalRegistries(@RequestParam(value = "query", required = false) String query) { + ResponseEntity> listExternalRegistries(@RequestParam(value = "query", required = false) String query + ,@RequestParam(value = "type", required = false) String type) { try { - List> remoteRepos = this.getApiContext().getOperationsContext().getRemoteFetcher().getRegistries(query); + List> remoteRepos = this.getApiContext().getOperationsContext().getRemoteFetcher().getRegistries(query,type); RegistriesExternalSourcesModel registriesExternalSourcesModel = new RegistriesExternalSourcesModel().fromExternalItem(remoteRepos); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(registriesExternalSourcesModel).status(ApiMessageCode.NO_MESSAGE)); } catch (NoURLFound ex) { diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/Researchers.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/Researchers.java index 182e0e2ac..aeca7dfd6 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/Researchers.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/Researchers.java @@ -34,9 +34,10 @@ public class Researchers extends BaseController { @RequestMapping(method = RequestMethod.GET, value = {"/external/researchers"}, produces = "application/json") public @ResponseBody - ResponseEntity> listExternalResearchers(@RequestParam(value = "query", required = false) String query) { + ResponseEntity> listExternalResearchers( + @RequestParam(value = "query", required = false) String query,@RequestParam(value = "type", required = false) String type) { try { - List> remoteRepos = this.getApiContext().getOperationsContext().getRemoteFetcher().getResearchers(query); + List> remoteRepos = this.getApiContext().getOperationsContext().getRemoteFetcher().getResearchers(query,type); ResearchersExternalSourcesModel researchersExternalSourcesModel = new ResearchersExternalSourcesModel().fromExternalItem(remoteRepos); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(researchersExternalSourcesModel).status(ApiMessageCode.NO_MESSAGE)); } catch (NoURLFound ex) { diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/Services.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/Services.java index 6eb9488f7..6192f333c 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/Services.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/Services.java @@ -27,9 +27,11 @@ public class Services extends BaseController { @RequestMapping(method = RequestMethod.GET, value = {"/external/services"}, produces = "application/json") public @ResponseBody - ResponseEntity> listExternalServices(@RequestParam(value = "query", required = false) String query) { + ResponseEntity> listExternalServices( + @RequestParam(value = "query", required = false) String query,@RequestParam(value = "type", required = false) String type + ) { try { - List> remoteRepos = this.getApiContext().getOperationsContext().getRemoteFetcher().getServices(query); + List> remoteRepos = this.getApiContext().getOperationsContext().getRemoteFetcher().getServices(query,type); ServiceExternalSourcesModel serviceExternalSourcesModel = new ServiceExternalSourcesModel().fromExternalItem(remoteRepos); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(serviceExternalSourcesModel).status(ApiMessageCode.NO_MESSAGE)); } catch (NoURLFound ex) { diff --git a/dmp-backend/web/src/main/java/eu/eudat/managers/CommonsManager.java b/dmp-backend/web/src/main/java/eu/eudat/managers/CommonsManager.java new file mode 100644 index 000000000..390e08f98 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/managers/CommonsManager.java @@ -0,0 +1,25 @@ +package eu.eudat.managers; + +import eu.eudat.models.externalurl.ExternalSourcesConfiguration; +import eu.eudat.proxy.config.configloaders.ConfigLoader; + +import java.util.stream.Collectors; + +/** + * Created by ikalyvas on 5/17/2018. + */ +public class CommonsManager { + + public static ExternalSourcesConfiguration getExternalSourcesConfiguration(ConfigLoader configLoader){ + ExternalSourcesConfiguration externalSourcesConfiguration = new ExternalSourcesConfiguration(); + externalSourcesConfiguration.setDataRepositories(configLoader.getExternalUrls().getRepositories().getUrls().stream() + .map(item-> new ExternalSourcesConfiguration.ExternalSourcesUrlModel(item.getKey(),item.getLabel())).collect(Collectors.toList())); + externalSourcesConfiguration.setExternalDatasets(configLoader.getExternalUrls().getDatasets().getUrls().stream() + .map(item-> new ExternalSourcesConfiguration.ExternalSourcesUrlModel(item.getKey(),item.getLabel())).collect(Collectors.toList())); + externalSourcesConfiguration.setRegistries(configLoader.getExternalUrls().getRegistries().getUrls().stream() + .map(item-> new ExternalSourcesConfiguration.ExternalSourcesUrlModel(item.getKey(),item.getLabel())).collect(Collectors.toList())); + externalSourcesConfiguration.setServices(configLoader.getExternalUrls().getServices().getUrls().stream() + .map(item-> new ExternalSourcesConfiguration.ExternalSourcesUrlModel(item.getKey(),item.getLabel())).collect(Collectors.toList())); + return externalSourcesConfiguration; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/managers/DashBoardManager.java b/dmp-backend/web/src/main/java/eu/eudat/managers/DashBoardManager.java index 7a7c33eb3..82b301729 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/managers/DashBoardManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/managers/DashBoardManager.java @@ -4,9 +4,13 @@ import eu.eudat.builders.model.models.RecentActivityDataBuilder; import eu.eudat.data.dao.entities.DMPDao; import eu.eudat.data.dao.entities.DatasetDao; import eu.eudat.data.dao.entities.ProjectDao; +import eu.eudat.data.entities.DMP; +import eu.eudat.data.entities.Dataset; import eu.eudat.data.entities.UserInfo; import eu.eudat.data.dao.criteria.DataManagementPlanCriteria; import eu.eudat.data.dao.criteria.DatasetCriteria; +import eu.eudat.data.query.definition.Query; +import eu.eudat.data.query.items.table.dataset.DatasetTableRequest; import eu.eudat.models.dashboard.recent.RecentActivity; import eu.eudat.models.dashboard.recent.RecentActivityData; import eu.eudat.models.dashboard.statistics.DashBoardStatistics; @@ -62,7 +66,6 @@ public class DashBoardManager { RecentActivity activity = new RecentActivity(); UserInfo user = new UserInfo(); user.setId(principal.getId()); - List activities = new LinkedList<>(); RecentActivityDataBuilder recentActivityDataBuilder = apiContext.getOperationsContext().getBuilderFactory().getBuilder(RecentActivityDataBuilder.class); @@ -70,27 +73,24 @@ public class DashBoardManager { .withHint("dmpRecentActivity") .orderBy((builder, root) -> builder.desc(root.get("modified"))) .take(numberofactivities) - .selectAsync(item -> recentActivityDataBuilder.label(item.getLabel()).timestamp(item.getModified()).id(item.getId().toString()).type(RecentActivityData.RecentActivityType.DMP.getValue()).build()) - .whenComplete((dmpActivities, throwable) -> activities.addAll(dmpActivities)); + .selectAsync(item -> recentActivityDataBuilder.label(item.getLabel()).timestamp(item.getModified()).id(item.getId().toString()).build()) + .whenComplete((dmpActivities, throwable) -> activity.setRecentDmpActivities(dmpActivities)); CompletableFuture> datasets = datasetRepository.getAuthenticated(datasetRepository.asQueryable(), user) .withHint("datasetRecentActivity") .orderBy((builder, root) -> builder.desc(root.get("modified"))) .take(numberofactivities) - .selectAsync(item -> recentActivityDataBuilder.label(item.getLabel()).timestamp(item.getModified()).id(item.getId().toString()).type(RecentActivityData.RecentActivityType.DATASET.getValue()).build()) - .whenComplete((datasetActivities, throwable) -> activities.addAll(datasetActivities)); + .selectAsync(item -> recentActivityDataBuilder.label(item.getLabel()).timestamp(item.getModified()).id(item.getId().toString()).build()) + .whenComplete((datasetActivities, throwable) -> activity.setRecentDatasetActivities(datasetActivities)); CompletableFuture> projects = projectRepository.getAuthenticated(projectRepository.asQueryable(), user) .withHint("projectRecentActivity") .orderBy((builder, root) -> builder.desc(root.get("modified"))) .take(numberofactivities) - .selectAsync(item -> recentActivityDataBuilder.label(item.getLabel()).timestamp(item.getModified()).id(item.getId().toString()).type(RecentActivityData.RecentActivityType.PROJECT.getValue()).build()) - .whenComplete((projectActivities, throwable) -> activities.addAll(projectActivities)); + .selectAsync(item -> recentActivityDataBuilder.label(item.getLabel()).timestamp(item.getModified()).id(item.getId().toString()).build()) + .whenComplete((projectActivities, throwable) -> activity.setRecentProjectActivities(projectActivities)); CompletableFuture.allOf(projects, dmps, datasets).join(); - Collections.sort(activities, Comparator.comparing(RecentActivityData::getTimestamp).reversed()); - activity.setRecentActivities(activities.subList(0, numberofactivities)); - return activity; } diff --git a/dmp-backend/web/src/main/java/eu/eudat/managers/DataManagementPlanManager.java b/dmp-backend/web/src/main/java/eu/eudat/managers/DataManagementPlanManager.java index ab29d774c..1b0a9e22d 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/managers/DataManagementPlanManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/managers/DataManagementPlanManager.java @@ -235,19 +235,26 @@ public class DataManagementPlanManager { newDataset.update(entityDataset); newDataset.setDmp(newDmp); newDataset.setStatus(Dataset.Status.SAVED.getValue()); - if (newDataset.getDataRepositories() != null) { - newDataset.setDataRepositories(newDataset.getDataRepositories().stream().map(item -> { + if (newDataset.getDatasetDataRepositories() != null) { + newDataset.setDatasetDataRepositories(newDataset.getDatasetDataRepositories().stream().map(item -> { DataRepository dataRepository = new DataRepository(); dataRepository.setId(item.getId()); - return dataRepository; + + DatasetDataRepository datasetDataRepository = new DatasetDataRepository(); + datasetDataRepository.setDataRepository(dataRepository); + datasetDataRepository.setDataset(newDataset); + return datasetDataRepository; }).collect(Collectors.toSet())); } - if (newDataset.getExternalDatasets() != null) { - newDataset.setExternalDatasets(newDataset.getExternalDatasets().stream().map(item -> { + if (newDataset.getDatasetExternalDatasets() != null) { + newDataset.setDatasetExternalDatasets(newDataset.getDatasetExternalDatasets().stream().map(item -> { ExternalDataset externalDataset = new ExternalDataset(); externalDataset.setId(item.getId()); - return externalDataset; + DatasetExternalDataset datasetExternalDataset = new DatasetExternalDataset(); + datasetExternalDataset.setExternalDataset(externalDataset); + datasetExternalDataset.setDataset(newDataset); + return datasetExternalDataset; }).collect(Collectors.toSet())); } @@ -263,7 +270,10 @@ public class DataManagementPlanManager { newDataset.setServices(newDataset.getServices().stream().map(item -> { Service service = new Service(); service.setId(item.getId()); - return service; + DatasetService datasetService = new DatasetService(); + datasetService.setService(service); + datasetService.setDataset(newDataset); + return datasetService; }).collect(Collectors.toSet())); } newDataset.setCreated(new Date()); diff --git a/dmp-backend/web/src/main/java/eu/eudat/managers/DatasetManager.java b/dmp-backend/web/src/main/java/eu/eudat/managers/DatasetManager.java index 1e0bf673d..ff935c8b2 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/managers/DatasetManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/managers/DatasetManager.java @@ -2,10 +2,10 @@ package eu.eudat.managers; import eu.eudat.builders.entity.UserInfoBuilder; import eu.eudat.data.dao.entities.*; +import eu.eudat.data.entities.*; import eu.eudat.documents.helpers.FileEnvelope; import eu.eudat.documents.word.WordBuilder; import eu.eudat.documents.xml.ExportXmlBuilder; -import eu.eudat.data.entities.UserInfo; import eu.eudat.models.HintedModelFactory; import eu.eudat.data.dao.criteria.DataRepositoryCriteria; import eu.eudat.data.dao.criteria.ExternalDatasetCriteria; @@ -187,8 +187,8 @@ public class DatasetManager { dataset.setCreator(userInfo); createRegistriesIfTheyDontExist(apiContext.getOperationsContext().getDatabaseRepository().getRegistryDao(), dataset); createDataRepositoriesIfTheyDontExist(apiContext.getOperationsContext().getDatabaseRepository().getDataRepositoryDao(), dataset); - createServicesIfTheyDontExist(apiContext.getOperationsContext().getDatabaseRepository().getServiceDao(), dataset); - createExternalDatasetsIfTheyDontExist(apiContext.getOperationsContext().getDatabaseRepository().getExternalDatasetDao(), dataset); + createServicesIfTheyDontExist(apiContext.getOperationsContext().getDatabaseRepository().getDatasetServiceDao(),apiContext.getOperationsContext().getDatabaseRepository().getServiceDao(), dataset); + createExternalDatasetsIfTheyDontExist(apiContext.getOperationsContext().getDatabaseRepository().getDatasetExternalDatasetDao(),apiContext.getOperationsContext().getDatabaseRepository().getExternalDatasetDao(), dataset); return apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao().createOrUpdate(dataset); } @@ -213,38 +213,69 @@ public class DatasetManager { } } - private static void createServicesIfTheyDontExist(ServiceDao serviceDao, eu.eudat.data.entities.Dataset dataset) { - if (dataset.getServices() != null && !dataset.getServices().isEmpty()) { - for (eu.eudat.data.entities.Service service : dataset.getServices()) { - ServiceCriteria criteria = new ServiceCriteria(); - criteria.setLike(service.getReference()); - List entries = serviceDao.getWithCriteria(criteria).toList(); - if (entries != null && !entries.isEmpty()) service.setId(entries.get(0).getId()); - else service = serviceDao.createOrUpdate(service); - } - } - } - private static void createDataRepositoriesIfTheyDontExist(DataRepositoryDao dataRepositoryDao, eu.eudat.data.entities.Dataset dataset) { - if (dataset.getDataRepositories() != null && !dataset.getDataRepositories().isEmpty()) { - for (eu.eudat.data.entities.DataRepository dataRepo : dataset.getDataRepositories()) { + Set datasetDataRepositories = dataset.getDatasetDataRepositories(); + dataset.setDatasetDataRepositories(new HashSet<>()); + + if (datasetDataRepositories != null && !datasetDataRepositories.isEmpty()) { + for (eu.eudat.data.entities.DatasetDataRepository datasetDataRepository : datasetDataRepositories) { DataRepositoryCriteria criteria = new DataRepositoryCriteria(); - criteria.setLike(dataRepo.getReference()); + criteria.setLike(datasetDataRepository.getDataRepository().getReference()); List entries = dataRepositoryDao.getWithCriteria(criteria).toList(); - if (entries != null && !entries.isEmpty()) dataRepo.setId(entries.get(0).getId()); - else dataRepo = dataRepositoryDao.createOrUpdate(dataRepo); + if (entries != null && !entries.isEmpty()) { + datasetDataRepository.getDataRepository().setId(entries.get(0).getId()); + datasetDataRepository.setDataset(dataset); + dataset.getDatasetDataRepositories().add(datasetDataRepository); + } + else { + DataRepository dataRepository = dataRepositoryDao.createOrUpdate(datasetDataRepository.getDataRepository()); + datasetDataRepository.setDataRepository(dataRepository); + dataset.getDatasetDataRepositories().add(datasetDataRepository); + } } } } - private static void createExternalDatasetsIfTheyDontExist(ExternalDatasetDao externalDatasetDao, eu.eudat.data.entities.Dataset dataset) { - if (dataset.getExternalDatasets() != null && !dataset.getExternalDatasets().isEmpty()) { - for (eu.eudat.data.entities.ExternalDataset externalDataset : dataset.getExternalDatasets()) { + private static void createServicesIfTheyDontExist(DatasetServiceDao datasetServiceDao,ServiceDao serviceDao, eu.eudat.data.entities.Dataset dataset) { + Set services = dataset.getServices(); + dataset.setServices(new HashSet<>()); + if (services != null && !services.isEmpty()) { + for (eu.eudat.data.entities.DatasetService datasetService : services) { + ServiceCriteria criteria = new ServiceCriteria(); + criteria.setLike(datasetService.getService().getLabel()); + List entries = serviceDao.getWithCriteria(criteria).toList(); + if (entries != null && !entries.isEmpty()){ + datasetService.getService().setId(entries.get(0).getId()); + datasetService.setDataset(dataset); + dataset.getServices().add(datasetService); + } + else { + Service service = serviceDao.createOrUpdate(datasetService.getService()); + datasetService.setService(service ); + dataset.getServices().add(datasetService); + } + } + } + } + + private static void createExternalDatasetsIfTheyDontExist(DatasetExternalDatasetDao datasetExternalDatasetDao,ExternalDatasetDao externalDatasetDao, eu.eudat.data.entities.Dataset dataset) { + Set externalDatasets = dataset.getDatasetExternalDatasets(); + dataset.setDatasetExternalDatasets(new HashSet<>()); + if (externalDatasets != null && !externalDatasets.isEmpty()) { + for (eu.eudat.data.entities.DatasetExternalDataset datasetExternalDataset : externalDatasets) { ExternalDatasetCriteria criteria = new ExternalDatasetCriteria(); - criteria.setLike(externalDataset.getReference()); + criteria.setLike(datasetExternalDataset.getExternalDataset().getLabel()); List entries = externalDatasetDao.getWithCriteria(criteria).toList(); - if (entries != null && !entries.isEmpty()) externalDataset.setId(entries.get(0).getId()); - else externalDataset = externalDatasetDao.createOrUpdate(externalDataset); + if (entries != null && !entries.isEmpty()) { + datasetExternalDataset.getExternalDataset().setId(entries.get(0).getId()); + datasetExternalDataset.setDataset(dataset); + dataset.getDatasetExternalDatasets().add(datasetExternalDataset); + } + else { + ExternalDataset externalDataset = externalDatasetDao.createOrUpdate(datasetExternalDataset.getExternalDataset()); + datasetExternalDataset.setExternalDataset(externalDataset); + dataset.getDatasetExternalDatasets().add(datasetExternalDataset); + } } } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/managers/ProjectManager.java b/dmp-backend/web/src/main/java/eu/eudat/managers/ProjectManager.java index 63c0b3de0..825b20e6c 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/managers/ProjectManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/managers/ProjectManager.java @@ -43,7 +43,6 @@ public class ProjectManager { QueryableList pagedItems = PaginationManager.applyPaging(authItems, projectTableRequest); DataTableData dataTable = new DataTableData<>(); - CompletableFuture projectsFuture = pagedItems.withHint(HintedModelFactory.getHint(ProjectListingModel.class)).selectAsync(item -> { item.setDmps(item.getDmps().stream().filter( dmp -> dmp.getCreator().getId().equals(principal.getId()) || dmp.getUsers().stream().filter(user -> user.getId().equals(principal.getId())).collect(Collectors.toList()).size() > 0) @@ -118,7 +117,7 @@ public class ProjectManager { continue; } } - + projectEntity.setType(eu.eudat.data.entities.Project.ProjectType.INTERNAL.getValue()); projectEntity.setCreationUser(userInfoRepository.find(principal.getId())); projectRepository.createOrUpdate(projectEntity); } diff --git a/dmp-backend/web/src/main/java/eu/eudat/managers/ResearcherManager.java b/dmp-backend/web/src/main/java/eu/eudat/managers/ResearcherManager.java index c8ebbb7b0..199a9d6a6 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/managers/ResearcherManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/managers/ResearcherManager.java @@ -28,7 +28,7 @@ public class ResearcherManager { QueryableList items = apiContext.getOperationsContext().getDatabaseRepository().getResearcherDao().getWithCriteria(researcherCriteriaRequest.getCriteria()); List researchers = items.select(item -> new eu.eudat.models.dmp.Researcher().fromDataModel(item)); - List> remoteRepos = remoteFetcher.getResearchers(researcherCriteriaRequest.getCriteria().getLike()); + List> remoteRepos = remoteFetcher.getResearchers(researcherCriteriaRequest.getCriteria().getLike(),null); ResearchersExternalSourcesModel researchersExternalSourcesModel = new ResearchersExternalSourcesModel().fromExternalItem(remoteRepos); for (ExternalSourcesItemModel externalListingItem : researchersExternalSourcesModel) { eu.eudat.models.dmp.Researcher researcher = apiContext.getOperationsContext().getBuilderFactory().getBuilder(ResearcherBuilder.class) diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/dashboard/recent/RecentActivity.java b/dmp-backend/web/src/main/java/eu/eudat/models/dashboard/recent/RecentActivity.java index 83eb3b4fd..d8d963d23 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/dashboard/recent/RecentActivity.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/dashboard/recent/RecentActivity.java @@ -6,13 +6,31 @@ import java.util.List; * Created by ikalyvas on 3/14/2018. */ public class RecentActivity { - private List recentActivities; + private List recentProjectActivities; + private List recentDatasetActivities; + private List recentDmpActivities; - public List getRecentActivities() { - return recentActivities; + public List getRecentProjectActivities() { + return recentProjectActivities; } - public void setRecentActivities(List recentActivities) { - this.recentActivities = recentActivities; + public void setRecentProjectActivities(List recentProjectActivities) { + this.recentProjectActivities = recentProjectActivities; + } + + public List getRecentDatasetActivities() { + return recentDatasetActivities; + } + + public void setRecentDatasetActivities(List recentDatasetActivities) { + this.recentDatasetActivities = recentDatasetActivities; + } + + public List getRecentDmpActivities() { + return recentDmpActivities; + } + + public void setRecentDmpActivities(List recentDmpActivities) { + this.recentDmpActivities = recentDmpActivities; } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/dashboard/recent/RecentActivityData.java b/dmp-backend/web/src/main/java/eu/eudat/models/dashboard/recent/RecentActivityData.java index d99aacb9e..92cc768a1 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/dashboard/recent/RecentActivityData.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/dashboard/recent/RecentActivityData.java @@ -7,37 +7,9 @@ import java.util.Date; */ public class RecentActivityData { - public enum RecentActivityType { - PROJECT(0), DATASET(1), DMP(2); - - private Integer value; - - public Integer getValue() { - return value; - } - - private RecentActivityType(int value) { - this.value = value; - } - - public static RecentActivityType fromValue(Integer value) { - switch (value) { - case 0: - return PROJECT; - case 1: - return DATASET; - case 2: - return DMP; - default: - throw new RuntimeException("Unsupported Recent Activity Status"); - } - } - } - private String label; private String id; private Date timestamp; - private Integer type; public String getId() { return id; @@ -47,14 +19,6 @@ public class RecentActivityData { this.id = id; } - public Integer getType() { - return type; - } - - public void setType(Integer type) { - this.type = type; - } - public Date getTimestamp() { return timestamp; } diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/dataset/DataRepository.java b/dmp-backend/web/src/main/java/eu/eudat/models/dataset/DataRepository.java index 221df6ef8..c1a3128e3 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/dataset/DataRepository.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/dataset/DataRepository.java @@ -1,6 +1,7 @@ package eu.eudat.models.dataset; import eu.eudat.models.DataModel; +import eu.eudat.utilities.builders.XmlBuilder; import eu.eudat.utilities.helpers.LabelGenerator; import java.util.Date; @@ -9,6 +10,7 @@ public class DataRepository implements DataModel new Registry().fromDataModel(item)).collect(Collectors.toList()); - this.dataRepositories = entity.getDataRepositories().stream().map(item -> new DataRepository().fromDataModel(item)).collect(Collectors.toList()); - this.services = entity.getServices().stream().map(item -> new Service().fromDataModel(item)).collect(Collectors.toList()); + this.dataRepositories = entity.getDatasetDataRepositories().stream().map(item -> new DataRepository().fromDataModel(item.getDataRepository())).collect(Collectors.toList()); + this.services = entity.getServices().stream().map(item -> new Service().fromDataModel(item.getService())).collect(Collectors.toList()); this.created = entity.getCreated(); return this; } @@ -165,16 +167,22 @@ public class Dataset implements DataModel()); - for (DataRepository dataRepository : this.dataRepositories) { - entity.getDataRepositories().add(dataRepository.toDataModel()); + entity.setDatasetDataRepositories(new HashSet<>()); + for (DataRepository dataRepositoryModel : this.dataRepositories) { + DatasetDataRepository datasetDataRepository = new DatasetDataRepository(); + eu.eudat.data.entities.DataRepository dataRepository = dataRepositoryModel.toDataModel(); + datasetDataRepository.setDataRepository(dataRepository); + entity.getDatasetDataRepositories().add(datasetDataRepository); } } if (!this.services.isEmpty()) { - entity.setServices(new HashSet()); - for (Service service : this.services) { - entity.getServices().add(service.toDataModel()); + entity.setServices(new HashSet()); + for (Service serviceModel : this.services) { + eu.eudat.data.entities.Service service = serviceModel.toDataModel(); + DatasetService datasetService = new DatasetService(); + datasetService.setService(service); + entity.getServices().add(datasetService); } } return entity; diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/datasetwizard/DatasetWizardModel.java b/dmp-backend/web/src/main/java/eu/eudat/models/datasetwizard/DatasetWizardModel.java index d86913688..cc205eadf 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/datasetwizard/DatasetWizardModel.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/datasetwizard/DatasetWizardModel.java @@ -1,6 +1,6 @@ package eu.eudat.models.datasetwizard; -import eu.eudat.data.entities.Dataset; +import eu.eudat.data.entities.*; import eu.eudat.models.DataModel; import eu.eudat.models.dataset.DataRepository; import eu.eudat.models.dataset.Registry; @@ -9,11 +9,11 @@ import eu.eudat.models.datasetprofile.DatasetProfileListingModel; import eu.eudat.models.dmp.DataManagementPlan; import eu.eudat.models.externaldataset.ExternalDatasetListingModel; import eu.eudat.models.user.composite.PagedDatasetProfile; +import eu.eudat.types.externalsourcetype.ExternalDatasetType; +import eu.eudat.utilities.builders.XmlBuilder; +import net.minidev.json.JSONValue; -import java.util.Date; -import java.util.HashSet; -import java.util.List; -import java.util.UUID; +import java.util.*; import java.util.stream.Collectors; @@ -157,11 +157,28 @@ public class DatasetWizardModel implements DataModel new Registry().fromDataModel(item)).collect(Collectors.toList()); - this.dataRepositories = entity.getDataRepositories().stream().map(item -> new DataRepository().fromDataModel(item)).collect(Collectors.toList()); - this.services = entity.getServices().stream().map(item -> new Service().fromDataModel(item)).collect(Collectors.toList()); + this.dataRepositories = entity.getDatasetDataRepositories().stream().map(item -> { + DataRepository dataRepository = new DataRepository().fromDataModel(item.getDataRepository()); + if(item.getData()!=null) { + Map> data = (Map>) JSONValue.parse(item.getData()); + Map values = data.get("data"); + dataRepository.setInfo(values.get("info")); + } + return dataRepository; + }).collect(Collectors.toList()); + this.services = entity.getServices().stream().map(item -> new Service().fromDataModel(item.getService())).collect(Collectors.toList()); this.created = entity.getCreated(); this.dmp = new DataManagementPlan().fromDataModel(entity.getDmp()); - this.externalDatasets = entity.getExternalDatasets().stream().map(item -> new ExternalDatasetListingModel().fromDataModel(item)).collect(Collectors.toList()); + this.externalDatasets = entity.getDatasetExternalDatasets().stream().map(item -> { + ExternalDatasetListingModel externalDatasetListingModel = new ExternalDatasetListingModel().fromDataModel(item.getExternalDataset()); + if(item.getData()!=null) { + Map> data = (Map>) JSONValue.parse(item.getData()); + Map values = data.get("data"); + externalDatasetListingModel.setInfo(values.get("info")); + externalDatasetListingModel.setType(Integer.parseInt(values.get("type"))); + } + return externalDatasetListingModel; + }).collect(Collectors.toList()); return this; } @@ -186,23 +203,43 @@ public class DatasetWizardModel implements DataModel()); - for (DataRepository dataRepository : this.dataRepositories) { - entity.getDataRepositories().add(dataRepository.toDataModel()); + entity.setDatasetDataRepositories(new HashSet()); + for (DataRepository dataRepositoryModel : this.dataRepositories) { + eu.eudat.data.entities.DataRepository dataRepository = dataRepositoryModel.toDataModel(); + DatasetDataRepository datasetDataRepository = new DatasetDataRepository(); + datasetDataRepository.setDataRepository(dataRepository); + Map> data = new HashMap<>(); + Map values = new HashMap<>(); + values.put("info",dataRepositoryModel.getInfo()); + data.put("data",values); + datasetDataRepository.setData(JSONValue.toJSONString(data)); + entity.getDatasetDataRepositories().add(datasetDataRepository); } } if (this.services != null && !this.services.isEmpty()) { - entity.setServices(new HashSet()); - for (Service service : this.services) { - entity.getServices().add(service.toDataModel()); + entity.setServices(new HashSet()); + for (Service serviceModel : this.services) { + eu.eudat.data.entities.Service service = serviceModel.toDataModel(); + DatasetService datasetService = new DatasetService(); + datasetService.setService(service); + entity.getServices().add(datasetService); } } if (this.externalDatasets != null && !this.externalDatasets.isEmpty()) { - entity.setExternalDatasets(new HashSet()); + entity.setDatasetExternalDatasets(new HashSet()); for (ExternalDatasetListingModel externalDataset : this.externalDatasets) { - entity.getExternalDatasets().add(externalDataset.toDataModel()); + ExternalDataset externalDatasetEntity = externalDataset.toDataModel(); + DatasetExternalDataset datasetExternalDataset = new DatasetExternalDataset(); + datasetExternalDataset.setExternalDataset(externalDatasetEntity); + Map> data = new HashMap<>(); + Map values = new HashMap<>(); + values.put("info",externalDataset.getInfo()); + values.put("type",externalDataset.getType().toString()); + data.put("data",values); + datasetExternalDataset.setData(JSONValue.toJSONString(data)); + entity.getDatasetExternalDatasets().add(datasetExternalDataset); } } return entity; diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/externaldataset/ExternalDatasetListingModel.java b/dmp-backend/web/src/main/java/eu/eudat/models/externaldataset/ExternalDatasetListingModel.java index b36951c3f..b78858abb 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/externaldataset/ExternalDatasetListingModel.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/externaldataset/ExternalDatasetListingModel.java @@ -2,11 +2,11 @@ package eu.eudat.models.externaldataset; import eu.eudat.data.entities.ExternalDataset; import eu.eudat.models.DataModel; +import eu.eudat.types.externalsourcetype.ExternalDatasetType; import java.util.Date; import java.util.UUID; - public class ExternalDatasetListingModel implements DataModel { private UUID id; @@ -15,6 +15,8 @@ public class ExternalDatasetListingModel implements DataModel registries; + private List dataRepositories; + private List services; + private List externalDatasets; + + public List getRegistries() { + return registries; + } + + public void setRegistries(List registries) { + this.registries = registries; + } + + public List getDataRepositories() { + return dataRepositories; + } + + public void setDataRepositories(List dataRepositories) { + this.dataRepositories = dataRepositories; + } + + public List getServices() { + return services; + } + + public void setServices(List services) { + this.services = services; + } + + public List getExternalDatasets() { + return externalDatasets; + } + + public void setExternalDatasets(List externalDatasets) { + this.externalDatasets = externalDatasets; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/listingmodels/DatasetListingModel.java b/dmp-backend/web/src/main/java/eu/eudat/models/listingmodels/DatasetListingModel.java index a96d56846..e6ef184e6 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/listingmodels/DatasetListingModel.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/listingmodels/DatasetListingModel.java @@ -111,8 +111,8 @@ public class DatasetListingModel implements DataModel new eu.eudat.models.dataset.Registry().fromDataModel(item)).collect(Collectors.toList())); - this.dataRepositories = LabelBuilder.getLabel(entity.getDataRepositories().stream().map(item -> new DataRepository().fromDataModel(item)).collect(Collectors.toList())); - this.services = LabelBuilder.getLabel(entity.getServices().stream().map(item -> new Service().fromDataModel(item)).collect(Collectors.toList())); + this.dataRepositories = LabelBuilder.getLabel(entity.getDatasetDataRepositories().stream().map(item -> new DataRepository().fromDataModel(item.getDataRepository())).collect(Collectors.toList())); + this.services = LabelBuilder.getLabel(entity.getServices().stream().map(item -> new Service().fromDataModel(item.getService())).collect(Collectors.toList())); return this; } diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/loginprovider/LoginProviderUser.java b/dmp-backend/web/src/main/java/eu/eudat/models/loginprovider/LoginProviderUser.java index 61434530a..9ff2a20d6 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/loginprovider/LoginProviderUser.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/loginprovider/LoginProviderUser.java @@ -8,6 +8,7 @@ public class LoginProviderUser { private String id; private String email; private String secret; + private String avatarUrl; private boolean isVerified; private TokenValidatorFactoryImpl.LoginProvider provider; @@ -58,4 +59,12 @@ public class LoginProviderUser { public void setSecret(String secret) { this.secret = secret; } + + public String getAvatarUrl() { + return avatarUrl; + } + + public void setAvatarUrl(String avatarUrl) { + this.avatarUrl = avatarUrl; + } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/project/Project.java b/dmp-backend/web/src/main/java/eu/eudat/models/project/Project.java index c2219d189..21a3ae513 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/project/Project.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/project/Project.java @@ -19,6 +19,8 @@ public class Project implements DataModel getDmps() { return dmps; } @@ -171,6 +181,7 @@ public class Project implements DataModel authorities; public UUID getId() { @@ -46,6 +47,14 @@ public class Principal { this.expiresAt = expiresAt; } + public String getAvatarUrl() { + return avatarUrl; + } + + public void setAvatarUrl(String avatarUrl) { + this.avatarUrl = avatarUrl; + } + public Set getAuthorities() { return authorities.stream().map(authz -> authz.getValue()).collect(Collectors.toSet()); } diff --git a/dmp-backend/web/src/main/java/eu/eudat/proxy/config/UrlConfig.java b/dmp-backend/web/src/main/java/eu/eudat/proxy/config/UrlConfig.java index 00e457655..d02c89a2f 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/proxy/config/UrlConfig.java +++ b/dmp-backend/web/src/main/java/eu/eudat/proxy/config/UrlConfig.java @@ -5,11 +5,30 @@ import javax.xml.bind.annotation.XmlElement; public class UrlConfig { + private String key; + private String label; private Integer ordinal; private String url; private String dataPath; private String paginationPath; + public String getKey() { + return key; + } + + @XmlElement(name = "key") + public void setKey(String key) { + this.key = key; + } + + public String getLabel() { + return label; + } + + @XmlElement(name = "label") + public void setLabel(String label) { + this.label = label; + } public String getUrl() { return url; diff --git a/dmp-backend/web/src/main/java/eu/eudat/proxy/fetching/RemoteFetcher.java b/dmp-backend/web/src/main/java/eu/eudat/proxy/fetching/RemoteFetcher.java index 77d61a5f0..5c02cb933 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/proxy/fetching/RemoteFetcher.java +++ b/dmp-backend/web/src/main/java/eu/eudat/proxy/fetching/RemoteFetcher.java @@ -17,6 +17,7 @@ import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.*; +import java.util.stream.Collectors; @Service public class RemoteFetcher { @@ -32,8 +33,10 @@ public class RemoteFetcher { } @Cacheable("repositories") - public List> getRepositories(String query) throws NoURLFound, HugeResultSet { - List urlConfigs = configLoader.getExternalUrls().getRepositories().getUrls(); + public List> getRepositories(String query, String key) throws NoURLFound, HugeResultSet { + List urlConfigs = + key != null ? configLoader.getExternalUrls().getRepositories().getUrls().stream().filter(item -> item.getKey().equals(key)).collect(Collectors.toList()) + : configLoader.getExternalUrls().getRepositories().getUrls(); FetchStrategy fetchStrategy = configLoader.getExternalUrls().getRepositories().getFetchMode(); return getAll(urlConfigs, fetchStrategy, query); } @@ -46,36 +49,46 @@ public class RemoteFetcher { } @Cacheable("organisations") - public List> getOrganisations(String query) throws NoURLFound, HugeResultSet { - List urlConfigs = configLoader.getExternalUrls().getOrganisations().getUrls(); + public List> getOrganisations(String query, String key) throws NoURLFound, HugeResultSet { + List urlConfigs = + key != null ? configLoader.getExternalUrls().getOrganisations().getUrls().stream().filter(item -> item.getKey().equals(key)).collect(Collectors.toList()) + : configLoader.getExternalUrls().getOrganisations().getUrls(); FetchStrategy fetchStrategy = configLoader.getExternalUrls().getOrganisations().getFetchMode(); return getAll(urlConfigs, fetchStrategy, query); } @Cacheable("registries") - public List> getRegistries(String query) throws NoURLFound, HugeResultSet { - List urlConfigs = configLoader.getExternalUrls().getRegistries().getUrls(); + public List> getRegistries(String query, String key) throws NoURLFound, HugeResultSet { + List urlConfigs = + key != null ? configLoader.getExternalUrls().getRegistries().getUrls().stream().filter(item -> item.getKey().equals(key)).collect(Collectors.toList()) + : configLoader.getExternalUrls().getRegistries().getUrls(); FetchStrategy fetchStrategy = configLoader.getExternalUrls().getRegistries().getFetchMode(); return getAll(urlConfigs, fetchStrategy, query); } @Cacheable("services") - public List> getServices(String query) throws NoURLFound, HugeResultSet { - List urlConfigs = configLoader.getExternalUrls().getServices().getUrls(); + public List> getServices(String query,String key) throws NoURLFound, HugeResultSet { + List urlConfigs = + key != null ? configLoader.getExternalUrls().getServices().getUrls().stream().filter(item -> item.getKey().equals(key)).collect(Collectors.toList()) + : configLoader.getExternalUrls().getServices().getUrls(); FetchStrategy fetchStrategy = configLoader.getExternalUrls().getServices().getFetchMode(); return getAll(urlConfigs, fetchStrategy, query); } @Cacheable("researchers") - public List> getResearchers(String query) throws NoURLFound, HugeResultSet { - List urlConfigs = configLoader.getExternalUrls().getResearchers().getUrls(); + public List> getResearchers(String query,String key) throws NoURLFound, HugeResultSet { + List urlConfigs = + key != null ? configLoader.getExternalUrls().getResearchers().getUrls().stream().filter(item -> item.getKey().equals(key)).collect(Collectors.toList()) + : configLoader.getExternalUrls().getResearchers().getUrls(); FetchStrategy fetchStrategy = configLoader.getExternalUrls().getResearchers().getFetchMode(); return getAll(urlConfigs, fetchStrategy, query); } @Cacheable("datasets") - public List> getDatasets(String query) throws NoURLFound, HugeResultSet { - List urlConfigs = configLoader.getExternalUrls().getDatasets().getUrls(); + public List> getDatasets(String query,String key) throws NoURLFound, HugeResultSet { + List urlConfigs = + key != null ? configLoader.getExternalUrls().getDatasets().getUrls().stream().filter(item -> item.getKey().equals(key)).collect(Collectors.toList()) + : configLoader.getExternalUrls().getDatasets().getUrls(); FetchStrategy fetchStrategy = configLoader.getExternalUrls().getDatasets().getFetchMode(); return getAll(urlConfigs, fetchStrategy, query); } diff --git a/dmp-backend/web/src/main/java/eu/eudat/security/validators/facebook/FacebookTokenValidator.java b/dmp-backend/web/src/main/java/eu/eudat/security/validators/facebook/FacebookTokenValidator.java index 383ac9898..1be7c2c9f 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/security/validators/facebook/FacebookTokenValidator.java +++ b/dmp-backend/web/src/main/java/eu/eudat/security/validators/facebook/FacebookTokenValidator.java @@ -19,6 +19,7 @@ import java.io.IOException; import java.security.GeneralSecurityException; import java.util.Calendar; import java.util.Date; +import java.util.Map; @Component("facebookTokenValidator") @@ -43,18 +44,21 @@ public class FacebookTokenValidator implements TokenValidator { LoginProviderUser user = new LoginProviderUser(); if (profile.getEmail() == null) throw new UnauthorisedException("Cannot login user.Facebook account did not provide email"); + user.setEmail(profile.getEmail()); user.setId(profile.getId()); user.setIsVerified(profile.isVerified()); user.setName(profile.getName()); user.setProvider(TokenValidatorFactoryImpl.LoginProvider.FACEBOOK); + String url = (String)((Map )((Map )profile.getExtraData().get("picture")).get("data")).get("url"); + user.setAvatarUrl(url); user.setSecret(credentials.getTicket()); return this.authenticationServiceImpl.Touch(user); } private User getFacebookUser(String accessToken) { - String[] fields = {"id", "email", "first_name", "last_name", "name", "verified"}; + String[] fields = {"id", "email", "first_name", "last_name", "name", "verified","picture"}; User profile = this.facebookServiceProvider.getApi(accessToken).fetchObject("me", User.class, fields); return profile; } diff --git a/dmp-backend/web/src/main/java/eu/eudat/security/validators/google/GoogleTokenValidator.java b/dmp-backend/web/src/main/java/eu/eudat/security/validators/google/GoogleTokenValidator.java index 86b8f0373..98189b74d 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/security/validators/google/GoogleTokenValidator.java +++ b/dmp-backend/web/src/main/java/eu/eudat/security/validators/google/GoogleTokenValidator.java @@ -50,6 +50,7 @@ public class GoogleTokenValidator implements TokenValidator { GoogleIdToken idToken = this.verifyUserAndGetUser(credentials.getTicket()); Payload payload = idToken.getPayload(); LoginProviderUser user = new LoginProviderUser(); + user.setAvatarUrl((String) payload.get("picture")); user.setSecret(credentials.getTicket()); user.setId( payload.getSubject()); user.setProvider(TokenValidatorFactoryImpl.LoginProvider.GOOGLE); diff --git a/dmp-backend/web/src/main/java/eu/eudat/security/validators/linkedin/LinkedInTokenValidator.java b/dmp-backend/web/src/main/java/eu/eudat/security/validators/linkedin/LinkedInTokenValidator.java index e56429db0..137061c46 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/security/validators/linkedin/LinkedInTokenValidator.java +++ b/dmp-backend/web/src/main/java/eu/eudat/security/validators/linkedin/LinkedInTokenValidator.java @@ -49,6 +49,7 @@ public class LinkedInTokenValidator implements TokenValidator { user.setEmail(linkedInProfile.getEmailAddress()); user.setId(linkedInProfile.getId()); user.setIsVerified(true); //TODO + user.setAvatarUrl(linkedInProfile.getProfilePictureUrl()); user.setName(linkedInProfile.getFirstName() + " " + linkedInProfile.getLastName()); user.setProvider(TokenValidatorFactoryImpl.LoginProvider.LINKEDIN); user.setSecret(accessGrant.getAccessToken()); diff --git a/dmp-backend/web/src/main/java/eu/eudat/security/validators/twitter/TwitterTokenValidator.java b/dmp-backend/web/src/main/java/eu/eudat/security/validators/twitter/TwitterTokenValidator.java index f68e2677d..f875c9b02 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/security/validators/twitter/TwitterTokenValidator.java +++ b/dmp-backend/web/src/main/java/eu/eudat/security/validators/twitter/TwitterTokenValidator.java @@ -53,6 +53,7 @@ public class TwitterTokenValidator implements TokenValidator { if (values.get("email") == null) throw new UnauthorisedException("Cannot login user.Twitter account did not provide email"); user.setEmail((String) values.get("email")); + user.setAvatarUrl(profile.getProfileImageUrl()); user.setIsVerified(true); //TODO user.setId(""+profile.getId()); user.setName(profile.getName()); diff --git a/dmp-backend/web/src/main/java/eu/eudat/services/operations/AuthenticationServiceImpl.java b/dmp-backend/web/src/main/java/eu/eudat/services/operations/AuthenticationServiceImpl.java index c9d6cda77..7e788a47a 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/services/operations/AuthenticationServiceImpl.java +++ b/dmp-backend/web/src/main/java/eu/eudat/services/operations/AuthenticationServiceImpl.java @@ -1,14 +1,15 @@ package eu.eudat.services.operations; +import com.fasterxml.jackson.databind.ObjectMapper; import eu.eudat.builders.entity.CredentialBuilder; import eu.eudat.builders.entity.UserInfoBuilder; import eu.eudat.builders.entity.UserTokenBuilder; import eu.eudat.builders.model.models.PrincipalBuilder; +import eu.eudat.data.dao.criteria.UserInfoCriteria; import eu.eudat.data.entities.Credential; import eu.eudat.data.entities.UserInfo; import eu.eudat.data.entities.UserRole; import eu.eudat.data.entities.UserToken; -import eu.eudat.data.dao.criteria.UserInfoCriteria; import eu.eudat.models.login.Credentials; import eu.eudat.models.loginprovider.LoginProviderUser; import eu.eudat.models.security.Principal; @@ -20,6 +21,7 @@ import org.springframework.core.env.Environment; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.io.IOException; import java.util.*; @@ -51,12 +53,17 @@ public class AuthenticationServiceImpl implements AuthenticationService { UserInfo user = this.apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().find(token.getUser().getId()); if (user == null) return null; - + String json; + try { + json = user.getAdditionalinfo() != null ? new ObjectMapper().readTree(user.getAdditionalinfo()).get("data").get("avatar").get("url").asText() : ""; + } catch (IOException e) { + json = ""; + } Principal principal = this.apiContext.getOperationsContext().getBuilderFactory().getBuilder(PrincipalBuilder.class) .id(user.getId()).token(token.getToken()) .expiresAt(token.getExpiresAt()).name(user.getName()) + .avatarUrl(json) .build(); - List userRoles = apiContext.getOperationsContext().getDatabaseRepository().getUserRoleDao().getUserRoles(user); for (UserRole item : userRoles) { if (principal.getAuthz() == null) principal.setAuthorities(new HashSet<>()); @@ -66,7 +73,7 @@ public class AuthenticationServiceImpl implements AuthenticationService { } public Principal Touch(Credentials credentials) { - Credential credential = this.apiContext.getOperationsContext().getDatabaseRepository().getCredentialDao().getLoggedInCredentials(credentials.getUsername(),credentials.getSecret(), TokenValidatorFactoryImpl.LoginProvider.NATIVELOGIN.getValue()); + Credential credential = this.apiContext.getOperationsContext().getDatabaseRepository().getCredentialDao().getLoggedInCredentials(credentials.getUsername(), credentials.getSecret(), TokenValidatorFactoryImpl.LoginProvider.NATIVELOGIN.getValue()); if (credential == null && credentials.getUsername().equals(environment.getProperty("autouser.root.username"))) { try { @@ -105,7 +112,7 @@ public class AuthenticationServiceImpl implements AuthenticationService { final Credential credential = this.apiContext.getOperationsContext().getBuilderFactory().getBuilder(CredentialBuilder.class) .id(UUID.randomUUID()).creationTime(new Date()).status(1) - .lastUpdateTime(new Date()).provider( profile.getProvider().getValue()) + .lastUpdateTime(new Date()).provider(profile.getProvider().getValue()) .secret(profile.getSecret()).externalId(profile.getId()) .build(); @@ -113,6 +120,7 @@ public class AuthenticationServiceImpl implements AuthenticationService { userInfo = this.apiContext.getOperationsContext().getBuilderFactory().getBuilder(UserInfoBuilder.class) .name(profile.getName()).verified_email(profile.getIsVerified()) .email(profile.getEmail()).created(new Date()).lastloggedin(new Date()) + .additionalinfo("{\"data\":{\"avatar\":{\"url\":\""+profile.getAvatarUrl()+"\"}}}") .authorization_level((short) 1).usertype((short) 1) .build(); @@ -128,6 +136,7 @@ public class AuthenticationServiceImpl implements AuthenticationService { } else { userInfo.setLastloggedin(new Date()); + userInfo.setAdditionalinfo("{\"data\":{\"avatar\":{\"url\":\""+profile.getAvatarUrl()+"\"}}}"); Set credentials = userInfo.getCredentials(); if (credentials.contains(credential)) { Credential oldCredential = credentials.stream().filter(item -> credential.getProvider().equals(item.getProvider())).findFirst().get(); diff --git a/dmp-backend/web/src/main/java/eu/eudat/services/operations/DatabaseRepository.java b/dmp-backend/web/src/main/java/eu/eudat/services/operations/DatabaseRepository.java index 0643d1734..cad4aa15c 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/services/operations/DatabaseRepository.java +++ b/dmp-backend/web/src/main/java/eu/eudat/services/operations/DatabaseRepository.java @@ -41,4 +41,8 @@ public interface DatabaseRepository { ContentDao getContentDao(); DMPProfileDao getDmpProfileDao(); + + DatasetExternalDatasetDao getDatasetExternalDatasetDao(); + + DatasetServiceDao getDatasetServiceDao(); } diff --git a/dmp-backend/web/src/main/java/eu/eudat/services/operations/DatabaseRepositoryImpl.java b/dmp-backend/web/src/main/java/eu/eudat/services/operations/DatabaseRepositoryImpl.java index 875f6639d..58f8f4259 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/services/operations/DatabaseRepositoryImpl.java +++ b/dmp-backend/web/src/main/java/eu/eudat/services/operations/DatabaseRepositoryImpl.java @@ -3,6 +3,7 @@ package eu.eudat.services.operations; import eu.eudat.data.dao.entities.*; import eu.eudat.data.dao.entities.security.CredentialDao; import eu.eudat.data.dao.entities.security.UserTokenDao; +import eu.eudat.data.entities.DatasetService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -30,6 +31,8 @@ public class DatabaseRepositoryImpl implements DatabaseRepository { private UserDmpDao userDmpDao; private ContentDao contentDao; private DMPProfileDao dmpProfileDao; + private DatasetExternalDatasetDao datasetExternalDatasetDao; + private DatasetServiceDao datasetServiceDao; private EntityManager entityManager; @@ -217,4 +220,24 @@ public class DatabaseRepositoryImpl implements DatabaseRepository { public void setDmpProfileDao(DMPProfileDao dmpProfileDao) { this.dmpProfileDao = dmpProfileDao; } + + @Override + public DatasetExternalDatasetDao getDatasetExternalDatasetDao() { + return datasetExternalDatasetDao; + } + + @Autowired + public void setDatasetExternalDatasetDao(DatasetExternalDatasetDao datasetExternalDatasetDao) { + this.datasetExternalDatasetDao = datasetExternalDatasetDao; + } + + @Override + public DatasetServiceDao getDatasetServiceDao() { + return datasetServiceDao; + } + + @Autowired + public void setDatasetServiceDao(DatasetServiceDao datasetServiceDao) { + this.datasetServiceDao = datasetServiceDao; + } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/types/externalsourcetype/ExternalDatasetType.java b/dmp-backend/web/src/main/java/eu/eudat/types/externalsourcetype/ExternalDatasetType.java new file mode 100644 index 000000000..468f274fc --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/types/externalsourcetype/ExternalDatasetType.java @@ -0,0 +1,31 @@ +package eu.eudat.types.externalsourcetype; + +import eu.eudat.types.ApiMessageCode; + +/** + * Created by ikalyvas on 5/28/2018. + */ +public enum ExternalDatasetType{ + + SOURCE(0), OUTPUT(1) ; + private Integer value; + + private ExternalDatasetType(Integer value) { + this.value = value; + } + + public Integer getValue() { + return value; + } + + public static ExternalDatasetType fromInteger(Integer value) { + switch (value) { + case 0: + return SOURCE; + case 1: + return OUTPUT; + default: + throw new RuntimeException("Unsupported Api Message Code"); + } + } +} \ No newline at end of file diff --git a/dmp-backend/web/src/main/java/eu/eudat/utilities/builders/XmlBuilder.java b/dmp-backend/web/src/main/java/eu/eudat/utilities/builders/XmlBuilder.java index 414eae73f..a24a2dec2 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/utilities/builders/XmlBuilder.java +++ b/dmp-backend/web/src/main/java/eu/eudat/utilities/builders/XmlBuilder.java @@ -68,6 +68,12 @@ public class XmlBuilder { } } + public static String getItemValueAsString(String xml,String name){ + Document doc = fromXml(xml); + Element root = doc.getDocumentElement(); + return root.getElementsByTagName(name).item(0).getNodeValue(); + } + public static Element getNodeFromListByTagName(NodeList list, String tagName) { for (int temp = 0; temp < list.getLength(); temp++) { Node element = list.item(temp); diff --git a/dmp-backend/web/src/main/java/eu/eudat/validators/ProjectModelValidator.java b/dmp-backend/web/src/main/java/eu/eudat/validators/ProjectModelValidator.java index 9f05cc6a6..f28c0d4e7 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/validators/ProjectModelValidator.java +++ b/dmp-backend/web/src/main/java/eu/eudat/validators/ProjectModelValidator.java @@ -16,7 +16,10 @@ public class ProjectModelValidator implements Validator { @Override public void validate(Object obj, Errors errors) { Project project = (Project) obj; - if (project.getStartDate().after(project.getEndDate())) { + if (project.getType()== eu.eudat.data.entities.Project.ProjectType.EXTERNAL.getValue()) { + errors.rejectValue("type", "project.external.edit"); + } + if (project.getStartDate() != null && project.getEndDate() != null && project.getStartDate().after(project.getEndDate())) { errors.rejectValue("startDate", "project.startDate.overlapping"); } } diff --git a/dmp-backend/web/src/main/resources/ExternalUrls.xml b/dmp-backend/web/src/main/resources/ExternalUrls.xml index 2b18d8f08..7886134bc 100644 --- a/dmp-backend/web/src/main/resources/ExternalUrls.xml +++ b/dmp-backend/web/src/main/resources/ExternalUrls.xml @@ -7,6 +7,16 @@ + cristin + + 1 + https://eestore.paas2.uninett.no/api/metadataschemarepo/ + $['data'][*]['attributes']['pid','name','uri','description'] + $['meta']['pagination']['page','pages','count'] + + + openAire + 1 https://eestore.paas2.uninett.no/api/metadataschemarepo/ $['data'][*]['attributes']['pid','name','uri','description'] @@ -23,6 +33,16 @@ + cristin + + 1 + https://eestore.paas2.uninett.no/api/projectrepo/ + $['data'][*]['attributes']['pid','name','uri','description'] + $['meta']['pagination']['page','pages','count'] + + + openAire + 1 https://eestore.paas2.uninett.no/api/projectrepo/ $['data'][*]['attributes']['pid','name','uri','description'] @@ -39,12 +59,21 @@ + cristin + + 1 + https://eestore.paas2.uninett.no/api/datarepo/ + $['data'][*]['attributes']['pid','name','uri','description'] + $['meta']['pagination']['page','pages','count'] + + + openAire + 1 https://eestore.paas2.uninett.no/api/datarepo/ $['data'][*]['attributes']['pid','name','uri','description'] $['meta']['pagination']['page','pages','count'] - FIRST @@ -55,12 +84,21 @@ + cristin + + 1 + https://eestore.paas2.uninett.no/api/servicerepo/ + $['data'][*]['attributes']['pid','name','uri','description'] + $['meta']['pagination']['page','pages','count'] + + + openAire + 1 https://eestore.paas2.uninett.no/api/servicerepo/ $['data'][*]['attributes']['pid','name','uri','description'] $['meta']['pagination']['page','pages','count'] - FIRST @@ -70,12 +108,21 @@ + cristin + + 1 + https://eestore.paas2.uninett.no/api/personrepo/ + $['data'][*]['attributes']['pid','name','uri','description'] + $['meta']['pagination']['page','pages','count'] + + + openAire + 1 https://eestore.paas2.uninett.no/api/personrepo/ $['data'][*]['attributes']['pid','name','uri','description'] $['meta']['pagination']['page','pages','count'] - FIRST @@ -85,12 +132,21 @@ + cristin + + 1 + https://eestore.paas2.uninett.no/api/organizationrepo/ + $['data'][*]['attributes']['pid','name','uri','description'] + $['meta']['pagination']['page','pages','count'] + + + openAire + 1 https://eestore.paas2.uninett.no/api/organizationrepo/ $['data'][*]['attributes']['pid','name','uri','description'] $['meta']['pagination']['page','pages','count'] - FIRST @@ -100,6 +156,16 @@ + cristin + + 1 + https://eestore.paas2.uninett.no/api/datasetrepo/ + $['data'][*]['attributes']['pid','name','uri','description'] + $['meta']['pagination']['page','pages','count'] + + + openAire + 1 https://eestore.paas2.uninett.no/api/datasetrepo/ $['data'][*]['attributes']['pid','name','uri','description'] diff --git a/dmp-backend/web/src/main/resources/application.properties b/dmp-backend/web/src/main/resources/application.properties index 28e902199..82bcaf14b 100644 --- a/dmp-backend/web/src/main/resources/application.properties +++ b/dmp-backend/web/src/main/resources/application.properties @@ -41,11 +41,11 @@ google.login.clientId=524432312250-sc9qsmtmbvlv05r44onl6l93ia3k9deo.apps.googleu ########################LINKEDIN LOGIN Properties#############################HiR4hQH9HNubKC5iKQy0l4mAZ linkedin.login.clientId=86bl8vfk77clh9 linkedin.login.clientSecret=2OCO9e3wKylW05Tt -linkedin.login.redirect_uri=http://dl043.madgik.di.uoa.gr:8080/login/linkedin +linkedin.login.redirect_uri=http://localhost:4200/login/linkedin ########################LINKEDIN LOGIN Properties############################# twitter.login.clientId=HiR4hQH9HNubKC5iKQy0l4mAZ twitter.login.clientSecret=9KZHgkqUO2QFnELSL14jeUvfUacWX23rqD8OW8X0xoRDXOSfKH -twitter.login.redirect_uri=http://dl043.madgik.di.uoa.gr:8080/login/twitter +twitter.login.redirect_uri=http://localhost:4200/login/twitter ########################Persistence/Hibernate/Batch############################## spring.profiles.active=devel ########################Persistence/Hibernate/Connection pool#################### diff --git a/dmp-backend/web/src/main/resources/messages.properties b/dmp-backend/web/src/main/resources/messages.properties index ab6b865d5..468938d70 100644 --- a/dmp-backend/web/src/main/resources/messages.properties +++ b/dmp-backend/web/src/main/resources/messages.properties @@ -7,4 +7,5 @@ datasetprofile.label.null=Dataset Profile Label cannot be null project.startDate.overlapping=Period Start cannot overlap Period dataset.public=Dataset Has Been Made Public datamanagementplannewversion.version.notacceptable=There is already a newer version than the one you submitted -datamanagementplannewversion.version.notnext=The version you submitted is not the Subsequent value \ No newline at end of file +datamanagementplannewversion.version.notnext=The version you submitted is not the Subsequent value +project.external.edit = Editing External Projects Is Not Allowed \ No newline at end of file diff --git a/dmp-backend/web/src/main/resources/messages_el.properties b/dmp-backend/web/src/main/resources/messages_el.properties index aaa8f995f..bcf07d212 100644 --- a/dmp-backend/web/src/main/resources/messages_el.properties +++ b/dmp-backend/web/src/main/resources/messages_el.properties @@ -5,4 +5,5 @@ projectTableRequest.offset.negative=Το offset του table δεν μπορει projectTableRequest.length.negative=Το μέγεθος του table δεν μπορει να ειναι αρνητικο datasetprofile.label.null=Το ονομα του ορισμου ενος Dataset δεν μπορει να ειναι κενο project.startDate.overlapping=Η Αρχικη Περιοδος δεν μπορει να ειναι Μεγαλυτερη της τελικης -dataset.public=Το Dataset δημοσιοποιηθηκε σε ολους \ No newline at end of file +dataset.public=Το Dataset δημοσιοποιηθηκε σε ολους +project.external.edit = Δεν επιτρέπεται η επεξεργασία εξωτερικών Projects \ No newline at end of file diff --git a/dmp-frontend/.angular-cli.json b/dmp-frontend/.angular-cli.json index 7e79fbe3d..5ca150f42 100644 --- a/dmp-frontend/.angular-cli.json +++ b/dmp-frontend/.angular-cli.json @@ -1,7 +1,7 @@ { "$schema": "./node_modules/@angular/cli/lib/config/schema.json", "project": { - "name": "forms-cli" + "name": "dmp-frontend" }, "apps": [ { @@ -21,8 +21,7 @@ "styles": [ "styles.scss" ], - "scripts": [ - ], + "scripts": [], "environmentSource": "environments/environment.ts", "environments": { "dev": "environments/environment.ts", @@ -58,4 +57,4 @@ "styleExt": "css", "component": {} } -} \ No newline at end of file +} diff --git a/dmp-frontend/.editorconfig b/dmp-frontend/.editorconfig new file mode 100644 index 000000000..6e87a003d --- /dev/null +++ b/dmp-frontend/.editorconfig @@ -0,0 +1,13 @@ +# Editor configuration, see http://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/dmp-frontend/.gitignore b/dmp-frontend/.gitignore index 6b6681430..eabf65e51 100644 --- a/dmp-frontend/.gitignore +++ b/dmp-frontend/.gitignore @@ -2,6 +2,7 @@ # compiled output /dist +/dist-server /tmp /out-tsc @@ -30,9 +31,9 @@ /coverage /libpeerconnection.log npm-debug.log +yarn-error.log testem.log /typings -yarn-error.log # e2e /e2e/*.js diff --git a/dmp-frontend/.vscode/launch.json b/dmp-frontend/.vscode/launch.json deleted file mode 100644 index 2ed69a337..000000000 --- a/dmp-frontend/.vscode/launch.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "version": "0.2.0", - "configurations": [ - - { - "name": "Launch Chrome", - "type": "chrome", - "request": "launch", - "url": "http://localhost:4200/#", - "webRoot": "${workspaceRoot}" - }, - { - "name": "Attach Chrome", - "type": "chrome", - "request": "attach", - "url": "http://localhost:4200/#", - "webRoot": "${workspaceRoot}" - }, - { - "name": "Launch Chrome (Test)", - "type": "chrome", - "request": "launch", - "url": "http://localhost:9876/debug.html", - "webRoot": "${workspaceRoot}" - }, - { - "name": "Launch Chrome (E2E)", - "type": "node", - "request": "launch", - "program": "${workspaceRoot}/node_modules/protractor/bin/protractor", - "protocol": "inspector", - "args": ["${workspaceRoot}/protractor.conf.js"] - } - ] - } \ No newline at end of file diff --git a/dmp-frontend/.vscode/settings.json b/dmp-frontend/.vscode/settings.json deleted file mode 100644 index 55712c19f..000000000 --- a/dmp-frontend/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "typescript.tsdk": "node_modules/typescript/lib" -} \ No newline at end of file diff --git a/dmp-frontend/README.md b/dmp-frontend/README.md index cc11afe95..6c6e271a9 100644 --- a/dmp-frontend/README.md +++ b/dmp-frontend/README.md @@ -1,6 +1,6 @@ -# Digital Management Plans editor +# DmpFrontend2 -This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 1.3.1. +This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 1.7.4. ## Development server @@ -21,7 +21,6 @@ Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github. ## Running end-to-end tests Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/). -Before running the tests make sure you are serving the app via `ng serve`. ## Further help diff --git a/dmp-frontend/e2e/app.e2e-spec.ts b/dmp-frontend/e2e/app.e2e-spec.ts index cde64bfdf..d53241eb5 100644 --- a/dmp-frontend/e2e/app.e2e-spec.ts +++ b/dmp-frontend/e2e/app.e2e-spec.ts @@ -1,6 +1,6 @@ import { AppPage } from './app.po'; -describe('forms-cli App', () => { +describe('dmp-frontend2 App', () => { let page: AppPage; beforeEach(() => { diff --git a/dmp-frontend/karma.conf.js b/dmp-frontend/karma.conf.js new file mode 100644 index 000000000..af139fada --- /dev/null +++ b/dmp-frontend/karma.conf.js @@ -0,0 +1,33 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/1.0/config/configuration-file.html + +module.exports = function (config) { + config.set({ + basePath: '', + frameworks: ['jasmine', '@angular/cli'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage-istanbul-reporter'), + require('@angular/cli/plugins/karma') + ], + client:{ + clearContext: false // leave Jasmine Spec Runner output visible in browser + }, + coverageIstanbulReporter: { + reports: [ 'html', 'lcovonly' ], + fixWebpackSourcePaths: true + }, + angularCli: { + environment: 'dev' + }, + reporters: ['progress', 'kjhtml'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false + }); +}; diff --git a/dmp-frontend/package-lock.json b/dmp-frontend/package-lock.json index 7bab9fb66..73a48530b 100644 --- a/dmp-frontend/package-lock.json +++ b/dmp-frontend/package-lock.json @@ -1,5 +1,5 @@ { - "name": "forms-cli", + "name": "dmp-frontend2", "version": "0.0.0", "lockfileVersion": 1, "requires": true, @@ -47,6 +47,15 @@ "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.3.0" } + }, + "rxjs": { + "version": "5.5.10", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.10.tgz", + "integrity": "sha512-SRjimIDUHJkon+2hFo7xnvNC4ZEHGzCRwh9P7nzX3zPkCGFEg/tuElrNR7L/rZMagnK2JeH2jQwPRpmyXyLB6A==", + "dev": true, + "requires": { + "symbol-observable": "1.0.1" + } } } }, @@ -58,20 +67,31 @@ "requires": { "@ngtools/json-schema": "^1.1.0", "rxjs": "^5.5.6" + }, + "dependencies": { + "rxjs": { + "version": "5.5.10", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.10.tgz", + "integrity": "sha512-SRjimIDUHJkon+2hFo7xnvNC4ZEHGzCRwh9P7nzX3zPkCGFEg/tuElrNR7L/rZMagnK2JeH2jQwPRpmyXyLB6A==", + "dev": true, + "requires": { + "symbol-observable": "1.0.1" + } + } } }, "@angular/animations": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-5.1.1.tgz", - "integrity": "sha512-PHLBWDnAzr5b5l52pk5ZYmv/6m0YUe2ICwu5dmbS0d8Kf5dXadMphAWCDbljMF+djGyZeFq2/dQ/t7ygYl3YuA==", + "version": "5.2.11", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-5.2.11.tgz", + "integrity": "sha512-J7wKHkFn3wV28/Y1Qm4yjGXVCwXzj1JR5DRjGDTFnxTRacUFx7Nj0ApGhN0b2+V0NOvgxQOvEW415Y22kGoblw==", "requires": { "tslib": "^1.7.1" } }, "@angular/cdk": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-5.0.1.tgz", - "integrity": "sha512-uK4Vyaf06J8KqePzq35BxMHRGolt35EnbZf9wjCs7eYaghbQ7Pk2xUGoynu5Lj1wAOn5N1/C1nT2/aAH/EE2rw==", + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-5.2.5.tgz", + "integrity": "sha512-GN8m1d+VcCE9+Bgwv06Y8YJKyZ0i9ZIq2ZPBcJYt+KVgnVVRg4JkyUNxud07LNsvzOX22DquHqmIZiC4hAG7Ag==", "requires": { "tslib": "^1.7.1" } @@ -143,45 +163,43 @@ "webpack-subresource-integrity": "^1.0.1" }, "dependencies": { - "chalk": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.2.2.tgz", - "integrity": "sha512-LvixLAQ4MYhbf7hgL4o5PeK32gJKvVzDRiSNIApDofQvyhl8adgG2lJVXn4+ekQoK7HL9RF8lqxwerpe0x2pCw==", + "rxjs": { + "version": "5.5.10", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.10.tgz", + "integrity": "sha512-SRjimIDUHJkon+2hFo7xnvNC4ZEHGzCRwh9P7nzX3zPkCGFEg/tuElrNR7L/rZMagnK2JeH2jQwPRpmyXyLB6A==", "dev": true, "requires": { - "ansi-styles": "^3.1.0", - "escape-string-regexp": "^1.0.5", - "supports-color": "^4.0.0" + "symbol-observable": "1.0.1" } } } }, "@angular/common": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-5.1.1.tgz", - "integrity": "sha512-SFRzdDthoiKaMLuV+TAwjKXFWwTRFGuidlWC3BhUf8/HzNSePAdvfdQcqbEaE5buMn403OV105S9Tyx5tILQeA==", + "version": "5.2.11", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-5.2.11.tgz", + "integrity": "sha512-LniJjGAeftUJDJh+2+LEjltcGen08C/VMxQ/eUYmesytKy1sN+MWzh3GbpKfEWtWmyUsYTG9lAAJNo3L3jPwsw==", "requires": { "tslib": "^1.7.1" } }, "@angular/compiler": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-5.1.1.tgz", - "integrity": "sha512-k4J2kRiBjtjkDcDut2JVUpqQGLJWd8j3Don+swzZHuEklbLmsVRGM6u/fmH0K9TMwKHtC5Ycap8kj4bWXUYfwg==", + "version": "5.2.11", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-5.2.11.tgz", + "integrity": "sha512-ICvB1ud1mxaXUYLb8vhJqiLhGBVocAZGxoHTglv6hMkbrRYcnlB3FZJFOzBvtj+krkd1jamoYLI43UAmesqQ6Q==", "requires": { "tslib": "^1.7.1" } }, "@angular/compiler-cli": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-5.1.1.tgz", - "integrity": "sha512-X3n1V0fAsZzJDRLM2OPiOri8rrQ2ILFS0VDqPdHMa1HbpF0ZKe1Yyux2rhGSbS83a1Eanx6RqfDkrUalKEprbw==", + "version": "5.2.11", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-5.2.11.tgz", + "integrity": "sha512-dwrQ0yxoCM/XzKzlm7pTsyg4/6ECjT9emZufGj8t12bLMO8NDn1IJOsqXJA1+onEgQKhlr0Ziwi+96TvDTb1Cg==", "dev": true, "requires": { "chokidar": "^1.4.2", "minimist": "^1.2.0", "reflect-metadata": "^0.1.2", - "tsickle": "^0.25.5" + "tsickle": "^0.27.2" }, "dependencies": { "minimist": { @@ -193,71 +211,79 @@ } }, "@angular/core": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-5.1.1.tgz", - "integrity": "sha512-8HJ0lNM5Z+pf+JfOl5mAWgNfrdtnMhVcEGCEniJAQweKOfYCziuyB0ALkX/Q6jGmd2IshR36SarwCYEc5ttt/w==", + "version": "5.2.11", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-5.2.11.tgz", + "integrity": "sha512-h2vpvXNAdOqKzbVaZcHnHGMT5A8uDnizk6FgGq6SPyw9s3d+/VxZ9LJaPjUk3g2lICA7og1tUel+2YfF971MlQ==", + "requires": { + "tslib": "^1.7.1" + } + }, + "@angular/flex-layout": { + "version": "5.0.0-beta.14", + "resolved": "https://registry.npmjs.org/@angular/flex-layout/-/flex-layout-5.0.0-beta.14.tgz", + "integrity": "sha512-/fsOqXFUKdCmzzZx0bZ0HCYwcV+BSbVuIgOhaCrZKHj2rqiWKKPgj1ErU3HMT68bBBGag0u0skTdLGtrBorRIA==", "requires": { "tslib": "^1.7.1" } }, "@angular/forms": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-5.1.1.tgz", - "integrity": "sha512-4iN/8N0DgnV82XIb/8PqlFIGrog8BHJlzQ9sdAlpT29biPFezFpqpsXkjLBouBc7oBFTgoyXMgWDj8IGRmwLGQ==", + "version": "5.2.11", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-5.2.11.tgz", + "integrity": "sha512-wBllFlIubPclAFRXUc84Kc7TMeKOftzrQraVZ7ooTNeFLLa/FZLN2K8HGyRde8X/XDsMu1XAmjNfkz++spwTzA==", "requires": { "tslib": "^1.7.1" } }, "@angular/http": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@angular/http/-/http-5.1.1.tgz", - "integrity": "sha512-oeiLX00TaFlGS5Y4EAGnxxVitN8T9X8olhSC+XDDAAL3JHTAyh4dj7me8vNZk1VaqPFa9AXu4D34vu1Zsm0c1g==", + "version": "5.2.11", + "resolved": "https://registry.npmjs.org/@angular/http/-/http-5.2.11.tgz", + "integrity": "sha512-eR7wNXh1+6MpcQNb3sq4bJVX03dx50Wl3kpPG+Q7N1VSL0oPQSobaTrR17ac3oFCEfSJn6kkUCqtUXha6wcNHg==", "requires": { "tslib": "^1.7.1" } }, "@angular/language-service": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-5.1.1.tgz", - "integrity": "sha512-DWdUdOV8hxBs7D84V6pNR8KJbfdAWlwO1tzL2Rfpsdv/ZpkIFAOIc4BWpF7XhOtFqlnO8IVy5gg3ZFdUrnWu+w==", + "version": "5.2.11", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-5.2.11.tgz", + "integrity": "sha512-tgnFAhwBmUs1W0dmcmlBmUlMaOgkoyuSdrcF23lz8W5+nSLb+LnbH5a3blU2NVqA4ESvLKQkPW5dpKa/LuhrPQ==", "dev": true }, "@angular/material": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-5.0.1.tgz", - "integrity": "sha512-k95i58ZIVneLE61a5JliM10NSasy9P5C2JJUESo3s/rxt9dq/9XOWpUvNCy49OHYBRFJBlsyrLM6E2V7/tmq4w==", + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-5.2.5.tgz", + "integrity": "sha512-IltfBeTJWnmZehOQNQ7KoFs7MGWuZTe0g21hIitGkusVNt1cIoTD24xKH5jwztjH19c04IgiwonpurMKM6pBCQ==", "requires": { "tslib": "^1.7.1" } }, "@angular/platform-browser": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-5.1.1.tgz", - "integrity": "sha512-QpkNXoO2pqURQJxXPhZo6RFeirKbr56O0SwoMpYfXGGN1qEIicoWZHobCUTp7/jvjx5Xjc7886Fvu/qJrE7wVA==", + "version": "5.2.11", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-5.2.11.tgz", + "integrity": "sha512-6YZ4IpBFqXx88vEzBZG2WWnaSYXbFWDgG0iT+bZPHAfwsbmqbcMcs7Ogu+XZ4VmK02dTqbrFh7U4P2W+sqrzow==", "requires": { "tslib": "^1.7.1" } }, "@angular/platform-browser-dynamic": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-5.1.1.tgz", - "integrity": "sha512-xnin1eK5nF7EO4tYZvRlhT28DyhL3p4NKWsZQwfqyBwSF0T2mJ1vjhjCZVT0MmaOyt5D+0eUkHIhBDqeZyBMMQ==", + "version": "5.2.11", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-5.2.11.tgz", + "integrity": "sha512-5kKPNULcXNwkyBjpHfF+pq+Yxi8Zl866YSOK9t8txoiQ9Ctw97kMkEJcTetk6MJgBp/NP3YyjtoTAm8oXLerug==", "requires": { "tslib": "^1.7.1" } }, "@angular/router": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-5.1.1.tgz", - "integrity": "sha512-96mBZS1b1Dt7HFOGKh5zI/1U6F3zT4cdjIaBmcCKkbyKhs3WRAPXxxCkuCwr6lWmBeQt4iEvSdXiHQbD0iCG7Q==", + "version": "5.2.11", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-5.2.11.tgz", + "integrity": "sha512-NT8xYl7Vr3qPygisek3PlXqNROEjg48GXOEsDEc7c8lDBo3EB9Tf328fWJD0GbLtXZNhmmNNxwIe+qqPFFhFAA==", "requires": { "tslib": "^1.7.1" } }, "@covalent/core": { - "version": "1.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@covalent/core/-/core-1.0.0-rc.1.tgz", - "integrity": "sha1-majfr1PoModZlV7EBM4KwMjmDSU=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@covalent/core/-/core-1.0.0.tgz", + "integrity": "sha512-qUGL6CtyHNa3ttKGrvuQY0lJyQR9Dxp04vP0vrXmYrKapVbfYZ82qwJ2+PrX1EcWAQ6b/B2giFe0Q83ePin04g==", "requires": { "tslib": "^1.7.1" } @@ -282,30 +308,23 @@ "source-map": "^0.5.6", "tree-kill": "^1.0.0", "webpack-sources": "^1.1.0" - }, - "dependencies": { - "chalk": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.2.2.tgz", - "integrity": "sha512-LvixLAQ4MYhbf7hgL4o5PeK32gJKvVzDRiSNIApDofQvyhl8adgG2lJVXn4+ekQoK7HL9RF8lqxwerpe0x2pCw==", - "dev": true, - "requires": { - "ansi-styles": "^3.1.0", - "escape-string-regexp": "^1.0.5", - "supports-color": "^4.0.0" - } - } } }, "@ngx-translate/core": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-9.0.1.tgz", - "integrity": "sha1-AA8thjxMlMgY4UFu9DzKLFwMWEg=" + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-10.0.1.tgz", + "integrity": "sha1-nzo+0HfoR90NKVGmZNpu40igbSI=", + "requires": { + "tslib": "^1.9.0" + } }, "@ngx-translate/http-loader": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@ngx-translate/http-loader/-/http-loader-2.0.0.tgz", - "integrity": "sha1-nBbQfNBwxnraJwoulAKB64JrP0M=" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@ngx-translate/http-loader/-/http-loader-3.0.1.tgz", + "integrity": "sha1-ILD5i8bCUyESnT4zAqs8xInApCo=", + "requires": { + "tslib": "^1.9.0" + } }, "@schematics/angular": { "version": "0.3.2", @@ -333,54 +352,61 @@ "rxjs": "^5.5.6", "semver": "^5.3.0", "semver-intersect": "^1.1.2" + }, + "dependencies": { + "rxjs": { + "version": "5.5.10", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.10.tgz", + "integrity": "sha512-SRjimIDUHJkon+2hFo7xnvNC4ZEHGzCRwh9P7nzX3zPkCGFEg/tuElrNR7L/rZMagnK2JeH2jQwPRpmyXyLB6A==", + "dev": true, + "requires": { + "symbol-observable": "1.0.1" + } + } } }, - "@types/arrify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/arrify/-/arrify-1.0.2.tgz", - "integrity": "sha512-gB1Oqypj/WbMjnWyCcvQdynRyfusKtqzUpt+EN/OtgFcjikC7ZV4qzS3SLbO1Ai2B0iVSgWvwR9A49lZGfivYg==", - "dev": true - }, - "@types/diff": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@types/diff/-/diff-3.2.2.tgz", - "integrity": "sha512-q3zfJvaTroV5BjAAR+peTHEGAAhGrPX0z2EzCzpt2mwFA+qzUn2nigJLqSekXRtdULKmT8am7zjvTMZSapIgHw==", - "dev": true + "@swimlane/ngx-datatable": { + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/@swimlane/ngx-datatable/-/ngx-datatable-11.3.2.tgz", + "integrity": "sha512-Fn1RMJ991elSvp+LV2SGzG28ypuLM2DFyXAb7o8p4kzuhqtELwB25doXrLLVrtE2QtKmzoD9fRfbEUNsBKgoWA==" }, "@types/file-saver": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@types/file-saver/-/file-saver-1.3.0.tgz", "integrity": "sha512-fC12hKtEzVkrV/ZRcrmqvpHG/TMYDZtgpAmgMUA4F7KneDaQeFMwmPz8AfygKKJMqsdTi8bL+E+fciaaMLxUhg==" }, - "@types/minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=", + "@types/jasmine": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-2.8.7.tgz", + "integrity": "sha512-RdbrPcW1aD78UmdLiDa9ZCKrbR5Go8PXh6GCpb4oIOkWVEusubSJJDrP4c5RYOu8m/CBz+ygZpicj6Pgms5a4Q==", "dev": true }, - "@types/mkdirp": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-0.5.2.tgz", - "integrity": "sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==", + "@types/jasminewd2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.3.tgz", + "integrity": "sha512-hYDVmQZT5VA2kigd4H4bv7vl/OhlympwREUemqBdOqtrYTo5Ytm12a5W5/nGgGYdanGVxj0x/VhZ7J3hOg/YKg==", "dev": true, "requires": { - "@types/node": "*" + "@types/jasmine": "*" } }, "@types/node": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.5.1.tgz", - "integrity": "sha512-SrmAO+NhnsuG/6TychSl2VdxBZiw/d6V+8j+DFo8O3PwFi+QeYXWHhAw+b170aSc6zYab6/PjEWRZHIDN9mNUw==", + "version": "6.0.110", + "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.110.tgz", + "integrity": "sha512-LiaH3mF+OAqR+9Wo1OTJDbZDtCewAVjTbMhF1ZgUJ3fc8xqOJq6VqbpBh9dJVCVzByGmYIg2fREbuXNX0TKiJA==", "dev": true }, - "@types/source-map-support": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@types/source-map-support/-/source-map-support-0.4.0.tgz", - "integrity": "sha512-9oVAi1Jlr274pbMGPEe0S3IPImV9knVNafa6E4MookD/fjOZAE6EmLkFX5ZjtZ9OXNPi2FCIZzUSMvwAUUKeSg==", - "dev": true, - "requires": { - "@types/node": "*" - } + "@types/q": { + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", + "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", + "dev": true + }, + "@types/selenium-webdriver": { + "version": "2.53.43", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-2.53.43.tgz", + "integrity": "sha512-UBYHWph6P3tutkbXpW6XYg9ZPbTKjw/YC2hGG1/GEvWwTbvezBUv3h+mmUFw79T3RFPnmedpiXdOBbXX+4l0jg==", + "dev": true }, "@types/strip-bom": { "version": "3.0.0", @@ -394,16 +420,6 @@ "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", "dev": true }, - "@types/v8flags": { - "version": "github:types/npm-v8flags#de224ae1cd5fd7dbb4e7158a6cc7a29e5315930d", - "from": "@types/v8flags@github:types/npm-v8flags#de224ae1cd5fd7dbb4e7158a6cc7a29e5315930d", - "dev": true - }, - "@types/yn": { - "version": "github:types/npm-yn#ca75f6c82940fae6a06fb41d2d37a6aa9b4ea8e9", - "from": "@types/yn@github:types/npm-yn#ca75f6c82940fae6a06fb41d2d37a6aa9b4ea8e9", - "dev": true - }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -443,16 +459,52 @@ } } }, - "ajv": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.4.0.tgz", - "integrity": "sha1-06/3jpJ3VJdx2vAWTP9ISCt1T8Y=", + "addressparser": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/addressparser/-/addressparser-1.0.1.tgz", + "integrity": "sha1-R6++GiqSYhkdtoOOT9HTm0CCF0Y=", + "dev": true, + "optional": true + }, + "adm-zip": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.4.tgz", + "integrity": "sha1-ph7VrmkFw66lizplfSUDMJEFJzY=", + "dev": true + }, + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", + "dev": true + }, + "agent-base": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.0.tgz", + "integrity": "sha512-c+R/U5X+2zz2+UCrCFv6odQzJdoqI+YecuhnAJLa1zYaMc13zPfwMwZrr91Pd1DYNo/yPRbiM4WVf9whgwFsIg==", "dev": true, "requires": { - "fast-deep-equal": "^1.0.0", + "es6-promisify": "^5.0.0" + } + }, + "ajv": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.0.tgz", + "integrity": "sha512-VDUX1oSajablmiyFyED9L1DFndg0P9h7p1F+NO8FkIzei6EPrR6Zu1n18rd5P8PqaSRd/FrWv3G1TVBqpM83gA==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.3.0", - "uri-js": "^3.0.2" + "uri-js": "^4.2.1" + }, + "dependencies": { + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + } } }, "ajv-keywords": { @@ -478,6 +530,49 @@ "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", "dev": true }, + "amqplib": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/amqplib/-/amqplib-0.5.2.tgz", + "integrity": "sha512-l9mCs6LbydtHqRniRwYkKdqxVa6XMz3Vw1fh+2gJaaVgTM6Jk3o8RccAKWKtlhT1US5sWrFh+KKxsVUALURSIA==", + "dev": true, + "optional": true, + "requires": { + "bitsyntax": "~0.0.4", + "bluebird": "^3.4.6", + "buffer-more-ints": "0.0.2", + "readable-stream": "1.x >=1.1.9", + "safe-buffer": "^5.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true, + "optional": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true, + "optional": true + } + } + }, "ansi-html": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", @@ -491,9 +586,9 @@ "dev": true }, "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" @@ -515,6 +610,15 @@ "integrity": "sha1-zWLc+OT9WkF+/GZNLlsQZTxlG0Y=", "dev": true }, + "append-transform": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", + "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", + "dev": true, + "requires": { + "default-require-extensions": "^1.0.0" + } + }, "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", @@ -583,6 +687,12 @@ "es-abstract": "^1.7.0" } }, + "array-slice": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", + "dev": true + }, "array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", @@ -604,6 +714,12 @@ "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", "dev": true }, + "arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", + "dev": true + }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", @@ -655,6 +771,13 @@ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true }, + "ast-types": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.11.3.tgz", + "integrity": "sha512-XA5o5dsNw8MhyW0Q7MWXJWc4oOzZKbdsEJq45h7c8q/d9DwWZ5F2ugUc1PuMLPGsUnphCt/cNDHu8JeBbxf1qA==", + "dev": true, + "optional": true + }, "async": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", @@ -677,6 +800,12 @@ "dev": true, "optional": true }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", + "dev": true + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -715,6 +844,28 @@ "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==", "dev": true }, + "axios": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.15.3.tgz", + "integrity": "sha1-LJ1jiy4ZGgjqHWzJiOrda6W9wFM=", + "dev": true, + "optional": true, + "requires": { + "follow-redirects": "1.0.0" + }, + "dependencies": { + "follow-redirects": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.0.0.tgz", + "integrity": "sha1-jjQpjL0uF28lTv/sdaHHjMhJ/Tc=", + "dev": true, + "optional": true, + "requires": { + "debug": "^2.2.0" + } + } + } + }, "babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", @@ -767,14 +918,6 @@ "lodash": "^4.17.4", "source-map": "^0.5.7", "trim-right": "^1.0.1" - }, - "dependencies": { - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true - } } }, "babel-messages": { @@ -844,6 +987,12 @@ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", "dev": true }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "dev": true + }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -903,6 +1052,12 @@ "kind-of": "^6.0.2" } }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", @@ -911,12 +1066,24 @@ } } }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "dev": true + }, "base64-js": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", "dev": true }, + "base64id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", + "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", + "dev": true + }, "batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", @@ -933,6 +1100,15 @@ "tweetnacl": "^0.14.3" } }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "dev": true, + "requires": { + "callsite": "1.0.0" + } + }, "big.js": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", @@ -945,6 +1121,63 @@ "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", "dev": true }, + "bitsyntax": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/bitsyntax/-/bitsyntax-0.0.4.tgz", + "integrity": "sha1-6xDMb4K4xJDj6FaY8H6D1G4MuoI=", + "dev": true, + "optional": true, + "requires": { + "buffer-more-ints": "0.0.2" + } + }, + "bl": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.1.2.tgz", + "integrity": "sha1-/cqHGplxOqANGeO7ukHER4emU5g=", + "dev": true, + "optional": true, + "requires": { + "readable-stream": "~2.0.5" + }, + "dependencies": { + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true, + "optional": true + }, + "readable-stream": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", + "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true, + "optional": true + } + } + }, + "blob": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", + "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=", + "dev": true + }, "block-stream": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", @@ -955,6 +1188,23 @@ "inherits": "~2.0.0" } }, + "blocking-proxy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz", + "integrity": "sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, "bluebird": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", @@ -1023,9 +1273,9 @@ } }, "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { "balanced-match": "^1.0.0", @@ -1152,12 +1402,43 @@ "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", "dev": true }, + "buffer-more-ints": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-0.0.2.tgz", + "integrity": "sha1-JrOIXRD6E9t/wBquOquHAZngEkw=", + "dev": true + }, "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", "dev": true }, + "buildmail": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/buildmail/-/buildmail-4.0.1.tgz", + "integrity": "sha1-h393OLeHKYccmhBeO4N9K+EaenI=", + "dev": true, + "optional": true, + "requires": { + "addressparser": "1.0.1", + "libbase64": "0.1.0", + "libmime": "3.0.0", + "libqp": "1.1.0", + "nodemailer-fetch": "1.6.0", + "nodemailer-shared": "1.1.0", + "punycode": "1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true, + "optional": true + } + } + }, "builtin-modules": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", @@ -1212,6 +1493,14 @@ "to-object-path": "^0.3.0", "union-value": "^1.0.0", "unset-value": "^1.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } } }, "cache-loader": { @@ -1226,6 +1515,12 @@ "schema-utils": "^0.4.2" } }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", + "dev": true + }, "camel-case": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", @@ -1253,17 +1548,16 @@ } }, "caniuse-lite": { - "version": "1.0.30000833", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000833.tgz", - "integrity": "sha512-tKNuKu4WLImh4NxoTgntxFpDrRiA0Q6Q1NycNhuMST0Kx+Pt8YnRDW6V8xsyH6AtO2CpAoibatEk5eaEhP3O1g==", + "version": "1.0.30000842", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000842.tgz", + "integrity": "sha512-juspQHLwQRgptEM03HN66SpM/ggZUB+m49NAgJIaIS11aXVNeRB57sEY1X6tEzeK2THGvYWKZZu1wIbh+W7YTA==", "dev": true }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true, - "optional": true + "dev": true }, "center-align": { "version": "0.1.3", @@ -1276,40 +1570,14 @@ } }, "chalk": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", - "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.2.2.tgz", + "integrity": "sha512-LvixLAQ4MYhbf7hgL4o5PeK32gJKvVzDRiSNIApDofQvyhl8adgG2lJVXn4+ekQoK7HL9RF8lqxwerpe0x2pCw==", "dev": true, "requires": { "ansi-styles": "^3.1.0", "escape-string-regexp": "^1.0.5", "supports-color": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "supports-color": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.2.1.tgz", - "integrity": "sha512-qxzYsob3yv6U+xMzPrv170y8AwGP7i74g+pbixCfD6rgso8BscLT2qXIuz6TpOaiJZ3mFgT5O9lyT9nMU4LfaA==", - "dev": true, - "requires": { - "has-flag": "^2.0.0" - } - } } }, "chokidar": { @@ -1327,23 +1595,6 @@ "is-glob": "^2.0.0", "path-is-absolute": "^1.0.0", "readdirp": "^2.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } } }, "chownr": { @@ -1368,6 +1619,12 @@ "integrity": "sha512-yEFtUNUYT4jBykEX5ZOHw+5goA3glGZr9wAXIQqoyakjz5H5TeUmScnWRc52douAhb9eYzK3s7V6bXfNnjFdzg==", "dev": true }, + "circular-json": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.4.tgz", + "integrity": "sha512-vnJA8KS0BfOihugYEUkLRcnmq21FbuivbxgzDLXNs3zIk4KllV4Mx4UuTzBXht9F00C7QfD1YqMXg1zP6EXpig==", + "dev": true + }, "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", @@ -1388,6 +1645,12 @@ "requires": { "is-descriptor": "^0.1.0" } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true } } }, @@ -1429,6 +1692,15 @@ "shallow-clone": "^1.0.0" }, "dependencies": { + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", @@ -1450,16 +1722,16 @@ "dev": true }, "codelyzer": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-4.0.2.tgz", - "integrity": "sha512-nYwOr49+IV09e7C4aXkVALRz0+XpHqZiUUcxHuDZH4xP1FBcHINyr3qvVhv5Gfm7XRmoLx32tsIhrQhW/gBcog==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-4.3.0.tgz", + "integrity": "sha512-RLMrtLwrBS0dfo2/KTP+2NHofCpzcuh0bEp/A/naqvQonbUL4AW/qWQdbpn8dMNudtpmzEx9eS8KEpGdVPg1BA==", "dev": true, "requires": { "app-root-path": "^2.0.1", "css-selector-tokenizer": "^0.7.0", "cssauron": "^1.4.0", "semver-dsl": "^1.0.1", - "source-map": "^0.5.6", + "source-map": "^0.5.7", "sprintf-js": "^1.0.3" } }, @@ -1474,9 +1746,9 @@ } }, "color-convert": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", - "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", "dev": true, "requires": { "color-name": "^1.1.1" @@ -1488,6 +1760,21 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, + "combine-lists": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/combine-lists/-/combine-lists-1.0.1.tgz", + "integrity": "sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y=", + "dev": true, + "requires": { + "lodash": "^4.5.0" + } + }, "combined-stream": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", @@ -1498,9 +1785,9 @@ } }, "commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", "dev": true }, "common-tags": { @@ -1518,12 +1805,30 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, + "compare-versions": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.2.1.tgz", + "integrity": "sha512-2y2nHcopMG/NAyk6vWXlLs86XeM9sik4jmx1tKIgzMi9/RQ2eo758RGpxQO3ErihHmg0RlQITPqgz73y6s7quA==", + "dev": true + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", + "dev": true + }, "component-emitter": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", "dev": true }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", + "dev": true + }, "compressible": { "version": "2.0.13", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.13.tgz", @@ -1546,6 +1851,14 @@ "on-headers": "~1.0.1", "safe-buffer": "5.1.1", "vary": "~1.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true + } } }, "concat-map": { @@ -1566,6 +1879,41 @@ "typedarray": "^0.0.6" } }, + "connect": { + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", + "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.0", + "parseurl": "~1.3.2", + "utils-merge": "1.0.1" + }, + "dependencies": { + "finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", + "unpipe": "~1.0.0" + } + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true + } + } + }, "connect-history-api-fallback": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", @@ -1657,12 +2005,29 @@ "minimatch": "^3.0.4", "p-limit": "^1.0.0", "serialize-javascript": "^1.4.0" + }, + "dependencies": { + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + } } }, "core-js": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", - "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=" + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.6.tgz", + "integrity": "sha512-lQUVfQi0aLix2xpyjrrJEvfuYCqPc/HwmTKsC/VNf8q0zsjX7SQZtp4+oRONN5Tsur9GDETPjj+Ub2iDiGZfSQ==" }, "core-object": { "version": "3.1.5", @@ -1703,9 +2068,9 @@ } }, "create-ecdh": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.1.tgz", - "integrity": "sha512-iZvCCg8XqHQZ1ioNBTzXS/cQSkqkqcPs8xSX4upNB+DAk9Ht3uzQf2J32uAHNCne8LDmKr29AgZrEs4oIrwLuQ==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", "dev": true, "requires": { "bn.js": "^4.1.0", @@ -1843,6 +2208,12 @@ "array-find-index": "^1.0.1" } }, + "custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "dev": true + }, "cyclist": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", @@ -1875,6 +2246,19 @@ } } }, + "data-uri-to-buffer": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-1.2.0.tgz", + "integrity": "sha512-vKQ9DTQPN1FLYiiEEOQ6IBGFqvjCa5rSK3cWMy/Nespm5d/x3dGFT9UBZnkLxCwua/IXBi2TYnwTEpsOvhC4UQ==", + "dev": true, + "optional": true + }, + "date-format": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-1.2.0.tgz", + "integrity": "sha1-YV6CjiM90aubua4JUODOzPpuytg=", + "dev": true + }, "date-now": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", @@ -1908,6 +2292,22 @@ "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", "dev": true }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true, + "optional": true + }, + "default-require-extensions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", + "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", + "dev": true, + "requires": { + "strip-bom": "^2.0.0" + } + }, "define-properties": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", @@ -1957,6 +2357,12 @@ "kind-of": "^6.0.2" } }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", @@ -1965,6 +2371,27 @@ } } }, + "degenerator": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-1.0.4.tgz", + "integrity": "sha1-/PSQo37OJmRk2cxDGrmMWBnO0JU=", + "dev": true, + "optional": true, + "requires": { + "ast-types": "0.x.x", + "escodegen": "1.x.x", + "esprima": "3.x.x" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true, + "optional": true + } + } + }, "del": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", @@ -2057,10 +2484,16 @@ "integrity": "sha1-ogM8CcyOFY03dI+951B4Mr1s4Sc=", "dev": true }, + "di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "dev": true + }, "diff": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.0.tgz", - "integrity": "sha512-w0XZubFWn0Adlsapj9EAWX0FqWdO4tz8kc3RiYdWLh4k/V8PTb6i0SMgXt0vRM3zyKnT8tKO7mUlieRQHIjMNg==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, "diffie-hellman": { @@ -2126,6 +2559,18 @@ } } }, + "dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "dev": true, + "requires": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, "dom-serializer": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", @@ -2175,10 +2620,17 @@ "domelementtype": "1" } }, + "double-ended-queue": { + "version": "2.1.0-0", + "resolved": "https://registry.npmjs.org/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz", + "integrity": "sha1-ED01J/0xUo9AGIEwyEHv3XgmTlw=", + "dev": true, + "optional": true + }, "duplexify": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.4.tgz", - "integrity": "sha512-JzYSLYMhoVVBe8+mbHQ4KgpvHpm0DZpJuL8PY93Vyv1fW7jYJ90LoXa1di/CVbJM+TgMs91rbDapE/RNIfnJsA==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", + "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", "dev": true, "requires": { "end-of-stream": "^1.0.0", @@ -2204,15 +2656,15 @@ "dev": true }, "ejs": { - "version": "2.5.9", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.9.tgz", - "integrity": "sha512-GJCAeDBKfREgkBtgrYSf9hQy9kTb3helv0zGdzqhM7iAkW8FA/ZF97VQDbwFiwIT8MQLLOe5VlPZOEvZAqtUAQ==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz", + "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==", "dev": true }, "electron-to-chromium": { - "version": "1.3.45", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.45.tgz", - "integrity": "sha1-RYrBscXHYM6IEaFtK/vZfsMLr7g=", + "version": "1.3.47", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.47.tgz", + "integrity": "sha1-dk6IfKkQTQGgrI6r7n38DizhQQQ=", "dev": true }, "elliptic": { @@ -2257,6 +2709,75 @@ "once": "^1.4.0" } }, + "engine.io": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.1.5.tgz", + "integrity": "sha512-D06ivJkYxyRrcEe0bTpNnBQNgP9d3xog+qZlLbui8EsMr/DouQpf5o9FzJnWYHEYE0YsFHllUv2R1dkgYZXHcA==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "base64id": "1.0.0", + "cookie": "0.3.1", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.0", + "uws": "~9.14.0", + "ws": "~3.3.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "engine.io-client": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.1.6.tgz", + "integrity": "sha512-hnuHsFluXnsKOndS4Hv6SvUrgdYx1pk2NqfaDMW+GWdgfU3+/V25Cj7I8a0x92idSpa5PIhJRKxPvp9mnoLsfg==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.1", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "~3.3.1", + "xmlhttprequest-ssl": "~1.5.4", + "yeast": "0.1.2" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "engine.io-parser": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.2.tgz", + "integrity": "sha512-dInLFzr80RijZ1rGpx1+56/uFoH7/7InhH3kZt+Ms6hT8tNx3NGW/WNSA/f8As1WkOfkuyb3tnRyuXGxusclMw==", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.4", + "has-binary2": "~1.0.2" + } + }, "enhanced-resolve": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", @@ -2269,6 +2790,12 @@ "tapable": "^0.2.7" } }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "dev": true + }, "entities": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", @@ -2353,6 +2880,21 @@ "event-emitter": "~0.3.5" } }, + "es6-promise": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", + "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==", + "dev": true + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dev": true, + "requires": { + "es6-promise": "^4.0.3" + } + }, "es6-set": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", @@ -2400,6 +2942,36 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, + "escodegen": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz", + "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==", + "dev": true, + "optional": true, + "requires": { + "esprima": "^3.1.3", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true, + "optional": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, "escope": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", @@ -2514,6 +3086,56 @@ } } }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-braces": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz", + "integrity": "sha1-SIsdHSRRyz06axks/AMPRMWFX+o=", + "dev": true, + "requires": { + "array-slice": "^0.2.3", + "array-unique": "^0.2.1", + "braces": "^0.1.2" + }, + "dependencies": { + "braces": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz", + "integrity": "sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY=", + "dev": true, + "requires": { + "expand-range": "^0.1.0" + } + }, + "expand-range": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz", + "integrity": "sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ=", + "dev": true, + "requires": { + "is-number": "^0.1.1", + "repeat-string": "^0.2.2" + } + }, + "is-number": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz", + "integrity": "sha1-aaevEWlj1HIG7JvZtIoUIW8eOAY=", + "dev": true + }, + "repeat-string": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz", + "integrity": "sha1-x6jTI2BoNiBZp+RlH8aITosftK4=", + "dev": true + } + } + }, "expand-brackets": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", @@ -2581,6 +3203,12 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", "dev": true + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true } } }, @@ -2618,14 +3246,6 @@ "dev": true, "requires": { "is-extglob": "^1.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - } } }, "extract-text-webpack-plugin": { @@ -2681,6 +3301,13 @@ "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", "dev": true }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true, + "optional": true + }, "fastparse": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", @@ -2711,34 +3338,40 @@ "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-1.3.3.tgz", "integrity": "sha1-zdTETTqiZOrC9o7BZbx5HDSvEjI=" }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, "filename-regex": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", "dev": true }, + "fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "dev": true, + "requires": { + "glob": "^7.0.3", + "minimatch": "^3.0.3" + } + }, "fill-range": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", "dev": true, "requires": { "is-number": "^2.1.0", "isobject": "^2.0.0", - "randomatic": "^1.1.3", + "randomatic": "^3.0.0", "repeat-element": "^1.1.2", "repeat-string": "^1.5.2" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } } }, "finalhandler": { @@ -2813,9 +3446,9 @@ "dev": true }, "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", "dev": true, "requires": { "for-in": "^1.0.1" @@ -2875,6 +3508,15 @@ "readable-stream": "^2.0.0" } }, + "fs-access": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", + "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", + "dev": true, + "requires": { + "null-check": "^1.0.0" + } + }, "fs-extra": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", @@ -2905,14 +3547,14 @@ "dev": true }, "fsevents": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.3.tgz", - "integrity": "sha512-X+57O5YkDTiEQGiw8i7wYc2nQgweIekqkepI8Q3y4wVlurgBt2SuwxTeYUYMZIGpLZH3r/TsMjczCMXE5ZOt7Q==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", + "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", "dev": true, "optional": true, "requires": { "nan": "^2.9.2", - "node-pre-gyp": "^0.9.0" + "node-pre-gyp": "^0.10.0" }, "dependencies": { "abbrev": { @@ -2993,7 +3635,7 @@ } }, "deep-extend": { - "version": "0.4.2", + "version": "0.5.1", "bundled": true, "dev": true, "optional": true @@ -3171,7 +3813,7 @@ } }, "node-pre-gyp": { - "version": "0.9.1", + "version": "0.10.0", "bundled": true, "dev": true, "optional": true, @@ -3280,12 +3922,12 @@ "optional": true }, "rc": { - "version": "1.2.6", + "version": "1.2.7", "bundled": true, "dev": true, "optional": true, "requires": { - "deep-extend": "~0.4.0", + "deep-extend": "^0.5.1", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" @@ -3445,6 +4087,46 @@ "rimraf": "2" } }, + "ftp": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", + "integrity": "sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=", + "dev": true, + "optional": true, + "requires": { + "readable-stream": "1.1.x", + "xregexp": "2.0.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true, + "optional": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true, + "optional": true + } + } + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -3512,6 +4194,21 @@ "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", "dev": true }, + "get-uri": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-2.0.2.tgz", + "integrity": "sha512-ZD325dMZOgerGqF/rF6vZXyFGTAay62svjQIT+X/oU2PtxYpFxvSkbsdi+oxIrsNxlZVd4y8wUDqkaExWTI/Cw==", + "dev": true, + "optional": true, + "requires": { + "data-uri-to-buffer": "1", + "debug": "2", + "extend": "3", + "file-uri-to-path": "1", + "ftp": "~0.3.10", + "readable-stream": "2" + } + }, "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", @@ -3557,23 +4254,6 @@ "requires": { "glob-parent": "^2.0.0", "is-glob": "^2.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } } }, "glob-parent": { @@ -3583,23 +4263,6 @@ "dev": true, "requires": { "is-glob": "^2.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } } }, "globals": { @@ -3646,19 +4309,99 @@ "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=", "dev": true }, + "handlebars": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", + "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", + "dev": true, + "requires": { + "async": "^1.4.0", + "optimist": "^0.6.1", + "source-map": "^0.4.4", + "uglify-js": "^2.6" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true, + "optional": true + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "optional": true, + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "optional": true, + "requires": { + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "optional": true + } + } + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "optional": true, + "requires": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } + } + } + }, "har-schema": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", - "dev": true, - "optional": true + "dev": true }, "har-validator": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", "dev": true, - "optional": true, "requires": { "ajv": "^4.9.1", "har-schema": "^1.0.5" @@ -3669,7 +4412,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", "dev": true, - "optional": true, "requires": { "co": "^4.6.0", "json-stable-stringify": "^1.0.1" @@ -3695,6 +4437,29 @@ "ansi-regex": "^2.0.0" } }, + "has-binary2": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "dev": true, + "requires": { + "isarray": "2.0.1" + }, + "dependencies": { + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + } + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "dev": true + }, "has-flag": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", @@ -3716,6 +4481,14 @@ "get-value": "^2.0.6", "has-values": "^1.0.0", "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } } }, "has-values": { @@ -3797,6 +4570,17 @@ "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", "dev": true }, + "hipchat-notifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hipchat-notifier/-/hipchat-notifier-1.1.0.tgz", + "integrity": "sha1-ttJJdVQ3wZEII2d5nTupoPI7Ix4=", + "dev": true, + "optional": true, + "requires": { + "lodash": "^4.0.0", + "request": "^2.0.0" + } + }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", @@ -3814,6 +4598,15 @@ "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", "dev": true }, + "homedir-polyfill": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", + "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, "hosted-git-info": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", @@ -3851,14 +4644,6 @@ "param-case": "2.1.x", "relateurl": "0.2.x", "uglify-js": "3.3.x" - }, - "dependencies": { - "commander": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", - "dev": true - } } }, "html-webpack-plugin": { @@ -3971,6 +4756,27 @@ "requires-port": "^1.0.0" } }, + "http-proxy-agent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "dev": true, + "requires": { + "agent-base": "4", + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, "http-proxy-middleware": { "version": "0.17.4", "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz", @@ -3983,6 +4789,12 @@ "micromatch": "^2.3.11" }, "dependencies": { + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, "is-glob": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", @@ -4005,12 +4817,49 @@ "sshpk": "^1.7.0" } }, + "httpntlm": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/httpntlm/-/httpntlm-1.6.1.tgz", + "integrity": "sha1-rQFScUOi6Hc8+uapb1hla7UqNLI=", + "dev": true, + "requires": { + "httpreq": ">=0.4.22", + "underscore": "~1.7.0" + } + }, + "httpreq": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/httpreq/-/httpreq-0.4.24.tgz", + "integrity": "sha1-QzX/2CzZaWaKOUZckprGHWOTYn8=", + "dev": true + }, "https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", "dev": true }, + "https-proxy-agent": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", + "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", + "dev": true, + "requires": { + "agent-base": "^4.1.0", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, "iconv-lite": { "version": "0.4.19", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", @@ -4042,6 +4891,12 @@ "dev": true, "optional": true }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "dev": true + }, "import-local": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", @@ -4080,6 +4935,13 @@ "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", "dev": true }, + "inflection": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz", + "integrity": "sha1-ogCTVlbW9fa8TcdQLhrstwMihBY=", + "dev": true, + "optional": true + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -4096,6 +4958,12 @@ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, "internal-ip": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz", @@ -4163,9 +5031,9 @@ } }, "is-buffer": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", - "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, "is-builtin-module": { @@ -4245,9 +5113,9 @@ "dev": true }, "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", "dev": true }, "is-finite": { @@ -4269,12 +5137,12 @@ } }, "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "^2.1.1" + "is-extglob": "^1.0.0" } }, "is-my-ip-valid": { @@ -4355,6 +5223,14 @@ "dev": true, "requires": { "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } } }, "is-posix-bracket": { @@ -4427,6 +5303,12 @@ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, + "isbinaryfile": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.2.tgz", + "integrity": "sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE=", + "dev": true + }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -4434,10 +5316,13 @@ "dev": true }, "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } }, "isstream": { "version": "0.1.2", @@ -4445,6 +5330,26 @@ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, + "istanbul-api": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.1.tgz", + "integrity": "sha512-duj6AlLcsWNwUpfyfHt0nWIeRiZpuShnP40YTxOGQgtaN8fd6JYSxsvxUphTDy8V5MfDXo4s/xVCIIvVCO808g==", + "dev": true, + "requires": { + "async": "^2.1.4", + "compare-versions": "^3.1.0", + "fileset": "^2.0.2", + "istanbul-lib-coverage": "^1.2.0", + "istanbul-lib-hook": "^1.2.0", + "istanbul-lib-instrument": "^1.10.1", + "istanbul-lib-report": "^1.1.4", + "istanbul-lib-source-maps": "^1.2.4", + "istanbul-reports": "^1.3.0", + "js-yaml": "^3.7.0", + "mkdirp": "^0.5.1", + "once": "^1.4.0" + } + }, "istanbul-instrumenter-loader": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-3.0.1.tgz", @@ -4486,6 +5391,15 @@ "integrity": "sha512-GvgM/uXRwm+gLlvkWHTjDAvwynZkL9ns15calTrmhGgowlwJBbWMYzWbKqE2DT6JDP1AFXKa+Zi0EkqNCUqY0A==", "dev": true }, + "istanbul-lib-hook": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.0.tgz", + "integrity": "sha512-p3En6/oGkFQV55Up8ZPC2oLxvgSxD8CzA0yBrhRZSh3pfv3OFj9aSGVC0yoerAi/O4u7jUVnOGVX1eVFM+0tmQ==", + "dev": true, + "requires": { + "append-transform": "^0.4.0" + } + }, "istanbul-lib-instrument": { "version": "1.10.1", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz", @@ -4501,10 +5415,104 @@ "semver": "^5.3.0" } }, + "istanbul-lib-report": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.4.tgz", + "integrity": "sha512-Azqvq5tT0U09nrncK3q82e/Zjkxa4tkFZv7E6VcqP0QCPn6oNljDPfrZEC/umNXds2t7b8sRJfs6Kmpzt8m2kA==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^1.2.0", + "mkdirp": "^0.5.1", + "path-parse": "^1.0.5", + "supports-color": "^3.1.2" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.4.tgz", + "integrity": "sha512-UzuK0g1wyQijiaYQxj/CdNycFhAd2TLtO2obKQMTZrZ1jzEMRY3rvpASEKkaxbRR6brvdovfA03znPa/pXcejg==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "istanbul-lib-coverage": "^1.2.0", + "mkdirp": "^0.5.1", + "rimraf": "^2.6.1", + "source-map": "^0.5.3" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "istanbul-reports": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.3.0.tgz", + "integrity": "sha512-y2Z2IMqE1gefWUaVjrBm0mSKvUkaBy9Vqz8iwr/r40Y9hBbIteH5wqHG/9DLTfJ9xUnUT2j7A3+VVJ6EaYBllA==", + "dev": true, + "requires": { + "handlebars": "^4.0.3" + } + }, + "jasmine": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", + "integrity": "sha1-awicChFXax8W3xG4AUbZHU6Lij4=", + "dev": true, + "requires": { + "exit": "^0.1.2", + "glob": "^7.0.6", + "jasmine-core": "~2.8.0" + } + }, + "jasmine-core": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", + "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=", + "dev": true + }, + "jasmine-spec-reporter": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-4.2.1.tgz", + "integrity": "sha512-FZBoZu7VE5nR7Nilzy+Np8KuVIOxF4oXDPDknehCYBDE080EnlPu0afdZNmpGDBRCUBv3mj5qgqCRmk6W/K8vg==", + "dev": true, + "requires": { + "colors": "1.1.2" + } + }, + "jasminewd2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", + "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=", + "dev": true + }, "js-base64": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.3.tgz", - "integrity": "sha512-H7ErYLM34CvDMto3GbD6xD0JLUGYXR3QTcH6B/tr4Hi/QpSThnCsIp+Sy5FRTw3B0d6py4HcNkW7nO/wdtGWEw==", + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.5.tgz", + "integrity": "sha512-aUnNwqMOXw3yvErjMPSQu6qIIzUmT1e5KcU1OZxRDU1g/am6mzBvcrmLAYwzmB59BHPrh5/tKaiF4OPhqRWESQ==", "dev": true, "optional": true }, @@ -4532,9 +5540,9 @@ "optional": true }, "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", "dev": true }, "json-loader": { @@ -4560,7 +5568,6 @@ "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", "dev": true, - "optional": true, "requires": { "jsonify": "~0.0.0" } @@ -4596,8 +5603,7 @@ "version": "0.0.0", "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true, - "optional": true + "dev": true }, "jsonpointer": { "version": "4.0.1", @@ -4626,13 +5632,162 @@ } } }, - "karma-source-map-support": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.2.0.tgz", - "integrity": "sha1-G/gee7SwiWJ6s1LsQXnhF8QGpUA=", + "jszip": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.1.5.tgz", + "integrity": "sha512-5W8NUaFRFRqTOL7ZDDrx5qWHJyBXy6velVudIzQUSoqAAYqzSh2Z7/m0Rf1QbmQJccegD0r+YZxBjzqoBiEeJQ==", "dev": true, "requires": { - "source-map-support": "^0.4.1" + "core-js": "~2.3.0", + "es6-promise": "~3.0.2", + "lie": "~3.1.0", + "pako": "~1.0.2", + "readable-stream": "~2.0.6" + }, + "dependencies": { + "core-js": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.3.0.tgz", + "integrity": "sha1-+rg/uwstjchfpjbEudNMdUIMbWU=", + "dev": true + }, + "es6-promise": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz", + "integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "readable-stream": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", + "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "karma": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/karma/-/karma-2.0.2.tgz", + "integrity": "sha1-TS25QChQpmVR+nhLAWT7CCTtjEs=", + "dev": true, + "requires": { + "bluebird": "^3.3.0", + "body-parser": "^1.16.1", + "chokidar": "^1.4.1", + "colors": "^1.1.0", + "combine-lists": "^1.0.0", + "connect": "^3.6.0", + "core-js": "^2.2.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.0", + "expand-braces": "^0.1.1", + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "http-proxy": "^1.13.0", + "isbinaryfile": "^3.0.0", + "lodash": "^4.17.4", + "log4js": "^2.3.9", + "mime": "^1.3.4", + "minimatch": "^3.0.2", + "optimist": "^0.6.1", + "qjobs": "^1.1.4", + "range-parser": "^1.2.0", + "rimraf": "^2.6.0", + "safe-buffer": "^5.0.1", + "socket.io": "2.0.4", + "source-map": "^0.6.1", + "tmp": "0.0.33", + "useragent": "2.2.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "karma-chrome-launcher": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz", + "integrity": "sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==", + "dev": true, + "requires": { + "fs-access": "^1.0.0", + "which": "^1.2.1" + } + }, + "karma-coverage-istanbul-reporter": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-1.4.3.tgz", + "integrity": "sha1-O13/RmT6W41RlrmInj9hwforgNk=", + "dev": true, + "requires": { + "istanbul-api": "^1.3.1", + "minimatch": "^3.0.4" + } + }, + "karma-jasmine": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-1.1.2.tgz", + "integrity": "sha1-OU8rJf+0pkS5rabyLUQ+L9CIhsM=", + "dev": true + }, + "karma-jasmine-html-reporter": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-0.2.2.tgz", + "integrity": "sha1-SKjl7xiAdhfuK14zwRlMNbQ5Ukw=", + "dev": true, + "requires": { + "karma-jasmine": "^1.0.2" + } + }, + "karma-source-map-support": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.3.0.tgz", + "integrity": "sha512-HcPqdAusNez/ywa+biN4EphGz62MmQyPggUsDfsHqa7tSe4jdsxgvTKuDfIazjL+IOxpVWyT7Pr4dhAV+sxX5Q==", + "dev": true, + "requires": { + "source-map-support": "^0.5.5" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", + "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + } } }, "killable": { @@ -4692,6 +5847,48 @@ "pify": "^3.0.0" } }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "optional": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "libbase64": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/libbase64/-/libbase64-0.1.0.tgz", + "integrity": "sha1-YjUag5VjrF/1vSbxL2Dpgwu3UeY=", + "dev": true + }, + "libmime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/libmime/-/libmime-3.0.0.tgz", + "integrity": "sha1-UaGp50SOy9Ms2lRCFnW7IbwJPaY=", + "dev": true, + "requires": { + "iconv-lite": "0.4.15", + "libbase64": "0.1.0", + "libqp": "1.1.0" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz", + "integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es=", + "dev": true + } + } + }, + "libqp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/libqp/-/libqp-1.1.0.tgz", + "integrity": "sha1-9ebgatdLeU+1tbZpiL9yjvHe2+g=", + "dev": true + }, "license-webpack-plugin": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-1.3.1.tgz", @@ -4701,6 +5898,15 @@ "ejs": "^2.5.7" } }, + "lie": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=", + "dev": true, + "requires": { + "immediate": "~3.0.5" + } + }, "load-json-file": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", @@ -4781,6 +5987,163 @@ "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=", "dev": true }, + "log4js": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-2.6.1.tgz", + "integrity": "sha512-BOoWTr8gxJ9XRkQr/f68KUciHR6qnLESgbXuoD7VAhtu/aMq5kD1WD7IFMMaKjCDKLUHsjwT3V2cw34ENiJKig==", + "dev": true, + "requires": { + "amqplib": "^0.5.2", + "axios": "^0.15.3", + "circular-json": "^0.5.4", + "date-format": "^1.2.0", + "debug": "^3.1.0", + "hipchat-notifier": "^1.1.0", + "loggly": "^1.1.0", + "mailgun-js": "^0.18.0", + "nodemailer": "^2.5.0", + "redis": "^2.7.1", + "semver": "^5.5.0", + "slack-node": "~0.2.0", + "streamroller": "0.7.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "loggly": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/loggly/-/loggly-1.1.1.tgz", + "integrity": "sha1-Cg/B0/o6XsRP3HuJe+uipGlc6+4=", + "dev": true, + "optional": true, + "requires": { + "json-stringify-safe": "5.0.x", + "request": "2.75.x", + "timespan": "2.3.x" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "optional": true + }, + "caseless": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", + "dev": true, + "optional": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "optional": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "form-data": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.0.0.tgz", + "integrity": "sha1-bwrrrcxdoWwT4ezBETfYX5uIOyU=", + "dev": true, + "optional": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.11" + } + }, + "har-validator": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", + "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "dev": true, + "optional": true, + "requires": { + "chalk": "^1.1.1", + "commander": "^2.9.0", + "is-my-json-valid": "^2.12.4", + "pinkie-promise": "^2.0.0" + } + }, + "node-uuid": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", + "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=", + "dev": true, + "optional": true + }, + "qs": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.3.tgz", + "integrity": "sha1-HPyyXBCpsrSDBT/zn138kjOQjP4=", + "dev": true, + "optional": true + }, + "request": { + "version": "2.75.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.75.0.tgz", + "integrity": "sha1-0rgmiihtoT6qXQGt9dGMyQ9lfZM=", + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "bl": "~1.1.2", + "caseless": "~0.11.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~2.0.0", + "har-validator": "~2.0.6", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "node-uuid": "~1.4.7", + "oauth-sign": "~0.8.1", + "qs": "~6.2.0", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "~0.4.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "optional": true + }, + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", + "dev": true, + "optional": true + } + } + }, "loglevel": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz", @@ -4819,9 +6182,9 @@ "dev": true }, "lru-cache": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz", - "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", + "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", "dev": true, "requires": { "pseudomap": "^1.0.2", @@ -4837,19 +6200,72 @@ "vlq": "^0.2.2" } }, + "mailcomposer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/mailcomposer/-/mailcomposer-4.0.1.tgz", + "integrity": "sha1-DhxEsqB890DuF9wUm6AJ8Zyt/rQ=", + "dev": true, + "optional": true, + "requires": { + "buildmail": "4.0.1", + "libmime": "3.0.0" + } + }, + "mailgun-js": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/mailgun-js/-/mailgun-js-0.18.0.tgz", + "integrity": "sha512-o0P6jjZlx5CQj12tvVgDTbgjTqVN0+5h6/6P1+3c6xmozVKBwniQ6Qt3MkCSF0+ueVTbobAfWyGpWRZMJu8t1g==", + "dev": true, + "optional": true, + "requires": { + "async": "~2.6.0", + "debug": "~3.1.0", + "form-data": "~2.3.0", + "inflection": "~1.12.0", + "is-stream": "^1.1.0", + "path-proxy": "~1.0.0", + "promisify-call": "^2.0.2", + "proxy-agent": "~3.0.0", + "tsscmp": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "form-data": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "dev": true, + "optional": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "1.0.6", + "mime-types": "^2.1.12" + } + } + } + }, "make-dir": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz", - "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "dev": true, "requires": { "pify": "^3.0.0" } }, "make-error": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.0.tgz", - "integrity": "sha1-Uq06M5zPEM5itAQLcI/nByRLi5Y=", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.4.tgz", + "integrity": "sha512-0Dab5btKVPhibSalc9QGXb559ED7G7iLjFXBaj9Wq8O3vorueR5K5jaE3hkG6ZQINyhA/JgG6Qk4qdFQjsYV6g==", "dev": true }, "map-cache": { @@ -4873,6 +6289,12 @@ "object-visit": "^1.0.0" } }, + "math-random": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", + "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", + "dev": true + }, "md5.js": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", @@ -4965,23 +6387,6 @@ "object.omit": "^2.0.0", "parse-glob": "^3.0.4", "regex-cache": "^0.4.2" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } } }, "miller-rabin": { @@ -5209,6 +6614,13 @@ "integrity": "sha512-3KL3fvuRkZ7s4IFOMfztb7zJp3QaVWnBeGoJlgB38XnCRPj/0tLzzLG5IB8NYOHbJ8g8UGrgZv44GLDk6CxTxA==", "dev": true }, + "netmask": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-1.0.6.tgz", + "integrity": "sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU=", + "dev": true, + "optional": true + }, "next-tick": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", @@ -5225,9 +6637,9 @@ } }, "node-forge": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.1.tgz", - "integrity": "sha1-naYR6giYL0uUIGs760zJZl8gwwA=", + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz", + "integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==", "dev": true }, "node-gyp": { @@ -5434,6 +6846,91 @@ } } }, + "nodemailer": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-2.7.2.tgz", + "integrity": "sha1-8kLmSa7q45tsftdA73sGHEBNMPk=", + "dev": true, + "optional": true, + "requires": { + "libmime": "3.0.0", + "mailcomposer": "4.0.1", + "nodemailer-direct-transport": "3.3.2", + "nodemailer-shared": "1.1.0", + "nodemailer-smtp-pool": "2.8.2", + "nodemailer-smtp-transport": "2.7.2", + "socks": "1.1.9" + }, + "dependencies": { + "socks": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/socks/-/socks-1.1.9.tgz", + "integrity": "sha1-Yo1+TQSRJDVEWsC25Fk3bLPm1pE=", + "dev": true, + "optional": true, + "requires": { + "ip": "^1.1.2", + "smart-buffer": "^1.0.4" + } + } + } + }, + "nodemailer-direct-transport": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/nodemailer-direct-transport/-/nodemailer-direct-transport-3.3.2.tgz", + "integrity": "sha1-6W+vuQNYVglH5WkBfZfmBzilCoY=", + "dev": true, + "optional": true, + "requires": { + "nodemailer-shared": "1.1.0", + "smtp-connection": "2.12.0" + } + }, + "nodemailer-fetch": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/nodemailer-fetch/-/nodemailer-fetch-1.6.0.tgz", + "integrity": "sha1-ecSQihwPXzdbc/6IjamCj23JY6Q=", + "dev": true + }, + "nodemailer-shared": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/nodemailer-shared/-/nodemailer-shared-1.1.0.tgz", + "integrity": "sha1-z1mU4v0mjQD1zw+nZ6CBae2wfsA=", + "dev": true, + "requires": { + "nodemailer-fetch": "1.6.0" + } + }, + "nodemailer-smtp-pool": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/nodemailer-smtp-pool/-/nodemailer-smtp-pool-2.8.2.tgz", + "integrity": "sha1-LrlNbPhXgLG0clzoU7nL1ejajHI=", + "dev": true, + "optional": true, + "requires": { + "nodemailer-shared": "1.1.0", + "nodemailer-wellknown": "0.1.10", + "smtp-connection": "2.12.0" + } + }, + "nodemailer-smtp-transport": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/nodemailer-smtp-transport/-/nodemailer-smtp-transport-2.7.2.tgz", + "integrity": "sha1-A9ccdjFPFKx9vHvwM6am0W1n+3c=", + "dev": true, + "optional": true, + "requires": { + "nodemailer-shared": "1.1.0", + "nodemailer-wellknown": "0.1.10", + "smtp-connection": "2.12.0" + } + }, + "nodemailer-wellknown": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/nodemailer-wellknown/-/nodemailer-wellknown-0.1.10.tgz", + "integrity": "sha1-WG24EB2zDLRDjrVGc3pBqtDPE9U=", + "dev": true + }, "nopt": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", @@ -5501,6 +6998,12 @@ "boolbase": "~1.0.0" } }, + "null-check": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", + "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=", + "dev": true + }, "num2fraction": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", @@ -5525,6 +7028,12 @@ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", + "dev": true + }, "object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", @@ -5560,6 +7069,14 @@ "dev": true, "requires": { "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } } }, "object.omit": { @@ -5570,17 +7087,6 @@ "requires": { "for-own": "^0.1.4", "is-extendable": "^0.1.1" - }, - "dependencies": { - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - } } }, "object.pick": { @@ -5590,6 +7096,14 @@ "dev": true, "requires": { "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } } }, "obuf": { @@ -5631,27 +7145,55 @@ "is-wsl": "^1.1.0" } }, - "original": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.0.tgz", - "integrity": "sha1-kUf5P6FpbQS+YeAb1QuurKZWvTs=", + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "dev": true, "requires": { - "url-parse": "1.0.x" + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "optional": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" }, "dependencies": { - "url-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.0.5.tgz", - "integrity": "sha1-CFSGBCKv3P7+tsllxmLUgAFpkns=", + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", "dev": true, - "requires": { - "querystringify": "0.0.x", - "requires-port": "1.0.x" - } + "optional": true } } }, + "options": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", + "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=", + "dev": true + }, + "original": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.1.tgz", + "integrity": "sha512-IEvtB5vM5ULvwnqMxWBLxkS13JIEXbakizMSo3yoPNPCIWzg8TG3Usn/UhXoZFM/m+FuEA20KdzPSFq/0rS+UA==", + "dev": true, + "requires": { + "url-parse": "~1.4.0" + } + }, "os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", @@ -5725,6 +7267,49 @@ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true }, + "pac-proxy-agent": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-2.0.2.tgz", + "integrity": "sha512-cDNAN1Ehjbf5EHkNY5qnRhGPUCp6SnpyVof5fRzN800QV1Y2OkzbH9rmjZkbBRa8igof903yOnjIl6z0SlAhxA==", + "dev": true, + "optional": true, + "requires": { + "agent-base": "^4.2.0", + "debug": "^3.1.0", + "get-uri": "^2.0.0", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.1", + "pac-resolver": "^3.0.0", + "raw-body": "^2.2.0", + "socks-proxy-agent": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "pac-resolver": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-3.0.0.tgz", + "integrity": "sha512-tcc38bsjuE3XZ5+4vP96OfhOugrX+JcnpUbhfuc4LuXBLQhoTthOstZeoQJBDnQUDYzYmdImKsbz0xSl1/9qeA==", + "dev": true, + "optional": true, + "requires": { + "co": "^4.6.0", + "degenerator": "^1.0.4", + "ip": "^1.1.5", + "netmask": "^1.0.6", + "thunkify": "^2.1.2" + } + }, "pako": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", @@ -5774,23 +7359,6 @@ "is-dotfile": "^1.0.0", "is-extglob": "^1.0.0", "is-glob": "^2.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } } }, "parse-json": { @@ -5802,6 +7370,30 @@ "error-ex": "^1.2.0" } }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, "parseurl": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", @@ -5856,6 +7448,25 @@ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", "dev": true }, + "path-proxy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/path-proxy/-/path-proxy-1.0.0.tgz", + "integrity": "sha1-GOijaFn8nS8aU7SN7hOFQ8Ag3l4=", + "dev": true, + "optional": true, + "requires": { + "inflection": "~1.3.0" + }, + "dependencies": { + "inflection": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.3.8.tgz", + "integrity": "sha1-y9Fg2p91sUw8xjV41POWeEvzAU4=", + "dev": true, + "optional": true + } + } + }, "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", @@ -5888,8 +7499,7 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", - "dev": true, - "optional": true + "dev": true }, "pify": { "version": "3.0.0", @@ -5957,15 +7567,6 @@ "supports-color": "^5.4.0" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, "chalk": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", @@ -6045,9 +7646,9 @@ } }, "postcss-loader": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.1.4.tgz", - "integrity": "sha512-L2p654oK945B/gDFUGgOhh7uzj19RWoY1SVMeJVoKno1H2MdbQ0RppR/28JGju4pMb22iRC7BJ9aDzbxXSLf4A==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.1.5.tgz", + "integrity": "sha512-pV7kB5neJ0/1tZ8L1uGOBNTVBCSCXQoIsZMsrwvO8V2rKGa2tBl/f80GGVxow2jJnRJ2w1ocx693EKhZAb9Isg==", "dev": true, "requires": { "loader-utils": "^1.1.0", @@ -6075,6 +7676,12 @@ "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=", "dev": true }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, "preserve": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", @@ -6098,9 +7705,9 @@ "dev": true }, "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", "dev": true }, "promise": { @@ -6119,6 +7726,132 @@ "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", "dev": true }, + "promisify-call": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/promisify-call/-/promisify-call-2.0.4.tgz", + "integrity": "sha1-1IwtRWUszM1SgB3ey9UzptS9X7o=", + "dev": true, + "optional": true, + "requires": { + "with-callback": "^1.0.2" + } + }, + "protractor": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.3.2.tgz", + "integrity": "sha512-pw4uwwiy5lHZjIguxNpkEwJJa7hVz+bJsvaTI+IbXlfn2qXwzbF8eghW/RmrZwE2sGx82I8etb8lVjQ+JrjejA==", + "dev": true, + "requires": { + "@types/node": "^6.0.46", + "@types/q": "^0.0.32", + "@types/selenium-webdriver": "~2.53.39", + "blocking-proxy": "^1.0.0", + "chalk": "^1.1.3", + "glob": "^7.0.3", + "jasmine": "2.8.0", + "jasminewd2": "^2.1.0", + "optimist": "~0.6.0", + "q": "1.4.1", + "saucelabs": "^1.5.0", + "selenium-webdriver": "3.6.0", + "source-map-support": "~0.4.0", + "webdriver-js-extender": "^1.0.0", + "webdriver-manager": "^12.0.6" + }, + "dependencies": { + "adm-zip": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.11.tgz", + "integrity": "sha512-L8vcjDTCOIJk7wFvmlEUN7AsSb8T+2JrdP7KINBjzr24TJ5Mwj590sLu3BC7zNZowvJWa/JtPmD8eJCzdtDWjA==", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" + } + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "webdriver-manager": { + "version": "12.0.6", + "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.0.6.tgz", + "integrity": "sha1-PfGkgZdwELTL+MnYXHpXeCjA5ws=", + "dev": true, + "requires": { + "adm-zip": "^0.4.7", + "chalk": "^1.1.1", + "del": "^2.2.0", + "glob": "^7.0.3", + "ini": "^1.3.4", + "minimist": "^1.2.0", + "q": "^1.4.1", + "request": "^2.78.0", + "rimraf": "^2.5.2", + "semver": "^5.3.0", + "xml2js": "^0.4.17" + } + } + } + }, "proxy-addr": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", @@ -6129,6 +7862,42 @@ "ipaddr.js": "1.6.0" } }, + "proxy-agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-3.0.0.tgz", + "integrity": "sha512-g6n6vnk8fRf705ShN+FEXFG/SDJaW++lSs0d9KaJh4uBWW/wi7en4Cpo5VYQW3SZzAE121lhB/KLQrbURoubZw==", + "dev": true, + "optional": true, + "requires": { + "agent-base": "^4.2.0", + "debug": "^3.1.0", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.1", + "lru-cache": "^4.1.2", + "pac-proxy-agent": "^2.0.1", + "proxy-from-env": "^1.0.0", + "socks-proxy-agent": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "proxy-from-env": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", + "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=", + "dev": true, + "optional": true + }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", @@ -6165,12 +7934,12 @@ } }, "pumpify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.4.0.tgz", - "integrity": "sha512-2kmNR9ry+Pf45opRVirpNuIFotsxUGLaYqxIwuR77AYrYRMuFCz9eryHBS52L360O+NcR383CL4QYlMKPq4zYA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", "dev": true, "requires": { - "duplexify": "^3.5.3", + "duplexify": "^3.6.0", "inherits": "^2.0.3", "pump": "^2.0.0" } @@ -6181,12 +7950,23 @@ "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=", "dev": true }, + "q": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", + "dev": true + }, + "qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "dev": true + }, "qs": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", - "dev": true, - "optional": true + "dev": true }, "querystring": { "version": "0.2.0", @@ -6201,49 +7981,33 @@ "dev": true }, "querystringify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-0.0.4.tgz", - "integrity": "sha1-DPf4T5Rj/wrlHExLFC2VvjdyTZw=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.0.0.tgz", + "integrity": "sha512-eTPo5t/4bgaMNZxyjWx6N2a6AuE0mq51KWvpc7nU/MAqixcI6v6KrGUKES0HaomdnolQBBXU/++X6/QQ9KL4tw==", "dev": true }, "randomatic": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", + "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==", "dev": true, "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" }, "dependencies": { "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true }, "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true } } }, @@ -6395,17 +8159,17 @@ } }, "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", + "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", + "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, @@ -6431,16 +8195,42 @@ "strip-indent": "^1.0.1" } }, + "redis": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/redis/-/redis-2.8.0.tgz", + "integrity": "sha512-M1OkonEQwtRmZv4tEWF2VgpG0JWJ8Fv1PhlgT5+B+uNq2cA3Rt1Yt/ryoR+vQNOQcIEgdCdfH0jr3bDpihAw1A==", + "dev": true, + "optional": true, + "requires": { + "double-ended-queue": "^2.1.0-0", + "redis-commands": "^1.2.0", + "redis-parser": "^2.6.0" + } + }, + "redis-commands": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.3.5.tgz", + "integrity": "sha512-foGF8u6MXGFF++1TZVC6icGXuMYPftKXt1FBT2vrfU9ZATNtZJ8duRC5d1lEfE8hyVe3jhelHGB91oB7I6qLsA==", + "dev": true, + "optional": true + }, + "redis-parser": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-2.6.0.tgz", + "integrity": "sha1-Uu0J2srBCPGmMcB+m2mUHnoZUEs=", + "dev": true, + "optional": true + }, "reflect-metadata": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.10.tgz", - "integrity": "sha1-tPg3BEFqytiZiMmxVjXUfgO5NEo=", + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.12.tgz", + "integrity": "sha512-n+IyV+nGz3+0q3/Yf1ra12KpCyi001bi4XFxSjbiWWjfqb52iTTtpGXmCCAOWWIAn9KEuFZKGqBERHmrtScZ3A==", "dev": true }, "regenerate": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", - "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", "dev": true }, "regenerator-runtime": { @@ -6492,6 +8282,14 @@ "dev": true, "requires": { "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } } }, "relateurl": { @@ -6553,7 +8351,6 @@ "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", "dev": true, - "optional": true, "requires": { "aws-sign2": "~0.6.0", "aws4": "^1.2.1", @@ -6579,6 +8376,28 @@ "uuid": "^3.0.0" } }, + "requestretry": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/requestretry/-/requestretry-1.13.0.tgz", + "integrity": "sha512-Lmh9qMvnQXADGAQxsXHP4rbgO6pffCfuR8XUBdP9aitJcLQJxhp7YZK4xAVYXnPJ5E52mwrfiKQtKonPL8xsmg==", + "dev": true, + "optional": true, + "requires": { + "extend": "^3.0.0", + "lodash": "^4.15.0", + "request": "^2.74.0", + "when": "^3.7.7" + }, + "dependencies": { + "when": { + "version": "3.7.8", + "resolved": "https://registry.npmjs.org/when/-/when-3.7.8.tgz", + "integrity": "sha1-xxMLan6gRpPoQs3J56Hyqjmjn4I=", + "dev": true, + "optional": true + } + } + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -6604,9 +8423,9 @@ "dev": true }, "resolve": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", - "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", + "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", "dev": true, "requires": { "path-parse": "^1.0.5" @@ -6677,17 +8496,17 @@ } }, "rxjs": { - "version": "5.5.6", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.6.tgz", - "integrity": "sha512-v4Q5HDC0FHAQ7zcBX7T2IL6O5ltl1a2GX4ENjPXg6SjDY69Cmx9v4113C99a4wGF16ClPv5Z8mghuYorVkg/kg==", + "version": "5.6.0-forward-compat.4", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.6.0-forward-compat.4.tgz", + "integrity": "sha512-cLkrsMwsNa3lNVa+U9Uwo1u30hos193bZaSDs8CKMOC1q+OgnTc8TdvAXmq8g37vbhkpQfaeMYlm8BkOzthj/g==", "requires": { "symbol-observable": "1.0.1" } }, "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, "safe-regex": { @@ -6725,6 +8544,15 @@ "pify": "^3.0.0" } }, + "saucelabs": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz", + "integrity": "sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==", + "dev": true, + "requires": { + "https-proxy-agent": "^2.2.1" + } + }, "sax": { "version": "0.5.8", "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", @@ -6770,19 +8598,42 @@ "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", "dev": true }, - "selfsigned": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.2.tgz", - "integrity": "sha1-tESVgNmZKbZbEKSDiTAaZZIIh1g=", + "selenium-webdriver": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", + "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", "dev": true, "requires": { - "node-forge": "0.7.1" + "jszip": "^3.1.3", + "rimraf": "^2.5.4", + "tmp": "0.0.30", + "xml2js": "^0.4.17" + }, + "dependencies": { + "tmp": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", + "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.1" + } + } + } + }, + "selfsigned": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.3.tgz", + "integrity": "sha512-vmZenZ+8Al3NLHkWnhBQ0x6BkML1eCP2xEi3JE+f3D9wW9fipD9NNJHYtE9XJM4TsPaHGZJIamrSI6MTg1dU2Q==", + "dev": true, + "requires": { + "node-forge": "0.7.5" } }, "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", "dev": true }, "semver-dsl": { @@ -6971,12 +8822,38 @@ "debug": "^2.2.0" } }, + "slack-node": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/slack-node/-/slack-node-0.2.0.tgz", + "integrity": "sha1-3kuN3aqLeT9h29KTgQT9q/N9+jA=", + "dev": true, + "optional": true, + "requires": { + "requestretry": "^1.2.2" + } + }, "slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", "dev": true }, + "smart-buffer": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-1.1.15.tgz", + "integrity": "sha1-fxFLW2X6s+KjWqd1uxLw0cZJvxY=", + "dev": true + }, + "smtp-connection": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/smtp-connection/-/smtp-connection-2.12.0.tgz", + "integrity": "sha1-1275EnyyPCJZ7bHoNJwujV4tdME=", + "dev": true, + "requires": { + "httpntlm": "1.6.1", + "nodemailer-shared": "1.1.0" + } + }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -7062,6 +8939,12 @@ "kind-of": "^6.0.2" } }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", @@ -7088,6 +8971,75 @@ "hoek": "2.x.x" } }, + "socket.io": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.0.4.tgz", + "integrity": "sha1-waRZDO/4fs8TxyZS8Eb3FrKeYBQ=", + "dev": true, + "requires": { + "debug": "~2.6.6", + "engine.io": "~3.1.0", + "socket.io-adapter": "~1.1.0", + "socket.io-client": "2.0.4", + "socket.io-parser": "~3.1.1" + } + }, + "socket.io-adapter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", + "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=", + "dev": true + }, + "socket.io-client": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.0.4.tgz", + "integrity": "sha1-CRilUkBtxeVAs4Dc2Xr8SmQzL44=", + "dev": true, + "requires": { + "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "~2.6.4", + "engine.io-client": "~3.1.0", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "socket.io-parser": "~3.1.1", + "to-array": "0.1.4" + } + }, + "socket.io-parser": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.1.3.tgz", + "integrity": "sha512-g0a2HPqLguqAczs3dMECuA1RgoGFPyvDqcbaDEdCWY9g59kdUAz3YRmaJBNKXflrHNwB7Q12Gkf/0CZXfdHR7g==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "has-binary2": "~1.0.2", + "isarray": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + } + } + }, "sockjs": { "version": "0.3.19", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", @@ -7123,6 +9075,26 @@ } } }, + "socks": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/socks/-/socks-1.1.10.tgz", + "integrity": "sha1-W4t/x8jzQcU+0FbpKbe/Tei6e1o=", + "dev": true, + "requires": { + "ip": "^1.1.4", + "smart-buffer": "^1.0.13" + } + }, + "socks-proxy-agent": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-3.0.1.tgz", + "integrity": "sha512-ZwEDymm204mTzvdqyUqOdovVr2YRd2NYskrYrF2LXyZ9qDiMAoFESGK8CRphiO7rtbo2Y757k2Nia3x2hGtalA==", + "dev": true, + "requires": { + "agent-base": "^4.1.0", + "socks": "^1.1.10" + } + }, "source-list-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", @@ -7136,12 +9108,12 @@ "dev": true }, "source-map-resolve": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", - "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", "dev": true, "requires": { - "atob": "^2.0.0", + "atob": "^2.1.1", "decode-uri-component": "^0.2.0", "resolve-url": "^0.2.1", "source-map-url": "^0.4.0", @@ -7149,9 +9121,9 @@ } }, "source-map-support": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.16.tgz", - "integrity": "sha512-A6vlydY7H/ljr4L2UOhDSajQdZQ6dMD7cLH0pzwcmwLyc9u8PNI4WGtnfDDzX7uzGL6c/T+ORL97Zlh+S4iOrg==", + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", "dev": true, "requires": { "source-map": "^0.5.6" @@ -7330,14 +9302,14 @@ } }, "stream-http": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.1.tgz", - "integrity": "sha512-cQ0jo17BLca2r0GfRdZKYAGLU6JRoIWxqSOakUMuKOT6MOK7AAlE856L33QuDmAy/eeOrhLee3dZKX0Uadu93A==", + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.2.tgz", + "integrity": "sha512-QllfrBhqF1DPcz46WxKTs6Mz1Bpc+8Qm6vbqOpVav5odAXwbyzwnEczoWqtxrsmlO+cJqtPrp/8gWKWjaKLLlA==", "dev": true, "requires": { "builtin-status-codes": "^3.0.0", "inherits": "^2.0.1", - "readable-stream": "^2.3.3", + "readable-stream": "^2.3.6", "to-arraybuffer": "^1.0.0", "xtend": "^4.0.0" } @@ -7348,6 +9320,29 @@ "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", "dev": true }, + "streamroller": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-0.7.0.tgz", + "integrity": "sha512-WREzfy0r0zUqp3lGO096wRuUp7ho1X6uo/7DJfTlEi0Iv/4gT7YHqXDjKC2ioVGBZtE8QzsQD9nx1nIuoZ57jQ==", + "dev": true, + "requires": { + "date-format": "^1.2.0", + "debug": "^3.1.0", + "mkdirp": "^0.5.1", + "readable-stream": "^2.3.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", @@ -7360,18 +9355,18 @@ } }, "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { "safe-buffer": "~5.1.0" } }, "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz", + "integrity": "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==", "dev": true }, "strip-ansi": { @@ -7544,6 +9539,13 @@ "xtend": "~4.0.1" } }, + "thunkify": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/thunkify/-/thunkify-2.1.2.tgz", + "integrity": "sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0=", + "dev": true, + "optional": true + }, "thunky": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.2.tgz", @@ -7565,6 +9567,28 @@ "setimmediate": "^1.0.4" } }, + "timespan": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/timespan/-/timespan-2.3.0.tgz", + "integrity": "sha1-SQLOBAvRPYRcj1myfp1ZutbzmSk=", + "dev": true, + "optional": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", + "dev": true + }, "to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", @@ -7687,19 +9711,11 @@ } }, "ts-node": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-4.0.1.tgz", - "integrity": "sha512-F9AHAfL7QO+W8QPnEY4dzjCV2RPDK76mzYkQVB/7BuGOJWFxJgGezdyvCdtfVtE1QOOen3DnJONsenzIqIKqYQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-4.1.0.tgz", + "integrity": "sha512-xcZH12oVg9PShKhy3UHyDmuDLV3y7iKwX25aMVPt1SIXSuAfWkFiGPEkg+th8R4YKW/QCxDoW7lJdb15lx6QWg==", "dev": true, "requires": { - "@types/arrify": "^1.0.1", - "@types/diff": "^3.2.1", - "@types/minimist": "^1.2.0", - "@types/mkdirp": "^0.5.0", - "@types/node": "^8.0.27", - "@types/source-map-support": "^0.4.0", - "@types/v8flags": "github:types/npm-v8flags#de224ae1cd5fd7dbb4e7158a6cc7a29e5315930d", - "@types/yn": "github:types/npm-yn#ca75f6c82940fae6a06fb41d2d37a6aa9b4ea8e9", "arrify": "^1.0.0", "chalk": "^2.3.0", "diff": "^3.1.0", @@ -7713,16 +9729,22 @@ }, "dependencies": { "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "^3.1.0", + "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", - "supports-color": "^4.0.0" + "supports-color": "^5.3.0" } }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", @@ -7736,44 +9758,56 @@ "dev": true }, "source-map-support": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.0.tgz", - "integrity": "sha512-vUoN3I7fHQe0R/SJLKRdKYuEdRGogsviXFkHHo17AWaTGv17VLnxw+CFXvqy+y4ORZ3doWLQcxRYfwKrsd/H7Q==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", + "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", "dev": true, "requires": { + "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "tsconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", + "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", + "dev": true, + "requires": { + "@types/strip-bom": "^3.0.0", + "@types/strip-json-comments": "0.0.30", + "strip-bom": "^3.0.0", + "strip-json-comments": "^2.0.0" + }, + "dependencies": { "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true - }, - "tsconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", - "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", - "dev": true, - "requires": { - "@types/strip-bom": "^3.0.0", - "@types/strip-json-comments": "0.0.30", - "strip-bom": "^3.0.0", - "strip-json-comments": "^2.0.0" - } } } }, "tsickle": { - "version": "0.25.5", - "resolved": "https://registry.npmjs.org/tsickle/-/tsickle-0.25.5.tgz", - "integrity": "sha512-CgOT/1WqOKtE1fyvqB+kTJ7bizE33xj1TyUIzGbxJBGCbQmknCrZbb35DtxMiK6pJo4CrPyoS8iGFddfHKtSNA==", + "version": "0.27.5", + "resolved": "https://registry.npmjs.org/tsickle/-/tsickle-0.27.5.tgz", + "integrity": "sha512-NP+CjM1EXza/M8mOXBLH3vkFEJiu1zfEAlC5WdJxHPn8l96QPz5eooP6uAgYtw1CcKfuSyIiheNUdKxtDWCNeg==", "dev": true, "requires": { "minimist": "^1.2.0", "mkdirp": "^0.5.1", - "source-map": "^0.5.6", - "source-map-support": "^0.4.2" + "source-map": "^0.6.0", + "source-map-support": "^0.5.0" }, "dependencies": { "minimist": { @@ -7781,40 +9815,92 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", + "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } } } }, "tslib": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.7.1.tgz", - "integrity": "sha1-vIAEFkaRkjp5/oN4u+s9ogF1OOw=" + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.1.tgz", + "integrity": "sha512-avfPS28HmGLLc2o4elcc2EIq2FcH++Yo5YxpBZi9Yw93BCTGFthI4HPE4Rpep6vSYQaK8e69PelM44tPj+RaQg==" }, "tslint": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.8.0.tgz", - "integrity": "sha1-H0mtWy53x2w69N3K5VKuTjYS6xM=", + "version": "5.9.1", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.9.1.tgz", + "integrity": "sha1-ElX4ej/1frCw4fDmEKi0dIBGya4=", "dev": true, "requires": { "babel-code-frame": "^6.22.0", "builtin-modules": "^1.1.1", - "chalk": "^2.1.0", - "commander": "^2.9.0", + "chalk": "^2.3.0", + "commander": "^2.12.1", "diff": "^3.2.0", "glob": "^7.1.1", + "js-yaml": "^3.7.0", "minimatch": "^3.0.4", "resolve": "^1.3.2", "semver": "^5.3.0", - "tslib": "^1.7.1", + "tslib": "^1.8.0", "tsutils": "^2.12.1" + }, + "dependencies": { + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, + "tsscmp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.5.tgz", + "integrity": "sha1-fcSjOvcVgatDN9qR2FylQn69mpc=", + "dev": true, + "optional": true + }, "tsutils": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.13.0.tgz", - "integrity": "sha512-FuWzNJbMsp3gcZMbI3b5DomhW4Ia41vMxjN63nKWI0t7f+I3UmHfRl0TrXJTwI2LUduDG+eR1Mksp3pvtlyCFQ==", + "version": "2.27.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.27.0.tgz", + "integrity": "sha512-JcyX25oM9pFcb3zh60OqG1St8p/uSqC5Bgipdo3ieacB/Ao4dPhm7hAtKT9NrEu23CyYrrgJPV3CqYfo+/+T4w==", "dev": true, "requires": { - "tslib": "^1.7.1" + "tslib": "^1.8.1" } }, "tty-browserify": { @@ -7828,7 +9914,6 @@ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "dev": true, - "optional": true, "requires": { "safe-buffer": "^5.0.1" } @@ -7840,6 +9925,15 @@ "dev": true, "optional": true }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, "type-is": { "version": "1.6.16", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", @@ -7857,27 +9951,21 @@ "dev": true }, "typescript": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.4.2.tgz", - "integrity": "sha1-+DlfhdRZJ2BnyYiqQYN6j4KHCEQ=", + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.5.3.tgz", + "integrity": "sha512-ptLSQs2S4QuS6/OD1eAKG+S5G8QQtrU5RT32JULdZQtM1L3WTi34Wsu48Yndzi8xsObRAB9RPt/KhA9wlpEF6w==", "dev": true }, "uglify-js": { - "version": "3.3.23", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.23.tgz", - "integrity": "sha512-Ks+KqLGDsYn4z+pU7JsKCzC0T3mPYl+rU+VcPZiQOazjE4Uqi4UCRY3qPMDbJi7ze37n1lDXj3biz1ik93vqvw==", + "version": "3.3.25", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.25.tgz", + "integrity": "sha512-hobogryjDV36VrLK3Y69ou4REyrTApzUblVFmdQOYRe8cYaSmFJXMb4dR9McdvYDSbeNdzUgYr2YVukJaErJcA==", "dev": true, "requires": { "commander": "~2.15.0", "source-map": "~0.6.1" }, "dependencies": { - "commander": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", - "dev": true - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -7933,6 +10021,18 @@ } } }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "dev": true + }, + "underscore": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", + "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=", + "dev": true + }, "union-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", @@ -8035,13 +10135,19 @@ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true } } }, "upath": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.0.5.tgz", - "integrity": "sha512-qbKn90aDQ0YEwvXoLqj0oiuUYroLX2lVHZ+b+xwjozFasAOC4GneDq5+OaIG5Zj+jFmbz/uO+f7a9qxjktJQww==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", + "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", "dev": true }, "upper-case": { @@ -8051,9 +10157,9 @@ "dev": true }, "uri-js": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-3.0.2.tgz", - "integrity": "sha1-+QuFhQf4HepNz7s8TD2/orVX+qo=", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.1.tgz", + "integrity": "sha512-jpKCA3HjsBfSDOEgxRDAxQCNyHfCPSbq57PqCkd3gAyBuPb3IWxw54EHncqESznIdqSetHfw3D7ylThu2Kcc9A==", "dev": true, "requires": { "punycode": "^2.1.0" @@ -8125,14 +10231,6 @@ "requires": { "querystringify": "^2.0.0", "requires-port": "^1.0.0" - }, - "dependencies": { - "querystringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.0.0.tgz", - "integrity": "sha512-eTPo5t/4bgaMNZxyjWx6N2a6AuE0mq51KWvpc7nU/MAqixcI6v6KrGUKES0HaomdnolQBBXU/++X6/QQ9KL4tw==", - "dev": true - } } }, "use": { @@ -8152,11 +10250,23 @@ } } }, - "user-home": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", - "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", - "dev": true + "useragent": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.2.1.tgz", + "integrity": "sha1-z1k+9PLRdYdei7ZY6pLhik/QbY4=", + "dev": true, + "requires": { + "lru-cache": "2.2.x", + "tmp": "0.0.x" + }, + "dependencies": { + "lru-cache": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.2.4.tgz", + "integrity": "sha1-bGWGGb7PFAMdDQtZSxYELOTcBj0=", + "dev": true + } + } }, "util": { "version": "0.10.3", @@ -8199,13 +10309,20 @@ "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", "dev": true }, + "uws": { + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/uws/-/uws-9.14.0.tgz", + "integrity": "sha512-HNMztPP5A1sKuVFmdZ6BPVpBQd5bUjNC8EFMFiICK+oho/OQsAJy5hnIx4btMHiOk8j04f/DbIlqnEZ9d72dqg==", + "dev": true, + "optional": true + }, "v8flags": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.0.0.tgz", - "integrity": "sha512-AGl+C+4qpeSu2g3JxCD/mGFFOs/vVZ3XREkD3ibQXEqr4Y4zgIrPWW124/IKJFHOIVFIoH8miWrLf0o84HYjwA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.0.tgz", + "integrity": "sha512-0m69VIK2dudEf2Ub0xwLQhZkDZu85OmiOpTw+UGDt56ibviYICHziM/3aE+oVg7IjGPp0c83w3eSVqa+lYZ9UQ==", "dev": true, "requires": { - "user-home": "^1.1.1" + "homedir-polyfill": "^1.0.1" } }, "validate-npm-package-license": { @@ -8258,6 +10375,12 @@ "indexof": "0.0.1" } }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "dev": true + }, "watchpack": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", @@ -8541,6 +10664,21 @@ "kind-of": "^6.0.2" } }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", @@ -8561,6 +10699,12 @@ } } }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", @@ -8599,6 +10743,69 @@ "minimalistic-assert": "^1.0.0" } }, + "webdriver-js-extender": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-1.0.0.tgz", + "integrity": "sha1-gcUzqeM9W/tZe05j4s2yW1R3dRU=", + "dev": true, + "requires": { + "@types/selenium-webdriver": "^2.53.35", + "selenium-webdriver": "^2.53.2" + }, + "dependencies": { + "sax": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-0.6.1.tgz", + "integrity": "sha1-VjsZx8HeiS4Jv8Ty/DDjwn8JUrk=", + "dev": true + }, + "selenium-webdriver": { + "version": "2.53.3", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-2.53.3.tgz", + "integrity": "sha1-0p/1qVff8aG0ncRXdW5OS/vc4IU=", + "dev": true, + "requires": { + "adm-zip": "0.4.4", + "rimraf": "^2.2.8", + "tmp": "0.0.24", + "ws": "^1.0.1", + "xml2js": "0.4.4" + } + }, + "tmp": { + "version": "0.0.24", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.24.tgz", + "integrity": "sha1-1qXhmNFKmDXMby18PZ4wJCjIzxI=", + "dev": true + }, + "ultron": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", + "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=", + "dev": true + }, + "ws": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz", + "integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==", + "dev": true, + "requires": { + "options": ">=0.0.5", + "ultron": "1.0.x" + } + }, + "xml2js": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.4.tgz", + "integrity": "sha1-MREBAAMAiuGSQOuhdJe1fHKcVV0=", + "dev": true, + "requires": { + "sax": "0.6.x", + "xmlbuilder": ">=1.0.0" + } + } + } + }, "webpack": { "version": "3.11.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.11.0.tgz", @@ -9241,6 +11448,21 @@ "kind-of": "^6.0.2" } }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", @@ -9261,6 +11483,12 @@ } } }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", @@ -9423,6 +11651,13 @@ "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", "dev": true }, + "with-callback": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/with-callback/-/with-callback-1.0.2.tgz", + "integrity": "sha1-oJYpuakgAo1yFAT7Q1vc/1yRvCE=", + "dev": true, + "optional": true + }, "wordwrap": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", @@ -9454,6 +11689,54 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + }, + "xml2js": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~9.0.1" + }, + "dependencies": { + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + } + } + }, + "xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "dev": true + }, + "xmlhttprequest-ssl": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", + "dev": true + }, + "xregexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", + "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=", + "dev": true, + "optional": true + }, "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", @@ -9538,6 +11821,12 @@ } } }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "dev": true + }, "yn": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", @@ -9545,9 +11834,9 @@ "dev": true }, "zone.js": { - "version": "0.8.17", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.17.tgz", - "integrity": "sha1-TF5RhahX2o2nk9rzkZNxxaNrKgs=" + "version": "0.8.26", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.26.tgz", + "integrity": "sha512-W9Nj+UmBJG251wkCacIkETgra4QgBo/vgoEkb4a2uoLzpQG7qF9nzwoLXWU5xj3Fg2mxGvEDh47mg24vXccYjA==" } } } diff --git a/dmp-frontend/package.json b/dmp-frontend/package.json index 5f2bc1ca5..8195c4bd9 100644 --- a/dmp-frontend/package.json +++ b/dmp-frontend/package.json @@ -1,45 +1,57 @@ { - "name": "forms-cli", + "name": "dmp-frontend2", "version": "0.0.0", "license": "MIT", "scripts": { "ng": "ng", "start": "ng serve", - "build": "ng build", + "build": "ng build --prod", "test": "ng test", "lint": "ng lint", "e2e": "ng e2e" }, "private": true, "dependencies": { - "@angular/animations": "^5.1.1", - "@angular/cdk": "^5.0.1", - "@angular/common": "5.1.1", - "@angular/compiler": "5.1.1", - "@angular/core": "5.1.1", - "@angular/forms": "5.1.1", - "@angular/http": "5.1.1", - "@angular/material": "^5.0.1", - "@angular/platform-browser": "5.1.1", - "@angular/platform-browser-dynamic": "5.1.1", - "@angular/router": "5.1.1", - "@covalent/core": "^1.0.0-rc.1", - "@ngx-translate/core": "^9.0.1", - "@ngx-translate/http-loader": "^2.0.0", - "@types/file-saver": "^1.3.0", + "@angular/animations": "^5.2.0", + "@angular/cdk": "^5.2.4", + "@angular/common": "^5.2.0", + "@angular/compiler": "^5.2.0", + "@angular/core": "^5.2.0", + "@angular/flex-layout": "5.0.0-beta.14", + "@angular/forms": "^5.2.0", + "@angular/http": "^5.2.0", + "@angular/material": "^5.2.4", + "@angular/platform-browser": "^5.2.0", + "@angular/platform-browser-dynamic": "^5.2.0", + "@angular/router": "^5.2.0", + "@covalent/core": "1.0.0", + "@ngx-translate/core": "10.0.1", + "@ngx-translate/http-loader": "3.0.1", + "@swimlane/ngx-datatable": "^11.3.2", + "@types/file-saver": "1.3.0", "core-js": "^2.4.1", "file-saver": "1.3.3", - "rxjs": "^5.5.6", - "zone.js": "^0.8.17" + "rxjs": "^5.6.0-forward-compat.4", + "zone.js": "^0.8.19" }, "devDependencies": { - "@angular/cli": "1.7.4", - "@angular/compiler-cli": "^5.1.1", - "@angular/language-service": "^5.1.1", - "@types/node": "^8.5.1", - "codelyzer": "~4.0.2", - "ts-node": "~4.0.1", - "tslint": "~5.8.0", - "typescript": "2.4.2" + "@angular/cli": "~1.7.4", + "@angular/compiler-cli": "^5.2.0", + "@angular/language-service": "^5.2.0", + "@types/jasmine": "~2.8.3", + "@types/jasminewd2": "~2.0.2", + "@types/node": "~6.0.60", + "codelyzer": "^4.0.1", + "jasmine-core": "~2.8.0", + "jasmine-spec-reporter": "~4.2.1", + "karma": "~2.0.0", + "karma-chrome-launcher": "~2.2.0", + "karma-coverage-istanbul-reporter": "^1.2.1", + "karma-jasmine": "~1.1.0", + "karma-jasmine-html-reporter": "^0.2.2", + "protractor": "^5.3.2", + "ts-node": "~4.1.0", + "tslint": "~5.9.1", + "typescript": "~2.5.3" } } diff --git a/dmp-frontend/protractor.conf.js b/dmp-frontend/protractor.conf.js new file mode 100644 index 000000000..7ee3b5ee8 --- /dev/null +++ b/dmp-frontend/protractor.conf.js @@ -0,0 +1,28 @@ +// Protractor configuration file, see link for more information +// https://github.com/angular/protractor/blob/master/lib/config.ts + +const { SpecReporter } = require('jasmine-spec-reporter'); + +exports.config = { + allScriptsTimeout: 11000, + specs: [ + './e2e/**/*.e2e-spec.ts' + ], + capabilities: { + 'browserName': 'chrome' + }, + directConnect: true, + baseUrl: 'http://localhost:4200/', + framework: 'jasmine', + jasmineNodeOpts: { + showColors: true, + defaultTimeoutInterval: 30000, + print: function() {} + }, + onPrepare() { + require('ts-node').register({ + project: 'e2e/tsconfig.e2e.json' + }); + jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); + } +}; diff --git a/dmp-frontend/src/app/add-researchers/add-researchers.component.ts b/dmp-frontend/src/app/add-researchers/add-researchers.component.ts deleted file mode 100644 index ec0929a9f..000000000 --- a/dmp-frontend/src/app/add-researchers/add-researchers.component.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { JsonSerializer } from '../utilities/JsonSerializer'; -import { RequestItem } from '../models/criteria/RequestItem'; -import { Component, OnInit, Inject } from "@angular/core"; -import { FormGroup } from '@angular/forms'; -import { Params, ActivatedRoute, Router } from '@angular/router'; -import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material'; -import { ResearcherModel } from '../models/researcher/ResearcherModel'; -import { ResearcherService } from '../services/researchers/researchers.service'; - -@Component({ - selector: 'add-researchers-component', - templateUrl: 'add-researchers.component.html', - providers: [ResearcherService] - -}) -export class AddResearchersComponent implements OnInit { - - private formGroup: FormGroup; - - constructor( - private researcherService: ResearcherService, - private route: ActivatedRoute, - public router: Router, - public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: any - ) { } - - ngOnInit(): void { - let researcher = new ResearcherModel(); - this.formGroup = researcher.buildForm(); - } - - - send(value: any) { - this.researcherService.createResearcher(this.formGroup.value).subscribe( - null, null, () => this.dialogRef.close() - ); - } -} \ No newline at end of file diff --git a/dmp-frontend/src/app/app-routing.module.ts b/dmp-frontend/src/app/app-routing.module.ts index 81205071e..671e366dd 100644 --- a/dmp-frontend/src/app/app-routing.module.ts +++ b/dmp-frontend/src/app/app-routing.module.ts @@ -1,9 +1,8 @@ -import { InvitationAcceptedComponent } from './invitation-accepted/invitation-accepted.component'; import { UnauthorizedComponent } from './unauthorized/unauthorized.component'; import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; import { HomepageComponent } from './homepage/homepage.component'; -import { AuthGuard } from './guards/auth.guard'; +import { AuthGuard } from './shared/guards/auth.guard'; import { LoginComponent } from './user-management/login/login.component'; import { WelcomepageComponent } from './welcomepage/welcomepage.component'; import { B2AccessLoginComponent } from './user-management/login/b2access/b2access-login.component'; @@ -35,9 +34,6 @@ const appRoutes: Routes = [ ], exports: [ RouterModule - ], - providers: [ - AuthGuard ] }) export class AppRoutingModule { } diff --git a/dmp-frontend/src/app/app.module.ts b/dmp-frontend/src/app/app.module.ts index ed380f6ff..545323d9d 100644 --- a/dmp-frontend/src/app/app.module.ts +++ b/dmp-frontend/src/app/app.module.ts @@ -3,9 +3,8 @@ import { BaseHttpService } from './utilities/cite-http-service-module/base-http. import { DashboardService } from './services/dashboard/dashboard.service'; import { DatasetService } from './services/dataset/dataset.service'; import { AuthService } from './services/auth/auth.service'; -import { AuthGuard } from './guards/auth.guard'; import { PaginationService } from './services/pagination.service'; -import { VisibilityRulesService } from './visibility-rules/visibility-rules.service'; +import { VisibilityRulesService } from './utilities/visibility-rules/visibility-rules.service'; import { MaterialModule } from './shared/material/material.module'; import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; @@ -14,17 +13,19 @@ import { CommonModule } from '@angular/common'; import { HttpClient, HttpClientModule } from '@angular/common/http'; import { HttpModule } from '@angular/http'; import { HostConfiguration } from './app.constants'; +import { BaseHttpModule } from './utilities/cite-http-service-module/cite-http.module'; + import { LoginOptions } from './user-management/utilties/LoginOptions'; import { LoginModule } from './user-management/login.module'; +import { ProjectsModule } from './projects/projects.module'; + import { DataManagementPlanModule } from './dmps/dmps.module'; import { DynamicFormModule } from './form/dynamic-form.module'; import { DatasetModule } from './datasets/dataset.module'; -import { ProjectsModule } from './projects/projects.module'; import { SharedModule } from './shared/shared.module'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { BrowserModule } from '@angular/platform-browser'; import { FigurecardComponent } from './shared/components/figurecard/figurecard.component'; -import { InvitationAcceptedComponent } from './invitation-accepted/invitation-accepted.component'; import { HomepageComponent } from './homepage/homepage.component'; import { PageNotFoundComponent } from './not-found.component'; import { AppComponent } from './app.component'; @@ -32,11 +33,13 @@ import { NgModule } from "@angular/core"; import { DatasetProfileModule } from './dataset-profile-form/dataset-profile.module'; import { WelcomepageComponent } from './welcomepage/welcomepage.component'; import { HelpContentService } from './services/help-content/help-content.service'; -import { HelpContentComponent } from './help-content/help-content.component'; import { B2AccessLoginComponent } from './user-management/login/b2access/b2access-login.component'; import { RecentActivityComponent } from './users/activity/recent-activity.component'; import { LanguageResolverService } from './services/language-resolver/language-resolver.service'; import { LanguageService } from './services/language/language.service'; +import { UsersModule } from './users/users.module'; +import { HelpContentComponent } from './shared/help-content/help-content.component'; +import { AuthGuard } from './shared/guards/auth.guard'; @NgModule({ declarations: [ @@ -51,8 +54,26 @@ import { LanguageService } from './services/language/language.service'; imports: [ BrowserModule, ReactiveFormsModule, - SharedModule, + FormsModule, + HttpModule, + HttpClientModule, + BaseHttpModule.forRoot(), + + CommonModule, + AppRoutingModule, + BrowserAnimationsModule, + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useFactory: HttpLoaderFactory, + deps: [HttpClient] + } + }), + BrowserAnimationsModule, + MaterialModule, + SharedModule, + LoginModule.forRoot({ loginProviders: [ LoginOptions.facebookOauth, @@ -79,25 +100,14 @@ import { LanguageService } from './services/language/language.service'; accessTokenUri: "https://b2access-integration.fz-juelich.de:443/oauth2/token" } }), - HttpModule, - HttpClientModule, - CommonModule, - AppRoutingModule, - BrowserAnimationsModule, - TranslateModule.forRoot({ - loader: { - provide: TranslateLoader, - useFactory: HttpLoaderFactory, - deps: [HttpClient] - } - }), - BrowserAnimationsModule, - MaterialModule + ], providers: [ + AuthGuard, AuthService, - DashboardService, BaseHttpService, + + DashboardService, HelpContentService, LanguageService, LanguageResolverService diff --git a/dmp-frontend/src/app/available-profiles/available-profiles.component.ts b/dmp-frontend/src/app/available-profiles/available-profiles.component.ts deleted file mode 100644 index 7f788af13..000000000 --- a/dmp-frontend/src/app/available-profiles/available-profiles.component.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { JsonSerializer } from '../utilities/JsonSerializer'; -import { RequestItem } from '../models/criteria/RequestItem'; -import { Component, OnInit, Inject } from "@angular/core"; -import { FormGroup } from '@angular/forms'; -import { Params, ActivatedRoute, Router } from '@angular/router'; -import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material'; -import { DatasetService } from '../services/dataset/dataset.service'; -import { DatasetProfileModel } from '../models/datasetprofile/DatasetProfileModel'; -import { DatasetProfileModule } from '../dataset-profile-form/dataset-profile.module'; - -@Component({ - selector: 'available-profiles-component', - templateUrl: 'available-profiles.component.html', - providers: [DatasetService] - -}) -export class AvailableProfilesComponent implements OnInit { - - private formGroup: FormGroup; - private profiles: DatasetProfileModel[] = []; - private selectedProfiles: DatasetProfileModel[] = []; - - constructor( - private datasetService: DatasetService, - private route: ActivatedRoute, - public router: Router, - public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: any - ) { } - - ngOnInit(): void { - - this.datasetService.getDatasetProfiles().subscribe(data => { - this.profiles = JsonSerializer.fromJSONArray(data, DatasetProfileModel) - } - ) - } - - addProfiles(profiles) { - console.log(profiles) - // profiles.selectedOptions.forEach(element => { - // selectedProfiles.push(element.value) - // }); - - profiles.selectedOptions.selected.forEach(element => { - let selectedElement = new DatasetProfileModel(); - selectedElement.id = element.value.id; - selectedElement.label = element.value.label; - this.selectedProfiles.push(selectedElement) - }) - - this.dialogRef.close(this.selectedProfiles); - } -} \ No newline at end of file diff --git a/dmp-frontend/src/app/datasets-admin-listing/dataset-admin.routes.ts b/dmp-frontend/src/app/datasets-admin-listing/dataset-admin.routes.ts index fdfb9be7f..0a2ebb325 100644 --- a/dmp-frontend/src/app/datasets-admin-listing/dataset-admin.routes.ts +++ b/dmp-frontend/src/app/datasets-admin-listing/dataset-admin.routes.ts @@ -1,7 +1,7 @@ -import { AuthGuard } from '../guards/auth.guard'; import { DatasetAdminListingComponent } from './dataset-admin-listing.component'; import { RouterModule, Routes } from '@angular/router'; +import { AuthGuard } from '../shared/guards/auth.guard'; export const DatasetAdminRoutes: Routes = [ - { path: '', component: DatasetAdminListingComponent, canActivate: [AuthGuard] }, + { path: '', component: DatasetAdminListingComponent, canActivate: [AuthGuard] }, ]; diff --git a/dmp-frontend/src/app/datasets/dataset-wizard/dataset-wizard.component.html b/dmp-frontend/src/app/datasets/dataset-wizard/dataset-wizard.component.html index 033644dc8..23a2443db 100644 --- a/dmp-frontend/src/app/datasets/dataset-wizard/dataset-wizard.component.html +++ b/dmp-frontend/src/app/datasets/dataset-wizard/dataset-wizard.component.html @@ -1,106 +1,149 @@
-

New {{datasetWizardModel?.dmp?.project?.label}} Dataset

-

{{datasetWizardModel?.dmp?.project?.label}} Dataset

+

New {{datasetWizardModel?.dmp?.project?.label}} Dataset

+

{{datasetWizardModel?.dmp?.project?.label}} Dataset

+
+ - + (click)="save();" type="button">Save + + (click)="saveFinalize();" type="button">Save and Finalize + (click)="downloadPDF();" type="button">Download PDF - - -
- {{'DATASET-WIZARD.FIRST-STEP.TITLE' | translate}} - - - - {{profile.label}} - - - {{baseErrorModel['Criteria.status']}} - - - + + + + {{'DATASET-WIZARD.FIRST-STEP.TITLE' | translate}} + + + + {{profile.label}} + + + {{baseErrorModel['Criteria.status']}} + + + - - - -
- {{'DATASET-WIZARD.SECOND-STEP.TITLE' | translate}} - - -
{{chip.name.substring(0, 1).toUpperCase()}}
- {{chip.name}} -
- -
- {{option.name}} -
-
- -
+
+ + + +
+ {{'DATASET-WIZARD.SECOND-STEP.TITLE' | translate}} - - -
{{chip.label.substring(0, 1).toUpperCase()}}
- {{chip.name}} -
- -
- {{option.name}} -
-
- -
+ - - -
{{chip.label.substring(0, 1).toUpperCase()}}
- {{chip.name}} -
- -
- {{option.name}} -
-
- -
+
- - -
{{chip.label.substring(0, 1).toUpperCase()}}
- {{chip.label}} -
- -
- {{option.label}} -
-
- -
+ +
+

+ {{suggestion.get('name').value}} +

+
+
+ + - - - - - {{'DATASET-WIZARD.THIRD-STEP.TITLE' | translate}} - - - - -
\ No newline at end of file + +
+ + + + + + + +
+

+ {{suggestion.get('label').value}} +

+
+
+ + + + +
+
+ + + {{'TYPES.EXTERNAL-DATASET-TYPE.SOURCE' | translate}} + {{'TYPES.EXTERNAL-DATASET-TYPE.OUTPUT' | translate}} + + +
+ +
+ + + + + + + + +
+

+ {{suggestion.get('label').value}} +

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

+ {{suggestion.get('label').value}} +

+
+ +
+ + + + + + + {{'DATASET-WIZARD.THIRD-STEP.TITLE' | translate}} + + + + + diff --git a/dmp-frontend/src/app/datasets/dataset-wizard/dataset-wizard.component.scss b/dmp-frontend/src/app/datasets/dataset-wizard/dataset-wizard.component.scss index 90db00ca7..38f87807b 100644 --- a/dmp-frontend/src/app/datasets/dataset-wizard/dataset-wizard.component.scss +++ b/dmp-frontend/src/app/datasets/dataset-wizard/dataset-wizard.component.scss @@ -2,6 +2,10 @@ width: 100%; } +.flex-container { + display: flex; +} + .input-table { table-layout: fixed; } @@ -14,33 +18,29 @@ .full-width { width: 100%; } - mat-form-field { - width: 100%; - padding: 3px; - } - - td-chips { - margin-top: 20px; - } - - .navigation-buttons-container { - margin-top: 20px; - } - + mat-form-field { + width: 100%; + padding: 3px; + } + td-chips { + margin-top: 20px; + } + .navigation-buttons-container { + margin-top: 20px; + } .mat-card { margin: 16px 0; } - + .fill-space { + flex: 1 1 auto; + } p { margin: 16px; } - .left-button { float: left; } - .description-area { height: 100px; } - -} +} \ No newline at end of file diff --git a/dmp-frontend/src/app/datasets/dataset-wizard/dataset-wizard.component.ts b/dmp-frontend/src/app/datasets/dataset-wizard/dataset-wizard.component.ts index 7d4684746..80375210d 100644 --- a/dmp-frontend/src/app/datasets/dataset-wizard/dataset-wizard.component.ts +++ b/dmp-frontend/src/app/datasets/dataset-wizard/dataset-wizard.component.ts @@ -15,39 +15,50 @@ import { ExternalSourcesService } from '../../services/external-sources/external import { DatasetWizardService } from '../../services/dataset-wizard/dataset-wizard.service'; import { TranslateService } from '@ngx-translate/core'; import { ActivatedRoute, Router, Params } from '@angular/router'; -import { Component, ViewChild, OnInit, AfterViewInit, ViewEncapsulation } from "@angular/core"; -import { FormGroup, Validators, FormBuilder } from "@angular/forms"; +import { Component, ViewChild, OnInit, AfterViewInit, ViewEncapsulation, TemplateRef } from "@angular/core"; +import { FormGroup, Validators, FormBuilder, FormArray } from "@angular/forms"; import * as FileSaver from 'file-saver'; import { MatPaginator, MatSort, MatSnackBar, MatStepper } from "@angular/material"; +import { AutoCompleteConfiguration } from '../../shared/components/autocomplete/AutoCompleteConfiguration'; +import { ExternalDatasetCriteria } from '../../models/criteria/external-dataset/ExternalDatasetCriteria'; +import { ExternalDatasetModel } from '../../models/external-dataset/ExternalDatasetModel'; +import { RegistryCriteria } from '../../models/criteria/registry/RegistryCriteria'; +import { RegisterModel } from '../../models/registers/RegisterModel'; +import { DataRepositoryCriteria } from '../../models/criteria/data-repository/DataRepositoryCriteria'; +import { ServicesCriteria } from '../../models/criteria/services/ServicesCriteria'; +import { ServiceModel } from '../../models/services/ServiceModel'; +import { DataRepositoryModel } from '../../models/dataRepositories/DataRepositoryModel'; +import { ExternalSourcesConfigurationService } from '../../services/external-sources/external-sources-configuration.service'; +import { ExternalSourcesConfiguration } from '../../models/external-sources/ExternalSourcesConfiguration'; @Component({ selector: 'app-dataset-wizard-component', templateUrl: 'dataset-wizard.component.html', styleUrls: ['./dataset-wizard.component.scss'], - providers: [DatasetWizardService, ExternalSourcesService, DataManagementPlanService], encapsulation: ViewEncapsulation.None }) export class DatasetWizardComponent { @ViewChild('stepper') stepper: MatStepper; - //dmpAutoCompleteConfiguration: AutoCompleteConfiguration; - //datasetProfileAutoCompleteConfiguration: AutoCompleteConfiguration; + //autocomplete Display Functions; + externalDatasetDisplayFunc = (item) => item ? item.label : null; + registriesDisplayFunc = (item) => item ? item.label : null; + dataRepositoryDisplayFunc = (item) => item ? item.name : null; + servicesDisplayFunc = (item) => item ? item.label : null; + + //autocomplete Configurations; + externalDatasetAutoCompleteConfiguration: AutoCompleteConfiguration; + registriesAutoCompleteConfiguration: AutoCompleteConfiguration; + dataRepositoriesAutoCompleteConfiguration: AutoCompleteConfiguration; + servicesAutoCompleteConfiguration: AutoCompleteConfiguration; + externalSourcesConfiguration: ExternalSourcesConfiguration; + datasetWizardModel: DatasetWizardModel; isNew = true; formGroup: FormGroup; datasetProfileDefinitionModel: DatasetProfileDefinitionModel; availableProfiles: DatasetProfileModel[] = []; - - filtereddataRepositoriesAsync: boolean = false; - filteredRegistriesAsync: boolean = false; - filteredServicesAsync: boolean = false; - filteredExternalDatasetsAsync: boolean = false; - - filtereddataRepositories: ExternalSourcesItemModel[]; - filteredRegistries: ExternalSourcesItemModel[]; - filteredServices: ExternalSourcesItemModel[]; - filteredExternalDatasets: ExternalSourcesItemModel[]; itemId: string constructor( private datasetWizardService: DatasetWizardService, @@ -58,7 +69,8 @@ export class DatasetWizardComponent { public router: Router, public language: TranslateService, public externalSourcesService: ExternalSourcesService, - public dataManagementPlanService: DataManagementPlanService + public dataManagementPlanService: DataManagementPlanService, + public externalSourcesConfigurationService: ExternalSourcesConfigurationService ) { } @@ -71,7 +83,26 @@ export class DatasetWizardComponent { let dmpRequestItem: RequestItem = new RequestItem(); dmpRequestItem.criteria = new DataManagementPlanCriteria(); + let externalDatasetRequestItem: RequestItem = new RequestItem(); + externalDatasetRequestItem.criteria = new ExternalDatasetCriteria(); + this.externalDatasetAutoCompleteConfiguration = new AutoCompleteConfiguration(this.externalSourcesService.searchDatasetSExternalDatasetservice.bind(this.externalSourcesService), externalDatasetRequestItem) + let registriesRequestItem: RequestItem = new RequestItem(); + registriesRequestItem.criteria = new RegistryCriteria(); + this.registriesAutoCompleteConfiguration = new AutoCompleteConfiguration(this.externalSourcesService.searchDatasetRegistry.bind(this.externalSourcesService), registriesRequestItem) + + let dataRepositoriesRequestItem: RequestItem = new RequestItem(); + dataRepositoriesRequestItem.criteria = new DataRepositoryCriteria(); + this.dataRepositoriesAutoCompleteConfiguration = new AutoCompleteConfiguration(this.externalSourcesService.searchDatasetRepository.bind(this.externalSourcesService), dataRepositoriesRequestItem) + + let servicesRequestItem: RequestItem = new RequestItem(); + servicesRequestItem.criteria = new ServicesCriteria(); + this.servicesAutoCompleteConfiguration = new AutoCompleteConfiguration(this.externalSourcesService.searchDatasetService.bind(this.externalSourcesService), servicesRequestItem) + + this.externalSourcesConfigurationService.getExternalSourcesConfiguration().subscribe(result => { + this.externalSourcesConfiguration = result; + }) + let dmpAutoCompleteConfiguration = {} this.route.params.subscribe((params: Params) => { this.itemId = params['id']; const dmpId = params['dmpId']; @@ -192,60 +223,6 @@ export class DatasetWizardComponent { }) } - filterdataRepositories(value: string): void { - - this.filtereddataRepositories = undefined; - if (value) { - this.filtereddataRepositoriesAsync = true; - - this.externalSourcesService.searchDatasetRepository(value).subscribe(items => { - this.filtereddataRepositories = items; - this.filtereddataRepositoriesAsync = false; - }); - } - } - - filterRegistries(value: string): void { - - this.filteredRegistries = undefined; - if (value) { - this.filteredRegistriesAsync = true; - - this.externalSourcesService.searchDatasetRegistry(value).subscribe(items => { - this.filteredRegistries = items; - this.filteredRegistriesAsync = false; - - }); - } - } - - filterServices(value: string): void { - - this.filteredServices = undefined; - if (value) { - this.filteredServicesAsync = true; - - this.externalSourcesService.searchDatasetService(value).subscribe(items => { - this.filteredServices = items; - this.filteredServicesAsync = false; - }); - } - } - - - filterExternalDatasets(value: string): void { - - this.filteredExternalDatasets = undefined; - if (value) { - this.filteredExternalDatasetsAsync = true; - - this.externalSourcesService.searchDatasetSExternalDatasetservice(value).subscribe(items => { - this.filteredExternalDatasets = items; - this.filteredExternalDatasetsAsync = false; - }); - } - } - downloadPDF(): void { this.datasetWizardService.downloadPDF(this.itemId).subscribe(response => { const blob = new Blob([response.body], { type: 'application/pdf' }) @@ -264,8 +241,7 @@ export class DatasetWizardComponent { }) } - getFilenameFromContentDispositionHeader(header: string): string { // expecting filename=XXXX or filename="XXXX" to exist - // const regex: RegExp = new RegExp(/filename=((\"(.*)\")|([^;]*))/g); + getFilenameFromContentDispositionHeader(header: string): string { const regex: RegExp = new RegExp(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/g); const matches = header.match(regex); @@ -282,4 +258,32 @@ export class DatasetWizardComponent { } return filename; } -} \ No newline at end of file + + public redirectToProject() { + this.router.navigate(["projects/edit/" + this.datasetWizardModel.dmp.project.id]) + } + + public redirectToDmp() { + this.router.navigate(["dmps/edit/" + this.datasetWizardModel.dmp.id]) + } + + externalDatasetsOnItemChange(event) { + let externalDatasetModel = new ExternalDatasetModel(event.id, event.abbreviation, event.label, event.reference); + (this.formGroup.get("externalDatasets")).push(externalDatasetModel.buildForm()); + } + + registriesOnItemChange(event) { + let registryModel = new RegisterModel(event.abbreviation, event.definition, event.id, event.label, event.reference, event.uri); + (this.formGroup.get("registries")).push(registryModel.buildForm()); + } + + servicesOnItemChange(event) { + let serviceModel = new ServiceModel(event.abbreviation, event.definition, event.id, event.label, event.reference, event.uri); + (this.formGroup.get("services")).push(serviceModel.buildForm()); + } + + dataRepositoriesOnItemChange(event) { + let dataRepositoryModel = new DataRepositoryModel(event.id, event.name, event.pid, event.uri); + (this.formGroup.get("dataRepositories")).push(dataRepositoryModel.buildForm()); + } +} diff --git a/dmp-frontend/src/app/datasets/dataset.module.ts b/dmp-frontend/src/app/datasets/dataset.module.ts index 86971904a..6fa36b18e 100644 --- a/dmp-frontend/src/app/datasets/dataset.module.ts +++ b/dmp-frontend/src/app/datasets/dataset.module.ts @@ -13,48 +13,61 @@ import { NgModule } from '@angular/core'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { SharedModule } from '../shared/shared.module' +import { BaseHttpService } from '../utilities/cite-http-service-module/base-http.service'; +import { BaseHttpModule } from '../utilities/cite-http-service-module/cite-http.module'; +import { MaterialModule } from '../shared/material/material.module'; +import { DataManagementPlanService } from '../services/data-management-plan/data-management-plan.service'; +import { DatasetWizardService } from '../services/dataset-wizard/dataset-wizard.service'; +import { ExternalSourcesService } from '../services/external-sources/external-sources.service'; +import { ExternalSourcesConfigurationService } from '../services/external-sources/external-sources-configuration.service'; @NgModule({ - imports: [ - CommonModule, - FormsModule, - HttpClientModule, - SharedModule, - RouterModule.forChild(DatasetRoutes), - ReactiveFormsModule, - DynamicFormModule, - TranslateModule.forRoot({ - loader: { - provide: TranslateLoader, - useFactory: HttpLoaderFactory, - deps: [HttpClient] - } - }), - ], + imports: [ + CommonModule, + FormsModule, + HttpClientModule, + SharedModule, + MaterialModule, + RouterModule.forChild(DatasetRoutes), + ReactiveFormsModule, + DynamicFormModule, - declarations: [ - DatasetListingComponent, - DatasetEditorComponent, - DatasetWizardComponent - ], + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useFactory: HttpLoaderFactory, + deps: [HttpClient] + } + }), + ], - exports: [ - DatasetListingComponent, - DatasetEditorComponent, - DatasetWizardComponent, - RouterModule - ], - providers: [ - DatasetService - ] + declarations: [ + DatasetListingComponent, + DatasetEditorComponent, + DatasetWizardComponent + ], + + exports: [ + DatasetListingComponent, + DatasetEditorComponent, + DatasetWizardComponent, + RouterModule + ], + providers: [ + DatasetWizardService, + ExternalSourcesService, + ExternalSourcesConfigurationService, + DataManagementPlanService, + DatasetService + ] }) export class DatasetModule { - constructor(private translate: TranslateService) { - translate.setDefaultLang('en'); - translate.use('en'); - } + constructor(private translate: TranslateService) { + translate.setDefaultLang('en'); + translate.use('en'); + } } export function HttpLoaderFactory(httpClient: HttpClient) { - return new TranslateHttpLoader(httpClient, 'assets/lang/', '.json'); -} \ No newline at end of file + return new TranslateHttpLoader(httpClient, 'assets/lang/', '.json'); +} diff --git a/dmp-frontend/src/app/datasets/dataset.routes.ts b/dmp-frontend/src/app/datasets/dataset.routes.ts index cc67d3334..c023af169 100644 --- a/dmp-frontend/src/app/datasets/dataset.routes.ts +++ b/dmp-frontend/src/app/datasets/dataset.routes.ts @@ -1,12 +1,12 @@ -import { AuthGuard } from '../guards/auth.guard'; import { DatasetWizardComponent } from './dataset-wizard/dataset-wizard.component'; import { DatasetListingComponent } from './listing/dataset-listing.component'; import { RouterModule, Routes } from '@angular/router'; +import { AuthGuard } from '../shared/guards/auth.guard'; export const DatasetRoutes: Routes = [ - { path: "new/:dmpId", component: DatasetWizardComponent, canActivate: [AuthGuard] }, - { path: "edit/:id", component: DatasetWizardComponent, canActivate: [AuthGuard] }, - { path: "new", component: DatasetWizardComponent, canActivate: [AuthGuard] }, - { path: '', component: DatasetListingComponent, canActivate: [AuthGuard] }, - { path: "dmp/:dmpId", component: DatasetListingComponent, canActivate: [AuthGuard] } + { path: "new/:dmpId", component: DatasetWizardComponent, canActivate: [AuthGuard] }, + { path: "edit/:id", component: DatasetWizardComponent, canActivate: [AuthGuard] }, + { path: "new", component: DatasetWizardComponent, canActivate: [AuthGuard] }, + { path: '', component: DatasetListingComponent, canActivate: [AuthGuard] }, + { path: "dmp/:dmpId", component: DatasetListingComponent, canActivate: [AuthGuard] } ]; diff --git a/dmp-frontend/src/app/datasets/editor/dataset-editor.component.html b/dmp-frontend/src/app/datasets/editor/dataset-editor.component.html index 12e14b714..4371ba024 100644 --- a/dmp-frontend/src/app/datasets/editor/dataset-editor.component.html +++ b/dmp-frontend/src/app/datasets/editor/dataset-editor.component.html @@ -5,20 +5,20 @@ {{'DATASET-EDITOR.TITLE.EDIT' | translate}} {{dataset.label}} --> - - - {{baseErrorModel.label}} - {{'GENERAL.VALIDATION.REQUIRED' | translate}} - + + + {{baseErrorModel.label}} + {{'GENERAL.VALIDATION.REQUIRED' | translate}} + - - - {{baseErrorModel.uri}} - {{'GENERAL.VALIDATION.REQUIRED' | translate}} - + + + {{baseErrorModel.uri}} + {{'GENERAL.VALIDATION.REQUIRED' | translate}} + - - - - {{errorModel.description}} - {{'GENERAL.VALIDATION.REQUIRED' | translate}} - + + + {{errorModel.description}} + {{'GENERAL.VALIDATION.REQUIRED' | translate}} + - - diff --git a/dmp-frontend/src/app/datasets/editor/dataset-editor.component.ts b/dmp-frontend/src/app/datasets/editor/dataset-editor.component.ts index 4e369f0fa..fbbfa07d5 100644 --- a/dmp-frontend/src/app/datasets/editor/dataset-editor.component.ts +++ b/dmp-frontend/src/app/datasets/editor/dataset-editor.component.ts @@ -19,7 +19,6 @@ import { ExternalSourcesItemModel } from "../../models/external-sources/External selector: 'app-dataset-editor-component', templateUrl: 'dataset-editor.component.html', styleUrls: ['./dataset-editor.component.scss'], - providers: [DatasetService, ExternalSourcesService], encapsulation: ViewEncapsulation.None }) export class DatasetEditorComponent implements AfterViewInit { @@ -31,11 +30,11 @@ export class DatasetEditorComponent implements AfterViewInit { // filtereddataRepositoriesAsync: boolean = false; // filteredRegistriesAsync: boolean = false; // filteredServicesAsync: boolean = false; - + // filtereddataRepositories: ExternalSourcesItemModel[]; // filteredRegistries: ExternalSourcesItemModel[]; // filteredServices: ExternalSourcesItemModel[]; - + constructor( private datasetService: DatasetService, private externalSourcesService: ExternalSourcesService, @@ -67,17 +66,17 @@ export class DatasetEditorComponent implements AfterViewInit { }); */ } - + public cancel(): void { this.router.navigate(['/datasets']); } // filterdataRepositories(value: string): void { - + // this.filtereddataRepositories = undefined; // if (value) { // this.filtereddataRepositoriesAsync = true; - + // this.externalSourcesService.searchDMPOrganizations(value).subscribe(items => { // this.filtereddataRepositories = items; // this.filtereddataRepositoriesAsync = false; @@ -91,11 +90,11 @@ export class DatasetEditorComponent implements AfterViewInit { // } // filterRegistries(value: string): void { - + // this.filteredRegistries = undefined; // if (value) { // this.filteredRegistriesAsync = true; - + // this.externalSourcesService.searchDMPResearchers(value).subscribe(items => { // this.filteredRegistries = items; // this.filteredRegistriesAsync = false; @@ -109,11 +108,11 @@ export class DatasetEditorComponent implements AfterViewInit { // } // filterServices(value: string): void { - + // this.filteredServices = undefined; // if (value) { // this.filteredServicesAsync = true; - + // this.externalSourcesService.searchDatasetService(value).subscribe(items => { // this.filteredServices = items; // this.filteredServicesAsync = false; @@ -125,4 +124,4 @@ export class DatasetEditorComponent implements AfterViewInit { // }); // } // } -} \ No newline at end of file +} diff --git a/dmp-frontend/src/app/datasets/listing/dataset-listing.component.ts b/dmp-frontend/src/app/datasets/listing/dataset-listing.component.ts index 68d0bdb85..ff66b4821 100644 --- a/dmp-frontend/src/app/datasets/listing/dataset-listing.component.ts +++ b/dmp-frontend/src/app/datasets/listing/dataset-listing.component.ts @@ -20,7 +20,6 @@ import { DatasetCriteriaComponent } from '../../shared/components/criteria/datas selector: 'app-dataset-listing-component', templateUrl: 'dataset-listing.component.html', styleUrls: ['./dataset-listing.component.scss'], - providers: [DatasetService, DataManagementPlanService] }) export class DatasetListingComponent implements OnInit { @@ -149,4 +148,4 @@ export class DatasetDataSource extends DataSource { disconnect() { // No-op } -} \ No newline at end of file +} diff --git a/dmp-frontend/src/app/dmp-profiles/dmp-profile-editor/dmp-profile-editor.component.ts b/dmp-frontend/src/app/dmp-profiles/dmp-profile-editor/dmp-profile-editor.component.ts index 399bd8136..8e3072942 100644 --- a/dmp-frontend/src/app/dmp-profiles/dmp-profile-editor/dmp-profile-editor.component.ts +++ b/dmp-frontend/src/app/dmp-profiles/dmp-profile-editor/dmp-profile-editor.component.ts @@ -6,7 +6,6 @@ import { DataSource } from "@angular/cdk/table"; import { Observable } from "rxjs/Observable"; import { DataManagementPlanService } from "../../services/data-management-plan/data-management-plan.service"; import { ProjectModel } from "../../models/projects/ProjectModel"; -import { ProjectService } from "../../services/project/project.service"; import { JsonSerializer } from "../../utilities/JsonSerializer"; import { FormGroup, AbstractControl, FormControl, FormArray } from "@angular/forms"; import { SnackBarNotificationComponent } from "../../shared/components/notificaiton/snack-bar-notification.component"; @@ -22,157 +21,157 @@ import { DataManagementPlanProfileListingModel } from "../../models/data-managem @Component({ - selector: 'app-dmp-profile-editor-component', - templateUrl: 'dmp-profile-editor.component.html', - styleUrls: ['./dmp-profile-editor.component.scss'], - providers: [DataManagementPlanProfileService], - encapsulation: ViewEncapsulation.None + selector: 'app-dmp-profile-editor-component', + templateUrl: 'dmp-profile-editor.component.html', + styleUrls: ['./dmp-profile-editor.component.scss'], + providers: [DataManagementPlanProfileService], + encapsulation: ViewEncapsulation.None }) export class DataManagementPlanProfileEditorComponent implements AfterViewInit { - isNew = true; - dataManagementPlanProfileModel: DataManagementPlanProfileModel; - formGroup: FormGroup = null; - host = HostConfiguration.Server; - baseErrorModel: BaseErrorModel; - constructor( - private dmpProfileService: DataManagementPlanProfileService, - private route: ActivatedRoute, - public snackBar: MatSnackBar, - public router: Router, - public language: TranslateService, - private dialogService: TdDialogService - ) { - } + isNew = true; + dataManagementPlanProfileModel: DataManagementPlanProfileModel; + formGroup: FormGroup = null; + host = HostConfiguration.Server; + baseErrorModel: BaseErrorModel; + constructor( + private dmpProfileService: DataManagementPlanProfileService, + private route: ActivatedRoute, + public snackBar: MatSnackBar, + public router: Router, + public language: TranslateService, + private dialogService: TdDialogService + ) { + } - ngAfterViewInit() { - this.route.params.subscribe((params: Params) => { - const itemId = params['id']; + ngAfterViewInit() { + this.route.params.subscribe((params: Params) => { + const itemId = params['id']; - if (itemId != null) { - this.isNew = false; - this.dmpProfileService.getSingle(itemId).map(data => data as DataManagementPlanProfileModel) - .subscribe(data => { - this.dataManagementPlanProfileModel = JsonSerializer.fromJSONObject(data, DataManagementPlanProfileModel); - this.baseErrorModel = this.dataManagementPlanProfileModel.errorModel; - this.formGroup = this.dataManagementPlanProfileModel.buildForm(); - }); - } else { - this.dataManagementPlanProfileModel = new DataManagementPlanProfileModel(); - this.baseErrorModel = this.dataManagementPlanProfileModel.errorModel; + if (itemId != null) { + this.isNew = false; + this.dmpProfileService.getSingle(itemId).map(data => data as DataManagementPlanProfileModel) + .subscribe(data => { + this.dataManagementPlanProfileModel = JsonSerializer.fromJSONObject(data, DataManagementPlanProfileModel); + this.baseErrorModel = this.dataManagementPlanProfileModel.errorModel; + this.formGroup = this.dataManagementPlanProfileModel.buildForm(); + }); + } else { + this.dataManagementPlanProfileModel = new DataManagementPlanProfileModel(); + this.baseErrorModel = this.dataManagementPlanProfileModel.errorModel; - setTimeout(() => { - this.formGroup = this.dataManagementPlanProfileModel.buildForm(); - }); - } + setTimeout(() => { + this.formGroup = this.dataManagementPlanProfileModel.buildForm(); }); - } + } + }); + } - formSubmit(): void { - this.touchAllFormFields(this.formGroup); - if (!this.isFormValid()) { return; } - this.onSubmit(); - } + formSubmit(): void { + this.touchAllFormFields(this.formGroup); + if (!this.isFormValid()) { return; } + this.onSubmit(); + } - public isFormValid() { - return this.formGroup.valid; - } + public isFormValid() { + return this.formGroup.valid; + } - onSubmit(): void { - this.dmpProfileService.createDataManagementPlan(this.formGroup.value).subscribe( - complete => this.onCallbackSuccess(), - error => this.onCallbackError(error) - ); - } + onSubmit(): void { + this.dmpProfileService.createDataManagementPlan(this.formGroup.value).subscribe( + complete => this.onCallbackSuccess(), + error => this.onCallbackError(error) + ); + } - onCallbackSuccess(): void { - this.snackBar.openFromComponent(SnackBarNotificationComponent, { - data: { message: this.isNew ? 'GENERAL.SNACK-BAR.SUCCESSFUL-CREATION' : 'GENERAL.SNACK-BAR.SUCCESSFUL-UPDATE', language: this.language }, - duration: 3000, - extraClasses: ['snackbar-success'] - }) - this.router.navigate(['/dmp-profiles']); - } + onCallbackSuccess(): void { + this.snackBar.openFromComponent(SnackBarNotificationComponent, { + data: { message: this.isNew ? 'GENERAL.SNACK-BAR.SUCCESSFUL-CREATION' : 'GENERAL.SNACK-BAR.SUCCESSFUL-UPDATE', language: this.language }, + duration: 3000, + extraClasses: ['snackbar-success'] + }) + this.router.navigate(['/dmp-profiles']); + } - onCallbackError(errorResponse: any) { - this.setErrorModel(errorResponse.error); - this.validateAllFormFields(this.formGroup); - } + onCallbackError(errorResponse: any) { + this.setErrorModel(errorResponse.error); + this.validateAllFormFields(this.formGroup); + } - public setErrorModel(errorModel: BaseErrorModel) { - Object.keys(errorModel).forEach(item => { - (this.dataManagementPlanProfileModel.errorModel)[item] = (errorModel)[item]; - }) - } + public setErrorModel(errorModel: BaseErrorModel) { + Object.keys(errorModel).forEach(item => { + (this.dataManagementPlanProfileModel.errorModel)[item] = (errorModel)[item]; + }) + } - public cancel(): void { - this.router.navigate(['/dmp-profiles']); - } + public cancel(): void { + this.router.navigate(['/dmp-profiles']); + } - public touchAllFormFields(formControl: AbstractControl) { - if (formControl instanceof FormControl) { - formControl.markAsTouched(); - } else if (formControl instanceof FormGroup) { - Object.keys(formControl.controls).forEach(item => { - const control = formControl.get(item); - this.touchAllFormFields(control); - }) - } - else if (formControl instanceof FormArray) { - formControl.controls.forEach(item => { - this.touchAllFormFields(item); - }) - } + public touchAllFormFields(formControl: AbstractControl) { + if (formControl instanceof FormControl) { + formControl.markAsTouched(); + } else if (formControl instanceof FormGroup) { + Object.keys(formControl.controls).forEach(item => { + const control = formControl.get(item); + this.touchAllFormFields(control); + }) } + else if (formControl instanceof FormArray) { + formControl.controls.forEach(item => { + this.touchAllFormFields(item); + }) + } + } - public validateAllFormFields(formControl: AbstractControl) { - if (formControl instanceof FormControl) { - formControl.updateValueAndValidity({ emitEvent: false }) - } else if (formControl instanceof FormGroup) { - Object.keys(formControl.controls).forEach(item => { - const control = formControl.get(item); - this.validateAllFormFields(control); - }) - } - else if (formControl instanceof FormArray) { - formControl.controls.forEach(item => { - this.validateAllFormFields(item); - }) - } + public validateAllFormFields(formControl: AbstractControl) { + if (formControl instanceof FormControl) { + formControl.updateValueAndValidity({ emitEvent: false }) + } else if (formControl instanceof FormGroup) { + Object.keys(formControl.controls).forEach(item => { + const control = formControl.get(item); + this.validateAllFormFields(control); + }) } + else if (formControl instanceof FormArray) { + formControl.controls.forEach(item => { + this.validateAllFormFields(item); + }) + } + } - addField() { - (this.formGroup.get("definition").get("fields")).push(new DataManagementProfileField().buildForm()) - } + addField() { + (this.formGroup.get("definition").get("fields")).push(new DataManagementProfileField().buildForm()) + } - getDMPProfileFieldDataTypeValues(): Number[] { - let keys: string[] = Object.keys(DMPProfileFieldDataType); - keys = keys.slice(0, keys.length / 2); - const values: Number[] = keys.map(Number); - return values; - } + getDMPProfileFieldDataTypeValues(): Number[] { + let keys: string[] = Object.keys(DMPProfileFieldDataType); + keys = keys.slice(0, keys.length / 2); + const values: Number[] = keys.map(Number); + return values; + } - getDMPProfileFieldDataTypeWithLanguage(role: DMPProfileFieldDataType): string { - let result = ''; - this.language.get(new Utilities().convertFromDMPProfileDataType(role)).subscribe((value: string) => { - result = value; - }); - return result; - } + getDMPProfileFieldDataTypeWithLanguage(role: DMPProfileFieldDataType): string { + let result = ''; + this.language.get(new Utilities().convertFromDMPProfileDataType(role)).subscribe((value: string) => { + result = value; + }); + return result; + } - getDMPProfileFieldTypeValues(): Number[] { - let keys: string[] = Object.keys(DMPProfileType); - keys = keys.slice(0, keys.length / 2); - const values: Number[] = keys.map(Number); - return values; - } + getDMPProfileFieldTypeValues(): Number[] { + let keys: string[] = Object.keys(DMPProfileType); + keys = keys.slice(0, keys.length / 2); + const values: Number[] = keys.map(Number); + return values; + } - getDMPProfileFieldTypeWithLanguage(role: DMPProfileType): string { - let result = ''; - this.language.get(new Utilities().convertFromDMPProfileType(role)).subscribe((value: string) => { - result = value; - }); - return result; - } -} \ No newline at end of file + getDMPProfileFieldTypeWithLanguage(role: DMPProfileType): string { + let result = ''; + this.language.get(new Utilities().convertFromDMPProfileType(role)).subscribe((value: string) => { + result = value; + }); + return result; + } +} diff --git a/dmp-frontend/src/app/dmp-profiles/dmp-profile.routes.ts b/dmp-frontend/src/app/dmp-profiles/dmp-profile.routes.ts index 7c142ec37..d218aa830 100644 --- a/dmp-frontend/src/app/dmp-profiles/dmp-profile.routes.ts +++ b/dmp-frontend/src/app/dmp-profiles/dmp-profile.routes.ts @@ -1,10 +1,10 @@ -import { AuthGuard } from '../guards/auth.guard'; import { RouterModule, Routes } from '@angular/router'; import { DataManagementPlanProfileListingComponent } from './dmp-profile-listing/dmp-profile-listing.component'; import { DataManagementPlanProfileEditorComponent } from './dmp-profile-editor/dmp-profile-editor.component'; +import { AuthGuard } from '../shared/guards/auth.guard'; export const DataManagementPlanProfileRoutes: Routes = [ - { path: '', component: DataManagementPlanProfileListingComponent, canActivate: [AuthGuard] }, - { path: 'new', component: DataManagementPlanProfileEditorComponent, canActivate: [AuthGuard] }, - { path: ':id', component: DataManagementPlanProfileEditorComponent, canActivate: [AuthGuard] }, + { path: '', component: DataManagementPlanProfileListingComponent, canActivate: [AuthGuard] }, + { path: 'new', component: DataManagementPlanProfileEditorComponent, canActivate: [AuthGuard] }, + { path: ':id', component: DataManagementPlanProfileEditorComponent, canActivate: [AuthGuard] }, ]; diff --git a/dmp-frontend/src/app/dmps/dmps.module.ts b/dmp-frontend/src/app/dmps/dmps.module.ts index dc157410f..7de69d921 100644 --- a/dmp-frontend/src/app/dmps/dmps.module.ts +++ b/dmp-frontend/src/app/dmps/dmps.module.ts @@ -1,11 +1,11 @@ -import { AddResearchersComponent } from '../add-researchers/add-researchers.component'; +import { AddResearchersComponent } from '../shared/components/add-researchers/add-researchers.component'; import { DatasetWizardListingComponent } from './wizard/listing/dataset-wizard-listing.component'; import { DataManagementPlanWizardEditorComponent } from './wizard/editor/dmp-wizard-editor.component'; import { DataManagementPlanWizardComponent } from './wizard/dmp-wizard.component'; import { TranslateHttpLoader } from '@ngx-translate/http-loader'; import { BaseHttpService } from '../utilities/cite-http-service-module/base-http.service'; -import { InvitationAcceptedComponent } from '../invitation-accepted/invitation-accepted.component'; -import { InvitationComponent } from '../invitation/invitation.component'; +import { InvitationAcceptedComponent } from '../shared/components/invitation-accepted/invitation-accepted.component'; +import { InvitationComponent } from '../shared/components/invitation/invitation.component'; import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core'; import { DataManagementPlanEditorComponent } from './editor/dmp-editor.component'; import { DataManagementPlanListingComponent } from './listing/dmp-listing.component'; @@ -17,75 +17,92 @@ import { CovalentDialogsModule } from '@covalent/core'; import { SharedModule } from '../shared/shared.module' import { NgModule } from '@angular/core'; -import { AvailableProfilesComponent } from '../available-profiles/available-profiles.component'; +import { AvailableProfilesComponent } from '../shared/components/available-profiles/available-profiles.component'; import { DynamicDmpFieldResolver } from './editor/dynamic-field-resolver/dynamic-dmp-field-resolver.component'; import { DynamicFieldsProjectComponent } from './editor/dynamic-fields-project/dynamic-fields-project.component'; import { DynamicFieldProjectComponent } from './editor/dynamic-fields-project/dynamic-field-project/dynamic-field-project.component'; +import { BaseHttpModule } from '../utilities/cite-http-service-module/cite-http.module'; +import { DataManagementPlanService } from '../services/data-management-plan/data-management-plan.service'; +import { DataManagementPlanProfileService } from '../services/data-management-plan-profile/datamanagement-profile.service'; +import { ProjectService } from '../services/project/project.service'; +import { ExternalSourcesService } from '../services/external-sources/external-sources.service'; +import { MaterialModule } from '../shared/material/material.module'; +import { RouterModule } from '@angular/router'; +import { ResearcherService } from '../services/researchers/researchers.service'; +import { InvitationService } from '../services/invitation/invitation.service'; +import { DatasetService } from '../services/dataset/dataset.service'; @NgModule({ - imports: [ - CommonModule, - FormsModule, - HttpClientModule, - SharedModule, - ReactiveFormsModule, - DataManagementPlanRoutes, - TranslateModule.forRoot({ - loader: { - provide: TranslateLoader, - useFactory: HttpLoaderFactory, - deps: [HttpClient] - } - }), - CovalentDialogsModule - ], + imports: [ + CommonModule, + FormsModule, + HttpClientModule, + SharedModule, + MaterialModule, + RouterModule.forChild(DataManagementPlanRoutes), + ReactiveFormsModule, + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useFactory: HttpLoaderFactory, + deps: [HttpClient] + } + }), + CovalentDialogsModule + ], - declarations: [ - DataManagementPlanListingComponent, - DataManagementPlanEditorComponent, - InvitationComponent, - InvitationAcceptedComponent, - DataManagementPlanWizardComponent, - DataManagementPlanWizardEditorComponent, - DatasetWizardListingComponent, - AddResearchersComponent, - AvailableProfilesComponent, - DynamicDmpFieldResolver, - DynamicFieldsProjectComponent, - DynamicFieldProjectComponent - ], + declarations: [ + DataManagementPlanListingComponent, + DataManagementPlanEditorComponent, + InvitationComponent, + InvitationAcceptedComponent, + DataManagementPlanWizardComponent, + DataManagementPlanWizardEditorComponent, + DatasetWizardListingComponent, + AddResearchersComponent, + AvailableProfilesComponent, + DynamicDmpFieldResolver, + DynamicFieldsProjectComponent, + DynamicFieldProjectComponent + ], - exports: [ - DataManagementPlanListingComponent, - DataManagementPlanEditorComponent, - InvitationComponent, - InvitationAcceptedComponent, - DataManagementPlanWizardComponent, - DataManagementPlanWizardEditorComponent, - DatasetWizardListingComponent, - AddResearchersComponent, - AvailableProfilesComponent, - DynamicFieldsProjectComponent, - DynamicFieldProjectComponent - - ], - entryComponents: [ - InvitationComponent, - AddResearchersComponent, - AvailableProfilesComponent - ], - providers: [ - BaseHttpService - ] + exports: [ + DataManagementPlanListingComponent, + DataManagementPlanEditorComponent, + InvitationComponent, + InvitationAcceptedComponent, + DataManagementPlanWizardComponent, + DataManagementPlanWizardEditorComponent, + DatasetWizardListingComponent, + AddResearchersComponent, + AvailableProfilesComponent, + DynamicFieldsProjectComponent, + DynamicFieldProjectComponent, + RouterModule + ], + entryComponents: [ + InvitationComponent, + AddResearchersComponent, + AvailableProfilesComponent + ], + providers: [ + ProjectService, + ResearcherService, + DatasetService, + InvitationService, + DataManagementPlanService, + ExternalSourcesService, + DataManagementPlanProfileService + ] }) export class DataManagementPlanModule { - constructor(private translate: TranslateService) { - translate.setDefaultLang('en'); - translate.use('en'); - } + constructor(private translate: TranslateService) { + translate.setDefaultLang('en'); + translate.use('en'); + } } export function HttpLoaderFactory(httpClient: HttpClient) { - return new TranslateHttpLoader(httpClient, 'assets/lang/', '.json'); -} \ No newline at end of file + return new TranslateHttpLoader(httpClient, 'assets/lang/', '.json'); +} diff --git a/dmp-frontend/src/app/dmps/dmps.routes.ts b/dmp-frontend/src/app/dmps/dmps.routes.ts index 432413e0d..10d608026 100644 --- a/dmp-frontend/src/app/dmps/dmps.routes.ts +++ b/dmp-frontend/src/app/dmps/dmps.routes.ts @@ -3,17 +3,15 @@ import { DataManagementPlanEditorComponent } from './editor/dmp-editor.component import { DataManagementPlanListingComponent } from './listing/dmp-listing.component'; import { DatasetListingComponent } from '../datasets/listing/dataset-listing.component'; import { RouterModule, Routes } from '@angular/router'; -import { InvitationAcceptedComponent } from '../invitation-accepted/invitation-accepted.component'; +import { InvitationAcceptedComponent } from '../shared/components/invitation-accepted/invitation-accepted.component'; -const routes: Routes = [ - { path: '', component: DataManagementPlanListingComponent }, - { path: 'viewversions/:groupId', component: DataManagementPlanListingComponent }, - { path: 'project/:projectId', component: DataManagementPlanListingComponent }, - { path: 'edit/:id', component: DataManagementPlanEditorComponent }, - { path: 'new', component: DataManagementPlanEditorComponent }, - { path: 'new_version/:id', component: DataManagementPlanWizardComponent, data: { clone: false } }, - { path: 'clone/:id', component: DataManagementPlanWizardComponent, data: { clone: true } }, - { path: "invitation/:id", component: InvitationAcceptedComponent } +export const DataManagementPlanRoutes: Routes = [ + { path: '', component: DataManagementPlanListingComponent }, + { path: 'viewversions/:groupId', component: DataManagementPlanListingComponent }, + { path: 'project/:projectId', component: DataManagementPlanListingComponent }, + { path: 'edit/:id', component: DataManagementPlanEditorComponent }, + { path: 'new', component: DataManagementPlanEditorComponent }, + { path: 'new_version/:id', component: DataManagementPlanWizardComponent, data: { clone: false } }, + { path: 'clone/:id', component: DataManagementPlanWizardComponent, data: { clone: true } }, + { path: "invitation/:id", component: InvitationAcceptedComponent } ]; - -export const DataManagementPlanRoutes = RouterModule.forChild(routes); diff --git a/dmp-frontend/src/app/dmps/editor/dmp-editor.component.html b/dmp-frontend/src/app/dmps/editor/dmp-editor.component.html index d654bb844..d707f957b 100644 --- a/dmp-frontend/src/app/dmps/editor/dmp-editor.component.html +++ b/dmp-frontend/src/app/dmps/editor/dmp-editor.component.html @@ -1,120 +1,146 @@
-
- - - - - - {{ option.label }} - - - - {{'DMP-EDITOR.TITLE.NEW' | translate}} - {{formGroup.get('label').value}} - - - - {{baseErrorModel.label}} - {{'GENERAL.VALIDATION.REQUIRED' | translate}} - + - - - {{errorModel.description}} - {{'GENERAL.VALIDATION.REQUIRED' | translate}} - - - + + + {{'DMP-EDITOR.TITLE.NEW' | translate}} + {{formGroup.get('label').value}} +
+ + + + + + + +
+
- + + + + + + + {{ option.label }} + + + + + - - -
{{chip.label.substring(0, 1).toUpperCase()}}
- {{chip.label}} -
- -
- {{option.label}} -
-
- - - {{'GENERAL.VALIDATION.REQUIRED' | translate}} - -
- - View All + + - + View All + + - - -
{{chip.name.substring(0, 1).toUpperCase()}}
- {{chip.name}} -
- -
- {{option.name}} -
-
- -
+ + +
{{chip.name.substring(0, 1).toUpperCase()}}
+ {{chip.name}} +
+ +
+ {{option.name}} +
+
+ +
-
- - -
{{chip.name.substring(0, 1).toUpperCase()}}
- {{chip.name}} -
- -
- {{option.name}} -
-
- -
+
+ + +
{{chip.name.substring(0, 1).toUpperCase()}}
+ {{chip.name}} +
+ +
+ {{option.name}} +
+
+ +
- -
- + +
+ - - - + + + - -

Associated Users

- - person -
{{user.name}}
-
-
+ +

Associated Users

+ + person +
{{user.name}}
+
+
-
- - - - -
+
+ + + + +
-
-
- - -
\ No newline at end of file +
+ + + + diff --git a/dmp-frontend/src/app/dmps/editor/dmp-editor.component.scss b/dmp-frontend/src/app/dmps/editor/dmp-editor.component.scss index f5333f1db..24c35d806 100644 --- a/dmp-frontend/src/app/dmps/editor/dmp-editor.component.scss +++ b/dmp-frontend/src/app/dmps/editor/dmp-editor.component.scss @@ -11,29 +11,25 @@ } .data-management-plan-editor { - - .mat-form-field-full-width{ + .mat-form-field-full-width { mat-form-field { width: 100%; padding: 3px; } } - - + .fill-space { + flex: 1 1 auto; + } .mat-card { margin: 16px 0; } - p { margin: 16px; } - .left-button { float: left; } - .description-area { height: 100px; } - -} +} \ No newline at end of file diff --git a/dmp-frontend/src/app/dmps/editor/dmp-editor.component.ts b/dmp-frontend/src/app/dmps/editor/dmp-editor.component.ts index 266a2b225..f300c7f24 100644 --- a/dmp-frontend/src/app/dmps/editor/dmp-editor.component.ts +++ b/dmp-frontend/src/app/dmps/editor/dmp-editor.component.ts @@ -20,10 +20,10 @@ import { AutoCompleteConfiguration } from "../../shared/components/autocomplete/ import { ProjectCriteria } from "../../models/criteria/project/ProjectCriteria"; import { ProjectService } from "../../services/project/project.service"; import { DmpUsersModel } from "../../models/dmpUsers/DmpUsersModel"; -import { AddResearchersComponent } from "../../add-researchers/add-researchers.component"; +import { AddResearchersComponent } from "../../shared/components/add-researchers/add-researchers.component"; import { ViewContainerRef } from '@angular/core'; import { TdDialogService } from '@covalent/core'; -import { AvailableProfilesComponent } from "../../available-profiles/available-profiles.component"; +import { AvailableProfilesComponent } from "../../shared/components/available-profiles/available-profiles.component"; import { AutoCompleteChipConfiguration } from "../../shared/components/autocompleteChips/AutoCompleteChipConfiguration"; import { BaseCriteria } from "../../models/criteria/BaseCriteria"; import { DataManagementPlanProfileService } from "../../services/data-management-plan-profile/datamanagement-profile.service"; @@ -36,7 +36,6 @@ import { LanguageResolverService } from "../../services/language-resolver/langua selector: 'app-dmp-editor-component', templateUrl: 'dmp-editor.component.html', styleUrls: ['./dmp-editor.component.scss'], - providers: [DataManagementPlanService, ExternalSourcesService, ProjectService, DataManagementPlanProfileService], encapsulation: ViewEncapsulation.None }) export class DataManagementPlanEditorComponent implements AfterViewInit { @@ -193,10 +192,6 @@ export class DataManagementPlanEditorComponent implements AfterViewInit { this.filteredResearchers = items; this.filteringResearchersAsync = false; - // this.filteredOrganisations = items.filter((filteredObj: any) => { - // return this.objectsModel ? this.objectsModel.indexOf(filteredObj) < 0 : true; - // }); - }); } } @@ -207,16 +202,6 @@ export class DataManagementPlanEditorComponent implements AfterViewInit { if (value) { this.filteredProfilesAsync = true; - // this.externalSourcesService.searchDMPProfiles(value).subscribe(items => { - // this.filteredProfiles = items; - // this.filteredProfilesAsync = false; - - // // this.filteredOrganisations = items.filter((filteredObj: any) => { - // // return this.objectsModel ? this.objectsModel.indexOf(filteredObj) < 0 : true; - // // }); - - // }); - const request = new RequestItem(); let criteria = new DatasetProfileCriteria(); criteria.like = value; @@ -288,4 +273,21 @@ export class DataManagementPlanEditorComponent implements AfterViewInit { if (!item) return null; return item["label"]; } -} \ No newline at end of file + + redirectToProject() { + this.router.navigate(["projects/edit/" + this.dataManagementPlan.project.id]) + } + + redirectToDatasets() { + this.router.navigate(["datasets/dmp/" + this.dataManagementPlan.id]) + } + + newVersion(id: String, label: String) { + this.router.navigate(['/dmps/new_version/' + id, { dmpLabel: label }]); + } + + clone(id: String) { + this.router.navigate(['/dmps/clone/' + id]); + } + +} diff --git a/dmp-frontend/src/app/dmps/editor/dynamic-field-resolver/dynamic-dmp-field-resolver.component.ts b/dmp-frontend/src/app/dmps/editor/dynamic-field-resolver/dynamic-dmp-field-resolver.component.ts index 1d79745a0..8120092ca 100644 --- a/dmp-frontend/src/app/dmps/editor/dynamic-field-resolver/dynamic-dmp-field-resolver.component.ts +++ b/dmp-frontend/src/app/dmps/editor/dynamic-field-resolver/dynamic-dmp-field-resolver.component.ts @@ -8,7 +8,6 @@ import { LanguageResolverService } from "../../../services/language-resolver/lan selector: 'app-dynamic-dmp-field-resolver', templateUrl: 'dynamic-dmp-field-resolver.component.html', styleUrls: ['./dynamic-dmp-field-resolver.component.scss'], - providers: [], encapsulation: ViewEncapsulation.None }) export class DynamicDmpFieldResolver implements OnInit, OnDestroy { @@ -38,4 +37,4 @@ export class DynamicDmpFieldResolver implements OnInit, OnDestroy { ngOnDestroy(): void { this.formGroup.removeControl("properties") } -} \ No newline at end of file +} diff --git a/dmp-frontend/src/app/dmps/editor/dynamic-fields-project/dynamic-field-project/dynamic-field-project.component.ts b/dmp-frontend/src/app/dmps/editor/dynamic-fields-project/dynamic-field-project/dynamic-field-project.component.ts index 499f0cca9..c1ceb8688 100644 --- a/dmp-frontend/src/app/dmps/editor/dynamic-fields-project/dynamic-field-project/dynamic-field-project.component.ts +++ b/dmp-frontend/src/app/dmps/editor/dynamic-fields-project/dynamic-field-project/dynamic-field-project.component.ts @@ -9,77 +9,76 @@ import { DynamicFieldDependency } from "../../../../models/data-managemnt-plans/ import { LanguageResolverService } from "../../../../services/language-resolver/language-resolver.service"; @Component({ - selector: 'app-dynamic-field-project', - templateUrl: 'dynamic-field-project.component.html', - styleUrls: ['./dynamic-field-project.component.scss'], - providers: [DataManagementPlanService], - encapsulation: ViewEncapsulation.None + selector: 'app-dynamic-field-project', + templateUrl: 'dynamic-field-project.component.html', + styleUrls: ['./dynamic-field-project.component.scss'], + encapsulation: ViewEncapsulation.None }) export class DynamicFieldProjectComponent implements OnInit { - constructor(private languageResolverService: LanguageResolverService, private dmpService: DataManagementPlanService) { } + constructor(private languageResolverService: LanguageResolverService, private dmpService: DataManagementPlanService) { } - @Input() - dependencies: Array + @Input() + dependencies: Array - @Input() - formGroup: FormGroup; + @Input() + formGroup: FormGroup; - @ViewChild(AutoCompleteComponent) - autocomplete: AutoCompleteComponent + @ViewChild(AutoCompleteComponent) + autocomplete: AutoCompleteComponent - autoCompleteConfiguration: AutoCompleteConfiguration + autoCompleteConfiguration: AutoCompleteConfiguration - ngOnInit(): void { - let requestItem = new RequestItem() - requestItem.criteria = { id: this.formGroup.get("id").value, dynamicFields: this.buildDependencies() } - this.autoCompleteConfiguration = new AutoCompleteConfiguration(this.dmpService.getDynamicField.bind(this.dmpService), requestItem); + ngOnInit(): void { + let requestItem = new RequestItem() + requestItem.criteria = { id: this.formGroup.get("id").value, dynamicFields: this.buildDependencies() } + this.autoCompleteConfiguration = new AutoCompleteConfiguration(this.dmpService.getDynamicField.bind(this.dmpService), requestItem); + } + + hasUnResolvedDependencies() { + if (this.dependencies == null || this.dependencies.length == 0) { + if (this.formGroup.get("value").disabled) { + this.updateConfiguration(); + this.formGroup.get("value").enable({ onlySelf: true, emitEvent: false }) + } + return false; } - - hasUnResolvedDependencies() { - if (this.dependencies == null || this.dependencies.length == 0) { - if (this.formGroup.get("value").disabled) { - this.updateConfiguration(); - this.formGroup.get("value").enable({ onlySelf: true, emitEvent: false }) - } - return false; - } - for (let i = 0; i < this.dependencies.length; i++) { - if (!this.dependencies[i].get("value").value) { - this.formGroup.get("value").disable({ onlySelf: true, emitEvent: false }) - return true; - } - } - if (this.formGroup.get("value").disabled) { - this.updateConfiguration(); - this.formGroup.get("value").enable({ onlySelf: true, emitEvent: false }) - } - return false; + for (let i = 0; i < this.dependencies.length; i++) { + if (!this.dependencies[i].get("value").value) { + this.formGroup.get("value").disable({ onlySelf: true, emitEvent: false }) + return true; + } } - - updateConfiguration() { - let requestItem = new RequestItem() - requestItem.criteria = { id: this.formGroup.get("id").value, dynamicFields: this.buildDependencies() } - this.autoCompleteConfiguration = new AutoCompleteConfiguration(this.dmpService.getDynamicField.bind(this.dmpService), requestItem); - this.autocomplete.inputData = this.autoCompleteConfiguration; + if (this.formGroup.get("value").disabled) { + this.updateConfiguration(); + this.formGroup.get("value").enable({ onlySelf: true, emitEvent: false }) } + return false; + } - buildDependencies(): Array { - if (!this.dependencies || this.dependencies.length == 0) return [] - let dependencies = new Array(); - for (let i = 0; i < this.dependencies.length; i++) { - dependencies.push({ property: this.dependencies[i].get("id").value, value: this.assignFunction(this.dependencies[i].get("value").value) }) - } - return dependencies; - } + updateConfiguration() { + let requestItem = new RequestItem() + requestItem.criteria = { id: this.formGroup.get("id").value, dynamicFields: this.buildDependencies() } + this.autoCompleteConfiguration = new AutoCompleteConfiguration(this.dmpService.getDynamicField.bind(this.dmpService), requestItem); + this.autocomplete.inputData = this.autoCompleteConfiguration; + } - displayFunction(item: any): any { - if(!item) return null; - return item["label"]; + buildDependencies(): Array { + if (!this.dependencies || this.dependencies.length == 0) return [] + let dependencies = new Array(); + for (let i = 0; i < this.dependencies.length; i++) { + dependencies.push({ property: this.dependencies[i].get("id").value, value: this.assignFunction(this.dependencies[i].get("value").value) }) } + return dependencies; + } - assignFunction(item: any): any { - if(!item) return null; - return item["id"]; - } -} \ No newline at end of file + displayFunction(item: any): any { + if (!item) return null; + return item["label"]; + } + + assignFunction(item: any): any { + if (!item) return null; + return item["id"]; + } +} diff --git a/dmp-frontend/src/app/dmps/editor/dynamic-fields-project/dynamic-fields-project.component.ts b/dmp-frontend/src/app/dmps/editor/dynamic-fields-project/dynamic-fields-project.component.ts index 823df3765..4ca3060c9 100644 --- a/dmp-frontend/src/app/dmps/editor/dynamic-fields-project/dynamic-fields-project.component.ts +++ b/dmp-frontend/src/app/dmps/editor/dynamic-fields-project/dynamic-fields-project.component.ts @@ -3,33 +3,32 @@ import { FormGroup, FormArray } from "@angular/forms"; import { DynamicFieldDependency } from "../../../models/data-managemnt-plans/DynamicFieldDependency"; @Component({ - selector: 'app-dynamic-fields-project', - templateUrl: 'dynamic-fields-project.component.html', - styleUrls: ['./dynamic-fields-project.component.scss'], - providers: [], - encapsulation: ViewEncapsulation.None + selector: 'app-dynamic-fields-project', + templateUrl: 'dynamic-fields-project.component.html', + styleUrls: ['./dynamic-fields-project.component.scss'], + encapsulation: ViewEncapsulation.None }) export class DynamicFieldsProjectComponent implements OnInit { - @Input() - formGroup: FormGroup; + @Input() + formGroup: FormGroup; - ngOnInit(): void { - console.log(this.formGroup) - } + ngOnInit(): void { + console.log(this.formGroup) + } - findDependencies(id: number) { - let formGroupDependencies: Array = new Array(); - let dynamicFieldDependency: DynamicFieldDependency[] = (this.formGroup.get("dynamicFields")).at(id).get("dependencies").value - if (dynamicFieldDependency.length > 0) { - dynamicFieldDependency.forEach(item => { - let length = (this.formGroup.get("dynamicFields")).length; - for (let i = 0; i < length; i++) { - let formGroup = (this.formGroup.get("dynamicFields")).at(i); - if (formGroup.get("id").value === item.id) formGroupDependencies.push(formGroup); - } - }) + findDependencies(id: number) { + let formGroupDependencies: Array = new Array(); + let dynamicFieldDependency: DynamicFieldDependency[] = (this.formGroup.get("dynamicFields")).at(id).get("dependencies").value + if (dynamicFieldDependency.length > 0) { + dynamicFieldDependency.forEach(item => { + let length = (this.formGroup.get("dynamicFields")).length; + for (let i = 0; i < length; i++) { + let formGroup = (this.formGroup.get("dynamicFields")).at(i); + if (formGroup.get("id").value === item.id) formGroupDependencies.push(formGroup); } - return formGroupDependencies; + }) } -} \ No newline at end of file + return formGroupDependencies; + } +} diff --git a/dmp-frontend/src/app/dmps/listing/dmp-listing.component.html b/dmp-frontend/src/app/dmps/listing/dmp-listing.component.html index f3e561307..579836e7c 100644 --- a/dmp-frontend/src/app/dmps/listing/dmp-listing.component.html +++ b/dmp-frontend/src/app/dmps/listing/dmp-listing.component.html @@ -1,82 +1,84 @@
-

{{'DMP-LISTING.TITLE' | translate}}

+

{{'DMP-LISTING.TITLE' | translate}}

- - - - - - + + + + + + - - - {{'DMP-LISTING.COLUMNS.NAME' | translate}} - {{row.label}} - + + + {{'DMP-LISTING.COLUMNS.NAME' | translate}} + {{row.label}} + - - - {{'DMP-LISTING.COLUMNS.PROJECT' | translate}} - {{row.project}} - + + + {{'DMP-LISTING.COLUMNS.PROJECT' | translate}} + {{row.project}} + - - + - - - {{'DMP-LISTING.COLUMNS.CREATION-TIME' | translate}} - {{row.creationTime | date:'shortDate'}} - + + + {{'DMP-LISTING.COLUMNS.CREATION-TIME' | translate}} + {{row.creationTime | date:'shortDate'}} + - - - {{'DMP-LISTING.COLUMNS.ORGANISATIONS' | translate}} - {{row.organisations}} - + + + {{'DMP-LISTING.COLUMNS.ORGANISATIONS' | translate}} + {{row.organisations}} + - - - {{'DMP-LISTING.COLUMNS.LATEST_VERSION' | translate}} - {{row.version}} - + + + {{'DMP-LISTING.COLUMNS.LATEST_VERSION' | translate}} + {{row.version}} + - - - {{'DMP-LISTING.COLUMNS.DATASETS' | translate}} - {{row.numOfDatasets}} - + + + {{'DMP-LISTING.COLUMNS.DATASETS' | translate}} + {{row.numOfDatasets}} + - - {{'DMP-LISTING.COLUMNS.ACTIONS' | translate}} - - - - - - - - - - - - + + {{'DMP-LISTING.COLUMNS.ACTIONS' | translate}} + + + + + + + + + + - - + + - - - - + + + + - -
\ No newline at end of file + + diff --git a/dmp-frontend/src/app/dmps/listing/dmp-listing.component.ts b/dmp-frontend/src/app/dmps/listing/dmp-listing.component.ts index 25b0e531d..7930e654b 100644 --- a/dmp-frontend/src/app/dmps/listing/dmp-listing.component.ts +++ b/dmp-frontend/src/app/dmps/listing/dmp-listing.component.ts @@ -1,6 +1,6 @@ import { DataTableRequest } from '../../models/data-table/DataTableRequest'; import { DataManagementPlanListingModel } from '../../models/data-managemnt-plans/DataManagementPlanListingModel'; -import { InvitationComponent } from '../../invitation/invitation.component'; +import { InvitationComponent } from '../../shared/components/invitation/invitation.component'; import { DataManagementPlanCriteria } from '../../models/criteria/data-management-plan/DataManagementPlanCriteria'; import { DataManagementPlanCriteriaComponent, @@ -22,7 +22,6 @@ import { ProjectModel } from '../../models/projects/ProjectModel'; selector: 'app-dmp-listing-component', templateUrl: 'dmp-listing.component.html', styleUrls: ['./dmp-listing.component.scss'], - providers: [DataManagementPlanService] }) export class DataManagementPlanListingComponent implements OnInit { @@ -85,18 +84,10 @@ export class DataManagementPlanListingComponent implements OnInit { this.router.navigate(['/datasets/dmp/' + rowId, { dmpLabel: rowLabel }]); } - newVersion(rowId: String, rowLabel: String) { - this.router.navigate(['/dmps/new_version/' + rowId, { dmpLabel: rowLabel }]); - } - viewVersions(rowId: String) { this.router.navigate(['/dmps/viewversions/' + rowId]); } - clone(rowId: String) { - this.router.navigate(['/dmps/clone/' + rowId]); - } - getDefaultCriteria(): DataManagementPlanCriteria { const defaultCriteria = new DataManagementPlanCriteria(); return defaultCriteria; diff --git a/dmp-frontend/src/app/dmps/wizard/dmp-wizard.component.ts b/dmp-frontend/src/app/dmps/wizard/dmp-wizard.component.ts index 051506284..fd09170ef 100644 --- a/dmp-frontend/src/app/dmps/wizard/dmp-wizard.component.ts +++ b/dmp-frontend/src/app/dmps/wizard/dmp-wizard.component.ts @@ -9,73 +9,72 @@ import { FormGroup } from '@angular/forms'; import { MatSnackBar } from '@angular/material'; import { TranslateService } from '@ngx-translate/core'; @Component({ - selector: 'app-dmp-wizard-component', - templateUrl: 'dmp-wizard.component.html', - styleUrls: ['./dmp-wizard.component.scss'], - providers: [DataManagementPlanService] + selector: 'app-dmp-wizard-component', + templateUrl: 'dmp-wizard.component.html', + styleUrls: ['./dmp-wizard.component.scss'], }) export class DataManagementPlanWizardComponent implements OnInit { - constructor( - private dataManagementPlanService: DataManagementPlanService, - private language: TranslateService, - public snackBar: MatSnackBar, - public route: ActivatedRoute, - private router: Router - ) { } + constructor( + private dataManagementPlanService: DataManagementPlanService, + private language: TranslateService, + public snackBar: MatSnackBar, + public route: ActivatedRoute, + private router: Router + ) { } - itemId: string - dataManagementPlan: DataManagementPlanModel; - formGroup: FormGroup - isClone: boolean + itemId: string + dataManagementPlan: DataManagementPlanModel; + formGroup: FormGroup + isClone: boolean - ngOnInit(): void { - this.route.params.subscribe((params: Params) => { - this.itemId = params['id']; - this.dataManagementPlanService.getSingle(this.itemId).map(data => data as DataManagementPlanModel) - .subscribe(data => { - this.dataManagementPlan = JsonSerializer.fromJSONObject(data, DataManagementPlanModel); - this.isClone = this.route.snapshot.data.clone; - if(this.isClone == false) this.dataManagementPlan.version = this.dataManagementPlan.version + 1; - this.formGroup = this.dataManagementPlan.buildForm(); - - }); - }) + ngOnInit(): void { + this.route.params.subscribe((params: Params) => { + this.itemId = params['id']; + this.dataManagementPlanService.getSingle(this.itemId).map(data => data as DataManagementPlanModel) + .subscribe(data => { + this.dataManagementPlan = JsonSerializer.fromJSONObject(data, DataManagementPlanModel); + this.isClone = this.route.snapshot.data.clone; + if (this.isClone == false) this.dataManagementPlan.version = this.dataManagementPlan.version + 1; + this.formGroup = this.dataManagementPlan.buildForm(); + + }); + }) + } + + + submit() { + if (this.isClone) { + this.dataManagementPlanService.clone(this.formGroup.getRawValue(), this.itemId).subscribe( + complete => this.onCallbackSuccess(), + error => this.onCallbackError(error) + ); + } else { + this.dataManagementPlanService.newVersion(this.formGroup.getRawValue(), this.itemId).subscribe( + complete => this.onCallbackSuccess(), + error => this.onCallbackError(error) + ); } + } + + onCallbackSuccess(): void { + this.snackBar.openFromComponent(SnackBarNotificationComponent, { + data: { message: 'GENERAL.SNACK-BAR.SUCCESSFUL-UPDATE', language: this.language }, + duration: 3000, + extraClasses: ['snackbar-success'] + }) + this.router.navigate(['/dmps']); + } + + onCallbackError(error: any) { + this.setErrorModel(error.error); + //this.validateAllFormFields(this.formGroup); + } + + public setErrorModel(errorModel: BaseErrorModel) { + Object.keys(errorModel).forEach(item => { + // (this.dataManagementPlan.errorModel)[item] = (errorModel)[item]; + }) + } - submit() { - if (this.isClone) { - this.dataManagementPlanService.clone(this.formGroup.getRawValue(), this.itemId).subscribe( - complete => this.onCallbackSuccess(), - error => this.onCallbackError(error) - ); - } else { - this.dataManagementPlanService.newVersion(this.formGroup.getRawValue(), this.itemId).subscribe( - complete => this.onCallbackSuccess(), - error => this.onCallbackError(error) - ); - } - } - - onCallbackSuccess(): void { - this.snackBar.openFromComponent(SnackBarNotificationComponent, { - data: { message: 'GENERAL.SNACK-BAR.SUCCESSFUL-UPDATE', language: this.language }, - duration: 3000, - extraClasses: ['snackbar-success'] - }) - this.router.navigate(['/dmps']); - } - - onCallbackError(error: any) { - this.setErrorModel(error.error); - //this.validateAllFormFields(this.formGroup); - } - - public setErrorModel(errorModel: BaseErrorModel) { - Object.keys(errorModel).forEach(item => { - // (this.dataManagementPlan.errorModel)[item] = (errorModel)[item]; - }) - } - - -} \ No newline at end of file +} diff --git a/dmp-frontend/src/app/dmps/wizard/editor/dmp-wizard-editor.component.html b/dmp-frontend/src/app/dmps/wizard/editor/dmp-wizard-editor.component.html index 8dcaa29f8..7ec69416c 100644 --- a/dmp-frontend/src/app/dmps/wizard/editor/dmp-wizard-editor.component.html +++ b/dmp-frontend/src/app/dmps/wizard/editor/dmp-wizard-editor.component.html @@ -3,7 +3,8 @@ - + {{baseErrorModel.label}} {{'GENERAL.VALIDATION.REQUIRED' | translate}} @@ -67,8 +68,9 @@ - - + + +

Associated Users

diff --git a/dmp-frontend/src/app/dmps/wizard/editor/dmp-wizard-editor.component.ts b/dmp-frontend/src/app/dmps/wizard/editor/dmp-wizard-editor.component.ts index ef4b8a8cb..4fb6774e9 100644 --- a/dmp-frontend/src/app/dmps/wizard/editor/dmp-wizard-editor.component.ts +++ b/dmp-frontend/src/app/dmps/wizard/editor/dmp-wizard-editor.component.ts @@ -24,165 +24,164 @@ import { BaseCriteria } from '../../../models/criteria/BaseCriteria'; @Component({ - selector: 'app-dmp-wizard-editor-component', - templateUrl: 'dmp-wizard-editor.component.html', - styleUrls: ['./dmp-wizard-editor.component.scss'], - providers: [DataManagementPlanService, ExternalSourcesService, ProjectService], - encapsulation: ViewEncapsulation.None + selector: 'app-dmp-wizard-editor-component', + templateUrl: 'dmp-wizard-editor.component.html', + styleUrls: ['./dmp-wizard-editor.component.scss'], + encapsulation: ViewEncapsulation.None }) export class DataManagementPlanWizardEditorComponent implements AfterViewInit { - isNew = true; - @Input() formGroup: FormGroup = null; + isNew = true; + @Input() formGroup: FormGroup = null; - filteringOrganisationsAsync: boolean = false; - filteringResearchersAsync: boolean = false; - filteredProfilesAsync: boolean = false; - filteredOrganisations: ExternalSourcesItemModel[]; - filteredResearchers: ExternalSourcesItemModel[]; - filteredProfiles: DatasetProfileModel[]; + filteringOrganisationsAsync: boolean = false; + filteringResearchersAsync: boolean = false; + filteredProfilesAsync: boolean = false; + filteredOrganisations: ExternalSourcesItemModel[]; + filteredResearchers: ExternalSourcesItemModel[]; + filteredProfiles: DatasetProfileModel[]; - projectAutoCompleteConfiguration: AutoCompleteConfiguration; - organisationsAutoCompleteConfiguration: AutoCompleteChipConfiguration; - createNewVersion; - associatedUsers: Array - labelDisabled: boolean = false; + projectAutoCompleteConfiguration: AutoCompleteConfiguration; + organisationsAutoCompleteConfiguration: AutoCompleteChipConfiguration; + createNewVersion; + associatedUsers: Array + labelDisabled: boolean = false; - constructor( - private dataManagementPlanService: DataManagementPlanService, - private projectService: ProjectService, - private externalSourcesService: ExternalSourcesService, - private route: ActivatedRoute, - public snackBar: MatSnackBar, - public router: Router, - public language: TranslateService, - private _service: DataManagementPlanService - ) { + constructor( + private dataManagementPlanService: DataManagementPlanService, + private projectService: ProjectService, + private externalSourcesService: ExternalSourcesService, + private route: ActivatedRoute, + public snackBar: MatSnackBar, + public router: Router, + public language: TranslateService, + private _service: DataManagementPlanService + ) { + + } + + ngAfterViewInit() { + + let projectRequestItem: RequestItem = new RequestItem(); + projectRequestItem.criteria = new ProjectCriteria(); + this.projectAutoCompleteConfiguration = new AutoCompleteConfiguration(this.projectService.getWithExternal.bind(this.projectService), projectRequestItem); + + let organisationRequestItem: RequestItem = new RequestItem(); + organisationRequestItem.criteria = new BaseCriteria(); + this.organisationsAutoCompleteConfiguration = new AutoCompleteChipConfiguration(this.externalSourcesService.searchDMPOrganizations.bind(this.externalSourcesService), organisationRequestItem); + + this.route.data.subscribe(value => { + if (value.clone == false && this.formGroup.get("label").value) { + this.labelDisabled = true; + } + this.formGroup.controls["version"].disable(); + }) + } + + formSubmit(): void { + //this.touchAllFormFields(this.formGroup); + if (!this.isFormValid()) { return; } + this.onSubmit(); + } + + public isFormValid() { + return this.formGroup.valid; + } + + onSubmit(): void { + this.dataManagementPlanService.createDataManagementPlan(this.formGroup.getRawValue()).subscribe( + complete => this.onCallbackSuccess(), + error => this.onCallbackError(error) + ); + } + + onCallbackSuccess(): void { + this.snackBar.openFromComponent(SnackBarNotificationComponent, { + data: { message: this.isNew ? 'GENERAL.SNACK-BAR.SUCCESSFUL-CREATION' : 'GENERAL.SNACK-BAR.SUCCESSFUL-UPDATE', language: this.language }, + duration: 3000, + extraClasses: ['snackbar-success'] + }) + this.router.navigate(['/dmps']); + } + + onCallbackError(error: any) { + this.setErrorModel(error.error); + //this.validateAllFormFields(this.formGroup); + } + + public setErrorModel(errorModel: BaseErrorModel) { + Object.keys(errorModel).forEach(item => { + // (this.dataManagementPlan.errorModel)[item] = (errorModel)[item]; + }) + } + + public cancel(): void { + this.router.navigate(['/dmps']); + } + + filterOrganisations(value: string): void { + + this.filteredOrganisations = undefined; + if (value) { + this.filteringOrganisationsAsync = true; + + this.externalSourcesService.searchDMPOrganizations(value).subscribe(items => { + this.filteredOrganisations = items; + this.filteringOrganisationsAsync = false; + + // this.filteredOrganisations = items.filter((filteredObj: any) => { + // return this.objectsModel ? this.objectsModel.indexOf(filteredObj) < 0 : true; + // }); + + }); } + } - ngAfterViewInit() { + filterResearchers(value: string): void { - let projectRequestItem: RequestItem = new RequestItem(); - projectRequestItem.criteria = new ProjectCriteria(); - this.projectAutoCompleteConfiguration = new AutoCompleteConfiguration(this.projectService.getWithExternal.bind(this.projectService), projectRequestItem); + this.filteredResearchers = undefined; + if (value) { + this.filteringResearchersAsync = true; - let organisationRequestItem: RequestItem = new RequestItem(); - organisationRequestItem.criteria = new BaseCriteria(); - this.organisationsAutoCompleteConfiguration = new AutoCompleteChipConfiguration(this.externalSourcesService.searchDMPOrganizations.bind(this.externalSourcesService), organisationRequestItem); + this.externalSourcesService.searchDMPResearchers({ criteria: { name: value, like: null } }).subscribe(items => { + this.filteredResearchers = items; + this.filteringResearchersAsync = false; - this.route.data.subscribe(value => { - if (value.clone == false && this.formGroup.get("label").value) { - this.labelDisabled = true; - } - this.formGroup.controls["version"].disable(); - }) + // this.filteredOrganisations = items.filter((filteredObj: any) => { + // return this.objectsModel ? this.objectsModel.indexOf(filteredObj) < 0 : true; + // }); + + }); } + } - formSubmit(): void { - //this.touchAllFormFields(this.formGroup); - if (!this.isFormValid()) { return; } - this.onSubmit(); + filterProfiles(value: string): void { + + this.filteredProfiles = undefined; + if (value) { + this.filteredProfilesAsync = true; + + // this.externalSourcesService.searchDMPProfiles(value).subscribe(items => { + // this.filteredProfiles = items; + // this.filteredProfilesAsync = false; + + // // this.filteredOrganisations = items.filter((filteredObj: any) => { + // // return this.objectsModel ? this.objectsModel.indexOf(filteredObj) < 0 : true; + // // }); + + // }); + + const request = new RequestItem(); + let criteria = new DatasetProfileCriteria(); + criteria.like = value; + request.criteria = criteria; + this._service.searchDMPProfiles(request).subscribe(items => { + this.filteredProfiles = items; + this.filteredProfilesAsync = false; + }); } + } - public isFormValid() { - return this.formGroup.valid; - } - - onSubmit(): void { - this.dataManagementPlanService.createDataManagementPlan(this.formGroup.getRawValue()).subscribe( - complete => this.onCallbackSuccess(), - error => this.onCallbackError(error) - ); - } - - onCallbackSuccess(): void { - this.snackBar.openFromComponent(SnackBarNotificationComponent, { - data: { message: this.isNew ? 'GENERAL.SNACK-BAR.SUCCESSFUL-CREATION' : 'GENERAL.SNACK-BAR.SUCCESSFUL-UPDATE', language: this.language }, - duration: 3000, - extraClasses: ['snackbar-success'] - }) - this.router.navigate(['/dmps']); - } - - onCallbackError(error: any) { - this.setErrorModel(error.error); - //this.validateAllFormFields(this.formGroup); - } - - public setErrorModel(errorModel: BaseErrorModel) { - Object.keys(errorModel).forEach(item => { - // (this.dataManagementPlan.errorModel)[item] = (errorModel)[item]; - }) - } - - public cancel(): void { - this.router.navigate(['/dmps']); - } - - filterOrganisations(value: string): void { - - this.filteredOrganisations = undefined; - if (value) { - this.filteringOrganisationsAsync = true; - - this.externalSourcesService.searchDMPOrganizations(value).subscribe(items => { - this.filteredOrganisations = items; - this.filteringOrganisationsAsync = false; - - // this.filteredOrganisations = items.filter((filteredObj: any) => { - // return this.objectsModel ? this.objectsModel.indexOf(filteredObj) < 0 : true; - // }); - - }); - - } - } - - filterResearchers(value: string): void { - - this.filteredResearchers = undefined; - if (value) { - this.filteringResearchersAsync = true; - - this.externalSourcesService.searchDMPResearchers({ criteria: { name: value, like: null } }).subscribe(items => { - this.filteredResearchers = items; - this.filteringResearchersAsync = false; - - // this.filteredOrganisations = items.filter((filteredObj: any) => { - // return this.objectsModel ? this.objectsModel.indexOf(filteredObj) < 0 : true; - // }); - - }); - } - } - - filterProfiles(value: string): void { - - this.filteredProfiles = undefined; - if (value) { - this.filteredProfilesAsync = true; - - // this.externalSourcesService.searchDMPProfiles(value).subscribe(items => { - // this.filteredProfiles = items; - // this.filteredProfilesAsync = false; - - // // this.filteredOrganisations = items.filter((filteredObj: any) => { - // // return this.objectsModel ? this.objectsModel.indexOf(filteredObj) < 0 : true; - // // }); - - // }); - - const request = new RequestItem(); - let criteria = new DatasetProfileCriteria(); - criteria.like = value; - request.criteria = criteria; - this._service.searchDMPProfiles(request).subscribe(items => { - this.filteredProfiles = items; - this.filteredProfilesAsync = false; - }); - } - } - -} \ No newline at end of file +} diff --git a/dmp-frontend/src/app/dmps/wizard/listing/dataset-wizard-listing.component.ts b/dmp-frontend/src/app/dmps/wizard/listing/dataset-wizard-listing.component.ts index b9a2a74d4..97f74830f 100644 --- a/dmp-frontend/src/app/dmps/wizard/listing/dataset-wizard-listing.component.ts +++ b/dmp-frontend/src/app/dmps/wizard/listing/dataset-wizard-listing.component.ts @@ -19,63 +19,62 @@ import { SelectionModel } from '@angular/cdk/collections'; @Component({ - selector: 'app-dataset-wizard-listing-component', - templateUrl: 'dataset-wizard-listing.component.html', - styleUrls: ['./dataset-wizard-listing.component.scss'], - providers: [DatasetService, DataManagementPlanService] + selector: 'app-dataset-wizard-listing-component', + templateUrl: 'dataset-wizard-listing.component.html', + styleUrls: ['./dataset-wizard-listing.component.scss'], }) export class DatasetWizardListingComponent implements OnInit { - @ViewChild(MatPaginator) _paginator: MatPaginator; - @ViewChild(MatSort) sort: MatSort; - @ViewChild(DatasetCriteriaComponent) criteria: DatasetCriteriaComponent; + @ViewChild(MatPaginator) _paginator: MatPaginator; + @ViewChild(MatSort) sort: MatSort; + @ViewChild(DatasetCriteriaComponent) criteria: DatasetCriteriaComponent; - titlePrefix: String; - datasets: DatasetListingModel[] = [] + titlePrefix: String; + datasets: DatasetListingModel[] = [] - @Input() dmpId: String; - @Input() formGroup: FormGroup - selection = new SelectionModel(true, []); + @Input() dmpId: String; + @Input() formGroup: FormGroup + selection = new SelectionModel(true, []); - statuses = [ - { value: '0', viewValue: 'Active' }, - { value: '1', viewValue: 'Inactive' } - ]; + statuses = [ + { value: '0', viewValue: 'Active' }, + { value: '1', viewValue: 'Inactive' } + ]; - constructor( - private datasetService: DatasetService, - private router: Router, - private languageService: TranslateService, - public snackBar: MatSnackBar, - public route: ActivatedRoute, - public dataManagementPlanService: DataManagementPlanService - ) { + constructor( + private datasetService: DatasetService, + private router: Router, + private languageService: TranslateService, + public snackBar: MatSnackBar, + public route: ActivatedRoute, + public dataManagementPlanService: DataManagementPlanService + ) { - } + } - ngOnInit() { - this.route.params.subscribe((params: Params) => { - if (this.dmpId != null) - if(params['dmpLabel']!=undefined) - this.titlePrefix ="for " + params['dmpLabel']; - }); - let request: DataTableRequest = new DataTableRequest(null, null, null); - request.criteria = new DatasetCriteria(); - request.criteria.dmpIds = [this.dmpId]; - this.datasetService.getPaged(request).subscribe(items => { - this.datasets = JsonSerializer.fromJSONArray(items.data, DatasetListingModel) - }) - this.formGroup.addControl("datasets", new FormBuilder().array(new Array())) - } + ngOnInit() { + this.route.params.subscribe((params: Params) => { + if (this.dmpId != null) + if (params['dmpLabel'] != undefined) + this.titlePrefix = "for " + params['dmpLabel']; + }); + let request: DataTableRequest = new DataTableRequest(null, null, null); + request.criteria = new DatasetCriteria(); + request.criteria.dmpIds = [this.dmpId]; + this.datasetService.getPaged(request).subscribe(items => { + this.datasets = JsonSerializer.fromJSONArray(items.data, DatasetListingModel) + }) + this.formGroup.addControl("datasets", new FormBuilder().array(new Array())) + } - selectionChanged(event,selectedItems) { - this.formGroup.removeControl("datasets"); - this.formGroup.addControl("datasets", new FormBuilder().array(new Array())) - selectedItems.selectedOptions.selected.forEach(element => { - (this.formGroup.get("datasets")).push(new FormBuilder().group({ id: element.value })) - }); - } + selectionChanged(event, selectedItems) { + this.formGroup.removeControl("datasets"); + this.formGroup.addControl("datasets", new FormBuilder().array(new Array())) + selectedItems.selectedOptions.selected.forEach(element => { + (this.formGroup.get("datasets")).push(new FormBuilder().group({ id: element.value })) + }); + } } diff --git a/dmp-frontend/src/app/entities/common/rule.ts b/dmp-frontend/src/app/entities/common/rule.ts deleted file mode 100644 index 687c665b9..000000000 --- a/dmp-frontend/src/app/entities/common/rule.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Injectable } from '@angular/core'; -import {RuleStyle} from './rulestyle'; - -export class Rule { - ruleType: string; - ruleStyle: RuleStyle; - method: string; - ordinal: number; - target: string; - range: any[2]; - ruleText: string; - regex: string; - methodJs:string; -} \ No newline at end of file diff --git a/dmp-frontend/src/app/entities/common/rulestyle.ts b/dmp-frontend/src/app/entities/common/rulestyle.ts deleted file mode 100644 index 5097a69db..000000000 --- a/dmp-frontend/src/app/entities/common/rulestyle.ts +++ /dev/null @@ -1,6 +0,0 @@ - -export enum RuleStyle { - existence, - regex, - customValidation -} \ No newline at end of file diff --git a/dmp-frontend/src/app/entities/model/attribute.ts b/dmp-frontend/src/app/entities/model/attribute.ts deleted file mode 100644 index 0ba075666..000000000 --- a/dmp-frontend/src/app/entities/model/attribute.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Injectable } from '@angular/core'; -import {Rule} from '../common/rule'; -import { Source } from './source'; - -@Injectable() -export class Attribute { - id: string; - datatype:string; - ordinal:number; - defaultValue: any; - multiplicityMin: number; - multiplicityMax: number; - validationType: any; - validation : Rule[]; - sources: Source[]; - url: string; -} diff --git a/dmp-frontend/src/app/entities/model/param.ts b/dmp-frontend/src/app/entities/model/param.ts deleted file mode 100644 index 7ebecb455..000000000 --- a/dmp-frontend/src/app/entities/model/param.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Injectable } from '@angular/core'; - -@Injectable() -export class Param { - key: string; - value: string; - - constructor(){ - - } -} \ No newline at end of file diff --git a/dmp-frontend/src/app/entities/model/section.ts b/dmp-frontend/src/app/entities/model/section.ts deleted file mode 100644 index 9234283d8..000000000 --- a/dmp-frontend/src/app/entities/model/section.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Injectable } from '@angular/core'; - -@Injectable() -export class Section { - title: string; - description: string; - id: string; - defaultVisibility: boolean; - ordinal: number; - page: number; -} \ No newline at end of file diff --git a/dmp-frontend/src/app/entities/model/source.ts b/dmp-frontend/src/app/entities/model/source.ts deleted file mode 100644 index b2df7d217..000000000 --- a/dmp-frontend/src/app/entities/model/source.ts +++ /dev/null @@ -1,13 +0,0 @@ - -import { Injectable } from '@angular/core'; -import { Param } from './param'; - -@Injectable() -export class Source { - id: string; - sourceType:string; - refid: string; - behaviour: string; - params: Param[]; - -} \ No newline at end of file diff --git a/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-autocomplete/autocomplete-remote.component.html b/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-autocomplete/autocomplete-remote.component.html index d2be3f154..1092b89e9 100644 --- a/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-autocomplete/autocomplete-remote.component.html +++ b/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-autocomplete/autocomplete-remote.component.html @@ -1,3 +1,3 @@ - + titleKey="label" [formCtrl]="form.get('value')" [displayFunction]="displayWith.bind(this)" [assignValueFunction]="assign.bind(this)"> + \ No newline at end of file diff --git a/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-boolean-decision/dynamic-field-boolean-decision.component.ts b/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-boolean-decision/dynamic-field-boolean-decision.component.ts index 1535432af..1d70c749f 100644 --- a/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-boolean-decision/dynamic-field-boolean-decision.component.ts +++ b/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-boolean-decision/dynamic-field-boolean-decision.component.ts @@ -1,21 +1,20 @@ import { FormGroup } from '@angular/forms'; import { Field } from '../../../models/Field'; import { Component, Input, OnInit, ViewEncapsulation } from '@angular/core'; -import { FieldBase } from '../field-base'; @Component({ - selector: 'df-booleanDecision', - templateUrl: './dynamic-field-boolean-decision.component.html', - styleUrls: [ - './dynamic-field-boolean-decision.component.css' - ], - encapsulation: ViewEncapsulation.None + selector: 'df-booleanDecision', + templateUrl: './dynamic-field-boolean-decision.component.html', + styleUrls: [ + './dynamic-field-boolean-decision.component.css' + ], + encapsulation: ViewEncapsulation.None }) -export class DynamicFieldBooleanDecisionComponent implements OnInit{ - @Input() field: Field; - @Input() form: FormGroup; +export class DynamicFieldBooleanDecisionComponent implements OnInit { + @Input() field: Field; + @Input() form: FormGroup; - ngOnInit(){ + ngOnInit() { - } -} \ No newline at end of file + } +} diff --git a/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-checkbox/dynamic-field-checkbox.ts b/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-checkbox/dynamic-field-checkbox.ts index bc6ec6a11..e676abf16 100644 --- a/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-checkbox/dynamic-field-checkbox.ts +++ b/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-checkbox/dynamic-field-checkbox.ts @@ -1,18 +1,17 @@ import { Field } from '../../../models/Field'; import { FormGroup } from '@angular/forms'; import { Component, Input, ViewEncapsulation, OnInit } from '@angular/core'; -import { FieldBase } from '../field-base'; @Component({ - selector: 'df-checkbox', - templateUrl: './dynamic-field-checkbox.html', - styleUrls: [ - './dynamic-field-checkbox.css' - ], - encapsulation: ViewEncapsulation.None + selector: 'df-checkbox', + templateUrl: './dynamic-field-checkbox.html', + styleUrls: [ + './dynamic-field-checkbox.css' + ], + encapsulation: ViewEncapsulation.None }) export class DynamicFieldCheckBoxComponent { - @Input() field: Field; - @Input() form: FormGroup; + @Input() field: Field; + @Input() form: FormGroup; -} \ No newline at end of file +} diff --git a/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-dropdown/dynamic-field-dropdown.ts b/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-dropdown/dynamic-field-dropdown.ts index d18c78f35..a38e75bd1 100644 --- a/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-dropdown/dynamic-field-dropdown.ts +++ b/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-dropdown/dynamic-field-dropdown.ts @@ -1,21 +1,20 @@ import { FormGroup } from '@angular/forms'; import { Field } from '../../../models/Field'; import { Component, Input, OnInit, ViewEncapsulation } from '@angular/core'; -import { FieldBase } from '../field-base'; @Component({ - selector: 'df-dropdown', - templateUrl: './dynamic-field-dropdown.html', - styleUrls: [ - './dynamic-field-dropdown.css' - ], - encapsulation: ViewEncapsulation.None + selector: 'df-dropdown', + templateUrl: './dynamic-field-dropdown.html', + styleUrls: [ + './dynamic-field-dropdown.css' + ], + encapsulation: ViewEncapsulation.None }) export class DynamicFieldDropdownComponent implements OnInit { - @Input() field: Field; - @Input() form: FormGroup; + @Input() field: Field; + @Input() form: FormGroup; - ngOnInit() { + ngOnInit() { - } -} \ No newline at end of file + } +} diff --git a/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-radiobox/dynamic-field-radiobox.component.ts b/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-radiobox/dynamic-field-radiobox.component.ts index c107b156d..9bf45b962 100644 --- a/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-radiobox/dynamic-field-radiobox.component.ts +++ b/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-radiobox/dynamic-field-radiobox.component.ts @@ -1,21 +1,21 @@ import { FormGroup } from '@angular/forms'; import { Field } from '../../../models/Field'; import { Component, Input, OnInit, ViewEncapsulation } from '@angular/core'; -import { FieldBase } from '../field-base'; + @Component({ - selector: 'df-radiobox', - templateUrl: './dynamic-field-radiobox.component.html', - styleUrls: [ - './dynamic-field-radiobox.component.css' - ], - encapsulation: ViewEncapsulation.None + selector: 'df-radiobox', + templateUrl: './dynamic-field-radiobox.component.html', + styleUrls: [ + './dynamic-field-radiobox.component.css' + ], + encapsulation: ViewEncapsulation.None }) export class DynamicFieldRadioBoxComponent implements OnInit { - @Input() field: Field; - @Input() form: FormGroup; + @Input() field: Field; + @Input() form: FormGroup; - ngOnInit() { + ngOnInit() { - } -} \ No newline at end of file + } +} diff --git a/dmp-frontend/src/app/form/dynamic-fields/dynamic-form-field.component.ts b/dmp-frontend/src/app/form/dynamic-fields/dynamic-form-field.component.ts index f12fa47e8..b9befd157 100644 --- a/dmp-frontend/src/app/form/dynamic-fields/dynamic-form-field.component.ts +++ b/dmp-frontend/src/app/form/dynamic-fields/dynamic-form-field.component.ts @@ -1,55 +1,51 @@ -import { VisibilityRulesService } from '../../visibility-rules/visibility-rules.service'; -import { VisibilityRuleSource } from '../../visibility-rules/models/VisibilityRuleSource'; import { Field } from '../../models/Field'; import { Component, Input, OnInit, ViewEncapsulation } from '@angular/core'; import { FormGroup, ValidatorFn, AbstractControl, Validators } from '@angular/forms'; import { ActivatedRoute } from '@angular/router'; - -import { FieldBase } from './field-base'; -import { RuleStyle } from '../../entities/common/rulestyle'; +import { VisibilityRulesService } from '../../utilities/visibility-rules/visibility-rules.service'; @Component({ - selector: 'df-field', - templateUrl: './dynamic-form-field.component.html', - // styles: ['.checkBoxLabelCustom {font-weight: 700;}'] - styleUrls: [ - './dynamic-form-field.component.css' - ], - encapsulation: ViewEncapsulation.None + selector: 'df-field', + templateUrl: './dynamic-form-field.component.html', + // styles: ['.checkBoxLabelCustom {font-weight: 700;}'] + styleUrls: [ + './dynamic-form-field.component.css' + ], + encapsulation: ViewEncapsulation.None }) -export class DynamicFormFieldComponent implements OnInit{ - @Input() field: Field; - @Input() form: FormGroup; - @Input() pathName:string; - @Input() path:string; - - constructor(private route: ActivatedRoute,private visibilityRulesService:VisibilityRulesService) { } +export class DynamicFormFieldComponent implements OnInit { + @Input() field: Field; + @Input() form: FormGroup; + @Input() pathName: string; + @Input() path: string; - ngOnInit(){ - this.form.get('value').valueChanges.subscribe(item => { - this.visibilityRulesService.updateValueAndVisibility(this.field.id) - }) - } + constructor(private route: ActivatedRoute, private visibilityRulesService: VisibilityRulesService) { } - ngOnChanges(changeRecord) { - - } + ngOnInit() { + this.form.get('value').valueChanges.subscribe(item => { + this.visibilityRulesService.updateValueAndVisibility(this.field.id) + }) + } - clearInput(){ - } + ngOnChanges(changeRecord) { - get isValid() { - return this.form.get("value").valid; - } - get isValidRequired() { - return this.form.get("value").hasError("required"); - } - get isValidPattern() { - return this.form.get("value").hasError("pattern"); - } - get isValidCustom() { - return this.form.get("value").hasError("forbiddenName"); - } -} \ No newline at end of file + } + + clearInput() { + } + + get isValid() { + return this.form.get("value").valid; + } + get isValidRequired() { + return this.form.get("value").hasError("required"); + } + get isValidPattern() { + return this.form.get("value").hasError("pattern"); + } + get isValidCustom() { + return this.form.get("value").hasError("forbiddenName"); + } +} diff --git a/dmp-frontend/src/app/form/dynamic-fields/field-base.ts b/dmp-frontend/src/app/form/dynamic-fields/field-base.ts deleted file mode 100644 index 21882a23f..000000000 --- a/dmp-frontend/src/app/form/dynamic-fields/field-base.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { Rule } from '../../entities/common/rule'; -import { Attribute } from '../../entities/model/attribute'; - -export class FieldBase{ - value: T; - key: string; - label: string; - required:boolean; - order:number; - rules: Rule[]; - visible: boolean | string; - controlType:string; - group:string; - description:string; - attributes: Attribute; - regex:string; - url: string; - datatype: string; - - constructor(options: { - value?: T, - key?: string, - label?: string, - required?:boolean, - order?: number, - rules?: Rule[], - visible?: boolean | string, - controlType?: string - group?: string - description?: string, - attributes?: Attribute, - regex?:string, - url?: string, - datatype?:string - } = {}) { - this.value = options.value; - this.key = options.key || ''; - this.label = options.label || ''; - this.required = !! options.required; - this.order = options.order === undefined ? 1 : options.order; - this.rules = options.rules; - this.visible = options.visible; - this.controlType = options.controlType || ''; - this.group = options.group || ''; - this.description = options.description || ''; - this.attributes = options.attributes || new Attribute(); - this.regex = options.regex || ''; - this.url = options.url || ""; - this.datatype = options.datatype || ""; - } -} \ No newline at end of file diff --git a/dmp-frontend/src/app/form/dynamic-form-composite-field/dynamic-form-composite-field.ts b/dmp-frontend/src/app/form/dynamic-form-composite-field/dynamic-form-composite-field.ts index f90ca0daf..02cddeadd 100644 --- a/dmp-frontend/src/app/form/dynamic-form-composite-field/dynamic-form-composite-field.ts +++ b/dmp-frontend/src/app/form/dynamic-form-composite-field/dynamic-form-composite-field.ts @@ -1,7 +1,6 @@ -import { VisibilityRulesService } from '../../visibility-rules/visibility-rules.service'; +import { VisibilityRulesService } from '../../utilities/visibility-rules/visibility-rules.service'; import { CompositeField } from '../../models/CompositeField'; import { FormGroup, FormArray } from '@angular/forms'; -import { Section } from '../../entities/model/section'; import { Component, Input, OnInit, ViewEncapsulation } from '@angular/core'; import { Field } from '../../models/Field'; @Component({ @@ -30,5 +29,5 @@ export class DynamicFormCompositeFieldComponent implements OnInit { ((this.form.get("fields").get('' + fieldIndex).get('multiplicityItems'))).push(field.buildForm()); } - -} \ No newline at end of file + +} diff --git a/dmp-frontend/src/app/form/dynamic-form-group/dynamic-form-group.component.ts b/dmp-frontend/src/app/form/dynamic-form-group/dynamic-form-group.component.ts index e7e0b1331..4e0c0e301 100644 --- a/dmp-frontend/src/app/form/dynamic-form-group/dynamic-form-group.component.ts +++ b/dmp-frontend/src/app/form/dynamic-form-group/dynamic-form-group.component.ts @@ -1,9 +1,8 @@ -import { VisibilityRulesService } from '../../visibility-rules/visibility-rules.service'; +import { VisibilityRulesService } from '../../utilities/visibility-rules/visibility-rules.service'; import { FieldGroup } from '../../models/FieldGroup'; import { Component, Input, OnInit, ViewEncapsulation } from '@angular/core'; import { FormGroup, Validators, FormControl, FormArray } from '@angular/forms'; import { NgForm } from '@angular/forms'; -import { Rule } from '../../entities/common/rule'; import { CompositeField } from '../../models/CompositeField'; diff --git a/dmp-frontend/src/app/form/dynamic-form-section/dynamic-form-section.ts b/dmp-frontend/src/app/form/dynamic-form-section/dynamic-form-section.ts index b0915dd2b..f3075af11 100644 --- a/dmp-frontend/src/app/form/dynamic-form-section/dynamic-form-section.ts +++ b/dmp-frontend/src/app/form/dynamic-form-section/dynamic-form-section.ts @@ -1,4 +1,4 @@ -import { VisibilityRulesService } from '../../visibility-rules/visibility-rules.service'; +import { VisibilityRulesService } from '../../utilities/visibility-rules/visibility-rules.service'; import { FormGroup, Form, FormArray } from '@angular/forms'; import { Component, Input, OnInit, ViewEncapsulation } from '@angular/core'; import { CompositeField } from '../../models/CompositeField'; @@ -38,4 +38,4 @@ export class DynamicFormSectionComponent implements OnInit { } return false; } -} \ No newline at end of file +} diff --git a/dmp-frontend/src/app/form/dynamic-form.module.ts b/dmp-frontend/src/app/form/dynamic-form.module.ts index fb2786319..7d55a0c30 100644 --- a/dmp-frontend/src/app/form/dynamic-form.module.ts +++ b/dmp-frontend/src/app/form/dynamic-form.module.ts @@ -1,6 +1,6 @@ import { TranslateHttpLoader } from '@ngx-translate/http-loader'; import { PaginationService } from '../services/pagination.service'; -import { VisibilityRulesService } from '../visibility-rules/visibility-rules.service'; +import { VisibilityRulesService } from '../utilities/visibility-rules/visibility-rules.service'; import { DynamicFieldCheckBoxComponent } from './dynamic-fields/dynamic-field-checkbox/dynamic-field-checkbox'; import { ProgressBarComponent } from './pprogress-bar/progress-bar.component'; import { TableOfContentsFieldComponent } from './tableOfContents/table-of-content-field/table-of-content-field.component'; @@ -8,16 +8,16 @@ import { DynamicFormSectionComponent } from './dynamic-form-section/dynamic-form import { DynamicFieldDropdownComponent } from './dynamic-fields/dynamic-field-dropdown/dynamic-field-dropdown'; import { AutocompleteRemoteComponent } from './dynamic-fields/dynamic-field-autocomplete/autocomplete-remote.component'; import { - TableOfContentsSectionComponent, + TableOfContentsSectionComponent, } from './tableOfContents/table-of-content-section/table-of-content-section.component'; import { TableOfContentsGroupComponent } from './tableOfContents/table-of-content-group/table-of-content-group.component'; import { - TableOfContentsFieldSetComponent, + TableOfContentsFieldSetComponent, } from './tableOfContents/table-of-content-fieldset/table-of-content-fieldset.component'; import { DynamicFieldRadioBoxComponent } from './dynamic-fields/dynamic-field-radiobox/dynamic-field-radiobox.component'; import { TableOfContentsComponent } from './tableOfContents/table-of-contents.component'; import { - DynamicFieldBooleanDecisionComponent, + DynamicFieldBooleanDecisionComponent, } from './dynamic-fields/dynamic-field-boolean-decision/dynamic-field-boolean-decision.component'; import { DynamicFormGroupComponent } from './dynamic-form-group/dynamic-form-group.component'; import { DynamicFormCompositeFieldComponent } from './dynamic-form-composite-field/dynamic-form-composite-field'; @@ -34,68 +34,68 @@ import { DatasetProfileService } from '../services/dataset-profile.service'; @NgModule({ - imports: [ - CommonModule, - FormsModule, - HttpClientModule, - SharedModule, - ReactiveFormsModule, - TranslateModule.forRoot({ - loader: { - provide: TranslateLoader, - useFactory: HttpLoaderFactory, - deps: [HttpClient] - } - }), - ], + imports: [ + CommonModule, + FormsModule, + HttpClientModule, + SharedModule, + ReactiveFormsModule, + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useFactory: HttpLoaderFactory, + deps: [HttpClient] + } + }), + ], - declarations: [ - DynamicFormComponent, - DynamicFormFieldComponent, - DynamicFormGroupComponent, - DynamicFormCompositeFieldComponent, - DynamicFieldBooleanDecisionComponent, - DynamicFieldRadioBoxComponent, - TableOfContentsComponent, - TableOfContentsFieldSetComponent, - TableOfContentsGroupComponent, - TableOfContentsSectionComponent, - AutocompleteRemoteComponent, - DynamicFieldDropdownComponent, - DynamicFormSectionComponent, - TableOfContentsFieldComponent, - ProgressBarComponent, - DynamicFieldCheckBoxComponent, - ], + declarations: [ + DynamicFormComponent, + DynamicFormFieldComponent, + DynamicFormGroupComponent, + DynamicFormCompositeFieldComponent, + DynamicFieldBooleanDecisionComponent, + DynamicFieldRadioBoxComponent, + TableOfContentsComponent, + TableOfContentsFieldSetComponent, + TableOfContentsGroupComponent, + TableOfContentsSectionComponent, + AutocompleteRemoteComponent, + DynamicFieldDropdownComponent, + DynamicFormSectionComponent, + TableOfContentsFieldComponent, + ProgressBarComponent, + DynamicFieldCheckBoxComponent, + ], - exports: [ - DynamicFormComponent, - DynamicFormFieldComponent, - DynamicFormGroupComponent, - DynamicFormCompositeFieldComponent, - DynamicFieldBooleanDecisionComponent, - DynamicFieldRadioBoxComponent, - TableOfContentsComponent, - TableOfContentsFieldSetComponent, - TableOfContentsGroupComponent, - TableOfContentsSectionComponent, - AutocompleteRemoteComponent, - DynamicFieldDropdownComponent, - DynamicFormSectionComponent, - TableOfContentsFieldComponent, - ProgressBarComponent, - DynamicFieldCheckBoxComponent, - ], - providers:[ - VisibilityRulesService, - PaginationService, - DatasetProfileService, - DatasetProfileAdmin - ] + exports: [ + DynamicFormComponent, + DynamicFormFieldComponent, + DynamicFormGroupComponent, + DynamicFormCompositeFieldComponent, + DynamicFieldBooleanDecisionComponent, + DynamicFieldRadioBoxComponent, + TableOfContentsComponent, + TableOfContentsFieldSetComponent, + TableOfContentsGroupComponent, + TableOfContentsSectionComponent, + AutocompleteRemoteComponent, + DynamicFieldDropdownComponent, + DynamicFormSectionComponent, + TableOfContentsFieldComponent, + ProgressBarComponent, + DynamicFieldCheckBoxComponent, + ], + providers: [ + VisibilityRulesService, + PaginationService, + DatasetProfileService, + DatasetProfileAdmin + ] }) export class DynamicFormModule { } export function HttpLoaderFactory(httpClient: HttpClient) { - return new TranslateHttpLoader(httpClient, 'assets/lang/', '.json'); -} \ No newline at end of file + return new TranslateHttpLoader(httpClient, 'assets/lang/', '.json'); +} diff --git a/dmp-frontend/src/app/form/dynamic-form/dynamic-form.component.ts b/dmp-frontend/src/app/form/dynamic-form/dynamic-form.component.ts index 3a380f70d..9ddbc5678 100644 --- a/dmp-frontend/src/app/form/dynamic-form/dynamic-form.component.ts +++ b/dmp-frontend/src/app/form/dynamic-form/dynamic-form.component.ts @@ -3,7 +3,7 @@ import { JsonSerializer } from '../../utilities/JsonSerializer'; import { Rule } from '../../models/Rule'; import { DatasetWizardService } from '../../services/dataset-wizard/dataset-wizard.service'; import { BaseHttpService } from '../../utilities/cite-http-service-module/base-http.service'; -import { VisibilityRulesService } from '../../visibility-rules/visibility-rules.service'; +import { VisibilityRulesService } from '../../utilities/visibility-rules/visibility-rules.service'; import { DatasetProfileDefinitionModel } from '../../models/DatasetProfileDefinitionModel'; import { DatasetWizardModel } from '../../models/datasets/DatasetWizardModel'; import { Component, Input, OnInit, AfterViewChecked, ViewChild, forwardRef, ViewEncapsulation } from '@angular/core'; @@ -124,4 +124,4 @@ export class DynamicFormComponent implements OnInit { if (pageIndex === -1) return; this.currentPageIndex = page; } -} \ No newline at end of file +} diff --git a/dmp-frontend/src/app/form/pprogress-bar/progress-bar.component.ts b/dmp-frontend/src/app/form/pprogress-bar/progress-bar.component.ts index 58f757f96..752fe6d5c 100644 --- a/dmp-frontend/src/app/form/pprogress-bar/progress-bar.component.ts +++ b/dmp-frontend/src/app/form/pprogress-bar/progress-bar.component.ts @@ -1,69 +1,69 @@ -import { VisibilityRulesService } from '../../visibility-rules/visibility-rules.service'; +import { VisibilityRulesService } from '../../utilities/visibility-rules/visibility-rules.service'; import { ViewEncapsulation } from '@angular/core'; import { Component, Input, OnInit } from '@angular/core'; import { FormGroup, FormControl, FormArray } from '@angular/forms' @Component({ - selector: 'progress-bar', - templateUrl: './progress-bar.component.html', - styles: ['.alwaysVisible .ui-progressbar-label { display:block!important; }'], - encapsulation: ViewEncapsulation.None + selector: 'progress-bar', + templateUrl: './progress-bar.component.html', + styles: ['.alwaysVisible .ui-progressbar-label { display:block!important; }'], + encapsulation: ViewEncapsulation.None }) export class ProgressBarComponent implements OnInit { - @Input() formGroup: FormGroup - @Input("progressValueAccuracy") public accuracy: number = 1; - determinateProgressValue: number; + @Input() formGroup: FormGroup + @Input("progressValueAccuracy") public accuracy: number = 1; + determinateProgressValue: number; - constructor(private visibilityRulesService: VisibilityRulesService) { } + constructor(private visibilityRulesService: VisibilityRulesService) { } - private value: number = 0; - ngOnInit() { - this.calculateValueForProgressbar() - this.formGroup - .valueChanges - .subscribe(control => { - this.calculateValueForProgressbar(); - }); - } + private value: number = 0; + ngOnInit() { + this.calculateValueForProgressbar() + this.formGroup + .valueChanges + .subscribe(control => { + this.calculateValueForProgressbar(); + }); + } - calculateValueForProgressbar() { - var progressSoFar = this.countFormControlsWithValue(this.formGroup); - var total = this.getFormControlDepthLength(this.formGroup); - var perc = (progressSoFar / total) * 100; - this.value = Number.parseFloat(perc.toPrecision(this.accuracy)); - } + calculateValueForProgressbar() { + var progressSoFar = this.countFormControlsWithValue(this.formGroup); + var total = this.getFormControlDepthLength(this.formGroup); + var perc = (progressSoFar / total) * 100; + this.value = Number.parseFloat(perc.toPrecision(this.accuracy)); + } - countFormControlsWithValue(form: FormGroup): number { - let value = 0; - Object.keys(form.controls).forEach(key => { - let control = form.controls[key] - if (control instanceof FormGroup) value += this.countFormControlsWithValue(control); - else if (control instanceof FormArray) { - let formArray = (control); - for (let i = 0; i < formArray.length; i++) { - value += this.countFormControlsWithValue(formArray.get("" + i)) - } - } - else if (key === "value" && control.value != null && control.value != "") value++; - }); - return value; - } + countFormControlsWithValue(form: FormGroup): number { + let value = 0; + Object.keys(form.controls).forEach(key => { + let control = form.controls[key] + if (control instanceof FormGroup) value += this.countFormControlsWithValue(control); + else if (control instanceof FormArray) { + let formArray = (control); + for (let i = 0; i < formArray.length; i++) { + value += this.countFormControlsWithValue(formArray.get("" + i)) + } + } + else if (key === "value" && control.value != null && control.value != "") value++; + }); + return value; + } - getFormControlDepthLength(form: FormGroup): number { - let value = 0; - Object.keys(form.controls).forEach(key => { - let control = form.controls[key]; - if (control instanceof FormGroup) { value += this.getFormControlDepthLength(control); } - else if (control instanceof FormArray) { - let formArray = (control); - for (let i = 0; i < formArray.length; i++) { - if (formArray.get("" + i).value && this.visibilityRulesService.isElementVisible(null, formArray.get("" + i).value.id)) - value += this.getFormControlDepthLength(formArray.get("" + i)) - } - } - else if (key === "value" && this.visibilityRulesService.isElementVisible(null, form.controls["id"].value)) - value++; - }); - return value; - } -} \ No newline at end of file + getFormControlDepthLength(form: FormGroup): number { + let value = 0; + Object.keys(form.controls).forEach(key => { + let control = form.controls[key]; + if (control instanceof FormGroup) { value += this.getFormControlDepthLength(control); } + else if (control instanceof FormArray) { + let formArray = (control); + for (let i = 0; i < formArray.length; i++) { + if (formArray.get("" + i).value && this.visibilityRulesService.isElementVisible(null, formArray.get("" + i).value.id)) + value += this.getFormControlDepthLength(formArray.get("" + i)) + } + } + else if (key === "value" && this.visibilityRulesService.isElementVisible(null, form.controls["id"].value)) + value++; + }); + return value; + } +} diff --git a/dmp-frontend/src/app/form/tableOfContents/table-of-content-field/table-of-content-field.component.ts b/dmp-frontend/src/app/form/tableOfContents/table-of-content-field/table-of-content-field.component.ts index 1cd52a4b7..739f159e2 100644 --- a/dmp-frontend/src/app/form/tableOfContents/table-of-content-field/table-of-content-field.component.ts +++ b/dmp-frontend/src/app/form/tableOfContents/table-of-content-field/table-of-content-field.component.ts @@ -1,23 +1,23 @@ -import { VisibilityRulesService } from '../../../visibility-rules/visibility-rules.service'; +import { VisibilityRulesService } from '../../../utilities/visibility-rules/visibility-rules.service'; import { BaseTableOfContent } from '../base-table-of-content.component'; import { CompositeField } from '../../../models/CompositeField'; import { Field } from '../../../models/Field'; import { Section } from '../../../models/Section'; import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core'; -import {Router, ActivatedRoute} from '@angular/router' +import { Router, ActivatedRoute } from '@angular/router' @Component({ - selector: 'table-of-contents-field', - templateUrl: './table-of-content-field.component.html', - providers: [] - }) -export class TableOfContentsFieldComponent extends BaseTableOfContent{ - @Input() model:Field; - @Input() index:number; - @Input() public path:string; - @Input() public page: number; - constructor(public router: Router, public route: ActivatedRoute,private visibilityRulesService: VisibilityRulesService) { - super(router, route) - } -} \ No newline at end of file + selector: 'table-of-contents-field', + templateUrl: './table-of-content-field.component.html', + providers: [] +}) +export class TableOfContentsFieldComponent extends BaseTableOfContent { + @Input() model: Field; + @Input() index: number; + @Input() public path: string; + @Input() public page: number; + constructor(public router: Router, public route: ActivatedRoute, private visibilityRulesService: VisibilityRulesService) { + super(router, route) + } +} diff --git a/dmp-frontend/src/app/form/tableOfContents/table-of-content-fieldset/table-of-content-fieldset.component.ts b/dmp-frontend/src/app/form/tableOfContents/table-of-content-fieldset/table-of-content-fieldset.component.ts index 8b4f8be8a..4a3235336 100644 --- a/dmp-frontend/src/app/form/tableOfContents/table-of-content-fieldset/table-of-content-fieldset.component.ts +++ b/dmp-frontend/src/app/form/tableOfContents/table-of-content-fieldset/table-of-content-fieldset.component.ts @@ -1,4 +1,4 @@ -import { VisibilityRulesService } from '../../../visibility-rules/visibility-rules.service'; +import { VisibilityRulesService } from '../../../utilities/visibility-rules/visibility-rules.service'; import { BaseTableOfContent } from '../base-table-of-content.component'; import { CompositeField } from '../../../models/CompositeField'; import { FieldGroup } from '../../../models/FieldGroup'; @@ -20,7 +20,7 @@ export class TableOfContentsFieldSetComponent extends BaseTableOfContent { @Input() index: number; @Input() public path: string; @Input() public page: number; - constructor(public router: Router, public route: ActivatedRoute,private visibilityRulesService: VisibilityRulesService) { + constructor(public router: Router, public route: ActivatedRoute, private visibilityRulesService: VisibilityRulesService) { super(router, route) } } diff --git a/dmp-frontend/src/app/form/tableOfContents/table-of-content-group/table-of-content-group.component.ts b/dmp-frontend/src/app/form/tableOfContents/table-of-content-group/table-of-content-group.component.ts index 6c8124e5e..71a88dac1 100644 --- a/dmp-frontend/src/app/form/tableOfContents/table-of-content-group/table-of-content-group.component.ts +++ b/dmp-frontend/src/app/form/tableOfContents/table-of-content-group/table-of-content-group.component.ts @@ -1,9 +1,9 @@ -import { VisibilityRulesService } from '../../../visibility-rules/visibility-rules.service'; +import { VisibilityRulesService } from '../../../utilities/visibility-rules/visibility-rules.service'; import { BaseTableOfContent } from '../base-table-of-content.component'; import { FieldGroup } from '../../../models/FieldGroup'; import { Section } from '../../../models/Section'; import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core'; -import {Router, ActivatedRoute} from '@angular/router' +import { Router, ActivatedRoute } from '@angular/router' //import * as $ from '../../../../node_modules/jquery/dist/jquery' @@ -12,7 +12,7 @@ import {Router, ActivatedRoute} from '@angular/router' templateUrl: './table-of-content-group.component.html', providers: [] }) -export class TableOfContentsGroupComponent extends BaseTableOfContent { +export class TableOfContentsGroupComponent extends BaseTableOfContent { @Input() model: FieldGroup; @Input() index: number; @@ -22,9 +22,9 @@ export class TableOfContentsGroupComponent extends BaseTableOfContent { setPage:EventEmitter = new EventEmitter(); */ - constructor(public router: Router, public route: ActivatedRoute,private visibilityRulesService: VisibilityRulesService) { + constructor(public router: Router, public route: ActivatedRoute, private visibilityRulesService: VisibilityRulesService) { super(router, route) } -} \ No newline at end of file +} diff --git a/dmp-frontend/src/app/form/tableOfContents/table-of-content-section/table-of-content-section.component.ts b/dmp-frontend/src/app/form/tableOfContents/table-of-content-section/table-of-content-section.component.ts index d205a6f38..fc62e6eb2 100644 --- a/dmp-frontend/src/app/form/tableOfContents/table-of-content-section/table-of-content-section.component.ts +++ b/dmp-frontend/src/app/form/tableOfContents/table-of-content-section/table-of-content-section.component.ts @@ -1,8 +1,8 @@ -import { VisibilityRulesService } from '../../../visibility-rules/visibility-rules.service'; +import { VisibilityRulesService } from '../../../utilities/visibility-rules/visibility-rules.service'; import { BaseTableOfContent } from '../base-table-of-content.component'; import { Section } from '../../../models/Section'; import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core'; -import { ActivatedRouteSnapshot,Router,ActivatedRoute } from '@angular/router'; +import { ActivatedRouteSnapshot, Router, ActivatedRoute } from '@angular/router'; //import * as $ from '../../../../node_modules/jquery/dist/jquery' @@ -18,11 +18,11 @@ export class TableOfContentsSectionComponent extends BaseTableOfContent implemen @Input() index: number; @Input() public path: string; @Input() public page: number; - constructor(public router: Router,public route:ActivatedRoute,private visibilityRulesService: VisibilityRulesService){ - super(router,route) + constructor(public router: Router, public route: ActivatedRoute, private visibilityRulesService: VisibilityRulesService) { + super(router, route) } ngOnInit() { } -} \ No newline at end of file +} diff --git a/dmp-frontend/src/app/guards/auth.guard.ts b/dmp-frontend/src/app/guards/auth.guard.ts deleted file mode 100644 index 1117cbfe2..000000000 --- a/dmp-frontend/src/app/guards/auth.guard.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { AuthService } from '../services/auth/auth.service'; -import { Injectable } from '@angular/core'; -import { Router, CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router'; - -@Injectable() -export class AuthGuard implements CanActivate { - - constructor(private auth: AuthService, private router: Router) { } - canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean { - let url: string = state.url; - if (!this.auth.current()) { - this.router.navigate(['/unauthorized'], { queryParams: { returnUrl: url } }); - return false; - } - return true; - } -} diff --git a/dmp-frontend/src/app/help-content/help-content.component.ts b/dmp-frontend/src/app/help-content/help-content.component.ts deleted file mode 100644 index 74dbed5b9..000000000 --- a/dmp-frontend/src/app/help-content/help-content.component.ts +++ /dev/null @@ -1,57 +0,0 @@ -/** - * Created by stefania on 7/17/17. - */ -import { Component, OnInit, Input } from '@angular/core'; -import { ActivatedRoute, Router, NavigationStart } from "@angular/router"; -import { PageHelpContent } from '../models/help-content/page-help-content'; -import { HelpContentService } from '../services/help-content/help-content.service'; -@Component({ - selector: 'help-content', - template: ` - - -
-
-
- `, -}) -export class HelpContentComponent implements OnInit { - @Input('position') - position: string; - contents: any[]; - errorMessage: string = null; - constructor(private _helpContentService: HelpContentService, private route: ActivatedRoute, private router: Router) { - } - ngOnInit() { - this.errorMessage = null; - this.router.events.subscribe(event => { - if (event instanceof NavigationStart) { - this._helpContentService.getActivePageContent(event["url"]).subscribe( - pageContent => this.shiftThroughContent(pageContent), - error => this.handleError(error)) - } - }) - } - shiftThroughContent(pageContent: PageHelpContent) { - this.contents = pageContent.content[this.position]; - } - isPresent() { - return (this.contents && this.contents.length > 0); - } - handleError(error) { - this.contents = [] - this.errorMessage = 'System error retrieving page content (Server responded: ' + error + ')'; - } -} -@Component({ - selector: 'aside-help-content', - template: ` - - -
-
-
- `, -}) -export class AsideHelpContentComponent extends HelpContentComponent { -} \ No newline at end of file diff --git a/dmp-frontend/src/app/homepage/homepage.component.ts b/dmp-frontend/src/app/homepage/homepage.component.ts index 06f1c2d87..80d08027c 100644 --- a/dmp-frontend/src/app/homepage/homepage.component.ts +++ b/dmp-frontend/src/app/homepage/homepage.component.ts @@ -9,7 +9,6 @@ import { AuthService } from '../services/auth/auth.service'; selector: 'homepage', templateUrl: './homepage.component.html', styleUrls: ['./homepage.component.css'], - providers: [] }) export class HomepageComponent implements OnInit { @@ -48,4 +47,4 @@ export class HomepageComponent implements OnInit { return !(!this.authentication.current()) } -} \ No newline at end of file +} diff --git a/dmp-frontend/src/app/invitation-accepted/invitation-accepted.component.ts b/dmp-frontend/src/app/invitation-accepted/invitation-accepted.component.ts deleted file mode 100644 index 5ed4bdbbd..000000000 --- a/dmp-frontend/src/app/invitation-accepted/invitation-accepted.component.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { JsonSerializer } from '../utilities/JsonSerializer'; -import { UserInvitationCriteria } from '../models/criteria/invitation/UserInvitationCriteria'; -import { RequestItem } from '../models/criteria/RequestItem'; -import { Invitation } from '../models/invitation/Invitation'; -import { InvitationService } from '../services/invitation/invitation.service'; -import { User } from '../models/invitation/User'; -import { Component, OnInit, Inject } from "@angular/core"; -import { FormGroup } from '@angular/forms'; -import { Params, ActivatedRoute, Router } from '@angular/router'; -import { MAT_DIALOG_DATA } from '@angular/material'; - -@Component({ - selector: 'app-invitation-accepted-component', - templateUrl: 'invitation-accepted.component.html', - providers: [InvitationService] - -}) -export class InvitationAcceptedComponent implements OnInit { - constructor( - private invitationService: InvitationService, - private route: ActivatedRoute, - public router: Router - ) { } - - ngOnInit(): void { - this.route.params.subscribe(params => { - let id = params["id"] - this.invitationService.exchange(id).subscribe(id=>{ - this.router.navigate(["dmps/edit/"+id]) - }) - } - ) - } -} \ No newline at end of file diff --git a/dmp-frontend/src/app/invitation/invitation.component.ts b/dmp-frontend/src/app/invitation/invitation.component.ts deleted file mode 100644 index b63c2f880..000000000 --- a/dmp-frontend/src/app/invitation/invitation.component.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { JsonSerializer } from '../utilities/JsonSerializer'; -import { UserInvitationCriteria } from '../models/criteria/invitation/UserInvitationCriteria'; -import { RequestItem } from '../models/criteria/RequestItem'; -import { Invitation } from '../models/invitation/Invitation'; -import { InvitationService } from '../services/invitation/invitation.service'; -import { User } from '../models/invitation/User'; -import { Component, OnInit, Inject } from "@angular/core"; -import { FormGroup } from '@angular/forms'; -import { Params, ActivatedRoute, Router } from '@angular/router'; -import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material'; - -@Component({ - selector: 'app-invitation-component', - templateUrl: 'invitation.component.html', - providers: [InvitationService] - -}) -export class InvitationComponent implements OnInit { - - private formGroup: FormGroup; - - private filteredUsersAsync: boolean = false; - - private filteredUsers: User[]; - - constructor( - private invitationService: InvitationService, - private route: ActivatedRoute, - public router: Router, - public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: any - ) { } - - ngOnInit(): void { - let invitation = new Invitation(); - invitation.dataManagementPlan = this.data.dmpId; - this.formGroup = invitation.buildForm(); - } - - - send(value: any) { - this.invitationService.inviteUsers(this.formGroup.value).subscribe( - null, null, () => this.dialogRef.close() - ); - } - - filterUsers(value: string): void { - this.filteredUsers = undefined; - if (value) { - this.filteredUsersAsync = true; - let request = new RequestItem(); - request.criteria = { like: value } - this.invitationService.getUsers(request).subscribe(items => { - this.filteredUsers = JsonSerializer.fromJSONArray(items, User); - if (!this.filteredUsers || this.filteredUsers.length == 0) { - let user = new User(); - user.email = value; - user.name = value; - this.filteredUsers.push(user) - } - this.filteredUsersAsync = false; - }); - } - } -} \ No newline at end of file diff --git a/dmp-frontend/src/app/models/criteria/data-repository/DataRepositoryCriteria.ts b/dmp-frontend/src/app/models/criteria/data-repository/DataRepositoryCriteria.ts new file mode 100644 index 000000000..216e81835 --- /dev/null +++ b/dmp-frontend/src/app/models/criteria/data-repository/DataRepositoryCriteria.ts @@ -0,0 +1,4 @@ +import { BaseCriteria } from '../BaseCriteria'; +export class DataRepositoryCriteria extends BaseCriteria { + public type: string; +} diff --git a/dmp-frontend/src/app/models/criteria/external-dataset/ExternalDatasetCriteria.ts b/dmp-frontend/src/app/models/criteria/external-dataset/ExternalDatasetCriteria.ts index 6682f7702..2f69c518f 100644 --- a/dmp-frontend/src/app/models/criteria/external-dataset/ExternalDatasetCriteria.ts +++ b/dmp-frontend/src/app/models/criteria/external-dataset/ExternalDatasetCriteria.ts @@ -1,4 +1,4 @@ import { BaseCriteria } from '../BaseCriteria'; -export class ExternalDatasetCriteria extends BaseCriteria{ - -} \ No newline at end of file +export class ExternalDatasetCriteria extends BaseCriteria { + public type: string; +} diff --git a/dmp-frontend/src/app/models/criteria/registry/RegistryCriteria.ts b/dmp-frontend/src/app/models/criteria/registry/RegistryCriteria.ts new file mode 100644 index 000000000..95b42c82b --- /dev/null +++ b/dmp-frontend/src/app/models/criteria/registry/RegistryCriteria.ts @@ -0,0 +1,4 @@ +import { BaseCriteria } from '../BaseCriteria'; +export class RegistryCriteria extends BaseCriteria { + public type: string; +} diff --git a/dmp-frontend/src/app/models/criteria/services/ServicesCriteria.ts b/dmp-frontend/src/app/models/criteria/services/ServicesCriteria.ts new file mode 100644 index 000000000..3b253baae --- /dev/null +++ b/dmp-frontend/src/app/models/criteria/services/ServicesCriteria.ts @@ -0,0 +1,4 @@ +import { BaseCriteria } from '../BaseCriteria'; +export class ServicesCriteria extends BaseCriteria { + public type: string; +} diff --git a/dmp-frontend/src/app/models/dataRepositories/DataRepositoryModel.ts b/dmp-frontend/src/app/models/dataRepositories/DataRepositoryModel.ts index 13d429099..693c9260f 100644 --- a/dmp-frontend/src/app/models/dataRepositories/DataRepositoryModel.ts +++ b/dmp-frontend/src/app/models/dataRepositories/DataRepositoryModel.ts @@ -1,17 +1,38 @@ import { Serializable } from "../Serializable"; +import { ValidationContext } from "../../utilities/validators/ValidationContext"; +import { FormBuilder, FormGroup } from "@angular/forms"; export class DataRepositoryModel implements Serializable { - public id: String; - public name: String; - public pid: String; - public uri: String; + public id: String; + public name: String; + public pid: String; + public uri: String; + public info: String; - fromJSONObject(item: any): DataRepositoryModel { - this.id = item.id; - this.name = item.name; - this.pid = item.pid; - this.uri = item.uri; + constructor(id?: String, name?: String, pid?: String, uri?: String, info?: String + ) { + this.id = id; + this.name = name; + this.pid = pid; + this.uri = uri; + this.info = info; + } + fromJSONObject(item: any): DataRepositoryModel { + this.id = item.id; + this.name = item.name; + this.pid = item.pid; + this.uri = item.uri; + this.info = item.info; + return this; + } - return this; - } -} \ No newline at end of file + buildForm(context: ValidationContext = null, disabled: boolean = false): FormGroup { + return new FormBuilder().group({ + id: [this.id], + name: [this.name], + pid: [this.pid], + uri: [this.uri], + info: [this.info] + }) + } +} diff --git a/dmp-frontend/src/app/models/datasets/DatasetModel.ts b/dmp-frontend/src/app/models/datasets/DatasetModel.ts index 002673c32..2a3f2df8a 100644 --- a/dmp-frontend/src/app/models/datasets/DatasetModel.ts +++ b/dmp-frontend/src/app/models/datasets/DatasetModel.ts @@ -57,7 +57,7 @@ export class DatasetModel implements Serializable { const baseContext: ValidationContext = new ValidationContext(); baseContext.validation.push({ key: 'label', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'label')] }); baseContext.validation.push({ key: 'profile', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'profile')] }); - baseContext.validation.push({ key: 'uri', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'uri')] }); + baseContext.validation.push({ key: 'uri', validators: [BackendErrorValidator(this.errorModel, 'uri')] }); baseContext.validation.push({ key: 'status', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'status')] }); baseContext.validation.push({ key: 'description', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'description')] }); baseContext.validation.push({ key: 'services', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'services')] }); diff --git a/dmp-frontend/src/app/models/datasets/DatasetWizardModel.ts b/dmp-frontend/src/app/models/datasets/DatasetWizardModel.ts index a3aeb9f62..1bff68d13 100644 --- a/dmp-frontend/src/app/models/datasets/DatasetWizardModel.ts +++ b/dmp-frontend/src/app/models/datasets/DatasetWizardModel.ts @@ -14,70 +14,109 @@ import { DataRepositoryModel } from "../dataRepositories/DataRepositoryModel"; import { ExternalDatasetModel } from '../../models/external-dataset/ExternalDatasetModel'; export class DatasetWizardModel implements Serializable { - public id: String; - public label: String; - public profile: DatasetProfileModel = new DatasetProfileModel(); - public uri: String; - public status: String; - public description: String; - public services: ServiceModel[] = []; - public registries: RegisterModel[] = []; - public dataRepositories: DataRepositoryModel[] = []; - public externalDatasets: ExternalDatasetModel[] = []; - public dmp: DataManagementPlanModel = new DataManagementPlanModel(); - public datasetProfileDefinition; - public errorModel: BaseErrorModel = new BaseErrorModel(); + public id: String; + public label: String; + public profile: DatasetProfileModel = new DatasetProfileModel(); + public uri: String; + public status: String; + public description: String; + public services: ServiceModel[] = []; + public registries: RegisterModel[] = []; + public dataRepositories: DataRepositoryModel[] = []; + public externalDatasets: ExternalDatasetModel[] = []; + public dmp: DataManagementPlanModel = new DataManagementPlanModel(); + public datasetProfileDefinition; + public errorModel: BaseErrorModel = new BaseErrorModel(); - fromJSONObject(item: any): DatasetWizardModel { - this.id = item.id; - this.label = item.label; - this.profile = item.profile; - this.uri = item.uri; - this.status = item.status; - this.description = item.description; - this.services = JsonSerializer.fromJSONArray(item.services, ServiceModel); - this.registries = JsonSerializer.fromJSONArray(item.registries, RegisterModel); - this.dataRepositories = JsonSerializer.fromJSONArray(item.dataRepositories, DataRepositoryModel); - this.dmp = JsonSerializer.fromJSONObject(item.dmp, DataManagementPlanModel); - this.profile = JsonSerializer.fromJSONObject(item.profile, DatasetProfileModel); - this.datasetProfileDefinition = JsonSerializer.fromJSONObject(item.datasetProfileDefinition, DatasetProfileDefinitionModel); - return this; - } + fromJSONObject(item: any): DatasetWizardModel { + this.id = item.id; + this.label = item.label; + this.profile = item.profile; + this.uri = item.uri; + this.status = item.status; + this.description = item.description; + this.services = JsonSerializer.fromJSONArray(item.services, ServiceModel); + this.registries = JsonSerializer.fromJSONArray(item.registries, RegisterModel); + this.dataRepositories = JsonSerializer.fromJSONArray(item.dataRepositories, DataRepositoryModel); + this.dmp = JsonSerializer.fromJSONObject(item.dmp, DataManagementPlanModel); + this.profile = JsonSerializer.fromJSONObject(item.profile, DatasetProfileModel); + this.externalDatasets = JsonSerializer.fromJSONArray(item.externalDatasets, ExternalDatasetModel); + this.datasetProfileDefinition = JsonSerializer.fromJSONObject(item.datasetProfileDefinition, DatasetProfileDefinitionModel); + return this; + } - buildForm(context: ValidationContext = null, disabled: boolean = false): FormGroup { - if (context == null) { context = this.createValidationContext(); } - const formGroup = new FormBuilder().group({ - id: [{ value: this.id, disabled: disabled }, context.getValidation('id').validators], - label: [{ value: this.label, disabled: disabled }, context.getValidation('label').validators], - uri: [{ value: this.uri, disabled: disabled }, context.getValidation('uri').validators], - status: [{ value: this.status, disabled: disabled }, context.getValidation('status').validators], - description: [{ value: this.description, disabled: disabled }, context.getValidation('description').validators], - services: [{ value: this.services, disabled: disabled }, context.getValidation('services').validators], - registries: [{ value: this.registries, disabled: disabled }, context.getValidation('registries').validators], - dataRepositories: [{ value: this.dataRepositories, disabled: disabled }, context.getValidation('dataRepositories').validators], - externalDatasets: [{ value: this.externalDatasets, disabled: disabled }, context.getValidation('externalDatasets').validators], - dmp: [{ value: this.dmp, disabled: disabled }, context.getValidation('dmp').validators] - }); - if (this.datasetProfileDefinition) formGroup.addControl("datasetProfileDefinition", this.datasetProfileDefinition.buildForm()) - formGroup.addControl("profile", this.profile.buildForm()) - return formGroup; - } + buildForm(context: ValidationContext = null, disabled: boolean = false): FormGroup { + if (context == null) { context = this.createValidationContext(); } + let formBuilder = new FormBuilder(); + const formGroup = formBuilder.group({ + id: [{ value: this.id, disabled: disabled }, context.getValidation('id').validators], + label: [{ value: this.label, disabled: disabled }, context.getValidation('label').validators], + uri: [{ value: this.uri, disabled: disabled }, context.getValidation('uri').validators], + status: [{ value: this.status, disabled: disabled }, context.getValidation('status').validators], + description: [{ value: this.description, disabled: disabled }, context.getValidation('description').validators], + dmp: [{ value: this.dmp, disabled: disabled }, context.getValidation('dmp').validators] + }); - createValidationContext(): ValidationContext { - const baseContext: ValidationContext = new ValidationContext(); - baseContext.validation.push({ key: 'id', validators: [BackendErrorValidator(this.errorModel, 'id')] }); - baseContext.validation.push({ key: 'label', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'label')] }); - baseContext.validation.push({ key: 'profile', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'profile')] }); - baseContext.validation.push({ key: 'uri', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'uri')] }); - baseContext.validation.push({ key: 'status', validators: [BackendErrorValidator(this.errorModel, 'status')] }); - baseContext.validation.push({ key: 'description', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'description')] }); - baseContext.validation.push({ key: 'services', validators: [BackendErrorValidator(this.errorModel, 'services')] }); - baseContext.validation.push({ key: 'registries', validators: [BackendErrorValidator(this.errorModel, 'registries')] }); - baseContext.validation.push({ key: 'dataRepositories', validators: [BackendErrorValidator(this.errorModel, 'dataRepositories')] }); - baseContext.validation.push({ key: 'externalDatasets', validators: [BackendErrorValidator(this.errorModel, 'externalDatasets')] }); - baseContext.validation.push({ key: 'dmp', validators: [BackendErrorValidator(this.errorModel, 'dmp')] }); //TODO - baseContext.validation.push({ key: 'datasetProfileDefinition', validators: [BackendErrorValidator(this.errorModel, 'datasetProfileDefinition')] }); //TODO + const externalDatasetsFormArray = new Array(); + if (this.externalDatasets && this.externalDatasets.length > 0) { + this.externalDatasets.forEach(item => { + externalDatasetsFormArray.push(item.buildForm(context.getValidation('externalDatasets').descendantValidations, disabled)) + }) + } else { + //externalDatasetsFormArray.push(new ExternalDatasetModel().buildForm(context.getValidation('externalDatasets').descendantValidations, disabled)); + } + formGroup.addControl('externalDatasets', formBuilder.array(externalDatasetsFormArray, Validators.required)); - return baseContext; - } -} \ No newline at end of file + const registriesFormArray = new Array(); + if (this.registries && this.registries.length > 0) { + this.registries.forEach(item => { + registriesFormArray.push(item.buildForm(context.getValidation('registries').descendantValidations, disabled)) + }) + } else { + //externalDatasetsFormArray.push(new ExternalDatasetModel().buildForm(context.getValidation('externalDatasets').descendantValidations, disabled)); + } + formGroup.addControl('registries', formBuilder.array(registriesFormArray, Validators.required)); + + const dataRepositoriesFormArray = new Array(); + if (this.dataRepositories && this.dataRepositories.length > 0) { + this.dataRepositories.forEach(item => { + dataRepositoriesFormArray.push(item.buildForm(context.getValidation('dataRepositories').descendantValidations, disabled)) + }) + } else { + //externalDatasetsFormArray.push(new ExternalDatasetModel().buildForm(context.getValidation('externalDatasets').descendantValidations, disabled)); + } + formGroup.addControl('dataRepositories', formBuilder.array(dataRepositoriesFormArray, Validators.required)); + + const servicesFormArray = new Array(); + if (this.services && this.services.length > 0) { + this.services.forEach(item => { + servicesFormArray.push(item.buildForm(context.getValidation('services').descendantValidations, disabled)) + }) + } else { + //externalDatasetsFormArray.push(new ExternalDatasetModel().buildForm(context.getValidation('externalDatasets').descendantValidations, disabled)); + } + formGroup.addControl('services', formBuilder.array(servicesFormArray, Validators.required)); + + if (this.datasetProfileDefinition) formGroup.addControl("datasetProfileDefinition", this.datasetProfileDefinition.buildForm()) + formGroup.addControl("profile", this.profile.buildForm()) + return formGroup; + } + + createValidationContext(): ValidationContext { + const baseContext: ValidationContext = new ValidationContext(); + baseContext.validation.push({ key: 'id', validators: [BackendErrorValidator(this.errorModel, 'id')] }); + baseContext.validation.push({ key: 'label', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'label')] }); + baseContext.validation.push({ key: 'profile', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'profile')] }); + baseContext.validation.push({ key: 'uri', validators: [BackendErrorValidator(this.errorModel, 'uri')] }); + baseContext.validation.push({ key: 'status', validators: [BackendErrorValidator(this.errorModel, 'status')] }); + baseContext.validation.push({ key: 'description', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'description')] }); + baseContext.validation.push({ key: 'services', validators: [BackendErrorValidator(this.errorModel, 'services')] }); + baseContext.validation.push({ key: 'registries', validators: [BackendErrorValidator(this.errorModel, 'registries')] }); + baseContext.validation.push({ key: 'dataRepositories', validators: [BackendErrorValidator(this.errorModel, 'dataRepositories')] }); + baseContext.validation.push({ key: 'externalDatasets', validators: [BackendErrorValidator(this.errorModel, 'externalDatasets')] }); + baseContext.validation.push({ key: 'dmp', validators: [BackendErrorValidator(this.errorModel, 'dmp')] }); //TODO + baseContext.validation.push({ key: 'datasetProfileDefinition', validators: [BackendErrorValidator(this.errorModel, 'datasetProfileDefinition')] }); //TODO + + return baseContext; + } +} diff --git a/dmp-frontend/src/app/models/external-dataset/ExternalDatasetModel.ts b/dmp-frontend/src/app/models/external-dataset/ExternalDatasetModel.ts index d648bc8cb..a4957448d 100644 --- a/dmp-frontend/src/app/models/external-dataset/ExternalDatasetModel.ts +++ b/dmp-frontend/src/app/models/external-dataset/ExternalDatasetModel.ts @@ -2,29 +2,48 @@ import { BaseErrorModel } from '../error/BaseErrorModel'; import { Serializable } from "../Serializable"; import { FormGenerator } from "../interfaces/FormGenerator"; import { FormGroup, FormBuilder } from "@angular/forms"; +import { ValidationContext } from '../../utilities/validators/ValidationContext'; + +export enum ExternalDatasetType { + Source = 0, + Output = 1 +} export class ExternalDatasetModel implements Serializable, FormGenerator{ - public abbreviation: String; - public id: String; - public label: String; - public reference: String; - public errorModel: BaseErrorModel; - fromJSONObject(item: any): ExternalDatasetModel { - this.abbreviation = item.abbreviation; - this.id = item.id; - this.label = item.label; - this.reference = item.reference; + public abbreviation: String; + public id: String; + public label: String; + public reference: String; + public errorModel: BaseErrorModel; + public type: ExternalDatasetType; + public info: String; + constructor(id?: string, abbreviation?: string, label?: string, reference?: string, info?: string, type?: ExternalDatasetType) { + this.id = id; + this.label = label; + this.abbreviation = abbreviation; + this.reference = reference; + this.info = info; + this.type = type; + } + fromJSONObject(item: any): ExternalDatasetModel { + this.abbreviation = item.abbreviation; + this.id = item.id; + this.label = item.label; + this.reference = item.reference; + this.type = item.type; + this.info = item.info + return this; + } - return this; - } - - buildForm(): FormGroup { - return new FormBuilder().group({ - id: [this.id], - abbreviation: [this.abbreviation], - label: [this.label], - reference: [this.reference] - }) - } -} \ No newline at end of file + buildForm(context: ValidationContext = null, disabled: boolean = false): FormGroup { + return new FormBuilder().group({ + id: [this.id], + abbreviation: [this.abbreviation], + label: [this.label], + reference: [this.reference], + type: [this.type], + info: [this.info] + }) + } +} diff --git a/dmp-frontend/src/app/models/external-sources/ExternalSourcesConfiguration.ts b/dmp-frontend/src/app/models/external-sources/ExternalSourcesConfiguration.ts new file mode 100644 index 000000000..25c0a5d03 --- /dev/null +++ b/dmp-frontend/src/app/models/external-sources/ExternalSourcesConfiguration.ts @@ -0,0 +1,8 @@ +import { ExternalSourcesUrlModel } from "./ExternalSourcesUrlModel"; + +export class ExternalSourcesConfiguration { + public registries: Array + public dataRepositories: Array + public services: Array + public externalDatasets: Array +} \ No newline at end of file diff --git a/dmp-frontend/src/app/models/external-sources/ExternalSourcesUrlModel.ts b/dmp-frontend/src/app/models/external-sources/ExternalSourcesUrlModel.ts new file mode 100644 index 000000000..689587928 --- /dev/null +++ b/dmp-frontend/src/app/models/external-sources/ExternalSourcesUrlModel.ts @@ -0,0 +1,4 @@ +export class ExternalSourcesUrlModel { + public key: String; + public label: String; +} \ No newline at end of file diff --git a/dmp-frontend/src/app/models/login/Principal.ts b/dmp-frontend/src/app/models/login/Principal.ts index 3b58d651e..e6f5027f2 100644 --- a/dmp-frontend/src/app/models/login/Principal.ts +++ b/dmp-frontend/src/app/models/login/Principal.ts @@ -7,20 +7,21 @@ export class Principal implements Serializable { name: string; expiresAt: Date; appRoles: Principal.AppRole[]; - + avatarUrl: string; fromJSONObject(item: any): Principal { this.id = item.id; this.token = item.token; this.name = item.name; this.expiresAt = item.expiresAt; this.appRoles = item.authorities; + this.avatarUrl = item.avatarUrl; return this; } } export namespace Principal { export enum AppRole { - Admin = 2, + Admin = 2, Manager = 1, User = 0, } diff --git a/dmp-frontend/src/app/models/projects/ProjectListingModel.ts b/dmp-frontend/src/app/models/projects/ProjectListingModel.ts index 55e68bc13..b654968b4 100644 --- a/dmp-frontend/src/app/models/projects/ProjectListingModel.ts +++ b/dmp-frontend/src/app/models/projects/ProjectListingModel.ts @@ -24,8 +24,8 @@ export class ProjectListingModel implements Serializable { this.reference = item.reference; this.uri = item.uri; this.status = item.status; - this.startDate = new Date(item.startdate); - this.endDate = new Date(item.enddate); + this.startDate = item.startdate ? new Date(item.startdate) : item.startDate; + this.endDate = item.enddate ? new Date(item.enddate) : item.endDate; this.description = item.description; this.files = JsonSerializer.fromJSONArray(item.files, ContentFile) this.dmps = JsonSerializer.fromJSONArray(item.dmps, UrlListingItem) diff --git a/dmp-frontend/src/app/models/projects/ProjectModel.ts b/dmp-frontend/src/app/models/projects/ProjectModel.ts index 3021ed10d..b2f6eb21d 100644 --- a/dmp-frontend/src/app/models/projects/ProjectModel.ts +++ b/dmp-frontend/src/app/models/projects/ProjectModel.ts @@ -7,65 +7,74 @@ import { Status } from "../Status"; import { ContentFile } from "../../models/files/ContentFile"; import { JsonSerializer } from "../../utilities/JsonSerializer"; +export enum ProjectType { + External = 0, + Internal = 1 +} + export class ProjectModel implements Serializable { - public id: String; - public label: String; - public abbreviation: String; - public reference: String; - public uri: String; - public status: Status = Status.Active; - public startDate: Date; - public endDate: Date; - public description: String; - public contentUrl: string; - public files: ContentFile[] = new Array(); - public errorModel: BaseErrorModel = new BaseErrorModel(); + public id: String; + public label: String; + public abbreviation: String; + public reference: String; + public type: ProjectType; + public uri: String; + public status: Status = Status.Active; + public startDate: Date; + public endDate: Date; + public description: String; + public contentUrl: string; + public files: ContentFile[]; + public errorModel: BaseErrorModel = new BaseErrorModel(); - fromJSONObject(item: any): ProjectModel { - this.id = item.id; - this.label = item.label; - this.abbreviation = item.abbreviation; - this.reference = item.reference; - this.uri = item.uri; - this.status = item.status; - this.startDate = new Date(item.startDate); - this.endDate = new Date(item.endDate); - this.description = item.description; - this.contentUrl = item.contentUrl; - this.files = JsonSerializer.fromJSONArray(item.files, ContentFile) - return this; - } + fromJSONObject(item: any): ProjectModel { + this.id = item.id; + this.label = item.label; + this.type = item.type; + this.abbreviation = item.abbreviation; + this.reference = item.reference; + this.uri = item.uri; + this.status = item.status; + this.startDate = item.startDate ? new Date(item.startDate) : null; + this.endDate = item.endDate ? new Date(item.endDate) : null; + this.description = item.description; + this.contentUrl = item.contentUrl; + this.files = JsonSerializer.fromJSONArray(item.files, ContentFile) + return this; + } - buildForm(context: ValidationContext = null, disabled: boolean = false): FormGroup { - if (context == null) { context = this.createValidationContext(); } + buildForm(context: ValidationContext = null, disabled: boolean = false): FormGroup { + if (context == null) { context = this.createValidationContext(); } - const formGroup = new FormBuilder().group({ - id: [{ value: this.id, disabled: disabled }, context.getValidation('id').validators], - label: [{ value: this.label, disabled: disabled }, context.getValidation('label').validators], - abbreviation: [{ value: this.abbreviation, disabled: disabled }, context.getValidation('abbreviation').validators], - uri: [{ value: this.uri, disabled: disabled }, context.getValidation('uri').validators], - status: [{ value: this.status, disabled: disabled }, context.getValidation('status').validators], - description: [{ value: this.description, disabled: disabled }, context.getValidation('description').validators], - startDate: [{ value: this.startDate, disabled: disabled }, context.getValidation('startDate').validators], - endDate: [{ value: this.endDate, disabled: disabled }, context.getValidation('endDate').validators], - files: [{ value: this.files, disabled: disabled }, context.getValidation('files').validators] - }); + const formGroup = new FormBuilder().group({ + id: [{ value: this.id, disabled: disabled }, context.getValidation('id').validators], + label: [{ value: this.label, disabled: disabled }, context.getValidation('label').validators], + abbreviation: [{ value: this.abbreviation, disabled: disabled }, context.getValidation('abbreviation').validators], + uri: [{ value: this.uri, disabled: disabled }, context.getValidation('uri').validators], + status: [{ value: this.status, disabled: disabled }, context.getValidation('status').validators], + type: [{ value: this.type, disabled: disabled }, context.getValidation('type').validators], + description: [{ value: this.description, disabled: disabled }, context.getValidation('description').validators], + startDate: [{ value: this.startDate, disabled: disabled }, context.getValidation('startDate').validators], + endDate: [{ value: this.endDate, disabled: disabled }, context.getValidation('endDate').validators], + files: [{ value: this.files, disabled: disabled }, context.getValidation('files').validators] + }); - return formGroup; - } + return formGroup; + } - createValidationContext(): ValidationContext { - const baseContext: ValidationContext = new ValidationContext(); - baseContext.validation.push({ key: 'id', validators: [] }); - baseContext.validation.push({ key: 'label', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'label')] }); - baseContext.validation.push({ key: 'abbreviation', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'abbreviation')] }); - baseContext.validation.push({ key: 'uri', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'uri')] }); - baseContext.validation.push({ key: 'status', validators: [] }); - baseContext.validation.push({ key: 'description', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'description')] }); - baseContext.validation.push({ key: 'startDate', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'startDate')] }); - baseContext.validation.push({ key: 'endDate', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'endDate')] }); - baseContext.validation.push({ key: 'files', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'files')] }); + createValidationContext(): ValidationContext { + const baseContext: ValidationContext = new ValidationContext(); + baseContext.validation.push({ key: 'id', validators: [] }); + baseContext.validation.push({ key: 'label', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'label')] }); + baseContext.validation.push({ key: 'abbreviation', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'abbreviation')] }); + baseContext.validation.push({ key: 'uri', validators: [BackendErrorValidator(this.errorModel, 'uri')] }); + baseContext.validation.push({ key: 'type', validators: [BackendErrorValidator(this.errorModel, 'type')] }); + baseContext.validation.push({ key: 'status', validators: [] }); + baseContext.validation.push({ key: 'description', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'description')] }); + baseContext.validation.push({ key: 'startDate', validators: [BackendErrorValidator(this.errorModel, 'startDate')] }); + baseContext.validation.push({ key: 'endDate', validators: [BackendErrorValidator(this.errorModel, 'endDate')] }); + baseContext.validation.push({ key: 'files', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'files')] }); - return baseContext; - } -} \ No newline at end of file + return baseContext; + } +} diff --git a/dmp-frontend/src/app/models/registers/RegisterModel.ts b/dmp-frontend/src/app/models/registers/RegisterModel.ts index f52389330..faf6f5f57 100644 --- a/dmp-frontend/src/app/models/registers/RegisterModel.ts +++ b/dmp-frontend/src/app/models/registers/RegisterModel.ts @@ -1,4 +1,6 @@ import { Serializable } from "../Serializable"; +import { ValidationContext } from "../../utilities/validators/ValidationContext"; +import { FormGroup, FormBuilder } from "@angular/forms"; export class RegisterModel implements Serializable { public abbreviation: String; @@ -8,6 +10,15 @@ export class RegisterModel implements Serializable { public reference: String; public uri: String; + constructor(abbreviation?: String, definition?: String, id?: String, label?: String, reference?: String, uri?: String) { + this.abbreviation = abbreviation; + this.definition = definition; + this.id = id; + this.label = label; + this.reference = reference; + this.uri = uri; + } + fromJSONObject(item: any): RegisterModel { this.abbreviation = item.abbreviation; this.definition = item.definition; @@ -18,4 +29,15 @@ export class RegisterModel implements Serializable { return this; } + + buildForm(context: ValidationContext = null, disabled: boolean = false): FormGroup { + return new FormBuilder().group({ + id: [this.id], + abbreviation: [this.abbreviation], + label: [this.label], + reference: [this.reference], + uri: [this.uri], + definition: [this.definition] + }) + } } \ No newline at end of file diff --git a/dmp-frontend/src/app/models/services/ServiceModel.ts b/dmp-frontend/src/app/models/services/ServiceModel.ts index 90f5a8194..8d9a2d7ae 100644 --- a/dmp-frontend/src/app/models/services/ServiceModel.ts +++ b/dmp-frontend/src/app/models/services/ServiceModel.ts @@ -1,4 +1,6 @@ import { Serializable } from "../Serializable"; +import { ValidationContext } from "../../utilities/validators/ValidationContext"; +import { FormBuilder, FormGroup } from "@angular/forms"; export class ServiceModel implements Serializable { public id: String; @@ -8,6 +10,14 @@ export class ServiceModel implements Serializable { public label: String; public reference: String; + constructor(id?: String, abbreviation?: String, definition?: String, uri?: String, label?: String, reference?: String) { + this.id = id; + this.abbreviation = abbreviation; + this.definition = definition; + this.uri = uri; + this.label = label; + this.reference = reference; + } fromJSONObject(item: any): ServiceModel { this.id = item.id; this.abbreviation = item.abbreviation; @@ -18,4 +28,15 @@ export class ServiceModel implements Serializable { return this; } + + buildForm(context: ValidationContext = null, disabled: boolean = false): FormGroup { + return new FormBuilder().group({ + id: [this.id], + abbreviation: [this.abbreviation], + label: [this.label], + reference: [this.reference], + uri: [this.uri], + definition: [this.definition] + }) + } } diff --git a/dmp-frontend/src/app/projects/editor/project-editor.component.html b/dmp-frontend/src/app/projects/editor/project-editor.component.html index ee8d8d0f8..1173c0446 100644 --- a/dmp-frontend/src/app/projects/editor/project-editor.component.html +++ b/dmp-frontend/src/app/projects/editor/project-editor.component.html @@ -1,83 +1,95 @@
-
- - - {{'PROJECT-EDITOR.TITLE.NEW' | translate}} - {{formGroup.get('label').value}} + + + + {{'PROJECT-EDITOR.TITLE.NEW' | translate}} + {{formGroup.get('label').value}} +
-
- + + + +
+ - - - {{baseErrorModel.label}} - {{'GENERAL.VALIDATION.REQUIRED' | translate}} - + + + {{baseErrorModel.label}} + {{'GENERAL.VALIDATION.REQUIRED' | translate}} + - - - {{baseErrorModel.abbreviation}} - {{'GENERAL.VALIDATION.REQUIRED' | translate}} - + + + {{baseErrorModel.abbreviation}} + {{'GENERAL.VALIDATION.REQUIRED' | translate}} + - - - {{baseErrorModel.uri}} - {{'GENERAL.VALIDATION.REQUIRED' | translate}} - + + + {{baseErrorModel.uri}} + {{'GENERAL.VALIDATION.REQUIRED' | translate}} + - - - - - -
- - - - - {{this.project.errorModel.startDate}} - {{'GENERAL.VALIDATION.REQUIRED' | translate}} - - - - - - - {{baseErrorModel.endDate}} - {{'GENERAL.VALIDATION.REQUIRED' | translate}} - -
+ + + + + +
+ + + + + {{this.project.errorModel.startDate}} + {{'GENERAL.VALIDATION.REQUIRED' | translate}} + + + + + + + {{baseErrorModel.endDate}} + {{'GENERAL.VALIDATION.REQUIRED' | translate}} + +
- - - {{errorModel.description}} - {{'GENERAL.VALIDATION.REQUIRED' | translate}} - -

{{this.languageResolverService.getBy('editorLogo') | translate}}

+ + + {{errorModel.description}} + {{'GENERAL.VALIDATION.REQUIRED' | translate}} + +

{{this.languageResolverService.getBy('editorLogo') | translate}}

- - - - - -
- - - -
-
- - - -
+ + + + + +
+ + + + +
+
+ + + +
-
-
-
-
\ No newline at end of file +
+
+ + diff --git a/dmp-frontend/src/app/projects/editor/project-editor.component.scss b/dmp-frontend/src/app/projects/editor/project-editor.component.scss index 4b5eda25a..9a5306381 100644 --- a/dmp-frontend/src/app/projects/editor/project-editor.component.scss +++ b/dmp-frontend/src/app/projects/editor/project-editor.component.scss @@ -6,11 +6,10 @@ table-layout: fixed; } - .logo-table { table-layout: fixed; display: inline-block; - td{ + td { padding: 3px; } } @@ -24,21 +23,22 @@ width: 100%; padding: 3px; } - + .fill-space { + flex: 1 1 auto; + } .mat-card { margin: 16px 0; } - p { margin: 16px; } - .left-button { float: left; } - + .right-button { + float: right; + } .description-area { height: 100px; } - -} +} \ No newline at end of file diff --git a/dmp-frontend/src/app/projects/editor/project-editor.component.ts b/dmp-frontend/src/app/projects/editor/project-editor.component.ts index 3bd122f06..bd51a4580 100644 --- a/dmp-frontend/src/app/projects/editor/project-editor.component.ts +++ b/dmp-frontend/src/app/projects/editor/project-editor.component.ts @@ -5,7 +5,7 @@ import { TranslateService } from "@ngx-translate/core"; import { DataSource } from "@angular/cdk/table"; import { Observable } from "rxjs/Observable"; import { DataManagementPlanService } from "../../services/data-management-plan/data-management-plan.service"; -import { ProjectModel } from "../../models/projects/ProjectModel"; +import { ProjectModel, ProjectType } from "../../models/projects/ProjectModel"; import { ProjectService } from "../../services/project/project.service"; import { JsonSerializer } from "../../utilities/JsonSerializer"; import { FormGroup, AbstractControl, FormControl, FormArray } from "@angular/forms"; @@ -15,6 +15,8 @@ import { TdDialogService } from "@covalent/core"; import { ProjectFileUploaderService } from "../../services/files/project-file-uploader.service"; import { HostConfiguration } from "../../app.constants"; import { LanguageResolverService } from "../../services/language-resolver/language-resolver.service"; +import { THIS_EXPR } from "@angular/compiler/src/output/output_ast"; +import { BaseHttpService } from "../../utilities/cite-http-service-module/base-http.service"; @@ -22,7 +24,6 @@ import { LanguageResolverService } from "../../services/language-resolver/langua selector: 'app-project-editor-component', templateUrl: 'project-editor.component.html', styleUrls: ['./project-editor.component.scss'], - providers: [ProjectService, ProjectFileUploaderService], encapsulation: ViewEncapsulation.None }) export class ProjectEditorComponent implements AfterViewInit { @@ -31,6 +32,7 @@ export class ProjectEditorComponent implements AfterViewInit { project: ProjectModel; formGroup: FormGroup = null; host = HostConfiguration.Server; + editMode = false; constructor( private projectService: ProjectService, private route: ActivatedRoute, @@ -53,7 +55,7 @@ export class ProjectEditorComponent implements AfterViewInit { this.projectService.getSingle(itemId).map(data => data as ProjectModel) .subscribe(data => { this.project = JsonSerializer.fromJSONObject(data, ProjectModel); - this.formGroup = this.project.buildForm(); + this.formGroup = this.project.buildForm(null, this.project.type == ProjectType.External || !this.editMode); }); } else { this.project = new ProjectModel(); @@ -154,4 +156,25 @@ export class ProjectEditorComponent implements AfterViewInit { }) } } -} \ No newline at end of file + + public enableForm() { + if (!this.isExternalProject()) { + this.editMode = true; + this.formGroup.enable() + } + + } + + public disableForm() { + this.editMode = false; + this.formGroup.disable(); + } + + public goToProjectDmps() { + this.router.navigate(["dmps/project/" + this.project.id]) + } + + public isExternalProject() { + return this.project.type === ProjectType.External; + } +} diff --git a/dmp-frontend/src/app/projects/listing/project-listing.component.ts b/dmp-frontend/src/app/projects/listing/project-listing.component.ts index de5dc3247..7c40b8b3c 100644 --- a/dmp-frontend/src/app/projects/listing/project-listing.component.ts +++ b/dmp-frontend/src/app/projects/listing/project-listing.component.ts @@ -17,7 +17,6 @@ import { LanguageResolverService } from '../../services/language-resolver/langua selector: 'app-project-listing-component', templateUrl: 'project-listing.component.html', styleUrls: ['./project-listing.component.scss'], - providers: [ProjectService], encapsulation: ViewEncapsulation.None }) export class ProjectListingComponent implements OnInit { @@ -137,4 +136,4 @@ export class ProjectDataSource extends DataSource { disconnect() { // No-op } -} \ No newline at end of file +} diff --git a/dmp-frontend/src/app/projects/project.routes.ts b/dmp-frontend/src/app/projects/project.routes.ts index d63389d25..9bd149b6c 100644 --- a/dmp-frontend/src/app/projects/project.routes.ts +++ b/dmp-frontend/src/app/projects/project.routes.ts @@ -2,10 +2,9 @@ import { ProjectEditorComponent } from './editor/project-editor.component'; import { ProjectListingComponent } from './listing/project-listing.component'; import { RouterModule, Routes } from '@angular/router'; -const routes: Routes = [ - { path: '', component: ProjectListingComponent }, - { path: 'edit/:id', component: ProjectEditorComponent }, - { path: 'new', component: ProjectEditorComponent }, +export const ProjectRoutes: Routes = [ + { path: '', component: ProjectListingComponent }, + { path: 'edit/:id', component: ProjectEditorComponent }, + { path: 'new', component: ProjectEditorComponent }, ]; -export const ProjectRoutes = RouterModule.forChild(routes); diff --git a/dmp-frontend/src/app/projects/projects.module.ts b/dmp-frontend/src/app/projects/projects.module.ts index 015e78657..34cd0fd5e 100644 --- a/dmp-frontend/src/app/projects/projects.module.ts +++ b/dmp-frontend/src/app/projects/projects.module.ts @@ -11,43 +11,53 @@ import { CommonModule } from '@angular/common'; import { SharedModule } from '../shared/shared.module' import { NgModule } from '@angular/core'; +import { ProjectService } from '../services/project/project.service'; +import { ProjectFileUploaderService } from '../services/files/project-file-uploader.service'; +import { RouterModule } from '@angular/router'; +import { BaseHttpModule } from '../utilities/cite-http-service-module/cite-http.module'; +import { MaterialModule } from '../shared/material/material.module'; @NgModule({ - imports: [ - CommonModule, - FormsModule, - HttpClientModule, - SharedModule, - ProjectRoutes, - ReactiveFormsModule, - TranslateModule.forRoot({ - loader: { - provide: TranslateLoader, - useFactory: HttpLoaderFactory, - deps: [HttpClient] - } - }), - ], + imports: [ + CommonModule, + FormsModule, + HttpClientModule, + SharedModule, + MaterialModule, + RouterModule.forChild(ProjectRoutes), + ReactiveFormsModule, + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useFactory: HttpLoaderFactory, + deps: [HttpClient] + } + }), + BaseHttpModule.forRoot() + ], - declarations: [ - ProjectListingComponent, - ProjectEditorComponent - ], + declarations: [ + ProjectListingComponent, + ProjectEditorComponent + ], - exports: [ - ProjectListingComponent, - ProjectEditorComponent, - ], providers: [ - BaseHttpService - ] + exports: [ + ProjectListingComponent, + ProjectEditorComponent, + RouterModule + ], + providers: [ + ProjectService, + ProjectFileUploaderService + ] }) export class ProjectsModule { - constructor(private translate: TranslateService) { - translate.setDefaultLang('en'); - translate.use('en'); - } + constructor(private translate: TranslateService) { + translate.setDefaultLang('en'); + translate.use('en'); + } } export function HttpLoaderFactory(httpClient: HttpClient) { - return new TranslateHttpLoader(httpClient, 'assets/lang/', '.json'); + return new TranslateHttpLoader(httpClient, 'assets/lang/', '.json'); } diff --git a/dmp-frontend/src/app/services/auth/auth.service.ts b/dmp-frontend/src/app/services/auth/auth.service.ts index c9c8a76a6..6d6561dbf 100644 --- a/dmp-frontend/src/app/services/auth/auth.service.ts +++ b/dmp-frontend/src/app/services/auth/auth.service.ts @@ -14,136 +14,136 @@ import { SnackBarNotificationComponent } from '../../shared/components/notificai @Injectable() export class AuthService { - private actionUrl: string; - private headers: HttpHeaders; + private actionUrl: string; + private headers: HttpHeaders; - constructor( - private http: HttpClient, - public snackBar: MatSnackBar, - public language: TranslateService, - public router: Router - ) { + constructor( + private http: HttpClient, + public snackBar: MatSnackBar, + public language: TranslateService, + public router: Router + ) { - this.actionUrl = HostConfiguration.Server + 'auth/'; + this.actionUrl = HostConfiguration.Server + 'auth/'; - this.headers = new HttpHeaders(); - this.headers = this.headers.set('Content-Type', 'application/json'); - this.headers = this.headers.set('Accept', 'application/json'); - } + this.headers = new HttpHeaders(); + this.headers = this.headers.set('Content-Type', 'application/json'); + this.headers = this.headers.set('Accept', 'application/json'); + } - private clear(): void { - localStorage.removeItem('principal'); - } + private clear(): void { + localStorage.removeItem('principal'); + } - public current(principal?: Principal): Principal { - if (principal) { - localStorage.setItem('principal', JSON.stringify(principal)); - return principal; - } - const principalJson = localStorage.getItem('principal'); - if (!principalJson) { return null; } - const principalObj = JSON.parse(principalJson) as Principal; - return principalObj; - } + public current(principal?: Principal): Principal { + if (principal) { + localStorage.setItem('principal', JSON.stringify(principal)); + return principal; + } + const principalJson = localStorage.getItem('principal'); + if (!principalJson) { return null; } + const principalObj = JSON.parse(principalJson) as Principal; + return principalObj; + } - //public login(credential: Credential): Observable { - // const url = this.actionUrl + 'login'; + //public login(credential: Credential): Observable { + // const url = this.actionUrl + 'login'; - // return this.http.post(url, credential, { headers: this.headers }) - // .map((res: Response) => { - // let principal = this.current(new JsonSerializer().fromJSONObject(res, Principal)); - // //this.loginContextSubject.next(true); - // return principal; - // }) - // .catch((error: any) => { - // //this.loginContextSubject.next(false); - // return Observable.throw(error); - // }); - //} + // return this.http.post(url, credential, { headers: this.headers }) + // .map((res: Response) => { + // let principal = this.current(new JsonSerializer().fromJSONObject(res, Principal)); + // //this.loginContextSubject.next(true); + // return principal; + // }) + // .catch((error: any) => { + // //this.loginContextSubject.next(false); + // return Observable.throw(error); + // }); + //} - public login(loginInfo: LoginInfo): Observable { - const url = this.actionUrl + 'externallogin'; + public login(loginInfo: LoginInfo): Observable { + const url = this.actionUrl + 'externallogin'; - return this.http.post(url, loginInfo, { headers: this.headers }) - .map((res: any) => { - const principal = this.current(JsonSerializer.fromJSONObject(res.payload, Principal)); - //this.loginContextSubject.next(true); - return principal; - }) - .catch((error: any) => { - //this.loginContextSubject.next(false); - return Observable.throw(error); - }); - } + return this.http.post(url, loginInfo, { headers: this.headers }) + .map((res: any) => { + const principal = this.current(JsonSerializer.fromJSONObject(res.payload, Principal)); + //this.loginContextSubject.next(true); + return principal; + }) + .catch((error: any) => { + //this.loginContextSubject.next(false); + return Observable.throw(error); + }); + } - public nativeLogin(credentials: Credential): Observable { - const url = this.actionUrl + 'nativelogin'; + public nativeLogin(credentials: Credential): Observable { + const url = this.actionUrl + 'nativelogin'; - return this.http.post(url, credentials, { headers: this.headers }) - .map((res: any) => { - const principal = this.current(JsonSerializer.fromJSONObject(res.payload, Principal)); - //this.loginContextSubject.next(true); - return principal; - }) - .catch((error: any) => { - //this.loginContextSubject.next(false); - return Observable.throw(error); - }); - } + return this.http.post(url, credentials, { headers: this.headers }) + .map((res: any) => { + const principal = this.current(JsonSerializer.fromJSONObject(res.payload, Principal)); + //this.loginContextSubject.next(true); + return principal; + }) + .catch((error: any) => { + //this.loginContextSubject.next(false); + return Observable.throw(error); + }); + } - public logout(): void { - const url = this.actionUrl + 'logout'; - const principal = this.current(); - this.clear(); + public logout(): void { + const url = this.actionUrl + 'logout'; + const principal = this.current(); + this.clear(); - if (!principal) { return; } - let headers = this.headers; - headers = headers.set('AuthToken', principal.token) - this.http.post(url, null, { headers: headers }).subscribe( - res => this.onLogOutSuccess(res), - error => this.onLogOutError(error) - ) - } + if (!principal) { return; } + let headers = this.headers; + headers = headers.set('AuthToken', principal.token) + this.http.post(url, null, { headers: headers }).subscribe( + res => this.onLogOutSuccess(res), + error => this.onLogOutError(error) + ) + } - public me(): Observable { - const url = this.actionUrl + '/me'; - const principal = this.current(); - if (!principal) { - this.clear(); - return Observable.of(); - } - let headers = this.headers; - headers = headers.set('AuthToken', principal.token) - return this.http.post(url, null, { headers: headers }) - .map((res: any) => { - const princ = this.current(JsonSerializer.fromJSONObject(res.payload, Principal)); - return princ; - }) - .catch((error: any) => { - console.warn('could not retrieve me info:\n', error); - this.clear(); - const princ = this.current(); - this.router.navigate(['/login']); - return Observable.of(princ); - }); - } + public me(): Observable { + const url = this.actionUrl + '/me'; + const principal = this.current(); + if (!principal) { + this.clear(); + return Observable.of(); + } + let headers = this.headers; + headers = headers.set('AuthToken', principal.token) + return this.http.post(url, null, { headers: headers }) + .map((res: any) => { + const princ = this.current(JsonSerializer.fromJSONObject(res.payload, Principal)); + return princ; + }) + .catch((error: any) => { + console.warn('could not retrieve me info:\n', error); + this.clear(); + const princ = this.current(); + this.router.navigate(['/login']); + return Observable.of(princ); + }); + } - public onLogOutSuccess(logoutMessage: any) { - this.snackBar.openFromComponent(SnackBarNotificationComponent, { - data: { message: 'GENERAL.SNACK-BAR.SUCCESSFUL-LOGOUT', language: this.language }, - duration: 3000, - extraClasses: ['snackbar-success'] - }) - this.router.navigate(['/login']); - } + public onLogOutSuccess(logoutMessage: any) { + this.snackBar.openFromComponent(SnackBarNotificationComponent, { + data: { message: 'GENERAL.SNACK-BAR.SUCCESSFUL-LOGOUT', language: this.language }, + duration: 3000, + extraClasses: ['snackbar-success'] + }) + this.router.navigate(['/login']); + } - public onLogOutError(errorMessage: string) { - this.snackBar.openFromComponent(SnackBarNotificationComponent, { - data: { message: 'GENERAL.SNACK-BAR.UNSUCCESSFUL-LOGOUT', language: this.language }, - duration: 3000, - extraClasses: ['snackbar-warning'] - }) - this.router.navigate(['/login']); - } + public onLogOutError(errorMessage: string) { + this.snackBar.openFromComponent(SnackBarNotificationComponent, { + data: { message: 'GENERAL.SNACK-BAR.UNSUCCESSFUL-LOGOUT', language: this.language }, + duration: 3000, + extraClasses: ['snackbar-warning'] + }) + this.router.navigate(['/login']); + } } diff --git a/dmp-frontend/src/app/services/external-sources/external-sources-configuration.service.ts b/dmp-frontend/src/app/services/external-sources/external-sources-configuration.service.ts new file mode 100644 index 000000000..e31098525 --- /dev/null +++ b/dmp-frontend/src/app/services/external-sources/external-sources-configuration.service.ts @@ -0,0 +1,28 @@ +import { ExternalSourcesConfiguration } from "../../models/external-sources/ExternalSourcesConfiguration"; +import { BaseHttpService } from "../../utilities/cite-http-service-module/base-http.service"; +import { HostConfiguration } from "../../app.constants"; +import { HttpHeaders } from "@angular/common/http"; +import { Injectable } from "@angular/core"; +import { Observable } from "rxjs/Observable"; + + +@Injectable() +export class ExternalSourcesConfigurationService { + + private actionUrl: string; + private headers: HttpHeaders; + + constructor(private http: BaseHttpService) { + + this.actionUrl = HostConfiguration.Server + 'common/'; + + this.headers = new HttpHeaders(); + this.headers = this.headers.set('Content-Type', 'application/json'); + this.headers = this.headers.set('Accept', 'application/json'); + } + + public getExternalSourcesConfiguration(): Observable { + return this.http.get(this.actionUrl + "externalSourcesConfiguration", { headers: this.headers }); + } + +} diff --git a/dmp-frontend/src/app/services/external-sources/external-sources.service.ts b/dmp-frontend/src/app/services/external-sources/external-sources.service.ts index a295c6345..569aa5487 100644 --- a/dmp-frontend/src/app/services/external-sources/external-sources.service.ts +++ b/dmp-frontend/src/app/services/external-sources/external-sources.service.ts @@ -8,49 +8,53 @@ import { ExternalSourcesItemModel } from '../../models/external-sources/External import { BaseCriteria } from '../../models/criteria/BaseCriteria'; import { RequestItem } from '../../models/criteria/RequestItem'; import { ResearcherCriteria } from '../../models/criteria/researchers/ResearcherCriteria'; +import { ExternalDatasetCriteria } from '../../models/criteria/external-dataset/ExternalDatasetCriteria'; +import { RegistryCriteria } from '../../models/criteria/registry/RegistryCriteria'; +import { DataRepositoryCriteria } from '../../models/criteria/data-repository/DataRepositoryCriteria'; +import { ServicesCriteria } from '../../models/criteria/services/ServicesCriteria'; @Injectable() export class ExternalSourcesService { - private actionUrl: string; - private headers: HttpHeaders; + private actionUrl: string; + private headers: HttpHeaders; - constructor(private http: BaseHttpService) { + constructor(private http: BaseHttpService) { - this.actionUrl = HostConfiguration.Server + 'external/'; + this.actionUrl = HostConfiguration.Server + 'external/'; - this.headers = new HttpHeaders(); - this.headers = this.headers.set('Content-Type', 'application/json'); - this.headers = this.headers.set('Accept', 'application/json'); - } + this.headers = new HttpHeaders(); + this.headers = this.headers.set('Content-Type', 'application/json'); + this.headers = this.headers.set('Accept', 'application/json'); + } - public searchDatasetRegistry(like: string): Observable { - return this.http.get(this.actionUrl + "registries" + "?query=" + like, { headers: this.headers }); - } + public searchDatasetRegistry(requestItem: RequestItem): Observable { + return this.http.get(this.actionUrl + "registries" + "?query=" + requestItem.criteria.like + "&type=" + requestItem.criteria.type, { headers: this.headers }); + } - public searchDatasetRepository(like: string): Observable { - return this.http.get(this.actionUrl + "datarepos" + "?query=" + like, { headers: this.headers }); - } + public searchDatasetRepository(requestItem: RequestItem): Observable { + return this.http.get(this.actionUrl + "datarepos" + "?query=" + requestItem.criteria.like + "&type=" + requestItem.criteria.type, { headers: this.headers }); + } - public searchDatasetService(like: string): Observable { - return this.http.get(this.actionUrl + "services" + "?query=" + like, { headers: this.headers }); - } + public searchDatasetService(requestItem: RequestItem): Observable { + return this.http.get(this.actionUrl + "services" + "?query=" + requestItem.criteria.like + "&type=" + requestItem.criteria.type, { headers: this.headers }); + } - public searchDatasetSExternalDatasetservice(like: string): Observable { - return this.http.get(this.actionUrl + "datasets" + "?query=" + like, { headers: this.headers }); - } + public searchDatasetSExternalDatasetservice(requestItem: RequestItem): Observable { + return this.http.get(this.actionUrl + "datasets" + "?query=" + requestItem.criteria.like + "&type=" + requestItem.criteria.type, { headers: this.headers }); + } - public searchDMPResearchers(requestItem: RequestItem): Observable { - return this.http.post(HostConfiguration.Server + "/researchers/getWithExternal", requestItem, { headers: this.headers }); - } + public searchDMPResearchers(requestItem: RequestItem): Observable { + return this.http.post(HostConfiguration.Server + "/researchers/getWithExternal", requestItem, { headers: this.headers }); + } - public searchDMPOrganizations(like: string): Observable { - return this.http.get(this.actionUrl + "organisations" + "?query=" + like, { headers: this.headers }); - }//organizationscriteria.criteria.like + public searchDMPOrganizations(like: string): Observable { + return this.http.get(this.actionUrl + "organisations" + "?query=" + like, { headers: this.headers }); + }//organizationscriteria.criteria.like - public searchDMPProfiles(like: string): Observable { - return this.http.get(this.actionUrl + "datasetprofiles/get" + "?query=" + like, { headers: this.headers }); - } + public searchDMPProfiles(like: string): Observable { + return this.http.get(this.actionUrl + "datasetprofiles/get" + "?query=" + like, { headers: this.headers }); + } } diff --git a/dmp-frontend/src/app/add-researchers/add-researchers.component.html b/dmp-frontend/src/app/shared/components/add-researchers/add-researchers.component.html similarity index 100% rename from dmp-frontend/src/app/add-researchers/add-researchers.component.html rename to dmp-frontend/src/app/shared/components/add-researchers/add-researchers.component.html diff --git a/dmp-frontend/src/app/shared/components/add-researchers/add-researchers.component.ts b/dmp-frontend/src/app/shared/components/add-researchers/add-researchers.component.ts new file mode 100644 index 000000000..db1332d83 --- /dev/null +++ b/dmp-frontend/src/app/shared/components/add-researchers/add-researchers.component.ts @@ -0,0 +1,38 @@ +import { JsonSerializer } from '../../../utilities/JsonSerializer'; +import { RequestItem } from '../../../models/criteria/RequestItem'; +import { Component, OnInit, Inject } from "@angular/core"; +import { FormGroup } from '@angular/forms'; +import { Params, ActivatedRoute, Router } from '@angular/router'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material'; +import { ResearcherModel } from '../../../models/researcher/ResearcherModel'; +import { ResearcherService } from '../../../services/researchers/researchers.service'; + +@Component({ + selector: 'add-researchers-component', + templateUrl: 'add-researchers.component.html', + +}) +export class AddResearchersComponent implements OnInit { + + private formGroup: FormGroup; + + constructor( + private researcherService: ResearcherService, + private route: ActivatedRoute, + public router: Router, + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: any + ) { } + + ngOnInit(): void { + let researcher = new ResearcherModel(); + this.formGroup = researcher.buildForm(); + } + + + send(value: any) { + this.researcherService.createResearcher(this.formGroup.value).subscribe( + null, null, () => this.dialogRef.close() + ); + } +} diff --git a/dmp-frontend/src/app/shared/components/auto-complete/auto-complete.component.html b/dmp-frontend/src/app/shared/components/auto-complete/auto-complete.component.html index a59517559..8f255846f 100644 --- a/dmp-frontend/src/app/shared/components/auto-complete/auto-complete.component.html +++ b/dmp-frontend/src/app/shared/components/auto-complete/auto-complete.component.html @@ -1,19 +1,14 @@
- - - {{validationErrorString}} - {{'GENERAL.VALIDATION.REQUIRED' | translate}} - - - - {{ this.printText(option) }} - - - + + + {{validationErrorString}} + {{'GENERAL.VALIDATION.REQUIRED' | translate}} + + + + {{ this.printText(option) }} + + +
diff --git a/dmp-frontend/src/app/shared/components/auto-complete/auto-complete.component.ts b/dmp-frontend/src/app/shared/components/auto-complete/auto-complete.component.ts index 25da5b130..9d83979f4 100644 --- a/dmp-frontend/src/app/shared/components/auto-complete/auto-complete.component.ts +++ b/dmp-frontend/src/app/shared/components/auto-complete/auto-complete.component.ts @@ -4,102 +4,111 @@ import { ErrorStateMatcher } from '@angular/material'; import { AutoCompleteConfiguration } from '../autocomplete/AutoCompleteConfiguration'; @Component({ - selector: 'app-auto-complete', - templateUrl: './auto-complete.component.html', - styleUrls: ['./auto-complete.component.scss'] + selector: 'app-auto-complete', + templateUrl: './auto-complete.component.html', + styleUrls: ['./auto-complete.component.scss'] }) export class AutoCompleteComponent implements OnInit, ErrorStateMatcher { - @Input() placeholder: String; - @Input() disabled: boolean; + @Input() placeholder: String; + @Input() disabled: boolean; - @Input() typeaheadMS: number; - @Input() formCtrl: FormControl; - @Input() required = false; - @Input() displayFunction: Function; - @Input() assignValueFunction: Function; - @Input() transformFunction: Function; - @Input() inputData: AutoCompleteConfiguration; - @Input() validationErrorString: String; + @Input() typeaheadMS: number; + @Input() formCtrl: FormControl; + @Input() required = false; + @Input() displayFunction: Function; + @Input() assignValueFunction: Function; + @Input() transformFunction: Function; + @Input() inputData: AutoCompleteConfiguration; + @Input() validationErrorString: String; + @Input() clear = false; - @Output() onItemChange = new EventEmitter(); + @Output() onItemChange = new EventEmitter(); - public textFormCtrl: FormControl; - public options: any[]; + public textFormCtrl: FormControl; + public options: any[]; - loading = false; - hasSelectedItem = false; - isUnchanged = true; + loading = false; + hasSelectedItem = false; + isUnchanged = true; - constructor() { + constructor() { - } + } - ngOnInit() { + ngOnInit() { - this.textFormCtrl = new FormControl(); - this.formCtrl.registerOnDisabledChange(isDisabled => { - if (isDisabled) this.textFormCtrl.disable({ onlySelf: true, emitEvent: false }); - else this.textFormCtrl.enable({ onlySelf: true, emitEvent: false }); - }) - if (this.formCtrl && this.formCtrl.value) { - this.textFormCtrl.patchValue(this.formCtrl.value, { emitEvent: false }); - this.hasSelectedItem = true; - } + this.textFormCtrl = new FormControl(); + if (this.disabled) this.textFormCtrl.disable(); + this.formCtrl.registerOnDisabledChange(isDisabled => { + if (isDisabled) this.textFormCtrl.disable({ onlySelf: true, emitEvent: false }); + else this.textFormCtrl.enable({ onlySelf: true, emitEvent: false }); + }) + if (this.formCtrl && this.formCtrl.value) { + this.textFormCtrl.patchValue(this.formCtrl.value, { emitEvent: false }); + this.hasSelectedItem = true; + } - const valueChanges = this.textFormCtrl.valueChanges.share(); + const valueChanges = this.textFormCtrl.valueChanges.share(); - valueChanges.subscribe(searchTerm => { // reset value of input control every time the user starts typing - if (this.hasSelectedItem) { - this.hasSelectedItem = false; - this.onItemChange.emit(null); - if (this.formCtrl && this.formCtrl.value) { - this.formCtrl.patchValue(null, { emitEvent: false }); - } - } - this.isUnchanged = false; - this.loading = true; - }); + valueChanges.subscribe(searchTerm => { // reset value of input control every time the user starts typing + if (this.hasSelectedItem) { + this.hasSelectedItem = false; + this.onItemChange.emit(null); + if (this.formCtrl && this.formCtrl.value) { + this.formCtrl.patchValue(null, { emitEvent: false }); + } + } + this.isUnchanged = false; + }); - valueChanges.debounceTime(this.typeaheadMS) - .do(value => { - if (this.hasSelectedItem) { this.loading = false; } - if (typeof value === 'string') { - this.inputData.requestItem.criteria["like"] = value; - this.inputData.callback(this.inputData.requestItem).map(res => { - this.options = res; - this.loading = false; - }).subscribe(); - } - }) - .subscribe(); - } + valueChanges.debounceTime(this.typeaheadMS) + .do(value => { + if (this.hasSelectedItem) { this.loading = false; } + if (typeof value === 'string') { + this.loading = true; + this.inputData.requestItem.criteria["like"] = value; + this.inputData.callback(this.inputData.requestItem).map(res => { + this.options = res; + this.loading = false; + }).subscribe(); + } else { + this.loading = false; + } + }) + .subscribe(); + } - printText(item: any): string { - if (this.displayFunction) { - return this.displayFunction(item) - } - else return item; - } + printText(item: any): string { + if (this.displayFunction) { + return this.displayFunction(item) + } + else return item; + } - getValue(item: any): string { - if (this.assignValueFunction) { - if (this.transformFunction) return this.assignValueFunction(this.transformFunction(item)) - else return this.assignValueFunction(item) - } - else return item; - } + getValue(item: any): string { + if (this.assignValueFunction) { + if (this.transformFunction) return this.assignValueFunction(this.transformFunction(item)) + else return this.assignValueFunction(item) + } + else return item; + } - optionSelected(event: any) { - if (this.formCtrl) { this.formCtrl.patchValue(this.assignValueFunction ? this.assignValueFunction(event.option.value) : event.option.value, { emitEvent: false }); } - this.hasSelectedItem = true; - this.onItemChange.emit(this.assignValueFunction ? this.assignValueFunction(event.option.value) : event.option.value); - } + optionSelected(event: any) { + if (this.formCtrl) { this.formCtrl.patchValue(this.assignValueFunction ? this.assignValueFunction(event.option.value) : event.option.value, { emitEvent: false }); } + this.hasSelectedItem = true; + this.onItemChange.emit(this.assignValueFunction ? this.assignValueFunction(event.option.value) : event.option.value); + if (this.clear) { + this.options = []; + this.loading = false; + this.textFormCtrl.patchValue(null) + }; + } - isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean { - const isFormSubmitted = form && form.submitted; - const isControlInvalid = (control && control.invalid && (control.dirty || control.touched || isFormSubmitted)) || (!this.hasSelectedItem && !this.isUnchanged); - const isFormInvalid = form && form.enabled && form.invalid && (form.dirty || form.touched || isFormSubmitted); - return !!(isControlInvalid || isFormInvalid); - } + isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean { + const isFormSubmitted = form && form.submitted; + const isControlInvalid = (control && control.invalid && (control.dirty || control.touched || isFormSubmitted)) || (!this.hasSelectedItem && !this.isUnchanged); + const isFormInvalid = form && form.enabled && form.invalid && (form.dirty || form.touched || isFormSubmitted); + return !!((isControlInvalid || isFormInvalid) && this.required); + } } diff --git a/dmp-frontend/src/app/available-profiles/available-profiles.component.html b/dmp-frontend/src/app/shared/components/available-profiles/available-profiles.component.html similarity index 100% rename from dmp-frontend/src/app/available-profiles/available-profiles.component.html rename to dmp-frontend/src/app/shared/components/available-profiles/available-profiles.component.html diff --git a/dmp-frontend/src/app/shared/components/available-profiles/available-profiles.component.ts b/dmp-frontend/src/app/shared/components/available-profiles/available-profiles.component.ts new file mode 100644 index 000000000..2be66061b --- /dev/null +++ b/dmp-frontend/src/app/shared/components/available-profiles/available-profiles.component.ts @@ -0,0 +1,53 @@ +import { JsonSerializer } from '../../../utilities/JsonSerializer'; +import { RequestItem } from '../../../models/criteria/RequestItem'; +import { Component, OnInit, Inject } from "@angular/core"; +import { FormGroup } from '@angular/forms'; +import { Params, ActivatedRoute, Router } from '@angular/router'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material'; +import { DatasetService } from '../../../services/dataset/dataset.service'; +import { DatasetProfileModel } from '../../../models/datasetprofile/DatasetProfileModel'; +import { DatasetProfileModule } from '../../../dataset-profile-form/dataset-profile.module'; + +@Component({ + selector: 'available-profiles-component', + templateUrl: 'available-profiles.component.html', + +}) +export class AvailableProfilesComponent implements OnInit { + + private formGroup: FormGroup; + private profiles: DatasetProfileModel[] = []; + private selectedProfiles: DatasetProfileModel[] = []; + + constructor( + private datasetService: DatasetService, + private route: ActivatedRoute, + public router: Router, + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: any + ) { } + + ngOnInit(): void { + + this.datasetService.getDatasetProfiles().subscribe(data => { + this.profiles = JsonSerializer.fromJSONArray(data, DatasetProfileModel) + } + ) + } + + addProfiles(profiles) { + console.log(profiles) + // profiles.selectedOptions.forEach(element => { + // selectedProfiles.push(element.value) + // }); + + profiles.selectedOptions.selected.forEach(element => { + let selectedElement = new DatasetProfileModel(); + selectedElement.id = element.value.id; + selectedElement.label = element.value.label; + this.selectedProfiles.push(selectedElement) + }) + + this.dialogRef.close(this.selectedProfiles); + } +} diff --git a/dmp-frontend/src/app/shared/components/criteria/data-management-plan/dmp-criteria.component.html b/dmp-frontend/src/app/shared/components/criteria/data-management-plan/dmp-criteria.component.html index d3fb8b5f7..34a3f3df4 100644 --- a/dmp-frontend/src/app/shared/components/criteria/data-management-plan/dmp-criteria.component.html +++ b/dmp-frontend/src/app/shared/components/criteria/data-management-plan/dmp-criteria.component.html @@ -1,28 +1,32 @@
- -
-
- - - {{baseErrorModel['Criteria.like']}} - -
-
- - -
{{chip.label.substring(0, 1).toUpperCase()}}
- {{chip.label}} -
- -
- {{option.label}} -
-
- -
-
-
-
-
\ No newline at end of file + + + +

{{'CRITERIA.FILTERS'| translate}}

+
+
+
+
+ + + {{baseErrorModel['Criteria.like']}} + +
+
+ + +
{{chip.label.substring(0, 1).toUpperCase()}}
+ {{chip.label}} +
+ +
+ {{option.label}} +
+
+ +
+
+
+
+ diff --git a/dmp-frontend/src/app/shared/components/criteria/data-management-plan/dmp-criteria.component.ts b/dmp-frontend/src/app/shared/components/criteria/data-management-plan/dmp-criteria.component.ts index ebc6417f1..447982c27 100644 --- a/dmp-frontend/src/app/shared/components/criteria/data-management-plan/dmp-criteria.component.ts +++ b/dmp-frontend/src/app/shared/components/criteria/data-management-plan/dmp-criteria.component.ts @@ -13,69 +13,68 @@ import { RequestItem } from '../../../../models/criteria/RequestItem'; import { create } from 'domain'; @Component({ - selector: 'app-dmp-criteria-component', - templateUrl: './dmp-criteria.component.html', - styleUrls: ['./dmp-criteria.component.scss'], - providers: [ProjectService] + selector: 'app-dmp-criteria-component', + templateUrl: './dmp-criteria.component.html', + styleUrls: ['./dmp-criteria.component.scss'], }) export class DataManagementPlanCriteriaComponent extends BaseCriteriaComponent implements OnInit { - @Input() - showProject: boolean; - public criteria: DataManagementPlanCriteria = new DataManagementPlanCriteria(); - filteringProjectsAsync: boolean = false; - filteredProjects: ProjectModel[]; + @Input() + showProject: boolean; + public criteria: DataManagementPlanCriteria = new DataManagementPlanCriteria(); + filteringProjectsAsync: boolean = false; + filteredProjects: ProjectModel[]; - constructor( - public language: TranslateService, - public projectService: ProjectService, - public formBuilder: FormBuilder - ) { - super(new DataManagementPlanCriteriaErrorModel()); - } + constructor( + public language: TranslateService, + public projectService: ProjectService, + public formBuilder: FormBuilder + ) { + super(new DataManagementPlanCriteriaErrorModel()); + } - ngOnInit() { - super.ngOnInit(); - if (this.criteria == null) { this.criteria = new DataManagementPlanCriteria(); } - } + ngOnInit() { + super.ngOnInit(); + if (this.criteria == null) { this.criteria = new DataManagementPlanCriteria(); } + } - setCriteria(criteria: DataManagementPlanCriteria): void { - this.criteria = criteria; - } + setCriteria(criteria: DataManagementPlanCriteria): void { + this.criteria = criteria; + } - onCallbackError(error: any) { - this.setErrorModel(error.error); - } + onCallbackError(error: any) { + this.setErrorModel(error.error); + } - controlModified(): void { - this.clearErrorModel(); - if (this.refreshCallback != null && - (this.criteria.like == null || this.criteria.like.length == 0 || this.criteria.like.length > 2) - ) { - this.refreshCallback(); - } - } + controlModified(): void { + this.clearErrorModel(); + if (this.refreshCallback != null && + (this.criteria.like == null || this.criteria.like.length == 0 || this.criteria.like.length > 2) + ) { + this.refreshCallback(); + } + } - filterProjects(value: string): void { + filterProjects(value: string): void { - this.filteredProjects = undefined; - if (value) { - this.filteringProjectsAsync = true; + this.filteredProjects = undefined; + if (value) { + this.filteringProjectsAsync = true; - let requestItem: RequestItem = new RequestItem(); - let criteria: ProjectCriteria = new ProjectCriteria(); - criteria.like = value; - requestItem.criteria = criteria; - this.projectService.get(requestItem).subscribe(items => { - this.filteredProjects = items; - this.filteringProjectsAsync = false; + let requestItem: RequestItem = new RequestItem(); + let criteria: ProjectCriteria = new ProjectCriteria(); + criteria.like = value; + requestItem.criteria = criteria; + this.projectService.get(requestItem).subscribe(items => { + this.filteredProjects = items; + this.filteringProjectsAsync = false; - // this.filteredProjects = items.filter((filteredObj: any) => { - // return this.objectsModel ? this.objectsModel.indexOf(filteredObj) < 0 : true; - // }); + // this.filteredProjects = items.filter((filteredObj: any) => { + // return this.objectsModel ? this.objectsModel.indexOf(filteredObj) < 0 : true; + // }); - }); - } - } + }); + } + } } diff --git a/dmp-frontend/src/app/shared/components/criteria/datamanagementplanprofile/dmp-profile-criteria.component.ts b/dmp-frontend/src/app/shared/components/criteria/datamanagementplanprofile/dmp-profile-criteria.component.ts index 626f4e4a0..612b0db27 100644 --- a/dmp-frontend/src/app/shared/components/criteria/datamanagementplanprofile/dmp-profile-criteria.component.ts +++ b/dmp-frontend/src/app/shared/components/criteria/datamanagementplanprofile/dmp-profile-criteria.component.ts @@ -15,47 +15,46 @@ import { DataManagementPlanProfileCriteria } from '../../../../models/criteria/d import { DataManagementPlanProfileCriteriaErrorModel } from '../../../../models/criteria/dmp-profile/DataManagementPlanProfileCriteriaErrorModel'; @Component({ - selector: 'app-dmp-profile-criteria-component', - templateUrl: './dmp-profile-criteria.component.html', - styleUrls: ['./dmp-profile-criteria.component.scss'], - providers: [ProjectService] + selector: 'app-dmp-profile-criteria-component', + templateUrl: './dmp-profile-criteria.component.html', + styleUrls: ['./dmp-profile-criteria.component.scss'], }) export class DataManagementPlanProfileCriteriaComponent extends BaseCriteriaComponent implements OnInit { - @Input() - showProject: boolean; - public criteria: DataManagementPlanProfileCriteria = new DataManagementPlanProfileCriteria(); - filteringProjectsAsync: boolean = false; - filteredProjects: ProjectModel[]; + @Input() + showProject: boolean; + public criteria: DataManagementPlanProfileCriteria = new DataManagementPlanProfileCriteria(); + filteringProjectsAsync: boolean = false; + filteredProjects: ProjectModel[]; - constructor( - public language: TranslateService, - public projectService: ProjectService, - public formBuilder: FormBuilder - ) { - super(new DataManagementPlanProfileCriteriaErrorModel()); - } + constructor( + public language: TranslateService, + public projectService: ProjectService, + public formBuilder: FormBuilder + ) { + super(new DataManagementPlanProfileCriteriaErrorModel()); + } - ngOnInit() { - super.ngOnInit(); - if (this.criteria == null) { this.criteria = new DataManagementPlanCriteria(); } - } + ngOnInit() { + super.ngOnInit(); + if (this.criteria == null) { this.criteria = new DataManagementPlanCriteria(); } + } - setCriteria(criteria: DataManagementPlanProfileCriteria): void { - this.criteria = criteria; - } + setCriteria(criteria: DataManagementPlanProfileCriteria): void { + this.criteria = criteria; + } - onCallbackError(error: any) { - this.setErrorModel(error.error); - } + onCallbackError(error: any) { + this.setErrorModel(error.error); + } - controlModified(): void { - this.clearErrorModel(); - if (this.refreshCallback != null && - (this.criteria.like == null || this.criteria.like.length == 0 || this.criteria.like.length > 2) - ) { - this.refreshCallback(); - } - } + controlModified(): void { + this.clearErrorModel(); + if (this.refreshCallback != null && + (this.criteria.like == null || this.criteria.like.length == 0 || this.criteria.like.length > 2) + ) { + this.refreshCallback(); + } + } } diff --git a/dmp-frontend/src/app/shared/components/criteria/datasets/datasets-criteria.component.html b/dmp-frontend/src/app/shared/components/criteria/datasets/datasets-criteria.component.html index 139fa0fce..87ec2c7d8 100644 --- a/dmp-frontend/src/app/shared/components/criteria/datasets/datasets-criteria.component.html +++ b/dmp-frontend/src/app/shared/components/criteria/datasets/datasets-criteria.component.html @@ -1,7 +1,12 @@
- -
- -
- - - {{baseErrorModel['Criteria.like']}} - -
-
- - - - {{status.viewValue}} - - - {{baseErrorModel['Criteria.status']}} - -
-
-
+
+ + + {{baseErrorModel['Criteria.like']}} + +
+
+ + + + {{status.viewValue}} + + + {{baseErrorModel['Criteria.status']}} + +
+ +
\ No newline at end of file +[matDatepicker]="periodEndPicker" --> diff --git a/dmp-frontend/src/app/shared/components/criteria/projects/projects-criteria.component.html b/dmp-frontend/src/app/shared/components/criteria/projects/projects-criteria.component.html index 3a6fddd61..351b0accd 100644 --- a/dmp-frontend/src/app/shared/components/criteria/projects/projects-criteria.component.html +++ b/dmp-frontend/src/app/shared/components/criteria/projects/projects-criteria.component.html @@ -1,32 +1,37 @@
- -
-
- - - {{baseErrorModel['criteria.like']}} - -
-
- - - - - - {{baseErrorModel['criteria.periodStart']}} - -
-
- - - {{baseErrorModel['criteria.periodEnd']}} - - - -
-
-
-
\ No newline at end of file + + + +

{{'CRITERIA.FILTERS'| translate}}

+
+
+
+
+ + + {{baseErrorModel['criteria.like']}} + +
+
+ + + + + + {{baseErrorModel['criteria.periodStart']}} + +
+
+ + + {{baseErrorModel['criteria.periodEnd']}} + + + +
+
+
+ diff --git a/dmp-frontend/src/app/shared/components/external-items/external-item-listing/external-item-listing.component.html b/dmp-frontend/src/app/shared/components/external-items/external-item-listing/external-item-listing.component.html new file mode 100644 index 000000000..651a2966c --- /dev/null +++ b/dmp-frontend/src/app/shared/components/external-items/external-item-listing/external-item-listing.component.html @@ -0,0 +1,20 @@ +
+
+
+ + + + {{ option.label }} + + + + + +
+
+ + +
+
+
diff --git a/dmp-frontend/src/app/shared/components/external-items/external-item-listing/external-item-listing.component.scss b/dmp-frontend/src/app/shared/components/external-items/external-item-listing/external-item-listing.component.scss new file mode 100644 index 000000000..9cf774a68 --- /dev/null +++ b/dmp-frontend/src/app/shared/components/external-items/external-item-listing/external-item-listing.component.scss @@ -0,0 +1,3 @@ +.fxItems { + flex: 1 1 0 +} diff --git a/dmp-frontend/src/app/shared/components/external-items/external-item-listing/external-item-listing.component.ts b/dmp-frontend/src/app/shared/components/external-items/external-item-listing/external-item-listing.component.ts new file mode 100644 index 000000000..dd8b8b2cd --- /dev/null +++ b/dmp-frontend/src/app/shared/components/external-items/external-item-listing/external-item-listing.component.ts @@ -0,0 +1,55 @@ +import { Component, OnInit, Input, ContentChild, TemplateRef, ViewChild, Output, EventEmitter } from "@angular/core"; +import { AutoCompleteConfiguration } from "../../autocomplete/AutoCompleteConfiguration"; +import { FormGroup, FormControl } from "@angular/forms"; +import { ExternalSourcesUrlModel } from "../../../../models/external-sources/ExternalSourcesUrlModel"; + +@Component({ + selector: 'app-external-item-listing', + templateUrl: './external-item-listing.component.html', + styleUrls: ['./external-item-listing.component.scss'] +}) +export class ExternalItemListingComponent implements OnInit { + @Input() + public placeholder: string; + + @Input() + public formGroup: FormGroup; + + @Input() + public autoCompleteConfiguration: AutoCompleteConfiguration; + + @Input() + public displayFunction: Function; + + @Input() + public disabled = true; + + @Input() + public titleKey: string; + + @Input() + parentTemplate; + + @Input() + public options: Array + + @Output() + public onItemChange = new EventEmitter(); + + public choice: string; + public formControl = new FormControl(); + + ngOnInit() { + if (this.disabled) this.formControl.disable(); + } + + onItemChangeFunc(event) { + if (event) this.onItemChange.emit(event); + } + + selectionChange(event) { + if (this.formControl.disabled) this.formControl.enable(); + this.autoCompleteConfiguration.requestItem.criteria["type"] = event.value; + } +} + diff --git a/dmp-frontend/src/app/shared/components/external-items/external-item/external-item.component.html b/dmp-frontend/src/app/shared/components/external-items/external-item/external-item.component.html new file mode 100644 index 000000000..18cb0553b --- /dev/null +++ b/dmp-frontend/src/app/shared/components/external-items/external-item/external-item.component.html @@ -0,0 +1,4 @@ + + diff --git a/dmp-frontend/src/app/invitation-accepted/invitation-accepted.component.html b/dmp-frontend/src/app/shared/components/external-items/external-item/external-item.component.scss similarity index 100% rename from dmp-frontend/src/app/invitation-accepted/invitation-accepted.component.html rename to dmp-frontend/src/app/shared/components/external-items/external-item/external-item.component.scss diff --git a/dmp-frontend/src/app/shared/components/external-items/external-item/external-item.component.ts b/dmp-frontend/src/app/shared/components/external-items/external-item/external-item.component.ts new file mode 100644 index 000000000..56533df29 --- /dev/null +++ b/dmp-frontend/src/app/shared/components/external-items/external-item/external-item.component.ts @@ -0,0 +1,44 @@ +import { Component, OnInit, Input, Output, EventEmitter } from "@angular/core"; +import { Placeholder } from "@angular/compiler/src/i18n/i18n_ast"; +import { AutoCompleteConfiguration } from "../../autocomplete/AutoCompleteConfiguration"; +import { FormGroup, FormControl } from "@angular/forms"; + +@Component({ + selector: 'app-external-item', + templateUrl: './external-item.component.html', + styleUrls: ['./external-item.component.scss'] +}) +export class ExternalItemComponent implements OnInit { + + @Input() + public placeholder: string; + + @Input() + public formGroup: FormGroup; + + @Input() + public autoCompleteConfiguration: AutoCompleteConfiguration; + + @Input() + public displayFunction: Function; + + @Input() + public disabled = false; + + @Input() + public titleKey: string; + + @Output() + public onItemChange = new EventEmitter(); + + @Input() + public formCtrl: FormControl; + + ngOnInit() { + //this.formCtrl.valueChanges.subscribe(x => console.log(x)); + } + + onItemChangeFunc(event) { + this.onItemChange.emit(event); + } +} diff --git a/dmp-frontend/src/app/invitation/invitation.component.scss b/dmp-frontend/src/app/shared/components/invitation-accepted/invitation-accepted.component.html similarity index 100% rename from dmp-frontend/src/app/invitation/invitation.component.scss rename to dmp-frontend/src/app/shared/components/invitation-accepted/invitation-accepted.component.html diff --git a/dmp-frontend/src/app/shared/components/invitation-accepted/invitation-accepted.component.ts b/dmp-frontend/src/app/shared/components/invitation-accepted/invitation-accepted.component.ts new file mode 100644 index 000000000..3680c0f3d --- /dev/null +++ b/dmp-frontend/src/app/shared/components/invitation-accepted/invitation-accepted.component.ts @@ -0,0 +1,33 @@ +import { JsonSerializer } from '../../../utilities/JsonSerializer'; +import { UserInvitationCriteria } from '../../../models/criteria/invitation/UserInvitationCriteria'; +import { RequestItem } from '../../../models/criteria/RequestItem'; +import { Invitation } from '../../../models/invitation/Invitation'; +import { InvitationService } from '../../../services/invitation/invitation.service'; +import { User } from '../../../models/invitation/User'; +import { Component, OnInit, Inject } from "@angular/core"; +import { FormGroup } from '@angular/forms'; +import { Params, ActivatedRoute, Router } from '@angular/router'; +import { MAT_DIALOG_DATA } from '@angular/material'; + +@Component({ + selector: 'app-invitation-accepted-component', + templateUrl: 'invitation-accepted.component.html', + +}) +export class InvitationAcceptedComponent implements OnInit { + constructor( + private invitationService: InvitationService, + private route: ActivatedRoute, + public router: Router + ) { } + + ngOnInit(): void { + this.route.params.subscribe(params => { + let id = params["id"] + this.invitationService.exchange(id).subscribe(id => { + this.router.navigate(["dmps/edit/" + id]) + }) + } + ) + } +} diff --git a/dmp-frontend/src/app/invitation/invitation.component.html b/dmp-frontend/src/app/shared/components/invitation/invitation.component.html similarity index 100% rename from dmp-frontend/src/app/invitation/invitation.component.html rename to dmp-frontend/src/app/shared/components/invitation/invitation.component.html diff --git a/dmp-frontend/src/app/shared/components/invitation/invitation.component.scss b/dmp-frontend/src/app/shared/components/invitation/invitation.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/dmp-frontend/src/app/shared/components/invitation/invitation.component.ts b/dmp-frontend/src/app/shared/components/invitation/invitation.component.ts new file mode 100644 index 000000000..3eb679241 --- /dev/null +++ b/dmp-frontend/src/app/shared/components/invitation/invitation.component.ts @@ -0,0 +1,64 @@ +import { JsonSerializer } from '../../../utilities/JsonSerializer'; +import { UserInvitationCriteria } from '../../../models/criteria/invitation/UserInvitationCriteria'; +import { RequestItem } from '../../../models/criteria/RequestItem'; +import { Invitation } from '../../../models/invitation/Invitation'; +import { InvitationService } from '../../../services/invitation/invitation.service'; +import { User } from '../../../models/invitation/User'; +import { Component, OnInit, Inject } from "@angular/core"; +import { FormGroup } from '@angular/forms'; +import { Params, ActivatedRoute, Router } from '@angular/router'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material'; + +@Component({ + selector: 'app-invitation-component', + templateUrl: 'invitation.component.html', + +}) +export class InvitationComponent implements OnInit { + + private formGroup: FormGroup; + + private filteredUsersAsync: boolean = false; + + private filteredUsers: User[]; + + constructor( + private invitationService: InvitationService, + private route: ActivatedRoute, + public router: Router, + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: any + ) { } + + ngOnInit(): void { + let invitation = new Invitation(); + invitation.dataManagementPlan = this.data.dmpId; + this.formGroup = invitation.buildForm(); + } + + + send(value: any) { + this.invitationService.inviteUsers(this.formGroup.value).subscribe( + null, null, () => this.dialogRef.close() + ); + } + + filterUsers(value: string): void { + this.filteredUsers = undefined; + if (value) { + this.filteredUsersAsync = true; + let request = new RequestItem(); + request.criteria = { like: value } + this.invitationService.getUsers(request).subscribe(items => { + this.filteredUsers = JsonSerializer.fromJSONArray(items, User); + if (!this.filteredUsers || this.filteredUsers.length == 0) { + let user = new User(); + user.email = value; + user.name = value; + this.filteredUsers.push(user) + } + this.filteredUsersAsync = false; + }); + } + } +} diff --git a/dmp-frontend/src/app/shared/components/navigation/navigation.component.css b/dmp-frontend/src/app/shared/components/navigation/navigation.component.css index 762f55639..f0668bffc 100644 --- a/dmp-frontend/src/app/shared/components/navigation/navigation.component.css +++ b/dmp-frontend/src/app/shared/components/navigation/navigation.component.css @@ -21,6 +21,11 @@ padding-right: 15px; } -.login-label{ - font-size:14px; +.login-label { + font-size: 14px; } + +.logo { + width: 38px; + height: 38px; +} \ No newline at end of file diff --git a/dmp-frontend/src/app/shared/components/navigation/navigation.component.html b/dmp-frontend/src/app/shared/components/navigation/navigation.component.html index 93d274e4b..70c5df432 100644 --- a/dmp-frontend/src/app/shared/components/navigation/navigation.component.html +++ b/dmp-frontend/src/app/shared/components/navigation/navigation.component.html @@ -1,5 +1,7 @@ - {{'NAV-BAR.TITLE' | translate}} +
@@ -12,6 +14,7 @@
+ {{this.getPrincipalName()}}