@adaptabletools/adaptable-cjs 23.0.0-canary.7 → 23.0.0-canary.8

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 (90) hide show
  1. package/index.css +75 -9
  2. package/package.json +1 -1
  3. package/src/AdaptableState/StyledColumnState.d.ts +8 -850
  4. package/src/AdaptableState/StyledColumnState.js +0 -10
  5. package/src/AdaptableState/StyledColumns/BadgeStyle.d.ts +143 -0
  6. package/src/AdaptableState/StyledColumns/BadgeStyle.js +12 -0
  7. package/src/AdaptableState/StyledColumns/BulletChartStyle.d.ts +147 -0
  8. package/src/AdaptableState/StyledColumns/BulletChartStyle.js +2 -0
  9. package/src/AdaptableState/StyledColumns/Common/BarChartCellText.d.ts +60 -0
  10. package/src/AdaptableState/StyledColumns/Common/BarChartCellText.js +7 -0
  11. package/src/AdaptableState/StyledColumns/Common/BarChartMarker.d.ts +24 -0
  12. package/src/AdaptableState/StyledColumns/Common/BarChartMarker.js +6 -0
  13. package/src/AdaptableState/StyledColumns/Common/CellTextOptions.d.ts +13 -0
  14. package/src/AdaptableState/StyledColumns/Common/CellTextOptions.js +7 -0
  15. package/src/AdaptableState/StyledColumns/Common/NumericStyledColumn.d.ts +79 -0
  16. package/src/AdaptableState/StyledColumns/Common/NumericStyledColumn.js +10 -0
  17. package/src/AdaptableState/StyledColumns/GradientStyle.d.ts +48 -0
  18. package/src/AdaptableState/StyledColumns/GradientStyle.js +2 -0
  19. package/src/AdaptableState/StyledColumns/IconStyle.d.ts +158 -0
  20. package/src/AdaptableState/StyledColumns/IconStyle.js +2 -0
  21. package/src/AdaptableState/StyledColumns/PercentBarStyle.d.ts +32 -0
  22. package/src/AdaptableState/StyledColumns/PercentBarStyle.js +2 -0
  23. package/src/AdaptableState/StyledColumns/RangeBarStyle.d.ts +155 -0
  24. package/src/AdaptableState/StyledColumns/RangeBarStyle.js +2 -0
  25. package/src/AdaptableState/StyledColumns/RatingStyle.d.ts +111 -0
  26. package/src/AdaptableState/StyledColumns/RatingStyle.js +2 -0
  27. package/src/AdaptableState/StyledColumns/SparklineStyle.d.ts +21 -0
  28. package/src/AdaptableState/StyledColumns/SparklineStyle.js +2 -0
  29. package/src/Api/ColumnScopeApi.d.ts +1 -1
  30. package/src/Api/Implementation/ColumnScopeApiImpl.d.ts +1 -1
  31. package/src/Api/Internal/StyledColumnInternalApi.d.ts +3 -1
  32. package/src/Utilities/Helpers/IconStylePresets.d.ts +1 -1
  33. package/src/Utilities/Helpers/StyledColumnGradientHelper.d.ts +3 -1
  34. package/src/Utilities/Helpers/barChartCellText.d.ts +63 -0
  35. package/src/Utilities/Helpers/barChartCellText.js +333 -0
  36. package/src/Utilities/Helpers/percentBarPreviewHelper.d.ts +2 -1
  37. package/src/Utilities/Helpers/percentBarPreviewHelper.js +3 -8
  38. package/src/View/Alert/Wizard/AlertButtonsEditor.js +158 -125
  39. package/src/View/Alert/Wizard/AlertNotificationWizardSection.js +1 -1
  40. package/src/View/Alert/Wizard/AlertWizard.js +9 -1
  41. package/src/View/Components/AdaptableObjectList/AdaptableObjectCompactList.js +3 -2
  42. package/src/View/Components/AdaptableObjectList/AdaptableObjectList.js +3 -2
  43. package/src/View/Components/AdaptableObjectList/objectListActionButtonStyles.d.ts +2 -0
  44. package/src/View/Components/AdaptableObjectList/objectListActionButtonStyles.js +6 -0
  45. package/src/View/Components/Buttons/EntityListActionButtons.js +1 -1
  46. package/src/View/Components/Buttons/SuspendToggleButton/SuspendToggleButton.d.ts +1 -0
  47. package/src/View/Components/Buttons/SuspendToggleButton/SuspendToggleButton.js +8 -8
  48. package/src/View/Components/ColumnFilter/ColumnFilter.js +14 -1
  49. package/src/View/Components/Popups/AdaptablePopup/AdaptablePopupModuleView.js +1 -1
  50. package/src/View/Components/RangesComponent.d.ts +2 -1
  51. package/src/View/Export/ExportSchedulesTab.js +3 -4
  52. package/src/View/Filter/FilterViewPanel.js +1 -1
  53. package/src/View/Layout/Wizard/sections/RowSummarySection.js +128 -102
  54. package/src/View/StyledColumn/Wizard/BadgePillStyleEditor.d.ts +1 -1
  55. package/src/View/StyledColumn/Wizard/StyledColumnBadgeSection.js +36 -30
  56. package/src/View/StyledColumn/Wizard/StyledColumnSliceStyleEditors.d.ts +1 -3
  57. package/src/View/StyledColumn/Wizard/StyledColumnWizardBulletSection.js +73 -58
  58. package/src/View/StyledColumn/Wizard/StyledColumnWizardIconSection.js +38 -11
  59. package/src/View/StyledColumn/Wizard/StyledColumnWizardRangeBarSection.js +86 -44
  60. package/src/View/StyledColumn/Wizard/StyledColumnWizardStyleSection/Components/BarChartCellTextLayoutEditor.d.ts +9 -0
  61. package/src/View/StyledColumn/Wizard/StyledColumnWizardStyleSection/Components/BarChartCellTextLayoutEditor.js +40 -0
  62. package/src/View/StyledColumn/Wizard/StyledColumnWizardStyleSection/Components/BarChartCellTextPreview.d.ts +23 -0
  63. package/src/View/StyledColumn/Wizard/StyledColumnWizardStyleSection/Components/BarChartCellTextPreview.js +62 -0
  64. package/src/View/StyledColumn/Wizard/StyledColumnWizardStyleSection/Components/BulletRangesSummaryPreview.d.ts +1 -1
  65. package/src/View/StyledColumn/Wizard/StyledColumnWizardStyleSection/Components/GradientSummaryPreview.d.ts +2 -1
  66. package/src/View/StyledColumn/Wizard/StyledColumnWizardStyleSection/Components/RangeBarRangesSummaryPreview.d.ts +1 -1
  67. package/src/View/StyledColumn/Wizard/StyledColumnWizardStyleSection/Components/StyledColumnBadgePreview.js +3 -2
  68. package/src/View/StyledColumn/Wizard/StyledColumnWizardStyleSection/Components/StyledColumnBulletPreview.d.ts +2 -1
  69. package/src/View/StyledColumn/Wizard/StyledColumnWizardStyleSection/Components/StyledColumnBulletPreview.js +13 -17
  70. package/src/View/StyledColumn/Wizard/StyledColumnWizardStyleSection/Components/StyledColumnChartListPreviews.d.ts +2 -1
  71. package/src/View/StyledColumn/Wizard/StyledColumnWizardStyleSection/Components/StyledColumnChartListPreviews.js +5 -5
  72. package/src/View/StyledColumn/Wizard/StyledColumnWizardStyleSection/Components/StyledColumnIconPreview.js +2 -2
  73. package/src/View/StyledColumn/Wizard/StyledColumnWizardStyleSection/Components/StyledColumnPercentBarPreview.js +13 -6
  74. package/src/View/StyledColumn/Wizard/StyledColumnWizardStyleSection/Components/StyledColumnRangeBarPreview.js +11 -17
  75. package/src/View/StyledColumn/Wizard/StyledColumnWizardStyleSection/Components/StyledColumnRatingPreview.d.ts +2 -1
  76. package/src/View/StyledColumn/Wizard/StyledColumnWizardStyleSection/StyledColumnWizardStyleSection.js +18 -54
  77. package/src/agGrid/AgGridColumnAdapter.js +2 -1
  78. package/src/agGrid/cellRenderers/BadgeRenderer.js +7 -5
  79. package/src/agGrid/cellRenderers/BulletChartRenderer.js +43 -42
  80. package/src/agGrid/cellRenderers/IconRenderer.d.ts +2 -1
  81. package/src/agGrid/cellRenderers/IconRenderer.js +13 -11
  82. package/src/agGrid/cellRenderers/PercentBarRenderer.js +24 -96
  83. package/src/agGrid/cellRenderers/RangeBarRenderer.js +49 -46
  84. package/src/env.js +2 -2
  85. package/src/metamodel/adaptable.metamodel.d.ts +80 -14
  86. package/src/metamodel/adaptable.metamodel.js +1 -1
  87. package/src/migration/VersionUpgrade23.d.ts +27 -31
  88. package/src/migration/VersionUpgrade23.js +110 -29
  89. package/src/types.d.ts +12 -1
  90. package/tsconfig.cjs.tsbuildinfo +1 -1
@@ -13,7 +13,6 @@ const RangesComponent_1 = require("../../Components/RangesComponent");
13
13
  const ColumnSelector_1 = require("../../Components/Selectors/ColumnSelector");
14
14
  const UIHelper_1 = require("../../UIHelper");
15
15
  const OnePageAdaptableWizard_1 = require("../../Wizard/OnePageAdaptableWizard");
16
- const ArrayExtensions_1 = tslib_1.__importDefault(require("../../../Utilities/Extensions/ArrayExtensions"));
17
16
  const AdaptableInput_1 = tslib_1.__importDefault(require("../../Components/AdaptableInput"));
18
17
  const Flex_1 = require("../../../components/Flex");
19
18
  const BulletRangesSummaryPreview_1 = require("./StyledColumnWizardStyleSection/Components/BulletRangesSummaryPreview");
@@ -22,10 +21,9 @@ const NewSelect_1 = require("../../../components/NewSelect");
22
21
  const StyledColumnSliceStyleEditors_1 = require("./StyledColumnSliceStyleEditors");
23
22
  const Card_1 = require("../../../components/Card");
24
23
  const SummaryColorTag_1 = require("../../Wizard/SummaryColorTag");
24
+ const barChartCellText_1 = require("../../../Utilities/Helpers/barChartCellText");
25
+ const BarChartCellTextLayoutEditor_1 = require("./StyledColumnWizardStyleSection/Components/BarChartCellTextLayoutEditor");
25
26
  const BULLET_STYLE_FORM_SIZES = ['200px', '1fr'];
26
- // ---------------------------------------------------------------------------
27
- // Summary helpers
28
- // ---------------------------------------------------------------------------
29
27
  const getTargetSummary = (target) => {
30
28
  if (target == undefined) {
31
29
  return null;
@@ -78,11 +76,12 @@ const getStyledColumnBulletRangesViewValues = (data) => {
78
76
  exports.getStyledColumnBulletRangesViewValues = getStyledColumnBulletRangesViewValues;
79
77
  const buildStyledColumnBulletStyleSummaryStrings = (bullet, options) => {
80
78
  const items = [];
81
- const targetSummary = getTargetSummary(bullet.Target);
79
+ const targetProperties = bullet.TargetProperties;
80
+ const targetSummary = getTargetSummary(targetProperties?.Target);
82
81
  if (targetSummary) {
83
82
  items.push(`Target: ${targetSummary}`);
84
83
  }
85
- const marker = bullet.TargetMarker;
84
+ const marker = targetProperties?.Marker;
86
85
  if (marker?.Shape && marker.Shape !== 'Line') {
87
86
  items.push(`Target Marker Shape: ${marker.Shape}`);
88
87
  }
@@ -95,19 +94,24 @@ const buildStyledColumnBulletStyleSummaryStrings = (bullet, options) => {
95
94
  if (bullet.Orientation === 'Vertical') {
96
95
  items.push('Orientation: Vertical');
97
96
  }
98
- if (bullet.BarColor) {
99
- items.push(`Bar Colour: ${bullet.BarColor}`);
97
+ const barProperties = bullet.Bar;
98
+ if (barProperties?.Color) {
99
+ items.push(`Bar Colour: ${barProperties.Color}`);
100
100
  }
101
- if (bullet.BarHeight != null) {
102
- items.push(`${bullet.Orientation === 'Vertical' ? 'Bar Width' : 'Bar Height'}: ${bullet.BarHeight}px`);
101
+ if (barProperties?.Height != null) {
102
+ items.push(`${bullet.Orientation === 'Vertical' ? 'Bar Width' : 'Bar Height'}: ${barProperties.Height}px`);
103
103
  }
104
104
  items.push(`Origin: ${formatBulletOriginLabel(bullet.Origin)}`);
105
105
  if (bullet.BackColor) {
106
106
  items.push(`Back Colour: ${bullet.BackColor}`);
107
107
  }
108
- if (bullet.CellText?.length) {
109
- items.push(`Cell Text: ${formatBulletCellTextSummary(bullet.CellText)}`);
110
- items.push(`Cell Text Position: ${bullet.CellTextPosition ?? 'Below'}`);
108
+ if ((0, barChartCellText_1.hasBarChartCellTextConfigured)(bullet.CellTextProperties)) {
109
+ const tokens = (0, barChartCellText_1.getActiveBarChartCellTextTokens)(bullet.CellTextProperties);
110
+ items.push(`Cell Text: ${formatBulletCellTextSummary(tokens)}`);
111
+ const layoutSummary = (0, barChartCellText_1.formatBarChartCellTextLayoutSummary)((0, barChartCellText_1.resolveBarChartCellTextLayout)(bullet.CellTextProperties));
112
+ if (layoutSummary) {
113
+ items.push(`Placement: ${layoutSummary}`);
114
+ }
111
115
  }
112
116
  else if (options.includeEmptyCellText) {
113
117
  items.push('Cell Text: None');
@@ -270,20 +274,28 @@ const StyledColumnWizardBulletSection = (props) => {
270
274
  });
271
275
  }, [data, bullet]);
272
276
  // -- Target ----------------------------------------------------------------
273
- const currentMode = getSimpleTargetMode(bullet.Target);
277
+ const currentMode = getSimpleTargetMode(bullet.TargetProperties?.Target);
278
+ const updateTargetProperties = (patch) => {
279
+ const merged = {
280
+ ...bullet.TargetProperties,
281
+ ...patch,
282
+ };
283
+ // Strip the wrapper when nothing meaningful is left.
284
+ const isEmpty = merged.Target == undefined && merged.Marker == undefined;
285
+ update({ TargetProperties: isEmpty ? undefined : merged });
286
+ };
287
+ const setTarget = (target) => updateTargetProperties({ Target: target });
274
288
  const handleTargetModeChange = (mode) => {
275
289
  if (mode === 'None') {
276
- const next = { ...bullet };
277
- delete next.Target;
278
- props.onChange({ ...data, BulletChartStyle: next });
290
+ setTarget(undefined);
279
291
  return;
280
292
  }
281
293
  if (mode === 'Col-Avg' || mode === 'Col-Median') {
282
- update({ Target: mode });
294
+ setTarget(mode);
283
295
  return;
284
296
  }
285
297
  if (mode === 'Number') {
286
- update({ Target: minMaxRangeValues?.max ?? 0 });
298
+ setTarget(minMaxRangeValues?.max ?? 0);
287
299
  return;
288
300
  }
289
301
  if (mode === 'Column') {
@@ -291,38 +303,43 @@ const StyledColumnWizardBulletSection = (props) => {
291
303
  const candidate = api.columnApi
292
304
  .getNumericColumns()
293
305
  .find((c) => c.columnId !== data.ColumnId);
294
- update({ Target: candidate?.columnId ?? '' });
306
+ setTarget(candidate?.columnId ?? '');
295
307
  return;
296
308
  }
297
309
  };
298
310
  const handleNumericTargetChange = (value) => {
299
- if (value == undefined || isNaN(value)) {
300
- update({ Target: 0 });
301
- }
302
- else {
303
- update({ Target: value });
304
- }
311
+ setTarget(value == undefined || isNaN(value) ? 0 : value);
305
312
  };
306
313
  const handleColumnTargetChange = (columnId) => {
307
- update({ Target: columnId });
314
+ setTarget(columnId);
315
+ };
316
+ // -- Bar -------------------------------------------------------------------
317
+ const updateBar = (patch) => {
318
+ const merged = {
319
+ ...bullet.Bar,
320
+ ...patch,
321
+ };
322
+ const isEmpty = merged.Color == undefined && merged.Height == undefined;
323
+ update({ Bar: isEmpty ? undefined : merged });
308
324
  };
309
325
  // -- Marker ----------------------------------------------------------------
310
326
  const updateMarker = (patch) => {
311
- update({
312
- TargetMarker: {
327
+ updateTargetProperties({
328
+ Marker: {
313
329
  Shape: 'Line',
314
- ...bullet.TargetMarker,
330
+ ...bullet.TargetProperties?.Marker,
315
331
  ...patch,
316
332
  },
317
333
  });
318
334
  };
319
335
  // -- Cell text -------------------------------------------------------------
320
- const toggleCellText = (token, checked) => {
321
- const current = bullet.CellText ?? [];
322
- const next = checked
323
- ? Array.from(new Set([...current, token]))
324
- : current.filter((t) => t !== token);
325
- update({ CellText: next });
336
+ const toggleCellText = (token, show) => {
337
+ update((0, barChartCellText_1.toggleBarChartCellTextToken)(bullet.CellTextProperties, token, show));
338
+ };
339
+ const onCellTextPlacementChange = (token, patch) => {
340
+ update({
341
+ CellTextProperties: (0, barChartCellText_1.patchBarChartCellTextPlacement)(bullet.CellTextProperties, token, patch),
342
+ });
326
343
  };
327
344
  const toggleToolTipText = (token, checked) => {
328
345
  const current = bullet.ToolTipText ?? [];
@@ -331,9 +348,6 @@ const StyledColumnWizardBulletSection = (props) => {
331
348
  : current.filter((t) => t !== token);
332
349
  update({ ToolTipText: next });
333
350
  };
334
- const handleCellTextPositionChange = (pos) => {
335
- update({ CellTextPosition: pos });
336
- };
337
351
  // -------------------------------------------------------------------------
338
352
  // Render
339
353
  // -------------------------------------------------------------------------
@@ -346,22 +360,27 @@ const StyledColumnWizardBulletSection = (props) => {
346
360
  if (variant === 'ranges') {
347
361
  return ((0, jsx_runtime_1.jsx)(Flex_1.Box, { children: (0, jsx_runtime_1.jsxs)(Card_1.Card, { shadow: false, children: [(0, jsx_runtime_1.jsxs)(Card_1.Card.Title, { children: [(0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:font-medium", children: "Ranges" }), (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:text-xs twa:opacity-70 twa:font-normal twa:max-w-[520px]", children: "Define qualitative bands for the bullet scale" })] }), (0, jsx_runtime_1.jsx)(Card_1.Card.Body, { children: (0, jsx_runtime_1.jsx)(RangesComponent_1.RangesComponent, { disabled: disabled, minMaxRangeValues: minMaxRangeValues, api: api, scope: scope, ranges: bullet.CellRanges, rangeValueType: bullet.RangeValueType, onRangeValueTypeChange: onRangeValueTypeChange, columnComparison: bullet.ColumnComparison, updateRanges: onUpdateRanges, updateColumnComparison: onUpdateColumnComparison, hideColumnComparison: true }) })] }) }));
348
362
  }
349
- const numericTargetValue = typeof bullet.Target === 'number'
350
- ? bullet.Target
351
- : typeof bullet.Target?.Value === 'number'
352
- ? bullet.Target.Value
363
+ const primaryTarget = Array.isArray(bullet.TargetProperties?.Target)
364
+ ? bullet.TargetProperties?.Target?.[0]
365
+ : bullet.TargetProperties?.Target;
366
+ const numericTargetValue = typeof primaryTarget === 'number'
367
+ ? primaryTarget
368
+ : typeof primaryTarget?.Value === 'number'
369
+ ? primaryTarget.Value
353
370
  : undefined;
354
- const columnTargetValue = typeof bullet.Target === 'string' && bullet.Target !== 'Col-Avg' && bullet.Target !== 'Col-Median'
355
- ? bullet.Target
356
- : typeof bullet.Target?.Value === 'string'
357
- ? bullet.Target.Value
371
+ const columnTargetValue = typeof primaryTarget === 'string' && primaryTarget !== 'Col-Avg' && primaryTarget !== 'Col-Median'
372
+ ? primaryTarget
373
+ : typeof primaryTarget?.Value === 'string'
374
+ ? primaryTarget.Value
358
375
  : undefined;
376
+ const markerCfg = bullet.TargetProperties?.Marker;
359
377
  const marker = {
360
- Shape: bullet.TargetMarker?.Shape ?? 'Line',
361
- Color: bullet.TargetMarker?.Color ?? '',
362
- Size: bullet.TargetMarker?.Size ?? (bullet.TargetMarker?.Shape === 'Line' ? 2 : 8),
378
+ Shape: markerCfg?.Shape ?? 'Line',
379
+ Color: markerCfg?.Color ?? '',
380
+ Size: markerCfg?.Size ?? (markerCfg?.Shape === 'Line' ? 2 : 8),
363
381
  };
364
- const cellTextDisabled = ArrayExtensions_1.default.IsNullOrEmpty(bullet.CellText) || disabled;
382
+ const cellTextProperties = bullet.CellTextProperties;
383
+ const cellTextDisabled = !(0, barChartCellText_1.hasBarChartCellTextConfigured)(cellTextProperties) || disabled;
365
384
  return ((0, jsx_runtime_1.jsxs)(Flex_1.Box, { children: [(0, jsx_runtime_1.jsxs)(Card_1.Card, { shadow: false, className: "twa:mb-3", children: [(0, jsx_runtime_1.jsxs)(Card_1.Card.Title, { children: [(0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:font-medium", children: "Target" }), (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:text-xs twa:opacity-70 twa:font-normal twa:max-w-[520px]", children: "Select a target value for the bullet scale" })] }), (0, jsx_runtime_1.jsx)(Card_1.Card.Body, { children: (0, jsx_runtime_1.jsxs)(FormLayout_1.default, { sizes: [...BULLET_STYLE_FORM_SIZES], children: [(0, jsx_runtime_1.jsx)(FormLayout_1.FormRow, { label: "Target:", children: (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:max-w-[180px]", children: (0, jsx_runtime_1.jsx)(NewSelect_1.SingleSelect, { className: "twa:w-full", value: currentMode, onValueChange: (v) => handleTargetModeChange(v), items: [
366
385
  { value: 'None', label: 'None' },
367
386
  { value: 'Number', label: 'Fixed Number' },
@@ -371,8 +390,8 @@ const StyledColumnWizardBulletSection = (props) => {
371
390
  ] }) }) }), currentMode === 'Number' && ((0, jsx_runtime_1.jsx)(FormLayout_1.FormRow, { label: "Target Value:", children: (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:max-w-[160px]", children: (0, jsx_runtime_1.jsx)(AdaptableInput_1.default, { type: "number", value: numericTargetValue ?? '', onChange: (e) => handleNumericTargetChange(e.target.value === '' ? undefined : Number(e.target.value)) }) }) })), currentMode === 'Column' && ((0, jsx_runtime_1.jsx)(FormLayout_1.FormRow, { label: "Target Column:", children: (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:max-w-[220px]", children: (0, jsx_runtime_1.jsx)(ColumnSelector_1.ColumnSelector, { type: "number", value: columnTargetValue ?? '', onChange: handleColumnTargetChange, filterColumn: (c) => c.columnId !== data.ColumnId, placeholder: "Select numeric column" }) }) })), currentMode !== 'None' && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(FormLayout_1.FormRow, { label: "Marker Shape:", children: (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:max-w-[160px]", children: (0, jsx_runtime_1.jsx)(NewSelect_1.SingleSelect, { className: "twa:w-full", value: marker.Shape, onValueChange: (s) => updateMarker({ Shape: s }), items: MARKER_SHAPES.map((s) => ({ value: s.value, label: s.label })) }) }) }), (0, jsx_runtime_1.jsx)(FormLayout_1.FormRow, { label: "Marker Colour:", children: (0, jsx_runtime_1.jsx)(ColorPicker_1.ColorPicker, { disabled: disabled, api: api, value: marker.Color || undefined, onChange: (c) => updateMarker({ Color: c }) }) }), (0, jsx_runtime_1.jsx)(FormLayout_1.FormRow, { label: "Marker Size:", children: (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:max-w-[100px]", children: (0, jsx_runtime_1.jsx)(AdaptableInput_1.default, { type: "number", min: 1, value: marker.Size, onChange: (e) => updateMarker({ Size: Number(e.target.value) }) }) }) })] }))] }) })] }), (0, jsx_runtime_1.jsxs)(Card_1.Card, { shadow: false, className: "twa:mb-3", children: [(0, jsx_runtime_1.jsxs)(Card_1.Card.Title, { children: [(0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:font-medium", children: "Bar" }), (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:text-xs twa:opacity-70 twa:font-normal twa:max-w-[520px]", children: "Set the bar orientation and height" })] }), (0, jsx_runtime_1.jsx)(Card_1.Card.Body, { children: (0, jsx_runtime_1.jsxs)(FormLayout_1.default, { sizes: [...BULLET_STYLE_FORM_SIZES], children: [(0, jsx_runtime_1.jsx)(FormLayout_1.FormRow, { label: "Orientation:", children: (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:max-w-[160px]", children: (0, jsx_runtime_1.jsx)(NewSelect_1.SingleSelect, { className: "twa:w-full", value: bullet.Orientation ?? 'Horizontal', onValueChange: (v) => update({ Orientation: v }), items: [
372
391
  { value: 'Horizontal', label: 'Horizontal' },
373
392
  { value: 'Vertical', label: 'Vertical' },
374
- ] }) }) }), bullet.Orientation === 'Vertical' && ((0, jsx_runtime_1.jsx)(FormLayout_1.FormRow, { label: "", children: (0, jsx_runtime_1.jsxs)(Flex_1.Box, { className: "twa:text-xs twa:text-neutral-500", children: ["Tip: vertical bullet charts need a tall row height to be readable (we recommend at least 60px). Set ", (0, jsx_runtime_1.jsx)("code", { children: "rowHeight" }), " on ", (0, jsx_runtime_1.jsx)("code", { children: " gridOptions " }), " or use", ' ', (0, jsx_runtime_1.jsx)("code", { children: "getRowHeight" }), "."] }) })), (0, jsx_runtime_1.jsx)(FormLayout_1.FormRow, { label: "Bar Colour:", children: (0, jsx_runtime_1.jsx)(ColorPicker_1.ColorPicker, { disabled: disabled, api: api, value: bullet.BarColor, onChange: (c) => update({ BarColor: c }) }) }), (0, jsx_runtime_1.jsx)(FormLayout_1.FormRow, { label: bullet.Orientation === 'Vertical' ? 'Bar Width (px):' : 'Bar Height (px):', children: (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:max-w-[100px]", children: (0, jsx_runtime_1.jsx)(AdaptableInput_1.default, { type: "number", min: 1, value: bullet.BarHeight ?? '', onChange: (e) => update({
375
- BarHeight: e.target.value === '' ? undefined : Number(e.target.value),
393
+ ] }) }) }), bullet.Orientation === 'Vertical' && ((0, jsx_runtime_1.jsx)(FormLayout_1.FormRow, { label: "", children: (0, jsx_runtime_1.jsxs)(Flex_1.Box, { className: "twa:text-xs twa:text-neutral-500", children: ["Tip: vertical bullet charts need a tall row height to be readable (we recommend at least 60px). Set ", (0, jsx_runtime_1.jsx)("code", { children: "rowHeight" }), " on ", (0, jsx_runtime_1.jsx)("code", { children: " gridOptions " }), " or use", ' ', (0, jsx_runtime_1.jsx)("code", { children: "getRowHeight" }), "."] }) })), (0, jsx_runtime_1.jsx)(FormLayout_1.FormRow, { label: "Bar Colour:", children: (0, jsx_runtime_1.jsx)(ColorPicker_1.ColorPicker, { disabled: disabled, api: api, value: bullet.Bar?.Color, onChange: (c) => updateBar({ Color: c }) }) }), (0, jsx_runtime_1.jsx)(FormLayout_1.FormRow, { label: bullet.Orientation === 'Vertical' ? 'Bar Width (px):' : 'Bar Height (px):', children: (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:max-w-[100px]", children: (0, jsx_runtime_1.jsx)(AdaptableInput_1.default, { type: "number", min: 1, value: bullet.Bar?.Height ?? '', onChange: (e) => updateBar({
394
+ Height: e.target.value === '' ? undefined : Number(e.target.value),
376
395
  }), placeholder: "8" }) }) }), (0, jsx_runtime_1.jsx)(FormLayout_1.FormRow, { label: "Origin:", children: (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:max-w-[160px]", children: (0, jsx_runtime_1.jsx)(NewSelect_1.SingleSelect, { className: "twa:w-full", value: typeof bullet.Origin === 'number' ? 'Number' : (bullet.Origin ?? 'Auto'), onValueChange: (v) => {
377
396
  if (v === 'Auto' || v === 'Zero') {
378
397
  update({ Origin: v });
@@ -383,11 +402,7 @@ const StyledColumnWizardBulletSection = (props) => {
383
402
  }, items: [
384
403
  { value: 'Auto', label: 'Auto' },
385
404
  { value: 'Zero', label: 'Zero' },
386
- ] }) }) })] }) })] }), (0, jsx_runtime_1.jsxs)(Card_1.Card, { shadow: false, className: "twa:mb-3", children: [(0, jsx_runtime_1.jsxs)(Card_1.Card.Title, { children: [(0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:font-medium", children: "Cell Text" }), (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:text-xs twa:opacity-70 twa:font-normal twa:max-w-[520px]", children: "Choose whether to display text in the cell (and if so, then position and font))" })] }), (0, jsx_runtime_1.jsxs)(Card_1.Card.Body, { children: [(0, jsx_runtime_1.jsxs)(FormLayout_1.default, { sizes: [...BULLET_STYLE_FORM_SIZES], children: [(0, jsx_runtime_1.jsxs)(FormLayout_1.FormRow, { label: "Cell Display:", children: [(0, jsx_runtime_1.jsx)(CheckBox_1.CheckBox, { disabled: disabled, checked: bullet.CellText?.includes('CellValue'), onChange: (checked) => toggleCellText('CellValue', checked), children: "Cell Value" }), ' ', (0, jsx_runtime_1.jsx)(CheckBox_1.CheckBox, { disabled: disabled, className: "twa:ml-3", checked: bullet.CellText?.includes('PercentageValue'), onChange: (checked) => toggleCellText('PercentageValue', checked), children: "Percent Value" })] }), (0, jsx_runtime_1.jsx)(FormLayout_1.FormRow, { label: "Cell Display Position:", children: (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:max-w-[160px]", children: (0, jsx_runtime_1.jsx)(NewSelect_1.SingleSelect, { className: "twa:w-full", disabled: cellTextDisabled, value: bullet.CellTextPosition ?? 'Below', onValueChange: (v) => handleCellTextPositionChange(v), items: [
387
- { value: 'Above', label: 'Above Bar' },
388
- { value: 'Below', label: 'Below Bar' },
389
- { value: 'Merged', label: 'Merged' },
390
- ] }) }) })] }), (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: `twa:mt-3 twa:pt-3 twa:border-t twa:border-foreground/15 ${cellTextDisabled ? 'twa:opacity-50' : ''}`, children: (0, jsx_runtime_1.jsx)(StyledColumnSliceStyleEditors_1.StyledColumnFontStyleEditor, { api: api, disabled: cellTextDisabled, value: bullet.Font, onChange: (next) => {
405
+ ] }) }) })] }) })] }), (0, jsx_runtime_1.jsxs)(Card_1.Card, { shadow: false, className: "twa:mb-3", children: [(0, jsx_runtime_1.jsxs)(Card_1.Card.Title, { children: [(0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:font-medium", children: "Cell Text" }), (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:text-xs twa:opacity-70 twa:font-normal twa:max-w-[520px]", children: "Pick which values to display and where each one sits around the bar" })] }), (0, jsx_runtime_1.jsxs)(Card_1.Card.Body, { children: [(0, jsx_runtime_1.jsx)(FormLayout_1.default, { sizes: [...BULLET_STYLE_FORM_SIZES], children: (0, jsx_runtime_1.jsx)(FormLayout_1.FormRow, { label: "Cell Text Layout:", children: (0, jsx_runtime_1.jsx)(BarChartCellTextLayoutEditor_1.BarChartCellTextLayoutEditor, { disabled: disabled, cellTextProperties: cellTextProperties, onToggle: toggleCellText, onPlacementChange: onCellTextPlacementChange }) }) }), (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: `twa:mt-3 twa:pt-3 twa:border-t twa:border-foreground/15 ${cellTextDisabled ? 'twa:opacity-50' : ''}`, children: (0, jsx_runtime_1.jsx)(StyledColumnSliceStyleEditors_1.StyledColumnFontStyleEditor, { api: api, disabled: cellTextDisabled, value: bullet.Font, onChange: (next) => {
391
406
  if (next) {
392
407
  update({ Font: next });
393
408
  }
@@ -82,8 +82,9 @@ const getStyledColumnIconMappingsViewValues = (data) => {
82
82
  if (ic.MatchMode && ic.MatchMode !== 'Exact') {
83
83
  items.push(`Match Mode: ${ic.MatchMode}`);
84
84
  }
85
- if (ic.Fallback && ic.Fallback !== 'Hide') {
86
- items.push(`Fallback: ${ic.Fallback}`);
85
+ const fallbackMode = ic.FallbackProperties?.Mode;
86
+ if (fallbackMode && fallbackMode !== 'Hide') {
87
+ items.push(`Fallback: ${fallbackMode}`);
87
88
  }
88
89
  return items;
89
90
  };
@@ -96,9 +97,10 @@ const buildStyledColumnIconStyleSummaryStrings = (ic, options) => {
96
97
  if (ic.Gap != null) {
97
98
  items.push(`Gap: ${ic.Gap}px`);
98
99
  }
99
- if (ic.CellText?.length) {
100
- items.push(`Cell Text: ${formatIconCellTextSummary(ic.CellText)}`);
101
- items.push(`Cell Text Position: ${ic.CellTextPosition ?? 'After'}`);
100
+ const ctp = ic.CellTextProperties;
101
+ if (ctp?.CellText?.length) {
102
+ items.push(`Cell Text: ${formatIconCellTextSummary(ctp.CellText)}`);
103
+ items.push(`Cell Text Position: ${ctp.CellTextPosition ?? 'After'}`);
102
104
  }
103
105
  else if (options.includeEmptyCellText) {
104
106
  items.push('Cell Text: None');
@@ -264,12 +266,35 @@ const StyledColumnWizardIconSection = (props) => {
264
266
  // -----------------------------------------------------------------------
265
267
  // CellText helpers
266
268
  // -----------------------------------------------------------------------
269
+ const updateCellTextProperties = (patch) => {
270
+ const merged = {
271
+ ...iconStyle.CellTextProperties,
272
+ ...patch,
273
+ };
274
+ // Strip the wrapper when both inner properties are unset, so empty state
275
+ // serialises cleanly.
276
+ const isEmpty = !merged.CellText?.length && merged.CellTextPosition == undefined;
277
+ update({ CellTextProperties: isEmpty ? undefined : merged });
278
+ };
267
279
  const toggleCellText = (token, checked) => {
268
- const current = iconStyle.CellText ?? [];
280
+ const current = iconStyle.CellTextProperties?.CellText ?? [];
269
281
  const next = checked
270
282
  ? Array.from(new Set([...current, token]))
271
283
  : current.filter((t) => t !== token);
272
- update({ CellText: next });
284
+ updateCellTextProperties({ CellText: next });
285
+ };
286
+ // -----------------------------------------------------------------------
287
+ // Fallback helpers
288
+ // -----------------------------------------------------------------------
289
+ const updateFallbackProperties = (patch) => {
290
+ const merged = {
291
+ ...iconStyle.FallbackProperties,
292
+ ...patch,
293
+ };
294
+ // Strip the wrapper when there's nothing to remember; the renderer
295
+ // already defaults to `Mode: 'Hide'` when `FallbackProperties` is unset.
296
+ const isEmpty = (merged.Mode == undefined || merged.Mode === 'Hide') && merged.Icon == undefined;
297
+ update({ FallbackProperties: isEmpty ? undefined : merged });
273
298
  };
274
299
  const toggleToolTipText = (token, checked) => {
275
300
  const current = iconStyle.ToolTipText ?? [];
@@ -298,14 +323,14 @@ const StyledColumnWizardIconSection = (props) => {
298
323
  }), placeholder: "Tooltip label (optional)" }) }), (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:w-8 twa:shrink-0 twa:flex twa:justify-center", children: (0, jsx_runtime_1.jsx)(SimpleButton_1.default, { icon: "delete", variant: "text", tooltip: "Remove mapping", onClick: () => removeMapping(i) }) })] }, i)))] })), (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:mt-2", children: (0, jsx_runtime_1.jsx)(ButtonNew_1.ButtonNew, { onClick: addMapping, children: "Add Mapping" }) })] })] }), (0, jsx_runtime_1.jsxs)(Card_1.Card, { shadow: false, children: [(0, jsx_runtime_1.jsxs)(Card_1.Card.Title, { children: [(0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:font-medium", children: "Matching" }), (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:text-xs twa:opacity-70 twa:font-normal twa:max-w-[520px]", children: "How keys are compared to cell values, and what to render when no mapping matches" })] }), (0, jsx_runtime_1.jsx)(Card_1.Card.Body, { children: (0, jsx_runtime_1.jsxs)(FormLayout_1.default, { children: [(0, jsx_runtime_1.jsx)(FormLayout_1.FormRow, { label: "Match Mode:", children: (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:max-w-[200px]", children: (0, jsx_runtime_1.jsx)(NewSelect_1.SingleSelect, { className: "twa:w-full", value: iconStyle.MatchMode ?? 'Exact', onValueChange: (v) => update({ MatchMode: v }), items: [
299
324
  { value: 'Exact', label: 'Exact Match Required' },
300
325
  { value: 'CaseInsensitive', label: 'Case-insensitive (strings)' },
301
- ] }) }) }), (0, jsx_runtime_1.jsx)(FormLayout_1.FormRow, { label: "Fallback:", children: (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:max-w-[200px]", children: (0, jsx_runtime_1.jsx)(NewSelect_1.SingleSelect, { className: "twa:w-full", value: iconStyle.Fallback ?? 'Hide', onValueChange: (v) => update({ Fallback: v }), items: [
326
+ ] }) }) }), (0, jsx_runtime_1.jsx)(FormLayout_1.FormRow, { label: "Fallback:", children: (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:max-w-[200px]", children: (0, jsx_runtime_1.jsx)(NewSelect_1.SingleSelect, { className: "twa:w-full", value: iconStyle.FallbackProperties?.Mode ?? 'Hide', onValueChange: (v) => updateFallbackProperties({ Mode: v }), items: [
302
327
  { value: 'Hide', label: 'Show No Value' },
303
328
  { value: 'ShowText', label: 'Show Raw Value' },
304
329
  { value: 'Icon', label: 'Show Fallback Icon' },
305
- ] }) }) }), iconStyle.Fallback === 'Icon' && ((0, jsx_runtime_1.jsx)(FormLayout_1.FormRow, { label: "Fallback Icon:", children: (0, jsx_runtime_1.jsx)(IconPickerButton, { value: iconStyle.FallbackIcon, onChange: (next) => update({ FallbackIcon: next }) }) }))] }) })] })] }));
330
+ ] }) }) }), iconStyle.FallbackProperties?.Mode === 'Icon' && ((0, jsx_runtime_1.jsx)(FormLayout_1.FormRow, { label: "Fallback Icon:", children: (0, jsx_runtime_1.jsx)(IconPickerButton, { value: iconStyle.FallbackProperties?.Icon, onChange: (next) => updateFallbackProperties({ Icon: next }) }) }))] }) })] })] }));
306
331
  }
307
332
  // ----- Style variant (wizard step title: "Style") ------------------------
308
- const cellText = iconStyle.CellText ?? [];
333
+ const cellText = iconStyle.CellTextProperties?.CellText ?? [];
309
334
  const toolTipText = iconStyle.ToolTipText ?? [];
310
335
  const cellTextDisabled = cellText.length === 0;
311
336
  return ((0, jsx_runtime_1.jsxs)(Flex_1.Box, { children: [(0, jsx_runtime_1.jsxs)(Card_1.Card, { shadow: false, className: "twa:mb-3", children: [(0, jsx_runtime_1.jsx)(Card_1.Card.Title, { children: "Sizing" }), (0, jsx_runtime_1.jsx)(Card_1.Card.Body, { children: (0, jsx_runtime_1.jsxs)(FormLayout_1.default, { sizes: [...STYLE_FORM_SIZES], children: [(0, jsx_runtime_1.jsx)(FormLayout_1.FormRow, { label: "Icon Size (px):", children: (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:max-w-[100px]", children: (0, jsx_runtime_1.jsx)(Input_1.default, { type: "number", min: 8, step: 1, value: iconStyle.Size ?? '', placeholder: "18", className: "twa:w-full", onChange: (event) => {
@@ -318,7 +343,9 @@ const StyledColumnWizardIconSection = (props) => {
318
343
  update({
319
344
  Size: Number.isFinite(parsed) && parsed >= 8 ? parsed : undefined,
320
345
  });
321
- } }) }) }), (0, jsx_runtime_1.jsx)(FormLayout_1.FormRow, { label: "Gap (px):", children: (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:max-w-[100px]", children: (0, jsx_runtime_1.jsx)(NumberInput_1.NumberInput, { value: iconStyle.Gap ?? '', placeholder: "4", min: 0, step: 1, onChange: (value) => update({ Gap: typeof value === 'number' ? value : undefined }) }) }) })] }) })] }), (0, jsx_runtime_1.jsxs)(Card_1.Card, { shadow: false, className: "twa:mb-3", children: [(0, jsx_runtime_1.jsxs)(Card_1.Card.Title, { children: [(0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:font-medium", children: "Cell Text" }), (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:text-xs twa:opacity-70 twa:font-normal twa:max-w-[520px]", children: "Optionally show the raw value or the matched description alongside the icon (e.g. flag plus label)." })] }), (0, jsx_runtime_1.jsxs)(Card_1.Card.Body, { children: [(0, jsx_runtime_1.jsxs)(FormLayout_1.default, { sizes: [...STYLE_FORM_SIZES], children: [(0, jsx_runtime_1.jsxs)(FormLayout_1.FormRow, { label: "Cell Display:", children: [(0, jsx_runtime_1.jsx)(CheckBox_1.CheckBox, { checked: cellText.includes('CellValue'), onChange: (checked) => toggleCellText('CellValue', checked), children: "Cell Value" }), ' ', (0, jsx_runtime_1.jsx)(CheckBox_1.CheckBox, { className: "twa:ml-3", checked: cellText.includes('IconDescription'), onChange: (checked) => toggleCellText('IconDescription', checked), children: "Description" })] }), (0, jsx_runtime_1.jsx)(FormLayout_1.FormRow, { label: "Position:", children: (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:max-w-[160px]", children: (0, jsx_runtime_1.jsx)(NewSelect_1.SingleSelect, { className: "twa:w-full", value: iconStyle.CellTextPosition ?? 'After', onValueChange: (v) => update({ CellTextPosition: v }), items: [
346
+ } }) }) }), (0, jsx_runtime_1.jsx)(FormLayout_1.FormRow, { label: "Gap (px):", children: (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:max-w-[100px]", children: (0, jsx_runtime_1.jsx)(NumberInput_1.NumberInput, { value: iconStyle.Gap ?? '', placeholder: "4", min: 0, step: 1, onChange: (value) => update({ Gap: typeof value === 'number' ? value : undefined }) }) }) })] }) })] }), (0, jsx_runtime_1.jsxs)(Card_1.Card, { shadow: false, className: "twa:mb-3", children: [(0, jsx_runtime_1.jsxs)(Card_1.Card.Title, { children: [(0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:font-medium", children: "Cell Text" }), (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:text-xs twa:opacity-70 twa:font-normal twa:max-w-[520px]", children: "Optionally show the raw value or the matched description alongside the icon (e.g. flag plus label)." })] }), (0, jsx_runtime_1.jsxs)(Card_1.Card.Body, { children: [(0, jsx_runtime_1.jsxs)(FormLayout_1.default, { sizes: [...STYLE_FORM_SIZES], children: [(0, jsx_runtime_1.jsxs)(FormLayout_1.FormRow, { label: "Cell Display:", children: [(0, jsx_runtime_1.jsx)(CheckBox_1.CheckBox, { checked: cellText.includes('CellValue'), onChange: (checked) => toggleCellText('CellValue', checked), children: "Cell Value" }), ' ', (0, jsx_runtime_1.jsx)(CheckBox_1.CheckBox, { className: "twa:ml-3", checked: cellText.includes('IconDescription'), onChange: (checked) => toggleCellText('IconDescription', checked), children: "Description" })] }), (0, jsx_runtime_1.jsx)(FormLayout_1.FormRow, { label: "Position:", children: (0, jsx_runtime_1.jsx)(Flex_1.Box, { className: "twa:max-w-[160px]", children: (0, jsx_runtime_1.jsx)(NewSelect_1.SingleSelect, { className: "twa:w-full", value: iconStyle.CellTextProperties?.CellTextPosition ?? 'After', onValueChange: (v) => updateCellTextProperties({
347
+ CellTextPosition: v,
348
+ }), items: [
322
349
  { value: 'Before', label: 'Before' },
323
350
  { value: 'After', label: 'After' },
324
351
  { value: 'Above', label: 'Above' },