Skip to content

Commit

Permalink
SHIBUI-1478 Updated UI to support new schemas
Browse files Browse the repository at this point in the history
  • Loading branch information
rmathis committed Sep 25, 2019
1 parent 81bfaec commit 85f6d2d
Show file tree
Hide file tree
Showing 10 changed files with 99 additions and 48 deletions.
11 changes: 10 additions & 1 deletion ui/src/app/metadata/configuration/reducer/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,18 @@ export const getConfigurationModelKind = createSelector(getConfigurationState, f
export const getConfigurationModelId = createSelector(getConfigurationState, fromConfiguration.getModelId);

export const getConfigurationDefinition = createSelector(getConfigurationState, fromConfiguration.getDefinition);
export const getConfigurationSchema = createSelector(getConfigurationState, fromConfiguration.getSchema);
export const getSchema = createSelector(getConfigurationState, fromConfiguration.getSchema);
export const getConfigurationXml = createSelector(getConfigurationState, fromConfiguration.getXml);

export const processSchemaFn = (definition, schema) => {
return definition && schema ?
definition.schemaPreprocessor ?
definition.schemaPreprocessor(schema) : schema
: schema;
};

export const getConfigurationSchema = createSelector(getConfigurationDefinition, getSchema, processSchemaFn);

export const assignValueToProperties = (models, properties, definition: any): any[] => {
return properties.map(prop => {
const differences = models.some((model, index, array) => {
Expand Down
12 changes: 2 additions & 10 deletions ui/src/app/metadata/provider/model/dynamic-http.provider.form.ts
Original file line number Diff line number Diff line change
@@ -1,21 +1,13 @@
import { Wizard } from '../../../wizard/model';
import { DynamicHttpMetadataProvider } from '../../domain/model/providers/dynamic-http-metadata-provider';
import { BaseMetadataProviderEditor } from './base.provider.form';
import { metadataFilterProcessor } from './utilities';

export const DynamicHttpMetadataProviderWizard: Wizard<DynamicHttpMetadataProvider> = {
...BaseMetadataProviderEditor,
label: 'DynamicHttpMetadataProvider',
type: 'DynamicHttpMetadataResolver',
formatter: (changes: DynamicHttpMetadataProvider) => {
let base = BaseMetadataProviderEditor.formatter(changes);
if (base.dynamicMetadataResolverAttributes) {
if (base.dynamicMetadataResolverAttributes.refreshDelayFactor) {
base.dynamicMetadataResolverAttributes.refreshDelayFactor =
base.dynamicMetadataResolverAttributes.refreshDelayFactor.toString();
}
}
return base;
},
schemaPreprocessor: metadataFilterProcessor,
getValidators(namesList: string[] = [], xmlIdList: string[] = []): any {
const validators = BaseMetadataProviderEditor.getValidators(namesList, xmlIdList);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,13 @@ import { FileBackedHttpMetadataProvider } from '../../domain/model/providers/fil
import { BaseMetadataProviderEditor } from './base.provider.form';
import { UriValidator } from '../../../shared/validation/uri.validator';

import { metadataFilterProcessor } from './utilities';

export const FileBackedHttpMetadataProviderWizard: Wizard<FileBackedHttpMetadataProvider> = {
...BaseMetadataProviderEditor,
label: 'FileBackedHttpMetadataProvider',
type: 'FileBackedHttpMetadataResolver',
formatter: (changes: FileBackedHttpMetadataProvider) => {
let base = BaseMetadataProviderEditor.formatter(changes);
if (base.reloadableMetadataResolverAttributes) {
if (base.reloadableMetadataResolverAttributes.refreshDelayFactor) {
base.reloadableMetadataResolverAttributes.refreshDelayFactor =
base.reloadableMetadataResolverAttributes.refreshDelayFactor.toString();
}
}
return base;
},
schemaPreprocessor: metadataFilterProcessor,
getValidators(namesList: string[] = [], xmlIdList: string[] = []): any {
const validators = BaseMetadataProviderEditor.getValidators(namesList, xmlIdList);
validators['/metadataURL'] = (value, property, form) => {
Expand Down
10 changes: 0 additions & 10 deletions ui/src/app/metadata/provider/model/file-system.provider.form.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,6 @@ export const FileSystemMetadataProviderWizard: Wizard<FileSystemMetadataProvider
...BaseMetadataProviderEditor,
label: 'FilesystemMetadataProvider',
type: 'FilesystemMetadataResolver',
formatter: (changes: FileSystemMetadataProvider) => {
let base = BaseMetadataProviderEditor.formatter(changes);
if (base.reloadableMetadataResolverAttributes) {
if (base.reloadableMetadataResolverAttributes.refreshDelayFactor) {
base.reloadableMetadataResolverAttributes.refreshDelayFactor =
base.reloadableMetadataResolverAttributes.refreshDelayFactor.toString();
}
}
return base;
},
schema: '/api/ui/MetadataResolver/FilesystemMetadataResolver',
steps: [
{
Expand Down
10 changes: 0 additions & 10 deletions ui/src/app/metadata/provider/model/local-dynamic.provider.form.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,6 @@ export const LocalDynamicMetadataProviderWizard: Wizard<LocalDynamicMetadataProv
...BaseMetadataProviderEditor,
label: 'LocalDynamicMetadataProvider',
type: 'LocalDynamicMetadataResolver',
formatter: (changes: LocalDynamicMetadataProvider) => {
let base = BaseMetadataProviderEditor.formatter(changes);
if (base.dynamicMetadataResolverAttributes) {
if (base.dynamicMetadataResolverAttributes.refreshDelayFactor) {
base.dynamicMetadataResolverAttributes.refreshDelayFactor =
base.dynamicMetadataResolverAttributes.refreshDelayFactor.toString();
}
}
return base;
},
schema: '/api/ui/MetadataResolver/LocalDynamicMetadataResolver',
steps: [
{
Expand Down
25 changes: 25 additions & 0 deletions ui/src/app/metadata/provider/model/utilities.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
export const metadataFilterProcessor = (schema) => {
console.log(schema);
if (!schema) {
return null;
}
if (!schema.properties || !schema.properties.metadataFilters) {
return schema;
}
const filters = schema.properties.metadataFilters;
const processed = ({
...schema,
properties: {
...schema.properties,
metadataFilters: {
type: 'object',
properties: filters.items.reduce((collection, filterType) => ({
...collection,
[filterType.$id]: filterType
}), {})
}
}
});
console.log(processed);
return processed;
};
8 changes: 4 additions & 4 deletions ui/src/app/schema-form/widget/number/float.component.html
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,17 @@
</span>
</label>
<span *ngIf="schema.description" class="formHelp" [translate]="schema.description">{{schema.description}}</span>
<input [attr.readonly]="schema.readOnly?true:null"
<input #input
disableValidation="true"
[attr.readonly]="schema.readOnly?true:null"
[id]="formProperty._canonicalPath"
[name]="name"
class="text-widget integer-widget form-control"
class="text-widget float-widget form-control"
[formControl]="control"
[attr.type]="'number'"
[attr.min]="schema.minimum"
[attr.max]="schema.maximum"
[attr.placeholder]="schema.placeholder | translate"
[attr.maxLength]="schema.maxLength || null"
[attr.minLength]="schema.minLength || null"
[attr.step]="schema.multipleOf || schema.widget.step"
[attr.aria-label]="schema.title">
</div>
51 changes: 49 additions & 2 deletions ui/src/app/schema-form/widget/number/float.component.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import {
Component,
Component, AfterViewInit, ViewChild, ElementRef,
} from '@angular/core';
import { IntegerWidget } from 'ngx-schema-form';
import { SchemaService } from '../../service/schema.service';
Expand All @@ -8,14 +8,61 @@ import { SchemaService } from '../../service/schema.service';
selector: 'float-component',
templateUrl: `./float.component.html`
})
export class CustomFloatComponent extends IntegerWidget {
export class CustomFloatComponent extends IntegerWidget implements AfterViewInit {
private _displayValue: string;
@ViewChild('input') element: ElementRef;

constructor(
private widgetService: SchemaService
) {
super();
}

ngAfterViewInit() {
super.ngAfterViewInit();
const control = this.control;
this.formProperty.valueChanges.subscribe((newValue) => {
if (typeof this._displayValue !== 'undefined') {
// Ignore the model value, use the display value instead
if (control.value !== this._displayValue) {
control.setValue(this._displayValue, { emitEvent: false });
}
} else {
if (control.value !== newValue) {
control.setValue(newValue, { emitEvent: false });
}
}
});
this.formProperty.errorsChanges.subscribe((errors) => {
control.setErrors(errors, { emitEvent: true });
const messages = (errors || [])
.filter(e => {
return e.path && e.path.slice(1) === this.formProperty.path;
})
.map(e => e.message);
this.errorMessages = messages.filter((m, i) => messages.indexOf(m) === i);
});
control.valueChanges.subscribe((newValue) => {
const native = (<HTMLInputElement>this.element.nativeElement);
this._displayValue = newValue;
this.formProperty.setValue(newValue, false);
if (newValue === '' && native.validity.badInput) {
this.formProperty.extendErrors([{
code: 'INVALID_NUMBER',
path: `#${this.formProperty.path}`,
message: 'Invalid number',
}]);
}
});
}

get required(): boolean {
return this.widgetService.isRequired(this.formProperty);
}

get minimum(): number {
return this.required ?
this.schema.minimum :
this.formProperty.value === null ? null : this.schema.minimum;
}
}
1 change: 1 addition & 0 deletions ui/src/app/wizard/model/form-definition.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,5 @@ export interface FormDefinition<T> {
parser(changes: Partial<T>, schema?: any);
formatter(changes: Partial<T>, schema?: any);
getValidators?(...args: any[]): { [key: string]: any };
schemaPreprocessor?(schema: any): any;
}
6 changes: 5 additions & 1 deletion ui/src/app/wizard/reducer/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -128,8 +128,12 @@ export const getLockedStatus = createSelector(getState, fromWizard.getLocked);
export const getSchemaLockedFn = (step, locked) => step ? step.locked ? locked : false : false;
export const getLocked = createSelector(getCurrent, getLockedStatus, getSchemaLockedFn);

export const getSchemaProcessedFn = (schema, definition) =>
definition.schemaPreprocessor ? definition.schemaPreprocessor(schema) : schema;

export const getSchemaObject = createSelector(getState, fromWizard.getSchema);
export const getParsedSchema = createSelector(getSchemaObject, getLocked, getSchemaParseFn);
export const getProcessedSchema = createSelector(getSchemaObject, getWizardDefinition, getSchemaProcessedFn);
export const getParsedSchema = createSelector(getProcessedSchema, getLocked, getSchemaParseFn);

export const getSchema = createSelector(getParsedSchema, getCurrent, getSplitSchema);

Expand Down

0 comments on commit 85f6d2d

Please sign in to comment.