@adaptabletools/adaptable 16.1.1-canary.1 → 16.2.0-canary.0

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 (63) hide show
  1. package/base.css +5 -0
  2. package/base.css.map +1 -1
  3. package/bundle.cjs.js +195 -197
  4. package/index.css +9 -0
  5. package/index.css.map +1 -1
  6. package/package.json +2 -2
  7. package/publishTimestamp.d.ts +1 -1
  8. package/publishTimestamp.js +1 -1
  9. package/src/AdaptableOptions/AdaptableOptions.d.ts +1 -1
  10. package/src/Api/Internal/AlertInternalApi.d.ts +3 -2
  11. package/src/Api/Internal/AlertInternalApi.js +35 -5
  12. package/src/Api/Internal/GridInternalApi.js +1 -0
  13. package/src/PredefinedConfig/Common/Fdc3Intent.d.ts +4 -4
  14. package/src/PredefinedConfig/Common/Fdc3Intent.js +4 -19
  15. package/src/PredefinedConfig/DashboardState.d.ts +4 -0
  16. package/src/Redux/ActionsReducers/DashboardRedux.d.ts +11 -0
  17. package/src/Redux/ActionsReducers/DashboardRedux.js +14 -1
  18. package/src/Strategy/AlertModule.js +14 -31
  19. package/src/Utilities/Defaults/DefaultAdaptableOptions.js +3 -1
  20. package/src/Utilities/ExpressionFunctions/expressionFunctionUtils.d.ts +2 -0
  21. package/src/Utilities/ExpressionFunctions/expressionFunctionUtils.js +14 -2
  22. package/src/Utilities/ExpressionFunctions/observableExpressionFunctions.d.ts +1 -1
  23. package/src/Utilities/ExpressionFunctions/observableExpressionFunctions.js +93 -1
  24. package/src/Utilities/Services/AlertService.js +13 -6
  25. package/src/Utilities/Services/DataService.d.ts +4 -1
  26. package/src/Utilities/Services/DataService.js +10 -5
  27. package/src/Utilities/Services/Interface/IAlertService.d.ts +12 -3
  28. package/src/Utilities/Services/Interface/IAlertService.js +9 -0
  29. package/src/Utilities/Services/Interface/IDataService.d.ts +3 -0
  30. package/src/Utilities/Services/Interface/IQueryLanguageService.d.ts +2 -1
  31. package/src/Utilities/Services/QueryLanguageService.d.ts +2 -2
  32. package/src/View/Components/Selectors/ColumnSelector.js +0 -5
  33. package/src/View/Dashboard/{CustomToolbarWrapper.d.ts → CustomToolbar.d.ts} +1 -0
  34. package/src/View/Dashboard/{CustomToolbarWrapper.js → CustomToolbar.js} +36 -33
  35. package/src/View/Dashboard/Dashboard.d.ts +2 -2
  36. package/src/View/Dashboard/Dashboard.js +20 -24
  37. package/src/View/Dashboard/DashboardPopup.d.ts +2 -1
  38. package/src/View/Dashboard/DashboardPopup.js +7 -3
  39. package/src/View/Dashboard/DashboardToolbarFactory.d.ts +7 -0
  40. package/src/View/Dashboard/DashboardToolbarFactory.js +46 -0
  41. package/src/View/Dashboard/PinnedDashboard.d.ts +5 -0
  42. package/src/View/Dashboard/PinnedDashboard.js +21 -0
  43. package/src/View/Dashboard/PinnedToolbarsSelector.d.ts +5 -0
  44. package/src/View/Dashboard/PinnedToolbarsSelector.js +52 -0
  45. package/src/View/DataImport/DataImportWizard/DataImportWizard.d.ts +6 -1
  46. package/src/View/DataImport/DataImportWizard/DataImportWizard.js +71 -9
  47. package/src/View/DataImport/DataImportWizard/sections/ColumnsSection.d.ts +8 -0
  48. package/src/View/DataImport/DataImportWizard/sections/ColumnsSection.js +119 -0
  49. package/src/View/DataImport/DataImportWizard/sections/DataPreview.d.ts +2 -1
  50. package/src/View/DataImport/DataImportWizard/sections/DataPreview.js +13 -17
  51. package/src/View/DataImport/DataImportWizard/sections/ValidationSection.d.ts +2 -1
  52. package/src/View/DataImport/DataImportWizard/sections/ValidationSection.js +1 -1
  53. package/src/View/QuickSearch/QuickSearchInput.js +1 -1
  54. package/src/components/Dashboard/Dashboard.d.ts +1 -0
  55. package/src/components/Dashboard/Dashboard.js +2 -1
  56. package/src/components/DragAndDropContext/ModuleManager.js +1 -1
  57. package/src/components/DragAndDropContext/TabList.js +1 -1
  58. package/src/components/ExpressionEditor/editorButtonsObservable.js +5 -0
  59. package/src/metamodel/adaptable.metamodel.js +1 -1
  60. package/src/parser/src/index.js +4 -1
  61. package/src/parser/src/tokenizer.js +5 -2
  62. package/version.d.ts +1 -1
  63. package/version.js +1 -1
@@ -7,7 +7,6 @@ const SystemRedux = tslib_1.__importStar(require("../Redux/ActionsReducers/Syste
7
7
  const ModuleConstants = tslib_1.__importStar(require("../Utilities/Constants/ModuleConstants"));
8
8
  const ArrayExtensions_1 = require("../Utilities/Extensions/ArrayExtensions");
9
9
  const AdaptableModuleBase_1 = require("./AdaptableModuleBase");
10
- const ObjectFactory_1 = tslib_1.__importDefault(require("../Utilities/ObjectFactory"));
11
10
  const AlertWizard_1 = require("../View/Alert/Wizard/AlertWizard");
12
11
  const getScopeViewItems_1 = require("./Utilities/getScopeViewItems");
13
12
  const getRuleViewItems_1 = require("./Utilities/getRuleViewItems");
@@ -154,41 +153,25 @@ class AlertModule extends AdaptableModuleBase_1.AdaptableModuleBase {
154
153
  }
155
154
  }
156
155
  handleGridDataChanged(gridDataChangedInfo) {
157
- const internalAlertApi = this.api.alertApi.internalApi;
158
156
  const alertDefinitions = this.getAlertDefinitionsForGridDataChange(gridDataChangedInfo);
159
- const rowAdded = gridDataChangedInfo.rowTrigger === 'Add';
160
- const numberOfChangedRows = gridDataChangedInfo.rowNodes.length;
161
- const actionName = rowAdded ? 'Added' : 'Removed';
162
- const alertHeader = numberOfChangedRows > 1 ? `${actionName} Rows` : `${actionName} Row `;
163
- const defaultMessage = numberOfChangedRows > 1
164
- ? `${numberOfChangedRows} rows were ${actionName.toLowerCase()}`
165
- : `${numberOfChangedRows} row was ${actionName.toLowerCase()}`;
166
- alertDefinitions === null || alertDefinitions === void 0 ? void 0 : alertDefinitions.forEach((alertDefinition) => {
167
- if (internalAlertApi.shouldFireAlertOnClient(alertDefinition)) {
168
- const customMessage = internalAlertApi.getCustomAlertDescription(alertDefinition, {
169
- gridDataChangedInfo,
170
- });
171
- const customHeader = internalAlertApi.getCustomAlertMessageHeader(alertDefinition, {
172
- gridDataChangedInfo,
173
- });
174
- const alertMessage = alertDefinition.MessageText
175
- ? alertDefinition.MessageText
176
- : customMessage !== null && customMessage !== void 0 ? customMessage : defaultMessage;
177
- const alert = ObjectFactory_1.default.CreateRowChangedAlert(customHeader !== null && customHeader !== void 0 ? customHeader : alertHeader, alertMessage, alertDefinition, gridDataChangedInfo);
178
- this.api.alertApi.showAdaptableAlert(alert);
179
- }
180
- });
157
+ this.api.alertApi.internalApi.showAlertsForGridDataChanges(gridDataChangedInfo, alertDefinitions);
181
158
  }
182
159
  handleReactiveAlertTriggered(reactiveAlertInfo) {
183
160
  // TODO - suppress Notification if alert is not relevant for layout
184
161
  var _a;
185
- // the row node data is most probably stale because the reactive queries buffer the changed data
186
- // so we have to refresh it
187
- reactiveAlertInfo.dataChangeLogEntry.rowNode = this.api.gridApi.getRowNodeForPrimaryKey(reactiveAlertInfo.dataChangeLogEntry.primaryKeyValue);
188
- reactiveAlertInfo.dataChangeLogEntry.rowData =
189
- (_a = reactiveAlertInfo.dataChangeLogEntry.rowNode) === null || _a === void 0 ? void 0 : _a.data;
190
- if (reactiveAlertInfo.type === 'alert') {
191
- this.api.alertApi.internalApi.showAlertForDefinitions(reactiveAlertInfo.dataChangeLogEntry, [
162
+ if (reactiveAlertInfo.type === 'cellDataChangedAlert') {
163
+ // the row node data is most probably stale because the reactive queries buffer the changed data
164
+ // so we have to refresh it
165
+ reactiveAlertInfo.cellChangeLogEntry.rowNode = this.api.gridApi.getRowNodeForPrimaryKey(reactiveAlertInfo.cellChangeLogEntry.primaryKeyValue);
166
+ reactiveAlertInfo.cellChangeLogEntry.rowData =
167
+ (_a = reactiveAlertInfo.cellChangeLogEntry.rowNode) === null || _a === void 0 ? void 0 : _a.data;
168
+ this.api.alertApi.internalApi.showAlertForDefinitions(reactiveAlertInfo.cellChangeLogEntry, [
169
+ reactiveAlertInfo.alertDefinition,
170
+ ]);
171
+ }
172
+ else {
173
+ // reactiveAlertInfo.type === gridDataChangedAlert'
174
+ this.api.alertApi.internalApi.showAlertForDefinitions(reactiveAlertInfo.gridChangeLogEntry, [
192
175
  reactiveAlertInfo.alertDefinition,
193
176
  ]);
194
177
  }
@@ -40,7 +40,9 @@ exports.DefaultAdaptableOptions = {
40
40
  showSystemStatusMessageNotifications: false,
41
41
  maxSystemMessagesInStore: 100,
42
42
  },
43
- dataImportOptions: {},
43
+ dataImportOptions: {
44
+ fileHandlers: undefined,
45
+ },
44
46
  flashingCellOptions: {
45
47
  defaultFlashDuration: 500,
46
48
  defaultFlashTarget: 'cell',
@@ -2,6 +2,7 @@ import { ExpressionContext } from '../../parser/src/types';
2
2
  import { AdaptableApi } from '../../Api/AdaptableApi';
3
3
  import { Observable } from 'rxjs';
4
4
  import { CellDataChangedInfo } from '../../PredefinedConfig/Common/CellDataChangedInfo';
5
+ import { GridDataChangedInfo } from '../../types';
5
6
  export interface BaseParameter<T = string, N = string> {
6
7
  type: T;
7
8
  name: N;
@@ -13,6 +14,7 @@ export declare const getStringValues: (context: ExpressionContext, ...stringArgu
13
14
  export declare const getStringValue: (context: ExpressionContext, stringArgument: string) => string;
14
15
  export declare const isTextSearchCaseInsensitive: (context: ExpressionContext) => boolean;
15
16
  export declare const getDataChangeLog$: (context: ExpressionContext, columnNameFilter: string) => Observable<CellDataChangedInfo>;
17
+ export declare const getGridChangeLog$: (context: ExpressionContext, gridChangeType: GridDataChangedInfo['rowTrigger']) => Observable<GridDataChangedInfo>;
16
18
  export declare const handleWhereFunction: (args: ExpressionNode[], context: ExpressionContext) => any;
17
19
  export declare type ExpressionNode = any;
18
20
  export declare const evaluateExpressionNode: (expressionNode: ExpressionNode, context: ExpressionContext, filterFn?: (item: any) => boolean) => any;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.validateColumnType = exports.getNumericValue = exports.handleColumnFunction = exports.extractParameters = exports.extractParameter = exports.extractColumnParameters = exports.extractColumnParameter = exports.evaluateExpressionNode = exports.handleWhereFunction = exports.getDataChangeLog$ = exports.isTextSearchCaseInsensitive = exports.getStringValue = exports.getStringValues = void 0;
3
+ exports.validateColumnType = exports.getNumericValue = exports.handleColumnFunction = exports.extractParameters = exports.extractParameter = exports.extractColumnParameters = exports.extractColumnParameter = exports.evaluateExpressionNode = exports.handleWhereFunction = exports.getGridChangeLog$ = exports.getDataChangeLog$ = exports.isTextSearchCaseInsensitive = exports.getStringValue = exports.getStringValues = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const ExpressionEvaluationError_1 = require("../../parser/src/ExpressionEvaluationError");
6
6
  const StringExtensions_1 = tslib_1.__importDefault(require("../Extensions/StringExtensions"));
@@ -29,11 +29,23 @@ const getDataChangeLog$ = (context, columnNameFilter) => {
29
29
  dataChangeLog$ = dataChangeLog$.pipe((0, operators_1.filter)((dataChangeLog) => dataChangeLog.column.columnId === columnNameFilter));
30
30
  // filter based on the WHERE clause
31
31
  if (context.filterFn) {
32
- dataChangeLog$ = dataChangeLog$.pipe((0, operators_1.filter)((value) => context.filterFn(value.rowNode)));
32
+ dataChangeLog$ = dataChangeLog$.pipe((0, operators_1.filter)((value) => {
33
+ return context.filterFn(value.rowNode);
34
+ }));
33
35
  }
34
36
  return dataChangeLog$;
35
37
  };
36
38
  exports.getDataChangeLog$ = getDataChangeLog$;
39
+ const getGridChangeLog$ = (context, gridChangeType) => {
40
+ const gridChangeLog$ = context.adaptableApi.internalApi.getDataService().gridChangeLog$;
41
+ let gridChangeStream$ = gridChangeLog$.pipe((0, operators_1.filter)((gridDataChangedInfo) => gridDataChangedInfo.rowTrigger === gridChangeType));
42
+ // filter based on the WHERE clause
43
+ if (context.filterFn) {
44
+ gridChangeStream$ = gridChangeStream$.pipe((0, operators_1.filter)((value) => value.rowNodes.some((node) => context.filterFn(node))));
45
+ }
46
+ return gridChangeStream$;
47
+ };
48
+ exports.getGridChangeLog$ = getGridChangeLog$;
37
49
  const handleWhereFunction = (args, context) => {
38
50
  const reactiveExpressionNode = args[0];
39
51
  const whereClauseExpressionNode = args[1];
@@ -2,6 +2,6 @@ import { ExpressionFunction } from '../../parser/src/types';
2
2
  /**
3
3
  * List of all the Observable Functions available in AdaptableQL
4
4
  */
5
- export declare type ObservableFunctionName = 'WHERE' | 'COL' | 'TIMEFRAME' | 'ROW_CHANGE' | 'GRID_CHANGE' | 'MAX' | 'MIN' | 'NONE' | 'COUNT';
5
+ export declare type ObservableFunctionName = 'WHERE' | 'COL' | 'TIMEFRAME' | 'ROW_CHANGE' | 'ROW_ADDED' | 'GRID_CHANGE' | 'ROW_REMOVED' | 'MAX' | 'MIN' | 'NONE' | 'COUNT';
6
6
  export declare const observableExpressionFunctions: Record<ObservableFunctionName, ExpressionFunction>;
7
7
  export declare const observableExpressionFunctionNames: ObservableFunctionName[];
@@ -91,7 +91,7 @@ exports.observableExpressionFunctions = {
91
91
  (0, operators_1.debounceTime)(timeframeParameter.value),
92
92
  // completing the observable (ex. alert deletion) will also fire the NONE event
93
93
  // takeUntil takes care of this, ignoring any emissions as soon as the source completes
94
- // (count() result is irrelevant here, the main thing is that it emits an source completion)
94
+ // (count() result is irrelevant here, the main thing is that it emits a source completion)
95
95
  (0, operators_1.takeUntil)(dataChangeLog$.pipe((0, operators_1.count)())));
96
96
  }
97
97
  }
@@ -105,6 +105,48 @@ exports.observableExpressionFunctions = {
105
105
  ],
106
106
  category: 'observable',
107
107
  },
108
+ ROW_ADDED: {
109
+ handler(args, context) {
110
+ const gridChangeLog$ = (0, expressionFunctionUtils_1.getGridChangeLog$)(context, 'Add');
111
+ return handleGridRowAddedOrRemoved(args, gridChangeLog$, 'ROW_ADDED', context);
112
+ },
113
+ returnType: 'boolean',
114
+ description: 'Observes added rows in the grid',
115
+ signatures: [
116
+ 'ROW_ADDED()',
117
+ 'ROW_ADDED(rowCount: number)',
118
+ 'ROW_ADDED(timeframe:TIMEFRAME)',
119
+ 'ROW_ADDED(rowCount: number, timeframe:TIMEFRAME)',
120
+ ],
121
+ examples: [
122
+ 'ROW_ADDED()',
123
+ 'ROW_ADDED(2)',
124
+ "ROW_ADDED(TIMEFRAME('20s'))",
125
+ "ROW_ADDED(2, TIMEFRAME('20s'))",
126
+ ],
127
+ category: 'observable',
128
+ },
129
+ ROW_REMOVED: {
130
+ handler(args, context) {
131
+ const gridChangeLog$ = (0, expressionFunctionUtils_1.getGridChangeLog$)(context, 'Delete');
132
+ return handleGridRowAddedOrRemoved(args, gridChangeLog$, 'ROW_REMOVED', context);
133
+ },
134
+ returnType: 'boolean',
135
+ description: 'Observes removed rows in the grid',
136
+ signatures: [
137
+ 'ROW_REMOVED()',
138
+ 'ROW_REMOVED(rowCount: number)',
139
+ 'ROW_REMOVED(timeframe:TIMEFRAME)',
140
+ 'ROW_REMOVED(rowCount: number, timeframe:TIMEFRAME)',
141
+ ],
142
+ examples: [
143
+ 'ROW_REMOVED()',
144
+ 'ROW_REMOVED(2)',
145
+ "ROW_REMOVED(TIMEFRAME('20s'))",
146
+ "ROW_REMOVED(2, TIMEFRAME('20s'))",
147
+ ],
148
+ category: 'observable',
149
+ },
108
150
  COL: {
109
151
  handler(args, context) {
110
152
  return (0, expressionFunctionUtils_1.handleColumnFunction)(args, context);
@@ -320,6 +362,7 @@ const getTrailingGridCountChange$ = (source$, trailingPeriod, counterLimit) => {
320
362
  if (gridCounter === counterLimit) {
321
363
  // reset counter
322
364
  counter = 0;
365
+ console.log('reset counter');
323
366
  }
324
367
  return gridCounter;
325
368
  }));
@@ -434,3 +477,52 @@ const getMaxTimeframeSize = (expressionValue, context) => {
434
477
  }
435
478
  return expressionValue > maxTimeframeSize ? maxTimeframeSize : expressionValue;
436
479
  };
480
+ const handleGridRowAddedOrRemoved = (args, gridChangeLog$, consumingFunction, context) => {
481
+ let countValue = args.find((arg) => typeof arg === 'number');
482
+ if (countValue < 0) {
483
+ throw new ExpressionEvaluationError_1.ExpressionEvaluationError(consumingFunction, 'supports only zero or a positive number as argument');
484
+ }
485
+ let timeframeParameter = (0, expressionFunctionUtils_1.extractParameter)(consumingFunction, 'config', ['TIMEFRAME'], args, { isOptional: true });
486
+ if (countValue === 0 && timeframeParameter == null) {
487
+ throw new ExpressionEvaluationError_1.ExpressionEvaluationError(consumingFunction, 'requires a TIMEFRAME parameter when observing for no changes');
488
+ }
489
+ if (countValue == null && timeframeParameter == null) {
490
+ // default - return all new rows
491
+ return gridChangeLog$;
492
+ }
493
+ if (countValue == null) {
494
+ // default count value of 1
495
+ countValue = 1;
496
+ }
497
+ if (timeframeParameter == null) {
498
+ // default time parameter of max
499
+ timeframeParameter = {
500
+ name: 'TIMEFRAME',
501
+ type: 'config',
502
+ value: SYSTEM_MAX_TIMEFRAME_SIZE,
503
+ };
504
+ }
505
+ if (countValue === 0) {
506
+ // handle special case when observing NO changes
507
+ const gridDataChangeInfoStub = {
508
+ rowTrigger: consumingFunction === 'ROW_ADDED' ? 'Add' : 'Delete',
509
+ rowNodes: [],
510
+ dataRows: [],
511
+ changedAt: Date.now(),
512
+ adaptableId: context.adaptableId,
513
+ adaptableApi: context.adaptableApi,
514
+ userName: context.userName,
515
+ };
516
+ return gridChangeLog$.pipe(
517
+ // add a synthetic first value to ensure the grid is observed even when there are no changes
518
+ (0, operators_1.startWith)(gridDataChangeInfoStub),
519
+ // wait for the given time
520
+ (0, operators_1.debounceTime)(timeframeParameter.value),
521
+ // completing the observable (ex. alert deletion) will also fire the NONE event
522
+ // takeUntil takes care of this, ignoring any emissions as soon as the source completes
523
+ // (count() result is irrelevant here, the main thing is that it emits a source completion)
524
+ (0, operators_1.takeUntil)(gridChangeLog$.pipe((0, operators_1.count)())));
525
+ }
526
+ const timeframeChange$ = getTrailingGridCountChange$(gridChangeLog$, timeframeParameter.value, countValue);
527
+ return getDataChangeCount$(gridChangeLog$, timeframeChange$, countValue);
528
+ };
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.AlertService = void 0;
4
4
  const tslib_1 = require("tslib");
5
+ const IAlertService_1 = require("./Interface/IAlertService");
5
6
  const Emitter_1 = tslib_1.__importDefault(require("../Emitter"));
6
7
  const rxjs_1 = require("rxjs");
7
8
  const ModuleConstants_1 = require("../Constants/ModuleConstants");
@@ -36,12 +37,18 @@ class AlertService {
36
37
  const reactiveAlertSubscription = (0, rxjs_1.combineLatest)([
37
38
  (0, rxjs_1.of)(alertDefinition),
38
39
  reactiveExpressionObservable,
39
- ]).subscribe(([alertDefinition, dataChangeLogEntry]) => {
40
- const reactiveAlertInfo = {
41
- alertDefinition: alertDefinition,
42
- dataChangeLogEntry,
43
- type: 'alert',
44
- };
40
+ ]).subscribe(([alertDefinition, changeLogEntry]) => {
41
+ const reactiveAlertInfo = (0, IAlertService_1.isGridDataChangedInfo)(changeLogEntry)
42
+ ? {
43
+ alertDefinition,
44
+ type: 'gridDataChangedAlert',
45
+ gridChangeLogEntry: changeLogEntry,
46
+ }
47
+ : {
48
+ alertDefinition,
49
+ type: 'cellDataChangedAlert',
50
+ cellChangeLogEntry: changeLogEntry,
51
+ };
45
52
  this.emitter.emitSync('ReactiveAlertTriggered', reactiveAlertInfo);
46
53
  });
47
54
  this.reactiveAlertsMap.set(alertDefinition.Uuid, {
@@ -3,11 +3,14 @@ import { IAdaptable } from '../../AdaptableInterfaces/IAdaptable';
3
3
  import { CellDataChangedInfo } from '../../PredefinedConfig/Common/CellDataChangedInfo';
4
4
  import { EmitterCallback } from '../../Utilities/Emitter';
5
5
  import { Observable } from 'rxjs';
6
+ import { GridDataChangedInfo } from '../../types';
6
7
  export declare class DataService implements IDataService {
7
8
  private adaptable;
8
9
  private emitter;
9
10
  private dataChangeLogSubject$;
10
11
  dataChangeLog$: Observable<CellDataChangedInfo>;
12
+ private gridChangeLogSubject$;
13
+ gridChangeLog$: Observable<GridDataChangedInfo>;
11
14
  private undoChangeLog;
12
15
  private undoChangeTimers;
13
16
  constructor(adaptable: IAdaptable);
@@ -15,9 +18,9 @@ export declare class DataService implements IDataService {
15
18
  on: (eventName: string, callback: EmitterCallback) => (() => void);
16
19
  emit: (eventName: string, data?: any) => Promise<any>;
17
20
  CreateDataChangedEvent(cellDataChangedInfo: CellDataChangedInfo): void;
21
+ CreateGridChangedEvent(gridDataChangedInfo: GridDataChangedInfo): void;
18
22
  logUndoChange(change: CellDataChangedInfo): void;
19
23
  extractUndoChange(change: CellDataChangedInfo): CellDataChangedInfo | undefined;
20
24
  private getUndoChangeKey;
21
- private logDataChange;
22
25
  private extractDataChangeLogEntry;
23
26
  }
@@ -16,6 +16,8 @@ class DataService {
16
16
  this.emitter = new Emitter_1.default();
17
17
  this.dataChangeLogSubject$ = new rxjs_1.Subject();
18
18
  this.dataChangeLog$ = this.dataChangeLogSubject$.asObservable();
19
+ this.gridChangeLogSubject$ = new rxjs_1.Subject();
20
+ this.gridChangeLog$ = this.gridChangeLogSubject$.asObservable();
19
21
  this.undoChangeLog = new Map();
20
22
  this.undoChangeTimers = new Map();
21
23
  }
@@ -25,6 +27,9 @@ class DataService {
25
27
  this.dataChangeLogSubject$.complete();
26
28
  this.dataChangeLogSubject$ = null;
27
29
  this.dataChangeLog$ = null;
30
+ this.gridChangeLogSubject$.complete();
31
+ this.gridChangeLogSubject$ = null;
32
+ this.gridChangeLog$ = null;
28
33
  this.undoChangeLog.clear();
29
34
  this.undoChangeLog = null;
30
35
  this.undoChangeTimers.clear();
@@ -34,9 +39,13 @@ class DataService {
34
39
  if (cellDataChangedInfo.newValue != cellDataChangedInfo.oldValue) {
35
40
  this.emitter.emitSync('CellDataChanged', cellDataChangedInfo);
36
41
  this.adaptable.api.gridApi.internalApi.fireCellChangedEvent(cellDataChangedInfo);
37
- this.logDataChange(cellDataChangedInfo);
42
+ const dataChangeLogEntry = this.extractDataChangeLogEntry(cellDataChangedInfo);
43
+ this.dataChangeLogSubject$.next(dataChangeLogEntry);
38
44
  }
39
45
  }
46
+ CreateGridChangedEvent(gridDataChangedInfo) {
47
+ this.gridChangeLogSubject$.next(gridDataChangedInfo);
48
+ }
40
49
  // we need this temporary "shared memory" because the value change and the AG Grid cellChanged event are asynchronous
41
50
  // in the first phase we keep the undone change
42
51
  logUndoChange(change) {
@@ -75,10 +84,6 @@ class DataService {
75
84
  newValue,
76
85
  });
77
86
  }
78
- logDataChange(cellDataChangedInfo) {
79
- const dataChangeLogEntry = this.extractDataChangeLogEntry(cellDataChangedInfo);
80
- this.dataChangeLogSubject$.next(dataChangeLogEntry);
81
- }
82
87
  extractDataChangeLogEntry(cellDataChangedInfo) {
83
88
  // create rowData snapshot
84
89
  const rowData = cellDataChangedInfo.rowData
@@ -1,10 +1,17 @@
1
1
  import { AlertDefinition } from '../../../PredefinedConfig/AlertState';
2
2
  import { CellDataChangedInfo } from '../../../PredefinedConfig/Common/CellDataChangedInfo';
3
+ import { GridDataChangedInfo } from '../../../types';
3
4
  import { IAdaptableService } from './IAdaptableService';
4
- export declare type ReactiveAlertInfo = {
5
+ export declare type ReactiveAlertInfo = ReactiveGridDataChangedAlertInfo | ReactiveCellDataChangedAlertInfo;
6
+ export declare type ReactiveGridDataChangedAlertInfo = {
7
+ type: 'gridDataChangedAlert';
5
8
  alertDefinition: AlertDefinition;
6
- type: 'alert';
7
- dataChangeLogEntry: CellDataChangedInfo;
9
+ gridChangeLogEntry: GridDataChangedInfo;
10
+ };
11
+ export declare type ReactiveCellDataChangedAlertInfo = {
12
+ type: 'cellDataChangedAlert';
13
+ alertDefinition: AlertDefinition;
14
+ cellChangeLogEntry: CellDataChangedInfo;
8
15
  };
9
16
  export interface IAlertService extends IAdaptableService {
10
17
  createReactiveAlert(alertDefinition: AlertDefinition): void;
@@ -13,3 +20,5 @@ export interface IAlertService extends IAdaptableService {
13
20
  getReactiveActiveAlerts(): AlertDefinition[];
14
21
  isReactiveAlertActive(alertDefinition: AlertDefinition): boolean;
15
22
  }
23
+ export declare const isGridDataChangedInfo: (value: CellDataChangedInfo | GridDataChangedInfo) => value is GridDataChangedInfo<any>;
24
+ export declare const isCellDataChangedInfo: (value: CellDataChangedInfo | GridDataChangedInfo) => value is CellDataChangedInfo<any>;
@@ -1,2 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isCellDataChangedInfo = exports.isGridDataChangedInfo = void 0;
4
+ const isGridDataChangedInfo = (value) => {
5
+ return typeof value.rowTrigger === 'string';
6
+ };
7
+ exports.isGridDataChangedInfo = isGridDataChangedInfo;
8
+ const isCellDataChangedInfo = (value) => {
9
+ return !(0, exports.isGridDataChangedInfo)(value);
10
+ };
11
+ exports.isCellDataChangedInfo = isCellDataChangedInfo;
@@ -1,10 +1,13 @@
1
1
  import { CellDataChangedInfo } from '../../../PredefinedConfig/Common/CellDataChangedInfo';
2
2
  import { Observable } from 'rxjs';
3
3
  import { IAdaptableService } from './IAdaptableService';
4
+ import { GridDataChangedInfo } from '../../../types';
4
5
  export interface IDataService extends IAdaptableService {
5
6
  CreateDataChangedEvent(cellDataChangedInfo: CellDataChangedInfo): void;
7
+ CreateGridChangedEvent(gridDataChangedInfo: GridDataChangedInfo): void;
6
8
  on(eventName: 'CellDataChanged', callback: (cellDataChangedInfo: CellDataChangedInfo) => void): () => void;
7
9
  readonly dataChangeLog$: Observable<CellDataChangedInfo>;
10
+ readonly gridChangeLog$: Observable<GridDataChangedInfo>;
8
11
  logUndoChange(undoChange: CellDataChangedInfo): void;
9
12
  extractUndoChange(undoChange: CellDataChangedInfo): CellDataChangedInfo | undefined;
10
13
  }
@@ -9,10 +9,11 @@ import { BooleanFunctionName } from '../../ExpressionFunctions/booleanExpression
9
9
  import { ScalarFunctionName } from '../../ExpressionFunctions/scalarExpressionFunctions';
10
10
  import { ObservableFunctionName } from '../../ExpressionFunctions/observableExpressionFunctions';
11
11
  import { ExpressionFunctionMap } from '../../../parser/src/types';
12
+ import { GridDataChangedInfo } from '../../../types';
12
13
  export interface IQueryLanguageService extends IAdaptableService {
13
14
  evaluateBooleanExpression(expression: string, module: AdaptableModule, rowNode: IRowNode): boolean;
14
15
  evaluateScalarExpression(expression: string, module: AdaptableModule, rowNode: IRowNode): any;
15
- evaluateObservableExpression(expression: string, module: AdaptableModule): Observable<CellDataChangedInfo>;
16
+ evaluateObservableExpression(expression: string, module: AdaptableModule): Observable<CellDataChangedInfo | GridDataChangedInfo>;
16
17
  evaluateAggregatedBooleanExpression(expression: string, module: AdaptableModule): BooleanAggregationParameter;
17
18
  evaluateAggregatedScalarExpression(expression: string, module: AdaptableModule): ScalarAggregationParameter;
18
19
  validateBoolean(expression: string, module: AdaptableModule, config?: {
@@ -4,7 +4,7 @@ import { CellDataChangedInfo } from '../../PredefinedConfig/Common/CellDataChang
4
4
  import { IRowNode } from '@ag-grid-community/core';
5
5
  import { AdaptableModule } from '../../PredefinedConfig/Common/Types';
6
6
  import { ScalarAggregationParameter } from '../ExpressionFunctions/aggregatedScalarExpressionFunctions';
7
- import { AdaptableApi } from '../../../types';
7
+ import { AdaptableApi, GridDataChangedInfo } from '../../../types';
8
8
  import { BooleanAggregationParameter } from '../ExpressionFunctions/aggregatedBooleanExpressionFunctions';
9
9
  export declare class QueryLanguageService implements IQueryLanguageService {
10
10
  private adaptableApi;
@@ -17,7 +17,7 @@ export declare class QueryLanguageService implements IQueryLanguageService {
17
17
  evaluateBooleanExpression(expression: string, module: AdaptableModule, rowNode: any): any;
18
18
  evaluateScalarExpression(expression: string, module: AdaptableModule, rowNode: IRowNode): any;
19
19
  evaluateAggregatedScalarExpression(expression: string, module: AdaptableModule): ScalarAggregationParameter;
20
- evaluateObservableExpression(reactiveExpression: string, module: AdaptableModule): Observable<CellDataChangedInfo>;
20
+ evaluateObservableExpression(reactiveExpression: string, module: AdaptableModule): Observable<CellDataChangedInfo | GridDataChangedInfo>;
21
21
  evaluateAggregatedBooleanExpression(aggregationExpression: string, module: AdaptableModule): BooleanAggregationParameter;
22
22
  validateBoolean(expressionInput: string, module: AdaptableModule, config?: {
23
23
  force?: boolean;
@@ -13,11 +13,6 @@ class ColumnSelector extends React.Component {
13
13
  var _a;
14
14
  const sortedColumns = ArrayExtensions_1.ArrayExtensions.sortArrayWithProperty(Enums_1.SortOrder.Asc, this.props.ColumnList, 'friendlyName');
15
15
  const selectedColumnIds = this.props.SelectedColumnIds.filter((x) => StringExtensions_1.StringExtensions.IsNotNullOrEmpty(x));
16
- const placeHolder = StringExtensions_1.StringExtensions.IsNotNullOrEmpty(this.props.placeHolder)
17
- ? this.props.placeHolder.toString()
18
- : this.props.SelectionMode == Enums_1.SelectionMode.Single
19
- ? 'Select a column'
20
- : 'Select columns';
21
16
  const isEmptySelectedColumnIds = this.props.SelectedColumnIds.filter((x) => StringExtensions_1.StringExtensions.IsNotNullOrEmpty(x)).length == 0;
22
17
  let sortedColumnOptions = sortedColumns.map((column) => {
23
18
  return {
@@ -4,5 +4,6 @@ interface CustomToolbarWrapperProps {
4
4
  customToolbar: CustomToolbar;
5
5
  dashboardRevision: number;
6
6
  }
7
+ export declare const CustomToolbarCmp: (props: CustomToolbarWrapperProps) => JSX.Element;
7
8
  export declare const CustomToolbarWrapper: (props: CustomToolbarWrapperProps) => JSX.Element;
8
9
  export {};
@@ -1,13 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CustomToolbarWrapper = void 0;
3
+ exports.CustomToolbarWrapper = exports.CustomToolbarCmp = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const React = tslib_1.__importStar(require("react"));
6
6
  const react_1 = require("react");
7
- const PanelDashboard_1 = require("../Components/Panels/PanelDashboard");
8
7
  const AdaptableContext_1 = require("../AdaptableContext");
9
8
  const AdaptableButton_1 = require("../Components/AdaptableButton");
10
- const CustomToolbarWrapper = (props) => {
9
+ const PanelDashboard_1 = require("../Components/Panels/PanelDashboard");
10
+ const CustomToolbarCmp = (props) => {
11
11
  let contentsDivId = 'ab-CustomToolbar__' + props.customToolbar.name + '__contents';
12
12
  let buttonsDivId = 'ab-CustomToolbar__' + props.customToolbar.name + '__buttons';
13
13
  const [contentsHTML, setContentsHTML] = (0, react_1.useState)('');
@@ -63,6 +63,38 @@ const CustomToolbarWrapper = (props) => {
63
63
  }
64
64
  };
65
65
  }, []);
66
+ return (React.createElement(React.Fragment, null,
67
+ contentsHTML && (React.createElement("div", { id: contentsDivId, ref: contentsDivRef, className: "CustomToolBarContents ab-CustomToolbar__contents ab-CustomToolbar__contents--render", style: { minHeight: 22 }, dangerouslySetInnerHTML: { __html: contentsHTML } })),
68
+ props.customToolbar.toolbarButtons && (React.createElement("div", { id: buttonsDivId, className: "ab-CustomToolbar__buttons", style: { minHeight: 22 } }, props.customToolbar.toolbarButtons.map((button, index) => {
69
+ const dashboardContext = {
70
+ customToolbar: props.customToolbar,
71
+ adaptableApi: api,
72
+ userName: api.optionsApi.getUserName(),
73
+ adaptableId: api.optionsApi.getAdaptableId(),
74
+ dashboardState: api.dashboardApi.getDashboardState(),
75
+ };
76
+ const buttonIcon = api.internalApi.getIconForButton(button, dashboardContext);
77
+ let buttonStyle = api.internalApi.getStyleForButton(button, dashboardContext);
78
+ let buttonLabel = api.internalApi.getLabelForButton(button, dashboardContext);
79
+ let buttonTooltip = api.internalApi.getTooltipForButton(button, dashboardContext);
80
+ if (button.hidden && button.hidden(button, dashboardContext)) {
81
+ return null;
82
+ }
83
+ const disabled = button.disabled && button.disabled(button, dashboardContext);
84
+ let buttonVariant = buttonStyle && buttonStyle.variant ? buttonStyle.variant : 'outlined';
85
+ let buttonTone = buttonStyle && buttonStyle.tone ? buttonStyle.tone : 'neutral';
86
+ return (React.createElement(AdaptableButton_1.AdaptableButtonComponent, { style: { marginLeft: index ? 'var(--ab-space-1)' : 0 }, key: index, disabled: disabled, tooltip: buttonTooltip, icon: buttonIcon, variant: buttonVariant, tone: buttonTone, className: (buttonStyle === null || buttonStyle === void 0 ? void 0 : buttonStyle.className) || '', onClick: () => {
87
+ button.onClick ? button.onClick(button, dashboardContext) : null;
88
+ setTimeout(() => {
89
+ // mutate state to force a re-rendering
90
+ setComponentRevision(componentRevision + 1);
91
+ }, 16);
92
+ } }, buttonLabel));
93
+ })))));
94
+ };
95
+ exports.CustomToolbarCmp = CustomToolbarCmp;
96
+ const CustomToolbarWrapper = (props) => {
97
+ const { api } = (0, AdaptableContext_1.useAdaptable)();
66
98
  return (React.createElement(PanelDashboard_1.PanelDashboard, { className: `ab-CustomToolbar ab-DashboardToolbar__${props.customToolbar.name}`, "data-name": `ab-CustomToolbar ab-DashboardToolbar__${props.customToolbar.name}`, headerText: props.customToolbar.title ? props.customToolbar.title : '', showConfigureButton: props.customToolbar.showConfigureButton != null &&
67
99
  props.customToolbar.showConfigureButton == true, showCloseButton: props.customToolbar.showCloseButton != null && props.customToolbar.showCloseButton == true, onConfigure: () => {
68
100
  const customToolbarConfiguredInfo = {
@@ -75,35 +107,6 @@ const CustomToolbarWrapper = (props) => {
75
107
  }, accessLevel: api.internalApi
76
108
  .getEntitlementService()
77
109
  .getEntitlementAccessLevelForModule('Dashboard') },
78
- React.createElement("div", { id: contentsDivId, ref: contentsDivRef, className: "CustomToolBarContents ab-CustomToolbar__contents ab-CustomToolbar__contents--render", style: { minHeight: 22 }, dangerouslySetInnerHTML: { __html: contentsHTML } }),
79
- React.createElement("div", { id: buttonsDivId, className: "ab-CustomToolbar__buttons", style: { minHeight: 22 } }, props.customToolbar.toolbarButtons &&
80
- props.customToolbar.toolbarButtons.map((button, index) => {
81
- // TODO: variants of this mapping are present in several places (just search for api.internalApi.getStyleForButton() usages)
82
- // with the next opportunity we should abstract it
83
- const dashboardContext = {
84
- customToolbar: props.customToolbar,
85
- adaptableApi: api,
86
- userName: api.optionsApi.getUserName(),
87
- adaptableId: api.optionsApi.getAdaptableId(),
88
- dashboardState: api.dashboardApi.getDashboardState(),
89
- };
90
- const buttonIcon = api.internalApi.getIconForButton(button, dashboardContext);
91
- let buttonStyle = api.internalApi.getStyleForButton(button, dashboardContext);
92
- let buttonLabel = api.internalApi.getLabelForButton(button, dashboardContext);
93
- let buttonTooltip = api.internalApi.getTooltipForButton(button, dashboardContext);
94
- if (button.hidden && button.hidden(button, dashboardContext)) {
95
- return null;
96
- }
97
- const disabled = button.disabled && button.disabled(button, dashboardContext);
98
- let buttonVariant = buttonStyle && buttonStyle.variant ? buttonStyle.variant : 'outlined';
99
- let buttonTone = buttonStyle && buttonStyle.tone ? buttonStyle.tone : 'neutral';
100
- return (React.createElement(AdaptableButton_1.AdaptableButtonComponent, { style: { marginLeft: index ? 'var(--ab-space-1)' : 0 }, key: index, disabled: disabled, tooltip: buttonTooltip, icon: buttonIcon, variant: buttonVariant, tone: buttonTone, className: (buttonStyle === null || buttonStyle === void 0 ? void 0 : buttonStyle.className) || '', onClick: () => {
101
- button.onClick ? button.onClick(button, dashboardContext) : null;
102
- setTimeout(() => {
103
- // mutate state to force a re-rendering
104
- setComponentRevision(componentRevision + 1);
105
- }, 16);
106
- } }, buttonLabel));
107
- }))));
110
+ React.createElement(exports.CustomToolbarCmp, Object.assign({}, props))));
108
111
  };
109
112
  exports.CustomToolbarWrapper = CustomToolbarWrapper;
@@ -1,12 +1,12 @@
1
1
  /// <reference types="react" />
2
2
  import * as Redux from 'redux';
3
- import { ModuleViewPopupProps } from '../Components/SharedProps/ModuleViewPopupProps';
3
+ import { SystemStatusMessageInfo } from '../../PredefinedConfig/Common/SystemStatusMessageInfo';
4
4
  import { AdaptableCoordinate, DashboardState } from '../../PredefinedConfig/DashboardState';
5
5
  import { GridState } from '../../PredefinedConfig/GridState';
6
6
  import * as DashboardRedux from '../../Redux/ActionsReducers/DashboardRedux';
7
7
  import * as PopupRedux from '../../Redux/ActionsReducers/PopupRedux';
8
8
  import * as QuickSearchRedux from '../../Redux/ActionsReducers/QuickSearchRedux';
9
- import { SystemStatusMessageInfo } from '../../PredefinedConfig/Common/SystemStatusMessageInfo';
9
+ import { ModuleViewPopupProps } from '../Components/SharedProps/ModuleViewPopupProps';
10
10
  interface DashboardComponentProps extends ModuleViewPopupProps<any> {
11
11
  DashboardRevision: number;
12
12
  DashboardState: DashboardState;