@genesislcap/grid-pro 11.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/README.md +5 -0
  2. package/dist/dts/cell/cell.d.ts +14 -0
  3. package/dist/dts/cell/cell.d.ts.map +1 -0
  4. package/dist/dts/cell/cell.template.d.ts +3 -0
  5. package/dist/dts/cell/cell.template.d.ts.map +1 -0
  6. package/dist/dts/cell/index.d.ts +3 -0
  7. package/dist/dts/cell/index.d.ts.map +1 -0
  8. package/dist/dts/cell-renderers/action.renderer.d.ts +33 -0
  9. package/dist/dts/cell-renderers/action.renderer.d.ts.map +1 -0
  10. package/dist/dts/cell-renderers/actions-menu.renderer.d.ts +19 -0
  11. package/dist/dts/cell-renderers/actions-menu.renderer.d.ts.map +1 -0
  12. package/dist/dts/cell-renderers/boolean.renderer.d.ts +25 -0
  13. package/dist/dts/cell-renderers/boolean.renderer.d.ts.map +1 -0
  14. package/dist/dts/cell-renderers/index.d.ts +6 -0
  15. package/dist/dts/cell-renderers/index.d.ts.map +1 -0
  16. package/dist/dts/cell-renderers/select.renderer.d.ts +34 -0
  17. package/dist/dts/cell-renderers/select.renderer.d.ts.map +1 -0
  18. package/dist/dts/cell-renderers/text.renderer.d.ts +30 -0
  19. package/dist/dts/cell-renderers/text.renderer.d.ts.map +1 -0
  20. package/dist/dts/cell-renderers/utils/accessor.d.ts +2 -0
  21. package/dist/dts/cell-renderers/utils/accessor.d.ts.map +1 -0
  22. package/dist/dts/cell-renderers/utils/index.d.ts +2 -0
  23. package/dist/dts/cell-renderers/utils/index.d.ts.map +1 -0
  24. package/dist/dts/column/column.d.ts +8 -0
  25. package/dist/dts/column/column.d.ts.map +1 -0
  26. package/dist/dts/column/column.template.d.ts +3 -0
  27. package/dist/dts/column/column.template.d.ts.map +1 -0
  28. package/dist/dts/column/index.d.ts +4 -0
  29. package/dist/dts/column/index.d.ts.map +1 -0
  30. package/dist/dts/column/utils/grid-pro-columns.d.ts +4 -0
  31. package/dist/dts/column/utils/grid-pro-columns.d.ts.map +1 -0
  32. package/dist/dts/column/utils/index.d.ts +2 -0
  33. package/dist/dts/column/utils/index.d.ts.map +1 -0
  34. package/dist/dts/external/ag-grid-css.d.ts +2 -0
  35. package/dist/dts/external/ag-grid-css.d.ts.map +1 -0
  36. package/dist/dts/external/ag-head-css.d.ts +2 -0
  37. package/dist/dts/external/ag-head-css.d.ts.map +1 -0
  38. package/dist/dts/external/ag-theme-alpine-no-font-css.d.ts +2 -0
  39. package/dist/dts/external/ag-theme-alpine-no-font-css.d.ts.map +1 -0
  40. package/dist/dts/external/ag-theme-balham-no-font-css.d.ts +2 -0
  41. package/dist/dts/external/ag-theme-balham-no-font-css.d.ts.map +1 -0
  42. package/dist/dts/external/ag-theme-material-no-font-css.d.ts +2 -0
  43. package/dist/dts/external/ag-theme-material-no-font-css.d.ts.map +1 -0
  44. package/dist/dts/external/fonts.d.ts +8 -0
  45. package/dist/dts/external/fonts.d.ts.map +1 -0
  46. package/dist/dts/external/index.d.ts +9 -0
  47. package/dist/dts/external/index.d.ts.map +1 -0
  48. package/dist/dts/grid-components.d.ts +59 -0
  49. package/dist/dts/grid-components.d.ts.map +1 -0
  50. package/dist/dts/grid-pro-genesis-datasource/grid-pro-genesis-datasource-next.d.ts +390 -0
  51. package/dist/dts/grid-pro-genesis-datasource/grid-pro-genesis-datasource-next.d.ts.map +1 -0
  52. package/dist/dts/grid-pro-genesis-datasource/grid-pro-genesis-datasource.d.ts +376 -0
  53. package/dist/dts/grid-pro-genesis-datasource/grid-pro-genesis-datasource.d.ts.map +1 -0
  54. package/dist/dts/grid-pro-genesis-datasource/index.d.ts +3 -0
  55. package/dist/dts/grid-pro-genesis-datasource/index.d.ts.map +1 -0
  56. package/dist/dts/grid-pro.d.ts +389 -0
  57. package/dist/dts/grid-pro.d.ts.map +1 -0
  58. package/dist/dts/grid-pro.definitions.d.ts +8 -0
  59. package/dist/dts/grid-pro.definitions.d.ts.map +1 -0
  60. package/dist/dts/grid-pro.styles.d.ts +3 -0
  61. package/dist/dts/grid-pro.styles.d.ts.map +1 -0
  62. package/dist/dts/grid-pro.template.d.ts +3 -0
  63. package/dist/dts/grid-pro.template.d.ts.map +1 -0
  64. package/dist/dts/grid-pro.types.d.ts +68 -0
  65. package/dist/dts/grid-pro.types.d.ts.map +1 -0
  66. package/dist/dts/index.d.ts +20 -0
  67. package/dist/dts/index.d.ts.map +1 -0
  68. package/dist/dts/index.federated.d.ts +1 -0
  69. package/dist/dts/index.federated.d.ts.map +1 -0
  70. package/dist/dts/style/colors.d.ts +4 -0
  71. package/dist/dts/style/colors.d.ts.map +1 -0
  72. package/dist/dts/style/index.d.ts +3 -0
  73. package/dist/dts/style/index.d.ts.map +1 -0
  74. package/dist/dts/style/tokens.d.ts +6 -0
  75. package/dist/dts/style/tokens.d.ts.map +1 -0
  76. package/dist/dts/utils/index.d.ts +2 -0
  77. package/dist/dts/utils/index.d.ts.map +1 -0
  78. package/dist/dts/utils/logger.d.ts +2 -0
  79. package/dist/dts/utils/logger.d.ts.map +1 -0
  80. package/dist/esm/cell/cell.js +46 -0
  81. package/dist/esm/cell/cell.template.js +6 -0
  82. package/dist/esm/cell/index.js +2 -0
  83. package/dist/esm/cell-renderers/action.renderer.js +85 -0
  84. package/dist/esm/cell-renderers/actions-menu.renderer.js +46 -0
  85. package/dist/esm/cell-renderers/boolean.renderer.js +42 -0
  86. package/dist/esm/cell-renderers/index.js +5 -0
  87. package/dist/esm/cell-renderers/select.renderer.js +69 -0
  88. package/dist/esm/cell-renderers/text.renderer.js +66 -0
  89. package/dist/esm/cell-renderers/utils/accessor.js +18 -0
  90. package/dist/esm/cell-renderers/utils/index.js +1 -0
  91. package/dist/esm/column/column.js +24 -0
  92. package/dist/esm/column/column.template.js +6 -0
  93. package/dist/esm/column/index.js +3 -0
  94. package/dist/esm/column/utils/grid-pro-columns.js +15 -0
  95. package/dist/esm/column/utils/index.js +1 -0
  96. package/dist/esm/external/ag-grid-css.js +7166 -0
  97. package/dist/esm/external/ag-head-css.js +19 -0
  98. package/dist/esm/external/ag-theme-alpine-no-font-css.js +452 -0
  99. package/dist/esm/external/ag-theme-balham-no-font-css.js +272 -0
  100. package/dist/esm/external/ag-theme-material-no-font-css.js +267 -0
  101. package/dist/esm/external/fonts.js +33 -0
  102. package/dist/esm/external/index.js +15 -0
  103. package/dist/esm/grid-components.js +21 -0
  104. package/dist/esm/grid-pro-genesis-datasource/grid-pro-genesis-datasource-next.js +328 -0
  105. package/dist/esm/grid-pro-genesis-datasource/grid-pro-genesis-datasource.js +339 -0
  106. package/dist/esm/grid-pro-genesis-datasource/index.js +2 -0
  107. package/dist/esm/grid-pro.definitions.js +43 -0
  108. package/dist/esm/grid-pro.js +297 -0
  109. package/dist/esm/grid-pro.styles.js +31 -0
  110. package/dist/esm/grid-pro.template.js +9 -0
  111. package/dist/esm/grid-pro.types.js +72 -0
  112. package/dist/esm/index.federated.js +1 -0
  113. package/dist/esm/index.js +19 -0
  114. package/dist/esm/style/colors.js +4 -0
  115. package/dist/esm/style/index.js +2 -0
  116. package/dist/esm/style/tokens.js +7 -0
  117. package/dist/esm/utils/index.js +1 -0
  118. package/dist/esm/utils/logger.js +2 -0
  119. package/externals.js +11 -0
  120. package/federation.config.json +9 -0
  121. package/license.txt +46 -0
  122. package/package.json +107 -0
@@ -0,0 +1,328 @@
1
+ import { __awaiter, __decorate } from "tslib";
2
+ import { Connect, dataServerResultFilter, DatasourceDefaults, extractFieldDefinitions, FieldTypeEnum, MessageType, toFieldMetadata, } from '@genesislcap/foundation-comms';
3
+ import { LifecycleMixin } from '@genesislcap/foundation-utils';
4
+ import { attr, customElement, DOM } from '@microsoft/fast-element';
5
+ import { FoundationElement } from '@microsoft/fast-foundation';
6
+ import { take } from 'rxjs/operators';
7
+ import { dateTimeValueFormatter, dateValueFormatter, getColumnType, getFilterByFieldType, getFilterParamsByFieldType, } from '../grid-pro.definitions';
8
+ import { GridProRendererTypes } from '../grid-pro.types';
9
+ import { logger } from '../utils';
10
+ export class StreamDatasource {
11
+ constructor(options) {
12
+ this.rowCount = 0;
13
+ this.moreRows = false;
14
+ this.calculatedRowsCount = 0;
15
+ this.lastSequenceId = 0;
16
+ this.dataserverStream = options.stream;
17
+ this.resourceName = options.resourceName;
18
+ this.resourceParams = options.resourceParams;
19
+ this.originalCriteriaMatch = options.resourceParams.CRITERIA_MATCH;
20
+ this.resourceIndexes = options.resourceIndexes;
21
+ this.resourceColDefs = options.resourceColDefs;
22
+ this.maxRows = options.maxRows;
23
+ this.maxView = options.maxView;
24
+ this.pagination = options.pagination;
25
+ }
26
+ getRows(params) {
27
+ var _a;
28
+ return __awaiter(this, void 0, void 0, function* () {
29
+ const toBeAppliedFilterModel = params.request.filterModel;
30
+ if (JSON.stringify(toBeAppliedFilterModel) !== JSON.stringify(this.currentFilterModel) ||
31
+ Object.keys(toBeAppliedFilterModel).length > 0) {
32
+ if (Object.keys(toBeAppliedFilterModel).length === 0 && this.currentFilterModel) {
33
+ this.currentFilterModel = null;
34
+ this.resourceParams.CRITERIA_MATCH = this.originalCriteriaMatch;
35
+ this.restartSubscription();
36
+ }
37
+ else if (Object.keys(toBeAppliedFilterModel).length > 0) {
38
+ this.currentFilterModel = toBeAppliedFilterModel;
39
+ this.resourceParams.CRITERIA_MATCH = this.buildCriteriaMatchFromFilters();
40
+ this.restartSubscription();
41
+ }
42
+ }
43
+ const toBeAppliedSortModel = params.request.sortModel;
44
+ if (toBeAppliedSortModel.length !== ((_a = this.currentSortModel) === null || _a === void 0 ? void 0 : _a.length) ||
45
+ toBeAppliedSortModel.length > 0) {
46
+ if (toBeAppliedSortModel.length === 0 && this.currentSortModel) {
47
+ this.currentSortModel = null;
48
+ this.resourceParams.ORDER_BY = null;
49
+ this.resourceParams.REVERSE = null;
50
+ this.restartSubscription();
51
+ }
52
+ else if (toBeAppliedSortModel.length > 0) {
53
+ this.currentSortModel = toBeAppliedSortModel;
54
+ const coldIdBeingSorted = this.currentSortModel[0].colId;
55
+ const sortTypeBeingApplied = this.currentSortModel[0].sort;
56
+ const orderByAndToBeSortedColIds = this.getOrderByAndToBeSortedColIds(this.resourceIndexes, coldIdBeingSorted);
57
+ orderByAndToBeSortedColIds.toBeSorted.forEach((colId) => {
58
+ this.currentSortModel.push({ sort: sortTypeBeingApplied, colId });
59
+ });
60
+ this.resourceParams.ORDER_BY = orderByAndToBeSortedColIds.orderBy;
61
+ this.resourceParams.REVERSE = sortTypeBeingApplied === 'desc' ? true : false;
62
+ this.restartSubscription();
63
+ }
64
+ }
65
+ if (this.moreRows && params.request.startRow >= this.maxRows) {
66
+ this.connect.getMoreRows(this.streamSourceRef);
67
+ }
68
+ this.dataserverStream.pipe(take(1)).subscribe((result) => {
69
+ var _a, _b;
70
+ const messageType = result.MESSAGE_TYPE;
71
+ if (messageType &&
72
+ (messageType === MessageType.LOGOFF_ACK || messageType === MessageType.MSG_NACK)) {
73
+ params.fail();
74
+ return;
75
+ }
76
+ this.moreRows = result.MORE_ROWS;
77
+ let rowData = [];
78
+ if (result.ROW) {
79
+ const nextMessage = dataServerResultFilter(result);
80
+ rowData = this.handleStreamUpdate(nextMessage);
81
+ }
82
+ this.lastSequenceId = result.SEQUENCE_ID;
83
+ if (this.lastSequenceId === 1) {
84
+ this.streamSourceRef = result.SOURCE_REF;
85
+ this.rowCount = (_a = result.ROWS_COUNT) !== null && _a !== void 0 ? _a : rowData.length;
86
+ }
87
+ this.calculatedRowsCount += (_b = rowData === null || rowData === void 0 ? void 0 : rowData.length) !== null && _b !== void 0 ? _b : 0;
88
+ const successRowData = { rowData };
89
+ if (this.pagination) {
90
+ successRowData.rowCount = Math.min(this.rowCount, this.maxView);
91
+ }
92
+ else if (params.request.endRow > this.maxView ||
93
+ params.request.endRow > this.calculatedRowsCount) {
94
+ successRowData.rowCount = this.calculatedRowsCount;
95
+ }
96
+ params.success(successRowData);
97
+ });
98
+ });
99
+ }
100
+ restartSubscription() {
101
+ this.connect.dataLogoff(this.streamSourceRef);
102
+ const streamOnMessage = (message) => message;
103
+ const onError = (error) => logger.error(error);
104
+ this.dataserverStream = this.connect.stream(this.resourceName, streamOnMessage, onError, this.resourceParams);
105
+ }
106
+ getOrderByAndToBeSortedColIds(map, searchValue) {
107
+ for (const [key, value] of map.entries()) {
108
+ const searchIndex = value.findIndex((x) => x === searchValue);
109
+ if (searchIndex !== -1) {
110
+ const copy = [...value];
111
+ copy.splice(searchIndex, 1);
112
+ return { orderBy: key, toBeSorted: copy };
113
+ }
114
+ }
115
+ }
116
+ handleStreamUpdate(result) {
117
+ var _a;
118
+ if (!result)
119
+ return;
120
+ const rows = new Map();
121
+ (_a = result.inserts) === null || _a === void 0 ? void 0 : _a.forEach((insertData) => {
122
+ rows.set(insertData.ROW_REF, insertData);
123
+ });
124
+ const rowData = Array.from(rows.values());
125
+ return rowData;
126
+ }
127
+ buildCriteriaMatchFromFilters() {
128
+ this.resourceParams.CRITERIA_MATCH = this.originalCriteriaMatch;
129
+ if (this.resourceParams.CRITERIA_MATCH &&
130
+ typeof this.resourceParams.CRITERIA_MATCH === 'string') {
131
+ this.resourceParams.CRITERIA_MATCH = this.resourceParams.CRITERIA_MATCH.split(';');
132
+ }
133
+ if (!this.resourceParams.CRITERIA_MATCH) {
134
+ this.resourceParams.CRITERIA_MATCH = [];
135
+ }
136
+ const criteria = this.resourceParams.CRITERIA_MATCH.concat(this.criteriaFromFilters());
137
+ return criteria.join(' && ');
138
+ }
139
+ criteriaFromFilters() {
140
+ const filters = [];
141
+ this.getFiltersByType('text').forEach((k) => filters.push(`Expr.containsIgnoreCase(${k}, '${this.currentFilterModel[k].filter.toLowerCase()}')`));
142
+ return filters;
143
+ }
144
+ getFiltersByType(filterType) {
145
+ return Object.keys(this.currentFilterModel)
146
+ .filter((k) => this.resourceColDefs.findIndex((o) => o.NAME === k) !== -1)
147
+ .filter((k) => this.currentFilterModel[k].filterType === filterType);
148
+ }
149
+ }
150
+ __decorate([
151
+ Connect
152
+ ], StreamDatasource.prototype, "connect", void 0);
153
+ let GridProGenesisDatasourceNext = class GridProGenesisDatasourceNext extends LifecycleMixin(FoundationElement) {
154
+ constructor() {
155
+ super(...arguments);
156
+ this.isSnapshot = false;
157
+ this.maxRows = DatasourceDefaults.MAX_ROWS_250;
158
+ this.maxView = DatasourceDefaults.MAX_VIEW_1000;
159
+ this.pagination = false;
160
+ this.reverse = false;
161
+ }
162
+ connectedCallback() {
163
+ super.connectedCallback();
164
+ DOM.queueUpdate(() => {
165
+ if (!this.shouldRunConnect)
166
+ return;
167
+ this.init();
168
+ });
169
+ }
170
+ disconnectedCallback() {
171
+ super.disconnectedCallback();
172
+ DOM.queueUpdate(() => {
173
+ if (!this.shouldRunDisconnect)
174
+ return;
175
+ this.reset();
176
+ });
177
+ }
178
+ init() {
179
+ if (this.agGrid && this.resourceName && this.connect.isConnected) {
180
+ this.agGrid.gridOptions = {
181
+ cacheBlockSize: this.maxRows,
182
+ defaultColDef: {
183
+ filter: true,
184
+ resizable: true,
185
+ sortable: true,
186
+ },
187
+ pagination: this.pagination,
188
+ paginationPageSize: this.maxRows,
189
+ rowBuffer: 0,
190
+ rowModelType: 'serverSide',
191
+ suppressServerSideInfiniteScroll: false,
192
+ suppressMultiSort: true,
193
+ onFilterChanged: (params) => { },
194
+ onSortChanged: (params) => { },
195
+ };
196
+ this.agGrid.addEventListener('onGridReady', () => __awaiter(this, void 0, void 0, function* () {
197
+ const meta = yield this.connect
198
+ .getMetadata(this.resourceName)
199
+ .catch((e) => logger.error(e));
200
+ if (!meta)
201
+ return false;
202
+ this.indexes = this.getResourceIndexes(meta.INDEXES);
203
+ this.originalFieldDef = extractFieldDefinitions(meta);
204
+ const fieldMetadata = toFieldMetadata(this.originalFieldDef);
205
+ const agColumnDefs = this.getAgColumnDefs(fieldMetadata);
206
+ this.agGrid.gridApi.setColumnDefs(agColumnDefs);
207
+ const dataserverStream = yield this.createDataserverStream();
208
+ this.dataserverStream = new StreamDatasource({
209
+ stream: dataserverStream,
210
+ resourceName: this.resourceName,
211
+ resourceParams: this.params,
212
+ resourceIndexes: this.indexes,
213
+ resourceColDefs: this.originalFieldDef,
214
+ maxRows: this.maxRows,
215
+ maxView: this.maxView,
216
+ pagination: this.pagination,
217
+ });
218
+ this.agGrid.gridApi.setServerSideDatasource(this.dataserverStream);
219
+ }), { once: true });
220
+ return;
221
+ }
222
+ logger.warn(`Application not connected, falling back to local columnDefs/rowData`);
223
+ }
224
+ reset() { }
225
+ get agGrid() {
226
+ return this.parentElement;
227
+ }
228
+ getResourceIndexes(avaialbleIndexes) {
229
+ const resourceIndexesMap = new Map();
230
+ avaialbleIndexes === null || avaialbleIndexes === void 0 ? void 0 : avaialbleIndexes.forEach((index) => {
231
+ resourceIndexesMap.set(index.NAME, index.FIELDS.split(' '));
232
+ });
233
+ return resourceIndexesMap;
234
+ }
235
+ get params() {
236
+ const params = {
237
+ CRITERIA_MATCH: this.criteria,
238
+ FIELDS: this.fields,
239
+ MAX_ROWS: this.maxRows,
240
+ MAX_VIEW: this.maxView,
241
+ REVERSE: this.reverse,
242
+ };
243
+ const keys = Array.from(this.indexes.keys());
244
+ if (this.orderBy) {
245
+ if (keys.findIndex((key) => key === this.orderBy) > -1) {
246
+ params.ORDER_BY = this.orderBy;
247
+ }
248
+ else {
249
+ const validIndexes = keys.map((key) => key);
250
+ logger.warn('Specified [orderBy] index is not valid and will not be used. See https://learn.genesis.global/docs/database/data-types/index-entities/ - Available indexes:', validIndexes);
251
+ }
252
+ }
253
+ logger.debug('Getting configured params:', params);
254
+ return params;
255
+ }
256
+ createDataserverStream(existingParams = null) {
257
+ return __awaiter(this, void 0, void 0, function* () {
258
+ const streamOnMessage = (message) => message;
259
+ const onError = (error) => logger.error(error);
260
+ return this.connect.stream(this.resourceName, streamOnMessage, onError, existingParams !== null && existingParams !== void 0 ? existingParams : this.params);
261
+ });
262
+ }
263
+ getAgColumnDefs(fieldsMetadata) {
264
+ const colDefsFromGenesisData = fieldsMetadata === null || fieldsMetadata === void 0 ? void 0 : fieldsMetadata.flatMap((field) => {
265
+ var _a;
266
+ const cellConfigs = {};
267
+ cellConfigs.filterParams = getFilterParamsByFieldType(field.type);
268
+ switch (field.type) {
269
+ case FieldTypeEnum.BOOLEAN:
270
+ if (this.agGrid.autoCellRendererByType) {
271
+ cellConfigs.cellRenderer = GridProRendererTypes.boolean;
272
+ }
273
+ break;
274
+ case FieldTypeEnum.DATE:
275
+ cellConfigs.valueFormatter = dateValueFormatter;
276
+ break;
277
+ case FieldTypeEnum.DATETIME:
278
+ cellConfigs.valueFormatter = dateTimeValueFormatter;
279
+ break;
280
+ default:
281
+ break;
282
+ }
283
+ const templateColDef = (_a = this.agGrid.gridApi) === null || _a === void 0 ? void 0 : _a.getColumnDef(field.name);
284
+ if (this.agGrid.onlyTemplateColDefs && !templateColDef) {
285
+ return [];
286
+ }
287
+ return Object.assign(Object.assign({ field: field.name, type: getColumnType(field.type), filter: getFilterByFieldType(field.type), sortable: [].concat(...this.indexes.values()).includes(field.name) }, cellConfigs), templateColDef);
288
+ });
289
+ const colDefsMergedWithTemplateDefs = this.agGrid.applyTemplateDefinitions(colDefsFromGenesisData);
290
+ return colDefsMergedWithTemplateDefs;
291
+ }
292
+ };
293
+ __decorate([
294
+ Connect
295
+ ], GridProGenesisDatasourceNext.prototype, "connect", void 0);
296
+ __decorate([
297
+ attr
298
+ ], GridProGenesisDatasourceNext.prototype, "criteria", void 0);
299
+ __decorate([
300
+ attr
301
+ ], GridProGenesisDatasourceNext.prototype, "fields", void 0);
302
+ __decorate([
303
+ attr({ mode: 'boolean', attribute: 'is-snapshot' })
304
+ ], GridProGenesisDatasourceNext.prototype, "isSnapshot", void 0);
305
+ __decorate([
306
+ attr({ attribute: 'max-rows' })
307
+ ], GridProGenesisDatasourceNext.prototype, "maxRows", void 0);
308
+ __decorate([
309
+ attr({ attribute: 'max-view' })
310
+ ], GridProGenesisDatasourceNext.prototype, "maxView", void 0);
311
+ __decorate([
312
+ attr({ attribute: 'order-by' })
313
+ ], GridProGenesisDatasourceNext.prototype, "orderBy", void 0);
314
+ __decorate([
315
+ attr({ attribute: 'resource-name' })
316
+ ], GridProGenesisDatasourceNext.prototype, "resourceName", void 0);
317
+ __decorate([
318
+ attr({ mode: 'boolean' })
319
+ ], GridProGenesisDatasourceNext.prototype, "pagination", void 0);
320
+ __decorate([
321
+ attr({ mode: 'boolean' })
322
+ ], GridProGenesisDatasourceNext.prototype, "reverse", void 0);
323
+ GridProGenesisDatasourceNext = __decorate([
324
+ customElement({
325
+ name: 'grid-pro-genesis-datasource-next',
326
+ })
327
+ ], GridProGenesisDatasourceNext);
328
+ export { GridProGenesisDatasourceNext };
@@ -0,0 +1,339 @@
1
+ import { __awaiter, __decorate } from "tslib";
2
+ import { Connect, dataServerResultFilter, Datasource, DatasourceDefaults, FieldTypeEnum, MessageType, normaliseCriteria, } from '@genesislcap/foundation-comms';
3
+ import { LifecycleMixin } from '@genesislcap/foundation-utils';
4
+ import { attr, customElement, DOM, observable } from '@microsoft/fast-element';
5
+ import { FoundationElement } from '@microsoft/fast-foundation';
6
+ import { BehaviorSubject } from 'rxjs';
7
+ import { debounceTime, skip, tap } from 'rxjs/operators';
8
+ import { dateTimeValueFormatter, dateValueFormatter, getFilterParamsByFieldType, } from '../grid-pro.definitions';
9
+ import { GridProRendererTypes } from '../grid-pro.types';
10
+ import { logger } from '../utils/logger';
11
+ const criteriaDelimiter = ';';
12
+ const criteriaJoin = ' && ';
13
+ const withoutFullInit = null;
14
+ let GridProGenesisDatasource = class GridProGenesisDatasource extends LifecycleMixin(FoundationElement) {
15
+ constructor() {
16
+ super(...arguments);
17
+ this.isSnapshot = false;
18
+ this.maxRows = DatasourceDefaults.MAX_ROWS_250;
19
+ this.maxView = DatasourceDefaults.MAX_VIEW_1000;
20
+ this.reverse = false;
21
+ this.rowId = 'ROW_REF';
22
+ this.requiresFullRowDataAndColDefs = true;
23
+ this.rows = new Map();
24
+ this.dataSubWasLoggedOff = false;
25
+ this.criteriaFromFilters = new Map();
26
+ this.update = new BehaviorSubject(new Map());
27
+ }
28
+ connectedCallback() {
29
+ super.connectedCallback();
30
+ DOM.queueUpdate(() => {
31
+ if (!this.shouldRunConnect)
32
+ return;
33
+ this.init();
34
+ });
35
+ this.connectionSub = this.connect._status.subscribe((status) => {
36
+ if (status === 'connected') {
37
+ this.agGrid.removeAttribute('ds-disconnected');
38
+ }
39
+ else {
40
+ this.agGrid.setAttribute('ds-disconnected', 'ds-disconnected');
41
+ }
42
+ });
43
+ }
44
+ disconnectedCallback() {
45
+ var _a;
46
+ super.disconnectedCallback();
47
+ DOM.queueUpdate(() => {
48
+ if (!this.shouldRunDisconnect)
49
+ return;
50
+ this.reset();
51
+ });
52
+ (_a = this.connectionSub) === null || _a === void 0 ? void 0 : _a.unsubscribe();
53
+ }
54
+ deepClone() {
55
+ const copy = super.deepClone();
56
+ copy.deferredGridOptions = structuredClone(this.deferredGridOptions);
57
+ copy.request = structuredClone(this.request);
58
+ return copy;
59
+ }
60
+ get agGrid() {
61
+ return this.parentElement;
62
+ }
63
+ init() {
64
+ if (this.agGrid && this.resourceName && this.connect.isConnected) {
65
+ const gridOptions = Object.assign({ getRowId: (params) => params.data[this.rowId] }, this.deferredGridOptions);
66
+ this.agGrid.gridOptions = Object.assign({}, gridOptions);
67
+ this.agGrid.addEventListener('onGridReady', () => __awaiter(this, void 0, void 0, function* () {
68
+ yield this.loadResourceData();
69
+ }), { once: true });
70
+ const filterDebounceTime = 600;
71
+ this.updateSub = this.update
72
+ .pipe(skip(1), debounceTime(filterDebounceTime), tap((f) => logger.debug('filters (debounced): ', f)))
73
+ .subscribe((value) => {
74
+ this.loadResourceData(withoutFullInit);
75
+ });
76
+ return;
77
+ }
78
+ logger.warn(`Application not connected, falling back to local columnDefs/rowData`);
79
+ }
80
+ reset() {
81
+ var _a, _b;
82
+ (_a = this.dataSub) === null || _a === void 0 ? void 0 : _a.unsubscribe();
83
+ (_b = this.updateSub) === null || _b === void 0 ? void 0 : _b.unsubscribe();
84
+ this.requiresFullRowDataAndColDefs = true;
85
+ this.clearRowData();
86
+ }
87
+ clearRowData() {
88
+ var _a, _b;
89
+ this.rows = new Map();
90
+ (_b = (_a = this.agGrid) === null || _a === void 0 ? void 0 : _a.gridApi) === null || _b === void 0 ? void 0 : _b.setRowData([]);
91
+ }
92
+ updateRowData(rowData) {
93
+ const agColumnDefs = this.getAgColumnDefs(this.datasource.fieldMetadata);
94
+ if (agColumnDefs.length > 0) {
95
+ this.agGrid.gridApi.setColumnDefs(agColumnDefs);
96
+ }
97
+ this.agGrid.gridApi.setRowData(rowData);
98
+ this.requiresFullRowDataAndColDefs = false;
99
+ }
100
+ loadResourceData(withFullInit = true) {
101
+ return __awaiter(this, void 0, void 0, function* () {
102
+ const requiresMetadataFetch = withFullInit || !this.datasource.initialized;
103
+ if (!requiresMetadataFetch) {
104
+ this.connect.dataLogoff(this.sourceRef);
105
+ this.clearRowData();
106
+ }
107
+ const initOK = yield this.datasource.init(this.datasourceOptions(), requiresMetadataFetch);
108
+ if (!initOK) {
109
+ logger.debug(`Genesis Datasource init failed for ${this.resourceName}`);
110
+ return;
111
+ }
112
+ if (this.isSnapshot) {
113
+ const result = yield this.datasource.snapshot();
114
+ if (result) {
115
+ const rowData = this.handleSnapshot(result);
116
+ this.updateRowData(rowData);
117
+ }
118
+ return;
119
+ }
120
+ logger.debug(`requesting stream for ${this.resourceName}`);
121
+ this.dataSub = this.datasource.stream.subscribe((result) => {
122
+ this.sourceRef = result.SOURCE_REF;
123
+ const messageType = result.MESSAGE_TYPE;
124
+ if (messageType && messageType === MessageType.LOGOFF_ACK) {
125
+ this.dataSubWasLoggedOff = true;
126
+ return;
127
+ }
128
+ this.dataSubWasLoggedOff = false;
129
+ if (result.ROW) {
130
+ const nextMessage = dataServerResultFilter(result);
131
+ this.handleStreamResult(nextMessage);
132
+ }
133
+ else {
134
+ this.handleStreamResult(result);
135
+ }
136
+ });
137
+ });
138
+ }
139
+ handleSnapshot(result) {
140
+ if (Array.isArray(result))
141
+ return result;
142
+ if (result.REPLY) {
143
+ return result.REPLY;
144
+ }
145
+ if (result.ROW) {
146
+ return dataServerResultFilter(result).inserts;
147
+ }
148
+ return result.inserts;
149
+ }
150
+ datasourceOptions() {
151
+ return {
152
+ criteria: this.buildCriteria(),
153
+ fields: this.fields,
154
+ isSnapshot: this.isSnapshot,
155
+ orderBy: this.orderBy,
156
+ resourceName: this.resourceName,
157
+ request: this.request,
158
+ reverse: this.reverse,
159
+ maxRows: this.maxRows,
160
+ maxView: this.maxView,
161
+ };
162
+ }
163
+ handleStreamResult(result) {
164
+ if (!result)
165
+ return;
166
+ const isRequestServer = result.hasOwnProperty('REPLY');
167
+ if (isRequestServer) {
168
+ this.applyRequestServerData(result);
169
+ }
170
+ else {
171
+ this.applyDataserverData(result);
172
+ }
173
+ }
174
+ applyRequestServerData(requestServerResult) {
175
+ var _a, _b;
176
+ if (!Array.isArray(requestServerResult.REPLY) ||
177
+ !((_a = requestServerResult.MESSAGE_TYPE) === null || _a === void 0 ? void 0 : _a.startsWith('REP_'))) {
178
+ logger.error('received invalid RequestServerResult', requestServerResult);
179
+ return;
180
+ }
181
+ if (this.requiresFullRowDataAndColDefs) {
182
+ if (this.rowId !== 'ROW_REF') {
183
+ (_b = requestServerResult.REPLY) === null || _b === void 0 ? void 0 : _b.forEach((insertData) => {
184
+ this.rows.set(insertData[this.rowId], insertData);
185
+ });
186
+ }
187
+ const rowData = this.rows.size > 0 ? Array.from(this.rows.values()) : requestServerResult.REPLY;
188
+ this.updateRowData(rowData);
189
+ return;
190
+ }
191
+ this.agTransaction = { add: [], remove: [], update: [] };
192
+ this.handleStreamInserts(requestServerResult.REPLY);
193
+ const rowsToDelete = Array.from(this.rows.values()).filter((row) => !requestServerResult.REPLY.includes(row));
194
+ this.handleStreamDeletes(rowsToDelete);
195
+ this.agGrid.gridApi.applyTransactionAsync(this.agTransaction);
196
+ }
197
+ applyDataserverData(dataServerResult) {
198
+ var _a;
199
+ if (this.requiresFullRowDataAndColDefs) {
200
+ (_a = dataServerResult.inserts) === null || _a === void 0 ? void 0 : _a.forEach((insertData) => {
201
+ this.rows.set(insertData[this.rowId], insertData);
202
+ });
203
+ const rowData = Array.from(this.rows.values());
204
+ this.updateRowData(rowData);
205
+ return;
206
+ }
207
+ this.agTransaction = { add: [], remove: [], update: [] };
208
+ this.handleStreamInserts(dataServerResult.inserts);
209
+ this.handleStreamDeletes(dataServerResult.deletes);
210
+ this.handleStreamUpdates(dataServerResult.updates);
211
+ this.agGrid.gridApi.applyTransactionAsync(this.agTransaction);
212
+ }
213
+ handleStreamInserts(insertedRows) {
214
+ insertedRows === null || insertedRows === void 0 ? void 0 : insertedRows.forEach((insertData) => {
215
+ if (this.rows.has(insertData[this.rowId]) || this.dataSubWasLoggedOff) {
216
+ const rowToBeUpdated = this.rows.get(insertData[this.rowId]);
217
+ const updatedRow = Object.assign(Object.assign({}, rowToBeUpdated), insertData);
218
+ this.agTransaction.update.push(updatedRow);
219
+ }
220
+ else {
221
+ this.agTransaction.add.push(insertData);
222
+ this.agTransaction.addIndex = 0;
223
+ }
224
+ this.rows.set(insertData[this.rowId], insertData);
225
+ });
226
+ }
227
+ handleStreamDeletes(deletedRows) {
228
+ deletedRows === null || deletedRows === void 0 ? void 0 : deletedRows.forEach((deleteData) => {
229
+ this.agTransaction.remove.push({ [this.rowId]: deleteData[this.rowId] });
230
+ this.rows.delete(deleteData[this.rowId]);
231
+ });
232
+ }
233
+ handleStreamUpdates(updatedRows) {
234
+ updatedRows === null || updatedRows === void 0 ? void 0 : updatedRows.forEach((updateData) => {
235
+ const rowToBeUpdated = this.rows.get(updateData[this.rowId]);
236
+ const updatedRow = Object.assign(Object.assign({}, rowToBeUpdated), updateData);
237
+ this.agTransaction.update.push(updatedRow);
238
+ this.rows.set(updateData[this.rowId], updatedRow);
239
+ });
240
+ }
241
+ getAgColumnDefs(fieldsMetadata) {
242
+ const colDefsFromGenesisData = fieldsMetadata === null || fieldsMetadata === void 0 ? void 0 : fieldsMetadata.flatMap((field) => {
243
+ var _a;
244
+ const cellConfigs = {};
245
+ cellConfigs.filterParams = getFilterParamsByFieldType(field.type);
246
+ switch (field.type) {
247
+ case FieldTypeEnum.BOOLEAN:
248
+ if (this.agGrid.autoCellRendererByType) {
249
+ cellConfigs.cellRenderer = GridProRendererTypes.boolean;
250
+ }
251
+ break;
252
+ case FieldTypeEnum.DATE:
253
+ cellConfigs.valueFormatter = dateValueFormatter;
254
+ break;
255
+ case FieldTypeEnum.DATETIME:
256
+ cellConfigs.valueFormatter = dateTimeValueFormatter;
257
+ break;
258
+ default:
259
+ break;
260
+ }
261
+ const templateColDef = (_a = this.agGrid.gridApi) === null || _a === void 0 ? void 0 : _a.getColumnDef(field.name);
262
+ if (this.agGrid.onlyTemplateColDefs && !templateColDef) {
263
+ return [];
264
+ }
265
+ if (this.fields && !this.fields.includes(field.name)) {
266
+ return [];
267
+ }
268
+ return Object.assign(Object.assign({ field: field.name }, cellConfigs), templateColDef);
269
+ });
270
+ const colDefsMergedWithTemplateDefs = this.agGrid.applyTemplateDefinitions(colDefsFromGenesisData);
271
+ return colDefsMergedWithTemplateDefs;
272
+ }
273
+ buildCriteria() {
274
+ var _a;
275
+ const initialCriteria = ((_a = this.criteria) === null || _a === void 0 ? void 0 : _a.split(criteriaDelimiter)) || [];
276
+ const criteria = initialCriteria.concat(Array.from(this.criteriaFromFilters.values()));
277
+ return normaliseCriteria(criteria.join(criteriaJoin), criteriaDelimiter);
278
+ }
279
+ criteriaChanged(oldCriteria, newCriteria) {
280
+ const firstCriteria = !oldCriteria && newCriteria;
281
+ const criteriaNotDuplicate = oldCriteria !== normaliseCriteria(newCriteria, criteriaDelimiter);
282
+ if (firstCriteria || criteriaNotDuplicate) {
283
+ DOM.queueUpdate(() => this.loadResourceData(withoutFullInit));
284
+ }
285
+ }
286
+ setFilter(fieldName, newFilter) {
287
+ this.criteriaFromFilters.set(fieldName, newFilter);
288
+ this.update.next(this.criteriaFromFilters);
289
+ }
290
+ removeFilter(fieldName) {
291
+ this.criteriaFromFilters.delete(fieldName);
292
+ this.update.next(this.criteriaFromFilters);
293
+ }
294
+ };
295
+ __decorate([
296
+ Connect
297
+ ], GridProGenesisDatasource.prototype, "connect", void 0);
298
+ __decorate([
299
+ Datasource
300
+ ], GridProGenesisDatasource.prototype, "datasource", void 0);
301
+ __decorate([
302
+ observable
303
+ ], GridProGenesisDatasource.prototype, "deferredGridOptions", void 0);
304
+ __decorate([
305
+ attr
306
+ ], GridProGenesisDatasource.prototype, "criteria", void 0);
307
+ __decorate([
308
+ attr
309
+ ], GridProGenesisDatasource.prototype, "fields", void 0);
310
+ __decorate([
311
+ attr({ mode: 'boolean', attribute: 'is-snapshot' })
312
+ ], GridProGenesisDatasource.prototype, "isSnapshot", void 0);
313
+ __decorate([
314
+ attr({ attribute: 'max-rows' })
315
+ ], GridProGenesisDatasource.prototype, "maxRows", void 0);
316
+ __decorate([
317
+ attr({ attribute: 'max-view' })
318
+ ], GridProGenesisDatasource.prototype, "maxView", void 0);
319
+ __decorate([
320
+ attr({ attribute: 'order-by' })
321
+ ], GridProGenesisDatasource.prototype, "orderBy", void 0);
322
+ __decorate([
323
+ observable
324
+ ], GridProGenesisDatasource.prototype, "request", void 0);
325
+ __decorate([
326
+ attr({ attribute: 'resource-name' })
327
+ ], GridProGenesisDatasource.prototype, "resourceName", void 0);
328
+ __decorate([
329
+ attr({ mode: 'boolean' })
330
+ ], GridProGenesisDatasource.prototype, "reverse", void 0);
331
+ __decorate([
332
+ attr({ attribute: 'row-id' })
333
+ ], GridProGenesisDatasource.prototype, "rowId", void 0);
334
+ GridProGenesisDatasource = __decorate([
335
+ customElement({
336
+ name: 'grid-pro-genesis-datasource',
337
+ })
338
+ ], GridProGenesisDatasource);
339
+ export { GridProGenesisDatasource };
@@ -0,0 +1,2 @@
1
+ export * from './grid-pro-genesis-datasource-next';
2
+ export * from './grid-pro-genesis-datasource';