@adaptabletools/adaptable 23.0.0-canary.4 → 23.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 (248) hide show
  1. package/index.css +116 -61
  2. package/package.json +9 -4
  3. package/src/AdaptableOptions/EditOptions.d.ts +2 -2
  4. package/src/AdaptableState/Common/AggregationColumns.d.ts +14 -6
  5. package/src/AdaptableState/Common/AggregationColumns.js +27 -2
  6. package/src/AdaptableState/Common/ColumnScope.d.ts +4 -0
  7. package/src/AdaptableState/Common/Enums.d.ts +5 -5
  8. package/src/AdaptableState/Common/Enums.js +4 -4
  9. package/src/AdaptableState/PlusMinusState.d.ts +3 -3
  10. package/src/AdaptableState/ShortcutState.d.ts +2 -6
  11. package/src/AdaptableState/StyledColumnState.d.ts +3 -5
  12. package/src/AdaptableState/ThemeState.d.ts +33 -28
  13. package/src/Api/EventApi.d.ts +14 -1
  14. package/src/Api/Events/ThemeChanged.d.ts +6 -0
  15. package/src/Api/Events/ThemeSelected.d.ts +11 -0
  16. package/src/Api/Events/ThemeSelected.js +1 -0
  17. package/src/Api/Implementation/EventApiImpl.js +4 -0
  18. package/src/Api/Implementation/LayoutApiImpl.d.ts +0 -2
  19. package/src/Api/Implementation/LayoutApiImpl.js +0 -14
  20. package/src/Api/Implementation/LayoutHelpers.d.ts +2 -0
  21. package/src/Api/Implementation/LayoutHelpers.js +17 -7
  22. package/src/Api/Implementation/ThemeApiImpl.d.ts +3 -2
  23. package/src/Api/Implementation/ThemeApiImpl.js +19 -15
  24. package/src/Api/Internal/EventInternalApi.d.ts +2 -0
  25. package/src/Api/Internal/EventInternalApi.js +8 -1
  26. package/src/Api/Internal/StyledColumnInternalApi.d.ts +4 -4
  27. package/src/Api/Internal/StyledColumnInternalApi.js +4 -4
  28. package/src/Api/Internal/ThemeInternalApi.d.ts +0 -1
  29. package/src/Api/Internal/ThemeInternalApi.js +0 -10
  30. package/src/Api/LayoutApi.d.ts +1 -8
  31. package/src/Api/ThemeApi.d.ts +6 -2
  32. package/src/Redux/ActionsReducers/ThemeRedux.d.ts +3 -3
  33. package/src/Strategy/FormatColumnModule.js +14 -7
  34. package/src/Strategy/LayoutModule.js +13 -8
  35. package/src/Strategy/StyledColumnModule.js +64 -36
  36. package/src/Utilities/Constants/ReduxConstants.d.ts +2 -2
  37. package/src/Utilities/Constants/ReduxConstants.js +1 -14
  38. package/src/Utilities/Helpers/FormatHelper.js +20 -1
  39. package/src/Utilities/Helpers/SparklineOptionsHelper.d.ts +7 -0
  40. package/src/Utilities/Helpers/SparklineOptionsHelper.js +65 -0
  41. package/src/Utilities/Helpers/StyledColumnGradientHelper.d.ts +23 -1
  42. package/src/Utilities/Helpers/StyledColumnGradientHelper.js +204 -0
  43. package/src/Utilities/Helpers/ThemeHelpers.d.ts +5 -0
  44. package/src/Utilities/Helpers/ThemeHelpers.js +38 -0
  45. package/src/Utilities/Helpers/percentBarPreviewHelper.d.ts +19 -0
  46. package/src/Utilities/Helpers/percentBarPreviewHelper.js +143 -0
  47. package/src/Utilities/ObjectFactory.d.ts +1 -3
  48. package/src/Utilities/ObjectFactory.js +0 -8
  49. package/src/Utilities/Services/ThemeService.js +1 -1
  50. package/src/View/Alert/Wizard/AlertBehaviourWizardSection.js +17 -16
  51. package/src/View/Alert/Wizard/AlertButtonsEditor.js +114 -103
  52. package/src/View/Alert/Wizard/AlertMessageWizardSection.js +13 -14
  53. package/src/View/Alert/Wizard/AlertNotificationWizardSection.js +55 -55
  54. package/src/View/Alert/Wizard/AlertRulesWizardSection.js +3 -2
  55. package/src/View/Alert/Wizard/AlertScheduledWizardSection.js +2 -2
  56. package/src/View/Alert/Wizard/AlertScopeWizardSection.js +31 -39
  57. package/src/View/Alert/Wizard/AlertTypeWizardSection.js +3 -4
  58. package/src/View/CalculatedColumn/Wizard/CalculatedColumnDefinitionWizardSection.js +9 -13
  59. package/src/View/CalculatedColumn/Wizard/CalculatedColumnExpressionWizardSection.js +30 -17
  60. package/src/View/CalculatedColumn/Wizard/CalculatedColumnSettingsWizardSection.js +7 -9
  61. package/src/View/CalculatedColumn/Wizard/CalculatedColumnTypeSection.js +3 -3
  62. package/src/View/CellSummary/CellSummaryViewPanel.js +1 -1
  63. package/src/View/Charting/ChartingWizard/AgChargingWizard/AgChargingWizard.js +3 -10
  64. package/src/View/Charting/ChartingWizard/AgChargingWizard/PreviewChartSection.js +1 -1
  65. package/src/View/Charting/ChartingWizard/AgChargingWizard/SettingsSection.js +32 -41
  66. package/src/View/Charting/ChartingWizard/ExternalChartingWizard/ExternalChartingWizard.js +4 -31
  67. package/src/View/Charting/ChartingWizard/ExternalChartingWizard/PreviewChartSection.d.ts +5 -0
  68. package/src/View/Charting/ChartingWizard/ExternalChartingWizard/PreviewChartSection.js +21 -0
  69. package/src/View/Charting/ChartingWizard/ExternalChartingWizard/SettingsSection.d.ts +1 -0
  70. package/src/View/Charting/ChartingWizard/ExternalChartingWizard/SettingsSection.js +10 -7
  71. package/src/View/Comments/CommentsEditor.js +1 -1
  72. package/src/View/Components/ModuleProfile.js +1 -1
  73. package/src/View/Components/Popups/WindowPopups/windowFactory.d.ts +0 -1
  74. package/src/View/Components/Popups/WindowPopups/windowFactory.js +0 -1
  75. package/src/View/Components/RangesComponent.d.ts +7 -2
  76. package/src/View/Components/RangesComponent.js +94 -22
  77. package/src/View/Components/StyleComponent.d.ts +1 -0
  78. package/src/View/Components/StyleComponent.js +1 -1
  79. package/src/View/Components/ValueSelector/index.js +70 -57
  80. package/src/View/CustomSort/Wizard/CustomSortColumnWizardSection.js +8 -13
  81. package/src/View/CustomSort/Wizard/CustomSortValuesWizardSection.js +8 -8
  82. package/src/View/DataChangeHistory/DataChangeHistoryGrid.js +1 -1
  83. package/src/View/DataImport/DataImportWizard/sections/ColumnsSection.js +11 -12
  84. package/src/View/DataImport/DataImportWizard/sections/UploadSection/UploadSection.js +6 -4
  85. package/src/View/DataImport/DataImportWizard/sections/UploadSection/UploadTextSection.js +3 -2
  86. package/src/View/DataImport/DataImportWizard/sections/ValidationSection.js +5 -15
  87. package/src/View/Export/Wizard/ReportColumnsWizardSection.js +24 -26
  88. package/src/View/Export/Wizard/ReportNameWizardSection.js +10 -13
  89. package/src/View/Export/Wizard/ReportRowsWizardSection.js +20 -22
  90. package/src/View/Export/Wizard/ScheduledReportSettings.d.ts +2 -0
  91. package/src/View/Export/Wizard/ScheduledReportSettings.js +13 -13
  92. package/src/View/Export/Wizard/ScheduledReportWizard.js +4 -5
  93. package/src/View/FlashingCell/Wizard/FlashingCellRulesWizardSection.js +8 -6
  94. package/src/View/FlashingCell/Wizard/FlashingCellScopeWizardSection.js +21 -22
  95. package/src/View/FlashingCell/Wizard/FlashingCellSettingsWizardSection.js +20 -11
  96. package/src/View/FlashingCell/Wizard/FlashingCellStyleWizardSection.js +21 -5
  97. package/src/View/FlashingCell/Wizard/FlashingCellWizard.js +4 -4
  98. package/src/View/FormatColumn/Wizard/FormatColumnFormatWizardSection.d.ts +7 -0
  99. package/src/View/FormatColumn/Wizard/FormatColumnFormatWizardSection.js +117 -12
  100. package/src/View/FormatColumn/Wizard/FormatColumnPreview.d.ts +15 -0
  101. package/src/View/FormatColumn/Wizard/FormatColumnPreview.js +66 -0
  102. package/src/View/FormatColumn/Wizard/FormatColumnRuleWizardSection.d.ts +4 -0
  103. package/src/View/FormatColumn/Wizard/FormatColumnRuleWizardSection.js +30 -0
  104. package/src/View/FormatColumn/Wizard/FormatColumnScopeWizardSection.js +13 -8
  105. package/src/View/FormatColumn/Wizard/FormatColumnSettingsWizardSection.js +1 -1
  106. package/src/View/FormatColumn/Wizard/FormatColumnStyleWizardSection.d.ts +3 -1
  107. package/src/View/FormatColumn/Wizard/FormatColumnStyleWizardSection.js +62 -13
  108. package/src/View/FormatColumn/Wizard/FormatColumnWizard.js +5 -3
  109. package/src/View/FreeTextColumn/Utilities/getFreeTextColumnSettingsTags.d.ts +2 -0
  110. package/src/View/FreeTextColumn/Utilities/getFreeTextColumnSettingsTags.js +15 -0
  111. package/src/View/FreeTextColumn/Wizard/FreeTextColumnDefinitionWizardSection.d.ts +10 -0
  112. package/src/View/FreeTextColumn/Wizard/FreeTextColumnDefinitionWizardSection.js +53 -0
  113. package/src/View/FreeTextColumn/Wizard/FreeTextColumnSettingsWizardSection.d.ts +2 -3
  114. package/src/View/FreeTextColumn/Wizard/FreeTextColumnSettingsWizardSection.js +33 -68
  115. package/src/View/FreeTextColumn/Wizard/FreeTextColumnWizard.js +15 -11
  116. package/src/View/Layout/TransposedPopup.js +2 -2
  117. package/src/View/Layout/Wizard/LayoutWizard.js +3 -3
  118. package/src/View/Layout/Wizard/sections/AggregationsSection.d.ts +2 -3
  119. package/src/View/Layout/Wizard/sections/AggregationsSection.js +115 -26
  120. package/src/View/Layout/Wizard/sections/ColumnsSection.js +79 -79
  121. package/src/View/Layout/Wizard/sections/FilterSection.js +31 -32
  122. package/src/View/Layout/Wizard/sections/GridFilterSection.js +11 -11
  123. package/src/View/Layout/Wizard/sections/PivotAggregationsSection.d.ts +1 -2
  124. package/src/View/Layout/Wizard/sections/PivotAggregationsSection.js +101 -52
  125. package/src/View/Layout/Wizard/sections/PivotColumnsSection.js +9 -8
  126. package/src/View/Layout/Wizard/sections/PivotRowGroupingSection.js +4 -4
  127. package/src/View/Layout/Wizard/sections/RowGroupingSection.js +36 -33
  128. package/src/View/Layout/Wizard/sections/RowSelectionSection.js +2 -2
  129. package/src/View/Layout/Wizard/sections/RowSummarySection.js +95 -73
  130. package/src/View/Layout/Wizard/sections/SettingsSection.js +4 -5
  131. package/src/View/Layout/Wizard/sections/SortSection.js +2 -2
  132. package/src/View/NamedQuery/Wizard/NamedQueryExpressionWizardSection.js +1 -1
  133. package/src/View/NamedQuery/Wizard/NamedQuerySettingsWizardSection.js +9 -14
  134. package/src/View/NamedQuery/Wizard/NamedQueryWizard.js +1 -3
  135. package/src/View/PlusMinus/Wizard/PlusMinusRuleWizardSection.d.ts +4 -0
  136. package/src/View/PlusMinus/Wizard/PlusMinusRuleWizardSection.js +43 -13
  137. package/src/View/PlusMinus/Wizard/PlusMinusScopeWizardSection.js +11 -18
  138. package/src/View/PlusMinus/Wizard/PlusMinusSettingsWizardSection.d.ts +2 -6
  139. package/src/View/PlusMinus/Wizard/PlusMinusSettingsWizardSection.js +6 -22
  140. package/src/View/PlusMinus/Wizard/PlusMinusWizard.js +15 -21
  141. package/src/View/Schedule/Wizard/ScheduleScheduleWizard.js +2 -2
  142. package/src/View/Shortcut/Wizard/ShortcutScopeWizardSection.js +11 -18
  143. package/src/View/Shortcut/Wizard/ShortcutSettingsWizard.js +17 -6
  144. package/src/View/Shortcut/Wizard/ShortcutWizard.js +3 -3
  145. package/src/View/Shortcut/shortcutOperations.d.ts +3 -0
  146. package/src/View/Shortcut/shortcutOperations.js +28 -0
  147. package/src/View/SpecialColumnSettingsWizardStep.js +9 -8
  148. package/src/View/StyledColumn/Wizard/BadgePillStyleEditor.d.ts +5 -0
  149. package/src/View/StyledColumn/Wizard/BadgePillStyleEditor.js +24 -15
  150. package/src/View/StyledColumn/Wizard/StyledColumnBadgeSection.d.ts +10 -2
  151. package/src/View/StyledColumn/Wizard/StyledColumnBadgeSection.js +96 -16
  152. package/src/View/StyledColumn/Wizard/StyledColumnSliceStyleEditors.d.ts +14 -0
  153. package/src/View/StyledColumn/Wizard/StyledColumnSliceStyleEditors.js +45 -24
  154. package/src/View/StyledColumn/Wizard/StyledColumnSparklineSettingsSection.d.ts +2 -3
  155. package/src/View/StyledColumn/Wizard/StyledColumnSparklineSettingsSection.js +108 -33
  156. package/src/View/StyledColumn/Wizard/StyledColumnWizard.js +21 -13
  157. package/src/View/StyledColumn/Wizard/StyledColumnWizardBulletSection.d.ts +5 -0
  158. package/src/View/StyledColumn/Wizard/StyledColumnWizardBulletSection.js +121 -23
  159. package/src/View/StyledColumn/Wizard/StyledColumnWizardGradientSection.d.ts +1 -0
  160. package/src/View/StyledColumn/Wizard/StyledColumnWizardGradientSection.js +34 -11
  161. package/src/View/StyledColumn/Wizard/StyledColumnWizardIconSection.d.ts +5 -0
  162. package/src/View/StyledColumn/Wizard/StyledColumnWizardIconSection.js +86 -12
  163. package/src/View/StyledColumn/Wizard/StyledColumnWizardRangeBarSection.d.ts +5 -0
  164. package/src/View/StyledColumn/Wizard/StyledColumnWizardRangeBarSection.js +121 -34
  165. package/src/View/StyledColumn/Wizard/StyledColumnWizardRatingSection.d.ts +1 -0
  166. package/src/View/StyledColumn/Wizard/StyledColumnWizardRatingSection.js +55 -75
  167. package/src/View/StyledColumn/Wizard/StyledColumnWizardStyleSection/Components/BulletRangesSummaryPreview.d.ts +5 -0
  168. package/src/View/StyledColumn/Wizard/StyledColumnWizardStyleSection/Components/BulletRangesSummaryPreview.js +16 -0
  169. package/src/View/StyledColumn/Wizard/StyledColumnWizardStyleSection/Components/GradientSummaryPreview.js +7 -13
  170. package/src/View/StyledColumn/Wizard/StyledColumnWizardStyleSection/Components/PercentBarColumnComparisonPreview.js +5 -5
  171. package/src/View/StyledColumn/Wizard/StyledColumnWizardStyleSection/Components/PercentBarRangesPreview.js +4 -3
  172. package/src/View/StyledColumn/Wizard/StyledColumnWizardStyleSection/Components/PercentBarStylePreview.d.ts +5 -4
  173. package/src/View/StyledColumn/Wizard/StyledColumnWizardStyleSection/Components/PercentBarStylePreview.js +12 -14
  174. package/src/View/StyledColumn/Wizard/StyledColumnWizardStyleSection/Components/RangeBarRangesSummaryPreview.d.ts +5 -0
  175. package/src/View/StyledColumn/Wizard/StyledColumnWizardStyleSection/Components/RangeBarRangesSummaryPreview.js +16 -0
  176. package/src/View/StyledColumn/Wizard/StyledColumnWizardStyleSection/Components/StyledColumnBadgePreview.d.ts +3 -0
  177. package/src/View/StyledColumn/Wizard/StyledColumnWizardStyleSection/Components/StyledColumnBadgePreview.js +31 -3
  178. package/src/View/StyledColumn/Wizard/StyledColumnWizardStyleSection/Components/StyledColumnBulletPreview.d.ts +9 -0
  179. package/src/View/StyledColumn/Wizard/StyledColumnWizardStyleSection/Components/StyledColumnBulletPreview.js +58 -0
  180. package/src/View/StyledColumn/Wizard/StyledColumnWizardStyleSection/Components/StyledColumnGradientPreview.d.ts +10 -0
  181. package/src/View/StyledColumn/Wizard/StyledColumnWizardStyleSection/Components/StyledColumnGradientPreview.js +30 -0
  182. package/src/View/StyledColumn/Wizard/StyledColumnWizardStyleSection/Components/StyledColumnIconPreview.d.ts +10 -0
  183. package/src/View/StyledColumn/Wizard/StyledColumnWizardStyleSection/Components/StyledColumnIconPreview.js +91 -0
  184. package/src/View/StyledColumn/Wizard/StyledColumnWizardStyleSection/Components/StyledColumnPercentBarPreview.d.ts +8 -0
  185. package/src/View/StyledColumn/Wizard/StyledColumnWizardStyleSection/Components/StyledColumnPercentBarPreview.js +52 -0
  186. package/src/View/StyledColumn/Wizard/StyledColumnWizardStyleSection/Components/StyledColumnRangeBarPreview.d.ts +8 -0
  187. package/src/View/StyledColumn/Wizard/StyledColumnWizardStyleSection/Components/StyledColumnRangeBarPreview.js +53 -0
  188. package/src/View/StyledColumn/Wizard/StyledColumnWizardStyleSection/Components/StyledColumnRatingPreview.d.ts +18 -0
  189. package/src/View/StyledColumn/Wizard/StyledColumnWizardStyleSection/Components/StyledColumnRatingPreview.js +58 -0
  190. package/src/View/StyledColumn/Wizard/StyledColumnWizardStyleSection/Components/StyledColumnSparklinePreview.d.ts +10 -0
  191. package/src/View/StyledColumn/Wizard/StyledColumnWizardStyleSection/Components/StyledColumnSparklinePreview.js +126 -0
  192. package/src/View/StyledColumn/Wizard/StyledColumnWizardStyleSection/StyledColumnWizardRangesSection.js +12 -5
  193. package/src/View/StyledColumn/Wizard/StyledColumnWizardStyleSection/StyledColumnWizardStyleSection.d.ts +1 -5
  194. package/src/View/StyledColumn/Wizard/StyledColumnWizardStyleSection/StyledColumnWizardStyleSection.js +52 -29
  195. package/src/View/SystemStatus/Utilities/getStatusItemStyle.js +1 -1
  196. package/src/View/Theme/ThemePopup.d.ts +2 -14
  197. package/src/View/Theme/ThemePopup.js +1 -36
  198. package/src/View/UIHelper.js +1 -1
  199. package/src/View/Wizard/OnePageAdaptableWizard.js +7 -21
  200. package/src/agGrid/AdaptableAgGrid.d.ts +1 -0
  201. package/src/agGrid/AdaptableAgGrid.js +35 -25
  202. package/src/agGrid/AgGridAdapter.d.ts +1 -1
  203. package/src/agGrid/AgGridAdapter.js +27 -17
  204. package/src/agGrid/AgGridColumnAdapter.js +9 -15
  205. package/src/agGrid/AgGridMenuAdapter.d.ts +0 -1
  206. package/src/agGrid/AgGridMenuAdapter.js +20 -37
  207. package/src/agGrid/buildValueAggregationMenuItem.d.ts +19 -0
  208. package/src/agGrid/buildValueAggregationMenuItem.js +111 -0
  209. package/src/agGrid/cellRenderers/IconRenderer.d.ts +6 -0
  210. package/src/agGrid/cellRenderers/IconRenderer.js +43 -15
  211. package/src/agGrid/createAgGridIcon.d.ts +10 -0
  212. package/src/agGrid/createAgGridIcon.js +16 -0
  213. package/src/components/DragAndDropContext/UnusedPanel.js +1 -1
  214. package/src/components/ExpressionEditor/BaseEditorInput.js +1 -1
  215. package/src/components/ExpressionEditor/ExpressionFunctionDocumentation.js +1 -1
  216. package/src/components/Input/NumberInput.js +1 -1
  217. package/src/components/Panel/index.js +1 -1
  218. package/src/components/SimpleButton/index.js +4 -4
  219. package/src/components/Toggle/Toggle.js +1 -1
  220. package/src/components/Toggle/ToggleGroup.js +1 -1
  221. package/src/env.js +2 -2
  222. package/src/layout-manager/src/index.js +2 -9
  223. package/src/metamodel/adaptable.metamodel.d.ts +39 -29
  224. package/src/metamodel/adaptable.metamodel.js +1 -1
  225. package/src/types.d.ts +5 -4
  226. package/themes/dark.css +1 -68
  227. package/themes/light.css +1 -5
  228. package/tsconfig.esm.tsbuildinfo +1 -1
  229. package/src/Aggregation/ParameterizedAggregationRegistry.d.ts +0 -35
  230. package/src/Aggregation/ParameterizedAggregationRegistry.js +0 -63
  231. package/src/Aggregation/definitions/weightedAverageAggregationDefinition.d.ts +0 -3
  232. package/src/Aggregation/definitions/weightedAverageAggregationDefinition.js +0 -55
  233. package/src/Aggregation/parameterizedAggregationColumnMenu.d.ts +0 -8
  234. package/src/Aggregation/parameterizedAggregationColumnMenu.js +0 -137
  235. package/src/Aggregation/parameterizedAggregationHeader.d.ts +0 -13
  236. package/src/Aggregation/parameterizedAggregationHeader.js +0 -60
  237. package/src/Aggregation/parameterizedAggregationHelpers.d.ts +0 -23
  238. package/src/Aggregation/parameterizedAggregationHelpers.js +0 -111
  239. package/src/Aggregation/parameterizedAggregationWizardHelpers.d.ts +0 -9
  240. package/src/Aggregation/parameterizedAggregationWizardHelpers.js +0 -66
  241. package/src/Aggregation/validateParameterizedAggregations.d.ts +0 -4
  242. package/src/Aggregation/validateParameterizedAggregations.js +0 -20
  243. package/src/View/Layout/Wizard/sections/ParameterizedAggFuncPicker.d.ts +0 -12
  244. package/src/View/Layout/Wizard/sections/ParameterizedAggFuncPicker.js +0 -43
  245. package/src/View/StyledColumn/Wizard/StyledColumnWizardStyleSection/Components/StyledColumnBadgeSettings.d.ts +0 -5
  246. package/src/View/StyledColumn/Wizard/StyledColumnWizardStyleSection/Components/StyledColumnBadgeSettings.js +0 -28
  247. package/src/View/Theme/VariantSelector.d.ts +0 -8
  248. package/src/View/Theme/VariantSelector.js +0 -20
@@ -4,7 +4,7 @@ import { CheckBox } from '../../../../components/CheckBox';
4
4
  import FormLayout, { FormRow } from '../../../../components/FormLayout';
5
5
  import Panel from '../../../../components/Panel';
6
6
  import SimpleButton from '../../../../components/SimpleButton';
7
- import { Tabs } from '../../../../components/Tabs';
7
+ import { Card } from '../../../../components/Card';
8
8
  import { Tag } from '../../../../components/Tag';
9
9
  import { summarySupportedExpressions, WEIGHTED_AVERAGE_AGGREGATED_FUNCTION, } from '../../../../AdaptableState/Common/RowSummary';
10
10
  import { mapColumnDataTypeToExpressionFunctionType } from '../../../../Utilities/adaptableQlUtils';
@@ -73,6 +73,33 @@ const getAvailableExpressionsForColumnType = (columnType, availableScalarExpress
73
73
  availableExpressionsForColumnTypeCache.set(key, expressions);
74
74
  return expressions;
75
75
  };
76
+ const buildRowSummaryExpressionOptions = (column, availableScalarExpressions, layout) => {
77
+ const expressionOptions = getAvailableExpressionsForColumnType(column.dataType, availableScalarExpressions).map((expression) => ({
78
+ label: expression,
79
+ value: expression,
80
+ }));
81
+ const aggregation = layout.TableAggregationColumns?.find((agg) => agg.ColumnId === column.columnId)?.AggFunc;
82
+ if (aggregation &&
83
+ typeof aggregation === 'object' &&
84
+ aggregation.weightedColumnId) {
85
+ expressionOptions.push({
86
+ label: 'WEIGHTERD_AVG',
87
+ value: WEIGHTED_AVERAGE_AGGREGATED_FUNCTION,
88
+ });
89
+ }
90
+ return expressionOptions;
91
+ };
92
+ const getDefaultRowSummaryExpression = (column, availableScalarExpressions, layout) => {
93
+ const optionValues = buildRowSummaryExpressionOptions(column, availableScalarExpressions, layout).map((option) => option.value);
94
+ if (optionValues.includes('sum')) {
95
+ return 'sum';
96
+ }
97
+ const sumExpression = optionValues.find((value) => value.toLowerCase() === 'sum');
98
+ if (sumExpression) {
99
+ return sumExpression;
100
+ }
101
+ return optionValues[0] ?? null;
102
+ };
76
103
  export const RowSummarySectionSummary = () => {
77
104
  const adaptable = useAdaptable();
78
105
  const { data: layout } = useOnePageAdaptableWizardContext();
@@ -100,76 +127,71 @@ const RowSummaryEditor = React.memo(({ rowSummary, onChange, availableScalarExpr
100
127
  sortUnorderedItems: false,
101
128
  }).map((colId) => adaptable.api.columnApi.getColumnWithColumnId(colId));
102
129
  }, [rowSummary.ColumnsMap]);
103
- return (_jsxs(Panel, { header: _jsxs(Flex, { className: "twa:w-full", children: [_jsx(Flex, { className: "twa:flex-1", alignItems: "center", children: "Row Summary" }), _jsx(Box, { className: "twa:mr-2", children: _jsx(SuspendToggleButton, { onSuspend: () => {
104
- onChange({
105
- ...rowSummary,
106
- IsSuspended: true,
107
- });
108
- }, onUnSuspend: () => {
109
- onChange({
110
- ...rowSummary,
111
- IsSuspended: false,
112
- });
113
- }, suspendableObject: rowSummary }) }), _jsx(SimpleButton, { icon: "delete", onClick: () => {
114
- onDelete();
115
- } })] }), className: "twa:p-2", children: [_jsxs(FormLayout, { children: [_jsx(FormRow, { label: "Position", children: _jsx(SingleSelect, { items: [
116
- {
117
- label: 'Top',
118
- value: 'Top',
119
- },
120
- {
121
- label: 'Bottom',
122
- value: 'Bottom',
123
- },
124
- ], value: rowSummary.Position, onValueChange: (position) => {
125
- onChange({
126
- ...rowSummary,
127
- Position: position,
128
- });
129
- } }) }), _jsx(FormRow, { label: "", children: _jsx(CheckBox, { checked: rowSummary.IncludeOnlyFilteredRows ?? true, onChange: (IncludeOnlyFilteredRows) => {
130
- onChange({
131
- ...rowSummary,
132
- IncludeOnlyFilteredRows,
133
- });
134
- }, children: "Include Only Filtered Rows" }) })] }), _jsxs(Flex, { flexDirection: "column", className: "twa:mt-2 twa:mb-1", children: [_jsx(Flex, { alignItems: "center", className: "twa:flex-1 twa:mb-2", children: "Column Aggregations" }), _jsx(Panel, { bodyProps: { className: 'twa:max-h-full twa:bg-primarylight ' }, className: "twa:h-[360px]", children: _jsx(ValueSelector, { style: { maxHeight: '100%' }, showFilterInput: true, filter: columnFilter, toIdentifier: (column) => column.columnId, toLabel: (option) => option.friendlyName ?? option.columnId, options: columns, toListLabel: (column) => {
135
- const label = column.friendlyName ?? column.columnId;
136
- if (!(column.columnId in (rowSummary.ColumnsMap ?? {}))) {
137
- return (_jsxs(Flex, { alignItems: "center", children: [label, _jsx(ColumnGroupTag, { column: column })] }));
138
- }
139
- const expressionOptions = getAvailableExpressionsForColumnType(column.dataType, availableScalarExpressions).map((expression) => ({
140
- label: expression,
141
- value: expression,
142
- }));
143
- // check out if this layout has a aggregation with weighted column
144
- const aggregation = layout.TableAggregationColumns?.find((agg) => agg.ColumnId === column.columnId)?.AggFunc;
145
- if (aggregation &&
146
- typeof aggregation === 'object' &&
147
- aggregation.weightedColumnId) {
148
- expressionOptions.push({
149
- label: 'WEIGHTERD_AVG',
150
- value: WEIGHTED_AVERAGE_AGGREGATED_FUNCTION,
151
- });
152
- }
153
- const expression = rowSummary.ColumnsMap[column.columnId];
154
- return (_jsxs(Flex, { children: [_jsxs(Flex, { className: "twa:mr-2", alignItems: 'center', children: [label, _jsx(ColumnGroupTag, { column: column })] }), _jsx(SingleSelect, { value: expression, items: expressionOptions, onValueChange: (expression) => {
155
- onChange({
156
- ...rowSummary,
157
- ColumnsMap: {
158
- ...rowSummary.ColumnsMap,
159
- [column.columnId]: expression,
160
- },
161
- });
162
- } })] }));
163
- }, value: Object.keys(rowSummary.ColumnsMap), onChange: (colIds) => {
164
- const newColumnsMap = {};
165
- colIds.forEach((colId) => {
166
- newColumnsMap[colId] = rowSummary.ColumnsMap[colId] ?? null;
167
- });
168
- onChange({
169
- ...rowSummary,
170
- ColumnsMap: newColumnsMap,
171
- });
172
- } }) })] })] }));
130
+ return (_jsx(Panel, { className: "twa:mb-3", bodyProps: { className: 'twa:p-2' }, children: _jsxs(Card, { shadow: false, children: [_jsxs(Card.Title, { className: "twa:w-full", children: [_jsx(Box, { className: "twa:font-medium twa:flex-1", children: "Row Summary" }), _jsxs(Flex, { alignItems: "center", className: "twa:gap-2 twa:shrink-0", children: [_jsx(SuspendToggleButton, { onSuspend: () => {
131
+ onChange({
132
+ ...rowSummary,
133
+ IsSuspended: true,
134
+ });
135
+ }, onUnSuspend: () => {
136
+ onChange({
137
+ ...rowSummary,
138
+ IsSuspended: false,
139
+ });
140
+ }, suspendableObject: rowSummary }), _jsx(SimpleButton, { icon: "delete", onClick: () => {
141
+ onDelete();
142
+ } })] })] }), _jsxs(Card.Body, { className: "twa:p-1 twa:gap-3", children: [_jsxs(FormLayout, { children: [_jsx(FormRow, { label: "Position", children: _jsx(SingleSelect, { items: [
143
+ {
144
+ label: 'Top',
145
+ value: 'Top',
146
+ },
147
+ {
148
+ label: 'Bottom',
149
+ value: 'Bottom',
150
+ },
151
+ ], value: rowSummary.Position, onValueChange: (position) => {
152
+ onChange({
153
+ ...rowSummary,
154
+ Position: position,
155
+ });
156
+ } }) }), _jsx(FormRow, { label: "", children: _jsx(CheckBox, { checked: rowSummary.IncludeOnlyFilteredRows ?? true, onChange: (IncludeOnlyFilteredRows) => {
157
+ onChange({
158
+ ...rowSummary,
159
+ IncludeOnlyFilteredRows,
160
+ });
161
+ }, children: "Include Only Filtered Rows" }) })] }), _jsxs(Card, { shadow: false, className: "twa:h-[360px] twa:overflow-hidden twa:flex twa:flex-col", children: [_jsxs(Card.Title, { children: [_jsx(Box, { className: "twa:font-medium", children: "Column Aggregations" }), _jsx(Box, { className: "twa:text-xs twa:opacity-70 twa:font-normal twa:max-w-[520px]", children: "Select columns and choose an aggregation function for each" })] }), _jsx(Card.Body, { className: "twa:flex-1 twa:min-h-0 twa:overflow-hidden twa:p-1", children: _jsx(ValueSelector, { style: { minHeight: 0, maxHeight: '100%' }, showFilterInput: true, filter: columnFilter, toIdentifier: (column) => column.columnId, toLabel: (option) => option.friendlyName ?? option.columnId, options: columns, toListLabel: (column) => {
162
+ const label = column.friendlyName ?? column.columnId;
163
+ if (!(column.columnId in (rowSummary.ColumnsMap ?? {}))) {
164
+ return (_jsxs(Flex, { alignItems: "center", children: [label, _jsx(ColumnGroupTag, { column: column })] }));
165
+ }
166
+ const expressionOptions = buildRowSummaryExpressionOptions(column, availableScalarExpressions, layout);
167
+ const expression = rowSummary.ColumnsMap[column.columnId];
168
+ return (_jsxs(Flex, { children: [_jsxs(Flex, { className: "twa:mr-2", alignItems: 'center', children: [label, _jsx(ColumnGroupTag, { column: column })] }), _jsx(SingleSelect, { className: "twa:min-w-[140px]", value: expression, items: expressionOptions, onValueChange: (expression) => {
169
+ onChange({
170
+ ...rowSummary,
171
+ ColumnsMap: {
172
+ ...rowSummary.ColumnsMap,
173
+ [column.columnId]: expression,
174
+ },
175
+ });
176
+ } })] }));
177
+ }, value: Object.keys(rowSummary.ColumnsMap), onChange: (colIds) => {
178
+ const newColumnsMap = {};
179
+ colIds.forEach((colId) => {
180
+ const existing = rowSummary.ColumnsMap[colId];
181
+ if (existing) {
182
+ newColumnsMap[colId] = existing;
183
+ return;
184
+ }
185
+ const column = adaptable.api.columnApi.getColumnWithColumnId(colId);
186
+ newColumnsMap[colId] = column
187
+ ? getDefaultRowSummaryExpression(column, availableScalarExpressions, layout)
188
+ : null;
189
+ });
190
+ onChange({
191
+ ...rowSummary,
192
+ ColumnsMap: newColumnsMap,
193
+ });
194
+ } }) })] })] })] }) }));
173
195
  });
174
196
  export const RowSummarySection = (props) => {
175
197
  const adaptable = useAdaptable();
@@ -180,7 +202,7 @@ export const RowSummarySection = (props) => {
180
202
  .getModuleExpressionFunctionsMap(LayoutModuleId).aggregatedScalarFunctions;
181
203
  return sytemExpressions;
182
204
  }, []);
183
- return (_jsxs(Tabs, { style: { height: '100%' }, children: [_jsx(Tabs.Tab, { children: "Row Summaries" }), _jsx(Tabs.Content, { children: _jsxs("div", { children: [_jsxs(Flex, { className: "twa:mb-1", children: [_jsx(Flex, { className: "twa:flex-1" }), _jsx(SimpleButton, { onClick: () => {
205
+ return (_jsx(Flex, { flexDirection: "column", className: "twa:gap-3 twa:p-3 twa:h-full", children: _jsxs(Card, { shadow: false, children: [_jsxs(Card.Title, { children: [_jsx(Box, { className: "twa:font-medium", children: "Row Summaries" }), _jsx(Box, { className: "twa:text-xs twa:opacity-70 twa:font-normal twa:max-w-[520px]", children: "Add summary rows at the top or bottom of the grid with aggregated column values" })] }), _jsxs(Card.Body, { className: "twa:p-1", children: [_jsxs(Flex, { className: "twa:mb-2", children: [_jsx(Flex, { className: "twa:flex-1" }), _jsx(SimpleButton, { onClick: () => {
184
206
  props.onChange({
185
207
  ...layout,
186
208
  RowSummaries: [
@@ -208,5 +230,5 @@ export const RowSummarySection = (props) => {
208
230
  RowSummaries: newSummaries,
209
231
  });
210
232
  } }, index));
211
- })] }) })] }));
233
+ })] })] }) }));
212
234
  };
@@ -1,12 +1,11 @@
1
- import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
2
- import FormLayout, { FormRow } from '../../../../components/FormLayout';
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
3
2
  import Input from '../../../../components/Input';
4
- import Radio from '../../../../components/Radio';
5
- import { Tabs } from '../../../../components/Tabs';
6
3
  import { Tag } from '../../../../components/Tag';
4
+ import { TypeRadio } from '../../../Wizard/TypeRadio';
7
5
  import { useOnePageAdaptableWizardContext } from '../../../Wizard/OnePageAdaptableWizard';
8
6
  import { isPivotLayout } from '../../../../Utilities/isPivotLayout';
9
7
  import { Box, Flex } from '../../../../components/Flex';
8
+ import { Card } from '../../../../components/Card';
10
9
  export const SettingsSectionSummary = () => {
11
10
  const { data: layout } = useOnePageAdaptableWizardContext();
12
11
  const isPivot = isPivotLayout(layout);
@@ -20,5 +19,5 @@ export const SettingsSection = (props) => {
20
19
  Name: event.target.value,
21
20
  });
22
21
  };
23
- return (_jsxs(_Fragment, { children: [_jsxs(Tabs, { className: "twa:mb-2", children: [_jsx(Tabs.Tab, { children: "Settings" }), _jsx(Tabs.Content, { children: _jsx(Flex, { flexDirection: "row", children: _jsx(FormLayout, { className: "twa:max-w-[300px] twa:w-full", children: _jsx(FormRow, { label: "Name", children: _jsx(Input, { className: "twa:w-full", "data-name": "layout-name", onChange: onNameChange, value: layout?.Name ?? '' }) }) }) }) })] }), _jsxs(Tabs, { className: "twa:mb-2", children: [_jsx(Tabs.Tab, { children: "Grid Type" }), _jsx(Tabs.Content, { children: _jsxs(Flex, { flexDirection: "column", children: [_jsx(Radio, { "data-name": "layout-type-table", disabled: true, checked: !isPivotLayout(layout), children: "Table" }), _jsx(Radio, { "data-name": "layout-type-pivot", disabled: true, checked: isPivotLayout(layout), children: "Pivot" })] }) })] })] }));
22
+ return (_jsxs(Flex, { flexDirection: "column", className: "twa:gap-3 twa:p-3", children: [_jsxs(Card, { shadow: false, children: [_jsxs(Card.Title, { children: [_jsx(Box, { className: "twa:font-medium", children: "Name" }), _jsx(Box, { className: "twa:text-xs twa:opacity-70 twa:font-normal twa:max-w-[520px]", children: "Provide a unique name for this Layout" })] }), _jsx(Card.Body, { className: "twa:p-1", children: _jsx(Input, { className: "twa:max-w-[300px] twa:w-full", "data-name": "layout-name", onChange: onNameChange, value: layout?.Name ?? '' }) })] }), _jsxs(Card, { shadow: false, children: [_jsx(Card.Title, { children: _jsx(Box, { className: "twa:font-medium", children: "Grid Type" }) }), _jsx(Card.Body, { className: "twa:p-1", children: _jsxs(Flex, { flexDirection: "column", className: "twa:gap-2", children: [_jsx(Box, { "data-name": "layout-type-table", children: _jsx(TypeRadio, { disabled: true, checked: !isPivotLayout(layout), text: "Table", description: "A flat layout \u2014 data is shown in standard rows and columns, one row per record" }) }), _jsx(Box, { "data-name": "layout-type-pivot", children: _jsx(TypeRadio, { disabled: true, checked: isPivotLayout(layout), text: "Pivot", description: "An aggregated layout \u2014 data is grouped and summarized by pivot columns" }) })] }) })] })] }));
24
23
  };
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import * as React from 'react';
3
3
  import SimpleButton from '../../../../components/SimpleButton';
4
- import { Tabs } from '../../../../components/Tabs';
4
+ import { Card } from '../../../../components/Card';
5
5
  import { Tag } from '../../../../components/Tag';
6
6
  import { getLayoutSortViewItems } from '../../../../Strategy/Utilities/Layout/getLayoutSortViewItems';
7
7
  import { useAdaptable } from '../../../AdaptableContext';
@@ -55,5 +55,5 @@ export const SortSection = (props) => {
55
55
  }),
56
56
  });
57
57
  }, [layout]);
58
- return (_jsxs(Tabs, { className: "twa:h-full", children: [_jsx(Tabs.Tab, { children: "Column Sorts" }), _jsx(Tabs.Content, { children: _jsx(ValueSelector, { showFilterInput: true, filter: columnFilter, toIdentifier: (option) => `${option.columnId}`, toLabel: (option) => option.friendlyName ?? option.columnId, toListLabel: (column) => (_jsx(ColumnRow, { onSortChange: handleSortChange, layout: layout, column: column })), options: sortedSortColumns, value: (layout.ColumnSorts ?? []).map((sort) => sort.ColumnId), allowReorder: () => true, onChange: handleColumnsSelectionChange }) })] }));
58
+ return (_jsx(Flex, { flexDirection: "column", className: "twa:gap-3 twa:p-3 twa:h-full", children: _jsxs(Card, { shadow: false, className: "twa:flex-1 twa:min-h-0", children: [_jsxs(Card.Title, { children: [_jsx(Box, { className: "twa:font-medium", children: "Column Sorts" }), _jsx(Box, { className: "twa:text-xs twa:opacity-70 twa:font-normal twa:max-w-[520px]", children: "Select columns to sort and set their sort order. Drag to change sort priority." })] }), _jsx(Card.Body, { className: "twa:p-1 twa:min-h-[200px]", children: _jsx(ValueSelector, { showFilterInput: true, filter: columnFilter, toIdentifier: (option) => `${option.columnId}`, toLabel: (option) => option.friendlyName ?? option.columnId, toListLabel: (column) => (_jsx(ColumnRow, { onSortChange: handleSortChange, layout: layout, column: column })), options: sortedSortColumns, value: (layout.ColumnSorts ?? []).map((sort) => sort.ColumnId), allowReorder: () => true, onChange: handleColumnsSelectionChange }) })] }) }));
59
59
  };
@@ -7,7 +7,7 @@ import { useOnePageAdaptableWizardContext } from '../../Wizard/OnePageAdaptableW
7
7
  import { Box } from '../../../components/Flex';
8
8
  export const isValidNamedQueryExpression = (data, api) => {
9
9
  if (!data.BooleanExpression) {
10
- return 'An expression is required.';
10
+ return 'An expression is required';
11
11
  }
12
12
  const valid = api.expressionApi.isValidBooleanExpression(data.BooleanExpression, NamedQueryModuleId);
13
13
  if (!valid) {
@@ -1,11 +1,9 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import WizardPanel from '../../../components/WizardPanel';
3
- import FormLayout, { FormRow } from '../../../components/FormLayout';
4
- import ErrorBox from '../../../components/ErrorBox';
5
- import { useOnePageAdaptableWizardContext } from '../../Wizard/OnePageAdaptableWizard';
6
- import AdaptableInput from '../../Components/AdaptableInput';
2
+ import { useOnePageAdaptableWizardContext, SummaryText } from '../../Wizard/OnePageAdaptableWizard';
7
3
  import { Tag } from '../../../components/Tag';
8
- import { Box } from '../../../components/Flex';
4
+ import { Box, Flex } from '../../../components/Flex';
5
+ import { Card } from '../../../components/Card';
6
+ import Input from '../../../components/Input';
9
7
  export const isValidNamedQuerySettings = (data, api) => {
10
8
  const validationResult = api.namedQueryApi.isValidNamedQuery(data);
11
9
  const ErrorMessage = !validationResult.valid ? validationResult.message : null;
@@ -15,18 +13,15 @@ export const isValidNamedQuerySettings = (data, api) => {
15
13
  return ErrorMessage;
16
14
  };
17
15
  export const renderNamedQuerySettingsSummary = (data) => {
18
- return (_jsxs(Box, { className: "twa:text-2", children: ["Name: ", _jsx(Tag, { children: data.Name })] }));
16
+ return (_jsxs(SummaryText, { children: ["Name ", _jsx(Tag, { children: data.Name || 'Not specified' })] }));
19
17
  };
20
18
  export const NamedQuerySettingsWizardSection = (props) => {
21
- const { data, api } = useOnePageAdaptableWizardContext();
22
- const valid = isValidNamedQuerySettings(data, api);
23
- const errorMessage = valid === true ? null : valid;
24
- const handleColumnNameChange = (event) => {
25
- let e = event.target;
19
+ const { data } = useOnePageAdaptableWizardContext();
20
+ const handleNameChange = (event) => {
26
21
  props.onChange({
27
22
  ...data,
28
- Name: e.value,
23
+ Name: event.target.value,
29
24
  });
30
25
  };
31
- return (_jsx(WizardPanel, { "data-name": 'named-query-settings', children: _jsxs(FormLayout, { children: [_jsx(FormRow, { label: "Name", children: _jsx(AdaptableInput, { "data-name": "query-name", value: data.Name, autoFocus: true, className: "twa:w-[300px]", type: "text", placeholder: "Enter Named Query Name", onChange: (e) => handleColumnNameChange(e) }) }), ' ', errorMessage ? (_jsx(FormRow, { label: "", children: _jsx(ErrorBox, { children: errorMessage }) })) : null] }) }));
26
+ return (_jsx(Box, { "data-name": "named-query-settings", children: _jsx(Flex, { flexDirection: "column", className: "twa:gap-3 twa:p-3", children: _jsxs(Card, { shadow: false, children: [_jsxs(Card.Title, { children: [_jsx(Box, { className: "twa:font-medium", children: "Name" }), _jsx(Box, { className: "twa:text-xs twa:opacity-70 twa:font-normal twa:max-w-[520px]", children: "Provide a unique name for the Named Query" })] }), _jsx(Card.Body, { className: "twa:p-1", children: _jsx(Input, { "data-name": "query-name", value: data.Name ?? '', autoFocus: true, className: "twa:max-w-[300px] twa:w-full", type: "text", placeholder: "Enter name for Named Query", onChange: handleNameChange }) })] }) }) }));
32
27
  };
@@ -39,9 +39,7 @@ export function NamedQueryWizard(props) {
39
39
  details: 'Specify a unique Name for the Named Query',
40
40
  renderSummary: renderNamedQuerySettingsSummary,
41
41
  isValid: isValidNamedQuerySettings,
42
- render: () => {
43
- return _jsx(NamedQuerySettingsWizardSection, { onChange: setNamedQuery });
44
- },
42
+ render: () => _jsx(NamedQuerySettingsWizardSection, { onChange: setNamedQuery }),
45
43
  },
46
44
  {
47
45
  details: 'Select Named Query Tags',
@@ -1,6 +1,10 @@
1
1
  import * as React from 'react';
2
2
  import { PlusMinusNudge } from '../../../types';
3
+ import { OnePageAdaptableWizardContextType } from '../../Wizard/OnePageAdaptableWizard';
4
+ import { AdaptableApi } from '../../../Api/AdaptableApi';
3
5
  export declare function PlusMinusRuleSummary(): React.JSX.Element;
6
+ export declare const PlusMinusRuleStepSummary: React.FunctionComponent;
7
+ export declare const isRuleValid: (data: PlusMinusNudge, api: AdaptableApi, context: OnePageAdaptableWizardContextType<PlusMinusNudge>) => string | true;
4
8
  interface PlusMinusRuleWizardSectionProps {
5
9
  onChange: (data: PlusMinusNudge) => void;
6
10
  defaultPredicateId: string;
@@ -1,7 +1,12 @@
1
1
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useOnePageAdaptableWizardContext } from '../../Wizard/OnePageAdaptableWizard';
2
+ import { SummaryText, useOnePageAdaptableWizardContext, } from '../../Wizard/OnePageAdaptableWizard';
3
3
  import { EntityRulesEditor, EntityRulesSummary } from '../../Components/EntityRulesEditor';
4
4
  import { CodeBlock } from '../../../components/CodeBlock';
5
+ import { isAdaptableRuleValid } from '../../Components/EntityRulesEditor/Utilities';
6
+ import { Box, Flex } from '../../../components/Flex';
7
+ import { Card } from '../../../components/Card';
8
+ import { TypeRadio } from '../../Wizard/TypeRadio';
9
+ import { Tag } from '../../../components/Tag';
5
10
  export function PlusMinusRuleSummary() {
6
11
  const { data } = useOnePageAdaptableWizardContext();
7
12
  return (_jsx(EntityRulesSummary, { data: data, renderPredicate: (contents) => {
@@ -10,22 +15,47 @@ export function PlusMinusRuleSummary() {
10
15
  return (_jsxs(_Fragment, { children: ["Apply Plus Minus when", ' ', _jsx("b", { children: _jsx(CodeBlock, { children: contents }) })] }));
11
16
  } }));
12
17
  }
18
+ export const PlusMinusRuleStepSummary = () => {
19
+ const { data } = useOnePageAdaptableWizardContext();
20
+ const hasCondition = Boolean(data.Rule);
21
+ return (_jsxs(_Fragment, { children: [_jsxs(SummaryText, { children: ["Nudge Type ", _jsx(Tag, { children: hasCondition ? 'Conditional' : 'Always Apply' })] }), hasCondition ? _jsx(PlusMinusRuleSummary, {}) : null] }));
22
+ };
23
+ export const isRuleValid = (data, api, context) => {
24
+ if (!data.Rule) {
25
+ return true;
26
+ }
27
+ if (!data.Rule.BooleanExpression) {
28
+ return 'A valid rule is required.';
29
+ }
30
+ const ruleValidation = isAdaptableRuleValid(data, api, context);
31
+ if (typeof ruleValidation === 'string') {
32
+ return ruleValidation;
33
+ }
34
+ return true;
35
+ };
13
36
  export function PlusMinusRuleWizardSection(props) {
14
37
  const { data, moduleInfo } = useOnePageAdaptableWizardContext();
38
+ const hasCondition = Boolean(data.Rule);
39
+ const handleNudgeTypeChange = (conditional) => {
40
+ if (conditional) {
41
+ props.onChange({
42
+ ...data,
43
+ Rule: data.Rule ?? { BooleanExpression: '' },
44
+ });
45
+ return;
46
+ }
47
+ const preparedData = { ...data };
48
+ delete preparedData.Rule;
49
+ props.onChange(preparedData);
50
+ };
15
51
  const plusMinusNudge = {
16
52
  ...data,
17
53
  Rule: data?.Rule ?? { BooleanExpression: '' },
18
54
  };
19
- return (_jsx(EntityRulesEditor, { module: moduleInfo.ModuleName,
20
- // min-height 0 so the container does not min-size from it's children
21
- // https://stackoverflow.com/questions/33605552/how-to-prevent-a-flex-item-height-to-overflow-due-to-its-content
22
- flexProps: { style: { minHeight: 0 } }, defaultPredicateId: props.defaultPredicateId, predicateDefs: [], showAggregation: false, showObservable: false, showPredicate: false, data: plusMinusNudge,
23
- // the cast is to convince TS that it still a PlusMinusNudge
24
- // even when Rule is not optional, the type is inferred from `plusMinusNudge`
25
- onChange: (plusMinus) => props.onChange(plusMinus), descriptions: {
26
- selectPredicate: null,
27
- useBooleanQuery: (_jsxs(_Fragment, { children: ["Use an BooleanQuery if ", _jsx("i", { children: "Scope" }), " is 'All Columns' - so any data change may be evaluated in a complex BooleanExpression"] })),
28
- useObservableQuery: null,
29
- useAggregationQuery: null,
30
- } }));
55
+ return (_jsxs(Flex, { flexDirection: "column", className: "twa:h-full twa:gap-3 twa:p-3", children: [_jsxs(Card, { shadow: false, children: [_jsxs(Card.Title, { children: [_jsx(Box, { className: "twa:font-medium", children: "Nudge Type" }), _jsx(Box, { className: "twa:text-xs twa:opacity-70 twa:font-normal twa:max-w-[520px]", children: "Choose whether the nudge is always applied or only when a condition is met" })] }), _jsx(Card.Body, { children: _jsxs(Flex, { flexDirection: "column", children: [_jsx(TypeRadio, { "data-name": "nudge-type-always", text: "Always Apply", description: "The nudge value is always applied when using Plus/Minus", checked: !hasCondition, onClick: () => handleNudgeTypeChange(false) }), _jsx(TypeRadio, { "data-name": "nudge-type-condition", text: "Conditional", description: "Apply the nudge only when the row matches a rule", checked: hasCondition, onClick: () => handleNudgeTypeChange(true) })] }) })] }), hasCondition ? (_jsxs(Card, { shadow: false, className: "twa:flex-1 twa:min-h-0", children: [_jsxs(Card.Title, { children: [_jsx(Box, { className: "twa:font-medium", children: "Condition" }), _jsx(Box, { className: "twa:text-xs twa:opacity-70 twa:font-normal twa:max-w-[520px]", children: "Build a rule that determines when the nudge should be applied" })] }), _jsx(Card.Body, { className: "twa:flex-1 twa:min-h-0", children: _jsx(EntityRulesEditor, { module: moduleInfo.ModuleName, flexProps: { style: { minHeight: 0 } }, defaultPredicateId: props.defaultPredicateId, predicateDefs: [], showAggregation: false, showObservable: false, showPredicate: false, data: plusMinusNudge, onChange: (plusMinus) => props.onChange(plusMinus), descriptions: {
56
+ selectPredicate: null,
57
+ useBooleanQuery: (_jsxs(_Fragment, { children: ["Use an BooleanQuery if ", _jsx("i", { children: "Scope" }), " is 'All Columns' - so any data change may be evaluated in a complex BooleanExpression"] })),
58
+ useObservableQuery: null,
59
+ useAggregationQuery: null,
60
+ } }) })] })) : null] }));
31
61
  }
@@ -1,25 +1,18 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import * as React from 'react';
3
3
  import { useOnePageAdaptableWizardContext } from '../../Wizard/OnePageAdaptableWizard';
4
4
  import { NewScopeComponent } from '../../Components/NewScopeComponent';
5
+ import { Box, Flex } from '../../../components/Flex';
5
6
  export const PlusMinusScopeWizardSection = (props) => {
6
7
  const { data, api } = useOnePageAdaptableWizardContext();
7
8
  const availableColumns = React.useMemo(() => api.columnApi.getNumericColumns(), []);
8
- return (_jsx(NewScopeComponent, { availableDataTypes: ['number'], scopeColumns: availableColumns, scope: data.Scope, descriptions: {
9
- rowScope: 'Matching rows will have the plus/minus applied',
10
- columnScope: 'Matching Columns will have the plus/minus applied',
11
- }, updateScope: (Scope) => {
12
- let preparedScope = Scope;
13
- if (Scope && 'DataTypes' in Scope && Scope.DataTypes.length === 0) {
14
- // default to checked
15
- preparedScope = {
16
- ...Scope,
17
- DataTypes: ['number'],
18
- };
19
- }
20
- props.onChange({
21
- ...data,
22
- Scope: preparedScope,
23
- });
24
- } }));
9
+ return (_jsxs(Flex, { flexDirection: "column", className: "twa:h-full", children: [_jsxs(Flex, { flexDirection: "row", alignItems: "center", className: "twa:p-2 twa:gap-3 twa:border-b twa:mb-2 twa:border-b-foreground/20", children: [_jsx(Box, { className: "twa:text-5 twa:font-medium", children: "Target" }), _jsx(Box, { className: "twa:text-xs twa:opacity-70 twa:max-w-[520px]", children: "Specify where the Plus/Minus Nudge should be applied (numeric columns only)" })] }), _jsx(Box, { className: "twa:flex-1 twa:min-h-0 twa:overflow-auto twa:p-2", children: _jsx(NewScopeComponent, { disableDataTypes: true, scopeColumns: availableColumns, scope: data.Scope, descriptions: {
10
+ rowScope: 'Matching rows will have the plus/minus applied',
11
+ columnScope: 'Selected Columns will have the plus/minus applied',
12
+ }, updateScope: (Scope) => {
13
+ props.onChange({
14
+ ...data,
15
+ Scope: Scope,
16
+ });
17
+ } }) })] }));
25
18
  };
@@ -1,14 +1,10 @@
1
1
  import * as React from 'react';
2
2
  import { OnePageAdaptableWizardContextType } from '../../Wizard/OnePageAdaptableWizard';
3
3
  import { AdaptableApi, PlusMinusNudge } from '../../../types';
4
- export declare const PlusMinusSettingsSummary: React.FunctionComponent<{
5
- hasCondition: boolean;
6
- }>;
7
- export declare const isSettingsValid: (hasCondition: boolean) => (data: PlusMinusNudge, api: AdaptableApi, context: OnePageAdaptableWizardContextType<PlusMinusNudge>) => string | true;
4
+ export declare const PlusMinusSettingsSummary: React.FunctionComponent;
5
+ export declare const isSettingsValid: (data: PlusMinusNudge, api: AdaptableApi, _context: OnePageAdaptableWizardContextType<PlusMinusNudge>) => true | "A name is required." | "A Plus/Minus Nudge with this name already exists." | "A nudge value is required." | "Nudge value must not be zero." | "Increment and decrement keys cannot be the same for this nudge.";
8
6
  interface PlusMinusSettingsWizardSectionProps {
9
7
  onChange: (plusMinusNudge: PlusMinusNudge) => void;
10
- hasCondition: boolean;
11
- onConditionChange: (hasCondition: boolean) => void;
12
8
  }
13
9
  export declare const PlusMinusSettingsWizardSection: React.FunctionComponent<PlusMinusSettingsWizardSectionProps>;
14
10
  export {};
@@ -1,24 +1,17 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import * as React from 'react';
3
3
  import Input from '../../../components/Input';
4
- import FormLayout, { FormRow } from '../../../components/FormLayout';
5
- import { Tabs } from '../../../components/Tabs';
6
4
  import { SummaryText, useOnePageAdaptableWizardContext, } from '../../Wizard/OnePageAdaptableWizard';
7
- import { PlusMinusRuleSummary, PlusMinusRuleWizardSection } from './PlusMinusRuleWizardSection';
8
- import { isAdaptableRuleValid } from '../../Components/EntityRulesEditor/Utilities';
9
5
  import { Tag } from '../../../components/Tag';
10
- import { Flex } from '../../../components/Flex';
6
+ import { Box, Flex } from '../../../components/Flex';
7
+ import { Card } from '../../../components/Card';
11
8
  import { plusMinusDecrementKeyFromOptionsOnly, plusMinusIncrementKeyFromOptionsOnly, plusMinusResolvedKeysConflict, plusMinusTriggerSameAsBaseline, resolvePlusMinusTriggerKeysForNudge, } from '../../../Utilities/Helpers/plusMinusTriggerKeys';
12
- const plusMinusSettingsFormColumns = [
13
- { name: 'label', style: { textAlign: 'start' } },
14
- { name: 'children' },
15
- ];
16
- export const PlusMinusSettingsSummary = (props) => {
9
+ export const PlusMinusSettingsSummary = () => {
17
10
  const { data, api } = useOnePageAdaptableWizardContext();
18
11
  const { incrementKey, decrementKey } = resolvePlusMinusTriggerKeysForNudge(data, api.optionsApi.getEditOptions().plusMinusOptions ?? {});
19
- return (_jsxs(_Fragment, { children: [_jsxs(SummaryText, { children: ["Name ", _jsx(Tag, { children: data.Name || 'Not specified' })] }), _jsxs(SummaryText, { children: ["Nudge Value ", _jsx(Tag, { children: data.NudgeValue ?? 'Not selected' })] }), _jsxs(SummaryText, { children: ["Keys ", _jsx(Tag, { children: incrementKey }), " / ", _jsx(Tag, { children: decrementKey })] }), _jsxs(SummaryText, { children: ["Nudge Type ", _jsx(Tag, { children: props.hasCondition ? 'Conditional' : 'Always Apply' })] }), props.hasCondition && _jsx(PlusMinusRuleSummary, {})] }));
12
+ return (_jsxs(_Fragment, { children: [_jsxs(SummaryText, { children: ["Name ", _jsx(Tag, { children: data.Name || 'Not specified' })] }), _jsxs(SummaryText, { children: ["Nudge Value ", _jsx(Tag, { children: data.NudgeValue ?? 'Not selected' })] }), _jsxs(SummaryText, { children: ["Keys ", _jsx(Tag, { children: incrementKey }), " / ", _jsx(Tag, { children: decrementKey })] })] }));
20
13
  };
21
- export const isSettingsValid = (hasCondition) => (data, api, context) => {
14
+ export const isSettingsValid = (data, api, _context) => {
22
15
  if (!data.Name?.trim()) {
23
16
  return 'A name is required.';
24
17
  }
@@ -27,15 +20,6 @@ export const isSettingsValid = (hasCondition) => (data, api, context) => {
27
20
  if (isDuplicateName) {
28
21
  return 'A Plus/Minus Nudge with this name already exists.';
29
22
  }
30
- if (hasCondition) {
31
- if (!data?.Rule?.BooleanExpression) {
32
- return 'A valid rule is required.';
33
- }
34
- const ruleValidation = isAdaptableRuleValid(data, api, context);
35
- if (typeof ruleValidation === 'string') {
36
- return ruleValidation;
37
- }
38
- }
39
23
  if (typeof data.NudgeValue !== 'number') {
40
24
  return 'A nudge value is required.';
41
25
  }
@@ -125,5 +109,5 @@ export const PlusMinusSettingsWizardSection = (props) => {
125
109
  commitDecrementKey(event.target.value);
126
110
  setDecrementEdit(undefined);
127
111
  };
128
- return (_jsxs(Flex, { flexDirection: "column", "data-name": "plus-minus-column-settings", className: "twa:h-full", children: [_jsxs(Tabs, { className: "twa:p-2", children: [_jsx(Tabs.Tab, { children: "Settings" }), _jsx(Tabs.Content, { children: _jsxs(FormLayout, { columns: plusMinusSettingsFormColumns, sizes: ['minmax(140px, max-content)', '1fr'], children: [_jsx(FormRow, { label: "Name", children: _jsx(Input, { "data-name": "plus-minus-name", className: "twa:mr-3 twa:max-w-md twa:w-full", onChange: handleNameChange, placeholder: "Enter Name", value: data.Name ?? '' }) }), _jsx(FormRow, { label: "Nudge Value", children: _jsx(Input, { "data-name": "nudge-value", className: "twa:mr-3 twa:max-w-md twa:w-full", onChange: handleNudgeValueChange, placeholder: "Enter Number", type: "number", value: data.NudgeValue ?? '' }) }), _jsx(FormRow, { label: "Increment key", children: _jsx(Input, { "data-name": "plus-minus-increment-key", className: "twa:mr-3 twa:max-w-md twa:w-full", onBlur: handleIncrementKeyBlur, onChange: handleIncrementKeyChange, onFocus: handleIncrementKeyFocus, value: incrementDisplayValue }) }), _jsx(FormRow, { label: "Decrement key", children: _jsx(Input, { "data-name": "plus-minus-decrement-key", className: "twa:mr-3 twa:max-w-md twa:w-full", onBlur: handleDecrementKeyBlur, onChange: handleDecrementKeyChange, onFocus: handleDecrementKeyFocus, value: decrementDisplayValue }) })] }) })] }), _jsxs(Tabs, { className: "twa:p-2", selectedIndex: props.hasCondition ? 1 : 0, onSelectedIndexChange: (index) => props.onConditionChange(index === 1), children: [_jsx(Tabs.Tab, { "data-name": "nudge-type-always", children: "Always Apply" }), _jsx(Tabs.Tab, { "data-name": "nudge-type-condition", children: "Conditional" }), _jsx(Tabs.Content, { children: _jsx(Flex, { className: "twa:text-2 twa:py-2", children: "The nudge value is always applied when using Plus/Minus" }) }), _jsx(Tabs.Content, { className: "twa:p-0", children: _jsx(PlusMinusRuleWizardSection, { defaultPredicateId: "NonBlanks", onChange: props.onChange }) })] })] }));
112
+ return (_jsx(Box, { "data-name": "plus-minus-column-settings", children: _jsxs(Flex, { flexDirection: "column", className: "twa:gap-3 twa:p-3", children: [_jsxs(Card, { shadow: false, children: [_jsxs(Card.Title, { children: [_jsx(Box, { className: "twa:font-medium", children: "Name" }), _jsx(Box, { className: "twa:text-xs twa:opacity-70 twa:font-normal twa:max-w-[520px]", children: "Provide a unique name for the Plus/Minus Nudge" })] }), _jsx(Card.Body, { className: "twa:p-1", children: _jsx(Input, { "data-name": "plus-minus-name", className: "twa:max-w-[300px] twa:w-full", onChange: handleNameChange, placeholder: "Enter Name", value: data.Name ?? '' }) })] }), _jsxs(Card, { shadow: false, children: [_jsxs(Card.Title, { children: [_jsx(Box, { className: "twa:font-medium", children: "Nudge Value" }), _jsx(Box, { className: "twa:text-xs twa:opacity-70 twa:font-normal twa:max-w-[520px]", children: "Amount added to or subtracted from the cell value when Plus/Minus is used" })] }), _jsx(Card.Body, { className: "twa:p-1", children: _jsx(Input, { "data-name": "nudge-value", className: "twa:max-w-[300px] twa:w-full", onChange: handleNudgeValueChange, placeholder: "Enter Number", type: "number", value: data.NudgeValue ?? '' }) })] }), _jsxs(Card, { shadow: false, children: [_jsxs(Card.Title, { children: [_jsx(Box, { className: "twa:font-medium", children: "Trigger Keys" }), _jsx(Box, { className: "twa:text-xs twa:opacity-70 twa:font-normal twa:max-w-[520px]", children: "Keyboard keys that trigger increment and decrement" })] }), _jsx(Card.Body, { className: "twa:p-1", children: _jsxs(Flex, { flexDirection: "column", className: "twa:gap-3", children: [_jsxs(Box, { children: [_jsx(Box, { className: "twa:text-2 twa:mb-1 twa:opacity-80", children: "Increment key" }), _jsx(Input, { "data-name": "plus-minus-increment-key", className: "twa:max-w-[300px] twa:w-full", onBlur: handleIncrementKeyBlur, onChange: handleIncrementKeyChange, onFocus: handleIncrementKeyFocus, value: incrementDisplayValue })] }), _jsxs(Box, { children: [_jsx(Box, { className: "twa:text-2 twa:mb-1 twa:opacity-80", children: "Decrement key" }), _jsx(Input, { "data-name": "plus-minus-decrement-key", className: "twa:max-w-[300px] twa:w-full", onBlur: handleDecrementKeyBlur, onChange: handleDecrementKeyChange, onFocus: handleDecrementKeyFocus, value: decrementDisplayValue })] })] }) })] })] }) }));
129
113
  };
@@ -4,6 +4,7 @@ import { OnePageAdaptableWizard, OnePageWizardSummary, } from '../../../View/Wiz
4
4
  import { renderScopeSummary, isScopeValid } from '../../Components/NewScopeComponent';
5
5
  import { PlusMinusScopeWizardSection } from './PlusMinusScopeWizardSection';
6
6
  import { PlusMinusSettingsWizardSection, PlusMinusSettingsSummary, isSettingsValid, } from './PlusMinusSettingsWizardSection';
7
+ import { PlusMinusRuleWizardSection, PlusMinusRuleStepSummary, isRuleValid, } from './PlusMinusRuleWizardSection';
7
8
  import ObjectFactory from '../../../Utilities/ObjectFactory';
8
9
  import { useDispatch } from 'react-redux';
9
10
  import * as PlusMinusRedux from '../../../Redux/ActionsReducers/PlusMinusRedux';
@@ -26,22 +27,6 @@ export const PlusMinusWizard = (props) => {
26
27
  const setPlusMinus = React.useCallback((data) => {
27
28
  doSetPlusMinus(data);
28
29
  }, []);
29
- const [hasCondition, setHasCondition] = React.useState(() => {
30
- // true if on edit and it has a condition
31
- return Boolean(props?.data?.Rule);
32
- });
33
- React.useEffect(() => {
34
- doSetPlusMinus((prev) => {
35
- const preparedData = { ...prev };
36
- if (hasCondition) {
37
- preparedData.Rule = preparedData.Rule ?? { BooleanExpression: '' };
38
- }
39
- else {
40
- delete preparedData.Rule;
41
- }
42
- return preparedData;
43
- });
44
- }, [hasCondition]);
45
30
  const dispatch = useDispatch();
46
31
  const handleFinish = () => {
47
32
  if (props.data) {
@@ -55,9 +40,17 @@ export const PlusMinusWizard = (props) => {
55
40
  return (_jsx(OnePageAdaptableWizard, { defaultCurrentSectionName: props.defaultCurrentSectionName, moduleInfo: props.moduleInfo, data: plusMinus, onHide: props.onCloseWizard, onFinish: handleFinish, sections: [
56
41
  {
57
42
  title: 'Settings',
58
- isValid: isSettingsValid(hasCondition),
59
- renderSummary: () => _jsx(PlusMinusSettingsSummary, { hasCondition: hasCondition }),
60
- render: () => (_jsx(PlusMinusSettingsWizardSection, { hasCondition: hasCondition, onConditionChange: setHasCondition, onChange: setPlusMinus })),
43
+ details: 'Provide details of the Plus/Minus Nudge',
44
+ isValid: isSettingsValid,
45
+ renderSummary: () => _jsx(PlusMinusSettingsSummary, {}),
46
+ render: () => _jsx(PlusMinusSettingsWizardSection, { onChange: setPlusMinus }),
47
+ },
48
+ {
49
+ title: 'Rule',
50
+ details: 'Choose when the nudge should be applied',
51
+ isValid: isRuleValid,
52
+ renderSummary: () => _jsx(PlusMinusRuleStepSummary, {}),
53
+ render: () => (_jsx(PlusMinusRuleWizardSection, { defaultPredicateId: "NonBlanks", onChange: setPlusMinus })),
61
54
  },
62
55
  {
63
56
  title: 'Target',
@@ -66,9 +59,9 @@ export const PlusMinusWizard = (props) => {
66
59
  renderSummary: () => renderScopeSummary(plusMinus.Scope, {
67
60
  scopeWholeRow: 'Plus/Minus is applied for matching rows',
68
61
  scopeColumns: 'Plus/Minus is applied in cells in selected columns',
69
- scopeDataTypes: 'Plus/Minus is applied for cells with selected data type',
62
+ scopeDataTypes: '',
70
63
  }),
71
- render: () => (_jsx(Box, { className: "twa:p-2", children: _jsx(PlusMinusScopeWizardSection, { onChange: setPlusMinus }) })),
64
+ render: () => _jsx(PlusMinusScopeWizardSection, { onChange: setPlusMinus }),
72
65
  },
73
66
  {
74
67
  details: 'Select Plus/Minus Tags',
@@ -79,6 +72,7 @@ export const PlusMinusWizard = (props) => {
79
72
  },
80
73
  '-',
81
74
  {
75
+ details: 'Review the Plus/Minus Nudge',
82
76
  render: () => {
83
77
  return (_jsx(Box, { className: "twa:p-2", children: _jsx(OnePageWizardSummary, {}) }));
84
78
  },