@adaptabletools/adaptable 11.0.9 → 11.1.1-canary.1

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 (150) hide show
  1. package/base.css +19 -11
  2. package/bundle.cjs.js +125 -125
  3. package/index.css +23 -11
  4. package/package.json +2 -2
  5. package/publishTimestamp.d.ts +1 -1
  6. package/publishTimestamp.js +1 -1
  7. package/src/AdaptableInterfaces/IAdaptable.d.ts +4 -2
  8. package/src/AdaptableOptions/AlertOptions.d.ts +2 -2
  9. package/src/AdaptableOptions/DataChangeHistoryOptions.d.ts +2 -2
  10. package/src/AdaptableOptions/EditOptions.d.ts +2 -2
  11. package/src/AdaptableOptions/LayoutOptions.d.ts +5 -1
  12. package/src/Api/AlertApi.d.ts +5 -6
  13. package/src/Api/BulkUpdateApi.d.ts +5 -0
  14. package/src/Api/ConfigApi.d.ts +1 -1
  15. package/src/Api/DataChangeHistoryApi.d.ts +3 -3
  16. package/src/Api/EventApi.d.ts +1 -1
  17. package/src/Api/Events/CellChanged.d.ts +2 -2
  18. package/src/Api/Events/GridDataChanged.d.ts +5 -1
  19. package/src/Api/ExportApi.d.ts +3 -3
  20. package/src/Api/FreeTextColumnApi.d.ts +3 -3
  21. package/src/Api/GridApi.d.ts +27 -6
  22. package/src/Api/Implementation/AlertApiImpl.d.ts +7 -4
  23. package/src/Api/Implementation/AlertApiImpl.js +86 -59
  24. package/src/Api/Implementation/BulkUpdateApiImpl.d.ts +1 -0
  25. package/src/Api/Implementation/BulkUpdateApiImpl.js +4 -0
  26. package/src/Api/Implementation/ConfigApiImpl.d.ts +1 -1
  27. package/src/Api/Implementation/ConfigApiImpl.js +7 -2
  28. package/src/Api/Implementation/DataChangeHistoryApiImpl.d.ts +3 -3
  29. package/src/Api/Implementation/EventApiImpl.js +1 -1
  30. package/src/Api/Implementation/ExportApiImpl.d.ts +2 -2
  31. package/src/Api/Implementation/ExportApiImpl.js +7 -8
  32. package/src/Api/Implementation/FreeTextColumnApiImpl.d.ts +2 -2
  33. package/src/Api/Implementation/FreeTextColumnApiImpl.js +7 -7
  34. package/src/Api/Implementation/GridApiImpl.d.ts +11 -3
  35. package/src/Api/Implementation/GridApiImpl.js +29 -8
  36. package/src/Api/Implementation/InternalApiImpl.d.ts +11 -4
  37. package/src/Api/Implementation/InternalApiImpl.js +41 -5
  38. package/src/Api/Implementation/LayoutApiImpl.d.ts +2 -1
  39. package/src/Api/Implementation/LayoutApiImpl.js +19 -4
  40. package/src/Api/Implementation/ScheduleApiImpl.js +1 -0
  41. package/src/Api/Implementation/SettingsPanelApiImpl.js +7 -1
  42. package/src/Api/InternalApi.d.ts +10 -3
  43. package/src/Api/LayoutApi.d.ts +14 -3
  44. package/src/PredefinedConfig/AlertState.d.ts +7 -3
  45. package/src/PredefinedConfig/Common/AdaptableAlert.d.ts +35 -6
  46. package/src/PredefinedConfig/Common/AdaptableAlert.js +7 -0
  47. package/src/PredefinedConfig/Common/AdaptableFlashingCell.d.ts +2 -2
  48. package/src/PredefinedConfig/Common/AdaptablePredicate.js +20 -0
  49. package/src/PredefinedConfig/Common/{DataChangedInfo.d.ts → CellDataChangedInfo.d.ts} +2 -6
  50. package/src/PredefinedConfig/Common/{DataChangedInfo.js → CellDataChangedInfo.js} +0 -0
  51. package/src/PredefinedConfig/Common/CellHighlightInfo.d.ts +1 -1
  52. package/src/PredefinedConfig/Common/DataChangedScope.d.ts +4 -0
  53. package/src/PredefinedConfig/Common/DataChangedScope.js +2 -0
  54. package/src/PredefinedConfig/Common/Entitlement.d.ts +2 -2
  55. package/src/PredefinedConfig/Common/Menu.d.ts +3 -0
  56. package/src/PredefinedConfig/Common/RowsHighlightInfo.d.ts +15 -0
  57. package/src/PredefinedConfig/Common/RowsHighlightInfo.js +2 -0
  58. package/src/PredefinedConfig/ConfigState.d.ts +4 -1
  59. package/src/PredefinedConfig/LayoutState.d.ts +1 -1
  60. package/src/PredefinedConfig/PopupState.d.ts +2 -1
  61. package/src/PredefinedConfig/SystemState.d.ts +2 -2
  62. package/src/Redux/ActionsReducers/FlashingCellRedux.js +4 -8
  63. package/src/Redux/ActionsReducers/GridRedux.d.ts +5 -5
  64. package/src/Redux/ActionsReducers/PopupRedux.d.ts +18 -0
  65. package/src/Redux/ActionsReducers/PopupRedux.js +36 -1
  66. package/src/Redux/ActionsReducers/SystemRedux.d.ts +16 -5
  67. package/src/Redux/ActionsReducers/SystemRedux.js +37 -6
  68. package/src/Redux/Store/AdaptableReduxMerger.d.ts +1 -0
  69. package/src/Redux/Store/AdaptableReduxMerger.js +40 -4
  70. package/src/Redux/Store/AdaptableStore.js +76 -34
  71. package/src/Strategy/AlertModule.d.ts +5 -3
  72. package/src/Strategy/AlertModule.js +68 -22
  73. package/src/Strategy/BulkUpdateModule.js +7 -2
  74. package/src/Strategy/DataChangeHistoryModule.js +8 -6
  75. package/src/Strategy/ExportModule.js +1 -0
  76. package/src/Strategy/FlashingCellModule.d.ts +2 -2
  77. package/src/Strategy/FlashingCellModule.js +21 -15
  78. package/src/Strategy/FormatColumnModule.js +4 -2
  79. package/src/Strategy/SmartEditModule.js +6 -0
  80. package/src/Utilities/Defaults/DefaultAdaptableOptions.js +1 -0
  81. package/src/Utilities/Defaults/DefaultSettingsPanel.d.ts +1 -1
  82. package/src/Utilities/Defaults/DefaultSettingsPanel.js +6 -2
  83. package/src/Utilities/Emitter.d.ts +1 -1
  84. package/src/Utilities/Emitter.js +6 -3
  85. package/src/Utilities/ExpressionFunctions/expressionFunctionUtils.d.ts +2 -2
  86. package/src/Utilities/ExpressionFunctions/expressionFunctionUtils.js +1 -1
  87. package/src/Utilities/Interface/MessagePopups.d.ts +13 -0
  88. package/src/Utilities/ObjectFactory.d.ts +9 -7
  89. package/src/Utilities/ObjectFactory.js +26 -12
  90. package/src/Utilities/Services/CalculatedColumnExpressionService.js +3 -3
  91. package/src/Utilities/Services/DataService.d.ts +5 -5
  92. package/src/Utilities/Services/DataService.js +12 -10
  93. package/src/Utilities/Services/Interface/IAlertService.d.ts +2 -2
  94. package/src/Utilities/Services/Interface/IDataService.d.ts +6 -6
  95. package/src/Utilities/Services/Interface/IQueryLanguageService.d.ts +3 -3
  96. package/src/Utilities/Services/Interface/IValidationService.d.ts +4 -4
  97. package/src/Utilities/Services/LicenseService.js +1 -1
  98. package/src/Utilities/Services/ModuleService.js +1 -1
  99. package/src/Utilities/Services/QueryLanguageService.d.ts +3 -3
  100. package/src/Utilities/Services/ValidationService.d.ts +4 -4
  101. package/src/Utilities/Services/ValidationService.js +18 -17
  102. package/src/View/AdaptableView.js +2 -0
  103. package/src/View/Alert/Wizard/AlertBehaviourWizardSection.js +16 -9
  104. package/src/View/Alert/Wizard/AlertButtonsEditor.js +13 -3
  105. package/src/View/Alert/Wizard/AlertDisplayWizardSection.js +2 -0
  106. package/src/View/Alert/Wizard/AlertWizard.js +83 -1
  107. package/src/View/CellSummary/CellSummaryViewPanel.js +1 -2
  108. package/src/View/Components/FilterForm/FilterForm.js +2 -2
  109. package/src/View/Components/Panels/PanelFooter.d.ts +10 -0
  110. package/src/View/Components/Panels/PanelFooter.js +14 -0
  111. package/src/View/Components/Popups/AdaptablePopup/AdaptablePopup.js +12 -7
  112. package/src/View/Components/Popups/AdaptablePopup/AdaptablePopupDialog.js +1 -1
  113. package/src/View/Components/Popups/AdaptablePopup/useMenuItems.js +3 -1
  114. package/src/View/Components/Popups/{AdaptablePopup/Utilities.d.ts → Utilities.d.ts} +4 -0
  115. package/src/View/Components/Popups/{AdaptablePopup/Utilities.js → Utilities.js} +5 -2
  116. package/src/View/Components/Popups/WindowPopups/WindowPopups.d.ts +6 -0
  117. package/src/View/Components/Popups/WindowPopups/WindowPopups.js +32 -0
  118. package/src/View/Components/Popups/WindowPopups/windowFactory.d.ts +4 -0
  119. package/src/View/Components/Popups/WindowPopups/windowFactory.js +8 -0
  120. package/src/View/DataChangeHistory/DataChangeHistoryGrid.d.ts +2 -2
  121. package/src/View/DataChangeHistory/DataChangeHistoryPopup.d.ts +2 -2
  122. package/src/View/Layout/LayoutEditorStandalonePopup.d.ts +3 -0
  123. package/src/View/Layout/LayoutEditorStandalonePopup.js +76 -0
  124. package/src/View/Layout/LayoutPopup.js +3 -24
  125. package/src/View/Layout/LayoutViewPanel.d.ts +1 -4
  126. package/src/View/Layout/LayoutViewPanel.js +5 -18
  127. package/src/View/Layout/Wizard/LayoutEditor/ColumnLabels.d.ts +9 -0
  128. package/src/View/Layout/Wizard/LayoutEditor/ColumnLabels.js +55 -0
  129. package/src/View/Layout/Wizard/LayoutEditor/index.js +3 -68
  130. package/src/View/Layout/Wizard/LayoutEditorWizard.d.ts +1 -0
  131. package/src/View/Layout/Wizard/LayoutEditorWizard.js +35 -7
  132. package/src/View/SystemStatus/SystemStatusEntityRow.js +1 -2
  133. package/src/agGrid/Adaptable.d.ts +6 -4
  134. package/src/agGrid/Adaptable.js +115 -117
  135. package/src/agGrid/agGridHelper.d.ts +1 -1
  136. package/src/agGrid/agGridHelper.js +23 -8
  137. package/src/agGrid/editors/AdaptableDateEditor/index.js +1 -1
  138. package/src/agGrid/editors/AdaptableNumberEditor/index.js +1 -1
  139. package/src/components/Dialog/index.js +1 -1
  140. package/src/components/Modal/index.js +1 -1
  141. package/src/components/WindowModal/WindowModal.d.ts +10 -8
  142. package/src/components/WindowModal/WindowModal.js +4 -2
  143. package/src/components/WindowModal/useStacking.d.ts +9 -0
  144. package/src/components/WindowModal/useStacking.js +45 -0
  145. package/src/env.js +3 -3
  146. package/src/metamodel/adaptable.metamodel.d.ts +85 -45
  147. package/src/metamodel/adaptable.metamodel.js +185 -84
  148. package/src/types.d.ts +5 -3
  149. package/version.d.ts +1 -1
  150. package/version.js +1 -1
@@ -9,6 +9,7 @@ const ApiBase_1 = require("./ApiBase");
9
9
  const LoggingHelper_1 = require("../../Utilities/Helpers/LoggingHelper");
10
10
  const ModuleConstants = tslib_1.__importStar(require("../../Utilities/Constants/ModuleConstants"));
11
11
  const ObjectFactory_1 = tslib_1.__importDefault(require("../../Utilities/ObjectFactory"));
12
+ const AdaptableAlert_1 = require("../../PredefinedConfig/Common/AdaptableAlert");
12
13
  const AdaptableQuery_1 = require("../../PredefinedConfig/Common/AdaptableQuery");
13
14
  class AlertApiImpl extends ApiBase_1.ApiBase {
14
15
  getAlertState() {
@@ -61,22 +62,24 @@ class AlertApiImpl extends ApiBase_1.ApiBase {
61
62
  buttonOnClick === null || buttonOnClick === void 0 ? void 0 : buttonOnClick.handler(button, context);
62
63
  this.adaptable.api.alertApi.executeAlertAction(action, {
63
64
  alertDefinition: context.alert.alertDefinition,
64
- dataChangedInfo: context.alert.dataChangedInfo,
65
+ cellDataChangedInfo: AdaptableAlert_1.isAdaptableCellChangedAlert(context.alert)
66
+ ? context.alert.cellDataChangedInfo
67
+ : null,
68
+ gridDataChangedInfo: AdaptableAlert_1.isAdaptableRowChangedAlert(context.alert)
69
+ ? context.alert.gridDataChangedInfo
70
+ : null,
65
71
  formData: context.formData,
66
72
  });
67
73
  });
68
74
  }
69
75
  }
70
76
  executeAlertAction(actionName, details) {
71
- var _a;
72
- const { alertDefinition, dataChangedInfo } = details;
73
- if (!dataChangedInfo) {
74
- return;
75
- }
76
- if (actionName === 'highlight-cell') {
77
- const highhlightType = (_a = alertDefinition.MessageType) !== null && _a !== void 0 ? _a : 'Info';
77
+ const { alertDefinition, cellDataChangedInfo: cellDataChangedInfo, gridDataChangedInfo, } = details;
78
+ const getBackgroundColor = (alertDefinition) => {
79
+ var _a;
80
+ const highlightType = (_a = alertDefinition.MessageType) !== null && _a !== void 0 ? _a : 'Info';
78
81
  let backgroundColor = '';
79
- switch (highhlightType) {
82
+ switch (highlightType) {
80
83
  case 'Error':
81
84
  backgroundColor = 'var(--ab-color-error)';
82
85
  break;
@@ -89,48 +92,59 @@ class AlertApiImpl extends ApiBase_1.ApiBase {
89
92
  case 'Warning':
90
93
  backgroundColor = 'var(--ab-color-warn)';
91
94
  }
95
+ return backgroundColor;
96
+ };
97
+ if (actionName === 'highlight-cell' && cellDataChangedInfo) {
98
+ const backgroundColor = getBackgroundColor(alertDefinition);
92
99
  this.adaptable.api.gridApi.highlightCell({
93
- columnId: dataChangedInfo.column.columnId,
94
- primaryKeyValue: dataChangedInfo.primaryKeyValue,
100
+ columnId: cellDataChangedInfo.column.columnId,
101
+ primaryKeyValue: cellDataChangedInfo.primaryKeyValue,
95
102
  highlightStyle: {
96
103
  BackColor: backgroundColor,
97
104
  },
98
105
  timeout: this.getAlertOptions().cellHighlightDuration,
99
106
  });
100
- return;
101
107
  }
102
- if (actionName === 'jump-to-cell') {
103
- this.adaptable.api.gridApi.jumpToCell(dataChangedInfo.primaryKeyValue, dataChangedInfo.column.columnId);
104
- return;
108
+ if (actionName === 'highlight-row' &&
109
+ gridDataChangedInfo &&
110
+ // no sense to highlight a deleted(non-existing) row
111
+ (gridDataChangedInfo === null || gridDataChangedInfo === void 0 ? void 0 : gridDataChangedInfo.rowTrigger) !== 'Delete') {
112
+ const backgroundColor = getBackgroundColor(alertDefinition);
113
+ const primaryKeyValues = this.adaptable.api.gridApi.getPrimaryKeyValuesForRowNodes(gridDataChangedInfo.rowNodes);
114
+ const rowsHighlightInfo = {
115
+ primaryKeyValues,
116
+ highlightStyle: {
117
+ BackColor: backgroundColor,
118
+ },
119
+ timeout: this.getAlertOptions().cellHighlightDuration,
120
+ };
121
+ this.adaptable.api.gridApi.highlightRows(rowsHighlightInfo);
122
+ }
123
+ if (actionName === 'jump-to-cell' && cellDataChangedInfo) {
124
+ this.adaptable.api.gridApi.jumpToCell(cellDataChangedInfo.primaryKeyValue, cellDataChangedInfo.column.columnId);
125
+ }
126
+ if (actionName === 'jump-to-row' &&
127
+ gridDataChangedInfo &&
128
+ // no sense to jump to a deleted(non-existing) row
129
+ (gridDataChangedInfo === null || gridDataChangedInfo === void 0 ? void 0 : gridDataChangedInfo.rowTrigger) !== 'Delete') {
130
+ const [firstRowNode] = gridDataChangedInfo.rowNodes;
131
+ const targetRowNodePrimaryKeyValue = this.adaptable.api.gridApi.getPrimaryKeyValueForRowNode(firstRowNode);
132
+ if (targetRowNodePrimaryKeyValue) {
133
+ this.adaptable.api.gridApi.jumpToRow(targetRowNodePrimaryKeyValue);
134
+ }
105
135
  }
106
- if (actionName === 'jump-to-column') {
107
- this.adaptable.api.gridApi.jumpToColumn(dataChangedInfo.column.columnId);
108
- return;
136
+ if (actionName === 'jump-to-column' && cellDataChangedInfo) {
137
+ this.adaptable.api.gridApi.jumpToColumn(cellDataChangedInfo.column.columnId);
109
138
  }
110
139
  if (actionName === 'suspend') {
111
140
  this.adaptable.api.alertApi.suspendAlertDefinition(alertDefinition);
112
- return;
113
- }
114
- if (actionName === 'jump-to-row') {
115
- this.adaptable.api.gridApi.jumpToRow(dataChangedInfo.primaryKeyValue);
116
- return;
117
- }
118
- if (actionName === 'undo') {
119
- this.adaptable.api.gridApi.undoCellEdit(dataChangedInfo);
120
141
  }
121
- // we no longer overwrite through an Alert Action
122
- /*
123
- if (actionName === 'overwrite' && formData && Object.keys(formData).length === 1) {
124
- const value = formData[Object.keys(formData)[0]];
125
- this.adaptable.api.gridApi.setCellValue(
126
- dataChangedInfo.columnId,
127
- value,
128
- dataChangedInfo.primaryKeyValue
129
- );
142
+ if (actionName === 'undo' && cellDataChangedInfo) {
143
+ this.adaptable.api.gridApi.undoCellEdit(cellDataChangedInfo);
130
144
  }
131
- */
132
145
  }
133
146
  async displayAlert(alertToShow) {
147
+ var _a, _b;
134
148
  // 3 things we always do with an alert are:
135
149
  // 1. Dispatch the Alert (so it appears in the toolbar)
136
150
  this.addUidToAdaptableObject(alertToShow);
@@ -147,12 +161,16 @@ class AlertApiImpl extends ApiBase_1.ApiBase {
147
161
  if (alertToShow.alertDefinition && alertToShow.alertDefinition.AlertProperties != undefined) {
148
162
  const alertDefinition = alertToShow.alertDefinition;
149
163
  const alertProperties = alertDefinition.AlertProperties;
150
- const dataChangedInfo = alertToShow.dataChangedInfo;
151
164
  // There are 4 possible other actions that could happen
165
+ // alertProperties.PreventEdit is handled separately, in the Adaptable.setupColumnValueSetter() function
152
166
  // 1. Show a Popup
153
167
  if (alertProperties.DisplayNotification && showPopup) {
154
168
  this.dispatchAction(PopupRedux.PopupShowAlert(alertToShow));
155
169
  }
170
+ // 2. Log to console
171
+ if (alertProperties.LogToConsole) {
172
+ LoggingHelper_1.ConsoleLogByMessageType(alertToShow.header + ': ' + alertToShow.message, alertDefinition.MessageType);
173
+ }
156
174
  // 3. Show it in a Div (if one has been set)
157
175
  if (alertProperties.ShowInDiv) {
158
176
  let alertDiv;
@@ -166,37 +184,46 @@ class AlertApiImpl extends ApiBase_1.ApiBase {
166
184
  alertDiv.innerHTML = alertString;
167
185
  }
168
186
  }
187
+ // 4.JumpToCell and 5.JumpToRow are exclusive, based on alertType!
169
188
  // 4: Jump to the Cell
170
- if (alertProperties.JumpToCell && dataChangedInfo) {
171
- this.adaptable.jumpToCell(dataChangedInfo.column.columnId, dataChangedInfo.rowNode);
189
+ if (alertProperties.JumpToCell &&
190
+ AdaptableAlert_1.isAdaptableCellChangedAlert(alertToShow) &&
191
+ alertToShow.cellDataChangedInfo) {
192
+ this.adaptable.jumpToCell(alertToShow.cellDataChangedInfo.column.columnId, alertToShow.cellDataChangedInfo.rowNode);
172
193
  }
173
- // 5: Hight the cell - though that is taken care of in the Style Service
174
- if (alertProperties.HighlightCell && dataChangedInfo) {
175
- let alertNode = dataChangedInfo.rowNode;
176
- if (!alertNode) {
177
- alertNode = this.adaptable.getRowNodeForPrimaryKey(dataChangedInfo.primaryKeyValue);
178
- }
179
- if (alertNode) {
180
- this.adaptable.api.gridApi.refreshCells([alertNode], [dataChangedInfo.column.columnId]);
181
- setTimeout(() => {
182
- this.dispatchAction(SystemRedux.SystemAlertRemoveHighlight(alertToShow));
183
- }, this.adaptable.adaptableOptions.alertOptions.cellHighlightDuration);
194
+ // 5: Jump to the Row
195
+ else if (alertProperties.JumpToRow &&
196
+ AdaptableAlert_1.isAdaptableRowChangedAlert(alertToShow) &&
197
+ ((_a = alertToShow.gridDataChangedInfo) === null || _a === void 0 ? void 0 : _a.rowTrigger) === 'Add') {
198
+ const [firstRowNode] = alertToShow.gridDataChangedInfo.rowNodes;
199
+ if (firstRowNode) {
200
+ this.adaptable.jumpToRow(firstRowNode);
184
201
  }
185
202
  }
186
- if (alertProperties.HighlightRow && dataChangedInfo) {
187
- let alertNode = dataChangedInfo.rowNode;
203
+ // 6.HighlightCell and 7.HighlightRow are exclusive, based on alertType!
204
+ // 6: Highlight the cell - we just refresh the cells to trigger a re-evaluation of the Adaptable.setupColumn[Style/Class]
205
+ if (alertProperties.HighlightCell &&
206
+ AdaptableAlert_1.isAdaptableCellChangedAlert(alertToShow) &&
207
+ alertToShow.cellDataChangedInfo) {
208
+ let alertNode = alertToShow.cellDataChangedInfo.rowNode;
188
209
  if (!alertNode) {
189
- alertNode = this.adaptable.getRowNodeForPrimaryKey(dataChangedInfo.primaryKeyValue);
210
+ alertNode = this.adaptable.getRowNodeForPrimaryKey(alertToShow.cellDataChangedInfo.primaryKeyValue);
190
211
  }
191
212
  if (alertNode) {
192
- this.adaptable.api.gridApi.refreshRowNode(alertNode);
213
+ this.adaptable.api.gridApi.refreshCells([alertNode], [alertToShow.cellDataChangedInfo.column.columnId]);
193
214
  setTimeout(() => {
194
215
  this.dispatchAction(SystemRedux.SystemAlertRemoveHighlight(alertToShow));
195
216
  }, this.adaptable.adaptableOptions.alertOptions.cellHighlightDuration);
196
217
  }
197
218
  }
198
- if (alertProperties.LogToConsole) {
199
- LoggingHelper_1.ConsoleLogByMessageType(alertToShow.header + ': ' + alertToShow.message, alertDefinition.MessageType);
219
+ // 7. Highlight the row - we just refresh the rows to trigger a re-evaluation of the Adaptable.setupColumn[Style/Class]
220
+ else if (alertProperties.HighlightRow &&
221
+ AdaptableAlert_1.isAdaptableRowChangedAlert(alertToShow) &&
222
+ ((_b = alertToShow.gridDataChangedInfo) === null || _b === void 0 ? void 0 : _b.rowTrigger) === 'Add') {
223
+ this.adaptable.api.gridApi.refreshRowNodes(alertToShow.gridDataChangedInfo.rowNodes);
224
+ setTimeout(() => {
225
+ this.dispatchAction(SystemRedux.SystemAlertRemoveHighlight(alertToShow));
226
+ }, this.adaptable.adaptableOptions.alertOptions.cellHighlightDuration);
200
227
  }
201
228
  }
202
229
  }
@@ -212,7 +239,7 @@ class AlertApiImpl extends ApiBase_1.ApiBase {
212
239
  }
213
240
  showAlert(alertHeader, alertMessage, messageType, alertProperties) {
214
241
  const alertDefinition = ObjectFactory_1.default.CreateInternalAlertDefinitionForMessages(messageType, alertProperties);
215
- let alertToShow = ObjectFactory_1.default.CreateAlert(alertHeader, alertMessage, alertDefinition);
242
+ let alertToShow = ObjectFactory_1.default.CreateGenericAlert(alertHeader, alertMessage, alertDefinition);
216
243
  this.displayAlert(alertToShow);
217
244
  }
218
245
  showAlertInfo(alertHeader, alertMessage, alertProperties) {
@@ -248,11 +275,11 @@ class AlertApiImpl extends ApiBase_1.ApiBase {
248
275
  this.dispatchAction(AlertRedux.AlertDefinitionUnSuspend(alertDefinition));
249
276
  return this.getAlertDefinitionById(alertDefinition.Uuid);
250
277
  }
251
- getAlertDescription(alertDefinition, dataChangedInfo) {
278
+ getAlertDescription(alertDefinition, cellDataChangedInfo) {
252
279
  var _a;
253
280
  const alertMessageFunction = (_a = this.adaptable.adaptableOptions.alertOptions) === null || _a === void 0 ? void 0 : _a.alertMessageText;
254
281
  if (alertMessageFunction) {
255
- const returnText = alertMessageFunction(alertDefinition, dataChangedInfo);
282
+ const returnText = alertMessageFunction(alertDefinition, cellDataChangedInfo);
256
283
  if (returnText) {
257
284
  return returnText;
258
285
  }
@@ -5,4 +5,5 @@ export declare class BulkUpdateApiImpl extends ApiBase implements BulkUpdateApi
5
5
  getBulkUpdateValue(): string;
6
6
  showBulkUpdatePopup(): void;
7
7
  applyBulkUpdate(gridCells: GridCell[]): void;
8
+ setBulkUpdateValue(bulkUpdateValue: string): void;
8
9
  }
@@ -5,6 +5,7 @@ const tslib_1 = require("tslib");
5
5
  const ApiBase_1 = require("./ApiBase");
6
6
  const ModuleConstants = tslib_1.__importStar(require("../../Utilities/Constants/ModuleConstants"));
7
7
  const BulkUpdateRedux = tslib_1.__importStar(require("../../Redux/ActionsReducers/BulkUpdateRedux"));
8
+ const SystemRedux = tslib_1.__importStar(require("../../Redux/ActionsReducers/SystemRedux"));
8
9
  class BulkUpdateApiImpl extends ApiBase_1.ApiBase {
9
10
  getBulkUpdateValue() {
10
11
  return this.getAdaptableState().System.BulkUpdateValue;
@@ -15,5 +16,8 @@ class BulkUpdateApiImpl extends ApiBase_1.ApiBase {
15
16
  applyBulkUpdate(gridCells) {
16
17
  this.dispatchAction(BulkUpdateRedux.BulkUpdateApply(gridCells));
17
18
  }
19
+ setBulkUpdateValue(bulkUpdateValue) {
20
+ this.dispatchAction(SystemRedux.BulkUpdateChangeValue(bulkUpdateValue));
21
+ }
18
22
  }
19
23
  exports.BulkUpdateApiImpl = BulkUpdateApiImpl;
@@ -45,7 +45,7 @@ export declare class ConfigApiImpl extends ApiBase implements ConfigApi {
45
45
  getDescriptionForModule(module: AdaptableModule): string;
46
46
  getHelpPageForModule(module: AdaptableModule): string;
47
47
  getUserStateByStateKey(stateKey: AdaptableStateKey, returnJson?: boolean): ConfigState | string;
48
- incrementUerStateRevision(stateKey: AdaptableStateKey): void;
48
+ incrementUserStateRevision(stateKey: AdaptableStateKey): void;
49
49
  getAlertState(returnJson?: boolean): AlertState;
50
50
  getApplicationState(returnJson?: boolean): ApplicationState;
51
51
  getCalculatedColumnState(returnJson?: boolean): CalculatedColumnState;
@@ -242,9 +242,14 @@ class ConfigApiImpl extends ApiBase_1.ApiBase {
242
242
  : this.getAdaptableState().ToolPanel;
243
243
  }
244
244
  }
245
- incrementUerStateRevision(stateKey) {
245
+ incrementUserStateRevision(stateKey) {
246
246
  let state = this.getUserStateByStateKey(stateKey);
247
- state.Revision += 1;
247
+ if (typeof state.Revision === 'number') {
248
+ state.Revision += 1;
249
+ }
250
+ else {
251
+ state.Revision.Key += 1;
252
+ }
248
253
  // need to save it...
249
254
  }
250
255
  getAlertState(returnJson = false) {
@@ -1,12 +1,12 @@
1
1
  import { DataChangeHistoryApi } from '../DataChangeHistoryApi';
2
2
  import { ApiBase } from './ApiBase';
3
- import { DataChangedInfo } from '../../PredefinedConfig/Common/DataChangedInfo';
3
+ import { CellDataChangedInfo } from '../../PredefinedConfig/Common/CellDataChangedInfo';
4
4
  export declare class DataChangeHistoryApiImpl extends ApiBase implements DataChangeHistoryApi {
5
5
  getDataChangeHistoryMode(): 'ACTIVE' | 'INACTIVE' | 'SUSPENDED';
6
6
  activateDataChangeHistory(forceReset?: boolean): void;
7
7
  deactivateDataChangeHistory(): void;
8
8
  suspendDataChangeHistory(): void;
9
- getDataChangeHistoryLog(): DataChangedInfo[];
10
- undoDataChangeHistoryEntry(dataChangeInfo: DataChangedInfo): void;
9
+ getDataChangeHistoryLog(): CellDataChangedInfo[];
10
+ undoDataChangeHistoryEntry(dataChangeInfo: CellDataChangedInfo): void;
11
11
  showDataChangeHistoryPopup(): void;
12
12
  }
@@ -10,7 +10,7 @@ class EventApiImpl extends ApiBase_1.ApiBase {
10
10
  this.on = (eventName, callback) => {
11
11
  let result;
12
12
  if (eventName === 'AdaptableReady') {
13
- result = this.emitter.onIncludeFired(eventName, callback);
13
+ result = this.emitter.onIncludeFiredOnce(eventName, callback);
14
14
  }
15
15
  else {
16
16
  result = this.emitter.on(eventName, callback);
@@ -2,7 +2,7 @@ import { ExportApi } from '../ExportApi';
2
2
  import { ExportState, Report, ReportData, ReportSchedule, SystemReportNames } from '../../PredefinedConfig/ExportState';
3
3
  import { ApiBase } from './ApiBase';
4
4
  import { AdaptableForm } from '../../PredefinedConfig/Common/AdaptableForm';
5
- import { DataChangedInfo } from '../../PredefinedConfig/Common/DataChangedInfo';
5
+ import { CellDataChangedInfo } from '../../PredefinedConfig/Common/CellDataChangedInfo';
6
6
  import { CustomDestination, ExportButtonContext } from '../../AdaptableOptions/ExportOptions';
7
7
  import { ExportDestination } from '../../PredefinedConfig/Common/Enums';
8
8
  export declare class ExportApiImpl extends ApiBase implements ExportApi {
@@ -25,7 +25,7 @@ export declare class ExportApiImpl extends ApiBase implements ExportApi {
25
25
  showExportPopup(): void;
26
26
  editReport(report: Report): Report;
27
27
  editReports(reports: Report[]): Report[];
28
- isDataChangeInReport(dataChangedInfo: DataChangedInfo, report: Report): boolean;
28
+ isDataChangeInReport(cellDataChangedInfo: CellDataChangedInfo, report: Report): boolean;
29
29
  exportVisualDataToExcel(): void;
30
30
  runCustomReport(customReportName: string): ReportData | undefined;
31
31
  getReportDataForReport(reportName: string): ReportData | undefined;
@@ -95,7 +95,7 @@ class ExportApiImpl extends ApiBase_1.ApiBase {
95
95
  });
96
96
  return reports === null || reports === void 0 ? void 0 : reports.map((report) => this.getReportById(report.Uuid));
97
97
  }
98
- isDataChangeInReport(dataChangedInfo, report) {
98
+ isDataChangeInReport(cellDataChangedInfo, report) {
99
99
  // for All Data Report any data change is true so get out asap
100
100
  if (report.Name == 'All Data') {
101
101
  return true;
@@ -111,22 +111,21 @@ class ExportApiImpl extends ApiBase_1.ApiBase {
111
111
  break;
112
112
  case 'ScopeColumns':
113
113
  // use the Scope object which will tell us if the Column is relevant
114
- if (!this.adaptable.api.scopeApi.isColumnInScopeColumns(dataChangedInfo.column, report.Scope)) {
114
+ if (!this.adaptable.api.scopeApi.isColumnInScopeColumns(cellDataChangedInfo.column, report.Scope)) {
115
115
  return false;
116
116
  }
117
117
  break;
118
118
  case 'SelectedColumns':
119
119
  let selectedCellInfo = this.adaptable.api.gridApi.getSelectedCellInfo();
120
120
  if (selectedCellInfo) {
121
- if (selectedCellInfo.columns.find((c) => c.columnId == dataChangedInfo.column.columnId) ==
122
- null) {
121
+ if (selectedCellInfo.columns.find((c) => c.columnId == cellDataChangedInfo.column.columnId) == null) {
123
122
  return false;
124
123
  }
125
124
  }
126
125
  break;
127
126
  case 'VisibleColumns':
128
127
  // hope that visibile column property is updated whenever the layout changes... (need to check!)
129
- if (!dataChangedInfo.column.visible) {
128
+ if (!cellDataChangedInfo.column.visible) {
130
129
  return false;
131
130
  }
132
131
  break;
@@ -140,7 +139,7 @@ class ExportApiImpl extends ApiBase_1.ApiBase {
140
139
  case 'SelectedCellRows':
141
140
  let selectedCellInfo = this.adaptable.api.gridApi.getSelectedCellInfo();
142
141
  if (selectedCellInfo && selectedCellInfo.gridCells) {
143
- if (selectedCellInfo.gridCells.find((gc) => gc.primaryKeyValue == dataChangedInfo.primaryKeyValue)) {
142
+ if (selectedCellInfo.gridCells.find((gc) => gc.primaryKeyValue == cellDataChangedInfo.primaryKeyValue)) {
144
143
  return true;
145
144
  }
146
145
  }
@@ -148,13 +147,13 @@ class ExportApiImpl extends ApiBase_1.ApiBase {
148
147
  case 'SelectedRows':
149
148
  let selectedRowInfo = this.adaptable.api.gridApi.getSelectedRowInfo();
150
149
  if (selectedRowInfo && selectedRowInfo.gridRows) {
151
- if (selectedRowInfo.gridRows.find((gr) => gr.primaryKeyValue == dataChangedInfo.primaryKeyValue)) {
150
+ if (selectedRowInfo.gridRows.find((gr) => gr.primaryKeyValue == cellDataChangedInfo.primaryKeyValue)) {
152
151
  return true;
153
152
  }
154
153
  }
155
154
  return false;
156
155
  case 'VisibleRows':
157
- return this.adaptable.isRowNodeVisible(dataChangedInfo.rowNode);
156
+ return this.adaptable.isRowNodeVisible(cellDataChangedInfo.rowNode);
158
157
  }
159
158
  }
160
159
  exportVisualDataToExcel() {
@@ -1,7 +1,7 @@
1
1
  import { ApiBase } from './ApiBase';
2
2
  import { FreeTextColumnApi } from '../FreeTextColumnApi';
3
3
  import { FreeTextColumnState, FreeTextColumn, FreeTextStoredValue } from '../../PredefinedConfig/FreeTextColumnState';
4
- import { DataChangedInfo } from '../../PredefinedConfig/Common/DataChangedInfo';
4
+ import { CellDataChangedInfo } from '../../PredefinedConfig/Common/CellDataChangedInfo';
5
5
  import { RowNode } from '@ag-grid-community/all-modules';
6
6
  export declare class FreeTextColumnApiImpl extends ApiBase implements FreeTextColumnApi {
7
7
  getFreeTextColumnState(): FreeTextColumnState;
@@ -16,6 +16,6 @@ export declare class FreeTextColumnApiImpl extends ApiBase implements FreeTextCo
16
16
  deleteFreeTextColumn(columnId: string): void;
17
17
  showFreeTextColumnPopup(): void;
18
18
  getFreeTextColumnValueFromRowNode(freeTextColumn: FreeTextColumn, rowNode: RowNode): any;
19
- checkFreeTextColumnForDataChange(dataChangedInfo: DataChangedInfo): void;
19
+ checkFreeTextColumnForDataChange(cellDataChangedInfo: CellDataChangedInfo): void;
20
20
  getFreeTextColumnModuleReferences(freeTextColumn: FreeTextColumn): string[];
21
21
  }
@@ -94,20 +94,20 @@ class FreeTextColumnApiImpl extends ApiBase_1.ApiBase {
94
94
  return null;
95
95
  }
96
96
  }
97
- checkFreeTextColumnForDataChange(dataChangedInfo) {
98
- let freeTextColumn = this.getAllFreeTextColumn().find((fc) => fc.ColumnId == dataChangedInfo.column.columnId);
97
+ checkFreeTextColumnForDataChange(cellDataChangedInfo) {
98
+ let freeTextColumn = this.getAllFreeTextColumn().find((fc) => fc.ColumnId == cellDataChangedInfo.column.columnId);
99
99
  if (freeTextColumn) {
100
100
  let freeTextStoredValue = {
101
- PrimaryKey: dataChangedInfo.primaryKeyValue,
102
- FreeText: dataChangedInfo.newValue,
101
+ PrimaryKey: cellDataChangedInfo.primaryKeyValue,
102
+ FreeText: cellDataChangedInfo.newValue,
103
103
  };
104
104
  this.addEditFreeTextColumnStoredValue(freeTextColumn, freeTextStoredValue);
105
- var colsToRefresh = [dataChangedInfo.column.columnId];
106
- const refencedCalcColumns = this.adaptable.api.calculatedColumnApi.getCalculatedColumnsReferencingColumnId(dataChangedInfo.column.columnId);
105
+ var colsToRefresh = [cellDataChangedInfo.column.columnId];
106
+ const refencedCalcColumns = this.adaptable.api.calculatedColumnApi.getCalculatedColumnsReferencingColumnId(cellDataChangedInfo.column.columnId);
107
107
  refencedCalcColumns.forEach((calculatedColumn) => {
108
108
  colsToRefresh.push(calculatedColumn.ColumnId);
109
109
  });
110
- this.adaptable.refreshCells([dataChangedInfo.rowNode], colsToRefresh, false);
110
+ this.adaptable.refreshCells([cellDataChangedInfo.rowNode], colsToRefresh, false);
111
111
  }
112
112
  }
113
113
  getFreeTextColumnModuleReferences(freeTextColumn) {
@@ -6,11 +6,14 @@ import { SelectedRowInfo } from '../../PredefinedConfig/Selection/SelectedRowInf
6
6
  import { GridCell } from '../../PredefinedConfig/Selection/GridCell';
7
7
  import { ColumnSort } from '../../PredefinedConfig/Common/ColumnSort';
8
8
  import { DataUpdateConfig } from '../../PredefinedConfig/Common/DataUpdateConfig';
9
- import { DataChangedInfo, AccessLevel, AdaptableModule } from '../../types';
10
9
  import { CellHighlightInfo } from '../../PredefinedConfig/Common/CellHighlightInfo';
11
10
  import { RowHighlightInfo } from '../../PredefinedConfig/Common/RowHighlightInfo';
12
11
  import { GridOptions, RowNode } from '@ag-grid-community/all-modules';
13
12
  import { GridCellRange } from '../../PredefinedConfig/Selection/GridCellRange';
13
+ import { CellDataChangedInfo } from '../../PredefinedConfig/Common/CellDataChangedInfo';
14
+ import { AdaptableModule } from '../../PredefinedConfig/Common/Types';
15
+ import { RowsHighlightInfo } from '../../PredefinedConfig/Common/RowsHighlightInfo';
16
+ import { AccessLevel } from '../../PredefinedConfig/Common/Entitlement';
14
17
  export declare class GridApiImpl extends ApiBase implements GridApi {
15
18
  getGridState(): GridState;
16
19
  setGridData(dataSource: any): void;
@@ -19,7 +22,7 @@ export declare class GridApiImpl extends ApiBase implements GridApi {
19
22
  loadGridData(dataSource: any): void;
20
23
  updateGridData(dataRows: any[], dataUpdateConfig?: DataUpdateConfig): Promise<RowNode[]>;
21
24
  addGridData(dataRows: any[], dataUpdateConfig?: DataUpdateConfig): Promise<RowNode[]>;
22
- undoCellEdit(dataChangedInfo: DataChangedInfo): boolean;
25
+ undoCellEdit(cellDataChangedInfo: CellDataChangedInfo): boolean;
23
26
  deleteGridData(dataRows: any[], dataUpdateConfig?: DataUpdateConfig): Promise<RowNode[]>;
24
27
  setCellValue(columnId: string, newValue: any, primaryKeyValue: any): void;
25
28
  setCellsValue(gridCells: {
@@ -64,6 +67,7 @@ export declare class GridApiImpl extends ApiBase implements GridApi {
64
67
  getRowNodesForPrimaryKeys(primaryKeyValues: any[]): RowNode[];
65
68
  getRowNodeForPrimaryKey(primaryKeyValue: any): RowNode;
66
69
  getPrimaryKeyValueForRowNode(rowNode: RowNode): any;
70
+ getPrimaryKeyValuesForRowNodes(rowNodes: RowNode[]): any[];
67
71
  setRowGroupColumns(columnIds: string[]): void;
68
72
  clearRowGroupColumns(): void;
69
73
  expandAllRowGroups(): void;
@@ -78,7 +82,7 @@ export declare class GridApiImpl extends ApiBase implements GridApi {
78
82
  isQuickFilterAvailable(): boolean;
79
83
  redrawGrid(): void;
80
84
  fireSearchChangedEvent(searchChangedTrigger: 'DataSource' | 'CurrentQuery' | 'Filter' | 'DataChange' | 'Sort'): void;
81
- fireCellChangedEvent(dataChangedInfo: DataChangedInfo): void;
85
+ fireCellChangedEvent(cellDataChangedInfo: CellDataChangedInfo): void;
82
86
  fireGridDataChangedEvent(dataRows: any[], rowNodes: RowNode[], rowTrigger: 'Add' | 'Edit' | 'Delete'): void;
83
87
  jumpToRow(primaryKeyValue: any): void;
84
88
  jumpToColumn(columnId: string): void;
@@ -87,14 +91,18 @@ export declare class GridApiImpl extends ApiBase implements GridApi {
87
91
  unHighlightCell(primaryKeyValue: CellHighlightInfo['primaryKeyValue'], columnId: CellHighlightInfo['columnId']): void;
88
92
  unHighlightAllCells(): void;
89
93
  highlightRow(rowHighlightInfo: RowHighlightInfo): void;
94
+ highlightRows(rowHighlightInfos: RowsHighlightInfo): void;
90
95
  unHighlightRow(primaryKeyValue: RowHighlightInfo['primaryKeyValue']): void;
96
+ unHighlightRows(primaryKeyValues: RowsHighlightInfo['primaryKeyValues']): void;
91
97
  unHighlightAllRows(): void;
92
98
  refreshCells(rowNodes: RowNode[], columnIds: string[]): void;
93
99
  refreshRowByPrimaryKey(primaryKey: any): void;
94
100
  refreshRowNode(rowNode: RowNode): void;
101
+ refreshRowNodes(rowNodes: RowNode[]): void;
95
102
  areCellsEditable(gridCells: GridCell[]): boolean;
96
103
  getRowCount(): number;
97
104
  getVisibleRowCount(): number;
105
+ getRowsInViewport(): RowNode[];
98
106
  getColumnCount(): number;
99
107
  getVisibleColumnCount(): number;
100
108
  getEntitlementAccessLevelForModule(adaptableModule: AdaptableModule): AccessLevel;
@@ -32,10 +32,10 @@ class GridApiImpl extends ApiBase_1.ApiBase {
32
32
  this.fireGridDataChangedEvent(dataRows, rowNodes, 'Add');
33
33
  return rowNodes;
34
34
  }
35
- undoCellEdit(dataChangedInfo) {
35
+ undoCellEdit(cellDataChangedInfo) {
36
36
  // for the reason of this hacky solution see the comments in DataService
37
- this.adaptable.api.internalApi.getDataService().logUndoChange(dataChangedInfo);
38
- this.setCellValue(dataChangedInfo.column.columnId, dataChangedInfo.oldValue, dataChangedInfo.primaryKeyValue);
37
+ this.adaptable.api.internalApi.getDataService().logUndoChange(cellDataChangedInfo);
38
+ this.setCellValue(cellDataChangedInfo.column.columnId, cellDataChangedInfo.oldValue, cellDataChangedInfo.primaryKeyValue);
39
39
  return true;
40
40
  }
41
41
  async deleteGridData(dataRows, dataUpdateConfig) {
@@ -220,6 +220,9 @@ class GridApiImpl extends ApiBase_1.ApiBase {
220
220
  getPrimaryKeyValueForRowNode(rowNode) {
221
221
  return this.adaptable.getPrimaryKeyValueFromRowNode(rowNode);
222
222
  }
223
+ getPrimaryKeyValuesForRowNodes(rowNodes) {
224
+ return rowNodes.map((rowNode) => this.getPrimaryKeyValueForRowNode(rowNode));
225
+ }
223
226
  setRowGroupColumns(columnIds) {
224
227
  this.adaptable.setRowGroupColumns(columnIds);
225
228
  }
@@ -273,21 +276,22 @@ class GridApiImpl extends ApiBase_1.ApiBase {
273
276
  this.adaptable.api.eventApi.emit('SearchChanged', searchChangedInfo);
274
277
  }
275
278
  }
276
- fireCellChangedEvent(dataChangedInfo) {
279
+ fireCellChangedEvent(cellDataChangedInfo) {
277
280
  if (this.adaptable.isInitialised) {
278
281
  const cellChangedInfo = {
279
282
  adaptableApi: this.adaptable.api,
280
- cellChange: dataChangedInfo,
283
+ cellChange: cellDataChangedInfo,
281
284
  };
282
285
  this.adaptable.api.eventApi.emit('CellChanged', cellChangedInfo);
283
286
  }
284
287
  }
285
- fireGridDataChangedEvent(dataRows, rowNodes, rowTrigger) {
288
+ fireGridDataChangedEvent(dataRows, rowNodes = [], rowTrigger) {
286
289
  if (this.adaptable.isInitialised) {
287
290
  const gridDataChangedInfo = {
291
+ changedAt: Date.now(),
288
292
  adaptableApi: this.adaptable.api,
289
- rowTrigger: rowTrigger,
290
- dataRows: dataRows,
293
+ rowTrigger,
294
+ dataRows,
291
295
  rowNodes,
292
296
  };
293
297
  this.adaptable.api.eventApi.emit('GridDataChanged', gridDataChangedInfo);
@@ -326,9 +330,20 @@ class GridApiImpl extends ApiBase_1.ApiBase {
326
330
  }, rowHighlightInfo.timeout);
327
331
  }
328
332
  }
333
+ highlightRows(rowHighlightInfos) {
334
+ this.dispatchAction(SystemRedux_1.SystemHighlightRowsAdd(rowHighlightInfos));
335
+ if (rowHighlightInfos.timeout) {
336
+ setTimeout(() => {
337
+ this.unHighlightRows(rowHighlightInfos.primaryKeyValues);
338
+ }, rowHighlightInfos.timeout);
339
+ }
340
+ }
329
341
  unHighlightRow(primaryKeyValue) {
330
342
  this.dispatchAction(SystemRedux_1.SystemHighlightRowDelete(primaryKeyValue));
331
343
  }
344
+ unHighlightRows(primaryKeyValues) {
345
+ this.dispatchAction(SystemRedux_1.SystemHighlightRowsDelete(primaryKeyValues));
346
+ }
332
347
  unHighlightAllRows() {
333
348
  this.dispatchAction(SystemRedux_1.SystemHighlightRowDeleteAll());
334
349
  }
@@ -342,6 +357,9 @@ class GridApiImpl extends ApiBase_1.ApiBase {
342
357
  refreshRowNode(rowNode) {
343
358
  this.adaptable.redrawRow(rowNode);
344
359
  }
360
+ refreshRowNodes(rowNodes) {
361
+ this.adaptable.redrawRows(rowNodes);
362
+ }
345
363
  areCellsEditable(gridCells) {
346
364
  for (let gridCell of gridCells) {
347
365
  if (!gridCell.column) {
@@ -364,6 +382,9 @@ class GridApiImpl extends ApiBase_1.ApiBase {
364
382
  getVisibleRowCount() {
365
383
  return this.adaptable.getVisibleRowCount();
366
384
  }
385
+ getRowsInViewport() {
386
+ return this.adaptable.getRowsInViewport();
387
+ }
367
388
  getColumnCount() {
368
389
  return this.adaptable.getColumnCount();
369
390
  }