@sankhyalabs/sankhyablocks 8.8.0-rc.1 → 8.8.0-rc.11

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 (131) hide show
  1. package/dist/cjs/{ConfigStorage-a97ca159.js → ConfigStorage-c15716fd.js} +5 -2
  2. package/dist/cjs/{DataFetcher-2a99283c.js → DataFetcher-713f0749.js} +32 -32
  3. package/dist/cjs/PreloadManager-e26d237f.js +224 -0
  4. package/dist/cjs/{SnkFormConfigManager-f641f502.js → SnkFormConfigManager-29101e20.js} +2 -2
  5. package/dist/cjs/{SnkMultiSelectionListDataSource-56db34ee.js → SnkMultiSelectionListDataSource-d74d2336.js} +10 -6
  6. package/dist/cjs/{auth-fetcher-78231356.js → auth-fetcher-555ff856.js} +1 -1
  7. package/dist/cjs/{dataunit-fetcher-4f7d4ee7.js → dataunit-fetcher-66c0b7af.js} +48 -248
  8. package/dist/cjs/{form-config-fetcher-a322a522.js → form-config-fetcher-17775a75.js} +1 -1
  9. package/dist/cjs/loader.cjs.js +1 -1
  10. package/dist/cjs/{pesquisa-fetcher-7ef61508.js → pesquisa-fetcher-34922b83.js} +1 -1
  11. package/dist/cjs/sankhyablocks.cjs.js +1 -1
  12. package/dist/cjs/snk-actions-button.cjs.entry.js +93 -86
  13. package/dist/cjs/snk-application.cjs.entry.js +16 -6
  14. package/dist/cjs/snk-attach.cjs.entry.js +4 -2
  15. package/dist/cjs/snk-crud.cjs.entry.js +7 -5
  16. package/dist/cjs/snk-data-exporter.cjs.entry.js +1 -1
  17. package/dist/cjs/snk-detail-view.cjs.entry.js +24 -8
  18. package/dist/cjs/snk-filter-bar.cjs.entry.js +19 -4
  19. package/dist/cjs/snk-filter-modal-item.cjs.entry.js +3 -3
  20. package/dist/cjs/snk-form-config.cjs.entry.js +2 -2
  21. package/dist/cjs/snk-form.cjs.entry.js +4 -4
  22. package/dist/cjs/snk-grid-config.cjs.entry.js +3 -3
  23. package/dist/cjs/snk-grid.cjs.entry.js +8 -7
  24. package/dist/cjs/{snk-guides-viewer-aab80f66.js → snk-guides-viewer-b173ce35.js} +78 -5
  25. package/dist/cjs/snk-guides-viewer.cjs.entry.js +9 -7
  26. package/dist/cjs/snk-personalized-filter.cjs.entry.js +3 -3
  27. package/dist/cjs/snk-simple-crud.cjs.entry.js +8 -5
  28. package/dist/collection/components/snk-actions-button/actions/executor/java.executor.js +2 -2
  29. package/dist/collection/components/snk-actions-button/actions/executor/javascript.executor.js +2 -2
  30. package/dist/collection/components/snk-actions-button/actions/executor/procedure.executor.js +2 -2
  31. package/dist/collection/components/snk-actions-button/clientEvent/index.js +81 -76
  32. package/dist/collection/components/snk-application/snk-application.js +1 -0
  33. package/dist/collection/components/snk-crud/subcomponents/snk-detail-view/snk-detail-view.js +18 -1
  34. package/dist/collection/components/snk-crud/subcomponents/snk-guides-viewer.js +80 -8
  35. package/dist/collection/components/snk-filter-bar/filter-item/dataunitfilter/data-unit-filter-builder.js +17 -2
  36. package/dist/collection/components/snk-grid/filtercolumn/SnkMultiSelectionListDataSource.js +5 -5
  37. package/dist/collection/components/snk-grid/snk-grid.js +1 -0
  38. package/dist/collection/lib/http/data-fetcher/DataFetcher.js +33 -34
  39. package/dist/collection/lib/http/data-fetcher/fetchers/data-unit/DataUnitDataLoader.js +7 -2
  40. package/dist/collection/lib/http/data-fetcher/fetchers/data-unit/cache/ArrayRepository.js +25 -4
  41. package/dist/collection/lib/http/data-fetcher/fetchers/data-unit/cache/PreloadManager.js +25 -55
  42. package/dist/collection/lib/http/data-fetcher/fetchers/data-unit/dataunit-fetcher.js +1 -0
  43. package/dist/collection/lib/http/data-fetcher/fetchers/data-unit/loadstrategy/DatasetStrategy.js +29 -8
  44. package/dist/collection/lib/http/data-fetcher/fetchers/personalized-filter-fetcher.js +3 -0
  45. package/dist/collection/lib/workspace/workspace.js +7 -0
  46. package/dist/components/ConfigStorage.js +3 -0
  47. package/dist/components/DataFetcher.js +32 -32
  48. package/dist/components/SnkMultiSelectionListDataSource.js +5 -5
  49. package/dist/components/dataunit-fetcher.js +87 -68
  50. package/dist/components/snk-actions-button2.js +87 -82
  51. package/dist/components/snk-application2.js +8 -0
  52. package/dist/components/snk-detail-view2.js +88 -2
  53. package/dist/components/snk-filter-bar2.js +17 -2
  54. package/dist/components/snk-grid2.js +1 -0
  55. package/dist/esm/{ConfigStorage-26f89143.js → ConfigStorage-79c81f36.js} +5 -2
  56. package/dist/esm/{DataFetcher-90e91631.js → DataFetcher-79f78222.js} +32 -32
  57. package/dist/esm/PreloadManager-8826b96a.js +222 -0
  58. package/dist/esm/{SnkFormConfigManager-18948123.js → SnkFormConfigManager-7723f3ec.js} +2 -2
  59. package/dist/esm/{SnkMultiSelectionListDataSource-b9410c72.js → SnkMultiSelectionListDataSource-27572f47.js} +6 -6
  60. package/dist/esm/{auth-fetcher-a8c8ee7e.js → auth-fetcher-e260d0cd.js} +1 -1
  61. package/dist/esm/{dataunit-fetcher-1c2ccae2.js → dataunit-fetcher-831feb12.js} +41 -240
  62. package/dist/esm/{form-config-fetcher-7c3b6273.js → form-config-fetcher-e1603e66.js} +1 -1
  63. package/dist/esm/loader.js +1 -1
  64. package/dist/esm/{pesquisa-fetcher-90d6853b.js → pesquisa-fetcher-8e922c9d.js} +1 -1
  65. package/dist/esm/sankhyablocks.js +1 -1
  66. package/dist/esm/snk-actions-button.entry.js +93 -86
  67. package/dist/esm/snk-application.entry.js +16 -6
  68. package/dist/esm/snk-attach.entry.js +4 -2
  69. package/dist/esm/snk-crud.entry.js +7 -5
  70. package/dist/esm/snk-data-exporter.entry.js +1 -1
  71. package/dist/esm/snk-detail-view.entry.js +24 -8
  72. package/dist/esm/snk-filter-bar.entry.js +20 -5
  73. package/dist/esm/snk-filter-modal-item.entry.js +3 -3
  74. package/dist/esm/snk-form-config.entry.js +2 -2
  75. package/dist/esm/snk-form.entry.js +4 -4
  76. package/dist/esm/snk-grid-config.entry.js +3 -3
  77. package/dist/esm/snk-grid.entry.js +8 -7
  78. package/dist/esm/{snk-guides-viewer-62b0fa69.js → snk-guides-viewer-e62e0edc.js} +79 -6
  79. package/dist/esm/snk-guides-viewer.entry.js +9 -7
  80. package/dist/esm/snk-personalized-filter.entry.js +3 -3
  81. package/dist/esm/snk-simple-crud.entry.js +8 -5
  82. package/dist/sankhyablocks/{p-ebfa6460.entry.js → p-06e76ed2.entry.js} +1 -1
  83. package/dist/sankhyablocks/p-29176742.js +56 -0
  84. package/dist/sankhyablocks/p-2e6f1666.js +1 -0
  85. package/dist/sankhyablocks/{p-d563e451.entry.js → p-3bf4df20.entry.js} +1 -1
  86. package/dist/sankhyablocks/p-3c4f0354.js +1 -0
  87. package/dist/sankhyablocks/p-3ccb321d.entry.js +1 -0
  88. package/dist/sankhyablocks/{p-240f5892.js → p-41d156dd.js} +1 -1
  89. package/dist/sankhyablocks/{p-d47bbee3.js → p-4651b43f.js} +1 -1
  90. package/dist/sankhyablocks/{p-8652f90b.entry.js → p-47e4b6c9.entry.js} +1 -1
  91. package/dist/sankhyablocks/{p-68fbd480.entry.js → p-4f5b995d.entry.js} +1 -1
  92. package/dist/sankhyablocks/p-5f6113c8.js +60 -0
  93. package/dist/sankhyablocks/p-72b32e25.entry.js +11 -0
  94. package/dist/sankhyablocks/{p-57550ddc.entry.js → p-747043a5.entry.js} +1 -1
  95. package/dist/sankhyablocks/p-77756526.js +1 -0
  96. package/dist/sankhyablocks/{p-e74e2153.entry.js → p-80692cbd.entry.js} +1 -1
  97. package/dist/sankhyablocks/p-848b2e3b.entry.js +1 -0
  98. package/dist/sankhyablocks/p-862e5bf6.entry.js +1 -0
  99. package/dist/sankhyablocks/p-95b05e58.entry.js +1 -0
  100. package/dist/sankhyablocks/p-a1cce4f5.entry.js +1 -0
  101. package/dist/sankhyablocks/{p-5d51bff4.js → p-c9399ce6.js} +1 -1
  102. package/dist/sankhyablocks/p-d0b36421.js +1 -0
  103. package/dist/sankhyablocks/p-d32fe25e.js +1 -0
  104. package/dist/sankhyablocks/p-eb1561bf.entry.js +1 -0
  105. package/dist/sankhyablocks/p-f1743d68.entry.js +1 -0
  106. package/dist/sankhyablocks/p-f2e798f1.entry.js +1 -0
  107. package/dist/sankhyablocks/sankhyablocks.esm.js +1 -1
  108. package/dist/types/components/snk-actions-button/clientEvent/index.d.ts +1 -1
  109. package/dist/types/components/snk-crud/subcomponents/snk-detail-view/snk-detail-view.d.ts +3 -0
  110. package/dist/types/components/snk-crud/subcomponents/snk-guides-viewer.d.ts +22 -11
  111. package/dist/types/components/snk-grid/filtercolumn/SnkMultiSelectionListDataSource.d.ts +1 -0
  112. package/dist/types/lib/http/data-fetcher/DataFetcher.d.ts +5 -2
  113. package/dist/types/lib/http/data-fetcher/fetchers/data-unit/cache/PreloadManager.d.ts +3 -6
  114. package/dist/types/lib/http/data-fetcher/fetchers/data-unit/interfaces/ILoadingInfo.d.ts +2 -0
  115. package/dist/types/lib/workspace/workspace.d.ts +1 -0
  116. package/package.json +1 -1
  117. package/dist/sankhyablocks/p-193971ad.js +0 -1
  118. package/dist/sankhyablocks/p-19cbe6e2.entry.js +0 -11
  119. package/dist/sankhyablocks/p-2c7c1323.entry.js +0 -1
  120. package/dist/sankhyablocks/p-3253e7f2.entry.js +0 -1
  121. package/dist/sankhyablocks/p-5dd52ec5.entry.js +0 -1
  122. package/dist/sankhyablocks/p-6541f0df.js +0 -1
  123. package/dist/sankhyablocks/p-910af03c.js +0 -56
  124. package/dist/sankhyablocks/p-992a9d0f.js +0 -1
  125. package/dist/sankhyablocks/p-acb1374c.entry.js +0 -1
  126. package/dist/sankhyablocks/p-b36053da.entry.js +0 -1
  127. package/dist/sankhyablocks/p-b481e5ad.js +0 -1
  128. package/dist/sankhyablocks/p-d264da22.entry.js +0 -1
  129. package/dist/sankhyablocks/p-d56b65e3.entry.js +0 -1
  130. package/dist/sankhyablocks/p-e473ca13.entry.js +0 -1
  131. package/dist/sankhyablocks/p-e86d4a53.js +0 -59
@@ -95,6 +95,7 @@ export class SnkGrid {
95
95
  if (this._gridConfig && this._dataUnit) {
96
96
  this._dataUnit.defaultSorting = this._gridConfig
97
97
  .columns
98
+ .filter(col => col.ascending != undefined)
98
99
  .sort((colA, colB) => colA.orderIndex - colB.orderIndex)
99
100
  .map(({ name: field, ascending }) => {
100
101
  const { dataType } = this._dataUnit.getField(field);
@@ -6,10 +6,9 @@ var __asyncValues = (this && this.__asyncValues) || function (o) {
6
6
  function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
7
7
  function settle(resolve, reject, d, v) { Promise.resolve(v).then(function (v) { resolve({ value: v, done: d }); }, reject); }
8
8
  };
9
- import { ApplicationContext, ErrorException, ObjectUtils, WarningException } from '@sankhyalabs/core';
9
+ import { ApplicationContext, ErrorException, ObjectUtils, WarningException, StringUtils } from '@sankhyalabs/core';
10
10
  import { batchRequests } from 'graphql-request';
11
11
  import UrlUtils from "../../../lib/utils/urlutils";
12
- import { StringUtils } from '@sankhyalabs/core';
13
12
  import { ServiceBrokerRecaller } from './recaller/ServiceBrokerRecaller';
14
13
  import { GraphQLRecaller } from './recaller/GraphQLRecaller';
15
14
  import { PrintUtils } from '../../utils/PrintUtils';
@@ -109,16 +108,16 @@ export class DataFetcher {
109
108
  if (this.ready) {
110
109
  return new Promise(async (resolve, reject) => {
111
110
  let query = this.getQueryTemplate(req);
112
- const res = await this.fecthGrapql([{ document: query, variables: req.values }], quietMode);
111
+ const res = await this.fecthGraphQL([{ document: query, variables: req.values }], quietMode);
113
112
  if (res.errors.length > 0) {
114
- if (!this.proccesGraphQLClientEvents(res === null || res === void 0 ? void 0 : res.extensions, req, resolve, reject)) {
113
+ if (!(await this.proccesGraphQLClientEvents(res === null || res === void 0 ? void 0 : res.extensions, req, resolve, reject))) {
115
114
  const error = this.processGraphQlErrorInfo(res.errors);
116
115
  reject(error);
117
116
  }
118
117
  }
119
118
  else {
120
119
  resolve(res.data[0][reqKey]);
121
- this.proccesGraphQLClientEvents(res === null || res === void 0 ? void 0 : res.extensions, req, resolve, reject);
120
+ await this.proccesGraphQLClientEvents(res === null || res === void 0 ? void 0 : res.extensions, req, resolve, reject);
122
121
  }
123
122
  });
124
123
  }
@@ -132,7 +131,7 @@ export class DataFetcher {
132
131
  resolveURL() {
133
132
  return UrlUtils.getUrlBase();
134
133
  }
135
- proccesGraphQLClientEvents(extensions, originalRequest, resolve, reject) {
134
+ async proccesGraphQLClientEvents(extensions, originalRequest, resolve, reject) {
136
135
  if (extensions == undefined) {
137
136
  return false;
138
137
  }
@@ -147,8 +146,8 @@ export class DataFetcher {
147
146
  throw new WarningException("ClientEvent não registrado", `Ocorreu o client event ${id} porém não há client event registrado na aplicação.`);
148
147
  }
149
148
  const handlers = DataFetcher.clientEventsByID.get(id);
150
- handlers.forEach(handler => {
151
- handler({ id, content: JSON.parse(clientEvents[id]) }, new GraphQLRecaller(originalRequest, resolve, reject));
149
+ handlers.forEach(async (handler) => {
150
+ await handler({ id, content: JSON.parse(clientEvents[id]) }, new GraphQLRecaller(originalRequest, resolve, reject));
152
151
  });
153
152
  }
154
153
  return Object.keys(clientEvents).length > 0;
@@ -234,9 +233,9 @@ export class DataFetcher {
234
233
  const urlParams = UrlUtils.getQueryParams(location.search);
235
234
  return {
236
235
  baseUrl: `${this.resolveURL()}/${module}/service.sbr`,
237
- appName: "SankhyaBlocks",
236
+ appName: window['APPLICATION_NAME'] || "SankhyaBlocks",
238
237
  mgeSession: `${window['mgeSession'] || urlParams.get("mgeSession")}`,
239
- globalID: "85C0093DFA240EAB699B4E47A10215BD",
238
+ globalID: window['GLOBALID'] || StringUtils.generateUUID(),
240
239
  resourceID: (window["resourceID"] || ((_a = window["workspace"]) === null || _a === void 0 ? void 0 : _a.resourceID))
241
240
  };
242
241
  }
@@ -353,17 +352,13 @@ export class DataFetcher {
353
352
  async executePendingRequest(watingRequestsById) {
354
353
  const requestsBatch = [];
355
354
  let quietMode = true;
356
- watingRequestsById.forEach(async (waitingReq) => {
357
- let query = this.getQueryTemplate(waitingReq.request);
355
+ watingRequestsById.forEach((waitingReq) => {
356
+ const query = this.getQueryTemplate(waitingReq.request);
358
357
  requestsBatch.push({ document: query, variables: Object.assign({}, waitingReq.request.values) });
359
358
  quietMode = quietMode && waitingReq.quietMode;
360
359
  });
361
- let res = undefined;
362
- let dataResponse = [];
363
- let errorsResponse = [];
364
- res = await this.fecthGrapql(requestsBatch, quietMode);
365
- dataResponse = res.data;
366
- errorsResponse = res.errors;
360
+ const response = await this.fecthGraphQL(requestsBatch, quietMode);
361
+ const { data: dataResponse, errors: errorsResponse, extensions } = response;
367
362
  //Reject promises with errors from query
368
363
  errorsResponse.forEach((errorResponse) => {
369
364
  Object.entries(errorResponse).forEach(([_key, val]) => {
@@ -373,29 +368,33 @@ export class DataFetcher {
373
368
  });
374
369
  //Resolve promises with data from query
375
370
  dataResponse.forEach((data) => {
376
- Object.entries(data).forEach(([key, val]) => {
377
- var _a;
378
- (((_a = watingRequestsById.get(key)) === null || _a === void 0 ? void 0 : _a.resolve) || Promise.resolve)(val);
371
+ Object.entries(data).forEach(async ([key, val]) => {
372
+ const waitingRequest = watingRequestsById.get(key);
373
+ await this.proccesGraphQLClientEvents(extensions, waitingRequest.request, waitingRequest.resolve, waitingRequest.reject);
374
+ ((waitingRequest === null || waitingRequest === void 0 ? void 0 : waitingRequest.resolve) || Promise.resolve)(val);
379
375
  });
380
376
  });
381
377
  }
382
- async fecthGrapql(request, quietMode) {
383
- let res = undefined;
384
- let dataResponse = [];
385
- let errorsResponse = [];
386
- let url = `${this.resolveURL() + DataFetcher.getGraphQLPath()}`;
387
- const responseExtensions = [];
378
+ buildGraphQlURL(quietMode) {
388
379
  const mgeSession = window["mgeSession"];
389
- if (mgeSession != undefined) {
380
+ let url = `${this.resolveURL() + DataFetcher.getGraphQLPath()}`;
381
+ if (mgeSession) {
390
382
  url += `?mgeSession=${mgeSession}`;
391
383
  }
392
384
  if (quietMode) {
393
385
  url += `${url.indexOf("?") > -1 ? "&" : "?"}quietMode=true`;
394
386
  }
395
- DataFetcher.requestListener.forEach(listener => listener.onRequestStart({ url: url, requestBody: request }));
387
+ return url;
388
+ }
389
+ async fecthGraphQL(request, quietMode) {
390
+ const dataResponse = [];
391
+ const errorsResponse = [];
392
+ const responseExtensions = [];
393
+ const url = this.buildGraphQlURL(quietMode);
394
+ DataFetcher.requestListener.forEach(listener => listener.onRequestStart({ url, requestBody: request }));
396
395
  try {
397
- res = await batchRequests(url, request, { 'Content-Type': `application/json; charset=${window['SERVER_ENCODING'] || 'UTF-8'}` });
398
- res.forEach((resItem, index) => {
396
+ const response = await batchRequests(url, request, { 'Content-Type': `application/json; charset=${window['SERVER_ENCODING'] || 'UTF-8'}` });
397
+ response.forEach((resItem, index) => {
399
398
  var _a;
400
399
  if (((_a = resItem === null || resItem === void 0 ? void 0 : resItem.errors) === null || _a === void 0 ? void 0 : _a.length) > 0) {
401
400
  errorsResponse.push(resItem.errors.map((item) => this.normalizeErrorResponse(item, request, index)));
@@ -410,7 +409,7 @@ export class DataFetcher {
410
409
  }
411
410
  catch (err) {
412
411
  if (!this.isHttpError(err)) {
413
- res = err.response;
412
+ const res = err.response;
414
413
  const req = err.request;
415
414
  Object.entries(res).forEach(([key, val]) => {
416
415
  if (val.errors) {
@@ -426,11 +425,11 @@ export class DataFetcher {
426
425
  });
427
426
  }
428
427
  else {
429
- DataFetcher.requestListener.forEach(listener => listener.onRequestEnd({ url: url, requestBody: request }));
428
+ DataFetcher.requestListener.forEach(listener => listener.onRequestEnd({ url, requestBody: request }));
430
429
  throw new ErrorException("Falha de comunicação", err.message);
431
430
  }
432
431
  }
433
- DataFetcher.requestListener.forEach(listener => listener.onRequestEnd({ url: url, requestBody: request }));
432
+ DataFetcher.requestListener.forEach(listener => listener.onRequestEnd({ url, requestBody: request }));
434
433
  return { data: dataResponse, errors: errorsResponse, extensions: responseExtensions };
435
434
  }
436
435
  isHttpError(err) {
@@ -55,7 +55,7 @@ export default class DataUnitDataLoader {
55
55
  PreloadManager.cacheRecords(dataUnit, records, recreateCache, responseLoadingInfo.loadingInProgress);
56
56
  if (PreloadManager.isCacheEnabled(dataUnit) && responseLoadingInfo.loadingInProgress) {
57
57
  const newRequest = Object.assign(Object.assign({}, request), { offset: responseLoadingInfo.count });
58
- const newLoadingInfo = Object.assign(Object.assign({}, responseLoadingInfo), { pageNumber: (responseLoadingInfo.pageNumber || 0) + 1 });
58
+ const newLoadingInfo = Object.assign(Object.assign({}, responseLoadingInfo), { pageNumber: (responseLoadingInfo.pageNumber || 0) + 1, quiet: true });
59
59
  this.callLoader(dataUnit, newRequest, newLoadingInfo, dataLoader)
60
60
  .then(result => DataUnitDataLoader.afterLoadingPage(dataUnit, result.loadingInfo))
61
61
  .catch(reason => console.error(reason));
@@ -73,6 +73,11 @@ export default class DataUnitDataLoader {
73
73
  dataUnit.updatePagination(Object.assign(Object.assign({}, dataUnitPagination), { count }));
74
74
  return;
75
75
  }
76
+ if (loadingInfo.needReload) {
77
+ //Ir para a primeira página, faz com que o loadData seja chamado novamente
78
+ dataUnit.gotoPage(0);
79
+ return;
80
+ }
76
81
  dataUnit.updatePagination(Object.assign(Object.assign({}, dataUnitPagination), { total: count, count }));
77
82
  }
78
83
  static registryLoading(dataUnit, loadingInfo) {
@@ -97,7 +102,7 @@ export default class DataUnitDataLoader {
97
102
  offset = 0;
98
103
  }
99
104
  const { total, count, loadingInProgress } = loadingInfo;
100
- const firstRecord = count === 0 ? 0 : offset + 1;
105
+ const firstRecord = (count === 0 || pageSize === 0) ? 0 : offset + 1;
101
106
  const lastRecord = offset + Math.min(pageSize, limit);
102
107
  return {
103
108
  total,
@@ -20,9 +20,23 @@ export class ArrayRepository {
20
20
  return Promise.resolve({ result, count });
21
21
  }
22
22
  async distict(itemProcessor) {
23
- const processedItems = this._list.map(item => itemProcessor(item));
24
- return Promise.resolve(new Map(processedItems.filter(item => item != undefined)
25
- .map(item => [item.key, item.value])));
23
+ const processedItems = [];
24
+ let hasEmpty = false;
25
+ for (const item of this._list) {
26
+ const processedItem = itemProcessor(item);
27
+ if (processedItem == undefined) {
28
+ continue;
29
+ }
30
+ if (processedItem.value == undefined) {
31
+ hasEmpty = true;
32
+ continue;
33
+ }
34
+ processedItems.push(processedItem);
35
+ }
36
+ if (hasEmpty) {
37
+ processedItems.push({ key: "", value: null });
38
+ }
39
+ return Promise.resolve(new Map(processedItems.map(item => [item.key, item.value])));
26
40
  }
27
41
  async push(items) {
28
42
  this._list.push(...items);
@@ -31,7 +45,14 @@ export class ArrayRepository {
31
45
  this._list = [];
32
46
  }
33
47
  async delete(items) {
34
- this._list = this._list.filter(item => !items.includes(item));
48
+ this._list = this._list.filter(item => {
49
+ for (const removed of items) {
50
+ if (this._equalsFunction(item, removed)) {
51
+ return false;
52
+ }
53
+ }
54
+ return true;
55
+ });
35
56
  }
36
57
  async update(items) {
37
58
  this._list = this._list.map(existingItem => {
@@ -1,21 +1,12 @@
1
1
  import { DataUnit, FieldComparator, SortMode } from "@sankhyalabs/core";
2
- import DataUnitFetcher from "../dataunit-fetcher";
3
2
  import { ArrayRepository } from "./ArrayRepository";
4
- const COLUMN_FILTER_PATTERN = /FILTRO_COLUNA_(.+)/;
3
+ import { ColumnFilterManager } from "@sankhyalabs/ezui/dist/collection/components/ez-grid/utils";
5
4
  export default class PreloadManager {
6
5
  static setLoadingStatus(dataUnit, loadingInProgress) {
7
6
  this._loadingStatus.set(dataUnit.name, loadingInProgress);
8
7
  }
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;
8
+ static isCacheEnabled(_dataUnit) {
9
+ return true;
19
10
  }
20
11
  static cacheRecords(dataUnit, records, resetDatabase, loadingInProgress) {
21
12
  PreloadManager.setLoadingStatus(dataUnit, loadingInProgress);
@@ -43,18 +34,33 @@ export default class PreloadManager {
43
34
  }
44
35
  static async getDistinct(dataUnit, fieldName) {
45
36
  if (!PreloadManager.isCacheEnabled(dataUnit)) {
46
- return Promise.resolve(undefined);
37
+ return Promise.resolve(ColumnFilterManager.compileDistinct(fieldName, dataUnit));
38
+ }
39
+ let filterFunction;
40
+ const request = dataUnit.getLastLoadRequest();
41
+ if (request != undefined) {
42
+ const columnFilters = ColumnFilterManager.getColumnFilters(request.filters);
43
+ filterFunction = ColumnFilterManager.getFilterFunction(dataUnit, Array.from(columnFilters.values()));
47
44
  }
48
45
  return new Promise((accept, reject) => {
49
46
  PreloadManager.getRepository(dataUnit).distict(record => {
47
+ if (filterFunction != undefined && !filterFunction(record)) {
48
+ return undefined;
49
+ }
50
50
  const fieldValue = record[fieldName];
51
51
  if (fieldValue == undefined) {
52
- return undefined;
52
+ return { key: null, value: null };
53
53
  }
54
54
  const value = fieldValue.value != undefined ? fieldValue.value : fieldValue;
55
55
  return { key: dataUnit.getFormattedValue(fieldName, fieldValue), value };
56
56
  })
57
- .then(values => accept(values))
57
+ .then(result => {
58
+ if (result == undefined) {
59
+ accept(undefined);
60
+ return;
61
+ }
62
+ accept(Array.from(result.entries()).map(([label, value]) => ({ label, value, check: true })));
63
+ })
58
64
  .catch(reason => reject(reason));
59
65
  });
60
66
  }
@@ -68,7 +74,7 @@ export default class PreloadManager {
68
74
  return PreloadManager.loadFromCache(dataUnit, request);
69
75
  }
70
76
  }
71
- //Como não vamos aproveitar o cache, ele precisa ser limpado.
77
+ //Como não vamos aproveitar o cache, ele precisa ser limpo.
72
78
  PreloadManager.getRepository(dataUnit).clear().catch(() => { });
73
79
  }
74
80
  return loadFromServer(dataUnit, request);
@@ -106,39 +112,16 @@ export default class PreloadManager {
106
112
  }
107
113
  return PreloadManager._repositories.get(name);
108
114
  }
109
- static getFilterFunction(dataUnit, filters) {
110
- if (filters != undefined && filters.length > 0) {
111
- return record => {
112
- for (const filter of filters) {
113
- if (!PreloadManager.recordMatchesFilter(dataUnit, record, filter)) {
114
- return false;
115
- }
116
- }
117
- return true;
118
- };
119
- }
120
- return undefined;
121
- }
122
- static recordMatchesFilter(dataUnit, record, columnFilter) {
123
- const fieldValue = record[columnFilter.columnName];
124
- for (let param of columnFilter.params) {
125
- const paramValue = dataUnit.valueFromString(columnFilter.columnName, param.value);
126
- if (FieldComparator.compareValues(dataUnit.getField(columnFilter.columnName), fieldValue, paramValue) === 0) {
127
- return true;
128
- }
129
- }
130
- return false;
131
- }
132
115
  static async loadFromCache(dataUnit, request) {
133
116
  return new Promise((accept, reject) => {
134
- const columnFilters = PreloadManager.getColumnFilters(request.filters);
117
+ const columnFilters = ColumnFilterManager.getColumnFilters(request.filters);
135
118
  const { limit, offset, sort } = request;
136
119
  PreloadManager.getRepository(dataUnit)
137
- .load(PreloadManager.getFilterFunction(dataUnit, Array.from(columnFilters.values())), PreloadManager.getSortingFunction(dataUnit, sort), offset, limit)
120
+ .load(ColumnFilterManager.getFilterFunction(dataUnit, Array.from(columnFilters.values())), PreloadManager.getSortingFunction(dataUnit, sort), offset, limit)
138
121
  .then(loadResult => {
139
122
  const stillLoading = PreloadManager._loadingStatus.get(dataUnit.name);
140
123
  const { count, result: records } = loadResult;
141
- const firstRecord = count == 0 ? 1 : offset + 1;
124
+ const firstRecord = count == 0 ? 0 : offset + 1;
142
125
  const lastRecord = offset + Math.min(records.length, limit);
143
126
  const currentPage = offset / limit;
144
127
  const paginationInfo = {
@@ -151,19 +134,6 @@ export default class PreloadManager {
151
134
  .catch(reason => reject(reason));
152
135
  });
153
136
  }
154
- static getColumnFilters(filters) {
155
- const columnFilters = new Map();
156
- if (filters == undefined || filters.length == 0) {
157
- return columnFilters;
158
- }
159
- filters.forEach(filter => {
160
- const match = COLUMN_FILTER_PATTERN.exec(filter.name);
161
- if (match) {
162
- columnFilters.set(filter.name, Object.assign({ columnName: match[1] }, filter));
163
- }
164
- });
165
- return columnFilters;
166
- }
167
137
  }
168
138
  PreloadManager._repositories = new Map();
169
139
  PreloadManager._loadingStatus = new Map();
@@ -33,6 +33,7 @@ export default class DataUnitFetcher {
33
33
  defaultValue
34
34
  label
35
35
  visible
36
+ standAlone
36
37
  readOnly
37
38
  required
38
39
  dataType
@@ -11,17 +11,36 @@ export class DatasetStrategy {
11
11
  return Promise.resolve({ records: [], loadingInfo });
12
12
  }
13
13
  try {
14
+ const localSorting = [];
15
+ const serverSorting = [];
16
+ if (request.sort != undefined) {
17
+ for (const sort of request.sort) {
18
+ const descriptor = dataUnit.getField(sort.field);
19
+ const local = descriptor != undefined
20
+ && descriptor.properties != undefined
21
+ && descriptor.properties.calculated === "true";
22
+ if (local) {
23
+ localSorting.push(sort);
24
+ }
25
+ else {
26
+ serverSorting.push(sort);
27
+ }
28
+ }
29
+ }
14
30
  const fields = this.getFieldsList(dataUnit);
15
31
  const serviceName = "DatasetSP.loadRecords";
16
- const requestBody = this.buildRequestBody(serviceName, fields, dataUnit, request, loadingInfo);
17
- const { result: responseRecords, pagerID: pagerId } = await DataFetcher.get().callServiceBroker(serviceName, requestBody);
32
+ const requestBody = this.buildRequestBody(serviceName, fields, dataUnit, request, loadingInfo, serverSorting);
33
+ const params = loadingInfo.quiet ? { urlParams: { quietMode: "true" } } : undefined;
34
+ const { result: responseRecords, pagerID: pagerId } = await DataFetcher.get().callServiceBroker(serviceName, requestBody, params);
18
35
  const records = this.processRecords(dataUnit, fields, responseRecords);
19
36
  const loadingInProgress = pagerId != undefined;
20
37
  const count = loadingInfo.count + records.length;
38
+ const needReload = !loadingInProgress && localSorting.length > 0;
21
39
  return Promise.resolve({
22
40
  records,
23
41
  loadingInfo: Object.assign(Object.assign({}, loadingInfo), { pagerId,
24
- loadingInProgress, total: loadingInProgress ? undefined : count, count })
42
+ loadingInProgress, total: loadingInProgress ? undefined : count, count,
43
+ needReload })
25
44
  });
26
45
  }
27
46
  catch (error) {
@@ -31,7 +50,10 @@ export class DatasetStrategy {
31
50
  }
32
51
  getFieldsList(dataUnit) {
33
52
  let fields = ["__record__id__", "__record__label__"];
34
- dataUnit.metadata.fields.forEach(descriptor => {
53
+ dataUnit.metadata.fields.forEach((descriptor) => {
54
+ if (descriptor.standAlone) {
55
+ return;
56
+ }
35
57
  fields = fields.concat(this.getFieldNames(descriptor));
36
58
  });
37
59
  return fields;
@@ -43,7 +65,7 @@ export class DatasetStrategy {
43
65
  }
44
66
  return [descriptor.name, descriptionField];
45
67
  }
46
- buildRequestBody(serviceName, fields, dataUnit, request, loadingInfo) {
68
+ buildRequestBody(serviceName, fields, dataUnit, request, loadingInfo, sorting) {
47
69
  const dataSetID = dataUnit.dataUnitId;
48
70
  const dataUnitName = dataUnit.name;
49
71
  const entityName = DataUnitFetcher.parseDataUnitName(dataUnitName).entityName;
@@ -64,13 +86,13 @@ export class DatasetStrategy {
64
86
  tryJoinedFields: true,
65
87
  parallelLoader: true,
66
88
  crudListener: "br.com.sankhya.modelcore.dataset.DataUnitDatasetAdapter",
67
- txProperties: this.getTxProperties(dataUnitName, request),
89
+ txProperties: this.getTxProperties(dataUnitName, request, sorting),
68
90
  useDefaultRowsLimit: false
69
91
  }
70
92
  };
71
93
  return JSON.stringify(requestBody);
72
94
  }
73
- getTxProperties(dataUnitName, request) {
95
+ getTxProperties(dataUnitName, request, sorting) {
74
96
  const txProperties = {
75
97
  "__DATA_UNIT_ADAPTER__[dataUnitName]": dataUnitName
76
98
  };
@@ -78,7 +100,6 @@ export class DatasetStrategy {
78
100
  if (serverSideFilters.length !== 0) {
79
101
  txProperties["__DATA_UNIT_ADAPTER__[criteria]"] = JSON.stringify(serverSideFilters);
80
102
  }
81
- const sorting = request.sort;
82
103
  if (sorting != undefined && sorting.length !== 0) {
83
104
  txProperties["__DATA_UNIT_ADAPTER__[sorting]"] = JSON.stringify(sorting);
84
105
  }
@@ -91,6 +91,9 @@ export default class PersonalizedFilterFetcher {
91
91
  });
92
92
  }
93
93
  async savePersonalizedFilter(personalizedFilter, resourceID, configName) {
94
+ if (!personalizedFilter || Object.keys(personalizedFilter).length == 0) {
95
+ return Promise.reject(new Error("personalizedFilter não pode ser vazio"));
96
+ }
94
97
  let personalizedFilterParsed = JSON.parse(JSON.stringify(personalizedFilter));
95
98
  personalizedFilterParsed.assistent = JSON.stringify(personalizedFilterParsed.assistent);
96
99
  return new Promise((resolve, reject) => {
@@ -23,5 +23,12 @@ export default class Workspace {
23
23
  var _a;
24
24
  (_a = window["workspace"]) === null || _a === void 0 ? void 0 : _a.setScreenToUseOldLayout();
25
25
  }
26
+ static applicationClick() {
27
+ var _a, _b;
28
+ if (!((_a = window["workspace"]) === null || _a === void 0 ? void 0 : _a.applicationClick)) {
29
+ return;
30
+ }
31
+ (_b = window["workspace"]) === null || _b === void 0 ? void 0 : _b.applicationClick();
32
+ }
26
33
  }
27
34
  Workspace.resourceID = (_a = window["workspace"]) === null || _a === void 0 ? void 0 : _a.resourceID;
@@ -271,6 +271,9 @@ class PersonalizedFilterFetcher {
271
271
  });
272
272
  }
273
273
  async savePersonalizedFilter(personalizedFilter, resourceID, configName) {
274
+ if (!personalizedFilter || Object.keys(personalizedFilter).length == 0) {
275
+ return Promise.reject(new Error("personalizedFilter não pode ser vazio"));
276
+ }
274
277
  let personalizedFilterParsed = JSON.parse(JSON.stringify(personalizedFilter));
275
278
  personalizedFilterParsed.assistent = JSON.stringify(personalizedFilterParsed.assistent);
276
279
  return new Promise((resolve, reject) => {
@@ -6616,16 +6616,16 @@ class DataFetcher {
6616
6616
  if (this.ready) {
6617
6617
  return new Promise(async (resolve, reject) => {
6618
6618
  let query = this.getQueryTemplate(req);
6619
- const res = await this.fecthGrapql([{ document: query, variables: req.values }], quietMode);
6619
+ const res = await this.fecthGraphQL([{ document: query, variables: req.values }], quietMode);
6620
6620
  if (res.errors.length > 0) {
6621
- if (!this.proccesGraphQLClientEvents(res === null || res === void 0 ? void 0 : res.extensions, req, resolve, reject)) {
6621
+ if (!(await this.proccesGraphQLClientEvents(res === null || res === void 0 ? void 0 : res.extensions, req, resolve, reject))) {
6622
6622
  const error = this.processGraphQlErrorInfo(res.errors);
6623
6623
  reject(error);
6624
6624
  }
6625
6625
  }
6626
6626
  else {
6627
6627
  resolve(res.data[0][reqKey]);
6628
- this.proccesGraphQLClientEvents(res === null || res === void 0 ? void 0 : res.extensions, req, resolve, reject);
6628
+ await this.proccesGraphQLClientEvents(res === null || res === void 0 ? void 0 : res.extensions, req, resolve, reject);
6629
6629
  }
6630
6630
  });
6631
6631
  }
@@ -6639,7 +6639,7 @@ class DataFetcher {
6639
6639
  resolveURL() {
6640
6640
  return UrlUtils.getUrlBase();
6641
6641
  }
6642
- proccesGraphQLClientEvents(extensions, originalRequest, resolve, reject) {
6642
+ async proccesGraphQLClientEvents(extensions, originalRequest, resolve, reject) {
6643
6643
  if (extensions == undefined) {
6644
6644
  return false;
6645
6645
  }
@@ -6654,8 +6654,8 @@ class DataFetcher {
6654
6654
  throw new WarningException("ClientEvent não registrado", `Ocorreu o client event ${id} porém não há client event registrado na aplicação.`);
6655
6655
  }
6656
6656
  const handlers = DataFetcher.clientEventsByID.get(id);
6657
- handlers.forEach(handler => {
6658
- handler({ id, content: JSON.parse(clientEvents[id]) }, new GraphQLRecaller(originalRequest, resolve, reject));
6657
+ handlers.forEach(async (handler) => {
6658
+ await handler({ id, content: JSON.parse(clientEvents[id]) }, new GraphQLRecaller(originalRequest, resolve, reject));
6659
6659
  });
6660
6660
  }
6661
6661
  return Object.keys(clientEvents).length > 0;
@@ -6729,9 +6729,9 @@ class DataFetcher {
6729
6729
  const urlParams = UrlUtils.getQueryParams(location.search);
6730
6730
  return {
6731
6731
  baseUrl: `${this.resolveURL()}/${module}/service.sbr`,
6732
- appName: "SankhyaBlocks",
6732
+ appName: window['APPLICATION_NAME'] || "SankhyaBlocks",
6733
6733
  mgeSession: `${window['mgeSession'] || urlParams.get("mgeSession")}`,
6734
- globalID: "85C0093DFA240EAB699B4E47A10215BD",
6734
+ globalID: window['GLOBALID'] || StringUtils.generateUUID(),
6735
6735
  resourceID: (window["resourceID"] || ((_a = window["workspace"]) === null || _a === void 0 ? void 0 : _a.resourceID))
6736
6736
  };
6737
6737
  }
@@ -6848,17 +6848,13 @@ class DataFetcher {
6848
6848
  async executePendingRequest(watingRequestsById) {
6849
6849
  const requestsBatch = [];
6850
6850
  let quietMode = true;
6851
- watingRequestsById.forEach(async (waitingReq) => {
6852
- let query = this.getQueryTemplate(waitingReq.request);
6851
+ watingRequestsById.forEach((waitingReq) => {
6852
+ const query = this.getQueryTemplate(waitingReq.request);
6853
6853
  requestsBatch.push({ document: query, variables: Object.assign({}, waitingReq.request.values) });
6854
6854
  quietMode = quietMode && waitingReq.quietMode;
6855
6855
  });
6856
- let res = undefined;
6857
- let dataResponse = [];
6858
- let errorsResponse = [];
6859
- res = await this.fecthGrapql(requestsBatch, quietMode);
6860
- dataResponse = res.data;
6861
- errorsResponse = res.errors;
6856
+ const response = await this.fecthGraphQL(requestsBatch, quietMode);
6857
+ const { data: dataResponse, errors: errorsResponse, extensions } = response;
6862
6858
  //Reject promises with errors from query
6863
6859
  errorsResponse.forEach((errorResponse) => {
6864
6860
  Object.entries(errorResponse).forEach(([_key, val]) => {
@@ -6868,29 +6864,33 @@ class DataFetcher {
6868
6864
  });
6869
6865
  //Resolve promises with data from query
6870
6866
  dataResponse.forEach((data) => {
6871
- Object.entries(data).forEach(([key, val]) => {
6872
- var _a;
6873
- (((_a = watingRequestsById.get(key)) === null || _a === void 0 ? void 0 : _a.resolve) || Promise.resolve)(val);
6867
+ Object.entries(data).forEach(async ([key, val]) => {
6868
+ const waitingRequest = watingRequestsById.get(key);
6869
+ await this.proccesGraphQLClientEvents(extensions, waitingRequest.request, waitingRequest.resolve, waitingRequest.reject);
6870
+ ((waitingRequest === null || waitingRequest === void 0 ? void 0 : waitingRequest.resolve) || Promise.resolve)(val);
6874
6871
  });
6875
6872
  });
6876
6873
  }
6877
- async fecthGrapql(request, quietMode) {
6878
- let res = undefined;
6879
- let dataResponse = [];
6880
- let errorsResponse = [];
6881
- let url = `${this.resolveURL() + DataFetcher.getGraphQLPath()}`;
6882
- const responseExtensions = [];
6874
+ buildGraphQlURL(quietMode) {
6883
6875
  const mgeSession = window["mgeSession"];
6884
- if (mgeSession != undefined) {
6876
+ let url = `${this.resolveURL() + DataFetcher.getGraphQLPath()}`;
6877
+ if (mgeSession) {
6885
6878
  url += `?mgeSession=${mgeSession}`;
6886
6879
  }
6887
6880
  if (quietMode) {
6888
6881
  url += `${url.indexOf("?") > -1 ? "&" : "?"}quietMode=true`;
6889
6882
  }
6890
- DataFetcher.requestListener.forEach(listener => listener.onRequestStart({ url: url, requestBody: request }));
6883
+ return url;
6884
+ }
6885
+ async fecthGraphQL(request, quietMode) {
6886
+ const dataResponse = [];
6887
+ const errorsResponse = [];
6888
+ const responseExtensions = [];
6889
+ const url = this.buildGraphQlURL(quietMode);
6890
+ DataFetcher.requestListener.forEach(listener => listener.onRequestStart({ url, requestBody: request }));
6891
6891
  try {
6892
- res = await dist.batchRequests(url, request, { 'Content-Type': `application/json; charset=${window['SERVER_ENCODING'] || 'UTF-8'}` });
6893
- res.forEach((resItem, index) => {
6892
+ const response = await dist.batchRequests(url, request, { 'Content-Type': `application/json; charset=${window['SERVER_ENCODING'] || 'UTF-8'}` });
6893
+ response.forEach((resItem, index) => {
6894
6894
  var _a;
6895
6895
  if (((_a = resItem === null || resItem === void 0 ? void 0 : resItem.errors) === null || _a === void 0 ? void 0 : _a.length) > 0) {
6896
6896
  errorsResponse.push(resItem.errors.map((item) => this.normalizeErrorResponse(item, request, index)));
@@ -6905,7 +6905,7 @@ class DataFetcher {
6905
6905
  }
6906
6906
  catch (err) {
6907
6907
  if (!this.isHttpError(err)) {
6908
- res = err.response;
6908
+ const res = err.response;
6909
6909
  const req = err.request;
6910
6910
  Object.entries(res).forEach(([key, val]) => {
6911
6911
  if (val.errors) {
@@ -6921,11 +6921,11 @@ class DataFetcher {
6921
6921
  });
6922
6922
  }
6923
6923
  else {
6924
- DataFetcher.requestListener.forEach(listener => listener.onRequestEnd({ url: url, requestBody: request }));
6924
+ DataFetcher.requestListener.forEach(listener => listener.onRequestEnd({ url, requestBody: request }));
6925
6925
  throw new ErrorException("Falha de comunicação", err.message);
6926
6926
  }
6927
6927
  }
6928
- DataFetcher.requestListener.forEach(listener => listener.onRequestEnd({ url: url, requestBody: request }));
6928
+ DataFetcher.requestListener.forEach(listener => listener.onRequestEnd({ url, requestBody: request }));
6929
6929
  return { data: dataResponse, errors: errorsResponse, extensions: responseExtensions };
6930
6930
  }
6931
6931
  isHttpError(err) {