@sankhyalabs/sankhyablocks 8.6.0 → 8.8.0-dev.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/{ConfigStorage-bbffce76.js → ConfigStorage-a97ca159.js} +2 -2
- package/dist/cjs/{DataFetcher-0cc561bc.js → DataFetcher-2a99283c.js} +25 -10
- package/dist/cjs/{SnkFormConfigManager-c49af777.js → SnkFormConfigManager-f641f502.js} +2 -2
- package/dist/cjs/{SnkMultiSelectionListDataSource-804ff4c7.js → SnkMultiSelectionListDataSource-56db34ee.js} +11 -0
- package/dist/cjs/{auth-fetcher-fff2319e.js → auth-fetcher-78231356.js} +1 -1
- package/dist/cjs/dataunit-fetcher-4f7d4ee7.js +878 -0
- package/dist/cjs/{form-config-fetcher-35752aad.js → form-config-fetcher-a322a522.js} +1 -1
- package/dist/cjs/{pesquisa-fetcher-415eab63.js → pesquisa-fetcher-7ef61508.js} +1 -1
- package/dist/cjs/snk-actions-button.cjs.entry.js +4 -3
- package/dist/cjs/snk-application.cjs.entry.js +17 -8
- package/dist/cjs/snk-attach.cjs.entry.js +16 -3
- package/dist/cjs/snk-crud.cjs.entry.js +6 -4
- package/dist/cjs/snk-data-exporter.cjs.entry.js +1 -1
- package/dist/cjs/snk-detail-view.cjs.entry.js +8 -6
- package/dist/cjs/snk-filter-bar.cjs.entry.js +3 -3
- package/dist/cjs/snk-filter-modal-item.cjs.entry.js +3 -3
- package/dist/cjs/snk-form-config.cjs.entry.js +2 -2
- package/dist/cjs/snk-form.cjs.entry.js +4 -4
- package/dist/cjs/snk-grid-config.cjs.entry.js +3 -3
- package/dist/cjs/snk-grid.cjs.entry.js +25 -14
- package/dist/cjs/{snk-guides-viewer-36b39c9c.js → snk-guides-viewer-aab80f66.js} +5 -4
- package/dist/cjs/snk-guides-viewer.cjs.entry.js +8 -6
- package/dist/cjs/snk-personalized-filter.cjs.entry.js +19 -9
- package/dist/cjs/snk-simple-crud.cjs.entry.js +8 -92
- package/dist/collection/components/snk-application/snk-application.js +11 -3
- package/dist/collection/components/snk-attach/snk-attach.js +14 -2
- package/dist/collection/components/snk-grid/filtercolumn/SnkMultiSelectionListDataSource.js +11 -0
- package/dist/collection/components/snk-grid/snk-grid.js +24 -14
- package/dist/collection/components/snk-personalized-filter/snk-personalized-filter.js +16 -6
- package/dist/collection/lib/dataUnit/InMemoryLoader.js +23 -2
- package/dist/collection/lib/http/data-fetcher/DataFetcher.js +25 -10
- package/dist/collection/lib/http/data-fetcher/fetchers/data-unit/DataUnitDataLoader.js +113 -0
- package/dist/collection/lib/http/data-fetcher/fetchers/data-unit/cache/ArrayRepository.js +59 -0
- package/dist/collection/lib/http/data-fetcher/fetchers/data-unit/cache/PreloadManager.js +169 -0
- package/dist/collection/lib/http/data-fetcher/fetchers/{dataunit-fetcher.js → data-unit/dataunit-fetcher.js} +48 -100
- package/dist/collection/lib/http/data-fetcher/fetchers/data-unit/interfaces/ILoadDataResult.js +1 -0
- package/dist/collection/lib/http/data-fetcher/fetchers/data-unit/interfaces/ILoadDataStrategy.js +1 -0
- package/dist/collection/lib/http/data-fetcher/fetchers/data-unit/interfaces/ILoadingInfo.js +1 -0
- package/dist/collection/lib/http/data-fetcher/fetchers/data-unit/interfaces/IRecordField.js +1 -0
- package/dist/collection/lib/http/data-fetcher/fetchers/data-unit/interfaces/IResponseRecord.js +1 -0
- package/dist/collection/lib/http/data-fetcher/fetchers/data-unit/loadstrategy/DataUnitStrategy.js +68 -0
- package/dist/collection/lib/http/data-fetcher/fetchers/data-unit/loadstrategy/DatasetStrategy.js +131 -0
- package/dist/collection/lib/index.js +1 -1
- package/dist/components/DataFetcher.js +26 -11
- package/dist/components/SnkMultiSelectionListDataSource.js +11 -0
- package/dist/components/dataunit-fetcher.js +781 -100
- package/dist/components/snk-actions-button2.js +1 -1
- package/dist/components/snk-application2.js +11 -4
- package/dist/components/snk-attach2.js +13 -1
- package/dist/components/snk-crud.js +1 -1
- package/dist/components/snk-detail-view2.js +1 -1
- package/dist/components/snk-grid2.js +19 -11
- package/dist/components/snk-personalized-filter2.js +16 -6
- package/dist/components/snk-simple-crud2.js +2 -88
- package/dist/esm/{ConfigStorage-80ca14d5.js → ConfigStorage-26f89143.js} +2 -2
- package/dist/esm/{DataFetcher-044e3988.js → DataFetcher-90e91631.js} +26 -11
- package/dist/esm/{SnkFormConfigManager-1a8b3a44.js → SnkFormConfigManager-18948123.js} +2 -2
- package/dist/esm/{SnkMultiSelectionListDataSource-892f37f9.js → SnkMultiSelectionListDataSource-b9410c72.js} +11 -0
- package/dist/esm/{auth-fetcher-1b378f8e.js → auth-fetcher-a8c8ee7e.js} +1 -1
- package/dist/esm/dataunit-fetcher-1c2ccae2.js +874 -0
- package/dist/esm/{form-config-fetcher-c702e9e3.js → form-config-fetcher-7c3b6273.js} +1 -1
- package/dist/{components/pesquisa-fetcher.js → esm/pesquisa-fetcher-90d6853b.js} +1 -1
- package/dist/esm/snk-actions-button.entry.js +4 -3
- package/dist/esm/snk-application.entry.js +17 -8
- package/dist/esm/snk-attach.entry.js +16 -3
- package/dist/esm/snk-crud.entry.js +6 -4
- package/dist/esm/snk-data-exporter.entry.js +1 -1
- package/dist/esm/snk-detail-view.entry.js +8 -6
- package/dist/esm/snk-filter-bar.entry.js +3 -3
- package/dist/esm/snk-filter-modal-item.entry.js +3 -3
- package/dist/esm/snk-form-config.entry.js +2 -2
- package/dist/esm/snk-form.entry.js +4 -4
- package/dist/esm/snk-grid-config.entry.js +3 -3
- package/dist/esm/snk-grid.entry.js +26 -15
- package/dist/esm/{snk-guides-viewer-767ad354.js → snk-guides-viewer-62b0fa69.js} +5 -4
- package/dist/esm/snk-guides-viewer.entry.js +8 -6
- package/dist/esm/snk-personalized-filter.entry.js +19 -9
- package/dist/esm/snk-simple-crud.entry.js +7 -91
- package/dist/sankhyablocks/p-193971ad.js +1 -0
- package/dist/sankhyablocks/{p-dacb4c4c.entry.js → p-19cbe6e2.entry.js} +3 -3
- package/dist/sankhyablocks/{p-76926391.js → p-240f5892.js} +2 -2
- package/dist/sankhyablocks/p-2c7c1323.entry.js +1 -0
- package/dist/sankhyablocks/p-3253e7f2.entry.js +1 -0
- package/dist/sankhyablocks/{p-d1cc9007.entry.js → p-57550ddc.entry.js} +1 -1
- package/dist/sankhyablocks/p-5d51bff4.js +1 -0
- package/dist/sankhyablocks/{p-727b8cbe.entry.js → p-5dd52ec5.entry.js} +1 -1
- package/dist/sankhyablocks/p-6541f0df.js +1 -0
- package/dist/sankhyablocks/p-68fbd480.entry.js +1 -0
- package/dist/sankhyablocks/{p-845c7480.entry.js → p-8652f90b.entry.js} +1 -1
- package/dist/sankhyablocks/{p-a2c7c45f.js → p-910af03c.js} +1 -1
- package/dist/sankhyablocks/p-992a9d0f.js +1 -0
- package/dist/sankhyablocks/p-acb1374c.entry.js +1 -0
- package/dist/sankhyablocks/p-b36053da.entry.js +1 -0
- package/dist/sankhyablocks/p-b481e5ad.js +1 -0
- package/dist/sankhyablocks/p-d264da22.entry.js +1 -0
- package/dist/sankhyablocks/{p-af86752b.js → p-d47bbee3.js} +1 -1
- package/dist/sankhyablocks/{p-e46dd27b.entry.js → p-d563e451.entry.js} +1 -1
- package/dist/sankhyablocks/p-d56b65e3.entry.js +1 -0
- package/dist/sankhyablocks/p-e473ca13.entry.js +1 -0
- package/dist/sankhyablocks/{p-3ef37b31.entry.js → p-e74e2153.entry.js} +1 -1
- package/dist/sankhyablocks/p-e86d4a53.js +59 -0
- package/dist/sankhyablocks/{p-90c07587.entry.js → p-ebfa6460.entry.js} +1 -1
- package/dist/sankhyablocks/sankhyablocks.esm.js +1 -1
- package/dist/types/components/snk-application/snk-application.d.ts +1 -1
- package/dist/types/components/snk-attach/snk-attach.d.ts +1 -0
- package/dist/types/components/snk-grid/filtercolumn/SnkMultiSelectionListDataSource.d.ts +1 -0
- package/dist/types/components/snk-grid/snk-grid.d.ts +3 -4
- package/dist/types/components/snk-personalized-filter/snk-personalized-filter.d.ts +3 -1
- package/dist/types/components.d.ts +3 -2
- package/dist/types/lib/dataUnit/InMemoryLoader.d.ts +2 -1
- package/dist/types/lib/http/data-fetcher/DataFetcher.d.ts +2 -1
- package/dist/types/lib/http/data-fetcher/fetchers/data-unit/DataUnitDataLoader.d.ts +13 -0
- package/dist/types/lib/http/data-fetcher/fetchers/data-unit/cache/ArrayRepository.d.ts +19 -0
- package/dist/types/lib/http/data-fetcher/fetchers/data-unit/cache/PreloadManager.d.ts +25 -0
- package/dist/types/lib/http/data-fetcher/fetchers/{dataunit-fetcher.d.ts → data-unit/dataunit-fetcher.d.ts} +5 -3
- package/dist/types/lib/http/data-fetcher/fetchers/data-unit/interfaces/ILoadDataResult.d.ts +6 -0
- package/dist/types/lib/http/data-fetcher/fetchers/data-unit/interfaces/ILoadDataStrategy.d.ts +7 -0
- package/dist/types/lib/http/data-fetcher/fetchers/data-unit/interfaces/ILoadingInfo.d.ts +8 -0
- package/dist/types/lib/http/data-fetcher/fetchers/data-unit/interfaces/IRecordField.d.ts +4 -0
- package/dist/types/lib/http/data-fetcher/fetchers/data-unit/interfaces/IResponseRecord.d.ts +6 -0
- package/dist/types/lib/http/data-fetcher/fetchers/data-unit/loadstrategy/DataUnitStrategy.d.ts +9 -0
- package/dist/types/lib/http/data-fetcher/fetchers/data-unit/loadstrategy/DatasetStrategy.d.ts +15 -0
- package/dist/types/lib/http/data-fetcher/fetchers/personalized-filter-fetcher.d.ts +1 -1
- package/dist/types/lib/index.d.ts +1 -1
- package/package.json +3 -3
- package/dist/cjs/dataunit-fetcher-16b32d96.js +0 -356
- package/dist/esm/dataunit-fetcher-e0361781.js +0 -354
- package/dist/esm/pesquisa-fetcher-d1b4e5a2.js +0 -165
- package/dist/sankhyablocks/p-15578509.entry.js +0 -1
- package/dist/sankhyablocks/p-1f32ad9c.entry.js +0 -1
- package/dist/sankhyablocks/p-2043a64f.js +0 -1
- package/dist/sankhyablocks/p-251985c1.entry.js +0 -1
- package/dist/sankhyablocks/p-3c1759ba.entry.js +0 -1
- package/dist/sankhyablocks/p-473c7df4.js +0 -1
- package/dist/sankhyablocks/p-77aebc26.js +0 -1
- package/dist/sankhyablocks/p-867e9b79.js +0 -1
- package/dist/sankhyablocks/p-8d1602f2.entry.js +0 -1
- package/dist/sankhyablocks/p-98ae8ddc.entry.js +0 -1
- package/dist/sankhyablocks/p-9de24cf3.entry.js +0 -1
- package/dist/sankhyablocks/p-b6d54b6c.entry.js +0 -1
- package/dist/sankhyablocks/p-d5b11196.js +0 -76
- package/dist/sankhyablocks/p-fa9d3f73.js +0 -1
@@ -1,7 +1,743 @@
|
|
1
|
-
import { DataUnit,
|
1
|
+
import { DataType, FieldComparator, SortMode, DataUnit, defaultDataLoader, DateUtils, StringUtils, ChangeOperation, UserInterface, DataUnitStorage } from '@sankhyalabs/core';
|
2
2
|
import { d as dist, D as DataFetcher } from './DataFetcher.js';
|
3
3
|
import { DISTINCT_FILTER_NAME_PREFIX } from '@sankhyalabs/ezui/dist/collection/utils/constants';
|
4
4
|
import { DataUnitTransient } from '@sankhyalabs/core/dist/dataunit/metadata/UnitMetadata';
|
5
|
+
import { R as ResourceIDUtils } from './ResourceIDUtils.js';
|
6
|
+
|
7
|
+
class PesquisaFetcher {
|
8
|
+
constructor() {
|
9
|
+
this._defaultPageSize = 100;
|
10
|
+
this._templateByQuery = new Map();
|
11
|
+
this._searchListenersByDataUnit = new Map();
|
12
|
+
this.buldTemplates();
|
13
|
+
}
|
14
|
+
buldTemplates() {
|
15
|
+
this._templateByQuery.set("search", dist.gql `query($entityName: String! $argument: String $criteria: InputSearchCriteria $options: InputSearchOptions) {
|
16
|
+
$queryAlias$: search(entityName: $entityName argument: $argument criteria: $criteria options: $options){
|
17
|
+
value
|
18
|
+
label
|
19
|
+
}
|
20
|
+
}`);
|
21
|
+
}
|
22
|
+
loadSearchOptions(entityName, argument, criteria, options) {
|
23
|
+
var _a;
|
24
|
+
const cleanText = (argument === null || argument === void 0 ? void 0 : argument.toString().trim()) || undefined;
|
25
|
+
argument = isNaN(Number(cleanText)) && cleanText ? `%${cleanText}` : cleanText;
|
26
|
+
criteria === null || criteria === void 0 ? void 0 : criteria.params.forEach(param => {
|
27
|
+
if (param.dataType === DataType.OBJECT) {
|
28
|
+
param.value = JSON.stringify(param.value);
|
29
|
+
}
|
30
|
+
});
|
31
|
+
const listenerResult = this.applySearchListener(SearchListenerType.beforeSearch, entityName, argument, criteria, options);
|
32
|
+
const values = {
|
33
|
+
argument: (listenerResult === null || listenerResult === void 0 ? void 0 : listenerResult.argument) || argument,
|
34
|
+
entityName,
|
35
|
+
criteria: (listenerResult === null || listenerResult === void 0 ? void 0 : listenerResult.criteria) || criteria,
|
36
|
+
options: (listenerResult === null || listenerResult === void 0 ? void 0 : listenerResult.searchOptions) || options,
|
37
|
+
};
|
38
|
+
if (values.options) {
|
39
|
+
(_a = values.options) === null || _a === void 0 ? true : delete _a.dataUnitId;
|
40
|
+
}
|
41
|
+
return new Promise((resolve, reject) => {
|
42
|
+
DataFetcher.get()
|
43
|
+
.callGraphQL({
|
44
|
+
values,
|
45
|
+
query: this._templateByQuery.get("search"),
|
46
|
+
})
|
47
|
+
.then((result) => {
|
48
|
+
resolve(result);
|
49
|
+
})
|
50
|
+
.catch((error) => {
|
51
|
+
reject(error);
|
52
|
+
});
|
53
|
+
});
|
54
|
+
}
|
55
|
+
loadAdvancedSearch(entityName, argument, criteria, searchOptions) {
|
56
|
+
var _a, _b, _c;
|
57
|
+
const listenerResult = this.applySearchListener(SearchListenerType.beforeSearch, entityName, argument, criteria, searchOptions);
|
58
|
+
const values = {
|
59
|
+
argument: (listenerResult === null || listenerResult === void 0 ? void 0 : listenerResult.argument) || argument,
|
60
|
+
criteria: (listenerResult === null || listenerResult === void 0 ? void 0 : listenerResult.criteria) || criteria,
|
61
|
+
searchOptions: (listenerResult === null || listenerResult === void 0 ? void 0 : listenerResult.searchOptions) || searchOptions,
|
62
|
+
};
|
63
|
+
const serviceName = "PesquisaSP.getSuggestion";
|
64
|
+
const externalCriteria = {
|
65
|
+
query: {
|
66
|
+
$: (_a = values.criteria) === null || _a === void 0 ? void 0 : _a.expression
|
67
|
+
}
|
68
|
+
};
|
69
|
+
if (((_b = values.criteria) === null || _b === void 0 ? void 0 : _b.params.length) > 0) {
|
70
|
+
externalCriteria.params = {
|
71
|
+
param: values.criteria.params.map(param => {
|
72
|
+
let value = param.value;
|
73
|
+
let type = param.dataType;
|
74
|
+
if (type === DataType.OBJECT) {
|
75
|
+
value = value.value;
|
76
|
+
type = "S";
|
77
|
+
}
|
78
|
+
else {
|
79
|
+
type = convertParamType(param.dataType);
|
80
|
+
}
|
81
|
+
return { $: value, type };
|
82
|
+
})
|
83
|
+
};
|
84
|
+
}
|
85
|
+
const options = searchOptions != undefined
|
86
|
+
? {
|
87
|
+
"pkFieldName": searchOptions.codeFieldName,
|
88
|
+
"label": searchOptions.descriptionFieldName,
|
89
|
+
"fieldName": searchOptions.codeFieldName,
|
90
|
+
"useDescriptionOptions": false,
|
91
|
+
"enableRowsCounter": true
|
92
|
+
}
|
93
|
+
: undefined;
|
94
|
+
const reqBody = {
|
95
|
+
"serviceName": serviceName,
|
96
|
+
"requestBody": {
|
97
|
+
"criteria": Object.assign({ "entityName": entityName, "compacted": false, "ignoreEntityCriteria": false, "limit": this._defaultPageSize, "query": { "$": values.argument }, "orderByDesc": false, "externalCriteria": externalCriteria, "localEntityName": (_c = values.searchOptions) === null || _c === void 0 ? void 0 : _c.rootEntity }, { options }),
|
98
|
+
"clientEventList": {
|
99
|
+
"clientEvent": []
|
100
|
+
}
|
101
|
+
}
|
102
|
+
};
|
103
|
+
return new Promise((resolve, reject) => {
|
104
|
+
DataFetcher.get()
|
105
|
+
.callServiceBroker("PesquisaSP.getSuggestion", JSON.stringify(reqBody))
|
106
|
+
.then(result => resolve(result))
|
107
|
+
.catch(error => reject(error));
|
108
|
+
});
|
109
|
+
}
|
110
|
+
addSearchListener(entityName, dataUnitID, listener) {
|
111
|
+
var _a;
|
112
|
+
const dataUnitSearchListeners = this._searchListenersByDataUnit.get(dataUnitID) || [];
|
113
|
+
const entityListener = dataUnitSearchListeners.find(currentListener => currentListener.entity === entityName);
|
114
|
+
if (!entityListener) {
|
115
|
+
this._searchListenersByDataUnit.set(dataUnitID, [...dataUnitSearchListeners, { entity: entityName, listener }]);
|
116
|
+
}
|
117
|
+
else {
|
118
|
+
for (const type of Object.keys(listener)) {
|
119
|
+
if (type in entityListener.listener) {
|
120
|
+
const listenerFunctionIsEquals = ((_a = entityListener.listener[type]) === null || _a === void 0 ? void 0 : _a.toString()) === listener[type].toString();
|
121
|
+
if (listenerFunctionIsEquals)
|
122
|
+
continue;
|
123
|
+
entityListener.listener[type] = listener[type];
|
124
|
+
}
|
125
|
+
}
|
126
|
+
}
|
127
|
+
return () => {
|
128
|
+
const newListeners = dataUnitSearchListeners.filter(currentListener => currentListener.entity !== entityName);
|
129
|
+
if (!newListeners.length) {
|
130
|
+
this._searchListenersByDataUnit.delete(dataUnitID);
|
131
|
+
return;
|
132
|
+
}
|
133
|
+
this._searchListenersByDataUnit.set(dataUnitID, newListeners);
|
134
|
+
};
|
135
|
+
}
|
136
|
+
applySearchListener(listenerType, entityName, argument, criteria, searchOptions) {
|
137
|
+
var _a;
|
138
|
+
const dataUnitId = searchOptions === null || searchOptions === void 0 ? void 0 : searchOptions.dataUnitId;
|
139
|
+
if (!dataUnitId)
|
140
|
+
return;
|
141
|
+
const entityListener = (_a = this._searchListenersByDataUnit.get(dataUnitId)) === null || _a === void 0 ? void 0 : _a.find(({ entity }) => entity === entityName);
|
142
|
+
if (!entityListener)
|
143
|
+
return;
|
144
|
+
const { listener } = entityListener;
|
145
|
+
if (!(listenerType in listener))
|
146
|
+
return;
|
147
|
+
return listener[listenerType]({ argument, criteria, searchOptions });
|
148
|
+
}
|
149
|
+
}
|
150
|
+
function convertParamType(dataType) {
|
151
|
+
//Alerta: Cuidado pra não contaminar o DataType com a implementação
|
152
|
+
//atual da pesquisa... em geral, somente inteiros,
|
153
|
+
//data (com ou sem hora) e string são realmente relevantes
|
154
|
+
switch (dataType) {
|
155
|
+
case DataType.NUMBER:
|
156
|
+
return "I";
|
157
|
+
case DataType.DATE:
|
158
|
+
return "D";
|
159
|
+
default:
|
160
|
+
return "S";
|
161
|
+
}
|
162
|
+
}
|
163
|
+
var SearchListenerType;
|
164
|
+
(function (SearchListenerType) {
|
165
|
+
SearchListenerType["beforeSearch"] = "beforeSearch";
|
166
|
+
})(SearchListenerType || (SearchListenerType = {}));
|
167
|
+
|
168
|
+
class ArrayRepository {
|
169
|
+
constructor(equalsFunction) {
|
170
|
+
this._list = [];
|
171
|
+
this._equalsFunction = equalsFunction;
|
172
|
+
}
|
173
|
+
async load(filterFunction, sortingFunction, offset, limit) {
|
174
|
+
let result = [].concat(this._list);
|
175
|
+
if (filterFunction != undefined) {
|
176
|
+
result = this._list.filter(item => filterFunction(item));
|
177
|
+
}
|
178
|
+
if (sortingFunction != undefined) {
|
179
|
+
result = result.sort(sortingFunction);
|
180
|
+
}
|
181
|
+
const count = result.length;
|
182
|
+
if (limit != undefined) {
|
183
|
+
const start = offset || 0;
|
184
|
+
const end = limit ? start + limit : result.length;
|
185
|
+
result = result.slice(start, end);
|
186
|
+
}
|
187
|
+
return Promise.resolve({ result, count });
|
188
|
+
}
|
189
|
+
async distict(itemProcessor) {
|
190
|
+
const processedItems = this._list.map(item => itemProcessor(item));
|
191
|
+
return Promise.resolve(new Map(processedItems.filter(item => item != undefined)
|
192
|
+
.map(item => [item.key, item.value])));
|
193
|
+
}
|
194
|
+
async push(items) {
|
195
|
+
this._list.push(...items);
|
196
|
+
}
|
197
|
+
async clear() {
|
198
|
+
this._list = [];
|
199
|
+
}
|
200
|
+
async delete(items) {
|
201
|
+
this._list = this._list.filter(item => !items.includes(item));
|
202
|
+
}
|
203
|
+
async update(items) {
|
204
|
+
this._list = this._list.map(existingItem => {
|
205
|
+
const newItem = items.find(newItem => this._equalsFunction(existingItem, newItem));
|
206
|
+
return newItem == undefined ? existingItem : newItem;
|
207
|
+
});
|
208
|
+
}
|
209
|
+
async insert(itemReference, items) {
|
210
|
+
const itemPosition = this._list.indexOf(itemReference);
|
211
|
+
if (itemPosition == -1) {
|
212
|
+
this._list.push(...items);
|
213
|
+
return;
|
214
|
+
}
|
215
|
+
this._list = this._list.slice(0, itemPosition).concat(items).concat(this._list.slice(itemPosition));
|
216
|
+
}
|
217
|
+
isOperating() {
|
218
|
+
return true;
|
219
|
+
}
|
220
|
+
async isEmpty() {
|
221
|
+
return Promise.resolve(this._list.length === 0);
|
222
|
+
}
|
223
|
+
async count() {
|
224
|
+
return Promise.resolve(this._list.length);
|
225
|
+
}
|
226
|
+
}
|
227
|
+
|
228
|
+
const COLUMN_FILTER_PATTERN = /FILTRO_COLUNA_(.+)/;
|
229
|
+
class PreloadManager {
|
230
|
+
static setLoadingStatus(dataUnit, loadingInProgress) {
|
231
|
+
this._loadingStatus.set(dataUnit.name, loadingInProgress);
|
232
|
+
}
|
233
|
+
static isCacheEnabled(dataUnit) {
|
234
|
+
const dataUnitResourceId = PreloadManager.getResourceId(dataUnit.name);
|
235
|
+
if (dataUnitResourceId !== this.applicationResourceID) {
|
236
|
+
return false;
|
237
|
+
}
|
238
|
+
return this.getRepository(dataUnit).isOperating();
|
239
|
+
}
|
240
|
+
static getResourceId(dataUnitName) {
|
241
|
+
const dataUnitNameInfo = DataUnitFetcher.parseDataUnitName(dataUnitName);
|
242
|
+
return dataUnitNameInfo == undefined ? undefined : dataUnitNameInfo.resourceID;
|
243
|
+
}
|
244
|
+
static cacheRecords(dataUnit, records, resetDatabase, loadingInProgress) {
|
245
|
+
PreloadManager.setLoadingStatus(dataUnit, loadingInProgress);
|
246
|
+
if (PreloadManager.isCacheEnabled(dataUnit)) {
|
247
|
+
this.getRepository(dataUnit).push(records);
|
248
|
+
}
|
249
|
+
else {
|
250
|
+
if (resetDatabase) {
|
251
|
+
this._repositories.delete(dataUnit.name);
|
252
|
+
}
|
253
|
+
}
|
254
|
+
}
|
255
|
+
static getSortingFunction(dataUnit, sorting) {
|
256
|
+
if (sorting == undefined || sorting.length == 0) {
|
257
|
+
return undefined;
|
258
|
+
}
|
259
|
+
return (recordA, recordB) => {
|
260
|
+
for (const sort of sorting) {
|
261
|
+
const result = FieldComparator.compare(dataUnit.getField(sort.field), recordA, recordB, sort.mode === SortMode.ASC);
|
262
|
+
if (result != 0) {
|
263
|
+
return result;
|
264
|
+
}
|
265
|
+
}
|
266
|
+
};
|
267
|
+
}
|
268
|
+
static async getDistinct(dataUnit, fieldName) {
|
269
|
+
if (!PreloadManager.isCacheEnabled(dataUnit)) {
|
270
|
+
return Promise.resolve(undefined);
|
271
|
+
}
|
272
|
+
return new Promise((accept, reject) => {
|
273
|
+
PreloadManager.getRepository(dataUnit).distict(record => {
|
274
|
+
const fieldValue = record[fieldName];
|
275
|
+
if (fieldValue == undefined) {
|
276
|
+
return undefined;
|
277
|
+
}
|
278
|
+
const value = fieldValue.value != undefined ? fieldValue.value : fieldValue;
|
279
|
+
return { key: dataUnit.getFormattedValue(fieldName, fieldValue), value };
|
280
|
+
})
|
281
|
+
.then(values => accept(values))
|
282
|
+
.catch(reason => reject(reason));
|
283
|
+
});
|
284
|
+
}
|
285
|
+
static async loadData(dataUnit, request, loadFromServer) {
|
286
|
+
try {
|
287
|
+
if (PreloadManager.isCacheEnabled(dataUnit)) {
|
288
|
+
let useCache = request.source === "EZ_GRID_LOADING_SOURCE" || request.source === DataUnit.CHANGING_PAGE_LOADING_SOURCE;
|
289
|
+
if (useCache) {
|
290
|
+
const isCacheEmpty = await PreloadManager.getRepository(dataUnit).isEmpty();
|
291
|
+
if (!isCacheEmpty) {
|
292
|
+
return PreloadManager.loadFromCache(dataUnit, request);
|
293
|
+
}
|
294
|
+
}
|
295
|
+
//Como não vamos aproveitar o cache, ele precisa ser limpado.
|
296
|
+
PreloadManager.getRepository(dataUnit).clear().catch(() => { });
|
297
|
+
}
|
298
|
+
return loadFromServer(dataUnit, request);
|
299
|
+
}
|
300
|
+
catch (error) {
|
301
|
+
console.error(error);
|
302
|
+
return Promise.reject(error);
|
303
|
+
}
|
304
|
+
}
|
305
|
+
static insertRecords(dataUnit, reference, records) {
|
306
|
+
if (PreloadManager.isCacheEnabled(dataUnit)) {
|
307
|
+
PreloadManager.getRepository(dataUnit).insert(reference, records);
|
308
|
+
}
|
309
|
+
}
|
310
|
+
static updateRecords(dataUnit, records) {
|
311
|
+
if (PreloadManager.isCacheEnabled(dataUnit)) {
|
312
|
+
PreloadManager.getRepository(dataUnit).update(records);
|
313
|
+
}
|
314
|
+
}
|
315
|
+
static removeRecords(dataUnit, records) {
|
316
|
+
if (PreloadManager.isCacheEnabled(dataUnit)) {
|
317
|
+
PreloadManager.getRepository(dataUnit).delete(records);
|
318
|
+
}
|
319
|
+
}
|
320
|
+
static async countRecords(dataUnit) {
|
321
|
+
if (PreloadManager.isCacheEnabled(dataUnit)) {
|
322
|
+
return PreloadManager.getRepository(dataUnit).count();
|
323
|
+
}
|
324
|
+
return Promise.resolve(0);
|
325
|
+
}
|
326
|
+
static getRepository(dataUnit) {
|
327
|
+
const name = dataUnit.name;
|
328
|
+
if (!PreloadManager._repositories.has(name)) {
|
329
|
+
PreloadManager._repositories.set(name, new ArrayRepository((recordA, recordB) => recordA.__record__id__ === recordB.__record__id__));
|
330
|
+
}
|
331
|
+
return PreloadManager._repositories.get(name);
|
332
|
+
}
|
333
|
+
static getFilterFunction(dataUnit, filters) {
|
334
|
+
if (filters != undefined && filters.length > 0) {
|
335
|
+
return record => {
|
336
|
+
for (const filter of filters) {
|
337
|
+
if (!PreloadManager.recordMatchesFilter(dataUnit, record, filter)) {
|
338
|
+
return false;
|
339
|
+
}
|
340
|
+
}
|
341
|
+
return true;
|
342
|
+
};
|
343
|
+
}
|
344
|
+
return undefined;
|
345
|
+
}
|
346
|
+
static recordMatchesFilter(dataUnit, record, columnFilter) {
|
347
|
+
const fieldValue = record[columnFilter.columnName];
|
348
|
+
for (let param of columnFilter.params) {
|
349
|
+
const paramValue = dataUnit.valueFromString(columnFilter.columnName, param.value);
|
350
|
+
if (FieldComparator.compareValues(dataUnit.getField(columnFilter.columnName), fieldValue, paramValue) === 0) {
|
351
|
+
return true;
|
352
|
+
}
|
353
|
+
}
|
354
|
+
return false;
|
355
|
+
}
|
356
|
+
static async loadFromCache(dataUnit, request) {
|
357
|
+
return new Promise((accept, reject) => {
|
358
|
+
const columnFilters = PreloadManager.getColumnFilters(request.filters);
|
359
|
+
const { limit, offset, sort } = request;
|
360
|
+
PreloadManager.getRepository(dataUnit)
|
361
|
+
.load(PreloadManager.getFilterFunction(dataUnit, Array.from(columnFilters.values())), PreloadManager.getSortingFunction(dataUnit, sort), offset, limit)
|
362
|
+
.then(loadResult => {
|
363
|
+
const stillLoading = PreloadManager._loadingStatus.get(dataUnit.name);
|
364
|
+
const { count, result: records } = loadResult;
|
365
|
+
const firstRecord = count == 0 ? 1 : offset + 1;
|
366
|
+
const lastRecord = offset + Math.min(records.length, limit);
|
367
|
+
const currentPage = offset / limit;
|
368
|
+
const paginationInfo = {
|
369
|
+
count, currentPage, firstRecord, lastRecord,
|
370
|
+
hasMore: stillLoading || (lastRecord < count),
|
371
|
+
total: stillLoading ? undefined : count
|
372
|
+
};
|
373
|
+
accept({ records, paginationInfo });
|
374
|
+
})
|
375
|
+
.catch(reason => reject(reason));
|
376
|
+
});
|
377
|
+
}
|
378
|
+
static getColumnFilters(filters) {
|
379
|
+
const columnFilters = new Map();
|
380
|
+
if (filters == undefined || filters.length == 0) {
|
381
|
+
return columnFilters;
|
382
|
+
}
|
383
|
+
filters.forEach(filter => {
|
384
|
+
const match = COLUMN_FILTER_PATTERN.exec(filter.name);
|
385
|
+
if (match) {
|
386
|
+
columnFilters.set(filter.name, Object.assign({ columnName: match[1] }, filter));
|
387
|
+
}
|
388
|
+
});
|
389
|
+
return columnFilters;
|
390
|
+
}
|
391
|
+
}
|
392
|
+
PreloadManager._repositories = new Map();
|
393
|
+
PreloadManager._loadingStatus = new Map();
|
394
|
+
|
395
|
+
class InMemoryLoader {
|
396
|
+
constructor(metadata, records) {
|
397
|
+
this.metadata = metadata;
|
398
|
+
this.records = records;
|
399
|
+
this._dataUnit = new DataUnit(InMemoryLoader.IN_MEMORY_DATA_UNIT_NAME);
|
400
|
+
this._dataUnit.metadataLoader = () => this.metadaLoader();
|
401
|
+
this._dataUnit.dataLoader = (dataUnit, request) => defaultDataLoader(dataUnit, request, this.getRecordsToLoad());
|
402
|
+
this._dataUnit.saveLoader = (_dataUnit, changes) => this.saveLoader(_dataUnit, changes);
|
403
|
+
this._dataUnit.removeLoader = (_dataUnit, recordIds) => this.removeLoader(_dataUnit, recordIds);
|
404
|
+
this.dataUnit.loadMetadata().then(() => this.dataUnit.loadData());
|
405
|
+
}
|
406
|
+
getRecordsToLoad() {
|
407
|
+
if (this._initialRecords) {
|
408
|
+
try {
|
409
|
+
return this._initialRecords;
|
410
|
+
}
|
411
|
+
finally {
|
412
|
+
this._initialRecords = undefined;
|
413
|
+
}
|
414
|
+
}
|
415
|
+
return this.dataUnit.records;
|
416
|
+
}
|
417
|
+
get dataUnit() {
|
418
|
+
return this._dataUnit;
|
419
|
+
}
|
420
|
+
get records() {
|
421
|
+
return this.dataUnit.records;
|
422
|
+
}
|
423
|
+
static getConvertedValue(descriptor, strValue) {
|
424
|
+
if (descriptor.dataType === DataType.BOOLEAN) {
|
425
|
+
return strValue === "S";
|
426
|
+
}
|
427
|
+
if (descriptor.dataType === DataType.NUMBER) {
|
428
|
+
return Number(strValue);
|
429
|
+
}
|
430
|
+
if (descriptor.dataType === DataType.DATE) {
|
431
|
+
return DateUtils.strToDate(strValue, true);
|
432
|
+
}
|
433
|
+
return strValue;
|
434
|
+
}
|
435
|
+
set records(records) {
|
436
|
+
const columns = this._metadata ? new Map(this._metadata.fields.map(descriptor => [descriptor.name, descriptor])) : undefined;
|
437
|
+
const newRecords = records === null || records === void 0 ? void 0 : records.map(record => {
|
438
|
+
if (!record["__record__id__"]) {
|
439
|
+
record["__record__id__"] = this.generateUniqueId();
|
440
|
+
}
|
441
|
+
if (columns != undefined) {
|
442
|
+
for (const name in record) {
|
443
|
+
const value = record[name];
|
444
|
+
if (typeof value === "string" && columns.has(name)) {
|
445
|
+
record[name] = InMemoryLoader.getConvertedValue(columns.get(name), value);
|
446
|
+
}
|
447
|
+
}
|
448
|
+
}
|
449
|
+
return record;
|
450
|
+
});
|
451
|
+
if (this._dataUnit) {
|
452
|
+
this._dataUnit.records = newRecords;
|
453
|
+
}
|
454
|
+
else {
|
455
|
+
this._initialRecords = newRecords;
|
456
|
+
}
|
457
|
+
}
|
458
|
+
get metadata() {
|
459
|
+
return this._metadata;
|
460
|
+
}
|
461
|
+
set metadata(metadata) {
|
462
|
+
this._metadata = metadata;
|
463
|
+
if (this._dataUnit) {
|
464
|
+
this._dataUnit.metadata = this._metadata;
|
465
|
+
}
|
466
|
+
}
|
467
|
+
generateUniqueId() {
|
468
|
+
return StringUtils.generateUUID();
|
469
|
+
}
|
470
|
+
metadaLoader() {
|
471
|
+
return Promise.resolve(this._metadata);
|
472
|
+
}
|
473
|
+
saveLoader(_dataUnit, changes) {
|
474
|
+
return new Promise((resolve) => {
|
475
|
+
let dataUnitRecords = [];
|
476
|
+
changes.forEach(change => {
|
477
|
+
let { record, updatingFields, operation } = change;
|
478
|
+
const changedRecord = Object.assign(Object.assign({}, record), updatingFields);
|
479
|
+
if (operation === ChangeOperation.INSERT ||
|
480
|
+
operation === ChangeOperation.COPY) {
|
481
|
+
changedRecord["__old__id__"] = record["__record__id__"];
|
482
|
+
changedRecord["__record__id__"] = this.generateUniqueId();
|
483
|
+
this.records.push(changedRecord);
|
484
|
+
}
|
485
|
+
else {
|
486
|
+
const recordIndex = this.records.findIndex(r => r["__record__id__"] == changedRecord["__record__id__"]);
|
487
|
+
this.records[recordIndex] = changedRecord;
|
488
|
+
}
|
489
|
+
dataUnitRecords.push(changedRecord);
|
490
|
+
});
|
491
|
+
resolve(dataUnitRecords);
|
492
|
+
});
|
493
|
+
}
|
494
|
+
removeLoader(_dataUnit, recordIds) {
|
495
|
+
return new Promise((resolve) => {
|
496
|
+
resolve(recordIds);
|
497
|
+
});
|
498
|
+
}
|
499
|
+
}
|
500
|
+
InMemoryLoader.IN_MEMORY_DATA_UNIT_NAME = "InMemoryDataUnit";
|
501
|
+
|
502
|
+
class DatasetStrategy {
|
503
|
+
canSlice() {
|
504
|
+
return false;
|
505
|
+
}
|
506
|
+
async load(dataUnit, request, loadingInfo) {
|
507
|
+
if (dataUnit.metadata == undefined) {
|
508
|
+
return Promise.resolve({ records: [], loadingInfo });
|
509
|
+
}
|
510
|
+
try {
|
511
|
+
const fields = this.getFieldsList(dataUnit);
|
512
|
+
const serviceName = "DatasetSP.loadRecords";
|
513
|
+
const requestBody = this.buildRequestBody(serviceName, fields, dataUnit, request, loadingInfo);
|
514
|
+
const { result: responseRecords, pagerID: pagerId } = await DataFetcher.get().callServiceBroker(serviceName, requestBody);
|
515
|
+
const records = this.processRecords(dataUnit, fields, responseRecords);
|
516
|
+
const loadingInProgress = pagerId != undefined;
|
517
|
+
const count = loadingInfo.count + records.length;
|
518
|
+
return Promise.resolve({
|
519
|
+
records,
|
520
|
+
loadingInfo: Object.assign(Object.assign({}, loadingInfo), { pagerId,
|
521
|
+
loadingInProgress, total: loadingInProgress ? undefined : count, count })
|
522
|
+
});
|
523
|
+
}
|
524
|
+
catch (error) {
|
525
|
+
console.error(error);
|
526
|
+
return Promise.reject(error);
|
527
|
+
}
|
528
|
+
}
|
529
|
+
getFieldsList(dataUnit) {
|
530
|
+
let fields = ["__record__id__", "__record__label__"];
|
531
|
+
dataUnit.metadata.fields.forEach(descriptor => {
|
532
|
+
fields = fields.concat(this.getFieldNames(descriptor));
|
533
|
+
});
|
534
|
+
return fields;
|
535
|
+
}
|
536
|
+
getFieldNames(descriptor) {
|
537
|
+
const descriptionField = this.getSearchDescriptionField(descriptor);
|
538
|
+
if (descriptionField == undefined) {
|
539
|
+
return descriptor.name;
|
540
|
+
}
|
541
|
+
return [descriptor.name, descriptionField];
|
542
|
+
}
|
543
|
+
buildRequestBody(serviceName, fields, dataUnit, request, loadingInfo) {
|
544
|
+
const dataSetID = dataUnit.dataUnitId;
|
545
|
+
const dataUnitName = dataUnit.name;
|
546
|
+
const entityName = DataUnitFetcher.parseDataUnitName(dataUnitName).entityName;
|
547
|
+
const requestBody = {
|
548
|
+
serviceName,
|
549
|
+
requestBody: {
|
550
|
+
dataSetID,
|
551
|
+
fields,
|
552
|
+
entityName,
|
553
|
+
pageNumber: loadingInfo.pageNumber,
|
554
|
+
totalRecordsCount: loadingInfo.count,
|
555
|
+
pagerID: loadingInfo.pagerId,
|
556
|
+
standAlone: false,
|
557
|
+
standAloneFieldsMD: {
|
558
|
+
__record__id__: { "fieldType": "S", "userType": "P" },
|
559
|
+
__record__label__: { "fieldType": "S", "userType": "P" }
|
560
|
+
},
|
561
|
+
tryJoinedFields: true,
|
562
|
+
parallelLoader: true,
|
563
|
+
crudListener: "br.com.sankhya.modelcore.dataset.DataUnitDatasetAdapter",
|
564
|
+
txProperties: this.getTxProperties(dataUnitName, request),
|
565
|
+
useDefaultRowsLimit: false
|
566
|
+
}
|
567
|
+
};
|
568
|
+
return JSON.stringify(requestBody);
|
569
|
+
}
|
570
|
+
getTxProperties(dataUnitName, request) {
|
571
|
+
const txProperties = {
|
572
|
+
"__DATA_UNIT_ADAPTER__[dataUnitName]": dataUnitName
|
573
|
+
};
|
574
|
+
const serverSideFilters = request.filters.filter(filter => !filter.name.startsWith("FILTRO_COLUNA_"));
|
575
|
+
if (serverSideFilters.length !== 0) {
|
576
|
+
txProperties["__DATA_UNIT_ADAPTER__[criteria]"] = JSON.stringify(serverSideFilters);
|
577
|
+
}
|
578
|
+
const sorting = request.sort;
|
579
|
+
if (sorting != undefined && sorting.length !== 0) {
|
580
|
+
txProperties["__DATA_UNIT_ADAPTER__[sorting]"] = JSON.stringify(sorting);
|
581
|
+
}
|
582
|
+
return txProperties;
|
583
|
+
}
|
584
|
+
processRecords(dataUnit, fields, responseRecords) {
|
585
|
+
return responseRecords.map((dataFrame) => {
|
586
|
+
const duRecord = {
|
587
|
+
__record__id__: dataFrame[0],
|
588
|
+
__record__label__: dataFrame[1]
|
589
|
+
};
|
590
|
+
dataUnit.metadata.fields.forEach(fieldDescriptor => {
|
591
|
+
duRecord[fieldDescriptor.name] = this.buildFieldValue(fieldDescriptor, fields, dataFrame);
|
592
|
+
});
|
593
|
+
return duRecord;
|
594
|
+
});
|
595
|
+
}
|
596
|
+
buildFieldValue(descriptor, allFields, dataFrame) {
|
597
|
+
const fieldIndex = allFields.indexOf(descriptor.name);
|
598
|
+
if (fieldIndex < 0) {
|
599
|
+
return null;
|
600
|
+
}
|
601
|
+
const strValue = dataFrame[fieldIndex];
|
602
|
+
if (StringUtils.isEmpty(strValue)) {
|
603
|
+
return null;
|
604
|
+
}
|
605
|
+
const descriptionField = this.getSearchDescriptionField(descriptor);
|
606
|
+
if (descriptionField != undefined) {
|
607
|
+
const descriptionFieldIndex = allFields.indexOf(descriptionField);
|
608
|
+
if (descriptionFieldIndex >= 0) {
|
609
|
+
return { value: strValue, label: dataFrame[descriptionFieldIndex] };
|
610
|
+
}
|
611
|
+
}
|
612
|
+
if (descriptor.userInterface === UserInterface.SEARCH) {
|
613
|
+
//Se não tem um campo de descrição (código acima)
|
614
|
+
//Mas é um search, tentamos parsear um numero...
|
615
|
+
return isNaN(Number(strValue)) ? strValue : Number(strValue);
|
616
|
+
}
|
617
|
+
return InMemoryLoader.getConvertedValue(descriptor, strValue);
|
618
|
+
}
|
619
|
+
getSearchDescriptionField(descriptor) {
|
620
|
+
if (descriptor.userInterface === UserInterface.SEARCH) {
|
621
|
+
const { ENTITYNAME, mergedFrom, DESCRIPTIONFIELD } = descriptor.properties;
|
622
|
+
if (!StringUtils.isEmpty(DESCRIPTIONFIELD)) {
|
623
|
+
return mergedFrom != undefined ? `${mergedFrom}.${ENTITYNAME}.${DESCRIPTIONFIELD}` : `${ENTITYNAME}.${DESCRIPTIONFIELD}`;
|
624
|
+
}
|
625
|
+
}
|
626
|
+
return undefined;
|
627
|
+
}
|
628
|
+
}
|
629
|
+
|
630
|
+
class DataUnitDataLoader {
|
631
|
+
static async debounce(dataUnit, callBack) {
|
632
|
+
const duName = dataUnit.name;
|
633
|
+
if (DataUnitDataLoader._debouncingTimeouts[duName]) {
|
634
|
+
clearTimeout(DataUnitDataLoader._debouncingTimeouts[duName]);
|
635
|
+
delete DataUnitDataLoader._debouncingTimeouts[duName];
|
636
|
+
}
|
637
|
+
DataUnitDataLoader._debouncingTimeouts[duName] = setTimeout(() => {
|
638
|
+
delete DataUnitDataLoader._debouncingTimeouts[duName];
|
639
|
+
callBack();
|
640
|
+
}, 100);
|
641
|
+
}
|
642
|
+
static async loadData(dataUnit, request) {
|
643
|
+
return new Promise((resolve, reject) => {
|
644
|
+
DataUnitDataLoader.debounce(dataUnit, () => {
|
645
|
+
PreloadManager.loadData(dataUnit, request, this.loadFromServer)
|
646
|
+
.then(resp => resolve(resp))
|
647
|
+
.catch(reason => reject(reason));
|
648
|
+
});
|
649
|
+
});
|
650
|
+
}
|
651
|
+
static async loadFromServer(dataUnit, request, loadingInfo) {
|
652
|
+
try {
|
653
|
+
//Registramos a request com as informações de carga para determinarmos a última.
|
654
|
+
//Caso o usuário inicie outro refresh antes de terminar, devemos ignorar o resultado.
|
655
|
+
loadingInfo = DataUnitDataLoader.registryLoading(dataUnit, loadingInfo);
|
656
|
+
const loadResult = await DataUnitDataLoader.callLoader(dataUnit, request, loadingInfo);
|
657
|
+
if (loadResult == undefined) {
|
658
|
+
//Essa request foi originada de refresh antigo. Será ignorada;
|
659
|
+
return;
|
660
|
+
}
|
661
|
+
const loadedRecords = loadResult.records;
|
662
|
+
const paginationInfo = DataUnitDataLoader.buildPaginationInfo(loadedRecords.length, request, loadResult.loadingInfo);
|
663
|
+
const records = paginationInfo == undefined ? loadedRecords : loadedRecords.slice(0, paginationInfo.lastRecord);
|
664
|
+
return Promise.resolve({ records, paginationInfo });
|
665
|
+
}
|
666
|
+
catch (error) {
|
667
|
+
console.error(error);
|
668
|
+
return Promise.reject(error);
|
669
|
+
}
|
670
|
+
}
|
671
|
+
static async callLoader(dataUnit, request, requestLoadingInfo, dataLoader) {
|
672
|
+
if (dataLoader == undefined) {
|
673
|
+
//dataLoader = new DataUnitStrategy();
|
674
|
+
dataLoader = new DatasetStrategy();
|
675
|
+
}
|
676
|
+
const result = await dataLoader.load(dataUnit, request, requestLoadingInfo);
|
677
|
+
const { records, loadingInfo: responseLoadingInfo } = result;
|
678
|
+
if (DataUnitDataLoader.isOldRequest(dataUnit, responseLoadingInfo)) {
|
679
|
+
return Promise.resolve(undefined);
|
680
|
+
}
|
681
|
+
const recreateCache = !dataLoader.canSlice() || responseLoadingInfo.count === 0;
|
682
|
+
PreloadManager.cacheRecords(dataUnit, records, recreateCache, responseLoadingInfo.loadingInProgress);
|
683
|
+
if (PreloadManager.isCacheEnabled(dataUnit) && responseLoadingInfo.loadingInProgress) {
|
684
|
+
const newRequest = Object.assign(Object.assign({}, request), { offset: responseLoadingInfo.count });
|
685
|
+
const newLoadingInfo = Object.assign(Object.assign({}, responseLoadingInfo), { pageNumber: (responseLoadingInfo.pageNumber || 0) + 1 });
|
686
|
+
this.callLoader(dataUnit, newRequest, newLoadingInfo, dataLoader)
|
687
|
+
.then(result => DataUnitDataLoader.afterLoadingPage(dataUnit, result.loadingInfo))
|
688
|
+
.catch(reason => console.error(reason));
|
689
|
+
}
|
690
|
+
return Promise.resolve(result);
|
691
|
+
}
|
692
|
+
static afterLoadingPage(dataUnit, loadingInfo) {
|
693
|
+
PreloadManager.setLoadingStatus(dataUnit, loadingInfo.loadingInProgress);
|
694
|
+
const dataUnitPagination = dataUnit.getPaginationInfo();
|
695
|
+
if (dataUnitPagination == undefined) {
|
696
|
+
return;
|
697
|
+
}
|
698
|
+
const count = loadingInfo.count;
|
699
|
+
if (loadingInfo.loadingInProgress) {
|
700
|
+
dataUnit.updatePagination(Object.assign(Object.assign({}, dataUnitPagination), { count }));
|
701
|
+
return;
|
702
|
+
}
|
703
|
+
dataUnit.updatePagination(Object.assign(Object.assign({}, dataUnitPagination), { total: count, count }));
|
704
|
+
}
|
705
|
+
static registryLoading(dataUnit, loadingInfo) {
|
706
|
+
if (loadingInfo == undefined) {
|
707
|
+
loadingInfo = { requestTime: new Date().getTime(), count: 0 };
|
708
|
+
}
|
709
|
+
DataUnitDataLoader._requestTimeByDataUnit.set(dataUnit.name, loadingInfo.requestTime);
|
710
|
+
return loadingInfo;
|
711
|
+
}
|
712
|
+
static isOldRequest(dataUnit, loadingInfo) {
|
713
|
+
return DataUnitDataLoader._requestTimeByDataUnit.get(dataUnit.name) > loadingInfo.requestTime;
|
714
|
+
}
|
715
|
+
static buildPaginationInfo(pageSize, request, loadingInfo) {
|
716
|
+
let { limit, offset } = request;
|
717
|
+
if (!limit) {
|
718
|
+
return undefined;
|
719
|
+
}
|
720
|
+
if (loadingInfo.pageNumber === 1) {
|
721
|
+
// Quando o loader não é capaz de fatiar os registros
|
722
|
+
// ele pode decidir por uma carga completa, o que faz o
|
723
|
+
// controle de paginação voltar pra primeira página.
|
724
|
+
offset = 0;
|
725
|
+
}
|
726
|
+
const { total, count, loadingInProgress } = loadingInfo;
|
727
|
+
const firstRecord = count === 0 ? 0 : offset + 1;
|
728
|
+
const lastRecord = offset + Math.min(pageSize, limit);
|
729
|
+
return {
|
730
|
+
total,
|
731
|
+
count,
|
732
|
+
lastRecord,
|
733
|
+
firstRecord,
|
734
|
+
currentPage: offset / limit,
|
735
|
+
hasMore: lastRecord < count || loadingInProgress
|
736
|
+
};
|
737
|
+
}
|
738
|
+
}
|
739
|
+
DataUnitDataLoader._requestTimeByDataUnit = new Map();
|
740
|
+
DataUnitDataLoader._debouncingTimeouts = {};
|
5
741
|
|
6
742
|
var __rest = (undefined && undefined.__rest) || function (s, e) {
|
7
743
|
var t = {};
|
@@ -14,10 +750,10 @@ var __rest = (undefined && undefined.__rest) || function (s, e) {
|
|
14
750
|
}
|
15
751
|
return t;
|
16
752
|
};
|
753
|
+
const DATA_UNIT_NAME_PARSER = /dd:\/\/([^/]+)\/([^/?]+)/;
|
17
754
|
class DataUnitFetcher {
|
18
755
|
constructor() {
|
19
756
|
this.templateByQuery = new Map();
|
20
|
-
this._loadDataTimeout = {};
|
21
757
|
this.buldTemplates();
|
22
758
|
}
|
23
759
|
buldTemplates() {
|
@@ -56,24 +792,6 @@ class DataUnitFetcher {
|
|
56
792
|
}
|
57
793
|
}
|
58
794
|
}`);
|
59
|
-
this.templateByQuery.set("fetchData", dist.gql `query($dataunit: String! $limit: Int $offset:Int $filters: [InputFilter!] $sort: [InputSort!] $parentRecordId: String) {
|
60
|
-
$queryAlias$: fetchDataUnit(name: $dataunit){
|
61
|
-
data(limit: $limit offset: $offset filters: $filters sort: $sort parentRecordId: $parentRecordId){
|
62
|
-
limit
|
63
|
-
offset
|
64
|
-
total
|
65
|
-
hasMore
|
66
|
-
records{
|
67
|
-
id
|
68
|
-
label
|
69
|
-
fields {
|
70
|
-
name
|
71
|
-
value
|
72
|
-
}
|
73
|
-
}
|
74
|
-
}
|
75
|
-
}
|
76
|
-
}`);
|
77
795
|
this.templateByQuery.set("saveData", dist.gql `mutation($changes: [InputBatchChange!]!) {
|
78
796
|
$queryAlias$: batchOperationDataUnit(changes: $changes){
|
79
797
|
oldId
|
@@ -102,11 +820,25 @@ class DataUnitFetcher {
|
|
102
820
|
$queryAlias$: selectDistinct(dataUnit: $dataUnit, fieldName: $fieldName, argument: $argument, filters: $filters, parentRecordId: $parentRecordId)
|
103
821
|
}`);
|
104
822
|
}
|
823
|
+
static parseDataUnitName(name) {
|
824
|
+
if (name == undefined) {
|
825
|
+
return undefined;
|
826
|
+
}
|
827
|
+
const parts = DATA_UNIT_NAME_PARSER.exec(name);
|
828
|
+
if (!parts) {
|
829
|
+
return undefined;
|
830
|
+
}
|
831
|
+
return { entityName: parts[1], resourceID: parts[2] };
|
832
|
+
}
|
105
833
|
getDataUnit(entityName, resourceID, parentDataUnit, configName) {
|
834
|
+
if (PreloadManager.applicationResourceID == undefined) {
|
835
|
+
//Por falta de um lugar melhor pra iniciar essa variável, fazemos isso aqui.
|
836
|
+
ResourceIDUtils.getResourceID().then(resourceID => PreloadManager.applicationResourceID = resourceID);
|
837
|
+
}
|
106
838
|
const duName = `dd://${entityName}/${resourceID}${configName ? "/" + configName : ""}`;
|
107
839
|
const dataUnit = parentDataUnit != undefined ? parentDataUnit.getChildDataunit(duName) : new DataUnit(duName);
|
108
840
|
dataUnit.metadataLoader = (dataUnit) => this.loadMetadata(dataUnit);
|
109
|
-
dataUnit.dataLoader = (dataUnit, request) =>
|
841
|
+
dataUnit.dataLoader = (dataUnit, request) => DataUnitDataLoader.loadData(dataUnit, request);
|
110
842
|
dataUnit.saveLoader = (_dataUnit, changes) => this.saveData(dataUnit, changes);
|
111
843
|
dataUnit.removeLoader = (dataUnit, recordIds) => this.removeRecords(dataUnit, recordIds);
|
112
844
|
dataUnit.recordLoader = (dataUnit, recordIds) => this.loadRecord(dataUnit, recordIds);
|
@@ -146,24 +878,6 @@ class DataUnitFetcher {
|
|
146
878
|
});
|
147
879
|
});
|
148
880
|
}
|
149
|
-
async loadData(dataUnit, request) {
|
150
|
-
try {
|
151
|
-
const duName = dataUnit.name;
|
152
|
-
if (this._loadDataTimeout[duName]) {
|
153
|
-
clearTimeout(this._loadDataTimeout[duName]);
|
154
|
-
delete this._loadDataTimeout[duName];
|
155
|
-
}
|
156
|
-
const result = await this.doLoadData(dataUnit, request);
|
157
|
-
delete this._loadDataTimeout[duName];
|
158
|
-
await new Promise(resolve => {
|
159
|
-
this._loadDataTimeout[duName] = setTimeout(resolve, 200);
|
160
|
-
});
|
161
|
-
return Promise.resolve(result);
|
162
|
-
}
|
163
|
-
catch (error) {
|
164
|
-
return Promise.reject(error);
|
165
|
-
}
|
166
|
-
}
|
167
881
|
loadSelectDistinct(dataUnit, fieldName, argument) {
|
168
882
|
const { parentRecordId, filters } = dataUnit.getLastLoadRequest() || {};
|
169
883
|
const filteredFilters = filters.filter(f => f.name !== `${DISTINCT_FILTER_NAME_PREFIX}${fieldName}`);
|
@@ -188,67 +902,9 @@ class DataUnitFetcher {
|
|
188
902
|
});
|
189
903
|
});
|
190
904
|
}
|
191
|
-
doLoadData(dataUnit, request) {
|
192
|
-
return new Promise((resolve, reject) => {
|
193
|
-
var _a;
|
194
|
-
const { sort, filters, limit, offset, quickFilter } = request;
|
195
|
-
const variables = { dataunit: dataUnit.name, sort, filters };
|
196
|
-
variables.limit = limit;
|
197
|
-
variables.offset = offset;
|
198
|
-
variables.parentRecordId = request.parentRecordId;
|
199
|
-
if (!StringUtils.isEmpty(quickFilter === null || quickFilter === void 0 ? void 0 : quickFilter.term)) {
|
200
|
-
if (variables.filter === undefined) {
|
201
|
-
variables.filter = [];
|
202
|
-
}
|
203
|
-
const quickFilterCriteria = {
|
204
|
-
name: "__QUICK_FILTER__",
|
205
|
-
expression: "__QUICK_FILTER__",
|
206
|
-
params: [{ name: "term", dataType: DataType.TEXT, value: quickFilter.term }]
|
207
|
-
};
|
208
|
-
if (((_a = quickFilter === null || quickFilter === void 0 ? void 0 : quickFilter.fields) === null || _a === void 0 ? void 0 : _a.length) > 0) {
|
209
|
-
quickFilterCriteria.params.push({ name: "fields", dataType: DataType.OBJECT, value: quickFilter.fields });
|
210
|
-
}
|
211
|
-
variables.filter.push(quickFilterCriteria);
|
212
|
-
}
|
213
|
-
DataFetcher.get()
|
214
|
-
.callGraphQL({
|
215
|
-
values: variables,
|
216
|
-
query: this.templateByQuery.get("fetchData"),
|
217
|
-
})
|
218
|
-
.then((resp) => {
|
219
|
-
const { limit, offset, total, hasMore, records } = resp.data;
|
220
|
-
let paginationInfo;
|
221
|
-
if (limit) {
|
222
|
-
const firstRecord = total == 0 ? 0 : offset + 1;
|
223
|
-
const lastRecord = offset + Math.min(records.length, limit);
|
224
|
-
const currentPage = offset / limit;
|
225
|
-
paginationInfo = {
|
226
|
-
firstRecord,
|
227
|
-
lastRecord,
|
228
|
-
total,
|
229
|
-
currentPage,
|
230
|
-
hasMore
|
231
|
-
};
|
232
|
-
}
|
233
|
-
const processedRecords = [];
|
234
|
-
records.forEach((responseRecord) => {
|
235
|
-
const duRecord = { __record__id__: responseRecord.id, __record__label__: responseRecord.label };
|
236
|
-
responseRecord.fields.forEach(({ name, value }) => {
|
237
|
-
duRecord[name] = dataUnit.valueFromString(name, value);
|
238
|
-
});
|
239
|
-
processedRecords.push(duRecord);
|
240
|
-
});
|
241
|
-
resolve({
|
242
|
-
paginationInfo,
|
243
|
-
records: processedRecords
|
244
|
-
});
|
245
|
-
})
|
246
|
-
.catch((error) => {
|
247
|
-
reject(error);
|
248
|
-
});
|
249
|
-
});
|
250
|
-
}
|
251
905
|
saveData(dataUnit, duChanges) {
|
906
|
+
const updatedRecordsIds = [];
|
907
|
+
const addedRecordsIds = [];
|
252
908
|
const changes = duChanges.map((change) => {
|
253
909
|
const { dataUnit: changeDU, record, updatingFields, operation } = change;
|
254
910
|
const dataUnitInstance = DataUnitStorage.get(changeDU);
|
@@ -260,6 +916,14 @@ class DataUnitFetcher {
|
|
260
916
|
return { fieldName, dataType, value: dataUnitInstance.valueToString(fieldName, value) };
|
261
917
|
});
|
262
918
|
}
|
919
|
+
if (changeDU === dataUnit.name) {
|
920
|
+
if (operation === ChangeOperation.INSERT || operation === ChangeOperation.COPY) {
|
921
|
+
addedRecordsIds.push(record.__record__id__);
|
922
|
+
}
|
923
|
+
else {
|
924
|
+
updatedRecordsIds.push(record.__record__id__);
|
925
|
+
}
|
926
|
+
}
|
263
927
|
const reqChange = { dataUnit: changeDU, fields: parsedUpdatingFields, operation, recordId: record.__record__id__ };
|
264
928
|
if (change.sourceId) {
|
265
929
|
reqChange.sourceId = change.sourceId;
|
@@ -297,6 +961,7 @@ class DataUnitFetcher {
|
|
297
961
|
});
|
298
962
|
dataUnitRecords.push(duRecord);
|
299
963
|
});
|
964
|
+
this.updateCache(dataUnit, dataUnitRecords, updatedRecordsIds, addedRecordsIds);
|
300
965
|
resolve(dataUnitRecords);
|
301
966
|
})
|
302
967
|
.catch((error) => {
|
@@ -304,6 +969,20 @@ class DataUnitFetcher {
|
|
304
969
|
});
|
305
970
|
});
|
306
971
|
}
|
972
|
+
updateCache(dataUnit, savedRecords, toUpdate, toInsert) {
|
973
|
+
const recordsById = new Map(savedRecords.map(record => [record.__old__id__ || record.__record__id__, record]));
|
974
|
+
const addedRecords = toInsert.map(recordId => {
|
975
|
+
const copy = Object.assign({}, recordsById.get(recordId));
|
976
|
+
delete copy.__old__id__;
|
977
|
+
return copy;
|
978
|
+
});
|
979
|
+
if (addedRecords.length > 0) {
|
980
|
+
const firstRecord = dataUnit.records[0];
|
981
|
+
PreloadManager.insertRecords(dataUnit, firstRecord, addedRecords);
|
982
|
+
}
|
983
|
+
const updatedRecords = toUpdate.map(recordId => (Object.assign({}, recordsById.get(recordId))));
|
984
|
+
PreloadManager.updateRecords(dataUnit, updatedRecords);
|
985
|
+
}
|
307
986
|
getTransientInfo(dataUnit, recordID) {
|
308
987
|
const { records } = dataUnit.getSelectionInfo();
|
309
988
|
return Object.entries(records.filter(record => record.__record__id__ == recordID)[0]).filter(([key]) => key.startsWith(DataUnitTransient.DATA_UNIT_TRANSIENT_PREFIX_NAME)).map(([name, value]) => ({ fieldName: name, value, dataType: DataType.TEXT }));
|
@@ -319,6 +998,7 @@ class DataUnitFetcher {
|
|
319
998
|
query: this.templateByQuery.get("saveData"),
|
320
999
|
})
|
321
1000
|
.then((_resp) => {
|
1001
|
+
PreloadManager.removeRecords(dataUnit, dataUnit.records.filter(record => recordIds.includes(record.__record__id__)));
|
322
1002
|
resolve(recordIds);
|
323
1003
|
})
|
324
1004
|
.catch((error) => {
|
@@ -342,6 +1022,7 @@ class DataUnitFetcher {
|
|
342
1022
|
});
|
343
1023
|
dataUnitRecords.push(duRecord);
|
344
1024
|
});
|
1025
|
+
//TODO: Chamar o worker para persistir a nova versão do registro
|
345
1026
|
resolve(dataUnitRecords);
|
346
1027
|
})
|
347
1028
|
.catch((error) => {
|
@@ -351,4 +1032,4 @@ class DataUnitFetcher {
|
|
351
1032
|
}
|
352
1033
|
}
|
353
1034
|
|
354
|
-
export { DataUnitFetcher as D };
|
1035
|
+
export { DataUnitFetcher as D, InMemoryLoader as I, PesquisaFetcher as P, PreloadManager as a };
|