@adaptabletools/adaptable 12.0.8 → 12.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adaptabletools/adaptable",
3
- "version": "12.0.8",
3
+ "version": "12.0.9",
4
4
  "description": "Powerful data-agnostic HTML5 datagrid add-on that sits on top of an underlying grid component and provides all the rich functionality that advanced users expect from their DataGrids and Data Tables",
5
5
  "keywords": [
6
6
  "web-components",
@@ -1,2 +1,2 @@
1
- declare const _default: 1657781105254;
1
+ declare const _default: 1657803750403;
2
2
  export default _default;
@@ -1,3 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.default = 1657781105254;
3
+ exports.default = 1657803750403;
@@ -16,6 +16,7 @@ import { GridDataChangedInfo } from './Events/GridDataChanged';
16
16
  import { TeamSharingEntityChangedInfo } from './Events/TeamSharingEntityChanged';
17
17
  import { ActionRowSubmittedInfo } from './Events/ActionRowSubmitted';
18
18
  import { DataSetSelectedInfo } from './Events/DataSetSelected';
19
+ import { AdaptableStateReloadedInfo } from './Events/AdaptableStateReloaded';
19
20
  /**
20
21
  * Responsible for publishing the many Events that AdapTable fires
21
22
  */
@@ -183,6 +184,17 @@ export interface EventApi {
183
184
  * Unsubscribe from AdaptableStateChanged
184
185
  */
185
186
  off(eventName: 'AdaptableStateChanged', callback: (adaptableStateChangedInfo: AdaptableStateChangedInfo) => void): void;
187
+ /**
188
+ * Event fired whenever **Adaptable State is reloaded**
189
+ * @param eventName AdaptableStateReloaded
190
+ * @param callback AdaptableStateReloadedInfo
191
+ * @returns the unsubscribe function
192
+ */
193
+ on(eventName: 'AdaptableStateReloaded', callback: (adaptableStateReloadedInfo: AdaptableStateReloadedInfo) => void): () => void;
194
+ /**
195
+ * Unsubscribe from AdaptableStateReloaded
196
+ */
197
+ off(eventName: 'AdaptableStateReloaded', callback: (adaptableStateReloadedInfo: AdaptableStateReloadedInfo) => void): void;
186
198
  /**
187
199
  * Event fired whenever **a change occurs relating to live reports / data**
188
200
  * Used in conjunction with AdapTable's partners OpenFin, ipushpull or Glue42
@@ -252,6 +264,6 @@ export interface EventApi {
252
264
  emitSync(eventName: 'DashboardChanged', data?: any): any[];
253
265
  emitSync(eventName: 'FlashingCellDisplayed', data?: any): any[];
254
266
  emitSync(eventName: 'AdaptableDestroy'): any[];
255
- emit(eventName: 'AdaptableReady' | 'AlertFired' | 'CheckboxColumnClicked' | 'CustomToolbarConfigured' | 'AdaptableStateChanged' | 'DashboardChanged' | 'CellChanged' | 'GridDataChanged' | 'LayoutChanged' | 'LiveDataChanged' | 'SearchChanged' | 'SelectionChanged' | 'SystemStatusMessageDisplayed' | 'TeamSharingEntityChanged' | 'ThemeChanged' | 'FDC3MessageSent' | 'ActionRowSubmitted' | 'DataSetSelected', data?: any): Promise<any>;
267
+ emit(eventName: 'AdaptableReady' | 'AlertFired' | 'CheckboxColumnClicked' | 'CustomToolbarConfigured' | 'AdaptableStateChanged' | 'AdaptableStateReloaded' | 'DashboardChanged' | 'CellChanged' | 'GridDataChanged' | 'LayoutChanged' | 'LiveDataChanged' | 'SearchChanged' | 'SelectionChanged' | 'SystemStatusMessageDisplayed' | 'TeamSharingEntityChanged' | 'ThemeChanged' | 'FDC3MessageSent' | 'ActionRowSubmitted' | 'DataSetSelected', data?: any): Promise<any>;
256
268
  destroy(): void;
257
269
  }
@@ -0,0 +1,23 @@
1
+ import { AdaptablePersistentState } from '../../PredefinedConfig/AdaptableState';
2
+ import { BaseEventInfo } from './BaseEventInfo';
3
+ /**
4
+ * Object returned by the `AdaptableStateReloaded` event
5
+ */
6
+ export interface AdaptableStateReloadedInfo extends BaseEventInfo {
7
+ /**
8
+ * Current AdapTableId
9
+ */
10
+ adaptableId: string;
11
+ /**
12
+ * Current Adaptable State Key
13
+ */
14
+ adaptableStateKey: string;
15
+ /**
16
+ * Adaptable State before the reload
17
+ */
18
+ oldState: AdaptablePersistentState;
19
+ /**
20
+ * Adaptable State after the reload
21
+ */
22
+ newState: AdaptablePersistentState;
23
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -48,6 +48,7 @@ class ConfigApiImpl extends ApiBase_1.ApiBase {
48
48
  reloadPredefinedConfig(newPredefinedConfig) {
49
49
  var _a;
50
50
  const adaptableOptions = this.adaptable.adaptableOptions;
51
+ const oldState = this.getPersistedState();
51
52
  const clearStateFn = ((_a = adaptableOptions.stateOptions) === null || _a === void 0 ? void 0 : _a.clearState) ||
52
53
  (() => {
53
54
  localStorage.removeItem(adaptableOptions.adaptableStateKey);
@@ -63,6 +64,16 @@ class ConfigApiImpl extends ApiBase_1.ApiBase {
63
64
  this.setAdaptableStateKey(adaptableOptions.adaptableStateKey, {
64
65
  predefinedConfig: newPredefinedConfig || adaptableOptions.predefinedConfig,
65
66
  flushCurrentState: false,
67
+ }).then(() => {
68
+ const newState = this.getPersistedState();
69
+ const stateReloadedInfo = {
70
+ oldState,
71
+ newState,
72
+ adaptableStateKey: adaptableOptions.adaptableStateKey,
73
+ adaptableId: adaptableOptions.adaptableId,
74
+ adaptableApi: this.adaptable.api,
75
+ };
76
+ this.adaptable.api.eventApi.emit('AdaptableStateReloaded', stateReloadedInfo);
66
77
  });
67
78
  });
68
79
  });
@@ -570,7 +570,7 @@ const adaptableMiddleware = (adaptable) => function (middlewareAPI) {
570
570
  .getCalculatedColumnExpressionService()
571
571
  .createAggregatedScalarCalculatedColumn(calculatedColumn);
572
572
  });
573
- // refresh calcualted columns
573
+ // refresh calculated columns
574
574
  const aggCalculatedColumnIds = aggregatedCalculatedColumns.map((calculatedColumn) => calculatedColumn.ColumnId);
575
575
  adaptable.refreshCells(null, aggCalculatedColumnIds, true);
576
576
  return;
@@ -12,6 +12,7 @@ import { AccessLevel } from '../PredefinedConfig/Common/Entitlement';
12
12
  import { CalculatedColumn } from '../PredefinedConfig/CalculatedColumnState';
13
13
  import { FreeTextColumn } from '../PredefinedConfig/FreeTextColumnState';
14
14
  import { AdaptableInternalIconName } from '../PredefinedConfig/Common/AdaptableIcon';
15
+ import { AdaptableStateReloadedInfo } from '../Api/Events/AdaptableStateReloaded';
15
16
  /**
16
17
  * Base class for all strategies and does most of the work of creating menus
17
18
  */
@@ -34,6 +35,7 @@ export declare abstract class AdaptableModuleBase implements IModule {
34
35
  getReferencedNamedQueryNames(adaptableObject: AdaptableObject): string[];
35
36
  hasNamedQueryReferences(): boolean;
36
37
  handleAdaptableReady(): void;
38
+ handleConfigReloaded(adaptableStateReloadedInfo: AdaptableStateReloadedInfo): void;
37
39
  setModuleEntitlement(): void;
38
40
  addModuleMenuItem(source: 'ModuleMenu' | 'ModuleButton'): AdaptableMenuItem | undefined;
39
41
  addModuleButtonMenuItem(): AdaptableMenuItem | undefined;
@@ -24,6 +24,9 @@ class AdaptableModuleBase {
24
24
  this.handleAdaptableReady();
25
25
  this.api.configApi.dispatchStateReadyAction(this.moduleInfo.ModuleName);
26
26
  });
27
+ this.api.eventApi.on('AdaptableStateReloaded', (adaptableStateReloadedInfo) => {
28
+ this.handleConfigReloaded(adaptableStateReloadedInfo);
29
+ });
27
30
  }
28
31
  getViewAccessLevel() {
29
32
  // override where necessary (ex. only 'Full' accessLevel should be displayed)
@@ -68,6 +71,9 @@ class AdaptableModuleBase {
68
71
  handleAdaptableReady() {
69
72
  // override where necessary in base classes
70
73
  }
74
+ handleConfigReloaded(adaptableStateReloadedInfo) {
75
+ // override where necessary in base classes
76
+ }
71
77
  setModuleEntitlement() {
72
78
  this.AccessLevel = this.api.internalApi
73
79
  .getEntitlementService()
@@ -8,8 +8,10 @@ import { CalculatedColumn } from '../PredefinedConfig/CalculatedColumnState';
8
8
  import { AdaptableObjectItemView, IModule } from './Interface/IModule';
9
9
  import { AdaptableApi } from '../Api/AdaptableApi';
10
10
  import { AdaptableObject } from '../PredefinedConfig/Common/AdaptableObject';
11
+ import { AdaptableStateReloadedInfo } from '../Api/Events/AdaptableStateReloaded';
11
12
  export declare class CalculatedColumnModule extends AdaptableModuleBase implements IModule {
12
13
  constructor(api: AdaptableApi);
14
+ handleConfigReloaded(adaptableStateReloadedInfo: AdaptableStateReloadedInfo): void;
13
15
  getModuleAdaptableObjects(): AdaptableObject[];
14
16
  updateOldConfig(): void;
15
17
  getExplicitlyReferencedColumnIds(calculatedColumn: CalculatedColumn): string[];
@@ -15,6 +15,10 @@ class CalculatedColumnModule extends AdaptableModuleBase_1.AdaptableModuleBase {
15
15
  constructor(api) {
16
16
  super(ModuleConstants.CalculatedColumnModuleId, 'Calculated Column', 'calculated-column', 'CalculatedColumnPopup', 'Create bespoke columns whose cell value is derived dynamically from an Expression', api);
17
17
  }
18
+ handleConfigReloaded(adaptableStateReloadedInfo) {
19
+ // re-dispatch the CalculatedColumnReady action to recreate all the aggregated scalar columns
20
+ this.api.internalApi.dispatchReduxAction(CalculatedColumnRedux.CalculatedColumnReady(this.api.calculatedColumnApi.getCalculatedColumnState()));
21
+ }
18
22
  getModuleAdaptableObjects() {
19
23
  return this.api.calculatedColumnApi.getAllCalculatedColumn();
20
24
  }
@@ -32,10 +32,12 @@ class TeamSharingModule extends AdaptableModuleBase_1.AdaptableModuleBase {
32
32
  // make sure there is no zombie import process remaining (in case a previous import crashed)
33
33
  this.api.internalApi.dispatchReduxAction(TeamSharingRedux.TeamSharingCommitImport());
34
34
  });
35
- this.api.teamSharingApi.triggerLoadingTeamSharingEntries();
35
+ if (this.api.teamSharingApi.isTeamSharingAvailable()) {
36
+ this.api.teamSharingApi.triggerLoadingTeamSharingEntries();
37
+ }
36
38
  }
37
39
  isModuleAvailable() {
38
- return super.isModuleAvailable() && this.api.teamSharingApi.isTeamSharingActivated();
40
+ return super.isModuleAvailable() && this.api.teamSharingApi.isTeamSharingAvailable();
39
41
  }
40
42
  isModuleObjectsShareable() {
41
43
  return false;
@@ -177,6 +177,11 @@ exports.aggregatedScalarExpressionFunctions = {
177
177
  }
178
178
  return rowValue < minValue ? rowValue : minValue;
179
179
  },
180
+ done: (minValue) => {
181
+ if (minValue !== Number.MAX_VALUE) {
182
+ return minValue;
183
+ }
184
+ },
180
185
  },
181
186
  },
182
187
  },
@@ -218,6 +223,11 @@ exports.aggregatedScalarExpressionFunctions = {
218
223
  }
219
224
  return rowValue > maxValue ? rowValue : maxValue;
220
225
  },
226
+ done: (maxValue) => {
227
+ if (maxValue !== Number.MIN_VALUE) {
228
+ return maxValue;
229
+ }
230
+ },
221
231
  },
222
232
  },
223
233
  },
@@ -29,6 +29,16 @@ class CalculatedColumnExpressionService {
29
29
  this.adaptableApi.gridApi.refreshCells(null, refreshedCalculatedColumns);
30
30
  }
31
31
  });
32
+ this.adaptableApi.eventApi.on('GridDataChanged', () => {
33
+ const refreshedCalculatedColumns = [];
34
+ this.aggregatedScalarCalculatedColumnsMap.forEach((aggregatedScalarCalculatedColumn) => {
35
+ aggregatedScalarCalculatedColumn.refreshAggregatedColumnValue();
36
+ refreshedCalculatedColumns.push(aggregatedScalarCalculatedColumn.getCalculatedColumnId());
37
+ });
38
+ if (refreshedCalculatedColumns.length) {
39
+ this.adaptableApi.gridApi.refreshCells(null, refreshedCalculatedColumns);
40
+ }
41
+ });
32
42
  }
33
43
  destroy() {
34
44
  [...this.aggregatedScalarCalculatedColumnsMap.values()].forEach((aggregatedScalarCalculatedColumn) => aggregatedScalarCalculatedColumn.destroy());
@@ -116,10 +126,7 @@ class CalculatedColumnExpressionService {
116
126
  // if there is already an aggregated scalar, delete it (possible when editing)
117
127
  this.destroyAggregatedScalarCalculatedColumn(calculatedColumn);
118
128
  if ((_a = calculatedColumn.Query) === null || _a === void 0 ? void 0 : _a.AggregatedScalarExpression) {
119
- const aggregationConfig = this.adaptableApi.internalApi
120
- .getQueryLanguageService()
121
- .evaluateAggregatedScalarExpression(calculatedColumn.Query.AggregatedScalarExpression, ModuleConstants_1.CalculatedColumnModuleId);
122
- const aggregatedScalarCalculatedColumn = new AggregatedScalarCalculatedColumn(aggregationConfig.value, calculatedColumn, this.adaptableApi);
129
+ const aggregatedScalarCalculatedColumn = new AggregatedScalarCalculatedColumn(calculatedColumn, this.adaptableApi);
123
130
  this.aggregatedScalarCalculatedColumnsMap.set(calculatedColumn.Uuid, aggregatedScalarCalculatedColumn);
124
131
  }
125
132
  }
@@ -131,13 +138,16 @@ class CalculatedColumnExpressionService {
131
138
  }
132
139
  exports.CalculatedColumnExpressionService = CalculatedColumnExpressionService;
133
140
  class AggregatedScalarCalculatedColumn {
134
- constructor(expressionEvaluation, calculatedColumn, adaptableApi) {
135
- this.expressionEvaluation = expressionEvaluation;
141
+ constructor(calculatedColumn, adaptableApi) {
136
142
  this.calculatedColumn = calculatedColumn;
137
143
  this.adaptableApi = adaptableApi;
138
- this.aggregationResult = this.computeAggregatedValue(expressionEvaluation);
144
+ const aggregationConfig = this.adaptableApi.internalApi
145
+ .getQueryLanguageService()
146
+ .evaluateAggregatedScalarExpression(calculatedColumn.Query.AggregatedScalarExpression, ModuleConstants_1.CalculatedColumnModuleId);
147
+ this.expressionEvaluation = aggregationConfig.value;
148
+ this.aggregationResult = this.computeAggregatedValue(this.expressionEvaluation);
139
149
  // currently we support only one reducer
140
- this.aggregationReducerName = Object.keys(expressionEvaluation.aggregationParams.reducers)[0];
150
+ this.aggregationReducerName = Object.keys(this.expressionEvaluation.aggregationParams.reducers)[0];
141
151
  }
142
152
  destroy() {
143
153
  this.expressionEvaluation = null;
@@ -153,6 +163,10 @@ class AggregatedScalarCalculatedColumn {
153
163
  return aggregationValue;
154
164
  }
155
165
  refreshAggregatedColumnValue() {
166
+ const aggregationConfig = this.adaptableApi.internalApi
167
+ .getQueryLanguageService()
168
+ .evaluateAggregatedScalarExpression(this.calculatedColumn.Query.AggregatedScalarExpression, ModuleConstants_1.CalculatedColumnModuleId);
169
+ this.expressionEvaluation = aggregationConfig.value;
156
170
  this.aggregationResult = this.computeAggregatedValue(this.expressionEvaluation);
157
171
  }
158
172
  getCalculatedColumnId() {
@@ -167,11 +181,13 @@ class AggregatedScalarCalculatedColumn {
167
181
  // we iterate over the RowNode list (we need this to handle complex column values (nested values, valueGetters etc)
168
182
  // so we will map the fieldNames to RowNode.data
169
183
  const mapReducerValueGetter = (fieldName) => {
170
- return (rowNode) => this.adaptableApi.gridApi.getRawValueFromRowNode(rowNode, fieldName);
184
+ return (rowNode) => {
185
+ return this.adaptableApi.gridApi.getRawValueFromRowNode(rowNode, fieldName);
186
+ };
171
187
  };
172
188
  Object.values(expressionEvaluation.aggregationParams.reducers).forEach((aggregationReducer) => {
173
189
  aggregationReducer.getter = mapReducerValueGetter(aggregationReducer.field);
174
- // nullify the getter to force the fallback on the getter fn
190
+ // nullify the field to force the fallback on the getter fn
175
191
  aggregationReducer.field = null;
176
192
  });
177
193
  const mapGroupByToKey = (fieldName) => {
@@ -95,6 +95,7 @@ export declare class Adaptable implements IAdaptable {
95
95
  private listenerGlobalSetRowSelection;
96
96
  private listenerGlobalColumnEventsThatTriggerStateChange;
97
97
  private listenerGlobalColumnEventsThatTriggerAutoLayoutSave;
98
+ private listenerGlobalRowGroupEventsThatTriggerAutoLayoutSave;
98
99
  static init(adaptableOptions: AdaptableOptions): Promise<AdaptableApi>;
99
100
  /**
100
101
  * Lazy static constructor for Adaptable
@@ -2515,6 +2515,7 @@ class Adaptable {
2515
2515
  this.gridOptions.api.removeGlobalListener(this.listenerGlobalSetRowSelection);
2516
2516
  this.gridOptions.api.removeGlobalListener(this.listenerGlobalColumnEventsThatTriggerStateChange);
2517
2517
  this.gridOptions.api.removeGlobalListener(this.listenerGlobalColumnEventsThatTriggerAutoLayoutSave);
2518
+ this.gridOptions.api.removeGlobalListener(this.listenerGlobalRowGroupEventsThatTriggerAutoLayoutSave);
2518
2519
  this.listenerFirstDataRendered = null;
2519
2520
  this.listenerPivotModeChanged = null;
2520
2521
  this.listenerPivotChanged = null;
@@ -2526,6 +2527,7 @@ class Adaptable {
2526
2527
  this.listenerModelUpdated = null;
2527
2528
  this.listenerGlobalColumnEventsThatTriggerStateChange = null;
2528
2529
  this.listenerGlobalColumnEventsThatTriggerAutoLayoutSave = null;
2530
+ this.listenerGlobalRowGroupEventsThatTriggerAutoLayoutSave = null;
2529
2531
  this.gridOptions.api.__adaptable = null;
2530
2532
  this.gridOptions.api.setColumnDefs = GridApi_setColumnDefs;
2531
2533
  this.gridOptions.getRowStyle = null;
@@ -2759,7 +2761,6 @@ class Adaptable {
2759
2761
  all_modules_1.Events.EVENT_DISPLAYED_COLUMNS_CHANGED,
2760
2762
  all_modules_1.Events.EVENT_SORT_CHANGED,
2761
2763
  all_modules_1.Events.EVENT_COLUMN_ROW_GROUP_CHANGED,
2762
- all_modules_1.Events.EVENT_ROW_GROUP_OPENED,
2763
2764
  all_modules_1.Events.EVENT_COLUMN_VALUE_CHANGED,
2764
2765
  ];
2765
2766
  // ADD filter event
@@ -2768,6 +2769,18 @@ class Adaptable {
2768
2769
  this.debouncedSaveGridLayout();
2769
2770
  }
2770
2771
  }));
2772
+ // Save Layout if Display Row Groups is "dynamic"
2773
+ const rowGroupEventsThatTriggersAutoLayoutSave = [
2774
+ all_modules_1.Events.EVENT_ROW_GROUP_OPENED,
2775
+ all_modules_1.Events.EVENT_EXPAND_COLLAPSE_ALL,
2776
+ ];
2777
+ this.gridOptions.api.addGlobalListener((this.listenerGlobalRowGroupEventsThatTriggerAutoLayoutSave = (type) => {
2778
+ if (rowGroupEventsThatTriggersAutoLayoutSave.indexOf(type) > -1) {
2779
+ if (this.adaptableOptions.layoutOptions.displayRowGroups == 'dynamic') {
2780
+ this.debouncedSaveGridLayout();
2781
+ }
2782
+ }
2783
+ }));
2771
2784
  /**
2772
2785
  * Use Case: A visible Column has become row grouped and 'hideColumnWhenGrouped' is true
2773
2786
  * Action: Make the column invisible