@wavemaker/app-ng-runtime 11.14.1-1.6289 → 11.14.1-10.6348
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/components/base/bundles/index.umd.js +86 -17
- package/components/base/esm2022/pipes/custom-pipes.mjs +10 -10
- package/components/base/esm2022/utils/widget-utils.mjs +3 -3
- package/components/base/esm2022/widgets/common/base/base.component.mjs +67 -7
- package/components/base/esm2022/widgets/common/lazy-load/lazy-load.directive.mjs +7 -3
- package/components/base/esm2022/widgets/framework/property-change-handler.mjs +7 -2
- package/components/base/fesm2022/index.mjs +87 -18
- package/components/base/fesm2022/index.mjs.map +1 -1
- package/components/base/pipes/custom-pipes.d.ts +5 -5
- package/components/basic/label/bundles/index.umd.js +9 -1
- package/components/basic/label/esm2022/label.directive.mjs +10 -2
- package/components/basic/label/fesm2022/index.mjs +9 -1
- package/components/basic/label/fesm2022/index.mjs.map +1 -1
- package/components/data/pagination/bundles/index.umd.js +4 -0
- package/components/data/pagination/esm2022/pagination.component.mjs +5 -1
- package/components/data/pagination/fesm2022/index.mjs +4 -0
- package/components/data/pagination/fesm2022/index.mjs.map +1 -1
- package/components/data/table/bundles/index.umd.js +371 -15
- package/components/data/table/esm2022/table-action/table-action.directive.mjs +8 -1
- package/components/data/table/esm2022/table-column/table-column.directive.mjs +107 -3
- package/components/data/table/esm2022/table-column-group/table-column-group.directive.mjs +9 -1
- package/components/data/table/esm2022/table-cud.directive.mjs +8 -2
- package/components/data/table/esm2022/table-filter.directive.mjs +12 -2
- package/components/data/table/esm2022/table-row/table-row.directive.mjs +8 -1
- package/components/data/table/esm2022/table-row-action/table-row-action.directive.mjs +8 -1
- package/components/data/table/esm2022/table.component.mjs +219 -12
- package/components/data/table/fesm2022/index.mjs +371 -15
- package/components/data/table/fesm2022/index.mjs.map +1 -1
- package/components/data/table/table-action/table-action.directive.d.ts +3 -2
- package/components/data/table/table-column/table-column.directive.d.ts +3 -2
- package/components/data/table/table-column-group/table-column-group.directive.d.ts +3 -2
- package/components/data/table/table-cud.directive.d.ts +3 -1
- package/components/data/table/table-filter.directive.d.ts +3 -1
- package/components/data/table/table-row/table-row.directive.d.ts +3 -2
- package/components/data/table/table-row-action/table-row-action.directive.d.ts +3 -2
- package/components/data/table/table.component.d.ts +6 -2
- package/components/navigation/menu/bundles/index.umd.js +5 -0
- package/components/navigation/menu/esm2022/menu.component.mjs +6 -1
- package/components/navigation/menu/fesm2022/index.mjs +5 -0
- package/components/navigation/menu/fesm2022/index.mjs.map +1 -1
- package/components/navigation/popover/bundles/index.umd.js +6 -6
- package/components/navigation/popover/esm2022/popover.component.mjs +4 -4
- package/components/navigation/popover/fesm2022/index.mjs +3 -3
- package/components/navigation/popover/fesm2022/index.mjs.map +1 -1
- package/components/navigation/popover/popover.component.d.ts +6 -0
- package/core/bundles/index.umd.js +411 -82
- package/core/esm2022/public_api.mjs +3 -3
- package/core/esm2022/utils/utils.mjs +6 -2
- package/core/esm2022/utils/watcher.mjs +402 -81
- package/core/fesm2022/index.mjs +410 -84
- package/core/fesm2022/index.mjs.map +1 -1
- package/core/public_api.d.ts +2 -2
- package/core/utils/utils.d.ts +1 -0
- package/core/utils/watcher.d.ts +28 -5
- package/npm-shrinkwrap.json +2 -2
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/runtime/base/bundles/index.umd.js +22 -2
- package/runtime/base/esm2022/components/app-component/app.component.mjs +4 -2
- package/runtime/base/esm2022/components/base-page.component.mjs +6 -2
- package/runtime/base/esm2022/components/base-partial.component.mjs +7 -2
- package/runtime/base/esm2022/components/base-prefab.component.mjs +7 -2
- package/runtime/base/esm2022/components/base-spa-page.component.mjs +6 -2
- package/runtime/base/esm2022/services/pipe-provider.service.mjs +4 -4
- package/runtime/base/fesm2022/index.mjs +23 -3
- package/runtime/base/fesm2022/index.mjs.map +1 -1
- package/scripts/datatable/datatable.js +101 -15
|
@@ -186,8 +186,15 @@
|
|
|
186
186
|
this.setDataGridOption('colDefs', i2.getClonedObject(this.fieldDefs));
|
|
187
187
|
}
|
|
188
188
|
// If data and colDefs are present, call on before data render event
|
|
189
|
+
// Note: Errors in beforedatarender should not prevent table rendering
|
|
189
190
|
if (!this.isdynamictable && !lodashEs.isEmpty(newValue) && gridOptions.colDefs.length) {
|
|
190
|
-
|
|
191
|
+
try {
|
|
192
|
+
this.invokeEventCallback('beforedatarender', { $data: this._gridData, $columns: this.columns, data: this._gridData, columns: this.columns });
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
// Log error but continue with rendering - beforedatarender errors should not block table rendering
|
|
196
|
+
console.warn('Error in beforedatarender event callback, continuing with table rendering:', error);
|
|
197
|
+
}
|
|
191
198
|
}
|
|
192
199
|
this.setDataGridOption('data', i2.getClonedObject(this._gridData));
|
|
193
200
|
}
|
|
@@ -580,7 +587,7 @@
|
|
|
580
587
|
this.prevData = i2.getClonedObject(row);
|
|
581
588
|
},
|
|
582
589
|
afterRowUpdate: (row, e, callBack, options) => {
|
|
583
|
-
this.updateRecord(lodashEs.extend({}, options, { row, 'prevData': this.prevData, 'event': e, 'callBack': callBack }));
|
|
590
|
+
this.updateRecord(lodashEs.extend({}, options, { row, 'prevData': options.rowindex ? options.rowindex : this.prevData, 'event': e, 'callBack': callBack }));
|
|
584
591
|
},
|
|
585
592
|
onBeforeRowUpdate: (row, e, options) => {
|
|
586
593
|
return this.invokeEventCallback('beforerowupdate', { $event: e, $data: row, row, options: options });
|
|
@@ -1234,6 +1241,10 @@
|
|
|
1234
1241
|
return this.actualPageSize || 5;
|
|
1235
1242
|
}
|
|
1236
1243
|
watchVariableDataSet(newVal) {
|
|
1244
|
+
// Guard against component destruction
|
|
1245
|
+
if (this.isDestroyed) {
|
|
1246
|
+
return;
|
|
1247
|
+
}
|
|
1237
1248
|
let result;
|
|
1238
1249
|
// Check for Variable filters if applied
|
|
1239
1250
|
if (this.gridOptions.isNavTypeScrollOrOndemand()) {
|
|
@@ -1291,6 +1302,12 @@
|
|
|
1291
1302
|
}
|
|
1292
1303
|
/*Return if data is invalid.*/
|
|
1293
1304
|
if (!this.isDataValid()) {
|
|
1305
|
+
// If data is invalid and variableInflight is still true, clear loading state
|
|
1306
|
+
// This prevents tables from getting stuck in loading when data is invalid
|
|
1307
|
+
if (this.variableInflight) {
|
|
1308
|
+
this.variableInflight = false;
|
|
1309
|
+
this.setGridData([]);
|
|
1310
|
+
}
|
|
1294
1311
|
return;
|
|
1295
1312
|
}
|
|
1296
1313
|
// If value is empty or in studio mode, dont enable the navigation
|
|
@@ -1318,7 +1335,13 @@
|
|
|
1318
1335
|
// @ts-ignore
|
|
1319
1336
|
if (!lodashEs.isObject(newVal) || newVal === '' || (newVal && newVal.dataValue === '')) {
|
|
1320
1337
|
if (!this.variableInflight) {
|
|
1321
|
-
// If variable has finished loading and resultSet is empty,
|
|
1338
|
+
// If variable has finished loading and resultSet is empty, render empty data
|
|
1339
|
+
this.setGridData([]);
|
|
1340
|
+
}
|
|
1341
|
+
else {
|
|
1342
|
+
// If variableInflight is still true but we have invalid/empty data, clear loading state
|
|
1343
|
+
// This handles cases where data never arrives or is invalid
|
|
1344
|
+
this.variableInflight = false;
|
|
1322
1345
|
this.setGridData([]);
|
|
1323
1346
|
}
|
|
1324
1347
|
return;
|
|
@@ -1328,13 +1351,143 @@
|
|
|
1328
1351
|
}
|
|
1329
1352
|
}
|
|
1330
1353
|
ngOnDestroy() {
|
|
1354
|
+
// MEMORY LEAK FIX: Remove document click listener
|
|
1331
1355
|
document.removeEventListener('click', this.documentClickBind);
|
|
1356
|
+
// MEMORY LEAK FIX: Unsubscribe from navigator watches
|
|
1332
1357
|
if (this.navigatorResultWatch) {
|
|
1333
1358
|
this.navigatorResultWatch.unsubscribe();
|
|
1359
|
+
this.navigatorResultWatch = null;
|
|
1334
1360
|
}
|
|
1335
1361
|
if (this.navigatorMaxResultWatch) {
|
|
1336
1362
|
this.navigatorMaxResultWatch.unsubscribe();
|
|
1363
|
+
this.navigatorMaxResultWatch = null;
|
|
1364
|
+
}
|
|
1365
|
+
// MEMORY LEAK FIX: Clear all ViewContainerRef embedded views
|
|
1366
|
+
// These hold references to row data, custom expressions, and inline widgets
|
|
1367
|
+
if (this.customExprViewRef) {
|
|
1368
|
+
this.customExprViewRef.clear();
|
|
1369
|
+
}
|
|
1370
|
+
if (this.rowActionsViewRef) {
|
|
1371
|
+
this.rowActionsViewRef.clear();
|
|
1372
|
+
}
|
|
1373
|
+
if (this.filterViewRef) {
|
|
1374
|
+
this.filterViewRef.clear();
|
|
1375
|
+
}
|
|
1376
|
+
if (this.inlineEditViewRef) {
|
|
1377
|
+
this.inlineEditViewRef.clear();
|
|
1378
|
+
}
|
|
1379
|
+
if (this.inlineEditNewViewRef) {
|
|
1380
|
+
this.inlineEditNewViewRef.clear();
|
|
1381
|
+
}
|
|
1382
|
+
if (this.rowDetailViewRef) {
|
|
1383
|
+
this.rowDetailViewRef.clear();
|
|
1384
|
+
}
|
|
1385
|
+
if (this.rowExpansionActionViewRef) {
|
|
1386
|
+
this.rowExpansionActionViewRef.clear();
|
|
1387
|
+
}
|
|
1388
|
+
if (this.dynamicTableRef) {
|
|
1389
|
+
this.dynamicTableRef.clear();
|
|
1390
|
+
}
|
|
1391
|
+
// MEMORY LEAK FIX: Clear compiled template caches
|
|
1392
|
+
this.rowActionsCompiledTl = {};
|
|
1393
|
+
this.rowFilterCompliedTl = {};
|
|
1394
|
+
this.inlineCompliedTl = {};
|
|
1395
|
+
this.inlineNewCompliedTl = {};
|
|
1396
|
+
this.customExprCompiledTl = {};
|
|
1397
|
+
this.customExprCompiledSummaryTl = {};
|
|
1398
|
+
this.rowDefInstances = {};
|
|
1399
|
+
this.rowDefMap = {};
|
|
1400
|
+
this.rowExpansionActionTl = {};
|
|
1401
|
+
// MEMORY LEAK FIX: Clear dynamic context
|
|
1402
|
+
if (this._dynamicContext) {
|
|
1403
|
+
Object.keys(this._dynamicContext).forEach(key => {
|
|
1404
|
+
delete this._dynamicContext[key];
|
|
1405
|
+
});
|
|
1406
|
+
this._dynamicContext = null;
|
|
1407
|
+
}
|
|
1408
|
+
// MEMORY LEAK FIX: Clear data arrays
|
|
1409
|
+
this._gridData = [];
|
|
1410
|
+
this.items = [];
|
|
1411
|
+
this.selectedItems = [];
|
|
1412
|
+
this.fieldDefs = [];
|
|
1413
|
+
this.fullFieldDefs = [];
|
|
1414
|
+
this.gridData = [];
|
|
1415
|
+
this.__fullData = null;
|
|
1416
|
+
// MEMORY LEAK FIX: Destroy jQuery datatable widget before clearing gridOptions
|
|
1417
|
+
if (this.datagridElement && this.datagridElement.datatable) {
|
|
1418
|
+
try {
|
|
1419
|
+
this.datagridElement.datatable('destroy');
|
|
1420
|
+
}
|
|
1421
|
+
catch (e) {
|
|
1422
|
+
// Ignore errors during destroy
|
|
1423
|
+
}
|
|
1424
|
+
}
|
|
1425
|
+
// MEMORY LEAK FIX: Clear gridOptions to release all function closures and data
|
|
1426
|
+
// gridOptions holds many closures that capture 'this' and prevent GC
|
|
1427
|
+
if (this.gridOptions) {
|
|
1428
|
+
// Clear data array
|
|
1429
|
+
if (this.gridOptions.data) {
|
|
1430
|
+
this.gridOptions.data = [];
|
|
1431
|
+
}
|
|
1432
|
+
// Clear column definitions
|
|
1433
|
+
if (this.gridOptions.colDefs) {
|
|
1434
|
+
this.gridOptions.colDefs = [];
|
|
1435
|
+
}
|
|
1436
|
+
// Clear row actions
|
|
1437
|
+
if (this.gridOptions.rowActions) {
|
|
1438
|
+
this.gridOptions.rowActions = [];
|
|
1439
|
+
}
|
|
1440
|
+
// Clear header config
|
|
1441
|
+
if (this.gridOptions.headerConfig) {
|
|
1442
|
+
this.gridOptions.headerConfig = [];
|
|
1443
|
+
}
|
|
1444
|
+
// Nullify all function references to break closures
|
|
1445
|
+
Object.keys(this.gridOptions).forEach(key => {
|
|
1446
|
+
if (typeof this.gridOptions[key] === 'function') {
|
|
1447
|
+
this.gridOptions[key] = null;
|
|
1448
|
+
}
|
|
1449
|
+
});
|
|
1337
1450
|
}
|
|
1451
|
+
// MEMORY LEAK FIX: Clear other data structures
|
|
1452
|
+
this.columns = {};
|
|
1453
|
+
this.formfields = {};
|
|
1454
|
+
this.rowFilter = {};
|
|
1455
|
+
this.actions = [];
|
|
1456
|
+
this._actions = { header: [], footer: [] };
|
|
1457
|
+
this.exportOptions = [];
|
|
1458
|
+
this.headerConfig = [];
|
|
1459
|
+
this.rowActions = [];
|
|
1460
|
+
// MEMORY LEAK FIX: Clear all @ContentChildren QueryLists holding template references
|
|
1461
|
+
// These QueryLists hold TemplateRef instances that create circular references to the parent LView
|
|
1462
|
+
if (this.rowActionTmpl) {
|
|
1463
|
+
this.rowActionTmpl.reset([]);
|
|
1464
|
+
}
|
|
1465
|
+
if (this.filterTmpl) {
|
|
1466
|
+
this.filterTmpl.reset([]);
|
|
1467
|
+
}
|
|
1468
|
+
if (this.inlineWidgetTmpl) {
|
|
1469
|
+
this.inlineWidgetTmpl.reset([]);
|
|
1470
|
+
}
|
|
1471
|
+
if (this.inlineWidgetNewTmpl) {
|
|
1472
|
+
this.inlineWidgetNewTmpl.reset([]);
|
|
1473
|
+
}
|
|
1474
|
+
if (this.customExprTmpl) {
|
|
1475
|
+
this.customExprTmpl.reset([]);
|
|
1476
|
+
}
|
|
1477
|
+
if (this.rowExpansionActionTmpl) {
|
|
1478
|
+
this.rowExpansionActionTmpl.reset([]);
|
|
1479
|
+
}
|
|
1480
|
+
// MEMORY LEAK FIX: Clear @ContentChild template reference
|
|
1481
|
+
this.rowExpansionTmpl = null;
|
|
1482
|
+
// MEMORY LEAK FIX: Complete and clear subjects
|
|
1483
|
+
if (this.selectedItemChange) {
|
|
1484
|
+
this.selectedItemChange.complete();
|
|
1485
|
+
this.selectedItemChange = null;
|
|
1486
|
+
}
|
|
1487
|
+
// MEMORY LEAK FIX: Clear ViewChild references
|
|
1488
|
+
this.dataNavigator = null;
|
|
1489
|
+
this._tableElement = null;
|
|
1490
|
+
// console.log("table component destroyed");
|
|
1338
1491
|
super.ngOnDestroy();
|
|
1339
1492
|
}
|
|
1340
1493
|
addRowIndex(row) {
|
|
@@ -1405,6 +1558,9 @@
|
|
|
1405
1558
|
if (!key.endsWith('_filter') && ((key.endsWith('_new') && newRow) || (!key.endsWith('_new') && !newRow))) {
|
|
1406
1559
|
ctrls[key].setValue('');
|
|
1407
1560
|
this.resetFormControl(ctrls[key]);
|
|
1561
|
+
// MEMORY LEAK FIX: Clear validators to release references
|
|
1562
|
+
ctrls[key].clearValidators();
|
|
1563
|
+
ctrls[key].clearAsyncValidators();
|
|
1408
1564
|
}
|
|
1409
1565
|
});
|
|
1410
1566
|
}
|
|
@@ -1724,7 +1880,14 @@
|
|
|
1724
1880
|
defaultFieldDefs.forEach(col => {
|
|
1725
1881
|
this.columns[col.field] = col;
|
|
1726
1882
|
});
|
|
1727
|
-
|
|
1883
|
+
// Note: Errors in beforedatarender should not prevent table rendering
|
|
1884
|
+
try {
|
|
1885
|
+
this.invokeEventCallback('beforedatarender', { $data: data, $columns: this.columns, data: data, columns: this.columns });
|
|
1886
|
+
}
|
|
1887
|
+
catch (error) {
|
|
1888
|
+
// Log error but continue with rendering - beforedatarender errors should not block table rendering
|
|
1889
|
+
console.warn('Error in beforedatarender event callback, continuing with table rendering:', error);
|
|
1890
|
+
}
|
|
1728
1891
|
defaultFieldDefs = [];
|
|
1729
1892
|
// Apply the changes made by the user
|
|
1730
1893
|
lodashEs.forEach(this.columns, val => {
|
|
@@ -1763,23 +1926,30 @@
|
|
|
1763
1926
|
return sortExp || '';
|
|
1764
1927
|
}
|
|
1765
1928
|
onPropertyChange(key, nv, ov) {
|
|
1929
|
+
// Guard against property changes after component destruction
|
|
1930
|
+
if (this.isDestroyed) {
|
|
1931
|
+
return;
|
|
1932
|
+
}
|
|
1766
1933
|
let enableNewRow;
|
|
1767
1934
|
switch (key) {
|
|
1768
1935
|
case 'datasource':
|
|
1769
1936
|
// Fix for [WMS-23653] when startUpdate is false (request on page load property is unchecked),
|
|
1770
1937
|
// then set status msg as "No data found"
|
|
1771
|
-
if (this.allowpagesizechange) {
|
|
1938
|
+
if (this.allowpagesizechange && this.datasource) {
|
|
1772
1939
|
this.datasource.maxResults = this.pagesize || this.datasource.maxResults;
|
|
1773
1940
|
}
|
|
1774
|
-
if (nv.startUpdate === false) {
|
|
1941
|
+
if (nv && nv.startUpdate === false) {
|
|
1775
1942
|
this.variableInflight = false;
|
|
1776
1943
|
this.callDataGridMethod('setStatus', 'nodata', this.nodatamessage);
|
|
1777
1944
|
}
|
|
1778
|
-
if (lodashEs.get(this.datasource, 'category') !== 'wm.Variable') {
|
|
1945
|
+
if (this.datasource && lodashEs.get(this.datasource, 'category') !== 'wm.Variable') {
|
|
1779
1946
|
this.headerselectall = false;
|
|
1780
1947
|
this.setDataGridOption("headerselectall", false);
|
|
1781
1948
|
}
|
|
1782
|
-
|
|
1949
|
+
// Process dataset when datasource is set, especially if dataset was previously skipped
|
|
1950
|
+
if (this.datasource && this.dataset !== undefined) {
|
|
1951
|
+
this.watchVariableDataSet(this.dataset);
|
|
1952
|
+
}
|
|
1783
1953
|
this.onDataSourceChange();
|
|
1784
1954
|
break;
|
|
1785
1955
|
case 'dataset':
|
|
@@ -1787,6 +1957,12 @@
|
|
|
1787
1957
|
this.gridOptions.setIsNextPageData(false);
|
|
1788
1958
|
}
|
|
1789
1959
|
if (this.binddatasource && !this.datasource) {
|
|
1960
|
+
// If datasource is not set yet, clear loading state and show no data
|
|
1961
|
+
// This prevents tables from being stuck in loading state
|
|
1962
|
+
if (this.variableInflight) {
|
|
1963
|
+
this.variableInflight = false;
|
|
1964
|
+
this.callDataGridMethod('setStatus', 'nodata', this.nodatamessage);
|
|
1965
|
+
}
|
|
1790
1966
|
return;
|
|
1791
1967
|
}
|
|
1792
1968
|
// if table is inside list then table dataset will be set as "item.XXX" and there is no datasource.
|
|
@@ -1890,9 +2066,11 @@
|
|
|
1890
2066
|
this.allowpagesizechange = nv;
|
|
1891
2067
|
break;
|
|
1892
2068
|
case 'pagesizeoptions':
|
|
1893
|
-
this.
|
|
1894
|
-
this.pagesizeoptions = nv;
|
|
1895
|
-
this.
|
|
2069
|
+
this.prevPagesizeoptions = this.sanitizeCommaSeparatedIntegers(ov);
|
|
2070
|
+
this.gridOptions.pagesizeoptions = this.sanitizeCommaSeparatedIntegers(nv);
|
|
2071
|
+
this.pagesizeoptions = this.sanitizeCommaSeparatedIntegers(nv);
|
|
2072
|
+
if (this.allowpagesizechange)
|
|
2073
|
+
this.setDefaultPageSize(nv);
|
|
1896
2074
|
break;
|
|
1897
2075
|
case 'multiselecttitle':
|
|
1898
2076
|
this.setDataGridOption('multiselecttitle', nv);
|
|
@@ -1936,12 +2114,41 @@
|
|
|
1936
2114
|
this.pagesize = nv;
|
|
1937
2115
|
}
|
|
1938
2116
|
this.updatedPageSize = nv;
|
|
2117
|
+
if (this.isPageSizeOptionsChanged()) {
|
|
2118
|
+
this.dataNavigator.defaultPageSizeOptions = this.pagesizeoptions?.split(',').map(Number).sort((a, b) => a - b) || [];
|
|
2119
|
+
this.dataNavigator.pageSizeOptions = [...this.dataNavigator.defaultPageSizeOptions];
|
|
2120
|
+
}
|
|
1939
2121
|
}
|
|
1940
2122
|
this.dataNavigator.options = {
|
|
1941
2123
|
maxResults: nv
|
|
1942
2124
|
};
|
|
1943
2125
|
this.dataNavigator.widget.maxResults = nv;
|
|
1944
2126
|
this.dataNavigator.maxResults = nv;
|
|
2127
|
+
if (this.datasource) {
|
|
2128
|
+
this.datasource.maxResults = this.pagesize || this.datasource.maxResults;
|
|
2129
|
+
}
|
|
2130
|
+
}
|
|
2131
|
+
isPageSizeOptionsChanged() {
|
|
2132
|
+
return !lodashEs.isEqual(this.prevPagesizeoptions, this.pagesizeoptions);
|
|
2133
|
+
}
|
|
2134
|
+
selectPageSize(pagesize) {
|
|
2135
|
+
if (!this.allowpagesizechange && !pagesize)
|
|
2136
|
+
return;
|
|
2137
|
+
if (pagesize < this.dataNavigator.pageSizeOptions[0] || pagesize > this.dataNavigator.pageSizeOptions[this.dataNavigator.pageSizeOptions.length - 1]
|
|
2138
|
+
|| !this.dataNavigator.pageSizeOptions.includes(Number(pagesize))) {
|
|
2139
|
+
pagesize = this.dataNavigator.pageSizeOptions[0];
|
|
2140
|
+
}
|
|
2141
|
+
this.dataNavigator.onPageSizeChange(undefined, pagesize);
|
|
2142
|
+
}
|
|
2143
|
+
sanitizeCommaSeparatedIntegers(input) {
|
|
2144
|
+
if (!input)
|
|
2145
|
+
return "";
|
|
2146
|
+
const uniqueNumbers = Array.from(new Set(input
|
|
2147
|
+
.split(",")
|
|
2148
|
+
.map(v => v.trim())
|
|
2149
|
+
.filter(v => /^-?\d+$/.test(v))
|
|
2150
|
+
.map(v => Math.abs(parseInt(v, 10)))));
|
|
2151
|
+
return uniqueNumbers.join(",");
|
|
1945
2152
|
}
|
|
1946
2153
|
onDataSourceChange() {
|
|
1947
2154
|
this.fieldDefs.forEach(col => {
|
|
@@ -2467,7 +2674,7 @@
|
|
|
2467
2674
|
this.updateVariable(response, options.callBack);
|
|
2468
2675
|
}
|
|
2469
2676
|
else if (!this.table.datasource.execute(i2.DataSource.Operation.IS_API_AWARE)) {
|
|
2470
|
-
this.table.initiateSelectItem('current', response, undefined,
|
|
2677
|
+
this.table.initiateSelectItem('current', response, undefined, this.table.datasource.category === 'wm.Variable', options.callBack);
|
|
2471
2678
|
}
|
|
2472
2679
|
i2.triggerFn(options.success, response);
|
|
2473
2680
|
this.table.invokeEventCallback('rowupdate', { $event: options.event, $data: response, row: response });
|
|
@@ -2717,6 +2924,12 @@
|
|
|
2717
2924
|
this.table.callDataGridMethod('cancelEdit', $row);
|
|
2718
2925
|
}
|
|
2719
2926
|
}
|
|
2927
|
+
ngOnDestroy() {
|
|
2928
|
+
// MEMORY LEAK FIX: Clear all references
|
|
2929
|
+
this.table = null;
|
|
2930
|
+
this.dialogService = null;
|
|
2931
|
+
this.app = null;
|
|
2932
|
+
}
|
|
2720
2933
|
static { this.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0__namespace, type: TableCUDDirective, deps: [{ token: TableComponent, self: true }, { token: i2__namespace.AbstractDialogService }, { token: i2__namespace.App }], target: i0__namespace.ɵɵFactoryTarget.Directive }); }
|
|
2721
2934
|
static { this.ɵdir = i0__namespace.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: TableCUDDirective, isStandalone: true, selector: "[wmTableCUD]", ngImport: i0__namespace }); }
|
|
2722
2935
|
}
|
|
@@ -3029,6 +3242,12 @@
|
|
|
3029
3242
|
// Function that checks if a given string is a valid date and returns the timestamp if it is, or NaN if it's not.
|
|
3030
3243
|
parseDateString(dateString) {
|
|
3031
3244
|
const timestamp = Date.parse(dateString);
|
|
3245
|
+
// handling case when string starts with string and end with number
|
|
3246
|
+
const trimmed = dateString.trim();
|
|
3247
|
+
const monthRegex = /\b(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:t(?:ember)?)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\b/i;
|
|
3248
|
+
if (/^[A-Za-z]+/.test(trimmed) && /\d+$/.test(trimmed) && !monthRegex.test(trimmed)) {
|
|
3249
|
+
return NaN;
|
|
3250
|
+
}
|
|
3032
3251
|
if (!isNaN(timestamp)) {
|
|
3033
3252
|
return timestamp;
|
|
3034
3253
|
}
|
|
@@ -3043,7 +3262,7 @@
|
|
|
3043
3262
|
const fieldValue = lodashEs.get(lodashEs.find(data, sortObj.field), sortObj.field);
|
|
3044
3263
|
const isValidDateString = typeof fieldValue === 'string' ? this.parseDateString(fieldValue) : NaN;
|
|
3045
3264
|
if (!isNaN(isValidDateString)) { // if the field is a date string
|
|
3046
|
-
data = lodashEs.orderBy(data, [(item) => this.parseDateString(item
|
|
3265
|
+
data = lodashEs.orderBy(data, [(item) => this.parseDateString(lodashEs.get(item, sortObj.field))], [sortObj.direction]);
|
|
3047
3266
|
}
|
|
3048
3267
|
else if (sortObj.sortBy ? this.table.columns[sortObj.sortBy]?.caseinsensitive : this.table.columns[sortObj.field]?.caseinsensitive) {
|
|
3049
3268
|
//Fix for [WMS-27505]: Added case-insensitive sorting so that uppercase and lowercase letters are treated the same when sorting.
|
|
@@ -3405,6 +3624,10 @@
|
|
|
3405
3624
|
condition: logicalOp
|
|
3406
3625
|
});
|
|
3407
3626
|
}
|
|
3627
|
+
ngOnDestroy() {
|
|
3628
|
+
// MEMORY LEAK FIX: Clear table reference
|
|
3629
|
+
this.table = null;
|
|
3630
|
+
}
|
|
3408
3631
|
static { this.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0__namespace, type: TableFilterSortDirective, deps: [{ token: TableComponent, self: true }], target: i0__namespace.ɵɵFactoryTarget.Directive }); }
|
|
3409
3632
|
static { this.ɵdir = i0__namespace.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: TableFilterSortDirective, isStandalone: true, selector: "[wmTableFilterSort]", ngImport: i0__namespace }); }
|
|
3410
3633
|
}
|
|
@@ -3491,6 +3714,13 @@
|
|
|
3491
3714
|
this.buttonDef[key] = nv;
|
|
3492
3715
|
}
|
|
3493
3716
|
}
|
|
3717
|
+
ngOnDestroy() {
|
|
3718
|
+
// MEMORY LEAK FIX: Clear table and buttonDef references
|
|
3719
|
+
this.table = null;
|
|
3720
|
+
this.buttonDef = null;
|
|
3721
|
+
// Call parent ngOnDestroy (BaseComponent has cleanup)
|
|
3722
|
+
super.ngOnDestroy();
|
|
3723
|
+
}
|
|
3494
3724
|
static { this.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0__namespace, type: TableActionDirective, deps: [{ token: i0__namespace.Injector }, { token: TableComponent, optional: true }, { token: 'EXPLICIT_CONTEXT', optional: true }], target: i0__namespace.ɵɵFactoryTarget.Directive }); }
|
|
3495
3725
|
static { this.ɵdir = i0__namespace.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: TableActionDirective, isStandalone: true, selector: "[wmTableAction]", providers: [
|
|
3496
3726
|
i4.provideAsWidgetRef(TableActionDirective)
|
|
@@ -3655,6 +3885,14 @@
|
|
|
3655
3885
|
const fieldName = this.group && this.group.name;
|
|
3656
3886
|
i4.setHeaderConfigForTable(this.table.headerConfig, this.config, fieldName, fieldName ? colIndex : headerIndex);
|
|
3657
3887
|
}
|
|
3888
|
+
ngOnDestroy() {
|
|
3889
|
+
// MEMORY LEAK FIX: Clear table, group, and config references
|
|
3890
|
+
this.table = null;
|
|
3891
|
+
this.group = null;
|
|
3892
|
+
this.config = null;
|
|
3893
|
+
// Call parent ngOnDestroy (BaseComponent has cleanup)
|
|
3894
|
+
super.ngOnDestroy();
|
|
3895
|
+
}
|
|
3658
3896
|
static { this.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0__namespace, type: TableColumnGroupDirective, deps: [{ token: i0__namespace.Injector }, { token: TableColumnGroupDirective, optional: true, skipSelf: true }, { token: TableComponent, optional: true }, { token: 'EXPLICIT_CONTEXT', optional: true }], target: i0__namespace.ɵɵFactoryTarget.Directive }); }
|
|
3659
3897
|
static { this.ɵdir = i0__namespace.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: TableColumnGroupDirective, isStandalone: true, selector: "[wmTableColumnGroup]", providers: [
|
|
3660
3898
|
i4.provideAsWidgetRef(TableColumnGroupDirective)
|
|
@@ -3849,6 +4087,10 @@
|
|
|
3849
4087
|
}
|
|
3850
4088
|
// Remove validators for the inline widget and set form to untouched
|
|
3851
4089
|
removeValidations() {
|
|
4090
|
+
// Guard against component destruction or table/ngform being null
|
|
4091
|
+
if (this.isDestroyed || !this.table || !this.table.ngform) {
|
|
4092
|
+
return;
|
|
4093
|
+
}
|
|
3852
4094
|
this.table.ngform.markAsUntouched();
|
|
3853
4095
|
const control = this.getFormControl();
|
|
3854
4096
|
if (!control) {
|
|
@@ -3860,6 +4102,10 @@
|
|
|
3860
4102
|
}
|
|
3861
4103
|
// Apply default|sync|async|prop validators for QuickEdit new row form control
|
|
3862
4104
|
applyNewRowValidations() {
|
|
4105
|
+
// Guard against component destruction or table/ngform being null
|
|
4106
|
+
if (this.isDestroyed || !this.table || !this.table.ngform) {
|
|
4107
|
+
return;
|
|
4108
|
+
}
|
|
3863
4109
|
if (!this._checkNewEditableRowControl()) {
|
|
3864
4110
|
return;
|
|
3865
4111
|
}
|
|
@@ -3876,22 +4122,37 @@
|
|
|
3876
4122
|
}
|
|
3877
4123
|
// Remove validators for the QuickEdit new row widget and set form to untouched
|
|
3878
4124
|
removeNewRowValidations() {
|
|
4125
|
+
// Guard against component destruction or table/ngform being null
|
|
4126
|
+
if (this.isDestroyed || !this.table || !this.table.ngform) {
|
|
4127
|
+
return;
|
|
4128
|
+
}
|
|
3879
4129
|
this.table.ngform.markAsUntouched();
|
|
3880
4130
|
if (!this._checkNewEditableRowControl()) {
|
|
3881
4131
|
return;
|
|
3882
4132
|
}
|
|
3883
4133
|
const control = this.getFormControl('_new');
|
|
4134
|
+
if (!control) {
|
|
4135
|
+
return;
|
|
4136
|
+
}
|
|
3884
4137
|
control.clearValidators();
|
|
3885
4138
|
control.clearAsyncValidators();
|
|
3886
4139
|
control.updateValueAndValidity();
|
|
3887
4140
|
}
|
|
3888
4141
|
addFormControl(suffix) {
|
|
4142
|
+
// Guard against component destruction or table/ngform being null
|
|
4143
|
+
if (this.isDestroyed || !this.table || !this.table.ngform) {
|
|
4144
|
+
return;
|
|
4145
|
+
}
|
|
3889
4146
|
const ctrlName = suffix ? (this.binding + suffix) : this.binding;
|
|
3890
4147
|
this.table.ngform.addControl(ctrlName, this.table.fb.control(''));
|
|
3891
4148
|
}
|
|
3892
4149
|
getFormControl(suffix) {
|
|
4150
|
+
// Guard against component destruction or table/ngform being null
|
|
4151
|
+
if (this.isDestroyed || !this.table || !this.table.ngform) {
|
|
4152
|
+
return null;
|
|
4153
|
+
}
|
|
3893
4154
|
const ctrlName = suffix ? (this.binding + suffix) : this.binding;
|
|
3894
|
-
return this.table.ngform.controls[ctrlName];
|
|
4155
|
+
return this.table.ngform.controls[ctrlName] || null;
|
|
3895
4156
|
}
|
|
3896
4157
|
_checkNewEditableRowControl() {
|
|
3897
4158
|
return this._isNewEditableRow && this.getFormControl('_new');
|
|
@@ -3965,12 +4226,16 @@
|
|
|
3965
4226
|
}
|
|
3966
4227
|
// On field value change, apply cascading filter and set validation message
|
|
3967
4228
|
onValueChange(val, widget) {
|
|
4229
|
+
// Guard against component destruction or table being null
|
|
4230
|
+
if (this.isDestroyed || !this.table) {
|
|
4231
|
+
return;
|
|
4232
|
+
}
|
|
3968
4233
|
if (val !== null) {
|
|
3969
4234
|
i4.applyFilterOnField(this.table.datasource, this.widget, this.table.fieldDefs, val, {
|
|
3970
4235
|
widget: 'edit-widget-type'
|
|
3971
4236
|
});
|
|
3972
4237
|
}
|
|
3973
|
-
if (this.table.ngform.touched) {
|
|
4238
|
+
if (this.table.ngform && this.table.ngform.touched) {
|
|
3974
4239
|
this.activeControlType = widget;
|
|
3975
4240
|
if (widget === 'inlineInstance') {
|
|
3976
4241
|
this.notifyChanges();
|
|
@@ -4261,6 +4526,83 @@
|
|
|
4261
4526
|
this.table.redraw(true);
|
|
4262
4527
|
}
|
|
4263
4528
|
}
|
|
4529
|
+
ngOnDestroy() {
|
|
4530
|
+
// MEMORY LEAK FIX: Clear ContentChildren QueryLists
|
|
4531
|
+
if (this._filterInstances) {
|
|
4532
|
+
try {
|
|
4533
|
+
this._filterInstances.reset([]);
|
|
4534
|
+
}
|
|
4535
|
+
catch (e) {
|
|
4536
|
+
// Silently handle cleanup errors - QueryList might already be destroyed
|
|
4537
|
+
}
|
|
4538
|
+
}
|
|
4539
|
+
if (this._inlineInstances) {
|
|
4540
|
+
try {
|
|
4541
|
+
this._inlineInstances.reset([]);
|
|
4542
|
+
}
|
|
4543
|
+
catch (e) {
|
|
4544
|
+
// Silently handle cleanup errors - QueryList might already be destroyed
|
|
4545
|
+
}
|
|
4546
|
+
}
|
|
4547
|
+
if (this._inlineInstancesNew) {
|
|
4548
|
+
try {
|
|
4549
|
+
this._inlineInstancesNew.reset([]);
|
|
4550
|
+
}
|
|
4551
|
+
catch (e) {
|
|
4552
|
+
// Silently handle cleanup errors - QueryList might already be destroyed
|
|
4553
|
+
}
|
|
4554
|
+
}
|
|
4555
|
+
// MEMORY LEAK FIX: Clear all widget instance references
|
|
4556
|
+
this.filterInstance = null;
|
|
4557
|
+
this.inlineInstance = null;
|
|
4558
|
+
this.inlineInstanceNew = null;
|
|
4559
|
+
// MEMORY LEAK FIX: Clear template references
|
|
4560
|
+
this.customExprTmpl = null;
|
|
4561
|
+
this.inlineWidthTempRef = null;
|
|
4562
|
+
this.filterTemplateRef = null;
|
|
4563
|
+
// MEMORY LEAK FIX: Clear dataset references
|
|
4564
|
+
this._filterDataSet = null;
|
|
4565
|
+
this.dataset = null;
|
|
4566
|
+
this._dataoptions = null;
|
|
4567
|
+
this._datasource = null;
|
|
4568
|
+
// MEMORY LEAK FIX: Clear validation objects
|
|
4569
|
+
if (this.fieldValidations) {
|
|
4570
|
+
try {
|
|
4571
|
+
this.fieldValidations.destroy();
|
|
4572
|
+
}
|
|
4573
|
+
catch (e) {
|
|
4574
|
+
// Silently handle cleanup errors
|
|
4575
|
+
}
|
|
4576
|
+
this.fieldValidations = null;
|
|
4577
|
+
}
|
|
4578
|
+
if (this.fieldValidations_new) {
|
|
4579
|
+
try {
|
|
4580
|
+
this.fieldValidations_new.destroy();
|
|
4581
|
+
}
|
|
4582
|
+
catch (e) {
|
|
4583
|
+
// Silently handle cleanup errors
|
|
4584
|
+
}
|
|
4585
|
+
this.fieldValidations_new = null;
|
|
4586
|
+
}
|
|
4587
|
+
this.syncValidators = [];
|
|
4588
|
+
this.asyncValidators = [];
|
|
4589
|
+
// MEMORY LEAK FIX: Clear filter control reference
|
|
4590
|
+
this.filterControl = null;
|
|
4591
|
+
// MEMORY LEAK FIX: Clear notify fields array
|
|
4592
|
+
if (this.notifyForFields) {
|
|
4593
|
+
this.notifyForFields = [];
|
|
4594
|
+
}
|
|
4595
|
+
// MEMORY LEAK FIX: Clear observe fields array
|
|
4596
|
+
if (this.observeOnFields) {
|
|
4597
|
+
this.observeOnFields = [];
|
|
4598
|
+
}
|
|
4599
|
+
// MEMORY LEAK FIX: Clear table and group references
|
|
4600
|
+
// Note: These are injected dependencies, but clearing helps GC
|
|
4601
|
+
this.table = null;
|
|
4602
|
+
this.group = null;
|
|
4603
|
+
// Call parent ngOnDestroy
|
|
4604
|
+
super.ngOnDestroy();
|
|
4605
|
+
}
|
|
4264
4606
|
static { this.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0__namespace, type: TableColumnDirective, deps: [{ token: i0__namespace.Injector }, { token: i2__namespace.AppDefaults }, { token: TableComponent, optional: true }, { token: TableColumnGroupDirective, optional: true }, { token: 'filterdataset.bind', attribute: true }, { token: 'dataset.bind', attribute: true }, { token: 'EXPLICIT_CONTEXT', optional: true }], target: i0__namespace.ɵɵFactoryTarget.Directive }); }
|
|
4265
4607
|
static { this.ɵdir = i0__namespace.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: TableColumnDirective, isStandalone: true, selector: "[wmTableColumn]", providers: [
|
|
4266
4608
|
i4.provideAsWidgetRef(TableColumnDirective)
|
|
@@ -4355,6 +4697,13 @@
|
|
|
4355
4697
|
this.config.content = this.content;
|
|
4356
4698
|
}
|
|
4357
4699
|
}
|
|
4700
|
+
ngOnDestroy() {
|
|
4701
|
+
// MEMORY LEAK FIX: Clear table and config references
|
|
4702
|
+
this.table = null;
|
|
4703
|
+
this.config = null;
|
|
4704
|
+
// Call parent ngOnDestroy (BaseComponent has cleanup)
|
|
4705
|
+
super.ngOnDestroy();
|
|
4706
|
+
}
|
|
4358
4707
|
static { this.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0__namespace, type: TableRowDirective, deps: [{ token: i0__namespace.Injector }, { token: TableComponent, optional: true, skipSelf: true }, { token: 'EXPLICIT_CONTEXT', optional: true }], target: i0__namespace.ɵɵFactoryTarget.Directive }); }
|
|
4359
4708
|
static { this.ɵdir = i0__namespace.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: TableRowDirective, isStandalone: true, selector: "[wmTableRow]", providers: [
|
|
4360
4709
|
i4.provideAsWidgetRef(TableRowDirective)
|
|
@@ -4436,6 +4785,13 @@
|
|
|
4436
4785
|
this.populateAction();
|
|
4437
4786
|
this.table.registerRowActions(this.buttonDef);
|
|
4438
4787
|
}
|
|
4788
|
+
ngOnDestroy() {
|
|
4789
|
+
// MEMORY LEAK FIX: Clear table reference and button definition
|
|
4790
|
+
this.table = null;
|
|
4791
|
+
this.buttonDef = null;
|
|
4792
|
+
// Call parent ngOnDestroy (BaseComponent has cleanup)
|
|
4793
|
+
super.ngOnDestroy();
|
|
4794
|
+
}
|
|
4439
4795
|
static { this.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0__namespace, type: TableRowActionDirective, deps: [{ token: i0__namespace.Injector }, { token: TableComponent, optional: true }, { token: i4.Context, self: true }, { token: 'EXPLICIT_CONTEXT', optional: true }], target: i0__namespace.ɵɵFactoryTarget.Directive }); }
|
|
4440
4796
|
static { this.ɵdir = i0__namespace.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: TableRowActionDirective, isStandalone: true, selector: "[wmTableRowAction]", providers: [
|
|
4441
4797
|
i4.provideAsWidgetRef(TableRowActionDirective),
|
|
@@ -51,6 +51,13 @@ export class TableActionDirective extends BaseComponent {
|
|
|
51
51
|
this.buttonDef[key] = nv;
|
|
52
52
|
}
|
|
53
53
|
}
|
|
54
|
+
ngOnDestroy() {
|
|
55
|
+
// MEMORY LEAK FIX: Clear table and buttonDef references
|
|
56
|
+
this.table = null;
|
|
57
|
+
this.buttonDef = null;
|
|
58
|
+
// Call parent ngOnDestroy (BaseComponent has cleanup)
|
|
59
|
+
super.ngOnDestroy();
|
|
60
|
+
}
|
|
54
61
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TableActionDirective, deps: [{ token: i0.Injector }, { token: i1.TableComponent, optional: true }, { token: 'EXPLICIT_CONTEXT', optional: true }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
55
62
|
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: TableActionDirective, isStandalone: true, selector: "[wmTableAction]", providers: [
|
|
56
63
|
provideAsWidgetRef(TableActionDirective)
|
|
@@ -73,4 +80,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
73
80
|
}, {
|
|
74
81
|
type: Optional
|
|
75
82
|
}] }] });
|
|
76
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
83
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtYWN0aW9uLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvd2lkZ2V0cy9kYXRhL3RhYmxlL3NyYy90YWJsZS1hY3Rpb24vdGFibGUtYWN0aW9uLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQXFCLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUV2RixPQUFPLEVBQUUsYUFBYSxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFeEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNwRCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sV0FBVyxDQUFDOzs7QUFFdEMsTUFBTSxhQUFhLEdBQUcsRUFBQyxVQUFVLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBQyxDQUFDO0FBU3JFLE1BQU0sT0FBTyxvQkFBcUIsU0FBUSxhQUFhO2FBQzVDLG9CQUFlLEdBQUcsYUFBYSxFQUFFLEFBQWxCLENBQW1CO0lBd0J6QyxZQUFZLEdBQWEsRUFBcUIsS0FBcUIsRUFBMEMsZUFBb0I7UUFDN0gsS0FBSyxDQUFDLEdBQUcsRUFBRSxhQUFhLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFERCxVQUFLLEdBQUwsS0FBSyxDQUFnQjtJQUVuRSxDQUFDO0lBRUQsY0FBYztRQUNWLElBQUksQ0FBQyxTQUFTLEdBQUc7WUFDYixHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7WUFDYixXQUFXLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksRUFBRTtZQUN2RCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ3ZCLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxJQUFJLEVBQUU7WUFDL0IsS0FBSyxFQUFFLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSztZQUMxRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQzdCLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztZQUM3QixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNmLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixVQUFVLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUMvQixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDekIsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLElBQUksRUFBRTtZQUN6QixnQkFBZ0IsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLElBQUksRUFBRTtZQUM3QyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLElBQUksRUFBRTtTQUNoRCxDQUFDO1FBQ0YsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztJQUNsQyxDQUFDO0lBRUQsUUFBUTtRQUNKLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsRUFBRTtRQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDMUIsT0FBTztRQUNYLENBQUM7UUFFRCxJQUFJLEdBQUcsS0FBSyxjQUFjLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDcEMsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUM3QixDQUFDO0lBQ0wsQ0FBQztJQUVELFdBQVc7UUFDUCx3REFBd0Q7UUFDeEQsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDbEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFFdEIsc0RBQXNEO1FBQ3RELEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN4QixDQUFDOytHQTlFUSxvQkFBb0Isd0ZBeUJnRCxrQkFBa0I7bUdBekJ0RixvQkFBb0IsOERBSmxCO1lBQ1Asa0JBQWtCLENBQUMsb0JBQW9CLENBQUM7U0FDM0M7OzRGQUVRLG9CQUFvQjtrQkFQaEMsU0FBUzttQkFBQztvQkFDVCxVQUFVLEVBQUUsSUFBSTtvQkFDZCxRQUFRLEVBQUUsaUJBQWlCO29CQUMzQixTQUFTLEVBQUU7d0JBQ1Asa0JBQWtCLHNCQUFzQjtxQkFDM0M7aUJBQ0o7OzBCQTBCK0IsUUFBUTs7MEJBQWtDLE1BQU07MkJBQUMsa0JBQWtCOzswQkFBRyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtEaXJlY3RpdmUsIEluamVjdCwgSW5qZWN0b3IsIE9uRGVzdHJveSwgT25Jbml0LCBPcHRpb25hbH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEJhc2VDb21wb25lbnQsIHByb3ZpZGVBc1dpZGdldFJlZiB9IGZyb20gJ0B3bS9jb21wb25lbnRzL2Jhc2UnO1xuXG5pbXBvcnQgeyByZWdpc3RlclByb3BzIH0gZnJvbSAnLi90YWJsZS1hY3Rpb24ucHJvcHMnO1xuaW1wb3J0IHsgVGFibGVDb21wb25lbnQgfSBmcm9tICcuLi90YWJsZS5jb21wb25lbnQnO1xuaW1wb3J0IHtpc1VuZGVmaW5lZH0gZnJvbSBcImxvZGFzaC1lc1wiO1xuXG5jb25zdCBXSURHRVRfQ09ORklHID0ge3dpZGdldFR5cGU6ICd3bS10YWJsZS1hY3Rpb24nLCBob3N0Q2xhc3M6ICcnfTtcblxuQERpcmVjdGl2ZSh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgc2VsZWN0b3I6ICdbd21UYWJsZUFjdGlvbl0nLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICBwcm92aWRlQXNXaWRnZXRSZWYoVGFibGVBY3Rpb25EaXJlY3RpdmUpXG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBUYWJsZUFjdGlvbkRpcmVjdGl2ZSBleHRlbmRzIEJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gICAgc3RhdGljIGluaXRpYWxpemVQcm9wcyA9IHJlZ2lzdGVyUHJvcHMoKTtcblxuICAgIGFjY2Vzc3JvbGVzO1xuICAgIGFjdGlvbjtcbiAgICBjYXB0aW9uO1xuICAgIGNsYXNzO1xuICAgIGRpc2FibGVkO1xuICAgIGRpc3BsYXlOYW1lO1xuICAgIGljb247XG4gICAgaWNvbmNsYXNzO1xuICAgIHBvc2l0aW9uO1xuICAgIHNob3J0Y3V0a2V5O1xuICAgIHNob3c7XG4gICAgdGFiaW5kZXg7XG4gICAgdGl0bGU7XG4gICAga2V5O1xuICAgIGh5cGVybGluaztcbiAgICB0YXJnZXQ7XG4gICAgYnV0dG9uRGVmO1xuICAgIGNvbmRpdGlvbmFsY2xhc3M7XG4gICAgY29uZGl0aW9uYWxzdHlsZTtcblxuICAgIHByaXZhdGUgX3Byb3BzSW5pdGlhbGl6ZWQ6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3Rvcihpbmo6IEluamVjdG9yLCBAT3B0aW9uYWwoKSBwdWJsaWMgdGFibGU6IFRhYmxlQ29tcG9uZW50LCBASW5qZWN0KCdFWFBMSUNJVF9DT05URVhUJykgQE9wdGlvbmFsKCkgZXhwbGljaXRDb250ZXh0OiBhbnkpIHtcbiAgICAgICAgc3VwZXIoaW5qLCBXSURHRVRfQ09ORklHLCBleHBsaWNpdENvbnRleHQpO1xuICAgIH1cblxuICAgIHBvcHVsYXRlQWN0aW9uKCkge1xuICAgICAgICB0aGlzLmJ1dHRvbkRlZiA9IHtcbiAgICAgICAgICAgIGtleTogdGhpcy5rZXksXG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogdGhpc1snZGlzcGxheS1uYW1lJ10gfHwgdGhpcy5jYXB0aW9uIHx8ICcnLFxuICAgICAgICAgICAgc2hvdzogdGhpcy5zaG93LFxuICAgICAgICAgICAgY2xhc3M6IHRoaXMuY2xhc3MgfHwgJycsXG4gICAgICAgICAgICBpY29uY2xhc3M6IHRoaXMuaWNvbmNsYXNzIHx8ICcnLFxuICAgICAgICAgICAgdGl0bGU6IGlzVW5kZWZpbmVkKHRoaXMudGl0bGUpID8gKHRoaXNbJ2Rpc3BsYXktbmFtZSddIHx8ICcnKSA6IHRoaXMudGl0bGUsXG4gICAgICAgICAgICBhY3Rpb246IHRoaXMuYWN0aW9uLFxuICAgICAgICAgICAgYWNjZXNzcm9sZXM6IHRoaXMuYWNjZXNzcm9sZXMsXG4gICAgICAgICAgICBzaG9ydGN1dGtleTogdGhpcy5zaG9ydGN1dGtleSxcbiAgICAgICAgICAgIGRpc2FibGVkOiB0aGlzLmRpc2FibGVkLFxuICAgICAgICAgICAgdGFiaW5kZXg6IHRoaXMudGFiaW5kZXgsXG4gICAgICAgICAgICBpY29uOiB0aGlzLmljb24sXG4gICAgICAgICAgICBwb3NpdGlvbjogdGhpcy5wb3NpdGlvbixcbiAgICAgICAgICAgIHdpZGdldFR5cGU6IHRoaXNbJ3dpZGdldC10eXBlJ10sXG4gICAgICAgICAgICBoeXBlcmxpbms6IHRoaXMuaHlwZXJsaW5rLFxuICAgICAgICAgICAgdGFyZ2V0OiB0aGlzLnRhcmdldCB8fCAnJyxcbiAgICAgICAgICAgIGNvbmRpdGlvbmFsY2xhc3M6IHRoaXMuY29uZGl0aW9uYWxjbGFzcyB8fCAnJyxcbiAgICAgICAgICAgIGNvbmRpdGlvbmFsc3R5bGU6IHRoaXMuY29uZGl0aW9uYWxzdHlsZSB8fCB7fVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9wcm9wc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICAgICAgdGhpcy5wb3B1bGF0ZUFjdGlvbigpO1xuICAgICAgICB0aGlzLnRhYmxlLnJlZ2lzdGVyQWN0aW9ucyh0aGlzLmJ1dHRvbkRlZik7XG4gICAgfVxuXG4gICAgb25Qcm9wZXJ0eUNoYW5nZShrZXksIG52KSB7XG4gICAgICAgIGlmICghdGhpcy5fcHJvcHNJbml0aWFsaXplZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGtleSA9PT0gJ2Rpc3BsYXktbmFtZScpIHtcbiAgICAgICAgICAgIHRoaXMuYnV0dG9uRGVmLmRpc3BsYXlOYW1lID0gbnY7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmJ1dHRvbkRlZltrZXldID0gbnY7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgLy8gTUVNT1JZIExFQUsgRklYOiBDbGVhciB0YWJsZSBhbmQgYnV0dG9uRGVmIHJlZmVyZW5jZXNcbiAgICAgICAgdGhpcy50YWJsZSA9IG51bGw7XG4gICAgICAgIHRoaXMuYnV0dG9uRGVmID0gbnVsbDtcblxuICAgICAgICAvLyBDYWxsIHBhcmVudCBuZ09uRGVzdHJveSAoQmFzZUNvbXBvbmVudCBoYXMgY2xlYW51cClcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICB9XG59Il19
|