@adaptabletools/adaptable 19.0.0 → 19.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/README.md +1 -2
  2. package/base.css +1 -1
  3. package/base.css.map +1 -1
  4. package/index.css +1 -1
  5. package/index.css.map +1 -1
  6. package/package.json +1 -1
  7. package/src/AdaptableInterfaces/IAdaptable.d.ts +1 -1
  8. package/src/AdaptableOptions/ActionRowOptions.d.ts +2 -2
  9. package/src/AdaptableOptions/DataChangeHistoryOptions.d.ts +2 -2
  10. package/src/AdaptableOptions/UserInterfaceOptions.d.ts +6 -2
  11. package/src/Api/AlertApi.d.ts +8 -0
  12. package/src/Api/ColumnApi.d.ts +18 -15
  13. package/src/Api/CustomSortApi.d.ts +8 -0
  14. package/src/Api/DataChangeHistoryApi.d.ts +5 -0
  15. package/src/Api/Events/GridSorted.d.ts +3 -3
  16. package/src/Api/Events/LiveDataChanged.d.ts +1 -1
  17. package/src/Api/FlashingCellApi.d.ts +25 -12
  18. package/src/Api/FormatColumnApi.d.ts +8 -0
  19. package/src/Api/GridApi.d.ts +53 -2
  20. package/src/Api/Implementation/AlertApiImpl.d.ts +2 -0
  21. package/src/Api/Implementation/AlertApiImpl.js +6 -0
  22. package/src/Api/Implementation/ColumnApiImpl.d.ts +3 -2
  23. package/src/Api/Implementation/ColumnApiImpl.js +19 -30
  24. package/src/Api/Implementation/CustomSortApiImpl.d.ts +2 -0
  25. package/src/Api/Implementation/CustomSortApiImpl.js +6 -0
  26. package/src/Api/Implementation/DataChangeHistoryApiImpl.d.ts +2 -0
  27. package/src/Api/Implementation/DataChangeHistoryApiImpl.js +5 -0
  28. package/src/Api/Implementation/FlashingCellApiImpl.d.ts +3 -0
  29. package/src/Api/Implementation/FlashingCellApiImpl.js +9 -0
  30. package/src/Api/Implementation/FormatColumnApiImpl.d.ts +2 -0
  31. package/src/Api/Implementation/FormatColumnApiImpl.js +6 -0
  32. package/src/Api/Implementation/GridApiImpl.d.ts +11 -2
  33. package/src/Api/Implementation/GridApiImpl.js +105 -1
  34. package/src/Api/Implementation/ShortcutApiImpl.d.ts +2 -0
  35. package/src/Api/Implementation/ShortcutApiImpl.js +6 -0
  36. package/src/Api/Implementation/StyledColumnApiImpl.d.ts +2 -0
  37. package/src/Api/Implementation/StyledColumnApiImpl.js +6 -0
  38. package/src/Api/Implementation/UserInterfaceApiImpl.d.ts +1 -0
  39. package/src/Api/Implementation/UserInterfaceApiImpl.js +3 -0
  40. package/src/Api/Internal/ActionRowInternalApi.d.ts +1 -1
  41. package/src/Api/Internal/ActionRowInternalApi.js +10 -8
  42. package/src/Api/Internal/ExportInternalApi.d.ts +3 -3
  43. package/src/Api/Internal/ExportInternalApi.js +17 -13
  44. package/src/Api/Internal/GridFilterInternalApi.d.ts +1 -1
  45. package/src/Api/Internal/GridFilterInternalApi.js +5 -2
  46. package/src/Api/ShortcutApi.d.ts +8 -0
  47. package/src/Api/StyledColumnApi.d.ts +8 -0
  48. package/src/Api/UserInterfaceApi.d.ts +6 -2
  49. package/src/PredefinedConfig/Common/AdaptableFormat.d.ts +1 -1
  50. package/src/PredefinedConfig/Common/RowScope.d.ts +1 -1
  51. package/src/Redux/ActionsReducers/SystemRedux.js +3 -8
  52. package/src/Utilities/license/hashing.js +1 -1
  53. package/src/View/Dashboard/DashboardPopup.js +4 -3
  54. package/src/View/GridInfo/GridInfoPopup/GridInfoPopup.js +1 -0
  55. package/src/View/Layout/Wizard/getGridFilterPreview.js +1 -1
  56. package/src/View/Layout/Wizard/sections/ColumnsSection.js +1 -1
  57. package/src/View/Layout/Wizard/sections/GridFilterSection.js +1 -1
  58. package/src/agGrid/ActionColumnRenderer.d.ts +2 -0
  59. package/src/agGrid/ActionColumnRenderer.js +29 -3
  60. package/src/agGrid/AdaptableAgGrid.d.ts +1 -1
  61. package/src/agGrid/AdaptableAgGrid.js +22 -8
  62. package/src/agGrid/AgGridAdapter.d.ts +1 -0
  63. package/src/agGrid/AgGridAdapter.js +12 -0
  64. package/src/agGrid/AgGridColumnAdapter.d.ts +2 -0
  65. package/src/agGrid/AgGridColumnAdapter.js +26 -13
  66. package/src/agGrid/PercentBarRenderer.js +1 -1
  67. package/src/agGrid/defaultAdaptableOptions.js +1 -0
  68. package/src/env.js +2 -2
  69. package/src/metamodel/adaptable.metamodel.js +1 -1
  70. package/src/types.d.ts +2 -2
  71. package/tsconfig.esm.tsbuildinfo +1 -1
  72. package/src/agGrid/CheckboxRenderer.d.ts +0 -16
  73. package/src/agGrid/CheckboxRenderer.js +0 -89
@@ -491,7 +491,22 @@ export class GridApiImpl extends ApiBase {
491
491
  if (gridCell.column.readOnly) {
492
492
  return false;
493
493
  }
494
- return this.adaptable.isCellEditable(gridCell.rowNode, this.adaptable.getAgGridColumnForColumnId(gridCell.column.columnId));
494
+ if (gridCell.rowNode && this.isSummaryNode(gridCell.rowNode)) {
495
+ return false;
496
+ }
497
+ const cellEditableFn = this.getEditOptions().isCellEditable;
498
+ if (cellEditableFn) {
499
+ const cellEditableContext = Object.assign({ gridCell }, this.getAdaptableApi().internalApi.buildBaseContext());
500
+ return cellEditableFn(cellEditableContext);
501
+ }
502
+ return true;
503
+ }
504
+ isCellEdited(gridCell) {
505
+ if (!gridCell) {
506
+ return false;
507
+ }
508
+ const cellDataChangedInfo = this.getDataChangeHistoryApi().getDataChangeForGridCell(gridCell);
509
+ return cellDataChangedInfo != null;
495
510
  }
496
511
  isEveryCellEditable(gridCells) {
497
512
  for (let gridCell of gridCells) {
@@ -504,6 +519,9 @@ export class GridApiImpl extends ApiBase {
504
519
  getRowCount() {
505
520
  return this.adaptable.getRowCount();
506
521
  }
522
+ getVisibleRowCount() {
523
+ return this.adaptable.getVisibleRowCount();
524
+ }
507
525
  getRowsInViewport() {
508
526
  return this.adaptable.getRowsInViewport();
509
527
  }
@@ -555,4 +573,90 @@ export class GridApiImpl extends ApiBase {
555
573
  getAllAgGridColumns() {
556
574
  return this.adaptable.getAllGridColumns();
557
575
  }
576
+ updateAgGridColumnState(columnState) {
577
+ const columnExists = this.getColumnApi().doesColumnExist(columnState.colId);
578
+ if (!columnExists) {
579
+ this.logWarn(`Column with id ${columnState.colId} does not exist, could NOT update configuration`);
580
+ return;
581
+ }
582
+ const agGridApi = this.adaptable.agGridAdapter.getAgGridApi();
583
+ agGridApi.applyColumnState({
584
+ state: [columnState],
585
+ });
586
+ }
587
+ updateAgGridColumnStates(columnStates) {
588
+ const existingColumnStates = columnStates.filter((cc) => this.getColumnApi().doesColumnExist(cc.colId));
589
+ const notExistingColumnIds = columnStates
590
+ .filter((cc) => !this.getColumnApi().doesColumnExist(cc.colId))
591
+ .map((cc) => cc.colId);
592
+ notExistingColumnIds.forEach((colId) => {
593
+ this.logWarn(`Column with id ${colId} does not exist, could NOT update configuration`);
594
+ });
595
+ const agGridApi = this.adaptable.agGridAdapter.getAgGridApi();
596
+ agGridApi.applyColumnState({
597
+ state: existingColumnStates,
598
+ });
599
+ }
600
+ setAgGridColumnDefinitions(columnDefinitions) {
601
+ const agGridApi = this.adaptable.agGridAdapter.getAgGridApi();
602
+ agGridApi.setGridOption('columnDefs', columnDefinitions);
603
+ this.adaptable.updateColumnModelAndRefreshGrid({ skipColDefsRefresh: true });
604
+ }
605
+ updateAgGridColumnDefinition(columnDefinitionToBeUpdated) {
606
+ const currentColDefs = [...this.adaptable.agGridAdapter.getAgGridApi().getColumnDefs()];
607
+ const columnId = columnDefinitionToBeUpdated.colId;
608
+ const doesColumnExist = this.getColumnApi().doesColumnExist(columnId);
609
+ if (!doesColumnExist) {
610
+ this.logWarn(`Column with id ${columnId} does not exist, will add it instead!`);
611
+ const newColDefs = [...currentColDefs, columnDefinitionToBeUpdated];
612
+ this.setAgGridColumnDefinitions(newColDefs);
613
+ return;
614
+ }
615
+ const updatedColDefs = this.adaptable.agGridAdapter.traverseColDefs(currentColDefs, (colDef) => {
616
+ return colDef.colId === columnId ? Object.assign(Object.assign({}, colDef), columnDefinitionToBeUpdated) : colDef;
617
+ });
618
+ this.setAgGridColumnDefinitions(updatedColDefs);
619
+ }
620
+ updateAgGridColumnDefinitions(columnDefinitionsToBeUpdated) {
621
+ const currentColDefs = [...this.adaptable.agGridAdapter.getAgGridApi().getColumnDefs()];
622
+ const updatedColDefs = this.adaptable.agGridAdapter.traverseColDefs(currentColDefs, (colDef) => {
623
+ const newColDef = newColumnDefinitions.find((c) => c.colId === colDef.colId);
624
+ return newColDef ? Object.assign(Object.assign({}, colDef), newColDef) : colDef;
625
+ });
626
+ // find out new columns which are not in the current column definitions
627
+ const currentColIds = [];
628
+ this.adaptable.agGridAdapter.traverseColDefs(currentColDefs, (colDef) => {
629
+ currentColIds.push(colDef.colId);
630
+ return colDef;
631
+ });
632
+ const newColumnDefinitions = columnDefinitionsToBeUpdated.filter((c) => !currentColIds.includes(c.colId));
633
+ if (newColumnDefinitions.length) {
634
+ this.logWarn(`Columns with ids ${newColumnDefinitions.map((c) => c.colId).join(', ')} do not exist, will add them instead!`);
635
+ }
636
+ this.setAgGridColumnDefinitions([...updatedColDefs, ...newColumnDefinitions]);
637
+ }
638
+ removeAgGridColumnDefinition(columnId) {
639
+ const doesColumnExist = this.getColumnApi().doesColumnExist(columnId);
640
+ if (!doesColumnExist) {
641
+ this.logWarn(`Column with id ${columnId} does not exist!`);
642
+ return;
643
+ }
644
+ const currentColDefs = this.adaptable.agGridAdapter.getAgGridApi().getColumnDefs();
645
+ const updatedColDefs = this.adaptable.agGridAdapter
646
+ .traverseColDefs(currentColDefs, (colDef) => {
647
+ return colDef.colId === columnId ? null : colDef;
648
+ })
649
+ .filter(Boolean);
650
+ this.setAgGridColumnDefinitions(updatedColDefs);
651
+ }
652
+ addAgGridColumnDefinition(newColumnDefinition) {
653
+ const currentColDefs = this.adaptable.agGridAdapter.getAgGridApi().getColumnDefs();
654
+ // just in case check of there is not already an existing column with the same id and eliminate it
655
+ const sanitizedColDefs = this.adaptable.agGridAdapter
656
+ .traverseColDefs(currentColDefs, (colDef) => {
657
+ return colDef.colId === newColumnDefinition.colId ? null : colDef;
658
+ })
659
+ .filter(Boolean);
660
+ this.setAgGridColumnDefinitions([...sanitizedColDefs, newColumnDefinition]);
661
+ }
558
662
  }
@@ -14,5 +14,7 @@ export declare class ShortcutApiImpl extends ApiBase implements ShortcutApi {
14
14
  deleteAllShortcuts(): void;
15
15
  suspendShortcut(shortcut: Shortcut): Shortcut;
16
16
  unSuspendShortcut(shortcut: Shortcut): Shortcut;
17
+ suspendAllShortcut(): void;
18
+ unSuspendAllShortcut(): void;
17
19
  openShortcutSettingsPanel(): void;
18
20
  }
@@ -39,6 +39,12 @@ export class ShortcutApiImpl extends ApiBase {
39
39
  this.dispatchAction(ShortcutRedux.ShortcutUnSuspend(shortcut));
40
40
  return this.getShortcutById(shortcut.Uuid);
41
41
  }
42
+ suspendAllShortcut() {
43
+ this.dispatchAction(ShortcutRedux.ShortcutSuspendAll());
44
+ }
45
+ unSuspendAllShortcut() {
46
+ this.dispatchAction(ShortcutRedux.ShortcutUnSuspendAll());
47
+ }
42
48
  openShortcutSettingsPanel() {
43
49
  this.showModulePopup(ModuleConstants.ShortcutModuleId);
44
50
  }
@@ -24,5 +24,7 @@ export declare class StyledColumnApiImpl extends ApiBase implements StyledColumn
24
24
  canDisplaySparklines(): boolean;
25
25
  suspendStyledColumn(styledColumn: StyledColumn): void;
26
26
  unSuspendStyledColumn(styledColumn: StyledColumn): void;
27
+ suspendAllStyledColumn(): void;
28
+ unSuspendAllStyledColumn(): void;
27
29
  openStyledColumnSettingsPanel(): void;
28
30
  }
@@ -63,6 +63,12 @@ export class StyledColumnApiImpl extends ApiBase {
63
63
  unSuspendStyledColumn(styledColumn) {
64
64
  this.dispatchAction(StyledColumnRedux.StyledColumnUnSuspend(styledColumn));
65
65
  }
66
+ suspendAllStyledColumn() {
67
+ this.dispatchAction(StyledColumnRedux.StyledColumnSuspendAll());
68
+ }
69
+ unSuspendAllStyledColumn() {
70
+ this.dispatchAction(StyledColumnRedux.StyledColumnUnSuspendAll());
71
+ }
66
72
  openStyledColumnSettingsPanel() {
67
73
  this.showModulePopup(ModuleConstants.StyledColumnModuleId);
68
74
  }
@@ -26,6 +26,7 @@ export declare class UserInterfaceApiImpl extends ApiBase implements UserInterfa
26
26
  getEditLookUpItemForColumn(column: AdaptableColumn): EditLookUpPermittedValues | undefined;
27
27
  getEditLookUpValuesForEditLookUpItem(editLookUpItem: EditLookUpPermittedValues, gridCell: GridCell): any[] | undefined;
28
28
  getEditableCellStyle(): AdaptableStyle | undefined;
29
+ getEditedCellStyle(): AdaptableStyle | undefined;
29
30
  getReadOnlyCellStyle(): AdaptableStyle | undefined;
30
31
  getAdaptableObjectTags(): AdaptableObjectTag[] | undefined;
31
32
  getCustomIconDefinition(iconName: string): import("../../types").AdaptableIcon | import("../../types").CustomIcon;
@@ -142,6 +142,9 @@ export class UserInterfaceApiImpl extends ApiBase {
142
142
  getEditableCellStyle() {
143
143
  return this.getUserInterfaceOptions().editableCellStyle;
144
144
  }
145
+ getEditedCellStyle() {
146
+ return this.getUserInterfaceOptions().editedCellStyle;
147
+ }
145
148
  getReadOnlyCellStyle() {
146
149
  return this.getUserInterfaceOptions().readOnlyCellStyle;
147
150
  }
@@ -18,7 +18,7 @@ export declare class ActionRowInternalApi extends ApiBase {
18
18
  private buidActionRowButtons;
19
19
  private prepareCreateData;
20
20
  private prepareEditData;
21
- private isColumnEditable;
21
+ private isCellEditable;
22
22
  private buildFormField;
23
23
  private getFormFieldLabel;
24
24
  private buildFormFieldLabelContext;
@@ -49,7 +49,7 @@ export class ActionRowInternalApi extends ApiBase {
49
49
  .columnApi.getColumns()
50
50
  .filter((column) => {
51
51
  // if there is NO rowNode, do NOT display the non-editable fields as they will be empty
52
- return !!rowNode || this.isColumnEditable(column, rowNode);
52
+ return !!rowNode || this.isCellEditable(column, rowNode);
53
53
  })
54
54
  .filter((column) => !this.getAdaptableApi().columnApi.internalApi.isActionRowButtonColumn(column.columnId) &&
55
55
  this.showColumnInActionRowForm(column, actionRowType));
@@ -116,21 +116,23 @@ export class ActionRowInternalApi extends ApiBase {
116
116
  dataToSave[this.getOptions().primaryKey] = pkValue;
117
117
  return dataToSave;
118
118
  }
119
- isColumnEditable(column, rowNode) {
120
- return rowNode
121
- ? this.adaptableInstance.isCellEditable(rowNode, this.adaptableInstance.getAgGridColumnForColumnId(column.columnId))
122
- : !column.readOnly;
119
+ isCellEditable(column, rowNode) {
120
+ if (!rowNode) {
121
+ return !column.readOnly;
122
+ }
123
+ const gridCell = this.getAdaptableApi().gridApi.getGridCellFromRowNode(rowNode, column.columnId);
124
+ return this.getAdaptableApi().gridApi.isCellEditable(gridCell);
123
125
  }
124
126
  buildFormField(type, column, rowNode) {
125
- const isColumnEditable = this.isColumnEditable(column, rowNode);
127
+ const isCellEditable = this.isCellEditable(column, rowNode);
126
128
  const fieldValueOptions = this.getFieldValueOptions(column, rowNode);
127
- const fieldType = isColumnEditable
129
+ const fieldType = isCellEditable
128
130
  ? !!(fieldValueOptions === null || fieldValueOptions === void 0 ? void 0 : fieldValueOptions.length)
129
131
  ? 'select'
130
132
  : this.getFieldTypeFromColumnType(column)
131
133
  : 'textOutput';
132
134
  const defaultValue = rowNode
133
- ? isColumnEditable
135
+ ? isCellEditable
134
136
  ? this.getAdaptableApi().gridApi.getRawValueFromRowNode(rowNode, column.columnId)
135
137
  : this.getAdaptableApi().gridApi.getDisplayValueFromRowNode(rowNode, column.columnId)
136
138
  : null;
@@ -30,10 +30,10 @@ export declare class ExportInternalApi extends ApiBase {
30
30
  getReportData(report: Report, includePrimaryKey?: boolean): ReportData;
31
31
  getReportDataAsArray(report: Report, includePrimaryKey?: boolean): any[][];
32
32
  convertReportDataToArray(reportData: ReportData): any[][];
33
- getRowObjectForColumnIds(rowNode: IRowNode, columnIds: string[]): Record<string, any>;
33
+ getRowObjectForColumnIds(rowNode: IRowNode, columnIds: string[], reportName: string): Record<string, any>;
34
34
  publishLiveLiveDataChangedEvent(reportDestination: 'ipushpull' | 'OpenFin', liveDataTrigger: 'Connected' | 'Disconnected' | 'SnapshotSent' | 'LiveDataStarted' | 'LiveDataStopped' | 'LiveDataUpdated', liveReport?: any): void;
35
- getCellExportValueFromRowNode(rowNode: IRowNode, columnId: string): any;
36
- getCellExportValueFromRawValue(rowNode: IRowNode, cellRawValue: any, columnId: string): any;
35
+ getCellExportValueFromRowNode(rowNode: IRowNode, columnId: string, reportName: string): any;
36
+ getCellExportValueFromRawValue(rowNode: IRowNode, cellRawValue: any, columnId: string, reportName: string): any;
37
37
  getReportFileName(reportName: string, destination: SystemExportDestination | CustomDestination): string;
38
38
  private getCustomExportDateFormat;
39
39
  private getCellExportValueFromRawValueByType;
@@ -361,12 +361,12 @@ export class ExportInternalApi extends ApiBase {
361
361
  switch (report.ReportRowScope) {
362
362
  case 'AllRows':
363
363
  this.getAdaptableApi().internalApi.forAllRowNodesDo((rowNode) => {
364
- resultRowData.push(this.getRowObjectForColumnIds(rowNode, columnIds));
364
+ resultRowData.push(this.getRowObjectForColumnIds(rowNode, columnIds, report.Name));
365
365
  });
366
366
  break;
367
367
  case 'VisibleRows':
368
368
  this.getAdaptableApi().internalApi.forAllVisibleRowNodesDo((rowNode) => {
369
- resultRowData.push(this.getRowObjectForColumnIds(rowNode, columnIds));
369
+ resultRowData.push(this.getRowObjectForColumnIds(rowNode, columnIds, report.Name));
370
370
  });
371
371
  break;
372
372
  case 'ExpressionRows':
@@ -375,7 +375,7 @@ export class ExportInternalApi extends ApiBase {
375
375
  if (this.getAdaptableApi()
376
376
  .internalApi.getQueryLanguageService()
377
377
  .evaluateBooleanExpression((_a = report.Query) === null || _a === void 0 ? void 0 : _a.BooleanExpression, ExportModuleId, rowNode)) {
378
- resultRowData.push(this.getRowObjectForColumnIds(rowNode, columnIds));
378
+ resultRowData.push(this.getRowObjectForColumnIds(rowNode, columnIds, report.Name));
379
379
  }
380
380
  });
381
381
  break;
@@ -390,7 +390,7 @@ export class ExportInternalApi extends ApiBase {
390
390
  if (selectedRowCells) {
391
391
  const selectedRowColumnIds = selectedRowCells.map((rowCell) => rowCell.column.columnId);
392
392
  const selectedColumnIds = columnIds.filter((columnId) => selectedRowColumnIds.includes(columnId));
393
- const row = this.getRowObjectForColumnIds(rowNode, selectedColumnIds);
393
+ const row = this.getRowObjectForColumnIds(rowNode, selectedColumnIds, report.Name);
394
394
  if (includePrimaryKey) {
395
395
  row[this.getAdaptableApi().optionsApi.getPrimaryKey()] = rowPrimaryKeyValue;
396
396
  }
@@ -405,7 +405,7 @@ export class ExportInternalApi extends ApiBase {
405
405
  this.getAdaptableApi().internalApi.forAllRowNodesDo((rowNode) => {
406
406
  const rowPrimaryKeyValue = this.getAdaptableApi().gridApi.getPrimaryKeyValueForRowNode(rowNode);
407
407
  if (selectedGridRowPrimaryKeys.includes(rowPrimaryKeyValue)) {
408
- resultRowData.push(this.getRowObjectForColumnIds(rowNode, columnIds));
408
+ resultRowData.push(this.getRowObjectForColumnIds(rowNode, columnIds, report.Name));
409
409
  }
410
410
  });
411
411
  }
@@ -431,9 +431,9 @@ export class ExportInternalApi extends ApiBase {
431
431
  ...reportData.rows.map((row) => reportData.columns.map((column) => row[column.columnId])),
432
432
  ];
433
433
  }
434
- getRowObjectForColumnIds(rowNode, columnIds) {
434
+ getRowObjectForColumnIds(rowNode, columnIds, reportName) {
435
435
  return columnIds.reduce((result, columnId) => {
436
- result[columnId] = this.getCellExportValueFromRowNode(rowNode, columnId);
436
+ result[columnId] = this.getCellExportValueFromRowNode(rowNode, columnId, reportName);
437
437
  return result;
438
438
  }, {});
439
439
  }
@@ -441,24 +441,28 @@ export class ExportInternalApi extends ApiBase {
441
441
  const liveDataChangedInfo = Object.assign(Object.assign({}, this.getAdaptableApi().internalApi.buildBaseContext()), { reportDestination: reportDestination, liveDataTrigger: liveDataTrigger, liveReport: liveReport });
442
442
  this.getAdaptableApi().eventApi.emit('LiveDataChanged', liveDataChangedInfo);
443
443
  }
444
- getCellExportValueFromRowNode(rowNode, columnId) {
445
- return this.getCellExportValueFromRawValue(rowNode, this.getAdaptableApi().gridApi.getRawValueFromRowNode(rowNode, columnId), columnId);
444
+ getCellExportValueFromRowNode(rowNode, columnId, reportName) {
445
+ return this.getCellExportValueFromRawValue(rowNode, this.getAdaptableApi().gridApi.getRawValueFromRowNode(rowNode, columnId), columnId, reportName);
446
446
  }
447
- getCellExportValueFromRawValue(rowNode, cellRawValue, columnId) {
447
+ getCellExportValueFromRawValue(rowNode, cellRawValue, columnId, reportName) {
448
448
  if (StringExtensions.IsNullOrEmpty(cellRawValue)) {
449
449
  return cellRawValue;
450
450
  }
451
451
  const column = this.getAdaptableApi().columnApi.getColumnWithColumnId(columnId);
452
452
  const columnDataType = column.dataType;
453
- // if this is a date column and there is a custom export date format provided, that will take precedence
453
+ // 1. if it is a Visual Data report then we always ONLY send the formatted value and ignore all other properties
454
+ if (reportName == VISUAL_DATA_REPORT) {
455
+ return this.getCellExportValueFromRawValueByType(rowNode, cellRawValue, columnId, 'formattedValue');
456
+ }
457
+ // 2. if this is a date column and there is a custom export date format provided, that will next take precedence
454
458
  if (columnDataType === 'Date' && !!this.getCustomExportDateFormat()) {
455
459
  const exportDateFormat = this.getCustomExportDateFormat();
456
460
  return FormatHelper.DateFormatter(cellRawValue, {
457
461
  Pattern: exportDateFormat,
458
462
  });
459
463
  }
460
- // otherwise check the general export format types
461
- let cellExportFormat = this.getAdaptableApi().exportApi.internalApi.getCellExportFormatType(column, columnDataType);
464
+ // 3. in all other cases check the general export format types
465
+ const cellExportFormat = this.getAdaptableApi().exportApi.internalApi.getCellExportFormatType(column, columnDataType);
462
466
  return this.getCellExportValueFromRawValueByType(rowNode, cellRawValue, columnId, cellExportFormat);
463
467
  }
464
468
  getReportFileName(reportName, destination) {
@@ -3,7 +3,7 @@ import { GridFilter } from '../../types';
3
3
  export declare class GridFilterInternalApi extends ApiBase {
4
4
  fireGridFilterAppliedEvent(): void;
5
5
  /**
6
- * Compares to Grid Filters to see if they are identical
6
+ * Compares to Grid Filter to see if they are identical
7
7
  */
8
8
  isGridFilterDifferent(oldFilter: GridFilter, newFilter: GridFilter): boolean;
9
9
  }
@@ -11,9 +11,12 @@ export class GridFilterInternalApi extends ApiBase {
11
11
  }
12
12
  }
13
13
  /**
14
- * Compares to Grid Filters to see if they are identical
14
+ * Compares to Grid Filter to see if they are identical
15
15
  */
16
16
  isGridFilterDifferent(oldFilter, newFilter) {
17
- return (oldFilter === null || oldFilter === void 0 ? void 0 : oldFilter.Expression) === (newFilter === null || newFilter === void 0 ? void 0 : newFilter.Expression);
17
+ if (oldFilter == undefined && newFilter == undefined) {
18
+ return false;
19
+ }
20
+ return (oldFilter === null || oldFilter === void 0 ? void 0 : oldFilter.Expression) !== (newFilter === null || newFilter === void 0 ? void 0 : newFilter.Expression);
18
21
  }
19
22
  }
@@ -53,6 +53,14 @@ export interface ShortcutApi {
53
53
  * @returns shortcut
54
54
  */
55
55
  unSuspendShortcut(shortcut: Shortcut): Shortcut;
56
+ /**
57
+ * Suspends all Shortcuts
58
+ */
59
+ suspendAllShortcut(): void;
60
+ /**
61
+ * Activates all suspended Shortcut
62
+ */
63
+ unSuspendAllShortcut(): void;
56
64
  /**
57
65
  * Opens Settings Panel with Shortcut section selected and visible
58
66
  */
@@ -57,6 +57,14 @@ export interface StyledColumnApi {
57
57
  * @param styledColumn
58
58
  */
59
59
  unSuspendStyledColumn(styledColumn: StyledColumn): void;
60
+ /**
61
+ * Suspends all Styled Columns
62
+ */
63
+ suspendAllStyledColumn(): void;
64
+ /**
65
+ * Activates all suspended Styled Column
66
+ */
67
+ unSuspendAllStyledColumn(): void;
60
68
  /**
61
69
  * Checks whether Column with given `columnId` has a PercentBar Style applied
62
70
  * @param columnId column ID
@@ -55,11 +55,15 @@ export interface UserInterfaceApi {
55
55
  */
56
56
  getEditLookUpValuesForEditLookUpItem(editLookUpItem: EditLookUpPermittedValues, gridCell: GridCell): any[] | undefined;
57
57
  /**
58
- * Returns Style set for Editable cells
58
+ * Returns Style set for Editable Cells
59
59
  */
60
60
  getEditableCellStyle(): AdaptableStyle | undefined;
61
61
  /**
62
- * Returns Style set for ReadOnly cells
62
+ * Returns Style for Cells that have been edited
63
+ */
64
+ getEditedCellStyle(): AdaptableStyle | undefined;
65
+ /**
66
+ * Returns Style set for ReadOnly Cells
63
67
  */
64
68
  getReadOnlyCellStyle(): AdaptableStyle | undefined;
65
69
  /**
@@ -43,7 +43,7 @@ export interface NumberFormatterOptions extends BaseFormatterOptions {
43
43
  */
44
44
  Suffix?: string;
45
45
  /**
46
- * Replaces cell value with supplied value (that can contain placeholders)
46
+ * Replaces cell value with supplied value (that can contain Template Literals)
47
47
  */
48
48
  Content?: string | number;
49
49
  /**
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Defines which types of Rows to exclude when rendering Format Columns, Action Columns, Badges
2
+ * Defines which types of Rows to exclude when rendering Format Columns, Action Columns and Badges
3
3
  */
4
4
  export type RowScope = {
5
5
  /**
@@ -463,10 +463,8 @@ export const SystemReducer = (state = initialState, action) => {
463
463
  });
464
464
  const AdaptableFlashingCellsMap = Object.assign({}, state.AdaptableFlashingCellsMap);
465
465
  AdaptableFlashingCellsMap[FlashingCell.Uuid] = FlashingCell;
466
- return Object.assign({}, state, {
467
- AdaptableFlashingCells: AdaptableFlashingCells,
468
- AdaptableFlashingCellsMap: AdaptableFlashingCellsMap,
469
- });
466
+ return Object.assign(Object.assign({}, state), { AdaptableFlashingCells,
467
+ AdaptableFlashingCellsMap });
470
468
  }
471
469
  case SYSTEM_FLASHING_CELL_DELETE: {
472
470
  const { flashingCell: FlashingCell } = action;
@@ -490,10 +488,7 @@ export const SystemReducer = (state = initialState, action) => {
490
488
  return Object.assign(Object.assign({}, state), { AdaptableFlashingCells: AdaptableFlashingCells, AdaptableFlashingCellsMap: AdaptableFlashingCellsMap });
491
489
  }
492
490
  case SYSTEM_FLASHING_CELL_DELETE_ALL: {
493
- return Object.assign({}, state, {
494
- AdaptableFlashingCells: {},
495
- AdaptableFlashingCellsMap: {},
496
- });
491
+ return Object.assign(Object.assign({}, state), { AdaptableFlashingCells: {}, AdaptableFlashingCellsMap: {} });
497
492
  }
498
493
  case SYSTEM_HIGHLIGHT_CELL_ADD: {
499
494
  const actionTypedAdd = action;
@@ -1 +1 @@
1
- const r=3988292384;function n(n=r){var t,o,u,e=new Array;for(t=0;t<256;t++){for(u=t,o=8;o>0;o--)1&~u?u>>>=1:u=u>>>1^n;e[t]=u}return e}function t(){return 4294967295}function o(r,n,t){return n=n>>>8^r[t^255&n]}function u(r){return r=(r=~r)<0?4294967295+r+1:r}export function compute_string(e,c=r){var f,i=n(c),a=0;for(a=t(),f=0;f<e.length;f++)a=o(i,a,e.charCodeAt(f));return`${a=u(a)}`}
1
+ const r=3988292384;function n(r=3988292384){var n,t,o,u=new Array;for(n=0;n<256;n++){for(o=n,t=8;t>0;t--)1&~o?o>>>=1:o=o>>>1^r;u[n]=o}return u}function t(){return 4294967295}function o(r,n,t){return n=n>>>8^r[t^255&n]}function u(r){return r=(r=~r)<0?4294967295+r+1:r}export function compute_string(r,e=3988292384){var c,f=n(e),i=0;for(i=t(),c=0;c<r.length;c++)i=o(f,i,r.charCodeAt(c));return`${i=u(i)}`}
@@ -72,9 +72,10 @@ class DashboardPopupComponent extends React.Component {
72
72
  React.createElement(CheckBox, { "data-name": "hidden", className: `${baseClassName}__settings-option`, checked: this.props.IsHidden, onChange: (checked) => this.props.onSetDashboardHidden(checked) }, "Hidden"))),
73
73
  React.createElement(Panel, { header: 'Dashboard Contents', style: { borderBottom: '1px solid var(--ab-color-primary)' }, variant: "default", borderRadius: "none", marginTop: 4 },
74
74
  React.createElement(Flex, { className: `${baseClassName}__contents-selector`, flexDirection: "row", padding: 2 },
75
- React.createElement(Radio, { marginLeft: 3, value: DashboardConfigView.Toolbars, checked: this.state.DashboardConfigView == DashboardConfigView.Toolbars, onChange: (_, e) => this.onDashboardConfigViewChanged(e) }, "Tabs & Toolbars"),
76
- React.createElement(Radio, { marginLeft: 3, value: DashboardConfigView.Buttons, checked: this.state.DashboardConfigView == DashboardConfigView.Buttons, onChange: (_, e) => this.onDashboardConfigViewChanged(e) }, "Buttons"),
77
- React.createElement(Radio, { marginLeft: 3, value: DashboardConfigView.PinnedToolbars, checked: this.state.DashboardConfigView == DashboardConfigView.PinnedToolbars, onChange: (_, e) => this.onDashboardConfigViewChanged(e) }, "Pinned Toolbars")),
75
+ React.createElement(Radio, { marginLeft: 3, value: DashboardConfigView.Toolbars, checked: this.state.DashboardConfigView == DashboardConfigView.Toolbars, onChange: (_, e) => this.onDashboardConfigViewChanged(e) }, "Tabbed Toolbars"),
76
+ React.createElement(Radio, { marginLeft: 3, value: DashboardConfigView.PinnedToolbars, checked: this.state.DashboardConfigView == DashboardConfigView.PinnedToolbars, onChange: (_, e) => this.onDashboardConfigViewChanged(e) }, "Pinned Toolbars"),
77
+ ' ',
78
+ React.createElement(Radio, { marginLeft: 3, value: DashboardConfigView.Buttons, checked: this.state.DashboardConfigView == DashboardConfigView.Buttons, onChange: (_, e) => this.onDashboardConfigViewChanged(e) }, "Buttons")),
78
79
  React.createElement(Box, { className: `${baseClassName}__Module-Selector`, "data-name": this.state.DashboardConfigView === DashboardConfigView.Toolbars
79
80
  ? 'toolbars'
80
81
  : 'buttons', style: { minHeight: 0, flex: '1 1 0' }, padding: 2 },
@@ -39,6 +39,7 @@ export const GridInfoPopup = (props) => {
39
39
  returnRows.push(createReadOnlyColItem(colItems, 'Column Filters', columnFilterDescription));
40
40
  returnRows.push(createReadOnlyColItem(colItems, 'Grid Filter', gridFilterExpression));
41
41
  returnRows.push(createReadOnlyColItem(colItems, 'All Rows', props.api.gridApi.getRowCount()));
42
+ returnRows.push(createReadOnlyColItem(colItems, 'Visible Rows', props.api.gridApi.getVisibleRowCount()));
42
43
  returnRows.push(createReadOnlyColItem(colItems, 'Selected Rows', selectedRowInfo === null || selectedRowInfo === void 0 ? void 0 : selectedRowInfo.gridRows.length));
43
44
  returnRows.push(createReadOnlyColItem(colItems, 'Visible Selected Rows', selectedRowInfo === null || selectedRowInfo === void 0 ? void 0 : selectedRowInfo.gridRows.filter((gr) => { var _a; return ((_a = gr.rowNode) === null || _a === void 0 ? void 0 : _a.displayed) == true; }).length));
44
45
  returnRows.push(createReadOnlyColItem(colItems, 'All Columns', props.api.gridApi.getColumnCount()));
@@ -4,7 +4,7 @@ import { Tag } from '../../../components/Tag';
4
4
  export const getGridFilterViewItems = (layout) => {
5
5
  var _a;
6
6
  return {
7
- name: 'Grid Filters',
7
+ name: 'Grid Filter',
8
8
  view: (React.createElement(Tag, null,
9
9
  React.createElement(ExpressionPreview, { query: { BooleanExpression: (_a = layout.GridFilter) === null || _a === void 0 ? void 0 : _a.Expression } }))),
10
10
  };
@@ -185,7 +185,7 @@ const ColumnRow = (props) => {
185
185
  export const ColumnsSection = (props) => {
186
186
  const adaptable = useAdaptable();
187
187
  const { data: layout } = useOnePageAdaptableWizardContext();
188
- const allColumns = adaptable.api.columnApi.getColumns();
188
+ const allColumns = adaptable.api.columnApi.getStandardColumns();
189
189
  const sortedColumns = React.useMemo(() => {
190
190
  return ArrayExtensions.sortArrayWithOrder(allColumns.map((col) => col.columnId), layout.Columns, { sortUnorderedItems: false }).map((colId) => adaptable.api.columnApi.getColumnWithColumnId(colId));
191
191
  }, [layout, allColumns]);
@@ -33,7 +33,7 @@ export const GridFilterSection = (props) => {
33
33
  props.onChange(Object.assign(Object.assign({}, layout), { GridFilter: Object.assign(Object.assign({}, layout.GridFilter), { Expression: expression }) }));
34
34
  }, initialData: initialData, columns: api.columnApi.getQueryableColumns(), fields: api.expressionApi.internalApi.getAvailableFields(), namedQueries: api.namedQueryApi.getNamedQueries(), api: api })));
35
35
  return (React.createElement(Tabs, { style: { height: '100%' } },
36
- React.createElement(Tabs.Tab, null, "Grid Filters"),
36
+ React.createElement(Tabs.Tab, null, "Grid Filter"),
37
37
  React.createElement(Tabs.Content, null,
38
38
  React.createElement(Panel, null, expressionEditorContent))));
39
39
  };
@@ -7,6 +7,8 @@ export declare class ActionColumnRenderer implements ICellRendererComp {
7
7
  private eGui;
8
8
  private eventListener;
9
9
  private unmountReactRoot?;
10
+ private layoutSwitchUnsubscribe?;
11
+ private actionButtons;
10
12
  init(params: ActionColumnCellRendererParams): void;
11
13
  render(): void;
12
14
  getGui(): HTMLElement;
@@ -2,6 +2,7 @@ import SimpleButton from '../components/SimpleButton';
2
2
  import * as React from 'react';
3
3
  import { useRerender } from '../components/utils/useRerender';
4
4
  import { renderWithAdaptableContext } from '../View/renderWithAdaptableContext';
5
+ import { LAYOUT_SELECT } from '../Redux/ActionsReducers/LayoutRedux';
5
6
  const ActionButtons = (props) => {
6
7
  const { buttons, adaptableApi, context, rerender } = props;
7
8
  return (React.createElement(React.Fragment, null, buttons.map((button, index) => {
@@ -65,6 +66,20 @@ export const ReactActionColumnRenderer = (props) => {
65
66
  if (!shouldRender) {
66
67
  return null;
67
68
  }
69
+ // subscribe to the LayoutChange event and rerender on change
70
+ const unsubscribe = adaptable.api.eventApi.on('AdaptableStateChanged', (eventInfo) => {
71
+ if (eventInfo.actionName === LAYOUT_SELECT) {
72
+ if (eventInfo.oldState.Layout.CurrentLayout !== eventInfo.newState.Layout.CurrentLayout) {
73
+ rerender();
74
+ }
75
+ }
76
+ });
77
+ // unsubscribe on unmount
78
+ React.useEffect(() => {
79
+ return () => {
80
+ unsubscribe();
81
+ };
82
+ }, []);
68
83
  const pkValue = adaptable.getPrimaryKeyValueFromRowNode(props.node, props.api);
69
84
  const buttonContext = Object.assign(Object.assign({ actionColumn, primaryKeyValue: pkValue, rowNode: props.node }, adaptable.api.internalApi.buildBaseContext()), { data: props.data });
70
85
  return (React.createElement("div", { className: "ab-ActionColumn" },
@@ -83,6 +98,7 @@ export class ActionColumnRenderer {
83
98
  if (!actionColumn || !actionButtons.length) {
84
99
  return;
85
100
  }
101
+ this.actionButtons = actionButtons;
86
102
  // create the cell
87
103
  this.eGui = document.createElement('div');
88
104
  this.eGui.className = 'ab-ActionColumn';
@@ -114,13 +130,22 @@ export class ActionColumnRenderer {
114
130
  const eGui = this.eGui;
115
131
  const doRender = () => {
116
132
  this.unmountReactRoot = adaptable.renderReactRoot(renderWithAdaptableContext(ActionButtons({
117
- buttons: actionButtons,
133
+ buttons: this.actionButtons,
118
134
  context: buttonContext,
119
135
  rerender: doRender,
120
136
  adaptableApi: adaptable.api,
121
137
  }), adaptable), eGui);
122
138
  };
123
139
  this.render = doRender;
140
+ this.layoutSwitchUnsubscribe = adaptable.api.eventApi.on('AdaptableStateChanged', (eventInfo) => {
141
+ if (eventInfo.actionName === LAYOUT_SELECT) {
142
+ if (eventInfo.oldState.Layout.CurrentLayout !== eventInfo.newState.Layout.CurrentLayout) {
143
+ const { actionButtons: freshActionButtons } = adaptable.api.internalApi.getActionButtonsAndActionColumn(params.colDef);
144
+ this.actionButtons = freshActionButtons;
145
+ doRender();
146
+ }
147
+ }
148
+ });
124
149
  doRender();
125
150
  }
126
151
  // defined on init
@@ -138,8 +163,9 @@ export class ActionColumnRenderer {
138
163
  }
139
164
  // gets called when the cell is removed from the grid
140
165
  destroy() {
141
- var _a;
142
- (_a = this.unmountReactRoot) === null || _a === void 0 ? void 0 : _a.call(this);
166
+ var _a, _b;
167
+ (_a = this.layoutSwitchUnsubscribe) === null || _a === void 0 ? void 0 : _a.call(this);
168
+ (_b = this.unmountReactRoot) === null || _b === void 0 ? void 0 : _b.call(this);
143
169
  // do cleanup, remove event listener from button
144
170
  if (this.eGui) {
145
171
  this.eGui.removeEventListener('click', this.eventListener);
@@ -249,7 +249,6 @@ export declare class AdaptableAgGrid implements IAdaptable {
249
249
  getRowNodeByIndex(index: number): IRowNode;
250
250
  getAgGridStatusPanels(): import("@ag-grid-community/core").StatusPanelDef[];
251
251
  setDataValue(value: any, column: AdaptableColumn, primaryKeyValue: any, rowNode?: IRowNode): void;
252
- isCellEditable(rowNode: IRowNode, column: Column): boolean;
253
252
  forAllRowNodesDo(func: (rowNode: IRowNode, rowIndex: number) => void, config?: {
254
253
  includeGroupRows?: boolean;
255
254
  filterFn?: (rowNode: IRowNode) => boolean;
@@ -285,6 +284,7 @@ export declare class AdaptableAgGrid implements IAdaptable {
285
284
  updateChart(chart: ChartDefinition): void;
286
285
  getChartModels(): import("@ag-grid-community/core").ChartModel[];
287
286
  getRowCount(): number;
287
+ getVisibleRowCount(): number;
288
288
  getColumnCount(): number;
289
289
  getVisibleColumnCount(): number;
290
290
  isGridGroupable(): boolean;