@adaptabletools/adaptable 10.0.3 → 10.0.4-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 (101) hide show
  1. package/package.json +1 -1
  2. package/publishTimestamp.d.ts +1 -1
  3. package/publishTimestamp.js +1 -1
  4. package/src/AdaptableOptions/UserInterfaceOptions.d.ts +3 -4
  5. package/src/Api/CalculatedColumnApi.d.ts +15 -0
  6. package/src/Api/ColumnApi.d.ts +6 -0
  7. package/src/Api/Implementation/AlertApiImpl.js +5 -5
  8. package/src/Api/Implementation/CalculatedColumnApiImpl.d.ts +3 -0
  9. package/src/Api/Implementation/CalculatedColumnApiImpl.js +23 -0
  10. package/src/Api/Implementation/ColumnApiImpl.d.ts +1 -0
  11. package/src/Api/Implementation/ColumnApiImpl.js +32 -35
  12. package/src/Api/Implementation/ExportApiImpl.js +4 -4
  13. package/src/Api/Implementation/FormatColumnApiImpl.js +1 -1
  14. package/src/Api/Implementation/FreeTextColumnApiImpl.js +7 -2
  15. package/src/Api/Implementation/GridApiImpl.js +8 -9
  16. package/src/Api/Implementation/InternalApiImpl.d.ts +1 -1
  17. package/src/Api/Implementation/InternalApiImpl.js +4 -4
  18. package/src/Api/Implementation/LayoutApiImpl.js +3 -3
  19. package/src/Api/Implementation/ScopeApiImpl.js +11 -11
  20. package/src/Api/Implementation/UserInterfaceApiImpl.d.ts +2 -1
  21. package/src/Api/Implementation/UserInterfaceApiImpl.js +4 -8
  22. package/src/Api/InternalApi.d.ts +1 -1
  23. package/src/Api/UserInterfaceApi.d.ts +3 -2
  24. package/src/PredefinedConfig/Common/AdaptableColumn.d.ts +33 -33
  25. package/src/PredefinedConfig/Common/AdaptableColumn.js +5 -5
  26. package/src/PredefinedConfig/Common/AdaptablePredicate.js +3 -3
  27. package/src/PredefinedConfig/Common/DataChangedInfo.d.ts +3 -2
  28. package/src/PredefinedConfig/Selection/GridCell.d.ts +2 -1
  29. package/src/Redux/ActionsReducers/SystemRedux.js +1 -1
  30. package/src/Redux/Store/AdaptableStore.js +3 -3
  31. package/src/Strategy/AdaptableModuleBase.js +8 -8
  32. package/src/Strategy/AlertModule.js +12 -11
  33. package/src/Strategy/BulkUpdateModule.js +5 -5
  34. package/src/Strategy/CalculatedColumnModule.js +1 -1
  35. package/src/Strategy/CellSummaryModule.js +3 -3
  36. package/src/Strategy/ConditionalStyleModule.js +3 -3
  37. package/src/Strategy/CustomSortModule.js +2 -2
  38. package/src/Strategy/ExportModule.js +1 -1
  39. package/src/Strategy/FilterModule.js +4 -4
  40. package/src/Strategy/FormatColumnModule.js +5 -5
  41. package/src/Strategy/FreeTextColumnModule.js +1 -1
  42. package/src/Strategy/LayoutModule.js +3 -3
  43. package/src/Strategy/PlusMinusModule.js +8 -9
  44. package/src/Strategy/SmartEditModule.js +6 -6
  45. package/src/Utilities/ExpressionFunctions/booleanExpressionFunctions.js +1 -1
  46. package/src/Utilities/ExpressionFunctions/expressionFunctionUtils.js +2 -2
  47. package/src/Utilities/ExpressionFunctions/observableExpressionFunctions.js +3 -2
  48. package/src/Utilities/ExpressionFunctions/scalarExpressionFunctions.js +1 -1
  49. package/src/Utilities/Helpers/PreviewHelper.js +2 -2
  50. package/src/Utilities/ObjectFactory.js +1 -1
  51. package/src/Utilities/Services/DataService.js +5 -5
  52. package/src/Utilities/Services/ReportService.js +11 -11
  53. package/src/Utilities/Services/ValidationService.js +4 -5
  54. package/src/View/Alert/AlertPopup.js +1 -1
  55. package/src/View/Alert/Wizard/BaseAlertScopeWizardSection.js +1 -1
  56. package/src/View/BulkUpdate/BulkUpdatePopup.js +3 -3
  57. package/src/View/CalculatedColumn/CalculatedColumnPopup.js +1 -1
  58. package/src/View/CalculatedColumn/CalculatedColumnSummary.js +1 -1
  59. package/src/View/CalculatedColumn/Wizard/CalculatedColumnSettingsWizardSection.js +1 -1
  60. package/src/View/Components/ColumnSelector/index.js +2 -2
  61. package/src/View/Components/FilterForm/FilterForm.js +14 -14
  62. package/src/View/Components/FilterForm/QuickFilterForm.js +13 -13
  63. package/src/View/Components/NewScopeComponent.js +1 -1
  64. package/src/View/Components/PreviewResultsPanel.js +1 -1
  65. package/src/View/Components/RangesComponent.js +2 -2
  66. package/src/View/Components/Selectors/ColumnSelector.js +5 -5
  67. package/src/View/Components/Selectors/ColumnValueSelector.js +4 -4
  68. package/src/View/Components/ToolPanel/AdaptableToolPanel.js +6 -6
  69. package/src/View/ConditionalStyle/ConditionalStylePopup.js +1 -1
  70. package/src/View/ConditionalStyle/ConditionalStyleSummary.js +1 -1
  71. package/src/View/CustomSort/CustomSortEntityRow.js +2 -2
  72. package/src/View/CustomSort/CustomSortPopup.js +1 -1
  73. package/src/View/CustomSort/CustomSortSummary.js +3 -3
  74. package/src/View/CustomSort/Wizard/CustomSortColumnWizardSection.js +3 -3
  75. package/src/View/DataChangeHistory/DataChangeHistoryGrid.js +3 -3
  76. package/src/View/Filter/FilterSummary.js +2 -2
  77. package/src/View/FormatColumn/FormatColumnPopup.js +1 -1
  78. package/src/View/FormatColumn/FormatColumnSummary.js +1 -1
  79. package/src/View/FormatColumn/Wizard/FormatColumnFormatWizardSection.js +1 -1
  80. package/src/View/FreeTextColumn/FreeTextColumnPopup.js +1 -1
  81. package/src/View/FreeTextColumn/FreeTextColumnSummary.js +2 -2
  82. package/src/View/FreeTextColumn/Wizard/FreeTextColumnSettingsWizardSection.js +1 -1
  83. package/src/View/GridInfo/ColumnInfoComponent.js +16 -16
  84. package/src/View/Layout/Wizard/LayoutEditor/ColumnList.js +6 -6
  85. package/src/View/Layout/Wizard/LayoutEditor/ColumnSortList.js +1 -1
  86. package/src/View/Layout/Wizard/LayoutEditor/PivotList.js +1 -1
  87. package/src/View/Layout/Wizard/LayoutEditor/RowGroupsList.js +1 -1
  88. package/src/View/Layout/Wizard/LayoutEditor/getItemStyle.js +2 -2
  89. package/src/View/Layout/Wizard/LayoutEditor/index.js +41 -41
  90. package/src/View/PlusMinus/PlusMinusPopup.js +1 -1
  91. package/src/View/PlusMinus/PlusMinusSummary.js +1 -1
  92. package/src/View/Query/QueryViewPanel.js +2 -2
  93. package/src/agGrid/Adaptable.js +57 -51
  94. package/src/agGrid/agGridHelper.js +32 -32
  95. package/src/agGrid/agGridMenuHelper.js +2 -2
  96. package/src/components/ExpressionEditor/index.js +7 -7
  97. package/src/metamodel/adaptable.metamodel.d.ts +51 -5
  98. package/src/metamodel/adaptable.metamodel.js +99 -30
  99. package/src/types.d.ts +1 -1
  100. package/version.d.ts +1 -1
  101. package/version.js +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adaptabletools/adaptable",
3
- "version": "10.0.3",
3
+ "version": "10.0.4-canary.0",
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
  "main": "index.js",
6
6
  "typings": "index.d.ts",
@@ -1,2 +1,2 @@
1
- declare const _default: 1637681957931;
1
+ declare const _default: 1637745164610;
2
2
  export default _default;
@@ -1,3 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.default = 1637681957931;
3
+ exports.default = 1637745164610;
@@ -101,15 +101,14 @@ export interface PermittedValues extends BasePermittedValues {
101
101
  * Used to define permitted values for inline column editor
102
102
  */
103
103
  export interface EditLookUpPermittedValues extends BasePermittedValues {
104
- values?: any[] | ((column: AdaptableColumn, rowData: any) => any[]);
104
+ values?: any[] | ((column: AdaptableColumn, gridCell: GridCell) => any[]);
105
105
  }
106
106
  /**
107
107
  * Used to define values inside the floating filter and floating filter (quick filter)
108
108
  */
109
109
  export interface FilterPermittedValues extends BasePermittedValues {
110
110
  /**
111
- * Prevents adaptable from filtering the list of values client-side.
112
- * When true, values is called each time filtering is done, via the search bar.
111
+ * Prevents AdapTable from filtering the list of values client-side; When true, values is called each time the search bar is changed
113
112
  * @default false
114
113
  */
115
114
  suppressClientSideFiltering?: boolean;
@@ -122,7 +121,7 @@ export interface CustomSortPermittedValues extends BasePermittedValues {
122
121
  values: (column: AdaptableColumn) => any[] | Promise<any[]>;
123
122
  }
124
123
  /**
125
- * User to define permitted values for when updating cells via bulk update
124
+ * User to define permitted values when updating cells via bulk update
126
125
  */
127
126
  export interface BulkUpdatePermittedValues extends BasePermittedValues {
128
127
  values: (column: AdaptableColumn, selectedGridCells: GridCell[]) => any[] | Promise<any[]>;
@@ -63,4 +63,19 @@ export interface CalculatedColumnApi {
63
63
  * @param calculatedColumn CalculatedColumn to be checked
64
64
  */
65
65
  getCalculatedColumnModuleReferences(calculatedColumn: CalculatedColumn): string[];
66
+ /**
67
+ * Returns all Calculated Columns whose Expression contains the ColumnId
68
+ * @param columnId ColumnId to check
69
+ */
70
+ getCalculatedColumnsReferencingColumnId(columnId: string): CalculatedColumn[];
71
+ /**
72
+ * Gets any ColumnIds referenced in a Calculated Column
73
+ * @param calculatedColumn Calculated Column to check
74
+ */
75
+ getReferencedColumnIdsForCalculatedColumn(calculatedColumn: CalculatedColumn): string[];
76
+ /**
77
+ * Gets any ColumnIds referenced in a Calculated Column
78
+ * @param calculatedColumnId CalculatedColumnId to check
79
+ */
80
+ getReferencedColumnIdsForCalculatedColumnId(calculatedColumnId: string): string[];
66
81
  }
@@ -269,4 +269,10 @@ export interface ColumnApi {
269
269
  * @param columnId Column to Check
270
270
  */
271
271
  usesAdaptableQuickFilter(columnId: string): boolean;
272
+ /**
273
+ * Checks if a column is referenced in a given Expression
274
+ * @param columnId Column to Check
275
+ * @param expression Expression to Lookup
276
+ */
277
+ isColumnReferencedInExpression(columnId: string, expression: string): boolean;
272
278
  }
@@ -117,7 +117,7 @@ class AlertApiImpl extends ApiBase_1.ApiBase {
117
117
  }
118
118
  if (actionName === 'highlight-cell') {
119
119
  this.adaptable.api.gridApi.highlightCell({
120
- columnId: dataChangedInfo.columnId,
120
+ columnId: dataChangedInfo.column.columnId,
121
121
  primaryKeyValue: dataChangedInfo.primaryKeyValue,
122
122
  highlightType: alertDefinition.MessageType,
123
123
  timeout: this.getNotificationsOptions().cellHighlightDuration,
@@ -125,11 +125,11 @@ class AlertApiImpl extends ApiBase_1.ApiBase {
125
125
  return;
126
126
  }
127
127
  if (actionName === 'jump-to-cell') {
128
- this.adaptable.api.gridApi.jumpToCell(dataChangedInfo.primaryKeyValue, dataChangedInfo.columnId);
128
+ this.adaptable.api.gridApi.jumpToCell(dataChangedInfo.primaryKeyValue, dataChangedInfo.column.columnId);
129
129
  return;
130
130
  }
131
131
  if (actionName === 'jump-to-column') {
132
- this.adaptable.api.gridApi.jumpToColumn(dataChangedInfo.columnId);
132
+ this.adaptable.api.gridApi.jumpToColumn(dataChangedInfo.column.columnId);
133
133
  return;
134
134
  }
135
135
  if (actionName === 'suspend') {
@@ -212,7 +212,7 @@ class AlertApiImpl extends ApiBase_1.ApiBase {
212
212
  }
213
213
  // 4: Jump to the Cell
214
214
  if (alertProperties.JumpToCell && dataChangedInfo) {
215
- this.adaptable.jumpToCell(dataChangedInfo.columnId, dataChangedInfo.rowNode);
215
+ this.adaptable.jumpToCell(dataChangedInfo.column.columnId, dataChangedInfo.rowNode);
216
216
  }
217
217
  // 5: Hight the cell - though that is taken care of in the Style Service
218
218
  if (alertProperties.HighlightCell && dataChangedInfo) {
@@ -221,7 +221,7 @@ class AlertApiImpl extends ApiBase_1.ApiBase {
221
221
  alertNode = this.adaptable.getRowNodeForPrimaryKey(dataChangedInfo.primaryKeyValue);
222
222
  }
223
223
  if (alertNode) {
224
- this.adaptable.api.gridApi.refreshCells([alertNode], [dataChangedInfo.columnId]);
224
+ this.adaptable.api.gridApi.refreshCells([alertNode], [dataChangedInfo.column.columnId]);
225
225
  setTimeout(() => {
226
226
  this.dispatchAction(SystemRedux.SystemAlertRemoveHighlight(alertToShow));
227
227
  }, this.adaptable.adaptableOptions.notificationsOptions.cellHighlightDuration);
@@ -13,4 +13,7 @@ export declare class CalculatedColumnApiImpl extends ApiBase implements Calculat
13
13
  deleteCalculatedColumn(column: string): void;
14
14
  showCalculatedColumnPopup(): void;
15
15
  getCalculatedColumnModuleReferences(calculatedColumn: CalculatedColumn): string[];
16
+ getCalculatedColumnsReferencingColumnId(columnId: string): CalculatedColumn[];
17
+ getReferencedColumnIdsForCalculatedColumn(calculatedColumn: CalculatedColumn): string[];
18
+ getReferencedColumnIdsForCalculatedColumnId(calculatedColumnId: string): string[];
16
19
  }
@@ -60,5 +60,28 @@ class CalculatedColumnApiImpl extends ApiBase_1.ApiBase {
60
60
  });
61
61
  return references;
62
62
  }
63
+ getCalculatedColumnsReferencingColumnId(columnId) {
64
+ var calcColumns = [];
65
+ this.getAllCalculatedColumn().forEach((calculatedColumn) => {
66
+ var _a;
67
+ if (this.adaptable.api.columnApi.isColumnReferencedInExpression(columnId, (_a = calculatedColumn.Query) === null || _a === void 0 ? void 0 : _a.ScalarExpression)) {
68
+ calcColumns.push(calculatedColumn);
69
+ }
70
+ });
71
+ return calcColumns;
72
+ }
73
+ getReferencedColumnIdsForCalculatedColumn(calculatedColumn) {
74
+ var _a;
75
+ const columnIds = this.adaptable.api.queryLanguageApi.getColumnsFromExpression((_a = calculatedColumn.Query) === null || _a === void 0 ? void 0 : _a.ScalarExpression);
76
+ return columnIds;
77
+ }
78
+ getReferencedColumnIdsForCalculatedColumnId(calculatedColumnId) {
79
+ const calculatedColumn = this.adaptable.api.calculatedColumnApi
80
+ .getAllCalculatedColumn()
81
+ .find((cc) => cc.ColumnId == calculatedColumnId);
82
+ if (calculatedColumn) {
83
+ return this.getReferencedColumnIdsForCalculatedColumn(calculatedColumn);
84
+ }
85
+ }
63
86
  }
64
87
  exports.CalculatedColumnApiImpl = CalculatedColumnApiImpl;
@@ -64,4 +64,5 @@ export declare class ColumnApiImpl extends ApiBase implements ColumnApi {
64
64
  getAllColumnFriendlyNames(): string[];
65
65
  usesAdaptableFilterForm(columnId: string): boolean;
66
66
  usesAdaptableQuickFilter(columnId: string): boolean;
67
+ isColumnReferencedInExpression(columnId: string, expression: string): boolean;
67
68
  }
@@ -18,7 +18,7 @@ class ColumnApiImpl extends ApiBase_1.ApiBase {
18
18
  acc[colId] = true;
19
19
  return acc;
20
20
  }, {});
21
- return this.getColumns().filter((c) => visibleCols[c.ColumnId]);
21
+ return this.getColumns().filter((c) => visibleCols[c.columnId]);
22
22
  }
23
23
  selectColumn(columnId) {
24
24
  this.adaptable.selectColumn(columnId);
@@ -78,33 +78,33 @@ class ColumnApiImpl extends ApiBase_1.ApiBase {
78
78
  return false;
79
79
  }
80
80
  isNumericColumn(column) {
81
- return column.DataType == Enums_1.DataType.Number;
81
+ return column.dataType == Enums_1.DataType.Number;
82
82
  }
83
83
  isBooleanColumn(column) {
84
- return column.DataType == Enums_1.DataType.Boolean;
84
+ return column.dataType == Enums_1.DataType.Boolean;
85
85
  }
86
86
  isDateColumn(column) {
87
- return column.DataType == Enums_1.DataType.Date;
87
+ return column.dataType == Enums_1.DataType.Date;
88
88
  }
89
89
  getColumnDataTypeFromColumnId(columnId) {
90
90
  const column = this.getColumnFromId(columnId); // this.getColumns().find(c => c.ColumnId == columnId);
91
91
  if (!column) {
92
92
  return undefined;
93
93
  }
94
- return column.DataType;
94
+ return column.dataType;
95
95
  }
96
96
  getFriendlyNameFromColumn(columnId, column) {
97
97
  if (columnId.includes(GeneralConstants.MISSING_COLUMN)) {
98
98
  return columnId;
99
99
  }
100
100
  if (column) {
101
- return column.FriendlyName;
101
+ return column.friendlyName;
102
102
  }
103
103
  this.LogMissingColumnWarning(columnId);
104
104
  return columnId + GeneralConstants.MISSING_COLUMN;
105
105
  }
106
106
  getFriendlyNameFromColumnId(columnId) {
107
- const foundColumn = this.getColumns().find((c) => c.ColumnId == columnId);
107
+ const foundColumn = this.getColumns().find((c) => c.columnId == columnId);
108
108
  if (foundColumn) {
109
109
  return this.getFriendlyNameFromColumn(columnId, foundColumn);
110
110
  }
@@ -130,9 +130,9 @@ class ColumnApiImpl extends ApiBase_1.ApiBase {
130
130
  if (friendlyName.includes(GeneralConstants.MISSING_COLUMN)) {
131
131
  return friendlyName.replace(GeneralConstants.MISSING_COLUMN, ''); // Ids should stay "pure"
132
132
  }
133
- const foundColumn = this.getColumns().find((c) => c.FriendlyName == friendlyName);
133
+ const foundColumn = this.getColumns().find((c) => c.friendlyName == friendlyName);
134
134
  if (foundColumn) {
135
- return foundColumn.ColumnId;
135
+ return foundColumn.columnId;
136
136
  }
137
137
  this.LogMissingColumnWarning(friendlyName);
138
138
  return friendlyName + GeneralConstants.MISSING_COLUMN;
@@ -149,7 +149,7 @@ class ColumnApiImpl extends ApiBase_1.ApiBase {
149
149
  }
150
150
  getColumnsFromFriendlyNames(friendlyNames) {
151
151
  // not sure if this is right as might ignore bad cols
152
- return friendlyNames.map((friendlyName) => this.getColumns().find((x) => x.FriendlyName == friendlyName));
152
+ return friendlyNames.map((friendlyName) => this.getColumns().find((x) => x.friendlyName == friendlyName));
153
153
  }
154
154
  getColumnsFromIds(columnIds, logWarning = true) {
155
155
  let returnCols = [];
@@ -166,7 +166,7 @@ class ColumnApiImpl extends ApiBase_1.ApiBase {
166
166
  if (ArrayExtensions_1.default.IsNullOrEmpty(this.getColumns())) {
167
167
  return null;
168
168
  }
169
- const foundColumn = this.getColumns().find((c) => c.ColumnId == columnId);
169
+ const foundColumn = this.getColumns().find((c) => c.columnId == columnId);
170
170
  if (foundColumn) {
171
171
  return foundColumn;
172
172
  }
@@ -176,20 +176,13 @@ class ColumnApiImpl extends ApiBase_1.ApiBase {
176
176
  return undefined;
177
177
  }
178
178
  getColumnIdsFromId(columnId, logWarning = false) {
179
- var _a;
180
179
  const col = this.getColumnFromId(columnId, logWarning);
181
180
  if (col) {
182
- if (this.isCalculatedColumn(col.ColumnId)) {
183
- const calculatedColumn = this.adaptable.api.calculatedColumnApi
184
- .getAllCalculatedColumn()
185
- .find((cc) => cc.ColumnId == col.ColumnId);
186
- if (calculatedColumn) {
187
- const columnIds = this.adaptable.api.queryLanguageApi.getColumnsFromExpression((_a = calculatedColumn.Query) === null || _a === void 0 ? void 0 : _a.ScalarExpression);
188
- return columnIds;
189
- }
181
+ if (this.isCalculatedColumn(col.columnId)) {
182
+ return this.adaptable.api.calculatedColumnApi.getReferencedColumnIdsForCalculatedColumnId(col.columnId);
190
183
  }
191
184
  else {
192
- return [col.ColumnId];
185
+ return [col.columnId];
193
186
  }
194
187
  }
195
188
  return undefined;
@@ -202,7 +195,7 @@ class ColumnApiImpl extends ApiBase_1.ApiBase {
202
195
  if (ArrayExtensions_1.default.IsNullOrEmpty(this.getColumns())) {
203
196
  return null;
204
197
  }
205
- const foundColumn = this.getColumns().find((c) => c.FriendlyName == columnName);
198
+ const foundColumn = this.getColumns().find((c) => c.friendlyName == columnName);
206
199
  if (foundColumn) {
207
200
  return foundColumn;
208
201
  }
@@ -230,36 +223,36 @@ class ColumnApiImpl extends ApiBase_1.ApiBase {
230
223
  }
231
224
  }
232
225
  getNumericColumns() {
233
- return this.getColumns().filter((c) => c.DataType == Enums_1.DataType.Number);
226
+ return this.getColumns().filter((c) => c.dataType == Enums_1.DataType.Number);
234
227
  }
235
228
  getNumericArrayColumns() {
236
- return this.getColumns().filter((c) => c.DataType == Enums_1.DataType.NumberArray);
229
+ return this.getColumns().filter((c) => c.dataType == Enums_1.DataType.NumberArray);
237
230
  }
238
231
  getStringColumns() {
239
- return this.getColumns().filter((c) => c.DataType == Enums_1.DataType.String);
232
+ return this.getColumns().filter((c) => c.dataType == Enums_1.DataType.String);
240
233
  }
241
234
  getDateColumns() {
242
- return this.getColumns().filter((c) => c.DataType == Enums_1.DataType.Date);
235
+ return this.getColumns().filter((c) => c.dataType == Enums_1.DataType.Date);
243
236
  }
244
237
  getBooleanColumns() {
245
- return this.getColumns().filter((c) => c.DataType == Enums_1.DataType.Boolean);
238
+ return this.getColumns().filter((c) => c.dataType == Enums_1.DataType.Boolean);
246
239
  }
247
240
  getSortableColumns() {
248
- return this.getColumns().filter((c) => c.Sortable);
241
+ return this.getColumns().filter((c) => c.sortable);
249
242
  }
250
243
  getGroupableColumns() {
251
- return this.getColumns().filter((c) => c.Groupable);
244
+ return this.getColumns().filter((c) => c.groupable);
252
245
  }
253
246
  getPivotableColumns() {
254
- return this.getColumns().filter((c) => c.Pivotable);
247
+ return this.getColumns().filter((c) => c.pivotable);
255
248
  }
256
249
  getAggregetableColumns() {
257
250
  return this.getColumns()
258
- .filter((c) => c.Aggregatable)
259
- .filter((c) => c.DataType == Enums_1.DataType.Number);
251
+ .filter((c) => c.aggregatable)
252
+ .filter((c) => c.dataType == Enums_1.DataType.Number);
260
253
  }
261
254
  getQueryableColumns() {
262
- return this.getColumns().filter((c) => c.Queryable);
255
+ return this.getColumns().filter((c) => c.queryable);
263
256
  }
264
257
  LogMissingColumnWarning(columnId) {
265
258
  if (this.adaptable.adaptableOptions.generalOptions.showMissingColumnsWarning &&
@@ -352,7 +345,7 @@ class ColumnApiImpl extends ApiBase_1.ApiBase {
352
345
  // this does NOT into account Custom Sort - far too hard for now...
353
346
  let sortOrder = Enums_1.SortOrder.Asc;
354
347
  if (this.getFilterOptions().sortColumnValuesInFilter) {
355
- let columnSort = this.adaptable.api.gridApi.getColumnSortForColumn(column.ColumnId);
348
+ let columnSort = this.adaptable.api.gridApi.getColumnSortForColumn(column.columnId);
356
349
  if (columnSort && columnSort.SortOrder == 'Desc') {
357
350
  sortOrder = Enums_1.SortOrder.Desc;
358
351
  }
@@ -373,7 +366,7 @@ class ColumnApiImpl extends ApiBase_1.ApiBase {
373
366
  }
374
367
  getAllColumnFriendlyNames() {
375
368
  return this.getColumns().map((c) => {
376
- return c.FriendlyName;
369
+ return c.friendlyName;
377
370
  });
378
371
  }
379
372
  usesAdaptableFilterForm(columnId) {
@@ -398,5 +391,9 @@ class ColumnApiImpl extends ApiBase_1.ApiBase {
398
391
  }
399
392
  return true;
400
393
  }
394
+ isColumnReferencedInExpression(columnId, expression) {
395
+ const colIds = this.adaptable.api.queryLanguageApi.getColumnsFromExpression(expression);
396
+ return colIds.some((c) => c === columnId);
397
+ }
401
398
  }
402
399
  exports.ColumnApiImpl = ColumnApiImpl;
@@ -103,7 +103,6 @@ class ExportApiImpl extends ApiBase_1.ApiBase {
103
103
  if (report.ReportRowScope == 'CustomRows' || report.ReportColumnScope == 'CustomColumns') {
104
104
  return false;
105
105
  }
106
- let abColumn = this.adaptable.api.columnApi.getColumnFromId(dataChangedInfo.columnId);
107
106
  // Start with the DataChanged Column and go through all possibilities
108
107
  switch (report.ReportColumnScope) {
109
108
  case 'AllColumns':
@@ -111,21 +110,22 @@ class ExportApiImpl extends ApiBase_1.ApiBase {
111
110
  break;
112
111
  case 'ScopeColumns':
113
112
  // use the Scope object which will tell us if the Column is relevant
114
- if (!this.adaptable.api.scopeApi.isColumnInScopeColumns(abColumn, report.Scope)) {
113
+ if (!this.adaptable.api.scopeApi.isColumnInScopeColumns(dataChangedInfo.column, report.Scope)) {
115
114
  return false;
116
115
  }
117
116
  break;
118
117
  case 'SelectedColumns':
119
118
  let selectedCellInfo = this.adaptable.api.gridApi.getSelectedCellInfo();
120
119
  if (selectedCellInfo) {
121
- if (selectedCellInfo.columns.find((c) => c.ColumnId == dataChangedInfo.columnId) == null) {
120
+ if (selectedCellInfo.columns.find((c) => c.columnId == dataChangedInfo.column.columnId) ==
121
+ null) {
122
122
  return false;
123
123
  }
124
124
  }
125
125
  break;
126
126
  case 'VisibleColumns':
127
127
  // hope that visibile column property is updated whenever the layout changes... (need to check!)
128
- if (!abColumn.Visible) {
128
+ if (!dataChangedInfo.column.visible) {
129
129
  return false;
130
130
  }
131
131
  break;
@@ -243,7 +243,7 @@ class FormatColumnApiImpl extends ApiBase_1.ApiBase {
243
243
  }
244
244
  getCheckBoxStyleFormatColumn(column) {
245
245
  var _a;
246
- if (column.DataType != 'Boolean') {
246
+ if (column.dataType != 'Boolean') {
247
247
  return undefined;
248
248
  }
249
249
  const checkBoxFormatColumns = (_a = this.getFormatColumnState().FormatColumns) === null || _a === void 0 ? void 0 : _a.filter((fc) => { var _a; return (_a = fc.ColumnStyle) === null || _a === void 0 ? void 0 : _a.CheckBoxStyle; });
@@ -104,14 +104,19 @@ class FreeTextColumnApiImpl extends ApiBase_1.ApiBase {
104
104
  }
105
105
  }
106
106
  checkFreeTextColumnForDataChange(dataChangedInfo) {
107
- let freeTextColumn = this.getAllFreeTextColumn().find((fc) => fc.ColumnId == dataChangedInfo.columnId);
107
+ let freeTextColumn = this.getAllFreeTextColumn().find((fc) => fc.ColumnId == dataChangedInfo.column.columnId);
108
108
  if (freeTextColumn) {
109
109
  let freeTextStoredValue = {
110
110
  PrimaryKey: dataChangedInfo.primaryKeyValue,
111
111
  FreeText: dataChangedInfo.newValue,
112
112
  };
113
113
  this.addEditFreeTextColumnStoredValue(freeTextColumn, freeTextStoredValue);
114
- this.adaptable.refreshCells([dataChangedInfo.rowNode], [dataChangedInfo.columnId], false);
114
+ var colsToRefresh = [dataChangedInfo.column.columnId];
115
+ const refencedCalcColumns = this.adaptable.api.calculatedColumnApi.getCalculatedColumnsReferencingColumnId(dataChangedInfo.column.columnId);
116
+ refencedCalcColumns.forEach((calculatedColumn) => {
117
+ colsToRefresh.push(calculatedColumn.ColumnId);
118
+ });
119
+ this.adaptable.refreshCells([dataChangedInfo.rowNode], colsToRefresh, false);
115
120
  }
116
121
  }
117
122
  getFreeTextColumnModuleReferences(freeTextColumn) {
@@ -32,7 +32,7 @@ class GridApiImpl extends ApiBase_1.ApiBase {
32
32
  undoCellEdit(dataChangedInfo) {
33
33
  // for the reason of this hacky solution see the comments in DataService
34
34
  this.adaptable.api.internalApi.getDataService().logUndoChange(dataChangedInfo);
35
- this.setCellValue(dataChangedInfo.columnId, dataChangedInfo.oldValue, dataChangedInfo.primaryKeyValue);
35
+ this.setCellValue(dataChangedInfo.column.columnId, dataChangedInfo.oldValue, dataChangedInfo.primaryKeyValue);
36
36
  return true;
37
37
  }
38
38
  deleteGridData(dataRows, dataUpdateConfig) {
@@ -42,18 +42,18 @@ class GridApiImpl extends ApiBase_1.ApiBase {
42
42
  }
43
43
  }
44
44
  setCellValue(columnId, newValue, primaryKeyValue) {
45
- let gridCell = {
45
+ const abColumn = this.adaptable.api.columnApi.getColumnFromId(columnId);
46
+ if (!abColumn || abColumn.readOnly) {
47
+ return;
48
+ }
49
+ const gridCell = {
46
50
  primaryKeyValue: primaryKeyValue,
47
- columnId: columnId,
48
51
  rawValue: newValue,
49
52
  displayValue: newValue,
50
53
  normalisedValue: newValue,
51
54
  rowNode: this.getRowNodeForPrimaryKey(primaryKeyValue),
55
+ column: abColumn,
52
56
  };
53
- const abColumn = this.adaptable.api.columnApi.getColumnFromId(columnId);
54
- if (!abColumn || abColumn.ReadOnly) {
55
- return;
56
- }
57
57
  this.adaptable.api.internalApi.setGridCell(gridCell);
58
58
  }
59
59
  setCellsValue(gridCells) {
@@ -290,8 +290,7 @@ class GridApiImpl extends ApiBase_1.ApiBase {
290
290
  let returnValue = true;
291
291
  gridCells.forEach((gridCell) => {
292
292
  if (returnValue) {
293
- let abColumn = this.adaptable.api.columnApi.getColumnFromId(gridCell.columnId);
294
- if (abColumn.ReadOnly) {
293
+ if (gridCell.column.readOnly) {
295
294
  returnValue = false;
296
295
  return;
297
296
  }
@@ -73,7 +73,7 @@ export declare class InternalApiImpl extends ApiBase implements InternalApi {
73
73
  setGridCells(gridCells: GridCell[]): void;
74
74
  setToolbarTitle(): string;
75
75
  setGridCell(gridCell: GridCell): void;
76
- buildDataChangedInfo(config: Pick<DataChangedInfo, 'newValue' | 'oldValue' | 'columnId' | 'primaryKeyValue' | 'rowNode' | 'trigger'>): DataChangedInfo;
76
+ buildDataChangedInfo(config: Pick<DataChangedInfo, 'newValue' | 'oldValue' | 'column' | 'primaryKeyValue' | 'rowNode' | 'trigger'>): DataChangedInfo;
77
77
  private createDataChangedInfoFromGridCell;
78
78
  setLastAppliedShortCut(gridCell: GridCell | undefined): void;
79
79
  updateCurrentDraftLayout(layout: Layout): void;
@@ -144,7 +144,7 @@ class InternalApiImpl extends ApiBase_1.ApiBase {
144
144
  this.dispatchAction(GridRedux.GridAddColumns(AdaptableColumns));
145
145
  }
146
146
  removeAdaptableColumn(colId) {
147
- const col = this.getAdaptableState().Grid.Columns.find((c) => c.ColumnId === colId);
147
+ const col = this.getAdaptableState().Grid.Columns.find((c) => c.columnId === colId);
148
148
  if (col) {
149
149
  this.dispatchAction(GridRedux.GridRemoveColumn(col));
150
150
  }
@@ -175,12 +175,12 @@ class InternalApiImpl extends ApiBase_1.ApiBase {
175
175
  return Object.assign(Object.assign({}, config), { rowData: (_a = config.rowNode) === null || _a === void 0 ? void 0 : _a.data, changedAt: Date.now() });
176
176
  }
177
177
  createDataChangedInfoFromGridCell(gridCell) {
178
- let currentValue = this.adaptable.getDisplayValue(gridCell.primaryKeyValue, gridCell.columnId);
178
+ let currentValue = this.adaptable.getDisplayValue(gridCell.primaryKeyValue, gridCell.column.columnId);
179
179
  const currentRowNode = this.adaptable.getRowNodeForPrimaryKey(gridCell.primaryKeyValue);
180
180
  const dataChangedInfo = this.buildDataChangedInfo({
181
181
  oldValue: currentValue,
182
182
  newValue: gridCell.rawValue,
183
- columnId: gridCell.columnId,
183
+ column: gridCell.column,
184
184
  primaryKeyValue: gridCell.primaryKeyValue,
185
185
  rowNode: currentRowNode,
186
186
  });
@@ -272,7 +272,7 @@ class InternalApiImpl extends ApiBase_1.ApiBase {
272
272
  }
273
273
  getCustomSortComparer(column) {
274
274
  var _a;
275
- return (_a = this.getGeneralOptions().customSortComparers) === null || _a === void 0 ? void 0 : _a.find((csc) => csc.columnId == column.ColumnId);
275
+ return (_a = this.getGeneralOptions().customSortComparers) === null || _a === void 0 ? void 0 : _a.find((csc) => csc.columnId == column.columnId);
276
276
  }
277
277
  getLabelForButton(button, context) {
278
278
  if (!button.label) {
@@ -188,9 +188,9 @@ class LayoutApiImpl extends ApiBase_1.ApiBase {
188
188
  let gridState = this.getAdaptableApi().gridApi.getGridState();
189
189
  let layoutState = this.getLayoutState();
190
190
  const isLayoutDefined = (layoutName) => !!layoutState.Layouts.filter((layout) => layout.Name === layoutName)[0];
191
- let defaultLayoutColumns = gridState.Columns.filter((column) => column.Visible);
191
+ let defaultLayoutColumns = gridState.Columns.filter((column) => column.visible);
192
192
  const columnsMap = gridState.Columns.reduce((acc, col) => {
193
- acc[col.ColumnId] = col;
193
+ acc[col.columnId] = col;
194
194
  return acc;
195
195
  }, {});
196
196
  let shouldCreateDefaultLayout = this.getLayoutOptions().createDefaultLayout;
@@ -201,7 +201,7 @@ class LayoutApiImpl extends ApiBase_1.ApiBase {
201
201
  if (!layoutState.Layouts || !isLayoutDefined(GeneralConstants_1.DEFAULT_LAYOUT)) {
202
202
  let defaultLayout = ObjectFactory_1.default.CreateEmptyLayout({
203
203
  Name: GeneralConstants_1.DEFAULT_LAYOUT,
204
- Columns: defaultLayoutColumns.map((c) => c.ColumnId),
204
+ Columns: defaultLayoutColumns.map((c) => c.columnId),
205
205
  }, gridState.Columns);
206
206
  this.saveLayout(defaultLayout);
207
207
  return defaultLayout;
@@ -14,10 +14,10 @@ class ScopeApiImpl extends ApiBase_1.ApiBase {
14
14
  // do we need a true check here?
15
15
  return true;
16
16
  }
17
- if ('DataTypes' in scope && scope.DataTypes.includes(column.DataType)) {
17
+ if ('DataTypes' in scope && scope.DataTypes.includes(column.dataType)) {
18
18
  return true;
19
19
  }
20
- if ('ColumnIds' in scope && scope.ColumnIds.includes(column.ColumnId)) {
20
+ if ('ColumnIds' in scope && scope.ColumnIds.includes(column.columnId)) {
21
21
  return true;
22
22
  }
23
23
  return false;
@@ -31,10 +31,10 @@ class ScopeApiImpl extends ApiBase_1.ApiBase {
31
31
  return columns;
32
32
  }
33
33
  return columns.filter((c) => {
34
- if ('DataTypes' in scope && scope.DataTypes.includes(c.DataType)) {
34
+ if ('DataTypes' in scope && scope.DataTypes.includes(c.dataType)) {
35
35
  return true;
36
36
  }
37
- if ('ColumnIds' in scope && scope.ColumnIds.includes(c.ColumnId)) {
37
+ if ('ColumnIds' in scope && scope.ColumnIds.includes(c.columnId)) {
38
38
  return true;
39
39
  }
40
40
  return false;
@@ -140,7 +140,7 @@ class ScopeApiImpl extends ApiBase_1.ApiBase {
140
140
  }
141
141
  isColumnInNumericScope(column, scope) {
142
142
  // if column is not even numeric then return false
143
- if (column == null || column == undefined || column.DataType !== 'Number') {
143
+ if (column == null || column == undefined || column.dataType !== 'Number') {
144
144
  return false;
145
145
  }
146
146
  // if no scope then return false
@@ -148,7 +148,7 @@ class ScopeApiImpl extends ApiBase_1.ApiBase {
148
148
  return false;
149
149
  }
150
150
  // check if the scope has ColumnIds and whether this column is contained
151
- if ('ColumnIds' in scope && scope.ColumnIds.includes(column.ColumnId)) {
151
+ if ('ColumnIds' in scope && scope.ColumnIds.includes(column.columnId)) {
152
152
  return true;
153
153
  }
154
154
  // check if the scope has ColumnIds and whether this column is contained
@@ -159,7 +159,7 @@ class ScopeApiImpl extends ApiBase_1.ApiBase {
159
159
  }
160
160
  isColumnInStringsScope(column, scope) {
161
161
  // if column is not even string then return false
162
- if (column == null || column == undefined || column.DataType !== 'String') {
162
+ if (column == null || column == undefined || column.dataType !== 'String') {
163
163
  return false;
164
164
  }
165
165
  // if no scope then return false
@@ -167,7 +167,7 @@ class ScopeApiImpl extends ApiBase_1.ApiBase {
167
167
  return false;
168
168
  }
169
169
  // check if the scope has ColumnIds and whether this column is contained
170
- if ('ColumnIds' in scope && scope.ColumnIds.includes(column.ColumnId)) {
170
+ if ('ColumnIds' in scope && scope.ColumnIds.includes(column.columnId)) {
171
171
  return true;
172
172
  }
173
173
  // check if the scope has ColumnIds and whether this column is contained
@@ -178,7 +178,7 @@ class ScopeApiImpl extends ApiBase_1.ApiBase {
178
178
  }
179
179
  isColumnInDateScope(column, scope) {
180
180
  // if column is not even numeric then return false
181
- if (column == null || column == undefined || column.DataType !== 'Date') {
181
+ if (column == null || column == undefined || column.dataType !== 'Date') {
182
182
  return false;
183
183
  }
184
184
  // if no scope then return false
@@ -186,7 +186,7 @@ class ScopeApiImpl extends ApiBase_1.ApiBase {
186
186
  return false;
187
187
  }
188
188
  // check if the scope has ColumnIds and whether this column is contained
189
- if ('ColumnIds' in scope && scope.ColumnIds.includes(column.ColumnId)) {
189
+ if ('ColumnIds' in scope && scope.ColumnIds.includes(column.columnId)) {
190
190
  return true;
191
191
  }
192
192
  // check if the scope has ColumnIds and whether this column is contained
@@ -213,7 +213,7 @@ class ScopeApiImpl extends ApiBase_1.ApiBase {
213
213
  'DataTypes' in b &&
214
214
  a.ColumnIds.every((columnId) => {
215
215
  var _a;
216
- return b.DataTypes.includes((_a = this.adaptable.api.columnApi.getColumnFromId(columnId)) === null || _a === void 0 ? void 0 : _a.DataType);
216
+ return b.DataTypes.includes((_a = this.adaptable.api.columnApi.getColumnFromId(columnId)) === null || _a === void 0 ? void 0 : _a.dataType);
217
217
  })) {
218
218
  return true;
219
219
  }
@@ -4,6 +4,7 @@ import { AdaptableColumn } from '../../PredefinedConfig/Common/AdaptableColumn';
4
4
  import { AdaptableStyle } from '../../PredefinedConfig/Common/AdaptableStyle';
5
5
  import { UserMenuItem } from '../../PredefinedConfig/Common/Menu';
6
6
  import { ActionColumn, BulkUpdatePermittedValues, CustomSortPermittedValues, EditLookUpPermittedValues, FilterPermittedValues, PermittedValues } from '../../AdaptableOptions/UserInterfaceOptions';
7
+ import { GridCell } from '../../types';
7
8
  export declare class UserInterfaceApiImpl extends ApiBase implements UserInterfaceApi {
8
9
  getColorPalette(): string[];
9
10
  getStyleClassNames(): string[] | undefined;
@@ -18,7 +19,7 @@ export declare class UserInterfaceApiImpl extends ApiBase implements UserInterfa
18
19
  getBulkUpdatePermittedValuesForColumn(column: AdaptableColumn): BulkUpdatePermittedValues | undefined;
19
20
  getAllEditLookUpItems(): EditLookUpPermittedValues[];
20
21
  getEditLookUpItemForColumn(column: AdaptableColumn): EditLookUpPermittedValues | undefined;
21
- getEditLookUpValuesForEditLookUpItem(editLookUpItem: EditLookUpPermittedValues, columnId: string, data: any): any[] | undefined;
22
+ getEditLookUpValuesForEditLookUpItem(editLookUpItem: EditLookUpPermittedValues, gridCell: GridCell): any[] | undefined;
22
23
  addColumnMenuItem(columnMenuItem: UserMenuItem): void;
23
24
  addContextMenuItem(contextMenuItem: UserMenuItem): void;
24
25
  getEditableCellStyle(): AdaptableStyle | undefined;