@adaptabletools/adaptable 22.0.0-canary.3 → 22.0.0-canary.5

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 (150) hide show
  1. package/index.css +58 -29
  2. package/index.css.map +1 -1
  3. package/package.json +1 -1
  4. package/src/AdaptableOptions/ActionColumnOptions.d.ts +2 -2
  5. package/src/AdaptableOptions/CustomSortOptions.d.ts +5 -0
  6. package/src/AdaptableOptions/DashboardOptions.d.ts +1 -2
  7. package/src/AdaptableOptions/ToolPanelOptions.d.ts +1 -2
  8. package/src/AdaptableState/AlertState.d.ts +2 -2
  9. package/src/AdaptableState/ChartingState.d.ts +3 -3
  10. package/src/AdaptableState/Common/AdaptableAlert.d.ts +2 -2
  11. package/src/AdaptableState/Common/AdaptableButton.d.ts +2 -2
  12. package/src/AdaptableState/Common/AdaptableFlashingCell.d.ts +2 -2
  13. package/src/AdaptableState/Common/AdaptableObject.d.ts +25 -2
  14. package/src/AdaptableState/Common/AdaptableStyle.d.ts +1 -1
  15. package/src/AdaptableState/Common/RowSummary.d.ts +1 -1
  16. package/src/AdaptableState/Common/Schedule.d.ts +3 -4
  17. package/src/AdaptableState/Common/SystemStatusMessageInfo.d.ts +2 -2
  18. package/src/AdaptableState/CustomSortState.d.ts +2 -2
  19. package/src/AdaptableState/DashboardState.d.ts +2 -2
  20. package/src/AdaptableState/ExportState.d.ts +2 -2
  21. package/src/AdaptableState/FlashingCellState.d.ts +2 -2
  22. package/src/AdaptableState/FormatColumnState.d.ts +2 -2
  23. package/src/AdaptableState/LayoutState.d.ts +8 -3
  24. package/src/AdaptableState/NamedQueryState.d.ts +2 -2
  25. package/src/AdaptableState/PlusMinusState.d.ts +2 -2
  26. package/src/AdaptableState/ShortcutState.d.ts +2 -2
  27. package/src/AdaptableState/StyledColumnState.d.ts +1 -1
  28. package/src/AdaptableState/ThemeState.d.ts +2 -2
  29. package/src/Api/CustomSortApi.d.ts +6 -3
  30. package/src/Api/Implementation/CustomSortApiImpl.d.ts +5 -1
  31. package/src/Api/Implementation/CustomSortApiImpl.js +2 -2
  32. package/src/Api/Implementation/LayoutHelpers.js +7 -0
  33. package/src/Api/Implementation/ScheduleApiImpl.js +1 -0
  34. package/src/Redux/ActionsReducers/LayoutRedux.d.ts +1 -1
  35. package/src/Strategy/AlertModule.js +4 -0
  36. package/src/Strategy/CustomSortModule.js +4 -0
  37. package/src/Strategy/FlashingCellModule.js +5 -0
  38. package/src/Strategy/FormatColumnModule.js +4 -0
  39. package/src/Strategy/LayoutModule.js +4 -4
  40. package/src/Strategy/PlusMinusModule.js +4 -0
  41. package/src/Strategy/ScheduleModule.js +4 -0
  42. package/src/Strategy/ShortcutModule.js +4 -0
  43. package/src/Utilities/Extensions/StringExtensions.d.ts +2 -0
  44. package/src/Utilities/Extensions/StringExtensions.js +16 -0
  45. package/src/Utilities/Helpers/FormatHelper.js +9 -2
  46. package/src/Utilities/ObjectFactory.js +15 -2
  47. package/src/View/Alert/Utilities/getDefaultAlertDefinition.d.ts +2 -1
  48. package/src/View/Alert/Wizard/AlertTypeWizardSection.d.ts +5 -2
  49. package/src/View/Alert/Wizard/AlertTypeWizardSection.js +47 -12
  50. package/src/View/Alert/Wizard/AlertWizard.js +14 -10
  51. package/src/View/Components/Buttons/EntityListActionButtons.d.ts +1 -2
  52. package/src/View/Components/Buttons/SuspendToggleButton/SuspendToggleButton.d.ts +1 -2
  53. package/src/View/Components/StyleComponent.d.ts +1 -0
  54. package/src/View/Components/StyleComponent.js +84 -33
  55. package/src/View/CustomSort/Wizard/CustomSortColumnWizardSection.d.ts +2 -1
  56. package/src/View/CustomSort/Wizard/CustomSortColumnWizardSection.js +40 -14
  57. package/src/View/CustomSort/Wizard/CustomSortWizard.js +4 -4
  58. package/src/View/DataChangeHistory/DataChangeHistoryGrid.js +1 -0
  59. package/src/View/FlashingCell/Wizard/FlashingCellSettingsWizardSection.d.ts +2 -1
  60. package/src/View/FlashingCell/Wizard/FlashingCellSettingsWizardSection.js +34 -14
  61. package/src/View/FlashingCell/Wizard/FlashingCellWizard.js +14 -10
  62. package/src/View/FormatColumn/Wizard/FormatColumnSettingsWizardSection.js +47 -29
  63. package/src/View/FormatColumn/Wizard/FormatColumnWizard.js +20 -9
  64. package/src/View/GridFilter/GridFilterExpressionEditor.js +6 -1
  65. package/src/View/GridFilter/GridFilterViewPanel.js +33 -70
  66. package/src/View/Layout/Wizard/sections/PivotColumnsSection.js +8 -0
  67. package/src/View/PlusMinus/Wizard/PlusMinusSettingsWizardSection.js +32 -9
  68. package/src/View/PlusMinus/Wizard/PlusMinusWizard.js +20 -15
  69. package/src/View/Schedule/Wizard/ScheduleSettingsWizard/ScheduleSettingsIPushPull.js +12 -1
  70. package/src/View/Schedule/Wizard/ScheduleSettingsWizard/ScheduleSettingsOpenFin.js +12 -1
  71. package/src/View/Schedule/Wizard/ScheduleSettingsWizard/ScheduleSettingsReminder.js +12 -2
  72. package/src/View/Schedule/Wizard/ScheduleSettingsWizard/ScheduleSettingsReport.js +12 -1
  73. package/src/View/Schedule/Wizard/ScheduleSettingsWizard/isSettingsValid.d.ts +2 -1
  74. package/src/View/Schedule/Wizard/ScheduleSettingsWizard/isSettingsValid.js +10 -1
  75. package/src/View/Shortcut/Wizard/ShortcutSettingsWizard.d.ts +2 -1
  76. package/src/View/Shortcut/Wizard/ShortcutSettingsWizard.js +25 -4
  77. package/src/View/Shortcut/Wizard/ShortcutWizard.js +18 -14
  78. package/src/components/ColorPicker/ColorPicker.js +5 -4
  79. package/src/components/ExpressionEditor/ExpressionFunctionDocumentation.js +1 -1
  80. package/src/env.js +2 -2
  81. package/src/layout-manager/src/LayoutManagerModel.d.ts +1 -0
  82. package/src/layout-manager/src/index.js +25 -7
  83. package/src/layout-manager/src/normalizeLayoutModel.js +3 -0
  84. package/src/metamodel/adaptable.metamodel.d.ts +30 -0
  85. package/src/metamodel/adaptable.metamodel.js +1 -1
  86. package/src/migration/AdaptableUpgradeHelper.js +1 -1
  87. package/src/migration/VersionUpgrade22.d.ts +15 -0
  88. package/src/migration/VersionUpgrade22.js +160 -0
  89. package/src/types.d.ts +1 -2
  90. package/tsconfig.esm.tsbuildinfo +1 -1
  91. package/src/AdaptableState/Common/SuspendableObject.d.ts +0 -10
  92. package/src/AdaptableState/Common/SuspendableObject.js +0 -1
  93. package/src/View/AdaptableWizardView/AdaptableConfigurationDialog/FinanceForm/FinanceForm.d.ts +0 -1
  94. package/src/View/AdaptableWizardView/AdaptableConfigurationDialog/FinanceForm/FinanceForm.js +0 -632
  95. package/src/View/Alert/AlertEntityRow.d.ts +0 -11
  96. package/src/View/Alert/AlertEntityRow.js +0 -28
  97. package/src/View/CalculatedColumn/CalculatedColumnSummary.d.ts +0 -21
  98. package/src/View/CalculatedColumn/CalculatedColumnSummary.js +0 -58
  99. package/src/View/Components/Buttons/ButtonFunction.d.ts +0 -7
  100. package/src/View/Components/Buttons/ButtonFunction.js +0 -8
  101. package/src/View/Components/Buttons/ButtonGeneral.d.ts +0 -5
  102. package/src/View/Components/Buttons/ButtonGeneral.js +0 -7
  103. package/src/View/Components/Buttons/ButtonPreviewDelete.d.ts +0 -4
  104. package/src/View/Components/Buttons/ButtonPreviewDelete.js +0 -5
  105. package/src/View/Components/Buttons/ButtonShow.d.ts +0 -5
  106. package/src/View/Components/Buttons/ButtonShow.js +0 -7
  107. package/src/View/Components/Buttons/ButtonShowChart.d.ts +0 -5
  108. package/src/View/Components/Buttons/ButtonShowChart.js +0 -7
  109. package/src/View/Components/Buttons/ButtonUndo.d.ts +0 -5
  110. package/src/View/Components/Buttons/ButtonUndo.js +0 -7
  111. package/src/View/Components/ExpressionWizard.d.ts +0 -24
  112. package/src/View/Components/ExpressionWizard.js +0 -77
  113. package/src/View/Components/FilterForm/Waiting.d.ts +0 -10
  114. package/src/View/Components/FilterForm/Waiting.js +0 -14
  115. package/src/View/Components/Panels/PanelFooter.d.ts +0 -10
  116. package/src/View/Components/Panels/PanelFooter.js +0 -9
  117. package/src/View/Components/Panels/PanelWithTwoButtons.d.ts +0 -12
  118. package/src/View/Components/Panels/PanelWithTwoButtons.js +0 -15
  119. package/src/View/Components/Panels/ToolPanelSettingsPanel.d.ts +0 -8
  120. package/src/View/Components/Panels/ToolPanelSettingsPanel.js +0 -26
  121. package/src/View/Components/Selectors/ColumnSelectorOld.d.ts +0 -18
  122. package/src/View/Components/Selectors/ColumnSelectorOld.js +0 -45
  123. package/src/View/Components/SharedProps/WizardScopeState.d.ts +0 -4
  124. package/src/View/Components/SharedProps/WizardScopeState.js +0 -1
  125. package/src/View/Components/WizardSummaryRow.d.ts +0 -9
  126. package/src/View/Components/WizardSummaryRow.js +0 -11
  127. package/src/View/CustomSort/CustomSortSummary.d.ts +0 -23
  128. package/src/View/CustomSort/CustomSortSummary.js +0 -105
  129. package/src/View/DataImport/DataImportWizard/sections/ImportSection.d.ts +0 -9
  130. package/src/View/DataImport/DataImportWizard/sections/ImportSection.js +0 -19
  131. package/src/View/Export/Wizard/ReportColumnTypeWizard.d.ts +0 -19
  132. package/src/View/Export/Wizard/ReportColumnTypeWizard.js +0 -68
  133. package/src/View/Export/Wizard/ReportRowTypeWizard.d.ts +0 -19
  134. package/src/View/Export/Wizard/ReportRowTypeWizard.js +0 -68
  135. package/src/View/Export/Wizard/ReportSettingsWizard.d.ts +0 -21
  136. package/src/View/Export/Wizard/ReportSettingsWizard.js +0 -56
  137. package/src/View/Export/Wizard/ReportSummaryWizard.d.ts +0 -15
  138. package/src/View/Export/Wizard/ReportSummaryWizard.js +0 -35
  139. package/src/View/Filter/FilterSummary.d.ts +0 -18
  140. package/src/View/Filter/FilterSummary.js +0 -48
  141. package/src/View/FormatColumn/FormatColumnSummary.d.ts +0 -22
  142. package/src/View/FormatColumn/FormatColumnSummary.js +0 -90
  143. package/src/View/FreeTextColumn/FreeTextColumnSummary.d.ts +0 -22
  144. package/src/View/FreeTextColumn/FreeTextColumnSummary.js +0 -88
  145. package/src/View/GridInfo/GridInfoPopup/AdaptableOptionsComponent.d.ts +0 -7
  146. package/src/View/GridInfo/GridInfoPopup/AdaptableOptionsComponent.js +0 -94
  147. package/src/View/PlusMinus/PlusMinusSummary.d.ts +0 -22
  148. package/src/View/PlusMinus/PlusMinusSummary.js +0 -95
  149. package/src/View/Wizard/WizardLegend.d.ts +0 -12
  150. package/src/View/Wizard/WizardLegend.js +0 -23
@@ -3,14 +3,26 @@ import { Tabs } from '../../../components/Tabs';
3
3
  import { Tag } from '../../../components/Tag';
4
4
  import { NewColumnSelector } from '../../Components/ColumnSelector';
5
5
  import { useOnePageAdaptableWizardContext } from '../../Wizard/OnePageAdaptableWizard';
6
- import { Box } from '../../../components/Flex';
6
+ import { Box, Flex } from '../../../components/Flex';
7
+ import FormLayout, { FormRow } from '../../../components/FormLayout';
8
+ import Input from '../../../components/Input';
7
9
  export const renderCustomSortColumn = (data) => {
8
10
  const { api } = useOnePageAdaptableWizardContext();
9
11
  return (React.createElement(Box, { className: "twa:text-2 twa:py-2 twa:pr-2" },
10
- "Custom sort column: ",
11
- React.createElement(Tag, null, api.columnApi.getFriendlyNameForColumnId(data.ColumnId))));
12
+ React.createElement(Tag, { className: "twa:mr-2" },
13
+ "Name: ",
14
+ data.Name),
15
+ React.createElement(Tag, null,
16
+ "Column: ",
17
+ api.columnApi.getFriendlyNameForColumnId(data.ColumnId))));
12
18
  };
13
- export const isValidCustomSortColumn = (data) => {
19
+ export const isValidCustomSortColumn = (data, allCustomSorts) => {
20
+ if (!data.Name) {
21
+ return 'Custom Sort Name cannot be blank';
22
+ }
23
+ if (allCustomSorts.some((customSort) => customSort.Name === data.Name && customSort.Uuid !== data.Uuid)) {
24
+ return 'A Custom Sort already exists with that name';
25
+ }
14
26
  if (!data.ColumnId) {
15
27
  return 'You have to select a Column for Custom Sort';
16
28
  }
@@ -42,14 +54,28 @@ export const CustomSortColumnWizardSection = (props) => {
42
54
  });
43
55
  });
44
56
  }, []);
45
- return (React.createElement(Tabs, { style: { height: '100%' } },
46
- React.createElement(Tabs.Tab, null, "Column"),
47
- React.createElement(Tabs.Content, null,
48
- React.createElement(NewColumnSelector, { availableColumns: sortableCols, selected: data.ColumnId ? [data.ColumnId] : [], singleSelect: true, onChange: (ids) => {
49
- props.onChange({
50
- ...data,
51
- SortedValues: [],
52
- ColumnId: ids[0],
53
- });
54
- }, allowReorder: false }))));
57
+ const onNameChange = (event) => {
58
+ props.onChange({
59
+ ...data,
60
+ Name: event.target.value,
61
+ });
62
+ };
63
+ return (React.createElement(Flex, { flexDirection: "column", style: { height: '100%' } },
64
+ React.createElement(Tabs, { className: "twa:mb-3" },
65
+ React.createElement(Tabs.Tab, null, "Settings"),
66
+ React.createElement(Tabs.Content, null,
67
+ React.createElement(Flex, { flexDirection: "row" },
68
+ React.createElement(FormLayout, { className: "twa:max-w-[300px] twa:w-full" },
69
+ React.createElement(FormRow, { label: "Name" },
70
+ React.createElement(Input, { className: "twa:w-full", "data-name": "custom-sort-name", onChange: onNameChange, value: data?.Name ?? '' })))))),
71
+ React.createElement(Tabs, { style: { flex: 1, minHeight: 0 } },
72
+ React.createElement(Tabs.Tab, null, "Column"),
73
+ React.createElement(Tabs.Content, null,
74
+ React.createElement(NewColumnSelector, { availableColumns: sortableCols, selected: data.ColumnId ? [data.ColumnId] : [], singleSelect: true, onChange: (ids) => {
75
+ props.onChange({
76
+ ...data,
77
+ SortedValues: [],
78
+ ColumnId: ids[0],
79
+ });
80
+ }, allowReorder: false })))));
55
81
  };
@@ -37,14 +37,14 @@ export const CustomSortWizard = (props) => {
37
37
  };
38
38
  return (React.createElement(OnePageAdaptableWizard, { defaultCurrentSectionName: props.defaultCurrentSectionName, moduleInfo: props.moduleInfo, data: customSort, onFinish: handleFinish, onHide: props.onCloseWizard, sections: [
39
39
  {
40
- isValid: isValidCustomSortColumn,
40
+ isValid: (data) => isValidCustomSortColumn(data, allCustomSorts),
41
41
  renderSummary: renderCustomSortColumn,
42
- details: 'Select a Column for Custom Sort',
42
+ details: 'Enter Name and select a Column for Custom Sort',
43
43
  render: () => {
44
44
  return (React.createElement(Box, { className: "twa:p-2 twa:h-full" },
45
- React.createElement(CustomSortColumnWizardSection, { isNew: props.isNew, onChange: setCustomSort })));
45
+ React.createElement(CustomSortColumnWizardSection, { isNew: props.isNew, onChange: setCustomSort, allCustomSorts: allCustomSorts })));
46
46
  },
47
- title: 'Column',
47
+ title: 'Name & Column',
48
48
  },
49
49
  {
50
50
  title: 'Sort Order',
@@ -160,6 +160,7 @@ const buildAdaptableOptions = (mainAdaptableInstance, adaptableContainerId, agGr
160
160
  Revision: Date.now(),
161
161
  FormatColumns: [
162
162
  {
163
+ Name: 'Changed At',
163
164
  Scope: {
164
165
  ColumnIds: ['changeInfo.changedAt'],
165
166
  },
@@ -1,10 +1,11 @@
1
1
  import * as React from 'react';
2
- import { FlashingCellDefinition } from '../../../types';
2
+ import { AdaptableApi, FlashingCellDefinition } from '../../../types';
3
3
  type FlashingAlertDurationWizardSectionProps = {
4
4
  readOnly?: boolean;
5
5
  flashingCell?: FlashingCellDefinition;
6
6
  onChange: (data: FlashingCellDefinition) => void;
7
7
  };
8
+ export declare const isSettingsValid: (data: FlashingCellDefinition, api: AdaptableApi) => true | "Name is required" | "A Flashing Cell already exists with that name";
8
9
  export declare const renderFlashingAlertSettingsSummary: (flashingAlert: FlashingCellDefinition) => React.JSX.Element;
9
10
  export declare const FlashingAlertSettingsWizardSection: (props: FlashingAlertDurationWizardSectionProps) => React.JSX.Element;
10
11
  export {};
@@ -2,15 +2,30 @@ import * as React from 'react';
2
2
  import { useRef } from 'react';
3
3
  import Input from '../../../components/Input';
4
4
  import usePrevious from '../../../components/utils/usePrevious';
5
- import Radio from '../../../components/Radio';
6
5
  import { Tabs } from '../../../components/Tabs';
7
6
  import { useOnePageAdaptableWizardContext } from '../../Wizard/OnePageAdaptableWizard';
8
7
  import { CodeBlock } from '../../../components/CodeBlock';
9
8
  import FormLayout, { FormRow } from '../../../components/FormLayout';
10
9
  import { CheckBox } from '../../../components/CheckBox';
11
10
  import { Box, Flex } from '../../../components/Flex';
11
+ import { Tag } from '../../../components/Tag';
12
+ import { SummaryText } from '../../Wizard/OnePageAdaptableWizard';
13
+ export const isSettingsValid = (data, api) => {
14
+ if (!data.Name?.trim()) {
15
+ return 'Name is required';
16
+ }
17
+ const allFlashingCells = api.flashingCellApi.getFlashingCellDefinitions();
18
+ const isDuplicateName = allFlashingCells.some((fc) => fc.Name === data.Name && fc.Uuid !== data.Uuid);
19
+ if (isDuplicateName) {
20
+ return 'A Flashing Cell already exists with that name';
21
+ }
22
+ return true;
23
+ };
12
24
  export const renderFlashingAlertSettingsSummary = (flashingAlert) => {
13
25
  return (React.createElement(React.Fragment, null,
26
+ React.createElement(SummaryText, null,
27
+ "Name ",
28
+ React.createElement(Tag, null, flashingAlert.Name || 'Not specified')),
14
29
  React.createElement(Box, { className: "twa:text-2" }, flashingAlert.FlashDuration === 'always' ? (React.createElement(React.Fragment, null, "Flashing is never removed")) : (React.createElement(React.Fragment, null,
15
30
  "Flashing is removed after ",
16
31
  React.createElement(CodeBlock, null, flashingAlert.FlashDuration),
@@ -20,6 +35,12 @@ export const renderFlashingAlertSettingsSummary = (flashingAlert) => {
20
35
  export const FlashingAlertSettingsWizardSection = (props) => {
21
36
  let { data: flashingCell } = useOnePageAdaptableWizardContext();
22
37
  flashingCell = flashingCell ?? props.flashingCell;
38
+ const handleNameChange = (event) => {
39
+ props.onChange({
40
+ ...flashingCell,
41
+ Name: event.target.value,
42
+ });
43
+ };
23
44
  const setDuration = (FlashDuration) => {
24
45
  props.onChange({ ...flashingCell, FlashDuration: FlashDuration });
25
46
  };
@@ -58,23 +79,22 @@ export const FlashingAlertSettingsWizardSection = (props) => {
58
79
  React.createElement(Tabs.Tab, null, "Flashing Cell Settings"),
59
80
  React.createElement(Tabs.Content, null,
60
81
  React.createElement(FormLayout, null,
61
- React.createElement(FormRow, { label: "Duration Type" },
62
- React.createElement(Radio, { "data-name": "duration-type-always", className: "twa:mr-3", checked: duration == 'always', tabIndex: -1, onChange: () => handleTypeChange('always') }, "Always"),
63
- React.createElement(Radio, { "data-name": "duration-type-number", checked: duration !== 'always', tabIndex: -1, onChange: () => handleTypeChange('number') }, "Limited (ms)")),
64
- React.createElement(FormRow, { label: "" },
65
- duration !== 'always' && (React.createElement(Flex, { flexDirection: "row", alignItems: "baseline" },
66
- React.createElement(Box, { className: "twa:text-2 twa:mr-2" }, "After"),
67
- React.createElement(Input, { "data-name": "duration-input", readOnly: props.readOnly, type: "text", name: "value", ref: inputRef, className: "twa:mt-2 twa:mr-1", value: duration, onChange: (event) => {
68
- const value = event.target.value;
69
- setDuration(isNaN(Number(value)) ? 500 : Number(value));
70
- } }),
71
- React.createElement(Box, { className: "twa:text-2" }, "milliseconds"))),
72
- duration === 'always' && (React.createElement(Box, { className: "twa:text-3 twa:h-[43px]" }, "Persists the flashing style indeterminately - can be removed manually"))),
82
+ React.createElement(FormRow, { label: "Name" },
83
+ React.createElement(Input, { "data-name": "flashing-cell-name", className: "twa:flex-1 twa:mr-3", onChange: handleNameChange, placeholder: "Enter Name", value: flashingCell.Name ?? '' })),
73
84
  React.createElement(FormRow, { label: "Flash Target" },
74
85
  React.createElement(CheckBox, { "data-name": "flashing-target", onChange: (checked) => handleTargetChange('cell', checked), className: "twa:mr-3", checked: flashingCell?.FlashTarget === 'cell' ||
75
86
  flashingCell?.FlashTarget?.includes?.('cell'), tabIndex: -1 }, "Cell"),
76
87
  React.createElement(CheckBox, { "data-name": "flashing-target-row", className: "twa:mr-3", onChange: (checked) => handleTargetChange('row', checked), checked: flashingCell?.FlashTarget === 'row' ||
77
88
  flashingCell?.FlashTarget?.includes?.('row'), tabIndex: -1 }, "Row"),
78
89
  React.createElement(CheckBox, { "data-name": "flashing-target-aggFuncCell", onChange: (checked) => handleTargetChange('aggFuncCell', checked), checked: flashingCell?.FlashTarget === 'aggFuncCell' ||
79
- flashingCell?.FlashTarget?.includes?.('aggFuncCell'), tabIndex: -1 }, "Aggregated Function Cell")))))));
90
+ flashingCell?.FlashTarget?.includes?.('aggFuncCell'), tabIndex: -1 }, "Aggregated Function Cell")),
91
+ React.createElement(FormRow, { label: "Duration" },
92
+ React.createElement(Flex, { alignItems: "center" },
93
+ React.createElement(CheckBox, { "data-name": "duration-always", checked: duration === 'always', onChange: (checked) => handleTypeChange(checked ? 'always' : 'number'), className: "twa:mr-4", tabIndex: -1 }, "Always"),
94
+ duration !== 'always' && (React.createElement(React.Fragment, null,
95
+ React.createElement(Input, { "data-name": "duration-input", readOnly: props.readOnly, type: "number", name: "value", ref: inputRef, className: "twa:w-20 twa:mr-2", value: duration, onChange: (event) => {
96
+ const value = event.target.value;
97
+ setDuration(isNaN(Number(value)) ? 500 : Number(value));
98
+ } }),
99
+ React.createElement(Box, { className: "twa:text-2" }, "ms"))))))))));
80
100
  };
@@ -1,7 +1,7 @@
1
1
  import * as React from 'react';
2
2
  import { useState, useCallback } from 'react';
3
3
  import { OnePageAdaptableWizard, OnePageWizardSummary } from '../../Wizard/OnePageAdaptableWizard';
4
- import { FlashingAlertSettingsWizardSection, renderFlashingAlertSettingsSummary, } from './FlashingCellSettingsWizardSection';
4
+ import { FlashingAlertSettingsWizardSection, renderFlashingAlertSettingsSummary, isSettingsValid, } from './FlashingCellSettingsWizardSection';
5
5
  import { cloneObject } from '../../../Utilities/Helpers/Helper';
6
6
  import { FlashingAlertRulesWizardSection, renderFlashingAlertRulesSummary, } from './FlashingCellRulesWizardSection';
7
7
  import { FlashingAlertStyleWizardSection, renderFlashingAlertStyleSummary, } from './FlashingCellStyleWizardSection';
@@ -17,7 +17,7 @@ import { ObjectTagsWizardSection, renderObjectTagsSummary, } from '../../Wizard/
17
17
  import { Box } from '../../../components/Flex';
18
18
  export const FlashingCellWizard = (props) => {
19
19
  const { api } = useAdaptable();
20
- const [flashingCell, setFlashingCell] = useState(() => {
20
+ const [flashingCell, doSetFlashingCell] = useState(() => {
21
21
  let flashingCell = props.data
22
22
  ? cloneObject(props.data)
23
23
  : ObjectFactory.CreateEmptyFlashingCellDefinition();
@@ -33,9 +33,12 @@ export const FlashingCellWizard = (props) => {
33
33
  }
34
34
  return flashingCell;
35
35
  });
36
+ const setFlashingCell = useCallback((data) => {
37
+ doSetFlashingCell(data);
38
+ }, []);
36
39
  const updateProperty = (propName) => {
37
40
  return (value) => {
38
- setFlashingCell((flashingCell) => {
41
+ doSetFlashingCell((flashingCell) => {
39
42
  flashingCell = { ...flashingCell, [propName]: value };
40
43
  return flashingCell;
41
44
  });
@@ -57,6 +60,14 @@ export const FlashingCellWizard = (props) => {
57
60
  props.onFinishWizard(flashingCell);
58
61
  };
59
62
  return (React.createElement(OnePageAdaptableWizard, { defaultCurrentSectionName: props.defaultCurrentSectionName, moduleInfo: props.moduleInfo, data: flashingCell, onHide: props.onCloseWizard, onFinish: handleFinish, sections: [
63
+ {
64
+ details: 'Set Name, Duration and Target Properties',
65
+ isValid: isSettingsValid,
66
+ render: () => (React.createElement(Box, { className: "twa:p-2" },
67
+ React.createElement(FlashingAlertSettingsWizardSection, { onChange: setFlashingCell }))),
68
+ renderSummary: renderFlashingAlertSettingsSummary,
69
+ title: 'Settings',
70
+ },
60
71
  {
61
72
  details: 'Specify which data changes should trigger Cell Flashing',
62
73
  isValid: isScopeValid,
@@ -80,13 +91,6 @@ export const FlashingCellWizard = (props) => {
80
91
  renderSummary: renderFlashingAlertStyleSummary,
81
92
  title: 'Flash Styles',
82
93
  },
83
- {
84
- details: 'Set Duration and Target Properties',
85
- render: () => (React.createElement(Box, { className: "twa:p-2" },
86
- React.createElement(FlashingAlertSettingsWizardSection, { onChange: setFlashingCell }))),
87
- renderSummary: renderFlashingAlertSettingsSummary,
88
- title: 'Settings',
89
- },
90
94
  {
91
95
  details: 'Select Flashing Cell Tags',
92
96
  title: 'Tags',
@@ -5,9 +5,13 @@ import { useOnePageAdaptableWizardContext } from '../../Wizard/OnePageAdaptableW
5
5
  import { Tag } from '../../../components/Tag';
6
6
  import Radio, { RadioGroup } from '../../../components/Radio';
7
7
  import { Box, Flex } from '../../../components/Flex';
8
- import { Card } from '../../../components/Card';
8
+ import { Tabs } from '../../../components/Tabs';
9
+ import Input from '../../../components/Input';
9
10
  export const renderFormatColumnSettingsSummary = (data) => {
10
11
  return (React.createElement(Box, { className: "twa:p-2" },
12
+ React.createElement(Box, { className: "twa:mt-3" },
13
+ "Name ",
14
+ React.createElement(Tag, null, data.Name)),
11
15
  React.createElement(Box, { className: "twa:mt-3" },
12
16
  "Data Rows ",
13
17
  React.createElement(Tag, null, data.RowScope?.ExcludeDataRows ? 'no' : 'yes')),
@@ -30,6 +34,12 @@ export const renderFormatColumnSettingsSummary = (data) => {
30
34
  };
31
35
  export const FormatColumnSettingsWizardSection = (props) => {
32
36
  const { data } = useOnePageAdaptableWizardContext();
37
+ const onNameChange = (event) => {
38
+ props.onChange({
39
+ ...data,
40
+ Name: event.target.value,
41
+ });
42
+ };
33
43
  const onExcludeDataRowsChanged = (ExcludeDataRows) => {
34
44
  props.onChange({
35
45
  ...data,
@@ -66,32 +76,40 @@ export const FormatColumnSettingsWizardSection = (props) => {
66
76
  },
67
77
  });
68
78
  };
69
- return (React.createElement(Card, null,
70
- React.createElement(Card.Title, null, "Settings"),
71
- React.createElement(Card.Body, null,
72
- React.createElement(Flex, { flexDirection: "row" },
73
- React.createElement(FormLayout, null,
74
- data.Target === 'cell' && (React.createElement(React.Fragment, null,
75
- React.createElement(FormRow, { label: "Exclude Data Rows:" },
76
- React.createElement(Flex, { alignItems: "center", className: "twa:ml-2" },
77
- React.createElement(CheckBox, { "data-name": "exclude-data-rows-checkbox", checked: data.RowScope?.ExcludeDataRows, onChange: onExcludeDataRowsChanged, className: "twa:mr-2" }))),
78
- React.createElement(FormRow, { label: "Exclude Group Rows:" },
79
- React.createElement(Flex, { alignItems: "center", className: "twa:ml-2" },
80
- React.createElement(CheckBox, { "data-name": "exclude-grouped-rows-checkbox", checked: data.RowScope?.ExcludeGroupRows, onChange: onExcludeGroupedRowsChanged, className: "twa:mr-2" }))),
81
- React.createElement(FormRow, { label: "Exclude Row Summaries:" },
82
- React.createElement(Flex, { alignItems: "center", className: "twa:ml-2" },
83
- React.createElement(CheckBox, { "data-name": "exclude-summary-rows-checkbox", checked: data.RowScope?.ExcludeSummaryRows, onChange: onExcludeSummaryRowsChanged, className: "twa:mr-2" }))),
84
- React.createElement(FormRow, { label: "Exclude Total Rows:" },
85
- React.createElement(Flex, { alignItems: "center", className: "twa:ml-2" },
86
- React.createElement(CheckBox, { "data-name": "exclude-total-rows-checkbox", checked: data.RowScope?.ExcludeTotalRows, onChange: onExcludeTotalRowsChanged, className: "twa:mr-2" }))))),
87
- React.createElement(FormRow, { label: "Apply on Column Group:" },
88
- React.createElement(RadioGroup, { value: data.ColumnGroupScope || 'Both', name: "columnGroupScope", orientation: "horizontal", onRadioChange: (columnGroupScope) => {
89
- props.onChange({
90
- ...data,
91
- ColumnGroupScope: columnGroupScope,
92
- });
93
- } },
94
- React.createElement(Radio, { className: "twa:ml-1", value: "Both" }, "Always"),
95
- React.createElement(Radio, { className: "twa:ml-4", value: "Expanded" }, "Expanded"),
96
- React.createElement(Radio, { className: "twa:ml-4", value: "Collapsed" }, "Collapsed"))))))));
79
+ return (React.createElement(Flex, { flexDirection: "column", style: { height: '100%' } },
80
+ React.createElement(Tabs, { className: "twa:mb-3" },
81
+ React.createElement(Tabs.Tab, null, "Settings"),
82
+ React.createElement(Tabs.Content, null,
83
+ React.createElement(Flex, { flexDirection: "row" },
84
+ React.createElement(FormLayout, { className: "twa:max-w-[300px] twa:w-full" },
85
+ React.createElement(FormRow, { label: "Name" },
86
+ React.createElement(Input, { className: "twa:w-full", "data-name": "format-column-name", onChange: onNameChange, value: data?.Name ?? '' })))))),
87
+ React.createElement(Tabs, null,
88
+ React.createElement(Tabs.Tab, null, "Configuration"),
89
+ React.createElement(Tabs.Content, null,
90
+ React.createElement(Flex, { flexDirection: "row" },
91
+ React.createElement(FormLayout, null,
92
+ data.Target === 'cell' && (React.createElement(React.Fragment, null,
93
+ React.createElement(FormRow, { label: "Exclude Data Rows:" },
94
+ React.createElement(Flex, { alignItems: "center", className: "twa:ml-2" },
95
+ React.createElement(CheckBox, { "data-name": "exclude-data-rows-checkbox", checked: data.RowScope?.ExcludeDataRows, onChange: onExcludeDataRowsChanged, className: "twa:mr-2" }))),
96
+ React.createElement(FormRow, { label: "Exclude Group Rows:" },
97
+ React.createElement(Flex, { alignItems: "center", className: "twa:ml-2" },
98
+ React.createElement(CheckBox, { "data-name": "exclude-grouped-rows-checkbox", checked: data.RowScope?.ExcludeGroupRows, onChange: onExcludeGroupedRowsChanged, className: "twa:mr-2" }))),
99
+ React.createElement(FormRow, { label: "Exclude Row Summaries:" },
100
+ React.createElement(Flex, { alignItems: "center", className: "twa:ml-2" },
101
+ React.createElement(CheckBox, { "data-name": "exclude-summary-rows-checkbox", checked: data.RowScope?.ExcludeSummaryRows, onChange: onExcludeSummaryRowsChanged, className: "twa:mr-2" }))),
102
+ React.createElement(FormRow, { label: "Exclude Total Rows:" },
103
+ React.createElement(Flex, { alignItems: "center", className: "twa:ml-2" },
104
+ React.createElement(CheckBox, { "data-name": "exclude-total-rows-checkbox", checked: data.RowScope?.ExcludeTotalRows, onChange: onExcludeTotalRowsChanged, className: "twa:mr-2" }))))),
105
+ React.createElement(FormRow, { label: "Apply on Column Group:" },
106
+ React.createElement(RadioGroup, { value: data.ColumnGroupScope || 'Both', name: "columnGroupScope", orientation: "horizontal", onRadioChange: (columnGroupScope) => {
107
+ props.onChange({
108
+ ...data,
109
+ ColumnGroupScope: columnGroupScope,
110
+ });
111
+ } },
112
+ React.createElement(Radio, { className: "twa:ml-1", value: "Both" }, "Always"),
113
+ React.createElement(Radio, { className: "twa:ml-4", value: "Expanded" }, "When Expanded"),
114
+ React.createElement(Radio, { className: "twa:ml-4", value: "Collapsed" }, "When Collapsed")))))))));
97
115
  };
@@ -7,6 +7,7 @@ import { FormatColumnStyleWizardSection, isFormatColumnStyleValid, renderFormatC
7
7
  import { FormatColumnFormatWizardSection, getFormatDisplayTypeForScope, renderFormatColumnFormatSummary, } from './FormatColumnFormatWizardSection';
8
8
  import { useAdaptable } from '../../AdaptableContext';
9
9
  import { FormatColumnSettingsWizardSection, renderFormatColumnSettingsSummary, } from './FormatColumnSettingsWizardSection';
10
+ import { useSelector } from 'react-redux';
10
11
  import { isScopeValid } from '../../Components/NewScopeComponent';
11
12
  import ObjectFactory from '../../../Utilities/ObjectFactory';
12
13
  import { useDispatch } from 'react-redux';
@@ -57,6 +58,7 @@ const adjustFormatColumn = (formatColumn, api) => {
57
58
  };
58
59
  export function FormatColumnWizard(props) {
59
60
  const { api } = useAdaptable();
61
+ const allFormatColumns = useSelector((state) => state.FormatColumn?.FormatColumns ?? []);
60
62
  const data = props.data ?? props.popupParams?.value;
61
63
  const [formatColumn, doSetFormatColumn] = useState(() => {
62
64
  let formatColumn = data ? cloneObject(data) : ObjectFactory.CreateEmptyFormatColumn();
@@ -92,6 +94,24 @@ export function FormatColumnWizard(props) {
92
94
  props.onFinishWizard(formatColumn);
93
95
  };
94
96
  return (React.createElement(OnePageAdaptableWizard, { defaultCurrentSectionName: props.defaultCurrentSectionName, moduleInfo: props.moduleInfo, modal: props.modal, data: formatColumn, onHide: props.onCloseWizard, onFinish: handleFinish, sections: [
97
+ {
98
+ title: 'Settings',
99
+ details: 'Enter Name and set Additional Properties',
100
+ isValid: (formatColumnData) => {
101
+ if (!formatColumnData.Name) {
102
+ return 'Format Column Name cannot be blank';
103
+ }
104
+ if (allFormatColumns.some((fc) => fc.Name === formatColumnData.Name && fc.Uuid !== formatColumnData.Uuid)) {
105
+ return 'A Format Column already exists with that name';
106
+ }
107
+ return true;
108
+ },
109
+ renderSummary: renderFormatColumnSettingsSummary,
110
+ render: () => {
111
+ return (React.createElement(Box, { className: "twa:p-2" },
112
+ React.createElement(FormatColumnSettingsWizardSection, { onChange: setFormatColumn })));
113
+ },
114
+ },
95
115
  {
96
116
  title: 'Scope',
97
117
  details: 'Select which Columns will be formatted',
@@ -142,15 +162,6 @@ export function FormatColumnWizard(props) {
142
162
  return React.createElement(FormatColumnFormatWizardSection, { onChange: setFormatColumn });
143
163
  },
144
164
  },
145
- {
146
- title: 'Settings',
147
- details: 'Set Additional Properties',
148
- renderSummary: renderFormatColumnSettingsSummary,
149
- render: () => {
150
- return (React.createElement(Box, { className: "twa:p-2" },
151
- React.createElement(FormatColumnSettingsWizardSection, { onChange: setFormatColumn })));
152
- },
153
- },
154
165
  {
155
166
  details: 'Select Format Column Tags',
156
167
  title: 'Tags',
@@ -28,6 +28,10 @@ export const GridFilterExpressionEditor = (props) => {
28
28
  const onRunQuery = (expression) => {
29
29
  api.filterApi.gridFilterApi.setGridFilterExpression(expression);
30
30
  };
31
+ const onClearExpression = () => {
32
+ setExpression('');
33
+ api.filterApi.gridFilterApi.clearGridFilter();
34
+ };
31
35
  const onAddNamedQuery = (namedQuery) => dispatch(NamedQueryRedux.NamedQueryAdd(namedQuery));
32
36
  const handleSaveQuery = () => {
33
37
  dispatch(PopupShowForm({
@@ -80,7 +84,7 @@ export const GridFilterExpressionEditor = (props) => {
80
84
  }));
81
85
  };
82
86
  const expressionEditorProps = useGridFilterOptionsForExpressionEditorProps();
83
- const actionsDisabled = !isExpressionValid || IsNullOrEmpty(expression) || hasNamedQueryError || isExistingNamedQuery;
87
+ const actionsDisabled = !isExpressionValid || IsNullOrEmpty(expression) || hasNamedQueryError;
84
88
  return (React.createElement(NamedQueryContext.Provider, { value: {
85
89
  namedQuery: namedQuery,
86
90
  setNamedQuery: (newQuery) => {
@@ -95,6 +99,7 @@ export const GridFilterExpressionEditor = (props) => {
95
99
  } }, "CLOSE")),
96
100
  React.createElement(Box, { className: "twa:flex-1" }),
97
101
  React.createElement(SimpleButton, { disabled: actionsDisabled, onClick: handleSaveQuery, icon: "save" }, "Save Query"),
102
+ React.createElement(SimpleButton, { "data-name": "action-clear", onClick: onClearExpression, icon: "close", disabled: IsNullOrEmpty(expression), className: "twa:ml-1" }, "Clear Query"),
98
103
  React.createElement(SimpleButton, { variant: "raised", tone: "accent", "data-name": "action-run", className: "twa:m-1", icon: "play", onClick: () => {
99
104
  if (namedQuery) {
100
105
  onAddNamedQuery({
@@ -1,98 +1,61 @@
1
1
  import * as React from 'react';
2
+ import clsx from 'clsx';
2
3
  import StringExtensions from '../../Utilities/Extensions/StringExtensions';
3
- import DropdownButton from '../../components/DropdownButton';
4
4
  import FieldWrap from '../../components/FieldWrap';
5
- import Textarea from '../../components/Textarea';
6
- import { Icon } from '../../components/icons';
7
5
  import { ButtonClear } from '../Components/Buttons/ButtonClear';
8
6
  import { ButtonExpand } from '../Components/Buttons/ButtonExpand';
9
7
  import { ButtonInvalid } from '../Components/Buttons/ButtonInvalid';
10
8
  import { ButtonPause } from '../Components/Buttons/ButtonPause';
11
- import { ButtonPlay } from '../Components/Buttons/ButtonPlay';
12
9
  import { ButtonSave } from '../Components/Buttons/ButtonSave';
13
10
  import { ButtonUnsuspend } from '../Components/Buttons/ButtonUnsuspend';
14
11
  import { NamedQuerySelector } from './NamedQuerySelector';
15
12
  import { useGridFilterExpressionEditor } from './useGridFilterExpressionEditor';
16
13
  import { Box, Flex } from '../../components/Flex';
14
+ import Tooltip from '../../components/Tooltip';
17
15
  const QueryViewPanelComponent = (props) => {
18
- const { cachedQueries, expression, setExpression, isExpressionNamedQuery, isExpressionValid, isSuspended, gridFilter, isAdaptableReady, namedQueries, availableColumns, runQuery, onExpand, clearQuery, namedQueryModuleAccessLevel, saveQuery, suspendGridFilter, unSuspendGridFilter, setGridFilterExpression, gridFilterAccessLevel, isReadOnly, } = useGridFilterExpressionEditor();
16
+ const { cachedQueries, expression, isExpressionNamedQuery, isExpressionValid, isSuspended, gridFilter, isAdaptableReady, namedQueries, runQuery, onExpand, clearQuery, namedQueryModuleAccessLevel, saveQuery, suspendGridFilter, unSuspendGridFilter, setGridFilterExpression, gridFilterAccessLevel, isReadOnly, } = useGridFilterExpressionEditor();
19
17
  if (!isAdaptableReady) {
20
18
  return null;
21
19
  }
22
20
  const elementType = props.viewType === 'Toolbar' ? 'DashboardToolbar' : 'ToolPanel';
23
21
  const disabled = isReadOnly || isSuspended || gridFilterAccessLevel === 'ReadOnly';
24
- const handleEnter = (e) => {
25
- if (e.key === 'Enter') {
26
- e.preventDefault();
27
- runQuery();
28
- }
29
- };
30
22
  const buttonExpand = (React.createElement(ButtonExpand, { disabled: disabled, accessLevel: gridFilterAccessLevel, variant: "text", tone: "neutral", onClick: onExpand, tooltip: "Edit the Expression in UI", className: "twa:ml-1" }));
31
- const renderTextInput = () => {
32
- return props.viewType === 'Toolbar' ? (React.createElement(FieldWrap, { className: "twa:mr-1 twa:w-[500px] twa:overflow-visible" },
33
- buttonExpand,
34
- React.createElement(Box, { className: "twa:flex-1 twa:relative twa:h-full" },
35
- React.createElement(Textarea, { "data-name": "grid-filter-input", autoResizeOnFocus: true, style: {
36
- left: 0,
37
- top: 0,
38
- right: 0,
39
- border: 0,
40
- position: 'absolute',
41
- resize: 'none',
42
- fontFamily: 'monospace',
43
- fontSize: 12,
44
- maxHeight: 52,
45
- height: '100%',
46
- paddingTop: 6,
47
- overflow: 'hidden',
48
- zIndex: 100,
49
- }, placeholder: "Grid Filter", onChange: (x) => setExpression(x.target.value), value: expression })),
50
- isExpressionValid && (React.createElement(ButtonPlay, { onClick: () => runQuery(), tooltip: '', accessLevel: gridFilterAccessLevel, variant: "text", tone: "neutral", disabled: disabled || expression == '' || expression == gridFilter?.Expression, className: "twa:mr-1" })),
51
- gridFilter && !isExpressionValid && (React.createElement(ButtonInvalid, { variant: "text", tone: "neutral", tooltip: "Invalid Grid Filter", className: "twa:mr-1" })),
52
- ' ',
53
- StringExtensions.IsNotNullOrEmpty(expression) && (React.createElement(ButtonClear, { onClick: () => clearQuery(), tooltip: "Clear Grid Filter", accessLevel: gridFilterAccessLevel })))) : (React.createElement(FieldWrap, { className: "twa:w-full twa:overflow-visible" },
54
- ' ',
23
+ const renderExpressionLabel = () => {
24
+ const baseClasses = 'twa:font-mono twa:text-xs twa:py-1.5 twa:px-2 twa:overflow-hidden twa:text-ellipsis twa:whitespace-nowrap twa:bg-white twa:rounded twa:cursor-pointer twa:h-7 twa:leading-4';
25
+ const placeholderClasses = 'twa:text-gray-400 twa:italic';
26
+ const labelClassName = clsx(baseClasses, {
27
+ [placeholderClasses]: !expression,
28
+ });
29
+ const expressionLabel = (React.createElement(Tooltip, { label: expression || 'Click to edit Grid Filter' },
30
+ React.createElement(Box, { className: clsx('twa:flex-1 twa:h-full twa:min-w-0', labelClassName), "data-name": "grid-filter-input", onClick: onExpand }, expression || 'Grid Filter')));
31
+ return (React.createElement(FieldWrap, { className: "twa:flex-1 twa:min-w-0 twa:overflow-visible" },
55
32
  buttonExpand,
56
- React.createElement(Box, { className: "twa:flex-1 twa:relative twa:w-full twa:min-h-[40px]" },
57
- React.createElement(Textarea, { "data-name": "grid-filter-input", autoResizeOnFocus: true, style: {
58
- left: 0,
59
- top: 0,
60
- right: 0,
61
- border: 0,
62
- position: 'absolute',
63
- resize: 'none',
64
- fontFamily: 'monospace',
65
- fontSize: 12,
66
- maxHeight: 60,
67
- paddingTop: 7,
68
- zIndex: 100,
69
- height: '100%',
70
- overflow: 'hidden',
71
- }, placeholder: "Grid Filter", onChange: (x) => setExpression(x.target.value), value: expression }))));
33
+ expressionLabel,
34
+ gridFilter && !isExpressionValid && (React.createElement(ButtonInvalid, { variant: "text", tone: "neutral", tooltip: "Invalid Grid Filter" }))));
72
35
  };
73
- const saveButton = (React.createElement(ButtonSave, { onClick: () => saveQuery(), tooltip: "Save as Named Query", accessLevel: namedQueryModuleAccessLevel, disabled: disabled || !isExpressionValid || isExpressionNamedQuery || expression == '', variant: "text", tone: "neutral", className: "twa:mr-1" }));
74
- const suspendButton = (React.createElement(ButtonPause, { onClick: () => suspendGridFilter(), tooltip: "Suspend Grid Filter", accessLevel: gridFilterAccessLevel, disabled: disabled || !isExpressionValid, variant: "text", tone: "neutral", className: "twa:mr-1" }));
75
- const unSuspendButton = (React.createElement(ButtonUnsuspend, { onClick: () => unSuspendGridFilter(), tooltip: "Unsuspend Grid Filter", accessLevel: gridFilterAccessLevel, disabled: !isExpressionValid, variant: "text", tone: "neutral", className: "twa:mr-1" }));
76
- const namedQuerySelector = (React.createElement(NamedQuerySelector, { namedQueries: namedQueries, cachedQueries: cachedQueries, currentQuery: gridFilter?.Expression, onSelect: (query) => runQuery(query), setGridFilterExpression: (query) => setGridFilterExpression(query) }));
77
- const columnsDropdown = (React.createElement(DropdownButton, { disabled: disabled, accessLevel: gridFilterAccessLevel, variant: "text", items: availableColumns, className: "twa:mr-1", tooltip: "Pick Columns" },
78
- React.createElement(Icon, { name: 'list' })));
36
+ const hasExpression = StringExtensions.IsNotNullOrEmpty(expression);
37
+ const hasActiveGridFilter = gridFilter != null && hasExpression;
38
+ const hasNamedQueries = namedQueries && namedQueries.length > 0;
39
+ const clearButton = hasExpression ? (React.createElement(ButtonClear, { onClick: () => clearQuery(), tooltip: "Clear Grid Filter", accessLevel: gridFilterAccessLevel, variant: "text", tone: "neutral" })) : null;
40
+ const saveButton = hasExpression ? (React.createElement(ButtonSave, { onClick: () => saveQuery(), tooltip: "Save as Named Query", accessLevel: namedQueryModuleAccessLevel, disabled: isReadOnly || gridFilterAccessLevel === 'ReadOnly' || !isExpressionValid || isExpressionNamedQuery, variant: "text", tone: "neutral" })) : null;
41
+ const suspendButton = hasActiveGridFilter ? (React.createElement(ButtonPause, { onClick: () => suspendGridFilter(), tooltip: "Suspend Grid Filter", accessLevel: gridFilterAccessLevel, disabled: disabled || !isExpressionValid, variant: "text", tone: "neutral" })) : null;
42
+ const unSuspendButton = hasActiveGridFilter ? (React.createElement(ButtonUnsuspend, { onClick: () => unSuspendGridFilter(), tooltip: "Unsuspend Grid Filter", accessLevel: gridFilterAccessLevel, disabled: !isExpressionValid, variant: "text", tone: "neutral" })) : null;
43
+ const namedQuerySelector = hasNamedQueries ? (React.createElement(NamedQuerySelector, { namedQueries: namedQueries, cachedQueries: cachedQueries, currentQuery: gridFilter?.Expression, onSelect: (query) => runQuery(query), setGridFilterExpression: (query) => setGridFilterExpression(query) })) : null;
79
44
  const renderButtons = () => {
80
- return props.viewType === 'Toolbar' ? (React.createElement(React.Fragment, null,
81
- saveButton,
45
+ return (React.createElement(React.Fragment, null,
46
+ clearButton,
82
47
  isSuspended ? unSuspendButton : suspendButton,
83
- columnsDropdown,
84
- namedQuerySelector,
85
- ' ')) : (React.createElement(React.Fragment, null,
86
- React.createElement(ButtonPlay, { "aria-label": 'Run Grid Filter', onClick: () => runQuery(), tooltip: "Run Grid Filter", accessLevel: gridFilterAccessLevel, variant: "text", tone: "neutral", disabled: disabled || !isExpressionValid || expression == '' || expression == gridFilter, className: "twa:mr-1" }),
87
- ' ',
88
- React.createElement(ButtonClear, { onClick: () => clearQuery(), tooltip: "Clear Grid Filter", accessLevel: gridFilterAccessLevel, disabled: expression == '' }),
89
- ' ',
90
48
  saveButton,
91
- isSuspended ? unSuspendButton : suspendButton,
92
49
  namedQuerySelector));
93
50
  };
94
- return (React.createElement(Flex, { onKeyDown: handleEnter, flexDirection: "row", className: `ab-${elementType}__Query__wrap`, flexWrap: props.viewType === 'ToolPanel' ? 'wrap' : 'nowrap' },
95
- React.createElement(Flex, { className: props.viewType === 'ToolPanel' ? 'twa:w-full' : 'twa:w-auto' }, renderTextInput()),
96
- React.createElement(Flex, null, renderButtons())));
51
+ const isToolbar = props.viewType === 'Toolbar';
52
+ return (React.createElement(Flex, { flexDirection: isToolbar ? 'row' : 'column', className: clsx(`ab-${elementType}__Query__wrap`, {
53
+ 'twa:w-[500px]': isToolbar,
54
+ }) },
55
+ React.createElement(Flex, { className: clsx({ 'twa:flex-1 twa:min-w-0': isToolbar }) }, renderExpressionLabel()),
56
+ React.createElement(Flex, { className: clsx('twa:flex-shrink-0', {
57
+ 'twa:pl-1': isToolbar,
58
+ 'twa:pt-1': !isToolbar,
59
+ }) }, renderButtons())));
97
60
  };
98
61
  export const GridFilterPanelControl = QueryViewPanelComponent;
@@ -7,6 +7,7 @@ import { useOnePageAdaptableWizardContext } from '../../../Wizard/OnePageAdaptab
7
7
  import { columnFilter } from './Utilities';
8
8
  import ArrayExtensions from '../../../../Utilities/Extensions/ArrayExtensions';
9
9
  import { Box } from '../../../../components/Flex';
10
+ import { CheckBox } from '../../../../components/CheckBox';
10
11
  export const PivotColumnsSectionSummary = () => {
11
12
  const adaptable = useAdaptable();
12
13
  const { data: layout } = useOnePageAdaptableWizardContext();
@@ -28,5 +29,12 @@ export const PivotColumnsSection = (props) => {
28
29
  return (React.createElement(Tabs, { className: "twa:h-full" },
29
30
  React.createElement(Tabs.Tab, null, "Pivot Columns"),
30
31
  React.createElement(Tabs.Content, null,
32
+ React.createElement(Box, { className: "twa:mb-3 twa:px-2" },
33
+ React.createElement(CheckBox, { checked: !!layout.PivotResultColumnsOrder, onChange: (checked) => {
34
+ props.onChange({
35
+ ...layout,
36
+ PivotResultColumnsOrder: checked,
37
+ });
38
+ } }, "Persist Order of Pivot Result Columns")),
31
39
  React.createElement(ValueSelector, { showFilterInput: true, filter: columnFilter, toIdentifier: (option) => `${option.columnId}`, toLabel: (option) => option.friendlyName ?? option.columnId, options: sortedPivotColumns, value: layout.PivotColumns ?? [], allowReorder: true, onChange: handleColumnsChange }))));
32
40
  };