@sankhyalabs/ezui 0.0.0-bugfix-dev-KB-75609.0 → 0.0.0-bugfix-dev-KB-73518.0

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 (112) hide show
  1. package/dist/cjs/DataBinder-aff1dcc7.js +445 -0
  2. package/dist/cjs/FocusResolver-885f2173.js +35 -0
  3. package/dist/cjs/ez-card-item_3.cjs.entry.js +8 -2
  4. package/dist/cjs/ez-combo-box.cjs.entry.js +46 -10
  5. package/dist/cjs/ez-date-input.cjs.entry.js +8 -2
  6. package/dist/cjs/ez-date-time-input.cjs.entry.js +8 -2
  7. package/dist/cjs/ez-dialog.cjs.entry.js +9 -1
  8. package/dist/cjs/ez-form.cjs.entry.js +3 -324
  9. package/dist/cjs/ez-grid.cjs.entry.js +254 -62
  10. package/dist/cjs/ez-modal.cjs.entry.js +1 -1
  11. package/dist/cjs/ez-number-input.cjs.entry.js +7 -0
  12. package/dist/cjs/ez-search.cjs.entry.js +27 -11
  13. package/dist/cjs/ez-text-area.cjs.entry.js +6 -0
  14. package/dist/cjs/ez-text-input.cjs.entry.js +7 -1
  15. package/dist/cjs/ez-time-input.cjs.entry.js +6 -0
  16. package/dist/cjs/ezui.cjs.js +1 -1
  17. package/dist/cjs/loader.cjs.js +1 -1
  18. package/dist/collection/collection-manifest.json +1 -1
  19. package/dist/collection/components/ez-combo-box/ez-combo-box.js +75 -14
  20. package/dist/collection/components/ez-date-input/ez-date-input.js +35 -4
  21. package/dist/collection/components/ez-date-time-input/ez-date-time-input.js +35 -4
  22. package/dist/collection/components/ez-dialog/ez-dialog.js +9 -1
  23. package/dist/collection/components/ez-filter-input/ez-filter-input.js +35 -4
  24. package/dist/collection/components/ez-grid/controller/ag-grid/AgGridController.js +52 -14
  25. package/dist/collection/components/ez-grid/controller/ag-grid/DataSource.js +3 -0
  26. package/dist/collection/components/ez-grid/controller/ag-grid/GridEditionManager.js +166 -45
  27. package/dist/collection/components/ez-grid/controller/ag-grid/components/EzGridCustomCellEditor.js +7 -0
  28. package/dist/collection/components/ez-grid/controller/ag-grid/editor/templates/ComboBox.tpl.js +1 -0
  29. package/dist/collection/components/ez-grid/controller/ag-grid/editor/templates/DateInput.tpl.js +1 -0
  30. package/dist/collection/components/ez-grid/controller/ag-grid/editor/templates/NumberInput.tpl.js +1 -0
  31. package/dist/collection/components/ez-grid/controller/ag-grid/editor/templates/Search.tpl.js +1 -0
  32. package/dist/collection/components/ez-grid/controller/ag-grid/editor/templates/TextInput.tpl.js +4 -1
  33. package/dist/collection/components/ez-grid/ez-grid.js +83 -1
  34. package/dist/collection/components/ez-modal/ez-modal.css +4 -0
  35. package/dist/collection/components/ez-modal/ez-modal.js +2 -2
  36. package/dist/collection/components/ez-number-input/ez-number-input.js +25 -0
  37. package/dist/collection/components/ez-search/ez-search.js +54 -13
  38. package/dist/collection/components/ez-text-area/ez-text-area.js +24 -0
  39. package/dist/collection/components/ez-text-input/ez-text-input.css +14 -38
  40. package/dist/collection/components/ez-text-input/ez-text-input.js +24 -0
  41. package/dist/collection/components/ez-time-input/ez-time-input.js +24 -0
  42. package/dist/collection/utils/FocusResolver.js +31 -0
  43. package/dist/collection/utils/form/DataBinder.js +18 -3
  44. package/dist/custom-elements/index.js +443 -103
  45. package/dist/esm/DataBinder-bd240826.js +441 -0
  46. package/dist/esm/FocusResolver-1ccbf850.js +33 -0
  47. package/dist/esm/ez-card-item_3.entry.js +8 -2
  48. package/dist/esm/ez-combo-box.entry.js +47 -11
  49. package/dist/esm/ez-date-input.entry.js +8 -2
  50. package/dist/esm/ez-date-time-input.entry.js +8 -2
  51. package/dist/esm/ez-dialog.entry.js +9 -1
  52. package/dist/esm/ez-form.entry.js +2 -323
  53. package/dist/esm/ez-grid.entry.js +253 -61
  54. package/dist/esm/ez-modal.entry.js +1 -1
  55. package/dist/esm/ez-number-input.entry.js +7 -0
  56. package/dist/esm/ez-search.entry.js +27 -11
  57. package/dist/esm/ez-text-area.entry.js +6 -0
  58. package/dist/esm/ez-text-input.entry.js +7 -1
  59. package/dist/esm/ez-time-input.entry.js +6 -0
  60. package/dist/esm/ezui.js +1 -1
  61. package/dist/esm/loader.js +1 -1
  62. package/dist/ezui/ezui.esm.js +1 -1
  63. package/dist/ezui/p-03a2c7d1.entry.js +1 -0
  64. package/dist/ezui/p-0a75bb05.entry.js +1 -0
  65. package/dist/ezui/{p-37219d42.entry.js → p-0db68715.entry.js} +1 -1
  66. package/dist/ezui/p-19098a3f.entry.js +1 -0
  67. package/dist/ezui/p-1f830a2f.entry.js +1 -0
  68. package/dist/ezui/p-3dd919b7.entry.js +1 -0
  69. package/dist/ezui/p-7bfae0fc.entry.js +1 -0
  70. package/dist/ezui/p-81f06699.js +1 -0
  71. package/dist/ezui/p-97af4b13.entry.js +1 -0
  72. package/dist/ezui/p-9ceefe4d.entry.js +1 -0
  73. package/dist/ezui/{p-c3c3d640.entry.js → p-b0a5c2cd.entry.js} +2 -2
  74. package/dist/ezui/p-d0ca26fe.entry.js +1 -0
  75. package/dist/ezui/p-dc628ed3.js +1 -0
  76. package/dist/ezui/p-fec696ab.entry.js +1 -0
  77. package/dist/ezui/p-ffd246f5.entry.js +1 -0
  78. package/dist/types/components/ez-combo-box/ez-combo-box.d.ts +7 -1
  79. package/dist/types/components/ez-date-input/ez-date-input.d.ts +6 -1
  80. package/dist/types/components/ez-date-time-input/ez-date-time-input.d.ts +6 -1
  81. package/dist/types/components/ez-dialog/ez-dialog.d.ts +2 -0
  82. package/dist/types/components/ez-filter-input/ez-filter-input.d.ts +6 -1
  83. package/dist/types/components/ez-grid/controller/EzGridController.d.ts +10 -0
  84. package/dist/types/components/ez-grid/controller/ag-grid/AgGridController.d.ts +4 -0
  85. package/dist/types/components/ez-grid/controller/ag-grid/GridEditionManager.d.ts +18 -6
  86. package/dist/types/components/ez-grid/controller/ag-grid/components/EzGridCustomCellEditor.d.ts +2 -0
  87. package/dist/types/components/ez-grid/controller/ag-grid/editor/IUICellEditor.d.ts +1 -0
  88. package/dist/types/components/ez-grid/ez-grid.d.ts +10 -0
  89. package/dist/types/components/ez-modal/ez-modal.d.ts +1 -1
  90. package/dist/types/components/ez-number-input/ez-number-input.d.ts +4 -0
  91. package/dist/types/components/ez-search/ez-search.d.ts +6 -1
  92. package/dist/types/components/ez-text-area/ez-text-area.d.ts +4 -0
  93. package/dist/types/components/ez-text-input/ez-text-input.d.ts +4 -0
  94. package/dist/types/components/ez-time-input/ez-time-input.d.ts +4 -0
  95. package/dist/types/components.d.ts +93 -8
  96. package/dist/types/utils/FocusResolver.d.ts +5 -0
  97. package/dist/types/utils/form/DataBinder.d.ts +3 -0
  98. package/package.json +1 -1
  99. package/dist/cjs/RecordValidationProcessor-10846595.js +0 -108
  100. package/dist/esm/RecordValidationProcessor-9c6cc267.js +0 -105
  101. package/dist/ezui/p-0f3b2e67.entry.js +0 -1
  102. package/dist/ezui/p-49456b34.entry.js +0 -1
  103. package/dist/ezui/p-5a90d7d1.entry.js +0 -1
  104. package/dist/ezui/p-62732269.entry.js +0 -1
  105. package/dist/ezui/p-abce5219.entry.js +0 -1
  106. package/dist/ezui/p-b95632e8.entry.js +0 -1
  107. package/dist/ezui/p-c25f0e92.entry.js +0 -1
  108. package/dist/ezui/p-d2c06f38.entry.js +0 -1
  109. package/dist/ezui/p-e85c48d7.entry.js +0 -1
  110. package/dist/ezui/p-f0e2ce9d.entry.js +0 -1
  111. package/dist/ezui/p-f299c608.entry.js +0 -1
  112. package/dist/ezui/p-f42855b9.js +0 -1
@@ -0,0 +1,445 @@
1
+ 'use strict';
2
+
3
+ const core = require('@sankhyalabs/core');
4
+ const ApplicationUtils = require('./ApplicationUtils-c9d1205c.js');
5
+
6
+ const buildFieldMetadata = (descriptor, config) => {
7
+ let { name, label, group } = Object.assign({}, config);
8
+ let { readOnly, required } = Object.assign({}, config);
9
+ let props;
10
+ let userInterface;
11
+ if (descriptor) {
12
+ label = label || descriptor.label;
13
+ name = name || descriptor.name;
14
+ required = descriptor.required || (config === null || config === void 0 ? void 0 : config.required);
15
+ readOnly = descriptor.readOnly || (config === null || config === void 0 ? void 0 : config.readOnly);
16
+ props = descriptor.properties;
17
+ userInterface = descriptor.userInterface;
18
+ }
19
+ return {
20
+ name, label, group,
21
+ readOnly, required,
22
+ props,
23
+ userInterface: userInterface || core.UserInterface.SHORTTEXT
24
+ };
25
+ };
26
+
27
+ class RecordValidationProcessor {
28
+ constructor(dataUnit, validationSource, validator) {
29
+ this._dataUnit = dataUnit;
30
+ this._validationSource = validationSource;
31
+ this._validator = validator;
32
+ }
33
+ validate(isSaving = true) {
34
+ return new Promise((accept, reject) => {
35
+ const records = this._dataUnit.getModifiedRecords();
36
+ for (let i = 0; i < records.length; i++) {
37
+ const record = records[i];
38
+ const invalidResults = [];
39
+ let validationResult = this.validateRequired(record);
40
+ if (validationResult && !validationResult.isValid) {
41
+ invalidResults.push(validationResult);
42
+ }
43
+ if (this._validator) {
44
+ validationResult = this._validator.validateRecord(record);
45
+ if (validationResult && !validationResult.isValid) {
46
+ invalidResults.push(validationResult);
47
+ }
48
+ }
49
+ if (invalidResults.length > 0) {
50
+ if (!isSaving && invalidResults[0].invalidFields.length > 0) {
51
+ this._validationSource.markAsInvalid(invalidResults[0].invalidFields[0], record.__record__id__);
52
+ reject();
53
+ break;
54
+ }
55
+ this.processValidationResult(invalidResults, record.__record__id__);
56
+ reject();
57
+ break;
58
+ }
59
+ }
60
+ return accept();
61
+ });
62
+ }
63
+ validateRequired(record) {
64
+ const requiredFields = this._validationSource.getRequiredFields();
65
+ const invalidFields = [];
66
+ new Set(requiredFields).forEach(field => {
67
+ const value = record[field];
68
+ if (value == undefined || value === "") {
69
+ const errorMessage = this._validationSource.getMessageForField(field, record.__record__id__);
70
+ if (errorMessage) {
71
+ invalidFields.push({ name: field, message: errorMessage });
72
+ }
73
+ else {
74
+ invalidFields.push({ name: field, message: "Essa informação é obrigatória" });
75
+ }
76
+ }
77
+ });
78
+ if (invalidFields.length > 0) {
79
+ return { isValid: false, invalidFields, infoMessage: "Há pelo menos um campo obrigatório não preenchido." };
80
+ }
81
+ return undefined;
82
+ }
83
+ processValidationResult(validationResult, recordId) {
84
+ validationResult.forEach(invalidResult => {
85
+ const invalidFields = invalidResult.invalidFields;
86
+ this._dataUnit.savingCanceled(invalidFields, recordId);
87
+ if (invalidFields) {
88
+ invalidFields.forEach(field => {
89
+ this.markAsInvalid(field, recordId);
90
+ });
91
+ }
92
+ if (invalidResult.infoMessage) {
93
+ ApplicationUtils.ApplicationUtils.info(invalidResult.infoMessage);
94
+ }
95
+ if (invalidResult.errorMessage) {
96
+ const { errorTitle, errorMessage } = invalidResult;
97
+ ApplicationUtils.ApplicationUtils.error(errorTitle, errorMessage);
98
+ }
99
+ });
100
+ }
101
+ markAsInvalid(field, recordId) {
102
+ this._dataUnit.setInvalidField(field.name, field.message, recordId);
103
+ this._validationSource.markAsInvalid(field, recordId);
104
+ }
105
+ }
106
+
107
+ class DataBinder {
108
+ constructor(dataUnit) {
109
+ this.onDataUnitEvent = (action) => {
110
+ var _a, _b;
111
+ switch (action.type) {
112
+ case core.Action.DATA_LOADED:
113
+ case core.Action.DATA_SAVED:
114
+ case core.Action.RECORDS_REMOVED:
115
+ case core.Action.RECORDS_ADDED:
116
+ case core.Action.RECORDS_COPIED:
117
+ case core.Action.EDITION_CANCELED:
118
+ case core.Action.SELECTION_CHANGED:
119
+ case core.Action.NEXT_SELECTED:
120
+ case core.Action.PREVIOUS_SELECTED:
121
+ this.clearInvalid();
122
+ case core.Action.DATA_CHANGED:
123
+ case core.Action.CHANGE_UNDONE:
124
+ case core.Action.CHANGE_REDONE:
125
+ case core.Action.RECORD_LOADED:
126
+ (_a = this._fields) === null || _a === void 0 ? void 0 : _a.forEach(field => {
127
+ this.updateValue(field.fieldName, field.field);
128
+ });
129
+ this.clearFieldError(Object.keys(action.payload)[0]);
130
+ break;
131
+ case core.Action.FIELD_INVALIDATED:
132
+ (_b = this._fields) === null || _b === void 0 ? void 0 : _b.forEach(field => {
133
+ this.updateErrorMessage(field.fieldName, field.field);
134
+ });
135
+ break;
136
+ }
137
+ };
138
+ this._uuid = core.StringUtils.generateUUID();
139
+ this._fields = new Map();
140
+ this._dataUnit = dataUnit;
141
+ this.applyDefaultValues();
142
+ this._dataUnit.subscribe(this.onDataUnitEvent);
143
+ this._dataUnit.addInterceptor(this);
144
+ this.setContextDataBinder(dataUnit);
145
+ }
146
+ get dataBinderId() {
147
+ return this._uuid;
148
+ }
149
+ setContextDataBinder(dataUnit) {
150
+ const dataBindersByDataUnit = core.ApplicationContext.getContextValue("__DATABINDER_BY_DATAUNIT__") || new Map();
151
+ const dataBinders = [...(dataBindersByDataUnit.get(dataUnit.dataUnitId) || []), this];
152
+ dataBindersByDataUnit.set(dataUnit.dataUnitId, dataBinders);
153
+ core.ApplicationContext.setContextValue("__DATABINDER_BY_DATAUNIT__", dataBindersByDataUnit);
154
+ }
155
+ applyDefaultValues() {
156
+ const recordIds = (this._dataUnit.getAddedRecords() || []).map(r => r.__record__id__);
157
+ if (recordIds.length > 0) {
158
+ const defaultValues = this.getDefaultValues();
159
+ if (defaultValues) {
160
+ Object.keys(defaultValues).forEach(field => {
161
+ this._dataUnit.setFieldValue(field, defaultValues[field], recordIds);
162
+ });
163
+ }
164
+ }
165
+ }
166
+ bind(fields, currentContextName, formMetadata, recordsValidator) {
167
+ fields.forEach(fieldElement => {
168
+ const { fieldName, contextName } = fieldElement.dataset;
169
+ if (contextName == undefined || contextName === currentContextName) {
170
+ this.updateBind(fieldName, fieldElement);
171
+ }
172
+ });
173
+ this._formMetadata = formMetadata;
174
+ this._recordValidatorProcessor = new RecordValidationProcessor(this._dataUnit, {
175
+ getRequiredFields: () => this.getFormRequiredFields(),
176
+ markAsInvalid: field => this.markInvalid(field),
177
+ getMessageForField: field => this.getErrorMessage(field),
178
+ }, recordsValidator);
179
+ }
180
+ getFormRequiredFields() {
181
+ return this._formMetadata.getRequiredFields();
182
+ }
183
+ disconnectDataUnit() {
184
+ const dataBindersByDataUnit = core.ApplicationContext.getContextValue("__DATABINDER_BY_DATAUNIT__") || new Map();
185
+ const dataBinders = dataBindersByDataUnit.get(this._dataUnit.dataUnitId);
186
+ const dataBindersFiltered = dataBinders.filter((dataBinder) => dataBinder.dataBinderId !== this.dataBinderId);
187
+ dataBindersByDataUnit.set(this._dataUnit.dataUnitId, dataBindersFiltered);
188
+ core.ApplicationContext.setContextValue("__DATABINDER_BY_DATAUNIT__", dataBindersByDataUnit);
189
+ }
190
+ onDisconnectedCallback() {
191
+ this._dataUnit.unsubscribe(this.onDataUnitEvent);
192
+ this._dataUnit.removeInterceptor(this);
193
+ this.disconnectDataUnit();
194
+ }
195
+ getCurrentRecordId() {
196
+ const record = this._dataUnit.getSelectedRecord();
197
+ return record === null || record === void 0 ? void 0 : record.__record__id__;
198
+ }
199
+ markInvalid(field) {
200
+ if (this._fields.has(field.name)) {
201
+ const fieldElement = this._fields.get(field.name).field;
202
+ this.updateErrorMessage(field.name, fieldElement, field.message);
203
+ }
204
+ }
205
+ setFocus(fieldName) {
206
+ if (!this._fields.has(fieldName)) {
207
+ return;
208
+ }
209
+ const fieldElement = this._fields.get(fieldName).field;
210
+ if (typeof fieldElement["setFocus"] != "function") {
211
+ return;
212
+ }
213
+ fieldElement["setFocus"]();
214
+ }
215
+ clearInvalid(recordId) {
216
+ this._dataUnit.clearInvalid(recordId);
217
+ this._fields.forEach(fieldBinder => {
218
+ const fieldElement = fieldBinder.field;
219
+ fieldElement["errorMessage"] = "";
220
+ });
221
+ }
222
+ clearFieldError(fieldName) {
223
+ var _a;
224
+ const field = (_a = this._fields.get(fieldName)) === null || _a === void 0 ? void 0 : _a.field;
225
+ if (field["errorMessage"]) {
226
+ field["errorMessage"] = "";
227
+ this._dataUnit.clearInvalid(this.getCurrentRecordId(), fieldName);
228
+ }
229
+ }
230
+ updateValue(fieldName, field) {
231
+ const bind = this._fields.get(fieldName);
232
+ try {
233
+ if (bind) {
234
+ bind.listen = false;
235
+ }
236
+ field["value"] = this._dataUnit.getFieldValue(fieldName);
237
+ this.updateErrorMessage(fieldName, field);
238
+ }
239
+ finally {
240
+ if (bind) {
241
+ bind.listen = true;
242
+ }
243
+ }
244
+ }
245
+ validate() {
246
+ return this._recordValidatorProcessor.validate();
247
+ }
248
+ static async validateByDataunit(dataUnit) {
249
+ try {
250
+ const dataBinders = this.getDataBindersByDataUnit(dataUnit);
251
+ await Promise.all(dataBinders.map((dataBinder) => dataBinder.validate()));
252
+ return true;
253
+ }
254
+ catch (_a) {
255
+ return false;
256
+ }
257
+ }
258
+ static getDataBindersByDataUnit(dataUnit) {
259
+ const dataBindersByDataUnit = core.ApplicationContext.getContextValue("__DATABINDER_BY_DATAUNIT__");
260
+ return dataBindersByDataUnit.get(dataUnit.dataUnitId) || [];
261
+ }
262
+ updateErrorMessage(fieldName, field, message) {
263
+ if (message == undefined) {
264
+ message = this._dataUnit.getInvalidMessage(this.getCurrentRecordId(), fieldName);
265
+ }
266
+ if (!field["errorMessage"]) {
267
+ field["errorMessage"] = message;
268
+ }
269
+ }
270
+ getErrorMessage(fieldName) {
271
+ if (this._fields.has(fieldName)) {
272
+ const fieldElement = this._fields.get(fieldName).field;
273
+ return fieldElement["errorMessage"];
274
+ }
275
+ return undefined;
276
+ }
277
+ updateBind(fieldName, field) {
278
+ const oldBind = this._fields.get(fieldName);
279
+ if (oldBind) {
280
+ oldBind.destroy();
281
+ }
282
+ this.bindSearchOptionsLoader(fieldName, field);
283
+ field["value"] = this._dataUnit.getFieldValue(fieldName);
284
+ this.updateErrorMessage(fieldName, field);
285
+ this._fields.set(fieldName, Bind.create(fieldName, field, (fieldName, waitingChange) => this.changeStarted(fieldName, waitingChange), (fieldName) => this.cancelWaitingChange(fieldName), (fieldName, newValue) => this.setFieldValue(fieldName, newValue)));
286
+ this.applyEzUploadContext(fieldName, field);
287
+ }
288
+ changeStarted(fieldName, waitingChange) {
289
+ /**
290
+ * se o waitingChange não é blocante, add um event listener pra
291
+ * fazer o accept da promise
292
+ *
293
+ * se não tiver promise no waitingChange, eu crio uma e resolvo no bind
294
+ *
295
+ *
296
+ */
297
+ if (this._dataUnit.records.length === 0) {
298
+ this._dataUnit.addRecord();
299
+ }
300
+ if (!waitingChange.blocking && waitingChange.promise == undefined) {
301
+ const bind = this._fields.get(fieldName);
302
+ if (bind) {
303
+ waitingChange.promise = new Promise((resolve, reject) => {
304
+ bind.waitingChangePromiseResolve = resolve;
305
+ bind.waitingChangePromiseReject = reject;
306
+ });
307
+ }
308
+ }
309
+ this._dataUnit.startChange(fieldName, waitingChange);
310
+ }
311
+ cancelWaitingChange(fieldName) {
312
+ if (this._dataUnit.waitingForChange(fieldName)) {
313
+ this._dataUnit.cancelWaitingChange(fieldName);
314
+ const bind = this._fields.get(fieldName);
315
+ if (bind) {
316
+ bind.rejectWaitingChange(new core.WaitingChangeException("Change canceled", fieldName));
317
+ }
318
+ }
319
+ }
320
+ setFieldValue(fieldName, newValue) {
321
+ if (this._dataUnit.records.length === 0) {
322
+ this._dataUnit.addRecord();
323
+ }
324
+ this._dataUnit.clearInvalid(this.getCurrentRecordId(), fieldName);
325
+ const record = this._dataUnit.getSelectedRecord();
326
+ this._dataUnit.setFieldValue(fieldName, newValue, record ? [record.__record__id__] : undefined);
327
+ if (this._dataUnit.waitingForChange(fieldName)) {
328
+ const bind = this._fields.get(fieldName);
329
+ if (bind) {
330
+ bind.acceptWaitingChange();
331
+ }
332
+ }
333
+ }
334
+ bindSearchOptionsLoader(fieldName, field) {
335
+ if (field.nodeName === "EZ-SEARCH" && field["optionLoader"] == undefined) {
336
+ const loader = core.ApplicationContext.getContextValue("__EZUI__SEARCH__OPTION__LOADER__");
337
+ if (loader) {
338
+ field["optionLoader"] = (arg) => {
339
+ return loader(arg, fieldName, this._dataUnit);
340
+ };
341
+ }
342
+ }
343
+ }
344
+ applyEzUploadContext(fieldName, field) {
345
+ var _a, _b;
346
+ if (field.nodeName === "EZ-UPLOAD") {
347
+ field["urlUpload"] = core.ApplicationContext.getContextValue("__EZUI__UPLOAD__ADD__URL__");
348
+ field["urlDelete"] = core.ApplicationContext.getContextValue("__EZUI__UPLOAD__DEL__URL__");
349
+ const descriptor = this._dataUnit.getField(fieldName);
350
+ const destination = (_a = descriptor.properties) === null || _a === void 0 ? void 0 : _a.DESTINATION;
351
+ if (destination) {
352
+ field["requestHeaders"] = { XTRAINF: `{"destination": "${destination}"}` };
353
+ }
354
+ field["maxFiles"] = ((_b = descriptor.properties) === null || _b === void 0 ? void 0 : _b.MAX_FILES) || 0;
355
+ }
356
+ }
357
+ interceptAction(action) {
358
+ if (action.type === core.Action.RECORDS_COPIED) {
359
+ const cleanFields = this._formMetadata.getCleanOnCopyFields();
360
+ if (cleanFields) {
361
+ const records = action.payload;
362
+ return new core.DataUnitAction(core.Action.RECORDS_COPIED, records.map(record => {
363
+ const newRecord = Object.assign({}, record);
364
+ cleanFields.forEach(fieldName => delete newRecord[fieldName]);
365
+ return newRecord;
366
+ }));
367
+ }
368
+ }
369
+ if (action.type === core.Action.SAVING_DATA) {
370
+ return new Promise((resolve) => {
371
+ this.validate()
372
+ .then(() => resolve(action))
373
+ .catch(() => { });
374
+ });
375
+ }
376
+ if (action.type === core.Action.RECORDS_ADDED) {
377
+ const defaultValues = this.getDefaultValues();
378
+ if (defaultValues) {
379
+ const records = action.payload;
380
+ return new core.DataUnitAction(core.Action.RECORDS_ADDED, records.map(record => {
381
+ return Object.assign(Object.assign({}, record), defaultValues);
382
+ }));
383
+ }
384
+ }
385
+ return action;
386
+ }
387
+ getDefaultValues() {
388
+ var _a;
389
+ const rawDefaultValues = (_a = this._formMetadata) === null || _a === void 0 ? void 0 : _a.getDefaultValues();
390
+ if (rawDefaultValues) {
391
+ const defaultValues = {};
392
+ for (const field in rawDefaultValues) {
393
+ defaultValues[field] = this._dataUnit.valueFromString(field, rawDefaultValues[field]);
394
+ }
395
+ return defaultValues;
396
+ }
397
+ return undefined;
398
+ }
399
+ }
400
+ class Bind {
401
+ constructor() {
402
+ this.listen = true;
403
+ this.startChangeEventName = "ezStartChange";
404
+ this.cancelWaitingChangeEventName = "ezCancelWaitingChange";
405
+ this.changeEventName = "ezChange";
406
+ }
407
+ destroy() {
408
+ this.field.removeEventListener(this.startChangeEventName, this.startChangeListener);
409
+ this.field.removeEventListener(this.cancelWaitingChangeEventName, this.cancelWaitingChangeListener);
410
+ this.field.removeEventListener(this.changeEventName, this.changeListener);
411
+ }
412
+ acceptWaitingChange() {
413
+ if (this.waitingChangePromiseResolve) {
414
+ this.waitingChangePromiseResolve();
415
+ this.waitingChangePromiseReject = undefined;
416
+ this.waitingChangePromiseResolve = undefined;
417
+ }
418
+ }
419
+ rejectWaitingChange(reason) {
420
+ if (this.waitingChangePromiseReject) {
421
+ this.waitingChangePromiseReject(reason);
422
+ this.waitingChangePromiseReject = undefined;
423
+ this.waitingChangePromiseResolve = undefined;
424
+ }
425
+ }
426
+ static create(fieldName, field, startChangeCallback, cancelWaitingChangeCallback, changeCallback) {
427
+ const b = new Bind();
428
+ b.field = field;
429
+ b.fieldName = fieldName;
430
+ b.startChangeListener = (evt) => { if (b.listen)
431
+ startChangeCallback(fieldName, evt.detail); };
432
+ b.field.addEventListener(b.startChangeEventName, b.startChangeListener);
433
+ b.cancelWaitingChangeListener = () => { if (b.listen)
434
+ cancelWaitingChangeCallback(fieldName); };
435
+ b.field.addEventListener(b.cancelWaitingChangeEventName, b.cancelWaitingChangeListener);
436
+ b.changeListener = (evt) => { if (b.listen)
437
+ changeCallback(fieldName, evt.detail); };
438
+ b.field.addEventListener(b.changeEventName, b.changeListener);
439
+ return b;
440
+ }
441
+ }
442
+
443
+ exports.DataBinder = DataBinder;
444
+ exports.RecordValidationProcessor = RecordValidationProcessor;
445
+ exports.buildFieldMetadata = buildFieldMetadata;
@@ -0,0 +1,35 @@
1
+ 'use strict';
2
+
3
+ class FocusResolver {
4
+ static resolveFocus(element, selectText = true) {
5
+ var _a;
6
+ if (!element)
7
+ return;
8
+ (_a = element.focus) === null || _a === void 0 ? void 0 : _a.call(element);
9
+ if (element.setFocus) {
10
+ element.setFocus({ selectText });
11
+ return;
12
+ }
13
+ this.resolveFocusOnChild(element, selectText);
14
+ }
15
+ static resolveFocusOnChild(element, selectText = true) {
16
+ var _a, _b;
17
+ if (this.isGridCell(element) && element.firstElementChild) {
18
+ this.resolveFocusOnChild(element.firstElementChild);
19
+ return;
20
+ }
21
+ if (!element || !element.classList.contains('hydrated'))
22
+ return;
23
+ const firstChild = element.firstElementChild;
24
+ if (!(firstChild === null || firstChild === void 0 ? void 0 : firstChild.focus) && !(firstChild === null || firstChild === void 0 ? void 0 : firstChild.setFocus))
25
+ return;
26
+ (_a = firstChild === null || firstChild === void 0 ? void 0 : firstChild.focus) === null || _a === void 0 ? void 0 : _a.call(firstChild);
27
+ (_b = firstChild === null || firstChild === void 0 ? void 0 : firstChild.setFocus) === null || _b === void 0 ? void 0 : _b.call(firstChild, { selectText });
28
+ }
29
+ static isGridCell(element) {
30
+ var _a;
31
+ return ((_a = element === null || element === void 0 ? void 0 : element.getAttribute) === null || _a === void 0 ? void 0 : _a.call(element, "role")) === 'gridcell';
32
+ }
33
+ }
34
+
35
+ exports.FocusResolver = FocusResolver;
@@ -86,6 +86,7 @@ const EzFilterInput = class {
86
86
  this.mode = "regular";
87
87
  this.asyncSearch = false;
88
88
  this.canShowError = true;
89
+ this.autoFocus = false;
89
90
  }
90
91
  observeLabel() {
91
92
  if (this._textInput) {
@@ -106,8 +107,8 @@ const EzFilterInput = class {
106
107
  /**
107
108
  * Aplica o foco no campo.
108
109
  */
109
- async setFocus() {
110
- this._textInput.setFocus();
110
+ async setFocus(options) {
111
+ this._textInput.setFocus(options);
111
112
  }
112
113
  /**
113
114
  * Remove o foco do campo.
@@ -160,6 +161,11 @@ const EzFilterInput = class {
160
161
  }
161
162
  componentDidLoad() {
162
163
  CSSVarsUtils.CSSVarsUtils.applyVarsTextInput(this._elem, this._textInput);
164
+ if (this.autoFocus) {
165
+ requestAnimationFrame(() => {
166
+ this.setFocus({ selectText: true });
167
+ });
168
+ }
163
169
  }
164
170
  render() {
165
171
  core.ElementIDUtils.addIDInfoIfNotExists(this._elem, 'input');
@@ -38,12 +38,13 @@ const EzComboBox = class {
38
38
  this.suppressSearch = false;
39
39
  this.optionLoader = undefined;
40
40
  this.suppressEmptyOption = false;
41
- this.stopPropagateEnterKeyEvent = false;
41
+ this.stopPropagateEnterKeyEvent = true;
42
42
  this.canShowError = true;
43
43
  this.mode = "regular";
44
44
  this.hideErrorOnFocusOut = true;
45
45
  this.listOptionsPosition = undefined;
46
46
  this.isTextSearch = false;
47
+ this.autoFocus = false;
47
48
  }
48
49
  observeErrorMessage() {
49
50
  var _a;
@@ -106,9 +107,9 @@ const EzComboBox = class {
106
107
  /**
107
108
  * Aplica o foco no campo.
108
109
  */
109
- async setFocus() {
110
+ async setFocus(options) {
110
111
  if (this._textInput) {
111
- this._textInput.setFocus();
112
+ this._textInput.setFocus(options);
112
113
  }
113
114
  }
114
115
  /**
@@ -268,11 +269,15 @@ const EzComboBox = class {
268
269
  : undefined, index.h("span", { class: "item__label " + (this.showOptionValue ? "item__label--bold" : ""), title: opt.label }, opt.label));
269
270
  }
270
271
  showOptions() {
272
+ var _a, _b;
271
273
  if (!this.enabled)
272
274
  return;
273
275
  if (this.isOptionsVisible()) {
274
276
  return;
275
277
  }
278
+ const valueString = (_b = (_a = this.value) === null || _a === void 0 ? void 0 : _a.value) !== null && _b !== void 0 ? _b : this.value;
279
+ const indexValue = this._visibleOptions.findIndex(option => option.value === valueString);
280
+ this._preSelection = indexValue === -1 ? 0 : indexValue;
276
281
  if (!!this._resizeObserver)
277
282
  this._resizeObserver.observe(this._textInput);
278
283
  this._floatingID = core.FloatingManager.float(this._listWrapper, this._listContainer, { autoClose: true, isFixed: true, backClickListener: () => this.hideOptions() });
@@ -314,11 +319,26 @@ const EzComboBox = class {
314
319
  liElem.scrollIntoView({ behavior: "smooth", block: "nearest" });
315
320
  });
316
321
  }
317
- selectCurrentOption() {
322
+ selectCurrentOption(focusOnInput = true) {
318
323
  if (this._preSelection !== undefined) {
319
- this.selectOption(this._visibleOptions[this._preSelection]);
324
+ this.selectOption(this._visibleOptions[this._preSelection], focusOnInput);
320
325
  this._preSelection = undefined;
321
326
  }
327
+ else {
328
+ this.controlListWithOnlyOne(focusOnInput);
329
+ }
330
+ }
331
+ controlListWithOnlyOne(focusOnInput = true) {
332
+ var _a;
333
+ const source = (_a = this._visibleOptions) === null || _a === void 0 ? void 0 : _a.filter((opt) => opt.label !== "" && opt.value != undefined);
334
+ if ((source === null || source === void 0 ? void 0 : source.length) > 0) {
335
+ let title = core.StringUtils.decodeHtmlEntities(source[0].label);
336
+ const option = {
337
+ value: source[0].value,
338
+ label: title,
339
+ };
340
+ this.selectOption(option, focusOnInput);
341
+ }
322
342
  }
323
343
  updateSource(source) {
324
344
  this._startLoading = false;
@@ -344,7 +364,7 @@ const EzComboBox = class {
344
364
  }
345
365
  }
346
366
  }
347
- selectOption(newOption) {
367
+ selectOption(newOption, focusOnInput = true) {
348
368
  var _a, _b;
349
369
  const currentValue = this.getSelectedOption(this.value);
350
370
  if ((((_a = currentValue === null || currentValue === void 0 ? void 0 : currentValue.value) === null || _a === void 0 ? void 0 : _a.toString()) !== ((_b = newOption === null || newOption === void 0 ? void 0 : newOption.value) === null || _b === void 0 ? void 0 : _b.toString()))
@@ -355,6 +375,11 @@ const EzComboBox = class {
355
375
  else {
356
376
  this.resetOptions();
357
377
  }
378
+ if (focusOnInput) {
379
+ setTimeout(() => {
380
+ this.setFocus();
381
+ }, 0);
382
+ }
358
383
  }
359
384
  loadOptions(mode, argument = "") {
360
385
  this._criteria = argument;
@@ -438,6 +463,11 @@ const EzComboBox = class {
438
463
  }
439
464
  });
440
465
  });
466
+ if (this.autoFocus) {
467
+ requestAnimationFrame(() => {
468
+ this.setFocus({ selectText: true });
469
+ });
470
+ }
441
471
  }
442
472
  //---------------------------------------------
443
473
  // Event handlers
@@ -492,18 +522,24 @@ const EzComboBox = class {
492
522
  }
493
523
  switch (event.key) {
494
524
  case "ArrowDown":
525
+ event.stopPropagation();
526
+ if (this.canShowListOptions())
527
+ event.preventDefault();
495
528
  this.showOptions();
496
529
  this.nextOption();
497
- event.stopPropagation();
498
530
  break;
499
531
  case "ArrowUp":
532
+ event.stopPropagation();
533
+ if (this.canShowListOptions())
534
+ event.preventDefault();
500
535
  this.showOptions();
501
536
  this.previousOption();
502
- event.stopPropagation();
503
537
  break;
504
538
  case "Enter":
505
539
  this.handleEventPropagation(event);
506
- this.selectCurrentOption();
540
+ if (this.isOptionsVisible()) {
541
+ this.selectCurrentOption();
542
+ }
507
543
  break;
508
544
  case "Escape":
509
545
  if (this.isOptionsVisible()) {
@@ -515,7 +551,7 @@ const EzComboBox = class {
515
551
  case "Tab":
516
552
  this._tabPressed = true;
517
553
  if (this.isOptionsVisible()) {
518
- this.selectCurrentOption();
554
+ this.selectCurrentOption(false);
519
555
  }
520
556
  this.resetOptions();
521
557
  break;
@@ -23,6 +23,7 @@ const EzDateInput = class {
23
23
  this.errorMessage = undefined;
24
24
  this.mode = "regular";
25
25
  this.canShowError = true;
26
+ this.autoFocus = false;
26
27
  }
27
28
  observeLabel() {
28
29
  if (this._textInput) {
@@ -59,8 +60,8 @@ const EzDateInput = class {
59
60
  /**
60
61
  * Aplica o foco no campo.
61
62
  */
62
- async setFocus() {
63
- this._textInput.setFocus();
63
+ async setFocus(options) {
64
+ this._textInput.setFocus(options);
64
65
  }
65
66
  /**
66
67
  * Remove o foco do campo.
@@ -178,6 +179,11 @@ const EzDateInput = class {
178
179
  componentDidLoad() {
179
180
  CSSVarsUtils.CSSVarsUtils.applyVarsTextInput(this._elem, this._textInput);
180
181
  this.setInputValue();
182
+ if (this.autoFocus) {
183
+ requestAnimationFrame(() => {
184
+ this.setFocus({ selectText: true });
185
+ });
186
+ }
181
187
  }
182
188
  render() {
183
189
  core.ElementIDUtils.addIDInfoIfNotExists(this._elem, 'input');