From c75fe2da313d3026998ed108f1f082bc439c1e84 Mon Sep 17 00:00:00 2001 From: Ryan Mathis Date: Thu, 21 Jun 2018 16:04:55 +0000 Subject: [PATCH] Merged in feature/SHIBUI-598 (pull request #91) * SHIBUI-598 Reorganizing code Approved-by: Shibui Jenkins --- ui/src/app/app.component.html | 22 +-- ui/src/app/app.component.spec.ts | 2 +- ui/src/app/app.component.ts | 6 - ui/src/app/app.module.ts | 21 +-- ui/src/app/app.reducer.ts | 3 +- ui/src/app/app.routing.ts | 16 ++ .../contention/action/contention.action.ts | 2 - .../component/change-item.component.ts | 12 +- .../component/contention-dialog.component.ts | 8 +- ui/src/app/contention/contention.module.ts | 6 +- .../contention/effect/contention.effect.ts | 3 - .../contention/reducer/contention.reducer.ts | 1 - .../app/core/service/differential.service.ts | 1 - .../container/dashboard.component.html | 70 -------- .../dashboard/reducer/dashboard.reducer.ts | 31 ---- .../action/provider-collection.action.ts | 147 ----------------- ui/src/app/domain/domain.type.ts | 14 -- .../effect/provider-collection.effect.spec.ts | 44 ----- .../effect/provider-collection.effects.ts | 150 ------------------ ui/src/app/domain/model/metadata-provider.ts | 36 ----- .../reducer/draft-collection.reducer.ts | 61 ------- ui/src/app/domain/reducer/index.ts | 88 ---------- .../reducer/provider-collection.reducer.ts | 57 ------- .../container/provider.component.ts | 36 ----- ui/src/app/edit-provider/editor.module.ts | 84 ---------- .../app/edit-provider/effect/editor.effect.ts | 62 -------- ui/src/app/edit-provider/reducer/index.ts | 24 --- .../action/filter.action.spec.ts | 8 - .../metadata-filter/action/search.action.ts | 50 ------ .../metadata-filter/effect/filter.effect.ts | 71 --------- .../metadata-provider/action/copy.action.ts | 53 ------- .../advanced-info-form.component.spec.ts | 82 ---------- .../container/new-provider.component.spec.ts | 66 -------- .../container/new-provider.component.ts | 11 -- .../metadata-provider.module.ts | 102 ------------ ui/src/app/metadata-provider/reducer/index.ts | 34 ---- .../domain/action/entity.action.ts | 2 +- .../forms/advanced-info-form.component.html | 0 .../advanced-info-form.component.spec.ts | 102 ++++++++++++ .../forms/advanced-info-form.component.ts | 42 ++--- .../forms/assertion-form.component.html | 0 .../forms/assertion-form.component.spec.ts | 21 +-- .../forms/assertion-form.component.ts | 13 +- .../attribute-release-form.component.html | 0 .../attribute-release-form.component.spec.ts | 15 +- .../forms/attribute-release-form.component.ts | 10 +- .../forms/descriptor-info-form.component.html | 0 .../descriptor-info-form.component.spec.ts | 23 +-- .../forms/descriptor-info-form.component.ts | 8 +- .../forms/finish-form.component.html | 106 ++++++------- .../forms/finish-form.component.scss | 2 +- .../forms/finish-form.component.spec.ts | 32 ++-- .../component/forms/finish-form.component.ts | 14 +- .../forms/key-info-form.component.html | 0 .../forms/key-info-form.component.spec.ts | 24 +-- .../forms/key-info-form.component.ts | 14 +- .../forms/logout-form.component.html | 0 .../forms/logout-form.component.spec.ts | 27 ++-- .../component/forms/logout-form.component.ts | 14 +- .../forms/metadata-ui-form.component.html | 0 .../forms/metadata-ui-form.component.spec.ts | 28 ++-- .../forms/metadata-ui-form.component.ts | 13 +- .../organization-info-form.component.html | 0 .../organization-info-form.component.spec.ts | 23 +-- .../forms/organization-info-form.component.ts | 13 +- .../provider-form-fragment.component.spec.ts | 2 +- .../forms/provider-form-fragment.component.ts | 15 +- .../forms/relying-party-form.component.html | 0 .../relying-party-form.component.spec.ts | 23 +-- .../forms/relying-party-form.component.ts | 9 +- .../domain}/component/index.ts | 8 +- .../component}/preview-dialog.component.html | 0 .../component/preview-dialog.component.ts | 25 +++ .../{ => metadata}/domain/domain.module.ts | 32 ++-- ui/src/app/metadata/domain/domain.type.ts | 36 +++++ .../app/metadata/domain/domain.util.spec.ts | 36 +++++ ui/src/app/metadata/domain/domain.util.ts | 10 ++ .../domain/effect/entity.effect.spec.ts | 12 +- .../domain/effect/entity.effect.ts | 16 +- .../filter/entity-attributes-filter.ts} | 26 ++- ui/src/app/metadata/domain/entity/index.ts | 3 + ...file-backed-http-metadata-provider.spec.ts | 104 ++++++++++++ .../file-backed-http-metadata-provider.ts} | 25 ++- ...ile-backed-http-metadata-resolver.spec.ts} | 7 +- .../file-backed-http-metadata-resolver.ts | 86 ++++++++++ ui/src/app/metadata/domain/model/index.ts | 15 ++ .../domain/model/metadata-base.ts | 8 +- .../metadata/domain/model/metadata-entity.ts | 12 ++ .../domain/model/metadata-filter.ts | 2 - .../domain/model/metadata-provider.ts | 25 +++ .../domain/model/metadata-resolver.ts | 26 +++ .../domain/model/properties}/certificate.ts | 2 +- .../domain/model/properties}/contact.ts | 2 +- .../domain/model/properties}/filter-target.ts | 0 .../model/properties}/logout-endpoint.ts | 2 +- .../domain/model/properties}/mdui.ts | 0 .../domain/model/properties}/organization.ts | 0 .../properties}/relying-party-overrides.ts | 0 .../domain/model/properties}/security-info.ts | 0 .../model/properties}/sso-descriptor.ts | 0 .../domain/model/properties}/sso-service.ts | 0 .../domain/service/draft.service.spec.ts} | 11 +- .../domain/service/draft.service.ts} | 19 ++- .../domain/service/entity-id.service.spec.ts | 0 .../domain/service/entity-id.service.ts | 11 +- .../service/entity-validators.service.spec.ts | 0 .../service/entity-validators.service.ts | 2 +- .../service/list-values.service.spec.ts | 0 .../domain/service/list-values.service.ts | 0 .../provider-change-emitter.service.spec.ts | 2 +- .../provider-change-emitter.service.ts | 0 .../domain/service/provider.service.spec.ts} | 27 ++-- .../domain/service/provider.service.ts} | 5 +- .../domain/service/resolver.service.spec.ts} | 32 ++-- .../domain/service/resolver.service.ts} | 39 ++--- .../filter/action/collection.action.ts} | 0 .../filter/action/filter.action.spec.ts | 8 + .../filter}/action/filter.action.ts | 36 ++--- .../filter}/action/search.action.spec.ts | 0 .../metadata/filter/action/search.action.ts | 52 ++++++ .../component/search-dialog.component.html | 0 .../component/search-dialog.component.scss | 0 .../component/search-dialog.component.spec.ts | 10 +- .../component/search-dialog.component.ts | 2 +- .../container/edit-filter.component.html | 4 +- .../container/edit-filter.component.spec.ts | 0 .../container/edit-filter.component.ts | 15 +- .../filter}/container/filter.component.html | 0 .../filter}/container/filter.component.scss | 0 .../container/filter.component.spec.ts | 0 .../filter}/container/filter.component.ts | 9 +- .../container/new-filter.component.html | 4 +- .../container/new-filter.component.spec.ts | 10 +- .../filter}/container/new-filter.component.ts | 6 +- .../filter/effect/collection.effect.spec.ts} | 18 +-- .../filter/effect/collection.effect.ts} | 14 +- .../metadata/filter/effect/filter.effect.ts | 82 ++++++++++ .../filter}/effect/search.effect.ts | 19 ++- .../filter}/filter.module.ts | 42 +++-- .../filter}/guard/filter-exists.guard.ts | 5 +- .../reducer/collection.reducer.spec.ts} | 12 +- .../filter/reducer/collection.reducer.ts} | 17 +- .../filter}/reducer/filter.reducer.spec.ts | 30 ++-- .../filter}/reducer/filter.reducer.ts | 26 +-- .../filter}/reducer/index.ts | 30 +++- .../filter}/reducer/search.reducer.spec.ts | 29 ++-- .../filter}/reducer/search.reducer.ts | 22 +-- .../manager/action/manager.action.ts} | 0 .../manager}/action/search.action.ts | 7 +- .../component/delete-dialog.component.html | 0 .../component/delete-dialog.component.ts | 0 .../component/entity-item.component.html | 36 ++--- .../component/entity-item.component.scss | 2 +- .../component/entity-item.component.spec.ts | 8 +- .../component/entity-item.component.ts | 5 +- .../component/provider-search.component.html | 6 +- .../component/provider-search.component.ts | 0 .../manager/container/manager.component.html | 42 +++++ .../manager/container/manager.component.scss} | 0 .../container/manager.component.spec.ts} | 54 +++---- .../manager/container/manager.component.ts} | 52 +++--- .../manager}/effect/search.effects.ts | 24 +-- .../manager/manager.module.ts} | 35 ++-- .../manager}/reducer/index.ts | 16 +- .../manager/reducer/manager.reducer.spec.ts} | 12 +- .../manager/reducer/manager.reducer.ts | 29 ++++ .../manager}/reducer/search.reducer.ts | 7 +- .../metadata.component.html} | 0 .../app/metadata/metadata.component.spec.ts | 55 +++++++ ui/src/app/metadata/metadata.component.ts | 24 +++ ui/src/app/metadata/metadata.module.ts | 25 +++ ui/src/app/metadata/metadata.routing.ts | 90 +++++++++++ .../app/metadata/provider/provider.module.ts | 25 +++ .../resolver/action/collection.action.ts | 147 +++++++++++++++++ .../metadata/resolver/action/copy.action.ts | 53 +++++++ .../resolver/action/draft.action.ts} | 52 +++--- .../resolver}/action/editor.action.ts | 6 +- .../resolver}/action/search.action.ts | 7 +- .../component/unsaved-dialog.component.html | 0 .../component/unsaved-dialog.component.ts | 6 +- .../component/wizard-nav.component.html | 0 .../component/wizard-nav.component.spec.ts | 10 +- .../component/wizard-nav.component.ts | 2 - .../container/blank-resolver.component.html} | 6 +- .../blank-resolver.component.spec.ts} | 20 ++- .../container/blank-resolver.component.ts} | 26 ++- .../container/confirm-copy.component.html | 4 +- .../container/confirm-copy.component.scss | 0 .../container/confirm-copy.component.spec.ts | 0 .../container/confirm-copy.component.ts | 21 ++- .../container/copy-resolver.component.html} | 6 +- .../copy-resolver.component.spec.ts} | 32 ++-- .../container/copy-resolver.component.ts} | 28 ++-- .../resolver/container/draft.component.html} | 0 .../resolver}/container/draft.component.ts | 14 +- .../resolver}/container/editor.component.html | 22 +-- .../resolver}/container/editor.component.ts | 67 ++++---- .../container/new-resolver.component.html} | 8 +- .../container/new-resolver.component.scss} | 2 +- .../container/new-resolver.component.spec.ts | 60 +++++++ .../container/new-resolver.component.ts | 11 ++ .../container/resolver.component.html | 1 + .../container/resolver.component.scss} | 0 .../container/resolver.component.spec.ts} | 17 +- .../resolver/container/resolver.component.ts | 34 ++++ .../container/upload-resolver.component.html} | 12 +- .../upload-resolver.component.spec.ts} | 28 ++-- .../container/upload-resolver.component.ts} | 23 ++- .../resolver}/container/wizard.component.html | 24 +-- .../resolver}/container/wizard.component.scss | 0 .../resolver}/container/wizard.component.ts | 38 ++--- .../resolver}/editor-definition.const.ts | 20 +-- .../resolver/effect/collection.effect.spec.ts | 42 +++++ .../resolver/effect/collection.effects.ts | 148 +++++++++++++++++ .../resolver}/effect/copy.effect.ts | 32 ++-- .../effect/draft-collection.effect.spec.ts | 24 ++- .../effect/draft-collection.effects.ts | 30 ++-- .../metadata/resolver/effect/editor.effect.ts | 59 +++++++ .../resolver}/effect/search.effect.ts | 11 +- .../resolver}/effect/wizard.effect.ts | 14 +- .../resolver}/guard/copy-isset.guard.ts | 0 .../reducer/collection.reducer.spec.ts} | 56 +++---- .../resolver/reducer/collection.reducer.ts | 54 +++++++ .../resolver}/reducer/copy.reducer.spec.ts | 60 +++---- .../resolver}/reducer/copy.reducer.ts | 24 ++- .../resolver/reducer/draft.reducer.spec.ts} | 18 +-- .../resolver/reducer/draft.reducer.ts | 59 +++++++ .../resolver}/reducer/editor.reducer.spec.ts | 30 ++-- .../resolver}/reducer/editor.reducer.ts | 19 +-- ui/src/app/metadata/resolver/reducer/index.ts | 105 ++++++++++++ .../resolver}/reducer/search.reducer.spec.ts | 4 +- .../resolver}/reducer/search.reducer.ts | 3 +- .../app/metadata/resolver/resolver.module.ts | 93 +++++++++++ ui/src/app/notification/reducer/index.ts | 1 - ui/src/app/routing.module.ts | 27 ---- .../component/i18n-text.component.html | 0 .../component/i18n-text.component.ts | 0 .../component/valid-form-icon.component.html | 0 .../component/valid-form-icon.component.ts | 2 +- .../directive/info-label.directive.spec.ts | 0 .../directive/info-label.directive.ts | 0 .../input-defaults.directive.spec.ts | 0 .../directive/input-defaults.directive.ts | 0 ui/src/app/shared/pipe/highlight.pipe.spec.ts | 28 ++++ .../app/shared/pipe/pretty-xml.pipe.spec.ts | 20 +++ .../pipe/pretty-xml.pipe.ts | 0 .../preview/preview-dialog.component.ts | 30 ---- .../shared/preview/preview-dialog.module.ts | 19 --- ui/src/app/shared/shared.module.ts | 17 +- ui/src/testing/provider.stub.ts | 3 +- ui/src/testing/resolver.stub.ts | 49 ++++++ 251 files changed, 3002 insertions(+), 2689 deletions(-) create mode 100644 ui/src/app/app.routing.ts delete mode 100644 ui/src/app/dashboard/container/dashboard.component.html delete mode 100644 ui/src/app/dashboard/reducer/dashboard.reducer.ts delete mode 100644 ui/src/app/domain/action/provider-collection.action.ts delete mode 100644 ui/src/app/domain/domain.type.ts delete mode 100644 ui/src/app/domain/effect/provider-collection.effect.spec.ts delete mode 100644 ui/src/app/domain/effect/provider-collection.effects.ts delete mode 100644 ui/src/app/domain/model/metadata-provider.ts delete mode 100644 ui/src/app/domain/reducer/draft-collection.reducer.ts delete mode 100644 ui/src/app/domain/reducer/index.ts delete mode 100644 ui/src/app/domain/reducer/provider-collection.reducer.ts delete mode 100644 ui/src/app/edit-provider/container/provider.component.ts delete mode 100644 ui/src/app/edit-provider/editor.module.ts delete mode 100644 ui/src/app/edit-provider/effect/editor.effect.ts delete mode 100644 ui/src/app/edit-provider/reducer/index.ts delete mode 100644 ui/src/app/metadata-filter/action/filter.action.spec.ts delete mode 100644 ui/src/app/metadata-filter/action/search.action.ts delete mode 100644 ui/src/app/metadata-filter/effect/filter.effect.ts delete mode 100644 ui/src/app/metadata-provider/action/copy.action.ts delete mode 100644 ui/src/app/metadata-provider/component/forms/advanced-info-form.component.spec.ts delete mode 100644 ui/src/app/metadata-provider/container/new-provider.component.spec.ts delete mode 100644 ui/src/app/metadata-provider/container/new-provider.component.ts delete mode 100644 ui/src/app/metadata-provider/metadata-provider.module.ts delete mode 100644 ui/src/app/metadata-provider/reducer/index.ts rename ui/src/app/{ => metadata}/domain/action/entity.action.ts (82%) rename ui/src/app/{metadata-provider => metadata/domain}/component/forms/advanced-info-form.component.html (100%) create mode 100644 ui/src/app/metadata/domain/component/forms/advanced-info-form.component.spec.ts rename ui/src/app/{metadata-provider => metadata/domain}/component/forms/advanced-info-form.component.ts (69%) rename ui/src/app/{metadata-provider => metadata/domain}/component/forms/assertion-form.component.html (100%) rename ui/src/app/{metadata-provider => metadata/domain}/component/forms/assertion-form.component.spec.ts (78%) rename ui/src/app/{metadata-provider => metadata/domain}/component/forms/assertion-form.component.ts (79%) rename ui/src/app/{metadata-provider => metadata/domain}/component/forms/attribute-release-form.component.html (100%) rename ui/src/app/{metadata-provider => metadata/domain}/component/forms/attribute-release-form.component.spec.ts (82%) rename ui/src/app/{metadata-provider => metadata/domain}/component/forms/attribute-release-form.component.ts (89%) rename ui/src/app/{metadata-provider => metadata/domain}/component/forms/descriptor-info-form.component.html (100%) rename ui/src/app/{metadata-provider => metadata/domain}/component/forms/descriptor-info-form.component.spec.ts (80%) rename ui/src/app/{metadata-provider => metadata/domain}/component/forms/descriptor-info-form.component.ts (88%) rename ui/src/app/{metadata-provider => metadata/domain}/component/forms/finish-form.component.html (82%) rename ui/src/app/{metadata-provider => metadata/domain}/component/forms/finish-form.component.scss (73%) rename ui/src/app/{metadata-provider => metadata/domain}/component/forms/finish-form.component.spec.ts (72%) rename ui/src/app/{metadata-provider => metadata/domain}/component/forms/finish-form.component.ts (70%) rename ui/src/app/{metadata-provider => metadata/domain}/component/forms/key-info-form.component.html (100%) rename ui/src/app/{metadata-provider => metadata/domain}/component/forms/key-info-form.component.spec.ts (82%) rename ui/src/app/{metadata-provider => metadata/domain}/component/forms/key-info-form.component.ts (86%) rename ui/src/app/{metadata-provider => metadata/domain}/component/forms/logout-form.component.html (100%) rename ui/src/app/{metadata-provider => metadata/domain}/component/forms/logout-form.component.spec.ts (82%) rename ui/src/app/{metadata-provider => metadata/domain}/component/forms/logout-form.component.ts (76%) rename ui/src/app/{metadata-provider => metadata/domain}/component/forms/metadata-ui-form.component.html (100%) rename ui/src/app/{metadata-provider => metadata/domain}/component/forms/metadata-ui-form.component.spec.ts (69%) rename ui/src/app/{metadata-provider => metadata/domain}/component/forms/metadata-ui-form.component.ts (73%) rename ui/src/app/{metadata-provider => metadata/domain}/component/forms/organization-info-form.component.html (100%) rename ui/src/app/{metadata-provider => metadata/domain}/component/forms/organization-info-form.component.spec.ts (77%) rename ui/src/app/{metadata-provider => metadata/domain}/component/forms/organization-info-form.component.ts (87%) rename ui/src/app/{metadata-provider => metadata/domain}/component/forms/provider-form-fragment.component.spec.ts (95%) rename ui/src/app/{metadata-provider => metadata/domain}/component/forms/provider-form-fragment.component.ts (74%) rename ui/src/app/{metadata-provider => metadata/domain}/component/forms/relying-party-form.component.html (100%) rename ui/src/app/{metadata-provider => metadata/domain}/component/forms/relying-party-form.component.spec.ts (84%) rename ui/src/app/{metadata-provider => metadata/domain}/component/forms/relying-party-form.component.ts (89%) rename ui/src/app/{metadata-provider => metadata/domain}/component/index.ts (84%) rename ui/src/app/{shared/preview => metadata/domain/component}/preview-dialog.component.html (100%) create mode 100644 ui/src/app/metadata/domain/component/preview-dialog.component.ts rename ui/src/app/{ => metadata}/domain/domain.module.ts (53%) create mode 100644 ui/src/app/metadata/domain/domain.type.ts create mode 100644 ui/src/app/metadata/domain/domain.util.spec.ts create mode 100644 ui/src/app/metadata/domain/domain.util.ts rename ui/src/app/{ => metadata}/domain/effect/entity.effect.spec.ts (80%) rename ui/src/app/{ => metadata}/domain/effect/entity.effect.ts (65%) rename ui/src/app/{domain/entity/entity-attributes.filter.ts => metadata/domain/entity/filter/entity-attributes-filter.ts} (71%) create mode 100644 ui/src/app/metadata/domain/entity/index.ts create mode 100644 ui/src/app/metadata/domain/entity/provider/file-backed-http-metadata-provider.spec.ts rename ui/src/app/{domain/entity/provider.ts => metadata/domain/entity/provider/file-backed-http-metadata-provider.ts} (74%) rename ui/src/app/{domain/entity/provider.spec.ts => metadata/domain/entity/resolver/file-backed-http-metadata-resolver.spec.ts} (92%) create mode 100644 ui/src/app/metadata/domain/entity/resolver/file-backed-http-metadata-resolver.ts create mode 100644 ui/src/app/metadata/domain/model/index.ts rename ui/src/app/{ => metadata}/domain/model/metadata-base.ts (50%) create mode 100644 ui/src/app/metadata/domain/model/metadata-entity.ts rename ui/src/app/{ => metadata}/domain/model/metadata-filter.ts (84%) create mode 100644 ui/src/app/metadata/domain/model/metadata-provider.ts create mode 100644 ui/src/app/metadata/domain/model/metadata-resolver.ts rename ui/src/app/{domain/model => metadata/domain/model/properties}/certificate.ts (97%) rename ui/src/app/{domain/model => metadata/domain/model/properties}/contact.ts (97%) rename ui/src/app/{domain/model => metadata/domain/model/properties}/filter-target.ts (100%) rename ui/src/app/{domain/model => metadata/domain/model/properties}/logout-endpoint.ts (97%) rename ui/src/app/{domain/model => metadata/domain/model/properties}/mdui.ts (100%) rename ui/src/app/{domain/model => metadata/domain/model/properties}/organization.ts (100%) rename ui/src/app/{domain/model => metadata/domain/model/properties}/relying-party-overrides.ts (100%) rename ui/src/app/{domain/model => metadata/domain/model/properties}/security-info.ts (100%) rename ui/src/app/{domain/model => metadata/domain/model/properties}/sso-descriptor.ts (100%) rename ui/src/app/{domain/model => metadata/domain/model/properties}/sso-service.ts (100%) rename ui/src/app/{domain/service/entity-draft.service.spec.ts => metadata/domain/service/draft.service.spec.ts} (74%) rename ui/src/app/{domain/service/entity-draft.service.ts => metadata/domain/service/draft.service.ts} (60%) rename ui/src/app/{ => metadata}/domain/service/entity-id.service.spec.ts (100%) rename ui/src/app/{ => metadata}/domain/service/entity-id.service.ts (82%) rename ui/src/app/{ => metadata}/domain/service/entity-validators.service.spec.ts (100%) rename ui/src/app/{ => metadata}/domain/service/entity-validators.service.ts (96%) rename ui/src/app/{ => metadata}/domain/service/list-values.service.spec.ts (100%) rename ui/src/app/{ => metadata}/domain/service/list-values.service.ts (100%) rename ui/src/app/{ => metadata}/domain/service/provider-change-emitter.service.spec.ts (96%) rename ui/src/app/{ => metadata}/domain/service/provider-change-emitter.service.ts (100%) rename ui/src/app/{domain/service/metadata-resolver.service.spec.ts => metadata/domain/service/provider.service.spec.ts} (78%) rename ui/src/app/{domain/service/metadata-resolver.service.ts => metadata/domain/service/provider.service.ts} (89%) rename ui/src/app/{domain/service/entity-descriptor.service.spec.ts => metadata/domain/service/resolver.service.spec.ts} (66%) rename ui/src/app/{domain/service/entity-descriptor.service.ts => metadata/domain/service/resolver.service.ts} (55%) rename ui/src/app/{domain/action/filter-collection.action.ts => metadata/filter/action/collection.action.ts} (100%) create mode 100644 ui/src/app/metadata/filter/action/filter.action.spec.ts rename ui/src/app/{metadata-filter => metadata/filter}/action/filter.action.ts (50%) rename ui/src/app/{metadata-filter => metadata/filter}/action/search.action.spec.ts (100%) create mode 100644 ui/src/app/metadata/filter/action/search.action.ts rename ui/src/app/{metadata-filter => metadata/filter}/component/search-dialog.component.html (100%) rename ui/src/app/{metadata-filter => metadata/filter}/component/search-dialog.component.scss (100%) rename ui/src/app/{metadata-filter => metadata/filter}/component/search-dialog.component.spec.ts (82%) rename ui/src/app/{metadata-filter => metadata/filter}/component/search-dialog.component.ts (95%) rename ui/src/app/{metadata-filter => metadata/filter}/container/edit-filter.component.html (98%) rename ui/src/app/{metadata-filter => metadata/filter}/container/edit-filter.component.spec.ts (100%) rename ui/src/app/{metadata-filter => metadata/filter}/container/edit-filter.component.ts (91%) rename ui/src/app/{metadata-filter => metadata/filter}/container/filter.component.html (100%) rename ui/src/app/{metadata-filter => metadata/filter}/container/filter.component.scss (100%) rename ui/src/app/{metadata-filter => metadata/filter}/container/filter.component.spec.ts (100%) rename ui/src/app/{metadata-filter => metadata/filter}/container/filter.component.ts (78%) rename ui/src/app/{metadata-filter => metadata/filter}/container/new-filter.component.html (98%) rename ui/src/app/{metadata-filter => metadata/filter}/container/new-filter.component.spec.ts (81%) rename ui/src/app/{metadata-filter => metadata/filter}/container/new-filter.component.ts (95%) rename ui/src/app/{domain/effect/filter-collection.effect.spec.ts => metadata/filter/effect/collection.effect.spec.ts} (59%) rename ui/src/app/{domain/effect/filter-collection.effect.ts => metadata/filter/effect/collection.effect.ts} (89%) create mode 100644 ui/src/app/metadata/filter/effect/filter.effect.ts rename ui/src/app/{metadata-filter => metadata/filter}/effect/search.effect.ts (74%) rename ui/src/app/{metadata-filter => metadata/filter}/filter.module.ts (70%) rename ui/src/app/{domain => metadata/filter}/guard/filter-exists.guard.ts (90%) rename ui/src/app/{domain/reducer/filter-collection.reducer.spec.ts => metadata/filter/reducer/collection.reducer.spec.ts} (85%) rename ui/src/app/{domain/reducer/filter-collection.reducer.ts => metadata/filter/reducer/collection.reducer.ts} (69%) rename ui/src/app/{metadata-filter => metadata/filter}/reducer/filter.reducer.spec.ts (76%) rename ui/src/app/{metadata-filter => metadata/filter}/reducer/filter.reducer.ts (72%) rename ui/src/app/{metadata-filter => metadata/filter}/reducer/index.ts (56%) rename ui/src/app/{metadata-filter => metadata/filter}/reducer/search.reducer.spec.ts (61%) rename ui/src/app/{metadata-filter => metadata/filter}/reducer/search.reducer.ts (69%) rename ui/src/app/{dashboard/action/dashboard.action.ts => metadata/manager/action/manager.action.ts} (100%) rename ui/src/app/{dashboard => metadata/manager}/action/search.action.ts (73%) rename ui/src/app/{dashboard => metadata/manager}/component/delete-dialog.component.html (100%) rename ui/src/app/{dashboard => metadata/manager}/component/delete-dialog.component.ts (100%) rename ui/src/app/{dashboard => metadata/manager}/component/entity-item.component.html (67%) rename ui/src/app/{dashboard => metadata/manager}/component/entity-item.component.scss (90%) rename ui/src/app/{dashboard => metadata/manager}/component/entity-item.component.spec.ts (75%) rename ui/src/app/{dashboard => metadata/manager}/component/entity-item.component.ts (82%) rename ui/src/app/{dashboard => metadata/manager}/component/provider-search.component.html (79%) rename ui/src/app/{dashboard => metadata/manager}/component/provider-search.component.ts (100%) create mode 100644 ui/src/app/metadata/manager/container/manager.component.html rename ui/src/app/{dashboard/container/dashboard.component.scss => metadata/manager/container/manager.component.scss} (100%) rename ui/src/app/{dashboard/container/dashboard.component.spec.ts => metadata/manager/container/manager.component.spec.ts} (71%) rename ui/src/app/{dashboard/container/dashboard.component.ts => metadata/manager/container/manager.component.ts} (63%) rename ui/src/app/{dashboard => metadata/manager}/effect/search.effects.ts (59%) rename ui/src/app/{dashboard/dashboard.module.ts => metadata/manager/manager.module.ts} (68%) rename ui/src/app/{dashboard => metadata/manager}/reducer/index.ts (74%) rename ui/src/app/{dashboard/reducer/dashboard.reducer.spec.ts => metadata/manager/reducer/manager.reducer.spec.ts} (67%) create mode 100644 ui/src/app/metadata/manager/reducer/manager.reducer.ts rename ui/src/app/{dashboard => metadata/manager}/reducer/search.reducer.ts (83%) rename ui/src/app/{edit-provider/container/draft.component.html => metadata/metadata.component.html} (100%) create mode 100644 ui/src/app/metadata/metadata.component.spec.ts create mode 100644 ui/src/app/metadata/metadata.component.ts create mode 100644 ui/src/app/metadata/metadata.module.ts create mode 100644 ui/src/app/metadata/metadata.routing.ts create mode 100644 ui/src/app/metadata/provider/provider.module.ts create mode 100644 ui/src/app/metadata/resolver/action/collection.action.ts create mode 100644 ui/src/app/metadata/resolver/action/copy.action.ts rename ui/src/app/{domain/action/draft-collection.action.ts => metadata/resolver/action/draft.action.ts} (58%) rename ui/src/app/{edit-provider => metadata/resolver}/action/editor.action.ts (84%) rename ui/src/app/{metadata-provider => metadata/resolver}/action/search.action.ts (72%) rename ui/src/app/{edit-provider => metadata/resolver}/component/unsaved-dialog.component.html (100%) rename ui/src/app/{edit-provider => metadata/resolver}/component/unsaved-dialog.component.ts (65%) rename ui/src/app/{edit-provider => metadata/resolver}/component/wizard-nav.component.html (100%) rename ui/src/app/{edit-provider => metadata/resolver}/component/wizard-nav.component.spec.ts (87%) rename ui/src/app/{edit-provider => metadata/resolver}/component/wizard-nav.component.ts (99%) rename ui/src/app/{metadata-provider/container/blank-provider.component.html => metadata/resolver/container/blank-resolver.component.html} (91%) rename ui/src/app/{metadata-provider/container/blank-provider.component.spec.ts => metadata/resolver/container/blank-resolver.component.spec.ts} (57%) rename ui/src/app/{metadata-provider/container/blank-provider.component.ts => metadata/resolver/container/blank-resolver.component.ts} (50%) rename ui/src/app/{metadata-provider => metadata/resolver}/container/confirm-copy.component.html (94%) rename ui/src/app/{metadata-provider => metadata/resolver}/container/confirm-copy.component.scss (100%) rename ui/src/app/{metadata-provider => metadata/resolver}/container/confirm-copy.component.spec.ts (100%) rename ui/src/app/{metadata-provider => metadata/resolver}/container/confirm-copy.component.ts (61%) rename ui/src/app/{metadata-provider/container/copy-provider.component.html => metadata/resolver/container/copy-resolver.component.html} (97%) rename ui/src/app/{metadata-provider/container/copy-provider.component.spec.ts => metadata/resolver/container/copy-resolver.component.spec.ts} (65%) rename ui/src/app/{metadata-provider/container/copy-provider.component.ts => metadata/resolver/container/copy-resolver.component.ts} (76%) rename ui/src/app/{edit-provider/container/provider.component.html => metadata/resolver/container/draft.component.html} (100%) rename ui/src/app/{edit-provider => metadata/resolver}/container/draft.component.ts (70%) rename ui/src/app/{edit-provider => metadata/resolver}/container/editor.component.html (86%) rename ui/src/app/{edit-provider => metadata/resolver}/container/editor.component.ts (73%) rename ui/src/app/{metadata-provider/container/new-provider.component.html => metadata/resolver/container/new-resolver.component.html} (93%) rename ui/src/app/{metadata-provider/container/new-provider.component.scss => metadata/resolver/container/new-resolver.component.scss} (57%) create mode 100644 ui/src/app/metadata/resolver/container/new-resolver.component.spec.ts create mode 100644 ui/src/app/metadata/resolver/container/new-resolver.component.ts create mode 100644 ui/src/app/metadata/resolver/container/resolver.component.html rename ui/src/app/{edit-provider/container/provider.component.scss => metadata/resolver/container/resolver.component.scss} (100%) rename ui/src/app/{edit-provider/container/provider.component.spec.ts => metadata/resolver/container/resolver.component.spec.ts} (73%) create mode 100644 ui/src/app/metadata/resolver/container/resolver.component.ts rename ui/src/app/{metadata-provider/container/upload-provider.component.html => metadata/resolver/container/upload-resolver.component.html} (86%) rename ui/src/app/{metadata-provider/container/upload-provider.component.spec.ts => metadata/resolver/container/upload-resolver.component.spec.ts} (83%) rename ui/src/app/{metadata-provider/container/upload-provider.component.ts => metadata/resolver/container/upload-resolver.component.ts} (73%) rename ui/src/app/{edit-provider => metadata/resolver}/container/wizard.component.html (59%) rename ui/src/app/{edit-provider => metadata/resolver}/container/wizard.component.scss (100%) rename ui/src/app/{edit-provider => metadata/resolver}/container/wizard.component.ts (82%) rename ui/src/app/{edit-provider => metadata/resolver}/editor-definition.const.ts (56%) create mode 100644 ui/src/app/metadata/resolver/effect/collection.effect.spec.ts create mode 100644 ui/src/app/metadata/resolver/effect/collection.effects.ts rename ui/src/app/{metadata-provider => metadata/resolver}/effect/copy.effect.ts (54%) rename ui/src/app/{domain => metadata/resolver}/effect/draft-collection.effect.spec.ts (60%) rename ui/src/app/{domain => metadata/resolver}/effect/draft-collection.effects.ts (69%) create mode 100644 ui/src/app/metadata/resolver/effect/editor.effect.ts rename ui/src/app/{metadata-provider => metadata/resolver}/effect/search.effect.ts (71%) rename ui/src/app/{edit-provider => metadata/resolver}/effect/wizard.effect.ts (54%) rename ui/src/app/{metadata-provider => metadata/resolver}/guard/copy-isset.guard.ts (100%) rename ui/src/app/{domain/reducer/provider-collection.reducer.spec.ts => metadata/resolver/reducer/collection.reducer.spec.ts} (55%) create mode 100644 ui/src/app/metadata/resolver/reducer/collection.reducer.ts rename ui/src/app/{metadata-provider => metadata/resolver}/reducer/copy.reducer.spec.ts (53%) rename ui/src/app/{metadata-provider => metadata/resolver}/reducer/copy.reducer.ts (68%) rename ui/src/app/{domain/reducer/draft-collection.reducer.spec.ts => metadata/resolver/reducer/draft.reducer.spec.ts} (89%) create mode 100644 ui/src/app/metadata/resolver/reducer/draft.reducer.ts rename ui/src/app/{edit-provider => metadata/resolver}/reducer/editor.reducer.spec.ts (86%) rename ui/src/app/{edit-provider => metadata/resolver}/reducer/editor.reducer.ts (73%) create mode 100644 ui/src/app/metadata/resolver/reducer/index.ts rename ui/src/app/{metadata-provider => metadata/resolver}/reducer/search.reducer.spec.ts (92%) rename ui/src/app/{metadata-provider => metadata/resolver}/reducer/search.reducer.ts (86%) create mode 100644 ui/src/app/metadata/resolver/resolver.module.ts delete mode 100644 ui/src/app/routing.module.ts rename ui/src/app/{domain => shared}/component/i18n-text.component.html (100%) rename ui/src/app/{domain => shared}/component/i18n-text.component.ts (100%) rename ui/src/app/{edit-provider => shared}/component/valid-form-icon.component.html (100%) rename ui/src/app/{edit-provider => shared}/component/valid-form-icon.component.ts (74%) rename ui/src/app/{metadata-provider => shared}/directive/info-label.directive.spec.ts (100%) rename ui/src/app/{metadata-provider => shared}/directive/info-label.directive.ts (100%) rename ui/src/app/{metadata-provider => shared}/directive/input-defaults.directive.spec.ts (100%) rename ui/src/app/{metadata-provider => shared}/directive/input-defaults.directive.ts (100%) create mode 100644 ui/src/app/shared/pipe/highlight.pipe.spec.ts create mode 100644 ui/src/app/shared/pipe/pretty-xml.pipe.spec.ts rename ui/src/app/{metadata-provider => shared}/pipe/pretty-xml.pipe.ts (100%) delete mode 100644 ui/src/app/shared/preview/preview-dialog.component.ts delete mode 100644 ui/src/app/shared/preview/preview-dialog.module.ts create mode 100644 ui/src/testing/resolver.stub.ts diff --git a/ui/src/app/app.component.html b/ui/src/app/app.component.html index 7ee5acda8..364388566 100644 --- a/ui/src/app/app.component.html +++ b/ui/src/app/app.component.html @@ -4,7 +4,7 @@ Shibboleth Logo - Click to be directed to www.shibboleth.net Shibboleth - Metadata Source Management + Source Management
- +   - Filter + Metadata Source - +   - Metadata Source + Metadata Provider
  • diff --git a/ui/src/app/app.component.spec.ts b/ui/src/app/app.component.spec.ts index 62dabd575..2c78a42c4 100644 --- a/ui/src/app/app.component.spec.ts +++ b/ui/src/app/app.component.spec.ts @@ -54,7 +54,7 @@ describe('AppComponent', () => { it('should create the app', async(() => { expect(app).toBeTruthy(); - expect(store.dispatch).toHaveBeenCalledTimes(4); + expect(store.dispatch).toHaveBeenCalledTimes(1); })); it(`should have as title 'Shib-UI'`, async(() => { diff --git a/ui/src/app/app.component.ts b/ui/src/app/app.component.ts index 6a2702749..f3e44f399 100644 --- a/ui/src/app/app.component.ts +++ b/ui/src/app/app.component.ts @@ -6,10 +6,7 @@ import { Store } from '@ngrx/store'; import * as fromRoot from './core/reducer'; import { VersionInfo } from './core/model/version'; -import { LoadProviderRequest } from './domain/action/provider-collection.action'; -import { LoadDraftRequest } from './domain/action/draft-collection.action'; import { VersionInfoLoadRequestAction } from './core/action/version.action'; -import { LoadFilterRequest } from './domain/action/filter-collection.action'; @Component({ selector: 'app-root', templateUrl: './app.component.html', @@ -30,9 +27,6 @@ export class AppComponent implements OnInit { } ngOnInit(): void { - this.store.dispatch(new LoadProviderRequest()); - this.store.dispatch(new LoadFilterRequest()); - this.store.dispatch(new LoadDraftRequest()); this.store.dispatch(new VersionInfoLoadRequestAction()); } } diff --git a/ui/src/app/app.module.ts b/ui/src/app/app.module.ts index 15c94ea59..85dd2dcf9 100644 --- a/ui/src/app/app.module.ts +++ b/ui/src/app/app.module.ts @@ -7,24 +7,19 @@ import { HTTP_INTERCEPTORS, HttpClientModule } from '@angular/common/http'; import { NgbDropdownModule, NgbModalModule, NgbPopoverModule, NgbPaginationModule } from '@ng-bootstrap/ng-bootstrap'; -import { AppRoutingModule } from './routing.module'; +import { AppRoutingModule } from './app.routing'; import { AppComponent } from './app.component'; import { CoreModule } from './core/core.module'; -import { DomainModule } from './domain/domain.module'; -import { MetadataProviderModule } from './metadata-provider/metadata-provider.module'; import { reducers, metaReducers } from './app.reducer'; import { CustomRouterStateSerializer } from './shared/util'; - -import { CachingInterceptor } from './core/service/cache.interceptor'; import { AuthorizedInterceptor } from './core/service/authorized.interceptor'; import { NotificationModule } from './notification/notification.module'; import { ErrorInterceptor } from './core/service/error.interceptor'; import { NavigatorService } from './core/service/navigator.service'; - -import { environment } from '../environments/environment'; import { ContentionModule } from './contention/contention.module'; +import { SharedModule } from './shared/shared.module'; @NgModule({ declarations: [ @@ -36,27 +31,21 @@ import { ContentionModule } from './contention/contention.module'; }), EffectsModule.forRoot([]), BrowserModule, - AppRoutingModule, CoreModule.forRoot(), - MetadataProviderModule.forRoot(), - DomainModule.forRoot(), StoreRouterConnectingModule, NgbDropdownModule.forRoot(), NgbModalModule.forRoot(), NgbPopoverModule.forRoot(), NgbPaginationModule.forRoot(), NotificationModule, + HttpClientModule, ContentionModule, - HttpClientModule + SharedModule, + AppRoutingModule ], providers: [ NavigatorService, { provide: RouterStateSerializer, useClass: CustomRouterStateSerializer }, - /*{ - provide: HTTP_INTERCEPTORS, - useClass: CachingInterceptor, - multi: true - },*/ { provide: HTTP_INTERCEPTORS, useClass: AuthorizedInterceptor, diff --git a/ui/src/app/app.reducer.ts b/ui/src/app/app.reducer.ts index bd5aa2946..5808ccf22 100644 --- a/ui/src/app/app.reducer.ts +++ b/ui/src/app/app.reducer.ts @@ -1,5 +1,4 @@ -import { ActionReducerMap, MetaReducer, ActionReducer } from '@ngrx/store'; -import { routerReducer, RouterReducerState } from '@ngrx/router-store'; +import { ActionReducerMap, MetaReducer } from '@ngrx/store'; import * as fromRouter from '@ngrx/router-store'; import { RouterStateUrl } from './shared/util'; diff --git a/ui/src/app/app.routing.ts b/ui/src/app/app.routing.ts new file mode 100644 index 000000000..3de190469 --- /dev/null +++ b/ui/src/app/app.routing.ts @@ -0,0 +1,16 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; + +const routes: Routes = [ + { path: '', redirectTo: 'metadata', pathMatch: 'full' }, + { + path: 'metadata', + loadChildren: './metadata/metadata.module#MetadataModule' + } +]; + +@NgModule({ + imports: [RouterModule.forRoot(routes)], + exports: [RouterModule] +}) +export class AppRoutingModule { } diff --git a/ui/src/app/contention/action/contention.action.ts b/ui/src/app/contention/action/contention.action.ts index bcf216008..0976c9c2d 100644 --- a/ui/src/app/contention/action/contention.action.ts +++ b/ui/src/app/contention/action/contention.action.ts @@ -1,7 +1,5 @@ import { Action } from '@ngrx/store'; import { Contention, ContentionResolution } from '../model/contention'; -import { MetadataEntity } from '../../domain/domain.type'; - export enum ContentionActionTypes { SHOW_CONTENTION = '[Contention] Show Contention', diff --git a/ui/src/app/contention/component/change-item.component.ts b/ui/src/app/contention/component/change-item.component.ts index c2cf99a7f..31e565286 100644 --- a/ui/src/app/contention/component/change-item.component.ts +++ b/ui/src/app/contention/component/change-item.component.ts @@ -1,15 +1,5 @@ -import { Component, OnInit, Input, OnChanges } from '@angular/core'; -import { FormGroup, Validators, FormBuilder } from '@angular/forms'; -import { Observable, of } from 'rxjs'; -import { map, withLatestFrom } from 'rxjs/operators'; -import { Router } from '@angular/router'; -import { Store } from '@ngrx/store'; -import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; - -import * as fromContention from '../reducer'; -import { ResolveContentionAction } from '../action/contention.action'; +import { Component, Input, OnChanges } from '@angular/core'; import { ChangeItem } from '../model/contention'; -import { DifferentialService } from '../../core/service/differential.service'; export enum ValueTypes { array = 'array', diff --git a/ui/src/app/contention/component/contention-dialog.component.ts b/ui/src/app/contention/component/contention-dialog.component.ts index f9108d64c..1f3070081 100644 --- a/ui/src/app/contention/component/contention-dialog.component.ts +++ b/ui/src/app/contention/component/contention-dialog.component.ts @@ -1,13 +1,9 @@ -import { Component, OnInit, Input, OnChanges } from '@angular/core'; -import { FormGroup, Validators, FormBuilder } from '@angular/forms'; -import { Observable, of } from 'rxjs'; -import { map, withLatestFrom } from 'rxjs/operators'; -import { Router } from '@angular/router'; +import { Component } from '@angular/core'; +import { Observable } from 'rxjs'; import { Store } from '@ngrx/store'; import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; import * as fromContention from '../reducer'; -import { ResolveContentionAction } from '../action/contention.action'; import { Contention, ChangeItem } from '../model/contention'; @Component({ diff --git a/ui/src/app/contention/contention.module.ts b/ui/src/app/contention/contention.module.ts index 670c8eac8..4ce48c3c3 100644 --- a/ui/src/app/contention/contention.module.ts +++ b/ui/src/app/contention/contention.module.ts @@ -1,16 +1,14 @@ import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; -import { RouterModule } from '@angular/router'; import { StoreModule } from '@ngrx/store'; import { EffectsModule } from '@ngrx/effects'; -import { HttpClientModule } from '@angular/common/http'; import { reducers } from './reducer'; import { ContentionEffects } from './effect/contention.effect'; import { ContentionDialogComponent } from './component/contention-dialog.component'; import { ChangeItemComponent } from './component/change-item.component'; -import { DomainModule } from '../domain/domain.module'; import { ContentionService } from './service/contention.service'; +import { SharedModule } from '../shared/shared.module'; export const COMPONENTS = [ ContentionDialogComponent, @@ -20,7 +18,7 @@ export const COMPONENTS = [ @NgModule({ imports: [ CommonModule, - DomainModule, + SharedModule, StoreModule.forFeature('contention', reducers), EffectsModule.forFeature([ContentionEffects]) ], diff --git a/ui/src/app/contention/effect/contention.effect.ts b/ui/src/app/contention/effect/contention.effect.ts index b034bb8d3..aa89ffbd1 100644 --- a/ui/src/app/contention/effect/contention.effect.ts +++ b/ui/src/app/contention/effect/contention.effect.ts @@ -1,7 +1,5 @@ import { Injectable } from '@angular/core'; import { Effect, Actions, ofType } from '@ngrx/effects'; -import { Location } from '@angular/common'; - import { of } from 'rxjs'; import { map, tap, catchError, switchMap } from 'rxjs/operators'; @@ -9,7 +7,6 @@ import { ShowContentionAction, ResolveContentionAction, ContentionActionTypes, - ContentionActionUnion, CancelContentionAction } from '../action/contention.action'; import { ModalService, DEFAULT_MODAL_OPTIONS } from '../../core/service/modal.service'; diff --git a/ui/src/app/contention/reducer/contention.reducer.ts b/ui/src/app/contention/reducer/contention.reducer.ts index 2b940a976..d5432a93d 100644 --- a/ui/src/app/contention/reducer/contention.reducer.ts +++ b/ui/src/app/contention/reducer/contention.reducer.ts @@ -1,6 +1,5 @@ import { ContentionActionTypes, ContentionActionUnion } from '../action/contention.action'; import { Contention } from '../model/contention'; -import { MetadataEntity } from '../../domain/domain.type'; export interface State { contention: Contention; diff --git a/ui/src/app/core/service/differential.service.ts b/ui/src/app/core/service/differential.service.ts index b4e432126..f4ecdf0c1 100644 --- a/ui/src/app/core/service/differential.service.ts +++ b/ui/src/app/core/service/differential.service.ts @@ -20,7 +20,6 @@ export class DifferentialService { return lib.updatedDiff(originalObj, updatedObj); } detailedDiff(originalObj, updatedObj) { // returns an object with the added, deleted and updated differences - console.log(originalObj, updatedObj); return lib.detailedDiff(originalObj, updatedObj); } } diff --git a/ui/src/app/dashboard/container/dashboard.component.html b/ui/src/app/dashboard/container/dashboard.component.html deleted file mode 100644 index 02f379165..000000000 --- a/ui/src/app/dashboard/container/dashboard.component.html +++ /dev/null @@ -1,70 +0,0 @@ -
    -
    -
    -
    -
    - Current Metadata Sources -
    -
    -
    - -
    - -
    -
    -
    -
    - - -
    -
    -
    -
    -
      -
    • - - -
    • -
    -
    - - -
    -
    -
    -
    diff --git a/ui/src/app/dashboard/reducer/dashboard.reducer.ts b/ui/src/app/dashboard/reducer/dashboard.reducer.ts deleted file mode 100644 index a71c8b812..000000000 --- a/ui/src/app/dashboard/reducer/dashboard.reducer.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { createSelector, createFeatureSelector } from '@ngrx/store'; -import { MetadataProvider } from '../../domain/model/metadata-provider'; -import * as dashboard from '../action/dashboard.action'; -import * as fromRoot from '../../core/reducer'; - -export interface State { - providersOpen: {[key: string]: boolean}; -} - -export const initialState: State = { - providersOpen: {} -}; - -export function reducer(state = initialState, action: dashboard.Actions): State { - switch (action.type) { - case dashboard.TOGGLE_ENTITY_DISPLAY: { - return Object.assign({}, state, { - providersOpen: { - ...state.providersOpen, - ...{[action.payload]: !state.providersOpen[action.payload]} - } - }); - } - default: { - // console.log(state); - return state; - } - } -} - -export const providersOpen = (state: State) => state.providersOpen; diff --git a/ui/src/app/domain/action/provider-collection.action.ts b/ui/src/app/domain/action/provider-collection.action.ts deleted file mode 100644 index 0d890aad4..000000000 --- a/ui/src/app/domain/action/provider-collection.action.ts +++ /dev/null @@ -1,147 +0,0 @@ -import { Action } from '@ngrx/store'; -import { MetadataProvider } from '../model/metadata-provider'; -import { Update } from '@ngrx/entity'; - -export enum ProviderCollectionActionTypes { - FIND = '[Metadata Provider] Find', - SELECT = '[Metadata Provider] Select', - SELECT_SUCCESS = '[Metadata Provider] Select Success', - - UPDATE_PROVIDER_REQUEST = '[Metadata Provider] Update Request', - UPDATE_PROVIDER_SUCCESS = '[Metadata Provider] Update Success', - UPDATE_PROVIDER_FAIL = '[Metadata Provider] Update Fail', - - LOAD_PROVIDER_REQUEST = '[Metadata Provider Collection] Provider REQUEST', - LOAD_PROVIDER_SUCCESS = '[Metadata Provider Collection] Provider SUCCESS', - LOAD_PROVIDER_ERROR = '[Metadata Provider Collection] Provider ERROR', - ADD_PROVIDER = '[Metadata Provider Collection] Add Provider', - ADD_PROVIDER_SUCCESS = '[Metadata Provider Collection] Add Provider Success', - ADD_PROVIDER_FAIL = '[Metadata Provider Collection] Add Provider Fail', - REMOVE_PROVIDER = '[Metadata Provider Collection] Remove Provider', - REMOVE_PROVIDER_SUCCESS = '[Metadata Provider Collection] Remove Provider Success', - REMOVE_PROVIDER_FAIL = '[Metadata Provider Collection] Remove Provider Fail', - - UPLOAD_PROVIDER_REQUEST = '[Metadata Provider Collection] Upload Provider Request', - CREATE_PROVIDER_FROM_URL_REQUEST = '[Metadata Provider Collection] Create Provider From URL Request', -} - -export class FindProvider implements Action { - readonly type = ProviderCollectionActionTypes.FIND; - - constructor(public payload: string) { } -} - -export class SelectProvider implements Action { - readonly type = ProviderCollectionActionTypes.SELECT; - - constructor(public payload: string) { } -} - -export class SelectProviderSuccess implements Action { - readonly type = ProviderCollectionActionTypes.SELECT_SUCCESS; - - constructor(public payload: MetadataProvider) { } -} - -export class LoadProviderRequest implements Action { - readonly type = ProviderCollectionActionTypes.LOAD_PROVIDER_REQUEST; - - constructor() { } -} - -export class LoadProviderSuccess implements Action { - readonly type = ProviderCollectionActionTypes.LOAD_PROVIDER_SUCCESS; - - constructor(public payload: MetadataProvider[]) { } -} - -export class LoadProviderError implements Action { - readonly type = ProviderCollectionActionTypes.LOAD_PROVIDER_ERROR; - - constructor(public payload: any) { } -} - -export class UpdateProviderRequest implements Action { - readonly type = ProviderCollectionActionTypes.UPDATE_PROVIDER_REQUEST; - - constructor(public payload: MetadataProvider) { } -} - -export class UpdateProviderSuccess implements Action { - readonly type = ProviderCollectionActionTypes.UPDATE_PROVIDER_SUCCESS; - - constructor(public payload: Update) { } -} - -export class UpdateProviderFail implements Action { - readonly type = ProviderCollectionActionTypes.UPDATE_PROVIDER_FAIL; - - constructor(public payload: MetadataProvider) { } -} - -export class AddProviderRequest implements Action { - readonly type = ProviderCollectionActionTypes.ADD_PROVIDER; - - constructor(public payload: MetadataProvider) { } -} - -export class AddProviderSuccess implements Action { - readonly type = ProviderCollectionActionTypes.ADD_PROVIDER_SUCCESS; - - constructor(public payload: MetadataProvider) { } -} - -export class AddProviderFail implements Action { - readonly type = ProviderCollectionActionTypes.ADD_PROVIDER_FAIL; - - constructor(public payload: any) { } -} - -export class RemoveProviderRequest implements Action { - readonly type = ProviderCollectionActionTypes.REMOVE_PROVIDER; - - constructor(public payload: MetadataProvider) { } -} - -export class RemoveProviderSuccess implements Action { - readonly type = ProviderCollectionActionTypes.REMOVE_PROVIDER_SUCCESS; - - constructor(public payload: MetadataProvider) { } -} - -export class RemoveProviderFail implements Action { - readonly type = ProviderCollectionActionTypes.REMOVE_PROVIDER_FAIL; - - constructor(public payload: MetadataProvider) { } -} - -export class UploadProviderRequest implements Action { - readonly type = ProviderCollectionActionTypes.UPLOAD_PROVIDER_REQUEST; - - constructor(public payload: { name: string, body: string }) { } -} - -export class CreateProviderFromUrlRequest implements Action { - readonly type = ProviderCollectionActionTypes.CREATE_PROVIDER_FROM_URL_REQUEST; - - constructor(public payload: { name: string, url: string }) { } -} - -export type ProviderCollectionActionsUnion = - | LoadProviderRequest - | LoadProviderSuccess - | LoadProviderError - | AddProviderRequest - | AddProviderSuccess - | AddProviderFail - | RemoveProviderRequest - | RemoveProviderSuccess - | RemoveProviderFail - | FindProvider - | SelectProvider - | SelectProviderSuccess - | UpdateProviderRequest - | UpdateProviderSuccess - | UpdateProviderFail - | UploadProviderRequest - | CreateProviderFromUrlRequest; diff --git a/ui/src/app/domain/domain.type.ts b/ui/src/app/domain/domain.type.ts deleted file mode 100644 index d9bd86cfa..000000000 --- a/ui/src/app/domain/domain.type.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { MetadataFilter } from './model/metadata-filter'; -import { MetadataProvider } from './model/metadata-provider'; - -export * from './model/metadata-provider'; -export * from './model/metadata-filter'; - -export enum DomainEntityKinds { - filter = 'filter', - provider = 'provider' -} - -export type MetadataEntity = - | MetadataFilter - | MetadataProvider; diff --git a/ui/src/app/domain/effect/provider-collection.effect.spec.ts b/ui/src/app/domain/effect/provider-collection.effect.spec.ts deleted file mode 100644 index e0ab36ae1..000000000 --- a/ui/src/app/domain/effect/provider-collection.effect.spec.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { TestBed, tick, fakeAsync } from '@angular/core/testing'; -import { Actions } from '@ngrx/effects'; -import { cold, getTestScheduler, hot } from 'jasmine-marbles'; -import { empty, Observable, of } from 'rxjs'; - -import { TestActions, getActions } from '../../../testing/effect.util'; -import { MetadataProvider } from '../domain.type'; -import { ProviderCollectionEffects } from './provider-collection.effects'; -import { EntityDescriptorService } from '../service/entity-descriptor.service'; -import { Router } from '@angular/router'; -import { RouterStub } from '../../../testing/router.stub'; - -describe('Provider Collection Effects', () => { - let effects: ProviderCollectionEffects; - let draftService: any; - let actions$: TestActions; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [ - ProviderCollectionEffects, - { - provide: EntityDescriptorService, - useValue: { - query: () => { }, - find: (id: string) => { }, - save: (e: MetadataProvider) => { }, - update: (e: MetadataProvider) => { }, - remove: (e: MetadataProvider) => { }, - preview: (e: MetadataProvider) => { }, - upload: (name: string, xml: string) => { }, - createFromUrl: (name: string, url: string) => { } - }, - }, - { provide: Actions, useFactory: getActions }, - { provide: Router, useClass: RouterStub } - ], - }); - - effects = TestBed.get(ProviderCollectionEffects); - draftService = TestBed.get(EntityDescriptorService); - actions$ = TestBed.get(Actions); - }); -}); diff --git a/ui/src/app/domain/effect/provider-collection.effects.ts b/ui/src/app/domain/effect/provider-collection.effects.ts deleted file mode 100644 index b402318f9..000000000 --- a/ui/src/app/domain/effect/provider-collection.effects.ts +++ /dev/null @@ -1,150 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Effect, Actions, ofType } from '@ngrx/effects'; -import { Action } from '@ngrx/store'; -import { Router } from '@angular/router'; - -import { Observable, of } from 'rxjs'; -import { map, catchError, switchMap, tap } from 'rxjs/operators'; - -import * as providerActions from '../action/provider-collection.action'; -import * as draftActions from '../action/draft-collection.action'; -import { ProviderCollectionActionsUnion, ProviderCollectionActionTypes } from '../action/provider-collection.action'; -import { MetadataProvider } from '../../domain/model/metadata-provider'; -import { EntityDescriptorService } from '../../domain/service/entity-descriptor.service'; -import { removeNulls } from '../../shared/util'; - -/* istanbul ignore next */ -@Injectable() -export class ProviderCollectionEffects { - - @Effect() - loadProviders$ = this.actions$.pipe( - ofType(ProviderCollectionActionTypes.LOAD_PROVIDER_REQUEST), - switchMap(() => - this.descriptorService - .query() - .pipe( - map(descriptors => new providerActions.LoadProviderSuccess(descriptors)), - catchError(error => of(new providerActions.LoadProviderError(error))) - ) - ) - ); - - @Effect() - updateProvider$ = this.actions$.pipe( - ofType(ProviderCollectionActionTypes.UPDATE_PROVIDER_REQUEST), - map(action => action.payload), - switchMap(provider => { - delete provider.modifiedDate; - delete provider.createdDate; - return this.descriptorService - .update(provider) - .pipe( - map(p => new providerActions.UpdateProviderSuccess({ - id: p.id, - changes: p - })), - catchError(err => of(new providerActions.UpdateProviderFail(provider))) - ); - }) - ); - - @Effect({ dispatch: false }) - updateProviderSuccessRedirect$ = this.actions$.pipe( - ofType(ProviderCollectionActionTypes.UPDATE_PROVIDER_SUCCESS), - map(action => action.payload), - tap(provider => this.router.navigate(['/dashboard'])) - ); - - @Effect() - updateProviderSuccessReload$ = this.actions$.pipe( - ofType(ProviderCollectionActionTypes.UPDATE_PROVIDER_SUCCESS), - map(action => action.payload), - map(provider => new providerActions.LoadProviderRequest()) - ); - - @Effect() - selectProvider$ = this.actions$.pipe( - ofType(ProviderCollectionActionTypes.SELECT), - map(action => action.payload), - switchMap(id => - this.descriptorService - .find(id) - .pipe( - map(p => new providerActions.SelectProviderSuccess(p)) - ) - ) - ); - - @Effect() - addProviderRequest$ = this.actions$.pipe( - ofType(ProviderCollectionActionTypes.ADD_PROVIDER), - map(action => action.payload), - map(provider => ({ - ...provider, - relyingPartyOverrides: removeNulls(provider.relyingPartyOverrides) - })), - switchMap(provider => - this.descriptorService - .save(provider) - .pipe( - map(p => new providerActions.AddProviderSuccess(p)), - catchError(() => of(new providerActions.AddProviderFail(provider))) - ) - ) - ); - - @Effect({ dispatch: false }) - addProviderSuccessRedirect$ = this.actions$.pipe( - ofType(ProviderCollectionActionTypes.ADD_PROVIDER_SUCCESS), - map(action => action.payload), - tap(provider => this.router.navigate(['/dashboard'])) - ); - @Effect() - addProviderSuccessReload$ = this.actions$.pipe( - ofType(ProviderCollectionActionTypes.ADD_PROVIDER_SUCCESS), - map(action => action.payload), - map(provider => new providerActions.LoadProviderRequest()) - ); - - @Effect() - addProviderSuccessRemoveDraft$ = this.actions$.pipe( - ofType(ProviderCollectionActionTypes.ADD_PROVIDER_SUCCESS), - map(action => action.payload), - map(provider => new draftActions.RemoveDraftRequest(provider)) - ); - - @Effect() - uploadProviderRequest$ = this.actions$.pipe( - ofType(ProviderCollectionActionTypes.UPLOAD_PROVIDER_REQUEST), - map(action => action.payload), - switchMap(file => - this.descriptorService - .upload(file.name, file.body) - .pipe( - map(p => new providerActions.AddProviderSuccess(p)), - catchError(() => of(new providerActions.AddProviderFail(file))) - ) - ) - ); - - @Effect() - createProviderFromUrlRequest$ = this.actions$.pipe( - ofType(ProviderCollectionActionTypes.CREATE_PROVIDER_FROM_URL_REQUEST), - map(action => action.payload), - switchMap(file => - this.descriptorService - .createFromUrl(file.name, file.url) - .pipe( - map(p => new providerActions.AddProviderSuccess(p)), - catchError(() => of(new providerActions.AddProviderFail(file))) - ) - ) - ); - - constructor( - private descriptorService: EntityDescriptorService, - private actions$: Actions, - private router: Router - ) { } -} /* istanbul ignore next */ diff --git a/ui/src/app/domain/model/metadata-provider.ts b/ui/src/app/domain/model/metadata-provider.ts deleted file mode 100644 index c01b9ce3a..000000000 --- a/ui/src/app/domain/model/metadata-provider.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { Organization } from './organization'; -import { MDUI } from './mdui'; -import { Contact } from './contact'; -import { SecurityInfo } from './security-info'; -import { SsoService } from './sso-service'; -import { LogoutEndpoint } from './logout-endpoint'; -import { IdpSsoDescriptor } from './sso-descriptor'; -import { RelyingPartyOverrides } from './relying-party-overrides'; -import { Certificate } from './certificate'; - -import { MetadataBase } from './metadata-base'; - -export interface MetadataProvider extends MetadataBase { - entityId: string; - serviceProviderName: string; - organization?: Organization; - contacts?: Contact[]; - mdui?: MDUI; - securityInfo?: SecurityInfo; - assertionConsumerServices?: SsoService[]; - serviceProviderSsoDescriptor?: IdpSsoDescriptor; - logoutEndpoints?: LogoutEndpoint[]; - serviceEnabled?: boolean; - relyingPartyOverrides: RelyingPartyOverrides; - attributeRelease: string[]; -} - -export * from './organization'; -export * from './mdui'; -export * from './contact'; -export * from './security-info'; -export * from './sso-service'; -export * from './logout-endpoint'; -export * from './sso-descriptor'; -export * from './relying-party-overrides'; -export * from './certificate'; diff --git a/ui/src/app/domain/reducer/draft-collection.reducer.ts b/ui/src/app/domain/reducer/draft-collection.reducer.ts deleted file mode 100644 index 0fea3ea3d..000000000 --- a/ui/src/app/domain/reducer/draft-collection.reducer.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { createSelector } from '@ngrx/store'; -import { EntityState, EntityAdapter, createEntityAdapter } from '@ngrx/entity'; - -import { MetadataProvider } from '../../domain/model/metadata-provider'; -import * as providerAction from '../action/provider-collection.action'; -import { DraftCollectionActionsUnion, DraftCollectionActionTypes } from '../action/draft-collection.action'; - -export interface DraftCollectionState extends EntityState { - selectedDraftId: string | null; -} - -export function sortByName(a: MetadataProvider, b: MetadataProvider): number { - return a.serviceProviderName.localeCompare(b.serviceProviderName); -} - -export const adapter: EntityAdapter = createEntityAdapter({ - sortComparer: sortByName, - selectId: (model: MetadataProvider) => model.entityId -}); - -export const initialState: DraftCollectionState = adapter.getInitialState({ - selectedDraftId: null, -}); - -export function reducer(state = initialState, action: DraftCollectionActionsUnion): DraftCollectionState { - switch (action.type) { - case DraftCollectionActionTypes.LOAD_DRAFT_SUCCESS: { - return adapter.addMany(action.payload, { - ...state, - selectedDraftId: state.selectedDraftId, - }); - } - - case DraftCollectionActionTypes.UPDATE_DRAFT_SUCCESS: { - return adapter.updateOne(action.payload, state); - } - - case DraftCollectionActionTypes.REMOVE_DRAFT_SUCCESS: { - return adapter.removeOne(action.payload.entityId, state); - } - - case DraftCollectionActionTypes.SELECT: { - return { - ...state, - selectedDraftId: action.payload, - }; - } - - default: { - return state; - } - } -} - -export const getSelectedDraftId = (state: DraftCollectionState) => state.selectedDraftId; -export const { - selectIds: selectDraftIds, - selectEntities: selectDraftEntities, - selectAll: selectAllDrafts, - selectTotal: selectDraftTotal -} = adapter.getSelectors(); diff --git a/ui/src/app/domain/reducer/index.ts b/ui/src/app/domain/reducer/index.ts deleted file mode 100644 index a6281c90b..000000000 --- a/ui/src/app/domain/reducer/index.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { createSelector, createFeatureSelector, ActionReducerMap } from '@ngrx/store'; -import * as fromFilter from './filter-collection.reducer'; -import * as fromProvider from './provider-collection.reducer'; -import * as fromDraft from './draft-collection.reducer'; -import * as fromRoot from '../../app.reducer'; - -export interface CollectionState { - filters: fromFilter.FilterCollectionState; - providers: fromProvider.ProviderCollectionState; - drafts: fromDraft.DraftCollectionState; -} - -export const reducers: ActionReducerMap = { - filters: fromFilter.reducer, - providers: fromProvider.reducer, - drafts: fromDraft.reducer -}; - -export interface State extends fromRoot.State { - 'collections': CollectionState; -} - -export const getCollectionState = createFeatureSelector('collections'); - -/* - * Select pieces of Collection State - Functions -*/ -export const getFiltersFromStateFn = (state: CollectionState) => state.filters; -export const getProvidersStateFn = (state: CollectionState) => state.providers; -export const getDraftsStateFn = (state: CollectionState) => state.drafts; - -export const getFilterEntityState = createSelector(getCollectionState, getFiltersFromStateFn); -export const getProviderEntityState = createSelector(getCollectionState, getProvidersStateFn); -export const getDraftEntityState = createSelector(getCollectionState, getDraftsStateFn); - -/* - * Utility functions -*/ - -export const combineAllFn = (d, p) => [...p, ...d]; -export const doesExistFn = (ids, selected) => ids.indexOf(selected) > -1; -export const getInCollectionFn = (entities, selectedId) => { - return selectedId && entities[selectedId]; -}; -export const getEntityIdsFn = list => list.map(entity => entity.entityId); - -/* - * Select pieces of Provider Collection -*/ - -export const getProviderEntities = createSelector(getProviderEntityState, fromProvider.selectProviderEntities); -export const getSelectedProviderId = createSelector(getProviderEntityState, fromProvider.getSelectedProviderId); -export const getSelectedProvider = createSelector(getProviderEntities, getSelectedProviderId, getInCollectionFn); -export const getProviderIds = createSelector(getProviderEntityState, fromProvider.selectProviderIds); -export const getProviderCollection = createSelector(getProviderEntityState, getProviderIds, fromProvider.selectAllProviders); - -/* - * Select pieces of Draft Collection -*/ - -export const getDraftEntities = createSelector(getDraftEntityState, fromDraft.selectDraftEntities); -export const getDraftIds = createSelector(getDraftEntityState, fromDraft.selectDraftIds); -export const getDraftCollection = createSelector(getDraftEntityState, getDraftIds, fromDraft.selectAllDrafts); - -export const getSelectedDraftId = createSelector(getDraftEntityState, fromDraft.getSelectedDraftId); -export const getSelectedDraft = createSelector(getDraftEntities, getSelectedDraftId, getInCollectionFn); -export const isSelectedProviderInCollection = createSelector(getProviderIds, getSelectedProviderId, doesExistFn); -export const isSelectedDraftInCollection = createSelector(getDraftIds, getSelectedDraftId, doesExistFn); - -/* - * Select pieces of Filter Collection -*/ - -export const getAllFilters = createSelector(getFilterEntityState, fromFilter.selectAllFilters); -export const getFilterEntities = createSelector(getFilterEntityState, fromFilter.selectFilterEntities); -export const getSelectedFilterId = createSelector(getFilterEntityState, fromFilter.getSelectedFilterId); -export const getSelectedFilter = createSelector(getFilterEntities, getSelectedFilterId, getInCollectionFn); -export const getFilterIds = createSelector(getFilterEntityState, fromFilter.selectFilterIds); -export const getFilterCollectionIsLoaded = createSelector(getFilterEntityState, fromFilter.getIsLoaded); - -/* - * Combine pieces of Collection State -*/ - -export const getAllProviders = createSelector(getDraftCollection, getProviderCollection, combineAllFn); -export const getAllProviderIds = createSelector(getDraftIds, getProviderIds, combineAllFn); - -export const getAllEntityIds = createSelector(getAllProviders, getEntityIdsFn); diff --git a/ui/src/app/domain/reducer/provider-collection.reducer.ts b/ui/src/app/domain/reducer/provider-collection.reducer.ts deleted file mode 100644 index 42a18c8c4..000000000 --- a/ui/src/app/domain/reducer/provider-collection.reducer.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { createSelector } from '@ngrx/store'; -import { EntityState, EntityAdapter, createEntityAdapter } from '@ngrx/entity'; - -import { MetadataProvider } from '../../domain/model/metadata-provider'; -import * as provider from '../action/provider-collection.action'; -import { ProviderCollectionActionsUnion, ProviderCollectionActionTypes } from '../action/provider-collection.action'; - -export interface ProviderCollectionState extends EntityState { - selectedProviderId: string | null; -} - -export function sortByDate(a: MetadataProvider, b: MetadataProvider): number { - return a.createdDate.localeCompare(b.createdDate); -} - -export const adapter: EntityAdapter = createEntityAdapter({ - sortComparer: sortByDate, - selectId: (model: MetadataProvider) => model.id -}); - -export const initialState: ProviderCollectionState = adapter.getInitialState({ - selectedProviderId: null -}); - -export function reducer(state = initialState, action: provider.ProviderCollectionActionsUnion): ProviderCollectionState { - switch (action.type) { - case ProviderCollectionActionTypes.LOAD_PROVIDER_SUCCESS: { - return adapter.addAll(action.payload, { - ...state, - selectedProviderId: state.selectedProviderId - }); - } - - case ProviderCollectionActionTypes.UPDATE_PROVIDER_SUCCESS: { - return adapter.updateOne(action.payload, state); - } - - case ProviderCollectionActionTypes.SELECT: { - return { - ...state, - selectedProviderId: action.payload, - }; - } - - default: { - return state; - } - } -} - -export const getSelectedProviderId = (state: ProviderCollectionState) => state.selectedProviderId; -export const { - selectIds: selectProviderIds, - selectEntities: selectProviderEntities, - selectAll: selectAllProviders, - selectTotal: selectProviderTotal -} = adapter.getSelectors(); diff --git a/ui/src/app/edit-provider/container/provider.component.ts b/ui/src/app/edit-provider/container/provider.component.ts deleted file mode 100644 index 0ca698a6b..000000000 --- a/ui/src/app/edit-provider/container/provider.component.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { Component, Output, Input, EventEmitter, OnDestroy, ChangeDetectionStrategy } from '@angular/core'; -import { FormBuilder, FormGroup, FormControl, Validators } from '@angular/forms'; -import { ActivatedRoute } from '@angular/router'; -import { Observable, Subscription } from 'rxjs'; -import { distinctUntilChanged, map } from 'rxjs/operators'; - -import { Store } from '@ngrx/store'; -import { NgbPopoverConfig } from '@ng-bootstrap/ng-bootstrap'; - -import { MetadataProvider } from '../../domain/model/metadata-provider'; -import { SelectProvider } from '../../domain/action/provider-collection.action'; -import * as fromProviders from '../../domain/reducer'; - -@Component({ - selector: 'provider-page', - templateUrl: './provider.component.html', - styleUrls: ['./provider.component.scss'], - providers: [NgbPopoverConfig] -}) -export class ProviderComponent implements OnDestroy { - actionsSubscription: Subscription; - - constructor( - store: Store, - route: ActivatedRoute - ) { - this.actionsSubscription = route.params.pipe( - distinctUntilChanged(), - map(params => new SelectProvider(params.id)) - ).subscribe(store); - } - - ngOnDestroy() { - this.actionsSubscription.unsubscribe(); - } -} /* istanbul ignore next */ diff --git a/ui/src/app/edit-provider/editor.module.ts b/ui/src/app/edit-provider/editor.module.ts deleted file mode 100644 index 8b2863fc0..000000000 --- a/ui/src/app/edit-provider/editor.module.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; -import { CommonModule } from '@angular/common'; -import { ReactiveFormsModule, FormsModule } from '@angular/forms'; -import { StoreModule } from '@ngrx/store'; -import { EffectsModule } from '@ngrx/effects'; - -import { ProviderComponent } from './container/provider.component'; -import { DraftComponent } from './container/draft.component'; -import { WizardComponent } from './container/wizard.component'; -import { EditorComponent } from './container/editor.component'; -import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; - -import { RootProviderModule } from '../metadata-provider/metadata-provider.module'; -import { ProviderEditorFormModule } from '../metadata-provider/component'; -import { reducers } from './reducer'; - -import { UnsavedDialogComponent } from './component/unsaved-dialog.component'; -import { CanDeactivateGuard } from '../core/service/can-deactivate.guard'; -import { WizardNavComponent } from './component/wizard-nav.component'; -import { WizardEffects } from './effect/wizard.effect'; -import { EditorEffects } from './effect/editor.effect'; -import { ValidFormIconComponent } from './component/valid-form-icon.component'; -import { SharedModule } from '../shared/shared.module'; -import { DomainModule } from '../domain/domain.module'; - -export const routes: Routes = [ - { - path: ':id', - component: ProviderComponent, - canActivate: [], - children: [ - { path: 'edit', redirectTo: 'edit/2' }, - { - path: 'edit/:index', - component: EditorComponent, - canDeactivate: [CanDeactivateGuard] - } - ] - }, - { - path: ':entityId', - component: DraftComponent, - canActivate: [], - children: [ - { path: 'wizard', redirectTo: 'wizard/2' }, - { - path: 'wizard/:index', - component: WizardComponent, - canDeactivate: [CanDeactivateGuard] - } - ] - } -]; - -@NgModule({ - declarations: [ - ProviderComponent, - EditorComponent, - WizardComponent, - UnsavedDialogComponent, - WizardNavComponent, - DraftComponent, - ValidFormIconComponent - ], - entryComponents: [ - UnsavedDialogComponent - ], - imports: [ - DomainModule, - CommonModule, - RouterModule, - ReactiveFormsModule, - RootProviderModule, - ProviderEditorFormModule, - NgbDropdownModule, - StoreModule.forFeature('edit-provider', reducers), - EffectsModule.forFeature([WizardEffects, EditorEffects]), - RouterModule.forChild(routes), - SharedModule - ], - providers: [] -}) -export class EditorModule { } diff --git a/ui/src/app/edit-provider/effect/editor.effect.ts b/ui/src/app/edit-provider/effect/editor.effect.ts deleted file mode 100644 index 1e14ca360..000000000 --- a/ui/src/app/edit-provider/effect/editor.effect.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Effect, Actions, ofType } from '@ngrx/effects'; - -import { switchMap, map, withLatestFrom, tap } from 'rxjs/operators'; - -import * as fromCollection from '../../domain/reducer'; -import * as fromRoot from '../../app.reducer'; - -import * as editor from '../action/editor.action'; -import * as provider from '../../domain/action/provider-collection.action'; - -import { ShowContentionAction } from '../../contention/action/contention.action'; -import { Contention, ContentionEntity } from '../../contention/model/contention'; - -import { ProviderCollectionActionTypes } from '../../domain/action/provider-collection.action'; -import { MetadataProvider } from '../../domain/model/metadata-provider'; -import { EntityDescriptorService } from '../../domain/service/entity-descriptor.service'; -import { Router } from '@angular/router'; -import { Store } from '@ngrx/store'; -import { MetadataResolverService } from '../../domain/service/metadata-resolver.service'; -import { ContentionService } from '../../contention/service/contention.service'; - -@Injectable() -export class EditorEffects { - - @Effect() - cancelChanges$ = this.actions$.pipe( - ofType(editor.CANCEL_CHANGES), - map(() => new provider.LoadProviderRequest()), - tap(() => this.router.navigate(['/dashboard'])) - ); - - @Effect() - updateProviderSuccessRedirect$ = this.actions$.pipe( - ofType(ProviderCollectionActionTypes.UPDATE_PROVIDER_SUCCESS), - map(action => action.payload), - map(p => new editor.ResetChanges()) - ); - - @Effect() - openContention$ = this.actions$.pipe( - ofType(ProviderCollectionActionTypes.UPDATE_PROVIDER_FAIL), - map(action => action.payload), - withLatestFrom(this.store.select(fromCollection.getSelectedProvider)), - switchMap(([filter, current]) => { - return this.service.find(filter.id).pipe( - map(data => new ShowContentionAction(this.contentionService.getContention(current, filter, data, { - resolve: (obj) => this.store.dispatch(new provider.UpdateProviderRequest(obj)), - reject: (obj) => this.store.dispatch(new editor.CancelChanges()) - }))) - ); - }) - ); - - constructor( - private store: Store, - private service: EntityDescriptorService, - private actions$: Actions, - private router: Router, - private contentionService: ContentionService - ) { } -} diff --git a/ui/src/app/edit-provider/reducer/index.ts b/ui/src/app/edit-provider/reducer/index.ts deleted file mode 100644 index ba82831f4..000000000 --- a/ui/src/app/edit-provider/reducer/index.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { createSelector, createFeatureSelector } from '@ngrx/store'; -import * as fromRoot from '../../app.reducer'; -import * as fromEditor from './editor.reducer'; - -export interface EditProviderState { - editor: fromEditor.EditorState; -} - -export const reducers = { - editor: fromEditor.reducer -}; - -export interface State extends fromRoot.State { - 'edit-provider': EditProviderState; -} - -export const getEditProviderState = createFeatureSelector('edit-provider'); -export const getEditorState = createSelector(getEditProviderState, (state: EditProviderState) => state.editor); -export const getEditorIsValid = createSelector(getEditorState, fromEditor.isEditorValid); -export const getEditorIsSaved = createSelector(getEditorState, fromEditor.isEditorSaved); -export const getEditorChanges = createSelector(getEditorState, fromEditor.getChanges); -export const getEditorIsSaving = createSelector(getEditorState, fromEditor.isEditorSaving); -export const getFormStatus = createSelector(getEditorState, fromEditor.getFormStatus); -export const getInvalidEditorForms = createSelector(getEditorState, fromEditor.getInvalidForms); diff --git a/ui/src/app/metadata-filter/action/filter.action.spec.ts b/ui/src/app/metadata-filter/action/filter.action.spec.ts deleted file mode 100644 index 290f349cd..000000000 --- a/ui/src/app/metadata-filter/action/filter.action.spec.ts +++ /dev/null @@ -1,8 +0,0 @@ -import * as actions from './filter.action'; - -describe('Filter Actions', () => { - it('should provide actions', () => { - expect(new actions.CancelCreateFilter().type).toBe(actions.CANCEL_CREATE_FILTER); - expect(new actions.SelectId('foo').type).toBe(actions.SELECT_ID); - }); -}); diff --git a/ui/src/app/metadata-filter/action/search.action.ts b/ui/src/app/metadata-filter/action/search.action.ts deleted file mode 100644 index a9312eff3..000000000 --- a/ui/src/app/metadata-filter/action/search.action.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { Action } from '@ngrx/store'; - -import { QueryParams } from '../../core/model/query'; - -export const QUERY_ENTITY_IDS = '[Filter] Query Entity Ids'; -export const VIEW_MORE_IDS = '[Filter] View More Ids Modal'; -export const CANCEL_VIEW_MORE = '[Filter] Cancel View More'; -export const CLEAR_SEARCH = '[Filter] Clear Search'; -export const LOAD_ENTITY_IDS_SUCCESS = '[Entity ID Collection] Load Entity Ids Success'; -export const LOAD_ENTITY_IDS_ERROR = '[Entity ID Collection] Load Entity Ids Error'; - -export class QueryEntityIds implements Action { - readonly type = QUERY_ENTITY_IDS; - - constructor(public payload: QueryParams) { } -} - -export class ViewMoreIds implements Action { - readonly type = VIEW_MORE_IDS; - - constructor(public payload: string) { } -} - -export class ClearSearch implements Action { - readonly type = CLEAR_SEARCH; -} - -export class CancelViewMore implements Action { - readonly type = CANCEL_VIEW_MORE; -} - -export class LoadEntityIdsSuccess implements Action { - readonly type = LOAD_ENTITY_IDS_SUCCESS; - - constructor(public payload: string[]) { } -} - -export class LoadEntityIdsError implements Action { - readonly type = LOAD_ENTITY_IDS_ERROR; - - constructor(public payload: Error) { } -} - -export type Actions = - | ViewMoreIds - | CancelViewMore - | ClearSearch - | LoadEntityIdsSuccess - | LoadEntityIdsError - | QueryEntityIds; diff --git a/ui/src/app/metadata-filter/effect/filter.effect.ts b/ui/src/app/metadata-filter/effect/filter.effect.ts deleted file mode 100644 index c74bd3893..000000000 --- a/ui/src/app/metadata-filter/effect/filter.effect.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Effect, Actions, ofType } from '@ngrx/effects'; -import { Store } from '@ngrx/store'; -import { of } from 'rxjs'; -import { map, switchMap, catchError, withLatestFrom, tap } from 'rxjs/operators'; - -import { Router } from '@angular/router'; - -import * as filterActions from '../action/filter.action'; -import * as fromCollection from '../../domain/reducer'; -import * as fromRoot from '../../app.reducer'; -import * as collection from '../../domain/action/filter-collection.action'; -import { FilterCollectionActionTypes } from '../../domain/action/filter-collection.action'; -import { EntityIdService } from '../../domain/service/entity-id.service'; -import { MetadataResolverService } from '../../domain/service/metadata-resolver.service'; -import { ShowContentionAction } from '../../contention/action/contention.action'; -import { MetadataFilter } from '../../domain/domain.type'; -import { ContentionService } from '../../contention/service/contention.service'; - -@Injectable() -export class FilterEffects { - - @Effect() - loadEntityMdui$ = this.actions$.pipe( - ofType(filterActions.SELECT_ID), - map(action => action.payload), - switchMap(query => - this.idService.findEntityById(query).pipe( - map(data => new filterActions.LoadEntityPreviewSuccess(data)), - catchError(error => of(new filterActions.LoadEntityPreviewError(error))) - ) - ) - ); - - @Effect() - openContention$ = this.actions$.pipe( - ofType(collection.FilterCollectionActionTypes.UPDATE_FILTER_FAIL), - map(action => action.payload), - withLatestFrom(this.store.select(fromCollection.getSelectedFilter)), - switchMap(([filter, current]) => - this.resolverService.find(filter.id).pipe( - map(data => new ShowContentionAction(this.contentionService.getContention(current, filter, data, { - resolve: (obj) => this.store.dispatch(new collection.UpdateFilterRequest({ ...obj })), - reject: (obj) => this.store.dispatch(new filterActions.CancelCreateFilter()) - }))) - ) - ) - ); - - @Effect({ dispatch: false }) - saveFilterSuccess$ = this.actions$.pipe( - ofType(FilterCollectionActionTypes.ADD_FILTER_SUCCESS), - switchMap(() => this.router.navigate(['/dashboard'])) - ); - - @Effect() - cancelChanges$ = this.actions$.pipe( - ofType(filterActions.CANCEL_CREATE_FILTER), - map(() => new collection.LoadFilterRequest()), - tap(() => this.router.navigate(['/dashboard'])) - ); - - constructor( - private store: Store, - private actions$: Actions, - private router: Router, - private idService: EntityIdService, - private resolverService: MetadataResolverService, - private contentionService: ContentionService - ) { } -} diff --git a/ui/src/app/metadata-provider/action/copy.action.ts b/ui/src/app/metadata-provider/action/copy.action.ts deleted file mode 100644 index 1343aa9d1..000000000 --- a/ui/src/app/metadata-provider/action/copy.action.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { Action } from '@ngrx/store'; -import { MetadataProvider } from '../../domain/model/metadata-provider'; - -export enum CopySourceActionTypes { - CREATE_PROVIDER_COPY_REQUEST = '[Copy Provider] Create Provider Copy Request', - CREATE_PROVIDER_COPY_SUCCESS = '[Copy Provider] Create Provider Copy Success', - CREATE_PROVIDER_COPY_ERROR = '[Copy Provider] Create Provider Copy Error', - - UPDATE_PROVIDER_COPY = '[Copy Provider] Update Provider Copy Request', - - UPDATE_PROVIDER_COPY_SECTIONS = '[Copy Provider] Update Provider Sections', - - SAVE_PROVIDER_COPY_REQUEST = '[Copy Provider] Save Provider Copy Request', - SAVE_PROVIDER_COPY_SUCCESS = '[Copy Provider] Save Provider Copy Request', - SAVE_PROVIDER_COPY_ERROR = '[Copy Provider] Save Provider Copy Request', -} - -export class CreateProviderCopyRequest implements Action { - readonly type = CopySourceActionTypes.CREATE_PROVIDER_COPY_REQUEST; - - constructor(public payload: { entityId: string, serviceProviderName: string, target: string }) { } -} - -export class CreateProviderCopySuccess implements Action { - readonly type = CopySourceActionTypes.CREATE_PROVIDER_COPY_SUCCESS; - - constructor(public payload: MetadataProvider) { } -} - -export class CreateProviderCopyError implements Action { - readonly type = CopySourceActionTypes.CREATE_PROVIDER_COPY_ERROR; - - constructor(public payload: Error) { } -} - -export class UpdateProviderCopy implements Action { - readonly type = CopySourceActionTypes.UPDATE_PROVIDER_COPY; - - constructor(public payload: Partial) { } -} - -export class UpdateProviderCopySections implements Action { - readonly type = CopySourceActionTypes.UPDATE_PROVIDER_COPY_SECTIONS; - - constructor(public payload: string[]) { } -} - -export type CopySourceActionUnion = - | CreateProviderCopyRequest - | CreateProviderCopySuccess - | CreateProviderCopyError - | UpdateProviderCopy - | UpdateProviderCopySections; diff --git a/ui/src/app/metadata-provider/component/forms/advanced-info-form.component.spec.ts b/ui/src/app/metadata-provider/component/forms/advanced-info-form.component.spec.ts deleted file mode 100644 index e51cc7972..000000000 --- a/ui/src/app/metadata-provider/component/forms/advanced-info-form.component.spec.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { StoreModule, Store, combineReducers } from '@ngrx/store'; -import { ProviderValueEmitter, ProviderStatusEmitter } from '../../../domain/service/provider-change-emitter.service'; -import * as fromCollections from '../../../domain/reducer'; -import { AdvancedInfoFormComponent } from './advanced-info-form.component'; -import { NgbPopoverModule, NgbPopoverConfig } from '@ng-bootstrap/ng-bootstrap/popover/popover.module'; -import * as stubs from '../../../../testing/provider.stub'; - -describe('Advanced Info Form Component', () => { - let fixture: ComponentFixture; - let instance: AdvancedInfoFormComponent; - let store: Store; - - beforeEach(() => { - TestBed.configureTestingModule({ - providers: [ - ProviderValueEmitter, - ProviderStatusEmitter, - NgbPopoverConfig - ], - imports: [ - NoopAnimationsModule, - ReactiveFormsModule, - StoreModule.forRoot({ - 'collections': combineReducers(fromCollections.reducers), - }), - NgbPopoverModule - ], - declarations: [ - AdvancedInfoFormComponent - ], - }); - store = TestBed.get(Store); - spyOn(store, 'dispatch').and.callThrough(); - - fixture = TestBed.createComponent(AdvancedInfoFormComponent); - instance = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should compile', () => { - expect(fixture).toBeDefined(); - }); - - describe('ngOnChanges method', () => { - it('should set properties on the provider', () => { - instance.provider = stubs.provider; - fixture.detectChanges(); - instance.ngOnChanges(); - expect(instance.provider.organization).toEqual({}); - expect(instance.provider.contacts).toEqual([]); - }); - }); - - describe('removeContact method', () => { - it('should remove the contact at the given index', () => { - instance.provider = { - ...stubs.provider, - contacts: [stubs.contact] - }; - fixture.detectChanges(); - instance.ngOnChanges(); - instance.removeContact(0); - expect(instance.contacts.length).toBe(0); - }); - }); - - describe('addContact method', () => { - it('should remove the contact at the given index', () => { - instance.provider = { - ...stubs.provider, - contacts: [stubs.contact] - }; - fixture.detectChanges(); - instance.ngOnChanges(); - instance.addContact(); - expect(instance.contacts.length).toBe(2); - }); - }); -}); diff --git a/ui/src/app/metadata-provider/container/new-provider.component.spec.ts b/ui/src/app/metadata-provider/container/new-provider.component.spec.ts deleted file mode 100644 index 4c320fa21..000000000 --- a/ui/src/app/metadata-provider/container/new-provider.component.spec.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { ReactiveFormsModule } from '@angular/forms'; -import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { RouterModule, Router, ActivatedRoute } from '@angular/router'; -import { APP_BASE_HREF } from '@angular/common'; - -import { StoreModule, Store, combineReducers } from '@ngrx/store'; -import { NewProviderComponent } from './new-provider.component'; - -import { BlankProviderComponent } from './blank-provider.component'; -import { UploadProviderComponent } from './upload-provider.component'; -import { CopyProviderComponent } from './copy-provider.component'; -import { SharedModule } from '../../shared/shared.module'; -import { NavigatorService } from '../../core/service/navigator.service'; -import * as fromProvider from '../reducer'; -import * as fromCollections from '../../domain/reducer'; -import { RouterStub } from '../../../testing/router.stub'; -import { ActivatedRouteStub } from '../../../testing/activated-route.stub'; -import { I18nTextComponent } from '../../domain/component/i18n-text.component'; - -describe('New Provider Page', () => { - let fixture: ComponentFixture; - let store: Store; - let instance: NewProviderComponent; - let activatedRoute: ActivatedRouteStub = new ActivatedRouteStub(); - activatedRoute.testParamMap = { id: 'foo' }; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [ - NoopAnimationsModule, - StoreModule.forRoot({ - collections: combineReducers(fromCollections.reducers), - provider: combineReducers(fromProvider.reducers) - }), - ReactiveFormsModule, - SharedModule, - RouterModule.forRoot([]) - ], - declarations: [ - NewProviderComponent, - BlankProviderComponent, - UploadProviderComponent, - CopyProviderComponent, - I18nTextComponent - ], - providers: [ - NavigatorService, - { provide: ActivatedRoute, useValue: activatedRoute }, - { provide: APP_BASE_HREF, useValue: '/' } - ] - }); - - fixture = TestBed.createComponent(NewProviderComponent); - instance = fixture.componentInstance; - store = TestBed.get(Store); - - spyOn(store, 'dispatch').and.callThrough(); - }); - - it('should compile', () => { - fixture.detectChanges(); - - expect(fixture).toBeDefined(); - }); -}); diff --git a/ui/src/app/metadata-provider/container/new-provider.component.ts b/ui/src/app/metadata-provider/container/new-provider.component.ts deleted file mode 100644 index 4dee1bf02..000000000 --- a/ui/src/app/metadata-provider/container/new-provider.component.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Component } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; - -@Component({ - selector: 'new-provider-page', - templateUrl: './new-provider.component.html', - styleUrls: ['./new-provider.component.scss'] -}) -export class NewProviderComponent { - constructor() {} -} /* istanbul ignore next */ diff --git a/ui/src/app/metadata-provider/metadata-provider.module.ts b/ui/src/app/metadata-provider/metadata-provider.module.ts deleted file mode 100644 index 7143a2712..000000000 --- a/ui/src/app/metadata-provider/metadata-provider.module.ts +++ /dev/null @@ -1,102 +0,0 @@ -import { NgModule, ModuleWithProviders } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; -import { CommonModule } from '@angular/common'; -import { HttpClientModule } from '@angular/common/http'; -import { ReactiveFormsModule, FormsModule } from '@angular/forms'; -import { StoreModule } from '@ngrx/store'; -import { EffectsModule } from '@ngrx/effects'; - -import { NewProviderComponent } from './container/new-provider.component'; - -import { ProviderEditorFormModule } from './component'; -import { PrettyXml } from './pipe/pretty-xml.pipe'; -import { UploadProviderComponent } from './container/upload-provider.component'; -import { BlankProviderComponent } from './container/blank-provider.component'; -import { CopyProviderComponent } from './container/copy-provider.component'; -import { SharedModule } from '../shared/shared.module'; -import { SearchIdEffects } from './effect/search.effect'; -import * as fromProvider from './reducer'; -import { ConfirmCopyComponent } from './container/confirm-copy.component'; -import { CopyIsSetGuard } from './guard/copy-isset.guard'; -import { CopyProviderEffects } from './effect/copy.effect'; -import { DomainModule } from '../domain/domain.module'; - -@NgModule({ - declarations: [ - NewProviderComponent, - UploadProviderComponent, - BlankProviderComponent, - CopyProviderComponent, - ConfirmCopyComponent, - PrettyXml - ], - entryComponents: [], - imports: [ - DomainModule, - SharedModule, - HttpClientModule, - CommonModule, - RouterModule, - ReactiveFormsModule, - FormsModule, - ProviderEditorFormModule - ], - exports: [ - ProviderEditorFormModule - ], - providers: [] -}) -export class MetadataProviderModule { - static forRoot(): ModuleWithProviders { - return { - ngModule: RootProviderModule, - providers: [ - CopyIsSetGuard - ] - }; - } -} - -export const routes: Routes = [ - { - path: 'new', - component: NewProviderComponent, - canActivate: [], - children: [ - { path: '', redirectTo: 'blank', pathMatch: 'prefix' }, - { - path: 'blank', - component: BlankProviderComponent, - canDeactivate: [] - }, - { - path: 'upload', - component: UploadProviderComponent, - canDeactivate: [] - }, - { - path: 'copy', - component: CopyProviderComponent, - canDeactivate: [] - } - ] - }, - { - path: 'new/copy/confirm', - component: ConfirmCopyComponent, - canActivate: [CopyIsSetGuard] - } -]; - -@NgModule({ - imports: [ - MetadataProviderModule, - RouterModule.forChild(routes), - StoreModule.forFeature('provider', fromProvider.reducers), - EffectsModule.forFeature([ - SearchIdEffects, - CopyProviderEffects - ]) - ], -}) -export class RootProviderModule { } diff --git a/ui/src/app/metadata-provider/reducer/index.ts b/ui/src/app/metadata-provider/reducer/index.ts deleted file mode 100644 index d1981f19a..000000000 --- a/ui/src/app/metadata-provider/reducer/index.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { createSelector, createFeatureSelector } from '@ngrx/store'; -import * as fromRoot from '../../app.reducer'; -import * as fromSearch from './search.reducer'; -import * as fromCopy from './copy.reducer'; - -export interface ProviderState { - copy: fromCopy.CopyState; - search: fromSearch.SearchState; -} - -export const reducers = { - copy: fromCopy.reducer, - search: fromSearch.reducer -}; - -export interface State extends fromRoot.State { - 'provider': ProviderState; -} - -export const getProviderState = createFeatureSelector('provider'); - -export const getCopyFromStateFn = (state: ProviderState) => state.copy; -export const getSearchFromStateFn = (state: ProviderState) => state.search; - -export const getCopyFromState = createSelector(getProviderState, getCopyFromStateFn); -export const getCopy = createSelector(getCopyFromState, fromCopy.getCopy); -export const getSaving = createSelector(getCopyFromState, fromCopy.getSaving); -export const getAttributes = createSelector(getCopyFromState, fromCopy.getCopyAttributes); -export const getSectionsToCopy = createSelector(getCopyFromState, fromCopy.getCopySections); - -export const getSearchFromState = createSelector(getProviderState, getSearchFromStateFn); -export const getSearchResults = createSelector(getSearchFromState, fromSearch.getMatches); -export const getSearchQuery = createSelector(getSearchFromState, fromSearch.getQuery); -export const getSearchLoading = createSelector(getSearchFromState, fromSearch.getSearching); diff --git a/ui/src/app/domain/action/entity.action.ts b/ui/src/app/metadata/domain/action/entity.action.ts similarity index 82% rename from ui/src/app/domain/action/entity.action.ts rename to ui/src/app/metadata/domain/action/entity.action.ts index 61f3ad3e5..4bfe1380c 100644 --- a/ui/src/app/domain/action/entity.action.ts +++ b/ui/src/app/metadata/domain/action/entity.action.ts @@ -1,5 +1,5 @@ import { Action } from '@ngrx/store'; -import { MetadataEntity } from '../../domain/domain.type'; +import { MetadataEntity } from '../../domain/model'; export const PREVIEW_ENTITY = '[Domain] Preview Entity'; diff --git a/ui/src/app/metadata-provider/component/forms/advanced-info-form.component.html b/ui/src/app/metadata/domain/component/forms/advanced-info-form.component.html similarity index 100% rename from ui/src/app/metadata-provider/component/forms/advanced-info-form.component.html rename to ui/src/app/metadata/domain/component/forms/advanced-info-form.component.html diff --git a/ui/src/app/metadata/domain/component/forms/advanced-info-form.component.spec.ts b/ui/src/app/metadata/domain/component/forms/advanced-info-form.component.spec.ts new file mode 100644 index 000000000..6049e344b --- /dev/null +++ b/ui/src/app/metadata/domain/component/forms/advanced-info-form.component.spec.ts @@ -0,0 +1,102 @@ +import { TestBed, ComponentFixture } from '@angular/core/testing'; +import { ReactiveFormsModule } from '@angular/forms'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { ViewChild, Component } from '@angular/core'; +import { NgbPopoverModule, NgbPopoverConfig } from '@ng-bootstrap/ng-bootstrap/popover/popover.module'; +import { Observable, of } from 'rxjs'; +import { ProviderValueEmitter, ProviderStatusEmitter } from '../../../domain/service/provider-change-emitter.service'; +import { AdvancedInfoFormComponent } from './advanced-info-form.component'; +import * as stubs from '../../../../../testing/resolver.stub'; +import { FileBackedHttpMetadataResolver } from '../../entity'; + +@Component({ + template: `` +}) +class TestHostComponent { + + ids$: Observable = of(['foo']); + resolver = new FileBackedHttpMetadataResolver({ + ...stubs.resolver, + serviceProviderSsoDescriptor: { + protocolSupportEnum: 'foo', + nameIdFormats: [] + } + }); + + @ViewChild(AdvancedInfoFormComponent) + public formUnderTest: AdvancedInfoFormComponent; + + changeProvider(opts: any): void { + this.resolver = Object.assign({}, this.resolver, opts); + } + + addFormat(value: string): void { + this.resolver.serviceProviderSsoDescriptor.nameIdFormats.push(value); + } +} + + +describe('Advanced Info Form Component', () => { + let fixture: ComponentFixture; + let instance: TestHostComponent; + + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [ + ProviderValueEmitter, + ProviderStatusEmitter, + NgbPopoverConfig + ], + imports: [ + NoopAnimationsModule, + ReactiveFormsModule, + NgbPopoverModule + ], + declarations: [ + AdvancedInfoFormComponent, + TestHostComponent + ], + }); + + fixture = TestBed.createComponent(TestHostComponent); + instance = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should compile', () => { + expect(fixture).toBeDefined(); + }); + + describe('ngOnChanges method', () => { + it('should set properties on the resolver', () => { + instance.changeProvider(stubs.resolver); + fixture.detectChanges(); + expect(instance.formUnderTest.resolver.organization).toEqual({}); + expect(instance.formUnderTest.resolver.contacts).toEqual([]); + }); + }); + + describe('removeContact method', () => { + it('should remove the contact at the given index', () => { + instance.changeProvider({ + ...stubs.resolver, + contacts: [stubs.contact] + }); + fixture.detectChanges(); + instance.formUnderTest.removeContact(0); + expect(instance.formUnderTest.contacts.length).toBe(0); + }); + }); + + describe('addContact method', () => { + it('should remove the contact at the given index', () => { + instance.changeProvider({ + ...stubs.resolver, + contacts: [stubs.contact] + }); + fixture.detectChanges(); + instance.formUnderTest.addContact(); + expect(instance.formUnderTest.contacts.length).toBe(2); + }); + }); +}); diff --git a/ui/src/app/metadata-provider/component/forms/advanced-info-form.component.ts b/ui/src/app/metadata/domain/component/forms/advanced-info-form.component.ts similarity index 69% rename from ui/src/app/metadata-provider/component/forms/advanced-info-form.component.ts rename to ui/src/app/metadata/domain/component/forms/advanced-info-form.component.ts index cf6173cf9..d0ce28c2c 100644 --- a/ui/src/app/metadata-provider/component/forms/advanced-info-form.component.ts +++ b/ui/src/app/metadata/domain/component/forms/advanced-info-form.component.ts @@ -1,16 +1,12 @@ import { Component, Input, OnInit, OnChanges, OnDestroy, ChangeDetectionStrategy, EventEmitter } from '@angular/core'; -import { FormBuilder, FormGroup, FormControl, FormArray, Validators } from '@angular/forms'; +import { FormBuilder, FormGroup, FormArray, Validators } from '@angular/forms'; import { Observable, Subscription, of } from 'rxjs'; -import { takeUntil, combineLatest, switchMap, map, startWith } from 'rxjs/operators'; +import { takeUntil, switchMap, map, startWith } from 'rxjs/operators'; -import { Store } from '@ngrx/store'; - -import * as fromCollection from '../../../domain/reducer'; import { ProviderStatusEmitter, ProviderValueEmitter } from '../../../domain/service/provider-change-emitter.service'; -import { MetadataProvider, Organization, Contact } from '../../../domain/model/metadata-provider'; +import { MetadataResolver, Contact } from '../../../domain/model'; import { ProviderFormFragmentComponent } from './provider-form-fragment.component'; import { EntityValidators } from '../../../domain/service/entity-validators.service'; -import * as patterns from '../../../shared/regex'; @Component({ selector: 'adv-info-form', @@ -18,7 +14,8 @@ import * as patterns from '../../../shared/regex'; templateUrl: './advanced-info-form.component.html' }) export class AdvancedInfoFormComponent extends ProviderFormFragmentComponent implements OnInit, OnChanges, OnDestroy { - @Input() provider: MetadataProvider; + @Input() resolver: MetadataResolver; + @Input() ids: Observable; contactTypes: string[] = [ 'support', @@ -31,26 +28,15 @@ export class AdvancedInfoFormComponent extends ProviderFormFragmentComponent imp hasValue$: Observable; totalValue$: Observable; - ids$: Observable = of([]); private validationSubscription: Subscription; constructor( protected fb: FormBuilder, protected statusEmitter: ProviderStatusEmitter, - protected valueEmitter: ProviderValueEmitter, - protected store: Store + protected valueEmitter: ProviderValueEmitter ) { super(fb, statusEmitter, valueEmitter); - - this.ids$ = this.store - .select(fromCollection.getAllEntityIds) - .pipe( - takeUntil(this.ngUnsubscribe), - combineLatest(this.store.select(fromCollection.getSelectedProvider), (ids: string[], provider: MetadataProvider) => { - return ids.filter(id => provider.entityId !== id); - }) - ); } createForm(): void { @@ -85,20 +71,20 @@ export class AdvancedInfoFormComponent extends ProviderFormFragmentComponent imp this.form .get('entityId') .setAsyncValidators( - EntityValidators.createUniqueIdValidator(this.ids$) + EntityValidators.createUniqueIdValidator(this.ids) ); } ngOnChanges(): void { - this.provider.organization = this.provider.organization || {}; - this.provider.contacts = this.provider.contacts || []; + this.resolver.organization = this.resolver.organization || {}; + this.resolver.contacts = this.resolver.contacts || []; this.form.reset({ - serviceProviderName: this.provider.serviceProviderName, - serviceEnabled: this.provider.serviceEnabled, - entityId: this.provider.entityId, - organization: this.provider.organization + serviceProviderName: this.resolver.serviceProviderName, + serviceEnabled: this.resolver.serviceEnabled, + entityId: this.resolver.entityId, + organization: this.resolver.organization }); - this.setContacts(this.provider.contacts); + this.setContacts(this.resolver.contacts); } get contacts(): FormArray { diff --git a/ui/src/app/metadata-provider/component/forms/assertion-form.component.html b/ui/src/app/metadata/domain/component/forms/assertion-form.component.html similarity index 100% rename from ui/src/app/metadata-provider/component/forms/assertion-form.component.html rename to ui/src/app/metadata/domain/component/forms/assertion-form.component.html diff --git a/ui/src/app/metadata-provider/component/forms/assertion-form.component.spec.ts b/ui/src/app/metadata/domain/component/forms/assertion-form.component.spec.ts similarity index 78% rename from ui/src/app/metadata-provider/component/forms/assertion-form.component.spec.ts rename to ui/src/app/metadata/domain/component/forms/assertion-form.component.spec.ts index 5f6574a8c..6a3925d2f 100644 --- a/ui/src/app/metadata-provider/component/forms/assertion-form.component.spec.ts +++ b/ui/src/app/metadata/domain/component/forms/assertion-form.component.spec.ts @@ -3,15 +3,13 @@ import { ReactiveFormsModule } from '@angular/forms'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { StoreModule, Store, combineReducers } from '@ngrx/store'; import { ProviderValueEmitter, ProviderStatusEmitter } from '../../../domain/service/provider-change-emitter.service'; -import * as fromCollections from '../../../domain/reducer'; import { NgbPopoverModule, NgbPopoverConfig } from '@ng-bootstrap/ng-bootstrap/popover/popover.module'; import { AssertionFormComponent } from './assertion-form.component'; -import * as stubs from '../../../../testing/provider.stub'; +import * as stubs from '../../../../../testing/resolver.stub'; describe('Assertion Form Component', () => { let fixture: ComponentFixture; let instance: AssertionFormComponent; - let store: Store; beforeEach(() => { TestBed.configureTestingModule({ @@ -23,17 +21,12 @@ describe('Assertion Form Component', () => { imports: [ NoopAnimationsModule, ReactiveFormsModule, - StoreModule.forRoot({ - 'collections': combineReducers(fromCollections.reducers), - }), NgbPopoverModule ], declarations: [ AssertionFormComponent ], }); - store = TestBed.get(Store); - spyOn(store, 'dispatch').and.callThrough(); fixture = TestBed.createComponent(AssertionFormComponent); instance = fixture.componentInstance; @@ -46,17 +39,17 @@ describe('Assertion Form Component', () => { describe('ngOnChanges method', () => { it('should set properties on the provider', () => { - instance.provider = stubs.provider; + instance.resolver = stubs.resolver; fixture.detectChanges(); instance.ngOnChanges(); - expect(instance.provider.assertionConsumerServices).toEqual([]); + expect(instance.resolver.assertionConsumerServices).toEqual([]); }); }); describe('removeEndpoint method', () => { it('should remove the endpoint at the given index', () => { - instance.provider = { - ...stubs.provider, + instance.resolver = { + ...stubs.resolver, assertionConsumerServices: [stubs.endpoint] }; fixture.detectChanges(); @@ -68,8 +61,8 @@ describe('Assertion Form Component', () => { describe('addEndpoint method', () => { it('should remove the endpoint at the given index', () => { - instance.provider = { - ...stubs.provider, + instance.resolver = { + ...stubs.resolver, assertionConsumerServices: [stubs.endpoint] }; fixture.detectChanges(); diff --git a/ui/src/app/metadata-provider/component/forms/assertion-form.component.ts b/ui/src/app/metadata/domain/component/forms/assertion-form.component.ts similarity index 79% rename from ui/src/app/metadata-provider/component/forms/assertion-form.component.ts rename to ui/src/app/metadata/domain/component/forms/assertion-form.component.ts index 668784c78..a3ce408b8 100644 --- a/ui/src/app/metadata-provider/component/forms/assertion-form.component.ts +++ b/ui/src/app/metadata/domain/component/forms/assertion-form.component.ts @@ -1,11 +1,10 @@ -import { Component, Output, Input, EventEmitter, OnInit, OnChanges, OnDestroy, ChangeDetectionStrategy } from '@angular/core'; -import { FormBuilder, FormGroup, FormControl, FormArray, AbstractControl, Validators } from '@angular/forms'; +import { Component, Input, OnInit, OnChanges, OnDestroy, ChangeDetectionStrategy } from '@angular/core'; +import { FormBuilder, FormGroup, FormArray, AbstractControl } from '@angular/forms'; import { ProviderFormFragmentComponent } from './provider-form-fragment.component'; import { ProviderStatusEmitter, ProviderValueEmitter } from '../../../domain/service/provider-change-emitter.service'; -import { MetadataProvider, SsoService } from '../../../domain/model/metadata-provider'; -import * as patterns from '../../../shared/regex'; +import { SsoService, MetadataResolver } from '../../../domain/model/'; @Component({ selector: 'assertion-form', @@ -13,7 +12,7 @@ import * as patterns from '../../../shared/regex'; templateUrl: './assertion-form.component.html' }) export class AssertionFormComponent extends ProviderFormFragmentComponent implements OnInit, OnChanges, OnDestroy { - @Input() provider: MetadataProvider; + @Input() resolver: MetadataResolver; form: FormGroup; @@ -68,7 +67,7 @@ export class AssertionFormComponent extends ProviderFormFragmentComponent implem } ngOnChanges(): void { - this.provider.assertionConsumerServices = this.provider.assertionConsumerServices || []; - this.setEndpoints(this.provider.assertionConsumerServices); + this.resolver.assertionConsumerServices = this.resolver.assertionConsumerServices || []; + this.setEndpoints(this.resolver.assertionConsumerServices); } } /* istanbul ignore next */ diff --git a/ui/src/app/metadata-provider/component/forms/attribute-release-form.component.html b/ui/src/app/metadata/domain/component/forms/attribute-release-form.component.html similarity index 100% rename from ui/src/app/metadata-provider/component/forms/attribute-release-form.component.html rename to ui/src/app/metadata/domain/component/forms/attribute-release-form.component.html diff --git a/ui/src/app/metadata-provider/component/forms/attribute-release-form.component.spec.ts b/ui/src/app/metadata/domain/component/forms/attribute-release-form.component.spec.ts similarity index 82% rename from ui/src/app/metadata-provider/component/forms/attribute-release-form.component.spec.ts rename to ui/src/app/metadata/domain/component/forms/attribute-release-form.component.spec.ts index 1345dda16..67882509e 100644 --- a/ui/src/app/metadata-provider/component/forms/attribute-release-form.component.spec.ts +++ b/ui/src/app/metadata/domain/component/forms/attribute-release-form.component.spec.ts @@ -3,16 +3,14 @@ import { ReactiveFormsModule } from '@angular/forms'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { StoreModule, Store, combineReducers } from '@ngrx/store'; import { ProviderValueEmitter, ProviderStatusEmitter } from '../../../domain/service/provider-change-emitter.service'; -import * as fromCollections from '../../../domain/reducer'; import { NgbPopoverModule, NgbPopoverConfig } from '@ng-bootstrap/ng-bootstrap/popover/popover.module'; import { AttributeReleaseFormComponent } from './attribute-release-form.component'; import { ListValuesService } from '../../../domain/service/list-values.service'; -import * as stubs from '../../../../testing/provider.stub'; +import * as stubs from '../../../../../testing/resolver.stub'; describe('Attribute Release Form Component', () => { let fixture: ComponentFixture; let instance: AttributeReleaseFormComponent; - let store: Store; beforeEach(() => { TestBed.configureTestingModule({ @@ -25,22 +23,17 @@ describe('Attribute Release Form Component', () => { imports: [ NoopAnimationsModule, ReactiveFormsModule, - StoreModule.forRoot({ - 'collections': combineReducers(fromCollections.reducers), - }), NgbPopoverModule ], declarations: [ AttributeReleaseFormComponent ], }); - store = TestBed.get(Store); - spyOn(store, 'dispatch').and.callThrough(); fixture = TestBed.createComponent(AttributeReleaseFormComponent); instance = fixture.componentInstance; - instance.provider = { - ...stubs.provider, + instance.resolver = { + ...stubs.resolver, attributeRelease: [] }; fixture.detectChanges(); @@ -54,7 +47,7 @@ describe('Attribute Release Form Component', () => { it('should set properties on the provider', () => { spyOn(instance, 'setAttributes'); instance.ngOnChanges(); - expect(instance.provider.attributeRelease).toEqual([]); + expect(instance.resolver.attributeRelease).toEqual([]); expect(instance.setAttributes).toHaveBeenCalled(); }); }); diff --git a/ui/src/app/metadata-provider/component/forms/attribute-release-form.component.ts b/ui/src/app/metadata/domain/component/forms/attribute-release-form.component.ts similarity index 89% rename from ui/src/app/metadata-provider/component/forms/attribute-release-form.component.ts rename to ui/src/app/metadata/domain/component/forms/attribute-release-form.component.ts index d4a4d8b39..8a7d3a258 100644 --- a/ui/src/app/metadata-provider/component/forms/attribute-release-form.component.ts +++ b/ui/src/app/metadata/domain/component/forms/attribute-release-form.component.ts @@ -1,11 +1,11 @@ import { Component, Output, Input, EventEmitter, OnInit, OnChanges, OnDestroy, ChangeDetectionStrategy } from '@angular/core'; -import { FormBuilder, FormGroup, FormControl, Validators } from '@angular/forms'; +import { FormBuilder, FormGroup } from '@angular/forms'; import { Observable } from 'rxjs'; import { last } from 'rxjs/operators'; import { ProviderFormFragmentComponent } from './provider-form-fragment.component'; import { ProviderStatusEmitter, ProviderValueEmitter } from '../../../domain/service/provider-change-emitter.service'; -import { MetadataProvider, Organization, Contact } from '../../../domain/model/metadata-provider'; +import { MetadataResolver } from '../../../domain/model'; import { ListValuesService } from '../../../domain/service/list-values.service'; import { FormArray } from '@angular/forms/src/model'; @@ -16,7 +16,7 @@ import { FormArray } from '@angular/forms/src/model'; templateUrl: './attribute-release-form.component.html' }) export class AttributeReleaseFormComponent extends ProviderFormFragmentComponent implements OnInit, OnChanges, OnDestroy { - @Input() provider: MetadataProvider; + @Input() resolver: MetadataResolver; form: FormGroup; attributesToRelease: any[]; @@ -43,8 +43,8 @@ export class AttributeReleaseFormComponent extends ProviderFormFragmentComponent } ngOnChanges(): void { - this.provider.attributeRelease = this.provider.attributeRelease || []; - this.setAttributes(this.provider.attributeRelease); + this.resolver.attributeRelease = this.resolver.attributeRelease || []; + this.setAttributes(this.resolver.attributeRelease); } get attributeRelease(): FormArray { diff --git a/ui/src/app/metadata-provider/component/forms/descriptor-info-form.component.html b/ui/src/app/metadata/domain/component/forms/descriptor-info-form.component.html similarity index 100% rename from ui/src/app/metadata-provider/component/forms/descriptor-info-form.component.html rename to ui/src/app/metadata/domain/component/forms/descriptor-info-form.component.html diff --git a/ui/src/app/metadata-provider/component/forms/descriptor-info-form.component.spec.ts b/ui/src/app/metadata/domain/component/forms/descriptor-info-form.component.spec.ts similarity index 80% rename from ui/src/app/metadata-provider/component/forms/descriptor-info-form.component.spec.ts rename to ui/src/app/metadata/domain/component/forms/descriptor-info-form.component.spec.ts index 5f814a6a2..3885aebef 100644 --- a/ui/src/app/metadata-provider/component/forms/descriptor-info-form.component.spec.ts +++ b/ui/src/app/metadata/domain/component/forms/descriptor-info-form.component.spec.ts @@ -4,21 +4,20 @@ import { ReactiveFormsModule, FormBuilder, Validators } from '@angular/forms'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { StoreModule, Store, combineReducers } from '@ngrx/store'; import { ProviderValueEmitter, ProviderStatusEmitter } from '../../../domain/service/provider-change-emitter.service'; -import * as fromCollections from '../../../domain/reducer'; import { NgbPopoverModule, NgbPopoverConfig } from '@ng-bootstrap/ng-bootstrap/popover/popover.module'; import { ListValuesService } from '../../../domain/service/list-values.service'; -import { Provider } from '../../../domain/entity/provider'; +import { FileBackedHttpMetadataResolver } from '../../../domain/entity'; import { DescriptorInfoFormComponent } from './descriptor-info-form.component'; -import * as stubs from '../../../../testing/provider.stub'; -import { SharedModule } from '../../../shared/shared.module'; +import * as stubs from '../../../../../testing/resolver.stub'; +import { SharedModule } from '../../../../shared/shared.module'; @Component({ - template: `` + template: `` }) class TestHostComponent { - provider = new Provider({ - ...stubs.provider, + resolver = new FileBackedHttpMetadataResolver({ + ...stubs.resolver, serviceProviderSsoDescriptor: { protocolSupportEnum: 'foo', nameIdFormats: [] @@ -29,18 +28,17 @@ class TestHostComponent { public formUnderTest: DescriptorInfoFormComponent; changeProvider(opts: any): void { - this.provider = Object.assign({}, this.provider, opts); + this.resolver = Object.assign({}, this.resolver, opts); } addFormat(value: string): void { - this.provider.serviceProviderSsoDescriptor.nameIdFormats.push(value); + this.resolver.serviceProviderSsoDescriptor.nameIdFormats.push(value); } } describe('Descriptor Info Form Component', () => { let fixture: ComponentFixture; let instance: TestHostComponent; - let store: Store; let form: DescriptorInfoFormComponent; let fb: FormBuilder; @@ -55,9 +53,6 @@ describe('Descriptor Info Form Component', () => { imports: [ NoopAnimationsModule, ReactiveFormsModule, - StoreModule.forRoot({ - 'collections': combineReducers(fromCollections.reducers), - }), NgbPopoverModule, SharedModule ], @@ -66,8 +61,6 @@ describe('Descriptor Info Form Component', () => { TestHostComponent ], }); - store = TestBed.get(Store); - spyOn(store, 'dispatch').and.callThrough(); fixture = TestBed.createComponent(TestHostComponent); instance = fixture.componentInstance; diff --git a/ui/src/app/metadata-provider/component/forms/descriptor-info-form.component.ts b/ui/src/app/metadata/domain/component/forms/descriptor-info-form.component.ts similarity index 88% rename from ui/src/app/metadata-provider/component/forms/descriptor-info-form.component.ts rename to ui/src/app/metadata/domain/component/forms/descriptor-info-form.component.ts index dea3f26a2..89a824bc5 100644 --- a/ui/src/app/metadata-provider/component/forms/descriptor-info-form.component.ts +++ b/ui/src/app/metadata/domain/component/forms/descriptor-info-form.component.ts @@ -1,11 +1,11 @@ -import { Component, Output, Input, EventEmitter, OnInit, OnChanges, OnDestroy, ChangeDetectionStrategy } from '@angular/core'; +import { Component, Input, OnInit, OnChanges, OnDestroy, ChangeDetectionStrategy } from '@angular/core'; import { FormBuilder, FormGroup, FormControl, FormArray, Validators } from '@angular/forms'; import { Observable, of } from 'rxjs'; import { ProviderFormFragmentComponent } from './provider-form-fragment.component'; import { ProviderStatusEmitter, ProviderValueEmitter } from '../../../domain/service/provider-change-emitter.service'; -import { MetadataProvider, Organization, Contact } from '../../../domain/model/metadata-provider'; +import { MetadataResolver } from '../../../domain/model'; import { ListValuesService } from '../../../domain/service/list-values.service'; @Component({ @@ -14,7 +14,7 @@ import { ListValuesService } from '../../../domain/service/list-values.service'; templateUrl: './descriptor-info-form.component.html' }) export class DescriptorInfoFormComponent extends ProviderFormFragmentComponent implements OnInit, OnChanges, OnDestroy { - @Input() provider: MetadataProvider; + @Input() resolver: MetadataResolver; form: FormGroup; @@ -46,7 +46,7 @@ export class DescriptorInfoFormComponent extends ProviderFormFragmentComponent i } ngOnChanges(): void { - let descriptor = this.provider.serviceProviderSsoDescriptor; + let descriptor = this.resolver.serviceProviderSsoDescriptor; this.form.reset({ serviceProviderSsoDescriptor: descriptor || {} }); diff --git a/ui/src/app/metadata-provider/component/forms/finish-form.component.html b/ui/src/app/metadata/domain/component/forms/finish-form.component.html similarity index 82% rename from ui/src/app/metadata-provider/component/forms/finish-form.component.html rename to ui/src/app/metadata/domain/component/forms/finish-form.component.html index 6a6725ade..3a2cb51a7 100644 --- a/ui/src/app/metadata-provider/component/forms/finish-form.component.html +++ b/ui/src/app/metadata/domain/component/forms/finish-form.component.html @@ -23,11 +23,11 @@

    Service Provider Name (Dashboard Display Only)
    -
    {{ provider.serviceProviderName }}
    +
    {{ resolver.serviceProviderName }}
    Service Provider Entity ID
    -
    {{ provider.entityId }}
    +
    {{ resolver.entityId }}
    Enable this service?
    -
    {{ provider.serviceEnabled ? 'Yes' : 'No' }}
    +
    {{ resolver.serviceEnabled ? 'Yes' : 'No' }}
    @@ -35,17 +35,17 @@

    2 Organization Information -
    +
    Organization Name
    -
    {{ provider.organization.name }}
    +
    {{ resolver.organization.name }}
    Organization Display Name
    -
    {{ provider.organization.displayName }}
    +
    {{ resolver.organization.displayName }}
    Organization URL
    -
    {{ provider.organization.url }}
    +
    {{ resolver.organization.url }}
    Contact Information
    -

    - +

    +
    @@ -54,7 +54,7 @@

    - + @@ -69,21 +69,21 @@

    3 User Interface / MDUI Information -
    +
    Display Name
    -
    {{ provider.mdui.displayName }}
    +
    {{ resolver.mdui.displayName }}
    Information URL
    -
    {{ provider.mdui.informationUrl }}
    +
    {{ resolver.mdui.informationUrl }}
    Description
    -
    {{ provider.mdui.description }}
    +
    {{ resolver.mdui.description }}
    Privacy Statement URL
    -
    {{ provider.mdui.privacyStatementUrl }}
    +
    {{ resolver.mdui.privacyStatementUrl }}
    Logo URL
    -
    {{ provider.mdui.logoUrl }}
    +
    {{ resolver.mdui.logoUrl }}
    Logo Width
    -
    {{ provider.mdui.logoWidth }}
    +
    {{ resolver.mdui.logoWidth }}
    Logo Height
    -
    {{ provider.mdui.logoHeight }}
    +
    {{ resolver.mdui.logoHeight }}
    @@ -91,14 +91,14 @@

    4 SP SSO Descriptor Information -
    +
    Protocol Support Enumeration
    -
    {{ provider.serviceProviderSsoDescriptor.protocolSupportEnum }}
    +
    {{ resolver.serviceProviderSsoDescriptor.protocolSupportEnum }}
    NameID Format
    -

    -
      -
    • +

      +
        +
      • {{ format }}
      @@ -110,8 +110,8 @@

      5 Logout Endpoints -

      -

    Given Name
    {{ contact.name }} {{ contact.emailAddress }} {{ contact.type }}
    +

    +
    @@ -119,7 +119,7 @@

    - + @@ -133,17 +133,17 @@

    6 Security Information -
    +
    Is there a X509 Certificate?
    -
    {{ provider.securityInfo.x509CertificateAvailable ? 'Yes' : 'No' }}
    +
    {{ resolver.securityInfo.x509CertificateAvailable ? 'Yes' : 'No' }}
    Authentication Requests Signed?
    -
    {{ provider.securityInfo.authenticationRequestsSigned ? 'Yes' : 'No' }}
    +
    {{ resolver.securityInfo.authenticationRequestsSigned ? 'Yes' : 'No' }}
    Want Assertions Signed?
    -
    {{ provider.securityInfo.wantAssertionsSigned ? 'Yes' : 'No' }}
    +
    {{ resolver.securityInfo.wantAssertionsSigned ? 'Yes' : 'No' }}
    X509 Certificates
    -

    -

    Logout Endpoint
    {{ endpoint.url }} {{ endpoint.bindingType }}
    +

    +
    @@ -153,7 +153,7 @@

    - +
    X509 Certificates
    {{ cert.name }} {{ cert.type }}
    Assertion Consumer Service Endpoints
    -

    - +

    +
    @@ -184,7 +184,7 @@

    - + @@ -199,39 +199,39 @@

    8 Relying Party Overrides -
    +
    Sign the Assertion?
    -
    {{ provider.relyingPartyOverrides.signAssertion ? 'True' : 'False' }}
    +
    {{ resolver.relyingPartyOverrides.signAssertion ? 'True' : 'False' }}
    Don't Sign the Response?
    -
    {{ provider.relyingPartyOverrides.dontSignResponse ? 'True' : 'False' }}
    +
    {{ resolver.relyingPartyOverrides.dontSignResponse ? 'True' : 'False' }}
    Turn off Encryption of Response?
    -
    {{ provider.relyingPartyOverrides.turnOffEncryption ? 'True' : 'False' }}
    +
    {{ resolver.relyingPartyOverrides.turnOffEncryption ? 'True' : 'False' }}
    Use SHA1 Signing Algorithm?
    -
    {{ provider.relyingPartyOverrides.useSha ? 'True' : 'False' }}
    +
    {{ resolver.relyingPartyOverrides.useSha ? 'True' : 'False' }}
    NameID Format to Send
    -

    -
      -
    • +

      +
        +
      • {{ format }}
    Default Authentication Method(s)
    -

    -
      -
    1. +

      +
        +
      1. {{ method }}
    Ignore any SP-Requested Authentication Method?
    -
    {{ provider.relyingPartyOverrides.ignoreAuthenticationMethod ? 'True' : 'False' }}
    +
    {{ resolver.relyingPartyOverrides.ignoreAuthenticationMethod ? 'True' : 'False' }}
    Omit Not Before Condition?
    -
    {{ provider.relyingPartyOverrides.omitNotBefore ? 'True' : 'False' }}
    +
    {{ resolver.relyingPartyOverrides.omitNotBefore ? 'True' : 'False' }}
    ResponderID
    -
    {{ provider.relyingPartyOverrides.responderId }}
    +
    {{ resolver.relyingPartyOverrides.responderId }}
    @@ -239,7 +239,7 @@

    9 Attribute Release -

    #
    {{ i + 1 }} {{ service.locationUrl }} {{ service.binding }}
    +
    @@ -251,10 +251,10 @@

    diff --git a/ui/src/app/metadata-provider/component/forms/finish-form.component.scss b/ui/src/app/metadata/domain/component/forms/finish-form.component.scss similarity index 73% rename from ui/src/app/metadata-provider/component/forms/finish-form.component.scss rename to ui/src/app/metadata/domain/component/forms/finish-form.component.scss index 0f9488141..71ade4d37 100644 --- a/ui/src/app/metadata-provider/component/forms/finish-form.component.scss +++ b/ui/src/app/metadata/domain/component/forms/finish-form.component.scss @@ -1,4 +1,4 @@ -@import '../../../../theme/_palette'; +@import '../../../../../theme/_palette'; .value:empty { &::after { diff --git a/ui/src/app/metadata-provider/component/forms/finish-form.component.spec.ts b/ui/src/app/metadata/domain/component/forms/finish-form.component.spec.ts similarity index 72% rename from ui/src/app/metadata-provider/component/forms/finish-form.component.spec.ts rename to ui/src/app/metadata/domain/component/forms/finish-form.component.spec.ts index 2936c0832..6487bcfa8 100644 --- a/ui/src/app/metadata-provider/component/forms/finish-form.component.spec.ts +++ b/ui/src/app/metadata/domain/component/forms/finish-form.component.spec.ts @@ -3,40 +3,37 @@ import { TestBed, ComponentFixture } from '@angular/core/testing'; import { ReactiveFormsModule } from '@angular/forms'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { ActivatedRoute, Router } from '@angular/router'; -import { StoreModule, Store, combineReducers } from '@ngrx/store'; import { ProviderValueEmitter, ProviderStatusEmitter } from '../../../domain/service/provider-change-emitter.service'; -import * as fromCollections from '../../../domain/reducer'; import { NgbPopoverModule, NgbPopoverConfig } from '@ng-bootstrap/ng-bootstrap/popover/popover.module'; import { ListValuesService } from '../../../domain/service/list-values.service'; import { FinishFormComponent } from './finish-form.component'; -import { RouterStub, RouterLinkStubDirective } from '../../../../testing/router.stub'; -import { ActivatedRouteStub } from '../../../../testing/activated-route.stub'; +import { RouterStub, RouterLinkStubDirective } from '../../../../../testing/router.stub'; +import { ActivatedRouteStub } from '../../../../../testing/activated-route.stub'; -import * as stubs from '../../../../testing/provider.stub'; -import { InputDefaultsDirective } from '../../directive/input-defaults.directive'; -import { I18nTextComponent } from '../../../domain/component/i18n-text.component'; -import { Provider } from '../../../domain/entity/provider'; +import * as stubs from '../../../../../testing/resolver.stub'; +import { FileBackedHttpMetadataResolver } from '../../entity'; +import { InputDefaultsDirective } from '../../../../shared/directive/input-defaults.directive'; +import { I18nTextComponent } from '../../../../shared/component/i18n-text.component'; @Component({ - template: `` + template: `` }) class TestHostComponent { - provider = new Provider({ - ...stubs.provider + resolver = new FileBackedHttpMetadataResolver({ + ...stubs.resolver }); @ViewChild(FinishFormComponent) public formUnderTest: FinishFormComponent; changeProvider(opts: any): void { - this.provider = Object.assign({}, this.provider, opts); + this.resolver = Object.assign({}, this.resolver, opts); } } describe('Finished Form Component', () => { let fixture: ComponentFixture; let instance: TestHostComponent; - let store: Store; let form: FinishFormComponent; beforeEach(() => { @@ -52,9 +49,6 @@ describe('Finished Form Component', () => { imports: [ NoopAnimationsModule, ReactiveFormsModule, - StoreModule.forRoot({ - 'collections': combineReducers(fromCollections.reducers), - }), NgbPopoverModule ], declarations: [ @@ -65,8 +59,6 @@ describe('Finished Form Component', () => { TestHostComponent ], }); - store = TestBed.get(Store); - spyOn(store, 'dispatch').and.callThrough(); fixture = TestBed.createComponent(TestHostComponent); instance = fixture.componentInstance; @@ -88,9 +80,9 @@ describe('Finished Form Component', () => { expect(form.form.reset).toHaveBeenCalled(); }); - xit('should reset the form with serviceEnabled = false if no provider', () => { + xit('should reset the form with serviceEnabled = false if no resolver', () => { spyOn(form.form, 'reset').and.callThrough(); - delete instance.provider; + delete instance.resolver; fixture.detectChanges(); expect(form.form.reset).toHaveBeenCalled(); }); diff --git a/ui/src/app/metadata-provider/component/forms/finish-form.component.ts b/ui/src/app/metadata/domain/component/forms/finish-form.component.ts similarity index 70% rename from ui/src/app/metadata-provider/component/forms/finish-form.component.ts rename to ui/src/app/metadata/domain/component/forms/finish-form.component.ts index c645db916..f7a3a80df 100644 --- a/ui/src/app/metadata-provider/component/forms/finish-form.component.ts +++ b/ui/src/app/metadata/domain/component/forms/finish-form.component.ts @@ -1,9 +1,9 @@ -import { Component, Output, Input, EventEmitter, OnInit, OnChanges, OnDestroy, ChangeDetectionStrategy } from '@angular/core'; -import { FormBuilder, FormGroup, FormControl, Validators } from '@angular/forms'; +import { Component, Input, OnInit, OnChanges, OnDestroy, ChangeDetectionStrategy } from '@angular/core'; +import { FormBuilder, FormGroup } from '@angular/forms'; import { Observable } from 'rxjs'; import { ProviderFormFragmentComponent } from './provider-form-fragment.component'; import { ProviderStatusEmitter, ProviderValueEmitter } from '../../../domain/service/provider-change-emitter.service'; -import { MetadataProvider, Organization, Contact } from '../../../domain/model/metadata-provider'; +import { MetadataResolver } from '../../../domain/model'; import { ListValuesService } from '../../../domain/service/list-values.service'; @Component({ @@ -13,7 +13,7 @@ import { ListValuesService } from '../../../domain/service/list-values.service'; styleUrls: ['./finish-form.component.scss'] }) export class FinishFormComponent extends ProviderFormFragmentComponent implements OnInit, OnChanges, OnDestroy { - @Input() provider: MetadataProvider; + @Input() resolver: MetadataResolver; form: FormGroup; attributesToRelease$: Observable; @@ -25,7 +25,7 @@ export class FinishFormComponent extends ProviderFormFragmentComponent implement private listValues: ListValuesService ) { super(fb, statusEmitter, valueEmitter); - this.attributesToRelease$ = listValues.attributesToRelease; + this.attributesToRelease$ = this.listValues.attributesToRelease; } createForm(): void { @@ -36,7 +36,7 @@ export class FinishFormComponent extends ProviderFormFragmentComponent implement ngOnChanges(): void { this.form.reset({ - serviceEnabled: !this.provider ? false : this.provider.serviceEnabled !== false ? true : false + serviceEnabled: !this.resolver ? false : this.resolver.serviceEnabled !== false ? true : false }); } -} /* istanbul ignore next */ +} diff --git a/ui/src/app/metadata-provider/component/forms/key-info-form.component.html b/ui/src/app/metadata/domain/component/forms/key-info-form.component.html similarity index 100% rename from ui/src/app/metadata-provider/component/forms/key-info-form.component.html rename to ui/src/app/metadata/domain/component/forms/key-info-form.component.html diff --git a/ui/src/app/metadata-provider/component/forms/key-info-form.component.spec.ts b/ui/src/app/metadata/domain/component/forms/key-info-form.component.spec.ts similarity index 82% rename from ui/src/app/metadata-provider/component/forms/key-info-form.component.spec.ts rename to ui/src/app/metadata/domain/component/forms/key-info-form.component.spec.ts index 3be72cbdd..a271be071 100644 --- a/ui/src/app/metadata-provider/component/forms/key-info-form.component.spec.ts +++ b/ui/src/app/metadata/domain/component/forms/key-info-form.component.spec.ts @@ -2,24 +2,22 @@ import { Component, ViewChild } from '@angular/core'; import { TestBed, ComponentFixture } from '@angular/core/testing'; import { ReactiveFormsModule } from '@angular/forms'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { StoreModule, Store, combineReducers } from '@ngrx/store'; import { ProviderValueEmitter, ProviderStatusEmitter } from '../../../domain/service/provider-change-emitter.service'; -import * as fromCollections from '../../../domain/reducer'; import { NgbPopoverModule, NgbPopoverConfig } from '@ng-bootstrap/ng-bootstrap/popover/popover.module'; import { ListValuesService } from '../../../domain/service/list-values.service'; import { KeyInfoFormComponent } from './key-info-form.component'; -import { InputDefaultsDirective } from '../../directive/input-defaults.directive'; -import * as stubs from '../../../../testing/provider.stub'; -import { I18nTextComponent } from '../../../domain/component/i18n-text.component'; -import { Provider } from '../../../domain/entity/provider'; +import * as stubs from '../../../../../testing/resolver.stub'; +import { FileBackedHttpMetadataResolver } from '../../entity'; +import { InputDefaultsDirective } from '../../../../shared/directive/input-defaults.directive'; +import { I18nTextComponent } from '../../../../shared/component/i18n-text.component'; @Component({ - template: `` + template: `` }) class TestHostComponent { - provider = new Provider({ - ...stubs.provider, + resolver = new FileBackedHttpMetadataResolver({ + ...stubs.resolver, securityInfo: { ...stubs.secInfo, x509Certificates: [] @@ -30,14 +28,13 @@ class TestHostComponent { public formUnderTest: KeyInfoFormComponent; changeProvider(opts: any): void { - this.provider = Object.assign({}, this.provider, opts); + this.resolver = Object.assign({}, this.resolver, opts); } } describe('Security (Key) Info Form Component', () => { let fixture: ComponentFixture; let instance: TestHostComponent; - let store: Store; let form: KeyInfoFormComponent; beforeEach(() => { @@ -51,9 +48,6 @@ describe('Security (Key) Info Form Component', () => { imports: [ NoopAnimationsModule, ReactiveFormsModule, - StoreModule.forRoot({ - 'collections': combineReducers(fromCollections.reducers), - }), NgbPopoverModule ], declarations: [ @@ -63,8 +57,6 @@ describe('Security (Key) Info Form Component', () => { I18nTextComponent ], }).compileComponents(); - store = TestBed.get(Store); - spyOn(store, 'dispatch').and.callThrough(); fixture = TestBed.createComponent(TestHostComponent); instance = fixture.componentInstance; diff --git a/ui/src/app/metadata-provider/component/forms/key-info-form.component.ts b/ui/src/app/metadata/domain/component/forms/key-info-form.component.ts similarity index 86% rename from ui/src/app/metadata-provider/component/forms/key-info-form.component.ts rename to ui/src/app/metadata/domain/component/forms/key-info-form.component.ts index 0e8fe19e0..882b7c330 100644 --- a/ui/src/app/metadata-provider/component/forms/key-info-form.component.ts +++ b/ui/src/app/metadata/domain/component/forms/key-info-form.component.ts @@ -1,11 +1,11 @@ -import { Component, Output, Input, EventEmitter, OnInit, OnChanges, OnDestroy, ChangeDetectionStrategy } from '@angular/core'; -import { FormBuilder, FormGroup, FormControl, FormArray, Validators } from '@angular/forms'; +import { Component, Input, OnInit, OnChanges, OnDestroy, ChangeDetectionStrategy } from '@angular/core'; +import { FormBuilder, FormGroup, FormArray, Validators } from '@angular/forms'; import { Observable } from 'rxjs'; import { distinctUntilChanged, map, takeUntil } from 'rxjs/operators'; import { ProviderFormFragmentComponent } from './provider-form-fragment.component'; import { ProviderStatusEmitter, ProviderValueEmitter } from '../../../domain/service/provider-change-emitter.service'; -import { MetadataProvider, Certificate } from '../../../domain/model/metadata-provider'; +import { MetadataResolver, Certificate } from '../../../domain/model'; @Component({ selector: 'key-info-form', @@ -13,7 +13,7 @@ import { MetadataProvider, Certificate } from '../../../domain/model/metadata-pr templateUrl: './key-info-form.component.html' }) export class KeyInfoFormComponent extends ProviderFormFragmentComponent implements OnInit, OnChanges, OnDestroy { - @Input() provider: MetadataProvider; + @Input() resolver: MetadataResolver; hasCert$: Observable; @@ -97,14 +97,14 @@ export class KeyInfoFormComponent extends ProviderFormFragmentComponent implemen ngOnChanges(): void { this.form.reset({ - securityInfo: this.provider.securityInfo || { + securityInfo: this.resolver.securityInfo || { x509CertificateAvailable: false, authenticationRequestsSigned: false, wantAssertionsSigned: false } }); - if (this.provider.securityInfo && this.provider.securityInfo.x509CertificateAvailable) { - this.setCertificates(this.provider.securityInfo.x509Certificates); + if (this.resolver.securityInfo && this.resolver.securityInfo.x509CertificateAvailable) { + this.setCertificates(this.resolver.securityInfo.x509Certificates); } } } /* istanbul ignore next */ diff --git a/ui/src/app/metadata-provider/component/forms/logout-form.component.html b/ui/src/app/metadata/domain/component/forms/logout-form.component.html similarity index 100% rename from ui/src/app/metadata-provider/component/forms/logout-form.component.html rename to ui/src/app/metadata/domain/component/forms/logout-form.component.html diff --git a/ui/src/app/metadata-provider/component/forms/logout-form.component.spec.ts b/ui/src/app/metadata/domain/component/forms/logout-form.component.spec.ts similarity index 82% rename from ui/src/app/metadata-provider/component/forms/logout-form.component.spec.ts rename to ui/src/app/metadata/domain/component/forms/logout-form.component.spec.ts index c841cd668..33f32fd51 100644 --- a/ui/src/app/metadata-provider/component/forms/logout-form.component.spec.ts +++ b/ui/src/app/metadata/domain/component/forms/logout-form.component.spec.ts @@ -4,22 +4,21 @@ import { ReactiveFormsModule } from '@angular/forms'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { StoreModule, Store, combineReducers } from '@ngrx/store'; import { ProviderValueEmitter, ProviderStatusEmitter } from '../../../domain/service/provider-change-emitter.service'; -import * as fromCollections from '../../../domain/reducer'; import { NgbPopoverModule, NgbPopoverConfig } from '@ng-bootstrap/ng-bootstrap/popover/popover.module'; import { ListValuesService } from '../../../domain/service/list-values.service'; import { LogoutFormComponent } from './logout-form.component'; -import * as stubs from '../../../../testing/provider.stub'; -import { InputDefaultsDirective } from '../../directive/input-defaults.directive'; -import { I18nTextComponent } from '../../../domain/component/i18n-text.component'; -import { Provider } from '../../../domain/entity/provider'; +import * as stubs from '../../../../../testing/resolver.stub'; +import { FileBackedHttpMetadataResolver } from '../../entity'; +import { InputDefaultsDirective } from '../../../../shared/directive/input-defaults.directive'; +import { I18nTextComponent } from '../../../../shared/component/i18n-text.component'; @Component({ - template: `` + template: `` }) class TestHostComponent { - provider = new Provider({ - ...stubs.provider, + resolver = new FileBackedHttpMetadataResolver({ + ...stubs.resolver, logoutEndpoints: [stubs.logoutEndpoint] }); @@ -27,14 +26,13 @@ class TestHostComponent { public formUnderTest: LogoutFormComponent; changeProvider(opts: any): void { - this.provider = Object.assign({}, this.provider, opts); + this.resolver = Object.assign({}, this.resolver, opts); } } describe('Logout Endpoints Form Component', () => { let fixture: ComponentFixture; let instance: TestHostComponent; - let store: Store; let form: LogoutFormComponent; beforeEach(() => { @@ -48,9 +46,6 @@ describe('Logout Endpoints Form Component', () => { imports: [ NoopAnimationsModule, ReactiveFormsModule, - StoreModule.forRoot({ - 'collections': combineReducers(fromCollections.reducers), - }), NgbPopoverModule ], declarations: [ @@ -60,8 +55,6 @@ describe('Logout Endpoints Form Component', () => { I18nTextComponent ], }); - store = TestBed.get(Store); - spyOn(store, 'dispatch').and.callThrough(); fixture = TestBed.createComponent(TestHostComponent); instance = fixture.componentInstance; @@ -85,8 +78,8 @@ describe('Logout Endpoints Form Component', () => { describe('ngOnChanges method', () => { it('should add endpoints if provided', () => { - instance.provider = new Provider({ - ...stubs.provider + instance.resolver = new FileBackedHttpMetadataResolver({ + ...stubs.resolver }); fixture.detectChanges(); expect(form.logoutEndpoints.length).toBe(0); diff --git a/ui/src/app/metadata-provider/component/forms/logout-form.component.ts b/ui/src/app/metadata/domain/component/forms/logout-form.component.ts similarity index 76% rename from ui/src/app/metadata-provider/component/forms/logout-form.component.ts rename to ui/src/app/metadata/domain/component/forms/logout-form.component.ts index 981c336db..60b3b5f80 100644 --- a/ui/src/app/metadata-provider/component/forms/logout-form.component.ts +++ b/ui/src/app/metadata/domain/component/forms/logout-form.component.ts @@ -1,11 +1,9 @@ -import { Component, Output, Input, EventEmitter, OnInit, OnChanges, OnDestroy, ChangeDetectionStrategy } from '@angular/core'; -import { FormBuilder, FormGroup, FormControl, FormArray, Validators } from '@angular/forms'; -import { Observable } from 'rxjs'; +import { Component, Input, OnInit, OnChanges, OnDestroy, ChangeDetectionStrategy } from '@angular/core'; +import { FormBuilder, FormGroup, FormArray, Validators } from '@angular/forms'; import { ProviderFormFragmentComponent } from './provider-form-fragment.component'; import { ProviderStatusEmitter, ProviderValueEmitter } from '../../../domain/service/provider-change-emitter.service'; -import { MetadataProvider, LogoutEndpoint } from '../../../domain/model/metadata-provider'; -import * as patterns from '../../../shared/regex'; +import { MetadataResolver, LogoutEndpoint } from '../../../domain/model'; @Component({ selector: 'logout-form', @@ -13,7 +11,7 @@ import * as patterns from '../../../shared/regex'; templateUrl: './logout-form.component.html' }) export class LogoutFormComponent extends ProviderFormFragmentComponent implements OnInit, OnChanges, OnDestroy { - @Input() provider: MetadataProvider; + @Input() resolver: MetadataResolver; form: FormGroup; @@ -62,7 +60,7 @@ export class LogoutFormComponent extends ProviderFormFragmentComponent implement } ngOnChanges(): void { - this.provider.logoutEndpoints = this.provider.logoutEndpoints || []; - this.setEndpoints(this.provider.logoutEndpoints); + this.resolver.logoutEndpoints = this.resolver.logoutEndpoints || []; + this.setEndpoints(this.resolver.logoutEndpoints); } } /* istanbul ignore next */ diff --git a/ui/src/app/metadata-provider/component/forms/metadata-ui-form.component.html b/ui/src/app/metadata/domain/component/forms/metadata-ui-form.component.html similarity index 100% rename from ui/src/app/metadata-provider/component/forms/metadata-ui-form.component.html rename to ui/src/app/metadata/domain/component/forms/metadata-ui-form.component.html diff --git a/ui/src/app/metadata-provider/component/forms/metadata-ui-form.component.spec.ts b/ui/src/app/metadata/domain/component/forms/metadata-ui-form.component.spec.ts similarity index 69% rename from ui/src/app/metadata-provider/component/forms/metadata-ui-form.component.spec.ts rename to ui/src/app/metadata/domain/component/forms/metadata-ui-form.component.spec.ts index 961311ac4..6c85a9a09 100644 --- a/ui/src/app/metadata-provider/component/forms/metadata-ui-form.component.spec.ts +++ b/ui/src/app/metadata/domain/component/forms/metadata-ui-form.component.spec.ts @@ -2,38 +2,35 @@ import { ViewChild, Component, Input } from '@angular/core'; import { TestBed, ComponentFixture } from '@angular/core/testing'; import { ReactiveFormsModule } from '@angular/forms'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { StoreModule, Store, combineReducers } from '@ngrx/store'; import { ProviderValueEmitter, ProviderStatusEmitter } from '../../../domain/service/provider-change-emitter.service'; -import * as fromCollections from '../../../domain/reducer'; import { NgbPopoverModule, NgbPopoverConfig } from '@ng-bootstrap/ng-bootstrap/popover/popover.module'; import { ListValuesService } from '../../../domain/service/list-values.service'; -import { Provider } from '../../../domain/entity/provider'; import { MetadataUiFormComponent } from './metadata-ui-form.component'; -import * as stubs from '../../../../testing/provider.stub'; -import { InputDefaultsDirective } from '../../directive/input-defaults.directive'; -import { I18nTextComponent } from '../../../domain/component/i18n-text.component'; +import * as stubs from '../../../../../testing/resolver.stub'; +import { FileBackedHttpMetadataResolver } from '../../entity'; +import { InputDefaultsDirective } from '../../../../shared/directive/input-defaults.directive'; +import { I18nTextComponent } from '../../../../shared/component/i18n-text.component'; @Component({ - template: `` + template: `` }) class TestHostComponent { - provider = new Provider({ - ...stubs.provider + resolver = new FileBackedHttpMetadataResolver({ + ...stubs.resolver }); @ViewChild(MetadataUiFormComponent) public formUnderTest: MetadataUiFormComponent; changeProvider(opts: any): void { - this.provider = Object.assign({}, this.provider, opts); + this.resolver = Object.assign({}, this.resolver, opts); } } describe('Metadata UI Form Component', () => { let fixture: ComponentFixture; let instance: TestHostComponent; - let store: Store; let form: MetadataUiFormComponent; beforeEach(() => { @@ -47,20 +44,15 @@ describe('Metadata UI Form Component', () => { imports: [ NoopAnimationsModule, ReactiveFormsModule, - StoreModule.forRoot({ - 'collections': combineReducers(fromCollections.reducers), - }), NgbPopoverModule ], declarations: [ MetadataUiFormComponent, TestHostComponent, - I18nTextComponent, - InputDefaultsDirective + InputDefaultsDirective, + I18nTextComponent ], }); - store = TestBed.get(Store); - spyOn(store, 'dispatch').and.callThrough(); fixture = TestBed.createComponent(TestHostComponent); instance = fixture.componentInstance; diff --git a/ui/src/app/metadata-provider/component/forms/metadata-ui-form.component.ts b/ui/src/app/metadata/domain/component/forms/metadata-ui-form.component.ts similarity index 73% rename from ui/src/app/metadata-provider/component/forms/metadata-ui-form.component.ts rename to ui/src/app/metadata/domain/component/forms/metadata-ui-form.component.ts index 5bd8b0d6b..bde640cfc 100644 --- a/ui/src/app/metadata-provider/component/forms/metadata-ui-form.component.ts +++ b/ui/src/app/metadata/domain/component/forms/metadata-ui-form.component.ts @@ -1,10 +1,9 @@ -import { Component, Output, Input, EventEmitter, OnInit, OnChanges, OnDestroy, ChangeDetectionStrategy } from '@angular/core'; -import { FormBuilder, FormGroup, FormControl, Validators } from '@angular/forms'; -import { Observable } from 'rxjs'; +import { Component, Input, OnInit, OnChanges, OnDestroy, ChangeDetectionStrategy } from '@angular/core'; +import { FormBuilder, Validators } from '@angular/forms'; import { ProviderFormFragmentComponent } from './provider-form-fragment.component'; import { ProviderStatusEmitter, ProviderValueEmitter } from '../../../domain/service/provider-change-emitter.service'; -import { MetadataProvider, Organization, Contact } from '../../../domain/model/metadata-provider'; -import * as patterns from '../../../shared/regex'; +import { MetadataResolver } from '../../../domain/model'; +import * as patterns from '../../../../shared/regex'; @Component({ selector: 'metadata-ui-form', @@ -12,7 +11,7 @@ import * as patterns from '../../../shared/regex'; templateUrl: './metadata-ui-form.component.html' }) export class MetadataUiFormComponent extends ProviderFormFragmentComponent implements OnInit, OnChanges, OnDestroy { - @Input() provider: MetadataProvider; + @Input() resolver: MetadataResolver; descriptionMaxLength = this.defaultMaxLength; @@ -40,7 +39,7 @@ export class MetadataUiFormComponent extends ProviderFormFragmentComponent imple ngOnChanges(): void { this.form.reset({ - mdui: this.provider.mdui || {} + mdui: this.resolver.mdui || {} }); } } /* istanbul ignore next */ diff --git a/ui/src/app/metadata-provider/component/forms/organization-info-form.component.html b/ui/src/app/metadata/domain/component/forms/organization-info-form.component.html similarity index 100% rename from ui/src/app/metadata-provider/component/forms/organization-info-form.component.html rename to ui/src/app/metadata/domain/component/forms/organization-info-form.component.html diff --git a/ui/src/app/metadata-provider/component/forms/organization-info-form.component.spec.ts b/ui/src/app/metadata/domain/component/forms/organization-info-form.component.spec.ts similarity index 77% rename from ui/src/app/metadata-provider/component/forms/organization-info-form.component.spec.ts rename to ui/src/app/metadata/domain/component/forms/organization-info-form.component.spec.ts index 93ca34dd9..98ce05361 100644 --- a/ui/src/app/metadata-provider/component/forms/organization-info-form.component.spec.ts +++ b/ui/src/app/metadata/domain/component/forms/organization-info-form.component.spec.ts @@ -3,16 +3,14 @@ import { ReactiveFormsModule } from '@angular/forms'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { StoreModule, Store, combineReducers } from '@ngrx/store'; import { ProviderValueEmitter, ProviderStatusEmitter } from '../../../domain/service/provider-change-emitter.service'; -import * as fromCollections from '../../../domain/reducer'; import { NgbPopoverModule, NgbPopoverConfig } from '@ng-bootstrap/ng-bootstrap/popover/popover.module'; import { ListValuesService } from '../../../domain/service/list-values.service'; import { OrganizationInfoFormComponent } from './organization-info-form.component'; -import * as stubs from '../../../../testing/provider.stub'; +import * as stubs from '../../../../../testing/resolver.stub'; describe('Organization Info Form Component', () => { let fixture: ComponentFixture; let instance: OrganizationInfoFormComponent; - let store: Store; beforeEach(() => { TestBed.configureTestingModule({ @@ -25,17 +23,12 @@ describe('Organization Info Form Component', () => { imports: [ NoopAnimationsModule, ReactiveFormsModule, - StoreModule.forRoot({ - 'collections': combineReducers(fromCollections.reducers), - }), NgbPopoverModule ], declarations: [ OrganizationInfoFormComponent ], }); - store = TestBed.get(Store); - spyOn(store, 'dispatch').and.callThrough(); fixture = TestBed.createComponent(OrganizationInfoFormComponent); instance = fixture.componentInstance; @@ -48,18 +41,18 @@ describe('Organization Info Form Component', () => { describe('ngOnChanges method', () => { it('should set properties on the provider', () => { - instance.provider = stubs.provider; + instance.resolver = stubs.resolver; fixture.detectChanges(); instance.ngOnChanges(); - expect(instance.provider.organization).toEqual({}); - expect(instance.provider.contacts).toEqual([]); + expect(instance.resolver.organization).toEqual({}); + expect(instance.resolver.contacts).toEqual([]); }); }); describe('removeContact method', () => { it('should remove the contact at the given index', () => { - instance.provider = { - ...stubs.provider, + instance.resolver = { + ...stubs.resolver, contacts: [stubs.contact] }; fixture.detectChanges(); @@ -71,8 +64,8 @@ describe('Organization Info Form Component', () => { describe('addContact method', () => { it('should remove the contact at the given index', () => { - instance.provider = { - ...stubs.provider, + instance.resolver = { + ...stubs.resolver, contacts: [stubs.contact] }; fixture.detectChanges(); diff --git a/ui/src/app/metadata-provider/component/forms/organization-info-form.component.ts b/ui/src/app/metadata/domain/component/forms/organization-info-form.component.ts similarity index 87% rename from ui/src/app/metadata-provider/component/forms/organization-info-form.component.ts rename to ui/src/app/metadata/domain/component/forms/organization-info-form.component.ts index 8a1d2598f..6051e4bbb 100644 --- a/ui/src/app/metadata-provider/component/forms/organization-info-form.component.ts +++ b/ui/src/app/metadata/domain/component/forms/organization-info-form.component.ts @@ -4,10 +4,9 @@ import { Observable, Subscription } from 'rxjs'; import { startWith, map } from 'rxjs/operators'; import { ProviderStatusEmitter, ProviderValueEmitter } from '../../../domain/service/provider-change-emitter.service'; -import { MetadataProvider, Organization, Contact } from '../../../domain/model/metadata-provider'; +import { MetadataResolver, Contact } from '../../../domain/model'; import { ProviderFormFragmentComponent } from './provider-form-fragment.component'; import { EntityValidators } from '../../../domain/service/entity-validators.service'; -import * as patterns from '../../../shared/regex'; @Component({ selector: 'org-info-form', @@ -15,7 +14,7 @@ import * as patterns from '../../../shared/regex'; templateUrl: './organization-info-form.component.html' }) export class OrganizationInfoFormComponent extends ProviderFormFragmentComponent implements OnInit, OnChanges, OnDestroy { - @Input() provider: MetadataProvider; + @Input() resolver: MetadataResolver; contactTypes: string[] = [ 'support', @@ -60,12 +59,12 @@ export class OrganizationInfoFormComponent extends ProviderFormFragmentComponent } ngOnChanges(): void { - this.provider.organization = this.provider.organization || {}; - this.provider.contacts = this.provider.contacts || []; + this.resolver.organization = this.resolver.organization || {}; + this.resolver.contacts = this.resolver.contacts || []; this.form.reset({ - organization: this.provider.organization + organization: this.resolver.organization }); - this.setContacts(this.provider.contacts); + this.setContacts(this.resolver.contacts); } get contacts(): FormArray { diff --git a/ui/src/app/metadata-provider/component/forms/provider-form-fragment.component.spec.ts b/ui/src/app/metadata/domain/component/forms/provider-form-fragment.component.spec.ts similarity index 95% rename from ui/src/app/metadata-provider/component/forms/provider-form-fragment.component.spec.ts rename to ui/src/app/metadata/domain/component/forms/provider-form-fragment.component.spec.ts index 168004a41..290acaeaa 100644 --- a/ui/src/app/metadata-provider/component/forms/provider-form-fragment.component.spec.ts +++ b/ui/src/app/metadata/domain/component/forms/provider-form-fragment.component.spec.ts @@ -5,7 +5,7 @@ import { ProviderFormFragmentComponent } from './provider-form-fragment.componen import { ProviderValueEmitter, ProviderStatusEmitter } from '../../../domain/service/provider-change-emitter.service'; -describe('Provider Form Fragment Component', () => { +describe('Resolver Form Fragment Component', () => { let fixture: ComponentFixture; let instance: ProviderFormFragmentComponent; diff --git a/ui/src/app/metadata-provider/component/forms/provider-form-fragment.component.ts b/ui/src/app/metadata/domain/component/forms/provider-form-fragment.component.ts similarity index 74% rename from ui/src/app/metadata-provider/component/forms/provider-form-fragment.component.ts rename to ui/src/app/metadata/domain/component/forms/provider-form-fragment.component.ts index fa9796f5c..746dfe7f8 100644 --- a/ui/src/app/metadata-provider/component/forms/provider-form-fragment.component.ts +++ b/ui/src/app/metadata/domain/component/forms/provider-form-fragment.component.ts @@ -1,15 +1,14 @@ -import { Component, Input, Output, OnInit, OnDestroy, AfterViewInit, - ChangeDetectionStrategy, EventEmitter, ElementRef, ViewChildren } from '@angular/core'; -import { FormBuilder, FormGroup, FormControl, FormArray, FormControlName, Validators } from '@angular/forms'; +import { Component, Input, OnInit, OnDestroy, ChangeDetectionStrategy, ElementRef, ViewChildren } from '@angular/core'; +import { FormBuilder, FormGroup, FormControlName } from '@angular/forms'; import { Observable, Subject, Subscription } from 'rxjs'; import { takeUntil, startWith } from 'rxjs/operators'; import { ProviderStatusEmitter, ProviderValueEmitter } from '../../../domain/service/provider-change-emitter.service'; -import { MetadataProvider, Organization, Contact } from '../../../domain/model/metadata-provider'; +import { MetadataResolver } from '../../../domain/model'; -import * as constants from '../../../shared/constant'; -import { removeNulls } from '../../../shared/util'; +import * as constants from '../../../../shared/constant'; +import { removeNulls } from '../../../../shared/util'; @Component({ selector: 'provider-form-fragment', @@ -17,7 +16,7 @@ import { removeNulls } from '../../../shared/util'; template: `Foo` }) export class ProviderFormFragmentComponent implements OnInit, OnDestroy { - @Input() provider: MetadataProvider; + @Input() resolver: MetadataResolver; @ViewChildren(FormControlName, { read: ElementRef }) formInputElements: ElementRef[]; protected ngUnsubscribe: Subject = new Subject(); @@ -25,7 +24,7 @@ export class ProviderFormFragmentComponent implements OnInit, OnDestroy { protected statusEmitSubscription: Subscription; form: FormGroup; - provider$: Observable; + provider$: Observable; defaultMaxLength = constants.DEFAULT_FIELD_MAX_LENGTH; diff --git a/ui/src/app/metadata-provider/component/forms/relying-party-form.component.html b/ui/src/app/metadata/domain/component/forms/relying-party-form.component.html similarity index 100% rename from ui/src/app/metadata-provider/component/forms/relying-party-form.component.html rename to ui/src/app/metadata/domain/component/forms/relying-party-form.component.html diff --git a/ui/src/app/metadata-provider/component/forms/relying-party-form.component.spec.ts b/ui/src/app/metadata/domain/component/forms/relying-party-form.component.spec.ts similarity index 84% rename from ui/src/app/metadata-provider/component/forms/relying-party-form.component.spec.ts rename to ui/src/app/metadata/domain/component/forms/relying-party-form.component.spec.ts index 170699ec4..62017b66b 100644 --- a/ui/src/app/metadata-provider/component/forms/relying-party-form.component.spec.ts +++ b/ui/src/app/metadata/domain/component/forms/relying-party-form.component.spec.ts @@ -4,21 +4,20 @@ import { ReactiveFormsModule, FormBuilder, Validators } from '@angular/forms'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { StoreModule, Store, combineReducers } from '@ngrx/store'; import { ProviderValueEmitter, ProviderStatusEmitter } from '../../../domain/service/provider-change-emitter.service'; -import * as fromCollections from '../../../domain/reducer'; import { NgbPopoverModule, NgbPopoverConfig } from '@ng-bootstrap/ng-bootstrap/popover/popover.module'; import { ListValuesService } from '../../../domain/service/list-values.service'; import { RelyingPartyFormComponent } from './relying-party-form.component'; -import { Provider } from '../../../domain/entity/provider'; -import * as stubs from '../../../../testing/provider.stub'; -import { SharedModule } from '../../../shared/shared.module'; +import * as stubs from '../../../../../testing/resolver.stub'; +import { SharedModule } from '../../../../shared/shared.module'; +import { FileBackedHttpMetadataResolver } from '../../entity'; @Component({ - template: `` + template: `` }) class TestHostComponent { - provider = new Provider({ - ...stubs.provider, + resolver = new FileBackedHttpMetadataResolver({ + ...stubs.resolver, relyingPartyOverrides: { nameIdFormats: [], authenticationMethods: [] @@ -29,18 +28,17 @@ class TestHostComponent { public formUnderTest: RelyingPartyFormComponent; changeProvider(opts: any): void { - this.provider = Object.assign({}, this.provider, opts); + this.resolver = Object.assign({}, this.resolver, opts); } addString(collection: 'nameIdFormats' | 'authenticationMethods', value: string): void { - this.provider.relyingPartyOverrides[collection].push(value); + this.resolver.relyingPartyOverrides[collection].push(value); } } describe('Relying Party Form Component', () => { let fixture: ComponentFixture; let instance: TestHostComponent; - let store: Store; let form: RelyingPartyFormComponent; let fb: FormBuilder; @@ -55,9 +53,6 @@ describe('Relying Party Form Component', () => { imports: [ NoopAnimationsModule, ReactiveFormsModule, - StoreModule.forRoot({ - 'collections': combineReducers(fromCollections.reducers), - }), NgbPopoverModule, SharedModule ], @@ -66,8 +61,6 @@ describe('Relying Party Form Component', () => { TestHostComponent ], }); - store = TestBed.get(Store); - spyOn(store, 'dispatch').and.callThrough(); fixture = TestBed.createComponent(TestHostComponent); fb = TestBed.get(FormBuilder); diff --git a/ui/src/app/metadata-provider/component/forms/relying-party-form.component.ts b/ui/src/app/metadata/domain/component/forms/relying-party-form.component.ts similarity index 89% rename from ui/src/app/metadata-provider/component/forms/relying-party-form.component.ts rename to ui/src/app/metadata/domain/component/forms/relying-party-form.component.ts index 354995938..4aef6bff4 100644 --- a/ui/src/app/metadata-provider/component/forms/relying-party-form.component.ts +++ b/ui/src/app/metadata/domain/component/forms/relying-party-form.component.ts @@ -1,13 +1,12 @@ -import { Component, Output, Input, EventEmitter, OnInit, OnChanges, OnDestroy, ChangeDetectionStrategy } from '@angular/core'; +import { Component, Input, OnInit, OnChanges, OnDestroy, ChangeDetectionStrategy } from '@angular/core'; import { FormBuilder, FormGroup, FormControl, FormArray, Validators } from '@angular/forms'; import { Observable, of } from 'rxjs'; import { ProviderFormFragmentComponent } from './provider-form-fragment.component'; import { ProviderStatusEmitter, ProviderValueEmitter } from '../../../domain/service/provider-change-emitter.service'; import { ListValuesService } from '../../../domain/service/list-values.service'; -import { MetadataProvider, Organization, Contact } from '../../../domain/model/metadata-provider'; +import { MetadataResolver } from '../../../domain/model'; -import { URL_REGEX } from '../../../shared/regex'; @Component({ selector: 'relying-party-form', @@ -15,7 +14,7 @@ import { URL_REGEX } from '../../../shared/regex'; templateUrl: './relying-party-form.component.html' }) export class RelyingPartyFormComponent extends ProviderFormFragmentComponent implements OnInit, OnChanges, OnDestroy { - @Input() provider: MetadataProvider; + @Input() resolver: MetadataResolver; form: FormGroup; nameIds$: Observable = of([]); @@ -84,7 +83,7 @@ export class RelyingPartyFormComponent extends ProviderFormFragmentComponent imp } ngOnChanges(): void { - let overrides = this.provider.relyingPartyOverrides || {nameIdFormats: [], authenticationMethods: []}; + let overrides = this.resolver.relyingPartyOverrides || {nameIdFormats: [], authenticationMethods: []}; this.form.reset({ relyingPartyOverrides: overrides }); diff --git a/ui/src/app/metadata-provider/component/index.ts b/ui/src/app/metadata/domain/component/index.ts similarity index 84% rename from ui/src/app/metadata-provider/component/index.ts rename to ui/src/app/metadata/domain/component/index.ts index 3a676ac1a..238ff8d25 100644 --- a/ui/src/app/metadata-provider/component/index.ts +++ b/ui/src/app/metadata/domain/component/index.ts @@ -2,7 +2,7 @@ import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { ReactiveFormsModule } from '@angular/forms'; import { RouterModule } from '@angular/router'; -import { NgbPopoverModule, NgbPopoverConfig } from '@ng-bootstrap/ng-bootstrap/popover/popover.module'; +import { NgbPopoverModule } from '@ng-bootstrap/ng-bootstrap/popover/popover.module'; import { NgbModalModule } from '@ng-bootstrap/ng-bootstrap/modal/modal.module'; import { AdvancedInfoFormComponent } from './forms/advanced-info-form.component'; @@ -17,9 +17,7 @@ import { LogoutFormComponent } from './forms/logout-form.component'; import { FinishFormComponent } from './forms/finish-form.component'; import { ProviderFormFragmentComponent } from './forms/provider-form-fragment.component'; -import { InfoLabelDirective } from '../directive/info-label.directive'; -import { InputDefaultsDirective } from '../directive/input-defaults.directive'; -import { SharedModule } from '../../shared/shared.module'; +import { SharedModule } from '../../../shared/shared.module'; import { DomainModule } from '../../domain/domain.module'; export const COMPONENTS = [ @@ -38,8 +36,6 @@ export const COMPONENTS = [ export const declarations = [ ...COMPONENTS, - InfoLabelDirective, - InputDefaultsDirective ]; @NgModule({ diff --git a/ui/src/app/shared/preview/preview-dialog.component.html b/ui/src/app/metadata/domain/component/preview-dialog.component.html similarity index 100% rename from ui/src/app/shared/preview/preview-dialog.component.html rename to ui/src/app/metadata/domain/component/preview-dialog.component.html diff --git a/ui/src/app/metadata/domain/component/preview-dialog.component.ts b/ui/src/app/metadata/domain/component/preview-dialog.component.ts new file mode 100644 index 000000000..824d5be90 --- /dev/null +++ b/ui/src/app/metadata/domain/component/preview-dialog.component.ts @@ -0,0 +1,25 @@ +import { Component, Input } from '@angular/core'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; +import * as FileSaver from 'file-saver'; +import { Subscription } from 'rxjs/Subscription'; +import { MetadataEntity } from '../../domain/model'; + +@Component({ + selector: 'preview-dialog', + templateUrl: './preview-dialog.component.html' +}) +export class PreviewDialogComponent { + @Input() entity: MetadataEntity; + @Input() xml: string; + + sub: Subscription; + + constructor( + public activeModal: NgbActiveModal + ) {} + + preview(xml): void { + const blob = new Blob([xml], { type: 'text/xml;charset=utf-8' }); + FileSaver.saveAs(blob, `${ this.entity.name }.xml`); + } +} /* istanbul ignore next */ diff --git a/ui/src/app/domain/domain.module.ts b/ui/src/app/metadata/domain/domain.module.ts similarity index 53% rename from ui/src/app/domain/domain.module.ts rename to ui/src/app/metadata/domain/domain.module.ts index ac77546db..3349342d9 100644 --- a/ui/src/app/domain/domain.module.ts +++ b/ui/src/app/metadata/domain/domain.module.ts @@ -1,29 +1,24 @@ import { NgModule, ModuleWithProviders } from '@angular/core'; import { HttpModule } from '@angular/http'; -import { StoreModule } from '@ngrx/store'; import { EffectsModule } from '@ngrx/effects'; import { CommonModule } from '@angular/common'; -import { EntityDescriptorService } from './service/entity-descriptor.service'; +import { ResolverService } from './service/resolver.service'; import { ListValuesService } from './service/list-values.service'; import { ProviderStatusEmitter, ProviderValueEmitter } from './service/provider-change-emitter.service'; import { EntityIdService } from './service/entity-id.service'; -import { EntityDraftService } from './service/entity-draft.service'; +import { EntityDraftService } from './service/draft.service'; -import { reducers } from './reducer'; -import { DraftCollectionEffects } from './effect/draft-collection.effects'; -import { ProviderCollectionEffects } from './effect/provider-collection.effects'; -import { FilterCollectionEffects } from './effect/filter-collection.effect'; -import { MetadataResolverService } from './service/metadata-resolver.service'; +import { MetadataProviderService } from './service/provider.service'; import { EntityEffects } from './effect/entity.effect'; -import { PreviewDialogModule } from '../shared/preview/preview-dialog.module'; -import { I18nTextComponent } from './component/i18n-text.component'; +import { PreviewDialogComponent } from './component/preview-dialog.component'; -export const COMPONENTS = []; +export const COMPONENTS = [ + PreviewDialogComponent +]; export const DECLARATIONS = [ - ...COMPONENTS, - I18nTextComponent + ...COMPONENTS ]; @NgModule({ @@ -31,8 +26,7 @@ export const DECLARATIONS = [ entryComponents: COMPONENTS, imports: [ HttpModule, - CommonModule, - PreviewDialogModule + CommonModule ], exports: DECLARATIONS, providers: [] @@ -42,13 +36,13 @@ export class DomainModule { return { ngModule: RootDomainModule, providers: [ - EntityDescriptorService, + ResolverService, EntityIdService, EntityDraftService, ListValuesService, ProviderStatusEmitter, ProviderValueEmitter, - MetadataResolverService + MetadataProviderService ] }; } @@ -57,11 +51,7 @@ export class DomainModule { @NgModule({ imports: [ DomainModule, - StoreModule.forFeature('collections', reducers), EffectsModule.forFeature([ - FilterCollectionEffects, - DraftCollectionEffects, - ProviderCollectionEffects, EntityEffects ]) ], diff --git a/ui/src/app/metadata/domain/domain.type.ts b/ui/src/app/metadata/domain/domain.type.ts new file mode 100644 index 000000000..78def16d7 --- /dev/null +++ b/ui/src/app/metadata/domain/domain.type.ts @@ -0,0 +1,36 @@ +import { + MetadataProvider, + MetadataResolver, + MetadataFilter +} from './model'; + +import { + EntityAttributesFilter, + FileBackedHttpMetadataResolver, + FileBackedHttpMetadataProvider +} from './entity'; + +export type Filter = + | EntityAttributesFilter; + +export type Resolver = + | FileBackedHttpMetadataResolver; + +export type Provider = + | FileBackedHttpMetadataProvider; + +export type Entity = + | Filter + | Resolver + | Provider; + +export type Metadata = + | MetadataProvider + | MetadataResolver + | MetadataFilter; + +export enum MetadataTypes { + FILTER = '[Type] Metadata Filter', + PROVIDER = '[Type] Metadata Provider', + RESOLVER = '[Type] Metadata Resolver' +} diff --git a/ui/src/app/metadata/domain/domain.util.spec.ts b/ui/src/app/metadata/domain/domain.util.spec.ts new file mode 100644 index 000000000..548379455 --- /dev/null +++ b/ui/src/app/metadata/domain/domain.util.spec.ts @@ -0,0 +1,36 @@ +import * as util from './domain.util'; + +describe('Domain Utility methods', () => { + + describe('combineAllFn', () => { + it('should return true when the selected id is found', () => { + expect(util.combineAllFn(['foo'], ['bar'])).toEqual(['bar', 'foo']); + }); + }); + + describe('doesExistFn', () => { + it('should return true when the selected id is found', () => { + expect(util.doesExistFn(['foo', 'bar'], 'foo')).toBe(true); + }); + it('should return false when the selected id is not found', () => { + expect(util.doesExistFn(['foo'], 'bar')).toBe(false); + }); + }); + + describe('getInCollectionFn', () => { + const entities = { foo: {}, bar: {} }; + it('should return the entity with the given id', () => { + expect(util.getInCollectionFn(entities, 'foo')).toBe(entities.foo); + }); + it('should return null when provided a null id', () => { + expect(util.getInCollectionFn(entities, null)).toBeNull(); + }); + }); + + describe('getEntityIdsFn', () => { + const entities = [{ entityId: 'foo' }, { entityId: 'bar' }]; + it('should return a list of ids', () => { + expect(util.getEntityIdsFn(entities)).toEqual(['foo', 'bar']); + }); + }); +}); diff --git a/ui/src/app/metadata/domain/domain.util.ts b/ui/src/app/metadata/domain/domain.util.ts new file mode 100644 index 000000000..599ce04b7 --- /dev/null +++ b/ui/src/app/metadata/domain/domain.util.ts @@ -0,0 +1,10 @@ +/* + * Utility functions +*/ + +export const combineAllFn = (d, p) => [...p, ...d]; +export const doesExistFn = (ids, selected) => ids.indexOf(selected) > -1; +export const getInCollectionFn = (entities, selectedId) => { + return selectedId && entities[selectedId]; +}; +export const getEntityIdsFn = list => list.map(entity => entity.entityId); diff --git a/ui/src/app/domain/effect/entity.effect.spec.ts b/ui/src/app/metadata/domain/effect/entity.effect.spec.ts similarity index 80% rename from ui/src/app/domain/effect/entity.effect.spec.ts rename to ui/src/app/metadata/domain/effect/entity.effect.spec.ts index 25a14a107..d42817b6e 100644 --- a/ui/src/app/domain/effect/entity.effect.spec.ts +++ b/ui/src/app/metadata/domain/effect/entity.effect.spec.ts @@ -2,13 +2,13 @@ import { TestBed, tick, fakeAsync } from '@angular/core/testing'; import { Actions } from '@ngrx/effects'; import { of } from 'rxjs'; -import { TestActions, getActions } from '../../../testing/effect.util'; +import { TestActions, getActions } from '../../../../testing/effect.util'; import { EntityEffects } from './entity.effect'; import { EntityIdService } from '../service/entity-id.service'; -import { EntityDescriptorService } from '../service/entity-descriptor.service'; +import { ResolverService } from '../service/resolver.service'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { NgbModalStub } from '../../../testing/modal.stub'; -import { EntityAttributesFilter } from '../entity/entity-attributes.filter'; +import { NgbModalStub } from '../../../../testing/modal.stub'; +import { EntityAttributesFilter } from '../entity'; describe('Entity Effects', () => { let effects: EntityEffects; @@ -26,7 +26,7 @@ describe('Entity Effects', () => { useClass: NgbModalStub }, { - provide: EntityDescriptorService, + provide: ResolverService, useValue: { preview: () => {} }, }, { @@ -38,7 +38,7 @@ describe('Entity Effects', () => { }); effects = TestBed.get(EntityEffects); - providerService = TestBed.get(EntityDescriptorService); + providerService = TestBed.get(ResolverService); idService = TestBed.get(EntityIdService); modal = TestBed.get(NgbModal); actions$ = TestBed.get(Actions); diff --git a/ui/src/app/domain/effect/entity.effect.ts b/ui/src/app/metadata/domain/effect/entity.effect.ts similarity index 65% rename from ui/src/app/domain/effect/entity.effect.ts rename to ui/src/app/metadata/domain/effect/entity.effect.ts index 440f5dd45..4901b3828 100644 --- a/ui/src/app/domain/effect/entity.effect.ts +++ b/ui/src/app/metadata/domain/effect/entity.effect.ts @@ -3,12 +3,12 @@ import { Effect, Actions, ofType } from '@ngrx/effects'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { Observable } from 'rxjs'; -import { map, switchMap, tap } from 'rxjs/operators'; +import { map, tap } from 'rxjs/operators'; -import { EntityDescriptorService } from '../service/entity-descriptor.service'; -import { MetadataResolverService } from '../service/metadata-resolver.service'; -import { PreviewDialogComponent } from '../../shared/preview/preview-dialog.component'; -import { MetadataEntity, DomainEntityKinds } from '../domain.type'; +import { ResolverService } from '../service/resolver.service'; +import { PreviewDialogComponent } from '../component/preview-dialog.component'; +import { MetadataEntity } from '../model'; +import { MetadataTypes } from '../domain.type'; import { EntityIdService } from '../service/entity-id.service'; import * as entityActions from '../action/entity.action'; @@ -26,13 +26,13 @@ export class EntityEffects { constructor( private actions$: Actions, private modalService: NgbModal, - private providerService: EntityDescriptorService, + private providerService: ResolverService, private entityService: EntityIdService ) { } openModal(entity: MetadataEntity): void { - let request: Observable = entity.kind === DomainEntityKinds.filter ? - this.entityService.preview(entity.entityId) : this.providerService.preview(entity.id); + let request: Observable = entity.kind === MetadataTypes.FILTER ? + this.entityService.preview(entity.getId()) : this.providerService.preview(entity.getId()); request.subscribe(xml => { let modal = this.modalService.open(PreviewDialogComponent, { size: 'lg', diff --git a/ui/src/app/domain/entity/entity-attributes.filter.ts b/ui/src/app/metadata/domain/entity/filter/entity-attributes-filter.ts similarity index 71% rename from ui/src/app/domain/entity/entity-attributes.filter.ts rename to ui/src/app/metadata/domain/entity/filter/entity-attributes-filter.ts index b10cde00f..82b5ae9d6 100644 --- a/ui/src/app/domain/entity/entity-attributes.filter.ts +++ b/ui/src/app/metadata/domain/entity/filter/entity-attributes-filter.ts @@ -1,8 +1,8 @@ -import { MetadataFilter, RelyingPartyOverrides } from '../model/metadata-filter'; -import { DomainEntityKinds } from '../domain.type'; -import { FilterTarget } from '../model/filter-target'; +import { MetadataFilter, MetadataEntity, RelyingPartyOverrides } from '../../model'; +import { MetadataTypes } from '../../domain.type'; +import { FilterTarget } from '../../model'; -export class EntityAttributesFilter implements MetadataFilter { +export class EntityAttributesFilter implements MetadataFilter, MetadataEntity { createdDate?: string; modifiedDate?: string; version: string; @@ -29,6 +29,22 @@ export class EntityAttributesFilter implements MetadataFilter { Object.assign(this, { ...obj }); } + getId(): string { + return this.entityId; + } + + getDisplayId(): string { + return this.entityId; + } + + isDraft(): boolean { + return false; + } + + getCreationDate(): Date { + return new Date(this.createdDate); + } + get id(): string { return this.resourceId; } @@ -42,7 +58,7 @@ export class EntityAttributesFilter implements MetadataFilter { } get kind(): string { - return DomainEntityKinds.filter; + return MetadataTypes.FILTER; } get entityId(): string { diff --git a/ui/src/app/metadata/domain/entity/index.ts b/ui/src/app/metadata/domain/entity/index.ts new file mode 100644 index 000000000..1adb3735e --- /dev/null +++ b/ui/src/app/metadata/domain/entity/index.ts @@ -0,0 +1,3 @@ +export * from './filter/entity-attributes-filter'; +export * from './provider/file-backed-http-metadata-provider'; +export * from './resolver/file-backed-http-metadata-resolver'; diff --git a/ui/src/app/metadata/domain/entity/provider/file-backed-http-metadata-provider.spec.ts b/ui/src/app/metadata/domain/entity/provider/file-backed-http-metadata-provider.spec.ts new file mode 100644 index 000000000..37d74a6a8 --- /dev/null +++ b/ui/src/app/metadata/domain/entity/provider/file-backed-http-metadata-provider.spec.ts @@ -0,0 +1,104 @@ +import { FileBackedHttpMetadataProvider } from './file-backed-http-metadata-provider'; + +describe('Resolver construct', () => { + + const config = { + id: 'foo', + entityId: 'string', + serviceProviderName: 'string', + organization: { + 'name': 'string', + 'displayName': 'string', + 'url': 'string' + }, + contacts: [ + { + 'name': 'string', + 'type': 'string', + 'emailAddress': 'string' + } + ], + mdui: { + 'displayName': 'string', + 'informationUrl': 'string', + 'privacyStatementUrl': 'string', + 'logoUrl': 'string', + 'logoHeight': 100, + 'logoWidth': 100, + 'description': 'string' + }, + securityInfo: { + 'x509CertificateAvailable': true, + 'authenticationRequestsSigned': true, + 'wantAssertionsSigned': true, + 'x509Certificates': [ + { + 'name': 'string', + 'type': 'string', + 'value': 'string' + } + ] + }, + assertionConsumerServices: [ + { + 'binding': 'string', + 'locationUrl': 'string', + 'makeDefault': true + } + ], + serviceProviderSsoDescriptor: { + 'protocolSupportEnum': 'string', + 'nameIdFormats': [ + 'string' + ] + }, + + logoutEndpoints: [ + { + 'url': 'string', + 'bindingType': 'string' + } + ], + serviceEnabled: true, + createdDate: new Date().toDateString(), + modifiedDate: new Date().toDateString(), + relyingPartyOverrides: { + 'signAssertion': true, + 'dontSignResponse': true, + 'turnOffEncryption': true, + 'useSha': true, + 'ignoreAuthenticationMethod': true, + 'omitNotBefore': true, + 'responderId': 'string', + 'nameIdFormats': [ + 'string' + ], + 'authenticationMethods': [ + 'string' + ] + }, + attributeRelease: [ + 'eduPersonPrincipalName', + 'uid', + 'mail' + ] + }; + + let entity; + + beforeEach(() => { + entity = new FileBackedHttpMetadataProvider(config); + }); + + it('should populate its own values', () => { + Object.keys(config).forEach(key => { + expect(entity[key]).toEqual(config[key]); + }); + }); + + describe('interface methods', () => { + it('should return a date object from getCreationDate', () => { + expect(entity.getCreationDate()).toEqual(new Date(config.createdDate)); + }); + }); +}); diff --git a/ui/src/app/domain/entity/provider.ts b/ui/src/app/metadata/domain/entity/provider/file-backed-http-metadata-provider.ts similarity index 74% rename from ui/src/app/domain/entity/provider.ts rename to ui/src/app/metadata/domain/entity/provider/file-backed-http-metadata-provider.ts index 6d87d0bcd..41898afa5 100644 --- a/ui/src/app/domain/entity/provider.ts +++ b/ui/src/app/metadata/domain/entity/provider/file-backed-http-metadata-provider.ts @@ -1,5 +1,6 @@ import { MetadataProvider, + MetadataEntity, Organization, Contact, MDUI, @@ -9,10 +10,10 @@ import { SsoService, IdpSsoDescriptor, RelyingPartyOverrides -} from '../model/metadata-provider'; -import { DomainEntityKinds } from '../domain.type'; +} from '../../model'; +import { MetadataTypes } from '../../domain.type'; -export class Provider implements MetadataProvider { +export class FileBackedHttpMetadataProvider implements MetadataProvider, MetadataEntity { id = ''; createdDate?: string; modifiedDate?: string; @@ -51,6 +52,22 @@ export class Provider implements MetadataProvider { Object.assign(this, descriptor); } + getId(): string { + return this.id; + } + + getDisplayId(): string { + return this.id; + } + + isDraft(): boolean { + return false; + } + + getCreationDate(): Date { + return new Date(this.createdDate); + } + get name(): string { return this.serviceProviderName; } @@ -60,7 +77,7 @@ export class Provider implements MetadataProvider { } get kind(): string { - return DomainEntityKinds.provider; + return MetadataTypes.PROVIDER; } serialize(): any { diff --git a/ui/src/app/domain/entity/provider.spec.ts b/ui/src/app/metadata/domain/entity/resolver/file-backed-http-metadata-resolver.spec.ts similarity index 92% rename from ui/src/app/domain/entity/provider.spec.ts rename to ui/src/app/metadata/domain/entity/resolver/file-backed-http-metadata-resolver.spec.ts index c5607e257..669033c19 100644 --- a/ui/src/app/domain/entity/provider.spec.ts +++ b/ui/src/app/metadata/domain/entity/resolver/file-backed-http-metadata-resolver.spec.ts @@ -1,7 +1,6 @@ -import { Provider } from './provider'; -import { MetadataProvider } from '../model/metadata-provider'; +import { FileBackedHttpMetadataResolver } from './file-backed-http-metadata-resolver'; -describe('Provider construct', () => { +describe('Resolver construct', () => { const config = { id: 'foo', @@ -84,7 +83,7 @@ describe('Provider construct', () => { 'mail' ] }; - const entity = new Provider(config); + const entity = new FileBackedHttpMetadataResolver(config); it('should populate its own values', () => { Object.keys(config).forEach(key => { diff --git a/ui/src/app/metadata/domain/entity/resolver/file-backed-http-metadata-resolver.ts b/ui/src/app/metadata/domain/entity/resolver/file-backed-http-metadata-resolver.ts new file mode 100644 index 000000000..982d86d35 --- /dev/null +++ b/ui/src/app/metadata/domain/entity/resolver/file-backed-http-metadata-resolver.ts @@ -0,0 +1,86 @@ +import { + Organization, + Contact, + MDUI, + LogoutEndpoint, + SecurityInfo, + Certificate, + SsoService, + IdpSsoDescriptor, + RelyingPartyOverrides, + MetadataResolver +} from '../../model'; +import { MetadataTypes } from '../../domain.type'; +import { MetadataEntity } from '../../model/metadata-entity'; + +export class FileBackedHttpMetadataResolver implements MetadataResolver, MetadataEntity { + id = ''; + createdDate?: string; + modifiedDate?: string; + version: string; + + entityId = ''; + serviceProviderName = ''; + organization = {} as Organization; + contacts = [] as Contact[]; + mdui = {} as MDUI; + + securityInfo = { + x509CertificateAvailable: false, + authenticationRequestsSigned: false, + wantAssertionsSigned: false, + x509Certificates: [] as Certificate[] + } as SecurityInfo; + + assertionConsumerServices = [] as SsoService[]; + serviceProviderSsoDescriptor = { + nameIdFormats: [] + } as IdpSsoDescriptor; + + logoutEndpoints: LogoutEndpoint[] = []; + + serviceEnabled = false; + + relyingPartyOverrides = { + nameIdFormats: [] as string[], + authenticationMethods: [] as string[] + } as RelyingPartyOverrides; + + attributeRelease = [] as string[]; + + constructor(descriptor?: Partial) { + Object.assign(this, descriptor); + } + + getId(): string { + return this.id ? this.id : this.entityId; + } + + getDisplayId(): string { + return this.entityId; + } + + isDraft(): boolean { + return this.id ? false : true; + } + + getCreationDate(): Date { + return new Date(this.createdDate); + } + + get name(): string { + return this.serviceProviderName; + } + + get enabled(): boolean { + return this.serviceEnabled; + } + + get kind(): string { + return MetadataTypes.RESOLVER; + } + + serialize(): any { + return this; + } +} diff --git a/ui/src/app/metadata/domain/model/index.ts b/ui/src/app/metadata/domain/model/index.ts new file mode 100644 index 000000000..cd00d92fe --- /dev/null +++ b/ui/src/app/metadata/domain/model/index.ts @@ -0,0 +1,15 @@ +export * from './metadata-base'; +export * from './metadata-entity'; +export * from './metadata-filter'; +export * from './metadata-provider'; +export * from './metadata-resolver'; +export * from './properties/certificate'; +export * from './properties/contact'; +export * from './properties/filter-target'; +export * from './properties/logout-endpoint'; +export * from './properties/mdui'; +export * from './properties/organization'; +export * from './properties/relying-party-overrides'; +export * from './properties/security-info'; +export * from './properties/sso-descriptor'; +export * from './properties/sso-service'; diff --git a/ui/src/app/domain/model/metadata-base.ts b/ui/src/app/metadata/domain/model/metadata-base.ts similarity index 50% rename from ui/src/app/domain/model/metadata-base.ts rename to ui/src/app/metadata/domain/model/metadata-base.ts index fc5ea1ca7..2de4e32bf 100644 --- a/ui/src/app/domain/model/metadata-base.ts +++ b/ui/src/app/metadata/domain/model/metadata-base.ts @@ -2,11 +2,5 @@ export interface MetadataBase { id?: string; createdDate?: string; modifiedDate?: string; - version: string; - - name: string; - enabled: boolean; - kind: string; - - serialize(): any; + version?: string; } diff --git a/ui/src/app/metadata/domain/model/metadata-entity.ts b/ui/src/app/metadata/domain/model/metadata-entity.ts new file mode 100644 index 000000000..49d34a78a --- /dev/null +++ b/ui/src/app/metadata/domain/model/metadata-entity.ts @@ -0,0 +1,12 @@ +export interface MetadataEntity { + name: string; + enabled: boolean; + kind: string; + + getId(): string; + getDisplayId(): string; + isDraft(): boolean; + getCreationDate(): Date; + + serialize(): any; +} diff --git a/ui/src/app/domain/model/metadata-filter.ts b/ui/src/app/metadata/domain/model/metadata-filter.ts similarity index 84% rename from ui/src/app/domain/model/metadata-filter.ts rename to ui/src/app/metadata/domain/model/metadata-filter.ts index 869bbc3c0..093fc4cf6 100644 --- a/ui/src/app/domain/model/metadata-filter.ts +++ b/ui/src/app/metadata/domain/model/metadata-filter.ts @@ -9,5 +9,3 @@ export interface MetadataFilter extends MetadataBase { serialize(): any; } - -export * from './relying-party-overrides'; diff --git a/ui/src/app/metadata/domain/model/metadata-provider.ts b/ui/src/app/metadata/domain/model/metadata-provider.ts new file mode 100644 index 000000000..22da67257 --- /dev/null +++ b/ui/src/app/metadata/domain/model/metadata-provider.ts @@ -0,0 +1,25 @@ +import { + MetadataBase, + Organization, + Contact, + MDUI, + SecurityInfo, + SsoService, + IdpSsoDescriptor, + LogoutEndpoint, + RelyingPartyOverrides +} from '../model'; + +export interface MetadataProvider extends MetadataBase { + serviceProviderName: string; + organization?: Organization; + contacts?: Contact[]; + mdui?: MDUI; + securityInfo?: SecurityInfo; + assertionConsumerServices?: SsoService[]; + serviceProviderSsoDescriptor?: IdpSsoDescriptor; + logoutEndpoints?: LogoutEndpoint[]; + serviceEnabled?: boolean; + relyingPartyOverrides: RelyingPartyOverrides; + attributeRelease: string[]; +} diff --git a/ui/src/app/metadata/domain/model/metadata-resolver.ts b/ui/src/app/metadata/domain/model/metadata-resolver.ts new file mode 100644 index 000000000..431d9d448 --- /dev/null +++ b/ui/src/app/metadata/domain/model/metadata-resolver.ts @@ -0,0 +1,26 @@ +import { + MetadataBase, + Organization, + Contact, + MDUI, + SecurityInfo, + SsoService, + IdpSsoDescriptor, + LogoutEndpoint, + RelyingPartyOverrides +} from '../model'; + +export interface MetadataResolver extends MetadataBase { + entityId: string; + serviceProviderName: string; + organization?: Organization; + contacts?: Contact[]; + mdui?: MDUI; + securityInfo?: SecurityInfo; + assertionConsumerServices?: SsoService[]; + serviceProviderSsoDescriptor?: IdpSsoDescriptor; + logoutEndpoints?: LogoutEndpoint[]; + serviceEnabled?: boolean; + relyingPartyOverrides: RelyingPartyOverrides; + attributeRelease: string[]; +} diff --git a/ui/src/app/domain/model/certificate.ts b/ui/src/app/metadata/domain/model/properties/certificate.ts similarity index 97% rename from ui/src/app/domain/model/certificate.ts rename to ui/src/app/metadata/domain/model/properties/certificate.ts index e46be4e38..bb8ad9088 100644 --- a/ui/src/app/domain/model/certificate.ts +++ b/ui/src/app/metadata/domain/model/properties/certificate.ts @@ -2,4 +2,4 @@ export interface Certificate { name: string; type: string; value: string; -} \ No newline at end of file +} diff --git a/ui/src/app/domain/model/contact.ts b/ui/src/app/metadata/domain/model/properties/contact.ts similarity index 97% rename from ui/src/app/domain/model/contact.ts rename to ui/src/app/metadata/domain/model/properties/contact.ts index 1485522d5..52d1fe905 100644 --- a/ui/src/app/domain/model/contact.ts +++ b/ui/src/app/metadata/domain/model/properties/contact.ts @@ -2,4 +2,4 @@ export interface Contact { type: string; name: string; emailAddress: string; -} \ No newline at end of file +} diff --git a/ui/src/app/domain/model/filter-target.ts b/ui/src/app/metadata/domain/model/properties/filter-target.ts similarity index 100% rename from ui/src/app/domain/model/filter-target.ts rename to ui/src/app/metadata/domain/model/properties/filter-target.ts diff --git a/ui/src/app/domain/model/logout-endpoint.ts b/ui/src/app/metadata/domain/model/properties/logout-endpoint.ts similarity index 97% rename from ui/src/app/domain/model/logout-endpoint.ts rename to ui/src/app/metadata/domain/model/properties/logout-endpoint.ts index 9f149b4d2..31354277a 100644 --- a/ui/src/app/domain/model/logout-endpoint.ts +++ b/ui/src/app/metadata/domain/model/properties/logout-endpoint.ts @@ -1,4 +1,4 @@ export interface LogoutEndpoint { url: string; bindingType: string; -} \ No newline at end of file +} diff --git a/ui/src/app/domain/model/mdui.ts b/ui/src/app/metadata/domain/model/properties/mdui.ts similarity index 100% rename from ui/src/app/domain/model/mdui.ts rename to ui/src/app/metadata/domain/model/properties/mdui.ts diff --git a/ui/src/app/domain/model/organization.ts b/ui/src/app/metadata/domain/model/properties/organization.ts similarity index 100% rename from ui/src/app/domain/model/organization.ts rename to ui/src/app/metadata/domain/model/properties/organization.ts diff --git a/ui/src/app/domain/model/relying-party-overrides.ts b/ui/src/app/metadata/domain/model/properties/relying-party-overrides.ts similarity index 100% rename from ui/src/app/domain/model/relying-party-overrides.ts rename to ui/src/app/metadata/domain/model/properties/relying-party-overrides.ts diff --git a/ui/src/app/domain/model/security-info.ts b/ui/src/app/metadata/domain/model/properties/security-info.ts similarity index 100% rename from ui/src/app/domain/model/security-info.ts rename to ui/src/app/metadata/domain/model/properties/security-info.ts diff --git a/ui/src/app/domain/model/sso-descriptor.ts b/ui/src/app/metadata/domain/model/properties/sso-descriptor.ts similarity index 100% rename from ui/src/app/domain/model/sso-descriptor.ts rename to ui/src/app/metadata/domain/model/properties/sso-descriptor.ts diff --git a/ui/src/app/domain/model/sso-service.ts b/ui/src/app/metadata/domain/model/properties/sso-service.ts similarity index 100% rename from ui/src/app/domain/model/sso-service.ts rename to ui/src/app/metadata/domain/model/properties/sso-service.ts diff --git a/ui/src/app/domain/service/entity-draft.service.spec.ts b/ui/src/app/metadata/domain/service/draft.service.spec.ts similarity index 74% rename from ui/src/app/domain/service/entity-draft.service.spec.ts rename to ui/src/app/metadata/domain/service/draft.service.spec.ts index c30b8761a..bc88dc941 100644 --- a/ui/src/app/domain/service/entity-draft.service.spec.ts +++ b/ui/src/app/metadata/domain/service/draft.service.spec.ts @@ -1,9 +1,6 @@ import { TestBed } from '@angular/core/testing'; -import { HttpClientModule, HttpRequest, HttpParams } from '@angular/common/http'; -import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; -import { EntityDraftService } from './entity-draft.service'; -import { Provider } from '../entity/provider'; - +import { EntityDraftService } from './draft.service'; +import { FileBackedHttpMetadataResolver } from '../entity'; describe(`EntityDraftService`, () => { let service: EntityDraftService; @@ -20,7 +17,7 @@ describe(`EntityDraftService`, () => { describe('query', () => { it(`should return an observable of the list from the store`, (done: DoneFn) => { - let list = [new Provider()]; + let list = [new FileBackedHttpMetadataResolver()]; spyOn(service.storage, 'query').and.returnValue(list); service.query().subscribe(l => { expect(l).toEqual(list); @@ -31,7 +28,7 @@ describe(`EntityDraftService`, () => { describe('find', () => { it(`should return an observable of the list from the store`, (done: DoneFn) => { let id = 'foo'; - let e = new Provider({ entityId: id }); + let e = new FileBackedHttpMetadataResolver({ entityId: id }); let list = [e]; spyOn(service.storage, 'query').and.returnValue(list); service.find(id).subscribe(entity => { diff --git a/ui/src/app/domain/service/entity-draft.service.ts b/ui/src/app/metadata/domain/service/draft.service.ts similarity index 60% rename from ui/src/app/domain/service/entity-draft.service.ts rename to ui/src/app/metadata/domain/service/draft.service.ts index 687d4d441..a31f8c798 100644 --- a/ui/src/app/domain/service/entity-draft.service.ts +++ b/ui/src/app/metadata/domain/service/draft.service.ts @@ -3,23 +3,22 @@ import { Injectable } from '@angular/core'; import { Observable, of } from 'rxjs'; import { switchMap } from 'rxjs/operators'; -import { MetadataProvider } from '../../domain/model/metadata-provider'; -import { MOCK_DESCRIPTORS } from '../../../data/descriptors.mock'; -import { Storage } from '../../shared/storage'; +import { MetadataResolver } from '../../domain/model'; +import { Storage } from '../../../shared/storage'; @Injectable() export class EntityDraftService { - readonly storage: Storage; + readonly storage: Storage; constructor() { - this.storage = new Storage('provider_drafts'); + this.storage = new Storage('provider_drafts'); } - query(): Observable { + query(): Observable { return of(this.storage.query()); } - find(entityId: string): Observable { + find(entityId: string): Observable { return this.query().pipe( switchMap( list => of( @@ -29,17 +28,17 @@ export class EntityDraftService { ); } - save(provider: MetadataProvider): Observable { + save(provider: MetadataResolver): Observable { this.storage.add(provider); return of(provider); } - remove(provider: MetadataProvider): Observable { + remove(provider: MetadataResolver): Observable { this.storage.removeByAttr(provider.entityId, 'entityId'); return of(provider); } - update(provider: MetadataProvider): Observable { + update(provider: MetadataResolver): Observable { let stored = this.storage.findByAttr(provider.id, 'entityId'); stored = Object.assign({}, stored, provider); this.storage.removeByAttr(provider.entityId, 'entityId'); diff --git a/ui/src/app/domain/service/entity-id.service.spec.ts b/ui/src/app/metadata/domain/service/entity-id.service.spec.ts similarity index 100% rename from ui/src/app/domain/service/entity-id.service.spec.ts rename to ui/src/app/metadata/domain/service/entity-id.service.spec.ts diff --git a/ui/src/app/domain/service/entity-id.service.ts b/ui/src/app/metadata/domain/service/entity-id.service.ts similarity index 82% rename from ui/src/app/domain/service/entity-id.service.ts rename to ui/src/app/metadata/domain/service/entity-id.service.ts index f95e5d653..8daec78df 100644 --- a/ui/src/app/domain/service/entity-id.service.ts +++ b/ui/src/app/metadata/domain/service/entity-id.service.ts @@ -1,18 +1,11 @@ import { Injectable } from '@angular/core'; import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'; -import * as XmlFormatter from 'xml-formatter'; - import { Observable, Subject, throwError } from 'rxjs'; import { map, catchError } from 'rxjs/operators'; -import { IDS } from '../../../data/ids.mock'; -import { Storage } from '../../shared/storage'; -import { environment } from '../../../environments/environment'; -import { QueryParams } from '../../core/model/query'; -import { MDUI } from '../model/mdui'; - -const MOCK_INTERVAL = 500; +import { QueryParams } from '../../../core/model/query'; +import { MDUI } from '../model'; @Injectable() export class EntityIdService { diff --git a/ui/src/app/domain/service/entity-validators.service.spec.ts b/ui/src/app/metadata/domain/service/entity-validators.service.spec.ts similarity index 100% rename from ui/src/app/domain/service/entity-validators.service.spec.ts rename to ui/src/app/metadata/domain/service/entity-validators.service.spec.ts diff --git a/ui/src/app/domain/service/entity-validators.service.ts b/ui/src/app/metadata/domain/service/entity-validators.service.ts similarity index 96% rename from ui/src/app/domain/service/entity-validators.service.ts rename to ui/src/app/metadata/domain/service/entity-validators.service.ts index 0e7a26716..638ba0c63 100644 --- a/ui/src/app/domain/service/entity-validators.service.ts +++ b/ui/src/app/metadata/domain/service/entity-validators.service.ts @@ -1,7 +1,7 @@ import { Observable, of } from 'rxjs'; import { map, take, startWith } from 'rxjs/operators'; -import { AbstractControl, FormGroup } from '@angular/forms'; +import { AbstractControl } from '@angular/forms'; export class EntityValidators { static createUniqueIdValidator(ids$: Observable) { diff --git a/ui/src/app/domain/service/list-values.service.spec.ts b/ui/src/app/metadata/domain/service/list-values.service.spec.ts similarity index 100% rename from ui/src/app/domain/service/list-values.service.spec.ts rename to ui/src/app/metadata/domain/service/list-values.service.spec.ts diff --git a/ui/src/app/domain/service/list-values.service.ts b/ui/src/app/metadata/domain/service/list-values.service.ts similarity index 100% rename from ui/src/app/domain/service/list-values.service.ts rename to ui/src/app/metadata/domain/service/list-values.service.ts diff --git a/ui/src/app/domain/service/provider-change-emitter.service.spec.ts b/ui/src/app/metadata/domain/service/provider-change-emitter.service.spec.ts similarity index 96% rename from ui/src/app/domain/service/provider-change-emitter.service.spec.ts rename to ui/src/app/metadata/domain/service/provider-change-emitter.service.spec.ts index f77a10b01..97dba2257 100644 --- a/ui/src/app/domain/service/provider-change-emitter.service.spec.ts +++ b/ui/src/app/metadata/domain/service/provider-change-emitter.service.spec.ts @@ -4,7 +4,7 @@ import { Observable } from 'rxjs'; import { AbstractControl, FormBuilder, ReactiveFormsModule } from '@angular/forms'; import { ProviderStatusEmitter, ProviderValueEmitter } from './provider-change-emitter.service'; -describe(`Provider Change emitter service`, () => { +describe(`Resolver Change emitter service`, () => { beforeEach(() => { TestBed.configureTestingModule({ diff --git a/ui/src/app/domain/service/provider-change-emitter.service.ts b/ui/src/app/metadata/domain/service/provider-change-emitter.service.ts similarity index 100% rename from ui/src/app/domain/service/provider-change-emitter.service.ts rename to ui/src/app/metadata/domain/service/provider-change-emitter.service.ts diff --git a/ui/src/app/domain/service/metadata-resolver.service.spec.ts b/ui/src/app/metadata/domain/service/provider.service.spec.ts similarity index 78% rename from ui/src/app/domain/service/metadata-resolver.service.spec.ts rename to ui/src/app/metadata/domain/service/provider.service.spec.ts index 95c9840d5..814c413ac 100644 --- a/ui/src/app/domain/service/metadata-resolver.service.spec.ts +++ b/ui/src/app/metadata/domain/service/provider.service.spec.ts @@ -1,11 +1,10 @@ import { TestBed, async, inject } from '@angular/core/testing'; import { HttpTestingController, HttpClientTestingModule } from '@angular/common/http/testing'; import { HttpClientModule, HttpRequest } from '@angular/common/http'; -import { MetadataResolverService } from './metadata-resolver.service'; -import { EntityAttributesFilter } from '../entity/entity-attributes.filter'; +import { MetadataProviderService } from './provider.service'; +import { EntityAttributesFilter } from '../entity'; - -describe(`Metadata Resolver Service`, () => { +describe(`Metadata Provider Service`, () => { beforeEach(() => { TestBed.configureTestingModule({ @@ -14,26 +13,26 @@ describe(`Metadata Resolver Service`, () => { HttpClientTestingModule ], providers: [ - MetadataResolverService + MetadataProviderService ] }); }); describe('query method', () => { - it(`should send an expected GET[] request`, async(inject([MetadataResolverService, HttpTestingController], - (service: MetadataResolverService, backend: HttpTestingController) => { + it(`should send an expected GET[] request`, async(inject([MetadataProviderService, HttpTestingController], + (service: MetadataProviderService, backend: HttpTestingController) => { service.query().subscribe(); backend.expectOne((req: HttpRequest) => { - return req.url === `${service.base}${service.endpoint}s` + return req.url === `${service.base}${service.endpoint}` && req.method === 'GET'; }, `GET MetadataResolvers collection`); } ))); }); describe('find method', () => { - it(`should send an expected GET request`, async(inject([MetadataResolverService, HttpTestingController], - (service: MetadataResolverService, backend: HttpTestingController) => { + it(`should send an expected GET request`, async(inject([MetadataProviderService, HttpTestingController], + (service: MetadataProviderService, backend: HttpTestingController) => { const id = 'foo'; service.find(id).subscribe(); @@ -45,8 +44,8 @@ describe(`Metadata Resolver Service`, () => { ))); }); describe('update method', () => { - it(`should send an expected PUT request`, async(inject([MetadataResolverService, HttpTestingController], - (service: MetadataResolverService, backend: HttpTestingController) => { + it(`should send an expected PUT request`, async(inject([MetadataProviderService, HttpTestingController], + (service: MetadataProviderService, backend: HttpTestingController) => { const id = 'foo'; const filter = new EntityAttributesFilter({id}); service.update(filter).subscribe(); @@ -59,8 +58,8 @@ describe(`Metadata Resolver Service`, () => { ))); }); describe('save method', () => { - it(`should send an expected POST request`, async(inject([MetadataResolverService, HttpTestingController], - (service: MetadataResolverService, backend: HttpTestingController) => { + it(`should send an expected POST request`, async(inject([MetadataProviderService, HttpTestingController], + (service: MetadataProviderService, backend: HttpTestingController) => { const id = 'foo'; const filter = new EntityAttributesFilter({ id }); service.save(filter).subscribe(); diff --git a/ui/src/app/domain/service/metadata-resolver.service.ts b/ui/src/app/metadata/domain/service/provider.service.ts similarity index 89% rename from ui/src/app/domain/service/metadata-resolver.service.ts rename to ui/src/app/metadata/domain/service/provider.service.ts index db62a0a9d..0644e4ab8 100644 --- a/ui/src/app/domain/service/metadata-resolver.service.ts +++ b/ui/src/app/metadata/domain/service/provider.service.ts @@ -1,12 +1,11 @@ - import { Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { Observable } from 'rxjs'; -import { MetadataFilter } from '../../domain/model/metadata-filter'; +import { MetadataFilter } from '../../domain/model'; @Injectable() -export class MetadataResolverService { +export class MetadataProviderService { readonly endpoint = '/MetadataResolver/incommon/Filters'; readonly base = '/api'; diff --git a/ui/src/app/domain/service/entity-descriptor.service.spec.ts b/ui/src/app/metadata/domain/service/resolver.service.spec.ts similarity index 66% rename from ui/src/app/domain/service/entity-descriptor.service.spec.ts rename to ui/src/app/metadata/domain/service/resolver.service.spec.ts index 299733fb6..d4a32cbdc 100644 --- a/ui/src/app/domain/service/entity-descriptor.service.spec.ts +++ b/ui/src/app/metadata/domain/service/resolver.service.spec.ts @@ -1,10 +1,10 @@ import { TestBed, async, inject } from '@angular/core/testing'; -import { HttpClientModule, HttpRequest, HttpParams } from '@angular/common/http'; +import { HttpClientModule, HttpRequest } from '@angular/common/http'; import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; -import { EntityDescriptorService } from './entity-descriptor.service'; +import { ResolverService } from './resolver.service'; -describe(`EntityDescriptorService`, () => { +describe(`Resolver Service`, () => { beforeEach(() => { TestBed.configureTestingModule({ @@ -13,7 +13,7 @@ describe(`EntityDescriptorService`, () => { HttpClientTestingModule ], providers: [ - EntityDescriptorService + ResolverService ] }); }); @@ -23,8 +23,8 @@ describe(`EntityDescriptorService`, () => { })); describe('query', () => { - it(`should send an expected query request`, async(inject([EntityDescriptorService, HttpTestingController], - (service: EntityDescriptorService, backend: HttpTestingController) => { + it(`should send an expected query request`, async(inject([ResolverService, HttpTestingController], + (service: ResolverService, backend: HttpTestingController) => { service.query().subscribe(); backend.expectOne((req: HttpRequest) => { @@ -34,8 +34,8 @@ describe(`EntityDescriptorService`, () => { } ))); - xit(`should emit an empty array if an error is thrown`, async(inject([EntityDescriptorService, HttpTestingController], - (service: EntityDescriptorService, backend: HttpTestingController) => { + xit(`should emit an empty array if an error is thrown`, async(inject([ResolverService, HttpTestingController], + (service: ResolverService, backend: HttpTestingController) => { service.query().subscribe((next) => { expect(next).toEqual([]); }); @@ -44,8 +44,8 @@ describe(`EntityDescriptorService`, () => { } ))); - it(`should emit 'true' for 200 Ok`, async(inject([EntityDescriptorService, HttpTestingController], - (service: EntityDescriptorService, backend: HttpTestingController) => { + it(`should emit 'true' for 200 Ok`, async(inject([ResolverService, HttpTestingController], + (service: ResolverService, backend: HttpTestingController) => { service.query().subscribe((next) => { expect(next).toBeTruthy(); }); @@ -58,8 +58,8 @@ describe(`EntityDescriptorService`, () => { describe('find', () => { let id = 'foo'; - it(`should send an expected GET request`, async(inject([EntityDescriptorService, HttpTestingController], - (service: EntityDescriptorService, backend: HttpTestingController) => { + it(`should send an expected GET request`, async(inject([ResolverService, HttpTestingController], + (service: ResolverService, backend: HttpTestingController) => { service.find(id).subscribe(); backend.expectOne((req: HttpRequest) => { @@ -69,8 +69,8 @@ describe(`EntityDescriptorService`, () => { } ))); - xit(`should emit an error is thrown`, async(inject([EntityDescriptorService, HttpTestingController], - (service: EntityDescriptorService, backend: HttpTestingController) => { + xit(`should emit an error is thrown`, async(inject([ResolverService, HttpTestingController], + (service: ResolverService, backend: HttpTestingController) => { service.find(id).subscribe((next) => { expect(next).toBeFalsy(); }); @@ -79,8 +79,8 @@ describe(`EntityDescriptorService`, () => { } ))); - xit(`should emit 'true' for 200 Ok`, async(inject([EntityDescriptorService, HttpTestingController], - (service: EntityDescriptorService, backend: HttpTestingController) => { + xit(`should emit 'true' for 200 Ok`, async(inject([ResolverService, HttpTestingController], + (service: ResolverService, backend: HttpTestingController) => { service.find(id).subscribe((next) => { expect(next).toBeTruthy(); }); diff --git a/ui/src/app/domain/service/entity-descriptor.service.ts b/ui/src/app/metadata/domain/service/resolver.service.ts similarity index 55% rename from ui/src/app/domain/service/entity-descriptor.service.ts rename to ui/src/app/metadata/domain/service/resolver.service.ts index 9bc8c88eb..c3486de76 100644 --- a/ui/src/app/domain/service/entity-descriptor.service.ts +++ b/ui/src/app/metadata/domain/service/resolver.service.ts @@ -1,18 +1,11 @@ import { Injectable } from '@angular/core'; import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'; - import { Observable, throwError } from 'rxjs'; import { catchError } from 'rxjs/operators'; - -import { MetadataProvider } from '../../domain/model/metadata-provider'; -import { MOCK_DESCRIPTORS } from '../../../data/descriptors.mock'; -import { Storage } from '../../shared/storage'; -import { environment } from '../../../environments/environment'; -import { MetadataEntity } from '../domain.type'; - +import { MetadataResolver } from '../model'; @Injectable() -export class EntityDescriptorService { +export class ResolverService { private endpoint = '/EntityDescriptor'; private base = '/api'; @@ -21,42 +14,42 @@ export class EntityDescriptorService { private http: HttpClient ) {} - query(): Observable { - return this.http.get(`${ this.base }${ this.endpoint }s`, {}) + query(): Observable { + return this.http.get(`${ this.base }${ this.endpoint }s`, {}) .pipe( catchError(err => throwError([])) ); } - find(id: string): Observable { - return this.http.get(`${ this.base }${ this.endpoint }/${ id }`) + find(id: string): Observable { + return this.http.get(`${ this.base }${ this.endpoint }/${ id }`) .pipe( catchError(err => throwError(err)) ); } - update(provider: MetadataProvider): Observable { - return this.http.put(`${this.base}${this.endpoint}/${provider.id}`, provider); + update(provider: MetadataResolver): Observable { + return this.http.put(`${this.base}${this.endpoint}/${provider.id}`, provider); } - save(provider: MetadataProvider): Observable { - return this.http.post(`${this.base}${this.endpoint}`, provider); + save(provider: MetadataResolver): Observable { + return this.http.post(`${this.base}${this.endpoint}`, provider); } - remove(provider: MetadataProvider): Observable { - return this.http.delete(`${this.base}${this.endpoint}/${provider.id}`); + remove(provider: MetadataResolver): Observable { + return this.http.delete(`${this.base}${this.endpoint}/${provider.id}`); } - upload(name: string, xml: string): Observable { - return this.http.post(`${this.base}${this.endpoint}`, xml, { + upload(name: string, xml: string): Observable { + return this.http.post(`${this.base}${this.endpoint}`, xml, { headers: new HttpHeaders().set('Content-Type', 'application/xml'), params: new HttpParams().set('spName', name) }); } - createFromUrl(name: string, url: string): Observable { + createFromUrl(name: string, url: string): Observable { let body = `metadataUrl=${url}`; - return this.http.post(`${this.base}${this.endpoint}`, body, { + return this.http.post(`${this.base}${this.endpoint}`, body, { headers: new HttpHeaders().set('Content-Type', 'application/x-www-form-urlencoded'), params: new HttpParams().set('spName', name) }); diff --git a/ui/src/app/domain/action/filter-collection.action.ts b/ui/src/app/metadata/filter/action/collection.action.ts similarity index 100% rename from ui/src/app/domain/action/filter-collection.action.ts rename to ui/src/app/metadata/filter/action/collection.action.ts diff --git a/ui/src/app/metadata/filter/action/filter.action.spec.ts b/ui/src/app/metadata/filter/action/filter.action.spec.ts new file mode 100644 index 000000000..db844107e --- /dev/null +++ b/ui/src/app/metadata/filter/action/filter.action.spec.ts @@ -0,0 +1,8 @@ +import { FilterActionTypes, CancelCreateFilter, SelectId } from './filter.action'; + +describe('Filter Actions', () => { + it('should provide actions', () => { + expect(new CancelCreateFilter().type).toBe(FilterActionTypes.CANCEL_CREATE_FILTER); + expect(new SelectId('foo').type).toBe(FilterActionTypes.SELECT_ID); + }); +}); diff --git a/ui/src/app/metadata-filter/action/filter.action.ts b/ui/src/app/metadata/filter/action/filter.action.ts similarity index 50% rename from ui/src/app/metadata-filter/action/filter.action.ts rename to ui/src/app/metadata/filter/action/filter.action.ts index af0f6f4c0..ad9ef8d28 100644 --- a/ui/src/app/metadata-filter/action/filter.action.ts +++ b/ui/src/app/metadata/filter/action/filter.action.ts @@ -1,51 +1,49 @@ import { Action } from '@ngrx/store'; - -import { QueryParams } from '../../core/model/query'; import { MetadataFilter } from '../../domain/model/metadata-filter'; -import { MDUI } from '../../domain/model/mdui'; - -export const SELECT_ID = '[Filter] Select Entity ID'; - -export const UPDATE_FILTER = '[Filter] Update Filter'; -export const CANCEL_CREATE_FILTER = '[Filter] Cancel Create Filter'; - -export const LOAD_ENTITY_PREVIEW = '[Filter] Load Preview data'; -export const LOAD_ENTITY_PREVIEW_SUCCESS = '[Filter] Load Preview data success'; -export const LOAD_ENTITY_PREVIEW_ERROR = '[Filter] Load Preview data error'; +import { MDUI } from '../../domain/model'; + +export enum FilterActionTypes { + SELECT_ID = '[Filter] Select Entity ID', + UPDATE_FILTER = '[Filter] Update Filter', + CANCEL_CREATE_FILTER = '[Filter] Cancel Create Filter', + LOAD_ENTITY_PREVIEW = '[Filter] Load Preview data', + LOAD_ENTITY_PREVIEW_SUCCESS = '[Filter] Load Preview data success', + LOAD_ENTITY_PREVIEW_ERROR = '[Filter] Load Preview data error' +} export class SelectId implements Action { - readonly type = SELECT_ID; + readonly type = FilterActionTypes.SELECT_ID; constructor(public payload: string) { } } export class LoadEntityPreview implements Action { - readonly type = LOAD_ENTITY_PREVIEW; + readonly type = FilterActionTypes.LOAD_ENTITY_PREVIEW; constructor(public payload: string) { } } export class LoadEntityPreviewSuccess implements Action { - readonly type = LOAD_ENTITY_PREVIEW_SUCCESS; + readonly type = FilterActionTypes.LOAD_ENTITY_PREVIEW_SUCCESS; constructor(public payload: MDUI) { } } export class LoadEntityPreviewError implements Action { - readonly type = LOAD_ENTITY_PREVIEW_ERROR; + readonly type = FilterActionTypes.LOAD_ENTITY_PREVIEW_ERROR; constructor(public payload: string) { } } export class CancelCreateFilter implements Action { - readonly type = CANCEL_CREATE_FILTER; + readonly type = FilterActionTypes.CANCEL_CREATE_FILTER; } export class UpdateFilterChanges implements Action { - readonly type = UPDATE_FILTER; + readonly type = FilterActionTypes.UPDATE_FILTER; constructor(public payload: Partial) { } } -export type Actions = +export type FilterActionsUnion = | SelectId | UpdateFilterChanges | CancelCreateFilter diff --git a/ui/src/app/metadata-filter/action/search.action.spec.ts b/ui/src/app/metadata/filter/action/search.action.spec.ts similarity index 100% rename from ui/src/app/metadata-filter/action/search.action.spec.ts rename to ui/src/app/metadata/filter/action/search.action.spec.ts diff --git a/ui/src/app/metadata/filter/action/search.action.ts b/ui/src/app/metadata/filter/action/search.action.ts new file mode 100644 index 000000000..cd9638a54 --- /dev/null +++ b/ui/src/app/metadata/filter/action/search.action.ts @@ -0,0 +1,52 @@ +import { Action } from '@ngrx/store'; + +import { QueryParams } from '../../../core/model/query'; + +export enum SearchActionTypes { + QUERY_ENTITY_IDS = '[Filter] Query Entity Ids', + VIEW_MORE_IDS = '[Filter] View More Ids Modal', + CANCEL_VIEW_MORE = '[Filter] Cancel View More', + CLEAR_SEARCH = '[Filter] Clear Search', + LOAD_ENTITY_IDS_SUCCESS = '[Entity ID Collection] Load Entity Ids Success', + LOAD_ENTITY_IDS_ERROR = '[Entity ID Collection] Load Entity Ids Error' +} + +export class QueryEntityIds implements Action { + readonly type = SearchActionTypes.QUERY_ENTITY_IDS; + + constructor(public payload: QueryParams) { } +} + +export class ViewMoreIds implements Action { + readonly type = SearchActionTypes.VIEW_MORE_IDS; + + constructor(public payload: string) { } +} + +export class ClearSearch implements Action { + readonly type = SearchActionTypes.CLEAR_SEARCH; +} + +export class CancelViewMore implements Action { + readonly type = SearchActionTypes.CANCEL_VIEW_MORE; +} + +export class LoadEntityIdsSuccess implements Action { + readonly type = SearchActionTypes.LOAD_ENTITY_IDS_SUCCESS; + + constructor(public payload: string[]) { } +} + +export class LoadEntityIdsError implements Action { + readonly type = SearchActionTypes.LOAD_ENTITY_IDS_ERROR; + + constructor(public payload: Error) { } +} + +export type SearchActionsUnion = + | ViewMoreIds + | CancelViewMore + | ClearSearch + | LoadEntityIdsSuccess + | LoadEntityIdsError + | QueryEntityIds; diff --git a/ui/src/app/metadata-filter/component/search-dialog.component.html b/ui/src/app/metadata/filter/component/search-dialog.component.html similarity index 100% rename from ui/src/app/metadata-filter/component/search-dialog.component.html rename to ui/src/app/metadata/filter/component/search-dialog.component.html diff --git a/ui/src/app/metadata-filter/component/search-dialog.component.scss b/ui/src/app/metadata/filter/component/search-dialog.component.scss similarity index 100% rename from ui/src/app/metadata-filter/component/search-dialog.component.scss rename to ui/src/app/metadata/filter/component/search-dialog.component.scss diff --git a/ui/src/app/metadata-filter/component/search-dialog.component.spec.ts b/ui/src/app/metadata/filter/component/search-dialog.component.spec.ts similarity index 82% rename from ui/src/app/metadata-filter/component/search-dialog.component.spec.ts rename to ui/src/app/metadata/filter/component/search-dialog.component.spec.ts index aa86d0289..82144a232 100644 --- a/ui/src/app/metadata-filter/component/search-dialog.component.spec.ts +++ b/ui/src/app/metadata/filter/component/search-dialog.component.spec.ts @@ -1,11 +1,11 @@ import { TestBed, ComponentFixture } from '@angular/core/testing'; -import { ReactiveFormsModule, FormBuilder } from '@angular/forms'; -import { NgbModalModule, NgbModal, NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; +import { ReactiveFormsModule } from '@angular/forms'; +import { NgbModalModule, NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; import { StoreModule, Store, combineReducers } from '@ngrx/store'; import { SearchDialogComponent } from './search-dialog.component'; -import { NgbActiveModalStub } from '../../../testing/modal.stub'; +import { NgbActiveModalStub } from '../../../../testing/modal.stub'; import * as fromFilter from '../reducer'; -import { SharedModule } from '../../shared/shared.module'; +import { SharedModule } from '../../../shared/shared.module'; describe('Search Dialog', () => { let fixture: ComponentFixture; @@ -21,7 +21,7 @@ describe('Search Dialog', () => { ReactiveFormsModule, NgbModalModule, StoreModule.forRoot({ - 'metadata-filter': combineReducers(fromFilter.reducers), + 'filter': combineReducers(fromFilter.reducers), }), SharedModule ], diff --git a/ui/src/app/metadata-filter/component/search-dialog.component.ts b/ui/src/app/metadata/filter/component/search-dialog.component.ts similarity index 95% rename from ui/src/app/metadata-filter/component/search-dialog.component.ts rename to ui/src/app/metadata/filter/component/search-dialog.component.ts index 41f75be8b..545684077 100644 --- a/ui/src/app/metadata-filter/component/search-dialog.component.ts +++ b/ui/src/app/metadata/filter/component/search-dialog.component.ts @@ -1,5 +1,5 @@ import { Component, AfterViewInit, Input, OnInit, SimpleChange, SimpleChanges } from '@angular/core'; -import { NgbModal, NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; import { Observable } from 'rxjs'; import { Store } from '@ngrx/store'; diff --git a/ui/src/app/metadata-filter/container/edit-filter.component.html b/ui/src/app/metadata/filter/container/edit-filter.component.html similarity index 98% rename from ui/src/app/metadata-filter/container/edit-filter.component.html rename to ui/src/app/metadata/filter/container/edit-filter.component.html index fb26a3a62..2a2267d26 100644 --- a/ui/src/app/metadata-filter/container/edit-filter.component.html +++ b/ui/src/app/metadata/filter/container/edit-filter.component.html @@ -171,10 +171,10 @@
    - +
    - +
    diff --git a/ui/src/app/metadata-filter/container/edit-filter.component.spec.ts b/ui/src/app/metadata/filter/container/edit-filter.component.spec.ts similarity index 100% rename from ui/src/app/metadata-filter/container/edit-filter.component.spec.ts rename to ui/src/app/metadata/filter/container/edit-filter.component.spec.ts diff --git a/ui/src/app/metadata-filter/container/edit-filter.component.ts b/ui/src/app/metadata/filter/container/edit-filter.component.ts similarity index 91% rename from ui/src/app/metadata-filter/container/edit-filter.component.ts rename to ui/src/app/metadata/filter/container/edit-filter.component.ts index b1581c8a4..41d10a3e9 100644 --- a/ui/src/app/metadata-filter/container/edit-filter.component.ts +++ b/ui/src/app/metadata/filter/container/edit-filter.component.ts @@ -4,21 +4,20 @@ import { Store } from '@ngrx/store'; import { Observable, Subject } from 'rxjs'; import { withLatestFrom, distinctUntilChanged, takeUntil, startWith, filter } from 'rxjs/operators'; -import * as fromRoot from '../../app.reducer'; +import * as fromRoot from '../../../app.reducer'; import * as fromFilter from '../reducer'; -import * as fromCollection from '../../domain/reducer'; import { ProviderValueEmitter } from '../../domain/service/provider-change-emitter.service'; import { CancelCreateFilter, SelectId, UpdateFilterChanges } from '../action/filter.action'; -import { UpdateFilterRequest } from '../../domain/action/filter-collection.action'; +import { UpdateFilterRequest } from '../../filter/action/collection.action'; import { MetadataFilter } from '../../domain/model/metadata-filter'; import { EntityValidators } from '../../domain/service/entity-validators.service'; import { QueryEntityIds, ViewMoreIds, ClearSearch } from '../action/search.action'; -import { AutoCompleteComponent } from '../../shared/autocomplete/autocomplete.component'; -import { MDUI } from '../../domain/model/mdui'; +import { AutoCompleteComponent } from '../../../shared/autocomplete/autocomplete.component'; +import { MDUI } from '../../domain/model'; import { PreviewEntity } from '../../domain/action/entity.action'; -import { MetadataEntity } from '../../domain/domain.type'; -import { EntityAttributesFilter } from '../../domain/entity/entity-attributes.filter'; +import { MetadataEntity } from '../../domain/model'; +import { EntityAttributesFilter } from '../../domain/entity/filter/entity-attributes-filter'; @Component({ selector: 'edit-filter-page', @@ -73,7 +72,7 @@ export class EditFilterComponent implements OnInit, OnDestroy { this.showMore$ = this.store.select(fromFilter.getViewingMore); this.selected$ = this.store.select(fromFilter.getSelected); - this.filter$ = this.store.select(fromCollection.getSelectedFilter); + this.filter$ = this.store.select(fromFilter.getSelectedFilter); this.entityIds$ = this.store.select(fromFilter.getEntityCollection); this.loading$ = this.store.select(fromFilter.getIsLoading); this.processing$ = this.loading$.pipe(withLatestFrom(this.showMore$, (l, s) => !s && l)); diff --git a/ui/src/app/metadata-filter/container/filter.component.html b/ui/src/app/metadata/filter/container/filter.component.html similarity index 100% rename from ui/src/app/metadata-filter/container/filter.component.html rename to ui/src/app/metadata/filter/container/filter.component.html diff --git a/ui/src/app/metadata-filter/container/filter.component.scss b/ui/src/app/metadata/filter/container/filter.component.scss similarity index 100% rename from ui/src/app/metadata-filter/container/filter.component.scss rename to ui/src/app/metadata/filter/container/filter.component.scss diff --git a/ui/src/app/metadata-filter/container/filter.component.spec.ts b/ui/src/app/metadata/filter/container/filter.component.spec.ts similarity index 100% rename from ui/src/app/metadata-filter/container/filter.component.spec.ts rename to ui/src/app/metadata/filter/container/filter.component.spec.ts diff --git a/ui/src/app/metadata-filter/container/filter.component.ts b/ui/src/app/metadata/filter/container/filter.component.ts similarity index 78% rename from ui/src/app/metadata-filter/container/filter.component.ts rename to ui/src/app/metadata/filter/container/filter.component.ts index b7d139423..2f2d0aa44 100644 --- a/ui/src/app/metadata-filter/container/filter.component.ts +++ b/ui/src/app/metadata/filter/container/filter.component.ts @@ -6,9 +6,8 @@ import { Store } from '@ngrx/store'; import { NgbPopoverConfig } from '@ng-bootstrap/ng-bootstrap'; import { MetadataFilter } from '../../domain/model/metadata-filter'; -import { SelectFilter } from '../../domain/action/filter-collection.action'; -import * as fromFilters from '../reducer'; -import * as fromCollection from '../../domain/reducer'; +import { SelectFilter } from '../action/collection.action'; +import * as fromFilter from '../reducer'; @Component({ @@ -22,7 +21,7 @@ export class FilterComponent implements OnDestroy { filter$: Observable; constructor( - private store: Store, + private store: Store, private route: ActivatedRoute ) { this.actionsSubscription = this.route.params.pipe( @@ -32,7 +31,7 @@ export class FilterComponent implements OnDestroy { }) ).subscribe(store); - this.filter$ = this.store.select(fromCollection.getSelectedFilter); + this.filter$ = this.store.select(fromFilter.getSelectedFilter); } ngOnDestroy() { diff --git a/ui/src/app/metadata-filter/container/new-filter.component.html b/ui/src/app/metadata/filter/container/new-filter.component.html similarity index 98% rename from ui/src/app/metadata-filter/container/new-filter.component.html rename to ui/src/app/metadata/filter/container/new-filter.component.html index 55889cee7..0985f9764 100644 --- a/ui/src/app/metadata-filter/container/new-filter.component.html +++ b/ui/src/app/metadata/filter/container/new-filter.component.html @@ -137,10 +137,10 @@
    - +
    - +
    diff --git a/ui/src/app/metadata-filter/container/new-filter.component.spec.ts b/ui/src/app/metadata/filter/container/new-filter.component.spec.ts similarity index 81% rename from ui/src/app/metadata-filter/container/new-filter.component.spec.ts rename to ui/src/app/metadata/filter/container/new-filter.component.spec.ts index 5872424fc..e954c1cbf 100644 --- a/ui/src/app/metadata-filter/container/new-filter.component.spec.ts +++ b/ui/src/app/metadata/filter/container/new-filter.component.spec.ts @@ -3,11 +3,11 @@ import { ReactiveFormsModule, FormBuilder } from '@angular/forms'; import { StoreModule, Store, combineReducers } from '@ngrx/store'; import { NewFilterComponent } from './new-filter.component'; import * as fromFilter from '../reducer'; -import { ProviderEditorFormModule } from '../../metadata-provider/component'; +import { ProviderEditorFormModule } from '../../domain/component'; import { ProviderStatusEmitter, ProviderValueEmitter } from '../../domain/service/provider-change-emitter.service'; -import { NgbPopoverModule, NgbPopoverConfig, NgbModalModule, NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { NavigatorService } from '../../core/service/navigator.service'; -import { SharedModule } from '../../shared/shared.module'; +import { NgbPopoverModule, NgbPopoverConfig } from '@ng-bootstrap/ng-bootstrap'; +import { NavigatorService } from '../../../core/service/navigator.service'; +import { SharedModule } from '../../../shared/shared.module'; describe('New Metadata Filter Page', () => { let fixture: ComponentFixture; @@ -25,7 +25,7 @@ describe('New Metadata Filter Page', () => { ], imports: [ StoreModule.forRoot({ - 'metadata-filter': combineReducers(fromFilter.reducers), + 'filter': combineReducers(fromFilter.reducers), }), ReactiveFormsModule, ProviderEditorFormModule, diff --git a/ui/src/app/metadata-filter/container/new-filter.component.ts b/ui/src/app/metadata/filter/container/new-filter.component.ts similarity index 95% rename from ui/src/app/metadata-filter/container/new-filter.component.ts rename to ui/src/app/metadata/filter/container/new-filter.component.ts index f56245dd7..840d2d9a4 100644 --- a/ui/src/app/metadata-filter/container/new-filter.component.ts +++ b/ui/src/app/metadata/filter/container/new-filter.component.ts @@ -7,12 +7,12 @@ import { withLatestFrom, distinctUntilChanged, startWith, takeUntil } from 'rxjs import * as fromFilter from '../reducer'; import { ProviderValueEmitter } from '../../domain/service/provider-change-emitter.service'; import { CancelCreateFilter, SelectId, UpdateFilterChanges } from '../action/filter.action'; -import { AddFilterRequest } from '../../domain/action/filter-collection.action'; +import { AddFilterRequest } from '../action/collection.action'; import { MetadataFilter } from '../../domain/model/metadata-filter'; import { EntityValidators } from '../../domain/service/entity-validators.service'; import { QueryEntityIds, ViewMoreIds, ClearSearch } from '../action/search.action'; -import { MDUI } from '../../domain/model/mdui'; -import { EntityAttributesFilter } from '../../domain/entity/entity-attributes.filter'; +import { MDUI } from '../../domain/model'; +import { EntityAttributesFilter } from '../../domain/entity/filter/entity-attributes-filter'; @Component({ selector: 'new-filter-page', diff --git a/ui/src/app/domain/effect/filter-collection.effect.spec.ts b/ui/src/app/metadata/filter/effect/collection.effect.spec.ts similarity index 59% rename from ui/src/app/domain/effect/filter-collection.effect.spec.ts rename to ui/src/app/metadata/filter/effect/collection.effect.spec.ts index 178dfa650..d89c931ad 100644 --- a/ui/src/app/domain/effect/filter-collection.effect.spec.ts +++ b/ui/src/app/metadata/filter/effect/collection.effect.spec.ts @@ -1,14 +1,12 @@ -import { TestBed, tick, fakeAsync } from '@angular/core/testing'; +import { TestBed } from '@angular/core/testing'; import { Actions } from '@ngrx/effects'; -import { cold, getTestScheduler, hot } from 'jasmine-marbles'; -import { empty, Observable, of } from 'rxjs'; -import { TestActions, getActions } from '../../../testing/effect.util'; -import { MetadataFilter } from '../domain.type'; -import { FilterCollectionEffects } from './filter-collection.effect'; -import { MetadataResolverService } from '../service/metadata-resolver.service'; +import { TestActions, getActions } from '../../../../testing/effect.util'; +import { MetadataFilter } from '../../domain/model'; +import { FilterCollectionEffects } from './collection.effect'; +import { MetadataProviderService } from '../../domain/service/provider.service'; import { Router } from '@angular/router'; -import { RouterStub } from '../../../testing/router.stub'; +import { RouterStub } from '../../../../testing/router.stub'; describe('Filter Collection Effects', () => { let effects: FilterCollectionEffects; @@ -20,7 +18,7 @@ describe('Filter Collection Effects', () => { providers: [ FilterCollectionEffects, { - provide: MetadataResolverService, + provide: MetadataProviderService, useValue: { query: () => { }, find: (id: string) => { }, @@ -34,7 +32,7 @@ describe('Filter Collection Effects', () => { }); effects = TestBed.get(FilterCollectionEffects); - draftService = TestBed.get(MetadataResolverService); + draftService = TestBed.get(MetadataProviderService); actions$ = TestBed.get(Actions); }); }); diff --git a/ui/src/app/domain/effect/filter-collection.effect.ts b/ui/src/app/metadata/filter/effect/collection.effect.ts similarity index 89% rename from ui/src/app/domain/effect/filter-collection.effect.ts rename to ui/src/app/metadata/filter/effect/collection.effect.ts index f9b5d8589..da2a08a84 100644 --- a/ui/src/app/domain/effect/filter-collection.effect.ts +++ b/ui/src/app/metadata/filter/effect/collection.effect.ts @@ -6,14 +6,14 @@ import { Router } from '@angular/router'; import { of } from 'rxjs'; import { switchMap, map, catchError, tap } from 'rxjs/operators'; -import * as actions from '../action/filter-collection.action'; -import { FilterCollectionActionTypes } from '../action/filter-collection.action'; +import * as actions from '../action/collection.action'; +import { FilterCollectionActionTypes } from '../action/collection.action'; import * as fromFilter from '../reducer'; -import { MetadataResolverService } from '../service/metadata-resolver.service'; -import { MetadataFilter } from '../../domain/model/metadata-filter'; -import { removeNulls } from '../../shared/util'; -import { EntityAttributesFilter } from '../entity/entity-attributes.filter'; +import { MetadataProviderService } from '../../domain/service/provider.service'; +import { MetadataFilter } from '../../domain/model'; +import { removeNulls } from '../../../shared/util'; +import { EntityAttributesFilter } from '../../domain/entity/filter/entity-attributes-filter'; /* istanbul ignore next */ @Injectable() @@ -113,7 +113,7 @@ export class FilterCollectionEffects { constructor( private actions$: Actions, private router: Router, - private resolverService: MetadataResolverService, + private resolverService: MetadataProviderService, private store: Store ) { } } diff --git a/ui/src/app/metadata/filter/effect/filter.effect.ts b/ui/src/app/metadata/filter/effect/filter.effect.ts new file mode 100644 index 000000000..87b5a7f1c --- /dev/null +++ b/ui/src/app/metadata/filter/effect/filter.effect.ts @@ -0,0 +1,82 @@ +import { Injectable } from '@angular/core'; +import { Effect, Actions, ofType } from '@ngrx/effects'; +import { Store } from '@ngrx/store'; +import { of } from 'rxjs'; +import { map, switchMap, catchError, withLatestFrom, tap } from 'rxjs/operators'; + +import { Router } from '@angular/router'; + +import * as fromFilter from '../reducer'; +import * as fromRoot from '../../../app.reducer'; +import { + FilterCollectionActionTypes, + UpdateFilterFail, + UpdateFilterRequest, + AddFilterSuccess, + LoadFilterRequest +} from '../action/collection.action'; +import { + SelectId, + FilterActionTypes, + LoadEntityPreviewSuccess, + LoadEntityPreviewError, + CancelCreateFilter +} from '../action/filter.action'; +import { EntityIdService } from '../../domain/service/entity-id.service'; +import { MetadataProviderService } from '../../domain/service/provider.service'; +import { ShowContentionAction } from '../../../contention/action/contention.action'; +import { MetadataFilter } from '../../domain/model'; +import { ContentionService } from '../../../contention/service/contention.service'; + +@Injectable() +export class FilterEffects { + + @Effect() + loadEntityMdui$ = this.actions$.pipe( + ofType(FilterActionTypes.SELECT_ID), + map(action => action.payload), + switchMap(query => + this.idService.findEntityById(query).pipe( + map(data => new LoadEntityPreviewSuccess(data)), + catchError(error => of(new LoadEntityPreviewError(error))) + ) + ) + ); + + @Effect() + openContention$ = this.actions$.pipe( + ofType(FilterCollectionActionTypes.UPDATE_FILTER_FAIL), + map(action => action.payload), + withLatestFrom(this.store.select(fromFilter.getSelectedFilter)), + switchMap(([filter, current]) => + this.resolverService.find(filter.id).pipe( + map(data => new ShowContentionAction(this.contentionService.getContention(current, filter, data, { + resolve: (obj) => this.store.dispatch(new UpdateFilterRequest({ ...obj })), + reject: (obj) => this.store.dispatch(new CancelCreateFilter()) + }))) + ) + ) + ); + + @Effect({ dispatch: false }) + saveFilterSuccess$ = this.actions$.pipe( + ofType(FilterCollectionActionTypes.ADD_FILTER_SUCCESS), + switchMap(() => this.router.navigate(['/dashboard'])) + ); + + @Effect() + cancelChanges$ = this.actions$.pipe( + ofType(FilterActionTypes.CANCEL_CREATE_FILTER), + map(() => new LoadFilterRequest()), + tap(() => this.router.navigate(['/dashboard'])) + ); + + constructor( + private store: Store, + private actions$: Actions, + private router: Router, + private idService: EntityIdService, + private resolverService: MetadataProviderService, + private contentionService: ContentionService + ) { } +} diff --git a/ui/src/app/metadata-filter/effect/search.effect.ts b/ui/src/app/metadata/filter/effect/search.effect.ts similarity index 74% rename from ui/src/app/metadata-filter/effect/search.effect.ts rename to ui/src/app/metadata/filter/effect/search.effect.ts index ef03c30d9..7642728e5 100644 --- a/ui/src/app/metadata-filter/effect/search.effect.ts +++ b/ui/src/app/metadata/filter/effect/search.effect.ts @@ -5,7 +5,14 @@ import { of } from 'rxjs'; import { catchError, map, debounceTime, switchMap } from 'rxjs/operators'; import { NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap'; -import * as search from '../action/search.action'; +import { + SearchActionTypes, + QueryEntityIds, + LoadEntityIdsError, + LoadEntityIdsSuccess, + ViewMoreIds, + CancelViewMore +} from '../action/search.action'; import { SearchDialogComponent } from '../component/search-dialog.component'; import { EntityIdService } from '../../domain/service/entity-id.service'; @@ -19,20 +26,20 @@ export class SearchIdEffects { private dbounce = 500; @Effect() loadEntityIds$ = this.actions$.pipe( - ofType(search.QUERY_ENTITY_IDS), + ofType(SearchActionTypes.QUERY_ENTITY_IDS), map(action => action.payload), debounceTime(this.dbounce), switchMap(query => this.idService.query(query).pipe( - map(ids => new search.LoadEntityIdsSuccess(ids)), - catchError(error => of(new search.LoadEntityIdsError(error))) + map(ids => new LoadEntityIdsSuccess(ids)), + catchError(error => of(new LoadEntityIdsError(error))) ) ) ); @Effect() viewMore$ = this.actions$.pipe( - ofType(search.VIEW_MORE_IDS), + ofType(SearchActionTypes.VIEW_MORE_IDS), map(action => action.payload), switchMap(q => { const modal = this.modalService.open(SearchDialogComponent) as NgbModalRef; @@ -40,7 +47,7 @@ export class SearchIdEffects { modal.componentInstance.term = q; return fromPromise(res).pipe( map(id => new SelectId(id)), - catchError(() => of(new search.CancelViewMore())) + catchError(() => of(new CancelViewMore())) ); }) ); diff --git a/ui/src/app/metadata-filter/filter.module.ts b/ui/src/app/metadata/filter/filter.module.ts similarity index 70% rename from ui/src/app/metadata-filter/filter.module.ts rename to ui/src/app/metadata/filter/filter.module.ts index 61bf73a8a..22a7ed992 100644 --- a/ui/src/app/metadata-filter/filter.module.ts +++ b/ui/src/app/metadata/filter/filter.module.ts @@ -8,17 +8,17 @@ import { EffectsModule } from '@ngrx/effects'; import { NewFilterComponent } from './container/new-filter.component'; import { reducers } from './reducer'; -import { ProviderFormFragmentComponent } from '../metadata-provider/component/forms/provider-form-fragment.component'; -import { ProviderEditorFormModule } from '../metadata-provider/component'; +import { ProviderEditorFormModule } from '../domain/component'; import { FilterEffects } from './effect/filter.effect'; import { NgbPopoverModule, NgbModalModule } from '@ng-bootstrap/ng-bootstrap'; import { SearchDialogComponent } from './component/search-dialog.component'; -import { SharedModule } from '../shared/shared.module'; +import { SharedModule } from '../../shared/shared.module'; import { EditFilterComponent } from './container/edit-filter.component'; import { FilterComponent } from './container/filter.component'; import { SearchIdEffects } from './effect/search.effect'; -import { FilterExistsGuard } from '../domain/guard/filter-exists.guard'; -import { PreviewDialogModule } from '../shared/preview/preview-dialog.module'; +import { FilterExistsGuard } from './guard/filter-exists.guard'; +import { DomainModule } from '../domain/domain.module'; +import { ModuleWithProviders } from '@angular/compiler/src/core'; export const routes: Routes = [ @@ -52,20 +52,34 @@ export const routes: Routes = [ SearchDialogComponent ], imports: [ - RouterModule.forChild(routes), - StoreModule.forFeature('metadata-filter', reducers), - EffectsModule.forFeature([FilterEffects, SearchIdEffects]), CommonModule, ReactiveFormsModule, ProviderEditorFormModule, NgbPopoverModule, NgbModalModule, SharedModule, - PreviewDialogModule, - HttpClientModule - ], - providers: [ - FilterExistsGuard + DomainModule, + HttpClientModule, + RouterModule ] }) -export class FilterModule { } +export class FilterModule { + static forRoot(): ModuleWithProviders { + return { + ngModule: RootFilterModule, + providers: [ + FilterExistsGuard + ] + }; + } +} + +@NgModule({ + imports: [ + FilterModule, + RouterModule.forChild(routes), + StoreModule.forFeature('filter', reducers), + EffectsModule.forFeature([FilterEffects, SearchIdEffects]), + ], +}) +export class RootFilterModule { } diff --git a/ui/src/app/domain/guard/filter-exists.guard.ts b/ui/src/app/metadata/filter/guard/filter-exists.guard.ts similarity index 90% rename from ui/src/app/domain/guard/filter-exists.guard.ts rename to ui/src/app/metadata/filter/guard/filter-exists.guard.ts index a7ac24414..048e5ae9f 100644 --- a/ui/src/app/domain/guard/filter-exists.guard.ts +++ b/ui/src/app/metadata/filter/guard/filter-exists.guard.ts @@ -4,9 +4,8 @@ import { select, Store } from '@ngrx/store'; import { Observable, of } from 'rxjs'; import { catchError, filter, map, switchMap, take, tap } from 'rxjs/operators'; -import * as FilterActions from '../action/filter-collection.action'; import * as fromCollection from '../reducer'; -import { MetadataResolverService } from '../service/metadata-resolver.service'; +import { MetadataProviderService } from '../../domain/service/provider.service'; /** * Guards are hooks into the route resolution process, providing an opportunity @@ -17,7 +16,7 @@ import { MetadataResolverService } from '../service/metadata-resolver.service'; export class FilterExistsGuard implements CanActivate { constructor( private store: Store, - private mdResolverService: MetadataResolverService, + private mdResolverService: MetadataProviderService, private router: Router ) { } diff --git a/ui/src/app/domain/reducer/filter-collection.reducer.spec.ts b/ui/src/app/metadata/filter/reducer/collection.reducer.spec.ts similarity index 85% rename from ui/src/app/domain/reducer/filter-collection.reducer.spec.ts rename to ui/src/app/metadata/filter/reducer/collection.reducer.spec.ts index 7ecfd7314..0a5d9f74f 100644 --- a/ui/src/app/domain/reducer/filter-collection.reducer.spec.ts +++ b/ui/src/app/metadata/filter/reducer/collection.reducer.spec.ts @@ -1,14 +1,14 @@ -import { reducer } from './filter-collection.reducer'; -import * as fromFilter from './filter-collection.reducer'; +import { reducer } from './collection.reducer'; +import * as fromFilter from './collection.reducer'; import { FilterCollectionActionTypes, LoadFilterSuccess, UpdateFilterSuccess, SelectFilter -} from '../action/filter-collection.action'; -import { EntityAttributesFilter } from '../entity/entity-attributes.filter'; +} from '../action/collection.action'; +import { EntityAttributesFilter } from '../../domain/entity/filter/entity-attributes-filter'; -const snapshot: fromFilter.FilterCollectionState = { +const snapshot: fromFilter.CollectionState = { ids: [], entities: {}, selectedFilterId: null, @@ -24,7 +24,7 @@ describe('Filter Reducer', () => { }); }); - describe(`${FilterCollectionActionTypes.SELECT}`, () => { + describe(`${FilterCollectionActionTypes.SELECT_FILTER}`, () => { it('should set the selected id in the store', () => { const selectedFilterId = 'foo'; const action = new SelectFilter(selectedFilterId); diff --git a/ui/src/app/domain/reducer/filter-collection.reducer.ts b/ui/src/app/metadata/filter/reducer/collection.reducer.ts similarity index 69% rename from ui/src/app/domain/reducer/filter-collection.reducer.ts rename to ui/src/app/metadata/filter/reducer/collection.reducer.ts index f665a6c50..2eeff6ff1 100644 --- a/ui/src/app/domain/reducer/filter-collection.reducer.ts +++ b/ui/src/app/metadata/filter/reducer/collection.reducer.ts @@ -1,9 +1,8 @@ -import { EntityState, EntityAdapter, createEntityAdapter, Update } from '@ngrx/entity'; -import { FilterCollectionActionTypes, FilterCollectionActionsUnion } from '../action/filter-collection.action'; -import { MetadataFilter } from '../domain.type'; -import { UpdateChanges } from '../../edit-provider/action/editor.action'; +import { EntityState, EntityAdapter, createEntityAdapter } from '@ngrx/entity'; +import { FilterCollectionActionTypes, FilterCollectionActionsUnion } from '../action/collection.action'; +import { MetadataFilter } from '../../domain/model'; -export interface FilterCollectionState extends EntityState { +export interface CollectionState extends EntityState { selectedFilterId: string | null; loaded: boolean; } @@ -17,12 +16,12 @@ export const adapter: EntityAdapter = createEntityAdapter model.resourceId }); -export const initialState: FilterCollectionState = adapter.getInitialState({ +export const initialState: CollectionState = adapter.getInitialState({ selectedFilterId: null, loaded: false }); -export function reducer(state = initialState, action: FilterCollectionActionsUnion): FilterCollectionState { +export function reducer(state = initialState, action: FilterCollectionActionsUnion): CollectionState { switch (action.type) { case FilterCollectionActionTypes.LOAD_FILTER_SUCCESS: { let s = adapter.addAll(action.payload, { @@ -50,8 +49,8 @@ export function reducer(state = initialState, action: FilterCollectionActionsUni } } -export const getSelectedFilterId = (state: FilterCollectionState) => state.selectedFilterId; -export const getIsLoaded = (state: FilterCollectionState) => state.loaded; +export const getSelectedFilterId = (state: CollectionState) => state.selectedFilterId; +export const getIsLoaded = (state: CollectionState) => state.loaded; export const { selectIds: selectFilterIds, selectEntities: selectFilterEntities, diff --git a/ui/src/app/metadata-filter/reducer/filter.reducer.spec.ts b/ui/src/app/metadata/filter/reducer/filter.reducer.spec.ts similarity index 76% rename from ui/src/app/metadata-filter/reducer/filter.reducer.spec.ts rename to ui/src/app/metadata/filter/reducer/filter.reducer.spec.ts index 8dd49f54f..f4f4cbe82 100644 --- a/ui/src/app/metadata-filter/reducer/filter.reducer.spec.ts +++ b/ui/src/app/metadata/filter/reducer/filter.reducer.spec.ts @@ -1,8 +1,7 @@ import { reducer } from './filter.reducer'; import * as fromFilter from './filter.reducer'; -import * as actions from '../action/filter.action'; -import * as searchActions from '../action/search.action'; -import { CancelCreateFilter } from '../action/filter.action'; +import { SelectId, LoadEntityPreviewSuccess, UpdateFilterChanges, FilterActionTypes, CancelCreateFilter } from '../action/filter.action'; +import { SearchActionTypes } from '../action/search.action'; import { ClearSearch @@ -14,10 +13,11 @@ import { UpdateFilterRequest, AddFilterSuccess, UpdateFilterSuccess -} from '../../domain/action/filter-collection.action'; -import { MDUI } from '../../domain/model/mdui'; -import { MetadataFilter } from '../../domain/domain.type'; -import { EntityAttributesFilter } from '../../domain/entity/entity-attributes.filter'; +} from '../action/collection.action'; +import { MDUI } from '../../domain/model'; +import { MetadataFilter } from '../../domain/model'; +import { EntityAttributesFilter } from '../../domain/entity/filter/entity-attributes-filter'; + const snapshot: fromFilter.FilterState = { selected: null, @@ -45,27 +45,27 @@ describe('Filter Reducer', () => { }); }); - describe(`${actions.SELECT_ID} action`, () => { + describe(`${FilterActionTypes.SELECT_ID} action`, () => { it('should set selected property to the provided payload', () => { const id = 'foo'; - const result = reducer(snapshot, new actions.SelectId(id)); + const result = reducer(snapshot, new SelectId(id)); expect(result.selected).toBe(id); }); }); - describe(`${actions.LOAD_ENTITY_PREVIEW_SUCCESS} action`, () => { + describe(`${FilterActionTypes.LOAD_ENTITY_PREVIEW_SUCCESS} action`, () => { it('should set preview property to the provided payload', () => { let sampleMdui = { ...mdui }; - const result = reducer(snapshot, new actions.LoadEntityPreviewSuccess(sampleMdui)); + const result = reducer(snapshot, new LoadEntityPreviewSuccess(sampleMdui)); expect(result.preview).toEqual(sampleMdui); }); }); - describe(`${actions.UPDATE_FILTER} action`, () => { + describe(`${FilterActionTypes.UPDATE_FILTER} action`, () => { it('should update the state of changes', () => { const changes = { filterEnabled: false }; const current = { ...snapshot, changes: { filterEnabled: true } as MetadataFilter }; - const result = reducer(current, new actions.UpdateFilterChanges(changes)); + const result = reducer(current, new UpdateFilterChanges(changes)); expect(result.changes.filterEnabled).toBe(false); }); }); @@ -96,13 +96,13 @@ describe('Filter Reducer', () => { expect(result).toEqual(fromFilter.initialState); }); }); - describe(`${searchActions.CLEAR_SEARCH} action`, () => { + describe(`${SearchActionTypes.CLEAR_SEARCH} action`, () => { it('should set saving to true', () => { const result = reducer(snapshot, new ClearSearch()); expect(result).toEqual(fromFilter.initialState); }); }); - describe(`${actions.CANCEL_CREATE_FILTER} action`, () => { + describe(`${FilterActionTypes.CANCEL_CREATE_FILTER} action`, () => { it('should set saving to true', () => { const result = reducer(snapshot, new CancelCreateFilter()); expect(result).toEqual(fromFilter.initialState); diff --git a/ui/src/app/metadata-filter/reducer/filter.reducer.ts b/ui/src/app/metadata/filter/reducer/filter.reducer.ts similarity index 72% rename from ui/src/app/metadata-filter/reducer/filter.reducer.ts rename to ui/src/app/metadata/filter/reducer/filter.reducer.ts index 1b7d54c01..3bce96ae3 100644 --- a/ui/src/app/metadata-filter/reducer/filter.reducer.ts +++ b/ui/src/app/metadata/filter/reducer/filter.reducer.ts @@ -1,7 +1,13 @@ -import * as filter from '../action/filter.action'; -import * as search from '../action/search.action'; -import { FilterCollectionActionTypes, FilterCollectionActionsUnion } from '../../domain/action/filter-collection.action'; -import { MetadataFilter, MDUI } from '../../domain/domain.type'; +import { + FilterActionTypes, + FilterActionsUnion +} from '../action/filter.action'; +import { + SearchActionTypes, + SearchActionsUnion +} from '../action/search.action'; +import { FilterCollectionActionTypes, FilterCollectionActionsUnion } from '../action/collection.action'; +import { MetadataFilter, MDUI } from '../../domain/model'; export interface FilterState { selected: string | null; @@ -17,21 +23,21 @@ export const initialState: FilterState = { saving: false }; -export function reducer(state = initialState, action: filter.Actions | search.Actions | FilterCollectionActionsUnion): FilterState { +export function reducer(state = initialState, action: FilterActionsUnion | SearchActionsUnion | FilterCollectionActionsUnion): FilterState { switch (action.type) { - case filter.SELECT_ID: { + case FilterActionTypes.SELECT_ID: { return { ...state, selected: action.payload }; } - case filter.LOAD_ENTITY_PREVIEW_SUCCESS: { + case FilterActionTypes.LOAD_ENTITY_PREVIEW_SUCCESS: { return { ...state, preview: action.payload }; } - case filter.UPDATE_FILTER: { + case FilterActionTypes.UPDATE_FILTER: { return { ...state, changes: { @@ -56,8 +62,8 @@ export function reducer(state = initialState, action: filter.Actions | search.Ac } case FilterCollectionActionTypes.ADD_FILTER_SUCCESS: case FilterCollectionActionTypes.UPDATE_FILTER_SUCCESS: - case search.CLEAR_SEARCH: - case filter.CANCEL_CREATE_FILTER: { + case SearchActionTypes.CLEAR_SEARCH: + case FilterActionTypes.CANCEL_CREATE_FILTER: { return { ...initialState }; diff --git a/ui/src/app/metadata-filter/reducer/index.ts b/ui/src/app/metadata/filter/reducer/index.ts similarity index 56% rename from ui/src/app/metadata-filter/reducer/index.ts rename to ui/src/app/metadata/filter/reducer/index.ts index f94f5d385..5ae10da51 100644 --- a/ui/src/app/metadata-filter/reducer/index.ts +++ b/ui/src/app/metadata/filter/reducer/index.ts @@ -1,35 +1,57 @@ import { createSelector, createFeatureSelector } from '@ngrx/store'; -import * as fromRoot from '../../core/reducer'; +import * as fromRoot from '../../../core/reducer'; import * as fromFilter from './filter.reducer'; import * as fromSearch from './search.reducer'; +import * as fromCollection from './collection.reducer'; +import * as utils from '../../domain/domain.util'; export interface FilterState { filter: fromFilter.FilterState; search: fromSearch.SearchState; + collection: fromCollection.CollectionState; } export const reducers = { filter: fromFilter.reducer, - search: fromSearch.reducer + search: fromSearch.reducer, + collection: fromCollection.reducer }; export interface State extends fromRoot.State { - 'metadata-filter': FilterState; + 'filter': FilterState; } export const getFiltersFromStateFn = (state: FilterState) => state.filter; export const getSearchFromStateFn = (state: FilterState) => state.search; -export const getFilterState = createFeatureSelector('metadata-filter'); +export const getCollectionFromStateFn = (state: FilterState) => state.collection; + +export const getFilterState = createFeatureSelector('filter'); export const getFilterFromState = createSelector(getFilterState, getFiltersFromStateFn); + export const getSelected = createSelector(getFilterFromState, fromFilter.getSelected); export const getFilter = createSelector(getFilterFromState, fromFilter.getFilterChanges); export const getPreview = createSelector(getFilterFromState, fromFilter.getPreview); export const getSaving = createSelector(getFilterFromState, fromFilter.getSaving); +/* + * Select pieces of Search Collection +*/ + export const getSearchFromState = createSelector(getFilterState, getSearchFromStateFn); export const getEntityCollection = createSelector(getSearchFromState, fromSearch.getEntityIds); export const getIsLoading = createSelector(getSearchFromState, fromSearch.getLoading); export const getError = createSelector(getSearchFromState, fromSearch.getError); export const getTerm = createSelector(getSearchFromState, fromSearch.getTerm); export const getViewingMore = createSelector(getSearchFromState, fromSearch.getViewMore); + +/* + * Select pieces of Filter Collection +*/ +export const getCollectionState = createSelector(getFilterState, getCollectionFromStateFn); +export const getAllFilters = createSelector(getCollectionState, fromCollection.selectAllFilters); +export const getFilterEntities = createSelector(getCollectionState, fromCollection.selectFilterEntities); +export const getSelectedFilterId = createSelector(getCollectionState, fromCollection.getSelectedFilterId); +export const getSelectedFilter = createSelector(getFilterEntities, getSelectedFilterId, utils.getInCollectionFn); +export const getFilterIds = createSelector(getCollectionState, fromCollection.selectFilterIds); +export const getFilterCollectionIsLoaded = createSelector(getCollectionState, fromCollection.getIsLoaded); diff --git a/ui/src/app/metadata-filter/reducer/search.reducer.spec.ts b/ui/src/app/metadata/filter/reducer/search.reducer.spec.ts similarity index 61% rename from ui/src/app/metadata-filter/reducer/search.reducer.spec.ts rename to ui/src/app/metadata/filter/reducer/search.reducer.spec.ts index 576294cf3..7c77afc30 100644 --- a/ui/src/app/metadata-filter/reducer/search.reducer.spec.ts +++ b/ui/src/app/metadata/filter/reducer/search.reducer.spec.ts @@ -1,6 +1,13 @@ import { reducer } from './search.reducer'; import * as fromFilter from './search.reducer'; -import * as actions from '../action/search.action'; +import { + SearchActionTypes, + ViewMoreIds, + CancelViewMore, + QueryEntityIds, + LoadEntityIdsError, + LoadEntityIdsSuccess +} from '../action/search.action'; const snapshot: fromFilter.SearchState = { entityIds: [], @@ -19,44 +26,44 @@ describe('Filter Reducer', () => { }); }); - describe(`${actions.VIEW_MORE_IDS} action`, () => { + describe(`${SearchActionTypes.VIEW_MORE_IDS} action`, () => { it('should set viewMore property to true', () => { - const result = reducer(snapshot, new actions.ViewMoreIds('foo')); + const result = reducer(snapshot, new ViewMoreIds('foo')); expect(result.viewMore).toBe(true); }); }); - describe(`${actions.CANCEL_VIEW_MORE} action`, () => { + describe(`${SearchActionTypes.CANCEL_VIEW_MORE} action`, () => { it('should set viewMore property to false', () => { - const result = reducer(snapshot, new actions.CancelViewMore()); + const result = reducer(snapshot, new CancelViewMore()); expect(result.viewMore).toBe(false); }); }); - describe(`${actions.QUERY_ENTITY_IDS} action`, () => { + describe(`${SearchActionTypes.QUERY_ENTITY_IDS} action`, () => { it('should set loading property to true', () => { - const result = reducer(snapshot, new actions.QueryEntityIds({ term: 'foo' })); + const result = reducer(snapshot, new QueryEntityIds({ term: 'foo' })); expect(result.loading).toBe(true); }); }); - describe(`${actions.LOAD_ENTITY_IDS_SUCCESS} action`, () => { + describe(`${SearchActionTypes.LOAD_ENTITY_IDS_SUCCESS} action`, () => { it('should set loading property to false and the entityIds property to the provided payload', () => { const ids = ['foo']; - const result = reducer(snapshot, new actions.LoadEntityIdsSuccess(ids)); + const result = reducer(snapshot, new LoadEntityIdsSuccess(ids)); expect(result.loading).toBe(false); expect(result.entityIds).toBe(ids); }); }); - describe(`${actions.LoadEntityIdsError} action`, () => { + describe(`${SearchActionTypes.LOAD_ENTITY_IDS_ERROR} action`, () => { it('should set loading property to false and the error property to the provided payload', () => { const err = new Error('Foobar!'); - const result = reducer(snapshot, new actions.LoadEntityIdsError(err)); + const result = reducer(snapshot, new LoadEntityIdsError(err)); expect(result.loading).toBe(false); expect(result.error).toBe(err); diff --git a/ui/src/app/metadata-filter/reducer/search.reducer.ts b/ui/src/app/metadata/filter/reducer/search.reducer.ts similarity index 69% rename from ui/src/app/metadata-filter/reducer/search.reducer.ts rename to ui/src/app/metadata/filter/reducer/search.reducer.ts index 47d5948bc..1d63609e9 100644 --- a/ui/src/app/metadata-filter/reducer/search.reducer.ts +++ b/ui/src/app/metadata/filter/reducer/search.reducer.ts @@ -1,6 +1,6 @@ -import * as search from '../action/search.action'; -import * as filter from '../action/filter.action'; -import { FilterCollectionActionTypes, FilterCollectionActionsUnion } from '../../domain/action/filter-collection.action'; +import { FilterActionsUnion, FilterActionTypes } from '../action/filter.action'; +import { SearchActionsUnion, SearchActionTypes } from '../action/search.action'; +import { FilterCollectionActionTypes, FilterCollectionActionsUnion } from '../action/collection.action'; export interface SearchState { entityIds: string[]; @@ -18,28 +18,28 @@ export const initialState: SearchState = { term: '', }; -export function reducer(state = initialState, action: search.Actions | filter.Actions | FilterCollectionActionsUnion): SearchState { +export function reducer(state = initialState, action: SearchActionsUnion | FilterActionsUnion | FilterCollectionActionsUnion): SearchState { switch (action.type) { - case search.VIEW_MORE_IDS: { + case SearchActionTypes.VIEW_MORE_IDS: { return { ...state, viewMore: true }; } - case search.CANCEL_VIEW_MORE: { + case SearchActionTypes.CANCEL_VIEW_MORE: { return { ...state, viewMore: false }; } - case search.QUERY_ENTITY_IDS: { + case SearchActionTypes.QUERY_ENTITY_IDS: { return { ...state, loading: true, term: action.payload.term }; } - case search.LOAD_ENTITY_IDS_SUCCESS: { + case SearchActionTypes.LOAD_ENTITY_IDS_SUCCESS: { return { ...state, loading: false, @@ -47,7 +47,7 @@ export function reducer(state = initialState, action: search.Actions | filter.Ac entityIds: action.payload }; } - case search.LOAD_ENTITY_IDS_ERROR: { + case SearchActionTypes.LOAD_ENTITY_IDS_ERROR: { return { ...state, loading: false, @@ -56,8 +56,8 @@ export function reducer(state = initialState, action: search.Actions | filter.Ac } case FilterCollectionActionTypes.ADD_FILTER_SUCCESS: case FilterCollectionActionTypes.UPDATE_FILTER_SUCCESS: - case search.CLEAR_SEARCH: - case filter.CANCEL_CREATE_FILTER: { + case SearchActionTypes.CLEAR_SEARCH: + case FilterActionTypes.CANCEL_CREATE_FILTER: { return { ...initialState }; diff --git a/ui/src/app/dashboard/action/dashboard.action.ts b/ui/src/app/metadata/manager/action/manager.action.ts similarity index 100% rename from ui/src/app/dashboard/action/dashboard.action.ts rename to ui/src/app/metadata/manager/action/manager.action.ts diff --git a/ui/src/app/dashboard/action/search.action.ts b/ui/src/app/metadata/manager/action/search.action.ts similarity index 73% rename from ui/src/app/dashboard/action/search.action.ts rename to ui/src/app/metadata/manager/action/search.action.ts index 11df79fc4..457a9c371 100644 --- a/ui/src/app/dashboard/action/search.action.ts +++ b/ui/src/app/metadata/manager/action/search.action.ts @@ -1,13 +1,12 @@ import { Action } from '@ngrx/store'; -import { MetadataProvider } from '../../domain/model/metadata-provider'; -import { MetadataFilter } from '../../domain/model/metadata-filter'; +import { MetadataEntity } from '../../domain/model'; export const ENTITY_SEARCH = '[Metadata Entity Search] Entity Search'; export const ENTITY_FILTER = '[Metadata Entity Filter] Entity Filter'; export const ENTITY_SEARCH_COMPLETE = '[Metadata Entity Search] Entity Search COMPLETE'; /** - * Add Provider to Collection Actions + * Add Resolver to Collection Actions */ export class SearchAction implements Action { readonly type = ENTITY_SEARCH; @@ -24,7 +23,7 @@ export class FilterAction implements Action { export class SearchCompleteAction implements Action { readonly type = ENTITY_SEARCH_COMPLETE; - constructor(public payload: Array) { } + constructor(public payload: Array) { } } export type Actions = diff --git a/ui/src/app/dashboard/component/delete-dialog.component.html b/ui/src/app/metadata/manager/component/delete-dialog.component.html similarity index 100% rename from ui/src/app/dashboard/component/delete-dialog.component.html rename to ui/src/app/metadata/manager/component/delete-dialog.component.html diff --git a/ui/src/app/dashboard/component/delete-dialog.component.ts b/ui/src/app/metadata/manager/component/delete-dialog.component.ts similarity index 100% rename from ui/src/app/dashboard/component/delete-dialog.component.ts rename to ui/src/app/metadata/manager/component/delete-dialog.component.ts diff --git a/ui/src/app/dashboard/component/entity-item.component.html b/ui/src/app/metadata/manager/component/entity-item.component.html similarity index 67% rename from ui/src/app/dashboard/component/entity-item.component.html rename to ui/src/app/metadata/manager/component/entity-item.component.html index 4b48336ca..5be89b505 100644 --- a/ui/src/app/dashboard/component/entity-item.component.html +++ b/ui/src/app/metadata/manager/component/entity-item.component.html @@ -6,23 +6,23 @@   - - + +
    {{ entity.name }} - - Incomplete Form - {{ entity.entityId }} + + Incomplete Form + {{ entity.getDisplayId() }}
    - - +
    diff --git a/ui/src/app/metadata-provider/container/confirm-copy.component.scss b/ui/src/app/metadata/resolver/container/confirm-copy.component.scss similarity index 100% rename from ui/src/app/metadata-provider/container/confirm-copy.component.scss rename to ui/src/app/metadata/resolver/container/confirm-copy.component.scss diff --git a/ui/src/app/metadata-provider/container/confirm-copy.component.spec.ts b/ui/src/app/metadata/resolver/container/confirm-copy.component.spec.ts similarity index 100% rename from ui/src/app/metadata-provider/container/confirm-copy.component.spec.ts rename to ui/src/app/metadata/resolver/container/confirm-copy.component.spec.ts diff --git a/ui/src/app/metadata-provider/container/confirm-copy.component.ts b/ui/src/app/metadata/resolver/container/confirm-copy.component.ts similarity index 61% rename from ui/src/app/metadata-provider/container/confirm-copy.component.ts rename to ui/src/app/metadata/resolver/container/confirm-copy.component.ts index 05579d3e4..42bbff14b 100644 --- a/ui/src/app/metadata-provider/container/confirm-copy.component.ts +++ b/ui/src/app/metadata/resolver/container/confirm-copy.component.ts @@ -4,12 +4,11 @@ import { Store } from '@ngrx/store'; import { Observable } from 'rxjs'; import * as fromProvider from '../reducer'; -import { MetadataProvider } from '../../domain/domain.type'; -import { FormGroup, FormBuilder } from '@angular/forms'; +import { MetadataResolver } from '../../domain/model'; import { ProviderValueEmitter } from '../../domain/service/provider-change-emitter.service'; -import { UpdateProviderCopy } from '../action/copy.action'; +import { UpdateResolverCopy } from '../action/copy.action'; import { map, take } from 'rxjs/operators'; -import { AddProviderRequest } from '../../domain/action/provider-collection.action'; +import { AddResolverRequest } from '../action/collection.action'; @Component({ selector: 'confirm-copy-page', @@ -18,11 +17,11 @@ import { AddProviderRequest } from '../../domain/action/provider-collection.acti }) export class ConfirmCopyComponent { - copy$: Observable; - values$: Observable; + copy$: Observable; + values$: Observable; saving$: Observable; - provider: MetadataProvider; + resolver: MetadataResolver; constructor( private store: Store, @@ -32,12 +31,12 @@ export class ConfirmCopyComponent { this.saving$ = this.store.select(fromProvider.getSaving); this.values$ = this.copy$.pipe(take(1)); - this.valueEmitter.changeEmitted$.subscribe(changes => this.store.dispatch(new UpdateProviderCopy(changes))); + this.valueEmitter.changeEmitted$.subscribe(changes => this.store.dispatch(new UpdateResolverCopy(changes))); - this.copy$.subscribe(p => this.provider = p); + this.copy$.subscribe(p => this.resolver = p); } - onSave(provider: MetadataProvider): void { - this.store.dispatch(new AddProviderRequest(provider)); + onSave(resolver: MetadataResolver): void { + this.store.dispatch(new AddResolverRequest(resolver)); } } /* istanbul ignore next */ diff --git a/ui/src/app/metadata-provider/container/copy-provider.component.html b/ui/src/app/metadata/resolver/container/copy-resolver.component.html similarity index 97% rename from ui/src/app/metadata-provider/container/copy-provider.component.html rename to ui/src/app/metadata/resolver/container/copy-resolver.component.html index 1fd0f0763..62f420492 100644 --- a/ui/src/app/metadata-provider/container/copy-provider.component.html +++ b/ui/src/app/metadata/resolver/container/copy-resolver.component.html @@ -38,7 +38,7 @@

    - + @@ -50,13 +50,13 @@

    - Service Provider Name is required + Service Resolver Name is required
    diff --git a/ui/src/app/metadata-provider/container/copy-provider.component.spec.ts b/ui/src/app/metadata/resolver/container/copy-resolver.component.spec.ts similarity index 65% rename from ui/src/app/metadata-provider/container/copy-provider.component.spec.ts rename to ui/src/app/metadata/resolver/container/copy-resolver.component.spec.ts index 1a1b3b406..ee432a7f4 100644 --- a/ui/src/app/metadata-provider/container/copy-provider.component.spec.ts +++ b/ui/src/app/metadata/resolver/container/copy-resolver.component.spec.ts @@ -3,44 +3,40 @@ import { TestBed, ComponentFixture } from '@angular/core/testing'; import { ReactiveFormsModule } from '@angular/forms'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { StoreModule, Store, combineReducers } from '@ngrx/store'; -import { NewProviderComponent } from './new-provider.component'; -import * as fromCollections from '../../domain/reducer'; -import * as fromProvider from '../reducer'; -import { CopyProviderComponent } from './copy-provider.component'; -import { SharedModule } from '../../shared/shared.module'; -import { NavigatorService } from '../../core/service/navigator.service'; -import { I18nTextComponent } from '../../domain/component/i18n-text.component'; +import * as fromResolver from '../reducer'; +import { CopyResolverComponent } from './copy-resolver.component'; +import { SharedModule } from '../../../shared/shared.module'; +import { NavigatorService } from '../../../core/service/navigator.service'; +import { I18nTextComponent } from '../../../shared/component/i18n-text.component'; @Component({ - template: `` + template: `` }) class TestHostComponent { - @ViewChild(CopyProviderComponent) - public formUnderTest: CopyProviderComponent; + @ViewChild(CopyResolverComponent) + public formUnderTest: CopyResolverComponent; onSave(event: any): void {} } -describe('Copy Provider Page', () => { +describe('Copy Resolver Page', () => { let fixture: ComponentFixture; - let store: Store; - let instance: CopyProviderComponent; + let store: Store; + let instance: CopyResolverComponent; beforeEach(() => { TestBed.configureTestingModule({ imports: [ NoopAnimationsModule, StoreModule.forRoot({ - collections: combineReducers(fromCollections.reducers), - provider: combineReducers(fromProvider.reducers) + resolver: combineReducers(fromResolver.reducers) }), ReactiveFormsModule, SharedModule ], declarations: [ - CopyProviderComponent, - I18nTextComponent, + CopyResolverComponent, TestHostComponent ], providers: [ diff --git a/ui/src/app/metadata-provider/container/copy-provider.component.ts b/ui/src/app/metadata/resolver/container/copy-resolver.component.ts similarity index 76% rename from ui/src/app/metadata-provider/container/copy-provider.component.ts rename to ui/src/app/metadata/resolver/container/copy-resolver.component.ts index c7b59b141..aec11cdb5 100644 --- a/ui/src/app/metadata-provider/container/copy-provider.component.ts +++ b/ui/src/app/metadata/resolver/container/copy-resolver.component.ts @@ -10,21 +10,21 @@ import { Store } from '@ngrx/store'; import { startWith, take, last } from 'rxjs/operators'; -import { AddDraftRequest } from '../../domain/action/draft-collection.action'; -import { AddProviderRequest, UploadProviderRequest } from '../../domain/action/provider-collection.action'; -import * as fromCollections from '../../domain/reducer'; +import { AddDraftRequest } from '../action/draft.action'; +import { AddResolverRequest, UploadResolverRequest } from '../action/collection.action'; +import * as fromResolver from '../reducer'; import { EntityValidators } from '../../domain/service/entity-validators.service'; import { SearchIds } from '../action/search.action'; import * as fromProvider from '../reducer'; -import { Provider } from '../../domain/entity/provider'; -import { CreateProviderCopyRequest, UpdateProviderCopySections} from '../action/copy.action'; +import { FileBackedHttpMetadataResolver } from '../../domain/entity'; +import { CreateResolverCopyRequest, UpdateResolverCopySections } from '../action/copy.action'; @Component({ - selector: 'copy-provider-form', - templateUrl: './copy-provider.component.html' + selector: 'copy-resolver-form', + templateUrl: './copy-resolver.component.html' }) -export class CopyProviderComponent implements OnInit { +export class CopyResolverComponent implements OnInit { @Output() save: EventEmitter = new EventEmitter(); providerForm: FormGroup; @@ -48,10 +48,10 @@ export class CopyProviderComponent implements OnInit { sections$ = of(this.sections); constructor( - private store: Store, + private store: Store, private fb: FormBuilder ) { - this.ids$ = this.store.select(fromCollections.getAllEntityIds); + this.ids$ = this.store.select(fromResolver.getAllEntityIds); this.searchResults$ = this.store.select(fromProvider.getSearchResults); this.selected$ = this.store.select(fromProvider.getSectionsToCopy); @@ -78,23 +78,23 @@ export class CopyProviderComponent implements OnInit { } next(): void { - this.store.dispatch(new CreateProviderCopyRequest({ + this.store.dispatch(new CreateResolverCopyRequest({ ...this.providerForm.value })); } onChange(attr: string): void { this.store.dispatch( - new UpdateProviderCopySections( + new UpdateResolverCopySections( this.selected.indexOf(attr) > -1 ? this.selected.filter(a => a !== attr) : [...this.selected, attr] ) ); } onCheckAll(): void { - this.store.dispatch(new UpdateProviderCopySections(this.sections.map(section => section.property))); + this.store.dispatch(new UpdateResolverCopySections(this.sections.map(section => section.property))); } onCheckNone(event: Event | null = null): void { - this.store.dispatch(new UpdateProviderCopySections([])); + this.store.dispatch(new UpdateResolverCopySections([])); } } diff --git a/ui/src/app/edit-provider/container/provider.component.html b/ui/src/app/metadata/resolver/container/draft.component.html similarity index 100% rename from ui/src/app/edit-provider/container/provider.component.html rename to ui/src/app/metadata/resolver/container/draft.component.html diff --git a/ui/src/app/edit-provider/container/draft.component.ts b/ui/src/app/metadata/resolver/container/draft.component.ts similarity index 70% rename from ui/src/app/edit-provider/container/draft.component.ts rename to ui/src/app/metadata/resolver/container/draft.component.ts index 490cf594c..b1838f18e 100644 --- a/ui/src/app/edit-provider/container/draft.component.ts +++ b/ui/src/app/metadata/resolver/container/draft.component.ts @@ -6,22 +6,20 @@ import { distinctUntilChanged, map } from 'rxjs/operators'; import { Store } from '@ngrx/store'; import { NgbPopoverConfig } from '@ng-bootstrap/ng-bootstrap'; - -import { MetadataProvider } from '../../domain/model/metadata-provider'; -import { SelectDraft } from '../../domain/action/draft-collection.action'; -import * as fromCollection from '../../domain/reducer'; +import { SelectDraft } from '../action/draft.action'; +import * as fromCollection from '../reducer'; @Component({ - selector: 'provider-page', - templateUrl: './provider.component.html', - styleUrls: ['./provider.component.scss'], + selector: 'resolver-page', + templateUrl: './resolver.component.html', + styleUrls: ['./resolver.component.scss'], providers: [NgbPopoverConfig] }) export class DraftComponent implements OnDestroy { actionsSubscription: Subscription; constructor( - store: Store, + store: Store, route: ActivatedRoute ) { this.actionsSubscription = route.params.pipe( diff --git a/ui/src/app/edit-provider/container/editor.component.html b/ui/src/app/metadata/resolver/container/editor.component.html similarity index 86% rename from ui/src/app/edit-provider/container/editor.component.html rename to ui/src/app/metadata/resolver/container/editor.component.html index 5e387e595..422a1cbc2 100644 --- a/ui/src/app/edit-provider/container/editor.component.html +++ b/ui/src/app/metadata/resolver/container/editor.component.html @@ -1,9 +1,9 @@ -
    -
    +
    +
    - Edit Metadata Source - {{ (provider$ | async).serviceProviderName }} + Edit Metadata Source - {{ (resolver$ | async).serviceProviderName }}
    @@ -83,17 +83,17 @@
    - - - - - - + + + + + +
    - +
    - +
    diff --git a/ui/src/app/edit-provider/container/editor.component.ts b/ui/src/app/metadata/resolver/container/editor.component.ts similarity index 73% rename from ui/src/app/edit-provider/container/editor.component.ts rename to ui/src/app/metadata/resolver/container/editor.component.ts index b8a84c50f..6aa252abe 100644 --- a/ui/src/app/edit-provider/container/editor.component.ts +++ b/ui/src/app/metadata/resolver/container/editor.component.ts @@ -1,29 +1,23 @@ import { Component, - ViewChild, - AfterViewInit, OnInit, - OnDestroy, - EventEmitter + OnDestroy } from '@angular/core'; import { ActivatedRoute, Router, - CanDeactivate, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router'; -import { FormBuilder, FormGroup, FormControl, Validators, NgModel } from '@angular/forms'; import { Observable, Subject, of } from 'rxjs'; import { combineLatest, map, takeUntil, withLatestFrom, debounceTime, skipWhile, distinctUntilChanged } from 'rxjs/operators'; import { Store } from '@ngrx/store'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap/modal/modal'; -import { MetadataProvider } from '../../domain/model/metadata-provider'; -import * as fromProviders from '../../domain/reducer'; -import { UpdateProviderRequest } from '../../domain/action/provider-collection.action'; -import * as fromEditor from '../reducer'; +import { MetadataResolver } from '../../domain/model/metadata-resolver'; +import * as fromResolver from '../reducer'; +import { UpdateResolverRequest } from '../action/collection.action'; import { ProviderStatusEmitter, ProviderValueEmitter } from '../../domain/service/provider-change-emitter.service'; import { UpdateStatus, UpdateChanges, CancelChanges } from '../action/editor.action'; @@ -43,15 +37,17 @@ export class EditorComponent implements OnInit, OnDestroy { modified = false; open = false; - changes$: Observable; - changes: MetadataProvider; - updates: MetadataProvider; - latest: MetadataProvider; - latest$: Observable; + changes$: Observable; + changes: MetadataResolver; + updates: MetadataResolver; + latest: MetadataResolver; + latest$: Observable; - provider$: Observable; + ids$: Observable; + + resolver$: Observable; providerName$: Observable; - provider: MetadataProvider; + resolver: MetadataResolver; editorIndex$: Observable; editor$: Observable; editor: EditorFlowDefinition[]; @@ -65,35 +61,44 @@ export class EditorComponent implements OnInit, OnDestroy { wizardIsInvalid$: Observable; constructor( - private store: Store, + private store: Store, private route: ActivatedRoute, private router: Router, private statusEmitter: ProviderStatusEmitter, private valueEmitter: ProviderValueEmitter, private modalService: NgbModal ) { - this.provider$ = this.store.select(fromProviders.getSelectedProvider); - this.changes$ = this.store.select(fromEditor.getEditorChanges); + this.resolver$ = this.store.select(fromResolver.getSelectedResolver); + this.changes$ = this.store.select(fromResolver.getEditorChanges); - this.latest$ = this.provider$.pipe( + this.latest$ = this.resolver$.pipe( combineLatest(this.changes$, (base, changes) => Object.assign({}, base, changes)) ); - this.providerName$ = this.provider$.pipe(map(p => p.serviceProviderName)); - this.changes$ = this.store.select(fromEditor.getEditorChanges); + this.providerName$ = this.resolver$.pipe(map(p => p.serviceProviderName)); + this.changes$ = this.store.select(fromResolver.getEditorChanges); this.editorIndex$ = this.route.params.pipe(map(params => Number(params.index))); this.currentPage$ = this.editorIndex$.pipe(map(index => EditorDef.find(r => r.index === index))); this.editor = EditorDef; - this.store.select(fromEditor.getEditorIsSaving).pipe( + this.store.select(fromResolver.getEditorIsSaving).pipe( takeUntil(this.ngUnsubscribe) ).subscribe(saving => this.saving = saving); - this.wizardIsValid$ = this.store.select(fromEditor.getEditorIsValid); + this.wizardIsValid$ = this.store.select(fromResolver.getEditorIsValid); this.wizardIsInvalid$ = this.wizardIsValid$.pipe(map(valid => !valid)); + + this.ids$ = this.store + .select(fromResolver.getAllEntityIds) + .pipe( + takeUntil(this.ngUnsubscribe), + combineLatest(this.store.select(fromResolver.getSelectedResolver), (ids: string[], provider: MetadataResolver) => { + return ids.filter(id => provider.entityId !== id); + }) + ); } save(): void { - this.store.dispatch(new UpdateProviderRequest({ + this.store.dispatch(new UpdateResolverRequest({ ...this.latest, ...this.changes, ...this.updates @@ -113,9 +118,9 @@ export class EditorComponent implements OnInit, OnDestroy { } ngOnInit(): void { - this.provider$.pipe( + this.resolver$.pipe( takeUntil(this.ngUnsubscribe) - ).subscribe(provider => this.provider = provider); + ).subscribe(resolver => this.resolver = resolver); this.changes$.pipe( takeUntil(this.ngUnsubscribe) ).subscribe(changes => this.changes = changes); @@ -143,7 +148,7 @@ export class EditorComponent implements OnInit, OnDestroy { skipWhile(() => this.saving) ).subscribe(latest => this.latest = latest); - this.invalidForms$ = this.store.select(fromEditor.getInvalidEditorForms); + this.invalidForms$ = this.store.select(fromResolver.getInvalidEditorForms); this.invalidForms$.pipe( distinctUntilChanged(), @@ -170,7 +175,7 @@ export class EditorComponent implements OnInit, OnDestroy { if (nextState.url.match('edit')) { return of(true); } if (Object.keys({ ...this.changes }).length > 0) { let modal = this.modalService.open(UnsavedDialogComponent); - modal.componentInstance.provider = this.latest; + modal.componentInstance.resolver = this.latest; modal.componentInstance.message = 'editor'; modal.componentInstance.action = new CancelChanges(); modal.result.then( @@ -178,6 +183,6 @@ export class EditorComponent implements OnInit, OnDestroy { () => console.warn('denied') ); } - return this.store.select(fromEditor.getEditorIsSaved); + return this.store.select(fromResolver.getEditorIsSaved); } } diff --git a/ui/src/app/metadata-provider/container/new-provider.component.html b/ui/src/app/metadata/resolver/container/new-resolver.component.html similarity index 93% rename from ui/src/app/metadata-provider/container/new-provider.component.html rename to ui/src/app/metadata/resolver/container/new-resolver.component.html index ed4b65186..da87cfc6c 100644 --- a/ui/src/app/metadata-provider/container/new-provider.component.html +++ b/ui/src/app/metadata/resolver/container/new-resolver.component.html @@ -3,7 +3,7 @@
    - Add a new metadata source + Add a new metadata source
    @@ -13,7 +13,7 @@

    How are you addi
    -
    +

    Attribute Name
    {{ attr.label }} - + - +