@sankhyalabs/sankhyablocks 4.4.0-hotfix-ga-SKA-99999.1 → 4.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/dist/cjs/{ConfigStorage-05b9b162.js → ConfigStorage-bc7d1d9b.js} +1 -1
  2. package/dist/cjs/{DataFetcher-451b3e68.js → DataFetcher-6acfc3a8.js} +3 -3
  3. package/dist/cjs/{SnkFormConfigManager-18ed80a5.js → SnkFormConfigManager-5230e010.js} +2 -2
  4. package/dist/cjs/{SnkMessageBuilder-0a6f6459.js → SnkMessageBuilder-d147f088.js} +8 -1
  5. package/dist/cjs/{constants-3d09ebea.js → constants-73803daf.js} +5 -0
  6. package/dist/cjs/{form-config-fetcher-a93d6334.js → form-config-fetcher-4a952a50.js} +1 -1
  7. package/dist/cjs/loader.cjs.js +1 -1
  8. package/dist/cjs/sankhyablocks.cjs.js +1 -1
  9. package/dist/cjs/snk-application.cjs.entry.js +4 -4
  10. package/dist/cjs/snk-config-options.cjs.entry.js +1 -1
  11. package/dist/cjs/snk-configurator.cjs.entry.js +1 -1
  12. package/dist/cjs/snk-crud.cjs.entry.js +2 -2
  13. package/dist/cjs/snk-data-exporter.cjs.entry.js +4 -4
  14. package/dist/cjs/snk-data-unit.cjs.entry.js +2 -2
  15. package/dist/cjs/snk-detail-view.cjs.entry.js +6 -6
  16. package/dist/cjs/snk-field-config.cjs.entry.js +1 -1
  17. package/dist/cjs/snk-filter-bar.cjs.entry.js +3 -3
  18. package/dist/cjs/snk-filter-field-search.cjs.entry.js +185 -0
  19. package/dist/cjs/snk-form-config.cjs.entry.js +3 -3
  20. package/dist/cjs/snk-form.cjs.entry.js +4 -4
  21. package/dist/cjs/snk-grid-config.cjs.entry.js +4 -4
  22. package/dist/cjs/snk-grid.cjs.entry.js +3 -3
  23. package/dist/cjs/{snk-guides-viewer-618e5c1d.js → snk-guides-viewer-5d3dca5d.js} +3 -3
  24. package/dist/cjs/snk-guides-viewer.cjs.entry.js +6 -6
  25. package/dist/cjs/snk-select-box.cjs.entry.js +1 -1
  26. package/dist/cjs/snk-simple-crud.cjs.entry.js +252 -0
  27. package/dist/cjs/snk-tab-config.cjs.entry.js +1 -1
  28. package/dist/collection/collection-manifest.json +2 -0
  29. package/dist/collection/components/snk-filter-field-search/interfaces/index.js +5 -0
  30. package/dist/collection/components/snk-filter-field-search/snk-filter-field-search.css +41 -0
  31. package/dist/collection/components/snk-filter-field-search/snk-filter-field-search.js +297 -0
  32. package/dist/collection/components/snk-filter-field-search/subcomponents/index.js +1 -0
  33. package/dist/collection/components/snk-filter-field-search/subcomponents/list-item.js +24 -0
  34. package/dist/collection/components/snk-simple-crud/snk-simple-crud.css +27 -0
  35. package/dist/collection/components/snk-simple-crud/snk-simple-crud.js +343 -0
  36. package/dist/collection/lib/dataUnit/InMemoryLoader.js +112 -0
  37. package/dist/collection/lib/http/data-fetcher/DataFetcher.js +3 -3
  38. package/dist/collection/lib/http/data-fetcher/fetchers/fetchDataExporter/index.js +1 -1
  39. package/dist/collection/lib/http/data-fetcher/fetchers/fetchDataExporter/personalized-reports-fetcher.js +1 -1
  40. package/dist/collection/lib/message/SnkMessageBuilder.js +3 -1
  41. package/dist/collection/lib/message/resources/snk-filter-field-search.msg.js +5 -0
  42. package/dist/collection/lib/utils/constants.js +5 -0
  43. package/dist/components/DataFetcher.js +3 -3
  44. package/dist/components/SnkMessageBuilder.js +8 -1
  45. package/dist/components/constants.js +6 -1
  46. package/dist/components/index.d.ts +2 -0
  47. package/dist/components/index.js +2 -0
  48. package/dist/components/snk-data-exporter2.js +2 -2
  49. package/dist/components/snk-detail-view2.js +2 -1
  50. package/dist/components/snk-filter-field-search.d.ts +11 -0
  51. package/dist/components/snk-filter-field-search.js +205 -0
  52. package/dist/components/snk-grid2.js +2 -47
  53. package/dist/components/snk-simple-crud.d.ts +11 -0
  54. package/dist/components/snk-simple-crud.js +297 -0
  55. package/dist/components/taskbar-processor.js +47 -0
  56. package/dist/esm/{ConfigStorage-34caac5c.js → ConfigStorage-1b64cd96.js} +1 -1
  57. package/dist/esm/{DataFetcher-00309101.js → DataFetcher-5e99fa75.js} +3 -3
  58. package/dist/esm/{SnkFormConfigManager-d3a8aaf4.js → SnkFormConfigManager-0d9752c3.js} +2 -2
  59. package/dist/esm/{SnkMessageBuilder-9473ae03.js → SnkMessageBuilder-0e1ffd61.js} +8 -1
  60. package/dist/esm/{constants-fb9721cc.js → constants-9560e54f.js} +6 -1
  61. package/dist/esm/{form-config-fetcher-e58fc104.js → form-config-fetcher-677f86dd.js} +1 -1
  62. package/dist/esm/loader.js +1 -1
  63. package/dist/esm/sankhyablocks.js +1 -1
  64. package/dist/esm/snk-application.entry.js +4 -4
  65. package/dist/esm/snk-config-options.entry.js +1 -1
  66. package/dist/esm/snk-configurator.entry.js +1 -1
  67. package/dist/esm/snk-crud.entry.js +2 -2
  68. package/dist/esm/snk-data-exporter.entry.js +4 -4
  69. package/dist/esm/snk-data-unit.entry.js +2 -2
  70. package/dist/esm/snk-detail-view.entry.js +6 -6
  71. package/dist/esm/snk-field-config.entry.js +1 -1
  72. package/dist/esm/snk-filter-bar.entry.js +3 -3
  73. package/dist/esm/snk-filter-field-search.entry.js +181 -0
  74. package/dist/esm/snk-form-config.entry.js +3 -3
  75. package/dist/esm/snk-form.entry.js +4 -4
  76. package/dist/esm/snk-grid-config.entry.js +4 -4
  77. package/dist/esm/snk-grid.entry.js +3 -3
  78. package/dist/esm/{snk-guides-viewer-7c32399d.js → snk-guides-viewer-6bb54367.js} +3 -3
  79. package/dist/esm/snk-guides-viewer.entry.js +6 -6
  80. package/dist/esm/snk-select-box.entry.js +1 -1
  81. package/dist/esm/snk-simple-crud.entry.js +248 -0
  82. package/dist/esm/snk-tab-config.entry.js +1 -1
  83. package/dist/sankhyablocks/{p-9cff8df2.js → p-0c11c980.js} +1 -1
  84. package/dist/sankhyablocks/{p-52989652.entry.js → p-268ab84f.entry.js} +1 -1
  85. package/dist/sankhyablocks/{p-0fe01a57.entry.js → p-2a3996b0.entry.js} +1 -1
  86. package/dist/sankhyablocks/p-330813ff.entry.js +1 -0
  87. package/dist/sankhyablocks/{p-25341d65.js → p-3c4823fc.js} +1 -1
  88. package/dist/sankhyablocks/{p-44c23eb1.entry.js → p-4bd183ba.entry.js} +1 -1
  89. package/dist/sankhyablocks/{p-c4483cb2.js → p-5518d572.js} +1 -1
  90. package/dist/sankhyablocks/{p-e0416591.entry.js → p-7889d481.entry.js} +1 -1
  91. package/dist/sankhyablocks/p-79d22df0.entry.js +1 -0
  92. package/dist/sankhyablocks/{p-fc86a31e.entry.js → p-869d6616.entry.js} +1 -1
  93. package/dist/sankhyablocks/{p-99742169.entry.js → p-86efa17d.entry.js} +1 -1
  94. package/dist/sankhyablocks/{p-2980936b.entry.js → p-8b0e8deb.entry.js} +1 -1
  95. package/dist/sankhyablocks/{p-ca72cc38.js → p-9bf0319f.js} +1 -1
  96. package/dist/sankhyablocks/{p-83ddac9f.entry.js → p-9f00c061.entry.js} +1 -1
  97. package/dist/sankhyablocks/{p-43d8d388.entry.js → p-9f2306ba.entry.js} +1 -1
  98. package/dist/sankhyablocks/{p-9d4a25d2.js → p-9f98fc3c.js} +1 -1
  99. package/dist/sankhyablocks/{p-840494aa.entry.js → p-a056d61f.entry.js} +1 -1
  100. package/dist/sankhyablocks/{p-70037212.js → p-a6258eed.js} +1 -1
  101. package/dist/sankhyablocks/{p-de1ee26c.entry.js → p-b318cec6.entry.js} +1 -1
  102. package/dist/sankhyablocks/p-c0bfafcb.entry.js +1 -0
  103. package/dist/sankhyablocks/p-cf9d1b55.entry.js +1 -0
  104. package/dist/sankhyablocks/{p-8899a7ea.entry.js → p-d3199c18.entry.js} +1 -1
  105. package/dist/sankhyablocks/{p-9d62bbca.entry.js → p-dbeac5db.entry.js} +1 -1
  106. package/dist/sankhyablocks/{p-f5d3ecb3.js → p-ecbfbb4a.js} +1 -1
  107. package/dist/sankhyablocks/{p-6e6ef989.entry.js → p-f83e3219.entry.js} +1 -1
  108. package/dist/sankhyablocks/sankhyablocks.esm.js +1 -1
  109. package/dist/types/components/snk-filter-field-search/interfaces/index.d.ts +35 -0
  110. package/dist/types/components/snk-filter-field-search/snk-filter-field-search.d.ts +58 -0
  111. package/dist/types/components/snk-filter-field-search/subcomponents/index.d.ts +1 -0
  112. package/dist/types/components/snk-filter-field-search/subcomponents/list-item.d.ts +2 -0
  113. package/dist/types/components/snk-simple-crud/snk-simple-crud.d.ts +41 -0
  114. package/dist/types/components.d.ts +81 -2
  115. package/dist/types/lib/dataUnit/InMemoryLoader.d.ts +21 -0
  116. package/dist/types/lib/message/resources/snk-filter-field-search.msg.d.ts +1 -0
  117. package/dist/types/lib/utils/constants.d.ts +4 -0
  118. package/package.json +2 -2
  119. package/react/components.d.ts +2 -0
  120. package/react/components.js +2 -0
  121. package/react/components.js.map +1 -1
  122. package/dist/sankhyablocks/p-4de78929.entry.js +0 -1
  123. package/dist/sankhyablocks/p-e7cc6e62.entry.js +0 -1
@@ -0,0 +1,205 @@
1
+ import { h, proxyCustomElement, HTMLElement, createEvent } from '@stencil/core/internal/client';
2
+ import { UserInterface, JSUtils, ElementIDUtils, ApplicationContext } from '@sankhyalabs/core';
3
+
4
+ var SelectedItemType;
5
+ (function (SelectedItemType) {
6
+ SelectedItemType["LINK"] = "LINK";
7
+ SelectedItemType["FIELD"] = "FIELD";
8
+ })(SelectedItemType || (SelectedItemType = {}));
9
+
10
+ const ICON_MODES = {
11
+ [UserInterface.SHORTTEXT]: 'text',
12
+ [UserInterface.LONGTEXT]: 'text',
13
+ [UserInterface.INTEGERNUMBER]: 'number',
14
+ [UserInterface.DECIMALNUMBER]: 'number',
15
+ [UserInterface.DATE]: 'calendar',
16
+ [UserInterface.DATETIME]: 'calendar',
17
+ [UserInterface.SWITCH]: 'boolean',
18
+ [UserInterface.CHECKBOX]: 'check-circle-inverted',
19
+ [UserInterface.OPTIONSELECTOR]: 'list',
20
+ [UserInterface.SEARCH]: 'search',
21
+ [UserInterface.HTML]: 'tag_code',
22
+ [UserInterface.IMAGE]: 'png',
23
+ [UserInterface.FILE]: 'edit-file',
24
+ [UserInterface.TIME]: 'timer-outline',
25
+ [UserInterface.ELAPSEDTIME]: 'timer',
26
+ [UserInterface.MASKEDTEXT]: 'text',
27
+ [UserInterface.PASSWORD]: 'email',
28
+ };
29
+ const ListItem = ({ userInterface, description }) => {
30
+ return (h("ez-icon", { iconName: ICON_MODES[userInterface], className: "ez-padding-left--small", title: description }));
31
+ };
32
+
33
+ const snkFilterFieldSearchCss = ".sc-snk-filter-field-search-h{--snk-filter-field-search--container-width:468px;--snk-filter-field-search--container-height:322px}.snk-filter-field-search__container.sc-snk-filter-field-search{display:flex;flex-direction:column;padding:var(--space--medium);width:var(--snk-filter-field-search--container-width);height:var(--snk-filter-field-search--container-height)}.snk-filter-field-search__section.sc-snk-filter-field-search{display:grid;grid-template-columns:1fr 1fr;place-items:flex-start;overflow:hidden;gap:var(--space--small)}.snk-filter-field-search__input.sc-snk-filter-field-search{margin-bottom:var(--space--medium)}.snk-filter-field-search__list_container.sc-snk-filter-field-search{display:flex;flex-direction:column}.snk-filter-field-search__list.sc-snk-filter-field-search{overflow-y:auto}";
34
+
35
+ const SNK_CONTEXT_KEY = "__SNK__APPLICATION__";
36
+ const SnkFilterFieldSearch$1 = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
37
+ constructor() {
38
+ super();
39
+ this.__registerHost();
40
+ this.ezSelectFilterItem = createEvent(this, "ezSelectFilterItem", 7);
41
+ this._filterMetadataStorage = new Map();
42
+ this._dataSource = null;
43
+ this._filterText = "";
44
+ this._isLoading = false;
45
+ this.searchable = true;
46
+ this.breadcrumbItems = [];
47
+ this.linkItems = [];
48
+ this.fieldItems = [];
49
+ }
50
+ /**
51
+ * Define a fonte de dados do componente.
52
+ * @param {IFilterLink} currentLink - Link atual da entidade.
53
+ * @param {IFilterMetadata} fetchData - callback que executa a busca de dados.
54
+ * @throws {Error} - Quando os metadados não forem válidos.
55
+ * @throws {Error} - Quando o link atual não for do tipo link.
56
+ */
57
+ async setDataSource(currentLink, fetchData) {
58
+ var _a;
59
+ this._isLoading = true;
60
+ let metadata = this._filterMetadataStorage.get(currentLink.uri);
61
+ if (!metadata) {
62
+ metadata = await fetchData(currentLink);
63
+ this._filterMetadataStorage.set(currentLink.uri, metadata);
64
+ }
65
+ const { fields, links } = metadata || {};
66
+ if (!Array.isArray(fields) || !Array.isArray(links))
67
+ throw new Error('Invalid metadata');
68
+ if (currentLink.type !== SelectedItemType.LINK)
69
+ throw new Error('The current link must be a link type');
70
+ this._dataSource = metadata;
71
+ this._currentLink = currentLink;
72
+ this.mapDataSourceToLinkItems();
73
+ this.mapDataSourceToFieldItems();
74
+ this._isLoading = false;
75
+ (_a = this._ezPopover) === null || _a === void 0 ? void 0 : _a.show();
76
+ this._ezFieldList.scrollToTop();
77
+ this._ezLinkList.scrollToTop();
78
+ }
79
+ /**
80
+ * Filtra a fonte de dados do componente.
81
+ * @param {string} filterText - Texto para filtrar a fonte de dados.
82
+ * @throws {Error} - Quando o componente estiver com a propriedade searchable como true.
83
+ */
84
+ async filterDataSource(filterText) {
85
+ if (this.searchable)
86
+ throw new Error('This method is not available when searchable is true');
87
+ this.handleFilterChange(filterText);
88
+ }
89
+ mapDataSourceToLinkItems() {
90
+ var _a;
91
+ const { links } = this._dataSource;
92
+ const filterLinkLabelMessage = this.getMessage('snkFilterFieldSearch.linkLabel', { link: (_a = this._currentLink) === null || _a === void 0 ? void 0 : _a.description });
93
+ const items = links.map(link => (Object.assign({ label: link.description }, link)));
94
+ this.linkItems = [{
95
+ group: filterLinkLabelMessage,
96
+ items
97
+ }];
98
+ if (this.breadcrumbItems.length === 0) {
99
+ this.breadcrumbItems = [Object.assign({ id: JSUtils.generateUUID(), label: this._currentLink.description }, this._currentLink)];
100
+ }
101
+ }
102
+ mapDataSourceToFieldItems() {
103
+ var _a;
104
+ const { fields } = this._dataSource;
105
+ const filterFieldLabelMessage = this.getMessage('snkFilterFieldSearch.fieldLabel', { link: (_a = this._currentLink) === null || _a === void 0 ? void 0 : _a.description });
106
+ const filteredFields = fields.filter(field => {
107
+ if (!this._currentLink)
108
+ return true;
109
+ const searchableByDescription = field.description.toLowerCase().includes(this._filterText.toLowerCase());
110
+ const searchableByName = field.name.toLowerCase().includes(this._filterText.toLowerCase());
111
+ return searchableByDescription || searchableByName;
112
+ });
113
+ const items = filteredFields.map(field => (Object.assign({ label: field.description }, field)));
114
+ this.fieldItems = [{
115
+ group: filterFieldLabelMessage,
116
+ items
117
+ }];
118
+ }
119
+ handleFilterChange(filterText) {
120
+ if (this._isLoading)
121
+ return;
122
+ this._filterText = filterText;
123
+ this.mapDataSourceToFieldItems();
124
+ }
125
+ handleSelectLink({ detail: item }) {
126
+ if (this._isLoading)
127
+ return;
128
+ const breadcrumbByIndex = this.breadcrumbItems.findIndex(breadcrumbItem => breadcrumbItem.id === item.id);
129
+ item.cache = this._filterMetadataStorage.has(item.uri);
130
+ if (breadcrumbByIndex > -1) {
131
+ this.breadcrumbItems = this.breadcrumbItems.slice(0, (breadcrumbByIndex + 1));
132
+ }
133
+ else {
134
+ this.breadcrumbItems = [...this.breadcrumbItems, Object.assign({ id: JSUtils.generateUUID(), label: item.description }, item)];
135
+ }
136
+ this.ezSelectFilterItem.emit(Object.assign(Object.assign({}, item), { type: SelectedItemType.LINK }));
137
+ }
138
+ handleSelectField({ detail: item }) {
139
+ var _a;
140
+ const breadcrumbPath = this.breadcrumbItems.map(breadcrumbItem => breadcrumbItem.label).join('>>');
141
+ const selectedField = Object.assign(Object.assign({}, item), { type: SelectedItemType.FIELD, path: `${breadcrumbPath} >> ${item.description}` });
142
+ this.ezSelectFilterItem.emit(selectedField);
143
+ (_a = this._ezPopover) === null || _a === void 0 ? void 0 : _a.hide();
144
+ }
145
+ getElementID(sufix) {
146
+ return {
147
+ [ElementIDUtils.DATA_ELEMENT_ID_ATTRIBUTE_NAME]: ElementIDUtils.getInternalIDInfo(sufix)
148
+ };
149
+ }
150
+ /**
151
+ * Conforme mecanismo de mensagens, é possível customizar as mensagens dos blocos de construção
152
+ * através de um pequeno modulo na estrutura da aplicação:
153
+ * - Criar um arquivo no seguinte caminho: /messages/appmessages.msg.js.
154
+ * Para conhecer os detalhes do módulo, vide o arquivo neste projeto "/src/lib/message/resources/snk-filter-field-search.msg.ts"
155
+ */
156
+ getMessage(key, params) {
157
+ var _a, _b, _c;
158
+ if (!this._application)
159
+ this._application = ApplicationContext.getContextValue(SNK_CONTEXT_KEY);
160
+ return (_c = (_b = (_a = this._application) === null || _a === void 0 ? void 0 : _a.messagesBuilder) === null || _b === void 0 ? void 0 : _b.getMessage) === null || _c === void 0 ? void 0 : _c.call(_b, key, params);
161
+ }
162
+ ;
163
+ componentWillLoad() {
164
+ this._application = ApplicationContext.getContextValue(SNK_CONTEXT_KEY);
165
+ }
166
+ componentDidLoad() {
167
+ ElementIDUtils.addIDInfoIfNotExists(this._ezPopover, 'popover');
168
+ }
169
+ disconnectedCallback() {
170
+ var _a;
171
+ this._filterMetadataStorage.clear();
172
+ (_a = this._ezPopover) === null || _a === void 0 ? void 0 : _a.hide();
173
+ }
174
+ render() {
175
+ var _a;
176
+ const searchLabelMessage = this.getMessage('snkFilterFieldSearch.searchLabel');
177
+ return (h("ez-popover", Object.assign({ ref: (el) => this._ezPopover = el, role: "dialog", "aria-hidden": !((_a = this._ezPopover) === null || _a === void 0 ? void 0 : _a.opened) }, this.getElementID('EzPopover')), h("div", { class: "snk-filter-field-search__container" }, h("header", { class: "snk-filter-field-search__header" }, this.searchable && !!searchLabelMessage && (h("ez-filter-input", Object.assign({ class: "snk-filter-field-search__input", label: searchLabelMessage, asyncSearch: true, canShowError: false, onEzSearching: (event) => this.handleFilterChange.bind(this)(event.detail), "aria-label": searchLabelMessage, "aria-required": "false", "aria-invalid": "false" }, this.getElementID('EzFilterInput')))), this.breadcrumbItems.length > 0 && (h("ez-breadcrumb", Object.assign({ items: this.breadcrumbItems, onSelectedItem: this.handleSelectLink.bind(this), role: "navigation", "aria-current": "step" }, this.getElementID('EzBreadcrumb')))), h("hr", { class: "ez-divider-horizontal ez-margin-vertical--medium" })), h("section", { class: "snk-filter-field-search__section" }, h("ez-list", Object.assign({ ref: (el) => this._ezLinkList = el, class: "snk-filter-field-search__list", id: "filterLinkList", useGroups: true, dataSource: this.linkItems, onEzSelectItem: this.handleSelectLink.bind(this), hoverFeedback: true, ezSelectable: true, itemSlotBuilder: ({ fieldCount }) => h("ez-badge", { label: fieldCount }), "aria-describedby": "filterLinkLabel" }, this.getElementID('EzListLinks'))), h("ez-list", Object.assign({ ref: (el) => this._ezFieldList = el, class: "snk-filter-field-search__list", id: "filterFieldList", useGroups: true, dataSource: this.fieldItems, onEzSelectItem: this.handleSelectField.bind(this), hoverFeedback: true, ezSelectable: true, itemSlotBuilder: ListItem, "aria-describedby": "filterFieldLabel" }, this.getElementID('EzListFields')))))));
178
+ }
179
+ static get style() { return snkFilterFieldSearchCss; }
180
+ }, [2, "snk-filter-field-search", {
181
+ "searchable": [4],
182
+ "breadcrumbItems": [32],
183
+ "linkItems": [32],
184
+ "fieldItems": [32],
185
+ "setDataSource": [64],
186
+ "filterDataSource": [64]
187
+ }]);
188
+ function defineCustomElement$1() {
189
+ if (typeof customElements === "undefined") {
190
+ return;
191
+ }
192
+ const components = ["snk-filter-field-search"];
193
+ components.forEach(tagName => { switch (tagName) {
194
+ case "snk-filter-field-search":
195
+ if (!customElements.get(tagName)) {
196
+ customElements.define(tagName, SnkFilterFieldSearch$1);
197
+ }
198
+ break;
199
+ } });
200
+ }
201
+
202
+ const SnkFilterFieldSearch = SnkFilterFieldSearch$1;
203
+ const defineCustomElement = defineCustomElement$1;
204
+
205
+ export { SnkFilterFieldSearch, defineCustomElement };
@@ -3,6 +3,7 @@ import { ElementIDUtils, ApplicationContext, DataType } from '@sankhyalabs/core'
3
3
  import { UserInterface } from '@sankhyalabs/core/dist/dataunit/metadata/UnitMetadata';
4
4
  import { C as ConfigStorage } from './ConfigStorage.js';
5
5
  import { P as PresentationMode } from './index2.js';
6
+ import { T as TaskbarProcessor } from './taskbar-processor.js';
6
7
  import { s as store, d as defineCustomElement$1 } from './snk-taskbar2.js';
7
8
  import { d as defineCustomElement$a } from './snk-data-exporter2.js';
8
9
  import { d as defineCustomElement$9 } from './snk-exporter-email-sender2.js';
@@ -14,52 +15,6 @@ import { d as defineCustomElement$4 } from './snk-filter-modal2.js';
14
15
  import { d as defineCustomElement$3 } from './snk-grid-config2.js';
15
16
  import { d as defineCustomElement$2 } from './snk-select-box2.js';
16
17
 
17
- class TaskbarProcessor {
18
- constructor(defaultButtons) {
19
- this._defaultButtons = defaultButtons;
20
- }
21
- process(taskbarId, taskbarManager, dataState, disabledButtons = [], invisibleButtons = []) {
22
- var _a;
23
- this.customButtons = new Map();
24
- this.buttons = "";
25
- this.disabledButtons = [];
26
- (_a = this.getButtonsArray(taskbarId, taskbarManager, dataState)) === null || _a === void 0 ? void 0 : _a.forEach(btnDef => {
27
- let buttonName;
28
- if (typeof btnDef === "string") {
29
- buttonName = btnDef;
30
- }
31
- else {
32
- const customBtn = btnDef;
33
- this.customButtons.set(customBtn.name, customBtn);
34
- buttonName = customBtn.name;
35
- }
36
- if (!invisibleButtons.includes(buttonName)) {
37
- if (!this.isEnabled(taskbarId, taskbarManager, buttonName, dataState, disabledButtons)) {
38
- this.disabledButtons.push(buttonName);
39
- }
40
- if (this.buttons.length > 0) {
41
- this.buttons += ",";
42
- }
43
- this.buttons += buttonName;
44
- }
45
- });
46
- }
47
- getButtonsArray(taskbarId, taskbarManager, dataState) {
48
- const defaults = this._defaultButtons[taskbarId];
49
- if (taskbarManager) {
50
- return taskbarManager.getButtons(taskbarId, dataState, [...defaults]);
51
- }
52
- return defaults;
53
- }
54
- isEnabled(taskbarId, taskbarManager, buttonName, dataState, disabled) {
55
- const originalValue = disabled.includes(buttonName) ? false : true;
56
- if (taskbarManager && taskbarManager.isEnabled) {
57
- return taskbarManager.isEnabled(taskbarId, dataState, buttonName, originalValue);
58
- }
59
- return originalValue;
60
- }
61
- }
62
-
63
18
  const snkGridCss = ".snk-grid__container.sc-snk-grid{display:flex;height:100%;width:100%}.snk-grid__header.sc-snk-grid{display:flex;flex-wrap:nowrap;width:100%}.snk-grid__filter-bar.sc-snk-grid{width:100%}.snk-grid__header-divider.sc-snk-grid{margin-bottom:var(--space--medium)}.snk-grid__table.sc-snk-grid{min-height:300px}.snk-grid-container__without-shadow.sc-snk-grid{--ezgrid__container--shadow:unset}";
64
19
 
65
20
  const SnkGrid = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
@@ -384,4 +339,4 @@ function defineCustomElement() {
384
339
  } });
385
340
  }
386
341
 
387
- export { SnkGrid as S, TaskbarProcessor as T, defineCustomElement as d };
342
+ export { SnkGrid as S, defineCustomElement as d };
@@ -0,0 +1,11 @@
1
+ import type { Components, JSX } from "../types/components";
2
+
3
+ interface SnkSimpleCrud extends Components.SnkSimpleCrud, HTMLElement {}
4
+ export const SnkSimpleCrud: {
5
+ prototype: SnkSimpleCrud;
6
+ new (): SnkSimpleCrud;
7
+ };
8
+ /**
9
+ * Used to define this component and all nested components recursively.
10
+ */
11
+ export const defineCustomElement: () => void;
@@ -0,0 +1,297 @@
1
+ import { proxyCustomElement, HTMLElement, h } from '@stencil/core/internal/client';
2
+ import { DataUnit, StringUtils, SortMode, DataType, ChangeOperation, UserInterface } from '@sankhyalabs/core';
3
+ import { V as VIEW_MODE, S as SIMPLE_CRUD_MODE } from './constants.js';
4
+ import { T as TaskbarElement, d as defineCustomElement$2 } from './snk-taskbar2.js';
5
+ import './DataFetcher.js';
6
+ import { P as PresentationMode } from './index2.js';
7
+ import { T as TaskbarProcessor } from './taskbar-processor.js';
8
+ import { d as defineCustomElement$5 } from './snk-data-exporter2.js';
9
+ import { d as defineCustomElement$4 } from './snk-data-unit2.js';
10
+ import { d as defineCustomElement$3 } from './snk-exporter-email-sender2.js';
11
+
12
+ class InMemoryLoader {
13
+ constructor(metadata, records) {
14
+ this.records = records || [];
15
+ this.metadata = metadata;
16
+ this._dataUnit = new DataUnit("InMemoryDataUnit");
17
+ this._dataUnit.metadataLoader = () => this.metadaLoader();
18
+ this._dataUnit.dataLoader = (_dataUnit, request) => this.dataLoader(_dataUnit, request);
19
+ this._dataUnit.saveLoader = (_dataUnit, changes) => this.saveLoader(_dataUnit, changes);
20
+ this._dataUnit.removeLoader = (_dataUnit, recordIds) => this.removeLoader(_dataUnit, recordIds);
21
+ this.dataUnit.loadMetadata().then(() => this.dataUnit.loadData());
22
+ }
23
+ get dataUnit() {
24
+ return this._dataUnit;
25
+ }
26
+ get records() {
27
+ return this._records;
28
+ }
29
+ set records(records) {
30
+ this._records = records === null || records === void 0 ? void 0 : records.map(record => {
31
+ if (!record["__record__id__"]) {
32
+ record["__record__id__"] = this.generateUniqueId();
33
+ }
34
+ return record;
35
+ });
36
+ if (this._dataUnit) {
37
+ this._dataUnit.records = [...this._records];
38
+ }
39
+ }
40
+ get metadata() {
41
+ return this._metadata;
42
+ }
43
+ set metadata(metadata) {
44
+ this._metadata = metadata;
45
+ if (this._dataUnit) {
46
+ this._dataUnit.metadata = this._metadata;
47
+ }
48
+ }
49
+ generateUniqueId() {
50
+ return StringUtils.generateUUID();
51
+ }
52
+ metadaLoader() {
53
+ return Promise.resolve(this._metadata);
54
+ }
55
+ dataLoader(_dataUnit, request) {
56
+ let records = [...this._records];
57
+ if (request.sort) {
58
+ request.sort.forEach(sort => {
59
+ records = records.sort((recordA, recordB) => {
60
+ const fieldA = recordA[sort.field];
61
+ const fieldB = recordB[sort.field];
62
+ const sortFn = this.getSortFn(sort.dataType);
63
+ return sortFn(fieldA, fieldB) * (sort.mode == SortMode.ASC ? 1 : -1);
64
+ });
65
+ });
66
+ }
67
+ return Promise.resolve({ records: records });
68
+ }
69
+ getSortFn(type) {
70
+ switch (type) {
71
+ case DataType.NUMBER:
72
+ return this.sortNumber;
73
+ case DataType.DATE:
74
+ return this.sortDate;
75
+ case DataType.OBJECT:
76
+ return this.sortObject;
77
+ default:
78
+ return StringUtils.compare;
79
+ }
80
+ }
81
+ sortObject(a, b) {
82
+ return StringUtils.compare(a["label"], b["label"]);
83
+ }
84
+ sortNumber(a, b) {
85
+ return a - b;
86
+ }
87
+ sortDate(a, b) {
88
+ let timeA = a.getTime(), timeB = b.getTime();
89
+ return timeA === timeB ? 0 : (timeA < timeB ? -1 : 1);
90
+ }
91
+ saveLoader(_dataUnit, changes) {
92
+ return new Promise((resolve) => {
93
+ let dataUnitRecords = [];
94
+ changes.forEach(change => {
95
+ let { record, updatingFields, operation } = change;
96
+ let isAdd = false;
97
+ if (operation === ChangeOperation.INSERT ||
98
+ operation === ChangeOperation.COPY) {
99
+ record["__old__id__"] = record["__record__id__"];
100
+ record["__record__id__"] = this.generateUniqueId();
101
+ isAdd = true;
102
+ }
103
+ const changedRecord = Object.assign(Object.assign({}, record), updatingFields);
104
+ if (isAdd) {
105
+ this.records.push(changedRecord);
106
+ }
107
+ else {
108
+ const recordIndex = this.records.findIndex(r => r["__record__id__"] == changedRecord["__record__id__"]);
109
+ this.records[recordIndex] = changedRecord;
110
+ }
111
+ dataUnitRecords.push(changedRecord);
112
+ });
113
+ resolve(dataUnitRecords);
114
+ });
115
+ }
116
+ removeLoader(_dataUnit, recordIds) {
117
+ return new Promise((resolve) => {
118
+ this._records = this._records.filter(record => !recordIds.includes(record["__record__id__"]));
119
+ resolve(recordIds);
120
+ });
121
+ }
122
+ }
123
+
124
+ const snkSimpleCrudCss = ".sc-snk-simple-crud-h{display:flex;height:100%;width:100%}.simple-crud__container.sc-snk-simple-crud{display:grid;grid-template-rows:auto;row-gap:12px;height:100%;width:100%}.simple-crud__taskbar.sc-snk-simple-crud{z-index:var(--more-visible, 2);margin-bottom:var(--space--medium)}ez-grid.sc-snk-simple-crud{--ez-grid__container--shadow:none;min-height:300px}ez-form.sc-snk-simple-crud{min-height:300px}";
125
+
126
+ const SnkSimpleCrud$1 = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
127
+ constructor() {
128
+ super();
129
+ this.__registerHost();
130
+ this.REGULAR_DEFAULT_BTNS = ["INSERT", "PREVIOUS", "NEXT", "DIVIDER"];
131
+ this.REGULAR_SELECTED_BTNS = ["INSERT", "PREVIOUS", "NEXT", "DIVIDER", "CLONE", "REMOVE", "DIVIDER"];
132
+ this._taskbarProcessor = new TaskbarProcessor({
133
+ "snkSimpleCrudTaskbar.form_regular": this.REGULAR_DEFAULT_BTNS.concat(TaskbarElement.GRID_MODE),
134
+ "snkSimpleCrudTaskbar.grid_regular": this.REGULAR_DEFAULT_BTNS.concat(TaskbarElement.FORM_MODE),
135
+ "snkSimpleCrudTaskbar.form_selected": this.REGULAR_SELECTED_BTNS.concat(TaskbarElement.GRID_MODE),
136
+ "snkSimpleCrudTaskbar.grid_selected": this.REGULAR_SELECTED_BTNS.concat(TaskbarElement.FORM_MODE),
137
+ "snkSimpleCrudTaskbar.finish_edition": ["CANCEL", "SAVE"]
138
+ });
139
+ this._currentViewMode = VIEW_MODE.GRID;
140
+ this._config = undefined;
141
+ this.dataState = undefined;
142
+ this.dataUnit = undefined;
143
+ this.mode = SIMPLE_CRUD_MODE.SERVER;
144
+ this.taskbarManager = undefined;
145
+ }
146
+ /**
147
+ * Usado para alternar a visão entre GRID e FORM externamente.
148
+ */
149
+ async goToView(view) {
150
+ this._currentViewMode = view;
151
+ if (this._viewStack) {
152
+ this._viewStack.show(view);
153
+ }
154
+ }
155
+ actionClickListener(evt) {
156
+ const act = evt.detail;
157
+ if (act === TaskbarElement.GRID_MODE) {
158
+ this.goToView(VIEW_MODE.GRID);
159
+ }
160
+ else if (act === TaskbarElement.FORM_MODE) {
161
+ this.goToView(VIEW_MODE.FORM);
162
+ }
163
+ evt.stopPropagation();
164
+ }
165
+ onModeChange() {
166
+ if (this.mode == SIMPLE_CRUD_MODE.IN_MEMORY) {
167
+ this.initInMemoryDataUnit();
168
+ }
169
+ }
170
+ componentWillRender() {
171
+ this._taskbarProcessor.process(this.getTaskBarId(), this.taskbarManager, this.dataState, undefined);
172
+ }
173
+ componentWillLoad() {
174
+ this.processMetadata();
175
+ this.onModeChange();
176
+ }
177
+ getTaskBarId() {
178
+ var _a, _b;
179
+ if ((_a = this.dataState) === null || _a === void 0 ? void 0 : _a.isDirty) {
180
+ return "snkSimpleCrudTaskbar.finish_edition";
181
+ }
182
+ if (((_b = this.dataState) === null || _b === void 0 ? void 0 : _b.selectedRecords.length) > 0) {
183
+ return this._currentViewMode === VIEW_MODE.GRID ? "snkSimpleCrudTaskbar.grid_selected" : "snkSimpleCrudTaskbar.form_selected";
184
+ }
185
+ return this._currentViewMode === VIEW_MODE.GRID ? "snkSimpleCrudTaskbar.grid_regular" : "snkSimpleCrudTaskbar.form_regular";
186
+ }
187
+ initInMemoryDataUnit() {
188
+ this._inMemoryLoader = new InMemoryLoader(this._metadata);
189
+ this.dataUnit = this._inMemoryLoader.dataUnit;
190
+ }
191
+ setMetadata(metadata) {
192
+ if (this._inMemoryLoader) {
193
+ this._inMemoryLoader.metadata = metadata;
194
+ }
195
+ else if (this.dataUnit) {
196
+ this.dataUnit.metadata = metadata;
197
+ }
198
+ return Promise.resolve();
199
+ }
200
+ setRecords(records) {
201
+ if (this._inMemoryLoader) {
202
+ this._inMemoryLoader.records = records;
203
+ }
204
+ else if (this.dataUnit) {
205
+ this.dataUnit.records = records;
206
+ }
207
+ return Promise.resolve();
208
+ }
209
+ getRecords() {
210
+ return Promise.resolve(this.dataUnit.records);
211
+ }
212
+ processMetadata() {
213
+ const fieldsMetadataElem = this._element.querySelectorAll("snk-field-metadata");
214
+ const fieldMetadata = [];
215
+ const formConfig = { fields: [], emptyConfig: false };
216
+ fieldsMetadataElem.forEach(fieldElem => {
217
+ const field = {
218
+ name: fieldElem.getAttribute("name") || fieldElem.getAttribute("label"),
219
+ label: fieldElem.getAttribute("label"),
220
+ dataType: DataType[fieldElem.getAttribute("dataType")] || DataType.TEXT,
221
+ userInterface: UserInterface[fieldElem.getAttribute("userInterface")] || UserInterface.SHORTTEXT,
222
+ readOnly: fieldElem.getAttribute("readOnly") == "true",
223
+ required: fieldElem.getAttribute("required") == "true",
224
+ tab: fieldElem.getAttribute("tab") || undefined
225
+ };
226
+ const fieldConfig = { name: field.name, tab: field.tab };
227
+ formConfig.fields.push(fieldConfig);
228
+ fieldMetadata.push(field);
229
+ });
230
+ if (fieldMetadata.length > 0) {
231
+ this._config = formConfig;
232
+ this._metadata = {
233
+ name: "SimpleCrud",
234
+ label: "SimpleCrud",
235
+ fields: fieldMetadata
236
+ };
237
+ }
238
+ }
239
+ render() {
240
+ var _a;
241
+ return (h("snk-data-unit", { class: "simple-crud__container", dataUnit: this.dataUnit, onDataStateChange: evt => this.dataState = evt.detail, onInsertionMode: () => this.goToView(VIEW_MODE.FORM) }, h("header", null, h("slot", { name: "snkSimpleCrudHeader" })), h("section", { class: "ez-flex ez-box ez-box--shadow" }, h("snk-taskbar", { class: "simple-crud__taskbar ez-box ez-box--shadow ez-padding--medium", dataUnit: this.dataUnit, primaryButton: ((_a = this.dataState) === null || _a === void 0 ? void 0 : _a.isDirty) ? "SAVE" : "INSERT", "data-element-id": "grid_left", buttons: this._taskbarProcessor.buttons, disabledButtons: this._taskbarProcessor.disabledButtons, customButtons: this._taskbarProcessor.customButtons, slot: "leftButtons", presentationMode: PresentationMode.SECONDARY }), h("ez-view-stack", { class: "ez-flex ez-flex--column", ref: (ref) => this._viewStack = ref, "data-element-id": "simple-crud" }, h("stack-item", null, h("ez-grid", { dataUnit: this.dataUnit, onEzDoubleClick: () => this.goToView(VIEW_MODE.FORM), "no-header": true }, h("div", { slot: "footer" }, h("slot", { name: "snkSimpleCrudFooter" })))), h("stack-item", null, h("ez-form", { dataUnit: this.dataUnit, config: this._config }))))));
242
+ }
243
+ get _element() { return this; }
244
+ static get watchers() { return {
245
+ "mode": ["onModeChange"]
246
+ }; }
247
+ static get style() { return snkSimpleCrudCss; }
248
+ }, [6, "snk-simple-crud", {
249
+ "dataState": [16],
250
+ "dataUnit": [16],
251
+ "mode": [2],
252
+ "taskbarManager": [16],
253
+ "_currentViewMode": [32],
254
+ "_config": [32],
255
+ "goToView": [64],
256
+ "setMetadata": [64],
257
+ "setRecords": [64],
258
+ "getRecords": [64]
259
+ }, [[0, "actionClick", "actionClickListener"]]]);
260
+ function defineCustomElement$1() {
261
+ if (typeof customElements === "undefined") {
262
+ return;
263
+ }
264
+ const components = ["snk-simple-crud", "snk-data-exporter", "snk-data-unit", "snk-exporter-email-sender", "snk-taskbar"];
265
+ components.forEach(tagName => { switch (tagName) {
266
+ case "snk-simple-crud":
267
+ if (!customElements.get(tagName)) {
268
+ customElements.define(tagName, SnkSimpleCrud$1);
269
+ }
270
+ break;
271
+ case "snk-data-exporter":
272
+ if (!customElements.get(tagName)) {
273
+ defineCustomElement$5();
274
+ }
275
+ break;
276
+ case "snk-data-unit":
277
+ if (!customElements.get(tagName)) {
278
+ defineCustomElement$4();
279
+ }
280
+ break;
281
+ case "snk-exporter-email-sender":
282
+ if (!customElements.get(tagName)) {
283
+ defineCustomElement$3();
284
+ }
285
+ break;
286
+ case "snk-taskbar":
287
+ if (!customElements.get(tagName)) {
288
+ defineCustomElement$2();
289
+ }
290
+ break;
291
+ } });
292
+ }
293
+
294
+ const SnkSimpleCrud = SnkSimpleCrud$1;
295
+ const defineCustomElement = defineCustomElement$1;
296
+
297
+ export { SnkSimpleCrud, defineCustomElement };
@@ -0,0 +1,47 @@
1
+ class TaskbarProcessor {
2
+ constructor(defaultButtons) {
3
+ this._defaultButtons = defaultButtons;
4
+ }
5
+ process(taskbarId, taskbarManager, dataState, disabledButtons = [], invisibleButtons = []) {
6
+ var _a;
7
+ this.customButtons = new Map();
8
+ this.buttons = "";
9
+ this.disabledButtons = [];
10
+ (_a = this.getButtonsArray(taskbarId, taskbarManager, dataState)) === null || _a === void 0 ? void 0 : _a.forEach(btnDef => {
11
+ let buttonName;
12
+ if (typeof btnDef === "string") {
13
+ buttonName = btnDef;
14
+ }
15
+ else {
16
+ const customBtn = btnDef;
17
+ this.customButtons.set(customBtn.name, customBtn);
18
+ buttonName = customBtn.name;
19
+ }
20
+ if (!invisibleButtons.includes(buttonName)) {
21
+ if (!this.isEnabled(taskbarId, taskbarManager, buttonName, dataState, disabledButtons)) {
22
+ this.disabledButtons.push(buttonName);
23
+ }
24
+ if (this.buttons.length > 0) {
25
+ this.buttons += ",";
26
+ }
27
+ this.buttons += buttonName;
28
+ }
29
+ });
30
+ }
31
+ getButtonsArray(taskbarId, taskbarManager, dataState) {
32
+ const defaults = this._defaultButtons[taskbarId];
33
+ if (taskbarManager) {
34
+ return taskbarManager.getButtons(taskbarId, dataState, [...defaults]);
35
+ }
36
+ return defaults;
37
+ }
38
+ isEnabled(taskbarId, taskbarManager, buttonName, dataState, disabled) {
39
+ const originalValue = disabled.includes(buttonName) ? false : true;
40
+ if (taskbarManager && taskbarManager.isEnabled) {
41
+ return taskbarManager.isEnabled(taskbarId, dataState, buttonName, originalValue);
42
+ }
43
+ return originalValue;
44
+ }
45
+ }
46
+
47
+ export { TaskbarProcessor as T };
@@ -1,5 +1,5 @@
1
1
  import { ApplicationContext } from '@sankhyalabs/core';
2
- import { R as ResourceFetcher, F as FormConfigFetcher } from './form-config-fetcher-e58fc104.js';
2
+ import { R as ResourceFetcher, F as FormConfigFetcher } from './form-config-fetcher-677f86dd.js';
3
3
 
4
4
  class GridConfigFetcher extends ResourceFetcher {
5
5
  constructor() {
@@ -6466,7 +6466,7 @@ class GraphQLRecaller {
6466
6466
 
6467
6467
  class DataFetcher {
6468
6468
  constructor() {
6469
- this.GRAPHQL_PATH = "/mgefin-bff/graphql";
6469
+ this.GRAPHQL_PATH = "/mge/graphql";
6470
6470
  this.watingRequestsById = new Map();
6471
6471
  }
6472
6472
  static get() {
@@ -6695,8 +6695,8 @@ class DataFetcher {
6695
6695
  let errorsResponse = [];
6696
6696
  let url = `${this.resolveURL() + this.GRAPHQL_PATH}`;
6697
6697
  const responseExtensions = [];
6698
- if (window['mgeSession']) {
6699
- url += `?mgeSession=${window['mgeSession']}`;
6698
+ if (window['skw_session']) {
6699
+ url += `?mgeSession=${window['skw_session']}`;
6700
6700
  }
6701
6701
  DataFetcher.requestListener.forEach(listener => listener.onRequestStart({ url: url, requestBody: request }));
6702
6702
  try {
@@ -1,6 +1,6 @@
1
- import { C as ConfigStorage } from './ConfigStorage-34caac5c.js';
1
+ import { C as ConfigStorage } from './ConfigStorage-1b64cd96.js';
2
2
  import { ObjectUtils } from '@sankhyalabs/core';
3
- import { F as FormConfigFetcher } from './form-config-fetcher-e58fc104.js';
3
+ import { F as FormConfigFetcher } from './form-config-fetcher-677f86dd.js';
4
4
 
5
5
  class SnkFormConfigManager {
6
6
  constructor(configName, onConfigChange) {