@adaptabletools/adaptable 24.0.0-canary.4 → 24.0.0-canary.6

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 (104) hide show
  1. package/aql.d.ts +104 -0
  2. package/aql.js +212 -0
  3. package/devtools.d.ts +182 -1
  4. package/index.css +271 -102
  5. package/package.json +2 -1
  6. package/src/AdaptableInterfaces/IAdaptable.d.ts +4 -4
  7. package/src/AdaptableOptions/DefaultAdaptableOptions.js +5 -5
  8. package/src/AdaptableOptions/FlashingCellOptions.d.ts +3 -3
  9. package/src/AdaptableOptions/SettingsPanelOptions.d.ts +6 -4
  10. package/src/AdaptableOptions/StateOptions.d.ts +37 -13
  11. package/src/AdaptableState/AdaptableState.d.ts +2 -0
  12. package/src/AdaptableState/Common/AdaptableAlert.d.ts +15 -0
  13. package/src/AdaptableState/Common/AdaptableAlert.js +9 -0
  14. package/src/AdaptableState/QuickSearchState.d.ts +4 -0
  15. package/src/Api/Events/LayoutChanged.d.ts +5 -3
  16. package/src/Api/Implementation/AlertApiImpl.d.ts +5 -5
  17. package/src/Api/Implementation/AlertApiImpl.js +26 -19
  18. package/src/Api/Implementation/ColumnScopeApiImpl.js +3 -3
  19. package/src/Api/Implementation/StateApiImpl.d.ts +1 -1
  20. package/src/Api/Implementation/StateApiImpl.js +4 -3
  21. package/src/Api/Internal/AlertInternalApi.js +12 -7
  22. package/src/Api/Internal/CalculatedColumnInternalApi.js +1 -1
  23. package/src/Api/Internal/StateInternalApi.d.ts +1 -1
  24. package/src/Api/Internal/StateInternalApi.js +2 -2
  25. package/src/Api/StateApi.d.ts +2 -2
  26. package/src/Redux/ActionsReducers/LayoutRedux.d.ts +3 -3
  27. package/src/Redux/ActionsReducers/QuickSearchRedux.d.ts +0 -4
  28. package/src/Redux/ActionsReducers/QuickSearchRedux.js +3 -7
  29. package/src/Redux/Store/AdaptableReduxLocalStorageEngine.d.ts +8 -0
  30. package/src/Redux/Store/AdaptableReduxLocalStorageEngine.js +12 -12
  31. package/src/Redux/Store/AdaptableStore.d.ts +8 -5
  32. package/src/Redux/Store/AdaptableStore.js +70 -38
  33. package/src/Redux/Store/Interface/IAdaptableStore.d.ts +5 -5
  34. package/src/Redux/Store/Interface/IStorageEngine.d.ts +4 -4
  35. package/src/Redux/Store/StateOptionsGuards.d.ts +58 -0
  36. package/src/Redux/Store/StateOptionsGuards.js +112 -0
  37. package/src/Redux/Store/isTransientReduxAction.d.ts +5 -0
  38. package/src/Redux/Store/isTransientReduxAction.js +19 -0
  39. package/src/Utilities/Constants/DocumentationLinkConstants.d.ts +1 -0
  40. package/src/Utilities/Constants/DocumentationLinkConstants.js +1 -0
  41. package/src/Utilities/Constants/ReduxConstants.d.ts +2 -2
  42. package/src/Utilities/Constants/ReduxConstants.js +5 -5
  43. package/src/Utilities/Helpers/AlertTypeHelper.d.ts +1 -1
  44. package/src/Utilities/Helpers/SettingsPanelHelper.d.ts +14 -0
  45. package/src/Utilities/Helpers/SettingsPanelHelper.js +37 -1
  46. package/src/Utilities/Helpers/UIHelper.d.ts +6 -3
  47. package/src/Utilities/Helpers/UIHelper.js +8 -4
  48. package/src/Utilities/ObjectFactory.js +3 -3
  49. package/src/View/Dashboard/DashboardPopupSections.js +1 -1
  50. package/src/View/GridInfo/GridInfoPopup.js +62 -25
  51. package/src/View/StyledColumn/RangesComponent.js +6 -6
  52. package/src/View/StyledColumn/Wizard/StyledColumnWizardBulletSection.js +2 -2
  53. package/src/View/StyledColumn/Wizard/StyledColumnWizardRangeBarSection.js +4 -4
  54. package/src/View/StyledColumn/Wizard/StyledColumnWizardStyleSection/StyledColumnWizardRangesSection.js +2 -2
  55. package/src/View/StyledColumn/Wizard/StyledColumnWizardStyleSection/StyledColumnWizardStyleSection.js +2 -2
  56. package/src/View/Wizard/CollapsibleWizardCard.d.ts +3 -1
  57. package/src/View/Wizard/CollapsibleWizardCard.js +17 -9
  58. package/src/agGrid/AdaptableAgGrid.d.ts +4 -4
  59. package/src/agGrid/AdaptableAgGrid.js +2 -0
  60. package/src/agGrid/AgGridColumnAdapter.d.ts +1 -1
  61. package/src/agGrid/AgGridColumnAdapter.js +7 -5
  62. package/src/components/aql/QueryBuilder/QueryBuilderInputs.js +12 -2
  63. package/src/env.js +2 -2
  64. package/src/layout-manager/src/normalizeLayoutModel.d.ts +1 -1
  65. package/src/layout-manager/src/simplifyLayoutModel.d.ts +1 -1
  66. package/src/migration/AdaptableUpgradeHelper.d.ts +7 -2
  67. package/src/migration/VersionUpgrade17.js +13 -8
  68. package/src/setupDevTools.js +442 -103
  69. package/src/types.d.ts +1 -1
  70. package/tsconfig.esm.tsbuildinfo +1 -1
  71. package/upgrade.d.ts +1 -0
  72. package/upgrade.js +1 -0
  73. package/vendor/components/Button/index.d.ts +1 -1
  74. package/vendor/components/Button/index.d.ts.map +1 -1
  75. package/vendor/components/Button/index.js.map +1 -1
  76. package/vendor/components/CheckBox/index.d.ts +1 -1
  77. package/vendor/components/CheckBox/index.d.ts.map +1 -1
  78. package/vendor/components/CheckBox/index.js.map +1 -1
  79. package/vendor/components/ColorPicker/colorPickerTab.d.ts +4 -0
  80. package/vendor/components/ColorPicker/colorPickerTab.d.ts.map +1 -0
  81. package/vendor/components/ColorPicker/colorPickerTab.js +50 -0
  82. package/vendor/components/ColorPicker/colorPickerTab.js.map +1 -0
  83. package/vendor/components/ColorPicker/index.d.ts +31 -0
  84. package/vendor/components/ColorPicker/index.d.ts.map +1 -0
  85. package/vendor/components/ColorPicker/index.js +132 -0
  86. package/vendor/components/ColorPicker/index.js.map +1 -0
  87. package/vendor/components/ColorPicker/themeColors.d.ts +24 -0
  88. package/vendor/components/ColorPicker/themeColors.d.ts.map +1 -0
  89. package/vendor/components/ColorPicker/themeColors.js +52 -0
  90. package/vendor/components/ColorPicker/themeColors.js.map +1 -0
  91. package/vendor/components/Combobox/VirtualizedList.d.ts +1 -1
  92. package/vendor/components/Combobox/VirtualizedList.d.ts.map +1 -1
  93. package/vendor/components/Combobox/VirtualizedList.js.map +1 -1
  94. package/vendor/components/Combobox/index.d.ts +1 -1
  95. package/vendor/components/Combobox/index.d.ts.map +1 -1
  96. package/vendor/components/Combobox/index.js.map +1 -1
  97. package/vendor/components/index.css +213 -0
  98. package/vendor/components/index.d.ts +2 -0
  99. package/vendor/components/index.d.ts.map +1 -1
  100. package/vendor/components/index.js +1 -0
  101. package/vendor/components/index.js.map +1 -1
  102. package/vendor/components/ui/combobox.d.ts.map +1 -1
  103. package/vendor/components/ui/combobox.js +1 -1
  104. package/vendor/components/ui/combobox.js.map +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adaptabletools/adaptable",
3
- "version": "24.0.0-canary.4",
3
+ "version": "24.0.0-canary.6",
4
4
  "description": "Powerful AG Grid extension which provides advanced, cutting-edge functionality to meet all DataGrid requirements",
5
5
  "keywords": [
6
6
  "web-components",
@@ -59,6 +59,7 @@
59
59
  "normalize.css": "^8.0.1",
60
60
  "re-resizable": "6.10.3",
61
61
  "react": "^18.0.0 || ^19.0.0",
62
+ "react-colorful": "^5.8.1",
62
63
  "react-day-picker": "^9.14.0",
63
64
  "react-dom": "^18.0.0 || ^19.0.0",
64
65
  "react-redux": "9.2.0",
@@ -9,7 +9,7 @@ import { SelectedCellInfo } from '../AdaptableState/Selection/SelectedCellInfo';
9
9
  import { AdaptableTheme } from '../AdaptableState/ThemeState';
10
10
  import { IAdaptableStore } from '../Redux/Store/Interface/IAdaptableStore';
11
11
  import { IModuleCollection } from '../Strategy/Interface/IModule';
12
- import { AdaptableMenuItem, AdaptableOptions, AdaptablePlugin, AdaptableState, ChartDefinition, InFilterValueResult, SelectedRowInfo } from '../types';
12
+ import { AdaptableMenuItem, AdaptableOptions, AdaptablePersistentState, AdaptablePlugin, ChartDefinition, InFilterValueResult, SelectedRowInfo } from '../types';
13
13
  import { ICalculatedColumnExpressionService } from '../Utilities/Services/Interface/ICalculatedColumnExpressionService';
14
14
  import { IDataService } from '../Utilities/Services/Interface/IDataService';
15
15
  import { CommentsService } from '../Utilities/Services/CommentsService';
@@ -326,17 +326,17 @@ export interface IAdaptable {
326
326
  canExportToExcel(): boolean;
327
327
  canExportToCsv(): boolean;
328
328
  silentUpdateCurrentLayoutModel(layoutModel?: TableLayoutModel | PivotLayoutModel): void;
329
- normalizeAdaptableState(state: AdaptableState, options: NormalizeAdaptableStateOptions): AdaptableState;
329
+ normalizeAdaptableState(state: Partial<AdaptablePersistentState>, options: NormalizeAdaptableStateOptions): Partial<AdaptablePersistentState>;
330
330
  /**
331
331
  * Runs the startup upgrade chain when `stateOptions.autoMigrateState` is on.
332
332
  * A no-op when migration is disabled or the state is already current.
333
333
  */
334
- migrateLoadedAdaptableState(state: AdaptableState): AdaptableState;
334
+ migrateLoadedAdaptableState<T extends Partial<AdaptablePersistentState>>(state: T): T;
335
335
  /**
336
336
  * `loadStore` hook used at startup and when the state key changes:
337
337
  * migrate (when enabled), then normalise.
338
338
  */
339
- buildPostLoadHook(gridOptions: NormalizeAdaptableStateOptions): (state: AdaptableState) => AdaptableState;
339
+ buildPostLoadHook(gridOptions: NormalizeAdaptableStateOptions): (state: Partial<AdaptablePersistentState>) => Partial<AdaptablePersistentState>;
340
340
  refreshLayout(): void;
341
341
  }
342
342
  export type NormalizeAdaptableStateOptions = Pick<GridOptions, 'rowModelType' | 'treeData' | 'columnDefs' | 'autoGroupColumnDef' | 'defaultColDef' | 'pivotMode'>;
@@ -1,5 +1,5 @@
1
1
  import * as GeneralConstants from '../Utilities/Constants/GeneralConstants';
2
- import { getGraySwatchColor, getSwatchColorVar } from '../Utilities/Helpers/UIHelper';
2
+ import { themeColorVar } from '../Utilities/Helpers/UIHelper';
3
3
  import { ACCESS_LEVEL_FULL, EMPTY_STRING, EMPTY_ARRAY, DEFAULT_DATE_FORMAT_PATTERN_WITH_TIME, SYSTEM_REPORT_NAMES, SYSTEM_REPORT_FORMATS, SYSTEM_EXPORT_DESTINATIONS, } from '../Utilities/Constants/GeneralConstants';
4
4
  import { addUuidsToInitialState } from '../Utilities/Helpers/AdaptableHelper';
5
5
  import { defaultsDeep } from '../Utilities/Extensions/ObjectExtensions';
@@ -200,13 +200,13 @@ const DefaultAdaptableOptions = {
200
200
  defaultFlashDuration: 500,
201
201
  defaultFlashTarget: 'cell',
202
202
  defaultDownChangeStyle: {
203
- BackColor: getSwatchColorVar(18),
203
+ BackColor: themeColorVar('flash-down'),
204
204
  },
205
205
  defaultUpChangeStyle: {
206
- BackColor: getSwatchColorVar(7),
206
+ BackColor: themeColorVar('flash-up'),
207
207
  },
208
208
  defaultNeutralChangeStyle: {
209
- BackColor: getGraySwatchColor(),
209
+ BackColor: themeColorVar('flash-neutral'),
210
210
  },
211
211
  },
212
212
  formatColumnOptions: {
@@ -279,7 +279,7 @@ const DefaultAdaptableOptions = {
279
279
  position: undefined,
280
280
  size: undefined,
281
281
  customSettingsPanels: undefined,
282
- gridInfoTabs: ['Grid Options', 'Grid Summary', 'Grid State'],
282
+ gridInfoTabs: ['Grid Summary', 'Layout', 'Grid State', 'Grid Options'],
283
283
  },
284
284
  wizardOptions: {
285
285
  popupType: undefined,
@@ -10,17 +10,17 @@ export interface FlashingCellOptions {
10
10
  defaultFlashTarget?: FlashTarget;
11
11
  /**
12
12
  * Style for 'Down' value changes
13
- * @defaultValue Red BackColour
13
+ * @defaultValue BackColor of `var(--ab-color-flash-down)` (red in the shipped themes)
14
14
  */
15
15
  defaultDownChangeStyle?: AdaptableStyle;
16
16
  /**
17
17
  * Style for 'Up' value changes
18
- * @defaultValue Green BackColour
18
+ * @defaultValue BackColor of `var(--ab-color-flash-up)` (green in the shipped themes)
19
19
  */
20
20
  defaultUpChangeStyle?: AdaptableStyle;
21
21
  /**
22
22
  * Style for 'Neutral' value changes
23
- * @defaultValue Gray BackColour
23
+ * @defaultValue BackColor of `var(--ab-color-flash-neutral)` (gray in the shipped themes)
24
24
  */
25
25
  defaultNeutralChangeStyle?: AdaptableStyle;
26
26
  /**
@@ -74,9 +74,11 @@ export interface SettingsPanelOptions {
74
74
  */
75
75
  customSettingsPanels?: CustomSettingsPanel[];
76
76
  /**
77
- * Which Tabs can be used to display Grid Info: 'Grid Options', 'Grid Summary' or 'Grid State'
77
+ * Which Tabs to show in Grid Info: 'Grid Summary', 'Layout', 'Grid State' or 'Grid Options'
78
78
  *
79
- * @defaultValue ['Grid Options', 'Grid Summary', 'Grid State']
79
+ * Tab labels in the UI are Summary, Layout, State and Options
80
+ *
81
+ * @defaultValue ['Grid Summary', 'Layout', 'Grid State', 'Grid Options']
80
82
  */
81
83
  gridInfoTabs?: GridInfoTabs;
82
84
  }
@@ -182,6 +184,6 @@ export type PopupType = 'modal' | 'window';
182
184
  */
183
185
  export type GridInfoTabs = GridInfoTab[];
184
186
  /**
185
- * Tab to use for Grid Info: 'Grid Options', 'Grid Summary' or 'Grid State'
187
+ * Tab to use for Grid Info: 'Grid Summary', 'Layout', 'Grid State' or 'Grid Options'
186
188
  */
187
- export type GridInfoTab = 'Grid Options' | 'Grid Summary' | 'Grid State';
189
+ export type GridInfoTab = 'Grid Summary' | 'Layout' | 'Grid State' | 'Grid Options';
@@ -1,12 +1,22 @@
1
- import { AdaptableState } from '../AdaptableState/AdaptableState';
1
+ import { AdaptablePersistentState } from '../AdaptableState/AdaptableState';
2
2
  import { AdaptableApi } from '../Api/AdaptableApi';
3
3
  /**
4
4
  * Options related to Adaptable State hydration / dehydration; allows users to intercept state persistence and loading with custom functionality
5
+ *
6
+ * All functions deal with `AdaptablePersistentState` - the persisted subset of `AdaptableState`.
7
+ * Transient sections (`Internal`, `Popup`, `Comment`, `Plugins`) are never passed to, nor expected from, these functions.
8
+ *
9
+ * Hydration flow: `loadState()` -> (merge with `initialState`) -> `applyState()`
10
+ *
11
+ * Dehydration flow: `saveState()` -> `persistState()`
12
+ *
13
+ * To store Adaptable State in a custom format (e.g. wrapped in an envelope, compressed, encrypted) do the wrapping in `persistState()` and the unwrapping in `loadState()` - these are the only functions which own the storage format.
14
+ * `saveState()` and `applyState()` always operate on Adaptable State, as `loadState()`'s result is merged with `initialState` section by section before `applyState()` is called.
5
15
  */
6
16
  export interface StateOptions {
7
17
  /**
8
18
  * Retrieves saved Adaptable State from storage or external source
9
- * @returns Promise resolving to the retrieved state object
19
+ * @returns Promise resolving to the retrieved (possibly partial) state object, or to nothing if no state was persisted yet
10
20
  */
11
21
  loadState?: AdaptableLoadStateFunction;
12
22
  /**
@@ -15,7 +25,7 @@ export interface StateOptions {
15
25
  */
16
26
  persistState?: AdaptablePersistStateFunction;
17
27
  /**
18
- * Transforms state before applying it to the application. Called after `loadState()` but before the state is used.
28
+ * Transforms state before applying it to the application. Called after `loadState()` (and after merging with `initialState`) but before the state is used.
19
29
  * @returns The transformed state object
20
30
  */
21
31
  applyState?: AdaptableApplyStateFunction;
@@ -74,63 +84,77 @@ export interface AdaptableStateFunctionConfig {
74
84
  */
75
85
  actionName?: string;
76
86
  /**
77
- * Previous state before the action was applied.
87
+ * Previous (persistent) state before the action was applied.
78
88
  * This is useful for comparing changes or reverting if necessary.
79
89
  */
80
- previousState?: AdaptableState;
90
+ previousState?: AdaptablePersistentState;
81
91
  }
82
92
  /**
83
93
  * Function that handles persisting state to storage systems (localStorage, server, etc.).
84
94
  * Called after `saveState()` to store the prepared state.
85
95
  *
96
+ * This is the place to apply any custom storage format (envelope, compression, encryption, etc.); the matching `loadState()` is expected to undo it.
97
+ *
86
98
  * @example
87
99
  * ```
88
100
  * persistState = (state, stateFunctionConfig) => {
89
- * localStorage.setItem(stateFunctionConfig.adaptableStateKey, JSON.stringify(state))
101
+ * localStorage.setItem(stateFunctionConfig.adaptableStateKey, JSON.stringify(state));
102
+ * return Promise.resolve();
90
103
  * }
91
104
  * ```
92
105
  *
93
106
  * @param state The state to be persisted
94
107
  * @param adaptableStateFunctionConfig Configuration details for the current Adaptable instance
95
- * @returns Promise resolving once persistence is complete
108
+ * @returns Promise resolving once persistence is complete; the resolved value is ignored
96
109
  */
97
110
  export interface AdaptablePersistStateFunction {
98
- (state: any, adaptableStateFunctionConfig: AdaptableStateFunctionConfig): Promise<any>;
111
+ (state: AdaptablePersistentState, adaptableStateFunctionConfig: AdaptableStateFunctionConfig): Promise<unknown>;
99
112
  }
100
113
  /**
101
114
  * Function that clears persisted state from the storage system.
102
115
  * Only invoked during `StateApi.reloadInitialState()` operations.
116
+ *
117
+ * @returns Promise resolving once the persisted state is cleared; the resolved value is ignored
103
118
  */
104
119
  export interface AdaptableClearStateFunction {
105
- (adaptableStateFunctionConfig: AdaptableStateFunctionConfig): Promise<any>;
120
+ (adaptableStateFunctionConfig: AdaptableStateFunctionConfig): Promise<unknown>;
106
121
  }
107
122
  /**
108
123
  * Function that transforms state before persistence. Called first in the persistence flow, before `persistState()`.
109
124
  *
125
+ * The received state is the full persistent state of the current Adaptable instance (transient sections are already stripped).
126
+ *
110
127
  * @param state The Adaptable state to transform before saving
111
128
  * @param adaptableStateFunctionConfig Configuration details for the current Adaptable instance
112
129
  * @returns The modified state ready for persistence
113
130
  */
114
131
  export interface AdaptableSaveStateFunction {
115
- (state: AdaptableState, adaptableStateFunctionConfig: AdaptableStateFunctionConfig): any;
132
+ (state: AdaptablePersistentState, adaptableStateFunctionConfig: AdaptableStateFunctionConfig): AdaptablePersistentState;
116
133
  }
117
134
  /**
118
135
  * Function that retrieves Adaptable state from storage or external source. Called during initialization to hydrate the application state.
119
136
  *
137
+ * The result is merged with `AdaptableOptions.initialState` before being passed to `applyState()`, so it may be partial (only the sections which were persisted) or empty / nullish (nothing was persisted yet).
138
+ *
139
+ * This is the place to undo any custom storage format applied in `persistState()`.
140
+ *
120
141
  * @param config Configuration details for the current Adaptable instance
121
142
  * @returns Promise resolving to the retrieved state object
122
143
  */
123
144
  export interface AdaptableLoadStateFunction {
124
- (config: AdaptableStateFunctionConfig): Promise<any>;
145
+ (config: AdaptableStateFunctionConfig): Promise<Partial<AdaptablePersistentState> | null | void>;
125
146
  }
126
147
  /**
127
- * Function that applies the loaded state to the application. Called after `loadState()` but before the state is used.
148
+ * Function that applies the loaded state to the application. Called after `loadState()` (and after the result was merged with `initialState`) but before the state is used.
128
149
  * This allows for any necessary transformations or adjustments before the state is applied.
150
+ *
151
+ * The state is partial, as only the sections present in either the persisted state or `initialState` are available at this point; missing sections are initialised with their defaults afterwards.
152
+ *
129
153
  * @param state The loaded state to transform
130
154
  * @param adaptableStateFunctionConfig Configuration details for the current Adaptable instance
131
155
  *
132
156
  * @returns The transformed state object
133
157
  */
134
158
  export interface AdaptableApplyStateFunction {
135
- (state: any, adaptableStateFunctionConfig: AdaptableStateFunctionConfig): any;
159
+ (state: Partial<AdaptablePersistentState>, adaptableStateFunctionConfig: AdaptableStateFunctionConfig): Partial<AdaptablePersistentState>;
136
160
  }
@@ -32,6 +32,8 @@ export interface AdaptableState extends AdaptablePersistentState, AdaptableTrans
32
32
  }
33
33
  /**
34
34
  * The state object of Adaptable which is persisted
35
+ *
36
+ * This is the state shape handled by all `StateOptions` functions (`saveState`, `persistState`, `loadState`, `applyState`)
35
37
  */
36
38
  export interface AdaptablePersistentState {
37
39
  Application: ApplicationState;
@@ -21,8 +21,18 @@ export interface AdaptableGenericAlert extends AdaptableAlertBase<'generic'> {
21
21
  export interface AdaptableCellChangedAlert<TData = any> extends AdaptableAlertBase<'cellChanged'> {
22
22
  /**
23
23
  * Cell DataChange which triggered Alert
24
+ *
25
+ * For a consolidated batch Alert this is the first affected cell (jump-to-cell lands here).
24
26
  */
25
27
  cellDataChangedInfo: CellDataChangedInfo<TData>;
28
+ /**
29
+ * All cell changes represented by this Alert when several changes from one batch
30
+ * action were consolidated (`occurrenceCount` > 1). The first entry matches
31
+ * {@link AdaptableCellChangedAlert.cellDataChangedInfo}.
32
+ *
33
+ * Used so cell / row highlighting still applies to every affected cell.
34
+ */
35
+ cellDataChangedInfos?: CellDataChangedInfo<TData>[];
26
36
  }
27
37
  /**
28
38
  * Defines an Alert fired by AdapTable when a row is changed
@@ -64,3 +74,8 @@ export interface AdaptableAlertBase<T> extends Identifiable {
64
74
  }
65
75
  export declare const isAdaptableCellChangedAlert: (alert: AdaptableAlert) => alert is AdaptableCellChangedAlert;
66
76
  export declare const isAdaptableRowChangedAlert: (alert: AdaptableAlert) => alert is AdaptableRowChangedAlert;
77
+ /**
78
+ * Cell changes to highlight (or clear) for an Alert: every cell in a
79
+ * consolidated batch, otherwise the single {@link AdaptableCellChangedAlert.cellDataChangedInfo}.
80
+ */
81
+ export declare const getAlertCellDataChangedInfos: (alert: AdaptableAlert) => CellDataChangedInfo[];
@@ -4,3 +4,12 @@ export const isAdaptableCellChangedAlert = (alert) => {
4
4
  export const isAdaptableRowChangedAlert = (alert) => {
5
5
  return alert.alertType === 'rowChanged';
6
6
  };
7
+ export const getAlertCellDataChangedInfos = (alert) => {
8
+ if (!isAdaptableCellChangedAlert(alert)) {
9
+ return [];
10
+ }
11
+ if (alert.cellDataChangedInfos?.length) {
12
+ return alert.cellDataChangedInfos;
13
+ }
14
+ return alert.cellDataChangedInfo ? [alert.cellDataChangedInfo] : [];
15
+ };
@@ -14,10 +14,14 @@ export interface QuickSearchState extends BaseState {
14
14
  CellMatchStyle?: Omit<AdaptableStyle, 'ClassName'>;
15
15
  /**
16
16
  * Style used to highlight matching text within a cell (not availale in SSRM)
17
+ *
18
+ * @defaultValue `var(--ab-color-quick-search-match)` background and `var(--ab-color-quick-search-match-foreground)` text
17
19
  */
18
20
  TextMatchStyle?: Omit<AdaptableStyle, 'ClassName'>;
19
21
  /**
20
22
  * Style used to highlight matching text within current match (not availale in SSRM)
23
+ *
24
+ * @defaultValue `var(--ab-color-quick-search-current-match)` background, `var(--ab-color-quick-search-current-match-foreground)` text, bold
21
25
  */
22
26
  CurrentTextMatchStyle?: Omit<AdaptableStyle, 'ClassName'>;
23
27
  }
@@ -17,11 +17,13 @@ export interface LayoutChangedInfo extends BaseContext {
17
17
  */
18
18
  newLayoutState: LayoutState;
19
19
  /**
20
- * Facets of the **current** Layout that changed.
20
+ * Which parts of the **current** Layout changed.
21
+ *
22
+ * Use this when you care *what* changed, rather than which `actionName` fired:
21
23
  *
22
24
  * - `LAYOUT_SAVE`: diffs non-filter facets (e.g. `ColumnSorting`, `RowGrouping`)
23
- * - Column Filter actions: `['ColumnFilter']`
24
- * - Grid Filter actions: `['GridFilter']`
25
+ * - Column Filter actions: always `['ColumnFilter']`
26
+ * - Grid Filter actions: always `['GridFilter']`
25
27
  *
26
28
  * Omitted for layout identity changes (`LAYOUT_SELECT`, `LAYOUT_ADD`, `LAYOUT_DELETE`, `LAYOUT_READY`).
27
29
  */
@@ -38,10 +38,9 @@ export declare class AlertApiImpl extends ApiBase implements AlertApi {
38
38
  private applyPerChangeAlertEffects;
39
39
  /**
40
40
  * Effects that should only happen once for a given Alert: adding the Alert to the store (so it
41
- * shows in the toolbar/status bar), the toast notification, jumping to the cell/row and
42
- * highlighting the cell/row (which reads the highlight from the just-stored Alert). When Alerts
43
- * are consolidated these run a single time for the consolidated Alert, jumping to / highlighting
44
- * the first affected cell/row.
41
+ * shows in the toolbar/status bar), the toast notification and jumping to the cell/row.
42
+ * Highlighting reads the just-stored Alert and is applied to every cell in
43
+ * `cellDataChangedInfos` when the Alert is a consolidated batch.
45
44
  */
46
45
  private applyOnceAlertEffects;
47
46
  /**
@@ -69,7 +68,8 @@ export declare class AlertApiImpl extends ApiBase implements AlertApi {
69
68
  /**
70
69
  * Builds a single consolidated Alert from a group of Alerts fired by the same Alert Definition.
71
70
  * The representative (first) Alert's context is retained (so jump-to-cell lands on the first
72
- * affected cell) and an occurrence count / summary message is applied.
71
+ * affected cell) and an occurrence count / summary message is applied. Every cell change is
72
+ * kept on `cellDataChangedInfos` so highlighting still covers the whole batch.
73
73
  *
74
74
  * When every Alert in the group shares the same message (typical for a Bulk Update that sets the
75
75
  * same value across cells), we keep that message and append the "N cells triggered this Alert"
@@ -4,7 +4,7 @@ import * as AlertRedux from '../../Redux/ActionsReducers/AlertRedux';
4
4
  import { ApiBase } from './ApiBase';
5
5
  import * as ModuleConstants from '../../Utilities/Constants/ModuleConstants';
6
6
  import ObjectFactory from '../../Utilities/ObjectFactory';
7
- import { isAdaptableCellChangedAlert, isAdaptableRowChangedAlert, } from '../../AdaptableState/Common/AdaptableAlert';
7
+ import { getAlertCellDataChangedInfos, isAdaptableCellChangedAlert, isAdaptableRowChangedAlert, } from '../../AdaptableState/Common/AdaptableAlert';
8
8
  import StringExtensions from '../../Utilities/Extensions/StringExtensions';
9
9
  import { AlertInternalApi } from '../Internal/AlertInternalApi';
10
10
  import { resolveContainerElement } from '../../Utilities/resolveContainerElement';
@@ -100,26 +100,29 @@ export class AlertApiImpl extends ApiBase {
100
100
  this.getGridApi().jumpToRow(firstRowNode);
101
101
  }
102
102
  }
103
- if (isAdaptableCellChangedAlert(alertToShow) &&
104
- alertToShow.cellDataChangedInfo &&
103
+ const highlightCellChanges = getAlertCellDataChangedInfos(alertToShow);
104
+ if (highlightCellChanges.length &&
105
105
  (alertProperties.HighlightCell || alertProperties.HighlightRow)) {
106
- let alertNode = alertToShow.cellDataChangedInfo.rowNode;
107
- if (!alertNode) {
108
- alertNode = this.getGridApi().getRowNodeForPrimaryKey(alertToShow.cellDataChangedInfo.primaryKeyValue);
109
- }
110
- if (alertNode) {
111
- if (alertProperties.HighlightRow) {
112
- this.getGridApi().refreshRowNodes([alertNode]);
113
- setTimeout(() => {
114
- this.dispatchAction(InternalRedux.AdaptableAlertRemoveRowHighlight(alertToShow));
115
- }, this.getAlertOptions().rowHighlightDuration);
116
- }
117
- if (alertProperties.HighlightCell && alertToShow.cellDataChangedInfo.column) {
118
- this.getGridApi().refreshCell(alertNode, alertToShow.cellDataChangedInfo.column.columnId);
119
- setTimeout(() => {
120
- this.dispatchAction(InternalRedux.AdaptableAlertRemoveCellHighlight(alertToShow));
121
- }, this.getAlertOptions().cellHighlightDuration);
106
+ const highlightNodes = [];
107
+ highlightCellChanges.forEach((cellChange) => {
108
+ const alertNode = cellChange.rowNode ?? this.getGridApi().getRowNodeForPrimaryKey(cellChange.primaryKeyValue);
109
+ if (alertNode) {
110
+ highlightNodes.push(alertNode);
111
+ if (alertProperties.HighlightCell && cellChange.column) {
112
+ this.getGridApi().refreshCell(alertNode, cellChange.column.columnId);
113
+ }
122
114
  }
115
+ });
116
+ if (alertProperties.HighlightRow && highlightNodes.length) {
117
+ this.getGridApi().refreshRowNodes(highlightNodes);
118
+ setTimeout(() => {
119
+ this.dispatchAction(InternalRedux.AdaptableAlertRemoveRowHighlight(alertToShow));
120
+ }, this.getAlertOptions().rowHighlightDuration);
121
+ }
122
+ if (alertProperties.HighlightCell) {
123
+ setTimeout(() => {
124
+ this.dispatchAction(InternalRedux.AdaptableAlertRemoveCellHighlight(alertToShow));
125
+ }, this.getAlertOptions().cellHighlightDuration);
123
126
  }
124
127
  }
125
128
  else if (alertProperties.HighlightRow &&
@@ -188,10 +191,14 @@ export class AlertApiImpl extends ApiBase {
188
191
  const message = allSameMessage && StringExtensions.IsNotNullOrEmpty(representative.message)
189
192
  ? `${representative.message}\n${summaryMessage}`
190
193
  : summaryMessage;
194
+ const cellDataChangedInfos = group.flatMap((alert) => getAlertCellDataChangedInfos(alert));
191
195
  return {
192
196
  ...representative,
193
197
  occurrenceCount: count,
194
198
  message,
199
+ ...(isAdaptableCellChangedAlert(representative) && cellDataChangedInfos.length
200
+ ? { cellDataChangedInfos }
201
+ : {}),
195
202
  };
196
203
  }
197
204
  displayAdaptableAlertNotification(alert) {
@@ -1,6 +1,6 @@
1
1
  import { ApiBase } from './ApiBase';
2
2
  import ArrayExtensions from '../../Utilities/Extensions/ArrayExtensions';
3
- import { getGraySwatchColor } from '../../Utilities/Helpers/UIHelper';
3
+ import { getDefaultRangeColor } from '../../Utilities/Helpers/UIHelper';
4
4
  export class ColumnScopeApiImpl extends ApiBase {
5
5
  isColumnInScope(column, scope) {
6
6
  if (!column) {
@@ -238,7 +238,7 @@ export class ColumnScopeApiImpl extends ApiBase {
238
238
  {
239
239
  Min: 0,
240
240
  Max: 0,
241
- Color: getGraySwatchColor(),
241
+ Color: getDefaultRangeColor(),
242
242
  },
243
243
  ];
244
244
  }
@@ -246,7 +246,7 @@ export class ColumnScopeApiImpl extends ApiBase {
246
246
  {
247
247
  Min: 'Col-Min',
248
248
  Max: 'Col-Max',
249
- Color: getGraySwatchColor(),
249
+ Color: getDefaultRangeColor(),
250
250
  },
251
251
  ];
252
252
  }
@@ -43,7 +43,7 @@ export declare class StateApiImpl extends ApiBase implements StateApi {
43
43
  flushCurrentState?: boolean;
44
44
  progressIndicatorLabel?: string;
45
45
  }): Promise<void>;
46
- persistAdaptableState(): Promise<AdaptableState>;
46
+ persistAdaptableState(): Promise<AdaptablePersistentState>;
47
47
  getDescriptionForModule(module: AdaptableModule): string;
48
48
  getHelpPageForModule(module: AdaptableModule): string;
49
49
  getUserStateByStateKey(stateKey: AdaptableStateKey, returnJson?: boolean): BaseState | string;
@@ -1,4 +1,6 @@
1
1
  import { InitState } from '../../Redux/Store/AdaptableStore';
2
+ import { runAsyncStateFunction } from '../../Redux/Store/StateOptionsGuards';
3
+ import { loadState as defaultLoadState } from '../../Redux/Store/AdaptableReduxLocalStorageEngine';
2
4
  import { ApiBase } from './ApiBase';
3
5
  import Helper from '../../Utilities/Helpers/Helper';
4
6
  import { addUuidsToInitialState } from '../../Utilities/Helpers/AdaptableHelper';
@@ -56,7 +58,7 @@ export class StateApiImpl extends ApiBase {
56
58
  localStorage.removeItem(adaptableOptions.adaptableStateKey);
57
59
  return Promise.resolve(true);
58
60
  });
59
- const clearStatePromise = clearStateFn(this.internalApi.buildAdaptableStateFunctionConfig());
61
+ const clearStatePromise = runAsyncStateFunction('clearState', clearStateFn, [this.internalApi.buildAdaptableStateFunctionConfig()], this._adaptable.logger);
60
62
  return clearStatePromise.then(() => {
61
63
  this.setAdaptableStateKey(adaptableOptions.adaptableStateKey, {
62
64
  initialState: newInitialState || adaptableOptions.initialState,
@@ -82,8 +84,7 @@ export class StateApiImpl extends ApiBase {
82
84
  }
83
85
  async remergePersistedState() {
84
86
  const config = this.internalApi.buildAdaptableStateFunctionConfig();
85
- const loadState = this.getOptions().stateOptions.loadState;
86
- const userState = await loadState(config);
87
+ const userState = await runAsyncStateFunction('loadState', this.getOptions().stateOptions.loadState || defaultLoadState, [config], this._adaptable.logger);
87
88
  return this.internalApi.applyMergedInitialAndUserState(this.getInitialState(), userState);
88
89
  }
89
90
  getAllState() {
@@ -1,6 +1,6 @@
1
1
  import { ApiBase } from '../Implementation/ApiBase';
2
2
  import { expressionKindForAlertType, isRowChangeAlertDefinition, } from '../../AdaptableState/AlertState';
3
- import { isAdaptableCellChangedAlert, isAdaptableRowChangedAlert, } from '../../AdaptableState/Common/AdaptableAlert';
3
+ import { getAlertCellDataChangedInfos, isAdaptableCellChangedAlert, isAdaptableRowChangedAlert, } from '../../AdaptableState/Common/AdaptableAlert';
4
4
  import ArrayExtensions from '../../Utilities/Extensions/ArrayExtensions';
5
5
  import { AlertModuleId } from '../../Utilities/Constants/ModuleConstants';
6
6
  import ObjectFactory from '../../Utilities/ObjectFactory';
@@ -476,9 +476,16 @@ export class AlertInternalApi extends ApiBase {
476
476
  return this.getAdaptableAlerts().filter(isAdaptableRowChangedAlert);
477
477
  }
478
478
  getAdaptableAlertWithHighlightCell(columnId, rowNode) {
479
- return this.getAdaptableCellChangedAlerts().find((alert) => getRuleAlertProperties(alert.alertDefinition)?.HighlightCell &&
480
- alert.cellDataChangedInfo?.column?.columnId === columnId &&
481
- alert.cellDataChangedInfo?.rowNode === rowNode);
479
+ const primaryKeyValue = this.getGridApi().getPrimaryKeyValueForRowNode(rowNode);
480
+ return this.getAdaptableCellChangedAlerts().find((alert) => {
481
+ if (!getRuleAlertProperties(alert.alertDefinition)?.HighlightCell) {
482
+ return false;
483
+ }
484
+ return getAlertCellDataChangedInfos(alert).some((cellChange) => cellChange.column?.columnId === columnId &&
485
+ (cellChange.rowNode === rowNode ||
486
+ cellChange.rowNode?.id === rowNode.id ||
487
+ (primaryKeyValue != null && cellChange.primaryKeyValue === primaryKeyValue)));
488
+ });
482
489
  }
483
490
  getAdaptableAlertWithHighlightRow(rowNode) {
484
491
  let alertWithRowHighlight;
@@ -494,9 +501,7 @@ export class AlertInternalApi extends ApiBase {
494
501
  }
495
502
  alertWithRowHighlight = this.getAdaptableCellChangedAlerts().find((alert) => {
496
503
  if (getRuleAlertProperties(alert.alertDefinition)?.HighlightRow) {
497
- if (alert.cellDataChangedInfo?.rowNode.id == rowNode.id) {
498
- return alert;
499
- }
504
+ return getAlertCellDataChangedInfos(alert).some((cellChange) => cellChange.rowNode?.id == rowNode.id);
500
505
  }
501
506
  });
502
507
  return alertWithRowHighlight;
@@ -221,7 +221,7 @@ export class CalculatedColumnInternalApi extends ApiBase {
221
221
  if (calculatedColumnSettings.ShowToolTip != null &&
222
222
  calculatedColumnSettings.ShowToolTip == true) {
223
223
  newColDef.tooltipComponent = TwoLineTooltip;
224
- newColDef.tooltipValueGetter = (params) => {
224
+ newColDef.tooltip = (params) => {
225
225
  const formulaText = this.getAdaptableInternalApi().getAdaptableQueryExpressionText(calculatedColumn.Expression);
226
226
  if (!isPerRowCalculatedColumnType(getCalculatedColumnType(calculatedColumn)) ||
227
227
  !params?.node ||
@@ -7,7 +7,7 @@ export declare class StateInternalApi extends ApiBase {
7
7
  * Startup-equivalent merge: Initial State + user state → store, layout/theme/cells, persist.
8
8
  * Does not clear persistence and does not call `loadState` (caller supplies user state).
9
9
  */
10
- applyMergedInitialAndUserState(initialState: InitialState, userState: AdaptablePersistentState | Record<string, unknown> | null | undefined): Promise<void>;
10
+ applyMergedInitialAndUserState(initialState: InitialState, userState: Partial<AdaptablePersistentState> | null | void): Promise<void>;
11
11
  getAllStateForDevTools(): AdaptableState;
12
12
  /**
13
13
  * Replaces persisted Adaptable state with the supplied snapshot (e.g. from DevTools).
@@ -1,5 +1,6 @@
1
1
  import { getPersistableState, LoadState, InitState } from '../../Redux/Store/AdaptableStore';
2
2
  import { MergeStateFunction } from '../../Redux/Store/AdaptableReduxMerger';
3
+ import { runSyncStateFunction } from '../../Redux/Store/StateOptionsGuards';
3
4
  import { addUuidsToInitialState } from '../../Utilities/Helpers/AdaptableHelper';
4
5
  import { ApiBase } from '../Implementation/ApiBase';
5
6
  function deepClone(value) {
@@ -23,8 +24,7 @@ export class StateInternalApi extends ApiBase {
23
24
  const initialForMerge = addUuidsToInitialState(deepClone(initialState));
24
25
  const userForMerge = deepClone(userState ?? {});
25
26
  let merged = MergeStateFunction(initialForMerge, userForMerge);
26
- const stateFunctionConfig = this.buildAdaptableStateFunctionConfig();
27
- merged = this.getOptions().stateOptions.applyState(merged, stateFunctionConfig);
27
+ merged = runSyncStateFunction('applyState', this.getOptions().stateOptions.applyState, merged, this.buildAdaptableStateFunctionConfig(), this._adaptable.logger);
28
28
  merged = this._adaptable.migrateLoadedAdaptableState(merged);
29
29
  const agGridOptions = {
30
30
  columnDefs: this._adaptable.agGridAdapter.getGridOption('columnDefs'),
@@ -224,7 +224,7 @@ export interface StateApi {
224
224
  * This method first calls StateOption.saveState() to prepare the state
225
225
  * and then StateOptions.persistState() to save it to the configured storage.
226
226
  *
227
- * @returns Promise<AdaptableState> - A promise that resolves to the persisted state
227
+ * @returns A promise that resolves to the persisted state
228
228
  */
229
- persistAdaptableState(): Promise<AdaptableState>;
229
+ persistAdaptableState(): Promise<AdaptablePersistentState>;
230
230
  }
@@ -4,7 +4,7 @@ import { LayoutState, Layout } from '../../AdaptableState/LayoutState';
4
4
  import { ColumnFilter } from '../../types';
5
5
  import { LayoutExtensionInfo, LayoutExtensionModule } from '../../AdaptableState/Common/ExtendedLayout';
6
6
  /**
7
- * @ReduxAction Layout Module is ready
7
+ * @ReduxAction Layout Module is ready — fired once after AdapTable starts, for the Layout that is already current
8
8
  */
9
9
  export declare const LAYOUT_READY = "LAYOUT_READY";
10
10
  /**
@@ -20,11 +20,11 @@ export declare const LAYOUT_EDIT = "LAYOUT_EDIT";
20
20
  */
21
21
  export declare const LAYOUT_DELETE = "LAYOUT_DELETE";
22
22
  /**
23
- * @ReduxAction A Layout has been selected
23
+ * @ReduxAction A different Layout has been selected
24
24
  */
25
25
  export declare const LAYOUT_SELECT = "LAYOUT_SELECT";
26
26
  /**
27
- * @ReduxAction A Layout has been (auto)saved
27
+ * @ReduxAction A Layout has been saved, including auto-save after grid edits (sort, grouping, columns, and so on)
28
28
  */
29
29
  export declare const LAYOUT_SAVE = "LAYOUT_SAVE";
30
30
  /**
@@ -1,10 +1,6 @@
1
1
  import * as Redux from 'redux';
2
2
  import { QuickSearchState } from '../../AdaptableState/QuickSearchState';
3
3
  import { AdaptableStyle } from '../../AdaptableState/Common/AdaptableStyle';
4
- export declare const QUICK_SEARCH_DEFAULT_CELL_MATCH_STYLE: {
5
- BackColor: string;
6
- ForeColor: string;
7
- };
8
4
  export declare const QUICK_SEARCH_DEFAULT_TEXT_MATCH_STYLE: {
9
5
  BackColor: string;
10
6
  ForeColor: string;