@sankhyalabs/sankhyablocks 8.7.0 → 8.8.0-dev.2
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-1097ff27.js → ConfigStorage-a97ca159.js} +2 -2
- package/dist/cjs/{DataFetcher-a00bc007.js → DataFetcher-2a99283c.js} +19 -10
- package/dist/cjs/{SnkFormConfigManager-a4b4d852.js → SnkFormConfigManager-f641f502.js} +2 -2
- package/dist/cjs/{SnkMultiSelectionListDataSource-804ff4c7.js → SnkMultiSelectionListDataSource-4e3de426.js} +11 -0
- package/dist/cjs/{auth-fetcher-92f3040b.js → auth-fetcher-78231356.js} +1 -1
- package/dist/cjs/dataunit-fetcher-a4e8352b.js +906 -0
- package/dist/cjs/{form-config-fetcher-60fbeb94.js → form-config-fetcher-a322a522.js} +1 -1
- package/dist/cjs/{pesquisa-fetcher-b2ed9767.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-eab0ec84.js → snk-guides-viewer-c540f4c5.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 +19 -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 +77 -0
- package/dist/collection/lib/http/data-fetcher/fetchers/data-unit/cache/PreloadManager.js +179 -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 +19 -10
- package/dist/components/SnkMultiSelectionListDataSource.js +11 -0
- package/dist/components/dataunit-fetcher.js +809 -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-4d30a649.js → ConfigStorage-26f89143.js} +2 -2
- package/dist/esm/{DataFetcher-487d6aad.js → DataFetcher-90e91631.js} +19 -10
- package/dist/esm/{SnkFormConfigManager-da594f63.js → SnkFormConfigManager-18948123.js} +2 -2
- package/dist/esm/{SnkMultiSelectionListDataSource-892f37f9.js → SnkMultiSelectionListDataSource-36887f31.js} +11 -0
- package/dist/esm/{auth-fetcher-5c3ae75b.js → auth-fetcher-a8c8ee7e.js} +1 -1
- package/dist/esm/dataunit-fetcher-c22b889c.js +902 -0
- package/dist/esm/{form-config-fetcher-cd3fa459.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-cff5e95d.js → snk-guides-viewer-e87b77d5.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-182246c9.entry.js +1 -0
- package/dist/sankhyablocks/{p-ee57d9f5.js → p-240f5892.js} +1 -1
- package/dist/sankhyablocks/p-42de2707.entry.js +1 -0
- package/dist/sankhyablocks/p-5356efdd.entry.js +1 -0
- package/dist/sankhyablocks/{p-c9fa27ce.entry.js → p-57550ddc.entry.js} +1 -1
- package/dist/sankhyablocks/{p-e2160bdd.js → p-5d51bff4.js} +1 -1
- package/dist/sankhyablocks/{p-ebd9f2b1.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-5e5816ed.entry.js → p-8652f90b.entry.js} +1 -1
- package/dist/sankhyablocks/{p-358e8f7b.js → p-910af03c.js} +1 -1
- package/dist/sankhyablocks/p-992a9d0f.js +1 -0
- package/dist/sankhyablocks/p-9e705c91.entry.js +1 -0
- package/dist/sankhyablocks/p-a046a2e1.js +1 -0
- package/dist/sankhyablocks/p-a221bc67.js +1 -0
- package/dist/sankhyablocks/{p-54f01129.entry.js → p-b3cd0dd1.entry.js} +3 -3
- package/dist/sankhyablocks/p-b7798801.entry.js +1 -0
- package/dist/sankhyablocks/p-bcc2b79d.js +59 -0
- package/dist/sankhyablocks/p-d07651cc.entry.js +1 -0
- package/dist/sankhyablocks/{p-33745612.js → p-d47bbee3.js} +1 -1
- package/dist/sankhyablocks/{p-86d00468.entry.js → p-d563e451.entry.js} +1 -1
- package/dist/sankhyablocks/{p-6cd36947.entry.js → p-e74e2153.entry.js} +1 -1
- package/dist/sankhyablocks/p-eab2c97d.entry.js +1 -0
- package/dist/sankhyablocks/{p-d109914d.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 +1 -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-32bb845f.js +0 -356
- package/dist/esm/dataunit-fetcher-d3033a06.js +0 -354
- package/dist/esm/pesquisa-fetcher-615da3ca.js +0 -165
- package/dist/sankhyablocks/p-0abc880c.entry.js +0 -1
- package/dist/sankhyablocks/p-1284f14a.entry.js +0 -1
- package/dist/sankhyablocks/p-162161ae.entry.js +0 -1
- package/dist/sankhyablocks/p-329f7520.entry.js +0 -1
- package/dist/sankhyablocks/p-401da0a5.entry.js +0 -1
- package/dist/sankhyablocks/p-5d62a74e.js +0 -1
- package/dist/sankhyablocks/p-5e63571e.entry.js +0 -1
- package/dist/sankhyablocks/p-6b2ee5b5.entry.js +0 -1
- package/dist/sankhyablocks/p-719c246f.js +0 -1
- package/dist/sankhyablocks/p-89b3df4c.js +0 -1
- package/dist/sankhyablocks/p-90946802.js +0 -76
- package/dist/sankhyablocks/p-b417c608.entry.js +0 -1
- package/dist/sankhyablocks/p-fa9d3f73.js +0 -1
@@ -0,0 +1,77 @@
|
|
1
|
+
export class ArrayRepository {
|
2
|
+
constructor(equalsFunction) {
|
3
|
+
this._list = [];
|
4
|
+
this._equalsFunction = equalsFunction;
|
5
|
+
}
|
6
|
+
async load(filterFunction, sortingFunction, offset, limit) {
|
7
|
+
let result = [].concat(this._list);
|
8
|
+
if (filterFunction != undefined) {
|
9
|
+
result = this._list.filter(item => filterFunction(item));
|
10
|
+
}
|
11
|
+
if (sortingFunction != undefined) {
|
12
|
+
result = result.sort(sortingFunction);
|
13
|
+
}
|
14
|
+
const count = result.length;
|
15
|
+
if (limit != undefined) {
|
16
|
+
const start = offset || 0;
|
17
|
+
const end = limit ? start + limit : result.length;
|
18
|
+
result = result.slice(start, end);
|
19
|
+
}
|
20
|
+
return Promise.resolve({ result, count });
|
21
|
+
}
|
22
|
+
async distict(itemProcessor) {
|
23
|
+
const processedItems = [];
|
24
|
+
let hasEmpty = false;
|
25
|
+
for (const item of this._list) {
|
26
|
+
const processedItem = itemProcessor(item);
|
27
|
+
if (processedItem == undefined) {
|
28
|
+
hasEmpty = true;
|
29
|
+
continue;
|
30
|
+
}
|
31
|
+
processedItems.push(processedItem);
|
32
|
+
}
|
33
|
+
if (hasEmpty) {
|
34
|
+
processedItems.push({ key: "", value: null });
|
35
|
+
}
|
36
|
+
return Promise.resolve(new Map(processedItems.map(item => [item.key, item.value])));
|
37
|
+
}
|
38
|
+
async push(items) {
|
39
|
+
this._list.push(...items);
|
40
|
+
}
|
41
|
+
async clear() {
|
42
|
+
this._list = [];
|
43
|
+
}
|
44
|
+
async delete(items) {
|
45
|
+
this._list = this._list.filter(item => {
|
46
|
+
for (const removed of items) {
|
47
|
+
if (this._equalsFunction(item, removed)) {
|
48
|
+
return false;
|
49
|
+
}
|
50
|
+
}
|
51
|
+
return true;
|
52
|
+
});
|
53
|
+
}
|
54
|
+
async update(items) {
|
55
|
+
this._list = this._list.map(existingItem => {
|
56
|
+
const newItem = items.find(newItem => this._equalsFunction(existingItem, newItem));
|
57
|
+
return newItem == undefined ? existingItem : newItem;
|
58
|
+
});
|
59
|
+
}
|
60
|
+
async insert(itemReference, items) {
|
61
|
+
const itemPosition = this._list.indexOf(itemReference);
|
62
|
+
if (itemPosition == -1) {
|
63
|
+
this._list.push(...items);
|
64
|
+
return;
|
65
|
+
}
|
66
|
+
this._list = this._list.slice(0, itemPosition).concat(items).concat(this._list.slice(itemPosition));
|
67
|
+
}
|
68
|
+
isOperating() {
|
69
|
+
return true;
|
70
|
+
}
|
71
|
+
async isEmpty() {
|
72
|
+
return Promise.resolve(this._list.length === 0);
|
73
|
+
}
|
74
|
+
async count() {
|
75
|
+
return Promise.resolve(this._list.length);
|
76
|
+
}
|
77
|
+
}
|
@@ -0,0 +1,179 @@
|
|
1
|
+
import { DataUnit, FieldComparator, SortMode } from "@sankhyalabs/core";
|
2
|
+
import DataUnitFetcher from "../dataunit-fetcher";
|
3
|
+
import { ArrayRepository } from "./ArrayRepository";
|
4
|
+
const COLUMN_FILTER_PATTERN = /FILTRO_COLUNA_(.+)/;
|
5
|
+
export default class PreloadManager {
|
6
|
+
static setLoadingStatus(dataUnit, loadingInProgress) {
|
7
|
+
this._loadingStatus.set(dataUnit.name, loadingInProgress);
|
8
|
+
}
|
9
|
+
static isCacheEnabled(dataUnit) {
|
10
|
+
const dataUnitResourceId = PreloadManager.getResourceId(dataUnit.name);
|
11
|
+
if (dataUnitResourceId !== this.applicationResourceID) {
|
12
|
+
return false;
|
13
|
+
}
|
14
|
+
return this.getRepository(dataUnit).isOperating();
|
15
|
+
}
|
16
|
+
static getResourceId(dataUnitName) {
|
17
|
+
const dataUnitNameInfo = DataUnitFetcher.parseDataUnitName(dataUnitName);
|
18
|
+
return dataUnitNameInfo == undefined ? undefined : dataUnitNameInfo.resourceID;
|
19
|
+
}
|
20
|
+
static cacheRecords(dataUnit, records, resetDatabase, loadingInProgress) {
|
21
|
+
PreloadManager.setLoadingStatus(dataUnit, loadingInProgress);
|
22
|
+
if (PreloadManager.isCacheEnabled(dataUnit)) {
|
23
|
+
this.getRepository(dataUnit).push(records);
|
24
|
+
}
|
25
|
+
else {
|
26
|
+
if (resetDatabase) {
|
27
|
+
this._repositories.delete(dataUnit.name);
|
28
|
+
}
|
29
|
+
}
|
30
|
+
}
|
31
|
+
static getSortingFunction(dataUnit, sorting) {
|
32
|
+
if (sorting == undefined || sorting.length == 0) {
|
33
|
+
return undefined;
|
34
|
+
}
|
35
|
+
return (recordA, recordB) => {
|
36
|
+
for (const sort of sorting) {
|
37
|
+
const result = FieldComparator.compare(dataUnit.getField(sort.field), recordA, recordB, sort.mode === SortMode.ASC);
|
38
|
+
if (result != 0) {
|
39
|
+
return result;
|
40
|
+
}
|
41
|
+
}
|
42
|
+
};
|
43
|
+
}
|
44
|
+
static async getDistinct(dataUnit, fieldName) {
|
45
|
+
if (!PreloadManager.isCacheEnabled(dataUnit)) {
|
46
|
+
return Promise.resolve(undefined);
|
47
|
+
}
|
48
|
+
return new Promise((accept, reject) => {
|
49
|
+
PreloadManager.getRepository(dataUnit).distict(record => {
|
50
|
+
const fieldValue = record[fieldName];
|
51
|
+
if (fieldValue == undefined) {
|
52
|
+
return undefined;
|
53
|
+
}
|
54
|
+
const value = fieldValue.value != undefined ? fieldValue.value : fieldValue;
|
55
|
+
return { key: dataUnit.getFormattedValue(fieldName, fieldValue), value };
|
56
|
+
})
|
57
|
+
.then(result => {
|
58
|
+
if (result != undefined && result.size > 0) {
|
59
|
+
const field = dataUnit.getField(fieldName);
|
60
|
+
const sortedMap = new Map(Array.from(result.entries())
|
61
|
+
.sort((itemA, itemB) => FieldComparator.compareValues(field, itemA[1], itemB[1]))
|
62
|
+
.map(([key, value]) => key === "" ? ["(Vazio)", value] : [key, value]));
|
63
|
+
accept(sortedMap);
|
64
|
+
return;
|
65
|
+
}
|
66
|
+
accept(result);
|
67
|
+
})
|
68
|
+
.catch(reason => reject(reason));
|
69
|
+
});
|
70
|
+
}
|
71
|
+
static async loadData(dataUnit, request, loadFromServer) {
|
72
|
+
try {
|
73
|
+
if (PreloadManager.isCacheEnabled(dataUnit)) {
|
74
|
+
let useCache = request.source === "EZ_GRID_LOADING_SOURCE" || request.source === DataUnit.CHANGING_PAGE_LOADING_SOURCE;
|
75
|
+
if (useCache) {
|
76
|
+
const isCacheEmpty = await PreloadManager.getRepository(dataUnit).isEmpty();
|
77
|
+
if (!isCacheEmpty) {
|
78
|
+
return PreloadManager.loadFromCache(dataUnit, request);
|
79
|
+
}
|
80
|
+
}
|
81
|
+
//Como não vamos aproveitar o cache, ele precisa ser limpado.
|
82
|
+
PreloadManager.getRepository(dataUnit).clear().catch(() => { });
|
83
|
+
}
|
84
|
+
return loadFromServer(dataUnit, request);
|
85
|
+
}
|
86
|
+
catch (error) {
|
87
|
+
console.error(error);
|
88
|
+
return Promise.reject(error);
|
89
|
+
}
|
90
|
+
}
|
91
|
+
static insertRecords(dataUnit, reference, records) {
|
92
|
+
if (PreloadManager.isCacheEnabled(dataUnit)) {
|
93
|
+
PreloadManager.getRepository(dataUnit).insert(reference, records);
|
94
|
+
}
|
95
|
+
}
|
96
|
+
static updateRecords(dataUnit, records) {
|
97
|
+
if (PreloadManager.isCacheEnabled(dataUnit)) {
|
98
|
+
PreloadManager.getRepository(dataUnit).update(records);
|
99
|
+
}
|
100
|
+
}
|
101
|
+
static removeRecords(dataUnit, records) {
|
102
|
+
if (PreloadManager.isCacheEnabled(dataUnit)) {
|
103
|
+
PreloadManager.getRepository(dataUnit).delete(records);
|
104
|
+
}
|
105
|
+
}
|
106
|
+
static async countRecords(dataUnit) {
|
107
|
+
if (PreloadManager.isCacheEnabled(dataUnit)) {
|
108
|
+
return PreloadManager.getRepository(dataUnit).count();
|
109
|
+
}
|
110
|
+
return Promise.resolve(0);
|
111
|
+
}
|
112
|
+
static getRepository(dataUnit) {
|
113
|
+
const name = dataUnit.name;
|
114
|
+
if (!PreloadManager._repositories.has(name)) {
|
115
|
+
PreloadManager._repositories.set(name, new ArrayRepository((recordA, recordB) => recordA.__record__id__ === recordB.__record__id__));
|
116
|
+
}
|
117
|
+
return PreloadManager._repositories.get(name);
|
118
|
+
}
|
119
|
+
static getFilterFunction(dataUnit, filters) {
|
120
|
+
if (filters != undefined && filters.length > 0) {
|
121
|
+
return record => {
|
122
|
+
for (const filter of filters) {
|
123
|
+
if (!PreloadManager.recordMatchesFilter(dataUnit, record, filter)) {
|
124
|
+
return false;
|
125
|
+
}
|
126
|
+
}
|
127
|
+
return true;
|
128
|
+
};
|
129
|
+
}
|
130
|
+
return undefined;
|
131
|
+
}
|
132
|
+
static recordMatchesFilter(dataUnit, record, columnFilter) {
|
133
|
+
const fieldValue = record[columnFilter.columnName];
|
134
|
+
for (let param of columnFilter.params) {
|
135
|
+
const paramValue = dataUnit.valueFromString(columnFilter.columnName, param.value);
|
136
|
+
if (FieldComparator.compareValues(dataUnit.getField(columnFilter.columnName), fieldValue, paramValue) === 0) {
|
137
|
+
return true;
|
138
|
+
}
|
139
|
+
}
|
140
|
+
return false;
|
141
|
+
}
|
142
|
+
static async loadFromCache(dataUnit, request) {
|
143
|
+
return new Promise((accept, reject) => {
|
144
|
+
const columnFilters = PreloadManager.getColumnFilters(request.filters);
|
145
|
+
const { limit, offset, sort } = request;
|
146
|
+
PreloadManager.getRepository(dataUnit)
|
147
|
+
.load(PreloadManager.getFilterFunction(dataUnit, Array.from(columnFilters.values())), PreloadManager.getSortingFunction(dataUnit, sort), offset, limit)
|
148
|
+
.then(loadResult => {
|
149
|
+
const stillLoading = PreloadManager._loadingStatus.get(dataUnit.name);
|
150
|
+
const { count, result: records } = loadResult;
|
151
|
+
const firstRecord = count == 0 ? 1 : offset + 1;
|
152
|
+
const lastRecord = offset + Math.min(records.length, limit);
|
153
|
+
const currentPage = offset / limit;
|
154
|
+
const paginationInfo = {
|
155
|
+
count, currentPage, firstRecord, lastRecord,
|
156
|
+
hasMore: stillLoading || (lastRecord < count),
|
157
|
+
total: stillLoading ? undefined : count
|
158
|
+
};
|
159
|
+
accept({ records, paginationInfo });
|
160
|
+
})
|
161
|
+
.catch(reason => reject(reason));
|
162
|
+
});
|
163
|
+
}
|
164
|
+
static getColumnFilters(filters) {
|
165
|
+
const columnFilters = new Map();
|
166
|
+
if (filters == undefined || filters.length == 0) {
|
167
|
+
return columnFilters;
|
168
|
+
}
|
169
|
+
filters.forEach(filter => {
|
170
|
+
const match = COLUMN_FILTER_PATTERN.exec(filter.name);
|
171
|
+
if (match) {
|
172
|
+
columnFilters.set(filter.name, Object.assign({ columnName: match[1] }, filter));
|
173
|
+
}
|
174
|
+
});
|
175
|
+
return columnFilters;
|
176
|
+
}
|
177
|
+
}
|
178
|
+
PreloadManager._repositories = new Map();
|
179
|
+
PreloadManager._loadingStatus = new Map();
|
@@ -10,15 +10,18 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
10
10
|
}
|
11
11
|
return t;
|
12
12
|
};
|
13
|
-
import { ChangeOperation, DataType, DataUnit,
|
13
|
+
import { ChangeOperation, DataType, DataUnit, DataUnitStorage } from "@sankhyalabs/core";
|
14
14
|
import { gql } from "graphql-request";
|
15
|
-
import { DataFetcher } from "
|
15
|
+
import { DataFetcher } from "../../DataFetcher";
|
16
16
|
import { DISTINCT_FILTER_NAME_PREFIX } from "@sankhyalabs/ezui/dist/collection/utils/constants";
|
17
17
|
import { DataUnitTransient } from "@sankhyalabs/core/dist/dataunit/metadata/UnitMetadata";
|
18
|
+
import DataUnitDataLoader from "./DataUnitDataLoader";
|
19
|
+
import PreloadManager from "./cache/PreloadManager";
|
20
|
+
import ResourceIDUtils from "../../../../resourceid/ResourceIDUtils";
|
21
|
+
const DATA_UNIT_NAME_PARSER = /dd:\/\/([^/]+)\/([^/?]+)/;
|
18
22
|
export default class DataUnitFetcher {
|
19
23
|
constructor() {
|
20
24
|
this.templateByQuery = new Map();
|
21
|
-
this._loadDataTimeout = {};
|
22
25
|
this.buldTemplates();
|
23
26
|
}
|
24
27
|
buldTemplates() {
|
@@ -57,24 +60,6 @@ export default class DataUnitFetcher {
|
|
57
60
|
}
|
58
61
|
}
|
59
62
|
}`);
|
60
|
-
this.templateByQuery.set("fetchData", gql `query($dataunit: String! $limit: Int $offset:Int $filters: [InputFilter!] $sort: [InputSort!] $parentRecordId: String) {
|
61
|
-
$queryAlias$: fetchDataUnit(name: $dataunit){
|
62
|
-
data(limit: $limit offset: $offset filters: $filters sort: $sort parentRecordId: $parentRecordId){
|
63
|
-
limit
|
64
|
-
offset
|
65
|
-
total
|
66
|
-
hasMore
|
67
|
-
records{
|
68
|
-
id
|
69
|
-
label
|
70
|
-
fields {
|
71
|
-
name
|
72
|
-
value
|
73
|
-
}
|
74
|
-
}
|
75
|
-
}
|
76
|
-
}
|
77
|
-
}`);
|
78
63
|
this.templateByQuery.set("saveData", gql `mutation($changes: [InputBatchChange!]!) {
|
79
64
|
$queryAlias$: batchOperationDataUnit(changes: $changes){
|
80
65
|
oldId
|
@@ -103,11 +88,25 @@ export default class DataUnitFetcher {
|
|
103
88
|
$queryAlias$: selectDistinct(dataUnit: $dataUnit, fieldName: $fieldName, argument: $argument, filters: $filters, parentRecordId: $parentRecordId)
|
104
89
|
}`);
|
105
90
|
}
|
91
|
+
static parseDataUnitName(name) {
|
92
|
+
if (name == undefined) {
|
93
|
+
return undefined;
|
94
|
+
}
|
95
|
+
const parts = DATA_UNIT_NAME_PARSER.exec(name);
|
96
|
+
if (!parts) {
|
97
|
+
return undefined;
|
98
|
+
}
|
99
|
+
return { entityName: parts[1], resourceID: parts[2] };
|
100
|
+
}
|
106
101
|
getDataUnit(entityName, resourceID, parentDataUnit, configName) {
|
102
|
+
if (PreloadManager.applicationResourceID == undefined) {
|
103
|
+
//Por falta de um lugar melhor pra iniciar essa variável, fazemos isso aqui.
|
104
|
+
ResourceIDUtils.getResourceID().then(resourceID => PreloadManager.applicationResourceID = resourceID);
|
105
|
+
}
|
107
106
|
const duName = `dd://${entityName}/${resourceID}${configName ? "/" + configName : ""}`;
|
108
107
|
const dataUnit = parentDataUnit != undefined ? parentDataUnit.getChildDataunit(duName) : new DataUnit(duName);
|
109
108
|
dataUnit.metadataLoader = (dataUnit) => this.loadMetadata(dataUnit);
|
110
|
-
dataUnit.dataLoader = (dataUnit, request) =>
|
109
|
+
dataUnit.dataLoader = (dataUnit, request) => DataUnitDataLoader.loadData(dataUnit, request);
|
111
110
|
dataUnit.saveLoader = (_dataUnit, changes) => this.saveData(dataUnit, changes);
|
112
111
|
dataUnit.removeLoader = (dataUnit, recordIds) => this.removeRecords(dataUnit, recordIds);
|
113
112
|
dataUnit.recordLoader = (dataUnit, recordIds) => this.loadRecord(dataUnit, recordIds);
|
@@ -147,24 +146,6 @@ export default class DataUnitFetcher {
|
|
147
146
|
});
|
148
147
|
});
|
149
148
|
}
|
150
|
-
async loadData(dataUnit, request) {
|
151
|
-
try {
|
152
|
-
const duName = dataUnit.name;
|
153
|
-
if (this._loadDataTimeout[duName]) {
|
154
|
-
clearTimeout(this._loadDataTimeout[duName]);
|
155
|
-
delete this._loadDataTimeout[duName];
|
156
|
-
}
|
157
|
-
const result = await this.doLoadData(dataUnit, request);
|
158
|
-
delete this._loadDataTimeout[duName];
|
159
|
-
await new Promise(resolve => {
|
160
|
-
this._loadDataTimeout[duName] = setTimeout(resolve, 200);
|
161
|
-
});
|
162
|
-
return Promise.resolve(result);
|
163
|
-
}
|
164
|
-
catch (error) {
|
165
|
-
return Promise.reject(error);
|
166
|
-
}
|
167
|
-
}
|
168
149
|
loadSelectDistinct(dataUnit, fieldName, argument) {
|
169
150
|
const { parentRecordId, filters } = dataUnit.getLastLoadRequest() || {};
|
170
151
|
const filteredFilters = filters.filter(f => f.name !== `${DISTINCT_FILTER_NAME_PREFIX}${fieldName}`);
|
@@ -189,67 +170,9 @@ export default class DataUnitFetcher {
|
|
189
170
|
});
|
190
171
|
});
|
191
172
|
}
|
192
|
-
doLoadData(dataUnit, request) {
|
193
|
-
return new Promise((resolve, reject) => {
|
194
|
-
var _a;
|
195
|
-
const { sort, filters, limit, offset, quickFilter } = request;
|
196
|
-
const variables = { dataunit: dataUnit.name, sort, filters };
|
197
|
-
variables.limit = limit;
|
198
|
-
variables.offset = offset;
|
199
|
-
variables.parentRecordId = request.parentRecordId;
|
200
|
-
if (!StringUtils.isEmpty(quickFilter === null || quickFilter === void 0 ? void 0 : quickFilter.term)) {
|
201
|
-
if (variables.filter === undefined) {
|
202
|
-
variables.filter = [];
|
203
|
-
}
|
204
|
-
const quickFilterCriteria = {
|
205
|
-
name: "__QUICK_FILTER__",
|
206
|
-
expression: "__QUICK_FILTER__",
|
207
|
-
params: [{ name: "term", dataType: DataType.TEXT, value: quickFilter.term }]
|
208
|
-
};
|
209
|
-
if (((_a = quickFilter === null || quickFilter === void 0 ? void 0 : quickFilter.fields) === null || _a === void 0 ? void 0 : _a.length) > 0) {
|
210
|
-
quickFilterCriteria.params.push({ name: "fields", dataType: DataType.OBJECT, value: quickFilter.fields });
|
211
|
-
}
|
212
|
-
variables.filter.push(quickFilterCriteria);
|
213
|
-
}
|
214
|
-
DataFetcher.get()
|
215
|
-
.callGraphQL({
|
216
|
-
values: variables,
|
217
|
-
query: this.templateByQuery.get("fetchData"),
|
218
|
-
})
|
219
|
-
.then((resp) => {
|
220
|
-
const { limit, offset, total, hasMore, records } = resp.data;
|
221
|
-
let paginationInfo;
|
222
|
-
if (limit) {
|
223
|
-
const firstRecord = total == 0 ? 0 : offset + 1;
|
224
|
-
const lastRecord = offset + Math.min(records.length, limit);
|
225
|
-
const currentPage = offset / limit;
|
226
|
-
paginationInfo = {
|
227
|
-
firstRecord,
|
228
|
-
lastRecord,
|
229
|
-
total,
|
230
|
-
currentPage,
|
231
|
-
hasMore
|
232
|
-
};
|
233
|
-
}
|
234
|
-
const processedRecords = [];
|
235
|
-
records.forEach((responseRecord) => {
|
236
|
-
const duRecord = { __record__id__: responseRecord.id, __record__label__: responseRecord.label };
|
237
|
-
responseRecord.fields.forEach(({ name, value }) => {
|
238
|
-
duRecord[name] = dataUnit.valueFromString(name, value);
|
239
|
-
});
|
240
|
-
processedRecords.push(duRecord);
|
241
|
-
});
|
242
|
-
resolve({
|
243
|
-
paginationInfo,
|
244
|
-
records: processedRecords
|
245
|
-
});
|
246
|
-
})
|
247
|
-
.catch((error) => {
|
248
|
-
reject(error);
|
249
|
-
});
|
250
|
-
});
|
251
|
-
}
|
252
173
|
saveData(dataUnit, duChanges) {
|
174
|
+
const updatedRecordsIds = [];
|
175
|
+
const addedRecordsIds = [];
|
253
176
|
const changes = duChanges.map((change) => {
|
254
177
|
const { dataUnit: changeDU, record, updatingFields, operation } = change;
|
255
178
|
const dataUnitInstance = DataUnitStorage.get(changeDU);
|
@@ -261,6 +184,14 @@ export default class DataUnitFetcher {
|
|
261
184
|
return { fieldName, dataType, value: dataUnitInstance.valueToString(fieldName, value) };
|
262
185
|
});
|
263
186
|
}
|
187
|
+
if (changeDU === dataUnit.name) {
|
188
|
+
if (operation === ChangeOperation.INSERT || operation === ChangeOperation.COPY) {
|
189
|
+
addedRecordsIds.push(record.__record__id__);
|
190
|
+
}
|
191
|
+
else {
|
192
|
+
updatedRecordsIds.push(record.__record__id__);
|
193
|
+
}
|
194
|
+
}
|
264
195
|
const reqChange = { dataUnit: changeDU, fields: parsedUpdatingFields, operation, recordId: record.__record__id__ };
|
265
196
|
if (change.sourceId) {
|
266
197
|
reqChange.sourceId = change.sourceId;
|
@@ -298,6 +229,7 @@ export default class DataUnitFetcher {
|
|
298
229
|
});
|
299
230
|
dataUnitRecords.push(duRecord);
|
300
231
|
});
|
232
|
+
this.updateCache(dataUnit, dataUnitRecords, updatedRecordsIds, addedRecordsIds);
|
301
233
|
resolve(dataUnitRecords);
|
302
234
|
})
|
303
235
|
.catch((error) => {
|
@@ -305,6 +237,20 @@ export default class DataUnitFetcher {
|
|
305
237
|
});
|
306
238
|
});
|
307
239
|
}
|
240
|
+
updateCache(dataUnit, savedRecords, toUpdate, toInsert) {
|
241
|
+
const recordsById = new Map(savedRecords.map(record => [record.__old__id__ || record.__record__id__, record]));
|
242
|
+
const addedRecords = toInsert.map(recordId => {
|
243
|
+
const copy = Object.assign({}, recordsById.get(recordId));
|
244
|
+
delete copy.__old__id__;
|
245
|
+
return copy;
|
246
|
+
});
|
247
|
+
if (addedRecords.length > 0) {
|
248
|
+
const firstRecord = dataUnit.records[0];
|
249
|
+
PreloadManager.insertRecords(dataUnit, firstRecord, addedRecords);
|
250
|
+
}
|
251
|
+
const updatedRecords = toUpdate.map(recordId => (Object.assign({}, recordsById.get(recordId))));
|
252
|
+
PreloadManager.updateRecords(dataUnit, updatedRecords);
|
253
|
+
}
|
308
254
|
getTransientInfo(dataUnit, recordID) {
|
309
255
|
const { records } = dataUnit.getSelectionInfo();
|
310
256
|
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 }));
|
@@ -320,6 +266,7 @@ export default class DataUnitFetcher {
|
|
320
266
|
query: this.templateByQuery.get("saveData"),
|
321
267
|
})
|
322
268
|
.then((_resp) => {
|
269
|
+
PreloadManager.removeRecords(dataUnit, dataUnit.records.filter(record => recordIds.includes(record.__record__id__)));
|
323
270
|
resolve(recordIds);
|
324
271
|
})
|
325
272
|
.catch((error) => {
|
@@ -343,6 +290,7 @@ export default class DataUnitFetcher {
|
|
343
290
|
});
|
344
291
|
dataUnitRecords.push(duRecord);
|
345
292
|
});
|
293
|
+
//TODO: Chamar o worker para persistir a nova versão do registro
|
346
294
|
resolve(dataUnitRecords);
|
347
295
|
})
|
348
296
|
.catch((error) => {
|
package/dist/collection/lib/http/data-fetcher/fetchers/data-unit/interfaces/ILoadDataResult.js
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
export {};
|
package/dist/collection/lib/http/data-fetcher/fetchers/data-unit/interfaces/ILoadDataStrategy.js
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
export {};
|
@@ -0,0 +1 @@
|
|
1
|
+
export {};
|
@@ -0,0 +1 @@
|
|
1
|
+
export {};
|
package/dist/collection/lib/http/data-fetcher/fetchers/data-unit/interfaces/IResponseRecord.js
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
export {};
|
package/dist/collection/lib/http/data-fetcher/fetchers/data-unit/loadstrategy/DataUnitStrategy.js
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
import { DataType, StringUtils } from "@sankhyalabs/core";
|
2
|
+
import { DataFetcher } from "../../../DataFetcher";
|
3
|
+
import { gql } from "graphql-request";
|
4
|
+
const GQL_QUERY = gql `query($dataunit: String! $limit: Int $offset:Int $filters: [InputFilter!] $sort: [InputSort!] $parentRecordId: String) {
|
5
|
+
$queryAlias$: fetchDataUnit(name: $dataunit) {
|
6
|
+
data(limit: $limit offset: $offset filters: $filters sort: $sort parentRecordId: $parentRecordId) {
|
7
|
+
limit
|
8
|
+
offset
|
9
|
+
total
|
10
|
+
hasMore
|
11
|
+
records {
|
12
|
+
id
|
13
|
+
label
|
14
|
+
fields {
|
15
|
+
name
|
16
|
+
value
|
17
|
+
}
|
18
|
+
}
|
19
|
+
}
|
20
|
+
}
|
21
|
+
}`;
|
22
|
+
export class DataUnitStrategy {
|
23
|
+
canSlice() {
|
24
|
+
return true;
|
25
|
+
}
|
26
|
+
getVariables(dataunit, request) {
|
27
|
+
var _a;
|
28
|
+
let { sort, filters, limit, offset, quickFilter, parentRecordId } = request;
|
29
|
+
if (!StringUtils.isEmpty(quickFilter === null || quickFilter === void 0 ? void 0 : quickFilter.term)) {
|
30
|
+
const quickFilterCriteria = {
|
31
|
+
name: "__QUICK_FILTER__",
|
32
|
+
expression: "__QUICK_FILTER__",
|
33
|
+
params: [{ name: "term", dataType: DataType.TEXT, value: quickFilter.term }]
|
34
|
+
};
|
35
|
+
if (((_a = quickFilter.fields) === null || _a === void 0 ? void 0 : _a.length) > 0) {
|
36
|
+
quickFilterCriteria.params.push({ name: "fields", dataType: DataType.OBJECT, value: quickFilter.fields });
|
37
|
+
}
|
38
|
+
if (filters === undefined) {
|
39
|
+
filters = [];
|
40
|
+
}
|
41
|
+
filters.push(quickFilterCriteria);
|
42
|
+
}
|
43
|
+
return { dataunit, sort, filters, limit, offset, parentRecordId };
|
44
|
+
}
|
45
|
+
async load(dataUnit, request, loadingInfo) {
|
46
|
+
return new Promise((accept, reject) => {
|
47
|
+
DataFetcher.get().callGraphQL({
|
48
|
+
values: this.getVariables(dataUnit.name, request),
|
49
|
+
query: GQL_QUERY
|
50
|
+
}, false)
|
51
|
+
.then(resp => {
|
52
|
+
const { hasMore, records: responseRecords, total } = resp.data;
|
53
|
+
const records = responseRecords.map((record) => {
|
54
|
+
const duRecord = { __record__id__: record.id, __record__label__: record.label };
|
55
|
+
record.fields.forEach(({ name, value }) => {
|
56
|
+
duRecord[name] = dataUnit.valueFromString(name, value);
|
57
|
+
});
|
58
|
+
return duRecord;
|
59
|
+
});
|
60
|
+
accept({
|
61
|
+
records,
|
62
|
+
loadingInfo: Object.assign(Object.assign({}, loadingInfo), { loadingInProgress: hasMore, total, count: loadingInfo.count + records.length })
|
63
|
+
});
|
64
|
+
})
|
65
|
+
.catch(reason => reject(reason));
|
66
|
+
});
|
67
|
+
}
|
68
|
+
}
|