@adaptabletools/adaptable-cjs 18.1.8 → 18.1.10

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 (34) hide show
  1. package/package.json +1 -1
  2. package/src/AdaptableInterfaces/IAdaptable.d.ts +3 -0
  3. package/src/AdaptableOptions/ContainerOptions.d.ts +7 -7
  4. package/src/AdaptableOptions/DataChangeHistoryOptions.d.ts +5 -0
  5. package/src/Api/DataChangeHistoryApi.d.ts +6 -0
  6. package/src/Api/GridApi.d.ts +2 -0
  7. package/src/Api/Implementation/DataChangeHistoryApiImpl.d.ts +2 -0
  8. package/src/Api/Implementation/DataChangeHistoryApiImpl.js +23 -2
  9. package/src/Api/Implementation/GridApiImpl.d.ts +2 -1
  10. package/src/Api/Implementation/GridApiImpl.js +3 -0
  11. package/src/Api/Internal/AdaptableInternalApi.d.ts +2 -0
  12. package/src/Api/Internal/AdaptableInternalApi.js +4 -0
  13. package/src/Api/Internal/GridInternalApi.js +12 -6
  14. package/src/PredefinedConfig/Common/AdaptableFormat.d.ts +9 -9
  15. package/src/Redux/ActionsReducers/SystemRedux.d.ts +9 -8
  16. package/src/Redux/ActionsReducers/SystemRedux.js +11 -11
  17. package/src/Strategy/DataChangeHistoryModule.js +1 -2
  18. package/src/Utilities/Constants/DocumentationLinkConstants.d.ts +1 -0
  19. package/src/Utilities/Constants/DocumentationLinkConstants.js +2 -1
  20. package/src/Utilities/Helpers/FormatContentHelper.d.ts +22 -0
  21. package/src/Utilities/Helpers/FormatContentHelper.js +39 -0
  22. package/src/Utilities/Helpers/FormatHelper.d.ts +0 -18
  23. package/src/Utilities/Helpers/FormatHelper.js +5 -38
  24. package/src/View/Alert/Wizard/AlertMessageWizardSection.js +4 -3
  25. package/src/View/Components/ExternalRenderer.js +3 -1
  26. package/src/View/Dashboard/CustomToolbar.js +3 -1
  27. package/src/View/FormatColumn/Wizard/FormatColumnFormatWizardSection.js +32 -13
  28. package/src/agGrid/AdaptableAgGrid.d.ts +3 -0
  29. package/src/agGrid/AdaptableAgGrid.js +35 -2
  30. package/src/agGrid/AgGridMenuAdapter.js +15 -1
  31. package/src/agGrid/defaultAdaptableOptions.js +1 -0
  32. package/src/env.js +2 -2
  33. package/src/metamodel/adaptable.metamodel.js +1 -1
  34. package/tsconfig.cjs.tsbuildinfo +1 -1
@@ -25,6 +25,7 @@ const AlertMessageWizardSection = (props) => {
25
25
  const messageType = data.MessageType;
26
26
  const messageText = api.alertApi.internalApi.getAlertDescriptionForDataChange(data);
27
27
  const messageHeader = data.MessageHeader;
28
+ const showDocumentationLinks = api.internalApi.isDocumentationLinksDisplayed();
28
29
  const onMessageTextChange = (e) => {
29
30
  const { value } = e.target;
30
31
  props.onChange(Object.assign(Object.assign({}, data), { MessageText: value }));
@@ -47,7 +48,7 @@ const AlertMessageWizardSection = (props) => {
47
48
  React.createElement(Tabs_1.Tabs, { "data-name": "message-text", mt: 2, mb: 3, autoFocus: false },
48
49
  React.createElement(Tabs_1.Tabs.Tab, null, "Message Text"),
49
50
  React.createElement(Tabs_1.Tabs.Content, null,
50
- React.createElement(rebass_1.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)"),
51
+ React.createElement(rebass_1.Text, { fontSize: 2, mt: 3, mb: 2 }, "Text to display as the Alert Message (leave blank to show automated Message based on Alert Type)"),
51
52
  ' ',
52
53
  React.createElement(FormLayout_1.default, null,
53
54
  React.createElement(FormLayout_1.FormRow, { label: "Header" },
@@ -56,11 +57,11 @@ const AlertMessageWizardSection = (props) => {
56
57
  onChange: (e) => onMessageHeaderChange(e) })),
57
58
  React.createElement(FormLayout_1.FormRow, { label: "Message" },
58
59
  React.createElement(Textarea_1.default, { minWidth: 300, rows: 3, marginTop: 2, type: 'text', autoFocus: false, value: messageText !== null && messageText !== void 0 ? messageText : '', onChange: (e) => onMessageTextChange(e) }))),
59
- React.createElement(HelpBlock_1.default, { "data-name": "alert-message-documentation", mt: 3, mb: 2, style: {
60
+ showDocumentationLinks && (React.createElement(HelpBlock_1.default, { "data-name": "alert-message-documentation", mt: 3, mb: 2, style: {
60
61
  fontSize: 'var(--ab-font-size-3)',
61
62
  padding: 0,
62
63
  } },
63
64
  React.createElement(ButtonInfo_1.ButtonInfo, { mr: 2, onClick: () => window.open(DocumentationLinkConstants_1.AlertMessageDocsLink, '_blank') }),
64
- "See Alert Message documentation for more details and examples")))));
65
+ "See how to create dynamic Alert Messages using placeholders"))))));
65
66
  };
66
67
  exports.AlertMessageWizardSection = AlertMessageWizardSection;
@@ -45,6 +45,8 @@ const ExternalRenderer = (_a) => {
45
45
  }
46
46
  };
47
47
  }, []);
48
- return React.createElement("div", Object.assign({}, rest, { dangerouslySetInnerHTML: { __html: contentsHTML }, ref: ref }));
48
+ const RFC = adaptable.variant === 'react' ? frameworkComponent : null;
49
+ return RFC ? (React.createElement("div", Object.assign({}, rest, { ref: ref }),
50
+ React.createElement(RFC, { adaptableApi: adaptable.api }))) : (React.createElement("div", Object.assign({}, rest, { dangerouslySetInnerHTML: { __html: contentsHTML }, ref: ref })));
49
51
  };
50
52
  exports.ExternalRenderer = ExternalRenderer;
@@ -67,6 +67,8 @@ const CustomToolbarCmp = (props) => {
67
67
  }
68
68
  };
69
69
  }, []);
70
+ const CustomReactFrameworkComponent = props.customToolbar
71
+ .frameworkComponent;
70
72
  return (React.createElement(React.Fragment, null,
71
73
  props.customToolbar.render && (React.createElement("div", { id: renderContentContainerId, ref: renderContentContainerRef, className: `ab-CustomToolbar__rendered-content ab-CustomToolbar--${props.customToolbar.name}`, style: { minHeight: 22 }, dangerouslySetInnerHTML: { __html: renderedContentHTML } })),
72
74
  props.customToolbar.toolbarButtons && (React.createElement("div", { id: buttonsContainerId, className: `ab-CustomToolbar__buttons ab-CustomToolbar--${props.customToolbar.name}`, style: { minHeight: 22 } }, props.customToolbar.toolbarButtons.map((button, index) => {
@@ -95,7 +97,7 @@ const CustomToolbarCmp = (props) => {
95
97
  }, 16);
96
98
  } }, buttonLabel));
97
99
  }))),
98
- props.customToolbar.frameworkComponent && (React.createElement("div", { id: componentContainerId, ref: componentContainerRef, style: { minHeight: 22 }, className: `ab-CustomToolbar__component ab-CustomToolbar--${props.customToolbar.name}` }))));
100
+ CustomReactFrameworkComponent && (React.createElement("div", { id: componentContainerId, ref: componentContainerRef, style: { minHeight: 22 }, className: `ab-CustomToolbar__component ab-CustomToolbar--${props.customToolbar.name}` }, api.gridApi.getVariant() === 'react' ? (React.createElement(CustomReactFrameworkComponent, { adaptableApi: api })) : null))));
99
101
  };
100
102
  exports.CustomToolbarCmp = CustomToolbarCmp;
101
103
  const CustomToolbarWrapper = (props) => {
@@ -22,6 +22,8 @@ const FormatHelper_1 = tslib_1.__importDefault(require("../../../Utilities/Helpe
22
22
  const Toggle_1 = require("../../../components/Toggle");
23
23
  const GeneralConstants_1 = require("../../../Utilities/Constants/GeneralConstants");
24
24
  const Textarea_1 = tslib_1.__importDefault(require("../../../components/Textarea"));
25
+ const ButtonInfo_1 = require("../../Components/Buttons/ButtonInfo");
26
+ const DocumentationLinkConstants_1 = require("../../../Utilities/Constants/DocumentationLinkConstants");
25
27
  const DOLLAR_OPTIONS = {
26
28
  FractionDigits: 2,
27
29
  FractionSeparator: '.',
@@ -209,8 +211,8 @@ const renderDateFormat = (data, _onChange, setFormatOption, scopedCustomFormatte
209
211
  },
210
212
  ] })))))));
211
213
  };
212
- const renderNumberFormat = (data, onChange, setFormatOption, scopedCustomFormatters, formatColumnApi) => {
213
- var _a, _b, _c, _d, _e;
214
+ const renderNumberFormat = (data, onChange, setFormatOption, scopedCustomFormatters, api) => {
215
+ var _a, _b, _c, _d, _e, _f;
214
216
  if (data.DisplayFormat.Formatter !== 'NumberFormatter') {
215
217
  return null;
216
218
  }
@@ -262,6 +264,7 @@ const renderNumberFormat = (data, onChange, setFormatOption, scopedCustomFormatt
262
264
  data.DisplayFormat.Options.Multiplier === MILLION_OPTIONS.Multiplier; //isEqual(data.DisplayFormat.Options, MILLION_OPTIONS);
263
265
  const IS_DOLLAR = data.DisplayFormat.Options.Prefix === '$'; //isEqual(data.DisplayFormat.Options, DOLLAR_OPTIONS);
264
266
  const IS_STERLING = data.DisplayFormat.Options.Prefix === '£'; //isEqual(data.DisplayFormat, STERLING_OPTIONS);
267
+ const showDocumentationLinks = api.internalApi.isDocumentationLinksDisplayed();
265
268
  return (React.createElement(rebass_1.Box, { "data-name": 'format-column-display-format', padding: 2 },
266
269
  React.createElement(Tabs_1.Tabs, null,
267
270
  React.createElement(Tabs_1.Tabs.Tab, null, "Format"),
@@ -269,7 +272,8 @@ const renderNumberFormat = (data, onChange, setFormatOption, scopedCustomFormatt
269
272
  React.createElement(rebass_1.Flex, { flexDirection: "row" },
270
273
  React.createElement(FormLayout_1.default, { mr: 3 },
271
274
  React.createElement(FormLayout_1.FormRow, { label: "Fraction Separator" },
272
- React.createElement(Input_1.default, { "data-name": "fraction-separator", value: (_a = data.DisplayFormat.Options.FractionSeparator) !== null && _a !== void 0 ? _a : '', onChange: (e) => setFormatOption('FractionSeparator', e.currentTarget.value) })),
275
+ React.createElement(Input_1.default, { "data-name": "fraction-separator", value: (_a = data.DisplayFormat.Options.FractionSeparator) !== null && _a !== void 0 ? _a : '', onChange: (e) => setFormatOption('FractionSeparator', e.currentTarget.value) }),
276
+ ' '),
273
277
  React.createElement(FormLayout_1.FormRow, { label: "Integer Separator" },
274
278
  React.createElement(Input_1.default, { "data-name": "integer-separator", value: (_b = data.DisplayFormat.Options.IntegerSeparator) !== null && _b !== void 0 ? _b : '', onChange: (e) => setFormatOption('IntegerSeparator', e.currentTarget.value) })),
275
279
  React.createElement(FormLayout_1.FormRow, { label: "Prefix" },
@@ -299,9 +303,6 @@ const renderNumberFormat = (data, onChange, setFormatOption, scopedCustomFormatt
299
303
  React.createElement(FormLayout_1.FormRow, { label: "Multiplier" },
300
304
  React.createElement(Input_1.default, { "data-name": "multiplier", type: "number", value: data.DisplayFormat.Options.Multiplier, onChange: (e) => setFormatOption('Multiplier', Number(e.currentTarget.value)) })),
301
305
  ' ',
302
- React.createElement(FormLayout_1.FormRow, { label: "Content" },
303
- React.createElement(Input_1.default, { "data-name": "content", value: (_e = data.DisplayFormat.Options.Content) !== null && _e !== void 0 ? _e : '', onChange: (e) => setFormatOption('Content', e.currentTarget.value) })),
304
- ' ',
305
306
  React.createElement(FormLayout_1.FormRow, { label: "Parentheses" },
306
307
  React.createElement(CheckBox_1.CheckBox, { "data-name": "parentheses-checkbox", checked: data.DisplayFormat.Options.Parentheses, onChange: (checked) => setFormatOption('Parentheses', checked) })),
307
308
  React.createElement(FormLayout_1.FormRow, { label: "Floor" },
@@ -325,6 +326,20 @@ const renderNumberFormat = (data, onChange, setFormatOption, scopedCustomFormatt
325
326
  React.createElement(Radio_1.default, { "data-name": "preset-million", marginLeft: 3, checked: IS_MILLION, onChange: () => setDivideMillionPreset() }, "M (Million)"),
326
327
  React.createElement(Radio_1.default, { "data-name": "preset-dollar", marginLeft: 3, checked: IS_DOLLAR, onChange: () => setDollarPreset() }, "Dollar"),
327
328
  React.createElement(Radio_1.default, { "data-name": "preset-sterling", marginLeft: 3, checked: IS_STERLING, onChange: () => setSterlingPreset() }, "Sterling")))))),
329
+ React.createElement(Tabs_1.Tabs, { marginTop: 2, autoFocus: false, keyboardNavigation: false },
330
+ React.createElement(Tabs_1.Tabs.Tab, null, "Dynamic Content"),
331
+ React.createElement(Tabs_1.Tabs.Content, null,
332
+ React.createElement(rebass_1.Text, { padding: 2, fontSize: 2 }, "Provide dynamic content through the use of Placeholders"),
333
+ React.createElement(FormLayout_1.default, { margin: 2 },
334
+ React.createElement(FormLayout_1.FormRow, { label: "" },
335
+ React.createElement(Textarea_1.default, { 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) }),
336
+ showDocumentationLinks && (React.createElement(HelpBlock_1.default, { "data-name": "query-documentation", mt: 3, mb: 2, style: {
337
+ fontSize: 'var(--ab-font-size-3)',
338
+ padding: 0,
339
+ } },
340
+ React.createElement(ButtonInfo_1.ButtonInfo, { mr: 2, onClick: () => window.open(DocumentationLinkConstants_1.FormatColumnPlaceholderDocsLink, '_blank') }),
341
+ "Learn more about using placeholders"))),
342
+ ' '))),
328
343
  React.createElement(Tabs_1.Tabs, { marginTop: 2, autoFocus: false, keyboardNavigation: false },
329
344
  React.createElement(Tabs_1.Tabs.Tab, null, "Examples"),
330
345
  React.createElement(Tabs_1.Tabs.Content, null,
@@ -354,11 +369,12 @@ const renderNumberFormat = (data, onChange, setFormatOption, scopedCustomFormatt
354
369
  },
355
370
  ] })))));
356
371
  };
357
- const renderStringFormat = (data, _onChange, setFormatOption, scopedCustomFormatters, formatColumnApi) => {
372
+ const renderStringFormat = (data, _onChange, setFormatOption, scopedCustomFormatters, api) => {
358
373
  var _a, _b, _c;
359
374
  if (data.DisplayFormat.Formatter !== 'StringFormatter') {
360
375
  return null;
361
376
  }
377
+ const showDocumentationLinks = api.internalApi.isDocumentationLinksDisplayed();
362
378
  return (React.createElement(rebass_1.Box, { "data-name": 'format-column-display-format', padding: 2 },
363
379
  React.createElement(Tabs_1.Tabs, null,
364
380
  React.createElement(Tabs_1.Tabs.Tab, null, "Format"),
@@ -377,10 +393,13 @@ const renderStringFormat = (data, _onChange, setFormatOption, scopedCustomFormat
377
393
  React.createElement(FormLayout_1.FormRow, { label: "Suffix" },
378
394
  React.createElement(Input_1.default, { "data-name": "suffix", value: (_b = data.DisplayFormat.Options.Suffix) !== null && _b !== void 0 ? _b : '', onChange: (e) => setFormatOption('Suffix', e.currentTarget.value) })),
379
395
  React.createElement(FormLayout_1.FormRow, { label: "Content" },
380
- React.createElement(Textarea_1.default, { minWidth: 300, rows: 3, placeholder: "use defaults", marginTop: 2, type: 'text', autoFocus: false, value: (_c = data.DisplayFormat.Options.Content) !== null && _c !== void 0 ? _c : '',
381
- // placeholder="defaults to column name"
382
- // onChange={(e: any) => onMessageHeaderChange(e)}
383
- onChange: (e) => setFormatOption('Content', e.currentTarget.value) })),
396
+ React.createElement(Textarea_1.default, { 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) }),
397
+ showDocumentationLinks && (React.createElement(HelpBlock_1.default, { "data-name": "query-documentation", mt: 3, mb: 2, style: {
398
+ fontSize: 'var(--ab-font-size-3)',
399
+ padding: 0,
400
+ } },
401
+ React.createElement(ButtonInfo_1.ButtonInfo, { mr: 2, onClick: () => window.open(DocumentationLinkConstants_1.FormatColumnPlaceholderDocsLink, '_blank') }),
402
+ "See how to create dynamic Display Format using placeholders"))),
384
403
  React.createElement(FormLayout_1.FormRow, { label: "Empty" },
385
404
  React.createElement(CheckBox_1.CheckBox, { "data-name": "empty-checkbox", checked: data.DisplayFormat.Options.Empty, onChange: (checked) => setFormatOption('Empty', checked) })))))),
386
405
  scopedCustomFormatters.length > 0 && (React.createElement(Tabs_1.Tabs, { marginTop: 2, keyboardNavigation: false },
@@ -423,13 +442,13 @@ const FormatColumnFormatWizardSection = (props) => {
423
442
  const Type = data.DisplayFormat && data.DisplayFormat.Formatter;
424
443
  const customScopedFormatters = customDisplayFormatters.filter((displayFormatter) => adaptable.api.columnScopeApi.isScopeInScope(data.Scope, displayFormatter.scope));
425
444
  if (Type === 'NumberFormatter') {
426
- return renderNumberFormat(data, update, setFormatOption, customScopedFormatters, formatColumnApi);
445
+ return renderNumberFormat(data, update, setFormatOption, customScopedFormatters, adaptable.api);
427
446
  }
428
447
  if (Type === 'DateFormatter') {
429
448
  return renderDateFormat(data, update, setFormatOption, customScopedFormatters);
430
449
  }
431
450
  if (Type === 'StringFormatter') {
432
- return renderStringFormat(data, update, setFormatOption, customScopedFormatters, formatColumnApi);
451
+ return renderStringFormat(data, update, setFormatOption, customScopedFormatters, adaptable.api);
433
452
  }
434
453
  return (React.createElement(HelpBlock_1.default, { margin: 3 },
435
454
  "Setting a Display Format is only possible if ",
@@ -1,3 +1,4 @@
1
+ /// <reference types="react" />
1
2
  import { AdaptableOptions } from '../AdaptableOptions/AdaptableOptions';
2
3
  import { ChartRef, Column, GridApi, GridOptions, IRowNode, Module, RowModelType } from '@ag-grid-community/core';
3
4
  import { AdaptableLogger } from './AdaptableLogger';
@@ -122,6 +123,7 @@ export declare class AdaptableAgGrid implements IAdaptable {
122
123
  * Temporary, these are MIGRATION technical debts, and should be removed as soon as possible
123
124
  */
124
125
  private adaptableStatusPanelKeys;
126
+ _PRIVATE_adaptableJSXElement: JSX.Element;
125
127
  constructor();
126
128
  static forEachAdaptable(fn: (adaptable: AdaptableAgGrid) => void): void;
127
129
  private static collectInstance;
@@ -244,6 +246,7 @@ export declare class AdaptableAgGrid implements IAdaptable {
244
246
  private addDistinctColumnValue;
245
247
  private getUniqueGridCells;
246
248
  getGridCellsForColumn(columnId: string, onlyVisibleRows?: boolean): GridCell[] | undefined;
249
+ getGridCellsForColumnTemp(columnId: string, onlyVisibleRows: boolean): GridCell[] | undefined;
247
250
  getRowNodesForPrimaryKeys(primaryKeyValues: any[]): any[];
248
251
  getRowNodeByIndex(index: number): IRowNode;
249
252
  getAgGridStatusPanels(): import("@ag-grid-community/core").StatusPanelDef[];
@@ -401,7 +401,19 @@ class AdaptableAgGrid {
401
401
  const adaptableContainerElem = this.getAdaptableContainerElement();
402
402
  if (adaptableContainerElem != null) {
403
403
  adaptableContainerElem.innerHTML = '';
404
- this.unmountReactRoot = this.renderReactRoot((0, AdaptableView_1.AdaptableApp)({ Adaptable: this }), adaptableContainerElem);
404
+ if (this.variant === 'react') {
405
+ /**
406
+ * #no_additional_react_root
407
+ * This is only used for the React variant
408
+ * Where we don't want to create a new React render tree here
409
+ * by rendering it as a React root, but instead we want to
410
+ * render it as is in the React tree of our AdaptableReact component
411
+ */
412
+ this._PRIVATE_adaptableJSXElement = (0, AdaptableView_1.AdaptableApp)({ Adaptable: this });
413
+ }
414
+ else {
415
+ this.unmountReactRoot = this.renderReactRoot((0, AdaptableView_1.AdaptableApp)({ Adaptable: this }), adaptableContainerElem);
416
+ }
405
417
  }
406
418
  this.lifecycleState = 'ready';
407
419
  this.forPlugins((plugin) => plugin.onAdaptableReady(this, this.adaptableOptions));
@@ -2383,6 +2395,27 @@ class AdaptableAgGrid {
2383
2395
  }
2384
2396
  return returnValues;
2385
2397
  }
2398
+ // This horrible method is temporary until we can get rid of having predicates inside values which is coming soon
2399
+ // We need it in case Blanks is requested
2400
+ // once we go to the new multi predicate screen then we wont show blanks any more - which we should never have done
2401
+ getGridCellsForColumnTemp(columnId, onlyVisibleRows) {
2402
+ let returnValues = [];
2403
+ const handler = (rowNode) => {
2404
+ if (!this.isGroupRowNode(rowNode)) {
2405
+ const gridCell = this.getGridCellFromRowNode(rowNode, columnId);
2406
+ if (gridCell) {
2407
+ returnValues.push(gridCell);
2408
+ }
2409
+ }
2410
+ };
2411
+ if (onlyVisibleRows) {
2412
+ this.agGridAdapter.getAgGridApi().forEachNodeAfterFilter(handler);
2413
+ }
2414
+ else {
2415
+ this.agGridAdapter.getAgGridApi().forEachNode(handler);
2416
+ }
2417
+ return returnValues;
2418
+ }
2386
2419
  getRowNodesForPrimaryKeys(primaryKeyValues) {
2387
2420
  let rowNodes = [];
2388
2421
  if (this.useRowNodeLookUp) {
@@ -3755,7 +3788,7 @@ class AdaptableAgGrid {
3755
3788
  // same grid column state as a previous,
3756
3789
  // so no need to update, as the layout has already been updated
3757
3790
  // for this grid column state
3758
- console.log('same state as before');
3791
+ // console.log('same state as before');
3759
3792
  return;
3760
3793
  }
3761
3794
  this.previousAgGridLayoutState = stringifiedLayoutState;
@@ -474,6 +474,20 @@ class AgGridMenuAdapter {
474
474
  ...gridInfoMenuItems,
475
475
  ],
476
476
  };
477
+ /*
478
+ const calculatedColumnMenuItem: AdaptableMenuItem = {
479
+ name: 'calculated-column-group',
480
+ label: 'Calculated Column',
481
+ module: 'CalculatedColumn',
482
+ isVisible: true,
483
+ icon: {
484
+ name: 'columns',
485
+ },
486
+ subItems: [
487
+ ...calculatedColumnMenuItems,
488
+ ],
489
+ };
490
+ */
477
491
  const columnMenuItem = {
478
492
  name: 'column-group',
479
493
  label: 'Column',
@@ -484,7 +498,6 @@ class AgGridMenuAdapter {
484
498
  },
485
499
  subItems: [
486
500
  ...columnActionGroup,
487
- ...calculatedColumnMenuItems,
488
501
  ...freeTextColumnMenuItems,
489
502
  ...customSortMenuItems,
490
503
  ...plusMinusMenuItems,
@@ -503,6 +516,7 @@ class AgGridMenuAdapter {
503
516
  subItems: [...formatColumnMenuItems, ...styledColumnMenuItems, ...flashingCellMenuItems],
504
517
  };
505
518
  return this.removeConsecutiveSeparators([
519
+ ...calculatedColumnMenuItems,
506
520
  ...settingsPanelMenuItems,
507
521
  ...dashboardMenuItems,
508
522
  ...columnFilterGroup,
@@ -298,6 +298,7 @@ const DefaultAdaptableOptions = {
298
298
  activeByDefault: false,
299
299
  showDataChange: undefined,
300
300
  changeHistoryButton: undefined,
301
+ showLastDataChangeOnly: true
301
302
  },
302
303
  settingsPanelOptions: {
303
304
  popupType: 'window',
package/src/env.js CHANGED
@@ -2,6 +2,6 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.default = {
4
4
  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" || '',
5
- PUBLISH_TIMESTAMP: 1720529578367 || Date.now(),
6
- VERSION: "18.1.8" || '--current-version--',
5
+ PUBLISH_TIMESTAMP: 1721302203425 || Date.now(),
6
+ VERSION: "18.1.10" || '--current-version--',
7
7
  };