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/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-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/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-provider/component/forms/advanced-info-form.component.spec.ts b/ui/src/app/metadata/domain/component/forms/advanced-info-form.component.spec.ts similarity index 100% rename from ui/src/app/metadata-provider/component/forms/advanced-info-form.component.spec.ts rename to ui/src/app/metadata/domain/component/forms/advanced-info-form.component.spec.ts 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 84% 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..8e601508d 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 @@ -7,10 +7,10 @@ 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'; +import * as fromMetadata from '../../../metadata.reducer'; @Component({ selector: 'adv-info-form', @@ -18,7 +18,7 @@ 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; contactTypes: string[] = [ 'support', @@ -39,7 +39,7 @@ export class AdvancedInfoFormComponent extends ProviderFormFragmentComponent imp protected fb: FormBuilder, protected statusEmitter: ProviderStatusEmitter, protected valueEmitter: ProviderValueEmitter, - protected store: Store + protected store: Store ) { super(fb, statusEmitter, valueEmitter); @@ -47,7 +47,7 @@ export class AdvancedInfoFormComponent extends ProviderFormFragmentComponent imp .select(fromCollection.getAllEntityIds) .pipe( takeUntil(this.ngUnsubscribe), - combineLatest(this.store.select(fromCollection.getSelectedProvider), (ids: string[], provider: MetadataProvider) => { + combineLatest(this.store.select(fromCollection.getSelectedProvider), (ids: string[], provider: MetadataResolver) => { return ids.filter(id => provider.entityId !== id); }) ); @@ -90,15 +90,15 @@ export class AdvancedInfoFormComponent extends ProviderFormFragmentComponent imp } 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 100% 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 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 88% 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..ec031922f 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 @@ -4,8 +4,7 @@ import { FormBuilder, FormGroup, FormControl, FormArray, AbstractControl, Valida 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 100% 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 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 100% 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 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 100% 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 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 100% 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 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 100% 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 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 71% 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..8cd8cac21 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 100% 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 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 100% 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 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 100% 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 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 100% 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 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 94% 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..2b6d4fbce 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() provider: MetadataResolver; contactTypes: string[] = [ 'support', 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 100% 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 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 100% 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 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/metadata/domain/effect/entity.effect.spec.ts b/ui/src/app/metadata/domain/effect/entity.effect.spec.ts index 25a14a107..9c259e826 100644 --- a/ui/src/app/metadata/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 { 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/filter/entity-attributes-filter'; describe('Entity Effects', () => { let effects: EntityEffects; diff --git a/ui/src/app/metadata/domain/effect/entity.effect.ts b/ui/src/app/metadata/domain/effect/entity.effect.ts index 440f5dd45..ff3e6394f 100644 --- a/ui/src/app/metadata/domain/effect/entity.effect.ts +++ b/ui/src/app/metadata/domain/effect/entity.effect.ts @@ -3,12 +3,11 @@ 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 { PreviewDialogComponent } from '../../../shared/preview/preview-dialog.component'; +import { MetadataEntity, MetadataTypes } from '../domain.type'; import { EntityIdService } from '../service/entity-id.service'; import * as entityActions from '../action/entity.action'; @@ -31,8 +30,8 @@ export class EntityEffects { ) { } 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/metadata/domain/entity/filter/entity-attributes-filter.ts b/ui/src/app/metadata/domain/entity/filter/entity-attributes-filter.ts index d2bbe89ab..aff842de5 100644 --- a/ui/src/app/metadata/domain/entity/filter/entity-attributes-filter.ts +++ b/ui/src/app/metadata/domain/entity/filter/entity-attributes-filter.ts @@ -29,6 +29,10 @@ export class EntityAttributesFilter implements MetadataFilter, MetadataEntity { Object.assign(this, { ...obj }); } + getId(): string { + return this.entityId; + } + get id(): string { return this.resourceId; } diff --git a/ui/src/app/metadata/domain/entity/provider/file-backed-http-metadata-provider.ts b/ui/src/app/metadata/domain/entity/provider/file-backed-http-metadata-provider.ts index d5841ab0b..29e97a31a 100644 --- a/ui/src/app/metadata/domain/entity/provider/file-backed-http-metadata-provider.ts +++ b/ui/src/app/metadata/domain/entity/provider/file-backed-http-metadata-provider.ts @@ -52,6 +52,10 @@ export class FileBackedHttpMetadataProvider implements MetadataProvider, Metadat Object.assign(this, descriptor); } + getId(): string { + return this.id; + } + get name(): string { return this.serviceProviderName; } 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 index 8759ef3eb..f58d961e6 100644 --- 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 @@ -1,5 +1,4 @@ import { - MetadataProvider, Organization, Contact, MDUI, @@ -8,12 +7,13 @@ import { Certificate, SsoService, IdpSsoDescriptor, - RelyingPartyOverrides + RelyingPartyOverrides, + MetadataResolver } from '../../model'; import { MetadataTypes } from '../../domain.type'; import { MetadataEntity } from '../../model/metadata-entity'; -export class FileBackedHttpMetadataResolver implements MetadataProvider, MetadataEntity { +export class FileBackedHttpMetadataResolver implements MetadataResolver, MetadataEntity { id = ''; createdDate?: string; modifiedDate?: string; @@ -48,10 +48,14 @@ export class FileBackedHttpMetadataResolver implements MetadataProvider, Metadat attributeRelease = [] as string[]; - constructor(descriptor?: Partial) { + constructor(descriptor?: Partial) { Object.assign(this, descriptor); } + getId(): string { + return this.id; + } + get name(): string { return this.serviceProviderName; } diff --git a/ui/src/app/metadata/domain/model/index.ts b/ui/src/app/metadata/domain/model/index.ts index 5b8fa5fc4..cd00d92fe 100644 --- a/ui/src/app/metadata/domain/model/index.ts +++ b/ui/src/app/metadata/domain/model/index.ts @@ -13,7 +13,3 @@ export * from './properties/relying-party-overrides'; export * from './properties/security-info'; export * from './properties/sso-descriptor'; export * from './properties/sso-service'; - -export * from './filter.entity'; -export * from './resolver.entity'; -export * from './provider.entity'; diff --git a/ui/src/app/metadata/domain/model/metadata-entity.ts b/ui/src/app/metadata/domain/model/metadata-entity.ts index 68dab399f..259a2cb99 100644 --- a/ui/src/app/metadata/domain/model/metadata-entity.ts +++ b/ui/src/app/metadata/domain/model/metadata-entity.ts @@ -3,5 +3,7 @@ export interface MetadataEntity { enabled: boolean; kind: string; + getId(): string; + serialize(): any; } diff --git a/ui/src/app/metadata/domain/reducer/draft-collection.reducer.ts b/ui/src/app/metadata/domain/reducer/draft-collection.reducer.ts deleted file mode 100644 index ff1271faa..000000000 --- a/ui/src/app/metadata/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/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/metadata/domain/reducer/index.ts b/ui/src/app/metadata/domain/reducer/index.ts deleted file mode 100644 index 5454f01a0..000000000 --- a/ui/src/app/metadata/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 Resolver 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/metadata/domain/service/entity-descriptor.service.ts b/ui/src/app/metadata/domain/service/entity-descriptor.service.ts index 9bb798c15..5cb853a60 100644 --- a/ui/src/app/metadata/domain/service/entity-descriptor.service.ts +++ b/ui/src/app/metadata/domain/service/entity-descriptor.service.ts @@ -1,14 +1,8 @@ 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/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() @@ -21,42 +15,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/metadata/domain/service/entity-draft.service.ts b/ui/src/app/metadata/domain/service/entity-draft.service.ts index 83a0dcc8f..a31f8c798 100644 --- a/ui/src/app/metadata/domain/service/entity-draft.service.ts +++ b/ui/src/app/metadata/domain/service/entity-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/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/metadata/domain/service/entity-id.service.ts b/ui/src/app/metadata/domain/service/entity-id.service.ts index f95e5d653..8daec78df 100644 --- a/ui/src/app/metadata/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/metadata/domain/service/entity-validators.service.ts b/ui/src/app/metadata/domain/service/entity-validators.service.ts index 0e7a26716..638ba0c63 100644 --- a/ui/src/app/metadata/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/metadata/domain/action/filter-collection.action.ts b/ui/src/app/metadata/filter/action/collection.action.ts similarity index 100% rename from ui/src/app/metadata/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.ts b/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.ts b/ui/src/app/metadata/filter/action/search.action.ts index a9312eff3..cd9638a54 100644 --- a/ui/src/app/metadata/filter/action/search.action.ts +++ b/ui/src/app/metadata/filter/action/search.action.ts @@ -1,47 +1,49 @@ 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'; +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 = QUERY_ENTITY_IDS; + readonly type = SearchActionTypes.QUERY_ENTITY_IDS; constructor(public payload: QueryParams) { } } export class ViewMoreIds implements Action { - readonly type = VIEW_MORE_IDS; + readonly type = SearchActionTypes.VIEW_MORE_IDS; constructor(public payload: string) { } } export class ClearSearch implements Action { - readonly type = CLEAR_SEARCH; + readonly type = SearchActionTypes.CLEAR_SEARCH; } export class CancelViewMore implements Action { - readonly type = CANCEL_VIEW_MORE; + readonly type = SearchActionTypes.CANCEL_VIEW_MORE; } export class LoadEntityIdsSuccess implements Action { - readonly type = LOAD_ENTITY_IDS_SUCCESS; + readonly type = SearchActionTypes.LOAD_ENTITY_IDS_SUCCESS; constructor(public payload: string[]) { } } export class LoadEntityIdsError implements Action { - readonly type = LOAD_ENTITY_IDS_ERROR; + readonly type = SearchActionTypes.LOAD_ENTITY_IDS_ERROR; constructor(public payload: Error) { } } -export type Actions = +export type SearchActionsUnion = | ViewMoreIds | CancelViewMore | ClearSearch diff --git a/ui/src/app/metadata/filter/component/search-dialog.component.ts b/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.ts b/ui/src/app/metadata/filter/container/edit-filter.component.ts index b1581c8a4..9ab55c3b7 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 { 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.ts b/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.ts b/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/metadata/domain/effect/filter-collection.effect.spec.ts b/ui/src/app/metadata/filter/effect/collection.effect.spec.ts similarity index 67% rename from ui/src/app/metadata/domain/effect/filter-collection.effect.spec.ts rename to ui/src/app/metadata/filter/effect/collection.effect.spec.ts index 178dfa650..8dfc5cb5d 100644 --- a/ui/src/app/metadata/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 { MetadataResolverService } from '../../domain/service/metadata-resolver.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; diff --git a/ui/src/app/metadata/domain/effect/filter-collection.effect.ts b/ui/src/app/metadata/filter/effect/collection.effect.ts similarity index 90% rename from ui/src/app/metadata/domain/effect/filter-collection.effect.ts rename to ui/src/app/metadata/filter/effect/collection.effect.ts index f9b5d8589..8874aee39 100644 --- a/ui/src/app/metadata/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 { MetadataResolverService } from '../../domain/service/metadata-resolver.service'; +import { MetadataFilter } from '../../domain/model'; +import { removeNulls } from '../../../shared/util'; +import { EntityAttributesFilter } from '../../domain/entity/filter/entity-attributes-filter'; /* istanbul ignore next */ @Injectable() diff --git a/ui/src/app/metadata/filter/effect/filter.effect.ts b/ui/src/app/metadata/filter/effect/filter.effect.ts index c74bd3893..d137129e7 100644 --- a/ui/src/app/metadata/filter/effect/filter.effect.ts +++ b/ui/src/app/metadata/filter/effect/filter.effect.ts @@ -6,42 +6,53 @@ 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 * 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 { 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'; +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(filterActions.SELECT_ID), + ofType(FilterActionTypes.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))) + map(data => new LoadEntityPreviewSuccess(data)), + catchError(error => of(new LoadEntityPreviewError(error))) ) ) ); @Effect() openContention$ = this.actions$.pipe( - ofType(collection.FilterCollectionActionTypes.UPDATE_FILTER_FAIL), + ofType(FilterCollectionActionTypes.UPDATE_FILTER_FAIL), map(action => action.payload), - withLatestFrom(this.store.select(fromCollection.getSelectedFilter)), + 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 collection.UpdateFilterRequest({ ...obj })), - reject: (obj) => this.store.dispatch(new filterActions.CancelCreateFilter()) + resolve: (obj) => this.store.dispatch(new UpdateFilterRequest({ ...obj })), + reject: (obj) => this.store.dispatch(new CancelCreateFilter()) }))) ) ) @@ -49,14 +60,14 @@ export class FilterEffects { @Effect({ dispatch: false }) saveFilterSuccess$ = this.actions$.pipe( - ofType(FilterCollectionActionTypes.ADD_FILTER_SUCCESS), + ofType(FilterCollectionActionTypes.ADD_FILTER_SUCCESS), switchMap(() => this.router.navigate(['/dashboard'])) ); @Effect() cancelChanges$ = this.actions$.pipe( - ofType(filterActions.CANCEL_CREATE_FILTER), - map(() => new collection.LoadFilterRequest()), + ofType(FilterActionTypes.CANCEL_CREATE_FILTER), + map(() => new LoadFilterRequest()), tap(() => this.router.navigate(['/dashboard'])) ); diff --git a/ui/src/app/metadata/filter/effect/search.effect.ts b/ui/src/app/metadata/filter/effect/search.effect.ts index d0e85f568..7642728e5 100644 --- a/ui/src/app/metadata/filter/effect/search.effect.ts +++ b/ui/src/app/metadata/filter/effect/search.effect.ts @@ -5,12 +5,17 @@ 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'; -import { MetadataProvider } from '../../domain/model/provider'; -import { MetadataResolverService } from '../../domain/service/metadata-resolver.service'; import { fromPromise } from 'rxjs/internal-compatibility'; import { SelectId } from '../action/filter.action'; @@ -21,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; @@ -42,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/domain/guard/filter-exists.guard.ts b/ui/src/app/metadata/filter/guard/filter-exists.guard.ts similarity index 93% rename from ui/src/app/metadata/domain/guard/filter-exists.guard.ts rename to ui/src/app/metadata/filter/guard/filter-exists.guard.ts index a7ac24414..dec524432 100644 --- a/ui/src/app/metadata/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 { MetadataResolverService } from '../../domain/service/metadata-resolver.service'; /** * Guards are hooks into the route resolution process, providing an opportunity diff --git a/ui/src/app/metadata/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/metadata/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/metadata/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/metadata/domain/reducer/filter-collection.reducer.ts b/ui/src/app/metadata/filter/reducer/collection.reducer.ts similarity index 69% rename from ui/src/app/metadata/domain/reducer/filter-collection.reducer.ts rename to ui/src/app/metadata/filter/reducer/collection.reducer.ts index f665a6c50..158bc0c7b 100644 --- a/ui/src/app/metadata/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/domain.type'; -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 index 8dd49f54f..33f3c4baf 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'; +} from '../action/collection.action'; +import { MDUI } from '../../domain/model'; import { MetadataFilter } from '../../domain/domain.type'; -import { EntityAttributesFilter } from '../../domain/entity/entity-attributes.filter'; +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 index 1b7d54c01..d10cba1fb 100644 --- a/ui/src/app/metadata/filter/reducer/filter.reducer.ts +++ b/ui/src/app/metadata/filter/reducer/filter.reducer.ts @@ -1,6 +1,12 @@ -import * as filter from '../action/filter.action'; -import * as search from '../action/search.action'; -import { FilterCollectionActionTypes, FilterCollectionActionsUnion } from '../../domain/action/filter-collection.action'; +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/domain.type'; export interface FilterState { @@ -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 index f94f5d385..5e971027c 100644 --- a/ui/src/app/metadata/filter/reducer/index.ts +++ b/ui/src/app/metadata/filter/reducer/index.ts @@ -1,25 +1,32 @@ 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 fromDomain from '../../domain/reducer/index'; 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); @@ -33,3 +40,14 @@ export const getIsLoading = createSelector(getSearchFromState, fromSearch.getLoa 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, fromDomain.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 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 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/metadata/metadata.reducer.ts b/ui/src/app/metadata/metadata.reducer.ts new file mode 100644 index 000000000..ecda6058c --- /dev/null +++ b/ui/src/app/metadata/metadata.reducer.ts @@ -0,0 +1,32 @@ +import * as fromRoot from '../app.reducer'; +import { FilterState } from './filter/reducer/filter.reducer'; +import { ResolverState } from './resolver/reducer'; + +import { reducers as filterReducers } from './filter/reducer'; +import { reducers as resolverReducers } from './filter/reducer'; + +export interface MetadataState { + filter: FilterState; + // provider: ProviderState; + resolver: ResolverState; +} + +export interface State extends fromRoot.State { + metadata: MetadataState; +} + +export const reducers = { + filter: filterReducers, + resolver: resolverReducers +}; + +/* + * 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/metadata/domain/action/provider-collection.action.ts b/ui/src/app/metadata/resolver/action/collection.action.ts similarity index 87% rename from ui/src/app/metadata/domain/action/provider-collection.action.ts rename to ui/src/app/metadata/resolver/action/collection.action.ts index 1f60e26c9..218f599b7 100644 --- a/ui/src/app/metadata/domain/action/provider-collection.action.ts +++ b/ui/src/app/metadata/resolver/action/collection.action.ts @@ -1,5 +1,5 @@ import { Action } from '@ngrx/store'; -import { MetadataProvider } from '../model/provider'; +import { MetadataResolver } from '../../domain/model'; import { Update } from '@ngrx/entity'; export enum ProviderCollectionActionTypes { @@ -40,7 +40,7 @@ export class SelectProvider implements Action { export class SelectProviderSuccess implements Action { readonly type = ProviderCollectionActionTypes.SELECT_SUCCESS; - constructor(public payload: MetadataProvider) { } + constructor(public payload: MetadataResolver) { } } export class LoadProviderRequest implements Action { @@ -52,7 +52,7 @@ export class LoadProviderRequest implements Action { export class LoadProviderSuccess implements Action { readonly type = ProviderCollectionActionTypes.LOAD_PROVIDER_SUCCESS; - constructor(public payload: MetadataProvider[]) { } + constructor(public payload: MetadataResolver[]) { } } export class LoadProviderError implements Action { @@ -64,31 +64,31 @@ export class LoadProviderError implements Action { export class UpdateProviderRequest implements Action { readonly type = ProviderCollectionActionTypes.UPDATE_PROVIDER_REQUEST; - constructor(public payload: MetadataProvider) { } + constructor(public payload: MetadataResolver) { } } export class UpdateProviderSuccess implements Action { readonly type = ProviderCollectionActionTypes.UPDATE_PROVIDER_SUCCESS; - constructor(public payload: Update) { } + constructor(public payload: Update) { } } export class UpdateProviderFail implements Action { readonly type = ProviderCollectionActionTypes.UPDATE_PROVIDER_FAIL; - constructor(public payload: MetadataProvider) { } + constructor(public payload: MetadataResolver) { } } export class AddProviderRequest implements Action { readonly type = ProviderCollectionActionTypes.ADD_PROVIDER; - constructor(public payload: MetadataProvider) { } + constructor(public payload: MetadataResolver) { } } export class AddProviderSuccess implements Action { readonly type = ProviderCollectionActionTypes.ADD_PROVIDER_SUCCESS; - constructor(public payload: MetadataProvider) { } + constructor(public payload: MetadataResolver) { } } export class AddProviderFail implements Action { @@ -100,19 +100,19 @@ export class AddProviderFail implements Action { export class RemoveProviderRequest implements Action { readonly type = ProviderCollectionActionTypes.REMOVE_PROVIDER; - constructor(public payload: MetadataProvider) { } + constructor(public payload: MetadataResolver) { } } export class RemoveProviderSuccess implements Action { readonly type = ProviderCollectionActionTypes.REMOVE_PROVIDER_SUCCESS; - constructor(public payload: MetadataProvider) { } + constructor(public payload: MetadataResolver) { } } export class RemoveProviderFail implements Action { readonly type = ProviderCollectionActionTypes.REMOVE_PROVIDER_FAIL; - constructor(public payload: MetadataProvider) { } + constructor(public payload: MetadataResolver) { } } export class UploadProviderRequest implements Action { diff --git a/ui/src/app/metadata-provider/action/copy.action.ts b/ui/src/app/metadata/resolver/action/copy.action.ts similarity index 90% rename from ui/src/app/metadata-provider/action/copy.action.ts rename to ui/src/app/metadata/resolver/action/copy.action.ts index a0e424374..54c20c477 100644 --- a/ui/src/app/metadata-provider/action/copy.action.ts +++ b/ui/src/app/metadata/resolver/action/copy.action.ts @@ -1,5 +1,5 @@ import { Action } from '@ngrx/store'; -import { MetadataProvider } from '../../domain/model/metadata-provider'; +import { MetadataResolver } from '../../domain/model'; export enum CopySourceActionTypes { CREATE_PROVIDER_COPY_REQUEST = '[Copy Resolver] Create Resolver Copy Request', @@ -24,7 +24,7 @@ export class CreateProviderCopyRequest implements Action { export class CreateProviderCopySuccess implements Action { readonly type = CopySourceActionTypes.CREATE_PROVIDER_COPY_SUCCESS; - constructor(public payload: MetadataProvider) { } + constructor(public payload: MetadataResolver) { } } export class CreateProviderCopyError implements Action { @@ -36,7 +36,7 @@ export class CreateProviderCopyError implements Action { export class UpdateProviderCopy implements Action { readonly type = CopySourceActionTypes.UPDATE_PROVIDER_COPY; - constructor(public payload: Partial) { } + constructor(public payload: Partial) { } } export class UpdateProviderCopySections implements Action { diff --git a/ui/src/app/metadata/domain/action/draft-collection.action.ts b/ui/src/app/metadata/resolver/action/draft.action.ts similarity index 59% rename from ui/src/app/metadata/domain/action/draft-collection.action.ts rename to ui/src/app/metadata/resolver/action/draft.action.ts index a5aef8dd3..f4bba2744 100644 --- a/ui/src/app/metadata/domain/action/draft-collection.action.ts +++ b/ui/src/app/metadata/resolver/action/draft.action.ts @@ -1,8 +1,8 @@ import { Action } from '@ngrx/store'; import { Update } from '@ngrx/entity/entity'; -import { MetadataProvider } from '../model/provider'; +import { MetadataResolver } from '../../domain/model'; -export enum DraftCollectionActionTypes { +export enum DraftActionTypes { FIND = '[Metadata Draft] Find', SELECT = '[Metadata Draft] Select', UPDATE_DRAFT_REQUEST = '[Metadata Draft] Update Request', @@ -21,90 +21,90 @@ export enum DraftCollectionActionTypes { export class FindDraft implements Action { - readonly type = DraftCollectionActionTypes.FIND; + readonly type = DraftActionTypes.FIND; constructor(public payload: string) { } } export class SelectDraft implements Action { - readonly type = DraftCollectionActionTypes.SELECT; + readonly type = DraftActionTypes.SELECT; constructor(public payload: string) { } } export class UpdateDraftRequest implements Action { - readonly type = DraftCollectionActionTypes.UPDATE_DRAFT_REQUEST; + readonly type = DraftActionTypes.UPDATE_DRAFT_REQUEST; - constructor(public payload: MetadataProvider) { } + constructor(public payload: MetadataResolver) { } } export class UpdateDraftSuccess implements Action { - readonly type = DraftCollectionActionTypes.UPDATE_DRAFT_SUCCESS; + readonly type = DraftActionTypes.UPDATE_DRAFT_SUCCESS; - constructor(public payload: Update) { } + constructor(public payload: Update) { } } export class UpdateDraftFail implements Action { - readonly type = DraftCollectionActionTypes.UPDATE_DRAFT_FAIL; + readonly type = DraftActionTypes.UPDATE_DRAFT_FAIL; - constructor(public payload: MetadataProvider) { } + constructor(public payload: MetadataResolver) { } } export class AddDraftRequest implements Action { - readonly type = DraftCollectionActionTypes.ADD_DRAFT; + readonly type = DraftActionTypes.ADD_DRAFT; - constructor(public payload: MetadataProvider) { } + constructor(public payload: MetadataResolver) { } } export class AddDraftSuccess implements Action { - readonly type = DraftCollectionActionTypes.ADD_DRAFT_SUCCESS; + readonly type = DraftActionTypes.ADD_DRAFT_SUCCESS; - constructor(public payload: MetadataProvider) { } + constructor(public payload: MetadataResolver) { } } export class AddDraftFail implements Action { - readonly type = DraftCollectionActionTypes.ADD_DRAFT_FAIL; + readonly type = DraftActionTypes.ADD_DRAFT_FAIL; constructor(public payload: any) { } } export class RemoveDraftRequest implements Action { - readonly type = DraftCollectionActionTypes.REMOVE_DRAFT; + readonly type = DraftActionTypes.REMOVE_DRAFT; - constructor(public payload: MetadataProvider) { } + constructor(public payload: MetadataResolver) { } } export class RemoveDraftSuccess implements Action { - readonly type = DraftCollectionActionTypes.REMOVE_DRAFT_SUCCESS; + readonly type = DraftActionTypes.REMOVE_DRAFT_SUCCESS; - constructor(public payload: MetadataProvider) { } + constructor(public payload: MetadataResolver) { } } export class RemoveDraftFail implements Action { - readonly type = DraftCollectionActionTypes.REMOVE_DRAFT_FAIL; + readonly type = DraftActionTypes.REMOVE_DRAFT_FAIL; - constructor(public payload: MetadataProvider) { } + constructor(public payload: MetadataResolver) { } } export class LoadDraftRequest implements Action { - readonly type = DraftCollectionActionTypes.LOAD_DRAFT_REQUEST; + readonly type = DraftActionTypes.LOAD_DRAFT_REQUEST; constructor() { } } export class LoadDraftSuccess implements Action { - readonly type = DraftCollectionActionTypes.LOAD_DRAFT_SUCCESS; + readonly type = DraftActionTypes.LOAD_DRAFT_SUCCESS; - constructor(public payload: MetadataProvider[]) { } + constructor(public payload: MetadataResolver[]) { } } export class LoadDraftError implements Action { - readonly type = DraftCollectionActionTypes.LOAD_DRAFT_ERROR; + readonly type = DraftActionTypes.LOAD_DRAFT_ERROR; constructor(public payload: any) { } } -export type DraftCollectionActionsUnion = +export type DraftActionsUnion = | LoadDraftRequest | LoadDraftSuccess | LoadDraftError diff --git a/ui/src/app/edit-provider/action/editor.action.ts b/ui/src/app/metadata/resolver/action/editor.action.ts similarity index 84% rename from ui/src/app/edit-provider/action/editor.action.ts rename to ui/src/app/metadata/resolver/action/editor.action.ts index 6e8744d61..80da7774e 100644 --- a/ui/src/app/edit-provider/action/editor.action.ts +++ b/ui/src/app/metadata/resolver/action/editor.action.ts @@ -1,5 +1,5 @@ import { Action } from '@ngrx/store'; -import { MetadataProvider } from '../../domain/model/metadata-provider'; +import { MetadataResolver } from '../../domain/model'; export const UPDATE_STATUS = '[Editor] Update Status'; export const UPDATE_SAVED = '[Editor] Update Saved'; @@ -17,7 +17,7 @@ export class UpdateStatus implements Action { export class UpdateChanges implements Action { readonly type = UPDATE_CHANGES; - constructor(public payload: MetadataProvider) { } + constructor(public payload: MetadataResolver) { } } export class CancelChanges implements Action { @@ -27,7 +27,7 @@ export class CancelChanges implements Action { export class SaveChanges implements Action { readonly type = SAVE_CHANGES; - constructor(public payload: MetadataProvider) { } + constructor(public payload: MetadataResolver) { } } export class ResetChanges implements Action { diff --git a/ui/src/app/metadata-provider/action/search.action.ts b/ui/src/app/metadata/resolver/action/search.action.ts similarity index 91% rename from ui/src/app/metadata-provider/action/search.action.ts rename to ui/src/app/metadata/resolver/action/search.action.ts index 9265f512e..7bfdd7d5b 100644 --- a/ui/src/app/metadata-provider/action/search.action.ts +++ b/ui/src/app/metadata/resolver/action/search.action.ts @@ -1,5 +1,4 @@ import { Action } from '@ngrx/store'; -import { MetadataProvider } from '../../domain/model/metadata-provider'; export enum SearchActionTypes { SEARCH_IDS = '[Search Resolver Ids] Request', diff --git a/ui/src/app/edit-provider/component/unsaved-dialog.component.html b/ui/src/app/metadata/resolver/component/unsaved-dialog.component.html similarity index 100% rename from ui/src/app/edit-provider/component/unsaved-dialog.component.html rename to ui/src/app/metadata/resolver/component/unsaved-dialog.component.html diff --git a/ui/src/app/edit-provider/component/unsaved-dialog.component.ts b/ui/src/app/metadata/resolver/component/unsaved-dialog.component.ts similarity index 65% rename from ui/src/app/edit-provider/component/unsaved-dialog.component.ts rename to ui/src/app/metadata/resolver/component/unsaved-dialog.component.ts index d412d069e..9373e352f 100644 --- a/ui/src/app/edit-provider/component/unsaved-dialog.component.ts +++ b/ui/src/app/metadata/resolver/component/unsaved-dialog.component.ts @@ -1,14 +1,10 @@ import { Component, Input, OnChanges } from '@angular/core'; -import { NgbModal, NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; import { Store, Action } from '@ngrx/store'; import { Subject } from 'rxjs/Subject'; -import { MetadataProvider } from '../../domain/model/metadata-provider'; import * as fromEditor from '../reducer'; -import { UpdateDraftRequest } from '../../domain/action/draft-collection.action'; -import { EntityDescriptorService } from '../../domain/service/entity-descriptor.service'; -import { SaveChanges, CancelChanges } from '../action/editor.action'; @Component({ selector: 'unsaved-dialog', diff --git a/ui/src/app/edit-provider/component/valid-form-icon.component.html b/ui/src/app/metadata/resolver/component/valid-form-icon.component.html similarity index 100% rename from ui/src/app/edit-provider/component/valid-form-icon.component.html rename to ui/src/app/metadata/resolver/component/valid-form-icon.component.html diff --git a/ui/src/app/edit-provider/component/valid-form-icon.component.ts b/ui/src/app/metadata/resolver/component/valid-form-icon.component.ts similarity index 74% rename from ui/src/app/edit-provider/component/valid-form-icon.component.ts rename to ui/src/app/metadata/resolver/component/valid-form-icon.component.ts index 389e5b0a3..4528f273b 100644 --- a/ui/src/app/edit-provider/component/valid-form-icon.component.ts +++ b/ui/src/app/metadata/resolver/component/valid-form-icon.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, OnChanges, ChangeDetectionStrategy } from '@angular/core'; +import { Component, Input, ChangeDetectionStrategy } from '@angular/core'; @Component({ selector: 'valid-form-icon', diff --git a/ui/src/app/edit-provider/component/wizard-nav.component.html b/ui/src/app/metadata/resolver/component/wizard-nav.component.html similarity index 100% rename from ui/src/app/edit-provider/component/wizard-nav.component.html rename to ui/src/app/metadata/resolver/component/wizard-nav.component.html diff --git a/ui/src/app/edit-provider/component/wizard-nav.component.spec.ts b/ui/src/app/metadata/resolver/component/wizard-nav.component.spec.ts similarity index 100% rename from ui/src/app/edit-provider/component/wizard-nav.component.spec.ts rename to ui/src/app/metadata/resolver/component/wizard-nav.component.spec.ts diff --git a/ui/src/app/edit-provider/component/wizard-nav.component.ts b/ui/src/app/metadata/resolver/component/wizard-nav.component.ts similarity index 100% rename from ui/src/app/edit-provider/component/wizard-nav.component.ts rename to ui/src/app/metadata/resolver/component/wizard-nav.component.ts diff --git a/ui/src/app/metadata-provider/container/blank-provider.component.html b/ui/src/app/metadata/resolver/container/blank-provider.component.html similarity index 100% rename from ui/src/app/metadata-provider/container/blank-provider.component.html rename to ui/src/app/metadata/resolver/container/blank-provider.component.html diff --git a/ui/src/app/metadata-provider/container/blank-provider.component.spec.ts b/ui/src/app/metadata/resolver/container/blank-provider.component.spec.ts similarity index 100% rename from ui/src/app/metadata-provider/container/blank-provider.component.spec.ts rename to ui/src/app/metadata/resolver/container/blank-provider.component.spec.ts diff --git a/ui/src/app/metadata-provider/container/blank-provider.component.ts b/ui/src/app/metadata/resolver/container/blank-provider.component.ts similarity index 58% rename from ui/src/app/metadata-provider/container/blank-provider.component.ts rename to ui/src/app/metadata/resolver/container/blank-provider.component.ts index b104ae129..c29fdc934 100644 --- a/ui/src/app/metadata-provider/container/blank-provider.component.ts +++ b/ui/src/app/metadata/resolver/container/blank-provider.component.ts @@ -4,16 +4,14 @@ import { Output, EventEmitter } from '@angular/core'; -import { FormBuilder, FormGroup, FormControl, FormControlName, Validators, AbstractControl } from '@angular/forms'; -import { Observable, Subject } from 'rxjs'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { Observable } from 'rxjs'; import { Store } from '@ngrx/store'; -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 * as fromResolver from '../reducer'; import { EntityValidators } from '../../domain/service/entity-validators.service'; -import { MetadataProvider } from '../../domain/domain.type'; -import { Resolver } from '../../domain/entity/provider'; +import { FileBackedHttpMetadataResolver } from '../../domain/entity/resolver/file-backed-http-metadata-resolver'; @Component({ selector: 'blank-provider-form', @@ -26,10 +24,10 @@ export class BlankProviderComponent implements OnInit { ids$: Observable; constructor( - private store: Store, + private store: Store, private fb: FormBuilder ) { - this.ids$ = this.store.select(fromCollections.getAllEntityIds); + this.ids$ = this.store.select(fromResolver.getAllEntityIds); } ngOnInit(): void { @@ -40,10 +38,10 @@ export class BlankProviderComponent implements OnInit { } next(): void { - const val: MetadataProvider = new Resolver({ + const val = new FileBackedHttpMetadataResolver({ entityId: this.providerForm.get('entityId').value, serviceProviderName: this.providerForm.get('serviceProviderName').value }); this.store.dispatch(new AddDraftRequest(val)); } -} /* istanbul ignore next */ +} diff --git a/ui/src/app/metadata-provider/container/confirm-copy.component.html b/ui/src/app/metadata/resolver/container/confirm-copy.component.html similarity index 100% rename from ui/src/app/metadata-provider/container/confirm-copy.component.html rename to ui/src/app/metadata/resolver/container/confirm-copy.component.html 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 85% 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..98162ad8b 100644 --- a/ui/src/app/metadata-provider/container/confirm-copy.component.ts +++ b/ui/src/app/metadata/resolver/container/confirm-copy.component.ts @@ -4,7 +4,7 @@ import { Store } from '@ngrx/store'; import { Observable } from 'rxjs'; import * as fromProvider from '../reducer'; -import { MetadataProvider } from '../../domain/domain.type'; +import { MetadataResolver } from '../../domain/domain.type'; import { FormGroup, FormBuilder } from '@angular/forms'; import { ProviderValueEmitter } from '../../domain/service/provider-change-emitter.service'; import { UpdateProviderCopy } from '../action/copy.action'; @@ -18,11 +18,11 @@ import { AddProviderRequest } from '../../domain/action/provider-collection.acti }) export class ConfirmCopyComponent { - copy$: Observable; - values$: Observable; + copy$: Observable; + values$: Observable; saving$: Observable; - provider: MetadataProvider; + provider: MetadataResolver; constructor( private store: Store, @@ -37,7 +37,7 @@ export class ConfirmCopyComponent { this.copy$.subscribe(p => this.provider = p); } - onSave(provider: MetadataProvider): void { + onSave(provider: MetadataResolver): void { this.store.dispatch(new AddProviderRequest(provider)); } } /* istanbul ignore next */ diff --git a/ui/src/app/metadata-provider/container/copy-provider.component.html b/ui/src/app/metadata/resolver/container/copy-provider.component.html similarity index 100% rename from ui/src/app/metadata-provider/container/copy-provider.component.html rename to ui/src/app/metadata/resolver/container/copy-provider.component.html diff --git a/ui/src/app/metadata-provider/container/copy-provider.component.spec.ts b/ui/src/app/metadata/resolver/container/copy-provider.component.spec.ts similarity index 100% rename from ui/src/app/metadata-provider/container/copy-provider.component.spec.ts rename to ui/src/app/metadata/resolver/container/copy-provider.component.spec.ts diff --git a/ui/src/app/metadata-provider/container/copy-provider.component.ts b/ui/src/app/metadata/resolver/container/copy-provider.component.ts similarity index 100% rename from ui/src/app/metadata-provider/container/copy-provider.component.ts rename to ui/src/app/metadata/resolver/container/copy-provider.component.ts diff --git a/ui/src/app/edit-provider/container/draft.component.html b/ui/src/app/metadata/resolver/container/draft.component.html similarity index 100% rename from ui/src/app/edit-provider/container/draft.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 95% rename from ui/src/app/edit-provider/container/draft.component.ts rename to ui/src/app/metadata/resolver/container/draft.component.ts index 490cf594c..13377a3ee 100644 --- a/ui/src/app/edit-provider/container/draft.component.ts +++ b/ui/src/app/metadata/resolver/container/draft.component.ts @@ -7,7 +7,7 @@ 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 { MetadataResolver } from '../../domain/model/metadata-provider'; import { SelectDraft } from '../../domain/action/draft-collection.action'; import * as fromCollection from '../../domain/reducer'; diff --git a/ui/src/app/edit-provider/container/editor.component.html b/ui/src/app/metadata/resolver/container/editor.component.html similarity index 100% rename from ui/src/app/edit-provider/container/editor.component.html rename to ui/src/app/metadata/resolver/container/editor.component.html diff --git a/ui/src/app/edit-provider/container/editor.component.ts b/ui/src/app/metadata/resolver/container/editor.component.ts similarity index 95% rename from ui/src/app/edit-provider/container/editor.component.ts rename to ui/src/app/metadata/resolver/container/editor.component.ts index b8a84c50f..22f7d112e 100644 --- a/ui/src/app/edit-provider/container/editor.component.ts +++ b/ui/src/app/metadata/resolver/container/editor.component.ts @@ -20,7 +20,7 @@ import { combineLatest, map, takeUntil, withLatestFrom, debounceTime, skipWhile, import { Store } from '@ngrx/store'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap/modal/modal'; -import { MetadataProvider } from '../../domain/model/metadata-provider'; +import { MetadataResolver } from '../../domain/model/metadata-provider'; import * as fromProviders from '../../domain/reducer'; import { UpdateProviderRequest } from '../../domain/action/provider-collection.action'; import * as fromEditor from '../reducer'; @@ -43,15 +43,15 @@ 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; + provider$: Observable; providerName$: Observable; - provider: MetadataProvider; + provider: MetadataResolver; editorIndex$: Observable; editor$: Observable; editor: EditorFlowDefinition[]; diff --git a/ui/src/app/metadata-provider/container/new-provider.component.html b/ui/src/app/metadata/resolver/container/new-provider.component.html similarity index 100% rename from ui/src/app/metadata-provider/container/new-provider.component.html rename to ui/src/app/metadata/resolver/container/new-provider.component.html diff --git a/ui/src/app/metadata-provider/container/new-provider.component.scss b/ui/src/app/metadata/resolver/container/new-provider.component.scss similarity index 100% rename from ui/src/app/metadata-provider/container/new-provider.component.scss rename to ui/src/app/metadata/resolver/container/new-provider.component.scss diff --git a/ui/src/app/metadata-provider/container/new-provider.component.spec.ts b/ui/src/app/metadata/resolver/container/new-provider.component.spec.ts similarity index 100% rename from ui/src/app/metadata-provider/container/new-provider.component.spec.ts rename to ui/src/app/metadata/resolver/container/new-provider.component.spec.ts diff --git a/ui/src/app/metadata-provider/container/new-provider.component.ts b/ui/src/app/metadata/resolver/container/new-provider.component.ts similarity index 100% rename from ui/src/app/metadata-provider/container/new-provider.component.ts rename to ui/src/app/metadata/resolver/container/new-provider.component.ts diff --git a/ui/src/app/edit-provider/container/provider.component.html b/ui/src/app/metadata/resolver/container/provider.component.html similarity index 100% rename from ui/src/app/edit-provider/container/provider.component.html rename to ui/src/app/metadata/resolver/container/provider.component.html diff --git a/ui/src/app/edit-provider/container/provider.component.scss b/ui/src/app/metadata/resolver/container/provider.component.scss similarity index 100% rename from ui/src/app/edit-provider/container/provider.component.scss rename to ui/src/app/metadata/resolver/container/provider.component.scss diff --git a/ui/src/app/edit-provider/container/provider.component.spec.ts b/ui/src/app/metadata/resolver/container/provider.component.spec.ts similarity index 100% rename from ui/src/app/edit-provider/container/provider.component.spec.ts rename to ui/src/app/metadata/resolver/container/provider.component.spec.ts diff --git a/ui/src/app/edit-provider/container/provider.component.ts b/ui/src/app/metadata/resolver/container/provider.component.ts similarity index 95% rename from ui/src/app/edit-provider/container/provider.component.ts rename to ui/src/app/metadata/resolver/container/provider.component.ts index 0ca698a6b..4178df52e 100644 --- a/ui/src/app/edit-provider/container/provider.component.ts +++ b/ui/src/app/metadata/resolver/container/provider.component.ts @@ -7,7 +7,7 @@ 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 { MetadataResolver } from '../../domain/model/metadata-provider'; import { SelectProvider } from '../../domain/action/provider-collection.action'; import * as fromProviders from '../../domain/reducer'; diff --git a/ui/src/app/metadata-provider/container/upload-provider.component.html b/ui/src/app/metadata/resolver/container/upload-provider.component.html similarity index 100% rename from ui/src/app/metadata-provider/container/upload-provider.component.html rename to ui/src/app/metadata/resolver/container/upload-provider.component.html diff --git a/ui/src/app/metadata-provider/container/upload-provider.component.spec.ts b/ui/src/app/metadata/resolver/container/upload-provider.component.spec.ts similarity index 100% rename from ui/src/app/metadata-provider/container/upload-provider.component.spec.ts rename to ui/src/app/metadata/resolver/container/upload-provider.component.spec.ts diff --git a/ui/src/app/metadata-provider/container/upload-provider.component.ts b/ui/src/app/metadata/resolver/container/upload-provider.component.ts similarity index 100% rename from ui/src/app/metadata-provider/container/upload-provider.component.ts rename to ui/src/app/metadata/resolver/container/upload-provider.component.ts diff --git a/ui/src/app/edit-provider/container/wizard.component.html b/ui/src/app/metadata/resolver/container/wizard.component.html similarity index 100% rename from ui/src/app/edit-provider/container/wizard.component.html rename to ui/src/app/metadata/resolver/container/wizard.component.html diff --git a/ui/src/app/edit-provider/container/wizard.component.scss b/ui/src/app/metadata/resolver/container/wizard.component.scss similarity index 100% rename from ui/src/app/edit-provider/container/wizard.component.scss rename to ui/src/app/metadata/resolver/container/wizard.component.scss diff --git a/ui/src/app/edit-provider/container/wizard.component.ts b/ui/src/app/metadata/resolver/container/wizard.component.ts similarity index 95% rename from ui/src/app/edit-provider/container/wizard.component.ts rename to ui/src/app/metadata/resolver/container/wizard.component.ts index d7020cd73..4aeb7022e 100644 --- a/ui/src/app/edit-provider/container/wizard.component.ts +++ b/ui/src/app/metadata/resolver/container/wizard.component.ts @@ -19,7 +19,7 @@ import { Store } from '@ngrx/store'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { MetadataProvider } from '../../domain/model/metadata-provider'; +import { MetadataResolver } from '../../domain/model/metadata-provider'; import * as fromCollections from '../../domain/reducer'; import * as draftActions from '../../domain/action/draft-collection.action'; import { AddProviderRequest, RemoveProviderRequest } from '../../domain/action/provider-collection.action'; @@ -42,12 +42,12 @@ export class WizardComponent implements OnInit, OnDestroy, CanComponentDeactivat private ngUnsubscribe: Subject = new Subject(); - provider$: Observable; - provider: MetadataProvider; + provider$: Observable; + provider: MetadataResolver; providerName$: Observable; - changes$: Observable; - changes: MetadataProvider; - latest: MetadataProvider; + changes$: Observable; + changes: MetadataResolver; + latest: MetadataResolver; wizardIndex$: Observable; currentPage$: Observable; diff --git a/ui/src/app/edit-provider/editor-definition.const.ts b/ui/src/app/metadata/resolver/editor-definition.const.ts similarity index 100% rename from ui/src/app/edit-provider/editor-definition.const.ts rename to ui/src/app/metadata/resolver/editor-definition.const.ts diff --git a/ui/src/app/metadata-provider/effect/copy.effect.ts b/ui/src/app/metadata/resolver/effect/copy.effect.ts similarity index 100% rename from ui/src/app/metadata-provider/effect/copy.effect.ts rename to ui/src/app/metadata/resolver/effect/copy.effect.ts diff --git a/ui/src/app/metadata/domain/effect/draft-collection.effect.spec.ts b/ui/src/app/metadata/resolver/effect/draft-collection.effect.spec.ts similarity index 87% rename from ui/src/app/metadata/domain/effect/draft-collection.effect.spec.ts rename to ui/src/app/metadata/resolver/effect/draft-collection.effect.spec.ts index 1dc4c8851..06e1c6c3e 100644 --- a/ui/src/app/metadata/domain/effect/draft-collection.effect.spec.ts +++ b/ui/src/app/metadata/resolver/effect/draft-collection.effect.spec.ts @@ -4,7 +4,7 @@ import { Actions } from '@ngrx/effects'; import { TestActions, getActions } from '../../../../testing/effect.util'; import { DraftCollectionEffects, getPayload } from './draft-collection.effects'; import { EntityDraftService } from '../service/entity-draft.service'; -import { MetadataProvider } from '../model'; +import { MetadataResolver } from '../model'; import { Router } from '@angular/router'; import { RouterStub } from '../../../../testing/router.stub'; import { AddDraftRequest } from '../action/draft-collection.action'; @@ -24,9 +24,9 @@ describe('Draft Collection Effects', () => { useValue: { query: () => { }, find: (id: string) => { }, - save: (provider: MetadataProvider) => { }, - remove: (provider: MetadataProvider) => { }, - update: (provider: MetadataProvider) => { } + save: (provider: MetadataResolver) => { }, + remove: (provider: MetadataResolver) => { }, + update: (provider: MetadataResolver) => { } }, }, { provide: Actions, useFactory: getActions }, diff --git a/ui/src/app/metadata/domain/effect/draft-collection.effects.ts b/ui/src/app/metadata/resolver/effect/draft-collection.effects.ts similarity index 98% rename from ui/src/app/metadata/domain/effect/draft-collection.effects.ts rename to ui/src/app/metadata/resolver/effect/draft-collection.effects.ts index 5c0eef714..772ea37d1 100644 --- a/ui/src/app/metadata/domain/effect/draft-collection.effects.ts +++ b/ui/src/app/metadata/resolver/effect/draft-collection.effects.ts @@ -10,7 +10,7 @@ import { switchMap, map, catchError, tap } from 'rxjs/operators'; import { DraftCollectionActionTypes, DraftCollectionActionsUnion } from '../action/draft-collection.action'; import * as actions from '../action/draft-collection.action'; -import { MetadataProvider } from '../../domain/model/provider'; +import { MetadataResolver } from '../../domain/model/provider'; import { EntityDraftService } from '../../domain/service/entity-draft.service'; export const getPayload = (action: any) => action.payload; diff --git a/ui/src/app/edit-provider/effect/editor.effect.ts b/ui/src/app/metadata/resolver/effect/editor.effect.ts similarity index 97% rename from ui/src/app/edit-provider/effect/editor.effect.ts rename to ui/src/app/metadata/resolver/effect/editor.effect.ts index 1e14ca360..4d9fee1e8 100644 --- a/ui/src/app/edit-provider/effect/editor.effect.ts +++ b/ui/src/app/metadata/resolver/effect/editor.effect.ts @@ -13,7 +13,7 @@ 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 { MetadataResolver } from '../../domain/model/metadata-provider'; import { EntityDescriptorService } from '../../domain/service/entity-descriptor.service'; import { Router } from '@angular/router'; import { Store } from '@ngrx/store'; diff --git a/ui/src/app/metadata/domain/effect/provider-collection.effect.spec.ts b/ui/src/app/metadata/resolver/effect/provider-collection.effect.spec.ts similarity index 100% rename from ui/src/app/metadata/domain/effect/provider-collection.effect.spec.ts rename to ui/src/app/metadata/resolver/effect/provider-collection.effect.spec.ts diff --git a/ui/src/app/metadata/domain/effect/provider-collection.effects.ts b/ui/src/app/metadata/resolver/effect/provider-collection.effects.ts similarity index 100% rename from ui/src/app/metadata/domain/effect/provider-collection.effects.ts rename to ui/src/app/metadata/resolver/effect/provider-collection.effects.ts diff --git a/ui/src/app/metadata-provider/effect/search.effect.ts b/ui/src/app/metadata/resolver/effect/search.effect.ts similarity index 100% rename from ui/src/app/metadata-provider/effect/search.effect.ts rename to ui/src/app/metadata/resolver/effect/search.effect.ts diff --git a/ui/src/app/edit-provider/effect/wizard.effect.ts b/ui/src/app/metadata/resolver/effect/wizard.effect.ts similarity index 95% rename from ui/src/app/edit-provider/effect/wizard.effect.ts rename to ui/src/app/metadata/resolver/effect/wizard.effect.ts index b60b95069..d7c6d23d3 100644 --- a/ui/src/app/edit-provider/effect/wizard.effect.ts +++ b/ui/src/app/metadata/resolver/effect/wizard.effect.ts @@ -7,7 +7,7 @@ import * as editorActions from '../action/editor.action'; import * as draft from '../../domain/action/draft-collection.action'; import * as provider from '../../domain/action/provider-collection.action'; import { ProviderCollectionActionTypes } from '../../domain/action/provider-collection.action'; -import { MetadataProvider } from '../../domain/model/metadata-provider'; +import { MetadataResolver } from '../../domain/model/metadata-provider'; import { EntityDraftService } from '../../domain/service/entity-draft.service'; @Injectable() diff --git a/ui/src/app/metadata-provider/guard/copy-isset.guard.ts b/ui/src/app/metadata/resolver/guard/copy-isset.guard.ts similarity index 100% rename from ui/src/app/metadata-provider/guard/copy-isset.guard.ts rename to ui/src/app/metadata/resolver/guard/copy-isset.guard.ts diff --git a/ui/src/app/metadata-provider/metadata-provider.module.ts b/ui/src/app/metadata/resolver/metadata-provider.module.ts similarity index 100% rename from ui/src/app/metadata-provider/metadata-provider.module.ts rename to ui/src/app/metadata/resolver/metadata-provider.module.ts diff --git a/ui/src/app/metadata/domain/reducer/provider-collection.reducer.spec.ts b/ui/src/app/metadata/resolver/reducer/collection.reducer.spec.ts similarity index 63% rename from ui/src/app/metadata/domain/reducer/provider-collection.reducer.spec.ts rename to ui/src/app/metadata/resolver/reducer/collection.reducer.spec.ts index ba6ae362b..93e377342 100644 --- a/ui/src/app/metadata/domain/reducer/provider-collection.reducer.spec.ts +++ b/ui/src/app/metadata/resolver/reducer/collection.reducer.spec.ts @@ -1,23 +1,23 @@ -import { reducer } from './provider-collection.reducer'; -import * as fromProvider from './provider-collection.reducer'; -import * as providerActions from '../action/provider-collection.action'; -import { MetadataResolver } from '../model'; +import { reducer } from './collection.reducer'; +import * as fromCollection from './collection.reducer'; +import * as resolverActions from '../action/collection.action'; +import { MetadataResolver } from '../../domain/model'; -let providers: MetadataResolver[] = [ +let resolvers: MetadataResolver[] = [ { id: '1', entityId: 'foo', serviceProviderName: 'bar', createdDate: 'Tue Apr 17 2018 13:33:54 GMT-0700 (MST)' } as MetadataResolver, { id: '2', entityId: 'baz', serviceProviderName: 'fin', createdDate: 'Tue Apr 17 2018 13:34:07 GMT-0700 (MST)' } as MetadataResolver ], - snapshot: fromProvider.ProviderCollectionState = { - ids: [providers[0].id, providers[1].id], + snapshot: fromCollection.CollectionState = { + ids: [resolvers[0].id, resolvers[1].id], entities: { - [providers[0].id]: providers[0], - [providers[1].id]: providers[1] + [resolvers[0].id]: resolvers[0], + [resolvers[1].id]: resolvers[1] }, selectedProviderId: null }; describe('Resolver Reducer', () => { - const initialState: fromProvider.ProviderCollectionState = { + const initialState: fromCollection.CollectionState = { ids: [], entities: {}, selectedProviderId: null, @@ -32,8 +32,8 @@ describe('Resolver Reducer', () => { }); describe('Load Providers: Success', () => { - it('should add the loaded providers to the collection', () => { - const action = new providerActions.LoadProviderSuccess(providers); + it('should add the loaded resolvers to the collection', () => { + const action = new resolverActions.LoadProviderSuccess(resolvers); const result = reducer(initialState, action); expect(result).toEqual( @@ -44,16 +44,16 @@ describe('Resolver Reducer', () => { describe('Update Providers: Success', () => { it('should update the draft of the specified id', () => { - let changes = { ...providers[1], serviceEnabled: true }, + let changes = { ...resolvers[1], serviceEnabled: true }, expected = { - ids: [providers[0].id, providers[1].id], + ids: [resolvers[0].id, resolvers[1].id], entities: { - [providers[0].id]: providers[0], - [providers[1].id]: changes + [resolvers[0].id]: resolvers[0], + [resolvers[1].id]: changes }, selectedProviderId: null }; - const action = new providerActions.UpdateProviderSuccess({id: changes.id, changes}); + const action = new resolverActions.UpdateProviderSuccess({id: changes.id, changes}); const result = reducer({ ...snapshot }, action); expect(result).toEqual( @@ -62,8 +62,8 @@ describe('Resolver Reducer', () => { }); it('should return state if the entityId is not found', () => { - let changes = { ...providers[1], serviceEnabled: true, id: '4' }; - const action = new providerActions.UpdateProviderSuccess({id: changes.id, changes}); + let changes = { ...resolvers[1], serviceEnabled: true, id: '4' }; + const action = new resolverActions.UpdateProviderSuccess({id: changes.id, changes}); const result = reducer({ ...snapshot }, action); expect(result).toEqual(snapshot); @@ -74,7 +74,7 @@ describe('Resolver Reducer', () => { it('should update the selected draft id', () => { let id = 'foo', expected = { ...snapshot, selectedProviderId: id }; - const action = new providerActions.SelectProvider(id); + const action = new resolverActions.SelectProvider(id); const result = reducer({ ...snapshot }, action); expect(result).toEqual( diff --git a/ui/src/app/metadata/domain/reducer/provider-collection.reducer.ts b/ui/src/app/metadata/resolver/reducer/collection.reducer.ts similarity index 57% rename from ui/src/app/metadata/domain/reducer/provider-collection.reducer.ts rename to ui/src/app/metadata/resolver/reducer/collection.reducer.ts index 13497e6f7..2505b4210 100644 --- a/ui/src/app/metadata/domain/reducer/provider-collection.reducer.ts +++ b/ui/src/app/metadata/resolver/reducer/collection.reducer.ts @@ -1,28 +1,25 @@ -import { createSelector } from '@ngrx/store'; import { EntityState, EntityAdapter, createEntityAdapter } from '@ngrx/entity'; +import { MetadataResolver } from '../../domain/model'; +import { ProviderCollectionActionsUnion, ProviderCollectionActionTypes } from '../action/collection.action'; -import { MetadataProvider } from '../../domain/model/provider'; -import * as provider from '../action/provider-collection.action'; -import { ProviderCollectionActionsUnion, ProviderCollectionActionTypes } from '../action/provider-collection.action'; - -export interface ProviderCollectionState extends EntityState { +export interface CollectionState extends EntityState { selectedProviderId: string | null; } -export function sortByDate(a: MetadataProvider, b: MetadataProvider): number { +export function sortByDate(a: MetadataResolver, b: MetadataResolver): number { return a.createdDate.localeCompare(b.createdDate); } -export const adapter: EntityAdapter = createEntityAdapter({ +export const adapter: EntityAdapter = createEntityAdapter({ sortComparer: sortByDate, - selectId: (model: MetadataProvider) => model.id + selectId: (model: MetadataResolver) => model.id }); -export const initialState: ProviderCollectionState = adapter.getInitialState({ +export const initialState: CollectionState = adapter.getInitialState({ selectedProviderId: null }); -export function reducer(state = initialState, action: provider.ProviderCollectionActionsUnion): ProviderCollectionState { +export function reducer(state = initialState, action: ProviderCollectionActionsUnion): CollectionState { switch (action.type) { case ProviderCollectionActionTypes.LOAD_PROVIDER_SUCCESS: { return adapter.addAll(action.payload, { @@ -48,7 +45,7 @@ export function reducer(state = initialState, action: provider.ProviderCollectio } } -export const getSelectedProviderId = (state: ProviderCollectionState) => state.selectedProviderId; +export const getSelectedProviderId = (state: CollectionState) => state.selectedProviderId; export const { selectIds: selectProviderIds, selectEntities: selectProviderEntities, diff --git a/ui/src/app/metadata-provider/reducer/copy.reducer.spec.ts b/ui/src/app/metadata/resolver/reducer/copy.reducer.spec.ts similarity index 100% rename from ui/src/app/metadata-provider/reducer/copy.reducer.spec.ts rename to ui/src/app/metadata/resolver/reducer/copy.reducer.spec.ts diff --git a/ui/src/app/metadata-provider/reducer/copy.reducer.ts b/ui/src/app/metadata/resolver/reducer/copy.reducer.ts similarity index 88% rename from ui/src/app/metadata-provider/reducer/copy.reducer.ts rename to ui/src/app/metadata/resolver/reducer/copy.reducer.ts index 416086eba..b9a35caa8 100644 --- a/ui/src/app/metadata-provider/reducer/copy.reducer.ts +++ b/ui/src/app/metadata/resolver/reducer/copy.reducer.ts @@ -1,14 +1,12 @@ -import { createSelector, createFeatureSelector } from '@ngrx/store'; import { CopySourceActionTypes, CopySourceActionUnion } from '../action/copy.action'; -import { MetadataFilter, MetadataProvider } from '../../domain/domain.type'; -import { CopyProviderComponent } from '../container/copy-provider.component'; -import { ProviderCollectionActionsUnion, ProviderCollectionActionTypes } from '../../domain/action/provider-collection.action'; +import { MetadataResolver } from '../../domain/model'; +import { ProviderCollectionActionsUnion, ProviderCollectionActionTypes } from '../action/collection.action'; export interface CopyState { target: string; serviceProviderName: string; entityId: string; - provider: MetadataProvider; + provider: MetadataResolver; saving: boolean; sections: string[]; } diff --git a/ui/src/app/metadata/domain/reducer/draft-collection.reducer.spec.ts b/ui/src/app/metadata/resolver/reducer/draft.reducer.spec.ts similarity index 92% rename from ui/src/app/metadata/domain/reducer/draft-collection.reducer.spec.ts rename to ui/src/app/metadata/resolver/reducer/draft.reducer.spec.ts index 0ec6b9ff0..936581814 100644 --- a/ui/src/app/metadata/domain/reducer/draft-collection.reducer.spec.ts +++ b/ui/src/app/metadata/resolver/reducer/draft.reducer.spec.ts @@ -1,13 +1,13 @@ -import { reducer, adapter } from './draft-collection.reducer'; -import * as fromDrafts from './draft-collection.reducer'; -import * as draftActions from '../action/draft-collection.action'; +import { reducer, adapter } from './draft.reducer'; +import * as fromDrafts from './draft.reducer'; +import * as draftActions from '../action/draft.action'; import { MetadataResolver } from '../../domain/model'; let drafts: MetadataResolver[] = [ { entityId: 'foo', serviceProviderName: 'bar' } as MetadataResolver, { entityId: 'baz', serviceProviderName: 'fin' } as MetadataResolver ], - snapshot: fromDrafts.DraftCollectionState = { + snapshot: fromDrafts.DraftState = { ids: [drafts[0].entityId, drafts[1].entityId], entities: { [drafts[0].entityId]: drafts[0], @@ -17,7 +17,7 @@ let drafts: MetadataResolver[] = [ }; describe('Draft Reducer', () => { - const initialState: fromDrafts.DraftCollectionState = { + const initialState: fromDrafts.DraftState = { ids: [], entities: {}, selectedDraftId: null diff --git a/ui/src/app/metadata/resolver/reducer/draft.reducer.ts b/ui/src/app/metadata/resolver/reducer/draft.reducer.ts new file mode 100644 index 000000000..987883aaf --- /dev/null +++ b/ui/src/app/metadata/resolver/reducer/draft.reducer.ts @@ -0,0 +1,59 @@ +import { EntityState, EntityAdapter, createEntityAdapter } from '@ngrx/entity'; + +import { MetadataResolver } from '../../domain/model'; +import { DraftActionsUnion, DraftActionTypes } from '../action/draft.action'; + +export interface DraftState extends EntityState { + selectedDraftId: string | null; +} + +export function sortByName(a: MetadataResolver, b: MetadataResolver): number { + return a.serviceProviderName.localeCompare(b.serviceProviderName); +} + +export const adapter: EntityAdapter = createEntityAdapter({ + sortComparer: sortByName, + selectId: (model: MetadataResolver) => model.entityId +}); + +export const initialState: DraftState = adapter.getInitialState({ + selectedDraftId: null, +}); + +export function reducer(state = initialState, action: DraftActionsUnion): DraftState { + switch (action.type) { + case DraftActionTypes.LOAD_DRAFT_SUCCESS: { + return adapter.addMany(action.payload, { + ...state, + selectedDraftId: state.selectedDraftId, + }); + } + + case DraftActionTypes.UPDATE_DRAFT_SUCCESS: { + return adapter.updateOne(action.payload, state); + } + + case DraftActionTypes.REMOVE_DRAFT_SUCCESS: { + return adapter.removeOne(action.payload.entityId, state); + } + + case DraftActionTypes.SELECT: { + return { + ...state, + selectedDraftId: action.payload, + }; + } + + default: { + return state; + } + } +} + +export const getSelectedDraftId = (state: DraftState) => state.selectedDraftId; +export const { + selectIds: selectDraftIds, + selectEntities: selectDraftEntities, + selectAll: selectAllDrafts, + selectTotal: selectDraftTotal +} = adapter.getSelectors(); diff --git a/ui/src/app/edit-provider/reducer/editor.reducer.spec.ts b/ui/src/app/metadata/resolver/reducer/editor.reducer.spec.ts similarity index 90% rename from ui/src/app/edit-provider/reducer/editor.reducer.spec.ts rename to ui/src/app/metadata/resolver/reducer/editor.reducer.spec.ts index d3013c83a..9e8e3e6d3 100644 --- a/ui/src/app/edit-provider/reducer/editor.reducer.spec.ts +++ b/ui/src/app/metadata/resolver/reducer/editor.reducer.spec.ts @@ -1,20 +1,20 @@ import { reducer } from './editor.reducer'; import * as fromEditor from './editor.reducer'; import * as actions from '../action/editor.action'; -import * as collectionActions from '../../domain/action/provider-collection.action'; -import { MetadataProvider } from '../../domain/model/metadata-provider'; +import * as collectionActions from '../action/collection.action'; +import { MetadataResolver } from '../../domain/model'; describe('Editor Reducer', () => { const initialState: fromEditor.EditorState = { saving: false, formStatus: {}, - changes: {} as MetadataProvider + changes: {} as MetadataResolver }; const changes = { entityId: 'foo', serviceProviderName: 'bar' - } as MetadataProvider; + } as MetadataResolver; describe('undefined action', () => { it('should return the default state', () => { @@ -121,7 +121,7 @@ describe('Editor Reducer', () => { it('should aggregate the status', () => { expect(fromEditor.isEditorValid({ saving: false, - changes: {} as MetadataProvider, + changes: {} as MetadataResolver, formStatus: { organization: 'INVALID', foo: 'VALID' @@ -132,13 +132,13 @@ describe('Editor Reducer', () => { it('should calculate a saved status based on changes', () => { expect(fromEditor.isEditorSaved({ saving: false, - changes: {} as MetadataProvider, + changes: {} as MetadataResolver, formStatus: {} })).toBe(true); expect(fromEditor.isEditorSaved({ saving: false, - changes: {organization: {}, entityId: 'bar'} as MetadataProvider, + changes: {organization: {}, entityId: 'bar'} as MetadataResolver, formStatus: {} })).toBe(false); }); @@ -146,21 +146,21 @@ describe('Editor Reducer', () => { it('should return current changes', () => { expect(fromEditor.getChanges({ saving: false, - changes: {} as MetadataProvider, + changes: {} as MetadataResolver, formStatus: {} - })).toEqual({} as MetadataProvider); + })).toEqual({} as MetadataResolver); }); it('should return `saving` status', () => { expect(fromEditor.isEditorSaving({ saving: false, - changes: {} as MetadataProvider, + changes: {} as MetadataResolver, formStatus: {} })).toBe(false); expect(fromEditor.isEditorSaving({ saving: true, - changes: {} as MetadataProvider, + changes: {} as MetadataResolver, formStatus: {} })).toBe(true); }); diff --git a/ui/src/app/edit-provider/reducer/editor.reducer.ts b/ui/src/app/metadata/resolver/reducer/editor.reducer.ts similarity index 84% rename from ui/src/app/edit-provider/reducer/editor.reducer.ts rename to ui/src/app/metadata/resolver/reducer/editor.reducer.ts index 1513c1403..dfc90db18 100644 --- a/ui/src/app/edit-provider/reducer/editor.reducer.ts +++ b/ui/src/app/metadata/resolver/reducer/editor.reducer.ts @@ -1,20 +1,17 @@ -import { createSelector, createFeatureSelector } from '@ngrx/store'; -import { MetadataProvider } from '../../domain/model/metadata-provider'; +import { MetadataResolver } from '../../domain/model'; import * as editor from '../action/editor.action'; -import * as provider from '../../domain/action/provider-collection.action'; -import { ProviderCollectionActionTypes, ProviderCollectionActionsUnion } from '../../domain/action/provider-collection.action'; -import * as fromRoot from '../../core/reducer'; +import { ProviderCollectionActionTypes, ProviderCollectionActionsUnion } from '../action/collection.action'; export interface EditorState { saving: boolean; formStatus: { [key: string]: string }; - changes: MetadataProvider; + changes: MetadataResolver; } export const initialState: EditorState = { saving: false, formStatus: {}, - changes: {} as MetadataProvider + changes: {} as MetadataResolver }; export function reducer(state = initialState, action: editor.Actions | ProviderCollectionActionsUnion): EditorState { diff --git a/ui/src/app/metadata/resolver/reducer/index.ts b/ui/src/app/metadata/resolver/reducer/index.ts new file mode 100644 index 000000000..c02e8386a --- /dev/null +++ b/ui/src/app/metadata/resolver/reducer/index.ts @@ -0,0 +1,103 @@ +import { createSelector, createFeatureSelector } from '@ngrx/store'; +import * as fromRoot from '../../../app.reducer'; +import * as fromEditor from './editor.reducer'; +import * as fromSearch from './search.reducer'; +import * as fromCopy from './copy.reducer'; +import * as fromDraft from './draft.reducer'; +import * as fromCollection from './collection.reducer'; + +import { combineAllFn, getEntityIdsFn, getInCollectionFn, doesExistFn } from '../../metadata.reducer'; + +export interface ResolverState { + editor: fromEditor.EditorState; + copy: fromCopy.CopyState; + search: fromSearch.SearchState; + draft: fromDraft.DraftState; + collection: fromCollection.CollectionState; +} + +export const reducers = { + copy: fromCopy.reducer, + search: fromSearch.reducer, + editor: fromEditor.reducer +}; + +export interface State extends fromRoot.State { + 'resolver': ResolverState; +} + +export const getResolverState = createFeatureSelector('resolver'); + +export const getCollectionStateFn = (state: ResolverState) => state.collection; +export const getDraftStateFn = (state: ResolverState) => state.draft; +export const getEditorStateFn = (state: ResolverState) => state.editor; +export const getCopyStateFn = (state: ResolverState) => state.copy; +export const getSearchStateFn = (state: ResolverState) => state.search; + +export const getCollectionState = createSelector(getResolverState, getCollectionStateFn); +export const getDraftState = createSelector(getResolverState, getDraftStateFn); +export const getEditorState = createSelector(getResolverState, getEditorStateFn); +export const getCopyState = createSelector(getResolverState, getCopyStateFn); +export const getSearchState = createSelector(getResolverState, getSearchStateFn); + +/* +Editor State +*/ + +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); + +/* +Copy State +*/ + +export const getCopy = createSelector(getCopyState, fromCopy.getCopy); +export const getSaving = createSelector(getCopyState, fromCopy.getSaving); +export const getAttributes = createSelector(getCopyState, fromCopy.getCopyAttributes); +export const getSectionsToCopy = createSelector(getCopyState, fromCopy.getCopySections); + +/* +Search State +*/ + +export const getSearchResults = createSelector(getSearchState, fromSearch.getMatches); +export const getSearchQuery = createSelector(getSearchState, fromSearch.getQuery); +export const getSearchLoading = createSelector(getSearchState, fromSearch.getSearching); + +/* +Collection State +*/ + +export const getProviderEntities = createSelector(getCollectionState, fromCollection.selectProviderEntities); +export const getSelectedProviderId = createSelector(getCollectionState, fromCollection.getSelectedProviderId); +export const getProviderIds = createSelector(getCollectionState, fromCollection.selectProviderIds); + +export const getProviderCollection = createSelector(getCollectionState, getProviderIds, fromCollection.selectAllProviders); +export const getSelectedProvider = createSelector(getProviderEntities, getSelectedProviderId, getInCollectionFn); + + +/* +Draft State +*/ + +export const getDraftEntities = createSelector(getDraftState, fromDraft.selectDraftEntities); +export const getDraftIds = createSelector(getDraftState, fromDraft.selectDraftIds); +export const getDraftCollection = createSelector(getDraftState, getDraftIds, fromDraft.selectAllDrafts); +export const getSelectedDraftId = createSelector(getDraftState, fromDraft.getSelectedDraftId); + +export const getSelectedDraft = createSelector(getDraftEntities, getSelectedDraftId, getInCollectionFn); +export const isSelectedProviderInCollection = createSelector(getProviderIds, getSelectedProviderId, doesExistFn); +export const isSelectedDraftInCollection = createSelector(getDraftIds, getSelectedDraftId, doesExistFn); + +/* +Combine Drafts and Providers +*/ + +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/metadata-provider/reducer/search.reducer.spec.ts b/ui/src/app/metadata/resolver/reducer/search.reducer.spec.ts similarity index 100% rename from ui/src/app/metadata-provider/reducer/search.reducer.spec.ts rename to ui/src/app/metadata/resolver/reducer/search.reducer.spec.ts diff --git a/ui/src/app/metadata-provider/reducer/search.reducer.ts b/ui/src/app/metadata/resolver/reducer/search.reducer.ts similarity index 95% rename from ui/src/app/metadata-provider/reducer/search.reducer.ts rename to ui/src/app/metadata/resolver/reducer/search.reducer.ts index 734057433..60f1b8e72 100644 --- a/ui/src/app/metadata-provider/reducer/search.reducer.ts +++ b/ui/src/app/metadata/resolver/reducer/search.reducer.ts @@ -1,5 +1,5 @@ import { SearchActionTypes, SearchActionUnion, SearchIds, SearchIdsSuccess, SearchIdsError } from '../action/search.action'; -import { MetadataProvider } from '../../domain/domain.type'; +import { MetadataResolver } from '../../domain/domain.type'; export interface SearchState { query: string; diff --git a/ui/src/app/metadata/resolver/resolver.module.ts b/ui/src/app/metadata/resolver/resolver.module.ts index e69de29bb..9df42ed70 100644 --- a/ui/src/app/metadata/resolver/resolver.module.ts +++ b/ui/src/app/metadata/resolver/resolver.module.ts @@ -0,0 +1,84 @@ +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 ResolverModule { } diff --git a/ui/src/app/metadata-provider/directive/info-label.directive.spec.ts b/ui/src/app/shared/directive/info-label.directive.spec.ts similarity index 100% rename from ui/src/app/metadata-provider/directive/info-label.directive.spec.ts rename to ui/src/app/shared/directive/info-label.directive.spec.ts diff --git a/ui/src/app/metadata-provider/directive/info-label.directive.ts b/ui/src/app/shared/directive/info-label.directive.ts similarity index 100% rename from ui/src/app/metadata-provider/directive/info-label.directive.ts rename to ui/src/app/shared/directive/info-label.directive.ts diff --git a/ui/src/app/metadata-provider/directive/input-defaults.directive.spec.ts b/ui/src/app/shared/directive/input-defaults.directive.spec.ts similarity index 100% rename from ui/src/app/metadata-provider/directive/input-defaults.directive.spec.ts rename to ui/src/app/shared/directive/input-defaults.directive.spec.ts diff --git a/ui/src/app/metadata-provider/directive/input-defaults.directive.ts b/ui/src/app/shared/directive/input-defaults.directive.ts similarity index 100% rename from ui/src/app/metadata-provider/directive/input-defaults.directive.ts rename to ui/src/app/shared/directive/input-defaults.directive.ts diff --git a/ui/src/app/metadata-provider/pipe/pretty-xml.pipe.ts b/ui/src/app/shared/pipe/pretty-xml.pipe.ts similarity index 100% rename from ui/src/app/metadata-provider/pipe/pretty-xml.pipe.ts rename to ui/src/app/shared/pipe/pretty-xml.pipe.ts