Skip to content

Commit

Permalink
SHIBUI-914 Fixed issues with providers/resolvers edit screens
Browse files Browse the repository at this point in the history
  • Loading branch information
rmathis committed Oct 17, 2018
1 parent ab46139 commit 3a81f2c
Show file tree
Hide file tree
Showing 22 changed files with 200 additions and 126 deletions.
5 changes: 5 additions & 0 deletions ui/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions ui/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
14 changes: 4 additions & 10 deletions ui/src/app/metadata/domain/component/editor-nav.component.html
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
<valid-form-icon *ngIf="status.indexOf(route.path) > -1" status="INVALID"></valid-form-icon>
</a>
<div class="dropdown-divider"></div>
<ng-content select=".dropdown-items"></ng-content>
<ng-content select=".dropdown-item"></ng-content>
</div>
</div>
<ng-container *ngSwitchCase="formats.TABS">
Expand All @@ -43,14 +43,8 @@
</a>
</nav>
<hr />
<!--<nav class="nav nav-pills flex-column" role="navigation">
<a class="nav-link"
[routerLink]="['../', 'filters']"
routerLinkActive="active"
[attr.aria-label]="'label.filter-list' | translate"
role="button">
<translate-i18n key="label.filter-list"></translate-i18n>
</a>
</nav>-->
<nav class="nav nav-pills flex-column" role="navigation">
<ng-content select=".nav-link"></ng-content>
</nav>
</ng-container>
</ng-container>
3 changes: 1 addition & 2 deletions ui/src/app/metadata/domain/component/editor-nav.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ export enum NAV_FORMATS {

export class EditorNavComponent {
@Input() format: string;
@Input() status: string[];
@Input() status: string[] = [];

@Output() onPageSelect: EventEmitter<string> = new EventEmitter();

Expand All @@ -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));
}

Expand Down
17 changes: 12 additions & 5 deletions ui/src/app/metadata/domain/component/wizard-summary.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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];
}
Expand All @@ -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,
Expand Down Expand Up @@ -66,7 +68,8 @@ export class WizardSummaryComponent implements OnChanges {
columns: Array<Section>[];
steps: WizardStep[];

constructor() {}
constructor() {
}

ngOnChanges(changes: SimpleChanges): void {
if (changes.summary && this.summary) {
Expand All @@ -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(
Expand All @@ -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 || {}
)
});
}
Expand Down
90 changes: 90 additions & 0 deletions ui/src/app/metadata/domain/model/wizards/metadata-source-base.ts
Original file line number Diff line number Diff line change
@@ -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<MetadataResolver> {
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<MetadataResolver>, schema?: any): any {
return changes;
}

formatter(changes: Partial<MetadataResolver>, 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;
}
}
18 changes: 2 additions & 16 deletions ui/src/app/metadata/domain/model/wizards/metadata-source-editor.ts
Original file line number Diff line number Diff line change
@@ -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<MetadataResolver> {
label = 'Metadata Source';
type = '@MetadataProvider';
export class MetadataSourceEditor extends MetadataSourceBase implements Wizard<MetadataResolver> {
steps: WizardStep[] = [
{
index: 1,
Expand Down Expand Up @@ -131,17 +130,4 @@ export class MetadataSourceEditor implements Wizard<MetadataResolver> {
]
}
];

parser(changes: Partial<MetadataResolver>, schema?: any): any {
return changes;
}

formatter(changes: Partial<MetadataResolver>, schema?: any): any {
return changes;
}

getValidators(...args: any[]): { [key: string]: any } {
const validators = {};
return validators;
}
}
18 changes: 2 additions & 16 deletions ui/src/app/metadata/domain/model/wizards/metadata-source-wizard.ts
Original file line number Diff line number Diff line change
@@ -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<MetadataResolver> {
label = 'Metadata Source';
type = '@MetadataProvider';
export class MetadataSourceWizard extends MetadataSourceBase implements Wizard<MetadataResolver> {
steps: WizardStep[] = [
{
index: 1,
Expand Down Expand Up @@ -155,18 +154,5 @@ export class MetadataSourceWizard implements Wizard<MetadataResolver> {
summary: true
}
];

parser (changes: Partial<MetadataResolver>, schema?: any): any {
return changes;
}

formatter (changes: Partial < MetadataResolver >, schema ?: any): any {
return changes;
}

getValidators(...args: any[]): { [key: string]: any } {
const validators = {};
return validators;
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -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';

Expand All @@ -19,6 +19,8 @@ import { FormControl } from '@angular/forms';
styleUrls: []
})
export class ProviderEditStepComponent implements OnDestroy {
private ngUnsubscribe: Subject<void> = new Subject<void>();

valueChangeSubject = new Subject<Partial<any>>();
private valueChangeEmitted$ = this.valueChangeSubject.asObservable();

Expand Down Expand Up @@ -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(
Expand All @@ -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(
Expand All @@ -114,6 +117,8 @@ export class ProviderEditStepComponent implements OnDestroy {

ngOnDestroy() {
this.valueChangeSubject.complete();
this.statusChangeSubject.complete();
this.ngUnsubscribe.unsubscribe();
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,13 @@
[format]="formats.DROPDOWN"
[status]="status$ | async"
(onPageSelect)="setIndex($event)">
<a class="dropdown-item"
[routerLink]="['../', 'filters']"
routerLinkActive="active"
[attr.aria-label]="'label.filter-list' | translate"
role="button">
<translate-i18n key="label.filter-list"></translate-i18n>
</a>
</editor-nav>
</div>
<div class="col-6 col-lg-3 order-2 text-right">
Expand Down Expand Up @@ -50,6 +57,13 @@
<editor-nav
[format]="formats.TABS"
(onPageSelect)="setIndex($event)">
<a class="nav-link"
[routerLink]="['../', 'filters']"
routerLinkActive="active"
[attr.aria-label]="'label.filter-list' | translate"
role="button">
<translate-i18n key="label.filter-list"></translate-i18n>
</a>
</editor-nav>
</div>
<div class="col-lg-6">
Expand Down
Original file line number Diff line number Diff line change
@@ -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';
Expand Down Expand Up @@ -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));
Expand All @@ -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());
}

Expand Down
Loading

0 comments on commit 3a81f2c

Please sign in to comment.