@adaptabletools/adaptable 22.0.7 → 22.0.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 (65) hide show
  1. package/index.css +19 -1
  2. package/index.css.map +1 -1
  3. package/package.json +1 -1
  4. package/src/AdaptableOptions/FilterOptions.d.ts +23 -5
  5. package/src/AdaptableState/Common/CellDataChangedInfo.d.ts +4 -0
  6. package/src/AdaptableState/Common/ColumnScope.d.ts +4 -0
  7. package/src/AdaptableState/Common/ColumnScope.js +12 -1
  8. package/src/Api/Implementation/StateApiImpl.d.ts +1 -1
  9. package/src/Api/Implementation/StateApiImpl.js +12 -15
  10. package/src/Api/StateApi.d.ts +1 -1
  11. package/src/Redux/Store/AdaptableReduxMerger.js +4 -1
  12. package/src/Redux/Store/AdaptableStore.d.ts +2 -1
  13. package/src/Redux/Store/AdaptableStore.js +12 -8
  14. package/src/Redux/Store/Interface/IAdaptableStore.d.ts +1 -1
  15. package/src/Strategy/CalculatedColumnModule.js +1 -1
  16. package/src/Strategy/ColumnFilterModule.js +4 -2
  17. package/src/Strategy/DataChangeHistoryModule.js +3 -1
  18. package/src/Strategy/FlashingCellModule.js +1 -1
  19. package/src/Strategy/FreeTextColumnModule.js +1 -1
  20. package/src/Utilities/Services/DataService.js +6 -0
  21. package/src/View/Alert/Wizard/AlertScopeWizardSection.js +10 -3
  22. package/src/View/CalculatedColumn/Wizard/CalculatedColumnDefinitionWizardSection.js +8 -8
  23. package/src/View/CalculatedColumn/Wizard/CalculatedColumnTypeSection.js +1 -1
  24. package/src/View/CalculatedColumn/Wizard/CalculatedColumnWizard.js +4 -2
  25. package/src/View/Components/ColumnFilter/components/FloatingFilterValues.js +1 -0
  26. package/src/View/Components/ColumnGroupTag/index.d.ts +5 -0
  27. package/src/View/Components/ColumnGroupTag/index.js +9 -0
  28. package/src/View/Components/ColumnSelector/index.js +4 -1
  29. package/src/View/Components/FilterForm/ListBoxFilterForm.js +9 -2
  30. package/src/View/Components/NewScopeComponent.js +19 -37
  31. package/src/View/Components/ReorderDraggable/index.d.ts +1 -0
  32. package/src/View/Components/ReorderDraggable/index.js +2 -1
  33. package/src/View/CustomSort/Wizard/CustomSortColumnWizardSection.js +7 -1
  34. package/src/View/CustomSort/Wizard/CustomSortWizard.js +1 -1
  35. package/src/View/FlashingCell/Wizard/FlashingCellScopeWizardSection.js +10 -3
  36. package/src/View/FormatColumn/Wizard/FormatColumnColumnScopeWizardSection.js +14 -7
  37. package/src/View/FormatColumn/Wizard/FormatColumnRuleWizardSection.js +1 -3
  38. package/src/View/FormatColumn/Wizard/FormatColumnWizard.js +1 -3
  39. package/src/View/FreeTextColumn/Wizard/FreeTextColumnSettingsWizardSection.d.ts +1 -1
  40. package/src/View/FreeTextColumn/Wizard/FreeTextColumnSettingsWizardSection.js +7 -7
  41. package/src/View/Layout/Wizard/LayoutWizard.js +2 -2
  42. package/src/View/Layout/Wizard/sections/AggregationsSection.js +2 -0
  43. package/src/View/Layout/Wizard/sections/ColumnsSection.js +149 -140
  44. package/src/View/Layout/Wizard/sections/FilterSection.js +8 -1
  45. package/src/View/Layout/Wizard/sections/PivotAggregationsSection.js +2 -0
  46. package/src/View/Layout/Wizard/sections/PivotRowGroupingSection.js +5 -2
  47. package/src/View/Layout/Wizard/sections/RowGroupingSection.js +4 -1
  48. package/src/View/Layout/Wizard/sections/RowSummarySection.js +8 -3
  49. package/src/View/Layout/Wizard/sections/SortSection.js +4 -2
  50. package/src/View/StyledColumn/Wizard/StyledColumnWizardColumnSection.js +8 -2
  51. package/src/View/Wizard/OnePageAdaptableWizard.d.ts +0 -1
  52. package/src/View/Wizard/OnePageAdaptableWizard.js +1 -1
  53. package/src/View/Wizard/OnePageWizards.d.ts +1 -0
  54. package/src/View/Wizard/OnePageWizards.js +11 -4
  55. package/src/agGrid/AdaptableAgGrid.js +18 -30
  56. package/src/agGrid/AgGridAdapter.d.ts +1 -0
  57. package/src/agGrid/AgGridAdapter.js +4 -0
  58. package/src/agGrid/AgGridColumnAdapter.js +3 -3
  59. package/src/agGrid/AgGridExportAdapter.js +1 -3
  60. package/src/components/Tree/TreeDropdown/index.d.ts +9 -0
  61. package/src/components/Tree/TreeDropdown/index.js +20 -1
  62. package/src/components/Tree/TreeList/index.d.ts +1 -1
  63. package/src/env.js +2 -2
  64. package/src/metamodel/adaptable.metamodel.js +1 -1
  65. package/tsconfig.esm.tsbuildinfo +1 -1
@@ -40,6 +40,7 @@ export interface OnePageWizardProps<ENTITY> {
40
40
  closeText?: React.ReactNode;
41
41
  closeTooltip?: string;
42
42
  finishText?: React.ReactNode;
43
+ moduleName?: string;
43
44
  }
44
45
  export declare const OnePageWizard: <ENTITY extends unknown>(props: OnePageWizardProps<ENTITY>) => React.JSX.Element;
45
46
  export {};
@@ -13,6 +13,8 @@ import { useKeyboardNavigation } from './useKeyboardNavigation';
13
13
  import { Box, Flex } from '../../components/Flex';
14
14
  import { twMerge } from '../../twMerge';
15
15
  import { targetOwn } from '../../components/twUtils';
16
+ /** Same template for header row and main row so module/details align with nav / content columns. */
17
+ const ONE_PAGE_WIZARD_SECTION_GRID = 'twa:grid twa:grid-cols-[minmax(160px,14rem)_minmax(0,1fr)]';
16
18
  export const SummaryTag = (props) => (React.createElement(Box, { ...props }));
17
19
  export const SummaryText = (props) => (React.createElement(Box, { ...props, className: twMerge('twa:text-2 twa:mb-3', props.className) }));
18
20
  export const FormDescriptionText = (props) => React.createElement(Box, { ...props, className: twMerge('twa:text-2 twa:mt-1', props.className) });
@@ -63,7 +65,6 @@ export const OnePageWizard = (props) => {
63
65
  return React.createElement(React.Fragment, { key: index });
64
66
  }
65
67
  return (React.createElement(Flex, { flexDirection: "column", key: index, "data-name": `section-${index}`, className: "twa:min-h-full twa:mr-2" },
66
- React.createElement(Box, { className: "ab-OnePageWizard__details twa:text-4 twa:py-3 twa:pl-2" }, section.details),
67
68
  React.createElement(Box, { className: "ab-OnePageWizard__section twa:flex-1 twa:rounded-standard twa:overflow-auto twa:bg-defaultbackground" }, section.render(props.data, index))));
68
69
  };
69
70
  const handleNavigation = useKeyboardNavigation(setCurrentSection, visibleSections);
@@ -104,6 +105,8 @@ export const OnePageWizard = (props) => {
104
105
  return acc;
105
106
  }, new Map());
106
107
  const canFinish = !invalidCount;
108
+ const activeSection = visibleSections[currentSection];
109
+ const activeSectionDetails = activeSection !== '-' ? activeSection?.details : undefined;
107
110
  return (React.createElement(NamedQueryContext.Provider, { value: { namedQuery, setNamedQuery } },
108
111
  React.createElement(OnePageWizardContext.Provider, { value: contextValue },
109
112
  React.createElement(Dialog, { modal: props.modal ?? true, isOpen: true, showCloseButton: false, focusOnBrowserVisible: true, className: "twa:rounded-standard twa:overflow-hidden twa:h-[90vh]", ref: dialogRef, onDismiss: () => props.onHide?.(), onKeyDown: (event) => {
@@ -124,8 +127,12 @@ export const OnePageWizard = (props) => {
124
127
  }
125
128
  } },
126
129
  React.createElement(Box, { className: clsx('ab-OnePageWizard twa:flex twa:flex-col twa:h-full twa:w-[90vw] twa:max-w-[1200px]', 'twa:bg-primarylight twa:text-primary-foreground'), "data-name": props.name, style: props.style },
127
- React.createElement(Flex, { flexDirection: "row", alignItems: "stretch", className: "twa:flex-1 twa:overflow-auto" },
128
- React.createElement(Flex, { flexDirection: "column", className: "ab-OnePageWizard__section-title-container twa:p-3 twa:flex-none twa:overflow-auto twa:relative", ref: sizeOwnerRef, style: props.titleContainerStyle },
130
+ (props.moduleName || activeSectionDetails) && (React.createElement(Box, { className: clsx('ab-OnePageWizard__header', ONE_PAGE_WIZARD_SECTION_GRID, 'twa:items-start twa:mt-4 twa:mb-2 twa:px-2') },
131
+ React.createElement(Box, { className: "ab-OnePageWizard__module-name twa:min-w-0 twa:pl-3 twa:font-bold" }, props.moduleName),
132
+ React.createElement(Box, { className: "ab-OnePageWizard__details twa:min-w-0 twa:pr-2 twa:text-4" }, activeSectionDetails))),
133
+ React.createElement(Box, { as: "hr", className: "ab-OnePageWizard__module-separator twa:w-full twa:border-0 twa:border-t twa:border-t-inputborder" }),
134
+ React.createElement(Box, { className: clsx(ONE_PAGE_WIZARD_SECTION_GRID, 'twa:flex-1 twa:min-h-0 twa:overflow-auto twa:items-stretch') },
135
+ React.createElement(Flex, { flexDirection: "column", className: "ab-OnePageWizard__section-title-container twa:min-h-0 twa:min-w-0 twa:overflow-auto twa:p-3 twa:relative", ref: sizeOwnerRef, style: props.titleContainerStyle },
129
136
  visibleSections.map((section, index) => {
130
137
  if (section === '-') {
131
138
  return (React.createElement(Box, { as: "hr", className: "ab-OnePageWizard__section-separator twa:mt-2 twa:w-full twa:border-t twa:border-t-inputborder", key: `${index}-` }));
@@ -167,7 +174,7 @@ export const OnePageWizard = (props) => {
167
174
  "or arrow keys",
168
175
  React.createElement("br", null),
169
176
  "to navigate")),
170
- React.createElement(Flex, { flexDirection: "column", className: "ab-OnePageWizard__section-container twa:flex-1" }, renderSection(currentSection))),
177
+ React.createElement(Flex, { flexDirection: "column", className: "ab-OnePageWizard__section-container twa:min-h-0 twa:min-w-0 twa:flex-1" }, renderSection(currentSection))),
171
178
  React.createElement(Flex, { flexDirection: "row", alignItems: "center", className: "ab-WizardDialog__footer ab-OnePageWizard__footer twa:p-2" },
172
179
  React.createElement(SimpleButton, { tone: "neutral", variant: "text", "data-name": "close", onClick: () => props.onHide?.(), tooltip: props.closeTooltip ?? 'Close wizard', accessLevel: 'Full' }, props.closeText ?? 'CLOSE'),
173
180
  React.createElement(KeyHint, { className: "twa:ml-2" }, "Esc"),
@@ -1020,7 +1020,7 @@ export class AdaptableAgGrid {
1020
1020
  }
1021
1021
  return (params) => {
1022
1022
  // might be a summary row
1023
- if (params.data?.[ROW_SUMMARY_ROW_ID]) {
1023
+ if (params.data?.[ROW_SUMMARY_ROW_ID] != undefined) {
1024
1024
  return params.data[ROW_SUMMARY_ROW_ID];
1025
1025
  }
1026
1026
  if (params.level > 0) {
@@ -1036,7 +1036,7 @@ export class AdaptableAgGrid {
1036
1036
  const id = [...parentKeys, Math.abs(hash)].join('/');
1037
1037
  return id;
1038
1038
  }
1039
- if (params.data?.[primaryKey]) {
1039
+ if (params.data?.[primaryKey] != undefined) {
1040
1040
  const primaryKeyValue = params.data[primaryKey];
1041
1041
  return typeof primaryKeyValue === 'number'
1042
1042
  ? `${primaryKeyValue}`
@@ -2154,38 +2154,16 @@ export class AdaptableAgGrid {
2154
2154
  }
2155
2155
  const colDef = this.agGridAdapter.getAgGridApi().getColumnDef(columnId);
2156
2156
  if (colDef) {
2157
- if (typeof colDef.valueFormatter == 'function') {
2158
- const column = this.agGridAdapter.getAgGridApi().getColumn(columnId);
2159
- const params = {
2160
- value: rawValue,
2161
- node: rowNode,
2162
- data: rowNode.data,
2163
- colDef,
2164
- column,
2165
- api: this.agGridAdapter.getAgGridApi(),
2166
- context: this.agGridAdapter.getGridOption('context'),
2167
- };
2168
- const formattedValue = colDef.valueFormatter(params);
2169
- return formattedValue || '';
2170
- }
2157
+ const formattedValue = this.agGridAdapter._agGridApi_getFormattedValue(columnId, rowNode);
2158
+ return formattedValue || '';
2171
2159
  }
2172
- else if (this.api.columnApi.isPivotResultColumn(columnId)) {
2160
+ if (this.api.columnApi.isPivotResultColumn(columnId)) {
2173
2161
  const pivotResultColumn = this.agGridAdapter
2174
2162
  .getAgGridApi()
2175
2163
  .getPivotResultColumns()
2176
2164
  .find((col) => col.getColId() === columnId);
2177
- const pivotResultColDef = pivotResultColumn?.getColDef();
2178
- if (pivotResultColDef && typeof pivotResultColDef.valueFormatter === 'function') {
2179
- const params = {
2180
- value: rawValue,
2181
- node: rowNode,
2182
- data: rowNode.data,
2183
- colDef: pivotResultColDef,
2184
- column: pivotResultColumn,
2185
- api: this.agGridAdapter.getAgGridApi(),
2186
- context: this.agGridAdapter.getGridOption('context'),
2187
- };
2188
- const formattedValue = pivotResultColDef.valueFormatter(params);
2165
+ if (pivotResultColumn) {
2166
+ const formattedValue = this.agGridAdapter._agGridApi_getFormattedValue(pivotResultColumn, rowNode);
2189
2167
  return formattedValue || '';
2190
2168
  }
2191
2169
  }
@@ -2773,7 +2751,9 @@ export class AdaptableAgGrid {
2773
2751
  const result = gridApiInternal
2774
2752
  .sortDistinctValues(getCurrentGridCells(), column)
2775
2753
  .map((gridCell) => {
2754
+ const itemId = `${gridCell.rowNode?.id}-${gridCell.column?.columnId}`;
2776
2755
  return {
2756
+ id: itemId,
2777
2757
  label: gridCell.displayValue,
2778
2758
  value: gridCell.rawValue,
2779
2759
  isSelected: gridCell.rowNode.displayed,
@@ -2799,7 +2779,9 @@ export class AdaptableAgGrid {
2799
2779
  },
2800
2780
  get defaultValues() {
2801
2781
  const result = getCurrentGridCells().map((gridCell) => {
2782
+ const itemId = `${gridCell.rowNode?.id}-${gridCell.column?.columnId}`;
2802
2783
  return {
2784
+ id: itemId,
2803
2785
  label: gridCell.displayValue,
2804
2786
  value: gridCell.rawValue,
2805
2787
  isSelected: gridCell.rowNode.displayed,
@@ -2827,7 +2809,9 @@ export class AdaptableAgGrid {
2827
2809
  const rowNodes = gridApiInternal.getSortedRowNodesWithCurrentLayoutSortOrder();
2828
2810
  const currentGridCells = self.getDistinctGridCellsForColumn(column, rowNodes);
2829
2811
  const result = currentGridCells.map((gridCell) => {
2812
+ const itemId = `${gridCell.rowNode?.id}-${gridCell.column?.columnId}`;
2830
2813
  return {
2814
+ id: itemId,
2831
2815
  label: gridCell.displayValue,
2832
2816
  value: gridCell.rawValue,
2833
2817
  isSelected: gridCell.rowNode.displayed,
@@ -3730,7 +3714,11 @@ export class AdaptableAgGrid {
3730
3714
  }
3731
3715
  const distinctRawValues = this.api.gridApi.internalApi
3732
3716
  .getUnsortedDistinctRawValuesForColumn(columnId)
3733
- .map((item) => item.rawValue);
3717
+ .map((item) => item.rawValue)
3718
+ .filter((v) => typeof v === 'number' && !isNaN(v));
3719
+ if (distinctRawValues.length === 0) {
3720
+ return undefined;
3721
+ }
3734
3722
  value = minMax === 'min' ? Math.min(...distinctRawValues) : Math.max(...distinctRawValues);
3735
3723
  this.columnMinMaxValuesCache[columnId] = {
3736
3724
  ...this.columnMinMaxValuesCache[columnId],
@@ -81,4 +81,5 @@ export declare class AgGridAdapter {
81
81
  traverseColDefs(colDefs: (ColDef | ColGroupDef)[], modifyFn: (colDef: ColDef) => ColDef | null): (ColDef | ColGroupDef)[];
82
82
  getDefaultColumnDefinition(): GridOptions['defaultColDef'];
83
83
  _agGridApi_getValue(colKey: string | Column, rowNode: IRowNode, gridApi?: GridApi): any;
84
+ _agGridApi_getFormattedValue(colKey: string | Column, rowNode: IRowNode, gridApi?: GridApi): any;
84
85
  }
@@ -835,4 +835,8 @@ export class AgGridAdapter {
835
835
  gridApi = gridApi || this.getAgGridApi();
836
836
  return gridApi.getCellValue({ colKey, rowNode });
837
837
  }
838
+ _agGridApi_getFormattedValue(colKey, rowNode, gridApi) {
839
+ gridApi = gridApi || this.getAgGridApi();
840
+ return gridApi.getCellValue({ colKey, rowNode, useFormatter: true });
841
+ }
838
842
  }
@@ -1194,8 +1194,8 @@ export class AgGridColumnAdapter {
1194
1194
  getStyledColumnStyle(styledColumn, abColumn, params) {
1195
1195
  let style = {};
1196
1196
  const gradientStyle = styledColumn?.GradientStyle;
1197
- if (params.value === undefined) {
1198
- return;
1197
+ if (params.value == undefined || params.value === '') {
1198
+ return style;
1199
1199
  }
1200
1200
  let colValue = params.value;
1201
1201
  if (this.adaptableApi.gridApi.isGroupRowNode(params.node)) {
@@ -1311,7 +1311,7 @@ export class AgGridColumnAdapter {
1311
1311
  const columnHighlight = this.adaptableApi.internalApi
1312
1312
  .getInternalState()
1313
1313
  .ColumnHighlightInfo.find((columnHighlightInfo) => {
1314
- return (gridCell.column.columnId === columnHighlightInfo.columnId);
1314
+ return gridCell.column.columnId === columnHighlightInfo.columnId;
1315
1315
  });
1316
1316
  if (columnHighlight) {
1317
1317
  return convertAdaptableStyleToCSS(columnHighlight.highlightStyle);
@@ -430,9 +430,7 @@ export class AgGridExportAdapter {
430
430
  }
431
431
  const getColIdAndRawValue = () => {
432
432
  if (this.adaptableApi.columnApi.isAutoRowGroupColumn(agColumn?.getColId())) {
433
- const columnId = rowNode.rowGroupColumn?.getColId() ??
434
- rowNode.rowGroupColumn?.getColDef()?.field ??
435
- rowNode.field;
433
+ const columnId = agColumn.getColId();
436
434
  let rawValue = rowNode.key;
437
435
  return { columnId, rawValue };
438
436
  }
@@ -24,4 +24,13 @@ export type TreeDropdownProps<T extends TreeListItem<any>> = {
24
24
  clearable?: boolean;
25
25
  };
26
26
  export declare function toDisplayValueDefault(value: any[][] | string[]): string;
27
+ /**
28
+ * Formats the closed TreeDropdown input using each option's `label` for the stored `value` path
29
+ * segments (same shape as {@link toDisplayValueDefault}, but resolves raw values to labels).
30
+ */
31
+ export declare function toDisplayValueFromOptionTree<T extends {
32
+ value: any;
33
+ label: string;
34
+ children?: T[];
35
+ }>(paths: any[][] | string[], options: T[]): string;
27
36
  export declare function TreeDropdown<T extends TreeListItem<any>>(props: TreeDropdownProps<T>): React.JSX.Element;
@@ -23,6 +23,25 @@ export function toDisplayValueDefault(value) {
23
23
  }
24
24
  return value.map((v) => (Array.isArray(v) ? v.join('-') : v)).join(', ');
25
25
  }
26
+ /**
27
+ * Formats the closed TreeDropdown input using each option's `label` for the stored `value` path
28
+ * segments (same shape as {@link toDisplayValueDefault}, but resolves raw values to labels).
29
+ */
30
+ export function toDisplayValueFromOptionTree(paths, options) {
31
+ const valueToLabel = new Map();
32
+ const walk = (node) => {
33
+ valueToLabel.set(node.value, node.label);
34
+ if (Array.isArray(node.children)) {
35
+ node.children.forEach(walk);
36
+ }
37
+ };
38
+ options.forEach(walk);
39
+ return paths
40
+ .map((path) => Array.isArray(path)
41
+ ? path.map((segment) => valueToLabel.get(segment) ?? String(segment)).join('-')
42
+ : valueToLabel.get(path) ?? String(path))
43
+ .join(', ');
44
+ }
26
45
  const getLabelColumn = (field, { includeExpandCollapseButton }) => {
27
46
  return {
28
47
  field,
@@ -249,7 +268,7 @@ export function TreeDropdown(props) {
249
268
  } }, children));
250
269
  } },
251
270
  React.createElement(FieldWrap, { style: props.fieldStyle, className: "twa:w-full" },
252
- React.createElement(Input, { type: "text", readOnly: true, "data-name": "Select Values", "aria-expanded": visible, placeholder: props.placeholder ?? 'Select a value', className: `twa:w-full ${props.clearable ? 'twa:pr-0' : ''}`, value: props.toDisplayValue ? props.toDisplayValue(value) : toDisplayValueDefault(value), onFocus: () => {
271
+ React.createElement(Input, { type: "text", readOnly: true, "data-name": "Select Values", "aria-expanded": visible, placeholder: props.placeholder ?? 'Select...', className: `twa:w-full ${props.clearable ? 'twa:pr-0' : ''}`, value: props.toDisplayValue ? props.toDisplayValue(value) : toDisplayValueDefault(value), onFocus: () => {
253
272
  if (!visible) {
254
273
  setVisible(true);
255
274
  }
@@ -1,7 +1,7 @@
1
1
  import * as React from 'react';
2
2
  import { DataSourcePropOnTreeSelectionChange_MultiNode, InfiniteTableProps, TreeDataSourceProps } from '../../InfiniteTable';
3
3
  export type TreeListItem<T = any> = {
4
- id: string | number;
4
+ id?: string | number;
5
5
  label: string;
6
6
  children?: TreeListItem<T>[];
7
7
  };
package/src/env.js CHANGED
@@ -1,5 +1,5 @@
1
1
  export default {
2
2
  NEXT_PUBLIC_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: 1774369234081 || Date.now(),
4
- VERSION: "22.0.7" || '--current-version--',
3
+ PUBLISH_TIMESTAMP: 1775641544194 || Date.now(),
4
+ VERSION: "22.0.9" || '--current-version--',
5
5
  };