diff --git a/ng2-components/ng2-activiti-form/src/components/widgets/dropdown/dropdown.widget.ts b/ng2-components/ng2-activiti-form/src/components/widgets/dropdown/dropdown.widget.ts index ad36310bb0..c098b801e2 100644 --- a/ng2-components/ng2-activiti-form/src/components/widgets/dropdown/dropdown.widget.ts +++ b/ng2-components/ng2-activiti-form/src/components/widgets/dropdown/dropdown.widget.ts @@ -15,7 +15,10 @@ * limitations under the License. */ -import { Component } from '@angular/core'; +import { Component, OnInit, NgZone } from '@angular/core'; +import { Observable } from 'rxjs/Rx'; +import { Http } from '@angular/http'; +import { ObjectUtils } from 'ng2-alfresco-core'; import { WidgetComponent } from './../widget.component'; declare let __moduleName: string; @@ -27,6 +30,53 @@ declare var componentHandler; templateUrl: './dropdown.widget.html', styleUrls: ['./dropdown.widget.css'] }) -export class DropdownWidget extends WidgetComponent { +export class DropdownWidget extends WidgetComponent implements OnInit { + + constructor(private http: Http, + private zone: NgZone) { + super(); + } + + ngOnInit() { + if (this.field && + this.field.optionType === 'rest' && + this.field.restUrl && + this.field.restIdProperty && + this.field.restLabelProperty) { + + let url = `${this.field.restUrl}`; + this.http.get(url).subscribe( + response => { + let json: any = response.json(); + this.loadFromJson(json); + }, + this.handleError + ); + + } + } + + // TODO: support 'restResponsePath' + private loadFromJson(json: any) { + if (json instanceof Array) { + let options = json.map(obj => { + return { + id: ObjectUtils.getValue(obj, this.field.restIdProperty).toString(), + name: ObjectUtils.getValue(obj, this.field.restLabelProperty).toString() + }; + }); + this.field.options = options; + this.field.updateForm(); + } + } + + private handleError (error: any) { + // In a real world app, we might use a remote logging infrastructure + // We'd also dig deeper into the error to get a better message + let errMsg = (error.message) ? error.message : + error.status ? `${error.status} - ${error.statusText}` : 'Server error'; + console.error(errMsg); // log to console instead + return Observable.throw(errMsg); + } } diff --git a/ng2-components/ng2-activiti-form/src/components/widgets/widget.model.ts b/ng2-components/ng2-activiti-form/src/components/widgets/widget.model.ts index cdbaee64ec..363efbb0c9 100644 --- a/ng2-components/ng2-activiti-form/src/components/widgets/widget.model.ts +++ b/ng2-components/ng2-activiti-form/src/components/widgets/widget.model.ts @@ -45,28 +45,25 @@ export interface FormFieldOption { export class FormFieldModel extends FormWidgetModel { - private _fieldType: string; - private _id: string; - private _name: string; - private _type: string; private _value: string; - private _tab: string; - get fieldType(): string { - return this._fieldType; - } - - get id(): string { - return this._id; - } - - get name(): string { - return this._name; - } - - get type(): string { - return this._type; - } + fieldType: string; + id: string; + name: string; + type: string; + required: boolean; + readOnly: boolean; + overrideId: boolean; + tab: string; + colspan: number = 1; + options: FormFieldOption[] = []; + restUrl: string; + restResponsePath: string; + restIdProperty: string; + restLabelProperty: string; + hasEmptyValue: boolean; + className: string; + optionType: string; get value(): any { return this._value; @@ -77,24 +74,27 @@ export class FormFieldModel extends FormWidgetModel { this.updateForm(); } - get tab(): string { - return this._tab; - } - - colspan: number = 1; - options: FormFieldOption[] = []; - constructor(form: FormModel, json?: any) { super(form, json); if (json) { - this._fieldType = json.fieldType; - this._id = json.id; - this._name = json.name; - this._type = json.type; - this._tab = json.tab; + this.fieldType = json.fieldType; + this.id = json.id; + this.name = json.name; + this.type = json.type; + this.required = json.required; + this.readOnly = json.readOnly; + this.overrideId = json.overrideId; + this.tab = json.tab; + this.restUrl = json.restUrl; + this.restResponsePath = json.restResponsePath; + this.restIdProperty = json.restIdProperty; + this.restLabelProperty = json.restLabelProperty; this.colspan = json.colspan; this.options = json.options || []; + this.hasEmptyValue = json.hasEmptyValue; + this.className = json.className; + this.optionType = json.optionType; this._value = this.parseValue(json); this.updateForm(); @@ -118,7 +118,7 @@ export class FormFieldModel extends FormWidgetModel { return value; } - private updateForm() { + updateForm() { /* This is needed due to Activiti reading dropdown values as string but saving back as object: { id: , name: }