@rowsncolumns/charts 28.1.14 → 28.1.16

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 (99) hide show
  1. package/dist/cjs/basic-chart/basic-chart.d.ts.map +1 -1
  2. package/dist/cjs/basic-chart/basic-chart.js +312 -271
  3. package/dist/cjs/components/editors/chart-editor-capabilities.d.ts +48 -0
  4. package/dist/cjs/components/editors/chart-editor-capabilities.d.ts.map +1 -0
  5. package/dist/cjs/components/editors/chart-editor-capabilities.js +62 -0
  6. package/dist/cjs/components/editors/chart-editor.d.ts.map +1 -1
  7. package/dist/cjs/components/editors/chart-editor.js +200 -534
  8. package/dist/cjs/components/editors/fields/axis-options-fields.d.ts +16 -0
  9. package/dist/cjs/components/editors/fields/axis-options-fields.d.ts.map +1 -0
  10. package/dist/cjs/components/editors/fields/axis-options-fields.js +31 -0
  11. package/dist/cjs/components/editors/fields/chart-type-options.d.ts +25 -0
  12. package/dist/cjs/components/editors/fields/chart-type-options.d.ts.map +1 -0
  13. package/dist/cjs/components/editors/fields/chart-type-options.js +170 -0
  14. package/dist/cjs/components/editors/fields/data-labels-fields.d.ts +15 -0
  15. package/dist/cjs/components/editors/fields/data-labels-fields.d.ts.map +1 -0
  16. package/dist/cjs/components/editors/fields/data-labels-fields.js +57 -0
  17. package/dist/cjs/components/editors/fields/primitives.d.ts +54 -0
  18. package/dist/cjs/components/editors/fields/primitives.d.ts.map +1 -0
  19. package/dist/cjs/components/editors/fields/primitives.js +52 -0
  20. package/dist/cjs/components/editors/fields/series-format-fields.d.ts +17 -0
  21. package/dist/cjs/components/editors/fields/series-format-fields.d.ts.map +1 -0
  22. package/dist/cjs/components/editors/fields/series-format-fields.js +165 -0
  23. package/dist/cjs/components/editors/fields/series-name-field.d.ts +16 -0
  24. package/dist/cjs/components/editors/fields/series-name-field.d.ts.map +1 -0
  25. package/dist/cjs/components/editors/fields/series-name-field.js +36 -0
  26. package/dist/cjs/components/editors/fields/text-format-fields.d.ts +20 -0
  27. package/dist/cjs/components/editors/fields/text-format-fields.d.ts.map +1 -0
  28. package/dist/cjs/components/editors/fields/text-format-fields.js +46 -0
  29. package/dist/cjs/config.d.ts.map +1 -1
  30. package/dist/cjs/config.js +3 -0
  31. package/dist/cjs/interface/create-chart.d.ts +3 -2
  32. package/dist/cjs/interface/create-chart.d.ts.map +1 -1
  33. package/dist/cjs/interface/create-chart.js +7 -0
  34. package/dist/cjs/plotly/basic-chart/basic-chart.d.ts.map +1 -1
  35. package/dist/cjs/plotly/basic-chart/basic-chart.js +255 -218
  36. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  37. package/dist/cjs/utils/chart-orientation.d.ts.map +1 -1
  38. package/dist/cjs/utils/chart-orientation.js +24 -12
  39. package/dist/cjs/utils/chart-spec-utils.d.ts.map +1 -1
  40. package/dist/cjs/utils/chart-spec-utils.js +120 -21
  41. package/dist/cjs/utils/echarts-overlays.d.ts +2 -0
  42. package/dist/cjs/utils/echarts-overlays.d.ts.map +1 -1
  43. package/dist/cjs/utils/echarts-overlays.js +25 -12
  44. package/dist/cjs/utils/series-name.d.ts +12 -0
  45. package/dist/cjs/utils/series-name.d.ts.map +1 -0
  46. package/dist/cjs/utils/series-name.js +26 -0
  47. package/dist/cjs/utils/trendline.d.ts +9 -0
  48. package/dist/cjs/utils/trendline.d.ts.map +1 -1
  49. package/dist/cjs/utils/trendline.js +16 -1
  50. package/dist/esm/basic-chart/basic-chart.d.ts.map +1 -1
  51. package/dist/esm/basic-chart/basic-chart.js +80 -38
  52. package/dist/esm/components/editors/chart-editor-capabilities.d.ts +48 -0
  53. package/dist/esm/components/editors/chart-editor-capabilities.d.ts.map +1 -0
  54. package/dist/esm/components/editors/chart-editor-capabilities.js +58 -0
  55. package/dist/esm/components/editors/chart-editor.d.ts.map +1 -1
  56. package/dist/esm/components/editors/chart-editor.js +166 -448
  57. package/dist/esm/components/editors/fields/axis-options-fields.d.ts +16 -0
  58. package/dist/esm/components/editors/fields/axis-options-fields.d.ts.map +1 -0
  59. package/dist/esm/components/editors/fields/axis-options-fields.js +22 -0
  60. package/dist/esm/components/editors/fields/chart-type-options.d.ts +25 -0
  61. package/dist/esm/components/editors/fields/chart-type-options.d.ts.map +1 -0
  62. package/dist/esm/components/editors/fields/chart-type-options.js +151 -0
  63. package/dist/esm/components/editors/fields/data-labels-fields.d.ts +15 -0
  64. package/dist/esm/components/editors/fields/data-labels-fields.d.ts.map +1 -0
  65. package/dist/esm/components/editors/fields/data-labels-fields.js +47 -0
  66. package/dist/esm/components/editors/fields/primitives.d.ts +54 -0
  67. package/dist/esm/components/editors/fields/primitives.d.ts.map +1 -0
  68. package/dist/esm/components/editors/fields/primitives.js +26 -0
  69. package/dist/esm/components/editors/fields/series-format-fields.d.ts +17 -0
  70. package/dist/esm/components/editors/fields/series-format-fields.d.ts.map +1 -0
  71. package/dist/esm/components/editors/fields/series-format-fields.js +143 -0
  72. package/dist/esm/components/editors/fields/series-name-field.d.ts +16 -0
  73. package/dist/esm/components/editors/fields/series-name-field.d.ts.map +1 -0
  74. package/dist/esm/components/editors/fields/series-name-field.js +31 -0
  75. package/dist/esm/components/editors/fields/text-format-fields.d.ts +20 -0
  76. package/dist/esm/components/editors/fields/text-format-fields.d.ts.map +1 -0
  77. package/dist/esm/components/editors/fields/text-format-fields.js +34 -0
  78. package/dist/esm/config.d.ts.map +1 -1
  79. package/dist/esm/config.js +3 -0
  80. package/dist/esm/interface/create-chart.d.ts +3 -2
  81. package/dist/esm/interface/create-chart.d.ts.map +1 -1
  82. package/dist/esm/interface/create-chart.js +8 -1
  83. package/dist/esm/plotly/basic-chart/basic-chart.d.ts.map +1 -1
  84. package/dist/esm/plotly/basic-chart/basic-chart.js +52 -30
  85. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  86. package/dist/esm/utils/chart-orientation.d.ts.map +1 -1
  87. package/dist/esm/utils/chart-orientation.js +20 -0
  88. package/dist/esm/utils/chart-spec-utils.d.ts.map +1 -1
  89. package/dist/esm/utils/chart-spec-utils.js +95 -8
  90. package/dist/esm/utils/echarts-overlays.d.ts +2 -0
  91. package/dist/esm/utils/echarts-overlays.d.ts.map +1 -1
  92. package/dist/esm/utils/echarts-overlays.js +15 -1
  93. package/dist/esm/utils/series-name.d.ts +12 -0
  94. package/dist/esm/utils/series-name.d.ts.map +1 -0
  95. package/dist/esm/utils/series-name.js +24 -0
  96. package/dist/esm/utils/trendline.d.ts +9 -0
  97. package/dist/esm/utils/trendline.d.ts.map +1 -1
  98. package/dist/esm/utils/trendline.js +14 -0
  99. package/package.json +3 -3
@@ -7,15 +7,22 @@ var spreadsheet_state_1 = require("@rowsncolumns/spreadsheet-state");
7
7
  var ui_1 = require("@rowsncolumns/ui");
8
8
  var ui_2 = require("@rowsncolumns/ui");
9
9
  var ui_3 = require("@rowsncolumns/ui");
10
+ var utils_1 = require("@rowsncolumns/utils");
10
11
  var formik_1 = require("formik");
11
12
  var react_1 = tslib_1.__importStar(require("react"));
12
13
  var editing_chart_atom_1 = require("../../atoms/editing-chart.atom");
13
- var chart_range_input_1 = require("./chart-range-input");
14
14
  var config_1 = require("../../config");
15
- var utils_1 = require("@rowsncolumns/utils");
16
15
  var chart_orientation_1 = require("../../utils/chart-orientation");
17
16
  var chart_spec_utils_1 = require("../../utils/chart-spec-utils");
18
17
  var chart_styles_1 = require("../../utils/chart-styles");
18
+ var chart_editor_capabilities_1 = require("./chart-editor-capabilities");
19
+ var chart_range_input_1 = require("./chart-range-input");
20
+ var axis_options_fields_1 = require("./fields/axis-options-fields");
21
+ var chart_type_options_1 = require("./fields/chart-type-options");
22
+ var data_labels_fields_1 = require("./fields/data-labels-fields");
23
+ var series_format_fields_1 = require("./fields/series-format-fields");
24
+ var series_name_field_1 = require("./fields/series-name-field");
25
+ var text_format_fields_1 = require("./fields/text-format-fields");
19
26
  var AGGREGATE_OPTIONS = [
20
27
  { label: "Sum", value: "SUM" },
21
28
  { label: "Average", value: "AVERAGE" },
@@ -48,7 +55,7 @@ var Section = function (_a) {
48
55
  react_1.default.createElement("div", { className: "flex flex-col gap-2 pb-3" }, children)));
49
56
  };
50
57
  var ChartEditor = function (_a) {
51
- var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40;
58
+ var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0;
52
59
  var chart = _a.chart, sheetId = _a.sheetId, onSubmit = _a.onSubmit, onRequestMoveChart = _a.onRequestMoveChart, getFormattedValue = _a.getFormattedValue;
53
60
  var setChartDialogState = (0, editing_chart_atom_1.useSetChartEditorDialogState)();
54
61
  // Close dialog
@@ -68,7 +75,7 @@ var ChartEditor = function (_a) {
68
75
  // eslint-disable-next-line react-hooks/exhaustive-deps
69
76
  [chart === null || chart === void 0 ? void 0 : chart.chartId]);
70
77
  // Formik
71
- var _41 = (0, formik_1.useFormik)({
78
+ var _1 = (0, formik_1.useFormik)({
72
79
  initialValues: initialValues,
73
80
  enableReinitialize: true,
74
81
  onSubmit: function (values) {
@@ -80,63 +87,136 @@ var ChartEditor = function (_a) {
80
87
  // Close dialog
81
88
  closeDialog();
82
89
  },
83
- }), handleSubmit = _41.handleSubmit, setFieldValue = _41.setFieldValue, resetForm = _41.resetForm, values = _41.values;
90
+ }), handleSubmit = _1.handleSubmit, setFieldValue = _1.setFieldValue, resetForm = _1.resetForm, values = _1.values;
84
91
  var onCancelForm = function () {
85
92
  resetForm();
86
93
  closeDialog();
87
94
  };
88
- var basicSpec = (0, chart_spec_utils_1.isBasicChartSpec)(values.spec) ? values.spec : undefined;
89
- var bubbleSpec = (0, chart_spec_utils_1.isBubbleChartSpec)(values.spec) ? values.spec : undefined;
90
- var treemapSpec = (0, chart_spec_utils_1.isHierarchyChartSpec)(values.spec)
91
- ? values.spec
95
+ var spec = values.spec;
96
+ var basicSpec = (0, chart_spec_utils_1.isBasicChartSpec)(spec) ? spec : undefined;
97
+ var bubbleSpec = (0, chart_spec_utils_1.isBubbleChartSpec)(spec) ? spec : undefined;
98
+ var treemapSpec = (0, chart_spec_utils_1.isHierarchyChartSpec)(spec)
99
+ ? spec
92
100
  : undefined;
93
- // Cartesian (XY) chart types have value/category axes; circular and
94
- // polar/derived types (pie/doughnut/radar) do not, so the axis-scale
95
- // controls are gated to these.
96
- var isCartesianBasic = basicSpec
97
- ? basicSpec.chartType !== "pie" &&
98
- basicSpec.chartType !== "doughnut" &&
99
- basicSpec.chartType !== "radar"
100
- : false;
101
- // Bar/column-only features. gapWidth is consumed by both renderers
102
- // (echarts barCategoryGap / plotly bargap); overlap by echarts
103
- // (barGap).
104
- var isBarOrColumnBasic = basicSpec
105
- ? basicSpec.chartType === "bar" || basicSpec.chartType === "column"
106
- : false;
107
- // Customize → "Chart options": each control names the chart types it
108
- // applies to and the section renders when any of them does, so a chart type
109
- // is never left out by a separately maintained list (pie was, until #783).
110
- var chartOptionControls = {
111
- binCount: (basicSpec === null || basicSpec === void 0 ? void 0 : basicSpec.chartType) === "histogram",
112
- radarStyle: (basicSpec === null || basicSpec === void 0 ? void 0 : basicSpec.chartType) === "radar",
113
- stockVariant: (basicSpec === null || basicSpec === void 0 ? void 0 : basicSpec.chartType) === "stock",
114
- doughnutHoleSize: (basicSpec === null || basicSpec === void 0 ? void 0 : basicSpec.chartType) === "doughnut",
115
- explosion: (basicSpec === null || basicSpec === void 0 ? void 0 : basicSpec.chartType) === "pie" || (basicSpec === null || basicSpec === void 0 ? void 0 : basicSpec.chartType) === "doughnut",
116
- gapWidth: isBarOrColumnBasic,
117
- overlap: isBarOrColumnBasic,
101
+ // Which controls this chart type has — Excel's rule set, so an option is
102
+ // only offered where the chart (and the renderers) honour it (#1102).
103
+ var caps = (0, chart_editor_capabilities_1.getChartEditorCapabilities)(spec);
104
+ // The series of a basic or bubble chart. Guarded: a spec converted from
105
+ // another category used to arrive without `series` and crash the editor
106
+ // on `series.some` (#1101).
107
+ var seriesList = basicSpec
108
+ ? (_b = basicSpec.series) !== null && _b !== void 0 ? _b : []
109
+ : bubbleSpec
110
+ ? (_c = bubbleSpec.series) !== null && _c !== void 0 ? _c : []
111
+ : [];
112
+ var domainsList = basicSpec
113
+ ? (_d = basicSpec.domains) !== null && _d !== void 0 ? _d : []
114
+ : bubbleSpec
115
+ ? (_e = bubbleSpec.domains) !== null && _e !== void 0 ? _e : []
116
+ : [];
117
+ var isAggregateType = seriesList.some(function (serie) { return serie.aggregateType; });
118
+ var setSeries = function (index, patch) {
119
+ return setFieldValue("spec.series[".concat(index, "]"), tslib_1.__assign(tslib_1.__assign({}, seriesList[index]), patch));
118
120
  };
119
- var showChartOptions = Object.values(chartOptionControls).some(Boolean);
120
- // Check aggregate
121
- var isAggregateType = basicSpec
122
- ? basicSpec.series.some(function (serie) { return serie.aggregateType; })
123
- : false;
124
- var bubbleAggregateEnabled = bubbleSpec
125
- ? bubbleSpec.series.some(function (serie) { return serie.aggregateType; })
126
- : false;
127
- var renderChartDataSection = function (label, field, data, helperText) {
128
- var sections = data.length > 0 ? data : [{ sources: [] }];
121
+ var hasSeriesFormat = caps.hasSecondaryAxis ||
122
+ caps.hasTrendlines ||
123
+ caps.hasErrorBars ||
124
+ caps.hasSeriesFill ||
125
+ caps.hasInvertIfNegative ||
126
+ caps.hasMarkers ||
127
+ caps.hasPointColors ||
128
+ caps.hasDataLabels;
129
+ var categoryLevels = (_f = basicSpec === null || basicSpec === void 0 ? void 0 : basicSpec.categoryLevels) !== null && _f !== void 0 ? _f : [];
130
+ var hasTypeOptions = (0, chart_type_options_1.chartTypeHasOptions)(spec, caps);
131
+ var renderChartDataSection = function (label, field, data, helperText, levels) {
132
+ // A levelled section (parent labels, category levels) starts empty and
133
+ // grows with "Add level"; a plain section always shows one input.
134
+ var sections = data.length > 0 ? data : levels ? [] : [{ sources: [] }];
129
135
  return (react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-3" },
130
136
  react_1.default.createElement("label", { className: "font-system text-sm" }, label),
131
137
  helperText ? (react_1.default.createElement("p", { className: "m-0 text-xs text-rnc-text-weak" }, helperText)) : null,
132
138
  sections.map(function (domain, i) {
133
139
  var sources = domain.sources.length > 0 ? domain.sources : [undefined];
134
- return sources.map(function (source, idx) { return (react_1.default.createElement("div", { key: "".concat(values.chartId, "-").concat(label, "-").concat(sections.length, "-").concat(i, "-").concat(idx) },
140
+ return sources.map(function (source, idx) { return (react_1.default.createElement("div", { key: "".concat(values.chartId, "-").concat(label, "-").concat(sections.length, "-").concat(i, "-").concat(idx), className: "flex items-center gap-1" },
135
141
  react_1.default.createElement(chart_range_input_1.ChartRangeInput, { sheetId: sheetId, range: source, onChangeRange: function (range) {
136
142
  setFieldValue("spec.".concat(field, "[").concat(i, "].sources[").concat(idx, "]"), range);
137
- }, required: true, placeholder: "Select a range", className: "mb-0 flex-1" }))); });
138
- })));
143
+ }, required: true, placeholder: "Select a range", className: "mb-0 flex-1" }),
144
+ levels && data.length > 1 ? (react_1.default.createElement(ui_1.IconButton, { type: "button", "aria-label": "".concat(levels.removeLabel, " ").concat(i + 1), title: levels.removeLabel, onClick: function () {
145
+ return setFieldValue("spec.".concat(field), data.filter(function (_, levelIndex) { return levelIndex !== i; }));
146
+ } },
147
+ react_1.default.createElement(icons_1.CrossCircledIcon, null))) : null)); });
148
+ }),
149
+ levels ? (react_1.default.createElement("div", null,
150
+ react_1.default.createElement(ui_1.Button, { variant: "link", type: "button", className: "cursor-pointer", onClick: function () {
151
+ return setFieldValue("spec.".concat(field), tslib_1.__spreadArray(tslib_1.__spreadArray([], tslib_1.__read(data), false), [{ sources: [] }], false));
152
+ } }, levels.addLabel))) : null));
153
+ };
154
+ var renderSeriesCard = function (entry, i) {
155
+ var _a;
156
+ var sources = ((_a = entry.sources) === null || _a === void 0 ? void 0 : _a.length) > 0 ? entry.sources : [undefined];
157
+ return sources.map(function (source, idx) {
158
+ var _a, _b, _c;
159
+ return (react_1.default.createElement("div", { className: "border border-rnc-border border-solid p-2 relative", key: "".concat(values.chartId, "-series-").concat(seriesList.length, "-").concat(i, "-").concat(idx) },
160
+ react_1.default.createElement("div", { className: "flex gap-2 items-start flex-wrap" },
161
+ react_1.default.createElement(series_name_field_1.SeriesNameField, { sheetId: sheetId, series: entry, getFormattedValue: getFormattedValue, onChange: function (patch) { return setSeries(i, patch); } }),
162
+ react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 flex-1" },
163
+ react_1.default.createElement("label", { className: "font-system text-sm" }, "Y values"),
164
+ react_1.default.createElement(chart_range_input_1.ChartRangeInput, { sheetId: sheetId, range: source, onChangeRange: function (range) {
165
+ setFieldValue("spec.series[".concat(i, "].sources[").concat(idx, "]"), range);
166
+ }, required: true, placeholder: "Select a range", className: "mb-0" })),
167
+ react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2 w-20" },
168
+ react_1.default.createElement("label", { className: "font-system text-sm" }, "Color"),
169
+ react_1.default.createElement("div", { className: "flex items-center gap-1" },
170
+ react_1.default.createElement("input", { type: "color", value: (_a = entry.color) !== null && _a !== void 0 ? _a : "#4285F4", "aria-label": "Series ".concat(i + 1, " color"), onChange: function (e) { return setSeries(i, { color: e.target.value }); }, className: "h-6 w-8 p-0 border border-rnc-border rounded-sm bg-transparent cursor-pointer" }),
171
+ entry.color ? (react_1.default.createElement(ui_1.IconButton, { type: "button", "aria-label": "Clear series ".concat(i + 1, " color"), title: "Automatic color", onClick: function () { return setSeries(i, { color: undefined }); } },
172
+ react_1.default.createElement(icons_1.CrossCircledIcon, null))) : null)),
173
+ isAggregateType ? (react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2 w-32" },
174
+ react_1.default.createElement("label", { className: "font-system text-sm" }, "Aggregate type"),
175
+ react_1.default.createElement("select", { className: "border border-rnc-border rounded-sm px-1 py-1 text-xs bg-transparent", value: (_b = entry.aggregateType) !== null && _b !== void 0 ? _b : "", onChange: function (event) {
176
+ var aggregateType = event.target.value;
177
+ setSeries(i, { aggregateType: aggregateType || undefined });
178
+ } },
179
+ react_1.default.createElement("option", { value: "" }, "None"),
180
+ AGGREGATE_OPTIONS.map(function (option) { return (react_1.default.createElement("option", { key: option.value, value: option.value }, option.label)); })))) : null,
181
+ caps.hasSeriesChartType ? (react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2 w-28" },
182
+ react_1.default.createElement("label", { className: "font-system text-sm" }, "Series type"),
183
+ react_1.default.createElement("select", { className: "border border-rnc-border rounded-sm px-1 py-1 text-xs bg-transparent", value: (_c = entry.seriesChartType) !== null && _c !== void 0 ? _c : "", "aria-label": "Series ".concat(i + 1, " type"), onChange: function (event) {
184
+ return setSeries(i, {
185
+ seriesChartType: (event.target.value || undefined),
186
+ });
187
+ } },
188
+ react_1.default.createElement("option", { value: "" }, "Default"),
189
+ react_1.default.createElement("option", { value: "column" }, "Column"),
190
+ react_1.default.createElement("option", { value: "bar" }, "Bar"),
191
+ react_1.default.createElement("option", { value: "line" }, "Line"),
192
+ react_1.default.createElement("option", { value: "area" }, "Area")))) : null),
193
+ hasSeriesFormat ? (react_1.default.createElement("details", { className: "mt-2 group/fmt" },
194
+ react_1.default.createElement("summary", { className: "cursor-pointer list-none py-1 font-system text-xs text-rnc-muted-foreground select-none [&::-webkit-details-marker]:hidden flex items-center gap-1" },
195
+ react_1.default.createElement(icons_1.ChevronRightIcon, { className: "transition-transform group-open/fmt:rotate-90" }),
196
+ "Format"),
197
+ react_1.default.createElement(series_format_fields_1.SeriesFormatFields, { sheetId: sheetId, series: entry, capabilities: caps, onChange: function (patch) { return setSeries(i, patch); } }))) : null,
198
+ react_1.default.createElement(ui_1.IconButton, { className: "absolute right-1 top-1", type: "button", "aria-label": "Remove series ".concat(i + 1), onClick: function () {
199
+ return setFieldValue("spec.series", seriesList.filter(function (_, seriesIndex) { return seriesIndex !== i; }));
200
+ } },
201
+ react_1.default.createElement(icons_1.CrossCircledIcon, null))));
202
+ });
139
203
  };
204
+ var renderSeriesList = function () { return (react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-2 pb-2" },
205
+ react_1.default.createElement("label", { className: "font-system text-sm" }, "Legend entries (series)"),
206
+ seriesList.map(renderSeriesCard),
207
+ react_1.default.createElement("div", { className: "py-1" },
208
+ react_1.default.createElement(ui_1.Button, { variant: "link", type: "button", className: "cursor-pointer", onClick: function () {
209
+ var lastSeries = seriesList[seriesList.length - 1];
210
+ setFieldValue("spec.series", tslib_1.__spreadArray(tslib_1.__spreadArray([], tslib_1.__read(seriesList), false), [
211
+ {
212
+ sources: lastSeries
213
+ ? lastSeries.sources
214
+ : spec.dataRange
215
+ ? [spec.dataRange]
216
+ : [],
217
+ },
218
+ ], false));
219
+ } }, "Add series")))); };
140
220
  return (react_1.default.createElement("form", { onSubmit: handleSubmit, className: "flex flex-col" },
141
221
  react_1.default.createElement(ui_1.Tabs, { defaultValue: "setup", className: "w-full" },
142
222
  react_1.default.createElement(ui_1.TabsList, { className: "grid-cols-2" },
@@ -170,10 +250,10 @@ var ChartEditor = function (_a) {
170
250
  }))))),
171
251
  react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
172
252
  react_1.default.createElement("label", { className: "font-system text-sm" }, "Chart data range"),
173
- ((_b = values.spec) === null || _b === void 0 ? void 0 : _b.pivotTableId) != null ? (
253
+ ((_g = values.spec) === null || _g === void 0 ? void 0 : _g.pivotTableId) != null ? (
174
254
  // A PivotChart's range follows its pivot's data area; it is not
175
255
  // editable here (Excel greys the range on a PivotChart too).
176
- react_1.default.createElement("span", { className: "font-system text-xs text-rnc-muted-foreground" }, "Bound to PivotTable \u2014 the data range follows the pivot.")) : (react_1.default.createElement(chart_range_input_1.ChartRangeInput, { key: values.chartId, sheetId: sheetId, range: (_d = (_c = values.spec) === null || _c === void 0 ? void 0 : _c.dataRange) !== null && _d !== void 0 ? _d : undefined, onChangeRange: function (range) {
256
+ react_1.default.createElement("span", { className: "font-system text-xs text-rnc-muted-foreground" }, "Bound to PivotTable \u2014 the data range follows the pivot.")) : (react_1.default.createElement(chart_range_input_1.ChartRangeInput, { key: values.chartId, sheetId: sheetId, range: (_j = (_h = values.spec) === null || _h === void 0 ? void 0 : _h.dataRange) !== null && _j !== void 0 ? _j : undefined, onChangeRange: function (range) {
177
257
  setFieldValue("spec.dataRange", range);
178
258
  }, required: true, placeholder: "Select a range", className: "mb-0" }))),
179
259
  basicSpec ? (react_1.default.createElement(ui_1.Stack, { direction: "horizontal", className: "gap-2 pb-2 items-center" },
@@ -190,271 +270,53 @@ var ChartEditor = function (_a) {
190
270
  basicSpec ? (react_1.default.createElement(react_1.default.Fragment, null,
191
271
  react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
192
272
  react_1.default.createElement("label", { className: "font-system text-sm" }, "Horizontal (category) axis labels"),
193
- ((_e = basicSpec.domains) !== null && _e !== void 0 ? _e : []).map(function (domain, i) {
194
- return domain.sources.map(function (source, idx) {
195
- return (react_1.default.createElement(chart_range_input_1.ChartRangeInput, { key: "".concat(values.chartId, "-domains-").concat(basicSpec.domains.length, "-").concat(i, "-").concat(idx), sheetId: sheetId, range: source, onChangeRange: function (range) {
273
+ domainsList.map(function (domain, i) {
274
+ var _a;
275
+ return ((_a = domain.sources) !== null && _a !== void 0 ? _a : []).map(function (source, idx) {
276
+ return (react_1.default.createElement(chart_range_input_1.ChartRangeInput, { key: "".concat(values.chartId, "-domains-").concat(domainsList.length, "-").concat(i, "-").concat(idx), sheetId: sheetId, range: source, onChangeRange: function (range) {
196
277
  setFieldValue("spec.domains[".concat(i, "].sources[").concat(idx, "]"), range);
197
278
  }, required: true, placeholder: "Select a range", className: "mb-0" }));
198
279
  });
199
280
  })),
200
- react_1.default.createElement("label", { className: "font-system text-sm flex items-center gap-1 pb-2" },
201
- react_1.default.createElement("input", { type: "checkbox", checked: isAggregateType, name: "showColumnStripes", onChange: function (e) {
202
- var nextSeries = basicSpec.series.map(function (serie) { return (tslib_1.__assign(tslib_1.__assign({}, serie), { aggregateType: e.target.checked ? "SUM" : undefined })); });
203
- setFieldValue("spec.series", nextSeries);
204
- } }),
205
- "Aggregate"),
206
- react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
207
- react_1.default.createElement("label", { className: "font-system text-sm" }, "Legend entries (series)"),
208
- basicSpec.series.map(function (domain, i) {
209
- return domain.sources.map(function (source, idx) {
210
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r;
211
- return (react_1.default.createElement("div", { className: "border border-rnc-border border-solid p-2 relative", key: "".concat(values.chartId, "-series-").concat(basicSpec.series.length, "-").concat(i, "-").concat(idx) },
212
- react_1.default.createElement("div", { className: "flex gap-2 " },
213
- react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
214
- react_1.default.createElement("label", { className: "font-system text-sm" }, "Name"),
215
- react_1.default.createElement(ui_1.Input, { value: (_a = domain.dataLabel) !== null && _a !== void 0 ? _a : "", type: "text", name: "fromValue", onChange: function (e) {
216
- return setFieldValue("spec.series[".concat(i, "].dataLabel"), e.target.value);
217
- }, className: "text-xs", placeholder: "Enter value" })),
218
- react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 flex-1" },
219
- react_1.default.createElement("label", { className: "font-system text-sm" }, "Y values"),
220
- react_1.default.createElement(chart_range_input_1.ChartRangeInput, { sheetId: sheetId, range: source, onChangeRange: function (range) {
221
- setFieldValue("spec.series[".concat(i, "].sources[").concat(idx, "]"), range);
222
- }, required: true, placeholder: "Select a range", className: "mb-0" })),
223
- react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2 w-20" },
224
- react_1.default.createElement("label", { className: "font-system text-sm" }, "Color"),
225
- react_1.default.createElement("div", { className: "flex items-center gap-1" },
226
- react_1.default.createElement("input", { type: "color", value: (_b = domain.color) !== null && _b !== void 0 ? _b : "#4285F4", onChange: function (e) {
227
- return setFieldValue("spec.series[".concat(i, "].color"), e.target.value);
228
- }, className: "h-6 w-8 p-0 border border-rnc-border rounded-sm bg-transparent cursor-pointer", "aria-label": "Series color" }),
229
- domain.color ? (react_1.default.createElement(ui_1.IconButton, { type: "button", onClick: function () {
230
- return setFieldValue("spec.series[".concat(i, "].color"), undefined);
231
- }, "aria-label": "Clear series color" },
232
- react_1.default.createElement(icons_1.CrossCircledIcon, null))) : null)),
233
- isAggregateType ? (react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2 w-32" },
234
- react_1.default.createElement("label", { className: "font-system text-sm" }, "Aggregate type"),
235
- react_1.default.createElement("select", { className: "border border-rnc-border rounded-sm px-1 py-1 text-xs bg-transparent", value: (_c = domain.aggregateType) !== null && _c !== void 0 ? _c : "", onChange: function (event) {
236
- var aggregateType = event.target.value;
237
- setFieldValue("spec.series[".concat(i, "].aggregateType"), aggregateType || undefined);
238
- } },
239
- react_1.default.createElement("option", { value: "" }, "None"),
240
- AGGREGATE_OPTIONS.map(function (option) { return (react_1.default.createElement("option", { key: option.value, value: option.value }, option.label)); })))) : null,
241
- basicSpec.chartType === "combo" ? (react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2 w-32" },
242
- react_1.default.createElement("label", { className: "font-system text-sm" }, "Series type"),
243
- react_1.default.createElement("select", { className: "border border-rnc-border rounded-sm px-1 py-1 text-xs bg-transparent", value: (_d = domain.seriesChartType) !== null && _d !== void 0 ? _d : "bar", onChange: function (event) {
244
- setFieldValue("spec.series[".concat(i, "].seriesChartType"), event.target.value || undefined);
245
- } },
246
- react_1.default.createElement("option", { value: "bar" }, "Bar"),
247
- react_1.default.createElement("option", { value: "column" }, "Column"),
248
- react_1.default.createElement("option", { value: "line" }, "Line"),
249
- react_1.default.createElement("option", { value: "area" }, "Area")))) : null),
250
- basicSpec.chartType !== "pie" &&
251
- basicSpec.chartType !== "doughnut" &&
252
- basicSpec.chartType !== "radar" &&
253
- basicSpec.chartType !== "stock" ? (react_1.default.createElement("details", { className: "mt-2 group/fmt" },
254
- react_1.default.createElement("summary", { className: "cursor-pointer list-none py-1 font-system text-xs text-rnc-muted-foreground select-none [&::-webkit-details-marker]:hidden flex items-center gap-1" },
255
- react_1.default.createElement(icons_1.ChevronRightIcon, { className: "transition-transform group-open/fmt:rotate-90" }),
256
- "Format"),
257
- react_1.default.createElement("div", { className: "flex flex-col gap-2 pt-2 border border-rnc-border border-solid mt-2" },
258
- react_1.default.createElement("label", { className: "font-system text-sm flex items-center gap-1" },
259
- react_1.default.createElement("input", { type: "checkbox", checked: !!domain.useSecondaryAxis, onChange: function (e) {
260
- return setFieldValue("spec.series[".concat(i, "].useSecondaryAxis"), e.target.checked || undefined);
261
- } }),
262
- "Plot on secondary axis"),
263
- react_1.default.createElement("div", { className: "flex items-center gap-2" },
264
- react_1.default.createElement("label", { className: "font-system text-sm flex items-center gap-1" },
265
- react_1.default.createElement("input", { type: "checkbox", checked: ((_f = (_e = domain.trendlines) === null || _e === void 0 ? void 0 : _e.length) !== null && _f !== void 0 ? _f : 0) > 0, onChange: function (e) {
266
- var _a, _b;
267
- return setFieldValue("spec.series[".concat(i, "].trendlines"), e.target.checked
268
- ? [
269
- (_b = (_a = domain.trendlines) === null || _a === void 0 ? void 0 : _a[0]) !== null && _b !== void 0 ? _b : {
270
- type: "linear",
271
- },
272
- ]
273
- : undefined);
274
- } }),
275
- "Trendline"),
276
- ((_h = (_g = domain.trendlines) === null || _g === void 0 ? void 0 : _g.length) !== null && _h !== void 0 ? _h : 0) > 0 ? (react_1.default.createElement("select", { className: "border border-rnc-border rounded-sm px-1 py-1 text-xs bg-transparent", value: (_l = (_k = (_j = domain.trendlines) === null || _j === void 0 ? void 0 : _j[0]) === null || _k === void 0 ? void 0 : _k.type) !== null && _l !== void 0 ? _l : "linear", onChange: function (event) {
277
- var _a, _b, _c, _d, _e;
278
- return setFieldValue("spec.series[".concat(i, "].trendlines[0]"), tslib_1.__assign(tslib_1.__assign(tslib_1.__assign({}, ((_b = (_a = domain.trendlines) === null || _a === void 0 ? void 0 : _a[0]) !== null && _b !== void 0 ? _b : {})), { type: event.target.value }), (event.target.value === "poly"
279
- ? {
280
- order: (_e = (_d = (_c = domain.trendlines) === null || _c === void 0 ? void 0 : _c[0]) === null || _d === void 0 ? void 0 : _d.order) !== null && _e !== void 0 ? _e : 2,
281
- }
282
- : {})));
283
- } },
284
- react_1.default.createElement("option", { value: "linear" }, "Linear"),
285
- react_1.default.createElement("option", { value: "poly" }, "Polynomial"),
286
- react_1.default.createElement("option", { value: "exp" }, "Exponential"),
287
- react_1.default.createElement("option", { value: "log" }, "Logarithmic"))) : null),
288
- react_1.default.createElement("div", { className: "flex items-center gap-2 flex-wrap" },
289
- react_1.default.createElement("label", { className: "font-system text-sm flex items-center gap-1" },
290
- react_1.default.createElement("input", { type: "checkbox", checked: !!domain.errorBars, onChange: function (e) {
291
- var _a;
292
- return setFieldValue("spec.series[".concat(i, "].errorBars"), e.target.checked
293
- ? (_a = domain.errorBars) !== null && _a !== void 0 ? _a : {
294
- valueType: "percentage",
295
- value: 5,
296
- }
297
- : undefined);
298
- } }),
299
- "Error bars"),
300
- domain.errorBars ? (react_1.default.createElement(react_1.default.Fragment, null,
301
- react_1.default.createElement("select", { className: "border border-rnc-border rounded-sm px-1 py-1 text-xs bg-transparent", value: (_o = (_m = domain.errorBars) === null || _m === void 0 ? void 0 : _m.valueType) !== null && _o !== void 0 ? _o : "percentage", onChange: function (event) {
302
- var _a;
303
- return setFieldValue("spec.series[".concat(i, "].errorBars"), tslib_1.__assign(tslib_1.__assign({}, ((_a = domain.errorBars) !== null && _a !== void 0 ? _a : {})), { valueType: event.target.value }));
304
- } },
305
- react_1.default.createElement("option", { value: "fixedVal" }, "Fixed"),
306
- react_1.default.createElement("option", { value: "percentage" }, "Percentage"),
307
- react_1.default.createElement("option", { value: "stdDev" }, "Std deviation"),
308
- react_1.default.createElement("option", { value: "stdErr" }, "Std error")),
309
- ((_p = domain.errorBars) === null || _p === void 0 ? void 0 : _p.valueType) !==
310
- "stdErr" ? (react_1.default.createElement(ui_1.Input, { type: "number", value: (_r = (_q = domain.errorBars) === null || _q === void 0 ? void 0 : _q.value) !== null && _r !== void 0 ? _r : "", onChange: function (e) {
311
- var _a;
312
- return setFieldValue("spec.series[".concat(i, "].errorBars"), tslib_1.__assign(tslib_1.__assign({}, ((_a = domain.errorBars) !== null && _a !== void 0 ? _a : {})), { value: e.target.value === ""
313
- ? undefined
314
- : Number(e.target.value) }));
315
- }, className: "text-xs w-20", placeholder: "Value" })) : null)) : null),
316
- react_1.default.createElement("label", { className: "font-system text-sm flex items-center gap-1" },
317
- react_1.default.createElement("input", { type: "checkbox", checked: !!domain.gradient, onChange: function (e) {
318
- var _a, _b;
319
- return setFieldValue("spec.series[".concat(i, "].gradient"), e.target.checked
320
- ? (_a = domain.gradient) !== null && _a !== void 0 ? _a : {
321
- type: "linear",
322
- degree: 90,
323
- stops: [
324
- {
325
- position: 0,
326
- color: (_b = domain.color) !== null && _b !== void 0 ? _b : "#4285F4",
327
- },
328
- {
329
- position: 1,
330
- color: "#FFFFFF",
331
- },
332
- ],
333
- }
334
- : undefined);
335
- } }),
336
- "Gradient fill")))) : null,
337
- react_1.default.createElement(ui_1.IconButton, { className: "absolute right-1 top-1", type: "button", onClick: function () {
338
- var currentSeries = basicSpec.series;
339
- setFieldValue("spec.series", currentSeries.filter(function (_, seriesIndex) { return seriesIndex !== i; }));
340
- } },
341
- react_1.default.createElement(icons_1.CrossCircledIcon, null))));
342
- });
343
- }),
344
- react_1.default.createElement("div", { className: "py-1" },
345
- react_1.default.createElement(ui_1.Button, { variant: "link", onClick: function () {
346
- var nextSeries = basicSpec.series;
347
- var lastSeries = nextSeries[nextSeries.length - 1];
348
- setFieldValue("spec.series", tslib_1.__spreadArray(tslib_1.__spreadArray([], tslib_1.__read(nextSeries), false), [
349
- {
350
- sources: lastSeries
351
- ? lastSeries.sources
352
- : values.spec.dataRange
353
- ? [values.spec.dataRange]
354
- : [],
355
- },
356
- ], false));
357
- }, type: "button", className: "cursor-pointer" }, "Add series"))))) : null,
281
+ caps.hasCategoryLevels ? (react_1.default.createElement("details", { className: "pb-2" },
282
+ react_1.default.createElement("summary", { className: "cursor-pointer list-none font-system text-xs text-rnc-muted-foreground select-none [&::-webkit-details-marker]:hidden" },
283
+ "Category axis levels",
284
+ categoryLevels.length ? " (".concat(categoryLevels.length, ")") : ""),
285
+ renderChartDataSection("Category axis levels", "categoryLevels", categoryLevels, "One range per level, outermost first; the last level is the plotted categories.", { addLabel: "Add level", removeLabel: "Remove level" }))) : null)) : null,
358
286
  bubbleSpec ? (react_1.default.createElement(react_1.default.Fragment, null,
359
- react_1.default.createElement("label", { className: "font-system text-sm flex items-center gap-1 pb-2" },
360
- react_1.default.createElement("input", { type: "checkbox", checked: bubbleAggregateEnabled, onChange: function (e) {
361
- var nextSeries = bubbleSpec.series.map(function (serie) { return (tslib_1.__assign(tslib_1.__assign({}, serie), { aggregateType: e.target.checked ? "SUM" : undefined })); });
362
- setFieldValue("spec.series", nextSeries);
363
- } }),
364
- "Aggregate"),
365
287
  react_1.default.createElement("label", { className: "font-system text-sm flex items-center gap-1 pb-2" },
366
288
  react_1.default.createElement("input", { type: "checkbox", checked: bubbleSpec.useFirstRowAsHeaders !== false, onChange: function (e) {
367
289
  return setFieldValue("spec.useFirstRowAsHeaders", e.target.checked);
368
290
  } }),
369
291
  "Use first row as headers"),
370
292
  bubbleSpec.chartType === "bubble"
371
- ? renderChartDataSection("Bubble labels", "bubbleLabels", (_f = bubbleSpec.bubbleLabels) !== null && _f !== void 0 ? _f : [], "Select the cells containing labels for each bubble.")
293
+ ? renderChartDataSection("Bubble labels", "bubbleLabels", (_k = bubbleSpec.bubbleLabels) !== null && _k !== void 0 ? _k : [], "Select the cells containing labels for each bubble.")
372
294
  : null,
373
- renderChartDataSection("X values", "domains", (_g = bubbleSpec.domains) !== null && _g !== void 0 ? _g : [], "Choose the numeric values for the horizontal axis."),
374
- react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-2 pb-2" },
375
- react_1.default.createElement("label", { className: "font-system text-sm" }, "Legend entries (series)"),
376
- bubbleSpec.series.map(function (seriesEntry, i) {
377
- var sources = seriesEntry.sources.length > 0
378
- ? seriesEntry.sources
379
- : [undefined];
380
- return sources.map(function (source, idx) {
381
- var _a, _b, _c, _d, _e, _f;
382
- return (react_1.default.createElement("div", { className: "border border-rnc-border border-solid p-2 relative", key: "".concat(values.chartId, "-bubble-series-").concat(bubbleSpec.series.length, "-").concat(i, "-").concat(idx) },
383
- react_1.default.createElement("div", { className: "flex gap-2 items-start" },
384
- react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
385
- react_1.default.createElement("label", { className: "font-system text-sm" }, "Name"),
386
- react_1.default.createElement(ui_1.Input, { value: (_a = seriesEntry.dataLabel) !== null && _a !== void 0 ? _a : "", type: "text", onChange: function (e) {
387
- return setFieldValue("spec.series[".concat(i, "].dataLabel"), e.target.value);
388
- }, className: "text-xs", placeholder: "Enter label" })),
389
- react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 flex-1" },
390
- react_1.default.createElement("label", { className: "font-system text-sm" }, "Y values"),
391
- react_1.default.createElement(chart_range_input_1.ChartRangeInput, { sheetId: sheetId, range: source, onChangeRange: function (range) {
392
- setFieldValue("spec.series[".concat(i, "].sources[").concat(idx, "]"), range);
393
- }, required: true, placeholder: "Select a range", className: "mb-0 flex-1" })),
394
- bubbleSpec.chartType === "scatter" ? (react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2 w-24" },
395
- react_1.default.createElement("label", { className: "font-system text-sm" }, "Marker"),
396
- react_1.default.createElement("select", { className: "border border-rnc-border rounded-sm px-1 py-1 text-xs bg-transparent", value: (_c = (_b = seriesEntry.marker) === null || _b === void 0 ? void 0 : _b.symbol) !== null && _c !== void 0 ? _c : "", onChange: function (event) {
397
- var _a;
398
- return setFieldValue("spec.series[".concat(i, "].marker"), tslib_1.__assign(tslib_1.__assign({}, ((_a = seriesEntry.marker) !== null && _a !== void 0 ? _a : {})), { symbol: event.target.value || undefined }));
399
- } },
400
- react_1.default.createElement("option", { value: "" }, "Auto"),
401
- react_1.default.createElement("option", { value: "circle" }, "Circle"),
402
- react_1.default.createElement("option", { value: "square" }, "Square"),
403
- react_1.default.createElement("option", { value: "diamond" }, "Diamond"),
404
- react_1.default.createElement("option", { value: "triangle" }, "Triangle"),
405
- react_1.default.createElement("option", { value: "x" }, "X"),
406
- react_1.default.createElement("option", { value: "plus" }, "Plus"),
407
- react_1.default.createElement("option", { value: "star" }, "Star"),
408
- react_1.default.createElement("option", { value: "none" }, "None")),
409
- react_1.default.createElement("label", { className: "font-system text-xs" }, "Marker size"),
410
- react_1.default.createElement(ui_1.Input, { type: "number", min: 1, value: (_e = (_d = seriesEntry.marker) === null || _d === void 0 ? void 0 : _d.size) !== null && _e !== void 0 ? _e : "", onChange: function (e) {
411
- var _a;
412
- return setFieldValue("spec.series[".concat(i, "].marker"), tslib_1.__assign(tslib_1.__assign({}, ((_a = seriesEntry.marker) !== null && _a !== void 0 ? _a : {})), { size: e.target.value === ""
413
- ? undefined
414
- : Number(e.target.value) }));
415
- }, className: "text-xs", placeholder: "6" }))) : null,
416
- bubbleAggregateEnabled ? (react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2 w-32" },
417
- react_1.default.createElement("label", { className: "font-system text-sm" }, "Aggregate type"),
418
- react_1.default.createElement("select", { className: "border border-rnc-border rounded-sm px-1 py-1 text-xs bg-transparent", value: (_f = seriesEntry.aggregateType) !== null && _f !== void 0 ? _f : "", onChange: function (event) {
419
- var aggregateType = event.target.value;
420
- setFieldValue("spec.series[".concat(i, "].aggregateType"), aggregateType || undefined);
421
- } },
422
- react_1.default.createElement("option", { value: "" }, "None"),
423
- AGGREGATE_OPTIONS.map(function (option) { return (react_1.default.createElement("option", { key: option.value, value: option.value }, option.label)); })))) : null),
424
- react_1.default.createElement(ui_1.IconButton, { className: "absolute right-1 top-1", type: "button", onClick: function () {
425
- var currentSeries = bubbleSpec.series;
426
- setFieldValue("spec.series", currentSeries.filter(function (_, index) { return index !== i; }));
427
- } },
428
- react_1.default.createElement(icons_1.CrossCircledIcon, null))));
429
- });
430
- }),
431
- react_1.default.createElement("div", { className: "py-1" },
432
- react_1.default.createElement(ui_1.Button, { variant: "link", type: "button", onClick: function () {
433
- var nextSeries = bubbleSpec.series;
434
- var lastSeries = nextSeries[nextSeries.length - 1];
435
- setFieldValue("spec.series", tslib_1.__spreadArray(tslib_1.__spreadArray([], tslib_1.__read(nextSeries), false), [
436
- {
437
- sources: lastSeries
438
- ? lastSeries.sources
439
- : values.spec.dataRange
440
- ? [values.spec.dataRange]
441
- : [],
442
- },
443
- ], false));
444
- }, className: "cursor-pointer" }, "Add series"))))) : null,
295
+ renderChartDataSection("X values", "domains", domainsList, "Choose the numeric values for the horizontal axis."),
296
+ bubbleSpec.chartType === "bubble"
297
+ ? renderChartDataSection("Bubble sizes", "bubbleSizes", (_l = bubbleSpec.bubbleSizes) !== null && _l !== void 0 ? _l : [], "Choose the numeric values that size each bubble.")
298
+ : null)) : null,
299
+ basicSpec || bubbleSpec ? (react_1.default.createElement(react_1.default.Fragment, null,
300
+ react_1.default.createElement("label", { className: "font-system text-sm flex items-center gap-1 pb-2" },
301
+ react_1.default.createElement("input", { type: "checkbox", checked: isAggregateType, name: "showColumnStripes", onChange: function (e) {
302
+ var nextSeries = seriesList.map(function (serie) { return (tslib_1.__assign(tslib_1.__assign({}, serie), { aggregateType: e.target.checked ? "SUM" : undefined })); });
303
+ setFieldValue("spec.series", nextSeries);
304
+ } }),
305
+ "Aggregate"),
306
+ renderSeriesList())) : null,
445
307
  treemapSpec ? (react_1.default.createElement(react_1.default.Fragment, null,
446
308
  react_1.default.createElement("label", { className: "font-system text-sm flex items-center gap-1 pb-2" },
447
309
  react_1.default.createElement("input", { type: "checkbox", checked: treemapSpec.useFirstRowAsHeaders !== false, onChange: function (e) {
448
310
  return setFieldValue("spec.useFirstRowAsHeaders", e.target.checked);
449
311
  } }),
450
312
  "Use first row as headers"),
451
- renderChartDataSection("Labels", "labels", (_h = treemapSpec.labels) !== null && _h !== void 0 ? _h : [], "Select the cells that contain node labels."),
452
- renderChartDataSection("Parent labels", "parentLabels", (_j = treemapSpec.parentLabels) !== null && _j !== void 0 ? _j : [], "Choose the cells that define each node's parent label."),
453
- renderChartDataSection("Size data", "sizeData", (_k = treemapSpec.sizeData) !== null && _k !== void 0 ? _k : [], "Provide numeric values to determine each node's size."))) : null,
454
- basicSpec ? (react_1.default.createElement(react_1.default.Fragment, null,
313
+ renderChartDataSection("Labels", "labels", (_m = treemapSpec.labels) !== null && _m !== void 0 ? _m : [], "Select the cells that contain node labels."),
314
+ renderChartDataSection("Parent labels", "parentLabels", (_o = treemapSpec.parentLabels) !== null && _o !== void 0 ? _o : [], "One range per level above the labels, top level first.", { addLabel: "Add level", removeLabel: "Remove level" }),
315
+ renderChartDataSection("Size data", "sizeData", (_p = treemapSpec.sizeData) !== null && _p !== void 0 ? _p : [], "Provide numeric values to determine each node's size."))) : null,
316
+ caps.hasEmptyCellOptions ? (react_1.default.createElement(react_1.default.Fragment, null,
455
317
  react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2 w-56" },
456
318
  react_1.default.createElement("label", { className: "font-system text-sm" }, "Show empty cells as"),
457
- react_1.default.createElement("select", { className: "border border-rnc-border rounded-sm px-1 py-1 text-xs bg-transparent", "aria-label": "Show empty cells as", value: (_l = values.spec.emptyCells) !== null && _l !== void 0 ? _l : "gaps", onChange: function (event) {
319
+ react_1.default.createElement("select", { className: "border border-rnc-border rounded-sm px-1 py-1 text-xs bg-transparent", "aria-label": "Show empty cells as", value: (_q = values.spec.emptyCells) !== null && _q !== void 0 ? _q : "gaps", onChange: function (event) {
458
320
  var emptyCells = event.target.value;
459
321
  setFieldValue("spec.emptyCells", emptyCells === "gaps" ? undefined : emptyCells);
460
322
  } },
@@ -477,7 +339,10 @@ var ChartEditor = function (_a) {
477
339
  react_1.default.createElement(Section, { title: "Chart style", defaultOpen: true },
478
340
  react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
479
341
  react_1.default.createElement("label", { className: "font-system text-sm" }, "Chart title"),
480
- react_1.default.createElement(ui_1.Input, { value: (_m = values === null || values === void 0 ? void 0 : values.spec.title) !== null && _m !== void 0 ? _m : "", type: "text", onChange: function (e) { return setFieldValue("spec.title", e.target.value); }, className: "text-xs", placeholder: "Enter chart title" })),
342
+ react_1.default.createElement(ui_1.Input, { value: (_r = values === null || values === void 0 ? void 0 : values.spec.title) !== null && _r !== void 0 ? _r : "", type: "text", onChange: function (e) { return setFieldValue("spec.title", e.target.value); }, className: "text-xs", placeholder: "Enter chart title" })),
343
+ react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
344
+ react_1.default.createElement("label", { className: "font-system text-sm" }, "Subtitle"),
345
+ react_1.default.createElement(ui_1.Input, { value: (_s = values.spec.subtitle) !== null && _s !== void 0 ? _s : "", type: "text", onChange: function (e) { return setFieldValue("spec.subtitle", e.target.value || undefined); }, className: "text-xs", placeholder: "Enter chart subtitle", "aria-label": "Chart subtitle" })),
481
346
  react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
482
347
  react_1.default.createElement("label", { className: "font-system text-sm" }, "Style"),
483
348
  react_1.default.createElement("div", { className: "grid grid-cols-4 gap-1", role: "radiogroup" }, chart_styles_1.CHART_STYLES.map(function (style) {
@@ -506,7 +371,7 @@ var ChartEditor = function (_a) {
506
371
  }))),
507
372
  react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
508
373
  react_1.default.createElement("label", { className: "font-system text-sm" }, "Quick layout"),
509
- react_1.default.createElement("select", { className: "border border-rnc-border rounded-sm px-1 py-1 text-xs bg-transparent w-32", value: (_o = values.spec.quickLayout) !== null && _o !== void 0 ? _o : "", "aria-label": "Quick layout", onChange: function (e) {
374
+ react_1.default.createElement("select", { className: "border border-rnc-border rounded-sm px-1 py-1 text-xs bg-transparent w-32", value: (_t = values.spec.quickLayout) !== null && _t !== void 0 ? _t : "", "aria-label": "Quick layout", onChange: function (e) {
510
375
  var layout = chart_styles_1.CHART_QUICK_LAYOUTS.find(function (entry) { return String(entry.id) === e.target.value; });
511
376
  if (layout) {
512
377
  setFieldValue("spec", (0, chart_styles_1.applyChartQuickLayout)(values.spec, layout));
@@ -518,33 +383,14 @@ var ChartEditor = function (_a) {
518
383
  react_1.default.createElement(ui_1.Button, { type: "button", size: "xs", onClick: function () {
519
384
  return setFieldValue("spec", (0, chart_styles_1.resetChartToMatchStyle)(values.spec));
520
385
  } }, "Reset to match style")),
521
- react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
522
- react_1.default.createElement("label", { className: "font-system text-sm" }, "Title font"),
523
- react_1.default.createElement("div", { className: "flex items-center gap-1 flex-wrap" },
524
- react_1.default.createElement(ui_1.Input, { value: (_q = (_p = values.spec.titleTextFormat) === null || _p === void 0 ? void 0 : _p.fontFamily) !== null && _q !== void 0 ? _q : "", type: "text", onChange: function (e) {
525
- return setFieldValue("spec.titleTextFormat.fontFamily", e.target.value || undefined);
526
- }, className: "text-xs w-32", placeholder: "Font family", "aria-label": "Title font family" }),
527
- react_1.default.createElement(ui_1.Input, { value: (_s = (_r = values.spec.titleTextFormat) === null || _r === void 0 ? void 0 : _r.fontSize) !== null && _s !== void 0 ? _s : "", type: "number", min: 1, onChange: function (e) {
528
- return setFieldValue("spec.titleTextFormat.fontSize", e.target.value === "" ? undefined : Number(e.target.value));
529
- }, className: "text-xs w-16", placeholder: "Size", "aria-label": "Title font size" }),
530
- react_1.default.createElement("input", { type: "color", value: (_u = (_t = values.spec.titleTextFormat) === null || _t === void 0 ? void 0 : _t.color) !== null && _u !== void 0 ? _u : "#000000", onChange: function (e) {
531
- return setFieldValue("spec.titleTextFormat.color", e.target.value);
532
- }, className: "h-6 w-8 p-0 border border-rnc-border rounded-sm bg-transparent cursor-pointer", "aria-label": "Title color" }),
533
- react_1.default.createElement("label", { className: "font-system text-xs flex items-center gap-1" },
534
- react_1.default.createElement("input", { type: "checkbox", checked: Boolean((_v = values.spec.titleTextFormat) === null || _v === void 0 ? void 0 : _v.bold), onChange: function (e) {
535
- return setFieldValue("spec.titleTextFormat.bold", e.target.checked);
536
- } }),
537
- "Bold"),
538
- react_1.default.createElement("label", { className: "font-system text-xs flex items-center gap-1" },
539
- react_1.default.createElement("input", { type: "checkbox", checked: Boolean((_w = values.spec.titleTextFormat) === null || _w === void 0 ? void 0 : _w.italic), onChange: function (e) {
540
- return setFieldValue("spec.titleTextFormat.italic", e.target.checked);
541
- } }),
542
- "Italic")))),
386
+ react_1.default.createElement(text_format_fields_1.TextFormatFields, { label: "Title font", value: values.spec.titleTextFormat, onChange: function (titleTextFormat) {
387
+ return setFieldValue("spec.titleTextFormat", titleTextFormat);
388
+ }, ariaLabels: { color: "Title color" } })),
543
389
  react_1.default.createElement(Section, { title: "Chart area" },
544
390
  react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
545
391
  react_1.default.createElement("label", { className: "font-system text-sm" }, "Fill"),
546
392
  react_1.default.createElement("div", { className: "flex items-center gap-1" },
547
- react_1.default.createElement("input", { type: "color", value: (_x = values.spec.backgroundColor) !== null && _x !== void 0 ? _x : "#FFFFFF", onChange: function (e) {
393
+ react_1.default.createElement("input", { type: "color", value: (_u = values.spec.backgroundColor) !== null && _u !== void 0 ? _u : "#FFFFFF", onChange: function (e) {
548
394
  return setFieldValue("spec.backgroundColor", e.target.value);
549
395
  }, className: "h-6 w-8 p-0 border border-rnc-border rounded-sm bg-transparent cursor-pointer", "aria-label": "Chart area fill" }),
550
396
  values.spec.backgroundColor ? (react_1.default.createElement(ui_1.IconButton, { type: "button", onClick: function () {
@@ -554,7 +400,7 @@ var ChartEditor = function (_a) {
554
400
  react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
555
401
  react_1.default.createElement("label", { className: "font-system text-sm" }, "Border"),
556
402
  react_1.default.createElement("div", { className: "flex items-center gap-1" },
557
- react_1.default.createElement("input", { type: "color", value: (_y = values.borderColor) !== null && _y !== void 0 ? _y : "#D9D9D9", onChange: function (e) { return setFieldValue("borderColor", e.target.value); }, className: "h-6 w-8 p-0 border border-rnc-border rounded-sm bg-transparent cursor-pointer", "aria-label": "Chart area border" }),
403
+ react_1.default.createElement("input", { type: "color", value: (_v = values.borderColor) !== null && _v !== void 0 ? _v : "#D9D9D9", onChange: function (e) { return setFieldValue("borderColor", e.target.value); }, className: "h-6 w-8 p-0 border border-rnc-border rounded-sm bg-transparent cursor-pointer", "aria-label": "Chart area border" }),
558
404
  values.borderColor ? (react_1.default.createElement(ui_1.IconButton, { type: "button", onClick: function () { return setFieldValue("borderColor", undefined); }, "aria-label": "No border", title: "No border" },
559
405
  react_1.default.createElement(icons_1.CrossCircledIcon, null))) : (react_1.default.createElement("span", { className: "font-system text-xs text-rnc-text-weak" }, "None")))),
560
406
  react_1.default.createElement("label", { className: "font-system text-sm flex items-center gap-1" },
@@ -562,226 +408,46 @@ var ChartEditor = function (_a) {
562
408
  return setFieldValue("spec.roundedCorners", e.target.checked);
563
409
  } }),
564
410
  "Rounded corners")),
565
- basicSpec ? (react_1.default.createElement(react_1.default.Fragment, null,
566
- react_1.default.createElement(Section, { title: "Legend" },
567
- react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
568
- react_1.default.createElement("label", { className: "font-system text-sm" }, "Legend"),
569
- react_1.default.createElement("select", { className: "border border-rnc-border rounded-sm px-1 py-1 text-xs bg-transparent w-32", value: (_0 = (_z = values === null || values === void 0 ? void 0 : values.spec.legend) === null || _z === void 0 ? void 0 : _z.position) !== null && _0 !== void 0 ? _0 : "", onChange: function (e) {
570
- return setFieldValue("spec.legend.position", e.target.value || undefined);
571
- } },
572
- react_1.default.createElement("option", { value: "" }, "Auto"),
573
- react_1.default.createElement("option", { value: "top" }, "Top"),
574
- react_1.default.createElement("option", { value: "bottom" }, "Bottom"),
575
- react_1.default.createElement("option", { value: "left" }, "Left"),
576
- react_1.default.createElement("option", { value: "right" }, "Right"),
577
- react_1.default.createElement("option", { value: "none" }, "None")))),
578
- react_1.default.createElement(Section, { title: "Vertical axis" },
579
- react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
580
- react_1.default.createElement("label", { className: "font-system text-sm" }, "Vertical axis title"),
581
- react_1.default.createElement(ui_1.Input, { value: (_1 = values === null || values === void 0 ? void 0 : values.spec.verticalAxisTitle) !== null && _1 !== void 0 ? _1 : "", type: "text", onChange: function (e) {
582
- return setFieldValue("spec.verticalAxisTitle", e.target.value);
583
- }, className: "text-xs", placeholder: "Vertical axis title" })),
584
- isCartesianBasic ? (react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-2 pb-2" },
585
- react_1.default.createElement("label", { className: "font-system text-sm" }, "Value axis"),
586
- react_1.default.createElement("div", { className: "flex flex-wrap gap-2 items-end" },
587
- react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 w-20" },
588
- react_1.default.createElement("label", { className: "font-system text-xs" }, "Min"),
589
- react_1.default.createElement(ui_1.Input, { type: "number", value: (_3 = (_2 = values === null || values === void 0 ? void 0 : values.spec.valueAxisOptions) === null || _2 === void 0 ? void 0 : _2.min) !== null && _3 !== void 0 ? _3 : "", onChange: function (e) {
590
- return setFieldValue("spec.valueAxisOptions.min", e.target.value === ""
591
- ? undefined
592
- : Number(e.target.value));
593
- }, className: "text-xs", placeholder: "Auto" })),
594
- react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 w-20" },
595
- react_1.default.createElement("label", { className: "font-system text-xs" }, "Max"),
596
- react_1.default.createElement(ui_1.Input, { type: "number", value: (_5 = (_4 = values === null || values === void 0 ? void 0 : values.spec.valueAxisOptions) === null || _4 === void 0 ? void 0 : _4.max) !== null && _5 !== void 0 ? _5 : "", onChange: function (e) {
597
- return setFieldValue("spec.valueAxisOptions.max", e.target.value === ""
598
- ? undefined
599
- : Number(e.target.value));
600
- }, className: "text-xs", placeholder: "Auto" }))),
601
- react_1.default.createElement("label", { className: "font-system text-xs flex items-center gap-1" },
602
- react_1.default.createElement("input", { type: "checkbox", checked: Boolean((_6 = values === null || values === void 0 ? void 0 : values.spec.valueAxisOptions) === null || _6 === void 0 ? void 0 : _6.logarithmic), onChange: function (e) {
603
- return setFieldValue("spec.valueAxisOptions.logarithmic", e.target.checked || undefined);
604
- } }),
605
- "Logarithmic scale"),
606
- react_1.default.createElement("label", { className: "font-system text-xs flex items-center gap-1" },
607
- react_1.default.createElement("input", { type: "checkbox", checked: Boolean((_7 = values === null || values === void 0 ? void 0 : values.spec.valueAxisOptions) === null || _7 === void 0 ? void 0 : _7.reverse), onChange: function (e) {
608
- return setFieldValue("spec.valueAxisOptions.reverse", e.target.checked || undefined);
609
- } }),
610
- "Reverse direction"),
611
- react_1.default.createElement("label", { className: "font-system text-xs flex items-center gap-1" },
612
- react_1.default.createElement("input", { type: "checkbox", checked: ((_8 = values === null || values === void 0 ? void 0 : values.spec.valueAxisOptions) === null || _8 === void 0 ? void 0 : _8.showMajorGridlines) !==
613
- false, onChange: function (e) {
614
- return setFieldValue("spec.valueAxisOptions.showMajorGridlines", e.target.checked);
615
- } }),
616
- "Gridlines"),
617
- react_1.default.createElement("label", { className: "font-system text-xs" }, "Number format"),
618
- react_1.default.createElement(ui_1.Input, { value: (_10 = (_9 = values === null || values === void 0 ? void 0 : values.spec.valueAxisOptions) === null || _9 === void 0 ? void 0 : _9.numberFormatPattern) !== null && _10 !== void 0 ? _10 : "", type: "text", onChange: function (e) {
619
- return setFieldValue("spec.valueAxisOptions.numberFormatPattern", e.target.value || undefined);
620
- }, className: "text-xs w-32", placeholder: "Linked to source" }),
621
- basicSpec.series.some(function (s) { return s.useSecondaryAxis; }) ? (react_1.default.createElement(react_1.default.Fragment, null,
622
- react_1.default.createElement("label", { className: "font-system text-sm pt-1" }, "Secondary value axis"),
623
- react_1.default.createElement("div", { className: "flex flex-wrap gap-2 items-end" },
624
- react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 w-20" },
625
- react_1.default.createElement("label", { className: "font-system text-xs" }, "Min"),
626
- react_1.default.createElement(ui_1.Input, { type: "number", value: (_12 = (_11 = values === null || values === void 0 ? void 0 : values.spec.secondaryValueAxisOptions) === null || _11 === void 0 ? void 0 : _11.min) !== null && _12 !== void 0 ? _12 : "", onChange: function (e) {
627
- return setFieldValue("spec.secondaryValueAxisOptions.min", e.target.value === ""
628
- ? undefined
629
- : Number(e.target.value));
630
- }, className: "text-xs", placeholder: "Auto" })),
631
- react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 w-20" },
632
- react_1.default.createElement("label", { className: "font-system text-xs" }, "Max"),
633
- react_1.default.createElement(ui_1.Input, { type: "number", value: (_14 = (_13 = values === null || values === void 0 ? void 0 : values.spec.secondaryValueAxisOptions) === null || _13 === void 0 ? void 0 : _13.max) !== null && _14 !== void 0 ? _14 : "", onChange: function (e) {
634
- return setFieldValue("spec.secondaryValueAxisOptions.max", e.target.value === ""
635
- ? undefined
636
- : Number(e.target.value));
637
- }, className: "text-xs", placeholder: "Auto" }))),
638
- react_1.default.createElement("label", { className: "font-system text-xs flex items-center gap-1" },
639
- react_1.default.createElement("input", { type: "checkbox", checked: Boolean((_15 = values === null || values === void 0 ? void 0 : values.spec.secondaryValueAxisOptions) === null || _15 === void 0 ? void 0 : _15.logarithmic), onChange: function (e) {
640
- return setFieldValue("spec.secondaryValueAxisOptions.logarithmic", e.target.checked || undefined);
641
- } }),
642
- "Logarithmic scale"),
643
- react_1.default.createElement("label", { className: "font-system text-xs flex items-center gap-1" },
644
- react_1.default.createElement("input", { type: "checkbox", checked: ((_16 = values === null || values === void 0 ? void 0 : values.spec.secondaryValueAxisOptions) === null || _16 === void 0 ? void 0 : _16.showMajorGridlines) !== false, onChange: function (e) {
645
- return setFieldValue("spec.secondaryValueAxisOptions.showMajorGridlines", e.target.checked);
646
- } }),
647
- "Gridlines"),
648
- react_1.default.createElement("label", { className: "font-system text-xs" }, "Number format"),
649
- react_1.default.createElement(ui_1.Input, { value: (_18 = (_17 = values === null || values === void 0 ? void 0 : values.spec.secondaryValueAxisOptions) === null || _17 === void 0 ? void 0 : _17.numberFormatPattern) !== null && _18 !== void 0 ? _18 : "", type: "text", onChange: function (e) {
650
- return setFieldValue("spec.secondaryValueAxisOptions.numberFormatPattern", e.target.value || undefined);
651
- }, className: "text-xs w-32", placeholder: "Linked to source" }))) : null)) : null),
652
- react_1.default.createElement(Section, { title: "Horizontal axis" },
653
- react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
654
- react_1.default.createElement("label", { className: "font-system text-sm" }, "Horizontal axis title"),
655
- react_1.default.createElement(ui_1.Input, { value: (_19 = values === null || values === void 0 ? void 0 : values.spec.horizontalAxisTitle) !== null && _19 !== void 0 ? _19 : "", type: "text", onChange: function (e) {
656
- return setFieldValue("spec.horizontalAxisTitle", e.target.value);
657
- }, className: "text-xs", placeholder: "Horizontal axis title" })),
658
- isCartesianBasic ? (react_1.default.createElement(react_1.default.Fragment, null,
659
- react_1.default.createElement("label", { className: "font-system text-sm pt-1" }, "Category axis"),
660
- react_1.default.createElement("label", { className: "font-system text-xs flex items-center gap-1" },
661
- react_1.default.createElement("input", { type: "checkbox", checked: ((_20 = values === null || values === void 0 ? void 0 : values.spec.categoryAxisOptions) === null || _20 === void 0 ? void 0 : _20.showMajorGridlines) === true, onChange: function (e) {
662
- return setFieldValue("spec.categoryAxisOptions.showMajorGridlines", e.target.checked);
663
- } }),
664
- "Gridlines"))) : null),
665
- react_1.default.createElement(Section, { title: "Data labels" },
666
- react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
667
- react_1.default.createElement("label", { className: "font-system text-sm flex items-center gap-1" },
668
- react_1.default.createElement("input", { type: "checkbox", checked: Boolean((_21 = values === null || values === void 0 ? void 0 : values.spec.dataLabels) === null || _21 === void 0 ? void 0 : _21.show), onChange: function (e) {
669
- return setFieldValue("spec.dataLabels.show", e.target.checked);
670
- } }),
671
- "Show data labels"),
672
- ((_22 = values === null || values === void 0 ? void 0 : values.spec.dataLabels) === null || _22 === void 0 ? void 0 : _22.show) ? (react_1.default.createElement("div", { className: "pl-4 flex flex-col gap-1" },
673
- react_1.default.createElement("label", { className: "font-system text-xs flex items-center gap-1" },
674
- react_1.default.createElement("input", { type: "checkbox", checked: ((_23 = values === null || values === void 0 ? void 0 : values.spec.dataLabels) === null || _23 === void 0 ? void 0 : _23.showValue) !== false, onChange: function (e) {
675
- return setFieldValue("spec.dataLabels.showValue", e.target.checked);
676
- } }),
677
- "Value"),
678
- react_1.default.createElement("label", { className: "font-system text-xs flex items-center gap-1" },
679
- react_1.default.createElement("input", { type: "checkbox", checked: Boolean((_24 = values === null || values === void 0 ? void 0 : values.spec.dataLabels) === null || _24 === void 0 ? void 0 : _24.showCategoryName), onChange: function (e) {
680
- return setFieldValue("spec.dataLabels.showCategoryName", e.target.checked);
681
- } }),
682
- "Category name"),
683
- react_1.default.createElement("label", { className: "font-system text-xs flex items-center gap-1" },
684
- react_1.default.createElement("input", { type: "checkbox", checked: Boolean((_25 = values === null || values === void 0 ? void 0 : values.spec.dataLabels) === null || _25 === void 0 ? void 0 : _25.showSeriesName), onChange: function (e) {
685
- return setFieldValue("spec.dataLabels.showSeriesName", e.target.checked);
686
- } }),
687
- "Series name"),
688
- react_1.default.createElement("label", { className: "font-system text-xs flex items-center gap-1" },
689
- react_1.default.createElement("input", { type: "checkbox", checked: Boolean((_26 = values === null || values === void 0 ? void 0 : values.spec.dataLabels) === null || _26 === void 0 ? void 0 : _26.showPercent), onChange: function (e) {
690
- return setFieldValue("spec.dataLabels.showPercent", e.target.checked);
691
- } }),
692
- "Percentage"),
693
- react_1.default.createElement("label", { className: "font-system text-xs" }, "Label position"),
694
- react_1.default.createElement("select", { className: "border border-rnc-border rounded-sm px-1 py-1 text-xs bg-transparent w-32", value: (_28 = (_27 = values === null || values === void 0 ? void 0 : values.spec.dataLabels) === null || _27 === void 0 ? void 0 : _27.position) !== null && _28 !== void 0 ? _28 : "outside", onChange: function (e) {
695
- return setFieldValue("spec.dataLabels.position", e.target.value);
696
- } },
697
- react_1.default.createElement("option", { value: "center" }, "Center"),
698
- react_1.default.createElement("option", { value: "inside" }, "Inside"),
699
- react_1.default.createElement("option", { value: "outside" }, "Outside"),
700
- react_1.default.createElement("option", { value: "insideEnd" }, "Inside end"),
701
- react_1.default.createElement("option", { value: "outsideEnd" }, "Outside end"),
702
- react_1.default.createElement("option", { value: "bestFit" }, "Best fit"),
703
- react_1.default.createElement("option", { value: "above" }, "Above"),
704
- react_1.default.createElement("option", { value: "below" }, "Below"),
705
- react_1.default.createElement("option", { value: "left" }, "Left"),
706
- react_1.default.createElement("option", { value: "right" }, "Right")),
707
- react_1.default.createElement("label", { className: "font-system text-xs" }, "Number format pattern"),
708
- react_1.default.createElement(ui_1.Input, { value: (_30 = (_29 = values === null || values === void 0 ? void 0 : values.spec.dataLabels) === null || _29 === void 0 ? void 0 : _29.numberFormatPattern) !== null && _30 !== void 0 ? _30 : "", type: "text", onChange: function (e) {
709
- return setFieldValue("spec.dataLabels.numberFormatPattern", e.target.value || undefined);
710
- }, className: "text-xs w-32", placeholder: "#,##0.00" }))) : null)),
711
- basicSpec && showChartOptions ? (react_1.default.createElement(Section, { title: "Chart options" },
712
- chartOptionControls.binCount ? (react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
713
- react_1.default.createElement("label", { className: "font-system text-sm" }, "Bins (leave blank for auto)"),
714
- react_1.default.createElement(ui_1.Input, { value: (_31 = basicSpec.binCount) !== null && _31 !== void 0 ? _31 : "", type: "number", min: 1, onChange: function (e) {
715
- var raw = e.target.value;
716
- setFieldValue("spec.binCount", raw === "" ? undefined : Number(raw));
717
- }, className: "text-xs", placeholder: "Auto (Sturges)" }))) : null,
718
- chartOptionControls.radarStyle ? (react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
719
- react_1.default.createElement("label", { className: "font-system text-sm" }, "Radar style"),
720
- react_1.default.createElement("select", { className: "border border-rnc-border rounded-sm px-1 py-1 text-xs bg-transparent", value: (_32 = basicSpec.radarStyle) !== null && _32 !== void 0 ? _32 : "standard", onChange: function (e) {
721
- return setFieldValue("spec.radarStyle", e.target.value);
722
- } },
723
- react_1.default.createElement("option", { value: "standard" }, "Standard"),
724
- react_1.default.createElement("option", { value: "marker" }, "With markers"),
725
- react_1.default.createElement("option", { value: "filled" }, "Filled")))) : null,
726
- chartOptionControls.stockVariant ? (react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
727
- react_1.default.createElement("label", { className: "font-system text-sm" }, "Stock variant"),
728
- react_1.default.createElement("select", { className: "border border-rnc-border rounded-sm px-1 py-1 text-xs bg-transparent", value: (_33 = basicSpec.stockVariant) !== null && _33 !== void 0 ? _33 : "HLC", onChange: function (e) {
729
- return setFieldValue("spec.stockVariant", e.target.value);
730
- } },
731
- react_1.default.createElement("option", { value: "HLC" }, "High-Low-Close"),
732
- react_1.default.createElement("option", { value: "OHLC" }, "Open-High-Low-Close"),
733
- react_1.default.createElement("option", { value: "VHLC" }, "Volume-High-Low-Close"),
734
- react_1.default.createElement("option", { value: "VOHLC" }, "Volume-Open-High-Low-Close")))) : null,
735
- chartOptionControls.doughnutHoleSize ? (react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
736
- react_1.default.createElement("label", { className: "font-system text-sm" }, "Doughnut hole size (0-0.9)"),
737
- react_1.default.createElement(ui_1.Input, { type: "number", min: 0, max: 0.9, step: 0.05, value: (_34 = basicSpec.doughnutHoleSize) !== null && _34 !== void 0 ? _34 : "", onChange: function (e) {
738
- return setFieldValue("spec.doughnutHoleSize", e.target.value === ""
739
- ? undefined
740
- : Number(e.target.value));
741
- }, className: "text-xs w-32", placeholder: "0.5" }))) : null,
742
- chartOptionControls.explosion ? (react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
743
- react_1.default.createElement("label", { className: "font-system text-sm" }, "Explosion (% of radius, 0-400)"),
744
- react_1.default.createElement(ui_1.Input, { type: "number", min: 0, max: 400, step: 5, "aria-label": "Explosion", value: (_35 = basicSpec.explosion) !== null && _35 !== void 0 ? _35 : "", onChange: function (e) {
745
- return setFieldValue("spec.explosion", e.target.value === ""
746
- ? undefined
747
- : Number(e.target.value));
748
- }, className: "text-xs w-32", placeholder: "0" }))) : null,
749
- chartOptionControls.gapWidth ? (react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
750
- react_1.default.createElement("label", { className: "font-system text-sm" }, "Gap width (0-500)"),
751
- react_1.default.createElement(ui_1.Input, { type: "number", min: 0, max: 500, value: (_36 = basicSpec.gapWidth) !== null && _36 !== void 0 ? _36 : "", onChange: function (e) {
752
- return setFieldValue("spec.gapWidth", e.target.value === ""
753
- ? undefined
754
- : Number(e.target.value));
755
- }, className: "text-xs w-32", placeholder: "150" }))) : null,
756
- chartOptionControls.overlap ? (react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
757
- react_1.default.createElement("label", { className: "font-system text-sm" }, "Series overlap (-100 to 100)"),
758
- react_1.default.createElement(ui_1.Input, { type: "number", min: -100, max: 100, value: (_37 = basicSpec.overlap) !== null && _37 !== void 0 ? _37 : "", onChange: function (e) {
759
- return setFieldValue("spec.overlap", e.target.value === ""
760
- ? undefined
761
- : Number(e.target.value));
762
- }, className: "text-xs w-32", placeholder: "0" }))) : null)) : null)) : null,
763
- bubbleSpec && bubbleSpec.chartType === "scatter" ? (react_1.default.createElement(Section, { title: "Chart options" },
411
+ caps.hasLegend ? (react_1.default.createElement(Section, { title: "Legend" },
764
412
  react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
765
- react_1.default.createElement("label", { className: "font-system text-sm" }, "Scatter style"),
766
- react_1.default.createElement("select", { className: "border border-rnc-border rounded-sm px-1 py-1 text-xs bg-transparent w-56", value: (_38 = bubbleSpec.scatterStyle) !== null && _38 !== void 0 ? _38 : "lineMarker", onChange: function (e) {
767
- return setFieldValue("spec.scatterStyle", e.target.value);
413
+ react_1.default.createElement("label", { className: "font-system text-sm" }, "Legend"),
414
+ react_1.default.createElement("select", { className: "border border-rnc-border rounded-sm px-1 py-1 text-xs bg-transparent w-32", "aria-label": "Legend position", value: (_x = (_w = values === null || values === void 0 ? void 0 : values.spec.legend) === null || _w === void 0 ? void 0 : _w.position) !== null && _x !== void 0 ? _x : "", onChange: function (e) {
415
+ return setFieldValue("spec.legend.position", e.target.value || undefined);
768
416
  } },
769
- react_1.default.createElement("option", { value: "lineMarker" }, "Straight lines with markers"),
770
- react_1.default.createElement("option", { value: "line" }, "Straight lines"),
771
- react_1.default.createElement("option", { value: "marker" }, "Markers only"),
772
- react_1.default.createElement("option", { value: "smoothMarker" }, "Smooth lines with markers"),
773
- react_1.default.createElement("option", { value: "smooth" }, "Smooth lines"))))) : null,
774
- bubbleSpec ? (react_1.default.createElement(Section, { title: "Axis titles" },
775
- react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
417
+ react_1.default.createElement("option", { value: "" }, "Auto"),
418
+ react_1.default.createElement("option", { value: "top" }, "Top"),
419
+ react_1.default.createElement("option", { value: "bottom" }, "Bottom"),
420
+ react_1.default.createElement("option", { value: "left" }, "Left"),
421
+ react_1.default.createElement("option", { value: "right" }, "Right"),
422
+ react_1.default.createElement("option", { value: "topRight" }, "Top right"),
423
+ react_1.default.createElement("option", { value: "none" }, "None"))),
424
+ react_1.default.createElement(text_format_fields_1.TextFormatFields, { label: "Legend font", collapsible: true, value: (_y = values.spec.legend) === null || _y === void 0 ? void 0 : _y.textFormat, onChange: function (textFormat) {
425
+ return setFieldValue("spec.legend.textFormat", textFormat);
426
+ } }))) : null,
427
+ caps.hasAxisTitles || caps.hasValueAxis ? (react_1.default.createElement(Section, { title: "Vertical axis" },
428
+ caps.hasAxisTitles ? (react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
776
429
  react_1.default.createElement("label", { className: "font-system text-sm" }, "Vertical axis title"),
777
- react_1.default.createElement(ui_1.Input, { value: (_39 = values === null || values === void 0 ? void 0 : values.spec.verticalAxisTitle) !== null && _39 !== void 0 ? _39 : "", type: "text", onChange: function (e) {
430
+ react_1.default.createElement(ui_1.Input, { value: (_z = values === null || values === void 0 ? void 0 : values.spec.verticalAxisTitle) !== null && _z !== void 0 ? _z : "", type: "text", onChange: function (e) {
778
431
  return setFieldValue("spec.verticalAxisTitle", e.target.value);
779
- }, className: "text-xs", placeholder: "Vertical axis title" })),
780
- react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
432
+ }, className: "text-xs", placeholder: "Vertical axis title" }))) : null,
433
+ caps.hasValueAxis ? (react_1.default.createElement(axis_options_fields_1.AxisOptionsFields, { label: "Value axis", kind: "value", value: values.spec.valueAxisOptions, onChange: function (next) { return setFieldValue("spec.valueAxisOptions", next); } })) : null,
434
+ caps.hasSecondaryAxis &&
435
+ seriesList.some(function (s) { return s.useSecondaryAxis; }) ? (react_1.default.createElement(axis_options_fields_1.AxisOptionsFields, { label: "Secondary value axis", kind: "value", value: values.spec.secondaryValueAxisOptions, onChange: function (next) {
436
+ return setFieldValue("spec.secondaryValueAxisOptions", next);
437
+ } })) : null)) : null,
438
+ caps.hasAxisTitles || caps.hasCategoryAxis ? (react_1.default.createElement(Section, { title: "Horizontal axis" },
439
+ caps.hasAxisTitles ? (react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
781
440
  react_1.default.createElement("label", { className: "font-system text-sm" }, "Horizontal axis title"),
782
- react_1.default.createElement(ui_1.Input, { value: (_40 = values === null || values === void 0 ? void 0 : values.spec.horizontalAxisTitle) !== null && _40 !== void 0 ? _40 : "", type: "text", onChange: function (e) {
441
+ react_1.default.createElement(ui_1.Input, { value: (_0 = values === null || values === void 0 ? void 0 : values.spec.horizontalAxisTitle) !== null && _0 !== void 0 ? _0 : "", type: "text", onChange: function (e) {
783
442
  return setFieldValue("spec.horizontalAxisTitle", e.target.value);
784
- }, className: "text-xs", placeholder: "Horizontal axis title" })))) : null,
443
+ }, className: "text-xs", placeholder: "Horizontal axis title" }))) : null,
444
+ caps.hasCategoryAxis ? (react_1.default.createElement(axis_options_fields_1.AxisOptionsFields, { label: "Category axis", kind: caps.category === "bubble" ? "value" : "category", value: values.spec.categoryAxisOptions, gridlinesDefault: false, onChange: function (next) {
445
+ return setFieldValue("spec.categoryAxisOptions", next);
446
+ } })) : null)) : null,
447
+ caps.hasDataLabels ? (react_1.default.createElement(Section, { title: "Data labels" },
448
+ react_1.default.createElement(data_labels_fields_1.DataLabelsFields, { value: values.spec.dataLabels, capabilities: caps, onChange: function (dataLabels) { return setFieldValue("spec.dataLabels", dataLabels); } }))) : null,
449
+ hasTypeOptions ? (react_1.default.createElement(Section, { title: "Chart options" },
450
+ react_1.default.createElement(chart_type_options_1.ChartTypeOptionsFields, { spec: values.spec, capabilities: caps, setFieldValue: setFieldValue }))) : null,
785
451
  react_1.default.createElement(Section, { title: "Properties" },
786
452
  react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2", role: "radiogroup" }, CHART_PLACEMENT_OPTIONS.map(function (_a) {
787
453
  var _b;