@adaptabletools/adaptable 18.1.7 → 18.1.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/package.json +1 -1
  2. package/src/AdaptableInterfaces/IAdaptable.d.ts +2 -1
  3. package/src/AdaptableOptions/DataChangeHistoryOptions.d.ts +4 -0
  4. package/src/Api/DataChangeHistoryApi.d.ts +6 -0
  5. package/src/Api/Implementation/DataChangeHistoryApiImpl.d.ts +2 -0
  6. package/src/Api/Implementation/DataChangeHistoryApiImpl.js +24 -3
  7. package/src/Api/Internal/AlertInternalApi.d.ts +0 -3
  8. package/src/Api/Internal/AlertInternalApi.js +12 -39
  9. package/src/Api/Internal/FormatColumnInternalApi.d.ts +2 -2
  10. package/src/Api/Internal/FormatColumnInternalApi.js +6 -6
  11. package/src/Api/Internal/GridInternalApi.js +13 -7
  12. package/src/PredefinedConfig/Common/AdaptableFormat.d.ts +9 -9
  13. package/src/Redux/ActionsReducers/SystemRedux.d.ts +9 -8
  14. package/src/Redux/ActionsReducers/SystemRedux.js +11 -11
  15. package/src/Strategy/DataChangeHistoryModule.js +1 -2
  16. package/src/Utilities/Constants/DocumentationLinkConstants.d.ts +1 -0
  17. package/src/Utilities/Constants/DocumentationLinkConstants.js +1 -0
  18. package/src/Utilities/Helpers/FormatContentHelper.d.ts +22 -0
  19. package/src/Utilities/Helpers/FormatContentHelper.js +34 -0
  20. package/src/Utilities/Helpers/FormatHelper.d.ts +5 -4
  21. package/src/Utilities/Helpers/FormatHelper.js +40 -13
  22. package/src/Utilities/Helpers/Helper.d.ts +6 -0
  23. package/src/Utilities/Helpers/Helper.js +31 -0
  24. package/src/View/Alert/Wizard/AlertMessageWizardSection.js +4 -3
  25. package/src/View/FormatColumn/Wizard/FormatColumnFormatWizardSection.js +33 -10
  26. package/src/agGrid/AdaptableAgGrid.d.ts +2 -1
  27. package/src/agGrid/AdaptableAgGrid.js +29 -8
  28. package/src/agGrid/AgGridMenuAdapter.js +15 -1
  29. package/src/agGrid/defaultAdaptableOptions.js +1 -0
  30. package/src/env.js +2 -2
  31. package/src/metamodel/adaptable.metamodel.d.ts +8 -0
  32. package/src/metamodel/adaptable.metamodel.js +1 -1
  33. package/tsconfig.esm.tsbuildinfo +1 -1
@@ -18,6 +18,9 @@ export declare function meanNumberArray(numericValues: number[]): number;
18
18
  export declare function medianNumberArray(numericValues: number[]): number;
19
19
  export declare function modeNumberArray(numbers: number[]): number;
20
20
  export declare function clamp(value: any, boundOne: number, boundTwo: number): number;
21
+ export declare function extractColsFromText(text: string): string[];
22
+ export declare function replaceAll(text: string, toReplace: string, replaceWith: string): string;
23
+ export declare function extractContextKeysFromText(text: string): string[];
21
24
  export declare const Helper: {
22
25
  objectExists: typeof objectExists;
23
26
  objectNotExists: typeof objectNotExists;
@@ -38,5 +41,8 @@ export declare const Helper: {
38
41
  medianNumberArray: typeof medianNumberArray;
39
42
  modeNumberArray: typeof modeNumberArray;
40
43
  clamp: typeof clamp;
44
+ extractColsFromText: typeof extractColsFromText;
45
+ replaceAll: typeof replaceAll;
46
+ extractContextKeysFromText: typeof extractContextKeysFromText;
41
47
  };
42
48
  export default Helper;
@@ -227,6 +227,34 @@ export function clamp(value, boundOne, boundTwo) {
227
227
  }
228
228
  return value;
229
229
  }
230
+ export function extractColsFromText(text) {
231
+ // rowData.columnName => columnName
232
+ const regex = /\[rowData\.(.*?)\]/g;
233
+ let m;
234
+ const cols = [];
235
+ while ((m = regex.exec(text)) !== null) {
236
+ cols.push(m[1]);
237
+ }
238
+ return cols;
239
+ }
240
+ export function replaceAll(text, toReplace, replaceWith) {
241
+ if (!text) {
242
+ return text;
243
+ }
244
+ // fails for []
245
+ toReplace = toReplace.replace('[', '\\[').replace(']', '\\]');
246
+ return text.replace(new RegExp(toReplace, 'g'), replaceWith);
247
+ }
248
+ export function extractContextKeysFromText(text) {
249
+ // context.columnName => columnName
250
+ const regex = /\[context\.(.*?)\]/g;
251
+ let m;
252
+ const contextKeys = [];
253
+ while ((m = regex.exec(text)) !== null) {
254
+ contextKeys.push(m[1]);
255
+ }
256
+ return contextKeys;
257
+ }
230
258
  export const Helper = {
231
259
  objectExists,
232
260
  objectNotExists,
@@ -247,5 +275,8 @@ export const Helper = {
247
275
  medianNumberArray,
248
276
  modeNumberArray,
249
277
  clamp,
278
+ extractColsFromText,
279
+ replaceAll,
280
+ extractContextKeysFromText,
250
281
  };
251
282
  export default Helper;
@@ -20,6 +20,7 @@ export const AlertMessageWizardSection = (props) => {
20
20
  const messageType = data.MessageType;
21
21
  const messageText = api.alertApi.internalApi.getAlertDescriptionForDataChange(data);
22
22
  const messageHeader = data.MessageHeader;
23
+ const showDocumentationLinks = api.internalApi.isDocumentationLinksDisplayed();
23
24
  const onMessageTextChange = (e) => {
24
25
  const { value } = e.target;
25
26
  props.onChange(Object.assign(Object.assign({}, data), { MessageText: value }));
@@ -42,7 +43,7 @@ export const AlertMessageWizardSection = (props) => {
42
43
  React.createElement(Tabs, { "data-name": "message-text", mt: 2, mb: 3, autoFocus: false },
43
44
  React.createElement(Tabs.Tab, null, "Message Text"),
44
45
  React.createElement(Tabs.Content, null,
45
- React.createElement(Text, { fontSize: 2, mt: 3, mb: 2 }, "The text to display as the Alert Message (leave blank to show automated Message based on Alert Type)"),
46
+ React.createElement(Text, { fontSize: 2, mt: 3, mb: 2 }, "Text to display as the Alert Message (leave blank to show automated Message based on Alert Type)"),
46
47
  ' ',
47
48
  React.createElement(FormLayout, null,
48
49
  React.createElement(FormRow, { label: "Header" },
@@ -51,10 +52,10 @@ export const AlertMessageWizardSection = (props) => {
51
52
  onChange: (e) => onMessageHeaderChange(e) })),
52
53
  React.createElement(FormRow, { label: "Message" },
53
54
  React.createElement(Textarea, { minWidth: 300, rows: 3, marginTop: 2, type: 'text', autoFocus: false, value: messageText !== null && messageText !== void 0 ? messageText : '', onChange: (e) => onMessageTextChange(e) }))),
54
- React.createElement(HelpBlock, { "data-name": "alert-message-documentation", mt: 3, mb: 2, style: {
55
+ showDocumentationLinks && (React.createElement(HelpBlock, { "data-name": "alert-message-documentation", mt: 3, mb: 2, style: {
55
56
  fontSize: 'var(--ab-font-size-3)',
56
57
  padding: 0,
57
58
  } },
58
59
  React.createElement(ButtonInfo, { mr: 2, onClick: () => window.open(AlertMessageDocsLink, '_blank') }),
59
- "See Alert Message documentation for more details and examples")))));
60
+ "See how to create dynamic Alert Messages using placeholders"))))));
60
61
  };
@@ -17,6 +17,9 @@ import { useAdaptable } from '../../AdaptableContext';
17
17
  import FormatHelper from '../../../Utilities/Helpers/FormatHelper';
18
18
  import { Toggle, ToggleGroup } from '../../../components/Toggle';
19
19
  import { DEFAULT_DOUBLE_DISPLAY_VALUE, DEFAULT_STRING_DISPLAY_VALUE, } from '../../../Utilities/Constants/GeneralConstants';
20
+ import Textarea from '../../../components/Textarea';
21
+ import { ButtonInfo } from '../../Components/Buttons/ButtonInfo';
22
+ import { FormatColumnPlaceholderDocsLink } from '../../../Utilities/Constants/DocumentationLinkConstants';
20
23
  const DOLLAR_OPTIONS = {
21
24
  FractionDigits: 2,
22
25
  FractionSeparator: '.',
@@ -201,8 +204,8 @@ const renderDateFormat = (data, _onChange, setFormatOption, scopedCustomFormatte
201
204
  },
202
205
  ] })))))));
203
206
  };
204
- const renderNumberFormat = (data, onChange, setFormatOption, scopedCustomFormatters, formatColumnApi) => {
205
- var _a, _b, _c, _d, _e;
207
+ const renderNumberFormat = (data, onChange, setFormatOption, scopedCustomFormatters, api) => {
208
+ var _a, _b, _c, _d, _e, _f;
206
209
  if (data.DisplayFormat.Formatter !== 'NumberFormatter') {
207
210
  return null;
208
211
  }
@@ -254,6 +257,7 @@ const renderNumberFormat = (data, onChange, setFormatOption, scopedCustomFormatt
254
257
  data.DisplayFormat.Options.Multiplier === MILLION_OPTIONS.Multiplier; //isEqual(data.DisplayFormat.Options, MILLION_OPTIONS);
255
258
  const IS_DOLLAR = data.DisplayFormat.Options.Prefix === '$'; //isEqual(data.DisplayFormat.Options, DOLLAR_OPTIONS);
256
259
  const IS_STERLING = data.DisplayFormat.Options.Prefix === '£'; //isEqual(data.DisplayFormat, STERLING_OPTIONS);
260
+ const showDocumentationLinks = api.internalApi.isDocumentationLinksDisplayed();
257
261
  return (React.createElement(Box, { "data-name": 'format-column-display-format', padding: 2 },
258
262
  React.createElement(Tabs, null,
259
263
  React.createElement(Tabs.Tab, null, "Format"),
@@ -261,7 +265,8 @@ const renderNumberFormat = (data, onChange, setFormatOption, scopedCustomFormatt
261
265
  React.createElement(Flex, { flexDirection: "row" },
262
266
  React.createElement(FormLayout, { mr: 3 },
263
267
  React.createElement(FormRow, { label: "Fraction Separator" },
264
- React.createElement(Input, { "data-name": "fraction-separator", value: (_a = data.DisplayFormat.Options.FractionSeparator) !== null && _a !== void 0 ? _a : '', onChange: (e) => setFormatOption('FractionSeparator', e.currentTarget.value) })),
268
+ React.createElement(Input, { "data-name": "fraction-separator", value: (_a = data.DisplayFormat.Options.FractionSeparator) !== null && _a !== void 0 ? _a : '', onChange: (e) => setFormatOption('FractionSeparator', e.currentTarget.value) }),
269
+ ' '),
265
270
  React.createElement(FormRow, { label: "Integer Separator" },
266
271
  React.createElement(Input, { "data-name": "integer-separator", value: (_b = data.DisplayFormat.Options.IntegerSeparator) !== null && _b !== void 0 ? _b : '', onChange: (e) => setFormatOption('IntegerSeparator', e.currentTarget.value) })),
267
272
  React.createElement(FormRow, { label: "Prefix" },
@@ -291,9 +296,6 @@ const renderNumberFormat = (data, onChange, setFormatOption, scopedCustomFormatt
291
296
  React.createElement(FormRow, { label: "Multiplier" },
292
297
  React.createElement(Input, { "data-name": "multiplier", type: "number", value: data.DisplayFormat.Options.Multiplier, onChange: (e) => setFormatOption('Multiplier', Number(e.currentTarget.value)) })),
293
298
  ' ',
294
- React.createElement(FormRow, { label: "Content" },
295
- React.createElement(Input, { "data-name": "content", value: (_e = data.DisplayFormat.Options.Content) !== null && _e !== void 0 ? _e : '', onChange: (e) => setFormatOption('Content', e.currentTarget.value) })),
296
- ' ',
297
299
  React.createElement(FormRow, { label: "Parentheses" },
298
300
  React.createElement(CheckBox, { "data-name": "parentheses-checkbox", checked: data.DisplayFormat.Options.Parentheses, onChange: (checked) => setFormatOption('Parentheses', checked) })),
299
301
  React.createElement(FormRow, { label: "Floor" },
@@ -317,6 +319,20 @@ const renderNumberFormat = (data, onChange, setFormatOption, scopedCustomFormatt
317
319
  React.createElement(Radio, { "data-name": "preset-million", marginLeft: 3, checked: IS_MILLION, onChange: () => setDivideMillionPreset() }, "M (Million)"),
318
320
  React.createElement(Radio, { "data-name": "preset-dollar", marginLeft: 3, checked: IS_DOLLAR, onChange: () => setDollarPreset() }, "Dollar"),
319
321
  React.createElement(Radio, { "data-name": "preset-sterling", marginLeft: 3, checked: IS_STERLING, onChange: () => setSterlingPreset() }, "Sterling")))))),
322
+ React.createElement(Tabs, { marginTop: 2, autoFocus: false, keyboardNavigation: false },
323
+ React.createElement(Tabs.Tab, null, "Dynamic Content"),
324
+ React.createElement(Tabs.Content, null,
325
+ React.createElement(Text, { padding: 2, fontSize: 2 }, "Provide dynamic content through the use of Placeholders"),
326
+ React.createElement(FormLayout, { margin: 2 },
327
+ React.createElement(FormRow, { label: "" },
328
+ React.createElement(Textarea, { minWidth: 300, rows: 3, placeholder: "", marginTop: 2, type: 'text', autoFocus: false, value: (_f = (_e = data.DisplayFormat.Options.Content) === null || _e === void 0 ? void 0 : _e.toString()) !== null && _f !== void 0 ? _f : '', onChange: (e) => setFormatOption('Content', e.currentTarget.value) }),
329
+ showDocumentationLinks && (React.createElement(HelpBlock, { "data-name": "query-documentation", mt: 3, mb: 2, style: {
330
+ fontSize: 'var(--ab-font-size-3)',
331
+ padding: 0,
332
+ } },
333
+ React.createElement(ButtonInfo, { mr: 2, onClick: () => window.open(FormatColumnPlaceholderDocsLink, '_blank') }),
334
+ "Learn more about using placeholders"))),
335
+ ' '))),
320
336
  React.createElement(Tabs, { marginTop: 2, autoFocus: false, keyboardNavigation: false },
321
337
  React.createElement(Tabs.Tab, null, "Examples"),
322
338
  React.createElement(Tabs.Content, null,
@@ -346,11 +362,12 @@ const renderNumberFormat = (data, onChange, setFormatOption, scopedCustomFormatt
346
362
  },
347
363
  ] })))));
348
364
  };
349
- const renderStringFormat = (data, _onChange, setFormatOption, scopedCustomFormatters, formatColumnApi) => {
365
+ const renderStringFormat = (data, _onChange, setFormatOption, scopedCustomFormatters, api) => {
350
366
  var _a, _b, _c;
351
367
  if (data.DisplayFormat.Formatter !== 'StringFormatter') {
352
368
  return null;
353
369
  }
370
+ const showDocumentationLinks = api.internalApi.isDocumentationLinksDisplayed();
354
371
  return (React.createElement(Box, { "data-name": 'format-column-display-format', padding: 2 },
355
372
  React.createElement(Tabs, null,
356
373
  React.createElement(Tabs.Tab, null, "Format"),
@@ -369,7 +386,13 @@ const renderStringFormat = (data, _onChange, setFormatOption, scopedCustomFormat
369
386
  React.createElement(FormRow, { label: "Suffix" },
370
387
  React.createElement(Input, { "data-name": "suffix", value: (_b = data.DisplayFormat.Options.Suffix) !== null && _b !== void 0 ? _b : '', onChange: (e) => setFormatOption('Suffix', e.currentTarget.value) })),
371
388
  React.createElement(FormRow, { label: "Content" },
372
- React.createElement(Input, { "data-name": "content", value: (_c = data.DisplayFormat.Options.Content) !== null && _c !== void 0 ? _c : '', onChange: (e) => setFormatOption('Content', e.currentTarget.value) })),
389
+ React.createElement(Textarea, { minWidth: 300, rows: 3, placeholder: "", marginTop: 2, type: 'text', autoFocus: false, value: (_c = data.DisplayFormat.Options.Content) !== null && _c !== void 0 ? _c : '', onChange: (e) => setFormatOption('Content', e.currentTarget.value) }),
390
+ showDocumentationLinks && (React.createElement(HelpBlock, { "data-name": "query-documentation", mt: 3, mb: 2, style: {
391
+ fontSize: 'var(--ab-font-size-3)',
392
+ padding: 0,
393
+ } },
394
+ React.createElement(ButtonInfo, { mr: 2, onClick: () => window.open(FormatColumnPlaceholderDocsLink, '_blank') }),
395
+ "See how to create dynamic Display Format using placeholders"))),
373
396
  React.createElement(FormRow, { label: "Empty" },
374
397
  React.createElement(CheckBox, { "data-name": "empty-checkbox", checked: data.DisplayFormat.Options.Empty, onChange: (checked) => setFormatOption('Empty', checked) })))))),
375
398
  scopedCustomFormatters.length > 0 && (React.createElement(Tabs, { marginTop: 2, keyboardNavigation: false },
@@ -412,13 +435,13 @@ export const FormatColumnFormatWizardSection = (props) => {
412
435
  const Type = data.DisplayFormat && data.DisplayFormat.Formatter;
413
436
  const customScopedFormatters = customDisplayFormatters.filter((displayFormatter) => adaptable.api.columnScopeApi.isScopeInScope(data.Scope, displayFormatter.scope));
414
437
  if (Type === 'NumberFormatter') {
415
- return renderNumberFormat(data, update, setFormatOption, customScopedFormatters, formatColumnApi);
438
+ return renderNumberFormat(data, update, setFormatOption, customScopedFormatters, adaptable.api);
416
439
  }
417
440
  if (Type === 'DateFormatter') {
418
441
  return renderDateFormat(data, update, setFormatOption, customScopedFormatters);
419
442
  }
420
443
  if (Type === 'StringFormatter') {
421
- return renderStringFormat(data, update, setFormatOption, customScopedFormatters, formatColumnApi);
444
+ return renderStringFormat(data, update, setFormatOption, customScopedFormatters, adaptable.api);
422
445
  }
423
446
  return (React.createElement(HelpBlock, { margin: 3 },
424
447
  "Setting a Display Format is only possible if ",
@@ -243,7 +243,8 @@ export declare class AdaptableAgGrid implements IAdaptable {
243
243
  private getDistinctGridCellsForColumn;
244
244
  private addDistinctColumnValue;
245
245
  private getUniqueGridCells;
246
- getGridCellsForColumn(columnId: string, includeBlanks?: boolean, onlyVisibleRows?: boolean): GridCell[] | undefined;
246
+ getGridCellsForColumn(columnId: string, onlyVisibleRows?: boolean): GridCell[] | undefined;
247
+ getGridCellsForColumnTemp(columnId: string, onlyVisibleRows: boolean): GridCell[] | undefined;
247
248
  getRowNodesForPrimaryKeys(primaryKeyValues: any[]): any[];
248
249
  getRowNodeByIndex(index: number): IRowNode;
249
250
  getAgGridStatusPanels(): import("@ag-grid-community/core").StatusPanelDef[];
@@ -276,6 +276,7 @@ export class AdaptableAgGrid {
276
276
  this.adaptableOptions = this.normalizeAdaptableOptions(this.adaptableOptions);
277
277
  const { showLoadingScreen, loadingScreenDelay, loadingScreenText, loadingScreenTitle } = this.adaptableOptions.userInterfaceOptions;
278
278
  if (showLoadingScreen) {
279
+ this.logger.info(`Show Loading Screen`);
279
280
  const portalElement = ensurePortalElement();
280
281
  if (portalElement) {
281
282
  this.unmountLoadingScreen = this.renderReactRoot(createElement(AdaptableLoadingScreen, {
@@ -285,6 +286,9 @@ export class AdaptableAgGrid {
285
286
  loadingScreenTitle,
286
287
  }), portalElement);
287
288
  }
289
+ else {
290
+ this.logger.consoleError(`Adaptable failed to show the loading screen!`);
291
+ }
288
292
  }
289
293
  this.forPlugins((plugin) => plugin.afterInitOptions(this, this.adaptableOptions));
290
294
  this.api = new AdaptableApiImpl(this);
@@ -350,6 +354,7 @@ export class AdaptableAgGrid {
350
354
  this.logger.consoleError(`Adaptable failed to initialize AG Grid!`);
351
355
  return Promise.reject('Adaptable failed to initialize AG Grid!');
352
356
  }
357
+ this.logger.info(`Hide Loading Screen`);
353
358
  (_b = this.unmountLoadingScreen) === null || _b === void 0 ? void 0 : _b.call(this);
354
359
  perfInitAgGrid.end();
355
360
  // we need to intercept several AG Grid Api methods and trigger Adaptale state changes
@@ -2356,17 +2361,33 @@ export class AdaptableAgGrid {
2356
2361
  }
2357
2362
  return uniqueVals.slice(0, this.api.columnFilterApi.internalApi.getFilterValuesMaxNumberOfItems(column));
2358
2363
  }
2359
- getGridCellsForColumn(columnId, includeBlanks = false, onlyVisibleRows = false) {
2364
+ getGridCellsForColumn(columnId, onlyVisibleRows = false) {
2360
2365
  let returnValues = [];
2361
2366
  const handler = (rowNode) => {
2362
- const gridCell = this.getGridCellFromRowNode(rowNode, columnId);
2363
- if (gridCell) {
2364
- if (gridCell.rawValue == undefined || gridCell.rawValue == null) {
2365
- if (includeBlanks) {
2366
- returnValues.push(gridCell);
2367
- }
2367
+ if (!this.isGroupRowNode(rowNode)) {
2368
+ const gridCell = this.getGridCellFromRowNode(rowNode, columnId);
2369
+ if (gridCell && gridCell.rawValue !== undefined && gridCell.rawValue !== null) {
2370
+ returnValues.push(gridCell);
2368
2371
  }
2369
- else {
2372
+ }
2373
+ };
2374
+ if (onlyVisibleRows) {
2375
+ this.agGridAdapter.getAgGridApi().forEachNodeAfterFilter(handler);
2376
+ }
2377
+ else {
2378
+ this.agGridAdapter.getAgGridApi().forEachNode(handler);
2379
+ }
2380
+ return returnValues;
2381
+ }
2382
+ // This horrible method is temporary until we can get rid of having predicates inside values which is coming soon
2383
+ // We need it in case Blanks is requested
2384
+ // once we go to the new multi predicate screen then we wont show blanks any more - which we should never have done
2385
+ getGridCellsForColumnTemp(columnId, onlyVisibleRows) {
2386
+ let returnValues = [];
2387
+ const handler = (rowNode) => {
2388
+ if (!this.isGroupRowNode(rowNode)) {
2389
+ const gridCell = this.getGridCellFromRowNode(rowNode, columnId);
2390
+ if (gridCell) {
2370
2391
  returnValues.push(gridCell);
2371
2392
  }
2372
2393
  }
@@ -470,6 +470,20 @@ export class AgGridMenuAdapter {
470
470
  ...gridInfoMenuItems,
471
471
  ],
472
472
  };
473
+ /*
474
+ const calculatedColumnMenuItem: AdaptableMenuItem = {
475
+ name: 'calculated-column-group',
476
+ label: 'Calculated Column',
477
+ module: 'CalculatedColumn',
478
+ isVisible: true,
479
+ icon: {
480
+ name: 'columns',
481
+ },
482
+ subItems: [
483
+ ...calculatedColumnMenuItems,
484
+ ],
485
+ };
486
+ */
473
487
  const columnMenuItem = {
474
488
  name: 'column-group',
475
489
  label: 'Column',
@@ -480,7 +494,6 @@ export class AgGridMenuAdapter {
480
494
  },
481
495
  subItems: [
482
496
  ...columnActionGroup,
483
- ...calculatedColumnMenuItems,
484
497
  ...freeTextColumnMenuItems,
485
498
  ...customSortMenuItems,
486
499
  ...plusMinusMenuItems,
@@ -499,6 +512,7 @@ export class AgGridMenuAdapter {
499
512
  subItems: [...formatColumnMenuItems, ...styledColumnMenuItems, ...flashingCellMenuItems],
500
513
  };
501
514
  return this.removeConsecutiveSeparators([
515
+ ...calculatedColumnMenuItems,
502
516
  ...settingsPanelMenuItems,
503
517
  ...dashboardMenuItems,
504
518
  ...columnFilterGroup,
@@ -294,6 +294,7 @@ const DefaultAdaptableOptions = {
294
294
  activeByDefault: false,
295
295
  showDataChange: undefined,
296
296
  changeHistoryButton: undefined,
297
+ showLastDataChangeOnly: true
297
298
  },
298
299
  settingsPanelOptions: {
299
300
  popupType: 'window',
package/src/env.js CHANGED
@@ -1,5 +1,5 @@
1
1
  export default {
2
2
  INFINITE_TABLE_LICENSE_KEY: "StartDate=2021-06-29|EndDate=2030-01-01|Owner=Adaptable|Type=distribution|TS=1624971462479|C=137829811,1004007071,2756196225,1839832928,3994409405,636616862" || '',
3
- PUBLISH_TIMESTAMP: 1720099744173 || Date.now(),
4
- VERSION: "18.1.7" || '--current-version--',
3
+ PUBLISH_TIMESTAMP: 1721129456634 || Date.now(),
4
+ VERSION: "18.1.9" || '--current-version--',
5
5
  };
@@ -2751,6 +2751,14 @@ export declare const ADAPTABLE_METAMODEL: {
2751
2751
  gridInfo: string;
2752
2752
  defVal: string;
2753
2753
  noCode?: undefined;
2754
+ } | {
2755
+ name: string;
2756
+ kind: string;
2757
+ desc: string;
2758
+ isOpt: boolean;
2759
+ gridInfo?: undefined;
2760
+ noCode?: undefined;
2761
+ defVal?: undefined;
2754
2762
  })[];
2755
2763
  };
2756
2764
  DataFormatDataType: {