Maurizio Vitale d2f7a6858f Activiti form - Custom date format (#1806)
* Fix format date|
#1704

* Add unit tests on custom format date
#1704

* Update form-field.model.ts

* Update display-value.widget.ts
2017-04-27 14:05:07 +01:00

253 lines
9.9 KiB
TypeScript

/*!
* @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, OnInit } from '@angular/core';
import * as moment from 'moment';
import { LogService } from 'ng2-alfresco-core';
import { WidgetComponent } from './../widget.component';
import { FormFieldTypes } from '../core/form-field-types';
import { FormService } from '../../../services/form.service';
import { FormFieldOption } from './../core/form-field-option';
import { DynamicTableColumn, DynamicTableRow } from './../dynamic-table/dynamic-table.widget.model';
import { WidgetVisibilityService } from '../../../services/widget-visibility.service';
import { NumberFieldValidator } from '../core/form-field-validator';
@Component({
moduleId: module.id,
selector: 'display-value-widget',
templateUrl: './display-value.widget.html',
styleUrls: ['./display-value.widget.css']
})
export class DisplayValueWidget extends WidgetComponent implements OnInit {
value: any;
fieldType: string;
id: any;
// hyperlink
linkUrl: string;
linkText: string;
// dynamic table
rows: DynamicTableRow[] = [];
columns: DynamicTableColumn[] = [];
visibleColumns: DynamicTableColumn[] = [];
// upload/attach
hasFile: boolean = false;
showDocumentContent: boolean = true;
constructor(private formService: FormService,
private visibilityService: WidgetVisibilityService,
private logService: LogService) {
super();
}
ngOnInit() {
if (this.field) {
this.value = this.field.value;
this.visibilityService.refreshEntityVisibility(this.field);
if (this.field.params) {
if (this.field.params['showDocumentContent'] !== undefined) {
this.showDocumentContent = !!this.field.params['showDocumentContent'];
}
let originalField = this.field.params['field'];
if (originalField && originalField.type) {
this.fieldType = originalField.type;
switch (originalField.type) {
case FormFieldTypes.BOOLEAN:
this.value = this.field.value === 'true' ? true : false;
break;
case FormFieldTypes.FUNCTIONAL_GROUP:
if (this.field.value) {
this.value = this.field.value.name;
} else {
this.value = null;
}
break;
case FormFieldTypes.PEOPLE:
let model = this.field.value;
if (model) {
let displayName = `${model.firstName} ${model.lastName}`;
this.value = displayName.trim();
}
break;
case FormFieldTypes.UPLOAD:
let files = this.field.value || [];
if (files.length > 0) {
this.value = decodeURI(files[0].name);
this.id = files[0].id;
this.hasFile = true;
} else {
this.value = null;
this.hasFile = false;
}
break;
case FormFieldTypes.TYPEAHEAD:
this.loadRestFieldValue();
break;
case FormFieldTypes.DROPDOWN:
if (this.field.restUrl) {
this.loadRestFieldValue();
} else {
this.value = this.field.getOptionName();
}
break;
case FormFieldTypes.RADIO_BUTTONS:
if (this.field.restUrl) {
this.loadRestFieldValue();
} else {
this.loadRadioButtonValue();
}
break;
case FormFieldTypes.DATE:
if (this.value) {
let dateValue;
if (NumberFieldValidator.isNumber(this.value)) {
dateValue = moment(this.value);
} else {
dateValue = moment(this.value.split('T')[0], 'YYYY-M-D');
}
if (dateValue && dateValue.isValid()) {
const displayFormat = this.field.dateDisplayFormat || this.field.defaultDateFormat;
this.value = dateValue.format(displayFormat);
}
}
break;
case FormFieldTypes.AMOUNT:
if (this.value) {
let currency = this.field.currency || '$';
this.value = `${currency} ${this.field.value}`;
}
break;
case FormFieldTypes.HYPERLINK:
this.linkUrl = this.getHyperlinkUrl(this.field);
this.linkText = this.getHyperlinkText(this.field);
break;
case FormFieldTypes.DYNAMIC_TABLE:
let json = this.field.json;
if (json.columnDefinitions) {
this.columns = json.columnDefinitions.map(obj => <DynamicTableColumn> obj);
this.visibleColumns = this.columns.filter(col => col.visible);
}
if (json.value) {
this.rows = json.value.map(obj => <DynamicTableRow> {selected: false, value: obj});
}
break;
default:
this.value = this.field.value;
break;
}
}
}
this.visibilityService.refreshVisibility(this.field.form);
}
}
loadRadioButtonValue() {
let options = this.field.options || [];
let toSelect = options.find(item => item.id === this.field.value);
if (toSelect) {
this.value = toSelect.name;
} else {
this.value = this.field.value;
}
}
loadRestFieldValue() {
if (this.field.form.taskId) {
this.getValuesByTaskId();
} else {
this.getValuesByProcessDefinitionId();
}
}
getValuesByProcessDefinitionId() {
this.formService
.getRestFieldValuesByProcessId(
this.field.form.processDefinitionId,
this.field.id
)
.subscribe(
(result: FormFieldOption[]) => {
let options = result || [];
let toSelect = options.find(item => item.id === this.field.value);
this.field.options = options;
if (toSelect) {
this.value = toSelect.name;
} else {
this.value = this.field.value;
}
this.visibilityService.refreshVisibility(this.field.form);
},
error => {
this.logService.error(error);
this.value = this.field.value;
}
);
}
getValuesByTaskId() {
this.formService
.getRestFieldValues(this.field.form.taskId, this.field.id)
.subscribe(
(result: FormFieldOption[]) => {
let options = result || [];
let toSelect = options.find(item => item.id === this.field.value);
this.field.options = options;
if (toSelect) {
this.value = toSelect.name;
} else {
this.value = this.field.value;
}
this.visibilityService.refreshVisibility(this.field.form);
},
error => {
this.logService.error(error);
this.value = this.field.value;
}
);
}
getCellValue(row: DynamicTableRow, column: DynamicTableColumn): any {
let result = row.value[column.id];
if (column.type === 'Dropdown') {
if (result) {
return result.name;
}
}
if (column.type === 'Boolean') {
return result ? true : false;
}
if (column.type === 'Date') {
if (result) {
return moment(result.split('T')[0], 'YYYY-MM-DD').format('D-M-YYYY');
}
}
if (column.type === 'Amount') {
return (column.amountCurrency || '$') + ' ' + (result || 0);
}
return result || '';
}
}