@sankhyalabs/sankhyablocks 8.6.0-dev.2 → 8.6.0-dev.4

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 (138) hide show
  1. package/dist/cjs/{ConfigStorage-bbffce76.js → ConfigStorage-a97ca159.js} +2 -2
  2. package/dist/cjs/{DataFetcher-0cc561bc.js → DataFetcher-2a99283c.js} +25 -10
  3. package/dist/cjs/{SnkFormConfigManager-c49af777.js → SnkFormConfigManager-f641f502.js} +2 -2
  4. package/dist/cjs/{SnkMultiSelectionListDataSource-804ff4c7.js → SnkMultiSelectionListDataSource-faf3a0f2.js} +11 -0
  5. package/dist/cjs/{auth-fetcher-fff2319e.js → auth-fetcher-78231356.js} +1 -1
  6. package/dist/cjs/dataunit-fetcher-9e875872.js +877 -0
  7. package/dist/cjs/{form-config-fetcher-35752aad.js → form-config-fetcher-a322a522.js} +1 -1
  8. package/dist/cjs/{pesquisa-fetcher-415eab63.js → pesquisa-fetcher-7ef61508.js} +1 -1
  9. package/dist/cjs/snk-actions-button.cjs.entry.js +4 -3
  10. package/dist/cjs/snk-application.cjs.entry.js +17 -8
  11. package/dist/cjs/snk-attach.cjs.entry.js +16 -3
  12. package/dist/cjs/snk-crud.cjs.entry.js +6 -4
  13. package/dist/cjs/snk-data-exporter.cjs.entry.js +1 -1
  14. package/dist/cjs/snk-detail-view.cjs.entry.js +8 -6
  15. package/dist/cjs/snk-filter-bar.cjs.entry.js +3 -3
  16. package/dist/cjs/snk-filter-modal-item.cjs.entry.js +3 -3
  17. package/dist/cjs/snk-form-config.cjs.entry.js +2 -2
  18. package/dist/cjs/snk-form.cjs.entry.js +4 -4
  19. package/dist/cjs/snk-grid-config.cjs.entry.js +3 -3
  20. package/dist/cjs/snk-grid.cjs.entry.js +25 -14
  21. package/dist/cjs/{snk-guides-viewer-36b39c9c.js → snk-guides-viewer-015b8632.js} +5 -4
  22. package/dist/cjs/snk-guides-viewer.cjs.entry.js +8 -6
  23. package/dist/cjs/snk-personalized-filter.cjs.entry.js +3 -3
  24. package/dist/cjs/snk-simple-crud.cjs.entry.js +8 -92
  25. package/dist/collection/components/snk-application/snk-application.js +11 -3
  26. package/dist/collection/components/snk-attach/snk-attach.js +14 -2
  27. package/dist/collection/components/snk-grid/filtercolumn/SnkMultiSelectionListDataSource.js +11 -0
  28. package/dist/collection/components/snk-grid/snk-grid.js +24 -14
  29. package/dist/collection/lib/dataUnit/InMemoryLoader.js +23 -2
  30. package/dist/collection/lib/http/data-fetcher/DataFetcher.js +25 -10
  31. package/dist/collection/lib/http/data-fetcher/fetchers/data-unit/DataUnitDataLoader.js +112 -0
  32. package/dist/collection/lib/http/data-fetcher/fetchers/data-unit/cache/ArrayRepository.js +59 -0
  33. package/dist/collection/lib/http/data-fetcher/fetchers/data-unit/cache/PreloadManager.js +169 -0
  34. package/dist/collection/lib/http/data-fetcher/fetchers/{dataunit-fetcher.js → data-unit/dataunit-fetcher.js} +48 -100
  35. package/dist/collection/lib/http/data-fetcher/fetchers/data-unit/interfaces/ILoadDataResult.js +1 -0
  36. package/dist/collection/lib/http/data-fetcher/fetchers/data-unit/interfaces/ILoadDataStrategy.js +1 -0
  37. package/dist/collection/lib/http/data-fetcher/fetchers/data-unit/interfaces/ILoadingInfo.js +1 -0
  38. package/dist/collection/lib/http/data-fetcher/fetchers/data-unit/interfaces/IRecordField.js +1 -0
  39. package/dist/collection/lib/http/data-fetcher/fetchers/data-unit/interfaces/IResponseRecord.js +1 -0
  40. package/dist/collection/lib/http/data-fetcher/fetchers/data-unit/loadstrategy/DataUnitStrategy.js +68 -0
  41. package/dist/collection/lib/http/data-fetcher/fetchers/data-unit/loadstrategy/DatasetStrategy.js +131 -0
  42. package/dist/collection/lib/index.js +1 -1
  43. package/dist/components/DataFetcher.js +26 -11
  44. package/dist/components/SnkMultiSelectionListDataSource.js +11 -0
  45. package/dist/components/dataunit-fetcher.js +780 -100
  46. package/dist/components/snk-actions-button2.js +1 -1
  47. package/dist/components/snk-application2.js +11 -4
  48. package/dist/components/snk-attach2.js +13 -1
  49. package/dist/components/snk-crud.js +1 -1
  50. package/dist/components/snk-detail-view2.js +1 -1
  51. package/dist/components/snk-grid2.js +19 -11
  52. package/dist/components/snk-simple-crud2.js +2 -88
  53. package/dist/esm/{ConfigStorage-80ca14d5.js → ConfigStorage-26f89143.js} +2 -2
  54. package/dist/esm/{DataFetcher-044e3988.js → DataFetcher-90e91631.js} +26 -11
  55. package/dist/esm/{SnkFormConfigManager-1a8b3a44.js → SnkFormConfigManager-18948123.js} +2 -2
  56. package/dist/esm/{SnkMultiSelectionListDataSource-892f37f9.js → SnkMultiSelectionListDataSource-9e916004.js} +11 -0
  57. package/dist/esm/{auth-fetcher-1b378f8e.js → auth-fetcher-a8c8ee7e.js} +1 -1
  58. package/dist/esm/dataunit-fetcher-cc16ac1a.js +873 -0
  59. package/dist/esm/{form-config-fetcher-c702e9e3.js → form-config-fetcher-7c3b6273.js} +1 -1
  60. package/dist/{components/pesquisa-fetcher.js → esm/pesquisa-fetcher-90d6853b.js} +1 -1
  61. package/dist/esm/snk-actions-button.entry.js +4 -3
  62. package/dist/esm/snk-application.entry.js +17 -8
  63. package/dist/esm/snk-attach.entry.js +16 -3
  64. package/dist/esm/snk-crud.entry.js +6 -4
  65. package/dist/esm/snk-data-exporter.entry.js +1 -1
  66. package/dist/esm/snk-detail-view.entry.js +8 -6
  67. package/dist/esm/snk-filter-bar.entry.js +3 -3
  68. package/dist/esm/snk-filter-modal-item.entry.js +3 -3
  69. package/dist/esm/snk-form-config.entry.js +2 -2
  70. package/dist/esm/snk-form.entry.js +4 -4
  71. package/dist/esm/snk-grid-config.entry.js +3 -3
  72. package/dist/esm/snk-grid.entry.js +26 -15
  73. package/dist/esm/{snk-guides-viewer-767ad354.js → snk-guides-viewer-1838230d.js} +5 -4
  74. package/dist/esm/snk-guides-viewer.entry.js +8 -6
  75. package/dist/esm/snk-personalized-filter.entry.js +3 -3
  76. package/dist/esm/snk-simple-crud.entry.js +7 -91
  77. package/dist/sankhyablocks/p-218d30c7.js +1 -0
  78. package/dist/sankhyablocks/{p-76926391.js → p-240f5892.js} +2 -2
  79. package/dist/sankhyablocks/p-3258df1d.js +59 -0
  80. package/dist/sankhyablocks/{p-dacb4c4c.entry.js → p-3ec7e5f9.entry.js} +3 -3
  81. package/dist/sankhyablocks/{p-d1cc9007.entry.js → p-57550ddc.entry.js} +1 -1
  82. package/dist/sankhyablocks/p-5d51bff4.js +1 -0
  83. package/dist/sankhyablocks/{p-727b8cbe.entry.js → p-5dd52ec5.entry.js} +1 -1
  84. package/dist/sankhyablocks/p-6541f0df.js +1 -0
  85. package/dist/sankhyablocks/{p-845c7480.entry.js → p-8652f90b.entry.js} +1 -1
  86. package/dist/sankhyablocks/{p-a2c7c45f.js → p-910af03c.js} +1 -1
  87. package/dist/sankhyablocks/p-992a9d0f.js +1 -0
  88. package/dist/sankhyablocks/p-c3642830.entry.js +1 -0
  89. package/dist/sankhyablocks/p-cf954be2.entry.js +1 -0
  90. package/dist/sankhyablocks/{p-af86752b.js → p-d47bbee3.js} +1 -1
  91. package/dist/sankhyablocks/p-d50b5736.entry.js +1 -0
  92. package/dist/sankhyablocks/{p-e46dd27b.entry.js → p-d563e451.entry.js} +1 -1
  93. package/dist/sankhyablocks/p-d5bc8eb1.js +1 -0
  94. package/dist/sankhyablocks/p-d8d4ff87.entry.js +1 -0
  95. package/dist/sankhyablocks/p-dfca1930.entry.js +1 -0
  96. package/dist/sankhyablocks/{p-3ef37b31.entry.js → p-e74e2153.entry.js} +1 -1
  97. package/dist/sankhyablocks/{p-3c1759ba.entry.js → p-e8b55571.entry.js} +1 -1
  98. package/dist/sankhyablocks/{p-90c07587.entry.js → p-ebfa6460.entry.js} +1 -1
  99. package/dist/sankhyablocks/p-f3fdb409.entry.js +1 -0
  100. package/dist/sankhyablocks/p-f9dd2359.entry.js +1 -0
  101. package/dist/sankhyablocks/sankhyablocks.esm.js +1 -1
  102. package/dist/types/components/snk-application/snk-application.d.ts +1 -1
  103. package/dist/types/components/snk-attach/snk-attach.d.ts +1 -0
  104. package/dist/types/components/snk-grid/filtercolumn/SnkMultiSelectionListDataSource.d.ts +1 -0
  105. package/dist/types/components/snk-grid/snk-grid.d.ts +3 -4
  106. package/dist/types/components.d.ts +3 -2
  107. package/dist/types/lib/dataUnit/InMemoryLoader.d.ts +2 -1
  108. package/dist/types/lib/http/data-fetcher/DataFetcher.d.ts +2 -1
  109. package/dist/types/lib/http/data-fetcher/fetchers/data-unit/DataUnitDataLoader.d.ts +13 -0
  110. package/dist/types/lib/http/data-fetcher/fetchers/data-unit/cache/ArrayRepository.d.ts +19 -0
  111. package/dist/types/lib/http/data-fetcher/fetchers/data-unit/cache/PreloadManager.d.ts +25 -0
  112. package/dist/types/lib/http/data-fetcher/fetchers/{dataunit-fetcher.d.ts → data-unit/dataunit-fetcher.d.ts} +5 -3
  113. package/dist/types/lib/http/data-fetcher/fetchers/data-unit/interfaces/ILoadDataResult.d.ts +6 -0
  114. package/dist/types/lib/http/data-fetcher/fetchers/data-unit/interfaces/ILoadDataStrategy.d.ts +7 -0
  115. package/dist/types/lib/http/data-fetcher/fetchers/data-unit/interfaces/ILoadingInfo.d.ts +8 -0
  116. package/dist/types/lib/http/data-fetcher/fetchers/data-unit/interfaces/IRecordField.d.ts +4 -0
  117. package/dist/types/lib/http/data-fetcher/fetchers/data-unit/interfaces/IResponseRecord.d.ts +6 -0
  118. package/dist/types/lib/http/data-fetcher/fetchers/data-unit/loadstrategy/DataUnitStrategy.d.ts +9 -0
  119. package/dist/types/lib/http/data-fetcher/fetchers/data-unit/loadstrategy/DatasetStrategy.d.ts +15 -0
  120. package/dist/types/lib/http/data-fetcher/fetchers/personalized-filter-fetcher.d.ts +1 -1
  121. package/dist/types/lib/index.d.ts +1 -1
  122. package/package.json +3 -3
  123. package/dist/cjs/dataunit-fetcher-16b32d96.js +0 -356
  124. package/dist/esm/dataunit-fetcher-e0361781.js +0 -354
  125. package/dist/esm/pesquisa-fetcher-d1b4e5a2.js +0 -165
  126. package/dist/sankhyablocks/p-15578509.entry.js +0 -1
  127. package/dist/sankhyablocks/p-1f32ad9c.entry.js +0 -1
  128. package/dist/sankhyablocks/p-2043a64f.js +0 -1
  129. package/dist/sankhyablocks/p-251985c1.entry.js +0 -1
  130. package/dist/sankhyablocks/p-473c7df4.js +0 -1
  131. package/dist/sankhyablocks/p-77aebc26.js +0 -1
  132. package/dist/sankhyablocks/p-867e9b79.js +0 -1
  133. package/dist/sankhyablocks/p-8d1602f2.entry.js +0 -1
  134. package/dist/sankhyablocks/p-98ae8ddc.entry.js +0 -1
  135. package/dist/sankhyablocks/p-9de24cf3.entry.js +0 -1
  136. package/dist/sankhyablocks/p-b6d54b6c.entry.js +0 -1
  137. package/dist/sankhyablocks/p-d5b11196.js +0 -76
  138. package/dist/sankhyablocks/p-fa9d3f73.js +0 -1
@@ -0,0 +1,877 @@
1
+ 'use strict';
2
+
3
+ const core = require('@sankhyalabs/core');
4
+ const DataFetcher = require('./DataFetcher-2a99283c.js');
5
+ const constants = require('@sankhyalabs/ezui/dist/collection/utils/constants');
6
+ const UnitMetadata = require('@sankhyalabs/core/dist/dataunit/metadata/UnitMetadata');
7
+ const ResourceIDUtils = require('./ResourceIDUtils-5ff86aa7.js');
8
+
9
+ class ArrayRepository {
10
+ constructor(equalsFunction) {
11
+ this._list = [];
12
+ this._equalsFunction = equalsFunction;
13
+ }
14
+ async load(filterFunction, sortingFunction, offset, limit) {
15
+ let result = [].concat(this._list);
16
+ if (filterFunction != undefined) {
17
+ result = this._list.filter(item => filterFunction(item));
18
+ }
19
+ if (sortingFunction != undefined) {
20
+ result = result.sort(sortingFunction);
21
+ }
22
+ const count = result.length;
23
+ if (limit != undefined) {
24
+ const start = offset || 0;
25
+ const end = limit ? start + limit : result.length;
26
+ result = result.slice(start, end);
27
+ }
28
+ return Promise.resolve({ result, count });
29
+ }
30
+ async distict(itemProcessor) {
31
+ const processedItems = this._list.map(item => itemProcessor(item));
32
+ return Promise.resolve(new Map(processedItems.filter(item => item != undefined)
33
+ .map(item => [item.key, item.value])));
34
+ }
35
+ async push(items) {
36
+ this._list.push(...items);
37
+ }
38
+ async clear() {
39
+ this._list = [];
40
+ }
41
+ async delete(items) {
42
+ this._list = this._list.filter(item => !items.includes(item));
43
+ }
44
+ async update(items) {
45
+ this._list = this._list.map(existingItem => {
46
+ const newItem = items.find(newItem => this._equalsFunction(existingItem, newItem));
47
+ return newItem == undefined ? existingItem : newItem;
48
+ });
49
+ }
50
+ async insert(itemReference, items) {
51
+ const itemPosition = this._list.indexOf(itemReference);
52
+ if (itemPosition == -1) {
53
+ this._list.push(...items);
54
+ return;
55
+ }
56
+ this._list = this._list.slice(0, itemPosition).concat(items).concat(this._list.slice(itemPosition));
57
+ }
58
+ isOperating() {
59
+ return true;
60
+ }
61
+ async isEmpty() {
62
+ return Promise.resolve(this._list.length === 0);
63
+ }
64
+ async count() {
65
+ return Promise.resolve(this._list.length);
66
+ }
67
+ }
68
+
69
+ const COLUMN_FILTER_PATTERN = /FILTRO_COLUNA_(.+)/;
70
+ class PreloadManager {
71
+ static setLoadingStatus(dataUnit, loadingInProgress) {
72
+ this._loadingStatus.set(dataUnit.name, loadingInProgress);
73
+ }
74
+ static isCacheEnabled(dataUnit) {
75
+ const dataUnitResourceId = PreloadManager.getResourceId(dataUnit.name);
76
+ if (dataUnitResourceId !== this.applicationResourceID) {
77
+ return false;
78
+ }
79
+ return this.getRepository(dataUnit).isOperating();
80
+ }
81
+ static getResourceId(dataUnitName) {
82
+ const dataUnitNameInfo = DataUnitFetcher.parseDataUnitName(dataUnitName);
83
+ return dataUnitNameInfo == undefined ? undefined : dataUnitNameInfo.resourceID;
84
+ }
85
+ static cacheRecords(dataUnit, records, resetDatabase, loadingInProgress) {
86
+ PreloadManager.setLoadingStatus(dataUnit, loadingInProgress);
87
+ if (PreloadManager.isCacheEnabled(dataUnit)) {
88
+ this.getRepository(dataUnit).push(records);
89
+ }
90
+ else {
91
+ if (resetDatabase) {
92
+ this._repositories.delete(dataUnit.name);
93
+ }
94
+ }
95
+ }
96
+ static getSortingFunction(dataUnit, sorting) {
97
+ if (sorting == undefined || sorting.length == 0) {
98
+ return undefined;
99
+ }
100
+ return (recordA, recordB) => {
101
+ for (const sort of sorting) {
102
+ const result = core.FieldComparator.compare(dataUnit.getField(sort.field), recordA, recordB, sort.mode === core.SortMode.ASC);
103
+ if (result != 0) {
104
+ return result;
105
+ }
106
+ }
107
+ };
108
+ }
109
+ static async getDistinct(dataUnit, fieldName) {
110
+ if (!PreloadManager.isCacheEnabled(dataUnit)) {
111
+ return Promise.resolve(undefined);
112
+ }
113
+ return new Promise((accept, reject) => {
114
+ PreloadManager.getRepository(dataUnit).distict(record => {
115
+ const fieldValue = record[fieldName];
116
+ if (fieldValue == undefined) {
117
+ return undefined;
118
+ }
119
+ const value = fieldValue.value != undefined ? fieldValue.value : fieldValue;
120
+ return { key: dataUnit.getFormattedValue(fieldName, fieldValue), value };
121
+ })
122
+ .then(values => accept(values))
123
+ .catch(reason => reject(reason));
124
+ });
125
+ }
126
+ static async loadData(dataUnit, request, loadFromServer) {
127
+ try {
128
+ if (PreloadManager.isCacheEnabled(dataUnit)) {
129
+ let useCache = request.source === "EZ_GRID_LOADING_SOURCE" || request.source === core.DataUnit.CHANGING_PAGE_LOADING_SOURCE;
130
+ if (useCache) {
131
+ const isCacheEmpty = await PreloadManager.getRepository(dataUnit).isEmpty();
132
+ if (!isCacheEmpty) {
133
+ return PreloadManager.loadFromCache(dataUnit, request);
134
+ }
135
+ }
136
+ //Como não vamos aproveitar o cache, ele precisa ser limpado.
137
+ PreloadManager.getRepository(dataUnit).clear().catch(() => { });
138
+ }
139
+ return loadFromServer(dataUnit, request);
140
+ }
141
+ catch (error) {
142
+ console.error(error);
143
+ return Promise.reject(error);
144
+ }
145
+ }
146
+ static insertRecords(dataUnit, reference, records) {
147
+ if (PreloadManager.isCacheEnabled(dataUnit)) {
148
+ PreloadManager.getRepository(dataUnit).insert(reference, records);
149
+ }
150
+ }
151
+ static updateRecords(dataUnit, records) {
152
+ if (PreloadManager.isCacheEnabled(dataUnit)) {
153
+ PreloadManager.getRepository(dataUnit).update(records);
154
+ }
155
+ }
156
+ static removeRecords(dataUnit, records) {
157
+ if (PreloadManager.isCacheEnabled(dataUnit)) {
158
+ PreloadManager.getRepository(dataUnit).delete(records);
159
+ }
160
+ }
161
+ static async countRecords(dataUnit) {
162
+ if (PreloadManager.isCacheEnabled(dataUnit)) {
163
+ return PreloadManager.getRepository(dataUnit).count();
164
+ }
165
+ return Promise.resolve(0);
166
+ }
167
+ static getRepository(dataUnit) {
168
+ const name = dataUnit.name;
169
+ if (!PreloadManager._repositories.has(name)) {
170
+ PreloadManager._repositories.set(name, new ArrayRepository((recordA, recordB) => recordA.__record__id__ === recordB.__record__id__));
171
+ }
172
+ return PreloadManager._repositories.get(name);
173
+ }
174
+ static getFilterFunction(dataUnit, filters) {
175
+ if (filters != undefined && filters.length > 0) {
176
+ return record => {
177
+ for (const filter of filters) {
178
+ if (!PreloadManager.recordMatchesFilter(dataUnit, record, filter)) {
179
+ return false;
180
+ }
181
+ }
182
+ return true;
183
+ };
184
+ }
185
+ return undefined;
186
+ }
187
+ static recordMatchesFilter(dataUnit, record, columnFilter) {
188
+ const fieldValue = record[columnFilter.columnName];
189
+ for (let param of columnFilter.params) {
190
+ const paramValue = dataUnit.valueFromString(columnFilter.columnName, param.value);
191
+ if (core.FieldComparator.compareValues(dataUnit.getField(columnFilter.columnName), fieldValue, paramValue) === 0) {
192
+ return true;
193
+ }
194
+ }
195
+ return false;
196
+ }
197
+ static async loadFromCache(dataUnit, request) {
198
+ return new Promise((accept, reject) => {
199
+ const columnFilters = PreloadManager.getColumnFilters(request.filters);
200
+ const { limit, offset, sort } = request;
201
+ PreloadManager.getRepository(dataUnit)
202
+ .load(PreloadManager.getFilterFunction(dataUnit, Array.from(columnFilters.values())), PreloadManager.getSortingFunction(dataUnit, sort), offset, limit)
203
+ .then(loadResult => {
204
+ const stillLoading = PreloadManager._loadingStatus.get(dataUnit.name);
205
+ const { count, result: records } = loadResult;
206
+ const firstRecord = count == 0 ? 1 : offset + 1;
207
+ const lastRecord = offset + Math.min(records.length, limit);
208
+ const currentPage = offset / limit;
209
+ const paginationInfo = {
210
+ count, currentPage, firstRecord, lastRecord,
211
+ hasMore: stillLoading || (lastRecord < count),
212
+ total: stillLoading ? undefined : count
213
+ };
214
+ accept({ records, paginationInfo });
215
+ })
216
+ .catch(reason => reject(reason));
217
+ });
218
+ }
219
+ static getColumnFilters(filters) {
220
+ const columnFilters = new Map();
221
+ if (filters == undefined || filters.length == 0) {
222
+ return columnFilters;
223
+ }
224
+ filters.forEach(filter => {
225
+ const match = COLUMN_FILTER_PATTERN.exec(filter.name);
226
+ if (match) {
227
+ columnFilters.set(filter.name, Object.assign({ columnName: match[1] }, filter));
228
+ }
229
+ });
230
+ return columnFilters;
231
+ }
232
+ }
233
+ PreloadManager._repositories = new Map();
234
+ PreloadManager._loadingStatus = new Map();
235
+
236
+ class InMemoryLoader {
237
+ constructor(metadata, records) {
238
+ this.metadata = metadata;
239
+ this.records = records;
240
+ this._dataUnit = new core.DataUnit(InMemoryLoader.IN_MEMORY_DATA_UNIT_NAME);
241
+ this._dataUnit.metadataLoader = () => this.metadaLoader();
242
+ this._dataUnit.dataLoader = (dataUnit, request) => core.defaultDataLoader(dataUnit, request, this.getRecordsToLoad());
243
+ this._dataUnit.saveLoader = (_dataUnit, changes) => this.saveLoader(_dataUnit, changes);
244
+ this._dataUnit.removeLoader = (_dataUnit, recordIds) => this.removeLoader(_dataUnit, recordIds);
245
+ this.dataUnit.loadMetadata().then(() => this.dataUnit.loadData());
246
+ }
247
+ getRecordsToLoad() {
248
+ if (this._initialRecords) {
249
+ try {
250
+ return this._initialRecords;
251
+ }
252
+ finally {
253
+ this._initialRecords = undefined;
254
+ }
255
+ }
256
+ return this.dataUnit.records;
257
+ }
258
+ get dataUnit() {
259
+ return this._dataUnit;
260
+ }
261
+ get records() {
262
+ return this.dataUnit.records;
263
+ }
264
+ static getConvertedValue(descriptor, strValue) {
265
+ if (descriptor.dataType === core.DataType.BOOLEAN) {
266
+ return strValue === "S";
267
+ }
268
+ if (descriptor.dataType === core.DataType.NUMBER) {
269
+ return Number(strValue);
270
+ }
271
+ if (descriptor.dataType === core.DataType.DATE) {
272
+ return core.DateUtils.strToDate(strValue, true);
273
+ }
274
+ return strValue;
275
+ }
276
+ set records(records) {
277
+ const columns = this._metadata ? new Map(this._metadata.fields.map(descriptor => [descriptor.name, descriptor])) : undefined;
278
+ const newRecords = records === null || records === void 0 ? void 0 : records.map(record => {
279
+ if (!record["__record__id__"]) {
280
+ record["__record__id__"] = this.generateUniqueId();
281
+ }
282
+ if (columns != undefined) {
283
+ for (const name in record) {
284
+ const value = record[name];
285
+ if (typeof value === "string" && columns.has(name)) {
286
+ record[name] = InMemoryLoader.getConvertedValue(columns.get(name), value);
287
+ }
288
+ }
289
+ }
290
+ return record;
291
+ });
292
+ if (this._dataUnit) {
293
+ this._dataUnit.records = newRecords;
294
+ }
295
+ else {
296
+ this._initialRecords = newRecords;
297
+ }
298
+ }
299
+ get metadata() {
300
+ return this._metadata;
301
+ }
302
+ set metadata(metadata) {
303
+ this._metadata = metadata;
304
+ if (this._dataUnit) {
305
+ this._dataUnit.metadata = this._metadata;
306
+ }
307
+ }
308
+ generateUniqueId() {
309
+ return core.StringUtils.generateUUID();
310
+ }
311
+ metadaLoader() {
312
+ return Promise.resolve(this._metadata);
313
+ }
314
+ saveLoader(_dataUnit, changes) {
315
+ return new Promise((resolve) => {
316
+ let dataUnitRecords = [];
317
+ changes.forEach(change => {
318
+ let { record, updatingFields, operation } = change;
319
+ const changedRecord = Object.assign(Object.assign({}, record), updatingFields);
320
+ if (operation === core.ChangeOperation.INSERT ||
321
+ operation === core.ChangeOperation.COPY) {
322
+ changedRecord["__old__id__"] = record["__record__id__"];
323
+ changedRecord["__record__id__"] = this.generateUniqueId();
324
+ this.records.push(changedRecord);
325
+ }
326
+ else {
327
+ const recordIndex = this.records.findIndex(r => r["__record__id__"] == changedRecord["__record__id__"]);
328
+ this.records[recordIndex] = changedRecord;
329
+ }
330
+ dataUnitRecords.push(changedRecord);
331
+ });
332
+ resolve(dataUnitRecords);
333
+ });
334
+ }
335
+ removeLoader(_dataUnit, recordIds) {
336
+ return new Promise((resolve) => {
337
+ resolve(recordIds);
338
+ });
339
+ }
340
+ }
341
+ InMemoryLoader.IN_MEMORY_DATA_UNIT_NAME = "InMemoryDataUnit";
342
+
343
+ class DatasetStrategy {
344
+ canSlice() {
345
+ return false;
346
+ }
347
+ async load(dataUnit, request, loadingInfo) {
348
+ if (dataUnit.metadata == undefined) {
349
+ return Promise.resolve({ records: [], loadingInfo });
350
+ }
351
+ try {
352
+ const fields = this.getFieldsList(dataUnit);
353
+ const serviceName = "DatasetSP.loadRecords";
354
+ const requestBody = this.buildRequestBody(serviceName, fields, dataUnit, request, loadingInfo);
355
+ const { result: responseRecords, pagerID: pagerId } = await DataFetcher.DataFetcher.get().callServiceBroker(serviceName, requestBody);
356
+ const records = this.processRecords(dataUnit, fields, responseRecords);
357
+ const loadingInProgress = pagerId != undefined;
358
+ const count = loadingInfo.count + records.length;
359
+ return Promise.resolve({
360
+ records,
361
+ loadingInfo: Object.assign(Object.assign({}, loadingInfo), { pagerId,
362
+ loadingInProgress, total: loadingInProgress ? undefined : count, count })
363
+ });
364
+ }
365
+ catch (error) {
366
+ console.error(error);
367
+ return Promise.reject(error);
368
+ }
369
+ }
370
+ getFieldsList(dataUnit) {
371
+ let fields = ["__record__id__", "__record__label__"];
372
+ dataUnit.metadata.fields.forEach(descriptor => {
373
+ fields = fields.concat(this.getFieldNames(descriptor));
374
+ });
375
+ return fields;
376
+ }
377
+ getFieldNames(descriptor) {
378
+ const descriptionField = this.getSearchDescriptionField(descriptor);
379
+ if (descriptionField == undefined) {
380
+ return descriptor.name;
381
+ }
382
+ return [descriptor.name, descriptionField];
383
+ }
384
+ buildRequestBody(serviceName, fields, dataUnit, request, loadingInfo) {
385
+ const dataSetID = dataUnit.dataUnitId;
386
+ const dataUnitName = dataUnit.name;
387
+ const entityName = DataUnitFetcher.parseDataUnitName(dataUnitName).entityName;
388
+ const requestBody = {
389
+ serviceName,
390
+ requestBody: {
391
+ dataSetID,
392
+ fields,
393
+ entityName,
394
+ pageNumber: loadingInfo.pageNumber,
395
+ totalRecordsCount: loadingInfo.count,
396
+ pagerID: loadingInfo.pagerId,
397
+ standAlone: false,
398
+ standAloneFieldsMD: {
399
+ __record__id__: { "fieldType": "S", "userType": "P" },
400
+ __record__label__: { "fieldType": "S", "userType": "P" }
401
+ },
402
+ tryJoinedFields: true,
403
+ parallelLoader: true,
404
+ crudListener: "br.com.sankhya.modelcore.dataset.DataUnitDatasetAdapter",
405
+ txProperties: this.getTxProperties(dataUnitName, request),
406
+ useDefaultRowsLimit: false
407
+ }
408
+ };
409
+ return JSON.stringify(requestBody);
410
+ }
411
+ getTxProperties(dataUnitName, request) {
412
+ const txProperties = {
413
+ "__DATA_UNIT_ADAPTER__[dataUnitName]": dataUnitName
414
+ };
415
+ const serverSideFilters = request.filters.filter(filter => !filter.name.startsWith("FILTRO_COLUNA_"));
416
+ if (serverSideFilters.length !== 0) {
417
+ txProperties["__DATA_UNIT_ADAPTER__[criteria]"] = JSON.stringify(serverSideFilters);
418
+ }
419
+ const sorting = request.sort;
420
+ if (sorting != undefined && sorting.length !== 0) {
421
+ txProperties["__DATA_UNIT_ADAPTER__[sorting]"] = JSON.stringify(sorting);
422
+ }
423
+ return txProperties;
424
+ }
425
+ processRecords(dataUnit, fields, responseRecords) {
426
+ return responseRecords.map((dataFrame) => {
427
+ const duRecord = {
428
+ __record__id__: dataFrame[0],
429
+ __record__label__: dataFrame[1]
430
+ };
431
+ dataUnit.metadata.fields.forEach(fieldDescriptor => {
432
+ duRecord[fieldDescriptor.name] = this.buildFieldValue(fieldDescriptor, fields, dataFrame);
433
+ });
434
+ return duRecord;
435
+ });
436
+ }
437
+ buildFieldValue(descriptor, allFields, dataFrame) {
438
+ const fieldIndex = allFields.indexOf(descriptor.name);
439
+ if (fieldIndex < 0) {
440
+ return null;
441
+ }
442
+ const strValue = dataFrame[fieldIndex];
443
+ if (core.StringUtils.isEmpty(strValue)) {
444
+ return null;
445
+ }
446
+ const descriptionField = this.getSearchDescriptionField(descriptor);
447
+ if (descriptionField != undefined) {
448
+ const descriptionFieldIndex = allFields.indexOf(descriptionField);
449
+ if (descriptionFieldIndex >= 0) {
450
+ return { value: strValue, label: dataFrame[descriptionFieldIndex] };
451
+ }
452
+ }
453
+ if (descriptor.userInterface === core.UserInterface.SEARCH) {
454
+ //Se não tem um campo de descrição (código acima)
455
+ //Mas é um search, tentamos parsear um numero...
456
+ return isNaN(Number(strValue)) ? strValue : Number(strValue);
457
+ }
458
+ return InMemoryLoader.getConvertedValue(descriptor, strValue);
459
+ }
460
+ getSearchDescriptionField(descriptor) {
461
+ if (descriptor.userInterface === core.UserInterface.SEARCH) {
462
+ const { ENTITYNAME, mergedFrom, DESCRIPTIONFIELD } = descriptor.properties;
463
+ if (!core.StringUtils.isEmpty(DESCRIPTIONFIELD)) {
464
+ return mergedFrom != undefined ? `${mergedFrom}.${ENTITYNAME}.${DESCRIPTIONFIELD}` : `${ENTITYNAME}.${DESCRIPTIONFIELD}`;
465
+ }
466
+ }
467
+ return undefined;
468
+ }
469
+ }
470
+
471
+ class DataUnitDataLoader {
472
+ static async debounce(dataUnit, callBack) {
473
+ const duName = dataUnit.name;
474
+ if (DataUnitDataLoader._debouncingTimeouts[duName]) {
475
+ clearTimeout(DataUnitDataLoader._debouncingTimeouts[duName]);
476
+ delete DataUnitDataLoader._debouncingTimeouts[duName];
477
+ }
478
+ DataUnitDataLoader._debouncingTimeouts[duName] = setTimeout(() => {
479
+ delete DataUnitDataLoader._debouncingTimeouts[duName];
480
+ callBack();
481
+ }, 100);
482
+ }
483
+ static async loadData(dataUnit, request) {
484
+ return new Promise((resolve, reject) => {
485
+ DataUnitDataLoader.debounce(dataUnit, () => {
486
+ PreloadManager.loadData(dataUnit, request, this.loadFromServer)
487
+ .then(resp => resolve(resp))
488
+ .catch(reason => reject(reason));
489
+ });
490
+ });
491
+ }
492
+ static async loadFromServer(dataUnit, request, loadingInfo) {
493
+ try {
494
+ //Registramos a request com as informações de carga para determinarmos a última.
495
+ //Caso o usuário inicie outro refresh antes de terminar, devemos ignorar o resultado.
496
+ loadingInfo = DataUnitDataLoader.registryLoading(dataUnit, loadingInfo);
497
+ const loadResult = await DataUnitDataLoader.callLoader(dataUnit, request, loadingInfo);
498
+ if (loadResult == undefined) {
499
+ //Essa request foi originada de refresh antigo. Será ignorada;
500
+ return;
501
+ }
502
+ const loadedRecords = loadResult.records;
503
+ const paginationInfo = DataUnitDataLoader.buildPaginationInfo(loadedRecords.length, request, loadResult.loadingInfo);
504
+ const records = paginationInfo == undefined ? loadedRecords : loadedRecords.slice(0, paginationInfo.lastRecord);
505
+ return Promise.resolve({ records, paginationInfo });
506
+ }
507
+ catch (error) {
508
+ console.error(error);
509
+ return Promise.reject(error);
510
+ }
511
+ }
512
+ static async callLoader(dataUnit, request, requestLoadingInfo, dataLoader) {
513
+ if (dataLoader == undefined) {
514
+ //dataLoader = new DataUnitStrategy();
515
+ dataLoader = new DatasetStrategy();
516
+ }
517
+ const result = await dataLoader.load(dataUnit, request, requestLoadingInfo);
518
+ const { records, loadingInfo: responseLoadingInfo } = result;
519
+ if (DataUnitDataLoader.isOldRequest(dataUnit, responseLoadingInfo)) {
520
+ return Promise.resolve(undefined);
521
+ }
522
+ const recreateCache = !dataLoader.canSlice() || responseLoadingInfo.count === 0;
523
+ PreloadManager.cacheRecords(dataUnit, records, recreateCache, responseLoadingInfo.loadingInProgress);
524
+ if (PreloadManager.isCacheEnabled(dataUnit) && responseLoadingInfo.loadingInProgress) {
525
+ const newRequest = Object.assign(Object.assign({}, request), { offset: responseLoadingInfo.count });
526
+ const newLoadingInfo = Object.assign(Object.assign({}, responseLoadingInfo), { pageNumber: (responseLoadingInfo.pageNumber || 0) + 1 });
527
+ this.callLoader(dataUnit, newRequest, newLoadingInfo, dataLoader)
528
+ .then(result => DataUnitDataLoader.afterLoadingPage(dataUnit, result.loadingInfo))
529
+ .catch(reason => console.error(reason));
530
+ }
531
+ return Promise.resolve(result);
532
+ }
533
+ static afterLoadingPage(dataUnit, loadingInfo) {
534
+ PreloadManager.setLoadingStatus(dataUnit, loadingInfo.loadingInProgress);
535
+ const dataUnitPagination = dataUnit.getPaginationInfo();
536
+ if (dataUnitPagination == undefined) {
537
+ return;
538
+ }
539
+ const count = loadingInfo.count;
540
+ if (loadingInfo.loadingInProgress) {
541
+ dataUnit.updatePagination(Object.assign(Object.assign({}, dataUnitPagination), { count }));
542
+ return;
543
+ }
544
+ dataUnit.updatePagination(Object.assign(Object.assign({}, dataUnitPagination), { total: count, count }));
545
+ }
546
+ static registryLoading(dataUnit, loadingInfo) {
547
+ if (loadingInfo == undefined) {
548
+ loadingInfo = { requestTime: new Date().getTime(), count: 0 };
549
+ }
550
+ DataUnitDataLoader._requestTimeByDataUnit.set(dataUnit.name, loadingInfo.requestTime);
551
+ return loadingInfo;
552
+ }
553
+ static isOldRequest(dataUnit, loadingInfo) {
554
+ return DataUnitDataLoader._requestTimeByDataUnit.get(dataUnit.name) > loadingInfo.requestTime;
555
+ }
556
+ static buildPaginationInfo(pageSize, request, loadingInfo) {
557
+ let { limit, offset } = request;
558
+ if (!limit) {
559
+ return undefined;
560
+ }
561
+ if (loadingInfo.pageNumber === 1) {
562
+ // Quando o loader não é capaz de fatiar os registros
563
+ // ele pode decidir por uma carga completa, o que faz o
564
+ // controle de paginação voltar pra primeira página.
565
+ offset = 0;
566
+ }
567
+ const { total, count, loadingInProgress } = loadingInfo;
568
+ const lastRecord = offset + Math.min(pageSize, limit);
569
+ return {
570
+ total,
571
+ count,
572
+ lastRecord,
573
+ firstRecord: offset + 1,
574
+ currentPage: offset / limit,
575
+ hasMore: lastRecord < count || loadingInProgress
576
+ };
577
+ }
578
+ }
579
+ DataUnitDataLoader._requestTimeByDataUnit = new Map();
580
+ DataUnitDataLoader._debouncingTimeouts = {};
581
+
582
+ var __rest = (undefined && undefined.__rest) || function (s, e) {
583
+ var t = {};
584
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
585
+ t[p] = s[p];
586
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
587
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
588
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
589
+ t[p[i]] = s[p[i]];
590
+ }
591
+ return t;
592
+ };
593
+ const DATA_UNIT_NAME_PARSER = /dd:\/\/([^/]+)\/([^/?]+)/;
594
+ class DataUnitFetcher {
595
+ constructor() {
596
+ this.templateByQuery = new Map();
597
+ this.buldTemplates();
598
+ }
599
+ buldTemplates() {
600
+ this.templateByQuery.set("fetchDataUnit", DataFetcher.dist.gql `query($name: String!) {
601
+ $queryAlias$: fetchDataUnit(name: $name){
602
+ name
603
+ fields{
604
+ name
605
+ defaultValue
606
+ label
607
+ visible
608
+ readOnly
609
+ required
610
+ dataType
611
+ userInterface
612
+ calculated
613
+ group
614
+ order
615
+ properties{
616
+ name
617
+ value
618
+ }
619
+ dependencies{
620
+ masterFields
621
+ type
622
+ expression
623
+ }
624
+ }
625
+ children{
626
+ name
627
+ label
628
+ links{
629
+ source
630
+ target
631
+ }
632
+ }
633
+ }
634
+ }`);
635
+ this.templateByQuery.set("saveData", DataFetcher.dist.gql `mutation($changes: [InputBatchChange!]!) {
636
+ $queryAlias$: batchOperationDataUnit(changes: $changes){
637
+ oldId
638
+ id
639
+ label
640
+ ownerDataUnitName
641
+ fields {
642
+ name
643
+ value
644
+ }
645
+ }
646
+ }`);
647
+ this.templateByQuery.set("fetchDataRecord", DataFetcher.dist.gql `query($dataunit: String! $recordID: [String!]) {
648
+ $queryAlias$: fetchDataUnit(name: $dataunit){
649
+ record(id: $recordID){
650
+ id
651
+ label
652
+ fields {
653
+ name
654
+ value
655
+ }
656
+ }
657
+ }
658
+ }`);
659
+ this.templateByQuery.set("fetchDistinctColumn", DataFetcher.dist.gql `query($dataUnit: String!, $fieldName: String!, $argument: String, $filters: [InputFilter], $parentRecordId: String) {
660
+ $queryAlias$: selectDistinct(dataUnit: $dataUnit, fieldName: $fieldName, argument: $argument, filters: $filters, parentRecordId: $parentRecordId)
661
+ }`);
662
+ }
663
+ static parseDataUnitName(name) {
664
+ if (name == undefined) {
665
+ return undefined;
666
+ }
667
+ const parts = DATA_UNIT_NAME_PARSER.exec(name);
668
+ if (!parts) {
669
+ return undefined;
670
+ }
671
+ return { entityName: parts[1], resourceID: parts[2] };
672
+ }
673
+ getDataUnit(entityName, resourceID, parentDataUnit, configName) {
674
+ if (PreloadManager.applicationResourceID == undefined) {
675
+ //Por falta de um lugar melhor pra iniciar essa variável, fazemos isso aqui.
676
+ ResourceIDUtils.ResourceIDUtils.getResourceID().then(resourceID => PreloadManager.applicationResourceID = resourceID);
677
+ }
678
+ const duName = `dd://${entityName}/${resourceID}${configName ? "/" + configName : ""}`;
679
+ const dataUnit = parentDataUnit != undefined ? parentDataUnit.getChildDataunit(duName) : new core.DataUnit(duName);
680
+ dataUnit.metadataLoader = (dataUnit) => this.loadMetadata(dataUnit);
681
+ dataUnit.dataLoader = (dataUnit, request) => DataUnitDataLoader.loadData(dataUnit, request);
682
+ dataUnit.saveLoader = (_dataUnit, changes) => this.saveData(dataUnit, changes);
683
+ dataUnit.removeLoader = (dataUnit, recordIds) => this.removeRecords(dataUnit, recordIds);
684
+ dataUnit.recordLoader = (dataUnit, recordIds) => this.loadRecord(dataUnit, recordIds);
685
+ return dataUnit;
686
+ }
687
+ loadMetadata(dataUnit) {
688
+ return new Promise((resolve, reject) => {
689
+ DataFetcher.DataFetcher.get()
690
+ .callGraphQL({
691
+ values: { name: dataUnit.name },
692
+ query: this.templateByQuery.get("fetchDataUnit"),
693
+ })
694
+ .then((resp) => {
695
+ var _a;
696
+ const metadata = {
697
+ name: resp.name,
698
+ label: resp.name,
699
+ children: [...resp.children],
700
+ fields: []
701
+ };
702
+ (_a = resp.fields) === null || _a === void 0 ? void 0 : _a.forEach((source) => {
703
+ let properties = undefined;
704
+ if (Array.isArray(source.properties)) {
705
+ properties = {};
706
+ if (source.calculated) {
707
+ properties.gridHeaderTooltip = "Campos calculados não podem ser ordenados";
708
+ }
709
+ source.properties.forEach((prop) => (properties[prop.name] = prop.value));
710
+ }
711
+ metadata.fields.push(Object.assign(Object.assign({}, source), { properties }));
712
+ });
713
+ metadata.fields.sort((a, b) => a.order - b.order);
714
+ resolve(metadata);
715
+ })
716
+ .catch((error) => {
717
+ reject(error);
718
+ });
719
+ });
720
+ }
721
+ loadSelectDistinct(dataUnit, fieldName, argument) {
722
+ const { parentRecordId, filters } = dataUnit.getLastLoadRequest() || {};
723
+ const filteredFilters = filters.filter(f => f.name !== `${constants.DISTINCT_FILTER_NAME_PREFIX}${fieldName}`);
724
+ const values = {
725
+ dataUnit: dataUnit.name,
726
+ argument,
727
+ fieldName,
728
+ parentRecordId,
729
+ filters: filteredFilters
730
+ };
731
+ return new Promise((resolve, reject) => {
732
+ DataFetcher.DataFetcher.get()
733
+ .callGraphQL({
734
+ values,
735
+ query: this.templateByQuery.get("fetchDistinctColumn"),
736
+ })
737
+ .then((result) => {
738
+ resolve(result);
739
+ })
740
+ .catch((error) => {
741
+ reject(error);
742
+ });
743
+ });
744
+ }
745
+ saveData(dataUnit, duChanges) {
746
+ const updatedRecordsIds = [];
747
+ const addedRecordsIds = [];
748
+ const changes = duChanges.map((change) => {
749
+ const { dataUnit: changeDU, record, updatingFields, operation } = change;
750
+ const dataUnitInstance = core.DataUnitStorage.get(changeDU);
751
+ let parsedUpdatingFields;
752
+ if (updatingFields) {
753
+ parsedUpdatingFields = Object.entries(updatingFields).map(([fieldName, value]) => {
754
+ const descriptor = dataUnitInstance.getField(fieldName);
755
+ const dataType = descriptor ? descriptor.dataType : core.DataType.TEXT;
756
+ return { fieldName, dataType, value: dataUnitInstance.valueToString(fieldName, value) };
757
+ });
758
+ }
759
+ if (changeDU === dataUnit.name) {
760
+ if (operation === core.ChangeOperation.INSERT || operation === core.ChangeOperation.COPY) {
761
+ addedRecordsIds.push(record.__record__id__);
762
+ }
763
+ else {
764
+ updatedRecordsIds.push(record.__record__id__);
765
+ }
766
+ }
767
+ const reqChange = { dataUnit: changeDU, fields: parsedUpdatingFields, operation, recordId: record.__record__id__ };
768
+ if (change.sourceId) {
769
+ reqChange.sourceId = change.sourceId;
770
+ }
771
+ if (record.__parent__record__id__) {
772
+ reqChange.parentRecordId = record.__parent__record__id__;
773
+ }
774
+ return reqChange;
775
+ });
776
+ return new Promise((resolve, reject) => {
777
+ const changesFormatted = changes.map((_a) => {
778
+ var rest = __rest(_a, []);
779
+ return rest;
780
+ });
781
+ DataFetcher.DataFetcher.get()
782
+ .callGraphQL({
783
+ values: { changes: changesFormatted },
784
+ query: this.templateByQuery.get("saveData"),
785
+ })
786
+ .then((resp) => {
787
+ const dataUnitRecords = [];
788
+ resp === null || resp === void 0 ? void 0 : resp.forEach((responseRecord) => {
789
+ const duRecord = {
790
+ __record__id__: responseRecord.id,
791
+ __record__label__: responseRecord.label,
792
+ __owner__dataunit__name__: responseRecord.ownerDataUnitName,
793
+ };
794
+ const dataUnitInstance = core.DataUnitStorage.get(duRecord.__owner__dataunit__name__) || dataUnit;
795
+ if (responseRecord.oldId) {
796
+ duRecord.__old__id__ = responseRecord.oldId;
797
+ }
798
+ responseRecord.fields.forEach(({ name, value }) => {
799
+ var _a;
800
+ duRecord[name] = ((_a = dataUnitInstance === null || dataUnitInstance === void 0 ? void 0 : dataUnitInstance.valueFromString) === null || _a === void 0 ? void 0 : _a.call(dataUnitInstance, name, value)) || value;
801
+ });
802
+ dataUnitRecords.push(duRecord);
803
+ });
804
+ this.updateCache(dataUnit, dataUnitRecords, updatedRecordsIds, addedRecordsIds);
805
+ resolve(dataUnitRecords);
806
+ })
807
+ .catch((error) => {
808
+ reject(error);
809
+ });
810
+ });
811
+ }
812
+ updateCache(dataUnit, savedRecords, toUpdate, toInsert) {
813
+ const recordsById = new Map(savedRecords.map(record => [record.__old__id__ || record.__record__id__, record]));
814
+ const addedRecords = toInsert.map(recordId => {
815
+ const copy = Object.assign({}, recordsById.get(recordId));
816
+ delete copy.__old__id__;
817
+ return copy;
818
+ });
819
+ if (addedRecords.length > 0) {
820
+ const firstRecord = dataUnit.records[0];
821
+ PreloadManager.insertRecords(dataUnit, firstRecord, addedRecords);
822
+ }
823
+ const updatedRecords = toUpdate.map(recordId => (Object.assign({}, recordsById.get(recordId))));
824
+ PreloadManager.updateRecords(dataUnit, updatedRecords);
825
+ }
826
+ getTransientInfo(dataUnit, recordID) {
827
+ const { records } = dataUnit.getSelectionInfo();
828
+ return Object.entries(records.filter(record => record.__record__id__ == recordID)[0]).filter(([key]) => key.startsWith(UnitMetadata.DataUnitTransient.DATA_UNIT_TRANSIENT_PREFIX_NAME)).map(([name, value]) => ({ fieldName: name, value, dataType: core.DataType.TEXT }));
829
+ }
830
+ removeRecords(dataUnit, recordIds) {
831
+ const changes = recordIds.map((recordId) => {
832
+ return { dataUnit: dataUnit.name, operation: core.ChangeOperation.DELETE, recordId, fields: this.getTransientInfo(dataUnit, recordId) };
833
+ });
834
+ return new Promise((resolve, reject) => {
835
+ DataFetcher.DataFetcher.get()
836
+ .callGraphQL({
837
+ values: { changes: changes },
838
+ query: this.templateByQuery.get("saveData"),
839
+ })
840
+ .then((_resp) => {
841
+ PreloadManager.removeRecords(dataUnit, dataUnit.records.filter(record => recordIds.includes(record.__record__id__)));
842
+ resolve(recordIds);
843
+ })
844
+ .catch((error) => {
845
+ reject(error);
846
+ });
847
+ });
848
+ }
849
+ loadRecord(dataUnit, recordIds) {
850
+ return new Promise((resolve, reject) => {
851
+ DataFetcher.DataFetcher.get()
852
+ .callGraphQL({
853
+ values: { recordID: recordIds, dataunit: dataUnit.name },
854
+ query: this.templateByQuery.get("fetchDataRecord"),
855
+ })
856
+ .then((response) => {
857
+ const dataUnitRecords = [];
858
+ response.record.forEach(responseRecord => {
859
+ const duRecord = { __record__id__: responseRecord.id, __record__label__: responseRecord.label };
860
+ responseRecord.fields.forEach(({ name, value }) => {
861
+ duRecord[name] = dataUnit.valueFromString(name, value);
862
+ });
863
+ dataUnitRecords.push(duRecord);
864
+ });
865
+ //TODO: Chamar o worker para persistir a nova versão do registro
866
+ resolve(dataUnitRecords);
867
+ })
868
+ .catch((error) => {
869
+ reject(error);
870
+ });
871
+ });
872
+ }
873
+ }
874
+
875
+ exports.DataUnitFetcher = DataUnitFetcher;
876
+ exports.InMemoryLoader = InMemoryLoader;
877
+ exports.PreloadManager = PreloadManager;