@adaptabletools/adaptable 22.0.0-canary.5 → 22.0.0-canary.7

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/index.css +0 -3
  2. package/index.css.map +1 -1
  3. package/package.json +1 -1
  4. package/src/AdaptableOptions/CustomSortOptions.d.ts +1 -2
  5. package/src/AdaptableState/AlertState.d.ts +6 -3
  6. package/src/AdaptableState/ChartingState.d.ts +5 -5
  7. package/src/AdaptableState/Common/AdaptableObject.d.ts +4 -9
  8. package/src/AdaptableState/Common/BaseContext.d.ts +2 -0
  9. package/src/AdaptableState/Common/ColumnHighlightInfo.d.ts +18 -0
  10. package/src/AdaptableState/Common/ColumnHighlightInfo.js +1 -0
  11. package/src/AdaptableState/Common/NamedObject.d.ts +10 -0
  12. package/src/AdaptableState/Common/NamedObject.js +1 -0
  13. package/src/AdaptableState/Common/RowSummary.d.ts +1 -1
  14. package/src/AdaptableState/Common/Schedule.d.ts +7 -3
  15. package/src/AdaptableState/Common/SuspendableObject.d.ts +10 -0
  16. package/src/AdaptableState/Common/SuspendableObject.js +1 -0
  17. package/src/AdaptableState/CustomSortState.d.ts +6 -2
  18. package/src/AdaptableState/DashboardState.d.ts +3 -3
  19. package/src/AdaptableState/ExportState.d.ts +3 -3
  20. package/src/AdaptableState/FlashingCellState.d.ts +6 -2
  21. package/src/AdaptableState/FormatColumnState.d.ts +6 -2
  22. package/src/AdaptableState/InternalState.d.ts +2 -0
  23. package/src/AdaptableState/LayoutState.d.ts +3 -3
  24. package/src/AdaptableState/NamedQueryState.d.ts +3 -3
  25. package/src/AdaptableState/PlusMinusState.d.ts +6 -2
  26. package/src/AdaptableState/ShortcutState.d.ts +6 -2
  27. package/src/AdaptableState/StyledColumnState.d.ts +1 -1
  28. package/src/AdaptableState/ThemeState.d.ts +3 -3
  29. package/src/Api/AlertApi.d.ts +6 -0
  30. package/src/Api/CustomSortApi.d.ts +6 -0
  31. package/src/Api/FlashingCellApi.d.ts +6 -0
  32. package/src/Api/FormatColumnApi.d.ts +10 -4
  33. package/src/Api/GridApi.d.ts +18 -3
  34. package/src/Api/Implementation/AlertApiImpl.d.ts +1 -0
  35. package/src/Api/Implementation/AlertApiImpl.js +3 -0
  36. package/src/Api/Implementation/ChartingApiImpl.js +2 -2
  37. package/src/Api/Implementation/CustomSortApiImpl.d.ts +1 -0
  38. package/src/Api/Implementation/CustomSortApiImpl.js +3 -0
  39. package/src/Api/Implementation/FlashingCellApiImpl.d.ts +1 -0
  40. package/src/Api/Implementation/FlashingCellApiImpl.js +3 -0
  41. package/src/Api/Implementation/FormatColumnApiImpl.d.ts +6 -5
  42. package/src/Api/Implementation/FormatColumnApiImpl.js +6 -5
  43. package/src/Api/Implementation/GridApiImpl.d.ts +4 -0
  44. package/src/Api/Implementation/GridApiImpl.js +15 -1
  45. package/src/Api/Implementation/LayoutApiImpl.js +1 -1
  46. package/src/Api/Implementation/NamedQueryApiImpl.js +2 -2
  47. package/src/Api/Implementation/PlusMinusApiImpl.d.ts +1 -0
  48. package/src/Api/Implementation/PlusMinusApiImpl.js +3 -0
  49. package/src/Api/Implementation/ScheduleApiImpl.d.ts +1 -0
  50. package/src/Api/Implementation/ScheduleApiImpl.js +3 -0
  51. package/src/Api/Implementation/ShortcutApiImpl.d.ts +1 -0
  52. package/src/Api/Implementation/ShortcutApiImpl.js +3 -0
  53. package/src/Api/Implementation/SystemStatusApiImpl.js +4 -4
  54. package/src/Api/Internal/CalculatedColumnInternalApi.js +2 -2
  55. package/src/Api/Internal/FreeTextColumnInternalApi.js +2 -2
  56. package/src/Api/Internal/LayoutInternalApi.js +1 -1
  57. package/src/Api/Internal/NamedQueryInternalApi.js +4 -4
  58. package/src/Api/PlusMinusApi.d.ts +6 -0
  59. package/src/Api/ScheduleApi.d.ts +6 -0
  60. package/src/Api/ShortcutApi.d.ts +6 -0
  61. package/src/Redux/ActionsReducers/FormatColumnRedux.d.ts +8 -0
  62. package/src/Redux/ActionsReducers/FormatColumnRedux.js +15 -0
  63. package/src/Redux/ActionsReducers/InternalRedux.d.ts +15 -0
  64. package/src/Redux/ActionsReducers/InternalRedux.js +36 -0
  65. package/src/Redux/Store/AdaptableStore.js +39 -16
  66. package/src/Strategy/BulkUpdateModule.js +8 -8
  67. package/src/Strategy/PlusMinusModule.js +1 -1
  68. package/src/Strategy/QuickSearchModule.js +1 -1
  69. package/src/Strategy/SettingsPanelModule.js +11 -7
  70. package/src/Strategy/SmartEditModule.js +10 -10
  71. package/src/Utilities/Services/DataService.js +1 -1
  72. package/src/Utilities/Services/Fdc3Service.js +4 -4
  73. package/src/Utilities/Services/ModuleService.js +1 -3
  74. package/src/Utilities/Services/ThemeService.js +2 -6
  75. package/src/Utilities/Services/ValidationService.js +1 -1
  76. package/src/Utilities/logDeprecation.js +3 -4
  77. package/src/View/Alert/Utilities/getDefaultAlertDefinition.d.ts +2 -2
  78. package/src/View/Alert/Wizard/isValidAlertRules.js +1 -1
  79. package/src/View/CalculatedColumn/Wizard/CalculatedColumnDefinitionWizardSection.js +2 -2
  80. package/src/View/CalculatedColumn/Wizard/CalculatedColumnExpressionWizardSection.js +2 -2
  81. package/src/View/CalculatedColumn/Wizard/CalculatedColumnSettingsWizardSection.js +1 -1
  82. package/src/View/Charting/ChartingWizard/AgChargingWizard/SettingsSection.js +2 -2
  83. package/src/View/Charting/ChartingWizard/ExternalChartingWizard/SettingsSection.js +2 -2
  84. package/src/View/Components/CellPopup/index.js +1 -1
  85. package/src/View/Components/ColumnFilter/FloatingFilter.js +41 -3
  86. package/src/View/Components/ColumnFilter/components/ColumnFilterMenu.js +54 -2
  87. package/src/View/Components/EntityRulesEditor/Utilities.js +5 -5
  88. package/src/View/Components/NewScopeComponent.js +3 -3
  89. package/src/View/Components/Popups/AdaptablePopupConfirmation.js +1 -1
  90. package/src/View/CustomSort/Wizard/CustomSortColumnWizardSection.js +3 -3
  91. package/src/View/CustomSort/Wizard/CustomSortValuesWizardSection.js +1 -1
  92. package/src/View/FlashingCell/Wizard/isValidFlashingCellRules.js +1 -1
  93. package/src/View/FreeTextColumn/Wizard/FreeTextColumnSettingsWizardSection.d.ts +1 -1
  94. package/src/View/FreeTextColumn/Wizard/FreeTextColumnSettingsWizardSection.js +3 -3
  95. package/src/View/Layout/LayoutViewPanel.js +1 -1
  96. package/src/View/Layout/Wizard/sections/AggregationsSection.js +1 -1
  97. package/src/View/Layout/Wizard/sections/FilterSection.js +1 -1
  98. package/src/View/Layout/Wizard/sections/GridFilterSection.js +1 -1
  99. package/src/View/Layout/Wizard/sections/PivotAggregationsSection.js +3 -3
  100. package/src/View/Layout/Wizard/sections/RowSummarySection.js +1 -1
  101. package/src/View/NamedQuery/Wizard/NamedQueryExpressionWizardSection.js +2 -2
  102. package/src/View/PlusMinus/Wizard/PlusMinusSettingsWizardSection.js +5 -5
  103. package/src/View/Schedule/Wizard/ScheduleSettingsWizard/isSettingsValid.d.ts +1 -1
  104. package/src/View/Schedule/Wizard/ScheduleSettingsWizard/isSettingsValid.js +11 -11
  105. package/src/View/StateManagement/handleExportState.js +1 -1
  106. package/src/View/StyledColumn/Wizard/StyledColumnWizardColumnSection.js +1 -1
  107. package/src/agGrid/AdaptableAgGrid.js +47 -51
  108. package/src/agGrid/AgGridAdapter.js +8 -8
  109. package/src/agGrid/AgGridColumnAdapter.d.ts +1 -0
  110. package/src/agGrid/AgGridColumnAdapter.js +15 -4
  111. package/src/agGrid/AgGridExportAdapter.js +5 -5
  112. package/src/agGrid/AgGridThemeAdapter.js +2 -2
  113. package/src/components/OverlayTrigger/index.js +1 -1
  114. package/src/components/Select/Select.js +78 -15
  115. package/src/env.js +2 -2
  116. package/src/metamodel/adaptable.metamodel.d.ts +25 -18
  117. package/src/metamodel/adaptable.metamodel.js +1 -1
  118. package/src/migration/AdaptableUpgradeHelper.js +2 -2
  119. package/src/migration/VersionUpgrade17.js +4 -4
  120. package/src/migration/VersionUpgrade20.js +4 -4
  121. package/src/types.d.ts +2 -2
  122. package/tsconfig.esm.tsbuildinfo +1 -1
@@ -359,7 +359,7 @@ export class AdaptableAgGrid {
359
359
  this.adaptableOptions = this.normalizeAdaptableOptions(this.adaptableOptions);
360
360
  const { showLoadingScreen, loadingScreenDelay, loadingScreenText, loadingScreenTitle } = this.adaptableOptions.userInterfaceOptions.loadingScreenOptions;
361
361
  if (showLoadingScreen) {
362
- this.logger.info(`Show Loading Screen`);
362
+ this.logger.info('Showing loading screen');
363
363
  // it's important to use ensureLoadingScreenPortalElement
364
364
  // and not ensurePortalElement, because multiple adaptable instances share the same portal element
365
365
  // so when displaying the second one, the react root associated to the portal element
@@ -375,7 +375,7 @@ export class AdaptableAgGrid {
375
375
  }), portalElement);
376
376
  }
377
377
  else {
378
- this.logger.consoleError(`Adaptable failed to show the loading screen!`);
378
+ this.logger.consoleError('Failed to create loading screen portal element.');
379
379
  }
380
380
  }
381
381
  this.forPlugins((plugin) => plugin.afterInitOptions(this, this.adaptableOptions));
@@ -434,7 +434,7 @@ export class AdaptableAgGrid {
434
434
  // see #map_dateString_to_date
435
435
  this.agGridAdapter.patchColDefs(columnDefs, (colDef) => {
436
436
  if (colDef.cellDataType === 'dateString') {
437
- this.logger.consoleError(`AG Grid: Column '${colDef.colId}' specifies cellDataType='dateString' which is no longer supported. It has been automatically replaced with cellDataType='date'. Please update your column definition.`);
437
+ this.logger.consoleError(`Column "${colDef.colId}" uses cellDataType="dateString" which is no longer supported. It has been replaced with cellDataType="date". Please update your column definition.`);
438
438
  colDef.cellDataType = 'date';
439
439
  }
440
440
  });
@@ -465,8 +465,8 @@ export class AdaptableAgGrid {
465
465
  const agGridApi = await this.initializeAgGrid(gridOptions, config.modules, config.renderAgGridFrameworkComponent);
466
466
  if (agGridApi === false) {
467
467
  this.midwayDestroy();
468
- this.logger.consoleError(`Adaptable failed to initialize AG Grid!`);
469
- return Promise.reject('Adaptable failed to initialize AG Grid!');
468
+ this.logger.consoleError('Failed to initialize AG Grid.');
469
+ return Promise.reject('Failed to initialize AG Grid.');
470
470
  }
471
471
  this.layoutManager = new LayoutManager({
472
472
  gridApi: agGridApi,
@@ -491,7 +491,7 @@ export class AdaptableAgGrid {
491
491
  this.layoutManager.onColumnDefsChanged(() => {
492
492
  this.updateColumnModelAndRefreshGrid();
493
493
  });
494
- this.logger.info(`Hide Loading Screen`);
494
+ this.logger.info('Hiding loading screen');
495
495
  this.unmountLoadingScreen?.();
496
496
  perfInitAgGrid.end();
497
497
  initAgGridMarker.end();
@@ -502,7 +502,7 @@ export class AdaptableAgGrid {
502
502
  this.lifecycleState = 'agGridReady';
503
503
  this.api.entitlementApi.internalApi.setModulesAgGridDepsInfos();
504
504
  this.ModuleService.logMissingAgGridDepsInfos();
505
- this.logger.info(`Registered AG Grid modules (incl. dependent modules): `, this.agGridModulesAdapter.getAgGridRegisteredModuleNames().sort());
505
+ this.logger.info('Registered AG Grid modules (including dependents):', this.agGridModulesAdapter.getAgGridRegisteredModuleNames().sort());
506
506
  /**
507
507
  * At this point AG Grid is initialized!
508
508
  */
@@ -592,10 +592,7 @@ export class AdaptableAgGrid {
592
592
  const layoutState = state.Layout;
593
593
  // ensure that at least one Layout has been provided
594
594
  if (!layoutState || !layoutState.Layouts?.length) {
595
- this.logger
596
- .consoleError(`You have not defined any Layout in your InitialState.Layout.Layouts[] state!
597
-
598
- You need to define at least one Layout!`);
595
+ this.logger.consoleError('No Layouts defined in InitialState.Layout.Layouts[]. At least one Layout is required.');
599
596
  }
600
597
  // ensure CurrentLayout is valid
601
598
  if (!layoutState.CurrentLayout ||
@@ -760,19 +757,12 @@ You need to define at least one Layout!`);
760
757
  }
761
758
  normalizeAdaptableOptions(adaptableOptions) {
762
759
  if (this.hasAutogeneratedPrimaryKey) {
763
- this.logger
764
- .warn(`Autogenerated primary key (adaptableOptions.autogeneratedPrimaryKey = TRUE) should be used only as a last resort,
765
- when no unique column is available, as it limits some Adaptable functionalities!
766
-
767
- For more details see: ${PrimaryKeyDocsLink}`);
760
+ this.logger.warn(`Autogenerated primary key is enabled (adaptableOptions.autogeneratedPrimaryKey = true). This should be a last resort as it limits some Adaptable features. See: ${PrimaryKeyDocsLink}`);
768
761
  this.adaptableOptions.primaryKey = AUTOGENERATED_PK_COLUMN;
769
762
  return this.adaptableOptions;
770
763
  }
771
764
  if (StringExtensions.IsNullOrEmpty(adaptableOptions.primaryKey)) {
772
- this.logger.consoleError(`AdaptableOptions.primaryKey is required and cannot be empty or null!
773
- As a fallback, you can set adaptableOptions.autogeneratedPrimaryKey = TRUE
774
-
775
- For more details see: ${PrimaryKeyDocsLink}`);
765
+ this.logger.consoleError(`adaptableOptions.primaryKey is required and must not be empty. As a fallback, set adaptableOptions.autogeneratedPrimaryKey = true. See: ${PrimaryKeyDocsLink}`);
776
766
  }
777
767
  return adaptableOptions;
778
768
  }
@@ -804,7 +794,7 @@ You need to define at least one Layout!`);
804
794
  */
805
795
  this.agGridOptionsService.setGridOptionsProperty(gridOptions, 'defaultColDef', (original_defaultColDef) => {
806
796
  if (original_defaultColDef?.headerValueGetter) {
807
- this.logger.warn(`defaultColDef.headerValueGetter and overrides the Adaptable custom header mechanism! We recommend using a ColumnOptions.columnHeader instead!`);
797
+ this.logger.warn('defaultColDef.headerValueGetter overrides the Adaptable header mechanism. Consider using ColumnOptions.columnHeader instead.');
808
798
  return original_defaultColDef;
809
799
  }
810
800
  // #customize_header
@@ -821,7 +811,7 @@ You need to define at least one Layout!`);
821
811
  */
822
812
  this.agGridOptionsService.setGridOptionsProperty(gridOptions, 'defaultColGroupDef', (original_defaultColGroupDef) => {
823
813
  if (original_defaultColGroupDef?.headerValueGetter) {
824
- this.logger.warn(`defaultColGroupDef.headerValueGetter and overrides the Adaptable custom header mechanism! We recommend using a ColumnOptions.tableColumnHeader instead!`);
814
+ this.logger.warn('defaultColGroupDef.headerValueGetter overrides the Adaptable header mechanism. Consider using ColumnOptions.tableColumnHeader instead.');
825
815
  return original_defaultColGroupDef;
826
816
  }
827
817
  const defaultColGroupDef = { ...original_defaultColGroupDef };
@@ -841,12 +831,11 @@ You need to define at least one Layout!`);
841
831
  }
842
832
  if (original_autoGroupColumnDef?.filter === false) {
843
833
  // if user disables filter on autoGroupColumnDef, we respect that
844
- this.logger.info(`autoGroupColumnDef.filter is disabled as per user configuration.`);
834
+ this.logger.info('autoGroupColumnDef.filter is disabled via user configuration.');
845
835
  return original_autoGroupColumnDef;
846
836
  }
847
837
  if (typeof original_autoGroupColumnDef?.filter === 'object') {
848
- this.logger.consoleWarn(`autoGroupColumnDef.filter is set and overrides the Adaptable custom filter mechanism, so Adaptable will not be able to manage filtering for the Group Column!
849
- Please contact the Adaptable Support Team for further assistance and investigation.`);
838
+ this.logger.consoleWarn('autoGroupColumnDef.filter overrides the Adaptable filtering mechanism for the Group Column. Adaptable-managed filters will not apply to this column. Contact support for alternatives.');
850
839
  return original_autoGroupColumnDef;
851
840
  }
852
841
  const autoGroupColumnDef = { ...original_autoGroupColumnDef };
@@ -854,8 +843,7 @@ You need to define at least one Layout!`);
854
843
  // !! DO NOT REMOVE THIS !!
855
844
  // see https://github.com/ag-grid/ag-grid/blob/6f43ff257c2e285068eb425b655e58d6eeb89816/packages/ag-grid-enterprise/src/rowHierarchy/autoColService.ts#L225
856
845
  autoGroupColumnDef.filterValueGetter = (params) => {
857
- this.logger.consoleWarn(`An unexpected invocation of autoGroupColumnDef.filterValueGetter was detected. This execution path is not expected under normal operation.
858
- Please contact the Adaptable Support Team for further assistance and investigation.`, params);
846
+ this.logger.consoleWarn('Unexpected invocation of autoGroupColumnDef.filterValueGetter. This is not expected under normal operation. Please contact support.', params);
859
847
  return '';
860
848
  };
861
849
  // !! it is important that we always return the same component / handler instances
@@ -1425,15 +1413,14 @@ You need to define at least one Layout!`);
1425
1413
  const rowData = agGridApi.getGridOption('rowData');
1426
1414
  this.initWithLazyData = rowData == undefined || rowData.length === 0;
1427
1415
  if (this.initWithLazyData) {
1428
- this.logger.info('initWithLazyData = TRUE');
1416
+ this.logger.info('Initializing with lazy data (no initial rowData).');
1429
1417
  }
1430
1418
  if (!this.getAgGridContainerElement()) {
1431
1419
  // initialize the agGridContainerElement from the AgGrid instance
1432
1420
  const gridRoot = this.agGridAdapter.getAgGridRootElement();
1433
1421
  const gridContainer = gridRoot?.closest('[class*="ag-theme"]');
1434
1422
  if (!gridContainer) {
1435
- this.logger.consoleError(`No AG Grid container could be derived from the Adaptable framework wrapper.
1436
- Please contact AdapTable Support and in the meantime provide a valid container element in 'ContainerOptions.agGridContainer'!`);
1423
+ this.logger.consoleError('Failed to derive AG Grid container from the framework wrapper. Please provide a valid container element via ContainerOptions.agGridContainer.');
1437
1424
  }
1438
1425
  this.DANGER_USE_GETTER_agGridContainerElement = gridContainer;
1439
1426
  }
@@ -1441,7 +1428,7 @@ You need to define at least one Layout!`);
1441
1428
  }
1442
1429
  const agGridContainer = this.getAgGridContainerElement();
1443
1430
  if (!agGridContainer) {
1444
- this.logger.consoleError('No AG Grid container element found in the DOM. Please provide a valid container element in `ContainerOptions.agGridContainer`');
1431
+ this.logger.consoleError('AG Grid container element not found in the DOM. Please provide a valid element via ContainerOptions.agGridContainer.');
1445
1432
  return Promise.resolve(false);
1446
1433
  }
1447
1434
  let gridParams;
@@ -1856,7 +1843,7 @@ You need to define at least one Layout!`);
1856
1843
  // if no primary key column then lets check the first row to see if its a data item
1857
1844
  const primaryKeyDataItem = this.getFirstRowNode()?.data[primaryKey];
1858
1845
  if (!primaryKeyDataItem) {
1859
- errorMessage = `The Primary Key '${this.adaptableOptions.primaryKey}' does not exist. This will affect many functions in AdapTable.`;
1846
+ errorMessage = `Primary key column "${this.adaptableOptions.primaryKey}" not found. This will affect many Adaptable features.`;
1860
1847
  if (this.adaptableOptions.alertOptions.showMissingPrimaryKeyAlert) {
1861
1848
  // show an alert if that is the option
1862
1849
  this.api.alertApi.showAlertError('No Primary Key', errorMessage);
@@ -1913,12 +1900,12 @@ You need to define at least one Layout!`);
1913
1900
  checkShouldClearExistingFiltersOrSearches() {
1914
1901
  // if they have selected to clear Filters on startup then do it
1915
1902
  if (this.adaptableOptions.filterOptions.clearFiltersOnStartUp) {
1916
- this.logger.warn('Clearing any saved Filters as "clearFiltersOnStartUp" is true');
1903
+ this.logger.warn('Clearing saved filters (clearFiltersOnStartUp is enabled).');
1917
1904
  this.api.filterApi.clearAllFilters();
1918
1905
  }
1919
1906
  // if they have selected to clear searches on startup then do it
1920
1907
  if (this.adaptableOptions.quickSearchOptions.clearQuickSearchOnStartUp) {
1921
- this.logger.warn('Clearing any saved Searches as "clearQuickSearchOnStartUp" is true');
1908
+ this.logger.warn('Clearing saved Quick Search (clearQuickSearchOnStartUp is enabled).');
1922
1909
  this.api.quickSearchApi.clearQuickSearch();
1923
1910
  }
1924
1911
  }
@@ -2147,7 +2134,7 @@ You need to define at least one Layout!`);
2147
2134
  }
2148
2135
  }
2149
2136
  _updateColumnModelAndRefreshGridNow() {
2150
- this.logger.info(`Updating Column Model and Refreshing Grid.`);
2137
+ this.logger.info('Updating column model and refreshing grid.');
2151
2138
  this.deriveAdaptableColumnStateFromAgGrid();
2152
2139
  this.agGridColumnAdapter.setupColumns();
2153
2140
  this.redrawBody();
@@ -2173,7 +2160,7 @@ You need to define at least one Layout!`);
2173
2160
  this.agGridAdapter.getAgGridApi().redrawRows(redrawRowsParams);
2174
2161
  }
2175
2162
  catch (ex) {
2176
- this.logger.consoleError('AG Grid redrawRows was unable to find some row nodes. Tried to redraw row nodes: ', rowNodes, ex);
2163
+ this.logger.consoleError('AG Grid redrawRows failed to locate some row nodes.', rowNodes, ex);
2177
2164
  }
2178
2165
  }
2179
2166
  redrawRow(rowNode) {
@@ -2583,14 +2570,14 @@ You need to define at least one Layout!`);
2583
2570
  }
2584
2571
  autoSizeColumns(columnIds) {
2585
2572
  if (!this.agGridModulesAdapter.isAgGridModuleRegistered('ColumnAutoSizeModule')) {
2586
- this.logger.consoleError(`Could not auto-size columns [${columnIds}] - missing required AG Grid module 'ColumnAutoSizeModule'`);
2573
+ this.logger.consoleError(`Auto-sizing columns [${columnIds}] requires the AG Grid "ColumnAutoSizeModule". Please register this module.`);
2587
2574
  return;
2588
2575
  }
2589
2576
  this.layoutManager.autoSizeColumns(columnIds);
2590
2577
  }
2591
2578
  autoSizeAllColumns() {
2592
2579
  if (!this.agGridModulesAdapter.isAgGridModuleRegistered('ColumnAutoSizeModule')) {
2593
- this.logger.consoleError(`Could not auto-size all columns - missing required AG Grid module 'ColumnAutoSizeModule'`);
2580
+ this.logger.consoleError('Auto-sizing all columns requires the AG Grid "ColumnAutoSizeModule". Please register this module.');
2594
2581
  return;
2595
2582
  }
2596
2583
  const agGridApi = this.agGridAdapter.getAgGridApi();
@@ -2748,7 +2735,7 @@ You need to define at least one Layout!`);
2748
2735
  customInFilterValuesResult = await customInFilterValues(customInFilterValuesContext);
2749
2736
  }
2750
2737
  catch (error) {
2751
- this.logger.consoleError(`Failed to fetch custom filter values`, column, error);
2738
+ this.logger.consoleError('Failed to retrieve custom filter values.', column, error);
2752
2739
  }
2753
2740
  return customInFilterValuesResult;
2754
2741
  }
@@ -2788,7 +2775,7 @@ You need to define at least one Layout!`);
2788
2775
  customDistinctValues = await customEditColumnValues(customEditValuesContext);
2789
2776
  }
2790
2777
  catch (error) {
2791
- this.logger.consoleError(`Failed to fetch custom edit values`, column, error);
2778
+ this.logger.consoleError('Failed to retrieve custom edit values.', column, error);
2792
2779
  }
2793
2780
  return customDistinctValues ?? [];
2794
2781
  }
@@ -3243,7 +3230,7 @@ You need to define at least one Layout!`);
3243
3230
  if (this.getAgGridRowModelType() !== 'clientSide') {
3244
3231
  // only in client-side row model can we loop through filtered&sorted rows
3245
3232
  // see https://www.ag-grid.com/javascript-data-grid/accessing-data/#iterating-rows
3246
- this.logger.warn('`forAllVisibleRowNodesDo()` is only supported in client-side row model. `forAllRowNodesDo` will be used instead.');
3233
+ this.logger.warn('forAllVisibleRowNodesDo() is only supported with client-side row model. Falling back to forAllRowNodesDo().');
3247
3234
  return this.forAllRowNodesDo(func, config);
3248
3235
  }
3249
3236
  this.agGridAdapter.getAgGridApi().forEachNodeAfterFilterAndSort((rowNode, rowIndex) => {
@@ -3295,14 +3282,14 @@ You need to define at least one Layout!`);
3295
3282
  }
3296
3283
  selectNode(rowNode, clearSelection) {
3297
3284
  if (!rowNode) {
3298
- this.logger.error('No node to select');
3285
+ this.logger.error('Cannot select: row node is null.');
3299
3286
  return;
3300
3287
  }
3301
3288
  rowNode.setSelected(true, clearSelection);
3302
3289
  }
3303
3290
  deSelectNode(rowNode, clearSelection) {
3304
3291
  if (!rowNode) {
3305
- this.logger.error('No node to deselect');
3292
+ this.logger.error('Cannot deselect: row node is null.');
3306
3293
  return;
3307
3294
  }
3308
3295
  rowNode.setSelected(false, clearSelection);
@@ -3390,7 +3377,7 @@ You need to define at least one Layout!`);
3390
3377
  }
3391
3378
  showChart(chartDefinition, container) {
3392
3379
  if (!this.isReady) {
3393
- this.logger.consoleError('Adaptable must be instantiated before calling showChart');
3380
+ this.logger.consoleError('Cannot call showChart before Adaptable is fully initialized.');
3394
3381
  return null;
3395
3382
  }
3396
3383
  /**
@@ -3411,7 +3398,7 @@ You need to define at least one Layout!`);
3411
3398
  }
3412
3399
  updateChart(chart) {
3413
3400
  if (!chart.Model) {
3414
- this.logger.consoleError(`Chart definition must have a Model property to be updated: ${chart.Name}`);
3401
+ this.logger.consoleError(`Cannot update chart "${chart.Name}": the chart definition is missing the required Model property.`);
3415
3402
  return;
3416
3403
  }
3417
3404
  const upgradableProperties = {
@@ -3423,12 +3410,21 @@ You need to define at least one Layout!`);
3423
3410
  suppressChartRanges: Boolean(chart.Model.suppressChartRanges),
3424
3411
  aggFunc: chart.Model.aggFunc,
3425
3412
  };
3413
+ // Skip the AG Grid API call if the upgradable properties haven't changed
3414
+ // to avoid unnecessary chartOptionsChanged events (see #ag_grid_update_chart_loop)
3415
+ const currentModel = this.getChartModels().find((model) => model.chartId === chart.Model.chartId);
3416
+ if (currentModel &&
3417
+ Boolean(currentModel.unlinkChart) === upgradableProperties.unlinkChart &&
3418
+ Boolean(currentModel.suppressChartRanges) === upgradableProperties.suppressChartRanges &&
3419
+ currentModel.aggFunc === upgradableProperties.aggFunc) {
3420
+ return;
3421
+ }
3426
3422
  // see also #ag_grid_update_chart_loop
3427
3423
  this.agGridAdapter.getAgGridApi().updateChart(upgradableProperties);
3428
3424
  }
3429
3425
  getChartModels() {
3430
3426
  if (!this.isReady) {
3431
- this.logger.consoleError('Adaptable must be instantiated before calling getChartModels');
3427
+ this.logger.consoleError('Cannot call getChartModels before Adaptable is fully initialized.');
3432
3428
  return [];
3433
3429
  }
3434
3430
  return this.agGridAdapter.getAgGridApi().getChartModels();
@@ -3462,7 +3458,7 @@ You need to define at least one Layout!`);
3462
3458
  }
3463
3459
  setAgGridQuickSearch(searchText) {
3464
3460
  if (!this.agGridModulesAdapter.isAgGridModuleRegistered('QuickFilterModule')) {
3465
- this.logger.consoleError(`Can NOT set Quick Search text - missing required AG Grid module 'QuickFilterModule'`);
3461
+ this.logger.consoleError('Quick Search requires the AG Grid "QuickFilterModule". Please register this module to enable Quick Search.');
3466
3462
  return;
3467
3463
  }
3468
3464
  this.agGridAdapter.setGridOption('quickFilterText', searchText);
@@ -3472,7 +3468,7 @@ You need to define at least one Layout!`);
3472
3468
  }
3473
3469
  setAgGridFindSearchValue(searchText) {
3474
3470
  if (!this.agGridModulesAdapter.isAgGridModuleRegistered('FindModule')) {
3475
- this.logger.consoleError(`Can NOT set Find Search text - missing required AG Grid module 'FindModule'`);
3471
+ this.logger.consoleError('Find Search requires the AG Grid "FindModule". Please register this module to enable Find Search.');
3476
3472
  return;
3477
3473
  }
3478
3474
  this.agGridAdapter.setGridOption('findSearchValue', searchText);
@@ -4001,7 +3997,7 @@ You need to define at least one Layout!`);
4001
3997
  cellDataChangedInfos.forEach((cellDataChangedInfo) => {
4002
3998
  // if a Cell Data Change is undone, log to the Console
4003
3999
  if (cellDataChangedInfo.trigger === 'undo') {
4004
- this.logger.info(`Undo data change: PK(${cellDataChangedInfo.primaryKeyValue}) Col(${cellDataChangedInfo.column}) RevertedValue(${cellDataChangedInfo.oldValue}) OriginalValue(${cellDataChangedInfo.newValue})`);
4000
+ this.logger.info(`Data change reverted: column="${cellDataChangedInfo.column}", primaryKey="${cellDataChangedInfo.primaryKeyValue}", from=${cellDataChangedInfo.newValue} to=${cellDataChangedInfo.oldValue}`);
4005
4001
  }
4006
4002
  // For Changes except Aggregations, reset cell selection if required
4007
4003
  if (cellDataChangedInfo.trigger === 'edit' ||
@@ -4206,7 +4202,7 @@ You need to define at least one Layout!`);
4206
4202
  this.api.layoutApi.createOrUpdateLayout(layout);
4207
4203
  }
4208
4204
  refreshAdaptableAfterLayoutChange(layout) {
4209
- this.logger.info('refreshAdaptableAfterLayoutChange()');
4205
+ this.logger.info('Refreshing Adaptable after layout change.');
4210
4206
  const prevLayoutForRefresh = this.__prevLayoutForRefresh || this.api.layoutApi.getCurrentLayout();
4211
4207
  // see #on-regroup-expect-group-column-to-be-recomputed-and-setup-properly
4212
4208
  const rowGroupsChanged = this.isRowGroupDifferentInLayout(prevLayoutForRefresh, layout);
@@ -4252,7 +4248,7 @@ You need to define at least one Layout!`);
4252
4248
  .forEach((colType) => {
4253
4249
  const newValidCellDataType = mapOldTypeToDataType(colType);
4254
4250
  if (newValidCellDataType) {
4255
- this.logger.consoleWarn(`Column ${columnDefinition.colId ?? columnDefinition.field} has a type of ${colType} which is no longer in use${newValidCellDataType !== 'unknown' ? `. Please use 'colDef.cellDataType' instead: ${newValidCellDataType}` : ''}`);
4251
+ this.logger.consoleWarn(`Column "${columnDefinition.colId ?? columnDefinition.field}" uses deprecated type "${colType}"${newValidCellDataType !== 'unknown' ? `. Use colDef.cellDataType="${newValidCellDataType}" instead.` : '. This type is no longer supported.'}`);
4256
4252
  }
4257
4253
  });
4258
4254
  });
@@ -145,7 +145,7 @@ export class AgGridAdapter {
145
145
  }
146
146
  }
147
147
  options['columnDefs'] = colDefsWithSpecialColumns;
148
- self.logger.info(`Added SpecialColumns on GridOptions.columnDefs update (source=${source})`);
148
+ self.logger.info(`Added special columns on GridOptions.columnDefs update (source="${source}").`);
149
149
  }
150
150
  // `context`
151
151
  const passedContext = options.context;
@@ -165,7 +165,7 @@ export class AgGridAdapter {
165
165
  }
166
166
  const agGridColumnFilterService = this.DANGER_getPrivateAgGridBeans()?.colFilter;
167
167
  if (!agGridColumnFilterService) {
168
- this.logger.consoleError('Could not get hold of ColumnFilterService! This is a critical error and will prevent Adaptable from working correctly.');
168
+ this.logger.consoleError('Failed to initialize ColumnFilterService. Filtering and related features will not function correctly.');
169
169
  return;
170
170
  }
171
171
  const self = this;
@@ -211,7 +211,7 @@ export class AgGridAdapter {
211
211
  DANGER_getPrivateAgGridBeans() {
212
212
  const beans = DANGER_AG_GRID_BEANS_MAP[this._agGridId];
213
213
  if (!beans) {
214
- this.logger.consoleError('Could not get hold of AgGridBeans! This is a critical error and will prevent Adaptable from working correctly.');
214
+ this.logger.consoleError('Failed to access AG Grid internal beans. Adaptable will not function correctly.');
215
215
  }
216
216
  return beans;
217
217
  }
@@ -355,7 +355,7 @@ export class AgGridAdapter {
355
355
  if (isEndRowPin) {
356
356
  shouldIncludeRange = false;
357
357
  }
358
- this.logger.consoleWarn('Cannot select pinned rows in AG Grid.');
358
+ this.logger.consoleWarn('Pinned rows cannot be selected in AG Grid.');
359
359
  }
360
360
  if (shouldIncludeRange) {
361
361
  const y1 = Math.min(rangeSelection.startRow.rowIndex, rangeSelection.endRow.rowIndex);
@@ -525,7 +525,7 @@ export class AgGridAdapter {
525
525
  deriveAdaptableColumnDataType(agColumn, logWarning = true) {
526
526
  // Some columns can have no ID or Title. we return string as a consequence but it needs testing
527
527
  if (!agColumn) {
528
- this.logger.warn(`Column is undefined, returning 'text' for Type`);
528
+ this.logger.warn('Column is undefined. Defaulting data type to "text".');
529
529
  return 'text';
530
530
  }
531
531
  if (this.adaptableApi.columnApi.isAutoRowGroupColumnForSingle(agColumn.getId())) {
@@ -568,7 +568,7 @@ export class AgGridAdapter {
568
568
  let row = this.getAgGridApi().getDisplayedRowAtIndex(0);
569
569
  if (row == null) {
570
570
  // possible that there will be no data.
571
- this.logger.consoleError(`No data in grid, returning type "unknown" for Column: "${agColumn.getColId()}". This will impact several Adaptable features, such as Filters and ColumnFormats.`);
571
+ this.logger.consoleError(`No data in grid. Returning type "unknown" for column "${agColumn.getColId()}". This will affect features such as Filters and Column Formats.`);
572
572
  return 'unknown';
573
573
  }
574
574
  // // if it's a group we need the content of the group
@@ -610,7 +610,7 @@ export class AgGridAdapter {
610
610
  dataType = arrayDataType;
611
611
  }
612
612
  }
613
- this.logger.consoleWarn(`No defined type for column '${agColumn.getColId()}'. Defaulting to type of first row value: ${dataType}`);
613
+ this.logger.consoleWarn(`No explicit type for column "${agColumn.getColId()}". Inferred type from first row value: "${dataType}".`);
614
614
  return dataType;
615
615
  }
616
616
  isColumnReadonly(colDef) {
@@ -796,7 +796,7 @@ export class AgGridAdapter {
796
796
  colDef.colId = colDef.field;
797
797
  }
798
798
  if (!colDef.colId) {
799
- this.logger.warn('A column is missing the colId - please check ', colDef, 'Either pass a "field" property or a "colId" property.');
799
+ this.logger.warn('Column definition is missing colId. Provide either a "field" or "colId" property.', colDef);
800
800
  }
801
801
  };
802
802
  this.patchColDefs(colDefs, assignColId);
@@ -71,6 +71,7 @@ export declare class AgGridColumnAdapter {
71
71
  private getAlertCellStyle;
72
72
  private getFlashingCellStyle;
73
73
  private getCellHighlightStyle;
74
+ private getColumnHighlightStyle;
74
75
  isColGroupDef(columnDefinition: ColDef | ColGroupDef): columnDefinition is ColGroupDef;
75
76
  private getRelevantFormatColumnHeaderStyles;
76
77
  }
@@ -398,6 +398,7 @@ export class AgGridColumnAdapter {
398
398
  ...this.getAlertCellStyle(gridCell, params),
399
399
  ...this.getFlashingCellStyle(gridCell, params),
400
400
  ...this.getCellHighlightStyle(gridCell, params),
401
+ ...this.getColumnHighlightStyle(gridCell, params),
401
402
  };
402
403
  return normalizeStyleForAgGrid(result);
403
404
  };
@@ -655,7 +656,7 @@ export class AgGridColumnAdapter {
655
656
  if (typeof original_filter !== 'boolean' &&
656
657
  typeof original_filter?.handler !== 'function' &&
657
658
  !pivotMode) {
658
- this.adaptableApi.consoleError(`Column '${colId}' has a custom filter defined in colDef.filter, but Adaptable Filtering accepts only the TRUE/FALSE values!`);
659
+ this.adaptableApi.consoleError(`Column "${colId}" has a custom filter in colDef.filter, but Adaptable filtering only accepts boolean (true/false) values for this property.`);
659
660
  return false;
660
661
  }
661
662
  return {
@@ -1289,14 +1290,24 @@ export class AgGridColumnAdapter {
1289
1290
  : flashingCell.flashingCellDefinition.NeutralChangeStyle) ?? {});
1290
1291
  }
1291
1292
  getCellHighlightStyle(gridCell, params) {
1292
- const cellHightlight = this.adaptableApi.internalApi
1293
+ const cellHighlight = this.adaptableApi.internalApi
1293
1294
  .getInternalState()
1294
1295
  .CellHighlightInfo.find((cellHighlightInfo) => {
1295
1296
  return (gridCell.column.columnId === cellHighlightInfo.columnId &&
1296
1297
  cellHighlightInfo.primaryKeyValue === gridCell.primaryKeyValue);
1297
1298
  });
1298
- if (cellHightlight) {
1299
- return convertAdaptableStyleToCSS(cellHightlight.highlightStyle);
1299
+ if (cellHighlight) {
1300
+ return convertAdaptableStyleToCSS(cellHighlight.highlightStyle);
1301
+ }
1302
+ }
1303
+ getColumnHighlightStyle(gridCell, params) {
1304
+ const columnHighlight = this.adaptableApi.internalApi
1305
+ .getInternalState()
1306
+ .ColumnHighlightInfo.find((columnHighlightInfo) => {
1307
+ return (gridCell.column.columnId === columnHighlightInfo.columnId);
1308
+ });
1309
+ if (columnHighlight) {
1310
+ return convertAdaptableStyleToCSS(columnHighlight.highlightStyle);
1300
1311
  }
1301
1312
  }
1302
1313
  isColGroupDef(columnDefinition) {
@@ -66,7 +66,7 @@ export class AgGridExportAdapter {
66
66
  try {
67
67
  if (showProgressIndicator) {
68
68
  this.adaptableApi.userInterfaceApi.showProgressIndicator({
69
- text: `${report.Name} Export in progress...`,
69
+ text: `Exporting ${report.Name}...`,
70
70
  });
71
71
  // waitForTimeout required to give the ProgressIndicator rendering a head-start (see rAF in ProgressIndicator implementation)
72
72
  // see #raf_progress_indicator
@@ -120,7 +120,7 @@ export class AgGridExportAdapter {
120
120
  };
121
121
  }
122
122
  catch (error) {
123
- this.logger.consoleError(`Error exporting ${report.Name} in ${format} format to ${config.destination}`, error.stack);
123
+ this.logger.consoleError(`Export failed: report="${report.Name}", format="${format}", destination="${config.destination}".`, error.stack);
124
124
  }
125
125
  finally {
126
126
  /**
@@ -142,7 +142,7 @@ export class AgGridExportAdapter {
142
142
  const exportContext = this.buildExportProcessContext(config);
143
143
  let exportParams = this.buildExportParams(exportContext);
144
144
  if (typeof config?.customExportParams === 'function') {
145
- this.logger.info(`Custom export params for ${config.report.Name} in ${config.format} format`);
145
+ this.logger.info(`Applying custom export params: report="${config.report.Name}", format="${config.format}".`);
146
146
  exportParams = config.customExportParams(exportParams);
147
147
  }
148
148
  exportContext.exportedColumnIds = exportParams.columnKeys;
@@ -508,7 +508,7 @@ export class AgGridExportAdapter {
508
508
  const columnId = column.getId();
509
509
  const adaptableColumn = getAdaptableColumnWithColumnId(columnId);
510
510
  if (!adaptableColumn) {
511
- this.logger.warn(`Export Styling: Column with id ${columnId} not found in Adaptable`);
511
+ this.logger.warn(`Export styling: column "${columnId}" not found in Adaptable.`);
512
512
  return;
513
513
  }
514
514
  let headerClassParams = {
@@ -571,7 +571,7 @@ export class AgGridExportAdapter {
571
571
  const columnId = column.getId();
572
572
  const adaptableColumn = getAdaptableColumnWithColumnId(columnId);
573
573
  if (!adaptableColumn) {
574
- this.logger.warn(`Export Styling: Column with id ${columnId} not found in Adaptable`);
574
+ this.logger.warn(`Export styling: column "${columnId}" not found in Adaptable.`);
575
575
  return;
576
576
  }
577
577
  const isDateCellExportedAsFormattedValue = this.isDateCellExportedAsFormattedValue(adaptableColumn, exportContext);
@@ -101,9 +101,9 @@ export class AgGridThemeAdapter {
101
101
  }
102
102
  }
103
103
  else {
104
- this.logger.warn('No AgGrid container found, defaulting to ag-theme-balham for the light theme');
104
+ this.logger.warn('AG Grid container not found. Defaulting to ag-theme-balham for the light theme.');
105
105
  }
106
- this.logger.warn('No ag-theme- class found on the grid container, defaulting to ag-theme-balham');
106
+ this.logger.warn('No ag-theme-* class found on the grid container. Defaulting to ag-theme-balham.');
107
107
  // fallback to the default light theme
108
108
  return 'ag-theme-balham';
109
109
  }
@@ -152,7 +152,7 @@ const OverlayTrigger = React.forwardRef((givenProps, ref) => {
152
152
  target = targetProp(target);
153
153
  }
154
154
  if (!target) {
155
- adaptable.logger.warn('No OverlayTrigger target - make sure you render a child inside the OverlayTrigger, which will be the overlay target');
155
+ adaptable.logger.warn('OverlayTrigger target not found. Ensure a child element is rendered inside the OverlayTrigger component.');
156
156
  return;
157
157
  }
158
158
  targetRef.current = target;