diff --git a/ui/package-lock.json b/ui/package-lock.json index 89be49e79..a39dc8ca3 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -3456,6 +3456,11 @@ "resolved": "https://registry.npmjs.org/deep-object-diff/-/deep-object-diff-1.1.0.tgz", "integrity": "sha512-b+QLs5vHgS+IoSNcUE4n9HP2NwcHj7aqnJWsjPtuG75Rh5TOaGt0OjAYInh77d5T16V5cRDC+Pw/6ZZZiETBGw==" }, + "deepmerge": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz", + "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==" + }, "default-require-extensions": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", diff --git a/ui/package.json b/ui/package.json index 9bf38918e..b21405119 100644 --- a/ui/package.json +++ b/ui/package.json @@ -32,6 +32,7 @@ "bootstrap": "4.1.1", "core-js": "^2.4.1", "deep-object-diff": "^1.1.0", + "deepmerge": "^2.2.1", "file-saver": "^1.3.3", "font-awesome": "^4.7.0", "ngx-schema-form": "^2.2.0-beta.1", diff --git a/ui/src/app/metadata/domain/component/editor-nav.component.html b/ui/src/app/metadata/domain/component/editor-nav.component.html index 354dd0582..9fe804c85 100644 --- a/ui/src/app/metadata/domain/component/editor-nav.component.html +++ b/ui/src/app/metadata/domain/component/editor-nav.component.html @@ -23,7 +23,7 @@ - + @@ -43,14 +43,8 @@
- +
diff --git a/ui/src/app/metadata/domain/component/editor-nav.component.ts b/ui/src/app/metadata/domain/component/editor-nav.component.ts index f6c77bd62..3f9853cb1 100644 --- a/ui/src/app/metadata/domain/component/editor-nav.component.ts +++ b/ui/src/app/metadata/domain/component/editor-nav.component.ts @@ -20,7 +20,7 @@ export enum NAV_FORMATS { export class EditorNavComponent { @Input() format: string; - @Input() status: string[]; + @Input() status: string[] = []; @Output() onPageSelect: EventEmitter = new EventEmitter(); @@ -43,7 +43,6 @@ export class EditorNavComponent { this.routes$ = this.store.select(fromWizard.getRoutes); this.current$ = this.store.select(fromWizard.getCurrent); this.currentPage$ = this.current$.pipe(map(this.getFilterId)); - this.currentLabel$ = this.current$.pipe(map(this.getFilterLabel)); } diff --git a/ui/src/app/metadata/domain/component/wizard-summary.component.ts b/ui/src/app/metadata/domain/component/wizard-summary.component.ts index b88323eaa..8a77bd1b0 100644 --- a/ui/src/app/metadata/domain/component/wizard-summary.component.ts +++ b/ui/src/app/metadata/domain/component/wizard-summary.component.ts @@ -4,6 +4,7 @@ import { Wizard, WizardStep } from '../../../wizard/model'; import { MetadataProvider, MetadataResolver } from '../../domain/model'; import { Property } from '../model/property'; import { getSplitSchema } from '../../../wizard/reducer'; +import merge from 'deepmerge'; interface Section { id: string; @@ -12,7 +13,7 @@ interface Section { properties: Property[]; } -export function getDefinition(path: string, definitions): any { +export function getDefinition(path: string, definitions: any): any { let def = path.split('/').pop(); return definitions[def]; } @@ -23,7 +24,8 @@ export function getPropertyItemSchema(items: any, definitions: any): any { } export function getStepProperty(property, model, definitions): Property { - property = property.$ref ? getDefinition(property.$ref, definitions) : property; + if (!property) { return null; } + property = property.$ref ? { ...property, ...getDefinition(property.$ref, definitions) } : property; return { name: property.title, value: model, @@ -66,7 +68,8 @@ export class WizardSummaryComponent implements OnChanges { columns: Array
[]; steps: WizardStep[]; - constructor() {} + constructor() { + } ngOnChanges(changes: SimpleChanges): void { if (changes.summary && this.summary) { @@ -75,6 +78,10 @@ export class WizardSummaryComponent implements OnChanges { const def = this.summary.definition; const steps = def.steps; + const schema = Object.keys(schemas).reduce((coll, key) => ({ + ...merge(coll, schemas[key]) + }), {} as any); + this.sections = steps .filter(step => step.id !== 'summary') .map( @@ -84,9 +91,9 @@ export class WizardSummaryComponent implements OnChanges { index: step.index, label: step.label, properties: getStepProperties( - schemas[step.id] || getSplitSchema(schemas['summary'], step), + getSplitSchema(schema, step), def.formatter(model), - schemas.definitions || schemas.hasOwnProperty('summary') ? schemas['summary'].definitions : {} + schema.definitions || {} ) }); } 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 new file mode 100644 index 000000000..b469af5ed --- /dev/null +++ b/ui/src/app/metadata/domain/model/wizards/metadata-source-base.ts @@ -0,0 +1,90 @@ +import { Wizard, WizardStep } from '../../../../wizard/model'; +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'; + +export class MetadataSourceBase implements Wizard { + label = 'Metadata Source'; + type = '@MetadataProvider'; + steps: WizardStep[] = []; + + bindings = { + '/securityInfo/x509CertificateAvailable': [ + { + 'input': (event, property: FormProperty) => { + let available = !property.value, + parent = property.parent, + certs = parent.getProperty('x509Certificates'); + if (available && !certs.value.length) { + certs.setValue([ + { + name: '', + type: 'both', + value: '' + } + ], true); + } + + if (!available && certs.value.length > 0) { + certs.setValue([], true); + } + } + } + ], + '/assertionConsumerServices/*/makeDefault': [ + { + 'input': (event, property: FormProperty) => { + let parent = property.parent.parent as ArrayProperty; + let props = parent.properties as ObjectProperty[]; + props.forEach(prop => { + if (prop !== property) { + prop.setValue({ + ...prop.value, + makeDefault: false + }, false); + } + }); + } + } + ] + }; + + parser(changes: Partial, schema?: any): any { + return changes; + } + + formatter(changes: Partial, schema?: any): any { + return changes; + } + + getValidators(entityIdList: string[]): { [key: string]: any } { + const validators = { + '/': (value, property, form_current) => { + let errors; + // iterate all customer + Object.keys(value).forEach((key) => { + const item = value[key]; + const validatorKey = `/${key}`; + const validator = validators.hasOwnProperty(validatorKey) ? validators[validatorKey] : null; + const error = validator ? validator(item, { path: `/${key}` }, form_current) : null; + if (error) { + errors = errors || []; + errors.push(error); + } + }); + return errors; + }, + '/entityId': (value, property, form) => { + const err = entityIdList.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/domain/model/wizards/metadata-source-editor.ts b/ui/src/app/metadata/domain/model/wizards/metadata-source-editor.ts index 1beb5c9a1..8f2c650cf 100644 --- a/ui/src/app/metadata/domain/model/wizards/metadata-source-editor.ts +++ b/ui/src/app/metadata/domain/model/wizards/metadata-source-editor.ts @@ -1,9 +1,8 @@ import { Wizard, WizardStep } from '../../../../wizard/model'; import { MetadataResolver } from '../metadata-resolver'; +import { MetadataSourceBase } from './metadata-source-base'; -export class MetadataSourceEditor implements Wizard { - label = 'Metadata Source'; - type = '@MetadataProvider'; +export class MetadataSourceEditor extends MetadataSourceBase implements Wizard { steps: WizardStep[] = [ { index: 1, @@ -131,17 +130,4 @@ export class MetadataSourceEditor implements Wizard { ] } ]; - - parser(changes: Partial, schema?: any): any { - return changes; - } - - formatter(changes: Partial, schema?: any): any { - return changes; - } - - getValidators(...args: any[]): { [key: string]: any } { - const validators = {}; - return validators; - } } diff --git a/ui/src/app/metadata/domain/model/wizards/metadata-source-wizard.ts b/ui/src/app/metadata/domain/model/wizards/metadata-source-wizard.ts index b3c6ce20f..7c4a4a01d 100644 --- a/ui/src/app/metadata/domain/model/wizards/metadata-source-wizard.ts +++ b/ui/src/app/metadata/domain/model/wizards/metadata-source-wizard.ts @@ -1,9 +1,8 @@ import { Wizard, WizardStep } from '../../../../wizard/model'; import { MetadataResolver } from '../metadata-resolver'; +import { MetadataSourceBase } from './metadata-source-base'; -export class MetadataSourceWizard implements Wizard { - label = 'Metadata Source'; - type = '@MetadataProvider'; +export class MetadataSourceWizard extends MetadataSourceBase implements Wizard { steps: WizardStep[] = [ { index: 1, @@ -155,18 +154,5 @@ export class MetadataSourceWizard implements Wizard { summary: true } ]; - - parser (changes: Partial, schema?: any): any { - return changes; - } - - formatter (changes: Partial < MetadataResolver >, schema ?: any): any { - return changes; - } - - getValidators(...args: any[]): { [key: string]: any } { - const validators = {}; - return validators; - } } diff --git a/ui/src/app/metadata/provider/container/provider-edit-step.component.ts b/ui/src/app/metadata/provider/container/provider-edit-step.component.ts index 6ba2346bb..6607ed56c 100644 --- a/ui/src/app/metadata/provider/container/provider-edit-step.component.ts +++ b/ui/src/app/metadata/provider/container/provider-edit-step.component.ts @@ -9,7 +9,7 @@ import { MetadataProvider } from '../../domain/model'; import { LockEditor, UnlockEditor } from '../../../wizard/action/wizard.action'; import * as fromWizard from '../../../wizard/reducer'; -import { withLatestFrom, map, skipWhile, distinctUntilChanged, startWith, combineLatest } from 'rxjs/operators'; +import { withLatestFrom, map, skipWhile, distinctUntilChanged, takeUntil, filter } from 'rxjs/operators'; import { UpdateProvider } from '../action/entity.action'; import { FormControl } from '@angular/forms'; @@ -19,6 +19,8 @@ import { FormControl } from '@angular/forms'; styleUrls: [] }) export class ProviderEditStepComponent implements OnDestroy { + private ngUnsubscribe: Subject = new Subject(); + valueChangeSubject = new Subject>(); private valueChangeEmitted$ = this.valueChangeSubject.asObservable(); @@ -65,10 +67,11 @@ export class ProviderEditStepComponent implements OnDestroy { this.store.select(fromProvider.getProviderXmlIds), this.provider$ ), - map(([def, names, ids, provider]) => def.getValidators( + filter(([def, names, ids, provider]) => !def), + map(([def, names, ids, provider]) => def ? def.getValidators( names.filter(n => n !== provider.name), ids.filter(id => id !== provider.xmlId) - )) + ) : {}) ); this.model$ = this.schema$.pipe( @@ -86,8 +89,8 @@ export class ProviderEditStepComponent implements OnDestroy { }, definition })), - skipWhile(({ model, definition }) => !definition || !model), - map(({ model, definition }) => definition.formatter(model)) + filter(({ model, definition }) => !definition || !model), + map(({ model, definition }) => definition ? definition.formatter(model) : {}) ); this.valueChangeEmitted$.pipe( @@ -114,6 +117,8 @@ export class ProviderEditStepComponent implements OnDestroy { ngOnDestroy() { this.valueChangeSubject.complete(); + this.statusChangeSubject.complete(); + this.ngUnsubscribe.unsubscribe(); } } diff --git a/ui/src/app/metadata/provider/container/provider-edit.component.html b/ui/src/app/metadata/provider/container/provider-edit.component.html index 7ab38b315..04acbb3e8 100644 --- a/ui/src/app/metadata/provider/container/provider-edit.component.html +++ b/ui/src/app/metadata/provider/container/provider-edit.component.html @@ -14,6 +14,13 @@ [format]="formats.DROPDOWN" [status]="status$ | async" (onPageSelect)="setIndex($event)"> + + +
@@ -50,6 +57,13 @@ + + +
diff --git a/ui/src/app/metadata/provider/container/provider-edit.component.ts b/ui/src/app/metadata/provider/container/provider-edit.component.ts index 2abd7d8ed..a71da19d7 100644 --- a/ui/src/app/metadata/provider/container/provider-edit.component.ts +++ b/ui/src/app/metadata/provider/container/provider-edit.component.ts @@ -1,7 +1,7 @@ import { Component, OnDestroy } from '@angular/core'; import { Router, ActivatedRoute, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router'; import { Observable, of } from 'rxjs'; -import { skipWhile, map, combineLatest } from 'rxjs/operators'; +import { skipWhile, map, combineLatest, filter } from 'rxjs/operators'; import { Store } from '@ngrx/store'; import * as fromWizard from '../../../wizard/reducer'; import * as fromProvider from '../reducer'; @@ -63,11 +63,11 @@ export class ProviderEditComponent implements OnDestroy, CanComponentDeactivate this.store.dispatch(new SetIndex(index)); }); - this.index$.subscribe(id => this.go(id)); + this.index$.subscribe(id => id && this.go(id)); this.store .select(fromWizard.getCurrentWizardSchema) - .pipe(skipWhile(s => !s)) + .pipe(filter(s => !!s)) .subscribe(s => { if (s) { this.store.dispatch(new LoadSchemaRequest(s)); @@ -92,7 +92,6 @@ export class ProviderEditComponent implements OnDestroy, CanComponentDeactivate clear(): void { this.store.dispatch(new ClearProvider()); - this.store.dispatch(new ClearWizard()); this.store.dispatch(new ClearEditor()); } diff --git a/ui/src/app/metadata/provider/container/provider-filter-list.component.html b/ui/src/app/metadata/provider/container/provider-filter-list.component.html index db5aa695c..d9f5b0504 100644 --- a/ui/src/app/metadata/provider/container/provider-filter-list.component.html +++ b/ui/src/app/metadata/provider/container/provider-filter-list.component.html @@ -13,7 +13,15 @@
+ [format]="formats.DROPDOWN" + [status]="[]"> + + +
@@ -28,7 +36,15 @@
+ [format]="formats.TABS" + [status]="[]"> + + +
diff --git a/ui/src/app/metadata/resolver/container/resolver-edit-step.component.html b/ui/src/app/metadata/resolver/container/resolver-edit-step.component.html index 5d07730fd..a9a3be2e4 100644 --- a/ui/src/app/metadata/resolver/container/resolver-edit-step.component.html +++ b/ui/src/app/metadata/resolver/container/resolver-edit-step.component.html @@ -3,6 +3,7 @@ [schema]="schema$ | async" [model]="model$ | async" [validators]="validators$ | async" + [bindings]="bindings$ | async" (onChange)="valueChangeSubject.next($event)" (onErrorChange)="statusChangeSubject.next($event)"> \ No newline at end of file diff --git a/ui/src/app/metadata/resolver/container/resolver-edit-step.component.ts b/ui/src/app/metadata/resolver/container/resolver-edit-step.component.ts index aa9441e82..fc6ddfc41 100644 --- a/ui/src/app/metadata/resolver/container/resolver-edit-step.component.ts +++ b/ui/src/app/metadata/resolver/container/resolver-edit-step.component.ts @@ -9,7 +9,7 @@ import { MetadataResolver } from '../../domain/model'; import { LockEditor, UnlockEditor } from '../../../wizard/action/wizard.action'; import * as fromWizard from '../../../wizard/reducer'; -import { withLatestFrom, map, skipWhile, distinctUntilChanged, startWith, combineLatest } from 'rxjs/operators'; +import { withLatestFrom, map, skipWhile, distinctUntilChanged, startWith, combineLatest, filter } from 'rxjs/operators'; import { UpdateChanges } from '../action/entity.action'; import { FormControl } from '@angular/forms'; @@ -19,6 +19,8 @@ import { FormControl } from '@angular/forms'; styleUrls: [] }) export class ResolverEditStepComponent implements OnDestroy { + private ngUnsubscribe: Subject = new Subject(); + valueChangeSubject = new Subject>(); private valueChangeEmitted$ = this.valueChangeSubject.asObservable(); @@ -35,6 +37,7 @@ export class ResolverEditStepComponent implements OnDestroy { definition$: Observable>; changes$: Observable; step$: Observable; + bindings$: Observable; validators$: Observable<{ [key: string]: any }>; @@ -48,6 +51,7 @@ export class ResolverEditStepComponent implements OnDestroy { this.resolver$ = this.store.select(fromResolver.getSelectedResolver); this.step$ = this.store.select(fromWizard.getCurrent); this.schema$ = this.store.select(fromWizard.getSchema); + this.bindings$ = this.definition$.pipe(filter(d => !!d), map(d => d.bindings)); this.step$.subscribe(s => { if (s && s.locked) { @@ -64,6 +68,7 @@ export class ResolverEditStepComponent implements OnDestroy { this.store.select(fromResolver.getAllEntityIds), this.resolver$ ), + filter(([def, ids, resolver]) => !!def), map(([def, ids, resolver]) => def.getValidators( ids.filter(id => id !== resolver.entityId) )) @@ -84,17 +89,17 @@ export class ResolverEditStepComponent implements OnDestroy { }, definition })), - skipWhile(({ model, definition }) => !definition || !model), + filter(({ model, definition }) => definition && model), map(({ model, definition }) => definition.formatter(model)) ); this.valueChangeEmitted$.pipe( map(changes => changes.value), withLatestFrom(this.definition$, this.store.select(fromResolver.getSelectedResolver)), - skipWhile(([changes, definition]) => !definition || !changes), + filter(([changes, definition]) => !definition || !changes), map(([changes, definition, resolver]) => definition.parser({ ...resolver, ...changes })) ) - .subscribe(changes => this.store.dispatch(new UpdateChanges(changes))); + .subscribe(changes => this.store.dispatch(new UpdateChanges(changes))); this.statusChangeEmitted$ .pipe(distinctUntilChanged()) @@ -112,6 +117,8 @@ export class ResolverEditStepComponent implements OnDestroy { ngOnDestroy() { this.valueChangeSubject.complete(); + this.statusChangeSubject.complete(); + this.ngUnsubscribe.unsubscribe(); } } diff --git a/ui/src/app/metadata/resolver/container/resolver-edit.component.ts b/ui/src/app/metadata/resolver/container/resolver-edit.component.ts index 1de850407..6210a59ed 100644 --- a/ui/src/app/metadata/resolver/container/resolver-edit.component.ts +++ b/ui/src/app/metadata/resolver/container/resolver-edit.component.ts @@ -1,7 +1,7 @@ import { Component, OnDestroy } from '@angular/core'; import { Router, ActivatedRoute, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router'; import { Observable, of } from 'rxjs'; -import { skipWhile, map, combineLatest } from 'rxjs/operators'; +import { skipWhile, map, combineLatest, filter } from 'rxjs/operators'; import { Store } from '@ngrx/store'; import * as fromWizard from '../../../wizard/reducer'; import * as fromResolver from '../reducer'; @@ -55,26 +55,23 @@ export class ResolverEditComponent implements OnDestroy, CanComponentDeactivate let startIndex$ = this.route.firstChild ? this.route.firstChild.params.pipe(map(p => p.form)) : - this.definition$.pipe(map(d => d.steps[0].id)); + this.definition$.pipe(filter(d => !!d), map(d => d.steps[0].id)); - startIndex$ - .subscribe(index => { - this.store.dispatch(new SetIndex(index)); - }); + startIndex$.subscribe(index => this.setIndex(index)); - this.index$.subscribe(id => this.go(id)); + this.index$.subscribe(index => index && this.go(index)); this.store .select(fromWizard.getCurrentWizardSchema) - .pipe(skipWhile(s => !s)) + .pipe(filter(s => !!s)) .subscribe(s => this.store.dispatch(new LoadSchemaRequest(s))); this.resolver$.subscribe(p => this.resolver = p); this.store.select(fromResolver.getEntityChanges).subscribe(changes => this.latest = changes); } - go(id: string): void { - this.router.navigate(['./', id], { relativeTo: this.route }); + go(index: string): void { + this.router.navigate(['./', index], { relativeTo: this.route }); } setIndex(id: string): void { diff --git a/ui/src/app/metadata/resolver/container/resolver-wizard-step.component.html b/ui/src/app/metadata/resolver/container/resolver-wizard-step.component.html index f69fbfdf5..926f3024c 100644 --- a/ui/src/app/metadata/resolver/container/resolver-wizard-step.component.html +++ b/ui/src/app/metadata/resolver/container/resolver-wizard-step.component.html @@ -2,7 +2,7 @@ diff --git a/ui/src/app/metadata/resolver/container/resolver-wizard-step.component.ts b/ui/src/app/metadata/resolver/container/resolver-wizard-step.component.ts index cddb8e5b0..0021727b2 100644 --- a/ui/src/app/metadata/resolver/container/resolver-wizard-step.component.ts +++ b/ui/src/app/metadata/resolver/container/resolver-wizard-step.component.ts @@ -9,9 +9,6 @@ import * as fromWizard from '../../../wizard/reducer'; import { UpdateStatus, UpdateChanges } from '../action/entity.action'; import { Wizard } from '../../../wizard/model'; import { MetadataResolver } from '../../domain/model'; -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'; @Component({ selector: 'resolver-wizard-step', @@ -38,7 +35,7 @@ export class ResolverWizardStepComponent implements OnDestroy { validators$: Observable<{ [key: string]: any }>; - bindings: any; + bindings$: Observable; constructor( private store: Store, @@ -46,10 +43,7 @@ export class ResolverWizardStepComponent implements OnDestroy { this.schema$ = this.store.select(fromWizard.getSchema); this.definition$ = this.store.select(fromWizard.getWizardDefinition); this.changes$ = this.store.select(fromResolver.getEntityChanges); - - this.validators$ = this.definition$.pipe( - map((def) => def.getValidators()) - ); + this.bindings$ = this.definition$.pipe(map(d => d.bindings)); this.model$ = this.schema$.pipe( withLatestFrom( @@ -70,6 +64,16 @@ export class ResolverWizardStepComponent implements OnDestroy { map(({ model, definition }) => definition.formatter(model)) ); + this.validators$ = this.definition$.pipe( + withLatestFrom( + this.store.select(fromResolver.getAllEntityIds), + this.model$ + ), + map(([def, ids, resolver]) => def.getValidators( + ids.filter(id => id !== resolver.entityId) + )) + ); + this.valueChangeEmitted$.pipe( withLatestFrom(this.definition$), skipWhile(([ changes, definition ]) => !definition || !changes), @@ -86,47 +90,6 @@ export class ResolverWizardStepComponent implements OnDestroy { this.statusChangeEmitted$.pipe(distinctUntilChanged()).subscribe(errors => this.updateStatus(errors)); this.store.select(fromWizard.getWizardIndex).subscribe(i => this.currentPage = i); - - this.bindings = { - '/securityInfo/x509CertificateAvailable': [ - { - 'input': (event, property: FormProperty) => { - let available = !property.value, - parent = property.parent, - certs = parent.getProperty('x509Certificates'); - if (available && !certs.value.length) { - certs.setValue([ - { - name: '', - type: 'both', - value: '' - } - ], true); - } - - if (!available && certs.value.length > 0) { - certs.setValue([], true); - } - } - } - ], - '/assertionConsumerServices/*/makeDefault': [ - { - 'input': (event, property: FormProperty) => { - let parent = property.parent.parent as ArrayProperty; - let props = parent.properties as ObjectProperty[]; - props.forEach(prop => { - if (prop !== property) { - prop.setValue({ - ...prop.value, - makeDefault: false - }, false); - } - }); - } - } - ] - }; } updateStatus(errors: any): void { diff --git a/ui/src/app/metadata/resolver/effect/draft-collection.effects.ts b/ui/src/app/metadata/resolver/effect/draft-collection.effects.ts index 024c923eb..038024f2d 100644 --- a/ui/src/app/metadata/resolver/effect/draft-collection.effects.ts +++ b/ui/src/app/metadata/resolver/effect/draft-collection.effects.ts @@ -75,6 +75,7 @@ export class DraftCollectionEffects { ofType(DraftActionTypes.UPDATE_DRAFT_REQUEST), map(getPayload), switchMap(provider => { + console.log(provider); return this.draftService .update(provider) .pipe( diff --git a/ui/src/app/metadata/resolver/effect/wizard.effect.ts b/ui/src/app/metadata/resolver/effect/wizard.effect.ts index e8ece35c7..69d24f732 100644 --- a/ui/src/app/metadata/resolver/effect/wizard.effect.ts +++ b/ui/src/app/metadata/resolver/effect/wizard.effect.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core'; import { Effect, Actions, ofType } from '@ngrx/effects'; import { ActivatedRoute, Router } from '@angular/router'; -import { map, switchMap, tap, withLatestFrom } from 'rxjs/operators'; +import { map, filter, tap } from 'rxjs/operators'; import { Store } from '@ngrx/store'; import { @@ -28,6 +28,7 @@ export class WizardEffects { updateResolver$ = this.actions$.pipe( ofType(ResolverEntityActionTypes.UPDATE_CHANGES), map(action => action.payload), + filter(provider => !provider.createdDate), map(provider => new UpdateDraftRequest(provider)) ); diff --git a/ui/src/app/wizard/model/form-definition.ts b/ui/src/app/wizard/model/form-definition.ts index f14fd2f23..f7036014d 100644 --- a/ui/src/app/wizard/model/form-definition.ts +++ b/ui/src/app/wizard/model/form-definition.ts @@ -2,6 +2,7 @@ export interface FormDefinition { label: string; type: string; schema?: string; + bindings?: any; parser(changes: Partial, schema?: any); formatter(changes: Partial, schema?: any); getValidators?(...args: any[]): { [key: string]: any }; diff --git a/ui/src/app/wizard/reducer/index.ts b/ui/src/app/wizard/reducer/index.ts index e3defa126..8540fe2ff 100644 --- a/ui/src/app/wizard/reducer/index.ts +++ b/ui/src/app/wizard/reducer/index.ts @@ -54,7 +54,7 @@ export const getSchemaPath = (index: string, wizard: Wizard) => { }; export const getSplitSchema = (schema: any, step: WizardStep) => { - if (!schema || !step.fields || !step.fields.length) { + if (!schema || !step.fields || !step.fields.length || !schema.properties) { return schema; } const keys = Object.keys(schema.properties).filter(key => step.fields.indexOf(key) > -1); diff --git a/ui/tsconfig.json b/ui/tsconfig.json index 6314441c5..ff13e7e77 100644 --- a/ui/tsconfig.json +++ b/ui/tsconfig.json @@ -7,6 +7,7 @@ "moduleResolution": "node", "emitDecoratorMetadata": true, "experimentalDecorators": true, + "allowSyntheticDefaultImports": true, "target": "es5", "typeRoots": [ "node_modules/@types"