#985 'required' validation for dynamic table

This commit is contained in:
Denys Vuika 2016-11-03 12:20:47 +00:00
parent d3f6824bde
commit ce151f23e0
5 changed files with 81 additions and 16 deletions

View File

@ -37,7 +37,8 @@ export class RequiredFieldValidator implements FormFieldValidator {
FormFieldTypes.FUNCTIONAL_GROUP,
FormFieldTypes.RADIO_BUTTONS,
FormFieldTypes.UPLOAD,
FormFieldTypes.AMOUNT
FormFieldTypes.AMOUNT,
FormFieldTypes.DYNAMIC_TABLE
];
isSupported(field: FormFieldModel): boolean {
@ -66,6 +67,10 @@ export class RequiredFieldValidator implements FormFieldValidator {
return field.value && field.value.length > 0;
}
if (field.type === FormFieldTypes.DYNAMIC_TABLE) {
return field.value && field.value instanceof Array && field.value.length > 0;
}
if (field.value === null || field.value === undefined || field.value === '') {
return false;
}

View File

@ -7,27 +7,32 @@
background-color: #eef !important;
}
.dynamic-table-widget__table {
.dynamic-table-widget__table-container {
overflow-y: auto;
width: 100%;
}
.dynamic-table-widget__table > table {
.dynamic-table-widget__table {
width: 100%;
}
.dynamic-table-widget__invalid .mdl-textfield__input {
border-color: #d50000;
}
.dynamic-table-widget__invalid .mdl-textfield__label {
.dynamic-table-widget__invalid .dynamic-table-widget__label {
color: #d50000;
}
.dynamic-table-widget__invalid .mdl-textfield__label:after {
background-color: #d50000;
.dynamic-table-widget__invalid .dynamic-table-widget__table-container {
border: 1px solid #d50000;
}
.dynamic-table-widget__invalid .mdl-textfield__error {
.dynamic-table-widget__invalid .dynamic-table-widget__table {
border: none;
}
.dynamic-table-widget__summary {
visibility: hidden;
color: #d50000;
}
.dynamic-table-widget__invalid .dynamic-table-widget__summary {
visibility: visible !important;
}

View File

@ -1,9 +1,10 @@
<div class="dynamic-table-widget">
<div>{{content.name}}</div>
<div class="dynamic-table-widget"
[class.dynamic-table-widget__invalid]="!isValid()">
<div class="dynamic-table-widget__label">{{content.name}}</div>
<div *ngIf="!editMode">
<div class="dynamic-table-widget__table">
<table class="mdl-data-table mdl-js-data-table">
<div class="dynamic-table-widget__table-container">
<table class="mdl-data-table mdl-js-data-table dynamic-table-widget__table">
<thead>
<tr>
<th *ngFor="let column of content.visibleColumns"
@ -61,4 +62,6 @@
(cancel)="onCancelChanges()">
</row-editor>
<div class="dynamic-table-widget__summary">{{content?.field.validationSummary}}</div>
</div>

View File

@ -16,7 +16,7 @@
*/
import { DynamicTableWidget } from './dynamic-table.widget';
import { DynamicTableModel, DynamicTableRow, DynamicTableColumn } from './../core/index';
import { DynamicTableModel, DynamicTableRow, DynamicTableColumn, FormModel, FormFieldTypes } from './../core/index';
describe('DynamicTableWidget', () => {
@ -206,4 +206,46 @@ describe('DynamicTableWidget', () => {
expect(widget.editRow).toBeNull();
});
it('should be valid by default', () => {
widget.content.field = null;
expect(widget.isValid()).toBeTruthy();
widget.content = null;
expect(widget.isValid()).toBeTruthy();
});
it('should take validation state from underlying field', () => {
let form = new FormModel();
widget.content = new DynamicTableModel(form, {
type: FormFieldTypes.DYNAMIC_TABLE,
required: true,
value: null
});
expect(widget.content.field.validate()).toBeFalsy();
expect(widget.isValid()).toBe(widget.content.field.isValid);
expect(widget.content.field.isValid).toBeFalsy();
widget.content.field.value = [{}];
expect(widget.content.field.validate()).toBeTruthy();
expect(widget.isValid()).toBe(widget.content.field.isValid);
expect(widget.content.field.isValid).toBeTruthy();
});
it('should prepend default currency for amount columns', () => {
let row = <DynamicTableRow> { value: { key: '100' } };
let column = <DynamicTableColumn> { id: 'key', type: 'Amount' };
let actual = widget.getCellValue(row, column);
expect(actual).toBe('$ 100');
});
it('should prepend custom currency for amount columns', () => {
let row = <DynamicTableRow> { value: { key: '100' } };
let column = <DynamicTableColumn> { id: 'key', type: 'Amount', amountCurrency: 'GBP' };
let actual = widget.getCellValue(row, column);
expect(actual).toBe('GBP 100');
});
});

View File

@ -39,6 +39,16 @@ export class DynamicTableWidget extends WidgetComponent {
super();
}
isValid() {
let result = true;
if (this.content && this.content.field) {
result = this.content.field.isValid;
}
return result;
}
onRowClicked(row: DynamicTableRow) {
if (this.content) {
this.content.selectedRow = row;