@sankhyalabs/ezui 0.0.0-bugfix-dev-KB-76362.0 → 0.0.0-bugfix-dev-KB-75609.1

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 (129) 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 +12 -19
  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-list.cjs.entry.js +151 -100
  11. package/dist/cjs/ez-number-input.cjs.entry.js +7 -0
  12. package/dist/cjs/ez-popover.cjs.entry.js +1 -1
  13. package/dist/cjs/ez-popup.cjs.entry.js +2 -9
  14. package/dist/cjs/ez-search.cjs.entry.js +28 -12
  15. package/dist/cjs/ez-text-area.cjs.entry.js +66 -4
  16. package/dist/cjs/ez-text-input.cjs.entry.js +8 -3
  17. package/dist/cjs/ez-time-input.cjs.entry.js +6 -0
  18. package/dist/cjs/ezui.cjs.js +1 -1
  19. package/dist/cjs/loader.cjs.js +1 -1
  20. package/dist/collection/collection-manifest.json +1 -1
  21. package/dist/collection/components/ez-card-item/ez-card-item.css +14 -5
  22. package/dist/collection/components/ez-combo-box/ez-combo-box.js +75 -14
  23. package/dist/collection/components/ez-date-input/ez-date-input.js +35 -4
  24. package/dist/collection/components/ez-date-time-input/ez-date-time-input.js +35 -4
  25. package/dist/collection/components/ez-dialog/ez-dialog.js +9 -1
  26. package/dist/collection/components/ez-filter-input/ez-filter-input.css +0 -11
  27. package/dist/collection/components/ez-filter-input/ez-filter-input.js +22 -52
  28. package/dist/collection/components/ez-grid/controller/ag-grid/AgGridController.js +52 -14
  29. package/dist/collection/components/ez-grid/controller/ag-grid/DataSource.js +3 -0
  30. package/dist/collection/components/ez-grid/controller/ag-grid/GridEditionManager.js +166 -45
  31. package/dist/collection/components/ez-grid/controller/ag-grid/components/EzGridCustomCellEditor.js +7 -0
  32. package/dist/collection/components/ez-grid/controller/ag-grid/editor/templates/ComboBox.tpl.js +1 -0
  33. package/dist/collection/components/ez-grid/controller/ag-grid/editor/templates/DateInput.tpl.js +1 -0
  34. package/dist/collection/components/ez-grid/controller/ag-grid/editor/templates/NumberInput.tpl.js +1 -0
  35. package/dist/collection/components/ez-grid/controller/ag-grid/editor/templates/Search.tpl.js +1 -0
  36. package/dist/collection/components/ez-grid/controller/ag-grid/editor/templates/TextInput.tpl.js +4 -1
  37. package/dist/collection/components/ez-grid/ez-grid.js +83 -1
  38. package/dist/collection/components/ez-list/ez-list.css +5 -5
  39. package/dist/collection/components/ez-list/ez-list.js +152 -170
  40. package/dist/collection/components/ez-number-input/ez-number-input.js +25 -0
  41. package/dist/collection/components/ez-popover/ez-popover.css +3 -10
  42. package/dist/collection/components/ez-popup/ez-popup.css +2 -6
  43. package/dist/collection/components/ez-popup/ez-popup.js +3 -10
  44. package/dist/collection/components/ez-search/ez-search.css +1 -1
  45. package/dist/collection/components/ez-search/ez-search.js +55 -14
  46. package/dist/collection/components/ez-text-area/ez-text-area.css +49 -0
  47. package/dist/collection/components/ez-text-area/ez-text-area.js +102 -2
  48. package/dist/collection/components/ez-text-input/ez-text-input.css +27 -53
  49. package/dist/collection/components/ez-text-input/ez-text-input.js +25 -2
  50. package/dist/collection/components/ez-time-input/ez-time-input.js +24 -0
  51. package/dist/collection/utils/FocusResolver.js +31 -0
  52. package/dist/collection/utils/form/DataBinder.js +18 -3
  53. package/dist/custom-elements/index.js +663 -237
  54. package/dist/esm/DataBinder-bd240826.js +441 -0
  55. package/dist/esm/FocusResolver-1ccbf850.js +33 -0
  56. package/dist/esm/ez-card-item_3.entry.js +12 -19
  57. package/dist/esm/ez-combo-box.entry.js +47 -11
  58. package/dist/esm/ez-date-input.entry.js +8 -2
  59. package/dist/esm/ez-date-time-input.entry.js +8 -2
  60. package/dist/esm/ez-dialog.entry.js +9 -1
  61. package/dist/esm/ez-form.entry.js +2 -323
  62. package/dist/esm/ez-grid.entry.js +253 -61
  63. package/dist/esm/ez-list.entry.js +152 -101
  64. package/dist/esm/ez-number-input.entry.js +7 -0
  65. package/dist/esm/ez-popover.entry.js +1 -1
  66. package/dist/esm/ez-popup.entry.js +2 -9
  67. package/dist/esm/ez-search.entry.js +28 -12
  68. package/dist/esm/ez-text-area.entry.js +66 -4
  69. package/dist/esm/ez-text-input.entry.js +8 -3
  70. package/dist/esm/ez-time-input.entry.js +6 -0
  71. package/dist/esm/ezui.js +1 -1
  72. package/dist/esm/loader.js +1 -1
  73. package/dist/ezui/ezui.esm.js +1 -1
  74. package/dist/ezui/p-03a2c7d1.entry.js +1 -0
  75. package/dist/ezui/p-0a75bb05.entry.js +1 -0
  76. package/dist/ezui/p-0db68715.entry.js +1 -0
  77. package/dist/ezui/p-19098a3f.entry.js +1 -0
  78. package/dist/ezui/p-1f830a2f.entry.js +1 -0
  79. package/dist/ezui/p-3dd919b7.entry.js +1 -0
  80. package/dist/ezui/p-7bfae0fc.entry.js +1 -0
  81. package/dist/ezui/p-81f06699.js +1 -0
  82. package/dist/ezui/p-97af4b13.entry.js +1 -0
  83. package/dist/ezui/p-9ceefe4d.entry.js +1 -0
  84. package/dist/ezui/p-a80b1287.entry.js +1 -0
  85. package/dist/ezui/{p-c3c3d640.entry.js → p-b0a5c2cd.entry.js} +2 -2
  86. package/dist/ezui/p-b54e17d2.entry.js +1 -0
  87. package/dist/ezui/p-bfad39eb.entry.js +1 -0
  88. package/dist/ezui/p-d0ca26fe.entry.js +1 -0
  89. package/dist/ezui/p-dc628ed3.js +1 -0
  90. package/dist/ezui/p-ffd246f5.entry.js +1 -0
  91. package/dist/types/components/ez-combo-box/ez-combo-box.d.ts +7 -1
  92. package/dist/types/components/ez-date-input/ez-date-input.d.ts +6 -1
  93. package/dist/types/components/ez-date-time-input/ez-date-time-input.d.ts +6 -1
  94. package/dist/types/components/ez-dialog/ez-dialog.d.ts +2 -0
  95. package/dist/types/components/ez-filter-input/ez-filter-input.d.ts +4 -11
  96. package/dist/types/components/ez-grid/controller/EzGridController.d.ts +10 -0
  97. package/dist/types/components/ez-grid/controller/ag-grid/AgGridController.d.ts +4 -0
  98. package/dist/types/components/ez-grid/controller/ag-grid/GridEditionManager.d.ts +18 -6
  99. package/dist/types/components/ez-grid/controller/ag-grid/components/EzGridCustomCellEditor.d.ts +2 -0
  100. package/dist/types/components/ez-grid/controller/ag-grid/editor/IUICellEditor.d.ts +1 -0
  101. package/dist/types/components/ez-grid/ez-grid.d.ts +10 -0
  102. package/dist/types/components/ez-list/ez-list.d.ts +3 -26
  103. package/dist/types/components/ez-number-input/ez-number-input.d.ts +4 -0
  104. package/dist/types/components/ez-popup/ez-popup.d.ts +2 -2
  105. package/dist/types/components/ez-search/ez-search.d.ts +6 -1
  106. package/dist/types/components/ez-text-area/ez-text-area.d.ts +17 -0
  107. package/dist/types/components/ez-text-input/ez-text-input.d.ts +4 -0
  108. package/dist/types/components/ez-time-input/ez-time-input.d.ts +4 -0
  109. package/dist/types/components.d.ts +101 -44
  110. package/dist/types/utils/FocusResolver.d.ts +5 -0
  111. package/dist/types/utils/form/DataBinder.d.ts +3 -0
  112. package/package.json +1 -1
  113. package/dist/cjs/RecordValidationProcessor-10846595.js +0 -108
  114. package/dist/esm/RecordValidationProcessor-9c6cc267.js +0 -105
  115. package/dist/ezui/p-188f1c4c.entry.js +0 -1
  116. package/dist/ezui/p-25ac5376.entry.js +0 -1
  117. package/dist/ezui/p-49456b34.entry.js +0 -1
  118. package/dist/ezui/p-5a90d7d1.entry.js +0 -1
  119. package/dist/ezui/p-62732269.entry.js +0 -1
  120. package/dist/ezui/p-86b6aa01.entry.js +0 -1
  121. package/dist/ezui/p-b3b94f72.entry.js +0 -1
  122. package/dist/ezui/p-b95632e8.entry.js +0 -1
  123. package/dist/ezui/p-bcd47eda.entry.js +0 -1
  124. package/dist/ezui/p-d2c06f38.entry.js +0 -1
  125. package/dist/ezui/p-dc4ada32.entry.js +0 -1
  126. package/dist/ezui/p-e85c48d7.entry.js +0 -1
  127. package/dist/ezui/p-f299c608.entry.js +0 -1
  128. package/dist/ezui/p-f42855b9.js +0 -1
  129. package/dist/ezui/p-f80ac647.entry.js +0 -1
@@ -0,0 +1,441 @@
1
+ import { UserInterface, Action, StringUtils, ApplicationContext, WaitingChangeException, DataUnitAction } from '@sankhyalabs/core';
2
+ import { A as ApplicationUtils } from './ApplicationUtils-eaf91331.js';
3
+
4
+ const buildFieldMetadata = (descriptor, config) => {
5
+ let { name, label, group } = Object.assign({}, config);
6
+ let { readOnly, required } = Object.assign({}, config);
7
+ let props;
8
+ let userInterface;
9
+ if (descriptor) {
10
+ label = label || descriptor.label;
11
+ name = name || descriptor.name;
12
+ required = descriptor.required || (config === null || config === void 0 ? void 0 : config.required);
13
+ readOnly = descriptor.readOnly || (config === null || config === void 0 ? void 0 : config.readOnly);
14
+ props = descriptor.properties;
15
+ userInterface = descriptor.userInterface;
16
+ }
17
+ return {
18
+ name, label, group,
19
+ readOnly, required,
20
+ props,
21
+ userInterface: userInterface || UserInterface.SHORTTEXT
22
+ };
23
+ };
24
+
25
+ class RecordValidationProcessor {
26
+ constructor(dataUnit, validationSource, validator) {
27
+ this._dataUnit = dataUnit;
28
+ this._validationSource = validationSource;
29
+ this._validator = validator;
30
+ }
31
+ validate(isSaving = true) {
32
+ return new Promise((accept, reject) => {
33
+ const records = this._dataUnit.getModifiedRecords();
34
+ for (let i = 0; i < records.length; i++) {
35
+ const record = records[i];
36
+ const invalidResults = [];
37
+ let validationResult = this.validateRequired(record);
38
+ if (validationResult && !validationResult.isValid) {
39
+ invalidResults.push(validationResult);
40
+ }
41
+ if (this._validator) {
42
+ validationResult = this._validator.validateRecord(record);
43
+ if (validationResult && !validationResult.isValid) {
44
+ invalidResults.push(validationResult);
45
+ }
46
+ }
47
+ if (invalidResults.length > 0) {
48
+ if (!isSaving && invalidResults[0].invalidFields.length > 0) {
49
+ this._validationSource.markAsInvalid(invalidResults[0].invalidFields[0], record.__record__id__);
50
+ reject();
51
+ break;
52
+ }
53
+ this.processValidationResult(invalidResults, record.__record__id__);
54
+ reject();
55
+ break;
56
+ }
57
+ }
58
+ return accept();
59
+ });
60
+ }
61
+ validateRequired(record) {
62
+ const requiredFields = this._validationSource.getRequiredFields();
63
+ const invalidFields = [];
64
+ new Set(requiredFields).forEach(field => {
65
+ const value = record[field];
66
+ if (value == undefined || value === "") {
67
+ const errorMessage = this._validationSource.getMessageForField(field, record.__record__id__);
68
+ if (errorMessage) {
69
+ invalidFields.push({ name: field, message: errorMessage });
70
+ }
71
+ else {
72
+ invalidFields.push({ name: field, message: "Essa informação é obrigatória" });
73
+ }
74
+ }
75
+ });
76
+ if (invalidFields.length > 0) {
77
+ return { isValid: false, invalidFields, infoMessage: "Há pelo menos um campo obrigatório não preenchido." };
78
+ }
79
+ return undefined;
80
+ }
81
+ processValidationResult(validationResult, recordId) {
82
+ validationResult.forEach(invalidResult => {
83
+ const invalidFields = invalidResult.invalidFields;
84
+ this._dataUnit.savingCanceled(invalidFields, recordId);
85
+ if (invalidFields) {
86
+ invalidFields.forEach(field => {
87
+ this.markAsInvalid(field, recordId);
88
+ });
89
+ }
90
+ if (invalidResult.infoMessage) {
91
+ ApplicationUtils.info(invalidResult.infoMessage);
92
+ }
93
+ if (invalidResult.errorMessage) {
94
+ const { errorTitle, errorMessage } = invalidResult;
95
+ ApplicationUtils.error(errorTitle, errorMessage);
96
+ }
97
+ });
98
+ }
99
+ markAsInvalid(field, recordId) {
100
+ this._dataUnit.setInvalidField(field.name, field.message, recordId);
101
+ this._validationSource.markAsInvalid(field, recordId);
102
+ }
103
+ }
104
+
105
+ class DataBinder {
106
+ constructor(dataUnit) {
107
+ this.onDataUnitEvent = (action) => {
108
+ var _a, _b;
109
+ switch (action.type) {
110
+ case Action.DATA_LOADED:
111
+ case Action.DATA_SAVED:
112
+ case Action.RECORDS_REMOVED:
113
+ case Action.RECORDS_ADDED:
114
+ case Action.RECORDS_COPIED:
115
+ case Action.EDITION_CANCELED:
116
+ case Action.SELECTION_CHANGED:
117
+ case Action.NEXT_SELECTED:
118
+ case Action.PREVIOUS_SELECTED:
119
+ this.clearInvalid();
120
+ case Action.DATA_CHANGED:
121
+ case Action.CHANGE_UNDONE:
122
+ case Action.CHANGE_REDONE:
123
+ case Action.RECORD_LOADED:
124
+ (_a = this._fields) === null || _a === void 0 ? void 0 : _a.forEach(field => {
125
+ this.updateValue(field.fieldName, field.field);
126
+ });
127
+ this.clearFieldError(Object.keys(action.payload)[0]);
128
+ break;
129
+ case Action.FIELD_INVALIDATED:
130
+ (_b = this._fields) === null || _b === void 0 ? void 0 : _b.forEach(field => {
131
+ this.updateErrorMessage(field.fieldName, field.field);
132
+ });
133
+ break;
134
+ }
135
+ };
136
+ this._uuid = StringUtils.generateUUID();
137
+ this._fields = new Map();
138
+ this._dataUnit = dataUnit;
139
+ this.applyDefaultValues();
140
+ this._dataUnit.subscribe(this.onDataUnitEvent);
141
+ this._dataUnit.addInterceptor(this);
142
+ this.setContextDataBinder(dataUnit);
143
+ }
144
+ get dataBinderId() {
145
+ return this._uuid;
146
+ }
147
+ setContextDataBinder(dataUnit) {
148
+ const dataBindersByDataUnit = ApplicationContext.getContextValue("__DATABINDER_BY_DATAUNIT__") || new Map();
149
+ const dataBinders = [...(dataBindersByDataUnit.get(dataUnit.dataUnitId) || []), this];
150
+ dataBindersByDataUnit.set(dataUnit.dataUnitId, dataBinders);
151
+ ApplicationContext.setContextValue("__DATABINDER_BY_DATAUNIT__", dataBindersByDataUnit);
152
+ }
153
+ applyDefaultValues() {
154
+ const recordIds = (this._dataUnit.getAddedRecords() || []).map(r => r.__record__id__);
155
+ if (recordIds.length > 0) {
156
+ const defaultValues = this.getDefaultValues();
157
+ if (defaultValues) {
158
+ Object.keys(defaultValues).forEach(field => {
159
+ this._dataUnit.setFieldValue(field, defaultValues[field], recordIds);
160
+ });
161
+ }
162
+ }
163
+ }
164
+ bind(fields, currentContextName, formMetadata, recordsValidator) {
165
+ fields.forEach(fieldElement => {
166
+ const { fieldName, contextName } = fieldElement.dataset;
167
+ if (contextName == undefined || contextName === currentContextName) {
168
+ this.updateBind(fieldName, fieldElement);
169
+ }
170
+ });
171
+ this._formMetadata = formMetadata;
172
+ this._recordValidatorProcessor = new RecordValidationProcessor(this._dataUnit, {
173
+ getRequiredFields: () => this.getFormRequiredFields(),
174
+ markAsInvalid: field => this.markInvalid(field),
175
+ getMessageForField: field => this.getErrorMessage(field),
176
+ }, recordsValidator);
177
+ }
178
+ getFormRequiredFields() {
179
+ return this._formMetadata.getRequiredFields();
180
+ }
181
+ disconnectDataUnit() {
182
+ const dataBindersByDataUnit = ApplicationContext.getContextValue("__DATABINDER_BY_DATAUNIT__") || new Map();
183
+ const dataBinders = dataBindersByDataUnit.get(this._dataUnit.dataUnitId);
184
+ const dataBindersFiltered = dataBinders.filter((dataBinder) => dataBinder.dataBinderId !== this.dataBinderId);
185
+ dataBindersByDataUnit.set(this._dataUnit.dataUnitId, dataBindersFiltered);
186
+ ApplicationContext.setContextValue("__DATABINDER_BY_DATAUNIT__", dataBindersByDataUnit);
187
+ }
188
+ onDisconnectedCallback() {
189
+ this._dataUnit.unsubscribe(this.onDataUnitEvent);
190
+ this._dataUnit.removeInterceptor(this);
191
+ this.disconnectDataUnit();
192
+ }
193
+ getCurrentRecordId() {
194
+ const record = this._dataUnit.getSelectedRecord();
195
+ return record === null || record === void 0 ? void 0 : record.__record__id__;
196
+ }
197
+ markInvalid(field) {
198
+ if (this._fields.has(field.name)) {
199
+ const fieldElement = this._fields.get(field.name).field;
200
+ this.updateErrorMessage(field.name, fieldElement, field.message);
201
+ }
202
+ }
203
+ setFocus(fieldName) {
204
+ if (!this._fields.has(fieldName)) {
205
+ return;
206
+ }
207
+ const fieldElement = this._fields.get(fieldName).field;
208
+ if (typeof fieldElement["setFocus"] != "function") {
209
+ return;
210
+ }
211
+ fieldElement["setFocus"]();
212
+ }
213
+ clearInvalid(recordId) {
214
+ this._dataUnit.clearInvalid(recordId);
215
+ this._fields.forEach(fieldBinder => {
216
+ const fieldElement = fieldBinder.field;
217
+ fieldElement["errorMessage"] = "";
218
+ });
219
+ }
220
+ clearFieldError(fieldName) {
221
+ var _a;
222
+ const field = (_a = this._fields.get(fieldName)) === null || _a === void 0 ? void 0 : _a.field;
223
+ if (field["errorMessage"]) {
224
+ field["errorMessage"] = "";
225
+ this._dataUnit.clearInvalid(this.getCurrentRecordId(), fieldName);
226
+ }
227
+ }
228
+ updateValue(fieldName, field) {
229
+ const bind = this._fields.get(fieldName);
230
+ try {
231
+ if (bind) {
232
+ bind.listen = false;
233
+ }
234
+ field["value"] = this._dataUnit.getFieldValue(fieldName);
235
+ this.updateErrorMessage(fieldName, field);
236
+ }
237
+ finally {
238
+ if (bind) {
239
+ bind.listen = true;
240
+ }
241
+ }
242
+ }
243
+ validate() {
244
+ return this._recordValidatorProcessor.validate();
245
+ }
246
+ static async validateByDataunit(dataUnit) {
247
+ try {
248
+ const dataBinders = this.getDataBindersByDataUnit(dataUnit);
249
+ await Promise.all(dataBinders.map((dataBinder) => dataBinder.validate()));
250
+ return true;
251
+ }
252
+ catch (_a) {
253
+ return false;
254
+ }
255
+ }
256
+ static getDataBindersByDataUnit(dataUnit) {
257
+ const dataBindersByDataUnit = ApplicationContext.getContextValue("__DATABINDER_BY_DATAUNIT__");
258
+ return dataBindersByDataUnit.get(dataUnit.dataUnitId) || [];
259
+ }
260
+ updateErrorMessage(fieldName, field, message) {
261
+ if (message == undefined) {
262
+ message = this._dataUnit.getInvalidMessage(this.getCurrentRecordId(), fieldName);
263
+ }
264
+ if (!field["errorMessage"]) {
265
+ field["errorMessage"] = message;
266
+ }
267
+ }
268
+ getErrorMessage(fieldName) {
269
+ if (this._fields.has(fieldName)) {
270
+ const fieldElement = this._fields.get(fieldName).field;
271
+ return fieldElement["errorMessage"];
272
+ }
273
+ return undefined;
274
+ }
275
+ updateBind(fieldName, field) {
276
+ const oldBind = this._fields.get(fieldName);
277
+ if (oldBind) {
278
+ oldBind.destroy();
279
+ }
280
+ this.bindSearchOptionsLoader(fieldName, field);
281
+ field["value"] = this._dataUnit.getFieldValue(fieldName);
282
+ this.updateErrorMessage(fieldName, field);
283
+ this._fields.set(fieldName, Bind.create(fieldName, field, (fieldName, waitingChange) => this.changeStarted(fieldName, waitingChange), (fieldName) => this.cancelWaitingChange(fieldName), (fieldName, newValue) => this.setFieldValue(fieldName, newValue)));
284
+ this.applyEzUploadContext(fieldName, field);
285
+ }
286
+ changeStarted(fieldName, waitingChange) {
287
+ /**
288
+ * se o waitingChange não é blocante, add um event listener pra
289
+ * fazer o accept da promise
290
+ *
291
+ * se não tiver promise no waitingChange, eu crio uma e resolvo no bind
292
+ *
293
+ *
294
+ */
295
+ if (this._dataUnit.records.length === 0) {
296
+ this._dataUnit.addRecord();
297
+ }
298
+ if (!waitingChange.blocking && waitingChange.promise == undefined) {
299
+ const bind = this._fields.get(fieldName);
300
+ if (bind) {
301
+ waitingChange.promise = new Promise((resolve, reject) => {
302
+ bind.waitingChangePromiseResolve = resolve;
303
+ bind.waitingChangePromiseReject = reject;
304
+ });
305
+ }
306
+ }
307
+ this._dataUnit.startChange(fieldName, waitingChange);
308
+ }
309
+ cancelWaitingChange(fieldName) {
310
+ if (this._dataUnit.waitingForChange(fieldName)) {
311
+ this._dataUnit.cancelWaitingChange(fieldName);
312
+ const bind = this._fields.get(fieldName);
313
+ if (bind) {
314
+ bind.rejectWaitingChange(new WaitingChangeException("Change canceled", fieldName));
315
+ }
316
+ }
317
+ }
318
+ setFieldValue(fieldName, newValue) {
319
+ if (this._dataUnit.records.length === 0) {
320
+ this._dataUnit.addRecord();
321
+ }
322
+ this._dataUnit.clearInvalid(this.getCurrentRecordId(), fieldName);
323
+ const record = this._dataUnit.getSelectedRecord();
324
+ this._dataUnit.setFieldValue(fieldName, newValue, record ? [record.__record__id__] : undefined);
325
+ if (this._dataUnit.waitingForChange(fieldName)) {
326
+ const bind = this._fields.get(fieldName);
327
+ if (bind) {
328
+ bind.acceptWaitingChange();
329
+ }
330
+ }
331
+ }
332
+ bindSearchOptionsLoader(fieldName, field) {
333
+ if (field.nodeName === "EZ-SEARCH" && field["optionLoader"] == undefined) {
334
+ const loader = ApplicationContext.getContextValue("__EZUI__SEARCH__OPTION__LOADER__");
335
+ if (loader) {
336
+ field["optionLoader"] = (arg) => {
337
+ return loader(arg, fieldName, this._dataUnit);
338
+ };
339
+ }
340
+ }
341
+ }
342
+ applyEzUploadContext(fieldName, field) {
343
+ var _a, _b;
344
+ if (field.nodeName === "EZ-UPLOAD") {
345
+ field["urlUpload"] = ApplicationContext.getContextValue("__EZUI__UPLOAD__ADD__URL__");
346
+ field["urlDelete"] = ApplicationContext.getContextValue("__EZUI__UPLOAD__DEL__URL__");
347
+ const descriptor = this._dataUnit.getField(fieldName);
348
+ const destination = (_a = descriptor.properties) === null || _a === void 0 ? void 0 : _a.DESTINATION;
349
+ if (destination) {
350
+ field["requestHeaders"] = { XTRAINF: `{"destination": "${destination}"}` };
351
+ }
352
+ field["maxFiles"] = ((_b = descriptor.properties) === null || _b === void 0 ? void 0 : _b.MAX_FILES) || 0;
353
+ }
354
+ }
355
+ interceptAction(action) {
356
+ if (action.type === Action.RECORDS_COPIED) {
357
+ const cleanFields = this._formMetadata.getCleanOnCopyFields();
358
+ if (cleanFields) {
359
+ const records = action.payload;
360
+ return new DataUnitAction(Action.RECORDS_COPIED, records.map(record => {
361
+ const newRecord = Object.assign({}, record);
362
+ cleanFields.forEach(fieldName => delete newRecord[fieldName]);
363
+ return newRecord;
364
+ }));
365
+ }
366
+ }
367
+ if (action.type === Action.SAVING_DATA) {
368
+ return new Promise((resolve) => {
369
+ this.validate()
370
+ .then(() => resolve(action))
371
+ .catch(() => { });
372
+ });
373
+ }
374
+ if (action.type === Action.RECORDS_ADDED) {
375
+ const defaultValues = this.getDefaultValues();
376
+ if (defaultValues) {
377
+ const records = action.payload;
378
+ return new DataUnitAction(Action.RECORDS_ADDED, records.map(record => {
379
+ return Object.assign(Object.assign({}, record), defaultValues);
380
+ }));
381
+ }
382
+ }
383
+ return action;
384
+ }
385
+ getDefaultValues() {
386
+ var _a;
387
+ const rawDefaultValues = (_a = this._formMetadata) === null || _a === void 0 ? void 0 : _a.getDefaultValues();
388
+ if (rawDefaultValues) {
389
+ const defaultValues = {};
390
+ for (const field in rawDefaultValues) {
391
+ defaultValues[field] = this._dataUnit.valueFromString(field, rawDefaultValues[field]);
392
+ }
393
+ return defaultValues;
394
+ }
395
+ return undefined;
396
+ }
397
+ }
398
+ class Bind {
399
+ constructor() {
400
+ this.listen = true;
401
+ this.startChangeEventName = "ezStartChange";
402
+ this.cancelWaitingChangeEventName = "ezCancelWaitingChange";
403
+ this.changeEventName = "ezChange";
404
+ }
405
+ destroy() {
406
+ this.field.removeEventListener(this.startChangeEventName, this.startChangeListener);
407
+ this.field.removeEventListener(this.cancelWaitingChangeEventName, this.cancelWaitingChangeListener);
408
+ this.field.removeEventListener(this.changeEventName, this.changeListener);
409
+ }
410
+ acceptWaitingChange() {
411
+ if (this.waitingChangePromiseResolve) {
412
+ this.waitingChangePromiseResolve();
413
+ this.waitingChangePromiseReject = undefined;
414
+ this.waitingChangePromiseResolve = undefined;
415
+ }
416
+ }
417
+ rejectWaitingChange(reason) {
418
+ if (this.waitingChangePromiseReject) {
419
+ this.waitingChangePromiseReject(reason);
420
+ this.waitingChangePromiseReject = undefined;
421
+ this.waitingChangePromiseResolve = undefined;
422
+ }
423
+ }
424
+ static create(fieldName, field, startChangeCallback, cancelWaitingChangeCallback, changeCallback) {
425
+ const b = new Bind();
426
+ b.field = field;
427
+ b.fieldName = fieldName;
428
+ b.startChangeListener = (evt) => { if (b.listen)
429
+ startChangeCallback(fieldName, evt.detail); };
430
+ b.field.addEventListener(b.startChangeEventName, b.startChangeListener);
431
+ b.cancelWaitingChangeListener = () => { if (b.listen)
432
+ cancelWaitingChangeCallback(fieldName); };
433
+ b.field.addEventListener(b.cancelWaitingChangeEventName, b.cancelWaitingChangeListener);
434
+ b.changeListener = (evt) => { if (b.listen)
435
+ changeCallback(fieldName, evt.detail); };
436
+ b.field.addEventListener(b.changeEventName, b.changeListener);
437
+ return b;
438
+ }
439
+ }
440
+
441
+ export { DataBinder as D, RecordValidationProcessor as R, buildFieldMetadata as b };
@@ -0,0 +1,33 @@
1
+ class FocusResolver {
2
+ static resolveFocus(element, selectText = true) {
3
+ var _a;
4
+ if (!element)
5
+ return;
6
+ (_a = element.focus) === null || _a === void 0 ? void 0 : _a.call(element);
7
+ if (element.setFocus) {
8
+ element.setFocus({ selectText });
9
+ return;
10
+ }
11
+ this.resolveFocusOnChild(element, selectText);
12
+ }
13
+ static resolveFocusOnChild(element, selectText = true) {
14
+ var _a, _b;
15
+ if (this.isGridCell(element) && element.firstElementChild) {
16
+ this.resolveFocusOnChild(element.firstElementChild);
17
+ return;
18
+ }
19
+ if (!element || !element.classList.contains('hydrated'))
20
+ return;
21
+ const firstChild = element.firstElementChild;
22
+ if (!(firstChild === null || firstChild === void 0 ? void 0 : firstChild.focus) && !(firstChild === null || firstChild === void 0 ? void 0 : firstChild.setFocus))
23
+ return;
24
+ (_a = firstChild === null || firstChild === void 0 ? void 0 : firstChild.focus) === null || _a === void 0 ? void 0 : _a.call(firstChild);
25
+ (_b = firstChild === null || firstChild === void 0 ? void 0 : firstChild.setFocus) === null || _b === void 0 ? void 0 : _b.call(firstChild, { selectText });
26
+ }
27
+ static isGridCell(element) {
28
+ var _a;
29
+ return ((_a = element === null || element === void 0 ? void 0 : element.getAttribute) === null || _a === void 0 ? void 0 : _a.call(element, "role")) === 'gridcell';
30
+ }
31
+ }
32
+
33
+ export { FocusResolver as F };
@@ -2,7 +2,7 @@ import { r as registerInstance, c as createEvent, h, H as Host, g as getElement
2
2
  import { StringUtils, ElementIDUtils } from '@sankhyalabs/core';
3
3
  import { C as CSSVarsUtils } from './CSSVarsUtils-71ce76be.js';
4
4
 
5
- const ezCardItemCss = ":host { \n /*@doc Define o tamanho da fonte do componente.*/\n --ez-card-item--font-size: var(--text--medium, 14px);\n\n /*@doc Define o tamanho da fonte do componente no modo compacto.*/\n --ez-card-item--font-size-compacted: var(--text--extra-small, 10px);\n\n /*@doc Define a família da fonte do componente.*/\n --ez-card-item--font-family: var(--font-pattern, Arial);\n\n /*@doc Define o peso da fonte do componente.*/\n --ez-card-item--font-weight: var(--text-weight--medium, 400);\n\n /*@doc Define o peso da fonte do title do componente.*/\n --ez-card-item--font-weight-medium: var(--text-weight--medium, 400);\n\n /*@doc Define a cor da fonte do componente.*/\n --ez-card-item--color: var(--text--primary, #626e82);\n\n /*@doc Define a cor da fonte da key do componente.*/\n --ez-card-item__key--color: var(--text--primary, #626e82);\n\n /*@doc Define a cor da fonte do label do detalhe do componente.*/\n --ez-card-item__detail-label--color: var(--text--secondary, #A2ABB9);\n\n /*@doc Define o espaçamento inferior dos detalhes do componente.*/\n --ez-card-item__detail--padding-bottom: var(--space--extra-small, 3px);\n\n /*@doc Define a cor do highlight / marcação nos textos do componente.*/\n --ez-card-item__highlight--color: var(--color--primary-300, #E2F4EF);\n\n /*@doc Define o peso da fonte do componente.*/\n --ez-card-item--detail-label--font-weight: var(--text-weight--large, 400);\n\n width: 100%;\n display: flex;\n cursor: pointer;\n}\n\n.card-item {\n display: flex;\n flex-direction: column;\n width: 100%;\n cursor: pointer;\n z-index: 0;\n position: relative;\n container-type: inline-size;\n container-name: box;\n white-space: pre-line;\n}\n\n.card-item__detail {\n display: inline-block;\n width: 100%;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n opacity: var(--opacity--soft);\n cursor: pointer;\n}\n\n\n\n.card-item__expanded {\n padding: var(--space--medium);\n}\n\n.card-item:hover {\n background: #F0F3F7;\n border-radius: 12px;\n}\n\n.card-item__title {\n display: flex;\n align-items: center;\n line-height: 18px;\n cursor: pointer;\n\n /*public*/\n font-size: var(--ez-card-item--font-size);\n font-family: var(--ez-card-item--font-family);\n font-weight: var(--ez-card-item--font-weight-medium);\n color: var(--ez-card-item--color);\n gap: var(--space--small, 6px);\n}\n\n.card-item__key {\n /*public*/\n color: var(--ez-card-item__key--color);\n}\n\n.card-item__details {\n display: flex;\n flex-direction: column;\n cursor: pointer;\n justify-content: space-between;\n width: 100%;\n}\n\n.card-item__details-container__left {\n display: flex;\n flex-direction: column;\n white-space: pre-line;\n cursor: pointer;\n width: 50%;\n}\n\n.card-item__details-container__right {\n display: flex;\n flex-direction: column;\n white-space: pre-line;\n width: 50%;\n cursor: pointer;\n}\n\n.card-item__detail-default:not(:last-child) {\n padding-bottom: var(--ez-card-item__detail--padding-bottom);\n}\n\n.card-item__detail-label {\n cursor: pointer;\n\n /*public*/\n font-size: var(--ez-card-item--font-size);\n font-family: var(--ez-card-item--font-family);\n font-weight: var(--ez-card-item--detail-label--font-weight);\n}\n\n.card-item__detail-value {\n cursor: pointer;\n line-break: anywhere;\n\n /*public*/\n font-size: var(--ez-card-item--font-size);\n font-family: var(--ez-card-item--font-family);\n font-weight: var(--ez-card-item--font-weight);\n}\n\n.card-item__highlight {\n position: relative;\n border-radius: 8px;\n z-index: -1;\n\n /*public*/\n background-color: var(--ez-card-item__highlight--color);\n outline: 2px solid var(--ez-card-item__highlight--color);\n box-shadow: -4px 0px 0px 0px var(--ez-card-item__highlight--color), \n 4px 0px 0px 0px var(--ez-card-item__highlight--color);\n}\n\n.card-item__content{\n display: flex;\n align-items: center;\n}\n\n.card-item__details-container_default{\n display: flex;\n}\n\n.card-item__details-slot{\n margin-left: auto;\n}\n\n/* Modo compacto */\n.card-item__compacted {\n padding: var(--space--2xs, 8px) var(--space--3xs, 4px);\n}\n\n.card-item__detail-label-compacted {\n font-size: var(--ez-card-item--font-size-compacted);\n}\n\n.card-item__detail-value-compacted {\n font-size: var(--ez-card-item--font-size-compacted);\n}\n\n.card-item__title-compacted {\n font-size: var(--ez-card-item--font-size-compacted);\n}\n\n.card-item__details-container__left-compacted{\n width: 100%;\n}\n\n.card-item__details-container__right-compacted {\n width: 100%;\n}\n\n\n@container box (max-width: 550px) {\n .card-item__details {\n flex-direction: column;\n }\n\n .card-item__details-container__left {\n width: 100%;\n }\n \n .card-item__details-container__right {\n width: 100%;\n }\n}\n\n@container box (max-width: 200px) {\n .card-item__title {\n font-size: 10px;\n }\n\n .card-item__detail-label {\n font-size: 10px;\n }\n\n .card-item__detail-value {\n font-size: 10px;\n }\n\n}";
5
+ const ezCardItemCss = ":host { \n /*@doc Define o tamanho da fonte do componente.*/\n --ez-card-item--font-size: var(--text--medium, 14px);\n\n /*@doc Define o tamanho da fonte do componente no modo compacto.*/\n --ez-card-item--font-size-compacted: var(--text--extra-small, 10px);\n\n /*@doc Define a família da fonte do componente.*/\n --ez-card-item--font-family: var(--font-pattern, Arial);\n\n /*@doc Define o peso da fonte do componente.*/\n --ez-card-item--font-weight: var(--text-weight--medium, 400);\n\n /*@doc Define o peso da fonte do title do componente.*/\n --ez-card-item--font-weight-large: var(--text-weight--large, 600);\n\n /*@doc Define a cor da fonte do componente.*/\n --ez-card-item--color: var(--text--primary, #626e82);\n\n /*@doc Define a cor da fonte da key do componente.*/\n --ez-card-item__key--color: var(--text--primary, #626e82);\n\n /*@doc Define a cor da fonte do label do detalhe do componente.*/\n --ez-card-item__detail-label--color: var(--text--secondary, #A2ABB9);\n\n /*@doc Define o espaçamento inferior dos detalhes do componente.*/\n --ez-card-item__detail--padding-bottom: var(--space--extra-small, 3px);\n\n /*@doc Define o espaçamento inferior do title do componente.*/\n --ez-card-item__title--padding-bottom: var(--space--extra-small, 3px);\n\n /*@doc Define a cor do highlight / marcação nos textos do componente.*/\n --ez-card-item__highlight--color: var(--color--primary-300, #E2F4EF);\n\n /*@doc Define o peso da fonte do componente.*/\n --ez-card-item--detail-label--font-weight: var(--text-weight--large, 400);\n\n width: 100%;\n display: flex;\n cursor: pointer;\n}\n\n.card-item {\n display: flex;\n flex-direction: column;\n width: 100%;\n cursor: pointer;\n z-index: 0;\n position: relative;\n container-type: inline-size;\n container-name: box;\n white-space: pre-line;\n}\n\n.card-item__detail{\n display: inline-block;\n width: 100%;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n opacity: var(--opacity--soft);\n}\n\n\n\n.card-item__expanded {\n padding: var(--space--medium);\n}\n\n.card-item:hover {\n background: #F0F3F7;\n border-radius: 12px;\n}\n\n.card-item__title {\n display: flex;\n align-items: center;\n line-height: 18px;\n cursor: pointer;\n\n /*public*/\n font-size: var(--ez-card-item--font-size);\n font-family: var(--ez-card-item--font-family);\n font-weight: var(--ez-card-item--font-weight-large);\n color: var(--ez-card-item--color);\n padding-bottom: var(--ez-card-item__title--padding-bottom);\n gap: var(--space--small, 6px);\n}\n\n.card-item__key {\n /*public*/\n color: var(--ez-card-item__key--color);\n}\n\n.card-item__details {\n display: flex;\n flex-direction: column;\n cursor: pointer;\n justify-content: space-between;\n width: 100%;\n}\n\n.card-item__details-container__left {\n display: flex;\n flex-direction: column;\n white-space: pre-line;\n cursor: pointer;\n width: 50%;\n}\n\n.card-item__details-container__right {\n display: flex;\n flex-direction: column;\n white-space: pre-line;\n width: 50%;\n cursor: pointer;\n}\n\n.card-item__detail{\n cursor: pointer;\n}\n\n.card-item__detail-default:not(:last-child) {\n padding-bottom: var(--ez-card-item__detail--padding-bottom);\n}\n\n.card-item__detail-label {\n cursor: pointer;\n\n /*public*/\n font-size: var(--ez-card-item--font-size);\n font-family: var(--ez-card-item--font-family);\n font-weight: var(--ez-card-item--detail-label--font-weight);\n}\n\n.card-item__detail-value {\n cursor: pointer;\n line-break: anywhere;\n\n /*public*/\n font-size: var(--ez-card-item--font-size);\n font-family: var(--ez-card-item--font-family);\n font-weight: var(--ez-card-item--font-weight);\n}\n\n.card-item__highlight {\n position: relative;\n border-radius: 8px;\n z-index: -1;\n\n /*public*/\n background-color: var(--ez-card-item__highlight--color);\n outline: 2px solid var(--ez-card-item__highlight--color);\n box-shadow: -4px 0px 0px 0px var(--ez-card-item__highlight--color), \n 4px 0px 0px 0px var(--ez-card-item__highlight--color);\n}\n\n.card-item__content{\n display: flex;\n align-items: center;\n}\n\n.card-item__details-container_default{\n display: flex;\n}\n\n.card-item__details-slot{\n margin-left: auto;\n}\n\n/* Modo compacto */\n.card-item__compacted {\n padding: var(--space--medium);\n padding-bottom: 0px;\n padding-right: 0px;\n}\n\n.card-item__detail-label-compacted {\n font-size: var(--ez-card-item--font-size-compacted);\n}\n\n.card-item__detail-value-compacted {\n font-size: var(--ez-card-item--font-size-compacted);\n}\n\n.card-item__title-compacted {\n font-size: var(--ez-card-item--font-size-compacted);\n}\n\n.card-item__details-container__left-compacted{\n width: 100%;\n}\n\n.card-item__details-container__right-compacted {\n width: 100%;\n}\n\n\n@container box (max-width: 550px) {\n .card-item__details {\n flex-direction: column;\n }\n\n .card-item__details-container__left {\n width: 100%;\n }\n \n .card-item__details-container__right {\n width: 100%;\n }\n}\n\n@container box (max-width: 200px) {\n .card-item__title {\n font-size: 10px;\n }\n\n .card-item__detail-label {\n font-size: 10px;\n }\n\n .card-item__detail-value {\n font-size: 10px;\n }\n\n}";
6
6
 
7
7
  const EzCardItem = class {
8
8
  constructor(hostRef) {
@@ -56,7 +56,7 @@ const EzCardItem = class {
56
56
  };
57
57
  EzCardItem.style = ezCardItemCss;
58
58
 
59
- const ezFilterInputCss = ":host{--ez-filter-slot--right--width:70px;display:block;width:100%}.pointerCursor{cursor:pointer}ez-text-input{--ez-text-input__icon--right--width:var(--ez-filter-slot--right--width)}";
59
+ const ezFilterInputCss = ":host{display:block;width:100%}";
60
60
 
61
61
  const EzFilterInput = class {
62
62
  constructor(hostRef) {
@@ -64,19 +64,15 @@ const EzFilterInput = class {
64
64
  this.ezChange = createEvent(this, "ezChange", 7);
65
65
  this.ezSearching = createEvent(this, "ezSearching", 7);
66
66
  this.ezFocusIn = createEvent(this, "ezFocusIn", 7);
67
- this.ezIconClick = createEvent(this, "ezIconClick", 7);
68
67
  this._searchingText = "";
69
68
  this.handleFocus = () => {
70
- this.ezFocusIn.emit();
71
- if (!this.asyncSearch) {
72
- return;
73
- }
74
69
  if (this._searchingText === "") {
75
70
  this._textInput.value = "";
76
71
  }
77
72
  else {
78
73
  this._textInput.value = this._searchingText;
79
74
  }
75
+ this.ezFocusIn.emit();
80
76
  };
81
77
  this.label = undefined;
82
78
  this.value = undefined;
@@ -86,7 +82,7 @@ const EzFilterInput = class {
86
82
  this.mode = "regular";
87
83
  this.asyncSearch = false;
88
84
  this.canShowError = true;
89
- this.enabledIconClick = false;
85
+ this.autoFocus = false;
90
86
  }
91
87
  observeLabel() {
92
88
  if (this._textInput) {
@@ -107,8 +103,8 @@ const EzFilterInput = class {
107
103
  /**
108
104
  * Aplica o foco no campo.
109
105
  */
110
- async setFocus() {
111
- this._textInput.setFocus();
106
+ async setFocus(options) {
107
+ this._textInput.setFocus(options);
112
108
  }
113
109
  /**
114
110
  * Remove o foco do campo.
@@ -148,14 +144,6 @@ const EzFilterInput = class {
148
144
  this._textInput.value = this.value;
149
145
  }
150
146
  }
151
- /**
152
- * Método usado para emitir o evento de clique no ícone
153
- */
154
- async handleIconClick() {
155
- if (this.enabledIconClick) {
156
- this.ezIconClick.emit(true);
157
- }
158
- }
159
147
  handleChange(evt) {
160
148
  const newValue = evt.detail;
161
149
  this.errorMessage = "";
@@ -169,10 +157,15 @@ const EzFilterInput = class {
169
157
  }
170
158
  componentDidLoad() {
171
159
  CSSVarsUtils.applyVarsTextInput(this._elem, this._textInput);
160
+ if (this.autoFocus) {
161
+ requestAnimationFrame(() => {
162
+ this.setFocus({ selectText: true });
163
+ });
164
+ }
172
165
  }
173
166
  render() {
174
167
  ElementIDUtils.addIDInfoIfNotExists(this._elem, 'input');
175
- return (h("ez-text-input", { "data-element-id": ElementIDUtils.getInternalIDInfo("textInput"), ref: elem => this._textInput = elem, label: this.label, onEzChange: evt => this.handleChange(evt), value: this.value, enabled: this.enabled, errorMessage: this.errorMessage, restrict: this.restrict, mode: this.mode, onFocusin: this.handleFocus, canShowError: this.canShowError }, h("ez-icon", { slot: "leftIcon", iconName: "search", onClick: () => this.handleIconClick(), class: this.enabledIconClick ? 'pointerCursor' : '' }), h("slot", { name: "right", slot: "rightIcon" })));
168
+ return (h("ez-text-input", { "data-element-id": ElementIDUtils.getInternalIDInfo("textInput"), ref: elem => this._textInput = elem, label: this.label, onEzChange: evt => this.handleChange(evt), value: this.value, enabled: this.enabled, errorMessage: this.errorMessage, restrict: this.restrict, mode: this.mode, onFocusin: this.handleFocus, canShowError: this.canShowError }, h("ez-icon", { slot: "leftIcon", iconName: "search" })));
176
169
  }
177
170
  get _elem() { return getElement(this); }
178
171
  static get watchers() { return {