diff --git a/ui/src/app/metadata/configuration/action/configuration.action.ts b/ui/src/app/metadata/configuration/action/configuration.action.ts index 8a12d47c8..b1eb9c00a 100644 --- a/ui/src/app/metadata/configuration/action/configuration.action.ts +++ b/ui/src/app/metadata/configuration/action/configuration.action.ts @@ -71,13 +71,13 @@ export class SetMetadataModel implements Action { constructor(public payload: Metadata) { } } -export class SetDefinition implements Action { +export class SetConfigurationDefinition implements Action { readonly type = ConfigurationActionTypes.SET_DEFINITION; constructor(public payload: Wizard) { } } -export class SetSchema implements Action { +export class SetConfigurationSchema implements Action { readonly type = ConfigurationActionTypes.SET_SCHEMA; constructor(public payload: Schema) { } @@ -105,8 +105,8 @@ export type ConfigurationActionsUnion = | LoadXmlSuccess | LoadXmlError | SetMetadata - | SetDefinition - | SetSchema + | SetConfigurationDefinition + | SetConfigurationSchema | SetXml | DownloadXml | ClearConfiguration; diff --git a/ui/src/app/metadata/configuration/action/restore.action.ts b/ui/src/app/metadata/configuration/action/restore.action.ts index 7febcd2e8..04a15fca7 100644 --- a/ui/src/app/metadata/configuration/action/restore.action.ts +++ b/ui/src/app/metadata/configuration/action/restore.action.ts @@ -7,6 +7,9 @@ export enum RestoreActionTypes { RESTORE_VERSION_SUCCESS = '[Restore Version] Restore Version Success', RESTORE_VERSION_ERROR = '[Restore Version] Restore Version Error', + UPDATE_RESTORATION_REQUEST = '[Restore Version] Update Changes Request', + UPDATE_RESTORATION_SUCCESS = '[Restore Version] Update Changes Success', + CLEAR_VERSION = '[Restore Version] Clear Versions', CANCEL_RESTORE = '[Restore Version] Cancel Restore' } @@ -26,6 +29,16 @@ export class RestoreVersionError implements Action { constructor(public payload: any) { } } +export class UpdateRestorationChangesRequest implements Action { + readonly type = RestoreActionTypes.UPDATE_RESTORATION_REQUEST; + constructor(public payload: any) { } +} + +export class UpdateRestorationChangesSuccess implements Action { + readonly type = RestoreActionTypes.UPDATE_RESTORATION_SUCCESS; + constructor(public payload: any) { } +} + export class CancelRestore implements Action { readonly type = RestoreActionTypes.CANCEL_RESTORE; constructor() { } @@ -35,4 +48,6 @@ export type RestoreActionsUnion = | RestoreVersionRequest | RestoreVersionSuccess | RestoreVersionError + | UpdateRestorationChangesRequest + | UpdateRestorationChangesSuccess | CancelRestore; diff --git a/ui/src/app/metadata/configuration/component/editor.component.html b/ui/src/app/metadata/configuration/component/editor.component.html new file mode 100644 index 000000000..53414fcf6 --- /dev/null +++ b/ui/src/app/metadata/configuration/component/editor.component.html @@ -0,0 +1,14 @@ +
+ + + {{ lock.value ? 'Locked' : 'Unlocked' }} + + For Advanced Knowledge Only +
+ \ No newline at end of file diff --git a/ui/src/app/metadata/configuration/component/editor.component.ts b/ui/src/app/metadata/configuration/component/editor.component.ts new file mode 100644 index 000000000..8e0ab78dd --- /dev/null +++ b/ui/src/app/metadata/configuration/component/editor.component.ts @@ -0,0 +1,26 @@ +import { Component, Input, Output, EventEmitter } from '@angular/core'; +import { FormControl } from '@angular/forms'; +import { Metadata } from '../../domain/domain.type'; + + +@Component({ + selector: 'metadata-editor', + templateUrl: './editor.component.html', + styleUrls: [] +}) +export class MetadataEditorComponent { + + @Input() schema: any; + @Input() bindings: any; + @Input() validators: { [key: string]: any }; + @Input() model: Metadata; + @Input() lockable: boolean; + + @Output() change: EventEmitter = new EventEmitter(); + @Output() status: EventEmitter = new EventEmitter(); + + lock: FormControl = new FormControl(true); + + constructor() {} +} + diff --git a/ui/src/app/metadata/configuration/component/array-property.component.html b/ui/src/app/metadata/configuration/component/property/array-property.component.html similarity index 100% rename from ui/src/app/metadata/configuration/component/array-property.component.html rename to ui/src/app/metadata/configuration/component/property/array-property.component.html diff --git a/ui/src/app/metadata/configuration/component/array-property.component.scss b/ui/src/app/metadata/configuration/component/property/array-property.component.scss similarity index 100% rename from ui/src/app/metadata/configuration/component/array-property.component.scss rename to ui/src/app/metadata/configuration/component/property/array-property.component.scss diff --git a/ui/src/app/metadata/configuration/component/array-property.component.spec.ts b/ui/src/app/metadata/configuration/component/property/array-property.component.spec.ts similarity index 89% rename from ui/src/app/metadata/configuration/component/array-property.component.spec.ts rename to ui/src/app/metadata/configuration/component/property/array-property.component.spec.ts index 614738b06..c0dbcbb16 100644 --- a/ui/src/app/metadata/configuration/component/array-property.component.spec.ts +++ b/ui/src/app/metadata/configuration/component/property/array-property.component.spec.ts @@ -3,13 +3,13 @@ import { TestBed, async, ComponentFixture } from '@angular/core/testing'; import { RouterTestingModule } from '@angular/router/testing'; import { NgbDropdownModule, NgbPopoverModule } from '@ng-bootstrap/ng-bootstrap'; -import { Property } from '../../domain/model/property'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; -import { SCHEMA } from '../../../../testing/form-schema.stub'; -import { getStepProperty } from '../../domain/utility/configuration'; +import { Property } from '../../../domain/model/property'; +import { MockI18nModule } from '../../../../../testing/i18n.stub'; +import { SCHEMA } from '../../../../../testing/form-schema.stub'; +import { getStepProperty } from '../../../domain/utility/configuration'; import { ArrayPropertyComponent } from './array-property.component'; -import { AttributesService } from '../../domain/service/attributes.service'; -import { MockAttributeService } from '../../../../testing/attributes.stub'; +import { AttributesService } from '../../../domain/service/attributes.service'; +import { MockAttributeService } from '../../../../../testing/attributes.stub'; import { of } from 'rxjs'; @Component({ diff --git a/ui/src/app/metadata/configuration/component/array-property.component.ts b/ui/src/app/metadata/configuration/component/property/array-property.component.ts similarity index 86% rename from ui/src/app/metadata/configuration/component/array-property.component.ts rename to ui/src/app/metadata/configuration/component/property/array-property.component.ts index a17ad01da..2c4de49bd 100644 --- a/ui/src/app/metadata/configuration/component/array-property.component.ts +++ b/ui/src/app/metadata/configuration/component/property/array-property.component.ts @@ -1,9 +1,9 @@ import { Component, Input, OnChanges, Output, EventEmitter } from '@angular/core'; -import { Property } from '../../domain/model/property'; +import { Property } from '../../../domain/model/property'; import { Observable, of } from 'rxjs'; -import { AttributesService } from '../../domain/service/attributes.service'; +import { AttributesService } from '../../../domain/service/attributes.service'; import { ConfigurationPropertyComponent } from './configuration-property.component'; -import UriValidator from '../../../shared/validation/uri.validator'; +import UriValidator from '../../../../shared/validation/uri.validator'; @Component({ selector: 'array-property', diff --git a/ui/src/app/metadata/configuration/component/configuration-property.component.spec.ts b/ui/src/app/metadata/configuration/component/property/configuration-property.component.spec.ts similarity index 85% rename from ui/src/app/metadata/configuration/component/configuration-property.component.spec.ts rename to ui/src/app/metadata/configuration/component/property/configuration-property.component.spec.ts index aa7fd9478..cccfd9114 100644 --- a/ui/src/app/metadata/configuration/component/configuration-property.component.spec.ts +++ b/ui/src/app/metadata/configuration/component/property/configuration-property.component.spec.ts @@ -2,11 +2,11 @@ import { Component, ViewChild, Input } from '@angular/core'; import { TestBed, async, ComponentFixture } from '@angular/core/testing'; import { RouterTestingModule } from '@angular/router/testing'; -import { NgbDropdownModule, NgbPopoverModule } from '@ng-bootstrap/ng-bootstrap'; -import { Property } from '../../domain/model/property'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; -import { SCHEMA } from '../../../../testing/form-schema.stub'; -import { getStepProperties, getStepProperty } from '../../domain/utility/configuration'; +import { NgbPopoverModule } from '@ng-bootstrap/ng-bootstrap'; +import { Property } from '../../../domain/model/property'; +import { MockI18nModule } from '../../../../../testing/i18n.stub'; +import { SCHEMA } from '../../../../../testing/form-schema.stub'; +import { getStepProperty } from '../../../domain/utility/configuration'; import { ConfigurationPropertyComponent } from './configuration-property.component'; @Component({ diff --git a/ui/src/app/metadata/configuration/component/configuration-property.component.ts b/ui/src/app/metadata/configuration/component/property/configuration-property.component.ts similarity index 91% rename from ui/src/app/metadata/configuration/component/configuration-property.component.ts rename to ui/src/app/metadata/configuration/component/property/configuration-property.component.ts index 5418bde30..7e666bc03 100644 --- a/ui/src/app/metadata/configuration/component/configuration-property.component.ts +++ b/ui/src/app/metadata/configuration/component/property/configuration-property.component.ts @@ -1,5 +1,5 @@ import { Component, Input } from '@angular/core'; -import { Property } from '../../domain/model/property'; +import { Property } from '../../../domain/model/property'; @Component({ selector: 'configuration-property', diff --git a/ui/src/app/metadata/configuration/component/filter-target-property.component.html b/ui/src/app/metadata/configuration/component/property/filter-target-property.component.html similarity index 100% rename from ui/src/app/metadata/configuration/component/filter-target-property.component.html rename to ui/src/app/metadata/configuration/component/property/filter-target-property.component.html diff --git a/ui/src/app/metadata/configuration/component/filter-target-property.component.spec.ts b/ui/src/app/metadata/configuration/component/property/filter-target-property.component.spec.ts similarity index 79% rename from ui/src/app/metadata/configuration/component/filter-target-property.component.spec.ts rename to ui/src/app/metadata/configuration/component/property/filter-target-property.component.spec.ts index 98c08d4c4..d1308787d 100644 --- a/ui/src/app/metadata/configuration/component/filter-target-property.component.spec.ts +++ b/ui/src/app/metadata/configuration/component/property/filter-target-property.component.spec.ts @@ -3,15 +3,12 @@ import { TestBed, async, ComponentFixture } from '@angular/core/testing'; import { RouterTestingModule } from '@angular/router/testing'; import { NgbPopoverModule } from '@ng-bootstrap/ng-bootstrap'; -import { Property } from '../../domain/model/property'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; -import { SCHEMA } from '../../../../testing/form-schema.stub'; -import { getStepProperty } from '../../domain/utility/configuration'; +import { Property } from '../../../domain/model/property'; +import { MockI18nModule } from '../../../../../testing/i18n.stub'; +import { SCHEMA } from '../../../../../testing/form-schema.stub'; +import { getStepProperty } from '../../../domain/utility/configuration'; import { FilterTargetPropertyComponent } from './filter-target-property.component'; -import { PrimitivePropertyComponent } from './primitive-property.component'; -import { ArrayPropertyComponentStub, PrimitivePropertyComponentStub } from '../../../../testing/property-component.stub'; -import { AttributesService } from '../../domain/service/attributes.service'; -import { of } from 'rxjs'; +import { ArrayPropertyComponentStub, PrimitivePropertyComponentStub } from '../../../../../testing/property-component.stub'; @Component({ template: ` diff --git a/ui/src/app/metadata/configuration/component/filter-target-property.component.ts b/ui/src/app/metadata/configuration/component/property/filter-target-property.component.ts similarity index 91% rename from ui/src/app/metadata/configuration/component/filter-target-property.component.ts rename to ui/src/app/metadata/configuration/component/property/filter-target-property.component.ts index 6b7ebf216..8c0e89b00 100644 --- a/ui/src/app/metadata/configuration/component/filter-target-property.component.ts +++ b/ui/src/app/metadata/configuration/component/property/filter-target-property.component.ts @@ -1,5 +1,5 @@ import { Component, Input, Output, EventEmitter } from '@angular/core'; -import { Property } from '../../domain/model/property'; +import { Property } from '../../../domain/model/property'; import { ConfigurationPropertyComponent } from './configuration-property.component'; @Component({ diff --git a/ui/src/app/metadata/configuration/component/object-property.component.html b/ui/src/app/metadata/configuration/component/property/object-property.component.html similarity index 100% rename from ui/src/app/metadata/configuration/component/object-property.component.html rename to ui/src/app/metadata/configuration/component/property/object-property.component.html diff --git a/ui/src/app/metadata/configuration/component/object-property.component.spec.ts b/ui/src/app/metadata/configuration/component/property/object-property.component.spec.ts similarity index 87% rename from ui/src/app/metadata/configuration/component/object-property.component.spec.ts rename to ui/src/app/metadata/configuration/component/property/object-property.component.spec.ts index 8817711c9..d9ddcdd97 100644 --- a/ui/src/app/metadata/configuration/component/object-property.component.spec.ts +++ b/ui/src/app/metadata/configuration/component/property/object-property.component.spec.ts @@ -3,11 +3,11 @@ import { TestBed, async, ComponentFixture } from '@angular/core/testing'; import { RouterTestingModule } from '@angular/router/testing'; import { NgbPopoverModule } from '@ng-bootstrap/ng-bootstrap'; -import { Property } from '../../domain/model/property'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; +import { Property } from '../../../domain/model/property'; +import { MockI18nModule } from '../../../../../testing/i18n.stub'; import { ObjectPropertyComponent } from './object-property.component'; -import { SCHEMA } from '../../../../testing/form-schema.stub'; -import { getStepProperty } from '../../domain/utility/configuration'; +import { SCHEMA } from '../../../../../testing/form-schema.stub'; +import { getStepProperty } from '../../../domain/utility/configuration'; import { PrimitivePropertyComponent } from './primitive-property.component'; import { ArrayPropertyComponent } from './array-property.component'; import { FilterTargetPropertyComponent } from './filter-target-property.component'; diff --git a/ui/src/app/metadata/configuration/component/object-property.component.ts b/ui/src/app/metadata/configuration/component/property/object-property.component.ts similarity index 89% rename from ui/src/app/metadata/configuration/component/object-property.component.ts rename to ui/src/app/metadata/configuration/component/property/object-property.component.ts index 1fafafa25..9eef4afbd 100644 --- a/ui/src/app/metadata/configuration/component/object-property.component.ts +++ b/ui/src/app/metadata/configuration/component/property/object-property.component.ts @@ -1,5 +1,5 @@ import { Component, Input, Output, EventEmitter } from '@angular/core'; -import { Property } from '../../domain/model/property'; +import { Property } from '../../../domain/model/property'; import { ConfigurationPropertyComponent } from './configuration-property.component'; @Component({ diff --git a/ui/src/app/metadata/configuration/component/primitive-property.component.html b/ui/src/app/metadata/configuration/component/property/primitive-property.component.html similarity index 100% rename from ui/src/app/metadata/configuration/component/primitive-property.component.html rename to ui/src/app/metadata/configuration/component/property/primitive-property.component.html diff --git a/ui/src/app/metadata/configuration/component/primitive-property.component.spec.ts b/ui/src/app/metadata/configuration/component/property/primitive-property.component.spec.ts similarity index 92% rename from ui/src/app/metadata/configuration/component/primitive-property.component.spec.ts rename to ui/src/app/metadata/configuration/component/property/primitive-property.component.spec.ts index 9ce81bfb5..dbc3eed4f 100644 --- a/ui/src/app/metadata/configuration/component/primitive-property.component.spec.ts +++ b/ui/src/app/metadata/configuration/component/property/primitive-property.component.spec.ts @@ -3,8 +3,8 @@ import { TestBed, async, ComponentFixture } from '@angular/core/testing'; import { RouterTestingModule } from '@angular/router/testing'; import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'; -import { Property } from '../../domain/model/property'; -import { MockI18nModule } from '../../../../testing/i18n.stub'; +import { Property } from '../../../domain/model/property'; +import { MockI18nModule } from '../../../../../testing/i18n.stub'; import { PrimitivePropertyComponent } from './primitive-property.component'; @Component({ diff --git a/ui/src/app/metadata/configuration/component/primitive-property.component.ts b/ui/src/app/metadata/configuration/component/property/primitive-property.component.ts similarity index 100% rename from ui/src/app/metadata/configuration/component/primitive-property.component.ts rename to ui/src/app/metadata/configuration/component/property/primitive-property.component.ts diff --git a/ui/src/app/metadata/configuration/configuration.module.ts b/ui/src/app/metadata/configuration/configuration.module.ts index 7294632dd..ae332ddf3 100644 --- a/ui/src/app/metadata/configuration/configuration.module.ts +++ b/ui/src/app/metadata/configuration/configuration.module.ts @@ -11,10 +11,12 @@ import { ConfigurationComponent } from './container/configuration.component'; import { MetadataConfigurationService } from './service/configuration.service'; import * as fromConfig from './reducer'; import { MetadataConfigurationEffects } from './effect/configuration.effect'; -import { ConfigurationPropertyComponent } from './component/configuration-property.component'; -import { PrimitivePropertyComponent } from './component/primitive-property.component'; -import { ObjectPropertyComponent } from './component/object-property.component'; -import { ArrayPropertyComponent } from './component/array-property.component'; +import { ConfigurationPropertyComponent } from './component/property/configuration-property.component'; +import { PrimitivePropertyComponent } from './component/property/primitive-property.component'; +import { ObjectPropertyComponent } from './component/property/object-property.component'; +import { ArrayPropertyComponent } from './component/property/array-property.component'; +import { FilterTargetPropertyComponent } from './component/property/filter-target-property.component'; + import { MetadataOptionsComponent } from './container/metadata-options.component'; import { MetadataXmlComponent } from './container/metadata-xml.component'; import { MetadataHeaderComponent } from './component/metadata-header.component'; @@ -29,12 +31,19 @@ import { FilterModule } from '../filter/filter.module'; import { FilterConfigurationListComponent } from './component/filter-configuration-list.component'; import { FilterConfigurationListItemComponent } from './component/filter-configuration-list-item.component'; import { SharedModule } from '../../shared/shared.module'; -import { FilterTargetPropertyComponent } from './component/filter-target-property.component'; + import { RestoreComponent } from './container/restore.component'; import { RestoreEffects } from './effect/restore.effect'; import { VersionComponent } from './container/version.component'; import { VersionOptionsComponent } from './container/version-options.component'; import { VersionEffects } from './effect/version.effect'; +import { MetadataEditorComponent } from './component/editor.component'; +import { WizardModule } from '../../wizard/wizard.module'; +import { FormModule } from '../../schema-form/schema-form.module'; +import { RestoreEditComponent } from './container/restore-edit.component'; +import { RestoreEditStepComponent } from './container/restore-edit-step.component'; + +import { IndexResolver } from './service/index-resolver.service'; @NgModule({ declarations: [ @@ -55,7 +64,10 @@ import { VersionEffects } from './effect/version.effect'; FilterTargetPropertyComponent, RestoreComponent, VersionComponent, - VersionOptionsComponent + VersionOptionsComponent, + MetadataEditorComponent, + RestoreEditComponent, + RestoreEditStepComponent ], entryComponents: [], imports: [ @@ -65,11 +77,14 @@ import { VersionEffects } from './effect/version.effect'; RouterModule, DomainModule, FilterModule, - SharedModule + SharedModule, + WizardModule, + FormModule ], exports: [], providers: [ - DatePipe + DatePipe, + IndexResolver ] }) export class MetadataConfigurationModule { diff --git a/ui/src/app/metadata/configuration/configuration.routing.ts b/ui/src/app/metadata/configuration/configuration.routing.ts index ddf6c5c3c..fec3c84da 100644 --- a/ui/src/app/metadata/configuration/configuration.routing.ts +++ b/ui/src/app/metadata/configuration/configuration.routing.ts @@ -7,6 +7,9 @@ import { MetadataComparisonComponent } from './container/metadata-comparison.com import { RestoreComponent } from './container/restore.component'; import { VersionComponent } from './container/version.component'; import { VersionOptionsComponent } from './container/version-options.component'; +import { RestoreEditComponent } from './container/restore-edit.component'; +import { IndexResolver } from './service/index-resolver.service'; +import { RestoreEditStepComponent } from './container/restore-edit-step.component'; export const ConfigurationRoutes: Routes = [ { @@ -44,6 +47,23 @@ export const ConfigurationRoutes: Routes = [ { path: 'restore', component: RestoreComponent + }, + { + path: 'edit', + redirectTo: 'edit/common' + }, + { + path: 'edit', + component: RestoreEditComponent, + children: [ + { + path: ':index', + component: RestoreEditStepComponent, + resolve: { + index: IndexResolver + } + } + ] } ] } diff --git a/ui/src/app/metadata/configuration/container/restore-edit-step.component.html b/ui/src/app/metadata/configuration/container/restore-edit-step.component.html new file mode 100644 index 000000000..496aa29f0 --- /dev/null +++ b/ui/src/app/metadata/configuration/container/restore-edit-step.component.html @@ -0,0 +1,6 @@ + \ No newline at end of file diff --git a/ui/src/app/metadata/configuration/container/restore-edit-step.component.ts b/ui/src/app/metadata/configuration/container/restore-edit-step.component.ts new file mode 100644 index 000000000..2e066a3d2 --- /dev/null +++ b/ui/src/app/metadata/configuration/container/restore-edit-step.component.ts @@ -0,0 +1,68 @@ +import { Component } from '@angular/core'; +import { Observable, combineLatest, of } from 'rxjs'; +import { ActivatedRoute } from '@angular/router'; +import { Store } from '@ngrx/store'; +import { + ConfigurationState, + getFormattedModel, + getRestorationChanges +} from '../reducer'; +import { getWizardDefinition, getSchema, getValidators } from '../../../wizard/reducer'; +import { Wizard } from '../../../wizard/model'; +import { Metadata } from '../../domain/domain.type'; +import { map, switchMap } from 'rxjs/operators'; +import { NAV_FORMATS } from '../../domain/component/editor-nav.component'; +import { UpdateRestorationChangesRequest } from '../action/restore.action'; + +@Component({ + selector: 'restore-edit-step', + templateUrl: './restore-edit-step.component.html', + styleUrls: [] +}) + +export class RestoreEditStepComponent { + + definition$: Observable> = this.store.select(getWizardDefinition); + schema$: Observable = this.store.select(getSchema); + model$: Observable = this.store.select(getFormattedModel); + + validators$: Observable; + + formats = NAV_FORMATS; + + constructor( + private store: Store, + private route: ActivatedRoute + ) { + this.validators$ = this.definition$.pipe( + map(def => def.validatorParams), + switchMap(params => combineLatest(params.map(p => this.store.select(p)))), + switchMap(selections => this.store.select(getValidators(selections))) + ); + + this.store.select(getRestorationChanges).subscribe(console.log); + } + + onChange(changes: any): void { + this.store.dispatch(new UpdateRestorationChangesRequest(changes)); + } +} + +/* +this.valueChangeEmitted$.pipe( + map(changes => changes.value), + withLatestFrom(this.definition$, this.store.select(fromProvider.getSelectedProvider)), + filter(([changes, definition, provider]) => definition && changes && provider), + map(([changes, definition, provider]) => { + const parsed = definition.parser(changes); + return ({ + ...parsed, + metadataFilters: [ + ...provider.metadataFilters, + ...(parsed.metadataFilters || []) + ] + }); + }) + ) + .subscribe(changes => this.store.dispatch(new UpdateProvider(changes))); +*/ diff --git a/ui/src/app/metadata/configuration/container/restore-edit.component.html b/ui/src/app/metadata/configuration/container/restore-edit.component.html new file mode 100644 index 000000000..6199dc016 --- /dev/null +++ b/ui/src/app/metadata/configuration/container/restore-edit.component.html @@ -0,0 +1,65 @@ +
+
+
+ + + + + +
+
+ +   + +
+
+
+ + All forms must be valid before changes can be saved! +
+
+
+
+
+
+ + + + + +
+
+ +
+
+
+ diff --git a/ui/src/app/metadata/configuration/container/restore-edit.component.ts b/ui/src/app/metadata/configuration/container/restore-edit.component.ts new file mode 100644 index 000000000..a50c0a52b --- /dev/null +++ b/ui/src/app/metadata/configuration/container/restore-edit.component.ts @@ -0,0 +1,45 @@ +import { Component } from '@angular/core'; +import { Observable, of } from 'rxjs'; +import { Store } from '@ngrx/store'; +import { + ConfigurationState, getConfigurationModelKind +} from '../../configuration/reducer'; +import { RestoreVersionRequest, CancelRestore } from '../action/restore.action'; +import { NAV_FORMATS } from '../../domain/component/editor-nav.component'; +import { Metadata } from '../../domain/domain.type'; +import { getVersionModel } from '../reducer'; + + +@Component({ + selector: 'restore-edit', + templateUrl: './restore-edit.component.html', + styleUrls: [] +}) + +export class RestoreEditComponent { + + model$: Observable = this.store.select(getVersionModel); + kind$: Observable = this.store.select(getConfigurationModelKind); + + isInvalid$: Observable = of(false); + canFilter$: Observable = of(false); + status$: Observable = of('VALID'); + isSaving$: Observable = of(false); + + validators$: Observable; + + formats = NAV_FORMATS; + + constructor( + private store: Store + ) {} + + save() { + this.store.dispatch(new RestoreVersionRequest()); + } + + cancel() { + this.store.dispatch(new CancelRestore()); + } +} + diff --git a/ui/src/app/metadata/configuration/container/restore.component.ts b/ui/src/app/metadata/configuration/container/restore.component.ts index e48e52c38..d87302ff6 100644 --- a/ui/src/app/metadata/configuration/container/restore.component.ts +++ b/ui/src/app/metadata/configuration/container/restore.component.ts @@ -7,6 +7,7 @@ import { CONFIG_DATE_FORMAT } from '../configuration.values'; import { RestoreVersionRequest, CancelRestore } from '../action/restore.action'; import { map } from 'rxjs/operators'; import { DatePipe } from '@angular/common'; +import { Router, ActivatedRoute } from '@angular/router'; @Component({ selector: 'restore-component', @@ -21,13 +22,15 @@ export class RestoreComponent { constructor( private store: Store, - private datePipe: DatePipe + private datePipe: DatePipe, + private router: Router, + private route: ActivatedRoute ) { this.date$ = this.dateString$.pipe(map((date) => this.datePipe.transform(date, CONFIG_DATE_FORMAT))); } restore() { - this.store.dispatch(new RestoreVersionRequest()); + this.router.navigate(['../', 'edit'], { relativeTo: this.route }); } cancel() { diff --git a/ui/src/app/metadata/configuration/effect/configuration.effect.ts b/ui/src/app/metadata/configuration/effect/configuration.effect.ts index b9719469d..91ce3d37a 100644 --- a/ui/src/app/metadata/configuration/effect/configuration.effect.ts +++ b/ui/src/app/metadata/configuration/effect/configuration.effect.ts @@ -9,10 +9,10 @@ import { MetadataConfigurationService } from '../service/configuration.service'; import { ConfigurationActionTypes, SetMetadata, - SetDefinition, + SetConfigurationDefinition, LoadSchemaRequest, LoadSchemaSuccess, - SetSchema, + SetConfigurationSchema, LoadSchemaError, LoadXmlSuccess, LoadXmlError, @@ -34,6 +34,11 @@ import { import { MetadataHistoryService } from '../service/history.service'; import { Metadata } from '../../domain/domain.type'; import { SelectVersion } from '../action/history.action'; +import { + SetDefinition, + LoadSchemaSuccess as LoadWizardSchemaSuccess, + LoadSchemaRequest as LoadWizardSchemaRequest +} from '../../../wizard/action/wizard.action'; @Injectable() export class MetadataConfigurationEffects { @@ -79,21 +84,33 @@ export class MetadataConfigurationEffects { @Effect() setDefinitionOnResolverDataLoad$ = this.actions$.pipe( ofType(ResolverCollectionActionTypes.SELECT_SUCCESS), - map(action => new SetDefinition(this.configService.getDefinition('resolver'))) + map(action => new SetConfigurationDefinition(this.configService.getDefinition('resolver'))) ); @Effect() setDefinitionOnProviderLoad$ = this.actions$.pipe( ofType(ProviderCollectionActionTypes.SELECT_PROVIDER_SUCCESS), - map(action => new SetDefinition(this.configService.getDefinition(action.payload['@type']))) + map(action => new SetConfigurationDefinition(this.configService.getDefinition(action.payload['@type']))) ); @Effect() loadSchemaOnDefinitionSet$ = this.actions$.pipe( - ofType(ConfigurationActionTypes.SET_DEFINITION), + ofType(ConfigurationActionTypes.SET_DEFINITION), map(action => new LoadSchemaRequest(action.payload.schema)) ); + @Effect() + setWizardDefinition$ = this.actions$.pipe( + ofType(ConfigurationActionTypes.SET_DEFINITION), + map(action => new SetDefinition(action.payload)) + ); + + @Effect() + setWizardSchema$ = this.actions$.pipe( + ofType(ConfigurationActionTypes.LOAD_SCHEMA_SUCCESS), + map(action => new LoadWizardSchemaSuccess(action.payload)) + ); + @Effect() loadSchemaData$ = this.actions$.pipe( ofType(ConfigurationActionTypes.LOAD_SCHEMA_REQUEST), @@ -110,7 +127,7 @@ export class MetadataConfigurationEffects { @Effect() setSchema$ = this.actions$.pipe( ofType(ConfigurationActionTypes.LOAD_SCHEMA_SUCCESS), - map(action => new SetSchema(action.payload)) + map(action => new SetConfigurationSchema(action.payload)) ); @Effect({dispatch: false}) diff --git a/ui/src/app/metadata/configuration/effect/restore.effect.ts b/ui/src/app/metadata/configuration/effect/restore.effect.ts index 4a5e0b491..bacb422f6 100644 --- a/ui/src/app/metadata/configuration/effect/restore.effect.ts +++ b/ui/src/app/metadata/configuration/effect/restore.effect.ts @@ -7,7 +7,9 @@ import { RestoreVersionRequest, RestoreVersionSuccess, RestoreVersionError, - CancelRestore + CancelRestore, + UpdateRestorationChangesRequest, + UpdateRestorationChangesSuccess } from '../action/restore.action'; import { MetadataHistoryService } from '../service/history.service'; import { of } from 'rxjs'; @@ -16,7 +18,14 @@ import { Router } from '@angular/router'; import { AddNotification } from '../../../notification/action/notification.action'; import { Notification, NotificationType } from '../../../notification/model/notification'; import { Store } from '@ngrx/store'; -import { ConfigurationState, getConfigurationModel, getVersionModel, getConfigurationModelId, getConfigurationModelKind } from '../reducer'; +import { + ConfigurationState, + getConfigurationModel, + getVersionModel, + getConfigurationModelId, + getConfigurationModelKind, + getConfigurationDefinition +} from '../reducer'; import { SetMetadata } from '../action/configuration.action'; @@ -86,6 +95,31 @@ export class RestoreEffects { ) ); + @Effect() + updateRestorationChanges$ = this.actions$.pipe( + ofType(RestoreActionTypes.UPDATE_RESTORATION_REQUEST), + map(action => action.payload), + withLatestFrom( + this.store.select(getConfigurationDefinition), + this.store.select(getConfigurationModelKind), + this.store.select(getConfigurationModel) + ), + map(([changes, definition, kind, original]) => { + let parsed = definition.parser(changes); + if (kind === 'provider') { + parsed = { + ...parsed, + metadataFilters: [ + ...original.metadataFilters, + ...(parsed.metadataFilters || []) + ] + }; + } + return (parsed); + }), + map(changes => new UpdateRestorationChangesSuccess(changes)) + ); + constructor( private store: Store, private historyService: MetadataHistoryService, diff --git a/ui/src/app/metadata/configuration/reducer/index.ts b/ui/src/app/metadata/configuration/reducer/index.ts index 43638ba72..7bd043a2c 100644 --- a/ui/src/app/metadata/configuration/reducer/index.ts +++ b/ui/src/app/metadata/configuration/reducer/index.ts @@ -5,6 +5,7 @@ import * as fromConfiguration from './configuration.reducer'; import * as fromHistory from './history.reducer'; import * as fromCompare from './compare.reducer'; import * as fromVersion from './version.reducer'; +import * as fromRestore from './restore.reducer'; import { WizardStep } from '../../../wizard/model'; import * as utils from '../../domain/utility/configuration'; @@ -21,13 +22,15 @@ export interface ConfigurationState { history: fromHistory.HistoryState; compare: fromCompare.State; version: fromVersion.State; + restore: fromRestore.RestoreState; } export const reducers = { configuration: fromConfiguration.reducer, history: fromHistory.reducer, compare: fromCompare.reducer, - version: fromVersion.reducer + version: fromVersion.reducer, + restore: fromRestore.reducer }; export interface State extends fromRoot.State { @@ -40,6 +43,7 @@ export const getConfigurationStateFn = (state: ConfigurationState) => state.conf export const getHistoryStateFn = (state: ConfigurationState) => state.history; export const getCompareStateFn = (state: ConfigurationState) => state.compare; export const getVersionStateFn = (state: ConfigurationState) => state.version; +export const getRestoreStateFn = (state: ConfigurationState) => state.restore; export const getConfigurationState = createSelector(getState, getConfigurationStateFn); export const getConfigurationModelKind = createSelector(getConfigurationState, fromConfiguration.getModelKind); @@ -151,6 +155,9 @@ export const getComparisonConfigurations = createSelector( export const getComparisonConfigurationCount = createSelector(getComparisonConfigurations, (config) => config ? config.dates.length : 0); // Version Restoration + +export const getRestoreState = createSelector(getState, getRestoreStateFn); + export const filterPluginTypes = ['RequiredValidUntil', 'SignatureValidation', 'EntityRoleWhiteList']; export const isAdditionalFilter = (type) => filterPluginTypes.indexOf(type) === -1; @@ -175,6 +182,19 @@ export const getVersionModelFilters = createSelector( getVersionModelFiltersFn ); +export const getRestorationIsValid = createSelector(getRestoreState, fromRestore.isRestorationValid); +export const getRestorationIsSaved = createSelector(getRestoreState, fromRestore.isRestorationSaved); +export const getRestorationChanges = createSelector(getRestoreState, fromRestore.getChanges); +export const getRestorationIsSaving = createSelector(getRestoreState, fromRestore.isRestorationSaving); +export const getRestorationFormStatus = createSelector(getRestoreState, fromRestore.getFormStatus); +export const getInvalidRestorationForms = createSelector(getRestoreState, fromRestore.getInvalidRestorationForms); + +export const getFormattedModel = createSelector( + getVersionModel, + getConfigurationDefinition, + (model, definition) => definition.formatter(model) +); + // Mixed states export const getConfigurationModelFn = (kind, version, provider, resolver) => { diff --git a/ui/src/app/metadata/configuration/reducer/restore.reducer.ts b/ui/src/app/metadata/configuration/reducer/restore.reducer.ts new file mode 100644 index 000000000..4ca626459 --- /dev/null +++ b/ui/src/app/metadata/configuration/reducer/restore.reducer.ts @@ -0,0 +1,40 @@ +import { Metadata } from '../../domain/domain.type'; +import { RestoreActionTypes, RestoreActionsUnion } from '../action/restore.action'; + +export interface RestoreState { + saving: boolean; + status: { [key: string]: string }; + changes: Metadata; +} + +export const initialState: RestoreState = { + saving: false, + status: {}, + changes: {} as Metadata +}; + +export function reducer(state = initialState, action: RestoreActionsUnion): RestoreState { + switch (action.type) { + case RestoreActionTypes.UPDATE_RESTORATION_SUCCESS: + return { + ...state, + changes: { + ...state.changes, + ...action.payload + } + }; + default: { + return state; + } + } +} + +export const isRestorationSaved = (state: RestoreState) => !Object.keys(state.changes).length; +export const getChanges = (state: RestoreState) => state.changes; +export const isRestorationSaving = (state: RestoreState) => state.saving; +export const getFormStatus = (state: RestoreState) => state.status; + +export const isRestorationValid = (state: RestoreState) => + !Object.keys(state.status).some(key => state.status[key] === ('INVALID')); +export const getInvalidRestorationForms = (state: RestoreState) => + Object.keys(state.status).filter(key => state.status[key] === 'INVALID'); diff --git a/ui/src/app/metadata/configuration/service/index-resolver.service.ts b/ui/src/app/metadata/configuration/service/index-resolver.service.ts new file mode 100644 index 000000000..4bbc5e07e --- /dev/null +++ b/ui/src/app/metadata/configuration/service/index-resolver.service.ts @@ -0,0 +1,14 @@ +import { Injectable } from '@angular/core'; +import { Resolve, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router'; +import { Store } from '@ngrx/store'; +import { WizardState } from '../../../wizard/reducer'; +import { SetIndex } from '../../../wizard/action/wizard.action'; + +@Injectable() +export class IndexResolver implements Resolve { + constructor(private store: Store) { } + + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { + this.store.dispatch(new SetIndex(route.params.index)); + } +} diff --git a/ui/src/app/metadata/domain/model/wizards/metadata-source-base.ts b/ui/src/app/metadata/domain/model/wizards/metadata-source-base.ts index 02b1a2625..106ebcf1d 100644 --- a/ui/src/app/metadata/domain/model/wizards/metadata-source-base.ts +++ b/ui/src/app/metadata/domain/model/wizards/metadata-source-base.ts @@ -3,6 +3,7 @@ import { MetadataResolver } from '../metadata-resolver'; import { FormProperty } from 'ngx-schema-form/lib/model/formproperty'; import { ArrayProperty } from 'ngx-schema-form/lib/model/arrayproperty'; import { ObjectProperty } from 'ngx-schema-form/lib/model/objectproperty'; +import { getAllOtherIds } from '../../../resolver/reducer'; /*istanbul ignore next */ export class MetadataSourceBase implements Wizard { @@ -11,6 +12,8 @@ export class MetadataSourceBase implements Wizard { steps: WizardStep[] = []; schema = ''; + validatorParams = [getAllOtherIds]; + bindings = { '/securityInfo/x509CertificateAvailable': [ { @@ -86,7 +89,6 @@ export class MetadataSourceBase implements Wizard { const checkOrg = (value, property, form) => { const org = property.parent; const orgValue = org.value || {}; - console.log(orgValue); const err = Object.keys(orgValue) && !value ? { code: 'ORG_INCOMPLETE', path: `#${property.path}`, diff --git a/ui/src/app/metadata/filter/model/entity-attributes.filter.ts b/ui/src/app/metadata/filter/model/entity-attributes.filter.ts index 78ee24e43..a2642ddc9 100644 --- a/ui/src/app/metadata/filter/model/entity-attributes.filter.ts +++ b/ui/src/app/metadata/filter/model/entity-attributes.filter.ts @@ -2,6 +2,7 @@ import { FormDefinition } from '../../../wizard/model'; import { MetadataFilter } from '../../domain/model'; import { removeNulls } from '../../../shared/util'; import { EntityAttributesFilterEntity } from '../../domain/entity'; +import { getFilterNames } from '../reducer'; export const EntityAttributesFilter: FormDefinition = { label: 'EntityAttributes', @@ -10,6 +11,7 @@ export const EntityAttributesFilter: FormDefinition = { getEntity(filter: MetadataFilter): EntityAttributesFilterEntity { return new EntityAttributesFilterEntity(filter); }, + validatorParams: [getFilterNames], getValidators(namesList: string[] = []): any { const validators = { '/': (value, property, form_current) => { diff --git a/ui/src/app/metadata/filter/model/nameid.filter.ts b/ui/src/app/metadata/filter/model/nameid.filter.ts index f3cf67960..9751d4ce9 100644 --- a/ui/src/app/metadata/filter/model/nameid.filter.ts +++ b/ui/src/app/metadata/filter/model/nameid.filter.ts @@ -1,6 +1,7 @@ import { FormDefinition } from '../../../wizard/model'; import { MetadataFilter } from '../../domain/model'; import { NameIDFormatFilterEntity } from '../../domain/entity/filter/nameid-format-filter'; +import { getFilterNames } from '../reducer'; export const NameIDFilter: FormDefinition = { label: 'NameIDFormat', @@ -9,6 +10,7 @@ export const NameIDFilter: FormDefinition = { getEntity(filter: MetadataFilter): NameIDFormatFilterEntity { return new NameIDFormatFilterEntity(filter); }, + validatorParams: [getFilterNames], getValidators(namesList: string[] = []): any { const validators = { '/': (value, property, form_current) => { diff --git a/ui/src/app/metadata/provider/container/provider-edit-step.component.spec.ts b/ui/src/app/metadata/provider/container/provider-edit-step.component.spec.ts index 093dc85c1..a9013176a 100644 --- a/ui/src/app/metadata/provider/container/provider-edit-step.component.spec.ts +++ b/ui/src/app/metadata/provider/container/provider-edit-step.component.spec.ts @@ -52,8 +52,7 @@ describe('Provider Edit Step Component', () => { } } }, - locked: false, - schemaCollection: [] + locked: false } }) }) diff --git a/ui/src/app/metadata/provider/container/provider-edit.component.spec.ts b/ui/src/app/metadata/provider/container/provider-edit.component.spec.ts index bd6ed6698..a5601d594 100644 --- a/ui/src/app/metadata/provider/container/provider-edit.component.spec.ts +++ b/ui/src/app/metadata/provider/container/provider-edit.component.spec.ts @@ -62,8 +62,7 @@ describe('Provider Edit Component', () => { schemaPath: '', loading: false, schema: {}, - locked: false, - schemaCollection: [] + locked: false } }) }), diff --git a/ui/src/app/metadata/provider/container/provider-wizard.component.ts b/ui/src/app/metadata/provider/container/provider-wizard.component.ts index 125966878..f1957718e 100644 --- a/ui/src/app/metadata/provider/container/provider-wizard.component.ts +++ b/ui/src/app/metadata/provider/container/provider-wizard.component.ts @@ -63,7 +63,7 @@ export class ProviderWizardComponent implements OnDestroy { this.summary$ = combineLatest( this.store.select(fromWizard.getWizardDefinition), - this.store.select(fromWizard.getSchemaCollection), + this.store.select(fromWizard.getSchema), this.store.select(fromProvider.getEntityChanges) ).pipe( map(([ definition, schema, model ]) => ({ definition, schema, model })) diff --git a/ui/src/app/metadata/provider/model/base.provider.form.ts b/ui/src/app/metadata/provider/model/base.provider.form.ts index a27a1cbc6..645e21f23 100644 --- a/ui/src/app/metadata/provider/model/base.provider.form.ts +++ b/ui/src/app/metadata/provider/model/base.provider.form.ts @@ -1,11 +1,13 @@ import { Wizard } from '../../../wizard/model'; import { BaseMetadataProvider } from '../../domain/model/providers'; +import { getProviderNames, getProviderXmlIds } from '../reducer'; export const BaseMetadataProviderEditor: Wizard = { label: 'BaseMetadataProvider', type: 'BaseMetadataResolver', schema: '', - getValidators(namesList: string[]): any { + validatorParams: [getProviderNames, getProviderXmlIds], + getValidators(namesList: string[], xmlIdList: string[]): any { const validators = { '/': (value, property, form_current) => { let errors; @@ -29,6 +31,15 @@ export const BaseMetadataProviderEditor: Wizard = { params: [value] } : null; return err; + }, + '/xmlId': (value, property, form) => { + const err = xmlIdList.indexOf(value) > -1 ? { + code: 'INVALID_ID', + path: `#${property.path}`, + message: 'message.id-unique', + params: [value] + } : null; + return err; } }; return validators; diff --git a/ui/src/app/metadata/provider/model/dynamic-http.provider.form.ts b/ui/src/app/metadata/provider/model/dynamic-http.provider.form.ts index 2583e3c69..9ef3bf2bb 100644 --- a/ui/src/app/metadata/provider/model/dynamic-http.provider.form.ts +++ b/ui/src/app/metadata/provider/model/dynamic-http.provider.form.ts @@ -17,16 +17,7 @@ export const DynamicHttpMetadataProviderWizard: Wizard { - const err = xmlIdList.indexOf(value) > -1 ? { - code: 'INVALID_ID', - path: `#${property.path}`, - message: 'message.id-unique', - params: [value] - } : null; - return err; - }; + const validators = BaseMetadataProviderEditor.getValidators(namesList, xmlIdList); validators['/metadataRequestURLConstructionScheme'] = (value, property, form) => { let errors; diff --git a/ui/src/app/metadata/provider/model/file-backed-http.provider.form.ts b/ui/src/app/metadata/provider/model/file-backed-http.provider.form.ts index 0df10c0ea..dde0ec3f1 100644 --- a/ui/src/app/metadata/provider/model/file-backed-http.provider.form.ts +++ b/ui/src/app/metadata/provider/model/file-backed-http.provider.form.ts @@ -18,16 +18,7 @@ export const FileBackedHttpMetadataProviderWizard: Wizard { - const err = xmlIdList.indexOf(value) > -1 ? { - code: 'INVALID_ID', - path: `#${property.path}`, - message: 'message.id-unique', - params: [value] - } : null; - return err; - }; + const validators = BaseMetadataProviderEditor.getValidators(namesList, xmlIdList); validators['/metadataURL'] = (value, property, form) => { return !UriValidator.isUri(value) ? { code: 'INVALID_URI', diff --git a/ui/src/app/metadata/provider/model/file-system.provider.form.ts b/ui/src/app/metadata/provider/model/file-system.provider.form.ts index 331a53c99..fcf780ac5 100644 --- a/ui/src/app/metadata/provider/model/file-system.provider.form.ts +++ b/ui/src/app/metadata/provider/model/file-system.provider.form.ts @@ -16,19 +16,6 @@ export const FileSystemMetadataProviderWizard: Wizard { - const err = xmlIdList.indexOf(value) > -1 ? { - code: 'INVALID_ID', - path: `#${property.path}`, - message: 'message.id-unique', - params: [value] - } : null; - return err; - }; - return validators; - }, schema: '/api/ui/MetadataResolver/FilesystemMetadataResolver', steps: [ { diff --git a/ui/src/app/metadata/provider/model/local-dynamic.provider.form.ts b/ui/src/app/metadata/provider/model/local-dynamic.provider.form.ts index aeeef302a..c53562873 100644 --- a/ui/src/app/metadata/provider/model/local-dynamic.provider.form.ts +++ b/ui/src/app/metadata/provider/model/local-dynamic.provider.form.ts @@ -17,19 +17,6 @@ export const LocalDynamicMetadataProviderWizard: Wizard { - const err = xmlIdList.indexOf(value) > -1 ? { - code: 'INVALID_ID', - path: `#${property.path}`, - message: 'message.id-unique', - params: [value] - } : null; - return err; - }; - return validators; - }, schema: '/api/ui/MetadataResolver/LocalDynamicMetadataResolver', steps: [ { diff --git a/ui/src/app/metadata/resolver/container/resolver-wizard-step.component.spec.ts b/ui/src/app/metadata/resolver/container/resolver-wizard-step.component.spec.ts index 56c4784a7..c64445dd4 100644 --- a/ui/src/app/metadata/resolver/container/resolver-wizard-step.component.spec.ts +++ b/ui/src/app/metadata/resolver/container/resolver-wizard-step.component.spec.ts @@ -66,11 +66,6 @@ describe('Resolver Wizard Step Component', () => { index: 'common', disabled: false, definition: new MetadataSourceWizard(), - schemaCollection: { - common: { - ...schema - } - }, schemaPath: '/foo/bar', loading: false, schema: { diff --git a/ui/src/app/metadata/resolver/container/resolver-wizard.component.spec.ts b/ui/src/app/metadata/resolver/container/resolver-wizard.component.spec.ts index 1b6c5df32..3cec9bf25 100644 --- a/ui/src/app/metadata/resolver/container/resolver-wizard.component.spec.ts +++ b/ui/src/app/metadata/resolver/container/resolver-wizard.component.spec.ts @@ -72,11 +72,6 @@ describe('Resolver Wizard Component', () => { index: 'page', disabled: false, definition: new MetadataSourceWizard(), - schemaCollection: { - page: { - ...schema - } - }, schemaPath: '/foo/bar', loading: false, schema: { diff --git a/ui/src/app/metadata/resolver/container/resolver-wizard.component.ts b/ui/src/app/metadata/resolver/container/resolver-wizard.component.ts index 3ccddc90e..ffabac236 100644 --- a/ui/src/app/metadata/resolver/container/resolver-wizard.component.ts +++ b/ui/src/app/metadata/resolver/container/resolver-wizard.component.ts @@ -117,7 +117,7 @@ export class ResolverWizardComponent implements OnDestroy, CanComponentDeactivat this.summary$ = combine( this.store.select(fromWizard.getWizardDefinition), - this.store.select(fromWizard.getSchemaCollection), + this.store.select(fromWizard.getSchema), this.store.select(fromResolver.getEntityChanges) ).pipe( map(([definition, schema, model]) => ( diff --git a/ui/src/app/metadata/resolver/reducer/index.ts b/ui/src/app/metadata/resolver/reducer/index.ts index bf38715d9..43bc2fbc7 100644 --- a/ui/src/app/metadata/resolver/reducer/index.ts +++ b/ui/src/app/metadata/resolver/reducer/index.ts @@ -103,3 +103,9 @@ export const getAllResolvers = createSelector(getDraftCollection, getResolverCol export const getAllResolverIds = createSelector(getDraftIds, getResolverIds, combineAllFn); export const getAllEntityIds = createSelector(getAllResolvers, getEntityIdsFn); + +export const getAllOtherIds = createSelector( + getAllResolvers, + getSelectedResolverId, + (ids, selected) => ids.filter(id => id !== selected) +); diff --git a/ui/src/app/wizard/model/form-definition.ts b/ui/src/app/wizard/model/form-definition.ts index 3f03957c0..4402aa354 100644 --- a/ui/src/app/wizard/model/form-definition.ts +++ b/ui/src/app/wizard/model/form-definition.ts @@ -1,8 +1,11 @@ +import { Selector } from '@ngrx/store'; + export interface FormDefinition { label: string; type: string; schema: string; bindings?: any; + validatorParams: any[]; getEntity?(entity: any): any; parser(changes: Partial, schema?: any); formatter(changes: Partial, schema?: any); diff --git a/ui/src/app/wizard/reducer/index.ts b/ui/src/app/wizard/reducer/index.ts index 4c3321c62..d85d930be 100644 --- a/ui/src/app/wizard/reducer/index.ts +++ b/ui/src/app/wizard/reducer/index.ts @@ -2,8 +2,6 @@ import * as fromRoot from '../../app.reducer'; import * as fromWizard from './wizard.reducer'; import { createFeatureSelector, createSelector } from '@ngrx/store'; import { Wizard, WizardStep } from '../model'; -import { diff } from 'deep-object-diff'; -import { SchemaService } from '../../schema-form/service/schema.service'; export interface WizardState { wizard: fromWizard.State; @@ -46,7 +44,6 @@ export const getState = createSelector(getWizardState, getWizardStateFn); export const getWizardIndex = createSelector(getState, fromWizard.getIndex); export const getWizardIsDisabled = createSelector(getState, fromWizard.getDisabled); export const getWizardDefinition = createSelector(getState, fromWizard.getDefinition); -export const getSchemaCollection = createSelector(getState, fromWizard.getCollection); export const getSchemaPath = (wizard: Wizard) => wizard ? wizard.schema : null; @@ -135,3 +132,9 @@ export const getSchemaObject = createSelector(getState, fromWizard.getSchema); export const getParsedSchema = createSelector(getSchemaObject, getLocked, getSchemaParseFn); export const getSchema = createSelector(getParsedSchema, getCurrent, getSplitSchema); + +export const getWizardDefinitionValidationParams = createSelector(getWizardDefinition, def => def.validatorParams); + +export const getValidators = (params: any) => createSelector(getWizardDefinition, (definition) => { + return definition.getValidators(...params); +}); diff --git a/ui/src/app/wizard/reducer/wizard.reducer.spec.ts b/ui/src/app/wizard/reducer/wizard.reducer.spec.ts index 8a50eb116..d43ad334e 100644 --- a/ui/src/app/wizard/reducer/wizard.reducer.spec.ts +++ b/ui/src/app/wizard/reducer/wizard.reducer.spec.ts @@ -34,12 +34,6 @@ describe('Wizard Reducer', () => { }); }); - describe(`${WizardActionTypes.ADD_SCHEMA}`, () => { - it('should add the payload to the schema collection', () => { - expect(reducer(snapshot, new AddSchema({id: 'foo', schema: SCHEMA })).schemaCollection).toEqual({ 'foo': SCHEMA }); - }); - }); - describe(`${WizardActionTypes.SET_DISABLED}`, () => { it('should set the disabled property on the wizard', () => { expect(reducer(snapshot, new SetDisabled(true)).disabled).toBe(true); @@ -108,7 +102,6 @@ describe('Wizard Reducer', () => { describe('selector functions', () => { it('should return pieces of state', () => { - expect(selectors.getCollection(snapshot)).toEqual(snapshot.schemaCollection); expect(selectors.getDefinition(snapshot)).toEqual(snapshot.definition); expect(selectors.getDisabled(snapshot)).toEqual(snapshot.disabled); expect(selectors.getIndex(snapshot)).toEqual(snapshot.index); diff --git a/ui/src/app/wizard/reducer/wizard.reducer.ts b/ui/src/app/wizard/reducer/wizard.reducer.ts index 603fbaeda..11205afb3 100644 --- a/ui/src/app/wizard/reducer/wizard.reducer.ts +++ b/ui/src/app/wizard/reducer/wizard.reducer.ts @@ -5,7 +5,6 @@ export interface State { index: string; disabled: boolean; definition: Wizard; - schemaCollection: { [id: string]: any }; schemaPath: string; loading: boolean; @@ -17,8 +16,6 @@ export const initialState: State = { index: null, disabled: false, definition: null, - schemaCollection: {}, - schemaPath: null, loading: false, schema: null, @@ -62,16 +59,6 @@ export function reducer(state = initialState, action: WizardActionUnion): State locked: false }; } - - case WizardActionTypes.ADD_SCHEMA: { - return { - ...state, - schemaCollection: { - ...state.schemaCollection, - [action.payload.id]: action.payload.schema - } - }; - } case WizardActionTypes.SET_DISABLED: { return { ...state, @@ -121,4 +108,3 @@ export const getLocked = (state: State) => state.locked; export const getIndex = (state: State) => state.index; export const getDisabled = (state: State) => state.disabled; export const getDefinition = (state: State) => state.definition; -export const getCollection = (state: State) => state.schemaCollection;