@sankhyalabs/sankhyablocks 8.16.0-dev.104 → 8.16.0-dev.106

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 (107) hide show
  1. package/dist/cjs/{ClientSideExporterProvider-8c219037.js → ClientSideExporterProvider-a2753c93.js} +3 -3
  2. package/dist/cjs/{SnkMessageBuilder-bae64d0d.js → SnkMessageBuilder-aecd7c18.js} +31 -24
  3. package/dist/cjs/{dataunit-fetcher-4a5d491a.js → dataunit-fetcher-a723f0dc.js} +5 -2
  4. package/dist/cjs/loader.cjs.js +1 -1
  5. package/dist/cjs/pesquisa-grid_2.cjs.entry.js +1 -1
  6. package/dist/cjs/sankhyablocks.cjs.js +1 -1
  7. package/dist/cjs/snk-actions-button_7.cjs.entry.js +1 -1
  8. package/dist/cjs/snk-application.cjs.entry.js +2 -2
  9. package/dist/cjs/snk-attach.cjs.entry.js +2 -2
  10. package/dist/cjs/snk-crud.cjs.entry.js +19 -11
  11. package/dist/cjs/snk-data-exporter.cjs.entry.js +3 -3
  12. package/dist/cjs/{snk-data-unit-4b510d6e.js → snk-data-unit-ebfdb9ba.js} +226 -12
  13. package/dist/cjs/snk-data-unit.cjs.entry.js +3 -3
  14. package/dist/cjs/snk-detail-view.cjs.entry.js +4 -4
  15. package/dist/cjs/snk-grid.cjs.entry.js +23 -9
  16. package/dist/cjs/{snk-guides-viewer-e8e5f7b4.js → snk-guides-viewer-fd39f437.js} +99 -44
  17. package/dist/cjs/snk-guides-viewer.cjs.entry.js +3 -3
  18. package/dist/cjs/snk-pesquisa.cjs.entry.js +1 -1
  19. package/dist/cjs/snk-simple-crud.cjs.entry.js +67 -24
  20. package/dist/cjs/snk-taskbar.cjs.entry.js +2 -1
  21. package/dist/cjs/{taskbar-elements-7e19882d.js → taskbar-elements-02379452.js} +3 -0
  22. package/dist/collection/components/snk-crud/snk-crud.js +35 -9
  23. package/dist/collection/components/snk-crud/subcomponents/snk-guides-viewer.js +117 -43
  24. package/dist/collection/components/snk-data-unit/MultipleUpdateHelper.js +128 -0
  25. package/dist/collection/components/snk-data-unit/snk-data-unit.js +107 -12
  26. package/dist/collection/components/snk-grid/filtercolumn/SnkMultiSelectionListDataSource.js +2 -2
  27. package/dist/collection/components/snk-grid/snk-grid.js +38 -6
  28. package/dist/collection/components/snk-simple-crud/snk-simple-crud.js +83 -22
  29. package/dist/collection/components/snk-taskbar/elements/taskbar-elements.js +3 -0
  30. package/dist/collection/components/snk-taskbar/snk-taskbar.js +2 -2
  31. package/dist/collection/lib/http/data-fetcher/fetchers/data-unit/cache/PreloadManager.js +5 -2
  32. package/dist/collection/lib/message/SnkMessageBuilder.js +1 -0
  33. package/dist/collection/lib/message/resources/snk-data-unit.msg.js +28 -23
  34. package/dist/collection/lib/message/resources/snk-taskbar.msg.js +1 -0
  35. package/dist/components/ContinuousInsertUtils.js +2 -2
  36. package/dist/components/SnkMessageBuilder.js +31 -24
  37. package/dist/components/dataunit-fetcher.js +5 -2
  38. package/dist/components/snk-crud.js +18 -9
  39. package/dist/components/snk-data-unit2.js +225 -11
  40. package/dist/components/snk-detail-view2.js +98 -43
  41. package/dist/components/snk-grid2.js +21 -6
  42. package/dist/components/snk-simple-crud2.js +66 -22
  43. package/dist/components/snk-taskbar2.js +4 -0
  44. package/dist/esm/{ClientSideExporterProvider-a37f890b.js → ClientSideExporterProvider-b3871edb.js} +3 -3
  45. package/dist/esm/{SnkMessageBuilder-6fff4a4c.js → SnkMessageBuilder-12f5fe1a.js} +31 -24
  46. package/dist/esm/{dataunit-fetcher-1d02ecfc.js → dataunit-fetcher-0e025732.js} +5 -2
  47. package/dist/esm/loader.js +1 -1
  48. package/dist/esm/pesquisa-grid_2.entry.js +1 -1
  49. package/dist/esm/sankhyablocks.js +1 -1
  50. package/dist/esm/snk-actions-button_7.entry.js +1 -1
  51. package/dist/esm/snk-application.entry.js +2 -2
  52. package/dist/esm/snk-attach.entry.js +2 -2
  53. package/dist/esm/snk-crud.entry.js +19 -11
  54. package/dist/esm/snk-data-exporter.entry.js +3 -3
  55. package/dist/esm/{snk-data-unit-7d0ce406.js → snk-data-unit-03654813.js} +226 -12
  56. package/dist/esm/snk-data-unit.entry.js +3 -3
  57. package/dist/esm/snk-detail-view.entry.js +4 -4
  58. package/dist/esm/snk-grid.entry.js +23 -9
  59. package/dist/esm/{snk-guides-viewer-c44b3839.js → snk-guides-viewer-75e06feb.js} +100 -45
  60. package/dist/esm/snk-guides-viewer.entry.js +3 -3
  61. package/dist/esm/snk-pesquisa.entry.js +1 -1
  62. package/dist/esm/snk-simple-crud.entry.js +68 -25
  63. package/dist/esm/snk-taskbar.entry.js +2 -1
  64. package/dist/esm/{taskbar-elements-d2353c64.js → taskbar-elements-c62b6c66.js} +3 -0
  65. package/dist/sankhyablocks/{p-35f85998.entry.js → p-1a51dfde.entry.js} +1 -1
  66. package/dist/sankhyablocks/{p-ef6f0a1b.entry.js → p-1c29409b.entry.js} +1 -1
  67. package/dist/sankhyablocks/{p-5503e89f.entry.js → p-271c86d3.entry.js} +1 -1
  68. package/dist/sankhyablocks/p-2d6df7e7.entry.js +1 -0
  69. package/dist/sankhyablocks/p-41da5310.js +1 -0
  70. package/dist/sankhyablocks/{p-b2a2a83e.entry.js → p-4a93daef.entry.js} +1 -1
  71. package/dist/sankhyablocks/p-65be98c5.entry.js +1 -0
  72. package/dist/sankhyablocks/{p-6541bb6d.entry.js → p-6a0c8ce0.entry.js} +1 -1
  73. package/dist/sankhyablocks/p-7993b2e3.js +60 -0
  74. package/dist/sankhyablocks/{p-754559b9.entry.js → p-7cd5c315.entry.js} +1 -1
  75. package/dist/sankhyablocks/p-80f8c22c.js +1 -0
  76. package/dist/sankhyablocks/p-885802c3.js +1 -0
  77. package/dist/sankhyablocks/p-ab0caed6.entry.js +1 -0
  78. package/dist/sankhyablocks/{p-38e3ffda.entry.js → p-ad07f0c5.entry.js} +1 -1
  79. package/dist/sankhyablocks/p-cc8c3bca.entry.js +1 -0
  80. package/dist/sankhyablocks/{p-3b190fb1.entry.js → p-d31a701e.entry.js} +1 -1
  81. package/dist/sankhyablocks/{p-00796b12.entry.js → p-dc6ad9a6.entry.js} +1 -1
  82. package/dist/sankhyablocks/p-f4d5bb7f.js +1 -0
  83. package/dist/sankhyablocks/p-fb0f0087.js +1 -0
  84. package/dist/sankhyablocks/sankhyablocks.esm.js +1 -1
  85. package/dist/types/components/snk-crud/snk-crud.d.ts +4 -0
  86. package/dist/types/components/snk-crud/subcomponents/snk-guides-viewer.d.ts +10 -1
  87. package/dist/types/components/snk-data-unit/MultipleUpdateHelper.d.ts +9 -0
  88. package/dist/types/components/snk-data-unit/snk-data-unit.d.ts +17 -0
  89. package/dist/types/components/snk-grid/filtercolumn/SnkMultiSelectionListDataSource.d.ts +2 -1
  90. package/dist/types/components/snk-grid/snk-grid.d.ts +5 -0
  91. package/dist/types/components/snk-simple-crud/snk-simple-crud.d.ts +9 -2
  92. package/dist/types/components/snk-taskbar/elements/taskbar-elements.d.ts +2 -1
  93. package/dist/types/components/snk-taskbar/snk-taskbar.d.ts +1 -0
  94. package/dist/types/components.d.ts +28 -0
  95. package/dist/types/lib/http/data-fetcher/fetchers/data-unit/cache/PreloadManager.d.ts +1 -1
  96. package/dist/types/lib/message/SnkMessageBuilder.d.ts +2 -1
  97. package/package.json +1 -1
  98. package/dist/sankhyablocks/p-17425c72.js +0 -1
  99. package/dist/sankhyablocks/p-3fc82614.js +0 -1
  100. package/dist/sankhyablocks/p-460f1827.entry.js +0 -1
  101. package/dist/sankhyablocks/p-6e0a5314.js +0 -1
  102. package/dist/sankhyablocks/p-835128f5.entry.js +0 -1
  103. package/dist/sankhyablocks/p-8fa828b5.js +0 -1
  104. package/dist/sankhyablocks/p-92778d5a.js +0 -1
  105. package/dist/sankhyablocks/p-a8be1d67.js +0 -60
  106. package/dist/sankhyablocks/p-a962a3e4.entry.js +0 -1
  107. package/dist/sankhyablocks/p-e35fe2bd.entry.js +0 -1
@@ -6,6 +6,135 @@ import { g as getRecordValue, a as DatasetStrategy } from './dataunit-fetcher.js
6
6
  import { convertType } from '@sankhyalabs/core/dist/dataunit/metadata/DataType';
7
7
  import { g as getSelectedRecordsIDsInfo } from './GetSelectedRecordsIDsInfo.js';
8
8
 
9
+ const NO_TAB_NAME = "__NO_TAB_NAME__";
10
+ const MAIN_TAB_NAME = "__main";
11
+ async function showConfirmMultipleUpdatePopup({ title, labelBtnConfirm, labelBtnCancel, message, changingFields, }) {
12
+ return new Promise((resolve) => {
13
+ const popup = builPopup(title, resolve);
14
+ const contentContainer = buildContentContainer();
15
+ contentContainer.appendChild(buildMessage(message));
16
+ contentContainer.appendChild(buildChangesContainer(changingFields));
17
+ const actionsContainer = buildActionsContainer();
18
+ actionsContainer.appendChild(buildCancelBtn(popup, labelBtnCancel, resolve));
19
+ actionsContainer.appendChild(buildConfirmBtn(popup, labelBtnConfirm, resolve));
20
+ contentContainer.appendChild(actionsContainer);
21
+ popup.appendChild(contentContainer);
22
+ document.body.appendChild(popup);
23
+ });
24
+ }
25
+ function groupChanges(changingFields) {
26
+ const changesMap = new Map();
27
+ changingFields.forEach(change => {
28
+ var _a;
29
+ const key = (_a = change.tabName) !== null && _a !== void 0 ? _a : NO_TAB_NAME;
30
+ if (!changesMap.has(key))
31
+ changesMap.set(key, []);
32
+ changesMap.get(key).push(change);
33
+ });
34
+ return changesMap;
35
+ }
36
+ function getTabName(tabName) {
37
+ switch (tabName) {
38
+ case NO_TAB_NAME:
39
+ return "";
40
+ case MAIN_TAB_NAME:
41
+ return "Principal";
42
+ default:
43
+ return tabName;
44
+ }
45
+ }
46
+ function buildChangesDiv(tabName, changes) {
47
+ const changeLabel = document.createElement('span');
48
+ changeLabel.innerText = getTabName(tabName);
49
+ changeLabel.style.display = 'block';
50
+ changeLabel.style.fontWeight = 'var(--text-weight--large, 500)';
51
+ changeLabel.style.fontSize = 'var(--text--medium, 14px)';
52
+ changeLabel.style.marginBottom = 'var(--space--small, 6px)';
53
+ const changeDiv = document.createElement('div');
54
+ changeDiv.style.padding = 'var(--space--medium, 12px) 0';
55
+ changeDiv.style.borderTop = '1px solid var(--color--disable-secondary, #f2f5f8)';
56
+ changeDiv.appendChild(changeLabel);
57
+ changes.forEach(change => {
58
+ const changeLine = document.createElement('span');
59
+ changeLine.innerHTML = `${change.label}: <span style="color: var(--text--primary, #626e82)">${change.value}</span>`;
60
+ changeLine.style.display = 'block';
61
+ changeLine.style.marginBottom = 'var(--space--extra-small, 3px)';
62
+ changeDiv.appendChild(changeLine);
63
+ });
64
+ return changeDiv;
65
+ }
66
+ function buildChangesContainer(changingFields) {
67
+ const changesContainer = document.createElement('div');
68
+ changesContainer.style.flexDirection = 'column';
69
+ changesContainer.style.display = 'flex';
70
+ changesContainer.style.overflow = 'auto';
71
+ changesContainer.style.maxHeight = '300px';
72
+ const changesMap = groupChanges(changingFields);
73
+ changesMap.forEach((changes, key) => {
74
+ changesContainer.appendChild(buildChangesDiv(key, changes));
75
+ });
76
+ return changesContainer;
77
+ }
78
+ function buildMessage(messageContent) {
79
+ const message = document.createElement('p');
80
+ message.textContent = messageContent;
81
+ message.style.fontSize = 'var(--text--medium, 14px)';
82
+ return message;
83
+ }
84
+ function buildContentContainer() {
85
+ const contentContainer = document.createElement('div');
86
+ contentContainer.style.display = 'flex';
87
+ contentContainer.style.flexDirection = 'column';
88
+ contentContainer.style.fontFamily = 'var(--font-pattern, Roboto)';
89
+ contentContainer.style.fontSize = 'var(--text--medium, 14px)';
90
+ return contentContainer;
91
+ }
92
+ function buildActionsContainer() {
93
+ const actionsContainer = document.createElement('div');
94
+ actionsContainer.style.display = 'flex';
95
+ actionsContainer.style.flexDirection = 'row';
96
+ actionsContainer.style.justifyContent = 'flex-end';
97
+ actionsContainer.style.gap = '5px';
98
+ return actionsContainer;
99
+ }
100
+ function builPopup(title, resolve) {
101
+ const popup = document.createElement('ez-popup');
102
+ popup.opened = true;
103
+ popup.size = 'small';
104
+ popup.ezTitle = title;
105
+ popup.heightMode = 'auto';
106
+ popup.addEventListener('ezClosePopup', () => {
107
+ document.body.removeChild(popup);
108
+ resolve(false);
109
+ }, { once: true });
110
+ popup.addEventListener('ezPopupAction', () => {
111
+ document.body.removeChild(popup);
112
+ resolve(false);
113
+ }, { once: true });
114
+ return popup;
115
+ }
116
+ function buildConfirmBtn(popup, confirmBtnLabel, resolve) {
117
+ const confirmBtn = document.createElement('ez-button');
118
+ confirmBtn.label = confirmBtnLabel;
119
+ confirmBtn.size = 'medium';
120
+ confirmBtn.classList.add('ez-button--primary');
121
+ confirmBtn.onclick = () => {
122
+ document.body.removeChild(popup);
123
+ resolve(true);
124
+ };
125
+ return confirmBtn;
126
+ }
127
+ function buildCancelBtn(popup, cancelBtnLabel, resolve) {
128
+ const cancelBtn = document.createElement('ez-button');
129
+ cancelBtn.label = cancelBtnLabel;
130
+ cancelBtn.size = 'medium';
131
+ cancelBtn.onclick = () => {
132
+ document.body.removeChild(popup);
133
+ resolve(false);
134
+ };
135
+ return cancelBtn;
136
+ }
137
+
9
138
  const SnkDataUnit = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
10
139
  constructor() {
11
140
  super();
@@ -22,6 +151,7 @@ const SnkDataUnit = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
22
151
  this._fieldsWithRmPrecision = [];
23
152
  this._metadataByRow = new Map();
24
153
  this._rowMetadataCache = new Map();
154
+ this._formFieldsConfig = [];
25
155
  this.REGEX_DATAUNIT_NAME = /dd:\/\/(.+?)\//;
26
156
  this._dataUnitObserver = async (action) => {
27
157
  const duState = await this.buildDataState(action.type);
@@ -98,6 +228,10 @@ const SnkDataUnit = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
98
228
  this.messagesBuilderUpdated.emit(newValue);
99
229
  }
100
230
  }
231
+ onMasterFormConfigChange({ detail }) {
232
+ var _a;
233
+ this._formFieldsConfig = (_a = detail === null || detail === void 0 ? void 0 : detail.fields) !== null && _a !== void 0 ? _a : [];
234
+ }
101
235
  /**
102
236
  * Obtém o dataUnit.
103
237
  */
@@ -272,9 +406,13 @@ const SnkDataUnit = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
272
406
  this._openedAlert = false;
273
407
  }
274
408
  async interceptSavingData(action) {
275
- if (!this.beforeSave) {
276
- return action;
409
+ if (this.dataUnit.isMultipleEdition) {
410
+ const confirm = await this.confirmMultipleSavingData();
411
+ if (!confirm)
412
+ return undefined;
277
413
  }
414
+ if (!this.beforeSave)
415
+ return action;
278
416
  const continueAction = this.beforeSave(this.dataUnit);
279
417
  if (continueAction instanceof Promise) {
280
418
  const result = await continueAction;
@@ -282,6 +420,46 @@ const SnkDataUnit = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
282
420
  }
283
421
  return continueAction ? action : undefined;
284
422
  }
423
+ async confirmMultipleSavingData() {
424
+ const selectedRecords = this.dataUnit.getSelectionInfo().records;
425
+ const title = this.getMessage('snkDataUnit.multipleUpdateConfirmationTitle');
426
+ const message = this.getMessage('snkDataUnit.multipleUpdateConfirmationMessage', { size: selectedRecords.length });
427
+ const labelBtnCancel = this.getMessage('snkDataUnit.confirm.cancel');
428
+ const labelBtnConfirm = this.getMessage('snkDataUnit.confirm.updateMultipleConfirm');
429
+ return await showConfirmMultipleUpdatePopup({
430
+ title,
431
+ message,
432
+ labelBtnConfirm,
433
+ labelBtnCancel,
434
+ changingFields: this.getChangingFields(),
435
+ });
436
+ }
437
+ getChangingFields() {
438
+ const changes = this.dataUnit.buildChangesToSave();
439
+ if (!(changes === null || changes === void 0 ? void 0 : changes.length))
440
+ return [];
441
+ const change = changes[0];
442
+ const changingFields = Object.keys(change.updatingFields).map(key => this.buildChangingField(key, change[key]));
443
+ return changingFields;
444
+ }
445
+ buildChangingField(key, value) {
446
+ const fieldLabel = this.dataUnit.getField(key).label;
447
+ const formattedValue = this.dataUnit.getFormattedValue(key, value);
448
+ return {
449
+ label: fieldLabel,
450
+ value: formattedValue,
451
+ tabName: this.getFieldTabName(key),
452
+ };
453
+ }
454
+ getFieldTabName(fieldName) {
455
+ var _a;
456
+ const tab = (_a = this._formFieldsConfig.find(f => f.name === fieldName)) === null || _a === void 0 ? void 0 : _a.tab;
457
+ if (!tab)
458
+ return undefined;
459
+ if (typeof tab === 'string')
460
+ return tab;
461
+ return tab.label;
462
+ }
285
463
  interceptDataSaved(action) {
286
464
  if (this.afterSave) {
287
465
  this.afterSave(this.dataUnit);
@@ -301,7 +479,17 @@ const SnkDataUnit = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
301
479
  }
302
480
  const cancelConfirmationTitle = this.getMessage("snkDataUnit.cancelConfirmationTitle");
303
481
  const confirm = await ApplicationUtils.confirm(cancelConfirmationTitle, cancelConfirmation);
304
- confirm && this.showSuccessMessage(this.getMessage("snkDataUnit.cancelInfo"));
482
+ if (confirm) {
483
+ let editionCanceledMessage;
484
+ if (this.dataUnit.isMultipleEdition) {
485
+ const selectedRecords = this.dataUnit.getSelectionInfo().records;
486
+ editionCanceledMessage = this.buildMultipleUpdateMessage(selectedRecords, true);
487
+ }
488
+ else {
489
+ editionCanceledMessage = this.getMessage("snkDataUnit.cancelInfo");
490
+ }
491
+ this.showSuccessMessage(editionCanceledMessage);
492
+ }
305
493
  return confirm ? action : undefined;
306
494
  }
307
495
  async interceptRemovingRecords(action) {
@@ -479,24 +667,50 @@ const SnkDataUnit = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
479
667
  }
480
668
  async handleDataSaved(action) {
481
669
  var _a, _b, _c;
482
- const newRowMetadata = await this.handleLoadRowMetadata((_c = (_b = (_a = action === null || action === void 0 ? void 0 : action.payload) === null || _a === void 0 ? void 0 : _a.changes) === null || _b === void 0 ? void 0 : _b[0]) === null || _c === void 0 ? void 0 : _c.record);
670
+ const changes = (_a = action === null || action === void 0 ? void 0 : action.payload) === null || _a === void 0 ? void 0 : _a.changes;
671
+ const affectedRecords = (_b = action === null || action === void 0 ? void 0 : action.payload) === null || _b === void 0 ? void 0 : _b.records;
672
+ const newRowMetadata = await this.handleLoadRowMetadata((_c = changes === null || changes === void 0 ? void 0 : changes[0]) === null || _c === void 0 ? void 0 : _c.record);
483
673
  if (newRowMetadata) {
484
674
  newRowMetadata.getProp = this.buildGetPropRowMetadata(newRowMetadata);
485
675
  }
486
- const recordId = action.payload.records[0].__record__id__;
676
+ const recordId = affectedRecords[0].__record__id__;
487
677
  this._metadataByRow.set(recordId, newRowMetadata);
488
678
  this.dataState = await this.buildDataState();
489
- let saveOperation = action.payload.changes[0]._operation.toLowerCase();
490
- if (saveOperation == 'copy')
679
+ let saveOperation = changes[0]._operation.toLowerCase();
680
+ if (saveOperation == 'copy') {
491
681
  saveOperation = OperationMap.CLONE;
492
- if (this.ignoreSaveMessage && ![OperationMap.CLONE, OperationMap.INSERT].includes(saveOperation)) {
493
- return;
494
682
  }
495
- const msg = this.getMessage("snkDataUnit.saveInfo", action.payload.records[0], saveOperation);
683
+ if (this.canIgnoreOperationMessage(saveOperation))
684
+ return;
685
+ let msg = this.buildOperationMessage(saveOperation, affectedRecords);
496
686
  if (msg != undefined) {
497
687
  this.showSuccessMessage(msg);
498
688
  }
499
689
  }
690
+ canIgnoreOperationMessage(saveOperation) {
691
+ return this.ignoreSaveMessage && !this.isCloneOrInsertOperation(saveOperation);
692
+ }
693
+ isCloneOrInsertOperation(saveOperation) {
694
+ return [OperationMap.CLONE, OperationMap.INSERT].includes(saveOperation);
695
+ }
696
+ buildOperationMessage(saveOperation, records) {
697
+ if (this.isMultiplesUpdate(saveOperation, records)) {
698
+ return this.buildMultipleUpdateMessage(records);
699
+ }
700
+ return this.getMessage('snkDataUnit.saveInfo', records[0], saveOperation);
701
+ }
702
+ buildMultipleUpdateMessage(records, isCancel) {
703
+ /**
704
+ * FIXME: No futuro, precisamos pensar em um mecanismo para deixar as mensagens de feedback mais dinâmicas.
705
+ * Podemo ocorrer cenários onde temos mais de um registro selecionado e também cenários onde a chave primária
706
+ * de um registro se trata de uma chave composta.
707
+ */
708
+ const key = `snkDataUnit.${isCancel ? 'cancelInfo' : 'saveInfo'}`;
709
+ return this.getMessage(key, { records: records }, OperationMap.UPDATE_MULTIPLES);
710
+ }
711
+ isMultiplesUpdate(saveOperation, records) {
712
+ return saveOperation === OperationMap.UPDATE && records.length > 1;
713
+ }
500
714
  handleRecordsRemoved(action) {
501
715
  var _a, _b;
502
716
  let removeFinishMsg = this.buildRemoveFinishMessage(action);
@@ -703,7 +917,7 @@ const SnkDataUnit = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
703
917
  "getFieldsWithRmp": [64],
704
918
  "getFieldsWithRmPrecision": [64],
705
919
  "getRowMetadata": [64]
706
- }]);
920
+ }, [[0, "snkMasterFormConfigChange", "onMasterFormConfigChange"]]]);
707
921
  class DataStateImpl {
708
922
  constructor(datastate) {
709
923
  this.copyMode = datastate.copyMode;
@@ -1,5 +1,5 @@
1
1
  import { proxyCustomElement, HTMLElement, createEvent, h, Fragment, forceUpdate, Host } from '@stencil/core/internal/client';
2
- import { Action, ElementIDUtils } from '@sankhyalabs/core';
2
+ import { ObjectUtils, Action, ElementIDUtils } from '@sankhyalabs/core';
3
3
  import { S as SnkFormConfigManager } from './SnkFormConfigManager.js';
4
4
  import { buildFormMetadata, FormMetadata } from '@sankhyalabs/ezui/dist/collection/utils/form';
5
5
  import './DataFetcher.js';
@@ -53,6 +53,7 @@ const SnkGuidesViewer = /*@__PURE__*/ proxyCustomElement(class extends HTMLEleme
53
53
  constructor() {
54
54
  super();
55
55
  this.__registerHost();
56
+ this.snkMasterFormConfigChange = createEvent(this, "snkMasterFormConfigChange", 7);
56
57
  this.exit = createEvent(this, "exit", 7);
57
58
  this.actionClick = createEvent(this, "actionClick", 7);
58
59
  this.formItemsReady = createEvent(this, "formItemsReady", 7);
@@ -89,14 +90,16 @@ const SnkGuidesViewer = /*@__PURE__*/ proxyCustomElement(class extends HTMLEleme
89
90
  this.loadGuides(true);
90
91
  }
91
92
  observeDataState(newValue, oldValue) {
92
- const newRecord = newValue === null || newValue === void 0 ? void 0 : newValue.selectedRecord;
93
- const oldRecord = oldValue === null || oldValue === void 0 ? void 0 : oldValue.selectedRecord;
94
- if ((newRecord === null || newRecord === void 0 ? void 0 : newRecord.__record__id__) !== (oldRecord === null || oldRecord === void 0 ? void 0 : oldRecord.__record__id__)) {
93
+ var _a, _b, _c, _d, _e, _f;
94
+ const newRecordsIds = (_b = (_a = newValue === null || newValue === void 0 ? void 0 : newValue.selectionInfo) === null || _a === void 0 ? void 0 : _a.recordIds) !== null && _b !== void 0 ? _b : (_c = newValue === null || newValue === void 0 ? void 0 : newValue.selectedRecord) === null || _c === void 0 ? void 0 : _c['__record__id__'];
95
+ const oldRecordsIds = (_e = (_d = oldValue === null || oldValue === void 0 ? void 0 : oldValue.selectionInfo) === null || _d === void 0 ? void 0 : _d.recordIds) !== null && _e !== void 0 ? _e : (_f = oldValue === null || oldValue === void 0 ? void 0 : oldValue.selectedRecord) === null || _f === void 0 ? void 0 : _f['__record__id__'];
96
+ if (!ObjectUtils.equals(newRecordsIds, oldRecordsIds)) {
95
97
  this.loadGuides((oldValue === null || oldValue === void 0 ? void 0 : oldValue.insertionMode) != (newValue === null || newValue === void 0 ? void 0 : newValue.insertionMode));
96
98
  }
97
99
  }
98
100
  observeMasterFormConfig() {
99
101
  this.loadGuides(this.noGuideSelected());
102
+ this.snkMasterFormConfigChange.emit(this.masterFormConfig);
100
103
  }
101
104
  /**
102
105
  * Abre o configurador do formulário
@@ -170,6 +173,11 @@ const SnkGuidesViewer = /*@__PURE__*/ proxyCustomElement(class extends HTMLEleme
170
173
  * Para conhecer os detalhes do módulo, vide o arquivo neste projeto "/src/lib/message/resources/snk-crud.msg.ts"
171
174
  */
172
175
  getMessage(key) {
176
+ var _a, _b;
177
+ if (this.dataUnit.isMultipleEdition) {
178
+ const selectedRecords = (_b = (_a = this.dataUnit.getSelectionInfo()) === null || _a === void 0 ? void 0 : _a.records) !== null && _b !== void 0 ? _b : [];
179
+ return `Editando ${selectedRecords.length} registros`;
180
+ }
173
181
  return this.messagesBuilder.getMessage(key, this.dataUnit.getSelectedRecord());
174
182
  }
175
183
  loadGuides(changeSelection) {
@@ -182,12 +190,12 @@ const SnkGuidesViewer = /*@__PURE__*/ proxyCustomElement(class extends HTMLEleme
182
190
  this._masterFormMetadata = buildFormMetadata(this.masterFormConfig, this.dataUnit, true);
183
191
  const allSheets = this._masterFormMetadata.getAllSheets();
184
192
  const currentRecord = this.dataUnit.getSelectedRecord();
185
- const disableDetails = !currentRecord || this.dataUnit.isNewRecord(currentRecord.__record__id__);
193
+ const disableDetails = this.hasToDisableDetails(currentRecord);
186
194
  const guides = [];
187
195
  Array.from(allSheets.values()).forEach((sheet) => {
188
196
  const item = { id: sheet.name, label: sheet.label };
189
197
  if (this.isDetail(sheet.name) && disableDetails) {
190
- item.tooltip = "Para alterar detalhes é necessário estar com um registro selecionado.";
198
+ item.tooltip = "Para alterar detalhes é necessário estar com um (e apenas um) registro selecionado.";
191
199
  item.disabled = true;
192
200
  }
193
201
  guides.push(item);
@@ -200,6 +208,11 @@ const SnkGuidesViewer = /*@__PURE__*/ proxyCustomElement(class extends HTMLEleme
200
208
  this.selectedGuide = this._guides.length > 0 ? this._guides[0] : undefined;
201
209
  }
202
210
  }
211
+ hasToDisableDetails(currentRecord) {
212
+ return !currentRecord
213
+ || this.dataUnit.isNewRecord(currentRecord.__record__id__)
214
+ || this.dataUnit.isMultipleEdition;
215
+ }
203
216
  isDetail(formId) {
204
217
  return FormMetadata.getDetailName(formId) != undefined;
205
218
  }
@@ -222,47 +235,59 @@ const SnkGuidesViewer = /*@__PURE__*/ proxyCustomElement(class extends HTMLEleme
222
235
  }
223
236
  getTaskBarId() {
224
237
  var _a;
225
- return ((_a = this.dataState) === null || _a === void 0 ? void 0 : _a.isDirty) ? "snkGuideViewer.finish_edition" : "snkGuideViewer.regular";
226
- }
227
- loadTaskbarProcessor() {
228
- var _a;
229
- const taskbarId = this.getTaskBarId();
230
- const disabledButtons = [];
231
- if (!this.dataState || !this.dataState.hasPrevious) {
232
- disabledButtons.push("PREVIOUS");
238
+ if ((_a = this.dataState) === null || _a === void 0 ? void 0 : _a.isDirty) {
239
+ return TASKBAR_ID.FINISH_EDITION;
233
240
  }
234
- if (!this.dataState || !this.dataState.hasNext) {
235
- disabledButtons.push("NEXT");
241
+ if (this.dataUnit.isMultipleEdition) {
242
+ return TASKBAR_ID.MUTIPLE_EDITION;
236
243
  }
237
- if ((_a = this.dataState) === null || _a === void 0 ? void 0 : _a.selectionInfo) {
238
- if (this.dataState.selectionInfo.length > 1) {
239
- disabledButtons.push("CLONE");
240
- }
241
- if (this.dataState.selectionInfo.isAllRecords()) {
242
- disabledButtons.push("REMOVE");
243
- }
244
+ return TASKBAR_ID.REGULAR;
245
+ }
246
+ loadTaskbarProcessor() {
247
+ const taskbarIDs = {};
248
+ taskbarIDs[TASKBAR_ID.REGULAR] = this.buildBtnsRegularMode();
249
+ taskbarIDs[TASKBAR_ID.FINISH_EDITION] = [TaskbarElement.CANCEL, TaskbarElement.SAVE, this.handleAddGridMode()];
250
+ taskbarIDs[TASKBAR_ID.MUTIPLE_EDITION] = [TaskbarElement.CANCEL];
251
+ this._taskbarProcessor = new TaskbarProcessor(taskbarIDs);
252
+ this._taskbarProcessor.process(this.getTaskBarId(), this.taskbarManager, this.dataState, this.buildDisabledButtons(), this.buildInvisibleButtons());
253
+ }
254
+ buildBtnsRegularMode() {
255
+ var _a, _b;
256
+ const btnsRegularMode = [
257
+ TaskbarElement.ATTACH, TaskbarElement.CLONE, TaskbarElement.REMOVE, TaskbarElement.MORE_OPTIONS,
258
+ TaskbarElement.ACTIONS_BUTTON, TaskbarElement.DIVIDER, TaskbarElement.GRID_MODE, TaskbarElement.CONFIGURATOR,
259
+ ];
260
+ if (((_b = (_a = this.dataState) === null || _a === void 0 ? void 0 : _a.selectionInfo) === null || _b === void 0 ? void 0 : _b.length) <= 1) {
261
+ btnsRegularMode.unshift(TaskbarElement.PREVIOUS, TaskbarElement.NEXT, TaskbarElement.DIVIDER);
244
262
  }
245
- const btnsRegularMode = ["PREVIOUS", "NEXT", "DIVIDER", "ATTACH", "CLONE", "REMOVE", "MORE_OPTIONS", "ACTIONS_BUTTON", "DIVIDER", "GRID_MODE", "CONFIGURATOR"];
246
263
  if (this.presentationMode == PresentationMode.SECONDARY) {
247
- btnsRegularMode.unshift("INSERT");
264
+ btnsRegularMode.unshift(TaskbarElement.INSERT);
248
265
  }
249
266
  else {
250
- btnsRegularMode.push("INSERT");
267
+ btnsRegularMode.push(TaskbarElement.INSERT);
251
268
  }
252
- const invisibleButtons = this.getInvisibleButtons();
253
- this._taskbarProcessor = new TaskbarProcessor({
254
- "snkGuideViewer.regular": btnsRegularMode,
255
- "snkGuideViewer.finish_edition": ["CANCEL", "SAVE", this.handleAddGridMode()],
256
- });
257
- this._taskbarProcessor.process(taskbarId, this.taskbarManager, this.dataState, disabledButtons, invisibleButtons);
269
+ return btnsRegularMode;
270
+ }
271
+ buildDisabledButtons() {
272
+ var _a, _b, _c, _d, _e, _f;
273
+ const disabledButtons = [];
274
+ if (!((_a = this.dataState) === null || _a === void 0 ? void 0 : _a.hasPrevious))
275
+ disabledButtons.push(TaskbarElement.PREVIOUS);
276
+ if (!((_b = this.dataState) === null || _b === void 0 ? void 0 : _b.hasNext))
277
+ disabledButtons.push(TaskbarElement.NEXT);
278
+ if (((_d = (_c = this.dataState) === null || _c === void 0 ? void 0 : _c.selectionInfo) === null || _d === void 0 ? void 0 : _d.length) > 1)
279
+ disabledButtons.push(TaskbarElement.CLONE);
280
+ if ((_f = (_e = this.dataState) === null || _e === void 0 ? void 0 : _e.selectionInfo) === null || _f === void 0 ? void 0 : _f.isAllRecords())
281
+ disabledButtons.push(TaskbarElement.REMOVE);
282
+ return disabledButtons;
258
283
  }
259
284
  handleAddGridMode() {
260
285
  return this.enableGridInsert ? TaskbarElement.GRID_MODE : "";
261
286
  }
262
- getInvisibleButtons() {
287
+ buildInvisibleButtons() {
263
288
  const invisibleButtons = [];
264
289
  if (this.dataState && this.dataState.selectionInfo.mode === SelectionMode.ALL_RECORDS)
265
- invisibleButtons.push("ACTIONS_BUTTON");
290
+ invisibleButtons.push(TaskbarElement.ACTIONS_BUTTON);
266
291
  return invisibleButtons;
267
292
  }
268
293
  static updateContentCard(formName, cardConfig, propertyChanged, configManager) {
@@ -475,17 +500,27 @@ const SnkGuidesViewer = /*@__PURE__*/ proxyCustomElement(class extends HTMLEleme
475
500
  }
476
501
  buildTaskBar() {
477
502
  var _a;
478
- return h("div", { class: `snk-guides-viewer__header-taskbar ${this.presentationMode != PresentationMode.SECONDARY ? 'ez-align--right' : 'ez-padding-bottom--medium'}` }, h("snk-taskbar", { key: "guideViewerTaskbar", "data-element-id": "guideViewer", configName: this.configName, buttons: this._taskbarProcessor.buttons, disabledButtons: this._taskbarProcessor.disabledButtons, customButtons: this._taskbarProcessor.customButtons, actionsList: this.getActionsList(), messagesBuilder: this.messagesBuilder, presentationMode: this.presentationMode, primaryButton: ((_a = this.dataState) === null || _a === void 0 ? void 0 : _a.isDirty) ? "SAVE" : "INSERT", "data-taskbar-owner": "master", dataUnit: this.dataUnit, resourceID: this.resourceID, customSlotId: "GUIDES_VIEWER_TASKBAR_CUSTOM_ELEMENTS", alignRigth: true }, h("slot", { name: "GUIDES_VIEWER_TASKBAR_CUSTOM_ELEMENTS" })));
503
+ return h("div", { class: `snk-guides-viewer__header-taskbar ${this.presentationMode != PresentationMode.SECONDARY ? 'ez-align--right' : 'ez-padding-bottom--medium'}` }, h("snk-taskbar", { key: "guideViewerTaskbar", "data-element-id": "guideViewer", configName: this.configName, buttons: this._taskbarProcessor.buttons, disabledButtons: this._taskbarProcessor.disabledButtons, customButtons: this._taskbarProcessor.customButtons, actionsList: this.getActionsList(), messagesBuilder: this.messagesBuilder, presentationMode: this.presentationMode, primaryButton: ((_a = this.dataState) === null || _a === void 0 ? void 0 : _a.isDirty) ? TaskbarElement.SAVE : TaskbarElement.INSERT, "data-taskbar-owner": "master", dataUnit: this.dataUnit, resourceID: this.resourceID, customSlotId: "GUIDES_VIEWER_TASKBAR_CUSTOM_ELEMENTS", alignRigth: true }, h("slot", { name: "GUIDES_VIEWER_TASKBAR_CUSTOM_ELEMENTS" })));
479
504
  }
480
505
  async dataUnitActionHandler(action) {
481
506
  var _a;
482
- if (action.type === Action.FIELD_INVALIDATED) {
483
- const guideName = this.getGuideName((_a = action.payload) === null || _a === void 0 ? void 0 : _a.fieldName);
484
- await this.addErrorBadgeToGuide(guideName);
485
- await this.openGuideNavigator(guideName);
486
- }
487
- if (action.type === Action.METADATA_LOADED) {
488
- this.loadGuides(this.noGuideSelected());
507
+ switch (action.type) {
508
+ case Action.EDITION_CANCELED:
509
+ case Action.DATA_SAVED:
510
+ if (this.dataUnit.isMultipleEdition) {
511
+ this.exitViewer();
512
+ this.dataUnit.isMultipleEdition = false;
513
+ }
514
+ break;
515
+ case Action.FIELD_INVALIDATED:
516
+ const guideName = this.getGuideName((_a = action.payload) === null || _a === void 0 ? void 0 : _a.fieldName);
517
+ await this.addErrorBadgeToGuide(guideName);
518
+ await this.openGuideNavigator(guideName);
519
+ break;
520
+ case Action.METADATA_LOADED:
521
+ case Action.MULTIPLE_EDITION_CHANGED:
522
+ this.loadGuides(this.noGuideSelected());
523
+ break;
489
524
  }
490
525
  }
491
526
  async addErrorBadgeToGuide(guideName) {
@@ -525,6 +560,20 @@ const SnkGuidesViewer = /*@__PURE__*/ proxyCustomElement(class extends HTMLEleme
525
560
  var _a, _b;
526
561
  return (_b = (_a = this.getCustomTitle) === null || _a === void 0 ? void 0 : _a.call(this)) !== null && _b !== void 0 ? _b : this.getMessage("snkCrud.title");
527
562
  }
563
+ getTitleTooltip() {
564
+ if (!this.dataUnit.isMultipleEdition)
565
+ return;
566
+ return this.buildRecordIdsArray();
567
+ }
568
+ buildRecordIdsArray() {
569
+ var _a, _b;
570
+ const selectedRecords = (_b = (_a = this.dataUnit.getSelectionInfo()) === null || _a === void 0 ? void 0 : _a.records) !== null && _b !== void 0 ? _b : [];
571
+ if (selectedRecords.length === 0) {
572
+ return "[]";
573
+ }
574
+ const labels = selectedRecords.map(record => this.messagesBuilder.getMessage("snkCrud.title", record));
575
+ return `[${labels.join(", ")}]`;
576
+ }
528
577
  componentDidLoad() {
529
578
  this.dataUnit.subscribe(this.dataUnitActionHandler.bind(this));
530
579
  }
@@ -538,7 +587,7 @@ const SnkGuidesViewer = /*@__PURE__*/ proxyCustomElement(class extends HTMLEleme
538
587
  }
539
588
  this.loadTaskbarProcessor();
540
589
  const showGuides = this._guides && (this._guides.length > 1);
541
- return (h("section", { class: "snk-guides-viewer", ref: ref => this._container = ref, tabindex: -1 }, h("div", { class: "ez-row snk-guides-viewer__header" }, h("div", { class: "snk-guides-viewer__header-breadcrumb ez-flex--align-items-center ez-flex-item--align-center ez-padding-left--large", key: "header" }, h("ez-button", { onClick: () => this.exitViewer(), title: this.getMessage("snkCrud.goBackTitle"), mode: "icon", iconName: "arrow_back", class: "ez-padding-right--medium", size: "small" }), h("div", { class: "ez-flex ez-flex--column ez-flex-item--auto" }, h("h1", { class: "ez-title ez-title--primary ez-title--xlarge" }, this.getTitle()), ((_a = this._breadcrumbItems) === null || _a === void 0 ? void 0 : _a.length) > 1 &&
590
+ return (h("section", { class: "snk-guides-viewer", ref: ref => this._container = ref, tabindex: -1 }, h("div", { class: "ez-row snk-guides-viewer__header" }, h("div", { class: "snk-guides-viewer__header-breadcrumb ez-flex--align-items-center ez-flex-item--align-center ez-padding-left--large", key: "header" }, h("ez-button", { onClick: () => this.exitViewer(), title: this.getMessage("snkCrud.goBackTitle"), mode: "icon", iconName: "arrow_back", class: "ez-padding-right--medium", size: "small" }), h("div", { class: "ez-flex ez-flex--column ez-flex-item--auto" }, h("h1", { class: "ez-title ez-title--primary ez-title--xlarge", title: this.getTitleTooltip() }, this.getTitle()), ((_a = this._breadcrumbItems) === null || _a === void 0 ? void 0 : _a.length) > 1 &&
542
591
  h("div", { class: "ez-margin-top--extra-small" }, h("ez-breadcrumb", Object.assign({ items: this._breadcrumbItems, onSelectedItem: (evt) => this.onBreadcrumbClickHandler(evt === null || evt === void 0 ? void 0 : evt.detail) }, { [ElementIDUtils.DATA_ELEMENT_ID_ATTRIBUTE_NAME]: `${ElementIDUtils.getInternalIDInfo("breadcrumb")}` }))))), this.presentationMode != PresentationMode.SECONDARY && this.buildTaskBar()), h("div", { class: "snk-guides-viewer__container" }, showGuides ?
543
592
  h("ez-guide-navigator", { ref: (ref) => this._guideNavigator = ref, class: "snk-guides-viewer__guide-navigator", items: this._guides, selectedId: this.selectedGuide ? this.selectedGuide.id : undefined, onEzSelectionChange: evt => this.updateSelectedGuideHandler(evt.detail) })
544
593
  :
@@ -595,6 +644,12 @@ const SnkGuidesViewer = /*@__PURE__*/ proxyCustomElement(class extends HTMLEleme
595
644
  "setFieldProp": [64],
596
645
  "setFocus": [64]
597
646
  }, [[2, "actionClick", "onActionClick"], [0, "snkContentCardChanged", "onContentCardChanged"]]]);
647
+ var TASKBAR_ID;
648
+ (function (TASKBAR_ID) {
649
+ TASKBAR_ID["FINISH_EDITION"] = "snkGuideViewer.finish_edition";
650
+ TASKBAR_ID["MUTIPLE_EDITION"] = "snkGuideViewer.multiple_edition";
651
+ TASKBAR_ID["REGULAR"] = "snkGuideViewer.regular";
652
+ })(TASKBAR_ID || (TASKBAR_ID = {}));
598
653
  function defineCustomElement$1() {
599
654
  if (typeof customElements === "undefined") {
600
655
  return;
@@ -106,7 +106,7 @@ const SnkGrid = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
106
106
  });
107
107
  this._headerTaskbarProcessor = new TaskbarProcessor({
108
108
  "snkGridHeaderTaskbar.unselected": ["REFRESH", "DATA_EXPORTER", "ACTIONS_BUTTON", "MORE_OPTIONS"],
109
- "snkGridHeaderTaskbar.selected": ["UPDATE", "CLONE", "REMOVE", "MORE_OPTIONS", "DIVIDER", "ATTACH", "REFRESH", "DATA_EXPORTER", "ACTIONS_BUTTON"],
109
+ "snkGridHeaderTaskbar.selected": this.getGridHeaderSelectedBtns(),
110
110
  "snkGridHeaderTaskbar.detail.unselected": ["REFRESH", "MORE_OPTIONS"],
111
111
  "snkGridHeaderTaskbar.detail.selected": ["UPDATE", "ATTACH", "CLONE", "REMOVE", "MORE_OPTIONS", "DIVIDER", "REFRESH"],
112
112
  "snkGridHeaderTaskbar.singleTaskbar.unselected": ["INSERT", "FORM_MODE", "CONFIGURATOR", "REFRESH", "DATA_EXPORTER", "ACTIONS_BUTTON", "MORE_OPTIONS"],
@@ -157,6 +157,17 @@ const SnkGrid = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
157
157
  this.enableGridInsert = false;
158
158
  this.outlineMode = false;
159
159
  this.strategyExporter = ExporterStrategy.SERVER_SIDE;
160
+ this.multipleEditionEnabled = true;
161
+ }
162
+ getGridHeaderSelectedBtns() {
163
+ const btns = [
164
+ TaskbarElement.UPDATE, TaskbarElement.CLONE, TaskbarElement.REMOVE,
165
+ TaskbarElement.MORE_OPTIONS, TaskbarElement.DIVIDER, TaskbarElement.ATTACH, TaskbarElement.FORM_MODE,
166
+ TaskbarElement.CONFIGURATOR, TaskbarElement.REFRESH, TaskbarElement.DATA_EXPORTER, TaskbarElement.ACTIONS_BUTTON
167
+ ];
168
+ if (this.multipleEditionEnabled)
169
+ btns.unshift(TaskbarElement.UPDATE_MULTIPLE);
170
+ return btns;
160
171
  }
161
172
  reloadConfig() {
162
173
  this.loadConfig();
@@ -441,20 +452,23 @@ const SnkGrid = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
441
452
  const disabledButtons = [];
442
453
  if ((_a = this._dataState) === null || _a === void 0 ? void 0 : _a.selectionInfo) {
443
454
  if (this._dataState.selectionInfo.length > 1) {
444
- disabledButtons.push(TaskbarElement.CLONE, "ATTACH", TaskbarElement.UPDATE);
455
+ disabledButtons.push(TaskbarElement.CLONE, TaskbarElement.ATTACH, TaskbarElement.UPDATE);
445
456
  }
446
457
  if (this._dataState.selectionInfo.isAllRecords()) {
447
- disabledButtons.push("REMOVE");
458
+ disabledButtons.push(TaskbarElement.REMOVE);
448
459
  }
449
460
  }
450
461
  return disabledButtons;
451
462
  }
452
463
  getInvisibleButtons() {
464
+ var _a, _b;
453
465
  let invisibleButtons = [];
454
466
  if (!this._dataUnit || this._dataUnit.records.length === 0)
455
- invisibleButtons.push("DATA_EXPORTER");
456
- if (this._dataState && this._dataState.selectionInfo.mode === SelectionMode.ALL_RECORDS)
457
- invisibleButtons.push("ACTIONS_BUTTON");
467
+ invisibleButtons.push(TaskbarElement.DATA_EXPORTER);
468
+ if (((_a = this._dataState) === null || _a === void 0 ? void 0 : _a.selectionInfo.mode) === SelectionMode.ALL_RECORDS)
469
+ invisibleButtons.push(TaskbarElement.ACTIONS_BUTTON);
470
+ if (((_b = this._dataState) === null || _b === void 0 ? void 0 : _b.selectionInfo.length) === 1)
471
+ invisibleButtons.push(TaskbarElement.UPDATE_MULTIPLE);
458
472
  return invisibleButtons;
459
473
  }
460
474
  componentWillRender() {
@@ -600,6 +614,7 @@ const SnkGrid = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
600
614
  "enableGridInsert": [4, "enable-grid-insert"],
601
615
  "outlineMode": [4, "outline-mode"],
602
616
  "strategyExporter": [1025, "strategy-exporter"],
617
+ "multipleEditionEnabled": [4, "multiple-edition-enabled"],
603
618
  "_dataUnit": [32],
604
619
  "_dataState": [32],
605
620
  "_gridConfig": [32],