@adaptabletools/adaptable-cjs 23.0.0-canary.1 → 23.0.0-canary.3

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 (80) hide show
  1. package/index.css +130 -137
  2. package/package.json +1 -1
  3. package/src/AdaptableOptions/UserInterfaceOptions.d.ts +1 -3
  4. package/src/AdaptableState/Common/AdaptableFormat.d.ts +1 -1
  5. package/src/AdaptableState/LayoutState.d.ts +5 -4
  6. package/src/AdaptableState/StyledColumnState.d.ts +7 -16
  7. package/src/AdaptableState/StyledColumnState.js +10 -0
  8. package/src/Api/EventApi.d.ts +1 -1
  9. package/src/Api/Events/ReportScheduleRan.d.ts +4 -0
  10. package/src/Api/Internal/EventInternalApi.js +2 -1
  11. package/src/View/AdaptablePopover/index.js +1 -1
  12. package/src/View/Components/Buttons/ButtonInfo.d.ts +1 -1
  13. package/src/View/Components/Buttons/ButtonInfo.js +4 -4
  14. package/src/View/Components/ColumnFilter/AdaptableColumnFilter.js +1 -1
  15. package/src/View/Components/ColumnFilter/ColumnFilter.js +15 -5
  16. package/src/View/Components/ColumnFilter/FloatingFilter.js +57 -59
  17. package/src/View/Components/FilterForm/ListBoxFilterForm.js +1 -1
  18. package/src/View/Components/Forms/AdaptableFormControlTextClear.js +2 -1
  19. package/src/View/Components/Popups/AdaptablePopup/AdaptablePopup.js +1 -1
  20. package/src/View/Components/Popups/AdaptablePopup/AdaptablePopupModuleView.js +2 -2
  21. package/src/View/Components/ValueSelector/index.js +1 -1
  22. package/src/View/FormatColumn/Wizard/FormatColumnScopeWizardSection.js +3 -8
  23. package/src/View/GridFilter/GridFilterViewPanel.js +1 -1
  24. package/src/View/Layout/Wizard/sections/ColumnsSection.js +4 -4
  25. package/src/View/Layout/Wizard/sections/PivotColumnsSection.js +1 -1
  26. package/src/View/Layout/Wizard/sections/RowGroupingSection.js +6 -2
  27. package/src/View/Layout/Wizard/sections/RowSelectionSection.js +1 -1
  28. package/src/View/Layout/Wizard/sections/SettingsSection.js +1 -1
  29. package/src/View/License/LicenseWatermark.js +1 -1
  30. package/src/View/StyledColumn/Wizard/StyledColumnWizardScopeSection.js +1 -1
  31. package/src/View/Wizard/OnePageWizards.js +1 -1
  32. package/src/agGrid/AdaptableAgGrid.js +2 -2
  33. package/src/components/Card/index.js +1 -1
  34. package/src/components/Combobox/index.js +10 -4
  35. package/src/components/Datepicker/index.js +2 -2
  36. package/src/components/Dialog/index.js +1 -1
  37. package/src/components/DragAndDropContext/TabList.js +1 -1
  38. package/src/components/Dropdown/Arrows.js +0 -1
  39. package/src/components/ExpressionEditor/BaseEditorInput.js +1 -1
  40. package/src/components/ExpressionEditor/index.js +1 -1
  41. package/src/components/Input/index.js +1 -1
  42. package/src/components/NewDropdownButton/index.d.ts +1 -0
  43. package/src/components/NewDropdownButton/index.js +2 -2
  44. package/src/components/NewSelect/index.d.ts +2 -0
  45. package/src/components/NewSelect/index.js +10 -7
  46. package/src/components/Panel/index.js +1 -1
  47. package/src/components/SimpleButton/index.js +1 -1
  48. package/src/components/Tabs/index.js +1 -1
  49. package/src/components/Tree/TreeDropdown/index.js +4 -8
  50. package/src/components/ui/button.d.ts +5 -2
  51. package/src/components/ui/button.js +8 -6
  52. package/src/components/ui/calendar.d.ts +1 -1
  53. package/src/components/ui/combobox.d.ts +16 -16
  54. package/src/components/ui/combobox.js +48 -49
  55. package/src/components/ui/input-group.d.ts +10 -9
  56. package/src/components/ui/input-group.js +19 -16
  57. package/src/components/ui/input.d.ts +2 -2
  58. package/src/components/ui/input.js +7 -4
  59. package/src/components/ui/popover.d.ts +5 -5
  60. package/src/components/ui/popover.js +5 -5
  61. package/src/components/ui/select.d.ts +7 -6
  62. package/src/components/ui/select.js +19 -17
  63. package/src/components/ui/textarea.d.ts +2 -2
  64. package/src/components/ui/textarea.js +7 -4
  65. package/src/components/ui/tooltip.d.ts +6 -5
  66. package/src/components/ui/tooltip.js +10 -7
  67. package/src/env.js +2 -2
  68. package/src/layout-manager/src/LayoutManagerModel.d.ts +2 -2
  69. package/src/layout-manager/src/index.js +5 -4
  70. package/src/layout-manager/src/normalizeLayoutModel.js +5 -1
  71. package/src/layout-manager/src/rowGroupDisplayType.d.ts +6 -0
  72. package/src/layout-manager/src/rowGroupDisplayType.js +29 -0
  73. package/src/lib/utils.d.ts +20 -0
  74. package/src/lib/utils.js +48 -1
  75. package/src/metamodel/adaptable.metamodel.d.ts +7 -26
  76. package/src/metamodel/adaptable.metamodel.js +1 -1
  77. package/src/migration/VersionUpgrade23.d.ts +2 -3
  78. package/src/migration/VersionUpgrade23.js +4 -16
  79. package/themes/dark.css +7 -17
  80. package/tsconfig.cjs.tsbuildinfo +1 -1
@@ -32,7 +32,7 @@ export interface EventApi {
32
32
  /**
33
33
  * Event fired whenever a Schedule is triggered in AdapTable
34
34
  * @param eventName ReportScheduleRan
35
- * @param callback ReportScheduleRan which provides details of the Report Schedule that was triggered
35
+ * @param callback provides the report schedule and `RanAt` (when this run started)
36
36
  */
37
37
  on(eventName: 'ReportScheduleRan', callback: (reportScheduleRanInfo: ReportScheduleRanInfo) => void): VoidFunction;
38
38
  /**
@@ -8,4 +8,8 @@ export interface ReportScheduleRanInfo extends BaseContext {
8
8
  * Report schedule that was triggered (if applicable)
9
9
  */
10
10
  reportSchedule?: ReportSchedule;
11
+ /**
12
+ * ISO datetime when Schedule ran (useful for logging)
13
+ */
14
+ RanAt: string;
11
15
  }
@@ -103,7 +103,8 @@ class EventInternalApi extends ApiBase_1.ApiBase {
103
103
  fireScheduledReportRanEvent(reportSchedule) {
104
104
  const reportScheduleRanInfo = {
105
105
  ...this.getAdaptableInternalApi().buildBaseContext(),
106
- reportSchedule: reportSchedule,
106
+ reportSchedule,
107
+ RanAt: new Date().toISOString(),
107
108
  };
108
109
  this.getEventApi().emit('ReportScheduleRan', reportScheduleRanInfo);
109
110
  }
@@ -29,7 +29,7 @@ class AdaptablePopover extends React.Component {
29
29
  const openOnHover = showEvent === 'mouseenter';
30
30
  const triggerElement = useButton ? ((0, jsx_runtime_1.jsx)(ButtonInfo_1.ButtonInfo, { style: iconStyle, variant: "text", onClick: () => null, icon: showIcon && icon, tooltip: this.props.tooltipText, disabled: this.props.disabled, children: this.props.children })) : ((0, jsx_runtime_1.jsxs)("div", { title: this.props.tooltipText, tabIndex: 0, style: { cursor: 'pointer', display: 'inline-block' }, children: [this.props.children, showIcon && (0, jsx_runtime_1.jsx)(icons_1.Icon, { name: icon, style: iconStyle })] }));
31
31
  const controlledProps = this.props.visible !== undefined ? { open: this.props.visible } : {};
32
- return ((0, jsx_runtime_1.jsx)(Flex_1.Flex, { alignItems: "center", className: this.props.className, children: (0, jsx_runtime_1.jsxs)(popover_1.Popover, { ...controlledProps, children: [(0, jsx_runtime_1.jsx)(popover_1.PopoverTrigger, { nativeButton: !!useButton, openOnHover: openOnHover, delay: 0, closeDelay: 0, render: triggerElement }), (0, jsx_runtime_1.jsxs)(popover_1.PopoverContent, { align: "start", sideOffset: 10, className: "ab-Popover twa:w-auto twa:gap-0 twa:p-0", style: {
32
+ return ((0, jsx_runtime_1.jsx)(Flex_1.Flex, { alignItems: "center", className: this.props.className, children: (0, jsx_runtime_1.jsxs)(popover_1.Popover, { ...controlledProps, children: [(0, jsx_runtime_1.jsx)(popover_1.PopoverTrigger, { nativeButton: !!useButton, openOnHover: openOnHover, delay: 0, closeDelay: 0, render: triggerElement }), (0, jsx_runtime_1.jsxs)(popover_1.PopoverContent, { align: "start", sideOffset: 10, className: "ab-Popover twa:border twa:border-primarylight twa:w-auto twa:gap-0 twa:p-0", style: {
33
33
  minWidth: popoverMinWidth,
34
34
  maxWidth: this.props.popoverMaxWidth ?? 300,
35
35
  }, children: [title ? (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:text-4 twa:p-2", children: title }) : null, (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: `ab-Popover__body ${(this.props.popupPadding ?? 2) === 0 ? 'twa:p-0' : 'twa:p-2'}`, children: this.props.bodyText.map((textOrHTML, index) => ((0, jsx_runtime_1.jsx)("span", { children: textOrHTML }, index))) })] })] }) }));
@@ -4,4 +4,4 @@ export interface InfoButtonProps extends SimpleButtonProps {
4
4
  glyph?: string;
5
5
  tooltip?: string;
6
6
  }
7
- export declare const ButtonInfo: React.FunctionComponent<InfoButtonProps>;
7
+ export declare const ButtonInfo: React.ForwardRefExoticComponent<Omit<InfoButtonProps, "ref"> & React.RefAttributes<HTMLButtonElement>>;
@@ -3,8 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ButtonInfo = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const jsx_runtime_1 = require("react/jsx-runtime");
6
+ const React = tslib_1.__importStar(require("react"));
6
7
  const SimpleButton_1 = tslib_1.__importDefault(require("../../../components/SimpleButton"));
7
- const ButtonInfo = (props) => {
8
- return ((0, jsx_runtime_1.jsx)(SimpleButton_1.default, { "data-name": "info", iconSize: 20, icon: "info", variant: "raised", tone: "accent", ...props }));
9
- };
10
- exports.ButtonInfo = ButtonInfo;
8
+ exports.ButtonInfo = React.forwardRef(function ButtonInfo(props, ref) {
9
+ return ((0, jsx_runtime_1.jsx)(SimpleButton_1.default, { ref: ref, "data-name": "info", iconSize: 20, icon: "info", variant: "raised", tone: "accent", ...props }));
10
+ });
@@ -25,7 +25,7 @@ const AdaptableColumnFilter = (props) => {
25
25
  handlePredicateChange(predicate);
26
26
  }, [handlePredicateChange]) }) }));
27
27
  if (props.location === 'filtersToolPanel') {
28
- return ((0, jsx_runtime_1.jsx)(Panel_1.default, { className: "twa:mb-2", bodyProps: { className: 'twa:p-0' }, children: filterContent }));
28
+ return ((0, jsx_runtime_1.jsx)(Panel_1.default, { className: "twa:p-1", bodyProps: { className: 'twa:p-0 twa:border-none' }, children: filterContent }));
29
29
  }
30
30
  return filterContent;
31
31
  };
@@ -15,11 +15,13 @@ const clsx_1 = tslib_1.__importDefault(require("clsx"));
15
15
  const twMerge_1 = require("../../../twMerge");
16
16
  const NewSelect_1 = require("../../../components/NewSelect");
17
17
  const columnFilterLocation_1 = require("./columnFilterLocation");
18
+ const utils_2 = require("../../../lib/utils");
18
19
  const ColumnFilterPredicateDropdown = (props) => {
19
20
  const predicateDef = (0, hooks_1.usePredicateDef)(props.predicate?.operator, props.predicateDefs);
20
21
  const options = props.predicateDefs.map((predicateDef) => {
21
22
  return {
22
- label: ((0, jsx_runtime_1.jsxs)(Flex_1.Box, { className: "twa:flex twa:items-center", children: [(0, jsx_runtime_1.jsx)(SimpleButton_1.default, { as: "span", variant: "raised", className: "twa:mr-2", tone: "accent", children: predicateDef.icon }), predicateDef.label] })),
23
+ label: ((0, jsx_runtime_1.jsxs)(Flex_1.Box, { className: "twa:flex twa:items-center", children: [(0, jsx_runtime_1.jsx)(SimpleButton_1.default, { as: "span", variant: "raised", className: "twa:mr-2 twa:p-0.5", tone: "accent", children: predicateDef.icon }), predicateDef.label] })),
24
+ tooltip: predicateDef.label,
23
25
  value: predicateDef.operator,
24
26
  };
25
27
  });
@@ -27,15 +29,14 @@ const ColumnFilterPredicateDropdown = (props) => {
27
29
  const isAndOr = operator === 'AND' || operator === 'OR';
28
30
  return ((0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:flex twa:items-center ab-ColumnFilterPredicateDropdown twa:p-0.5", style: {
29
31
  //@ts-ignore ignore
30
- '--ab-cmp-input__background': 'var(--ab-color-primary)',
31
32
  '--ab-color-input-background': 'var(--ab-color-primary)',
32
- }, children: (0, jsx_runtime_1.jsx)(NewSelect_1.SingleSelect, { "data-name": "filter-predicate-dropdown",
33
+ }, children: (0, jsx_runtime_1.jsx)(NewSelect_1.SingleSelect, { "data-name": "filter-predicate-dropdown", extraWidthChars: 8,
33
34
  // The trigger lives inside ag-grid's column menu, which closes itself
34
35
  // on mousedowns outside its DOM subtree. Since the popup is portaled
35
36
  // to `document.body`, mousedowns inside it would otherwise bubble to
36
37
  // `document` and unmount the trigger mid-interaction (causing the
37
38
  // popup to re-align to (0,0) before disappearing).
38
- stopMouseDownPropagation: true, className: predicateDef ? `twa:min-w-[10rem]` : null, onValueChange: (value) => {
39
+ stopMouseDownPropagation: true, showItemTooltip: true, className: predicateDef ? `twa:min-w-[10rem]` : null, onValueChange: (value) => {
39
40
  props.onPredicateChange({
40
41
  operator: value,
41
42
  args: [],
@@ -64,6 +65,7 @@ const AndOrInput = (props) => {
64
65
  const ColumnFilterComponent = (props) => {
65
66
  const adaptable = (0, AdaptableContext_1.useAdaptable)();
66
67
  const manuallyApplyColumnFilter = adaptable.api.filterApi.columnFilterApi.internalApi.shouldManuallyApplyColumnFilter(props.columnId);
68
+ const rootRef = React.useRef(null);
67
69
  const contentWrapperRef = React.useRef(null);
68
70
  React.useEffect(() => {
69
71
  if (props.location !== 'columnMenu')
@@ -73,6 +75,14 @@ const ColumnFilterComponent = (props) => {
73
75
  const dropdown = contentWrapperRef.current?.querySelector('[data-name="filter-predicate-dropdown"]');
74
76
  dropdown?.focus();
75
77
  }, [props.location]);
78
+ // When rendered inside ag-grid's column menu, Tabbing would otherwise escape
79
+ // to the surrounding menu/grid. Trap focus so Tab / Shift+Tab cycle within the filter.
80
+ const handleFocusTrap = React.useCallback((e) => {
81
+ if (props.location !== 'columnMenu') {
82
+ return;
83
+ }
84
+ (0, utils_2.captureTab)(rootRef.current, e);
85
+ }, [props.location]);
76
86
  const [predicateNotYetApplied, setPredicateNotYetApplied] = React.useState(props.predicate);
77
87
  const applyFilter = () => {
78
88
  props.onPredicateChange(currentPredicateRef.current);
@@ -133,7 +143,7 @@ const ColumnFilterComponent = (props) => {
133
143
  .map((qlPredicate) => (0, utils_1.mapQlPredicateToAdaptablePredicate)(qlPredicate))
134
144
  .some((adaptablePredicate) => adaptable.api.predicateApi.isValidPredicate(adaptablePredicate));
135
145
  };
136
- return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)(Flex_1.Flex, { flexDirection: "column", className: (0, clsx_1.default)({
146
+ return ((0, jsx_runtime_1.jsxs)("div", { ref: rootRef, onKeyDown: handleFocusTrap, className: "twa:contents", children: [(0, jsx_runtime_1.jsxs)(Flex_1.Flex, { flexDirection: "column", className: (0, clsx_1.default)({
137
147
  'twa:pb-2': !props.hideActionButtons,
138
148
  'twa:mb-2': (0, columnFilterLocation_1.isEmbeddedColumnFilterLocation)(props.location),
139
149
  'twa:mt-2 twa:ml-2 twa:mr-2': props.location === 'columnMenu',
@@ -4,11 +4,10 @@ exports.FloatingFilter = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const jsx_runtime_1 = require("react/jsx-runtime");
6
6
  const React = tslib_1.__importStar(require("react"));
7
- const OverlayTrigger_1 = tslib_1.__importDefault(require("../../../components/OverlayTrigger"));
8
7
  const SimpleButton_1 = tslib_1.__importDefault(require("../../../components/SimpleButton"));
9
8
  const AdaptableContext_1 = require("../../AdaptableContext");
10
9
  const AdaptableIconComponent_1 = require("../AdaptableIconComponent");
11
- const ColumnFilterMenu_1 = require("./components/ColumnFilterMenu");
10
+ const NewSelect_1 = require("../../../components/NewSelect");
12
11
  const FloatingFilterInputList_1 = require("./components/FloatingFilterInputList");
13
12
  const utils_1 = require("./utils");
14
13
  const GeneralConstants_1 = require("../../../Utilities/Constants/GeneralConstants");
@@ -44,75 +43,74 @@ const FloatingFilter = (props) => {
44
43
  const colDef = adaptable.api.columnApi.getAGGridColDefForColumnId(props.columnId);
45
44
  const showExpandFilterButton = colDef?.suppressHeaderFilterButton !== true;
46
45
  const handleClear = () => props.onClear?.();
47
- const showEvent = 'click';
48
- const hideEvent = 'blur';
49
- const [overlayVisible, setOverlayVisible] = React.useState(false);
46
+ const [selectOpen, setSelectOpen] = React.useState(false);
47
+ const currentOperator = props.predicate?.args[0]?.operator;
48
+ const operatorOptions = props.predicateDefs.map((predicateDef) => ({
49
+ label: ((0, jsx_runtime_1.jsxs)(Flex_1.Box, { className: "twa:flex twa:items-center", children: [(0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:mr-2 twa:flex twa:items-center", children: predicateDef.icon }), (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:truncate", "data-name": "filter-predicate-label", "data-label": predicateDef.label, children: predicateDef.label })] })),
50
+ tooltip: predicateDef.label,
51
+ value: predicateDef.operator,
52
+ }));
53
+ const renderTriggerValue = () => ((0, jsx_runtime_1.jsxs)(Flex_1.Flex, { alignItems: "center", className: "twa:min-w-0", children: [(0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:flex twa:items-center", children: !isManualApply && singleFilterPredicateDef?.icon ? (singleFilterPredicateDef?.icon) : ((0, jsx_runtime_1.jsx)(AdaptableIconComponent_1.AdaptableIconComponent, { icon: { name: 'filter' } })) }), showLabel && ((0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "ab-FloatingFilter-label twa:ml-2 twa:flex-1 twa:truncate", title: label, children: label }))] }));
50
54
  let filterDropdown = null;
51
- const filterDropdownButton = ((0, jsx_runtime_1.jsxs)(SimpleButton_1.default, { variant: "text", "data-name": "floating-filter-button", "aria-label": "Column Filter Operator Dropdown", tooltip: "Click to change filter operator", onBlur: () => {
52
- if (isInlineEditable) {
53
- setOverlayVisible(false);
54
- }
55
- }, "data-value": props.predicate?.args[0]?.operator, onClick: () => {
56
- if (!isInlineEditable) {
55
+ const filterDropdownSelect = ((0, jsx_runtime_1.jsx)(NewSelect_1.SingleSelect, { chevronIcon: null, "data-name": "floating-filter-button", ariaLabel: "Column Filter Operator Dropdown", size: "small", stopMouseDownPropagation: true, disabled: props.disabled, open: selectOpen, extraWidthChars: 5, onOpenChange: (nextOpen) => {
56
+ // In non-inline mode the select doesn't pick an operator inline; opening it
57
+ // instead opens the full column filter popup, so keep the dropdown closed.
58
+ if (nextOpen && !isInlineEditable) {
57
59
  adaptable.api.filterApi.columnFilterApi.internalApi.openColumnFilterPopup(props.columnId);
60
+ return;
58
61
  }
59
- else {
60
- setOverlayVisible(true);
61
- }
62
- }, className: "twa:my-0.5 twa:mx-0.5 twa:text-left twa:p-0.5", style: {
63
- ...(!isInlineEditable
64
- ? {
65
- minWidth: 0,
66
- flex: 1,
67
- }
68
- : {}),
69
- }, children: [(0, jsx_runtime_1.jsx)(Flex_1.Box, { children: !isManualApply && singleFilterPredicateDef?.icon ? (singleFilterPredicateDef?.icon) : ((0, jsx_runtime_1.jsx)(AdaptableIconComponent_1.AdaptableIconComponent, { icon: { name: 'filter' } })) }), showLabel && ((0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "ab-FloatingFilter-label twa:ml-2 twa:flex-1", title: label, children: label }))] }));
62
+ setSelectOpen(nextOpen);
63
+ }, value: currentOperator, placeholder: label, items: operatorOptions, showItemTooltip: true, renderValue: renderTriggerValue, onValueChange: (operator) => {
64
+ props.onPredicateChange({
65
+ operator: props.predicate.operator,
66
+ args: [{ operator: operator, args: [] }],
67
+ });
68
+ }, className: (0, utils_2.cn)('twa:self-center twa:mx-0.5 twa:my-0.5 twa:text-left twa:p-0.5 twa:border-none', 'twa:shadow-none', !isInlineEditable && 'twa:min-w-0 twa:flex-1') }));
70
69
  if (isInlineEditable) {
71
- filterDropdown = showQuickFilterDropdown && ((0, jsx_runtime_1.jsx)(OverlayTrigger_1.default, { className: "ab-FloatingFilter-overlay", showEvent: showEvent, hideEvent: hideEvent, visible: overlayVisible, onVisibleChange: setOverlayVisible, preventPortalEventPropagation: showEvent === 'click', targetOffset: 10, hideDelay: 50, "data-name": "floating-filter-overlay", render: () => {
72
- // we render this only for single filter
73
- return ((0, jsx_runtime_1.jsx)(ColumnFilterMenu_1.ColumnFilterMenu, { columnId: props.columnId, disabled: props.disabled, predicate: props.predicate.args[0], predicateDefs: props.predicateDefs, onPredicateChange: (predicate) => {
74
- setOverlayVisible(false);
75
- props.onPredicateChange({
76
- operator: props.predicate.operator,
77
- args: [predicate],
78
- });
79
- } }));
80
- }, children: filterDropdownButton }));
70
+ filterDropdown = showQuickFilterDropdown && filterDropdownSelect;
81
71
  }
82
72
  else {
83
- filterDropdown = filterDropdownButton;
73
+ filterDropdown = filterDropdownSelect;
84
74
  }
85
75
  const showClearButton = isMultiple ||
86
76
  !(0, utils_1.isPredicateEmpty)(props.predicate.args[0], singleFilterPredicateDef);
87
77
  return ((0, jsx_runtime_1.jsxs)(Flex_1.Flex, { className: "ab-FloatingFilter twa:w-full", onKeyDownCapture: (e) => {
88
78
  // AG Grid's header keyboard navigation intercepts Tab and calls preventDefault(),
89
- // which prevents focus from moving between elements inside the floating filter.
90
- // We handle Tab manually in the capture phase (before AG Grid's handlers).
91
- if (e.key === 'Tab') {
92
- const target = e.target;
93
- const wrapper = e.currentTarget;
94
- if (!e.shiftKey) {
95
- // Tab forward: from filter button → select input
96
- if (target.getAttribute('data-name') === 'floating-filter-button') {
97
- const selectInput = wrapper.querySelector('[data-name="Select Values"] input');
98
- if (selectInput) {
99
- e.preventDefault();
100
- e.nativeEvent.stopImmediatePropagation();
101
- selectInput.focus();
102
- // When the DummyInput gets focus the combobox sets isFocused=true,
103
- // triggering a React re-render. During this re-render, unstable component
104
- // references can cause the DummyInput to be removed from the DOM and
105
- // recreated, losing focus. We restore focus after the re-render.
106
- requestAnimationFrame(() => {
107
- if (document.activeElement === document.body || document.activeElement === null) {
108
- const newInput = wrapper.querySelector('[data-name="Select Values"] input');
109
- newInput?.focus();
110
- }
111
- });
112
- }
113
- }
114
- }
79
+ // which prevents focus from moving between the controls inside the floating filter
80
+ // (operator select, filter input(s), expand/clear buttons). We handle Tab ourselves
81
+ // in the capture phase (before AG Grid's handlers) and move focus to the next/previous
82
+ // focusable control. At the boundaries we let the event through so AG Grid can move
83
+ // to the adjacent header cell.
84
+ if (e.key !== 'Tab') {
85
+ return;
86
+ }
87
+ const wrapper = e.currentTarget;
88
+ const focusable = (0, utils_2.getFocusableElements)(wrapper);
89
+ if (focusable.length === 0) {
90
+ return;
115
91
  }
92
+ const active = document.activeElement;
93
+ const currentIndex = active ? focusable.indexOf(active) : -1;
94
+ if (currentIndex === -1) {
95
+ return;
96
+ }
97
+ const nextIndex = currentIndex + (e.shiftKey ? -1 : 1);
98
+ if (nextIndex < 0 || nextIndex >= focusable.length) {
99
+ // boundary reached: let AG Grid navigate between header cells
100
+ return;
101
+ }
102
+ e.preventDefault();
103
+ e.nativeEvent.stopImmediatePropagation();
104
+ focusable[nextIndex]?.focus();
105
+ // Focusing the values combobox's input makes it set isFocused=true, which
106
+ // re-renders and can momentarily recreate the input, dropping focus to <body>.
107
+ // Re-resolve the target after the re-render and restore focus to it.
108
+ requestAnimationFrame(() => {
109
+ if (document.activeElement === document.body || document.activeElement === null) {
110
+ const refreshed = (0, utils_2.getFocusableElements)(wrapper);
111
+ refreshed[Math.min(nextIndex, refreshed.length - 1)]?.focus();
112
+ }
113
+ });
116
114
  }, children: [filterDropdown, isInlineEditable && ((0, jsx_runtime_1.jsx)(Flex_1.Flex, { className: "twa:flex-1 twa:min-w-0", children: (0, jsx_runtime_1.jsx)(FloatingFilterInputList_1.FloatingFilterInputList, { onKeyDown: props.onKeydown, columnId: props.columnId, disabled: props.disabled,
117
115
  // It works only with a predicate
118
116
  predicate: props.predicate.args[0], predicateDefs: props.predicateDefs, onPredicateChange: (predicate) => {
@@ -166,7 +166,7 @@ const ColumnValuesSelect = (props) => {
166
166
  : props.onChange, items: options,
167
167
  // for dates, the treeDateOptions have ids that are numbers
168
168
  // so we have to add the `toDateValue` function to convert the values to the correct format
169
- value: selectedColumnValues, primaryKey: 'value', isLoading: props.isLoading, onOpenChange: onOpenChange, showClear: (0, columnFilterLocation_1.isEmbeddedColumnFilterLocation)(location) })) : ((0, jsx_runtime_1.jsx)(Combobox_1.GridFilterCombobox, { disabled: props.disabled, ...selectProps, onOpenChange: onOpenChange, items: options, value: value, isLoading: props.isLoading, onValueChange: props.onChange, showClear: (0, columnFilterLocation_1.isEmbeddedColumnFilterLocation)(location) }, "select"));
169
+ value: selectedColumnValues, "data-name": "Select Values", primaryKey: 'value', isLoading: props.isLoading, onOpenChange: onOpenChange, showClear: (0, columnFilterLocation_1.isEmbeddedColumnFilterLocation)(location) })) : ((0, jsx_runtime_1.jsx)(Combobox_1.GridFilterCombobox, { disabled: props.disabled, ...selectProps, onOpenChange: onOpenChange, items: options, value: value, isLoading: props.isLoading, onValueChange: props.onChange, showClear: (0, columnFilterLocation_1.isEmbeddedColumnFilterLocation)(location) }, "select"));
170
170
  return ((0, jsx_runtime_1.jsx)("div", { className: (0, join_1.default)(baseClassName, 'twa:relative', props.isLoading && `${baseClassName}--loading`, !value.length && `${baseClassName}--empty`), onKeyDownCapture: (e) => {
171
171
  if (e.key === 'Tab') {
172
172
  // Prevent AG Grid from hijacking Tab; keep browser default focus navigation.
@@ -13,6 +13,7 @@ exports.AdaptableFormControlTextClear = React.forwardRef((props, ref) => {
13
13
  let closeButtonTooltip = props.value ? 'Clear' : null;
14
14
  const inputRef = React.useRef(null);
15
15
  const { focusOnClear = true } = props;
16
+ const clearDisabled = StringExtensions_1.StringExtensions.IsNullOrEmpty(props.value.toString());
16
17
  return ((0, jsx_runtime_1.jsxs)(FieldWrap_1.default, { onClick: props.onClick, className: (0, twMerge_1.twMerge)('twa:bg-input-background twa:text-input-foreground twa:overflow-visible twa:w-full twa:rounded-input', props.className), style: props.style, children: [(0, jsx_runtime_1.jsx)(Input_1.default, { "aria-label": props['aria-label'], autoFocus: props.autoFocus, style: props.inputStyle, className: props.inputClassName, ref: (r) => {
17
18
  inputRef.current = r;
18
19
  if (!ref) {
@@ -35,5 +36,5 @@ exports.AdaptableFormControlTextClear = React.forwardRef((props, ref) => {
35
36
  input.focus();
36
37
  }
37
38
  });
38
- }, disabled: StringExtensions_1.StringExtensions.IsNullOrEmpty(props.value.toString()) })] }));
39
+ }, disabled: clearDisabled })] }));
39
40
  });
@@ -71,7 +71,7 @@ const AdaptablePopup = (props) => {
71
71
  props.onHide();
72
72
  }
73
73
  },
74
- }, children: (0, jsx_runtime_1.jsxs)(AdaptablePopupDialog_1.AdaptablePopupDialog, { dataName: componentModule, baseClassName: baseClassName, className: className, friendlyName: friendlyName, isActionModule: isStandalone, isWindowModal: isWindowModal, onHide: props.onHide, modalContainer: modalContainer, children: [!isStandalone && (0, jsx_runtime_1.jsx)(TopBar_1.default, { icon: settingsPanelOptions.icon, children: settingsPanelTitle }), (0, jsx_runtime_1.jsxs)(Flex_1.Box, { className: (0, clsx_1.default)('twa:flex twa:flex-row twa:flex-1 twa:min-h-0', 'twa:bg-defaultbackground twa:text-foreground', 'twa:rounded-bl-standard twa:rounded-br-standard', accessLevel == GeneralConstants.ACCESS_LEVEL_READ_ONLY
74
+ }, children: (0, jsx_runtime_1.jsxs)(AdaptablePopupDialog_1.AdaptablePopupDialog, { dataName: componentModule, baseClassName: baseClassName, className: className, friendlyName: friendlyName, isActionModule: isStandalone, isWindowModal: isWindowModal, onHide: props.onHide, modalContainer: modalContainer, children: [!isStandalone && (0, jsx_runtime_1.jsx)(TopBar_1.default, { icon: settingsPanelOptions.icon, children: settingsPanelTitle }), (0, jsx_runtime_1.jsxs)(Flex_1.Box, { className: (0, clsx_1.default)('twa:flex twa:flex-row twa:flex-1 twa:min-h-0', 'twa:bg-background twa:text-foreground', 'twa:rounded-bl-standard twa:rounded-br-standard', accessLevel == GeneralConstants.ACCESS_LEVEL_READ_ONLY
75
75
  ? GeneralConstants.READ_ONLY_STYLE
76
76
  : ''), children: [!isStandalone && ((0, jsx_runtime_1.jsx)(Navigation_1.Navigation, { menuItems: menuItems, api: props.api, activeItem: activeItem, customSettingsPanels: settingsPanelOptions.customSettingsPanels })), (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: (0, clsx_1.default)('ab-Adaptable-Popup__Body', 'twa:bg-primarylight twa:text-primarylight-foreground', 'twa:flex twa:flex-1 twa:min-w-0 twa:overflow-auto', 'twa:rounded-br-standard', !isStandalone && 'twa:*:p-3'), children: moduleViewContent })] })] }) }));
77
77
  };
@@ -6,7 +6,6 @@ const jsx_runtime_1 = require("react/jsx-runtime");
6
6
  const React = tslib_1.__importStar(require("react"));
7
7
  const react_redux_1 = require("react-redux");
8
8
  const GeneralConstants_1 = require("../../../../Utilities/Constants/GeneralConstants");
9
- const DropdownButton_1 = tslib_1.__importDefault(require("../../../../components/DropdownButton"));
10
9
  const EmptyContent_1 = tslib_1.__importDefault(require("../../../../components/EmptyContent"));
11
10
  const icons_1 = require("../../../../components/icons");
12
11
  const AdaptableObjectList_1 = require("../../AdaptableObjectList");
@@ -21,6 +20,7 @@ const useRerender_1 = require("../../../../components/utils/useRerender");
21
20
  const Flex_1 = require("../../../../components/Flex");
22
21
  const Panel_1 = tslib_1.__importDefault(require("../../../../components/Panel"));
23
22
  const Tabs_1 = require("../../../../components/Tabs");
23
+ const NewDropdownButton_1 = require("../../../../components/NewDropdownButton");
24
24
  const AdaptablePopupModuleView = (props) => {
25
25
  /**
26
26
  * This triggers a render for each state change.
@@ -84,7 +84,7 @@ const AdaptablePopupModuleView = (props) => {
84
84
  label: abObjectType.label ?? abObjectType.name,
85
85
  };
86
86
  });
87
- newButton = ((0, jsx_runtime_1.jsxs)(DropdownButton_1.default, { tone: "accent", variant: "raised", columns: ['label'], items: items, tooltip: toolTipText, children: [(0, jsx_runtime_1.jsx)(icons_1.Icon, { name: "plus" }), " New"] }));
87
+ newButton = ((0, jsx_runtime_1.jsxs)(NewDropdownButton_1.NewDropdownButton, { showDivider: false, tone: "accent", variant: "raised", items: items, tooltip: toolTipText, children: [(0, jsx_runtime_1.jsx)(icons_1.Icon, { name: "plus" }), " New"] }));
88
88
  }
89
89
  else if (!moduleViewProperties.hideNewButton &&
90
90
  (EditWizard || moduleViewProperties.onOpenEditPopup)) {
@@ -106,7 +106,7 @@ function ValueSelector(props) {
106
106
  notifyChange();
107
107
  },
108
108
  };
109
- return ((0, jsx_runtime_1.jsxs)(Flex_1.Flex, { style: props.style, className: (0, clsx_1.default)('twa:flex-1', baseClassName), flexDirection: "column", children: [(0, jsx_runtime_1.jsx)(Flex_1.Flex, { className: "twa:mb-1", children: showFilterInput && filter ? ((0, jsx_runtime_1.jsx)(AdaptableFormControlTextClear_1.AdaptableFormControlTextClear, { value: searchInputValue, OnTextChange: setSearchInputValue, placeholder: "Type to search", inputClassName: "twa:p-3", className: "twa:flex-1 twa:border-0 twa:m-[3px]" })) : ((0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:flex-1" })) }), (0, exports.renderSelectionSection)(selectionSectionProps), (0, jsx_runtime_1.jsx)(dnd_1.DragDropProvider, { children: (0, jsx_runtime_1.jsx)(Flex_1.Flex, { className: `${baseClassName}__body twa:flex-1 twa:overflow-auto`, flexDirection: "column", children: (0, jsx_runtime_1.jsx)(dnd_1.DragList, { dragListId: "value-selector", orientation: "vertical", onDragProxyMove: dnd_1.defaultDragProxyMove, onDragProxySetup: ({ proxyElement }) => {
109
+ return ((0, jsx_runtime_1.jsxs)(Flex_1.Flex, { style: props.style, className: (0, clsx_1.default)('twa:flex-1', baseClassName), flexDirection: "column", children: [(0, jsx_runtime_1.jsx)(Flex_1.Flex, { className: "twa:mb-1", children: showFilterInput && filter ? ((0, jsx_runtime_1.jsx)(AdaptableFormControlTextClear_1.AdaptableFormControlTextClear, { value: searchInputValue, OnTextChange: setSearchInputValue, placeholder: "Type to search", inputClassName: "twa:p-3", className: "twa:flex-1 twa:m-[3px]" })) : ((0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:flex-1" })) }), (0, exports.renderSelectionSection)(selectionSectionProps), (0, jsx_runtime_1.jsx)(dnd_1.DragDropProvider, { children: (0, jsx_runtime_1.jsx)(Flex_1.Flex, { className: `${baseClassName}__body twa:flex-1 twa:overflow-auto`, flexDirection: "column", children: (0, jsx_runtime_1.jsx)(dnd_1.DragList, { dragListId: "value-selector", orientation: "vertical", onDragProxyMove: dnd_1.defaultDragProxyMove, onDragProxySetup: ({ proxyElement }) => {
110
110
  proxyElement.classList.add('twa:shadow-md');
111
111
  }, onDrop: (_sortedIndexes) => {
112
112
  const selection = [];
@@ -60,9 +60,7 @@ const FormatColumnScopeWizardSection = (props) => {
60
60
  newData.Rule.BooleanExpression = '';
61
61
  }
62
62
  else {
63
- const validPredicateIds = new Set(api.formatColumnApi.internalApi
64
- .getFormatColumnDefsForScope(Scope)
65
- .map((def) => def.id));
63
+ const validPredicateIds = new Set(api.formatColumnApi.internalApi.getFormatColumnDefsForScope(Scope).map((def) => def.id));
66
64
  newData.Rule = {
67
65
  Predicates: newData.Rule.Predicates.filter((p) => validPredicateIds.has(p.PredicateId)).filter((predicate) => {
68
66
  // if there are more than 1 column, then we must eliminate the IN/NotIn predicates
@@ -87,12 +85,9 @@ const FormatColumnScopeWizardSection = (props) => {
87
85
  });
88
86
  };
89
87
  const showRowToggles = data.Target === 'cell';
90
- return ((0, jsx_runtime_1.jsxs)(Flex_1.Flex, { flexDirection: "column", style: { height: '100%' }, children: [(0, jsx_runtime_1.jsxs)(Flex_1.Flex, { flexDirection: "column", className: "twa:flex-1 twa:min-h-0", children: [(0, jsx_runtime_1.jsxs)(Flex_1.Flex, { flexDirection: "row", alignItems: "center", className: "twa:p-2 twa:gap-3 twa:border-b twa:border-b-text-on-defaultbackground/20", children: [(0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:text-5 twa:font-medium", children: "Columns" }), (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:text-xs twa:opacity-70", children: "Which Columns the Format Column will be applied to" })] }), (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:flex-1 twa:min-h-0 twa:overflow-auto", children: (0, jsx_runtime_1.jsx)(NewScopeComponent_1.NewScopeComponent, { descriptions: {
88
+ return ((0, jsx_runtime_1.jsxs)(Flex_1.Flex, { flexDirection: "column", style: { height: '100%' }, children: [(0, jsx_runtime_1.jsxs)(Flex_1.Flex, { flexDirection: "column", className: "twa:flex-1 twa:min-h-0", children: [(0, jsx_runtime_1.jsxs)(Flex_1.Flex, { flexDirection: "row", alignItems: "center", className: "twa:p-2 twa:gap-3 twa:border-b twa:mb-2 twa:border-b-foreground/20", children: [(0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:text-5 twa:font-medium", children: "Columns" }), (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:text-xs twa:opacity-70", children: "Which Columns the Format Column will be applied to" })] }), (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:flex-1 twa:min-h-0 twa:overflow-auto twa:p-2", children: (0, jsx_runtime_1.jsx)(NewScopeComponent_1.NewScopeComponent, { descriptions: {
91
89
  rowScope: 'Format all columns in the row',
92
90
  columnScope: 'Select columns to format',
93
- }, scope: data.Scope, updateScope: handleScopeChange }) })] }), showRowToggles && ((0, jsx_runtime_1.jsxs)(Flex_1.Box, { className: "twa:border-t twa:border-border twa:px-2 twa:py-3 twa:shrink-0", children: [(0, jsx_runtime_1.jsxs)(Flex_1.Flex, { alignItems: "center", className: "twa:gap-3 twa:pb-2 twa:mb-3 twa:flex-wrap twa:border-b twa:border-b-text-on-defaultbackground/20", children: [(0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:text-5 twa:font-medium", children: "Rows" }), (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:text-xs twa:opacity-70 twa:max-w-[520px]", children: "Which kinds of Rows the Format Column will be applied to" })] }), (0, jsx_runtime_1.jsx)(Flex_1.Flex, { flexDirection: "row", className: "twa:gap-6 twa:flex-wrap", children: [
94
- FORMAT_COLUMN_ROW_KINDS.slice(0, 2),
95
- FORMAT_COLUMN_ROW_KINDS.slice(2),
96
- ].map((rowKindGroup, groupIndex) => ((0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:flex-1 twa:min-w-[220px]", children: (0, jsx_runtime_1.jsx)(FormLayout_1.default, { sizes: ['180px', '1fr'], children: rowKindGroup.map((kind) => ((0, jsx_runtime_1.jsx)(FormLayout_1.FormRow, { label: `${ROW_KIND_LABELS[kind]}:`, children: (0, jsx_runtime_1.jsx)(Flex_1.Flex, { alignItems: "center", className: "twa:ml-2", children: (0, jsx_runtime_1.jsx)(CheckBox_1.CheckBox, { "data-name": `include-${kind.toLowerCase()}-rows-checkbox`, className: "twa:mr-2", checked: isRowKindIncluded(data, kind), onChange: (checked) => handleRowKindChange(kind, checked) }) }) }, kind))) }) }, groupIndex))) })] }))] }));
91
+ }, scope: data.Scope, updateScope: handleScopeChange }) })] }), showRowToggles && ((0, jsx_runtime_1.jsxs)(Flex_1.Box, { className: "twa:border-t twa:border-border twa:py-3 twa:shrink-0", children: [(0, jsx_runtime_1.jsxs)(Flex_1.Flex, { alignItems: "center", className: "twa:gap-3 twa:px-2 twa:pb-2 twa:mb-3 twa:flex-wrap twa:border-b twa:border-b-foreground/20", children: [(0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:text-5 twa:font-medium", children: "Rows" }), (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:text-xs twa:opacity-70 twa:max-w-[520px]", children: "Which kinds of Rows the Format Column will be applied to" })] }), (0, jsx_runtime_1.jsx)(Flex_1.Flex, { flexDirection: "row", className: "twa:gap-6 twa:flex-wrap", children: [FORMAT_COLUMN_ROW_KINDS.slice(0, 2), FORMAT_COLUMN_ROW_KINDS.slice(2)].map((rowKindGroup, groupIndex) => ((0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:flex-1 twa:min-w-[220px]", children: (0, jsx_runtime_1.jsx)(FormLayout_1.default, { sizes: ['180px', '1fr'], children: rowKindGroup.map((kind) => ((0, jsx_runtime_1.jsx)(FormLayout_1.FormRow, { label: `${ROW_KIND_LABELS[kind]}:`, children: (0, jsx_runtime_1.jsx)(Flex_1.Flex, { alignItems: "center", className: "twa:ml-2", children: (0, jsx_runtime_1.jsx)(CheckBox_1.CheckBox, { "data-name": `include-${kind.toLowerCase()}-rows-checkbox`, className: "twa:mr-2", checked: isRowKindIncluded(data, kind), onChange: (checked) => handleRowKindChange(kind, checked) }) }) }, kind))) }) }, groupIndex))) })] }))] }));
97
92
  };
98
93
  exports.FormatColumnScopeWizardSection = FormatColumnScopeWizardSection;
@@ -26,7 +26,7 @@ const QueryViewPanelComponent = (props) => {
26
26
  const disabled = isReadOnly || isSuspended || gridFilterAccessLevel === GeneralConstants_1.ACCESS_LEVEL_READ_ONLY;
27
27
  const buttonExpand = ((0, jsx_runtime_1.jsx)(ButtonExpand_1.ButtonExpand, { disabled: disabled, accessLevel: gridFilterAccessLevel, variant: "text", tone: "neutral", onClick: onExpand, tooltip: "Edit the Expression in UI", className: "twa:ml-1" }));
28
28
  const renderExpressionLabel = () => {
29
- const baseClasses = 'twa:font-mono twa:text-s twa:py-2 twa:px-2 twa:overflow-hidden twa:text-ellipsis twa:whitespace-nowrap twa:bg-defaultbackground twa:text-foreground twa:rounded twa:cursor-pointer twa:leading-4 twa:flex twa:items-center';
29
+ const baseClasses = 'twa:font-mono twa:text-s twa:py-2 twa:px-2 twa:overflow-hidden twa:text-ellipsis twa:whitespace-nowrap twa:bg-background twa:text-foreground twa:rounded twa:cursor-pointer twa:leading-4 twa:flex twa:items-center';
30
30
  const placeholderClasses = 'twa:text-gray-400 twa:italic';
31
31
  const labelClassName = (0, clsx_1.default)(baseClasses, {
32
32
  [placeholderClasses]: !expression,
@@ -194,7 +194,7 @@ const ColumnsSection = (props) => {
194
194
  if (layout.RowGroupDisplayType === 'single') {
195
195
  allColumns.unshift((0, ColumnApiImpl_1.generateAutoRowGroupSingleColumn)());
196
196
  }
197
- else {
197
+ else if (layout.RowGroupDisplayType === 'multi') {
198
198
  [...layout.RowGroupedColumns].reverse().forEach((col) => {
199
199
  const groupCol = (0, ColumnApiImpl_1.generateAutoRowGroupColumnForColumn)(adaptable.api.columnApi.getColumnWithColumnId(col));
200
200
  allColumns.unshift(groupCol);
@@ -428,7 +428,7 @@ const ColumnsSection = (props) => {
428
428
  const visible = isColumnVisible({ columnId: selectedColumnId, layout });
429
429
  handleColumnVisibilityChange(selectedColumnId, !visible);
430
430
  }
431
- }, children: (0, jsx_runtime_1.jsxs)(Flex_1.Box, { className: "twa:flex twa:flex-col twa:gap-2 twa:h-full twa:overflow-hidden twa:p-1", children: [(0, jsx_runtime_1.jsx)(AdaptableFormControlTextClear_1.AdaptableFormControlTextClear, { value: searchInputValue, OnTextChange: setSearchInputValue, placeholder: "Search Columns...", className: "twa:w-full twa:border-none twa:p-1" }), (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: (0, clsx_1.default)('twa:font-bold', 'twa:border-b twa:border-primarydark/30 twa:rounded-standard'), children: (0, jsx_runtime_1.jsx)(CheckBox_1.CheckBox, { checked: currentlyDisplayedColumnIds.length
431
+ }, children: (0, jsx_runtime_1.jsxs)(Flex_1.Box, { className: "twa:flex twa:flex-col twa:gap-2 twa:h-full twa:overflow-hidden twa:p-1", children: [(0, jsx_runtime_1.jsx)(AdaptableFormControlTextClear_1.AdaptableFormControlTextClear, { value: searchInputValue, OnTextChange: setSearchInputValue, placeholder: "Search Columns...", className: "twa:w-full twa:p-1" }), (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: (0, clsx_1.default)('twa:font-bold', 'twa:border-b twa:border-primarydark/30 twa:rounded-standard'), children: (0, jsx_runtime_1.jsx)(CheckBox_1.CheckBox, { checked: currentlyDisplayedColumnIds.length
432
432
  ? currentlyDisplayedColumnIds.length === visibleIdsCurrentlyDisplayed.length
433
433
  ? true
434
434
  : visibleIdsCurrentlyDisplayed.length
@@ -466,7 +466,7 @@ const ColumnPropertiesEditor = (props) => {
466
466
  const adaptable = (0, AdaptableContext_1.useAdaptable)();
467
467
  const baseCls = 'ab-Layout-Wizard__ColumnPropertiesEditor twa:border twa:rounded-standard';
468
468
  if (!props.column) {
469
- return ((0, jsx_runtime_1.jsx)(Flex_1.Box, { className: (0, clsx_1.default)(baseCls, 'twa:border-input-border twa:grid twa:place-items-center twa:border-dashed twa:border-2'), children: (0, jsx_runtime_1.jsxs)(Flex_1.Box, { className: "twa:flex twa:flex-col twa:gap-2 twa:items-center twa:justify-center", children: [(0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:text-text-on-primarydark ab-Layout-Wizard__ColumnPropertiesEditor__Placeholder__Icon", children: (0, jsx_runtime_1.jsx)(icons_1.NaturallySizedIcon, { name: "inspector", style: { stroke: 'currentColor', fill: 'none', strokeWidth: 2 } }) }), (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:text-4 twa:font-bold ab-Layout-Wizard__ColumnPropertiesEditor__Placeholder__Title", children: "No Column Selected" }), (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:text-3 twa:opacity-80 ab-Layout-Wizard__ColumnPropertiesEditor__Placeholder__Description", children: "Select a Column to view and edit its properties" })] }) }));
469
+ return ((0, jsx_runtime_1.jsx)(Flex_1.Box, { className: (0, clsx_1.default)(baseCls, 'twa:border-input-border twa:grid twa:place-items-center twa:border-dashed twa:border-2'), children: (0, jsx_runtime_1.jsxs)(Flex_1.Box, { className: "twa:flex twa:flex-col twa:gap-2 twa:items-center twa:justify-center", children: [(0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:text-muted-foreground ab-Layout-Wizard__ColumnPropertiesEditor__Placeholder__Icon", children: (0, jsx_runtime_1.jsx)(icons_1.NaturallySizedIcon, { name: "inspector", style: { stroke: 'currentColor', fill: 'none', strokeWidth: 2 } }) }), (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:text-4 twa:font-bold ab-Layout-Wizard__ColumnPropertiesEditor__Placeholder__Title", children: "No Column Selected" }), (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:text-3 twa:opacity-80 ab-Layout-Wizard__ColumnPropertiesEditor__Placeholder__Description", children: "Select a Column to view and edit its properties" })] }) }));
470
470
  }
471
471
  const { column } = props;
472
472
  const columnWidth = props.layout.ColumnSizing?.[column.columnId]?.Width;
@@ -478,7 +478,7 @@ const ColumnPropertiesEditor = (props) => {
478
478
  const columnPinning = props.layout.ColumnPinning?.[props.column.columnId] || 'None';
479
479
  const initialHeader = adaptable.api.columnApi.getFriendlyNameForColumnId(props.column.columnId, props.layout);
480
480
  const customHeader = props.layout.ColumnHeaders?.[props.column.columnId] ?? initialHeader;
481
- return ((0, jsx_runtime_1.jsxs)(Flex_1.Box, { className: (0, clsx_1.default)(baseCls, 'ab-Layout-Wizard__ColumnPropertiesEditor__Container twa:border-none twa:bg-defaultbackground twa:shadow-md', 'twa:max-h-full twa:overflow-hidden twa:flex twa:flex-col'), children: [(0, jsx_runtime_1.jsxs)(Flex_1.Box, { className: "twa:px-4 twa:pt-4", children: [(0, jsx_runtime_1.jsxs)(Flex_1.Box, { className: "twa:text-5 twa:font-bold twa:leading-relaxed ab-Layout-Wizard__ColumnPropertiesEditor__Title", children: ["Column Settings: ", column.friendlyName] }), (0, jsx_runtime_1.jsxs)(Flex_1.Box, { className: "twa:text-3 twa:opacity-80 twa:flex twa:flex-row twa:gap-1 twa:items-center", children: ["Column ID:", ' ', (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:bg-primarydark/20 twa:text-text-on-primarydark twa:px-1 twa:py-0.5 twa:rounded-standard", children: column.columnId })] }), props.column.columnGroup && props.column.columnGroup.groupCount > 1 ? ((0, jsx_runtime_1.jsxs)(Flex_1.Box, { className: "ab-Layout-Wizard__ColumnRow__Title twa:mx-2 twa:p-1", children: ["Column Group: ", props.column.columnGroup.friendlyName] })) : null] }), hr, (0, jsx_runtime_1.jsxs)(Flex_1.Box, { className: "twa:px-4 twa:flex-1 twa:overflow-y-auto twa:pb-3", children: [(0, jsx_runtime_1.jsxs)(Flex_1.Flex, { flexDirection: "column", className: "twa:gap-3 twa:mt-3", children: [(0, jsx_runtime_1.jsxs)(Flex_1.Flex, { flexDirection: "column", className: "twa:gap-1", children: ["Header", (0, jsx_runtime_1.jsx)(Input_1.default, { "data-name": "column-header", className: "ab-Layout-Wizard__ColumnPropertiesEditor__Input twa:w-full", placeholder: "Custom name (optional)", disabled: props.column.isGeneratedSelectionColumn, onChange: () => {
481
+ return ((0, jsx_runtime_1.jsxs)(Flex_1.Box, { className: (0, clsx_1.default)(baseCls, 'ab-Layout-Wizard__ColumnPropertiesEditor__Container twa:border-none twa:bg-background twa:shadow-md', 'twa:max-h-full twa:overflow-hidden twa:flex twa:flex-col'), children: [(0, jsx_runtime_1.jsxs)(Flex_1.Box, { className: "twa:px-4 twa:pt-4", children: [(0, jsx_runtime_1.jsxs)(Flex_1.Box, { className: "twa:text-5 twa:font-bold twa:leading-relaxed ab-Layout-Wizard__ColumnPropertiesEditor__Title", children: ["Column Settings: ", column.friendlyName] }), (0, jsx_runtime_1.jsxs)(Flex_1.Box, { className: "twa:text-3 twa:opacity-80 twa:flex twa:flex-row twa:gap-1 twa:items-center", children: ["Column ID:", ' ', (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:bg-primarydark/20 twa:text-muted-foreground twa:px-1 twa:py-0.5 twa:rounded-standard", children: column.columnId })] }), props.column.columnGroup && props.column.columnGroup.groupCount > 1 ? ((0, jsx_runtime_1.jsxs)(Flex_1.Box, { className: "ab-Layout-Wizard__ColumnRow__Title twa:mx-2 twa:p-1", children: ["Column Group: ", props.column.columnGroup.friendlyName] })) : null] }), hr, (0, jsx_runtime_1.jsxs)(Flex_1.Box, { className: "twa:px-4 twa:flex-1 twa:overflow-y-auto twa:pb-3", children: [(0, jsx_runtime_1.jsxs)(Flex_1.Flex, { flexDirection: "column", className: "twa:gap-3 twa:mt-3", children: [(0, jsx_runtime_1.jsxs)(Flex_1.Flex, { flexDirection: "column", className: "twa:gap-1", children: ["Header", (0, jsx_runtime_1.jsx)(Input_1.default, { "data-name": "column-header", className: "ab-Layout-Wizard__ColumnPropertiesEditor__Input twa:w-full", placeholder: "Custom name (optional)", disabled: props.column.isGeneratedSelectionColumn, onChange: () => {
482
482
  props.onColumnNameChange(props.column.columnId, event.target.value);
483
483
  }, value: customHeader })] }), (0, jsx_runtime_1.jsxs)(Flex_1.Box, { className: "twa:grid twa:grid-cols-[1fr_1fr] twa:gap-2", children: [(0, jsx_runtime_1.jsx)(Flex_1.Box, { children: "Width:" }), " ", (0, jsx_runtime_1.jsx)(Flex_1.Box, { children: "Flex:" }), (0, jsx_runtime_1.jsx)(Input_1.default, { "data-name": "column-width", className: "ab-Layout-Wizard__ColumnPropertiesEditor__Input", type: "number", placeholder: "Column width", disabled: resizable === false, onChange: (event) => {
484
484
  let value = parseFloat(event.target.value);
@@ -16,7 +16,7 @@ const CheckBox_1 = require("../../../../components/CheckBox");
16
16
  const PivotColumnsSectionSummary = () => {
17
17
  const adaptable = (0, AdaptableContext_1.useAdaptable)();
18
18
  const { data: layout } = (0, OnePageAdaptableWizard_1.useOnePageAdaptableWizardContext)();
19
- return ((0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:p-2 twa:rounded-standard twa:bg-defaultbackground", children: layout.PivotColumns?.length ? (layout.PivotColumns.map((columnId) => ((0, jsx_runtime_1.jsx)(Tag_1.Tag, { className: "twa:mr-1", children: adaptable.api.columnApi.getFriendlyNameForColumnId(columnId) }, columnId)))) : ((0, jsx_runtime_1.jsx)(Tag_1.Tag, { children: "No Pivot Columns Defined" })) }));
19
+ return ((0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:p-2 twa:rounded-standard twa:bg-background", children: layout.PivotColumns?.length ? (layout.PivotColumns.map((columnId) => ((0, jsx_runtime_1.jsx)(Tag_1.Tag, { className: "twa:mr-1", children: adaptable.api.columnApi.getFriendlyNameForColumnId(columnId) }, columnId)))) : ((0, jsx_runtime_1.jsx)(Tag_1.Tag, { children: "No Pivot Columns Defined" })) }));
20
20
  };
21
21
  exports.PivotColumnsSectionSummary = PivotColumnsSectionSummary;
22
22
  const PivotColumnsSection = (props) => {
@@ -79,10 +79,14 @@ const RowGroupingSection = (props) => {
79
79
  if (RowGroupDisplayType === 'single') {
80
80
  newLayout.TableColumns = (newLayout.TableColumns || []).filter((colId) => !adaptable.api.columnApi.isAutoRowGroupColumnForMulti(colId));
81
81
  }
82
- else {
82
+ else if (RowGroupDisplayType === 'multi') {
83
83
  newLayout.TableColumns = (newLayout.TableColumns || []).filter((colId) => !adaptable.api.columnApi.isAutoRowGroupColumnForSingle(colId));
84
84
  }
85
+ else {
86
+ newLayout.TableColumns = (newLayout.TableColumns || []).filter((colId) => !adaptable.api.columnApi.isAutoRowGroupColumnForSingle(colId) &&
87
+ !adaptable.api.columnApi.isAutoRowGroupColumnForMulti(colId));
88
+ }
85
89
  onChange(newLayout);
86
- }, children: [(0, jsx_runtime_1.jsx)(TypeRadio_1.TypeRadio, { value: "single", text: "Single Column", description: "All Row Grouped Columns display in one hierarchical Column" }), (0, jsx_runtime_1.jsx)(TypeRadio_1.TypeRadio, { value: "multi", text: "Multiple Columns", description: "Each Row Grouped Column displays in its own, separate, Column" })] }) }) })] }), (0, jsx_runtime_1.jsxs)(Tabs_1.Tabs, { className: "twa:mt-2", children: [(0, jsx_runtime_1.jsx)(Tabs_1.Tabs.Tab, { children: "Row Grouped Columns" }), (0, jsx_runtime_1.jsx)(Tabs_1.Tabs.Tab, { children: rowGroupsText }), (0, jsx_runtime_1.jsx)(Tabs_1.Tabs.Content, { children: (0, jsx_runtime_1.jsx)(ValueSelector_1.ValueSelector, { showFilterInput: true, filter: Utilities_1.columnFilter, toIdentifier: (option) => `${option.columnId}`, toLabel: (option) => option.friendlyName ?? option.columnId, toListLabel: (option) => ((0, jsx_runtime_1.jsxs)(Flex_1.Flex, { alignItems: "center", children: [option.friendlyName ?? option.columnId, (0, jsx_runtime_1.jsx)(ColumnGroupTag_1.ColumnGroupTag, { column: option })] })), options: sortedGroupableColumns, value: layout.RowGroupedColumns ?? [], allowReorder: true, onChange: handleColumnsChange }) }), (0, jsx_runtime_1.jsx)(Tabs_1.Tabs.Content, { children: (0, jsx_runtime_1.jsx)(exports.RowGroupBehaviorSection, { layout: layout, onChange: onChange }) })] })] }));
90
+ }, children: [(0, jsx_runtime_1.jsx)(TypeRadio_1.TypeRadio, { value: "single", text: "Single Column", description: "All Row Grouped Columns display in one hierarchical Column" }), (0, jsx_runtime_1.jsx)(TypeRadio_1.TypeRadio, { value: "multi", text: "Multiple Columns", description: "Each Row Grouped Column displays in its own, separate, Column" }), (0, jsx_runtime_1.jsx)(TypeRadio_1.TypeRadio, { value: "groupRows", text: "Full Width Group Rows", description: "Row groups display as full-width rows (no group column and no aggregations)" })] }) }) })] }), (0, jsx_runtime_1.jsxs)(Tabs_1.Tabs, { className: "twa:mt-2", children: [(0, jsx_runtime_1.jsx)(Tabs_1.Tabs.Tab, { children: "Row Grouped Columns" }), (0, jsx_runtime_1.jsx)(Tabs_1.Tabs.Tab, { children: rowGroupsText }), (0, jsx_runtime_1.jsx)(Tabs_1.Tabs.Content, { children: (0, jsx_runtime_1.jsx)(ValueSelector_1.ValueSelector, { showFilterInput: true, filter: Utilities_1.columnFilter, toIdentifier: (option) => `${option.columnId}`, toLabel: (option) => option.friendlyName ?? option.columnId, toListLabel: (option) => ((0, jsx_runtime_1.jsxs)(Flex_1.Flex, { alignItems: "center", children: [option.friendlyName ?? option.columnId, (0, jsx_runtime_1.jsx)(ColumnGroupTag_1.ColumnGroupTag, { column: option })] })), options: sortedGroupableColumns, value: layout.RowGroupedColumns ?? [], allowReorder: true, onChange: handleColumnsChange }) }), (0, jsx_runtime_1.jsx)(Tabs_1.Tabs.Content, { children: (0, jsx_runtime_1.jsx)(exports.RowGroupBehaviorSection, { layout: layout, onChange: onChange }) })] })] }));
87
91
  };
88
92
  exports.RowGroupingSection = RowGroupingSection;
@@ -74,6 +74,6 @@ const RowSelectionSection = (props) => {
74
74
  }
75
75
  props.onChange(newLayout);
76
76
  };
77
- return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)(Tabs_1.Tabs, { children: [(0, jsx_runtime_1.jsx)(Tabs_1.Tabs.Tab, { children: "Row Selection Mode" }), (0, jsx_runtime_1.jsx)(Tabs_1.Tabs.Content, { children: (0, jsx_runtime_1.jsx)(Flex_1.Flex, { flexDirection: "column", children: (0, jsx_runtime_1.jsxs)(Radio_2.RadioGroup, { orientation: "horizontal", variant: "text-only", className: (0, twMerge_1.twMerge)(Radio_1.radioGroupStyling.horizontalTextOnly, 'twa:gap-2 twa:max-w-[500px] twa:bg-defaultbackground twa:p-2'), value: mode, name: "rowSelectionMode", onRadioChange: handleModeChange, children: [(0, jsx_runtime_1.jsx)(Radio_1.default, { value: false, children: "Disabled" }), (0, jsx_runtime_1.jsx)(Radio_1.default, { value: "singleRow", children: "Single Row" }), (0, jsx_runtime_1.jsx)(Radio_1.default, { value: "multiRow", children: "Multi Row" })] }) }) })] }), !rowSelection && (0, jsx_runtime_1.jsx)(HelpBlock_1.default, { children: "There is no Row Selection configured for this Layout" }), rowSelection && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)(Tabs_1.Tabs, { className: "twa:mt-2", children: [(0, jsx_runtime_1.jsx)(Tabs_1.Tabs.Tab, { children: "Row Selection Column Checkboxes" }), (0, jsx_runtime_1.jsx)(Tabs_1.Tabs.Content, { children: (0, jsx_runtime_1.jsxs)(Flex_1.Flex, { flexDirection: "row", className: "twa:gap-6", children: [(0, jsx_runtime_1.jsx)(CheckBox_1.CheckBox, { className: "twa:flex-1", checked: rowSelection.Checkboxes ?? true, onChange: (checked) => updateRowSelection({ Checkboxes: checked }), children: "Checkboxes in Column Cells" }), mode === 'multiRow' && ((0, jsx_runtime_1.jsx)(CheckBox_1.CheckBox, { className: "twa:flex-1", checked: rowSelection.HeaderCheckbox ?? true, onChange: (checked) => updateRowSelection({ HeaderCheckbox: checked }), children: "Checkbox in Column Header (to enable Select All)" }))] }) })] }), (rowSelection.Checkboxes ?? true) && ((0, jsx_runtime_1.jsxs)(Tabs_1.Tabs, { className: "twa:mt-2", children: [(0, jsx_runtime_1.jsx)(Tabs_1.Tabs.Tab, { children: "Row Grouping Selection Checkboxes" }), (0, jsx_runtime_1.jsx)(Tabs_1.Tabs.Content, { children: (0, jsx_runtime_1.jsxs)(Radio_2.RadioGroup, { orientation: "vertical", value: rowSelection.CheckboxInGroupColumn ?? false, name: "checkboxLocation", onRadioChange: (value) => updateRowSelection({ CheckboxInGroupColumn: value }), children: [(0, jsx_runtime_1.jsx)(Radio_1.default, { value: false, children: "Display in dedicated Selection Column" }), (0, jsx_runtime_1.jsx)(Radio_1.default, { value: true, children: "Display in Row Grouped Column" })] }) })] })), (0, jsx_runtime_1.jsxs)(Tabs_1.Tabs, { className: "twa:mt-2", children: [(0, jsx_runtime_1.jsx)(Tabs_1.Tabs.Tab, { children: "Row Click Selection (when user clicks on Row outside of Selection Checkbox)" }), (0, jsx_runtime_1.jsx)(Tabs_1.Tabs.Content, { children: (0, jsx_runtime_1.jsxs)(Radio_2.RadioGroup, { orientation: "vertical", value: rowSelection.EnableClickSelection ?? false, name: "clickSelection", onRadioChange: (value) => updateRowSelection({ EnableClickSelection: value }), children: [(0, jsx_runtime_1.jsx)(Radio_1.default, { value: false, children: "Disabled (Cannot select or deselect by clicking in Row)" }), (0, jsx_runtime_1.jsx)(Radio_1.default, { value: true, children: "Full (Enable selection by clicking in Row and deselection by Ctrl+clicking in Row)" }), (0, jsx_runtime_1.jsx)(Radio_1.default, { value: 'enableSelection', children: "Selection Only (Enable selection by clicking in Row)" }), (0, jsx_runtime_1.jsx)(Radio_1.default, { value: 'enableDeselection', children: "Deselection Only (Enable deselection by Ctrl+clicking in Row)" })] }) })] }), mode === 'multiRow' && !isPivot && ((0, jsx_runtime_1.jsxs)(Tabs_1.Tabs, { className: "twa:mt-2", children: [(0, jsx_runtime_1.jsx)(Tabs_1.Tabs.Tab, { children: "Grouped Row Selection Behaviour" }), (0, jsx_runtime_1.jsx)(Tabs_1.Tabs.Content, { children: (0, jsx_runtime_1.jsxs)(Radio_2.RadioGroup, { orientation: "vertical", value: rowSelection.GroupSelectMode ?? 'self', name: "groupSelectMode", onRadioChange: (value) => updateRowSelection({ GroupSelectMode: value }), children: [(0, jsx_runtime_1.jsx)(Radio_1.default, { value: 'self', children: "Select Grouped Row Only (no cascade)" }), (0, jsx_runtime_1.jsx)(Radio_1.default, { value: 'descendants', children: "Select Grouped Row and all descendants" }), (0, jsx_runtime_1.jsx)(Radio_1.default, { value: 'filteredDescendants', children: "Select Grouped Row and only filtered descendants" })] }) })] })), mode === 'multiRow' && ((0, jsx_runtime_1.jsxs)(Tabs_1.Tabs, { className: "twa:mt-2", children: [(0, jsx_runtime_1.jsx)(Tabs_1.Tabs.Tab, { children: "Select All (in Header) Behaviour" }), (0, jsx_runtime_1.jsx)(Tabs_1.Tabs.Content, { children: (0, jsx_runtime_1.jsxs)(Radio_2.RadioGroup, { orientation: "vertical", value: rowSelection.SelectAllMode ?? 'all', name: "selectAllMode", onRadioChange: (value) => updateRowSelection({ SelectAllMode: value }), children: [(0, jsx_runtime_1.jsx)(Radio_1.default, { value: 'all', children: "All rows" }), (0, jsx_runtime_1.jsx)(Radio_1.default, { value: 'filtered', children: "Filtered rows only" }), (0, jsx_runtime_1.jsx)(Radio_1.default, { value: 'currentPage', children: "Current page only" })] }) })] }))] }))] }));
77
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)(Tabs_1.Tabs, { children: [(0, jsx_runtime_1.jsx)(Tabs_1.Tabs.Tab, { children: "Row Selection Mode" }), (0, jsx_runtime_1.jsx)(Tabs_1.Tabs.Content, { children: (0, jsx_runtime_1.jsx)(Flex_1.Flex, { flexDirection: "column", children: (0, jsx_runtime_1.jsxs)(Radio_2.RadioGroup, { orientation: "horizontal", variant: "text-only", className: (0, twMerge_1.twMerge)(Radio_1.radioGroupStyling.horizontalTextOnly, 'twa:gap-2 twa:max-w-[500px] twa:bg-background twa:p-2'), value: mode, name: "rowSelectionMode", onRadioChange: handleModeChange, children: [(0, jsx_runtime_1.jsx)(Radio_1.default, { value: false, children: "Disabled" }), (0, jsx_runtime_1.jsx)(Radio_1.default, { value: "singleRow", children: "Single Row" }), (0, jsx_runtime_1.jsx)(Radio_1.default, { value: "multiRow", children: "Multi Row" })] }) }) })] }), !rowSelection && (0, jsx_runtime_1.jsx)(HelpBlock_1.default, { children: "There is no Row Selection configured for this Layout" }), rowSelection && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)(Tabs_1.Tabs, { className: "twa:mt-2", children: [(0, jsx_runtime_1.jsx)(Tabs_1.Tabs.Tab, { children: "Row Selection Column Checkboxes" }), (0, jsx_runtime_1.jsx)(Tabs_1.Tabs.Content, { children: (0, jsx_runtime_1.jsxs)(Flex_1.Flex, { flexDirection: "row", className: "twa:gap-6", children: [(0, jsx_runtime_1.jsx)(CheckBox_1.CheckBox, { className: "twa:flex-1", checked: rowSelection.Checkboxes ?? true, onChange: (checked) => updateRowSelection({ Checkboxes: checked }), children: "Checkboxes in Column Cells" }), mode === 'multiRow' && ((0, jsx_runtime_1.jsx)(CheckBox_1.CheckBox, { className: "twa:flex-1", checked: rowSelection.HeaderCheckbox ?? true, onChange: (checked) => updateRowSelection({ HeaderCheckbox: checked }), children: "Checkbox in Column Header (to enable Select All)" }))] }) })] }), (rowSelection.Checkboxes ?? true) && ((0, jsx_runtime_1.jsxs)(Tabs_1.Tabs, { className: "twa:mt-2", children: [(0, jsx_runtime_1.jsx)(Tabs_1.Tabs.Tab, { children: "Row Grouping Selection Checkboxes" }), (0, jsx_runtime_1.jsx)(Tabs_1.Tabs.Content, { children: (0, jsx_runtime_1.jsxs)(Radio_2.RadioGroup, { orientation: "vertical", value: rowSelection.CheckboxInGroupColumn ?? false, name: "checkboxLocation", onRadioChange: (value) => updateRowSelection({ CheckboxInGroupColumn: value }), children: [(0, jsx_runtime_1.jsx)(Radio_1.default, { value: false, children: "Display in dedicated Selection Column" }), (0, jsx_runtime_1.jsx)(Radio_1.default, { value: true, children: "Display in Row Grouped Column" })] }) })] })), (0, jsx_runtime_1.jsxs)(Tabs_1.Tabs, { className: "twa:mt-2", children: [(0, jsx_runtime_1.jsx)(Tabs_1.Tabs.Tab, { children: "Row Click Selection (when user clicks on Row outside of Selection Checkbox)" }), (0, jsx_runtime_1.jsx)(Tabs_1.Tabs.Content, { children: (0, jsx_runtime_1.jsxs)(Radio_2.RadioGroup, { orientation: "vertical", value: rowSelection.EnableClickSelection ?? false, name: "clickSelection", onRadioChange: (value) => updateRowSelection({ EnableClickSelection: value }), children: [(0, jsx_runtime_1.jsx)(Radio_1.default, { value: false, children: "Disabled (Cannot select or deselect by clicking in Row)" }), (0, jsx_runtime_1.jsx)(Radio_1.default, { value: true, children: "Full (Enable selection by clicking in Row and deselection by Ctrl+clicking in Row)" }), (0, jsx_runtime_1.jsx)(Radio_1.default, { value: 'enableSelection', children: "Selection Only (Enable selection by clicking in Row)" }), (0, jsx_runtime_1.jsx)(Radio_1.default, { value: 'enableDeselection', children: "Deselection Only (Enable deselection by Ctrl+clicking in Row)" })] }) })] }), mode === 'multiRow' && !isPivot && ((0, jsx_runtime_1.jsxs)(Tabs_1.Tabs, { className: "twa:mt-2", children: [(0, jsx_runtime_1.jsx)(Tabs_1.Tabs.Tab, { children: "Grouped Row Selection Behaviour" }), (0, jsx_runtime_1.jsx)(Tabs_1.Tabs.Content, { children: (0, jsx_runtime_1.jsxs)(Radio_2.RadioGroup, { orientation: "vertical", value: rowSelection.GroupSelectMode ?? 'self', name: "groupSelectMode", onRadioChange: (value) => updateRowSelection({ GroupSelectMode: value }), children: [(0, jsx_runtime_1.jsx)(Radio_1.default, { value: 'self', children: "Select Grouped Row Only (no cascade)" }), (0, jsx_runtime_1.jsx)(Radio_1.default, { value: 'descendants', children: "Select Grouped Row and all descendants" }), (0, jsx_runtime_1.jsx)(Radio_1.default, { value: 'filteredDescendants', children: "Select Grouped Row and only filtered descendants" })] }) })] })), mode === 'multiRow' && ((0, jsx_runtime_1.jsxs)(Tabs_1.Tabs, { className: "twa:mt-2", children: [(0, jsx_runtime_1.jsx)(Tabs_1.Tabs.Tab, { children: "Select All (in Header) Behaviour" }), (0, jsx_runtime_1.jsx)(Tabs_1.Tabs.Content, { children: (0, jsx_runtime_1.jsxs)(Radio_2.RadioGroup, { orientation: "vertical", value: rowSelection.SelectAllMode ?? 'all', name: "selectAllMode", onRadioChange: (value) => updateRowSelection({ SelectAllMode: value }), children: [(0, jsx_runtime_1.jsx)(Radio_1.default, { value: 'all', children: "All rows" }), (0, jsx_runtime_1.jsx)(Radio_1.default, { value: 'filtered', children: "Filtered rows only" }), (0, jsx_runtime_1.jsx)(Radio_1.default, { value: 'currentPage', children: "Current page only" })] }) })] }))] }))] }));
78
78
  };
79
79
  exports.RowSelectionSection = RowSelectionSection;
@@ -25,6 +25,6 @@ const SettingsSection = (props) => {
25
25
  Name: event.target.value,
26
26
  });
27
27
  };
28
- return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)(Tabs_1.Tabs, { className: "twa:mb-3", children: [(0, jsx_runtime_1.jsx)(Tabs_1.Tabs.Tab, { children: "Settings" }), (0, jsx_runtime_1.jsx)(Tabs_1.Tabs.Content, { children: (0, jsx_runtime_1.jsx)(Flex_1.Flex, { flexDirection: "row", children: (0, jsx_runtime_1.jsx)(FormLayout_1.default, { className: "twa:max-w-[300px] twa:w-full", children: (0, jsx_runtime_1.jsx)(FormLayout_1.FormRow, { label: "Name", children: (0, jsx_runtime_1.jsx)(Input_1.default, { className: "twa:w-full", "data-name": "layout-name", onChange: onNameChange, value: layout?.Name ?? '' }) }) }) }) })] }), (0, jsx_runtime_1.jsxs)(Tabs_1.Tabs, { className: "twa:mb-2", children: [(0, jsx_runtime_1.jsx)(Tabs_1.Tabs.Tab, { children: "Grid Type" }), (0, jsx_runtime_1.jsx)(Tabs_1.Tabs.Content, { children: (0, jsx_runtime_1.jsxs)(Flex_1.Flex, { flexDirection: "column", children: [(0, jsx_runtime_1.jsx)(Radio_1.default, { "data-name": "layout-type-table", disabled: true, checked: !(0, isPivotLayout_1.isPivotLayout)(layout), children: "Table" }), (0, jsx_runtime_1.jsx)(Radio_1.default, { "data-name": "layout-type-pivot", disabled: true, checked: (0, isPivotLayout_1.isPivotLayout)(layout), children: "Pivot" })] }) })] })] }));
28
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)(Tabs_1.Tabs, { className: "twa:mb-2", children: [(0, jsx_runtime_1.jsx)(Tabs_1.Tabs.Tab, { children: "Settings" }), (0, jsx_runtime_1.jsx)(Tabs_1.Tabs.Content, { children: (0, jsx_runtime_1.jsx)(Flex_1.Flex, { flexDirection: "row", children: (0, jsx_runtime_1.jsx)(FormLayout_1.default, { className: "twa:max-w-[300px] twa:w-full", children: (0, jsx_runtime_1.jsx)(FormLayout_1.FormRow, { label: "Name", children: (0, jsx_runtime_1.jsx)(Input_1.default, { className: "twa:w-full", "data-name": "layout-name", onChange: onNameChange, value: layout?.Name ?? '' }) }) }) }) })] }), (0, jsx_runtime_1.jsxs)(Tabs_1.Tabs, { className: "twa:mb-2", children: [(0, jsx_runtime_1.jsx)(Tabs_1.Tabs.Tab, { children: "Grid Type" }), (0, jsx_runtime_1.jsx)(Tabs_1.Tabs.Content, { children: (0, jsx_runtime_1.jsxs)(Flex_1.Flex, { flexDirection: "column", children: [(0, jsx_runtime_1.jsx)(Radio_1.default, { "data-name": "layout-type-table", disabled: true, checked: !(0, isPivotLayout_1.isPivotLayout)(layout), children: "Table" }), (0, jsx_runtime_1.jsx)(Radio_1.default, { "data-name": "layout-type-pivot", disabled: true, checked: (0, isPivotLayout_1.isPivotLayout)(layout), children: "Pivot" })] }) })] })] }));
29
29
  };
30
30
  exports.SettingsSection = SettingsSection;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.LicenseWatermark=void 0;const e=require("tslib"),r=require("react/jsx-runtime"),t=e.__importStar(require("react")),o=require("../../components/Logo"),n=require("../../components/Flex"),i={border:"1px solid var(--ab-color-error)",padding:"5px",fontWeight:600,margin:"5px",fontSize:"14px",alignItems:"center",color:"var(--ab-color-foreground)",background:"var(--ab-color-defaultbackground)"},s=e=>{const r=[["display","none"],["opacity","0"],["position","absolute"],["position","fixed"],["position","relative"],["visibility","hidden"]];for(const[t,o]of r)if(e.style[t]===o)return!1;return!0},l=e=>{const l=t.useRef(null);return t.useEffect(()=>{const e=setInterval(()=>{l.current?.isConnected||alert("It is not allowed to remove the Adaptable watermark."),s(l.current)||alert("It is not allowed to modify the Adaptable watermark."),l?.current?.style&&(l.current.style.border=i.border,l.current.style.padding=i.padding,l.current.style.fontWeight=`${i.fontWeight}`,l.current.style.margin=i.margin,l.current.style.fontSize=i.fontSize,l.current.style.color=i.color,l.current.style.background=i.background,l.current.style.display="flex",l.current.style.position="static",l.current.style.opacity="1",l.current.style.visibility="visible")},5e3);return()=>clearTimeout(e)},[]),(0,r.jsxs)(n.Flex,{style:i,ref:l,children:[(0,r.jsx)(o.Logo,{style:{marginRight:10}}),(0,r.jsx)("div",{children:e.children})]})};exports.LicenseWatermark=l;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.LicenseWatermark=void 0;const e=require("tslib"),r=require("react/jsx-runtime"),t=e.__importStar(require("react")),o=require("../../components/Logo"),n=require("../../components/Flex"),i={border:"1px solid var(--ab-color-error)",padding:"5px",fontWeight:600,margin:"5px",fontSize:"14px",alignItems:"center",color:"var(--ab-color-foreground)",background:"var(--ab-color-background)"},s=e=>{const r=[["display","none"],["opacity","0"],["position","absolute"],["position","fixed"],["position","relative"],["visibility","hidden"]];for(const[t,o]of r)if(e.style[t]===o)return!1;return!0},l=e=>{const l=t.useRef(null);return t.useEffect(()=>{const e=setInterval(()=>{l.current?.isConnected||alert("It is not allowed to remove the Adaptable watermark."),s(l.current)||alert("It is not allowed to modify the Adaptable watermark."),l?.current?.style&&(l.current.style.border=i.border,l.current.style.padding=i.padding,l.current.style.fontWeight=`${i.fontWeight}`,l.current.style.margin=i.margin,l.current.style.fontSize=i.fontSize,l.current.style.color=i.color,l.current.style.background=i.background,l.current.style.display="flex",l.current.style.position="static",l.current.style.opacity="1",l.current.style.visibility="visible")},5e3);return()=>clearTimeout(e)},[]),(0,r.jsxs)(n.Flex,{style:i,ref:l,children:[(0,r.jsx)(o.Logo,{style:{marginRight:10}}),(0,r.jsx)("div",{children:e.children})]})};exports.LicenseWatermark=l;
@@ -234,7 +234,7 @@ const StyledColumnWizardScopeSection = (props) => {
234
234
  // -------------------------------------------------------------------------
235
235
  // Render
236
236
  // -------------------------------------------------------------------------
237
- return ((0, jsx_runtime_1.jsxs)(Flex_1.Flex, { flexDirection: "column", style: { height: '100%' }, children: [(0, jsx_runtime_1.jsxs)(Flex_1.Flex, { flexDirection: "column", className: "twa:flex-1 twa:min-h-0", children: [(0, jsx_runtime_1.jsxs)(Flex_1.Flex, { flexDirection: "row", alignItems: "center", className: "twa:p-2 twa:gap-3 twa:border-b twa:border-b-text-on-defaultbackground/20", children: [(0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:text-5 twa:font-medium", children: "Column" }), (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:text-xs twa:opacity-70", children: "The Column the Style is applied to" }), (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:flex-1" }), (0, jsx_runtime_1.jsx)(AdaptableFormControlTextClear_1.AdaptableFormControlTextClear, { value: columnsSearchText, OnTextChange: setColumnsSearchText, placeholder: "Type to search columns", style: { flex: 1, maxWidth: 320 } })] }), (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:flex-1 twa:min-h-0 twa:overflow-auto", children: (0, jsx_runtime_1.jsx)(ColumnSelector_1.NewColumnSelector, { columnFilterText: columnsSearchText, availableColumns: sortableCols, selected: data.ColumnId ? [data.ColumnId] : [], singleSelect: true, onChange: handleColumnsChange, allowReorder: false }) })] }), (0, jsx_runtime_1.jsxs)(Flex_1.Box, { className: "twa:border-t twa:border-border twa:px-2 twa:py-3 twa:shrink-0", children: [(0, jsx_runtime_1.jsxs)(Flex_1.Flex, { alignItems: "center", className: "twa:gap-3 twa:pb-2 twa:mb-3 twa:flex-wrap twa:border-b twa:border-b-text-on-defaultbackground/20", children: [(0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:text-5 twa:font-medium", children: "Rows" }), (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:text-xs twa:opacity-70 twa:max-w-[520px]", children: "Which kinds of Rows should the Styled Column render on" })] }), (0, jsx_runtime_1.jsx)(Flex_1.Flex, { flexDirection: "row", className: "twa:gap-6 twa:flex-wrap", children: [
237
+ return ((0, jsx_runtime_1.jsxs)(Flex_1.Flex, { flexDirection: "column", style: { height: '100%' }, children: [(0, jsx_runtime_1.jsxs)(Flex_1.Flex, { flexDirection: "column", className: "twa:flex-1 twa:min-h-0", children: [(0, jsx_runtime_1.jsxs)(Flex_1.Flex, { flexDirection: "row", alignItems: "center", className: "twa:p-2 twa:gap-3 twa:border-b twa:border-b-foreground/20", children: [(0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:text-5 twa:font-medium", children: "Column" }), (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:text-xs twa:opacity-70", children: "The Column the Style is applied to" }), (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:flex-1" }), (0, jsx_runtime_1.jsx)(AdaptableFormControlTextClear_1.AdaptableFormControlTextClear, { value: columnsSearchText, OnTextChange: setColumnsSearchText, placeholder: "Type to search columns", style: { flex: 1, maxWidth: 320 } })] }), (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:flex-1 twa:min-h-0 twa:overflow-auto", children: (0, jsx_runtime_1.jsx)(ColumnSelector_1.NewColumnSelector, { columnFilterText: columnsSearchText, availableColumns: sortableCols, selected: data.ColumnId ? [data.ColumnId] : [], singleSelect: true, onChange: handleColumnsChange, allowReorder: false }) })] }), (0, jsx_runtime_1.jsxs)(Flex_1.Box, { className: "twa:border-t twa:border-border twa:px-2 twa:py-3 twa:shrink-0", children: [(0, jsx_runtime_1.jsxs)(Flex_1.Flex, { alignItems: "center", className: "twa:gap-3 twa:pb-2 twa:mb-3 twa:flex-wrap twa:border-b twa:border-b-foreground/20", children: [(0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:text-5 twa:font-medium", children: "Rows" }), (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:text-xs twa:opacity-70 twa:max-w-[520px]", children: "Which kinds of Rows should the Styled Column render on" })] }), (0, jsx_runtime_1.jsx)(Flex_1.Flex, { flexDirection: "row", className: "twa:gap-6 twa:flex-wrap", children: [
238
238
  styledColumnRowKindSupport_1.STYLED_COLUMN_ROW_KINDS.slice(0, 2),
239
239
  styledColumnRowKindSupport_1.STYLED_COLUMN_ROW_KINDS.slice(2),
240
240
  ].map((rowKindGroup, groupIndex) => ((0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:flex-1 twa:min-w-[220px]", children: (0, jsx_runtime_1.jsx)(FormLayout_1.default, { sizes: ['180px', '1fr'], children: rowKindGroup.map((kind) => {