tuain-ng-forms-lib 17.2.21 → 17.2.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.browserslistrc +16 -0
- package/.yarn/cache/nanoid-npm-4.0.0-924f5c6312-7d5946df5c.zip +0 -0
- package/.yarn/cache/tslib-npm-2.4.1-36f0ed04db-19480d6e03.zip +0 -0
- package/.yarn/cache/yn-npm-5.0.0-b001dab23c-f0ec7710d3.zip +0 -0
- package/.yarn/install-state.gz +0 -0
- package/karma.conf.js +44 -0
- package/ng-package.json +11 -0
- package/package.json +2 -16
- package/src/lib/classes/forms/action.ts +117 -0
- package/src/lib/classes/forms/element.ts +26 -0
- package/src/lib/classes/forms/field.ts +522 -0
- package/src/lib/classes/forms/form.constants.ts +28 -0
- package/src/lib/classes/forms/form.ts +692 -0
- package/src/lib/classes/forms/piece-propagate.ts +47 -0
- package/src/lib/classes/forms/piece.ts +164 -0
- package/src/lib/classes/forms/section.ts +165 -0
- package/src/lib/classes/forms/subsection.ts +109 -0
- package/src/lib/classes/forms/table/action.ts +41 -0
- package/src/lib/classes/forms/table/column.ts +94 -0
- package/src/lib/classes/forms/table/row-data.ts +121 -0
- package/src/lib/classes/forms/table/table.ts +582 -0
- package/src/lib/components/elements/action.component.ts +70 -0
- package/src/lib/components/elements/field.component.ts +115 -0
- package/src/lib/components/elements/layout/element.component.ts +14 -0
- package/src/lib/components/elements/layout/form-error.component.ts +11 -0
- package/src/lib/components/elements/layout/form-header.component.ts +14 -0
- package/src/lib/components/elements/layout/piece.component.ts +60 -0
- package/src/lib/components/elements/layout/section.component.ts +52 -0
- package/src/lib/components/elements/layout/sub-section.component.ts +52 -0
- package/src/lib/components/elements/tables/table-record-action.component.ts +66 -0
- package/src/lib/components/elements/tables/table-record-field.component.ts +20 -0
- package/src/lib/components/elements/tables/table.component.ts +112 -0
- package/src/lib/components/forms/basic-form.ts +1464 -0
- package/src/lib/services/event-manager.service.ts +45 -0
- package/src/lib/services/file-manager.service.ts +7 -0
- package/src/lib/services/form-manager.service.ts +89 -0
- package/src/lib/services/icon-dictionary.service.ts +159 -0
- package/src/lib/tuain-ng-forms-lib.module.ts +40 -0
- package/{public-api.d.ts → src/public-api.ts} +5 -0
- package/src/test.ts +27 -0
- package/tsconfig.lib.json +15 -0
- package/tsconfig.lib.prod.json +10 -0
- package/tsconfig.spec.json +17 -0
- package/esm2022/lib/classes/forms/action.mjs +0 -106
- package/esm2022/lib/classes/forms/element.mjs +0 -25
- package/esm2022/lib/classes/forms/field.mjs +0 -474
- package/esm2022/lib/classes/forms/form.constants.mjs +0 -26
- package/esm2022/lib/classes/forms/form.mjs +0 -608
- package/esm2022/lib/classes/forms/piece-propagate.mjs +0 -39
- package/esm2022/lib/classes/forms/piece.mjs +0 -134
- package/esm2022/lib/classes/forms/section.mjs +0 -151
- package/esm2022/lib/classes/forms/subsection.mjs +0 -99
- package/esm2022/lib/classes/forms/table/action.mjs +0 -38
- package/esm2022/lib/classes/forms/table/column.mjs +0 -74
- package/esm2022/lib/classes/forms/table/row-data.mjs +0 -116
- package/esm2022/lib/classes/forms/table/table.mjs +0 -535
- package/esm2022/lib/components/elements/action.component.mjs +0 -70
- package/esm2022/lib/components/elements/field.component.mjs +0 -115
- package/esm2022/lib/components/elements/layout/element.component.mjs +0 -21
- package/esm2022/lib/components/elements/layout/form-error.component.mjs +0 -23
- package/esm2022/lib/components/elements/layout/form-header.component.mjs +0 -23
- package/esm2022/lib/components/elements/layout/piece.component.mjs +0 -64
- package/esm2022/lib/components/elements/layout/section.component.mjs +0 -56
- package/esm2022/lib/components/elements/layout/sub-section.component.mjs +0 -56
- package/esm2022/lib/components/elements/tables/table-record-action.component.mjs +0 -72
- package/esm2022/lib/components/elements/tables/table-record-field.component.mjs +0 -31
- package/esm2022/lib/components/elements/tables/table.component.mjs +0 -109
- package/esm2022/lib/components/forms/basic-form.mjs +0 -1399
- package/esm2022/lib/services/event-manager.service.mjs +0 -43
- package/esm2022/lib/services/file-manager.service.mjs +0 -7
- package/esm2022/lib/services/form-manager.service.mjs +0 -81
- package/esm2022/lib/tuain-ng-forms-lib.module.mjs +0 -71
- package/esm2022/public-api.mjs +0 -19
- package/esm2022/tuain-ng-forms-lib.mjs +0 -5
- package/fesm2022/tuain-ng-forms-lib.mjs +0 -4593
- package/fesm2022/tuain-ng-forms-lib.mjs.map +0 -1
- package/index.d.ts +0 -5
- package/lib/classes/forms/action.d.ts +0 -40
- package/lib/classes/forms/element.d.ts +0 -9
- package/lib/classes/forms/field.d.ts +0 -206
- package/lib/classes/forms/form.constants.d.ts +0 -25
- package/lib/classes/forms/form.d.ts +0 -232
- package/lib/classes/forms/piece-propagate.d.ts +0 -13
- package/lib/classes/forms/piece.d.ts +0 -51
- package/lib/classes/forms/section.d.ts +0 -43
- package/lib/classes/forms/subsection.d.ts +0 -42
- package/lib/classes/forms/table/action.d.ts +0 -16
- package/lib/classes/forms/table/column.d.ts +0 -33
- package/lib/classes/forms/table/row-data.d.ts +0 -14
- package/lib/classes/forms/table/table.d.ts +0 -145
- package/lib/components/elements/action.component.d.ts +0 -22
- package/lib/components/elements/field.component.d.ts +0 -47
- package/lib/components/elements/layout/element.component.d.ts +0 -8
- package/lib/components/elements/layout/form-error.component.d.ts +0 -8
- package/lib/components/elements/layout/form-header.component.d.ts +0 -9
- package/lib/components/elements/layout/piece.component.d.ts +0 -18
- package/lib/components/elements/layout/section.component.d.ts +0 -13
- package/lib/components/elements/layout/sub-section.component.d.ts +0 -13
- package/lib/components/elements/tables/table-record-action.component.d.ts +0 -18
- package/lib/components/elements/tables/table-record-field.component.d.ts +0 -12
- package/lib/components/elements/tables/table.component.d.ts +0 -44
- package/lib/components/forms/basic-form.d.ts +0 -256
- package/lib/services/event-manager.service.d.ts +0 -11
- package/lib/services/file-manager.service.d.ts +0 -6
- package/lib/services/form-manager.service.d.ts +0 -28
- package/lib/tuain-ng-forms-lib.module.d.ts +0 -20
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { RecordTableColumn } from './column';
|
|
2
|
+
import { operators } from '../form.constants';
|
|
3
|
+
|
|
4
|
+
export class TableRecordData {
|
|
5
|
+
recordId: string | null = null;
|
|
6
|
+
selected: boolean = false;
|
|
7
|
+
recordData: any = {};
|
|
8
|
+
|
|
9
|
+
constructor(recordReceived, recordDefinition: RecordTableColumn[], selectionFieldName: string | null = null) {
|
|
10
|
+
const { tableRecordId, recordData } = recordReceived;
|
|
11
|
+
this.recordId = tableRecordId;
|
|
12
|
+
if (!recordDefinition || recordDefinition.length === 0 || !recordData || recordData.length === 0) {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
const fieldNames = recordDefinition.map(column => column.fieldCode);
|
|
16
|
+
if (Array.isArray(recordData)) {
|
|
17
|
+
const rawRecordData = recordData.filter(fieldData => fieldData.fieldCode && fieldNames.includes(fieldData.fieldCode));
|
|
18
|
+
rawRecordData.forEach(fieldData => {
|
|
19
|
+
const { fieldCode, fieldValue } = fieldData;
|
|
20
|
+
const fieldDef = recordDefinition.find(column => column.fieldCode === fieldCode);
|
|
21
|
+
this.recordData[fieldCode] = fieldValue ?? '';
|
|
22
|
+
if (fieldCode === selectionFieldName) {
|
|
23
|
+
this.selected = fieldValue;
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
} else {
|
|
27
|
+
const fields = Object.keys(recordData);
|
|
28
|
+
fields.forEach(fieldCode => {
|
|
29
|
+
const fieldValue = recordData[fieldCode];
|
|
30
|
+
const fieldDef = recordDefinition.find(column => column.fieldCode === fieldCode);
|
|
31
|
+
this.recordData[fieldCode] = fieldValue ?? '';
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
toggleSelect() { this.selected = !this.selected; }
|
|
37
|
+
select() { this.selected = true; }
|
|
38
|
+
unselect() { this.selected = false; }
|
|
39
|
+
|
|
40
|
+
get recordIdKey() {
|
|
41
|
+
return (typeof this.recordId === 'object')
|
|
42
|
+
? JSON.stringify(this.recordId) : this.recordId;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
getFieldValue(fieldCode): any {
|
|
46
|
+
return (fieldCode && this.recordData) ? this.recordData[fieldCode] : null;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
hasPattern(words, columnObj) {
|
|
50
|
+
if (!words || words.length === 0) {
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
for (const word of words) {
|
|
54
|
+
let wordIsPresent = false;
|
|
55
|
+
for (const fieldCode in this.recordData) {
|
|
56
|
+
const columnDef = columnObj?.[fieldCode];
|
|
57
|
+
if (columnDef?.searchable && this.recordData.hasOwnProperty(fieldCode)) {
|
|
58
|
+
const term = word.toUpperCase();
|
|
59
|
+
let fieldValue;
|
|
60
|
+
if (columnDef.fieldType.toUpperCase().includes('DATE')) {
|
|
61
|
+
fieldValue = this.recordData[fieldCode].substring(0, 16);
|
|
62
|
+
} else {
|
|
63
|
+
fieldValue = this.recordData[fieldCode];
|
|
64
|
+
}
|
|
65
|
+
if (fieldValue.toString().toUpperCase().includes(term)) {
|
|
66
|
+
wordIsPresent = true;
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if (!wordIsPresent) {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
hasCondition(columnFilters) {
|
|
79
|
+
if (!columnFilters || columnFilters.length === 0) {
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
for (const condition of columnFilters) {
|
|
83
|
+
const { fieldCode, operator, values } = condition;
|
|
84
|
+
if (this.recordData.hasOwnProperty(fieldCode)) {
|
|
85
|
+
const fieldValue = this.recordData[fieldCode];
|
|
86
|
+
const stringValue = fieldValue.toString().toUpperCase();
|
|
87
|
+
if (operator === operators.G && fieldValue <= values[0]) {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
if (operator === operators.L && fieldValue >= values[0]) {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
if (operator === operators.GE && fieldValue < values[0]) {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
if (operator === operators.LE && fieldValue > values[0]) {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
if (operator === operators.IN && !values.includes(fieldValue)) {
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
if (operator === operators.EQ) {
|
|
103
|
+
return fieldValue === values[0];
|
|
104
|
+
}
|
|
105
|
+
if (operator === operators.NEQ && fieldValue === values[0]) {
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
if (operator === operators.HAS && !stringValue.includes(values[0].toString().toUpperCase())) {
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
if (operator === operators.NOTHAS && stringValue.includes(values[0].toString().toUpperCase())) {
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
if (operator === operators.BETWEEN && (fieldValue < values[0] || fieldValue > values[1])) {
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return true;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
@@ -0,0 +1,582 @@
|
|
|
1
|
+
import { Subject } from 'rxjs';
|
|
2
|
+
import { elementTypes } from '../form.constants';
|
|
3
|
+
import { FormElement } from '../element';
|
|
4
|
+
import { RecordTableColumn } from './column';
|
|
5
|
+
import { TableAction } from './action';
|
|
6
|
+
import { TableRecordData } from './row-data';
|
|
7
|
+
|
|
8
|
+
const TABLE_SORT_ASCENDING = 'asc';
|
|
9
|
+
const TABLE_SORT_DESCENDING = 'desc';
|
|
10
|
+
|
|
11
|
+
const attrs = {
|
|
12
|
+
allSelected: { name: 'allSelected', propagate: 'allSelected' },
|
|
13
|
+
tableCode: { name: 'tableCode', propagate: 'code' },
|
|
14
|
+
clientPaging: { name: 'clientPaging', propagate: null },
|
|
15
|
+
globalSearch: { name: 'globalSearch', propagate: 'globalSearch' },
|
|
16
|
+
globalFilterString: { name: '_globalFilterString', propagate: 'globalFilterString' },
|
|
17
|
+
sorting: { name: 'sorting', propagate: null },
|
|
18
|
+
recordsPerPage: { name: 'recordsPerPage', propagate: 'recordsPerPage' },
|
|
19
|
+
layout: { name: 'layout', propagate: 'layout' },
|
|
20
|
+
columns: { name: 'columns', propagate: 'columns' },
|
|
21
|
+
selectedRecords: { name: 'selectedRecords', propagate: 'selectedRecords' },
|
|
22
|
+
currentPage: { name: 'currentPage', propagate: 'currentPage' },
|
|
23
|
+
totalRecordsNumber: { name: 'totalRecordsNumber', propagate: 'totalRecordsNumber' },
|
|
24
|
+
visibleRecords: { name: '_visibleRecords', propagate: 'visibleRecords' },
|
|
25
|
+
waiting: { name: '_waiting', propagate: 'waiting' },
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export interface TableActionEvent {
|
|
29
|
+
actionCode: string;
|
|
30
|
+
recordId: any;
|
|
31
|
+
recordData: any;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface TableEvent {
|
|
35
|
+
tableCode: string;
|
|
36
|
+
actionCode: string | null;
|
|
37
|
+
actionDetail: any;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export class RecordTable extends FormElement {
|
|
41
|
+
private readonly _inlineActionTrigger = new Subject<TableEvent>();
|
|
42
|
+
private readonly _globalActionTrigger = new Subject<TableEvent>();
|
|
43
|
+
private readonly _recordSelectionTrigger = new Subject<TableEvent>();
|
|
44
|
+
private readonly _selectionActionTrigger = new Subject<TableEvent>();
|
|
45
|
+
private readonly _getDataTrigger = new Subject<TableEvent>();
|
|
46
|
+
private _tableColumnObj = {};
|
|
47
|
+
private _appendPages: boolean;
|
|
48
|
+
private _actions: TableAction[];
|
|
49
|
+
private _actionsObj = {};
|
|
50
|
+
|
|
51
|
+
// Mecanismos de filtrado nueva versión
|
|
52
|
+
private _globalFilterString: string = '';
|
|
53
|
+
private globalFilterStrings: string[] = [];
|
|
54
|
+
private selectedRecords: any;
|
|
55
|
+
private restrictedId: any;
|
|
56
|
+
private layout: string | null = null;
|
|
57
|
+
private _globalSearch: boolean;
|
|
58
|
+
private _tableRecords: TableRecordData[];
|
|
59
|
+
private _tableRecordObj = {};
|
|
60
|
+
private _visibleRecords: TableRecordData[] = [];
|
|
61
|
+
private _columns: RecordTableColumn[];
|
|
62
|
+
private _selectable: boolean;
|
|
63
|
+
private _selectionBackend: boolean;
|
|
64
|
+
private _selectionField: string;
|
|
65
|
+
private _allSelected = false;
|
|
66
|
+
private _tableCode: string = '';
|
|
67
|
+
private _tableTitle: string;
|
|
68
|
+
private _currentPage: number;
|
|
69
|
+
private _totalPages: number;
|
|
70
|
+
private _requestedPage: number;
|
|
71
|
+
private _recordsPerPage: number = 10;
|
|
72
|
+
private _totalRecordsNumber: number = 0;
|
|
73
|
+
private _recordsNumber: number = 0;
|
|
74
|
+
private _sorting: any;
|
|
75
|
+
private _waiting: boolean;
|
|
76
|
+
private _clientPaging: boolean = true;
|
|
77
|
+
private _sortable: boolean;
|
|
78
|
+
|
|
79
|
+
constructor(tableReceived, formConfig) {
|
|
80
|
+
super(tableReceived, formConfig);
|
|
81
|
+
this.propagationCustomAttributes = this._formConfig?.propagationCustomAttributes?.tables ?? [];
|
|
82
|
+
this.elementType = elementTypes.table;
|
|
83
|
+
this._waiting = false;
|
|
84
|
+
this._currentPage = 1;
|
|
85
|
+
this._totalPages = 1;
|
|
86
|
+
this._requestedPage = 1;
|
|
87
|
+
this._columns = [];
|
|
88
|
+
this._tableColumnObj = {};
|
|
89
|
+
this._actions = [];
|
|
90
|
+
this._actionsObj = {};
|
|
91
|
+
this._tableRecords = [];
|
|
92
|
+
this._globalSearch = false;
|
|
93
|
+
this.restrictedId = null;
|
|
94
|
+
|
|
95
|
+
this._tableTitle = tableReceived.tableTitle;
|
|
96
|
+
this._appendPages = tableReceived?.append ?? false;
|
|
97
|
+
this._selectable = tableReceived?.selectable ?? false;
|
|
98
|
+
this._selectionBackend = tableReceived?.selectionBackend ?? false;
|
|
99
|
+
this._sortable = tableReceived?.sortable ?? false;
|
|
100
|
+
|
|
101
|
+
this.setAttr(attrs.allSelected, false);
|
|
102
|
+
this.setAttr(attrs.tableCode, tableReceived.tableCode);
|
|
103
|
+
this.setAttr(attrs.clientPaging, tableReceived?.clientPaging ?? true);
|
|
104
|
+
this.setAttr(attrs.globalSearch, tableReceived?.simpleFilter ?? false);
|
|
105
|
+
this.setAttr(attrs.globalFilterString, '');
|
|
106
|
+
this.setAttr(attrs.sorting, { columnName: '', direction: '' });
|
|
107
|
+
this.setAttr(attrs.recordsPerPage, formConfig.defaultRecordsPerPage);
|
|
108
|
+
this.setAttr(attrs.layout, '');
|
|
109
|
+
|
|
110
|
+
if (tableReceived.fields) {
|
|
111
|
+
const columns: RecordTableColumn[] = [];
|
|
112
|
+
for (const columnReceived of tableReceived.fields) {
|
|
113
|
+
const columnEnriched = {
|
|
114
|
+
...columnReceived,
|
|
115
|
+
visibleStates: this.visibleStates,
|
|
116
|
+
enabledStates: this.enabledStates
|
|
117
|
+
};
|
|
118
|
+
const columnDefinition: RecordTableColumn = new RecordTableColumn(columnEnriched, this._formConfig);
|
|
119
|
+
columns.push(columnDefinition);
|
|
120
|
+
this._tableColumnObj[columnDefinition.fieldCode] = columnDefinition;
|
|
121
|
+
}
|
|
122
|
+
this.setAttr(attrs.columns, columns);
|
|
123
|
+
}
|
|
124
|
+
if (tableReceived.actions) {
|
|
125
|
+
const tableActions = tableReceived.actions.map(objDef => {
|
|
126
|
+
let visibleStates = objDef.visibleStates;
|
|
127
|
+
let enabledStates = objDef.enabledStates;
|
|
128
|
+
if (!visibleStates) {
|
|
129
|
+
visibleStates = (objDef.actionModes || '').split(',')
|
|
130
|
+
.map(state => state.trim())
|
|
131
|
+
.filter(state => state.length > 0);
|
|
132
|
+
enabledStates = (objDef.actionModes || '').split(',')
|
|
133
|
+
.map(state => state.trim())
|
|
134
|
+
.filter(state => state.length > 0);
|
|
135
|
+
}
|
|
136
|
+
return { ...objDef, visibleStates, enabledStates };
|
|
137
|
+
});
|
|
138
|
+
for (const actionReceived of tableActions) {
|
|
139
|
+
const inlineAction = new TableAction(actionReceived, this._formConfig);
|
|
140
|
+
this._actions.push(inlineAction);
|
|
141
|
+
this._actionsObj[inlineAction.actionCode] = inlineAction;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
this._selectionField = (this._selectable) ? tableReceived?.selectionField : null;
|
|
145
|
+
// Filtros predefinidos en el formulario
|
|
146
|
+
if (tableReceived.filters) {
|
|
147
|
+
for (let index = 0; index < tableReceived.filters.length; index++) {
|
|
148
|
+
this.addFilterDefinition(tableReceived.filters[index].fieldCode, tableReceived.filters[index]);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
get columnNames() { return Object.keys(this._tableColumnObj); }
|
|
154
|
+
get inlineActionTrigger() { return this._inlineActionTrigger.asObservable(); }
|
|
155
|
+
get globalActionTrigger() { return this._globalActionTrigger.asObservable(); }
|
|
156
|
+
get selectionActionTrigger() { return this._selectionActionTrigger.asObservable(); }
|
|
157
|
+
get recordSelectionTrigger() { return this._recordSelectionTrigger.asObservable(); }
|
|
158
|
+
get getDataTrigger() { return this._getDataTrigger.asObservable(); }
|
|
159
|
+
|
|
160
|
+
get globalSearch() { return this._globalSearch; }
|
|
161
|
+
get tableRecords() { return this._tableRecords; }
|
|
162
|
+
get tableRecordObj() { return this._tableRecordObj; }
|
|
163
|
+
get visibleRecords() { return this._visibleRecords; }
|
|
164
|
+
get columns() { return this._columns; }
|
|
165
|
+
get selectable() { return this._selectable; }
|
|
166
|
+
get selectionBackend() { return this._selectionBackend; }
|
|
167
|
+
get selectionField() { return this._selectionField; }
|
|
168
|
+
get allSelected() { return this._allSelected; }
|
|
169
|
+
get tableCode() { return this._tableCode; }
|
|
170
|
+
get tableTitle() { return this._tableTitle; }
|
|
171
|
+
get currentPage() { return this._currentPage; }
|
|
172
|
+
get totalPages() { return this._totalPages; }
|
|
173
|
+
get requestedPage() { return this._requestedPage; }
|
|
174
|
+
get recordsPerPage() { return this._recordsPerPage; }
|
|
175
|
+
get totalRecordsNumber() { return this._totalRecordsNumber; }
|
|
176
|
+
get recordsNumber() { return this._recordsNumber; }
|
|
177
|
+
get sorting() { return this._sorting; }
|
|
178
|
+
get waiting() { return this._waiting; }
|
|
179
|
+
get clientPaging() { return this._clientPaging; }
|
|
180
|
+
get sortable() { return this._sortable; }
|
|
181
|
+
|
|
182
|
+
get globalFilterString() { return this._globalFilterString; }
|
|
183
|
+
set globalFilterString(globalFilterString) { this._globalFilterString = globalFilterString; }
|
|
184
|
+
|
|
185
|
+
set globalSearch(globalSearch) { this._globalSearch = globalSearch; }
|
|
186
|
+
set tableRecords(tableRecords) { this._tableRecords = tableRecords; }
|
|
187
|
+
set tableRecordObj(tableRecordObj) { this._tableRecordObj = tableRecordObj; }
|
|
188
|
+
set visibleRecords(visibleRecords) { this._visibleRecords = visibleRecords ?? []; }
|
|
189
|
+
set columns(columns) { this._columns = columns; }
|
|
190
|
+
set selectable(selectable) { this._selectable = selectable; }
|
|
191
|
+
set selectionBackend(selectionBackend) { this._selectionBackend = selectionBackend; }
|
|
192
|
+
set selectionField(selectionField) { this._selectionField = selectionField; }
|
|
193
|
+
set allSelected(allSelected) { this._allSelected = allSelected; }
|
|
194
|
+
set tableCode(tableCode) { this._tableCode = tableCode; }
|
|
195
|
+
set tableTitle(tableTitle) { this._tableTitle = tableTitle; }
|
|
196
|
+
set currentPage(currentPage) { this._currentPage = currentPage; }
|
|
197
|
+
set totalPages(totalPages) { this._totalPages = totalPages; }
|
|
198
|
+
set requestedPage(requestedPage) { this._requestedPage = requestedPage; }
|
|
199
|
+
set recordsPerPage(recordsPerPage) { this._recordsPerPage = recordsPerPage; }
|
|
200
|
+
set totalRecordsNumber(totalRecordsNumber) { this._totalRecordsNumber = totalRecordsNumber; }
|
|
201
|
+
set recordsNumber(recordsNumber) { this._recordsNumber = recordsNumber; }
|
|
202
|
+
set sorting(sorting) { this._sorting = sorting; }
|
|
203
|
+
set waiting(waiting) { this.setAttr(attrs.waiting, waiting) }
|
|
204
|
+
set clientPaging(clientPaging) { this._clientPaging = clientPaging; }
|
|
205
|
+
set sortable(sortable) { this._sortable = sortable; }
|
|
206
|
+
|
|
207
|
+
getLayout() { return this.layout; }
|
|
208
|
+
setLayout(layout) { this.setAttr(attrs.layout, layout); }
|
|
209
|
+
hasActions() { return (this._actions.length > 0); }
|
|
210
|
+
getSelectedRecords() { return this._tableRecords.filter(rec => rec.selected).map(rec => rec.recordId); }
|
|
211
|
+
activateGlobalSearch() { this._globalSearch = true; }
|
|
212
|
+
inactivateGlobalSearch() { this._globalSearch = false; }
|
|
213
|
+
columnDefinition(fieldCode): RecordTableColumn { return this._tableColumnObj[fieldCode]; }
|
|
214
|
+
putOnWait() { this.waiting = true; }
|
|
215
|
+
freeWaiting() { this.waiting = false; }
|
|
216
|
+
setWidget(widget) { this.widget = widget; }
|
|
217
|
+
|
|
218
|
+
notifyGlobalAction(actionCode) {
|
|
219
|
+
const tableEvent: TableEvent = {
|
|
220
|
+
tableCode: this._tableCode,
|
|
221
|
+
actionCode,
|
|
222
|
+
actionDetail: null
|
|
223
|
+
};
|
|
224
|
+
this._globalActionTrigger.next(tableEvent);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
notifyInlineAction(tableActionEvent: TableActionEvent) {
|
|
228
|
+
const tableEvent: TableEvent = {
|
|
229
|
+
tableCode: this._tableCode,
|
|
230
|
+
actionCode: tableActionEvent.actionCode,
|
|
231
|
+
actionDetail: {
|
|
232
|
+
recordId: tableActionEvent.recordId,
|
|
233
|
+
recordData: tableActionEvent.recordData
|
|
234
|
+
}
|
|
235
|
+
};
|
|
236
|
+
this._inlineActionTrigger.next(tableEvent);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
notifyRecordSelection(recordId) {
|
|
240
|
+
const record = this.getTableRecord(recordId);
|
|
241
|
+
if (!record) { return; }
|
|
242
|
+
record.toggleSelect();
|
|
243
|
+
this._requestedPage = this._currentPage ?? 1;
|
|
244
|
+
const tableEvent: TableEvent = {
|
|
245
|
+
tableCode: this._tableCode,
|
|
246
|
+
actionCode: null,
|
|
247
|
+
actionDetail: {
|
|
248
|
+
recordId: record.recordId,
|
|
249
|
+
recordData: record.recordData
|
|
250
|
+
}
|
|
251
|
+
};
|
|
252
|
+
this._recordSelectionTrigger.next(tableEvent);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
notifySelectionAction(actionCode) {
|
|
256
|
+
const tableEvent: TableEvent = {
|
|
257
|
+
tableCode: this._tableCode,
|
|
258
|
+
actionCode,
|
|
259
|
+
actionDetail: {
|
|
260
|
+
selectedRecords: this.selectedRecords
|
|
261
|
+
}
|
|
262
|
+
};
|
|
263
|
+
this._selectionActionTrigger.next(tableEvent);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
notifyGetDataAction(requestedPage = null) {
|
|
267
|
+
this.updateVisibleRecords();
|
|
268
|
+
this._requestedPage = requestedPage || this._currentPage || 1;
|
|
269
|
+
const tableEvent: TableEvent = {
|
|
270
|
+
tableCode: this._tableCode,
|
|
271
|
+
actionCode: null,
|
|
272
|
+
actionDetail: null,
|
|
273
|
+
};
|
|
274
|
+
this._getDataTrigger.next(tableEvent);
|
|
275
|
+
return null;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
clean() {
|
|
279
|
+
this._tableRecords = [];
|
|
280
|
+
this.unSelectAll();
|
|
281
|
+
this._tableRecordObj = {};
|
|
282
|
+
this.updateVisibleRecords();
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
selectAll() {
|
|
286
|
+
this.setAttr(attrs.allSelected, true);
|
|
287
|
+
this._tableRecords.forEach(record => record.select());
|
|
288
|
+
this.setAttr(attrs.selectedRecords, this.getSelectedRecords());
|
|
289
|
+
return true;
|
|
290
|
+
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
unSelectAll() {
|
|
294
|
+
this.setAttr(attrs.allSelected, false);
|
|
295
|
+
this._tableRecords.forEach(record => record.unselect());
|
|
296
|
+
this.setAttr(attrs.selectedRecords, this.getSelectedRecords());
|
|
297
|
+
return true;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
setTableRecords(tableRecords, append = false, prepend = false) {
|
|
301
|
+
if (!append) {
|
|
302
|
+
this._tableRecords = [];
|
|
303
|
+
this._tableRecordObj = {};
|
|
304
|
+
this.setAttr(attrs.allSelected, false);
|
|
305
|
+
this.setAttr(attrs.selectedRecords, []);
|
|
306
|
+
}
|
|
307
|
+
const newRecordsObj = { ...this._tableRecordObj };
|
|
308
|
+
const newRecords = [...this._tableRecords];
|
|
309
|
+
for (const tableRecord of tableRecords) {
|
|
310
|
+
tableRecord.tableRecordId = tableRecord.tableRecordId ?? tableRecord.recordId ?? tableRecord.recordIdKey;
|
|
311
|
+
const recordReceived: TableRecordData = new TableRecordData(tableRecord, this._columns, this._selectionField);
|
|
312
|
+
const recordIdKey = recordReceived.recordIdKey ?? recordReceived.recordIdKey;
|
|
313
|
+
if (newRecordsObj[recordIdKey]) {
|
|
314
|
+
continue;
|
|
315
|
+
}
|
|
316
|
+
if (prepend) {
|
|
317
|
+
newRecords.unshift(recordReceived);
|
|
318
|
+
} else {
|
|
319
|
+
newRecords.push(recordReceived);
|
|
320
|
+
}
|
|
321
|
+
newRecordsObj[recordIdKey] = recordReceived;
|
|
322
|
+
}
|
|
323
|
+
this._tableRecords = newRecords;
|
|
324
|
+
this._tableRecordObj = newRecordsObj;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
appendRecords(records) { this.setTableRecords(records, true); }
|
|
328
|
+
prependRecords(records) { this.setTableRecords(records, true, true); }
|
|
329
|
+
replaceRecords(records) { this.setTableRecords(records, false); }
|
|
330
|
+
|
|
331
|
+
setTableAppend(append: boolean) { this._appendPages = append }
|
|
332
|
+
|
|
333
|
+
changePage(requestedPage) {
|
|
334
|
+
if (this._clientPaging) {
|
|
335
|
+
this.setAttr(attrs.currentPage, requestedPage);
|
|
336
|
+
this.updateVisibleRecords();
|
|
337
|
+
} else {
|
|
338
|
+
this.notifyGetDataAction(requestedPage);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
updateVisibleRecords() {
|
|
343
|
+
let visibleRecords: any[];
|
|
344
|
+
if (this._clientPaging) {
|
|
345
|
+
visibleRecords = this.getFilteredRecords();
|
|
346
|
+
// Se valida si la página actual sigue siendo válida
|
|
347
|
+
const totalRecords = visibleRecords.length;
|
|
348
|
+
const recordsLastPage = totalRecords % this._recordsPerPage;
|
|
349
|
+
const totalPages = Math.trunc(totalRecords / this._recordsPerPage + (recordsLastPage ? 1 : 0));
|
|
350
|
+
if (this._currentPage > totalPages) {
|
|
351
|
+
this._currentPage = totalPages || 1;
|
|
352
|
+
}
|
|
353
|
+
const sliceNumber1 = (this._currentPage - 1) * this._recordsPerPage;
|
|
354
|
+
const sliceNumber2 = (this._currentPage - 1) * this._recordsPerPage + this._recordsPerPage
|
|
355
|
+
visibleRecords = visibleRecords.slice(sliceNumber1, sliceNumber2);
|
|
356
|
+
this.setAttr(attrs.totalRecordsNumber, totalRecords);
|
|
357
|
+
} else {
|
|
358
|
+
visibleRecords = this._tableRecords;
|
|
359
|
+
}
|
|
360
|
+
this.setAttr(attrs.visibleRecords, visibleRecords ?? []);
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
updateFromServer(tableReceived) {
|
|
364
|
+
this._requestedPage = 1;
|
|
365
|
+
const { visible = true, totalPages = 1, recordsNumber, currentPage = 1, recordsPerPage,
|
|
366
|
+
totalRecordsNumber, sortingColumn, sortingDirection, tableRecords,
|
|
367
|
+
actions, fields,
|
|
368
|
+
} = tableReceived;
|
|
369
|
+
this.visible = visible;
|
|
370
|
+
if (actions) {
|
|
371
|
+
Object.keys(actions).forEach(actionCode => {
|
|
372
|
+
const tblAction = this.getAction(actionCode);
|
|
373
|
+
const actionReceived = actions[actionCode];
|
|
374
|
+
if (actionReceived.visible === true || actionReceived.visible === false) {
|
|
375
|
+
(actionReceived.visible === true) && tblAction.show();
|
|
376
|
+
(actionReceived.visible === false) && tblAction.hide();
|
|
377
|
+
}
|
|
378
|
+
if (actionReceived.enabled === true || actionReceived.enabled === false) {
|
|
379
|
+
(actionReceived.enabled === true) && tblAction.enable();
|
|
380
|
+
(actionReceived.enabled === false) && tblAction.disable();
|
|
381
|
+
}
|
|
382
|
+
if (actionReceived.showOnStates) {
|
|
383
|
+
actionReceived.showOnStates?.forEach(newState => {
|
|
384
|
+
tblAction.addVisibleState(newState);
|
|
385
|
+
});
|
|
386
|
+
}
|
|
387
|
+
if (actionReceived.hideOnStates) {
|
|
388
|
+
actionReceived.hideOnStates?.forEach(newState => {
|
|
389
|
+
tblAction.removeVisibleState(newState);
|
|
390
|
+
});
|
|
391
|
+
}
|
|
392
|
+
if (actionReceived.enableOnStates) {
|
|
393
|
+
actionReceived.enableOnStates?.forEach(newState => {
|
|
394
|
+
tblAction.addEnabledState(newState);
|
|
395
|
+
});
|
|
396
|
+
}
|
|
397
|
+
if (actionReceived.disableOnStates) {
|
|
398
|
+
actionReceived.disableOnStates?.forEach(newState => {
|
|
399
|
+
tblAction.removeEnabledState(newState);
|
|
400
|
+
});
|
|
401
|
+
}
|
|
402
|
+
});
|
|
403
|
+
}
|
|
404
|
+
if (fields) {
|
|
405
|
+
Object.keys(fields).forEach(fieldCode => {
|
|
406
|
+
const tblField = this.columnDefinition(fieldCode);
|
|
407
|
+
const fieldReceived = fields[fieldCode];
|
|
408
|
+
if (fieldReceived.visible === true || fieldReceived.visible === false) {
|
|
409
|
+
(fieldReceived.visible === true) && tblField.show();
|
|
410
|
+
(fieldReceived.visible === false) && tblField.hide();
|
|
411
|
+
}
|
|
412
|
+
});
|
|
413
|
+
}
|
|
414
|
+
if (tableRecords) {
|
|
415
|
+
this._totalPages = totalPages;
|
|
416
|
+
this._recordsNumber = recordsNumber;
|
|
417
|
+
this.setAttr(attrs.currentPage, +currentPage);
|
|
418
|
+
this.setAttr(attrs.recordsPerPage, +recordsPerPage);
|
|
419
|
+
this.setAttr(attrs.totalRecordsNumber, (this._clientPaging) ? tableRecords.length : +totalRecordsNumber);
|
|
420
|
+
this.setAttr(attrs.sorting, {
|
|
421
|
+
columnName: sortingColumn || '',
|
|
422
|
+
direction: sortingDirection || ''
|
|
423
|
+
});
|
|
424
|
+
if (!this._appendPages) {
|
|
425
|
+
this.replaceRecords(tableRecords);
|
|
426
|
+
} else {
|
|
427
|
+
this.appendRecords(tableRecords);
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
this.freeWaiting();
|
|
431
|
+
this.updateVisibleRecords();
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
getTableRecord(recordId) {
|
|
435
|
+
const recordIdKey = (typeof recordId === 'object') ? JSON.stringify(recordId) : recordId;
|
|
436
|
+
return (this._tableRecordObj && recordId && this._tableRecordObj[recordId])
|
|
437
|
+
? this._tableRecordObj[recordId] : null;
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
getAction(actionCode) {
|
|
441
|
+
return (this._actionsObj && actionCode && this._actionsObj[actionCode])
|
|
442
|
+
? this._actionsObj[actionCode] : null;
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
getActions(actionClass: string = this._formConfig.tableActions.inline, actionTypes: string[] = null) {
|
|
446
|
+
return this._actions.filter(actionDef => {
|
|
447
|
+
const typeIncluded = (actionTypes) ? actionTypes.includes(actionDef.actionType) : true;
|
|
448
|
+
return actionDef.actionClass === actionClass && typeIncluded;
|
|
449
|
+
});
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
// Filtros
|
|
453
|
+
|
|
454
|
+
setFilterById(id) {
|
|
455
|
+
if (this.restrictedId === id) { return; }
|
|
456
|
+
this.restrictedId = id;
|
|
457
|
+
this.updateVisibleRecords();
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
cleanIdFilter() {
|
|
461
|
+
if (this.restrictedId === null) { return; }
|
|
462
|
+
this.restrictedId = null;
|
|
463
|
+
this.updateVisibleRecords();
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
setGlobalFilterString(text, notifyComponent = true) {
|
|
467
|
+
this.globalFilterStrings = text.split(' ').filter(t => t && t.trim().length > 0).map(t => t.trim()) ?? [];
|
|
468
|
+
if (this._clientPaging) {
|
|
469
|
+
this.changePage(1);
|
|
470
|
+
}
|
|
471
|
+
if (notifyComponent) {
|
|
472
|
+
this.setAttr(attrs.globalFilterString, text.trim());
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
addFilterDefinition(columnName, filterDefinition) {
|
|
477
|
+
const tableColumn = this.columnDefinition(columnName);
|
|
478
|
+
tableColumn && tableColumn.addFilterDefinition(filterDefinition);
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
getFilteredRecords() {
|
|
482
|
+
let filteredRecords = this._tableRecords;
|
|
483
|
+
if (this.restrictedId) {
|
|
484
|
+
filteredRecords = filteredRecords.filter(record => record.recordId === this.restrictedId);
|
|
485
|
+
}
|
|
486
|
+
if (this.globalFilterStrings.length > 0) {
|
|
487
|
+
filteredRecords = filteredRecords.filter(record => record.hasPattern(this.globalFilterStrings, this._tableColumnObj));
|
|
488
|
+
}
|
|
489
|
+
const columnFilters = this._columns.filter(column => column.filter).map(column => column.filter);
|
|
490
|
+
if (columnFilters.length > 0) {
|
|
491
|
+
filteredRecords = filteredRecords.filter(record => record.hasCondition(columnFilters));
|
|
492
|
+
}
|
|
493
|
+
return filteredRecords;
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
getColumnFilter(columnName: string) {
|
|
497
|
+
const tableColumn = this.columnDefinition(columnName);
|
|
498
|
+
return tableColumn?.filter ?? null;
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
addColumnFilter(columnName: string, columnValues: any | any[], operator: string | null = null) {
|
|
502
|
+
const tableColumn = this.columnDefinition(columnName);
|
|
503
|
+
const columnFilterDefinition = tableColumn?.filterDefinition ?? null;
|
|
504
|
+
if (!columnFilterDefinition) {
|
|
505
|
+
return;
|
|
506
|
+
}
|
|
507
|
+
tableColumn && tableColumn.addFilter(columnValues, operator);
|
|
508
|
+
this.updateVisibleRecords();
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
removeColumnFilter(columnName: string) {
|
|
512
|
+
const tableColumn = this.columnDefinition(columnName);
|
|
513
|
+
tableColumn && tableColumn.removeFilter();
|
|
514
|
+
this.updateVisibleRecords();
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
get currentFilter() {
|
|
518
|
+
const compactFilter: any = {
|
|
519
|
+
simpleFilterWords: this.globalFilterStrings,
|
|
520
|
+
advancedFilter: [],
|
|
521
|
+
};
|
|
522
|
+
const columnFilters = this._columns.filter(column => column.filter).map(column => column.filter);
|
|
523
|
+
for (let index = 0; index < columnFilters.length; index++) {
|
|
524
|
+
const columnFilter = columnFilters[index];
|
|
525
|
+
compactFilter.advancedFilter.push({
|
|
526
|
+
fieldCode: columnFilter?.fieldCode,
|
|
527
|
+
operator: columnFilter?.operator,
|
|
528
|
+
fieldValue1: columnFilter?.values[0],
|
|
529
|
+
fieldValue2: columnFilter?.values[1],
|
|
530
|
+
});
|
|
531
|
+
}
|
|
532
|
+
return compactFilter;
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
// Ordenamiento de registros local
|
|
536
|
+
|
|
537
|
+
sort(columnName, direction) {
|
|
538
|
+
this.setRequiredOrder(columnName, direction);
|
|
539
|
+
if (this._clientPaging) {
|
|
540
|
+
this.localSortData()
|
|
541
|
+
} else {
|
|
542
|
+
this.notifyGetDataAction();
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
setRequiredOrder(columnField, direction = null) {
|
|
547
|
+
this.setAttr(attrs.sorting, {
|
|
548
|
+
columnName: columnField,
|
|
549
|
+
direction: (direction === 'ascend') ? TABLE_SORT_ASCENDING : TABLE_SORT_DESCENDING,
|
|
550
|
+
});
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
localSortData() {
|
|
554
|
+
if (!this._sorting.columnName || !this._sorting.direction) { return; }
|
|
555
|
+
this._tableRecords.sort((a, b) => this.recordCompare(a, b, this._sorting.columnName, this._sorting.direction));
|
|
556
|
+
//this.unSelectAll();
|
|
557
|
+
this.updateVisibleRecords();
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
recordCompare(recordA: TableRecordData, recordB: TableRecordData, columnCompare, direction) {
|
|
561
|
+
const recordAValue = recordA.getFieldValue(columnCompare);
|
|
562
|
+
const recordBValue = recordB.getFieldValue(columnCompare);
|
|
563
|
+
const recordAColumn = isNaN(recordAValue) ? recordAValue.toLocaleLowerCase() : +recordAValue;
|
|
564
|
+
const recordBColumn = isNaN(recordBValue) ? recordBValue.toLocaleLowerCase() : +recordBValue;
|
|
565
|
+
let result = 0;
|
|
566
|
+
if (recordAColumn < recordBColumn) {
|
|
567
|
+
result = -1;
|
|
568
|
+
} else if (recordAColumn > recordBColumn) {
|
|
569
|
+
result = 1;
|
|
570
|
+
}
|
|
571
|
+
return direction === TABLE_SORT_ASCENDING ? result : -result;
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
override formStateChangeCustomSubscribe(form, formChangeSubject) {
|
|
575
|
+
this._columns?.forEach(column => {
|
|
576
|
+
column?.connectWithParentForm(form, formChangeSubject);
|
|
577
|
+
});
|
|
578
|
+
this._actions?.forEach(action => {
|
|
579
|
+
action?.connectWithParentForm(form, formChangeSubject);
|
|
580
|
+
});
|
|
581
|
+
}
|
|
582
|
+
}
|