diff --git a/ui/src/app/metadata/domain/domain.type.ts b/ui/src/app/metadata/domain/domain.type.ts index 78def16d7..3cda36b83 100644 --- a/ui/src/app/metadata/domain/domain.type.ts +++ b/ui/src/app/metadata/domain/domain.type.ts @@ -6,9 +6,11 @@ import { import { EntityAttributesFilter, - FileBackedHttpMetadataResolver, - FileBackedHttpMetadataProvider + FileBackedHttpMetadataResolver } from './entity'; +import { + FileBackedHttpMetadataProvider +} from './model/providers'; export type Filter = | EntityAttributesFilter; diff --git a/ui/src/app/metadata/domain/entity/index.ts b/ui/src/app/metadata/domain/entity/index.ts index 1adb3735e..648255369 100644 --- a/ui/src/app/metadata/domain/entity/index.ts +++ b/ui/src/app/metadata/domain/entity/index.ts @@ -1,3 +1,2 @@ export * from './filter/entity-attributes-filter'; -export * from './provider/file-backed-http-metadata-provider'; export * from './resolver/file-backed-http-metadata-resolver'; diff --git a/ui/src/app/metadata/domain/entity/provider/file-backed-http-metadata-provider.spec.ts b/ui/src/app/metadata/domain/entity/provider/file-backed-http-metadata-provider.spec.ts deleted file mode 100644 index 70b0245a4..000000000 --- a/ui/src/app/metadata/domain/entity/provider/file-backed-http-metadata-provider.spec.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { FileBackedHttpMetadataProvider } from './file-backed-http-metadata-provider'; - -describe('FileBackedHttmMetadataProvider construct', () => { - - const config = { - id: 'foo', - entityId: 'string', - serviceProviderName: 'string', - organization: { - 'name': 'string', - 'displayName': 'string', - 'url': 'string' - }, - contacts: [ - { - 'name': 'string', - 'type': 'string', - 'emailAddress': 'string' - } - ], - mdui: { - 'displayName': 'string', - 'informationUrl': 'string', - 'privacyStatementUrl': 'string', - 'logoUrl': 'string', - 'logoHeight': 100, - 'logoWidth': 100, - 'description': 'string' - }, - securityInfo: { - 'x509CertificateAvailable': true, - 'authenticationRequestsSigned': true, - 'wantAssertionsSigned': true, - 'x509Certificates': [ - { - 'name': 'string', - 'type': 'string', - 'value': 'string' - } - ] - }, - assertionConsumerServices: [ - { - 'binding': 'string', - 'locationUrl': 'string', - 'makeDefault': true - } - ], - serviceProviderSsoDescriptor: { - 'protocolSupportEnum': 'string', - 'nameIdFormats': [ - 'string' - ] - }, - - logoutEndpoints: [ - { - 'url': 'string', - 'bindingType': 'string' - } - ], - serviceEnabled: true, - createdDate: new Date().toDateString(), - modifiedDate: new Date().toDateString(), - relyingPartyOverrides: { - 'signAssertion': true, - 'dontSignResponse': true, - 'turnOffEncryption': true, - 'useSha': true, - 'ignoreAuthenticationMethod': true, - 'omitNotBefore': true, - 'responderId': 'string', - 'nameIdFormats': [ - 'string' - ], - 'authenticationMethods': [ - 'string' - ] - }, - attributeRelease: [ - 'eduPersonPrincipalName', - 'uid', - 'mail' - ] - }; - - let entity; - - beforeEach(() => { - entity = new FileBackedHttpMetadataProvider(config); - }); - - it('should populate its own values', () => { - Object.keys(config).forEach(key => { - expect(entity[key]).toEqual(config[key]); - }); - }); - - describe('interface methods', () => { - it('should return a date object from getCreationDate', () => { - expect(entity.getCreationDate()).toEqual(new Date(config.createdDate)); - }); - }); -}); diff --git a/ui/src/app/metadata/domain/entity/provider/file-backed-http-metadata-provider.ts b/ui/src/app/metadata/domain/entity/provider/file-backed-http-metadata-provider.ts deleted file mode 100644 index 2f64a98ba..000000000 --- a/ui/src/app/metadata/domain/entity/provider/file-backed-http-metadata-provider.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { - MetadataProvider -} from '../../model'; - -export class FileBackedHttpMetadataProvider implements MetadataProvider { - id: string; - name: string; - '@type': string; - - createdDate?: string; - modifiedDate?: string; - version: string; - - constructor(descriptor?: Partial) { - Object.assign(this, descriptor); - } - - getCreationDate(): Date { - return new Date(this.createdDate); - } -} diff --git a/ui/src/app/metadata/domain/model/providers/file-backed-http-metadata-provider.ts b/ui/src/app/metadata/domain/model/providers/file-backed-http-metadata-provider.ts new file mode 100644 index 000000000..7d107036b --- /dev/null +++ b/ui/src/app/metadata/domain/model/providers/file-backed-http-metadata-provider.ts @@ -0,0 +1,5 @@ +import { MetadataProvider } from '../metadata-provider'; + +export interface FileBackedHttpMetadataProvider extends MetadataProvider { + metadataFilters: any[]; +} diff --git a/ui/src/app/metadata/domain/model/providers/index.ts b/ui/src/app/metadata/domain/model/providers/index.ts new file mode 100644 index 000000000..0cd02d47d --- /dev/null +++ b/ui/src/app/metadata/domain/model/providers/index.ts @@ -0,0 +1 @@ +export * from './file-backed-http-metadata-provider'; \ No newline at end of file diff --git a/ui/src/app/metadata/provider/action/editor.action.ts b/ui/src/app/metadata/provider/action/editor.action.ts index ca195716f..85ea00edd 100644 --- a/ui/src/app/metadata/provider/action/editor.action.ts +++ b/ui/src/app/metadata/provider/action/editor.action.ts @@ -6,7 +6,9 @@ export enum EditorActionTypes { LOAD_SCHEMA_SUCCESS = '[Provider Editor] Load Schema Success', LOAD_SCHEMA_FAIL = '[Provider Editor] Load Schema Fail', - SELECT_PROVIDER_TYPE = '[Provider Editor] Select Provider Type' + SELECT_PROVIDER_TYPE = '[Provider Editor] Select Provider Type', + + CLEAR = '[Provider Editor] Clear' } export class UpdateStatus implements Action { @@ -39,9 +41,14 @@ export class SelectProviderType implements Action { constructor(public payload: string) { } } +export class ClearEditor implements Action { + readonly type = EditorActionTypes.CLEAR; +} + export type EditorActionUnion = | UpdateStatus | LoadSchemaRequest | LoadSchemaSuccess | LoadSchemaFail - | SelectProviderType; + | SelectProviderType + | ClearEditor; diff --git a/ui/src/app/metadata/provider/action/entity.action.ts b/ui/src/app/metadata/provider/action/entity.action.ts index bff45b5f4..12c2efa5f 100644 --- a/ui/src/app/metadata/provider/action/entity.action.ts +++ b/ui/src/app/metadata/provider/action/entity.action.ts @@ -9,7 +9,8 @@ export enum EntityActionTypes { SAVE_PROVIDER_SUCCESS = '[Provider Entity] Save Provider Success', SAVE_PROVIDER_FAIL = '[Provider Entity] Save Provider Fail', - RESET_CHANGES = '[Provider Entity] Reset Provider Changes' + CLEAR_PROVIDER = '[Provider Entity] Clear', + RESET_CHANGES = '[Provider Entity] Reset Changes' } export class SelectProvider implements Action { @@ -48,6 +49,10 @@ export class SaveProviderFail implements Action { constructor(public payload: Error) { } } +export class ClearProvider implements Action { + readonly type = EntityActionTypes.CLEAR_PROVIDER; +} + export class ResetChanges implements Action { readonly type = EntityActionTypes.RESET_CHANGES; } @@ -59,4 +64,5 @@ export type EntityActionUnion = | SaveProviderSuccess | SaveProviderFail | CreateProvider + | ClearProvider | ResetChanges; diff --git a/ui/src/app/metadata/provider/container/provider-wizard-step.component.html b/ui/src/app/metadata/provider/container/provider-wizard-step.component.html index 842a4a2c2..b04035bf7 100644 --- a/ui/src/app/metadata/provider/container/provider-wizard-step.component.html +++ b/ui/src/app/metadata/provider/container/provider-wizard-step.component.html @@ -1,5 +1,5 @@ \ No newline at end of file diff --git a/ui/src/app/metadata/provider/container/provider-wizard-step.component.ts b/ui/src/app/metadata/provider/container/provider-wizard-step.component.ts index b4c553f0a..81f57c1eb 100644 --- a/ui/src/app/metadata/provider/container/provider-wizard-step.component.ts +++ b/ui/src/app/metadata/provider/container/provider-wizard-step.component.ts @@ -1,6 +1,6 @@ import { Component, OnDestroy } from '@angular/core'; import { Observable, Subject } from 'rxjs'; -import { withLatestFrom } from 'rxjs/operators'; +import { withLatestFrom, map } from 'rxjs/operators'; import { Store } from '@ngrx/store'; import * as fromProvider from '../reducer'; @@ -31,6 +31,7 @@ export class ProviderWizardStepComponent implements OnDestroy { changes$: Observable; currentPage: string; valid$: Observable; + model$: Observable; constructor( private store: Store @@ -52,32 +53,51 @@ export class ProviderWizardStepComponent implements OnDestroy { this.store.dispatch(new SetDisabled(!valid)); }); + this.model$ = this.schema$.pipe( + withLatestFrom( + this.store.select(fromWizard.getModel), + this.changes$, + this.definition$ + ), + map(([schema, model, changes, definition]) => { + return ({ + model: { + ...model, + ...changes + }, + definition + }); + }), + map(({ model, definition }) => { + return definition.translate ? definition.translate.formatter(model) : model; + }) + ); + this.schema$.subscribe(s => this.schema = s); - this.changeEmitted$ - .pipe( - withLatestFrom(this.schema$, this.definition$), - ) - .subscribe( - ([changes, schema, definition]) => { - const type = changes.value['@type']; - if (type && type !== definition.type) { - const newDefinition = MetadataProviderTypes.find(def => def.type === type); - if (newDefinition) { - this.store.dispatch(new SetDefinition({ - ...MetadataProviderWizard, - ...newDefinition, - steps: [ - ...MetadataProviderWizard.steps, - ...newDefinition.steps - ] - })); - changes = { value: pick(Object.keys(schema.properties))(changes.value) }; - } + this.changeEmitted$.pipe( + withLatestFrom(this.schema$, this.definition$), + map(([changes, schema, definition]) => { + const type = changes.value['@type']; + if (type && type !== definition.type) { + const newDefinition = MetadataProviderTypes.find(def => def.type === type); + if (newDefinition) { + this.store.dispatch(new SetDefinition({ + ...MetadataProviderWizard, + ...newDefinition, + steps: [ + ...MetadataProviderWizard.steps, + ...newDefinition.steps + ] + })); + changes = { value: pick(Object.keys(schema.properties))(changes.value) }; } - this.store.dispatch(new UpdateProvider(changes.value)); } - ); + return { changes: changes.value, definition }; + }), + map(({ changes, definition }) => definition.translate ? definition.translate.parser(changes) : changes) + ) + .subscribe(changes => this.store.dispatch(new UpdateProvider(changes))); } ngOnDestroy() { diff --git a/ui/src/app/metadata/provider/container/provider-wizard.component.html b/ui/src/app/metadata/provider/container/provider-wizard.component.html index cbeb7c675..2193c7e1d 100644 --- a/ui/src/app/metadata/provider/container/provider-wizard.component.html +++ b/ui/src/app/metadata/provider/container/provider-wizard.component.html @@ -5,10 +5,8 @@
- + --> 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 095d92a23..248efe68b 100644 --- a/ui/src/app/metadata/provider/container/provider-wizard.component.ts +++ b/ui/src/app/metadata/provider/container/provider-wizard.component.ts @@ -4,12 +4,13 @@ import { Store } from '@ngrx/store'; import * as fromProvider from '../reducer'; import * as fromWizard from '../../../wizard/reducer'; - -import { SetIndex, SetDisabled } from '../../../wizard/action/wizard.action'; -import { LoadSchemaRequest } from '../action/editor.action'; +import { SetIndex, SetDisabled, ClearWizard } from '../../../wizard/action/wizard.action'; +import { LoadSchemaRequest, ClearEditor } from '../action/editor.action'; import { startWith } from 'rxjs/operators'; import { Wizard, WizardStep } from '../../../wizard/model'; import { MetadataProvider } from '../../domain/model'; +import { ClearProvider } from '../action/entity.action'; + @Component({ selector: 'provider-wizard', @@ -17,16 +18,16 @@ import { MetadataProvider } from '../../domain/model'; styleUrls: [] }) -export class ProviderWizardComponent { +export class ProviderWizardComponent implements OnDestroy { + schema$: Observable; schema: any; definition$: Observable>; changes$: Observable; + model$: Observable; currentPage: string; valid$: Observable; - formModel: any; - nextStep: WizardStep; previousStep: WizardStep; @@ -48,6 +49,15 @@ export class ProviderWizardComponent { .subscribe((valid) => { this.store.dispatch(new SetDisabled(!valid)); }); + + this.schema$.subscribe(s => this.schema = s); + + } + + ngOnDestroy() { + this.store.dispatch(new ClearProvider()); + this.store.dispatch(new ClearWizard()); + this.store.dispatch(new ClearEditor()); } next(): void { 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 4f77f9e35..9b31fa220 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 @@ -1,17 +1,39 @@ import { Wizard } from '../../../wizard/model'; -import { MetadataProvider } from '../../domain/model'; +import { FileBackedHttpMetadataProvider } from '../../domain/model/providers/file-backed-http-metadata-provider'; -export const FileBackedHttpMetadataProviderWizard: Wizard = { +export const FileBackedHttpMetadataProviderWizard: Wizard = { label: 'FileBackedHttpMetadataProvider', type: '@FileBackedHttpMetadataProvider', + translate: { + parser: (changes) => ({ + ...changes, + metadataFilters: [ + ...Object.keys(changes.metadataFilters || {}).reduce((collection, filterName) => ([ + ...collection, + { + ...changes.metadataFilters[filterName], + '@type': filterName + } + ]), []) + ] + }), + formatter: (changes) => ({ + ...changes, + metadataFilters: { + ...(changes.metadataFilters || []).reduce((collection, filter) => ({ + ...collection, + [filter['@type']]: filter + }), {}) + } + }) + }, steps: [ { id: 'common', label: 'Common Attributes', index: 2, initialValues: [], - schema: 'assets/schema/provider/filebacked-http-common.schema.json', - parser: (changes: Partial, schema: any) => ({ name: '', '@type': '' }) + schema: 'assets/schema/provider/filebacked-http-common.schema.json' }, { id: 'reloading', @@ -24,7 +46,9 @@ export const FileBackedHttpMetadataProviderWizard: Wizard = { id: 'filters', label: 'Metadata Filter Plugins', index: 4, - initialValues: [], + initialValues: [ + { key: 'metadataFilters', value: [] } + ], schema: 'assets/schema/provider/filebacked-http-filters.schema.json' } ] diff --git a/ui/src/app/metadata/provider/reducer/editor.reducer.ts b/ui/src/app/metadata/provider/reducer/editor.reducer.ts index 351a17917..609f707f0 100644 --- a/ui/src/app/metadata/provider/reducer/editor.reducer.ts +++ b/ui/src/app/metadata/provider/reducer/editor.reducer.ts @@ -24,6 +24,11 @@ export function reducer(state = initialState, action: EditorActionUnion): Editor type: action.payload }; } + case EditorActionTypes.CLEAR: { + return { + ...initialState + }; + } case EditorActionTypes.UPDATE_STATUS: { return { ...state, diff --git a/ui/src/app/metadata/provider/reducer/entity.reducer.ts b/ui/src/app/metadata/provider/reducer/entity.reducer.ts index 101674749..4207c42a4 100644 --- a/ui/src/app/metadata/provider/reducer/entity.reducer.ts +++ b/ui/src/app/metadata/provider/reducer/entity.reducer.ts @@ -15,10 +15,17 @@ export const initialState: EntityState = { export function reducer(state = initialState, action: EntityActionUnion): EntityState { switch (action.type) { + case EntityActionTypes.CLEAR_PROVIDER: { + return { + ...initialState + }; + } case EntityActionTypes.RESET_CHANGES: { return { ...state, - changes: initialState.changes + changes: { + ...initialState.changes + } }; } case EntityActionTypes.SELECT_PROVIDER: diff --git a/ui/src/app/schema-form/registry.ts b/ui/src/app/schema-form/registry.ts index 85e7d3a7d..d197dcf2c 100644 --- a/ui/src/app/schema-form/registry.ts +++ b/ui/src/app/schema-form/registry.ts @@ -4,17 +4,17 @@ import { CustomStringComponent } from './widget/text/string.component'; import { WidgetRegistry } from 'ngx-schema-form'; -import { ArrayWidget } from 'ngx-schema-form'; import { ButtonWidget } from 'ngx-schema-form'; -import { CheckboxWidget } from 'ngx-schema-form'; import { FileWidget } from 'ngx-schema-form'; import { IntegerWidget } from 'ngx-schema-form'; import { ObjectWidget } from 'ngx-schema-form'; import { RadioWidget } from 'ngx-schema-form'; import { RangeWidget } from 'ngx-schema-form'; -import { TextAreaWidget } from 'ngx-schema-form'; import { CustomSelectComponent } from './widget/select/select.component'; import { DatalistComponent } from './widget/datalist/datalist.component'; +import { CustomCheckboxComponent } from './widget/check/checkbox.component'; +import { CustomTextAreaComponent } from './widget/textarea/textarea.component'; +import { CustomArrayComponent } from './widget/array/array.component'; export class CustomWidgetRegistry extends WidgetRegistry { @@ -34,26 +34,27 @@ export class CustomWidgetRegistry extends WidgetRegistry { this.register('time', CustomStringComponent); this.register('boolean-radio', BooleanRadioComponent); + this.register('fieldset', FieldsetComponent); + this.register('array', CustomArrayComponent); this.register('select', CustomSelectComponent); + this.register('boolean', CustomCheckboxComponent); + this.register('checkbox', CustomCheckboxComponent); + + this.register('textarea', CustomTextAreaComponent); this.register('datalist', DatalistComponent); /* NGX-Form */ - this.register('array', ArrayWidget); this.register('object', ObjectWidget); this.register('integer', IntegerWidget); this.register('number', IntegerWidget); this.register('range', RangeWidget); - this.register('textarea', TextAreaWidget); - this.register('file', FileWidget); this.register('radio', RadioWidget); - this.register('boolean', CheckboxWidget); - this.register('checkbox', CheckboxWidget); this.register('button', ButtonWidget); diff --git a/ui/src/app/schema-form/schema-form.module.ts b/ui/src/app/schema-form/schema-form.module.ts index 95549b7de..d51ae2269 100644 --- a/ui/src/app/schema-form/schema-form.module.ts +++ b/ui/src/app/schema-form/schema-form.module.ts @@ -11,13 +11,19 @@ import { NgbPopoverModule } from '@ng-bootstrap/ng-bootstrap'; import { SharedModule } from '../shared/shared.module'; import { CustomSelectComponent } from './widget/select/select.component'; import { DatalistComponent } from './widget/datalist/datalist.component'; +import { CustomCheckboxComponent } from './widget/check/checkbox.component'; +import { CustomTextAreaComponent } from './widget/textarea/textarea.component'; +import { CustomArrayComponent } from './widget/array/array.component'; export const COMPONENTS = [ BooleanRadioComponent, FieldsetComponent, CustomStringComponent, CustomSelectComponent, - DatalistComponent + DatalistComponent, + CustomCheckboxComponent, + CustomTextAreaComponent, + CustomArrayComponent ]; @NgModule({ diff --git a/ui/src/app/schema-form/widget/array/array.component.html b/ui/src/app/schema-form/widget/array/array.component.html new file mode 100644 index 000000000..577c084f9 --- /dev/null +++ b/ui/src/app/schema-form/widget/array/array.component.html @@ -0,0 +1,23 @@ +
+
+ +   + +
+
+
+ +
+ +
+
+
+ {{schema.description}} +
\ No newline at end of file diff --git a/ui/src/app/schema-form/widget/array/array.component.ts b/ui/src/app/schema-form/widget/array/array.component.ts new file mode 100644 index 000000000..52987cda7 --- /dev/null +++ b/ui/src/app/schema-form/widget/array/array.component.ts @@ -0,0 +1,9 @@ +import { Component } from '@angular/core'; + +import { ArrayWidget } from 'ngx-schema-form'; + +@Component({ + selector: 'array-component', + templateUrl: `./array.component.html` +}) +export class CustomArrayComponent extends ArrayWidget {} diff --git a/ui/src/app/schema-form/widget/check/checkbox.component.html b/ui/src/app/schema-form/widget/check/checkbox.component.html new file mode 100644 index 000000000..4c2745660 --- /dev/null +++ b/ui/src/app/schema-form/widget/check/checkbox.component.html @@ -0,0 +1,51 @@ +
+ +
+
+ + + +
+
+ {{ schema.description }} + +
+
+
+ +
+ +
+
+
+ \ No newline at end of file diff --git a/ui/src/app/schema-form/widget/check/checkbox.component.ts b/ui/src/app/schema-form/widget/check/checkbox.component.ts new file mode 100644 index 000000000..ebb784d71 --- /dev/null +++ b/ui/src/app/schema-form/widget/check/checkbox.component.ts @@ -0,0 +1,9 @@ +import { Component } from '@angular/core'; + +import { CheckboxWidget } from 'ngx-schema-form'; + +@Component({ + selector: 'checkbox-component', + templateUrl: `./checkbox.component.html` +}) +export class CustomCheckboxComponent extends CheckboxWidget { } diff --git a/ui/src/app/schema-form/widget/select/select.component.html b/ui/src/app/schema-form/widget/select/select.component.html index 831a7e852..7b4bf8173 100644 --- a/ui/src/app/schema-form/widget/select/select.component.html +++ b/ui/src/app/schema-form/widget/select/select.component.html @@ -1,7 +1,7 @@
-
\ No newline at end of file diff --git a/ui/src/app/schema-form/widget/textarea/textarea.component.ts b/ui/src/app/schema-form/widget/textarea/textarea.component.ts new file mode 100644 index 000000000..6586d7d1f --- /dev/null +++ b/ui/src/app/schema-form/widget/textarea/textarea.component.ts @@ -0,0 +1,9 @@ +import { Component } from '@angular/core'; + +import { TextAreaWidget } from 'ngx-schema-form'; + +@Component({ + selector: 'textarea-component', + templateUrl: `./textarea.component.html` +}) +export class CustomTextAreaComponent extends TextAreaWidget {} diff --git a/ui/src/app/wizard/action/wizard.action.ts b/ui/src/app/wizard/action/wizard.action.ts index b144601ae..55bb9b404 100644 --- a/ui/src/app/wizard/action/wizard.action.ts +++ b/ui/src/app/wizard/action/wizard.action.ts @@ -8,7 +8,9 @@ export enum WizardActionTypes { SET_DISABLED = '[Wizard] Set Disabled', NEXT = '[Wizard] Next Page', - PREVIOUS = '[Wizard] Previous Page' + PREVIOUS = '[Wizard] Previous Page', + + CLEAR = '[Wizard] Clear' } export class SetIndex implements Action { @@ -47,10 +49,15 @@ export class Previous implements Action { constructor(public payload: string) { } } +export class ClearWizard implements Action { + readonly type = WizardActionTypes.CLEAR; +} + export type WizardActionUnion = | SetIndex | SetDefinition | UpdateDefinition | SetDisabled | Next - | Previous; + | Previous + | ClearWizard; diff --git a/ui/src/app/wizard/model/wizard.ts b/ui/src/app/wizard/model/wizard.ts index bcceb9f00..b95f18cd9 100644 --- a/ui/src/app/wizard/model/wizard.ts +++ b/ui/src/app/wizard/model/wizard.ts @@ -1,9 +1,11 @@ -import { MetadataProvider } from '../../metadata/domain/model'; - export interface Wizard { label: string; type: string; steps: WizardStep[]; + translate?: { + parser(changes: Partial, schema?: any), + formatter(changes: Partial, schema?: any) + }; } export interface WizardStep { @@ -12,7 +14,6 @@ export interface WizardStep { initialValues?: WizardValue[]; schema: string; index: number; - parser?(changes: Partial, schema: any); } export interface WizardValue { diff --git a/ui/src/app/wizard/reducer/index.ts b/ui/src/app/wizard/reducer/index.ts index 1119d5d14..bde6660fb 100644 --- a/ui/src/app/wizard/reducer/index.ts +++ b/ui/src/app/wizard/reducer/index.ts @@ -1,7 +1,7 @@ import * as fromRoot from '../../app.reducer'; import * as fromWizard from './wizard.reducer'; import { createFeatureSelector, createSelector } from '@ngrx/store'; -import { Wizard } from '../model'; +import { Wizard, WizardStep } from '../model'; export interface WizardState { wizard: fromWizard.State; @@ -28,7 +28,6 @@ export const getSchema = (index: string, wizard: Wizard) => { return step ? step.schema : null; }; - export const getCurrentWizardSchema = createSelector(getWizardIndex, getWizardDefinition, getSchema); export const getPreviousFn = (index: string, wizard: Wizard) => { @@ -54,7 +53,14 @@ export const getLastFn = (index: string, wizard: Wizard) => { return index === step.id ? step : null; }; +export const getModelFn = (currentStep: WizardStep) => { + const model = currentStep.initialValues || []; + return model.reduce((m, property) => m[property.key] = property.value, {}); +}; + export const getPrevious = createSelector(getWizardIndex, getWizardDefinition, getPreviousFn); export const getCurrent = createSelector(getWizardIndex, getWizardDefinition, getCurrentFn); export const getNext = createSelector(getWizardIndex, getWizardDefinition, getNextFn); export const getLast = createSelector(getWizardIndex, getWizardDefinition, getLastFn); +export const getModel = createSelector(getCurrent, getModelFn); + diff --git a/ui/src/assets/schema/provider/filebacked-http-filters.schema.json b/ui/src/assets/schema/provider/filebacked-http-filters.schema.json index 2b3d32846..884b8b89e 100644 --- a/ui/src/assets/schema/provider/filebacked-http-filters.schema.json +++ b/ui/src/assets/schema/provider/filebacked-http-filters.schema.json @@ -15,7 +15,7 @@ "properties": { "maxValidityInterval": { "title": "Max Validity Interval", - "description": "", + "description": "Max Validity Interval", "type": "number" } } @@ -29,14 +29,15 @@ "properties": { "requireSignedRoot": { "title": "Require Signed Root", - "description": "", + "description": "Require Signed Root", "type": "boolean", "default": true }, "certificateFile": { "title": "Certificate File", - "description": "", - "type": "string" + "description": "Certificate File", + "type": "string", + "widget": "textarea" } } }, @@ -49,7 +50,7 @@ "properties": { "retainedRoles": { "title": "Retained Roles", - "description": "", + "description": "Retained Roles", "type": "array", "items": { "widget": { @@ -74,13 +75,13 @@ }, "removeRolelessEntityDescriptors": { "title": "Remove Roleless Entity Descriptors?", - "description": "", + "description": "Remove Roleless Entity Descriptors?", "type": "boolean", "default": true }, "removeEmptyEntitiesDescriptors": { "title": "Remove Empty Entities Descriptors?", - "description": "", + "description": "Remove Empty Entities Descriptors?", "type": "boolean", "default": true }