@sankhyalabs/sankhyablocks 10.1.0-dev.51 → 10.1.0-dev.52

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 (37) hide show
  1. package/dist/cjs/{SnkMultiSelectionListDataSource-293bc3d2.js → SnkMultiSelectionListDataSource-d341dd02.js} +67 -20
  2. package/dist/cjs/snk-crud.cjs.entry.js +14 -0
  3. package/dist/cjs/snk-detail-view.cjs.entry.js +8 -2
  4. package/dist/cjs/snk-grid.cjs.entry.js +2 -2
  5. package/dist/cjs/{snk-guides-viewer-b4ca3437.js → snk-guides-viewer-8e7a503b.js} +1 -1
  6. package/dist/cjs/snk-guides-viewer.cjs.entry.js +1 -1
  7. package/dist/cjs/snk-simple-crud.cjs.entry.js +1 -1
  8. package/dist/collection/components/snk-crud/subcomponents/snk-detail-view/snk-detail-view.css +4 -1
  9. package/dist/collection/components/snk-crud/subcomponents/snk-detail-view/snk-detail-view.js +6 -0
  10. package/dist/collection/components/snk-crud/subcomponents/snk-guides-viewer.css +1 -1
  11. package/dist/collection/components/snk-crud/utils/taskbarUtils.js +14 -0
  12. package/dist/collection/components/snk-data-exporter/interfaces/IExporterProvider.js +67 -20
  13. package/dist/collection/components/snk-grid/snk-grid.css +10 -5
  14. package/dist/components/ContinuousInsertUtils.js +67 -20
  15. package/dist/components/snk-crud.js +14 -0
  16. package/dist/components/snk-detail-view2.js +8 -2
  17. package/dist/components/snk-grid2.js +1 -1
  18. package/dist/esm/{SnkMultiSelectionListDataSource-f6cabd15.js → SnkMultiSelectionListDataSource-18abafb1.js} +67 -20
  19. package/dist/esm/snk-crud.entry.js +14 -0
  20. package/dist/esm/snk-detail-view.entry.js +8 -2
  21. package/dist/esm/snk-grid.entry.js +2 -2
  22. package/dist/esm/{snk-guides-viewer-cc37535b.js → snk-guides-viewer-adf39ea2.js} +1 -1
  23. package/dist/esm/snk-guides-viewer.entry.js +1 -1
  24. package/dist/esm/snk-simple-crud.entry.js +1 -1
  25. package/dist/sankhyablocks/{p-95b36bd3.entry.js → p-0a4cdcde.entry.js} +1 -1
  26. package/dist/sankhyablocks/p-3d294185.entry.js +1 -0
  27. package/dist/sankhyablocks/{p-fec88660.entry.js → p-57c184a2.entry.js} +1 -1
  28. package/dist/sankhyablocks/p-5c250661.js +1 -0
  29. package/dist/sankhyablocks/{p-771b137e.js → p-b1bb4cf1.js} +1 -1
  30. package/dist/sankhyablocks/{p-f1bbf065.entry.js → p-bd3c1aaa.entry.js} +1 -1
  31. package/dist/sankhyablocks/{p-33492640.entry.js → p-dbdbb77a.entry.js} +1 -1
  32. package/dist/sankhyablocks/sankhyablocks.esm.js +1 -1
  33. package/dist/types/components/snk-crud/subcomponents/snk-detail-view/snk-detail-view.d.ts +1 -0
  34. package/dist/types/components/snk-data-exporter/interfaces/IExporterProvider.d.ts +8 -0
  35. package/package.json +1 -1
  36. package/dist/sankhyablocks/p-134702f6.entry.js +0 -1
  37. package/dist/sankhyablocks/p-9e77e136.js +0 -1
@@ -168,41 +168,35 @@ class CommonsExporter {
168
168
  return this.columnsState;
169
169
  }
170
170
  async buildColumnsMetadata(gridColumns) {
171
- var _a, _b, _c;
171
+ var _a;
172
172
  const columnsMetadata = [];
173
+ const searchPlusDescriptionIds = this.collectSearchPlusDescriptionIds(gridColumns);
173
174
  for (const column of gridColumns) {
175
+ if (this.isHiddenColumn(column)) {
176
+ continue;
177
+ }
174
178
  /**
175
- * TODO: Analisar e criar uma melhor forma de tratar essa validação do "RECDESP".
179
+ * A grid adiciona uma coluna auxiliar para a descrição de campos SEARCHPLUS
180
+ * (ex.: "ENTITYNAME.DESCRIPTIONFIELD"). A descrição já é emitida ao processar
181
+ * o próprio SEARCHPLUS, então pulamos a auxiliar para evitar duplicar a coluna.
176
182
  */
177
- if (column.hidden && column.name !== "RECDESP") {
183
+ if (searchPlusDescriptionIds.has(column.name)) {
178
184
  continue;
179
185
  }
180
186
  const fieldData = (_a = this.dataUnit) === null || _a === void 0 ? void 0 : _a.getField(column.name);
181
187
  const customFormatter = await this.grid.getCustomValueFormatter(column.name);
182
- const isUserInterfaceSEARCH = (fieldData === null || fieldData === void 0 ? void 0 : fieldData.userInterface) === UnitMetadata.UserInterface.SEARCH;
183
- const widthColumnDefault = 60;
184
- const labelColumn = isUserInterfaceSEARCH ? "Cód. " : column.label;
185
- let descriptionColumn = undefined;
188
+ const isSearchField = this.isSearchUserInterface(fieldData);
189
+ const labelColumn = isSearchField ? "Cód. " : column.label;
186
190
  let columnData = {
187
191
  id: column.name,
188
192
  label: labelColumn,
189
- width: isUserInterfaceSEARCH ? (labelColumn.length * this.DEFAULT_FONT_SIZE) : column.width,
193
+ width: isSearchField ? (labelColumn.length * this.DEFAULT_FONT_SIZE) : column.width,
190
194
  type: fieldData === null || fieldData === void 0 ? void 0 : fieldData.dataType,
191
195
  userInterface: fieldData === null || fieldData === void 0 ? void 0 : fieldData.userInterface,
192
196
  customFormatter
193
197
  };
194
- if (isUserInterfaceSEARCH && ((_b = fieldData === null || fieldData === void 0 ? void 0 : fieldData.properties) === null || _b === void 0 ? void 0 : _b.DESCRIPTIONFIELD) != undefined) {
195
- const labelDescription = (_c = fieldData === null || fieldData === void 0 ? void 0 : fieldData.properties) === null || _c === void 0 ? void 0 : _c.DESCRIPTIONENTITY;
196
- const mergedFrom = fieldData.properties.mergedFrom;
197
- const descriptionField = `${fieldData.properties.ENTITYNAME}.${fieldData.properties.DESCRIPTIONFIELD}`;
198
- descriptionColumn = {
199
- id: `${mergedFrom ? (mergedFrom + ".") : ""}${descriptionField}`,
200
- label: labelDescription,
201
- width: isUserInterfaceSEARCH && labelDescription ? (labelDescription.length * this.DEFAULT_FONT_SIZE - widthColumnDefault) : column.width,
202
- type: core.DataType.TEXT,
203
- userInterface: UnitMetadata.UserInterface.LONGTEXT,
204
- descriptionFrom: fieldData.name
205
- };
198
+ let descriptionColumn = isSearchField ? this.buildDescriptionColumn(fieldData, column) : undefined;
199
+ if (descriptionColumn) {
206
200
  const newWidth = this.getWidthByMetaData(column === null || column === void 0 ? void 0 : column.width, columnData === null || columnData === void 0 ? void 0 : columnData.width, descriptionColumn === null || descriptionColumn === void 0 ? void 0 : descriptionColumn.width);
207
201
  columnData = Object.assign(Object.assign({}, columnData), { width: newWidth === null || newWidth === void 0 ? void 0 : newWidth.codWidth });
208
202
  descriptionColumn = Object.assign(Object.assign({}, descriptionColumn), { width: newWidth === null || newWidth === void 0 ? void 0 : newWidth.descWidth, label: (descriptionColumn === null || descriptionColumn === void 0 ? void 0 : descriptionColumn.label) || (column === null || column === void 0 ? void 0 : column.label) });
@@ -213,6 +207,59 @@ class CommonsExporter {
213
207
  }
214
208
  return columnsMetadata || [];
215
209
  }
210
+ collectSearchPlusDescriptionIds(gridColumns) {
211
+ var _a;
212
+ const descriptionIds = new Set();
213
+ for (const column of gridColumns) {
214
+ if (this.isHiddenColumn(column)) {
215
+ continue;
216
+ }
217
+ const fieldData = (_a = this.dataUnit) === null || _a === void 0 ? void 0 : _a.getField(column.name);
218
+ if (!this.isSearchUserInterface(fieldData)) {
219
+ continue;
220
+ }
221
+ const descriptionId = this.buildDescriptionColumnId(fieldData);
222
+ if (descriptionId) {
223
+ descriptionIds.add(descriptionId);
224
+ }
225
+ }
226
+ return descriptionIds;
227
+ }
228
+ /**
229
+ * TODO: Analisar e criar uma melhor forma de tratar essa validação do "RECDESP".
230
+ */
231
+ isHiddenColumn(column) {
232
+ return column.hidden && column.name !== "RECDESP";
233
+ }
234
+ isSearchUserInterface(fieldData) {
235
+ return (fieldData === null || fieldData === void 0 ? void 0 : fieldData.userInterface) === UnitMetadata.UserInterface.SEARCH
236
+ || (fieldData === null || fieldData === void 0 ? void 0 : fieldData.userInterface) === UnitMetadata.UserInterface.SEARCHPLUS;
237
+ }
238
+ buildDescriptionColumnId(fieldData) {
239
+ const properties = fieldData === null || fieldData === void 0 ? void 0 : fieldData.properties;
240
+ if ((properties === null || properties === void 0 ? void 0 : properties.DESCRIPTIONFIELD) == undefined) {
241
+ return undefined;
242
+ }
243
+ const descriptionField = `${properties.ENTITYNAME}.${properties.DESCRIPTIONFIELD}`;
244
+ return properties.mergedFrom ? `${properties.mergedFrom}.${descriptionField}` : descriptionField;
245
+ }
246
+ buildDescriptionColumn(fieldData, column) {
247
+ var _a;
248
+ const id = this.buildDescriptionColumnId(fieldData);
249
+ if (!id) {
250
+ return undefined;
251
+ }
252
+ const labelDescription = (_a = fieldData === null || fieldData === void 0 ? void 0 : fieldData.properties) === null || _a === void 0 ? void 0 : _a.DESCRIPTIONENTITY;
253
+ const widthColumnDefault = 60;
254
+ return {
255
+ id,
256
+ label: labelDescription,
257
+ width: labelDescription ? (labelDescription.length * this.DEFAULT_FONT_SIZE - widthColumnDefault) : column.width,
258
+ type: core.DataType.TEXT,
259
+ userInterface: UnitMetadata.UserInterface.LONGTEXT,
260
+ descriptionFrom: fieldData.name
261
+ };
262
+ }
216
263
  getWidthByMetaData(maxWidth, widthCod, widthDescription) {
217
264
  const totalCurrentWidth = widthCod + widthDescription;
218
265
  const codPercentage = widthCod / totalCurrentWidth;
@@ -118,6 +118,16 @@ function insertCustomButtonsBeforeSpacer(buttons, customButtons) {
118
118
  }
119
119
  return [...customButtons, ...buttons];
120
120
  }
121
+ function buildNavigationDisabledBtns(dataState) {
122
+ const navigationDisabled = [];
123
+ if (!(dataState === null || dataState === void 0 ? void 0 : dataState.hasPrevious)) {
124
+ navigationDisabled.push(taskbarElements.TaskbarElement.PREVIOUS);
125
+ }
126
+ if (!(dataState === null || dataState === void 0 ? void 0 : dataState.hasNext)) {
127
+ navigationDisabled.push(taskbarElements.TaskbarElement.NEXT);
128
+ }
129
+ return navigationDisabled;
130
+ }
121
131
  function buildNativeTaskbarManager(currentViewMode, mergeTaskbarManager, messagesBuilder) {
122
132
  var _a, _b;
123
133
  const CUSTOM_BUTTONS = [
@@ -188,6 +198,10 @@ function buildNativeTaskbarManager(currentViewMode, mergeTaskbarManager, message
188
198
  if (!hasSelectedRecord && buttonsRequiringSelection.includes(buttonName)) {
189
199
  return false;
190
200
  }
201
+ const navigationDisabled = buildNavigationDisabledBtns(dataState);
202
+ if (navigationDisabled.includes(buttonName)) {
203
+ return false;
204
+ }
191
205
  return (_a = mergeTaskbarManager === null || mergeTaskbarManager === void 0 ? void 0 : mergeTaskbarManager.isEnabled(_, dataState, buttonName, originalValue)) !== null && _a !== void 0 ? _a : originalValue;
192
206
  },
193
207
  getMoreOptions(taskbarId, configName, dataState, currentActions) {
@@ -16,7 +16,7 @@ require('./filter-item-type.enum-a7ffdaa6.js');
16
16
  require('./form-config-fetcher-45d1964c.js');
17
17
  const constants = require('./constants-6d82e405.js');
18
18
  const taskbarElements = require('./taskbar-elements-80eddec8.js');
19
- const snkGuidesViewer = require('./snk-guides-viewer-b4ca3437.js');
19
+ const snkGuidesViewer = require('./snk-guides-viewer-8e7a503b.js');
20
20
  const SnkMessageBuilder = require('./SnkMessageBuilder-a9300ebe.js');
21
21
  const utils = require('@sankhyalabs/ezui/dist/collection/utils');
22
22
  require('./ConfigStorage-a1fab5ca.js');
@@ -76,7 +76,7 @@ class GuideBuilder {
76
76
  }
77
77
  }
78
78
 
79
- const snkDetailViewCss = ".sc-snk-detail-view-h{display:flex;row-gap:24px;flex-direction:column;width:100%;height:100%}.level-path.sc-snk-detail-view{color:var(--color--title-primary, #2B3A54);font-weight:var(--text-weight--medium, 400);padding-right:3px}.form-taskbar.sc-snk-detail-view{padding-bottom:var(--space--medium)}.grid-container.sc-snk-detail-view{background-color:#FFF;min-height:100px;height:100%}.detail-header.sc-snk-detail-view{padding-bottom:0}snk-data-unit.sc-snk-detail-view{flex:1}snk-grid.sc-snk-detail-view{height:calc(100% - 43px)}";
79
+ const snkDetailViewCss = ".sc-snk-detail-view-h{display:flex;row-gap:24px;flex-direction:column;width:100%;height:100%}.level-path.sc-snk-detail-view{color:var(--color--title-primary, #2B3A54);font-weight:var(--text-weight--medium, 400);padding-right:3px}.form-taskbar.sc-snk-detail-view{padding-bottom:var(--space--medium)}.grid-container.sc-snk-detail-view{background-color:#FFF;min-height:100px;height:100%}.detail-header.sc-snk-detail-view{padding-bottom:0}snk-data-unit.sc-snk-detail-view{flex:1}snk-grid.sc-snk-detail-view{height:calc(100% - 56px);--snk-grid__header-padding:var(--space--4, 4px);--snk-grid-padding:var(--space--8, 8px);--snk-grid-box-shadow:unset}";
80
80
 
81
81
  const SnkDetailView = class {
82
82
  constructor(hostRef) {
@@ -324,6 +324,12 @@ const SnkDetailView = class {
324
324
  this.addErrorBadgeToBranchGuide();
325
325
  }
326
326
  else if (action.type === core.Action.DATA_LOADED) {
327
+ this.handleDataLoaded();
328
+ }
329
+ }
330
+ handleDataLoaded() {
331
+ var _a;
332
+ if (!((_a = this.dataUnit) === null || _a === void 0 ? void 0 : _a.getSelectedRecord())) {
327
333
  this.dataUnit.selectFirst();
328
334
  }
329
335
  }
@@ -8,7 +8,7 @@ const DataUnit = require('@sankhyalabs/core/dist/dataunit/DataUnit');
8
8
  const utils = require('@sankhyalabs/ezui/dist/collection/utils');
9
9
  require('./DataFetcher-384d2ce8.js');
10
10
  require('./ISave-ecbe9336.js');
11
- const SnkMultiSelectionListDataSource = require('./SnkMultiSelectionListDataSource-293bc3d2.js');
11
+ const SnkMultiSelectionListDataSource = require('./SnkMultiSelectionListDataSource-d341dd02.js');
12
12
  const index$1 = require('./index-e3e39724.js');
13
13
  require('@sankhyalabs/ezui/dist/collection/utils/constants');
14
14
  require('@sankhyalabs/core/dist/dataunit/metadata/UnitMetadata');
@@ -84,7 +84,7 @@ class ServerSideExporterProvider extends SnkMultiSelectionListDataSource.Commons
84
84
  }
85
85
  }
86
86
 
87
- const snkGridCss = ".sc-snk-grid-h{--snk-grid-min-height:300px;--snk-grid-padding:var(--space--small)}.snk-grid__container.sc-snk-grid{display:flex;height:100%;width:calc(100% - var(--space--12, 12px));margin:var(--snk-grid-padding);outline:none;border:1px solid var(--color--strokes, #E1E2E5);border-radius:var(--border--radius-12, 12px);box-shadow:var(--shadow--small);--snk-grid-header--min-height:var(--space--52)}.snk-grid__header.sc-snk-grid{width:100%;display:flex;flex-wrap:nowrap;justify-content:flex-end;align-items:flex-start;min-height:var(--snk-grid-header--min-height)}.snk-grid__filter-bar.sc-snk-grid{width:100%}.snk-grid__header-divider.sc-snk-grid{margin-bottom:var(--space--medium);margin-right:var(--space--0);align-self:stretch}.snk-grid__header.sc-snk-grid snk-taskbar.sc-snk-grid{display:flex;align-items:flex-start;min-height:var(--snk-grid-header--min-height)}.snk-grid__header.sc-snk-grid ez-tooltip.sc-snk-grid{width:auto;margin-inline:var(--space--8, 8px)}.snk-grid__table.sc-snk-grid{min-height:var(--snk-grid-min-height)}.snk-grid-container__without-shadow.sc-snk-grid{--ezgrid__container--shadow:unset}.snk-grid-container__footer.sc-snk-grid{background-color:var(--background--xlight, #FFF);border-top:1px solid var(--color--strokes, #E1E2E5);border-radius:0 0 var(--border--radius-medium) var(--border--radius-medium)}";
87
+ const snkGridCss = ".sc-snk-grid-h{--snk-grid-min-height:300px;--snk-grid-padding:unset;--snk-grid-margin:var(--space--small);--snk-grid-box-shadow:var(--shadow--small);--snk-grid__header-padding:unset}.snk-grid__container.sc-snk-grid{display:flex;height:100%;width:calc(100% - var(--space--12, 12px));margin:var(--snk-grid-margin);outline:none;border:1px solid var(--color--strokes, #E1E2E5);border-radius:var(--border--radius-12, 12px);box-shadow:var(--snk-grid-box-shadow);padding:var(--snk-grid-padding);--snk-grid-header--min-height:var(--space--52)}.snk-grid__header.sc-snk-grid{width:100%;display:flex;flex-wrap:nowrap;justify-content:flex-end;align-items:flex-start;min-height:var(--snk-grid-header--min-height);padding-top:var(--snk-grid__header-padding);padding-right:var(--snk-grid__header-padding)}.snk-grid__filter-bar.sc-snk-grid{width:100%}.snk-grid__header-divider.sc-snk-grid{margin-bottom:var(--space--medium);margin-right:var(--space--0);align-self:stretch}.snk-grid__header.sc-snk-grid snk-taskbar.sc-snk-grid{display:flex;align-items:flex-start;min-height:var(--snk-grid-header--min-height)}.snk-grid__header.sc-snk-grid ez-tooltip.sc-snk-grid{width:auto;margin-inline:var(--space--8, 8px)}.snk-grid__table.sc-snk-grid{min-height:var(--snk-grid-min-height)}.snk-grid-container__without-shadow.sc-snk-grid{--ezgrid__container--shadow:unset}.snk-grid-container__footer.sc-snk-grid{background-color:var(--background--xlight, #FFF);border-top:1px solid var(--color--strokes, #E1E2E5);border-radius:0 0 var(--border--radius-medium) var(--border--radius-medium)}";
88
88
 
89
89
  const SnkGrid = class {
90
90
  constructor(hostRef) {
@@ -8,7 +8,7 @@ const constants = require('./constants-6d82e405.js');
8
8
  const SnkFormConfigManager = require('./SnkFormConfigManager-44386305.js');
9
9
  const taskbarElements = require('./taskbar-elements-80eddec8.js');
10
10
 
11
- const snkGuidesViewerCss = ".sc-snk-guides-viewer-h{--snk-guides-viewer--space-large:var(--space--large, 24px);--snk-guides-viewer--space-small:var(--space--2xs, 8px);--snk-guides-viewer__header--min-height:132px;--snk-guides-viewer__header--z-index:var(--more-visible, 2);--snk-guides-viewer__header--background-color:var(--background--body, #fafcff);--snk-guides-viewer__guide-navigator--width:340px;--snk-workspace--header-height:40px;display:block;outline:none}ez-guide-navigator.sc-snk-guides-viewer{--ez-guide-navigator--border-radius:var(--space--12, 12px)}snk-form-view.sc-snk-guides-viewer{width:100%}stack-item.snk-guides-viewer.sc-snk-guides-viewer{display:grid}stack-item.sc-snk-guides-viewer.sc-snk-guides-viewer{display:grid;min-height:100%}.snk-guides-viewer.sc-snk-guides-viewer{position:relative;padding:0 var(--snk-guides-viewer--space-small);padding-bottom:var(--snk-guides-viewer--space-small)}.snk-guides-viewer__detail-container.sc-snk-guides-viewer{display:flex;row-gap:24px;flex-direction:column;max-height:calc(100vh - var(--snk-guides-viewer__header--min-height));overflow-y:auto}.snk-guides-viewer__header.sc-snk-guides-viewer{position:sticky;align-items:center;top:0;z-index:var(--snk-guides-viewer__header--z-index);background-color:var(--snk-guides-viewer__header--background-color);min-height:var(--snk-guides-viewer__header--min-height);width:calc(100% + (var(--snk-guides-viewer--space-large) * 2));padding-left:var(--snk-guides-viewer--space-large);padding-right:var(--snk-guides-viewer--space-large);padding-top:var(--snk-guides-viewer--space-large);padding-bottom:var(--snk-guides-viewer--space-small);margin-left:calc(var(--snk-guides-viewer--space-large) * -1);margin-right:calc(var(--snk-guides-viewer--space-large) * -1);margin-bottom:var(--snk-guides-viewer--space-small)}.snk-guides-viewer__header-breadcrumb.sc-snk-guides-viewer{width:25%;display:flex}.snk-guides-viewer__header-taskbar.sc-snk-guides-viewer{width:75%}.snk-guides-viewer__container.sc-snk-guides-viewer{display:grid;grid-template-columns:minmax(0, auto) minmax(0, 100%);height:100%;column-gap:var(--snk-guides-viewer--space-small)}.snk-guides-viewer__guide-navigator.sc-snk-guides-viewer{position:sticky;top:var(--snk-guides-viewer--space-small);height:100%}.snk-guides-viewer__guide-navigator[open].sc-snk-guides-viewer{width:var(--snk-guides-viewer__guide-navigator--width);max-width:var(--snk-guides-viewer__guide-navigator--width);min-width:var(--snk-guides-viewer__guide-navigator--width)}.snk-guides-viewer__detail-content.sc-snk-guides-viewer{min-height:100%;align-items:flex-start;align-content:flex-start}";
11
+ const snkGuidesViewerCss = ".sc-snk-guides-viewer-h{--snk-guides-viewer--space-large:var(--space--large, 24px);--snk-guides-viewer--space-small:var(--space--2xs, 8px);--snk-guides-viewer__header--min-height:132px;--snk-guides-viewer__header--z-index:var(--more-visible, 2);--snk-guides-viewer__header--background-color:var(--background--body, #fafcff);--snk-guides-viewer__guide-navigator--width:340px;--snk-workspace--header-height:40px;display:block;outline:none}ez-guide-navigator.sc-snk-guides-viewer{--ez-guide-navigator--border-radius:var(--space--12, 12px)}snk-form-view.sc-snk-guides-viewer{width:100%}stack-item.snk-guides-viewer.sc-snk-guides-viewer{display:grid}stack-item.sc-snk-guides-viewer.sc-snk-guides-viewer{display:grid;min-height:100%}.snk-guides-viewer.sc-snk-guides-viewer{position:relative;padding:0 var(--snk-guides-viewer--space-small);padding-bottom:var(--snk-guides-viewer--space-small)}.snk-guides-viewer__detail-container.sc-snk-guides-viewer{display:flex;row-gap:24px;flex-direction:column;max-height:calc(100vh - var(--snk-guides-viewer__header--min-height));overflow-y:auto}.snk-guides-viewer__header.sc-snk-guides-viewer{position:sticky;align-items:center;top:0;z-index:var(--snk-guides-viewer__header--z-index);background-color:var(--snk-guides-viewer__header--background-color);min-height:var(--snk-guides-viewer__header--min-height);width:calc(100% + (var(--snk-guides-viewer--space-large) * 2));padding-left:var(--snk-guides-viewer--space-large);padding-right:var(--snk-guides-viewer--space-large);padding-top:var(--snk-guides-viewer--space-large);padding-bottom:var(--snk-guides-viewer--space-small);margin-left:calc(var(--snk-guides-viewer--space-large) * -1);margin-right:calc(var(--snk-guides-viewer--space-large) * -1);margin-bottom:var(--snk-guides-viewer--space-small)}.snk-guides-viewer__header-breadcrumb.sc-snk-guides-viewer{width:25%;display:flex}.snk-guides-viewer__header-taskbar.sc-snk-guides-viewer{width:75%}.snk-guides-viewer__container.sc-snk-guides-viewer{display:grid;grid-template-columns:minmax(0, auto) minmax(0, 100%);height:100%;column-gap:var(--snk-guides-viewer--space-small)}.snk-guides-viewer__guide-navigator.sc-snk-guides-viewer{position:sticky;top:var(--snk-guides-viewer--space-small);height:calc(100vh - var(--snk-guides-viewer__header--min-height))}.snk-guides-viewer__guide-navigator[open].sc-snk-guides-viewer{width:var(--snk-guides-viewer__guide-navigator--width);max-width:var(--snk-guides-viewer__guide-navigator--width);min-width:var(--snk-guides-viewer__guide-navigator--width)}.snk-guides-viewer__detail-content.sc-snk-guides-viewer{min-height:100%;align-items:flex-start;align-content:flex-start}";
12
12
 
13
13
  const FORM_NAME_PREFIX = "__FORM:";
14
14
  const SnkGuidesViewer = class {
@@ -2,7 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- const snkGuidesViewer = require('./snk-guides-viewer-b4ca3437.js');
5
+ const snkGuidesViewer = require('./snk-guides-viewer-8e7a503b.js');
6
6
  require('./index-1894343a.js');
7
7
  require('@sankhyalabs/core');
8
8
  require('@sankhyalabs/ezui/dist/collection/utils');
@@ -9,7 +9,7 @@ const constants = require('./constants-6d82e405.js');
9
9
  const taskbarElements = require('./taskbar-elements-80eddec8.js');
10
10
  require('./DataFetcher-384d2ce8.js');
11
11
  require('./ISave-ecbe9336.js');
12
- const SnkMultiSelectionListDataSource = require('./SnkMultiSelectionListDataSource-293bc3d2.js');
12
+ const SnkMultiSelectionListDataSource = require('./SnkMultiSelectionListDataSource-d341dd02.js');
13
13
  const index$1 = require('./index-e3e39724.js');
14
14
  require('@sankhyalabs/ezui/dist/collection/utils/constants');
15
15
  require('@sankhyalabs/core/dist/dataunit/metadata/UnitMetadata');
@@ -31,5 +31,8 @@ snk-data-unit {
31
31
  }
32
32
 
33
33
  snk-grid{
34
- height: calc(100% - 43px);
34
+ height: calc(100% - 56px);
35
+ --snk-grid__header-padding: var(--space--4, 4px);
36
+ --snk-grid-padding: var(--space--8, 8px);
37
+ --snk-grid-box-shadow: unset;
35
38
  }
@@ -251,6 +251,12 @@ export class SnkDetailView {
251
251
  this.addErrorBadgeToBranchGuide();
252
252
  }
253
253
  else if (action.type === DUAction.DATA_LOADED) {
254
+ this.handleDataLoaded();
255
+ }
256
+ }
257
+ handleDataLoaded() {
258
+ var _a;
259
+ if (!((_a = this.dataUnit) === null || _a === void 0 ? void 0 : _a.getSelectedRecord())) {
254
260
  this.dataUnit.selectFirst();
255
261
  }
256
262
  }
@@ -96,7 +96,7 @@ stack-item.sc-snk-guides-viewer {
96
96
 
97
97
  /*public*/
98
98
  top: var(--snk-guides-viewer--space-small);
99
- height: 100%;
99
+ height: calc(100vh - var(--snk-guides-viewer__header--min-height));
100
100
  }
101
101
 
102
102
  .snk-guides-viewer__guide-navigator[open] {
@@ -37,6 +37,16 @@ function insertCustomButtonsBeforeSpacer(buttons, customButtons) {
37
37
  }
38
38
  return [...customButtons, ...buttons];
39
39
  }
40
+ function buildNavigationDisabledBtns(dataState) {
41
+ const navigationDisabled = [];
42
+ if (!(dataState === null || dataState === void 0 ? void 0 : dataState.hasPrevious)) {
43
+ navigationDisabled.push(TaskbarElement.PREVIOUS);
44
+ }
45
+ if (!(dataState === null || dataState === void 0 ? void 0 : dataState.hasNext)) {
46
+ navigationDisabled.push(TaskbarElement.NEXT);
47
+ }
48
+ return navigationDisabled;
49
+ }
40
50
  export function buildNativeTaskbarManager(currentViewMode, mergeTaskbarManager, messagesBuilder) {
41
51
  var _a, _b;
42
52
  const CUSTOM_BUTTONS = [
@@ -107,6 +117,10 @@ export function buildNativeTaskbarManager(currentViewMode, mergeTaskbarManager,
107
117
  if (!hasSelectedRecord && buttonsRequiringSelection.includes(buttonName)) {
108
118
  return false;
109
119
  }
120
+ const navigationDisabled = buildNavigationDisabledBtns(dataState);
121
+ if (navigationDisabled.includes(buttonName)) {
122
+ return false;
123
+ }
110
124
  return (_a = mergeTaskbarManager === null || mergeTaskbarManager === void 0 ? void 0 : mergeTaskbarManager.isEnabled(_, dataState, buttonName, originalValue)) !== null && _a !== void 0 ? _a : originalValue;
111
125
  },
112
126
  getMoreOptions(taskbarId, configName, dataState, currentActions) {
@@ -17,41 +17,35 @@ export class CommonsExporter {
17
17
  return this.columnsState;
18
18
  }
19
19
  async buildColumnsMetadata(gridColumns) {
20
- var _a, _b, _c;
20
+ var _a;
21
21
  const columnsMetadata = [];
22
+ const searchPlusDescriptionIds = this.collectSearchPlusDescriptionIds(gridColumns);
22
23
  for (const column of gridColumns) {
24
+ if (this.isHiddenColumn(column)) {
25
+ continue;
26
+ }
23
27
  /**
24
- * TODO: Analisar e criar uma melhor forma de tratar essa validação do "RECDESP".
28
+ * A grid adiciona uma coluna auxiliar para a descrição de campos SEARCHPLUS
29
+ * (ex.: "ENTITYNAME.DESCRIPTIONFIELD"). A descrição já é emitida ao processar
30
+ * o próprio SEARCHPLUS, então pulamos a auxiliar para evitar duplicar a coluna.
25
31
  */
26
- if (column.hidden && column.name !== "RECDESP") {
32
+ if (searchPlusDescriptionIds.has(column.name)) {
27
33
  continue;
28
34
  }
29
35
  const fieldData = (_a = this.dataUnit) === null || _a === void 0 ? void 0 : _a.getField(column.name);
30
36
  const customFormatter = await this.grid.getCustomValueFormatter(column.name);
31
- const isUserInterfaceSEARCH = (fieldData === null || fieldData === void 0 ? void 0 : fieldData.userInterface) === UserInterface.SEARCH;
32
- const widthColumnDefault = 60;
33
- const labelColumn = isUserInterfaceSEARCH ? "Cód. " : column.label;
34
- let descriptionColumn = undefined;
37
+ const isSearchField = this.isSearchUserInterface(fieldData);
38
+ const labelColumn = isSearchField ? "Cód. " : column.label;
35
39
  let columnData = {
36
40
  id: column.name,
37
41
  label: labelColumn,
38
- width: isUserInterfaceSEARCH ? (labelColumn.length * this.DEFAULT_FONT_SIZE) : column.width,
42
+ width: isSearchField ? (labelColumn.length * this.DEFAULT_FONT_SIZE) : column.width,
39
43
  type: fieldData === null || fieldData === void 0 ? void 0 : fieldData.dataType,
40
44
  userInterface: fieldData === null || fieldData === void 0 ? void 0 : fieldData.userInterface,
41
45
  customFormatter
42
46
  };
43
- if (isUserInterfaceSEARCH && ((_b = fieldData === null || fieldData === void 0 ? void 0 : fieldData.properties) === null || _b === void 0 ? void 0 : _b.DESCRIPTIONFIELD) != undefined) {
44
- const labelDescription = (_c = fieldData === null || fieldData === void 0 ? void 0 : fieldData.properties) === null || _c === void 0 ? void 0 : _c.DESCRIPTIONENTITY;
45
- const mergedFrom = fieldData.properties.mergedFrom;
46
- const descriptionField = `${fieldData.properties.ENTITYNAME}.${fieldData.properties.DESCRIPTIONFIELD}`;
47
- descriptionColumn = {
48
- id: `${mergedFrom ? (mergedFrom + ".") : ""}${descriptionField}`,
49
- label: labelDescription,
50
- width: isUserInterfaceSEARCH && labelDescription ? (labelDescription.length * this.DEFAULT_FONT_SIZE - widthColumnDefault) : column.width,
51
- type: DataType.TEXT,
52
- userInterface: UserInterface.LONGTEXT,
53
- descriptionFrom: fieldData.name
54
- };
47
+ let descriptionColumn = isSearchField ? this.buildDescriptionColumn(fieldData, column) : undefined;
48
+ if (descriptionColumn) {
55
49
  const newWidth = this.getWidthByMetaData(column === null || column === void 0 ? void 0 : column.width, columnData === null || columnData === void 0 ? void 0 : columnData.width, descriptionColumn === null || descriptionColumn === void 0 ? void 0 : descriptionColumn.width);
56
50
  columnData = Object.assign(Object.assign({}, columnData), { width: newWidth === null || newWidth === void 0 ? void 0 : newWidth.codWidth });
57
51
  descriptionColumn = Object.assign(Object.assign({}, descriptionColumn), { width: newWidth === null || newWidth === void 0 ? void 0 : newWidth.descWidth, label: (descriptionColumn === null || descriptionColumn === void 0 ? void 0 : descriptionColumn.label) || (column === null || column === void 0 ? void 0 : column.label) });
@@ -63,6 +57,59 @@ export class CommonsExporter {
63
57
  ;
64
58
  return columnsMetadata || [];
65
59
  }
60
+ collectSearchPlusDescriptionIds(gridColumns) {
61
+ var _a;
62
+ const descriptionIds = new Set();
63
+ for (const column of gridColumns) {
64
+ if (this.isHiddenColumn(column)) {
65
+ continue;
66
+ }
67
+ const fieldData = (_a = this.dataUnit) === null || _a === void 0 ? void 0 : _a.getField(column.name);
68
+ if (!this.isSearchUserInterface(fieldData)) {
69
+ continue;
70
+ }
71
+ const descriptionId = this.buildDescriptionColumnId(fieldData);
72
+ if (descriptionId) {
73
+ descriptionIds.add(descriptionId);
74
+ }
75
+ }
76
+ return descriptionIds;
77
+ }
78
+ /**
79
+ * TODO: Analisar e criar uma melhor forma de tratar essa validação do "RECDESP".
80
+ */
81
+ isHiddenColumn(column) {
82
+ return column.hidden && column.name !== "RECDESP";
83
+ }
84
+ isSearchUserInterface(fieldData) {
85
+ return (fieldData === null || fieldData === void 0 ? void 0 : fieldData.userInterface) === UserInterface.SEARCH
86
+ || (fieldData === null || fieldData === void 0 ? void 0 : fieldData.userInterface) === UserInterface.SEARCHPLUS;
87
+ }
88
+ buildDescriptionColumnId(fieldData) {
89
+ const properties = fieldData === null || fieldData === void 0 ? void 0 : fieldData.properties;
90
+ if ((properties === null || properties === void 0 ? void 0 : properties.DESCRIPTIONFIELD) == undefined) {
91
+ return undefined;
92
+ }
93
+ const descriptionField = `${properties.ENTITYNAME}.${properties.DESCRIPTIONFIELD}`;
94
+ return properties.mergedFrom ? `${properties.mergedFrom}.${descriptionField}` : descriptionField;
95
+ }
96
+ buildDescriptionColumn(fieldData, column) {
97
+ var _a;
98
+ const id = this.buildDescriptionColumnId(fieldData);
99
+ if (!id) {
100
+ return undefined;
101
+ }
102
+ const labelDescription = (_a = fieldData === null || fieldData === void 0 ? void 0 : fieldData.properties) === null || _a === void 0 ? void 0 : _a.DESCRIPTIONENTITY;
103
+ const widthColumnDefault = 60;
104
+ return {
105
+ id,
106
+ label: labelDescription,
107
+ width: labelDescription ? (labelDescription.length * this.DEFAULT_FONT_SIZE - widthColumnDefault) : column.width,
108
+ type: DataType.TEXT,
109
+ userInterface: UserInterface.LONGTEXT,
110
+ descriptionFrom: fieldData.name
111
+ };
112
+ }
66
113
  getWidthByMetaData(maxWidth, widthCod, widthDescription) {
67
114
  const totalCurrentWidth = widthCod + widthDescription;
68
115
  const codPercentage = widthCod / totalCurrentWidth;
@@ -1,18 +1,21 @@
1
1
  :host {
2
2
  --snk-grid-min-height: 300px;
3
- --snk-grid-padding: var(--space--small);
3
+ --snk-grid-padding: unset;
4
+ --snk-grid-margin: var(--space--small);
5
+ --snk-grid-box-shadow: var(--shadow--small);
6
+ --snk-grid__header-padding: unset;
4
7
  }
5
8
 
6
9
  .snk-grid__container {
7
10
  display: flex;
8
11
  height: 100%;
9
12
  width: calc(100% - var(--space--12, 12px));
10
- /* padding: var(--snk-grid-padding); */
11
- margin: var(--snk-grid-padding);
13
+ margin: var(--snk-grid-margin);
12
14
  outline: none;
13
15
  border: 1px solid var(--color--strokes, #E1E2E5);
14
16
  border-radius: var(--border--radius-12, 12px);
15
- box-shadow: var(--shadow--small);
17
+ box-shadow: var(--snk-grid-box-shadow);
18
+ padding: var(--snk-grid-padding);
16
19
 
17
20
  --snk-grid-header--min-height: var(--space--52);
18
21
  }
@@ -24,6 +27,8 @@
24
27
  justify-content: flex-end;
25
28
  align-items: flex-start;
26
29
  min-height: var(--snk-grid-header--min-height);
30
+ padding-top: var(--snk-grid__header-padding);
31
+ padding-right: var(--snk-grid__header-padding);
27
32
  }
28
33
 
29
34
  .snk-grid__filter-bar {
@@ -60,4 +65,4 @@
60
65
  background-color: var(--background--xlight, #FFF);
61
66
  border-top: 1px solid var(--color--strokes, #E1E2E5);
62
67
  border-radius: 0 0 var(--border--radius-medium) var(--border--radius-medium);
63
- }
68
+ }
@@ -250,41 +250,35 @@ class CommonsExporter {
250
250
  return this.columnsState;
251
251
  }
252
252
  async buildColumnsMetadata(gridColumns) {
253
- var _a, _b, _c;
253
+ var _a;
254
254
  const columnsMetadata = [];
255
+ const searchPlusDescriptionIds = this.collectSearchPlusDescriptionIds(gridColumns);
255
256
  for (const column of gridColumns) {
257
+ if (this.isHiddenColumn(column)) {
258
+ continue;
259
+ }
256
260
  /**
257
- * TODO: Analisar e criar uma melhor forma de tratar essa validação do "RECDESP".
261
+ * A grid adiciona uma coluna auxiliar para a descrição de campos SEARCHPLUS
262
+ * (ex.: "ENTITYNAME.DESCRIPTIONFIELD"). A descrição já é emitida ao processar
263
+ * o próprio SEARCHPLUS, então pulamos a auxiliar para evitar duplicar a coluna.
258
264
  */
259
- if (column.hidden && column.name !== "RECDESP") {
265
+ if (searchPlusDescriptionIds.has(column.name)) {
260
266
  continue;
261
267
  }
262
268
  const fieldData = (_a = this.dataUnit) === null || _a === void 0 ? void 0 : _a.getField(column.name);
263
269
  const customFormatter = await this.grid.getCustomValueFormatter(column.name);
264
- const isUserInterfaceSEARCH = (fieldData === null || fieldData === void 0 ? void 0 : fieldData.userInterface) === UserInterface$1.SEARCH;
265
- const widthColumnDefault = 60;
266
- const labelColumn = isUserInterfaceSEARCH ? "Cód. " : column.label;
267
- let descriptionColumn = undefined;
270
+ const isSearchField = this.isSearchUserInterface(fieldData);
271
+ const labelColumn = isSearchField ? "Cód. " : column.label;
268
272
  let columnData = {
269
273
  id: column.name,
270
274
  label: labelColumn,
271
- width: isUserInterfaceSEARCH ? (labelColumn.length * this.DEFAULT_FONT_SIZE) : column.width,
275
+ width: isSearchField ? (labelColumn.length * this.DEFAULT_FONT_SIZE) : column.width,
272
276
  type: fieldData === null || fieldData === void 0 ? void 0 : fieldData.dataType,
273
277
  userInterface: fieldData === null || fieldData === void 0 ? void 0 : fieldData.userInterface,
274
278
  customFormatter
275
279
  };
276
- if (isUserInterfaceSEARCH && ((_b = fieldData === null || fieldData === void 0 ? void 0 : fieldData.properties) === null || _b === void 0 ? void 0 : _b.DESCRIPTIONFIELD) != undefined) {
277
- const labelDescription = (_c = fieldData === null || fieldData === void 0 ? void 0 : fieldData.properties) === null || _c === void 0 ? void 0 : _c.DESCRIPTIONENTITY;
278
- const mergedFrom = fieldData.properties.mergedFrom;
279
- const descriptionField = `${fieldData.properties.ENTITYNAME}.${fieldData.properties.DESCRIPTIONFIELD}`;
280
- descriptionColumn = {
281
- id: `${mergedFrom ? (mergedFrom + ".") : ""}${descriptionField}`,
282
- label: labelDescription,
283
- width: isUserInterfaceSEARCH && labelDescription ? (labelDescription.length * this.DEFAULT_FONT_SIZE - widthColumnDefault) : column.width,
284
- type: DataType.TEXT,
285
- userInterface: UserInterface$1.LONGTEXT,
286
- descriptionFrom: fieldData.name
287
- };
280
+ let descriptionColumn = isSearchField ? this.buildDescriptionColumn(fieldData, column) : undefined;
281
+ if (descriptionColumn) {
288
282
  const newWidth = this.getWidthByMetaData(column === null || column === void 0 ? void 0 : column.width, columnData === null || columnData === void 0 ? void 0 : columnData.width, descriptionColumn === null || descriptionColumn === void 0 ? void 0 : descriptionColumn.width);
289
283
  columnData = Object.assign(Object.assign({}, columnData), { width: newWidth === null || newWidth === void 0 ? void 0 : newWidth.codWidth });
290
284
  descriptionColumn = Object.assign(Object.assign({}, descriptionColumn), { width: newWidth === null || newWidth === void 0 ? void 0 : newWidth.descWidth, label: (descriptionColumn === null || descriptionColumn === void 0 ? void 0 : descriptionColumn.label) || (column === null || column === void 0 ? void 0 : column.label) });
@@ -295,6 +289,59 @@ class CommonsExporter {
295
289
  }
296
290
  return columnsMetadata || [];
297
291
  }
292
+ collectSearchPlusDescriptionIds(gridColumns) {
293
+ var _a;
294
+ const descriptionIds = new Set();
295
+ for (const column of gridColumns) {
296
+ if (this.isHiddenColumn(column)) {
297
+ continue;
298
+ }
299
+ const fieldData = (_a = this.dataUnit) === null || _a === void 0 ? void 0 : _a.getField(column.name);
300
+ if (!this.isSearchUserInterface(fieldData)) {
301
+ continue;
302
+ }
303
+ const descriptionId = this.buildDescriptionColumnId(fieldData);
304
+ if (descriptionId) {
305
+ descriptionIds.add(descriptionId);
306
+ }
307
+ }
308
+ return descriptionIds;
309
+ }
310
+ /**
311
+ * TODO: Analisar e criar uma melhor forma de tratar essa validação do "RECDESP".
312
+ */
313
+ isHiddenColumn(column) {
314
+ return column.hidden && column.name !== "RECDESP";
315
+ }
316
+ isSearchUserInterface(fieldData) {
317
+ return (fieldData === null || fieldData === void 0 ? void 0 : fieldData.userInterface) === UserInterface$1.SEARCH
318
+ || (fieldData === null || fieldData === void 0 ? void 0 : fieldData.userInterface) === UserInterface$1.SEARCHPLUS;
319
+ }
320
+ buildDescriptionColumnId(fieldData) {
321
+ const properties = fieldData === null || fieldData === void 0 ? void 0 : fieldData.properties;
322
+ if ((properties === null || properties === void 0 ? void 0 : properties.DESCRIPTIONFIELD) == undefined) {
323
+ return undefined;
324
+ }
325
+ const descriptionField = `${properties.ENTITYNAME}.${properties.DESCRIPTIONFIELD}`;
326
+ return properties.mergedFrom ? `${properties.mergedFrom}.${descriptionField}` : descriptionField;
327
+ }
328
+ buildDescriptionColumn(fieldData, column) {
329
+ var _a;
330
+ const id = this.buildDescriptionColumnId(fieldData);
331
+ if (!id) {
332
+ return undefined;
333
+ }
334
+ const labelDescription = (_a = fieldData === null || fieldData === void 0 ? void 0 : fieldData.properties) === null || _a === void 0 ? void 0 : _a.DESCRIPTIONENTITY;
335
+ const widthColumnDefault = 60;
336
+ return {
337
+ id,
338
+ label: labelDescription,
339
+ width: labelDescription ? (labelDescription.length * this.DEFAULT_FONT_SIZE - widthColumnDefault) : column.width,
340
+ type: DataType.TEXT,
341
+ userInterface: UserInterface$1.LONGTEXT,
342
+ descriptionFrom: fieldData.name
343
+ };
344
+ }
298
345
  getWidthByMetaData(maxWidth, widthCod, widthDescription) {
299
346
  const totalCurrentWidth = widthCod + widthDescription;
300
347
  const codPercentage = widthCod / totalCurrentWidth;
@@ -149,6 +149,16 @@ function insertCustomButtonsBeforeSpacer(buttons, customButtons) {
149
149
  }
150
150
  return [...customButtons, ...buttons];
151
151
  }
152
+ function buildNavigationDisabledBtns(dataState) {
153
+ const navigationDisabled = [];
154
+ if (!(dataState === null || dataState === void 0 ? void 0 : dataState.hasPrevious)) {
155
+ navigationDisabled.push(TaskbarElement.PREVIOUS);
156
+ }
157
+ if (!(dataState === null || dataState === void 0 ? void 0 : dataState.hasNext)) {
158
+ navigationDisabled.push(TaskbarElement.NEXT);
159
+ }
160
+ return navigationDisabled;
161
+ }
152
162
  function buildNativeTaskbarManager(currentViewMode, mergeTaskbarManager, messagesBuilder) {
153
163
  var _a, _b;
154
164
  const CUSTOM_BUTTONS = [
@@ -219,6 +229,10 @@ function buildNativeTaskbarManager(currentViewMode, mergeTaskbarManager, message
219
229
  if (!hasSelectedRecord && buttonsRequiringSelection.includes(buttonName)) {
220
230
  return false;
221
231
  }
232
+ const navigationDisabled = buildNavigationDisabledBtns(dataState);
233
+ if (navigationDisabled.includes(buttonName)) {
234
+ return false;
235
+ }
222
236
  return (_a = mergeTaskbarManager === null || mergeTaskbarManager === void 0 ? void 0 : mergeTaskbarManager.isEnabled(_, dataState, buttonName, originalValue)) !== null && _a !== void 0 ? _a : originalValue;
223
237
  },
224
238
  getMoreOptions(taskbarId, configName, dataState, currentActions) {