@adaptabletools/adaptable 12.0.3 → 12.0.6

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 (41) hide show
  1. package/bundle.cjs.js +93 -93
  2. package/package.json +1 -1
  3. package/publishTimestamp.d.ts +1 -1
  4. package/publishTimestamp.js +1 -1
  5. package/src/AdaptableOptions/ExportOptions.d.ts +3 -3
  6. package/src/Api/Events/SearchChanged.d.ts +1 -1
  7. package/src/Api/FormatColumnApi.d.ts +5 -0
  8. package/src/Api/Implementation/FormatColumnApiImpl.d.ts +1 -0
  9. package/src/Api/Implementation/FormatColumnApiImpl.js +23 -1
  10. package/src/Api/Implementation/LayoutApiImpl.d.ts +1 -0
  11. package/src/Api/Implementation/LayoutApiImpl.js +6 -0
  12. package/src/Api/LayoutApi.d.ts +5 -0
  13. package/src/PredefinedConfig/ChartingState.d.ts +1 -1
  14. package/src/PredefinedConfig/Common/SpecialColumnSettings.d.ts +1 -1
  15. package/src/Redux/Store/AdaptableStore.js +6 -0
  16. package/src/Strategy/FormatColumnModule.js +1 -1
  17. package/src/Strategy/LayoutModule.js +2 -1
  18. package/src/Utilities/Constants/DocumentationLinkConstants.js +2 -2
  19. package/src/Utilities/Constants/GeneralConstants.d.ts +1 -0
  20. package/src/Utilities/Constants/GeneralConstants.js +3 -2
  21. package/src/Utilities/ExpressionFunctions/aggregatedBooleanExpressionFunctions.js +4 -4
  22. package/src/Utilities/ExpressionFunctions/aggregatedScalarExpressionFunctions.js +7 -7
  23. package/src/Utilities/ExpressionFunctions/booleanExpressionFunctions.js +26 -4
  24. package/src/Utilities/ExpressionFunctions/expressionFunctionUtils.js +5 -5
  25. package/src/Utilities/ExpressionFunctions/observableExpressionFunctions.js +11 -11
  26. package/src/Utilities/ExpressionFunctions/scalarExpressionFunctions.js +2 -2
  27. package/src/Utilities/Helpers/FormatHelper.js +2 -1
  28. package/src/Utilities/Services/QueryLanguageService.js +4 -4
  29. package/src/View/FormatColumn/Wizard/FormatColumnFormatWizardSection.d.ts +1 -2
  30. package/src/View/FormatColumn/Wizard/FormatColumnFormatWizardSection.js +30 -27
  31. package/src/View/Layout/LayoutViewPanel.d.ts +2 -2
  32. package/src/View/Layout/LayoutViewPanel.js +3 -4
  33. package/src/View/Layout/SaveLayoutButton.d.ts +2 -0
  34. package/src/View/Layout/SaveLayoutButton.js +30 -0
  35. package/src/agGrid/Adaptable.js +1 -1
  36. package/src/components/ExpressionEditor/BaseEditorInput.js +1 -1
  37. package/src/metamodel/adaptable.metamodel.d.ts +5 -5
  38. package/src/metamodel/adaptable.metamodel.js +1 -1
  39. package/src/parser/src/types.d.ts +4 -8
  40. package/version.d.ts +1 -1
  41. package/version.js +1 -1
@@ -78,7 +78,7 @@ const DateFormatPresets = [
78
78
  'yyyyMMdd',
79
79
  'HH:mm:ss',
80
80
  ];
81
- const getFormatColumnFormatSummaryValue = (data, formattedColumnApi) => {
81
+ const getFormatColumnFormatSummaryValue = (data, api) => {
82
82
  let content = 'N/A';
83
83
  if (!data.DisplayFormat) {
84
84
  content = 'N/A';
@@ -86,24 +86,17 @@ const getFormatColumnFormatSummaryValue = (data, formattedColumnApi) => {
86
86
  else {
87
87
  if (data.DisplayFormat.Formatter === 'NumberFormatter') {
88
88
  content = FormatHelper_1.default.NumberFormatter(12345.6789, data.DisplayFormat.Options);
89
- //formattedColumnApi.getNumberFormattedValue(12345.6789, data.DisplayFormat.Options);
90
89
  }
91
90
  if (data.DisplayFormat.Formatter === 'DateFormatter') {
92
- content = FormatHelper_1.default.DateFormatter(new Date(), data.DisplayFormat.Options);
93
- //formattedColumnApi.getDateFormattedValue(new Date(), data.DisplayFormat.Options);
91
+ content = FormatHelper_1.default.DateFormatter(new Date(2022, 0, 1), data.DisplayFormat.Options);
94
92
  }
95
93
  if (data.DisplayFormat.Formatter === 'StringFormatter') {
96
94
  content = FormatHelper_1.default.StringFormatter('Hello World ', data.DisplayFormat.Options);
97
- //formattedColumnApi.getStringFormattedValue('Hello World ', data.DisplayFormat.Options);
98
95
  }
99
96
  }
100
97
  return content;
101
98
  };
102
99
  exports.getFormatColumnFormatSummaryValue = getFormatColumnFormatSummaryValue;
103
- function splitArrayInTwo(arr) {
104
- const half = Math.floor(arr.length - 1 / 2);
105
- return [arr.slice(0, half), arr.slice(half)];
106
- }
107
100
  const renderCustomFormatter = (data, customFormatter, setFormatOption) => {
108
101
  var _a, _b, _c;
109
102
  return (React.createElement(FormLayout_1.FormRow, { key: customFormatter.id, label: (_a = customFormatter.label) !== null && _a !== void 0 ? _a : customFormatter.id },
@@ -120,7 +113,7 @@ const renderCustomFormatter = (data, customFormatter, setFormatOption) => {
120
113
  } })));
121
114
  };
122
115
  const renderFormatColumnFormatSummary = (data, api) => {
123
- return React.createElement(Tag_1.Tag, null, exports.getFormatColumnFormatSummaryValue(data, api.formatColumnApi));
116
+ return React.createElement(Tag_1.Tag, null, exports.getFormatColumnFormatSummaryValue(data, api));
124
117
  };
125
118
  exports.renderFormatColumnFormatSummary = renderFormatColumnFormatSummary;
126
119
  const getFormatDisplayTypeForScope = (scope, api) => {
@@ -157,7 +150,7 @@ const getFormatDisplayTypeForScope = (scope, api) => {
157
150
  return undefined;
158
151
  };
159
152
  exports.getFormatDisplayTypeForScope = getFormatDisplayTypeForScope;
160
- const renderDateFormat = (data, _onChange, setFormatOption, customFormatters, formatColumnApi) => {
153
+ const renderDateFormat = (data, _onChange, setFormatOption, scopedCustomFormatters, formatColumnApi) => {
161
154
  if (data.DisplayFormat.Formatter !== 'DateFormatter') {
162
155
  return null;
163
156
  }
@@ -173,9 +166,12 @@ const renderDateFormat = (data, _onChange, setFormatOption, customFormatters, fo
173
166
  React.createElement(FormLayout_1.default, null,
174
167
  React.createElement(FormLayout_1.FormRow, { label: "Pattern" },
175
168
  React.createElement(Input_1.default, { value: data.DisplayFormat.Options.Pattern, onChange: (e) => setFormatOption('Pattern', e.currentTarget.value), mr: 2 }),
176
- React.createElement("span", null, FormatHelper_1.default.DateFormatter(new Date(), data.DisplayFormat.Options))),
177
- customFormatters.map((formatter) => renderCustomFormatter(data, formatter, setFormatOption))))),
178
- React.createElement(Tabs_1.Tabs, { marginTop: 2 },
169
+ React.createElement("span", null, FormatHelper_1.default.DateFormatter(new Date(), data.DisplayFormat.Options)))))),
170
+ scopedCustomFormatters.length > 0 && (React.createElement(Tabs_1.Tabs, { marginTop: 2, keyboardNavigation: false },
171
+ React.createElement(Tabs_1.Tabs.Tab, null, "Custom Formats"),
172
+ React.createElement(Tabs_1.Tabs.Content, null,
173
+ React.createElement(FormLayout_1.default, null, scopedCustomFormatters.map((formatter) => renderCustomFormatter(data, formatter, setFormatOption)))))),
174
+ React.createElement(Tabs_1.Tabs, { marginTop: 2, keyboardNavigation: false },
179
175
  React.createElement(Tabs_1.Tabs.Tab, null, "Presets"),
180
176
  React.createElement(Tabs_1.Tabs.Content, null,
181
177
  React.createElement(AdaptableObjectRow_1.AdaptableObjectRow, { style: { fontWeight: 'bold' }, colItems: [
@@ -195,7 +191,7 @@ const renderDateFormat = (data, _onChange, setFormatOption, customFormatters, fo
195
191
  },
196
192
  ] })))))));
197
193
  };
198
- const renderNumberFormat = (data, onChange, setFormatOption, customFormatters, formatColumnApi) => {
194
+ const renderNumberFormat = (data, onChange, setFormatOption, scopedCustomFormatters, formatColumnApi) => {
199
195
  if (data.DisplayFormat.Formatter !== 'NumberFormatter') {
200
196
  return null;
201
197
  }
@@ -247,7 +243,6 @@ const renderNumberFormat = (data, onChange, setFormatOption, customFormatters, f
247
243
  data.DisplayFormat.Options.Multiplier === MILLION_OPTIONS.Multiplier; //isEqual(data.DisplayFormat.Options, MILLION_OPTIONS);
248
244
  const IS_DOLLAR = data.DisplayFormat.Options.Prefix === '$'; //isEqual(data.DisplayFormat.Options, DOLLAR_OPTIONS);
249
245
  const IS_STERLING = data.DisplayFormat.Options.Prefix === '£'; //isEqual(data.DisplayFormat, STERLING_OPTIONS);
250
- const [leftCustomFormatters, rightCustomFormatters] = splitArrayInTwo(customFormatters);
251
246
  return (React.createElement(rebass_1.Box, { "data-name": 'format-column-display-format', padding: 2 },
252
247
  React.createElement(Tabs_1.Tabs, null,
253
248
  React.createElement(Tabs_1.Tabs.Tab, null, "Format"),
@@ -261,8 +256,7 @@ const renderNumberFormat = (data, onChange, setFormatOption, customFormatters, f
261
256
  React.createElement(FormLayout_1.FormRow, { label: "Prefix" },
262
257
  React.createElement(Input_1.default, { value: data.DisplayFormat.Options.Prefix, onChange: (e) => setFormatOption('Prefix', e.currentTarget.value) })),
263
258
  React.createElement(FormLayout_1.FormRow, { label: "Suffix" },
264
- React.createElement(Input_1.default, { value: data.DisplayFormat.Options.Suffix, onChange: (e) => setFormatOption('Suffix', e.currentTarget.value) })),
265
- leftCustomFormatters.map((formatter) => renderCustomFormatter(data, formatter, setFormatOption))),
259
+ React.createElement(Input_1.default, { value: data.DisplayFormat.Options.Suffix, onChange: (e) => setFormatOption('Suffix', e.currentTarget.value) }))),
266
260
  React.createElement(FormLayout_1.default, null,
267
261
  React.createElement(FormLayout_1.FormRow, { label: "Fraction Digits" },
268
262
  React.createElement(Input_1.default, { type: "number", min: "0",
@@ -279,8 +273,12 @@ const renderNumberFormat = (data, onChange, setFormatOption, customFormatters, f
279
273
  React.createElement(FormLayout_1.FormRow, { label: "Parentheses" },
280
274
  React.createElement(CheckBox_1.CheckBox, { checked: data.DisplayFormat.Options.Parentheses, onChange: (checked) => setFormatOption('Parentheses', checked) })),
281
275
  React.createElement(FormLayout_1.FormRow, { label: "Truncate" },
282
- React.createElement(CheckBox_1.CheckBox, { checked: data.DisplayFormat.Options.Truncate, onChange: (checked) => setFormatOption('Truncate', checked) })),
283
- rightCustomFormatters.map((formatter) => renderCustomFormatter(data, formatter, setFormatOption)))))),
276
+ React.createElement(CheckBox_1.CheckBox, { checked: data.DisplayFormat.Options.Truncate, onChange: (checked) => setFormatOption('Truncate', checked) })))))),
277
+ scopedCustomFormatters.length > 0 && (React.createElement(Tabs_1.Tabs, { marginTop: 2, keyboardNavigation: false },
278
+ React.createElement(Tabs_1.Tabs.Tab, null, "Custom Formats"),
279
+ React.createElement(Tabs_1.Tabs.Content, null,
280
+ React.createElement(rebass_1.Flex, { flexDirection: "row" },
281
+ React.createElement(FormLayout_1.default, null, scopedCustomFormatters.map((formatter) => renderCustomFormatter(data, formatter, setFormatOption))))))),
284
282
  React.createElement(Tabs_1.Tabs, { marginTop: 2, autoFocus: false, keyboardNavigation: false },
285
283
  React.createElement(Tabs_1.Tabs.Tab, null, "Presets"),
286
284
  React.createElement(Tabs_1.Tabs.Content, null,
@@ -322,10 +320,11 @@ const renderNumberFormat = (data, onChange, setFormatOption, customFormatters, f
322
320
  },
323
321
  ] })))));
324
322
  };
325
- const renderStringFormat = (data, _onChange, setFormatOption, customFormatters, formatColumnApi) => {
323
+ const renderStringFormat = (data, _onChange, setFormatOption, scopedCustomFormatters, formatColumnApi) => {
326
324
  if (data.DisplayFormat.Formatter !== 'StringFormatter') {
327
325
  return null;
328
326
  }
327
+ console.log('formatters', scopedCustomFormatters);
329
328
  return (React.createElement(rebass_1.Box, { "data-name": 'format-column-display-format', padding: 2 },
330
329
  React.createElement(Tabs_1.Tabs, null,
331
330
  React.createElement(Tabs_1.Tabs.Tab, null, "Format"),
@@ -341,8 +340,12 @@ const renderStringFormat = (data, _onChange, setFormatOption, customFormatters,
341
340
  React.createElement(FormLayout_1.FormRow, { label: "Prefix" },
342
341
  React.createElement(Input_1.default, { value: data.DisplayFormat.Options.Prefix, onChange: (e) => setFormatOption('Prefix', e.currentTarget.value) })),
343
342
  React.createElement(FormLayout_1.FormRow, { label: "Suffix" },
344
- React.createElement(Input_1.default, { value: data.DisplayFormat.Options.Suffix, onChange: (e) => setFormatOption('Suffix', e.currentTarget.value) })),
345
- customFormatters.map((formatter) => renderCustomFormatter(data, formatter, setFormatOption)))))),
343
+ React.createElement(Input_1.default, { value: data.DisplayFormat.Options.Suffix, onChange: (e) => setFormatOption('Suffix', e.currentTarget.value) })))))),
344
+ scopedCustomFormatters.length > 0 && (React.createElement(Tabs_1.Tabs, { marginTop: 2, keyboardNavigation: false },
345
+ React.createElement(Tabs_1.Tabs.Tab, null, "Custom Formats"),
346
+ React.createElement(Tabs_1.Tabs.Content, null,
347
+ React.createElement(rebass_1.Flex, { flexDirection: "column" },
348
+ React.createElement(FormLayout_1.default, { mr: 3 }, scopedCustomFormatters.map((formatter) => renderCustomFormatter(data, formatter, setFormatOption))))))),
346
349
  React.createElement(Tabs_1.Tabs, { marginTop: 2, keyboardNavigation: false },
347
350
  React.createElement(Tabs_1.Tabs.Tab, null, "Example"),
348
351
  React.createElement(Tabs_1.Tabs.Content, null,
@@ -376,15 +379,15 @@ const FormatColumnFormatWizardSection = (props) => {
376
379
  update({ DisplayFormat });
377
380
  };
378
381
  const Type = data.DisplayFormat && data.DisplayFormat.Formatter;
379
- const customNumberFormatters = customDisplayFormatters.filter((displayFormatter) => adaptable.api.scopeApi.isScopeInScope(displayFormatter.scope, data.Scope));
382
+ const customScopedFormatters = customDisplayFormatters.filter((displayFormatter) => adaptable.api.scopeApi.isScopeInScope(displayFormatter.scope, data.Scope));
380
383
  if (Type === 'NumberFormatter') {
381
- return renderNumberFormat(data, update, setFormatOption, customNumberFormatters, formatColumnApi);
384
+ return renderNumberFormat(data, update, setFormatOption, customScopedFormatters, formatColumnApi);
382
385
  }
383
386
  if (Type === 'DateFormatter') {
384
- return renderDateFormat(data, update, setFormatOption, customNumberFormatters, formatColumnApi);
387
+ return renderDateFormat(data, update, setFormatOption, customScopedFormatters, formatColumnApi);
385
388
  }
386
389
  if (Type === 'StringFormatter') {
387
- return renderStringFormat(data, update, setFormatOption, customNumberFormatters, formatColumnApi);
390
+ return renderStringFormat(data, update, setFormatOption, customScopedFormatters, formatColumnApi);
388
391
  }
389
392
  return (React.createElement(HelpBlock_1.default, { margin: 3 },
390
393
  "Setting a Display Format is only available if ",
@@ -1,7 +1,7 @@
1
+ import * as React from 'react';
1
2
  import { ViewPanelProps } from '../Components/SharedProps/ViewPanelProps';
2
- import * as LayoutRedux from '../../Redux/ActionsReducers/LayoutRedux';
3
3
  import { Layout } from '../../PredefinedConfig/LayoutState';
4
- import * as React from 'react';
4
+ import * as LayoutRedux from '../../Redux/ActionsReducers/LayoutRedux';
5
5
  export declare const COMPONENT_LAYOUT_POPUP_NAME = "LayoutEditorStandalonePopup";
6
6
  export interface LayoutViewPanelComponentProps extends ViewPanelProps {
7
7
  onSelectLayout: (layoutName: string) => LayoutRedux.LayoutSelectAction;
@@ -2,8 +2,8 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.LayoutViewPanelControl = exports.COMPONENT_LAYOUT_POPUP_NAME = void 0;
4
4
  const tslib_1 = require("tslib");
5
- const LayoutRedux = tslib_1.__importStar(require("../../Redux/ActionsReducers/LayoutRedux"));
6
5
  const React = tslib_1.__importStar(require("react"));
6
+ const react_redux_1 = require("react-redux");
7
7
  const AdaptableHelper_1 = tslib_1.__importDefault(require("../../Utilities/Helpers/AdaptableHelper"));
8
8
  const rebass_1 = require("rebass");
9
9
  const DropdownButton_1 = tslib_1.__importDefault(require("../../components/DropdownButton"));
@@ -13,9 +13,9 @@ const ButtonSave_1 = require("../Components/Buttons/ButtonSave");
13
13
  const ButtonEdit_1 = require("../Components/Buttons/ButtonEdit");
14
14
  const ButtonNew_1 = require("../Components/Buttons/ButtonNew");
15
15
  const ButtonDelete_1 = require("../Components/Buttons/ButtonDelete");
16
- const react_redux_1 = require("react-redux");
17
16
  const ButtonClone_1 = require("../Components/Buttons/ButtonClone");
18
17
  const GridRedux = tslib_1.__importStar(require("../../Redux/ActionsReducers/GridRedux"));
18
+ const LayoutRedux = tslib_1.__importStar(require("../../Redux/ActionsReducers/LayoutRedux"));
19
19
  exports.COMPONENT_LAYOUT_POPUP_NAME = 'LayoutEditorStandalonePopup';
20
20
  class LayoutViewPanelComponent extends React.Component {
21
21
  render() {
@@ -55,8 +55,7 @@ function mapStateToProps(state, ownProps) {
55
55
  CurrentLayoutName,
56
56
  CurrentDraftLayout: state.Grid.CurrentLayout || selectedLayout,
57
57
  Layouts,
58
- CanSave: state.Grid.CurrentLayout &&
59
- !api.layoutApi.areLayoutsEqual(selectedLayout, state.Grid.CurrentLayout),
58
+ CanSave: state.Grid.CurrentLayout && !api.layoutApi.areDraftAndCurrentLayoutEqual(),
60
59
  };
61
60
  }
62
61
  function mapDispatchToProps(dispatch) {
@@ -0,0 +1,2 @@
1
+ import * as React from 'react';
2
+ export declare const SaveLayoutButton: React.FunctionComponent;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SaveLayoutButton = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const React = tslib_1.__importStar(require("react"));
6
+ const react_redux_1 = require("react-redux");
7
+ const AdaptableContext_1 = require("../AdaptableContext");
8
+ const ButtonSave_1 = require("../Components/Buttons/ButtonSave");
9
+ const GridRedux = tslib_1.__importStar(require("../../Redux/ActionsReducers/GridRedux"));
10
+ const LayoutRedux = tslib_1.__importStar(require("../../Redux/ActionsReducers/LayoutRedux"));
11
+ const ModuleConstants = tslib_1.__importStar(require("../../Utilities/Constants/ModuleConstants"));
12
+ const SaveLayoutButton = () => {
13
+ const adaptable = AdaptableContext_1.useAdaptable();
14
+ const accessLevel = adaptable.api.internalApi
15
+ .getEntitlementService()
16
+ .getEntitlementAccessLevelForModule(ModuleConstants.LayoutModuleId);
17
+ const dispatch = react_redux_1.useDispatch();
18
+ const currentDraftLayout = react_redux_1.useSelector((state) => state.Grid.CurrentLayout);
19
+ const isManualSaveLayout = !adaptable.api.layoutApi.shouldAutoSaveLayout(currentDraftLayout);
20
+ const handleSave = React.useCallback((layout) => {
21
+ dispatch(LayoutRedux.LayoutSave(layout));
22
+ dispatch(GridRedux.LayoutUpdateCurrentDraft(null));
23
+ }, []);
24
+ const isSaveEnabled = currentDraftLayout && !adaptable.api.layoutApi.areDraftAndCurrentLayoutEqual();
25
+ if (!isManualSaveLayout) {
26
+ return React.createElement(React.Fragment, null);
27
+ }
28
+ return (React.createElement(ButtonSave_1.ButtonSave, { ml: 1, variant: "text", iconSize: 15, onClick: () => handleSave(currentDraftLayout), tooltip: "Save Changes to Current Layout", disabled: !isSaveEnabled, accessLevel: accessLevel }));
29
+ };
30
+ exports.SaveLayoutButton = SaveLayoutButton;
@@ -2760,7 +2760,7 @@ class Adaptable {
2760
2760
  all_modules_1.Events.EVENT_ROW_GROUP_OPENED,
2761
2761
  all_modules_1.Events.EVENT_COLUMN_VALUE_CHANGED,
2762
2762
  ];
2763
- // no need to add filter event, it is handled by AdaptableStore side-effects
2763
+ // ADD filter event
2764
2764
  this.gridOptions.api.addGlobalListener((this.listenerGlobalColumnEventsThatTriggerAutoLayoutSave = (type) => {
2765
2765
  if (columnEventsThatTriggersAutoLayoutSave.indexOf(type) > -1) {
2766
2766
  this.debouncedSaveGridLayout();
@@ -51,7 +51,7 @@ function BaseEditorInput(props) {
51
51
  result = expr.evaluate({
52
52
  // we need a fully-fledged rowNode as Adaptable accesses internal methods of it
53
53
  node: testRowNode,
54
- api: props.api,
54
+ adaptableApi: props.api,
55
55
  functions: expressionFunctions,
56
56
  });
57
57
  }
@@ -2544,22 +2544,22 @@ export declare const ADAPTABLE_METAMODEL: {
2544
2544
  kind: string;
2545
2545
  description: string;
2546
2546
  uiLabel: string;
2547
- reference: string;
2548
- isOptional?: undefined;
2547
+ isOptional: boolean;
2548
+ reference?: undefined;
2549
2549
  } | {
2550
2550
  name: string;
2551
2551
  kind: string;
2552
2552
  description: string;
2553
2553
  uiLabel: string;
2554
- isOptional: boolean;
2555
- reference?: undefined;
2554
+ reference: string;
2555
+ isOptional?: undefined;
2556
2556
  } | {
2557
2557
  name: string;
2558
2558
  kind: string;
2559
2559
  description: string;
2560
2560
  uiLabel: string;
2561
- reference?: undefined;
2562
2561
  isOptional?: undefined;
2562
+ reference?: undefined;
2563
2563
  } | {
2564
2564
  name: string;
2565
2565
  kind: string;