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.
Files changed (106) hide show
  1. package/.browserslistrc +16 -0
  2. package/.yarn/cache/nanoid-npm-4.0.0-924f5c6312-7d5946df5c.zip +0 -0
  3. package/.yarn/cache/tslib-npm-2.4.1-36f0ed04db-19480d6e03.zip +0 -0
  4. package/.yarn/cache/yn-npm-5.0.0-b001dab23c-f0ec7710d3.zip +0 -0
  5. package/.yarn/install-state.gz +0 -0
  6. package/karma.conf.js +44 -0
  7. package/ng-package.json +11 -0
  8. package/package.json +2 -16
  9. package/src/lib/classes/forms/action.ts +117 -0
  10. package/src/lib/classes/forms/element.ts +26 -0
  11. package/src/lib/classes/forms/field.ts +522 -0
  12. package/src/lib/classes/forms/form.constants.ts +28 -0
  13. package/src/lib/classes/forms/form.ts +692 -0
  14. package/src/lib/classes/forms/piece-propagate.ts +47 -0
  15. package/src/lib/classes/forms/piece.ts +164 -0
  16. package/src/lib/classes/forms/section.ts +165 -0
  17. package/src/lib/classes/forms/subsection.ts +109 -0
  18. package/src/lib/classes/forms/table/action.ts +41 -0
  19. package/src/lib/classes/forms/table/column.ts +94 -0
  20. package/src/lib/classes/forms/table/row-data.ts +121 -0
  21. package/src/lib/classes/forms/table/table.ts +582 -0
  22. package/src/lib/components/elements/action.component.ts +70 -0
  23. package/src/lib/components/elements/field.component.ts +115 -0
  24. package/src/lib/components/elements/layout/element.component.ts +14 -0
  25. package/src/lib/components/elements/layout/form-error.component.ts +11 -0
  26. package/src/lib/components/elements/layout/form-header.component.ts +14 -0
  27. package/src/lib/components/elements/layout/piece.component.ts +60 -0
  28. package/src/lib/components/elements/layout/section.component.ts +52 -0
  29. package/src/lib/components/elements/layout/sub-section.component.ts +52 -0
  30. package/src/lib/components/elements/tables/table-record-action.component.ts +66 -0
  31. package/src/lib/components/elements/tables/table-record-field.component.ts +20 -0
  32. package/src/lib/components/elements/tables/table.component.ts +112 -0
  33. package/src/lib/components/forms/basic-form.ts +1464 -0
  34. package/src/lib/services/event-manager.service.ts +45 -0
  35. package/src/lib/services/file-manager.service.ts +7 -0
  36. package/src/lib/services/form-manager.service.ts +89 -0
  37. package/src/lib/services/icon-dictionary.service.ts +159 -0
  38. package/src/lib/tuain-ng-forms-lib.module.ts +40 -0
  39. package/{public-api.d.ts → src/public-api.ts} +5 -0
  40. package/src/test.ts +27 -0
  41. package/tsconfig.lib.json +15 -0
  42. package/tsconfig.lib.prod.json +10 -0
  43. package/tsconfig.spec.json +17 -0
  44. package/esm2022/lib/classes/forms/action.mjs +0 -106
  45. package/esm2022/lib/classes/forms/element.mjs +0 -25
  46. package/esm2022/lib/classes/forms/field.mjs +0 -474
  47. package/esm2022/lib/classes/forms/form.constants.mjs +0 -26
  48. package/esm2022/lib/classes/forms/form.mjs +0 -608
  49. package/esm2022/lib/classes/forms/piece-propagate.mjs +0 -39
  50. package/esm2022/lib/classes/forms/piece.mjs +0 -134
  51. package/esm2022/lib/classes/forms/section.mjs +0 -151
  52. package/esm2022/lib/classes/forms/subsection.mjs +0 -99
  53. package/esm2022/lib/classes/forms/table/action.mjs +0 -38
  54. package/esm2022/lib/classes/forms/table/column.mjs +0 -74
  55. package/esm2022/lib/classes/forms/table/row-data.mjs +0 -116
  56. package/esm2022/lib/classes/forms/table/table.mjs +0 -535
  57. package/esm2022/lib/components/elements/action.component.mjs +0 -70
  58. package/esm2022/lib/components/elements/field.component.mjs +0 -115
  59. package/esm2022/lib/components/elements/layout/element.component.mjs +0 -21
  60. package/esm2022/lib/components/elements/layout/form-error.component.mjs +0 -23
  61. package/esm2022/lib/components/elements/layout/form-header.component.mjs +0 -23
  62. package/esm2022/lib/components/elements/layout/piece.component.mjs +0 -64
  63. package/esm2022/lib/components/elements/layout/section.component.mjs +0 -56
  64. package/esm2022/lib/components/elements/layout/sub-section.component.mjs +0 -56
  65. package/esm2022/lib/components/elements/tables/table-record-action.component.mjs +0 -72
  66. package/esm2022/lib/components/elements/tables/table-record-field.component.mjs +0 -31
  67. package/esm2022/lib/components/elements/tables/table.component.mjs +0 -109
  68. package/esm2022/lib/components/forms/basic-form.mjs +0 -1399
  69. package/esm2022/lib/services/event-manager.service.mjs +0 -43
  70. package/esm2022/lib/services/file-manager.service.mjs +0 -7
  71. package/esm2022/lib/services/form-manager.service.mjs +0 -81
  72. package/esm2022/lib/tuain-ng-forms-lib.module.mjs +0 -71
  73. package/esm2022/public-api.mjs +0 -19
  74. package/esm2022/tuain-ng-forms-lib.mjs +0 -5
  75. package/fesm2022/tuain-ng-forms-lib.mjs +0 -4593
  76. package/fesm2022/tuain-ng-forms-lib.mjs.map +0 -1
  77. package/index.d.ts +0 -5
  78. package/lib/classes/forms/action.d.ts +0 -40
  79. package/lib/classes/forms/element.d.ts +0 -9
  80. package/lib/classes/forms/field.d.ts +0 -206
  81. package/lib/classes/forms/form.constants.d.ts +0 -25
  82. package/lib/classes/forms/form.d.ts +0 -232
  83. package/lib/classes/forms/piece-propagate.d.ts +0 -13
  84. package/lib/classes/forms/piece.d.ts +0 -51
  85. package/lib/classes/forms/section.d.ts +0 -43
  86. package/lib/classes/forms/subsection.d.ts +0 -42
  87. package/lib/classes/forms/table/action.d.ts +0 -16
  88. package/lib/classes/forms/table/column.d.ts +0 -33
  89. package/lib/classes/forms/table/row-data.d.ts +0 -14
  90. package/lib/classes/forms/table/table.d.ts +0 -145
  91. package/lib/components/elements/action.component.d.ts +0 -22
  92. package/lib/components/elements/field.component.d.ts +0 -47
  93. package/lib/components/elements/layout/element.component.d.ts +0 -8
  94. package/lib/components/elements/layout/form-error.component.d.ts +0 -8
  95. package/lib/components/elements/layout/form-header.component.d.ts +0 -9
  96. package/lib/components/elements/layout/piece.component.d.ts +0 -18
  97. package/lib/components/elements/layout/section.component.d.ts +0 -13
  98. package/lib/components/elements/layout/sub-section.component.d.ts +0 -13
  99. package/lib/components/elements/tables/table-record-action.component.d.ts +0 -18
  100. package/lib/components/elements/tables/table-record-field.component.d.ts +0 -12
  101. package/lib/components/elements/tables/table.component.d.ts +0 -44
  102. package/lib/components/forms/basic-form.d.ts +0 -256
  103. package/lib/services/event-manager.service.d.ts +0 -11
  104. package/lib/services/file-manager.service.d.ts +0 -6
  105. package/lib/services/form-manager.service.d.ts +0 -28
  106. 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
+ }