diff --git a/ng2-components/ng2-activiti-form/src/components/activiti-form.component.html b/ng2-components/ng2-activiti-form/src/components/activiti-form.component.html index ae6aaaf3c9..acbafc7105 100644 --- a/ng2-components/ng2-activiti-form/src/components/activiti-form.component.html +++ b/ng2-components/ng2-activiti-form/src/components/activiti-form.component.html @@ -25,11 +25,8 @@
-
- -
- UNKNOWN WIDGET TYPE: {{field.type}} +
diff --git a/ng2-components/ng2-activiti-form/src/components/form-field/form-field.component.ts b/ng2-components/ng2-activiti-form/src/components/form-field/form-field.component.ts index 1a34a49e03..07d6f2899c 100644 --- a/ng2-components/ng2-activiti-form/src/components/form-field/form-field.component.ts +++ b/ng2-components/ng2-activiti-form/src/components/form-field/form-field.component.ts @@ -48,7 +48,7 @@ export class FormFieldComponent implements OnInit { ngOnInit() { if (this.field) { - let componentType = this.formRenderingService.getComponentType(this.field.type); + let componentType = this.formRenderingService.resolveComponentType(this.field); if (componentType) { let factory = this.componentFactoryResolver.resolveComponentFactory(componentType); this.componentRef = this.container.createComponent(factory/*, 0, this.injector*/); diff --git a/ng2-components/ng2-activiti-form/src/components/widgets/container/container.widget.html b/ng2-components/ng2-activiti-form/src/components/widgets/container/container.widget.html index 761b7dfd0c..c0976a6de9 100644 --- a/ng2-components/ng2-activiti-form/src/components/widgets/container/container.widget.html +++ b/ng2-components/ng2-activiti-form/src/components/widgets/container/container.widget.html @@ -15,57 +15,7 @@
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- - -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- UNKNOWN WIDGET TYPE: {{field.type}} -
-
+
diff --git a/ng2-components/ng2-activiti-form/src/components/widgets/index.ts b/ng2-components/ng2-activiti-form/src/components/widgets/index.ts index 493174ea37..fdc59cff0f 100644 --- a/ng2-components/ng2-activiti-form/src/components/widgets/index.ts +++ b/ng2-components/ng2-activiti-form/src/components/widgets/index.ts @@ -15,6 +15,7 @@ * limitations under the License. */ +import { UnknownWidget } from './unknown/unknown.widget'; import { TabsWidget } from './tabs/tabs.widget'; import { ContainerWidget } from './container/container.widget'; @@ -50,6 +51,7 @@ export * from './tabs/tabs.widget'; export * from './container/container.widget'; // primitives +export * from './unknown/unknown.widget'; export * from './text/text.widget'; export * from './number/number.widget'; export * from './checkbox/checkbox.widget'; @@ -76,6 +78,7 @@ export * from './dynamic-table/editors/boolean/boolean.editor'; export * from './dynamic-table/editors/text/text.editor'; export const WIDGET_DIRECTIVES: any[] = [ + UnknownWidget, TabsWidget, ContainerWidget, TextWidget, diff --git a/ng2-components/ng2-activiti-form/src/components/widgets/tabs/tabs.widget.html b/ng2-components/ng2-activiti-form/src/components/widgets/tabs/tabs.widget.html index f4dd53c292..d532485a07 100644 --- a/ng2-components/ng2-activiti-form/src/components/widgets/tabs/tabs.widget.html +++ b/ng2-components/ng2-activiti-form/src/components/widgets/tabs/tabs.widget.html @@ -23,11 +23,8 @@
-
- -
- UNKNOWN WIDGET TYPE: {{field.type}} +
diff --git a/ng2-components/ng2-activiti-form/src/components/widgets/unknown/unknown.widget.ts b/ng2-components/ng2-activiti-form/src/components/widgets/unknown/unknown.widget.ts new file mode 100644 index 0000000000..7f94fb1a52 --- /dev/null +++ b/ng2-components/ng2-activiti-form/src/components/widgets/unknown/unknown.widget.ts @@ -0,0 +1,31 @@ +/*! + * @license + * Copyright 2016 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Component } from '@angular/core'; +import { WidgetComponent } from './../widget.component'; + +@Component({ + selector: 'unknown-widget', + template: ` +
+ error_outline + Unknown type: {{field.type}} +
+ ` +}) +export class UnknownWidget extends WidgetComponent { +} diff --git a/ng2-components/ng2-activiti-form/src/services/form-rendering.service.ts b/ng2-components/ng2-activiti-form/src/services/form-rendering.service.ts index d4d7e6ca3b..2edd1fb5b5 100644 --- a/ng2-components/ng2-activiti-form/src/services/form-rendering.service.ts +++ b/ng2-components/ng2-activiti-form/src/services/form-rendering.service.ts @@ -17,41 +17,104 @@ import { Injectable, Type } from '@angular/core'; -import { TextWidget } from './../components/widgets/text/text.widget'; +import { + FormFieldModel, + UnknownWidget, + TextWidget, + MultilineTextWidget, + NumberWidget, + CheckboxWidget, + DropdownWidget, + DateWidget, + AmountWidget, + RadioButtonsWidget, + HyperlinkWidget, + DisplayValueWidget, + DisplayTextWidget, + TypeaheadWidget, + PeopleWidget, + FunctionalGroupWidget, + DynamicTableWidget, + AttachWidget, + UploadWidget +} from './../components/widgets/index'; @Injectable() export class FormRenderingService { - private types: { [key: string]: Type<{}> } = { - 'text': TextWidget + private types: { [key: string]: ComponentTypeResolver } = { + 'text': DefaultTypeResolver.fromType(TextWidget), + 'integer': DefaultTypeResolver.fromType(NumberWidget), + 'multi-line-text': DefaultTypeResolver.fromType(MultilineTextWidget), + 'boolean': DefaultTypeResolver.fromType(CheckboxWidget), + 'dropdown': DefaultTypeResolver.fromType(DropdownWidget), + 'date': DefaultTypeResolver.fromType(DateWidget), + 'amount': DefaultTypeResolver.fromType(AmountWidget), + 'radio-buttons': DefaultTypeResolver.fromType(RadioButtonsWidget), + 'hyperlink': DefaultTypeResolver.fromType(HyperlinkWidget), + 'readonly': DefaultTypeResolver.fromType(DisplayValueWidget), + 'readonly-text': DefaultTypeResolver.fromType(DisplayTextWidget), + 'typeahead': DefaultTypeResolver.fromType(TypeaheadWidget), + 'people': DefaultTypeResolver.fromType(PeopleWidget), + 'functional-group': DefaultTypeResolver.fromType(FunctionalGroupWidget), + 'dynamic-table': DefaultTypeResolver.fromType(DynamicTableWidget) }; - getComponentType(fieldType: string): Type<{}> { - if (fieldType) { - return this.types[fieldType] || null; - } - return null; + constructor() { + this.types['upload'] = (field: FormFieldModel): Type<{}> => { + if (field) { + let params = field.params; + if (params && params.link) { + return AttachWidget; + } + return UploadWidget; + } + return null; + }; } - setComponentType(fieldType: string, componentType: Type<{}>, override: boolean = false) { + getComponentTypeResolver(fieldType: string, defaultValue: Type<{}> = UnknownWidget): ComponentTypeResolver { + if (fieldType) { + return this.types[fieldType] || DefaultTypeResolver.fromType(defaultValue); + } + return DefaultTypeResolver.fromType(defaultValue); + } + + setComponentTypeResolver(fieldType: string, resolver: ComponentTypeResolver, override: boolean = false) { if (!fieldType) { throw new Error(`fieldType is null or not defined`); } - if (!componentType) { - throw new Error(`componentType is null or not defined`); + if (!resolver) { + throw new Error(`resolver is null or not defined`); } let existing = this.types[fieldType]; if (existing && !override) { - throw new Error(`componentType is already mapped, use override option if you intend replacing existing mapping.`); + throw new Error(`already mapped, use override option if you intend replacing existing mapping.`); } - this.types[fieldType] = componentType; + this.types[fieldType] = resolver; } - constructor() { - this.setComponentType('xx', TextWidget); + resolveComponentType(field: FormFieldModel, defaultValue: Type<{}> = UnknownWidget): Type<{}> { + if (field) { + let resolver = this.getComponentTypeResolver(field.type, defaultValue); + return resolver(field); + } + return defaultValue; } } + +export interface ComponentTypeResolver { + (field: FormFieldModel): Type<{}>; +} + +export class DefaultTypeResolver { + static fromType(type: Type<{}>): ComponentTypeResolver { + return (field: FormFieldModel) => { + return type; + }; + } +}