@rowsncolumns/charts 28.0.0 → 28.1.0

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 (193) hide show
  1. package/dist/cjs/atoms/pivot-chart.atom.d.ts +14 -0
  2. package/dist/cjs/atoms/pivot-chart.atom.d.ts.map +1 -0
  3. package/dist/cjs/atoms/pivot-chart.atom.js +9 -0
  4. package/dist/cjs/basic-chart/basic-chart.d.ts +1 -1
  5. package/dist/cjs/basic-chart/basic-chart.d.ts.map +1 -1
  6. package/dist/cjs/basic-chart/basic-chart.js +863 -371
  7. package/dist/cjs/components/dialogs/pivot-chart-dialog.d.ts +39 -0
  8. package/dist/cjs/components/dialogs/pivot-chart-dialog.d.ts.map +1 -0
  9. package/dist/cjs/components/dialogs/pivot-chart-dialog.js +100 -0
  10. package/dist/cjs/components/editors/chart-editor.d.ts +13 -1
  11. package/dist/cjs/components/editors/chart-editor.d.ts.map +1 -1
  12. package/dist/cjs/components/editors/chart-editor.js +225 -59
  13. package/dist/cjs/config.d.ts.map +1 -1
  14. package/dist/cjs/config.js +149 -12
  15. package/dist/cjs/hooks/use-charts.d.ts +21 -6
  16. package/dist/cjs/hooks/use-charts.d.ts.map +1 -1
  17. package/dist/cjs/hooks/use-charts.js +13 -1
  18. package/dist/cjs/hooks/use-on-create-chart.d.ts.map +1 -1
  19. package/dist/cjs/hooks/use-on-create-chart.js +7 -1
  20. package/dist/cjs/hooks/use-on-move-chart-to-sheet.d.ts +12 -0
  21. package/dist/cjs/hooks/use-on-move-chart-to-sheet.d.ts.map +1 -0
  22. package/dist/cjs/hooks/use-on-move-chart-to-sheet.js +26 -0
  23. package/dist/cjs/hooks/use-on-move-chart.d.ts +1 -1
  24. package/dist/cjs/hooks/use-on-move-chart.d.ts.map +1 -1
  25. package/dist/cjs/hooks/use-on-move-chart.js +2 -2
  26. package/dist/cjs/hooks/use-on-resize-chart.d.ts +1 -1
  27. package/dist/cjs/hooks/use-on-resize-chart.d.ts.map +1 -1
  28. package/dist/cjs/hooks/use-on-resize-chart.js +2 -2
  29. package/dist/cjs/index.d.ts +11 -0
  30. package/dist/cjs/index.d.ts.map +1 -1
  31. package/dist/cjs/index.js +34 -1
  32. package/dist/cjs/interface/create-chart.d.ts.map +1 -1
  33. package/dist/cjs/interface/create-chart.js +33 -42
  34. package/dist/cjs/interface/delete-chart.d.ts.map +1 -1
  35. package/dist/cjs/interface/delete-chart.js +4 -0
  36. package/dist/cjs/interface/move-chart-to-sheet.d.ts +13 -0
  37. package/dist/cjs/interface/move-chart-to-sheet.d.ts.map +1 -0
  38. package/dist/cjs/interface/move-chart-to-sheet.js +136 -0
  39. package/dist/cjs/interface/move-chart.d.ts +2 -2
  40. package/dist/cjs/interface/move-chart.d.ts.map +1 -1
  41. package/dist/cjs/interface/move-chart.js +7 -1
  42. package/dist/cjs/interface/resize-chart.d.ts +2 -2
  43. package/dist/cjs/interface/resize-chart.d.ts.map +1 -1
  44. package/dist/cjs/interface/resize-chart.js +7 -1
  45. package/dist/cjs/interface/update-chart.d.ts.map +1 -1
  46. package/dist/cjs/interface/update-chart.js +4 -0
  47. package/dist/cjs/plotly/basic-chart/basic-chart.d.ts +1 -1
  48. package/dist/cjs/plotly/basic-chart/basic-chart.d.ts.map +1 -1
  49. package/dist/cjs/plotly/basic-chart/basic-chart.js +970 -585
  50. package/dist/cjs/plotly/basic-chart/helpers.d.ts.map +1 -1
  51. package/dist/cjs/plotly/basic-chart/helpers.js +3 -0
  52. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  53. package/dist/cjs/types.d.ts +7 -0
  54. package/dist/cjs/types.d.ts.map +1 -1
  55. package/dist/cjs/utils/axis-number-format.d.ts +69 -0
  56. package/dist/cjs/utils/axis-number-format.d.ts.map +1 -0
  57. package/dist/cjs/utils/axis-number-format.js +217 -0
  58. package/dist/cjs/utils/category-levels.d.ts +27 -0
  59. package/dist/cjs/utils/category-levels.d.ts.map +1 -0
  60. package/dist/cjs/utils/category-levels.js +80 -0
  61. package/dist/cjs/utils/chart-image.d.ts +8 -0
  62. package/dist/cjs/utils/chart-image.d.ts.map +1 -0
  63. package/dist/cjs/utils/chart-image.js +28 -0
  64. package/dist/cjs/utils/chart-orientation.d.ts +67 -0
  65. package/dist/cjs/utils/chart-orientation.d.ts.map +1 -0
  66. package/dist/cjs/utils/chart-orientation.js +265 -0
  67. package/dist/cjs/utils/chart-spec-utils.d.ts +3 -0
  68. package/dist/cjs/utils/chart-spec-utils.d.ts.map +1 -1
  69. package/dist/cjs/utils/chart-spec-utils.js +12 -4
  70. package/dist/cjs/utils/chart-styles.d.ts +75 -0
  71. package/dist/cjs/utils/chart-styles.d.ts.map +1 -0
  72. package/dist/cjs/utils/chart-styles.js +283 -0
  73. package/dist/cjs/utils/empty-cells.d.ts +30 -0
  74. package/dist/cjs/utils/empty-cells.d.ts.map +1 -0
  75. package/dist/cjs/utils/empty-cells.js +91 -0
  76. package/dist/cjs/utils/overrides.d.ts +6 -1
  77. package/dist/cjs/utils/overrides.d.ts.map +1 -1
  78. package/dist/cjs/utils/overrides.js +19 -7
  79. package/dist/cjs/utils/pie-explosion.d.ts +30 -0
  80. package/dist/cjs/utils/pie-explosion.d.ts.map +1 -0
  81. package/dist/cjs/utils/pie-explosion.js +55 -0
  82. package/dist/cjs/utils/plotly-click.d.ts +34 -0
  83. package/dist/cjs/utils/plotly-click.d.ts.map +1 -0
  84. package/dist/cjs/utils/plotly-click.js +49 -0
  85. package/dist/cjs/utils/plotly-surface.d.ts +14 -0
  86. package/dist/cjs/utils/plotly-surface.d.ts.map +1 -0
  87. package/dist/cjs/utils/plotly-surface.js +64 -0
  88. package/dist/cjs/utils/plotly-title.d.ts +12 -0
  89. package/dist/cjs/utils/plotly-title.d.ts.map +1 -0
  90. package/dist/cjs/utils/plotly-title.js +24 -0
  91. package/dist/cjs/utils/series-click.d.ts +39 -0
  92. package/dist/cjs/utils/series-click.d.ts.map +1 -0
  93. package/dist/cjs/utils/series-click.js +75 -0
  94. package/dist/cjs/utils/three-d.d.ts +17 -1
  95. package/dist/cjs/utils/three-d.d.ts.map +1 -1
  96. package/dist/cjs/utils/three-d.js +32 -4
  97. package/dist/esm/atoms/pivot-chart.atom.d.ts +14 -0
  98. package/dist/esm/atoms/pivot-chart.atom.d.ts.map +1 -0
  99. package/dist/esm/atoms/pivot-chart.atom.js +4 -0
  100. package/dist/esm/basic-chart/basic-chart.d.ts +1 -1
  101. package/dist/esm/basic-chart/basic-chart.d.ts.map +1 -1
  102. package/dist/esm/basic-chart/basic-chart.js +680 -178
  103. package/dist/esm/components/dialogs/pivot-chart-dialog.d.ts +39 -0
  104. package/dist/esm/components/dialogs/pivot-chart-dialog.d.ts.map +1 -0
  105. package/dist/esm/components/dialogs/pivot-chart-dialog.js +89 -0
  106. package/dist/esm/components/editors/chart-editor.d.ts +13 -1
  107. package/dist/esm/components/editors/chart-editor.d.ts.map +1 -1
  108. package/dist/esm/components/editors/chart-editor.js +164 -20
  109. package/dist/esm/config.d.ts.map +1 -1
  110. package/dist/esm/config.js +149 -12
  111. package/dist/esm/hooks/use-charts.d.ts +21 -6
  112. package/dist/esm/hooks/use-charts.d.ts.map +1 -1
  113. package/dist/esm/hooks/use-charts.js +13 -1
  114. package/dist/esm/hooks/use-on-create-chart.d.ts.map +1 -1
  115. package/dist/esm/hooks/use-on-create-chart.js +7 -1
  116. package/dist/esm/hooks/use-on-move-chart-to-sheet.d.ts +12 -0
  117. package/dist/esm/hooks/use-on-move-chart-to-sheet.d.ts.map +1 -0
  118. package/dist/esm/hooks/use-on-move-chart-to-sheet.js +19 -0
  119. package/dist/esm/hooks/use-on-move-chart.d.ts +1 -1
  120. package/dist/esm/hooks/use-on-move-chart.d.ts.map +1 -1
  121. package/dist/esm/hooks/use-on-move-chart.js +2 -2
  122. package/dist/esm/hooks/use-on-resize-chart.d.ts +1 -1
  123. package/dist/esm/hooks/use-on-resize-chart.d.ts.map +1 -1
  124. package/dist/esm/hooks/use-on-resize-chart.js +2 -2
  125. package/dist/esm/index.d.ts +11 -0
  126. package/dist/esm/index.d.ts.map +1 -1
  127. package/dist/esm/index.js +14 -0
  128. package/dist/esm/interface/create-chart.d.ts.map +1 -1
  129. package/dist/esm/interface/create-chart.js +36 -58
  130. package/dist/esm/interface/delete-chart.d.ts.map +1 -1
  131. package/dist/esm/interface/delete-chart.js +4 -0
  132. package/dist/esm/interface/move-chart-to-sheet.d.ts +13 -0
  133. package/dist/esm/interface/move-chart-to-sheet.d.ts.map +1 -0
  134. package/dist/esm/interface/move-chart-to-sheet.js +126 -0
  135. package/dist/esm/interface/move-chart.d.ts +2 -2
  136. package/dist/esm/interface/move-chart.d.ts.map +1 -1
  137. package/dist/esm/interface/move-chart.js +7 -1
  138. package/dist/esm/interface/resize-chart.d.ts +2 -2
  139. package/dist/esm/interface/resize-chart.d.ts.map +1 -1
  140. package/dist/esm/interface/resize-chart.js +7 -1
  141. package/dist/esm/interface/update-chart.d.ts.map +1 -1
  142. package/dist/esm/interface/update-chart.js +4 -0
  143. package/dist/esm/plotly/basic-chart/basic-chart.d.ts +1 -1
  144. package/dist/esm/plotly/basic-chart/basic-chart.d.ts.map +1 -1
  145. package/dist/esm/plotly/basic-chart/basic-chart.js +858 -463
  146. package/dist/esm/plotly/basic-chart/helpers.d.ts.map +1 -1
  147. package/dist/esm/plotly/basic-chart/helpers.js +3 -0
  148. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  149. package/dist/esm/types.d.ts +7 -0
  150. package/dist/esm/types.d.ts.map +1 -1
  151. package/dist/esm/utils/axis-number-format.d.ts +69 -0
  152. package/dist/esm/utils/axis-number-format.d.ts.map +1 -0
  153. package/dist/esm/utils/axis-number-format.js +170 -0
  154. package/dist/esm/utils/category-levels.d.ts +27 -0
  155. package/dist/esm/utils/category-levels.d.ts.map +1 -0
  156. package/dist/esm/utils/category-levels.js +65 -0
  157. package/dist/esm/utils/chart-image.d.ts +8 -0
  158. package/dist/esm/utils/chart-image.d.ts.map +1 -0
  159. package/dist/esm/utils/chart-image.js +24 -0
  160. package/dist/esm/utils/chart-orientation.d.ts +67 -0
  161. package/dist/esm/utils/chart-orientation.d.ts.map +1 -0
  162. package/dist/esm/utils/chart-orientation.js +234 -0
  163. package/dist/esm/utils/chart-spec-utils.d.ts +3 -0
  164. package/dist/esm/utils/chart-spec-utils.d.ts.map +1 -1
  165. package/dist/esm/utils/chart-spec-utils.js +10 -2
  166. package/dist/esm/utils/chart-styles.d.ts +75 -0
  167. package/dist/esm/utils/chart-styles.d.ts.map +1 -0
  168. package/dist/esm/utils/chart-styles.js +357 -0
  169. package/dist/esm/utils/empty-cells.d.ts +30 -0
  170. package/dist/esm/utils/empty-cells.d.ts.map +1 -0
  171. package/dist/esm/utils/empty-cells.js +67 -0
  172. package/dist/esm/utils/overrides.d.ts +6 -1
  173. package/dist/esm/utils/overrides.d.ts.map +1 -1
  174. package/dist/esm/utils/overrides.js +14 -2
  175. package/dist/esm/utils/pie-explosion.d.ts +30 -0
  176. package/dist/esm/utils/pie-explosion.d.ts.map +1 -0
  177. package/dist/esm/utils/pie-explosion.js +43 -0
  178. package/dist/esm/utils/plotly-click.d.ts +34 -0
  179. package/dist/esm/utils/plotly-click.d.ts.map +1 -0
  180. package/dist/esm/utils/plotly-click.js +44 -0
  181. package/dist/esm/utils/plotly-surface.d.ts +14 -0
  182. package/dist/esm/utils/plotly-surface.d.ts.map +1 -0
  183. package/dist/esm/utils/plotly-surface.js +45 -0
  184. package/dist/esm/utils/plotly-title.d.ts +12 -0
  185. package/dist/esm/utils/plotly-title.d.ts.map +1 -0
  186. package/dist/esm/utils/plotly-title.js +20 -0
  187. package/dist/esm/utils/series-click.d.ts +39 -0
  188. package/dist/esm/utils/series-click.d.ts.map +1 -0
  189. package/dist/esm/utils/series-click.js +66 -0
  190. package/dist/esm/utils/three-d.d.ts +17 -1
  191. package/dist/esm/utils/three-d.d.ts.map +1 -1
  192. package/dist/esm/utils/three-d.js +29 -3
  193. package/package.json +10 -6
@@ -1,5 +1,6 @@
1
1
  import { isNumber, selectionBoundsFromCells, uuid } from "@rowsncolumns/utils";
2
2
  import { enablePatches, produceWithPatches } from "immer";
3
+ import { deriveChartSeriesFromRange, pickSeriesOrientationForRange, } from "../utils/chart-orientation";
3
4
  import { isBasicChartSpec, getDefaultChartTypeSpec, } from "../utils/chart-spec-utils";
4
5
  // For external interface
5
6
  enablePatches();
@@ -13,18 +14,18 @@ export const createChart = ({ onChangeCharts, getFormattedValue, getEffectiveVal
13
14
  const lastSelection = selections.length
14
15
  ? selections[selections.length - 1]
15
16
  : { range: selectionBoundsFromCells(activeCell) };
16
- // Use the first column (beneath the header) as the category/domain axis.
17
- const categoryAxis = [
18
- {
19
- ...lastSelection.range,
20
- startRowIndex: lastSelection.range.startRowIndex + 1,
21
- endRowIndex: ensureValidEndIndex(lastSelection.range.endRowIndex, lastSelection.range.startRowIndex + 1),
22
- endColumnIndex: lastSelection.range.startColumnIndex,
23
- sheetId,
24
- },
25
- ];
26
- const len = lastSelection.range.endColumnIndex - lastSelection.range.startColumnIndex;
27
- // Build one series per numeric column after the category column.
17
+ const dataRange = { ...lastSelection.range, sheetId };
18
+ // Excel's wizard: a selection wider than it is tall plots its rows as
19
+ // the series; otherwise the columns are.
20
+ const orientation = pickSeriesOrientationForRange(dataRange);
21
+ const derived = deriveChartSeriesFromRange({
22
+ range: dataRange,
23
+ orientation,
24
+ getFormattedValue,
25
+ });
26
+ const categoryAxis = derived.domains[0].sources;
27
+ const len = derived.series.length;
28
+ // Keep only the series whose first data cell is a number (or empty).
28
29
  const chartData = len === 0
29
30
  ? [
30
31
  {
@@ -33,52 +34,23 @@ export const createChart = ({ onChangeCharts, getFormattedValue, getEffectiveVal
33
34
  aggregateType: "COUNT",
34
35
  },
35
36
  ]
36
- : Array.from({ length: len })
37
- .map((_, index) => {
38
- const columnIndex = lastSelection.range.startColumnIndex +
39
- index +
40
- categoryAxis.length;
41
- const dataLabel = getFormattedValue(sheetId, lastSelection.range.startRowIndex, columnIndex);
42
- const dataStartRowIndex = lastSelection.range.startRowIndex + 1;
43
- const dataStartColumnIndex = columnIndex;
44
- const firstEffectiveValue = getEffectiveValue(sheetId, dataStartRowIndex, dataStartColumnIndex);
45
- const isNumberOrEmpty = +isNumber(firstEffectiveValue) ||
46
- firstEffectiveValue === undefined;
47
- if (!isNumberOrEmpty) {
48
- return null;
49
- }
50
- return {
51
- dataLabel,
52
- sources: [
53
- {
54
- ...lastSelection.range,
55
- startRowIndex: dataStartRowIndex,
56
- endRowIndex: ensureValidEndIndex(lastSelection.range.endRowIndex, dataStartRowIndex),
57
- startColumnIndex: columnIndex,
58
- endColumnIndex: columnIndex,
59
- sheetId,
60
- },
61
- ],
62
- };
63
- })
64
- .filter(Boolean);
37
+ : derived.series.filter((entry) => {
38
+ const [source] = entry.sources;
39
+ const firstEffectiveValue = getEffectiveValue(sheetId, source.startRowIndex, source.startColumnIndex);
40
+ return (+isNumber(firstEffectiveValue) ||
41
+ firstEffectiveValue === undefined);
42
+ });
65
43
  const chartTypeConfig = len === 0
66
44
  ? getDefaultChartTypeSpec("pie")
67
45
  : getDefaultChartTypeSpec("line");
68
46
  const baseSpec = {
69
47
  ...chartTypeConfig,
70
- dataRange: {
71
- ...lastSelection.range,
72
- sheetId,
73
- },
74
- domains: [
75
- {
76
- sources: categoryAxis,
77
- },
78
- ],
48
+ dataRange,
49
+ ...(orientation === "rows" ? { seriesOrientation: orientation } : {}),
50
+ domains: derived.domains,
79
51
  series: chartData,
80
52
  };
81
- const finalChartSpec = chartSpec ?? {
53
+ let finalChartSpec = chartSpec ?? {
82
54
  chartId: idCreationStrategy?.("chart") ?? uuid(),
83
55
  position: {
84
56
  overlayPosition: {
@@ -106,18 +78,24 @@ export const createChart = ({ onChangeCharts, getFormattedValue, getEffectiveVal
106
78
  }
107
79
  // Update charts
108
80
  onChangeCharts?.((prevCharts) => {
81
+ // A requested id that is already taken gets a fresh one before the chart is finalized, so
82
+ // the stored chart, the history entry and the returned spec all carry the same id (the
83
+ // caller's spec is left untouched).
84
+ if (prevCharts.some((c) => c.chartId === finalChartSpec.chartId)) {
85
+ finalChartSpec = {
86
+ ...finalChartSpec,
87
+ chartId: idCreationStrategy?.("chart") ?? uuid(),
88
+ };
89
+ }
109
90
  const [nextState, patches, inversePatches] = produceWithPatches(prevCharts, (draft) => {
110
- // Validate id
111
- if (chartSpec) {
112
- const exists = draft.find((c) => c.chartId === chartSpec.chartId);
113
- if (exists) {
114
- chartSpec.chartId = uuid();
115
- }
116
- }
117
91
  draft.push(finalChartSpec);
118
92
  });
119
93
  saveHistory({
120
94
  charts: { patches, inversePatches },
95
+ selectedEmbedOrChart: {
96
+ undo: undefined,
97
+ redo: finalChartSpec.chartId,
98
+ },
121
99
  });
122
100
  return nextState;
123
101
  });
@@ -1 +1 @@
1
- {"version":3,"file":"delete-chart.d.ts","sourceRoot":"","sources":["../../../interface/delete-chart.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAG1D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAK1E,eAAO,MAAM,WAAW,GAAI,CAAC,SAAS,QAAQ,EAAE,oCAG7C,qBAAqB,CAAC,CAAC,CAAC,MACjB,SAAS,MAAM,GAAG,MAAM,SAsBjC,CAAC"}
1
+ {"version":3,"file":"delete-chart.d.ts","sourceRoot":"","sources":["../../../interface/delete-chart.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAG1D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAK1E,eAAO,MAAM,WAAW,GAAI,CAAC,SAAS,QAAQ,EAAE,oCAG7C,qBAAqB,CAAC,CAAC,CAAC,MACjB,SAAS,MAAM,GAAG,MAAM,SA0BjC,CAAC"}
@@ -13,6 +13,10 @@ export const deleteChart = ({ onChangeCharts, createHistory, }) => {
13
13
  });
14
14
  saveHistory({
15
15
  charts: { patches, inversePatches },
16
+ selectedEmbedOrChart: {
17
+ undo: chartId,
18
+ redo: undefined,
19
+ },
16
20
  });
17
21
  return nextState;
18
22
  });
@@ -0,0 +1,13 @@
1
+ import type { CellData, EmbeddedChart, MoveChartTarget, Sheet } from "@rowsncolumns/spreadsheet";
2
+ import type { UseOnMoveChartToSheetProps } from "../hooks/use-on-move-chart-to-sheet";
3
+ /** The first unused `Chart${n}` title (honouring `generatedNames.chartSheet`), like Excel. */
4
+ export declare const getNextChartSheetTitle: (sheets: Pick<Sheet, "title">[], generatedNames?: UseOnMoveChartToSheetProps<CellData, Sheet>["generatedNames"]) => string;
5
+ /**
6
+ * Excel's "Move Chart…": relocate a chart to a new chartsheet (a tab that is
7
+ * the chart, no cells) or onto another worksheet at A1. Moving a chart OUT of
8
+ * a chartsheet deletes the now-empty chartsheet, like Excel. Sheet and chart
9
+ * patches share one history pointer so the whole move undoes in one step.
10
+ * Returns the sheet the chart now lives on (undefined when nothing moved).
11
+ */
12
+ export declare const moveChartToSheet: <T extends CellData, S extends Sheet>({ onChangeCharts, onChangeSheets, onChangeActiveSheet, createHistory, idCreationStrategy, generatedNames, }: UseOnMoveChartToSheetProps<T, S>) => (chart: EmbeddedChart, target: MoveChartTarget) => number | undefined;
13
+ //# sourceMappingURL=move-chart-to-sheet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"move-chart-to-sheet.d.ts","sourceRoot":"","sources":["../../../interface/move-chart-to-sheet.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EACR,aAAa,EACb,eAAe,EACf,KAAK,EACN,MAAM,2BAA2B,CAAC;AASnC,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AAKtF,8FAA8F;AAC9F,eAAO,MAAM,sBAAsB,GACjC,QAAQ,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,EAC9B,iBAAiB,0BAA0B,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,gBAAgB,CAAC,WAI7E,CAAC;AA8BJ;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,GAAI,CAAC,SAAS,QAAQ,EAAE,CAAC,SAAS,KAAK,EAAE,6GAOnE,0BAA0B,CAAC,CAAC,EAAE,CAAC,CAAC,MACzB,OAAO,aAAa,EAAE,QAAQ,eAAe,uBAqGtD,CAAC"}
@@ -0,0 +1,126 @@
1
+ import { getNextChartSheetTitle as nextChartSheetTitle } from "@rowsncolumns/spreadsheet";
2
+ import { getGeneratedChartSheetName, truncateSheetTitle, } from "@rowsncolumns/spreadsheet-state";
3
+ import { uuid } from "@rowsncolumns/utils";
4
+ import { castDraft, enablePatches, produceWithPatches } from "immer";
5
+ // For external interface
6
+ enablePatches();
7
+ /** The first unused `Chart${n}` title (honouring `generatedNames.chartSheet`), like Excel. */
8
+ export const getNextChartSheetTitle = (sheets, generatedNames) => nextChartSheetTitle(sheets, (index) => truncateSheetTitle(getGeneratedChartSheetName(index, generatedNames)));
9
+ /**
10
+ * Sort key placing a new tab right after `afterSheetId` without renumbering
11
+ * the other tabs (patches stay add-only for ShareDB).
12
+ */
13
+ const indexAfterSheet = (sheets, afterSheetId) => {
14
+ const ordered = sheets
15
+ .map((sheet, arrayIndex) => ({
16
+ sheet,
17
+ effectiveIndex: sheet.index ?? arrayIndex,
18
+ arrayIndex,
19
+ }))
20
+ .sort((a, b) => a.effectiveIndex - b.effectiveIndex || a.arrayIndex - b.arrayIndex);
21
+ const position = ordered.findIndex((entry) => entry.sheet.sheetId === afterSheetId);
22
+ const maxIndex = ordered.length > 0
23
+ ? Math.max(...ordered.map((entry) => entry.effectiveIndex))
24
+ : -1;
25
+ if (position === -1)
26
+ return maxIndex + 1;
27
+ const current = ordered[position].effectiveIndex;
28
+ const next = ordered[position + 1]?.effectiveIndex;
29
+ return next === undefined ? current + 1 : current + (next - current) / 2;
30
+ };
31
+ /**
32
+ * Excel's "Move Chart…": relocate a chart to a new chartsheet (a tab that is
33
+ * the chart, no cells) or onto another worksheet at A1. Moving a chart OUT of
34
+ * a chartsheet deletes the now-empty chartsheet, like Excel. Sheet and chart
35
+ * patches share one history pointer so the whole move undoes in one step.
36
+ * Returns the sheet the chart now lives on (undefined when nothing moved).
37
+ */
38
+ export const moveChartToSheet = ({ onChangeCharts, onChangeSheets, onChangeActiveSheet, createHistory, idCreationStrategy, generatedNames, }) => {
39
+ return (chart, target) => {
40
+ const { chartId } = chart;
41
+ const sourceSheetId = chart.position.sheetId;
42
+ if (target.kind === "sheet" && target.sheetId === sourceSheetId) {
43
+ return undefined;
44
+ }
45
+ const saveHistory = createHistory();
46
+ let targetSheetId;
47
+ let targetIsChartSheet = false;
48
+ onChangeSheets((prevSheets) => {
49
+ const [nextState, patches, inversePatches] = produceWithPatches(prevSheets, (draft) => {
50
+ const sourceIndex = draft.findIndex((sheet) => sheet.sheetId === sourceSheetId);
51
+ if (target.kind === "sheet") {
52
+ const destination = draft.find((sheet) => sheet.sheetId === target.sheetId);
53
+ if (!destination || destination.type === "chartsheet") {
54
+ return;
55
+ }
56
+ targetSheetId = destination.sheetId;
57
+ }
58
+ else {
59
+ let newSheetId = idCreationStrategy?.("sheet") ?? uuid();
60
+ const existingIds = new Set(draft.map((sheet) => sheet.sheetId));
61
+ while (existingIds.has(newSheetId)) {
62
+ newSheetId = idCreationStrategy?.("sheet") ?? uuid();
63
+ }
64
+ const requested = target.title?.trim();
65
+ const existingTitles = new Set(draft.map((sheet) => sheet.title));
66
+ const chartSheet = {
67
+ title: requested && !existingTitles.has(requested)
68
+ ? truncateSheetTitle(requested)
69
+ : getNextChartSheetTitle(draft, generatedNames),
70
+ sheetId: newSheetId,
71
+ type: "chartsheet",
72
+ chartId,
73
+ index: indexAfterSheet(draft, sourceSheetId),
74
+ merges: [],
75
+ rowMetadata: [],
76
+ columnMetadata: [],
77
+ };
78
+ draft.push(castDraft(chartSheet));
79
+ targetSheetId = newSheetId;
80
+ targetIsChartSheet = true;
81
+ }
82
+ // The chart was the whole sheet: nothing is left to show.
83
+ if (sourceIndex !== -1 && draft[sourceIndex].type === "chartsheet") {
84
+ draft.splice(sourceIndex, 1);
85
+ }
86
+ });
87
+ if (targetSheetId !== undefined) {
88
+ saveHistory({
89
+ sheets: { patches, inversePatches },
90
+ sheetId: { undo: sourceSheetId, redo: targetSheetId },
91
+ });
92
+ }
93
+ return nextState;
94
+ });
95
+ if (targetSheetId === undefined) {
96
+ return undefined;
97
+ }
98
+ const destinationSheetId = targetSheetId;
99
+ onChangeCharts?.((prevCharts) => {
100
+ const [nextState, patches, inversePatches] = produceWithPatches(prevCharts, (draft) => {
101
+ const moved = draft.find((entry) => entry.chartId === chartId);
102
+ if (!moved)
103
+ return;
104
+ const { widthPixels, heightPixels } = moved.position.overlayPosition;
105
+ moved.position = {
106
+ sheetId: destinationSheetId,
107
+ overlayPosition: {
108
+ anchorCell: { rowIndex: 1, columnIndex: 1 },
109
+ offsetXPixels: 0,
110
+ offsetYPixels: 0,
111
+ widthPixels,
112
+ heightPixels,
113
+ ...(targetIsChartSheet ? { placement: "absolute" } : {}),
114
+ },
115
+ };
116
+ });
117
+ saveHistory({
118
+ charts: { patches, inversePatches },
119
+ selectedEmbedOrChart: { undo: chartId, redo: chartId },
120
+ });
121
+ return nextState;
122
+ });
123
+ onChangeActiveSheet?.(destinationSheetId);
124
+ return destinationSheetId;
125
+ };
126
+ };
@@ -1,5 +1,5 @@
1
1
  import type { CellInterface } from "@rowsncolumns/grid";
2
- import { type CellData } from "@rowsncolumns/spreadsheet";
2
+ import { type CellData, type OverlayToAnchor } from "@rowsncolumns/spreadsheet";
3
3
  import type { UseOnMoveChartProps } from "../hooks/use-on-move-chart";
4
- export declare const moveChart: <T extends CellData>({ onChangeCharts, createHistory, }: UseOnMoveChartProps<T>) => (chartId: string | number, anchorCell: CellInterface, offsetXPixels: number, offsetYPixels: number) => void;
4
+ export declare const moveChart: <T extends CellData>({ onChangeCharts, createHistory, }: UseOnMoveChartProps<T>) => (chartId: string | number, anchorCell: CellInterface, offsetXPixels: number, offsetYPixels: number, toAnchor?: OverlayToAnchor) => void;
5
5
  //# sourceMappingURL=move-chart.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"move-chart.d.ts","sourceRoot":"","sources":["../../../interface/move-chart.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAG1D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAKtE,eAAO,MAAM,SAAS,GAAI,CAAC,SAAS,QAAQ,EAAE,oCAG3C,mBAAmB,CAAC,CAAC,CAAC,MAErB,SAAS,MAAM,GAAG,MAAM,EACxB,YAAY,aAAa,EACzB,eAAe,MAAM,EACrB,eAAe,MAAM,SAuBxB,CAAC"}
1
+ {"version":3,"file":"move-chart.d.ts","sourceRoot":"","sources":["../../../interface/move-chart.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAIhF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAKtE,eAAO,MAAM,SAAS,GAAI,CAAC,SAAS,QAAQ,EAAE,oCAG3C,mBAAmB,CAAC,CAAC,CAAC,MAErB,SAAS,MAAM,GAAG,MAAM,EACxB,YAAY,aAAa,EACzB,eAAe,MAAM,EACrB,eAAe,MAAM,EACrB,WAAW,eAAe,SA4B7B,CAAC"}
@@ -1,8 +1,9 @@
1
+ import { setOverlayToAnchor } from "@rowsncolumns/spreadsheet-state";
1
2
  import { enablePatches, produceWithPatches } from "immer";
2
3
  // For external interface
3
4
  enablePatches();
4
5
  export const moveChart = ({ onChangeCharts, createHistory, }) => {
5
- return (chartId, anchorCell, offsetXPixels, offsetYPixels) => {
6
+ return (chartId, anchorCell, offsetXPixels, offsetYPixels, toAnchor) => {
6
7
  const saveHistory = createHistory();
7
8
  onChangeCharts?.((prevCharts) => {
8
9
  const [nextState, patches, inversePatches] = produceWithPatches(prevCharts, (draft) => {
@@ -11,10 +12,15 @@ export const moveChart = ({ onChangeCharts, createHistory, }) => {
11
12
  chart.position.overlayPosition.anchorCell = anchorCell;
12
13
  chart.position.overlayPosition.offsetXPixels = offsetXPixels;
13
14
  chart.position.overlayPosition.offsetYPixels = offsetYPixels;
15
+ setOverlayToAnchor(chart.position.overlayPosition, toAnchor);
14
16
  }
15
17
  });
16
18
  saveHistory({
17
19
  charts: { patches, inversePatches },
20
+ selectedEmbedOrChart: {
21
+ undo: chartId,
22
+ redo: chartId,
23
+ },
18
24
  });
19
25
  return nextState;
20
26
  });
@@ -1,5 +1,5 @@
1
1
  import type { CellInterface } from "@rowsncolumns/grid";
2
- import { type CellData } from "@rowsncolumns/spreadsheet";
2
+ import { type CellData, type OverlayToAnchor } from "@rowsncolumns/spreadsheet";
3
3
  import type { UseOnResizeChartProps } from "../hooks/use-on-resize-chart";
4
- export declare const resizeChart: <T extends CellData>({ onChangeCharts, createHistory, }: UseOnResizeChartProps<T>) => (chartId: string | number, anchorCell: CellInterface, offsetXPixels: number, offsetYPixels: number, width: number, height: number) => void;
4
+ export declare const resizeChart: <T extends CellData>({ onChangeCharts, createHistory, }: UseOnResizeChartProps<T>) => (chartId: string | number, anchorCell: CellInterface, offsetXPixels: number, offsetYPixels: number, width: number, height: number, toAnchor?: OverlayToAnchor) => void;
5
5
  //# sourceMappingURL=resize-chart.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"resize-chart.d.ts","sourceRoot":"","sources":["../../../interface/resize-chart.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAG1D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAK1E,eAAO,MAAM,WAAW,GAAI,CAAC,SAAS,QAAQ,EAAE,oCAG7C,qBAAqB,CAAC,CAAC,CAAC,MAEvB,SAAS,MAAM,GAAG,MAAM,EACxB,YAAY,aAAa,EACzB,eAAe,MAAM,EACrB,eAAe,MAAM,EACrB,OAAO,MAAM,EACb,QAAQ,MAAM,SAyBjB,CAAC"}
1
+ {"version":3,"file":"resize-chart.d.ts","sourceRoot":"","sources":["../../../interface/resize-chart.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAIhF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAK1E,eAAO,MAAM,WAAW,GAAI,CAAC,SAAS,QAAQ,EAAE,oCAG7C,qBAAqB,CAAC,CAAC,CAAC,MAEvB,SAAS,MAAM,GAAG,MAAM,EACxB,YAAY,aAAa,EACzB,eAAe,MAAM,EACrB,eAAe,MAAM,EACrB,OAAO,MAAM,EACb,QAAQ,MAAM,EACd,WAAW,eAAe,SA8B7B,CAAC"}
@@ -1,8 +1,9 @@
1
+ import { setOverlayToAnchor } from "@rowsncolumns/spreadsheet-state";
1
2
  import { enablePatches, produceWithPatches } from "immer";
2
3
  // For external interface
3
4
  enablePatches();
4
5
  export const resizeChart = ({ onChangeCharts, createHistory, }) => {
5
- return (chartId, anchorCell, offsetXPixels, offsetYPixels, width, height) => {
6
+ return (chartId, anchorCell, offsetXPixels, offsetYPixels, width, height, toAnchor) => {
6
7
  const saveHistory = createHistory();
7
8
  onChangeCharts?.((prevCharts) => {
8
9
  const [nextState, patches, inversePatches] = produceWithPatches(prevCharts, (draft) => {
@@ -13,10 +14,15 @@ export const resizeChart = ({ onChangeCharts, createHistory, }) => {
13
14
  chart.position.overlayPosition.offsetYPixels = offsetYPixels;
14
15
  chart.position.overlayPosition.widthPixels = width;
15
16
  chart.position.overlayPosition.heightPixels = height;
17
+ setOverlayToAnchor(chart.position.overlayPosition, toAnchor);
16
18
  }
17
19
  });
18
20
  saveHistory({
19
21
  charts: { patches, inversePatches },
22
+ selectedEmbedOrChart: {
23
+ undo: chartId,
24
+ redo: chartId,
25
+ },
20
26
  });
21
27
  return nextState;
22
28
  });
@@ -1 +1 @@
1
- {"version":3,"file":"update-chart.d.ts","sourceRoot":"","sources":["../../../interface/update-chart.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAG9E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAM1E,eAAO,MAAM,WAAW,GAAI,CAAC,SAAS,QAAQ,EAAE,oCAG7C,qBAAqB,CAAC,CAAC,CAAC,MACjB,OAAO,OAAO,CAAC,aAAa,CAAC,SA2BtC,CAAC"}
1
+ {"version":3,"file":"update-chart.d.ts","sourceRoot":"","sources":["../../../interface/update-chart.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAG9E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAM1E,eAAO,MAAM,WAAW,GAAI,CAAC,SAAS,QAAQ,EAAE,oCAG7C,qBAAqB,CAAC,CAAC,CAAC,MACjB,OAAO,OAAO,CAAC,aAAa,CAAC,SA+BtC,CAAC"}
@@ -19,6 +19,10 @@ export const updateChart = ({ onChangeCharts, createHistory, }) => {
19
19
  });
20
20
  saveHistory({
21
21
  charts: { patches, inversePatches },
22
+ selectedEmbedOrChart: {
23
+ undo: chart.chartId,
24
+ redo: chart.chartId,
25
+ },
22
26
  });
23
27
  return nextState;
24
28
  });
@@ -1,5 +1,5 @@
1
1
  import React from "react";
2
2
  import type { EChartComponentProps } from "../../types";
3
3
  export type BasicChartProps = EChartComponentProps;
4
- export declare const BasicChart: ({ width, height, chart, theme, isDarkMode, sheetId, readonly, getDomainValuesFromRange, getSeriesValuesFromRange, onDeleteChart, onRequestEdit, onRequestCalculate, isSelected, }: BasicChartProps) => React.JSX.Element;
4
+ export declare const BasicChart: ({ width, height, chart, theme, isDarkMode, sheetId, readonly, getDomainValuesFromRange, getSeriesValuesFromRange, getFormattingFromRange, onDeleteChart, onUpdateChart, onRequestEdit, onRequestCalculate, isSelected, fieldButtons, }: BasicChartProps) => React.JSX.Element;
5
5
  //# sourceMappingURL=basic-chart.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"basic-chart.d.ts","sourceRoot":"","sources":["../../../../plotly/basic-chart/basic-chart.tsx"],"names":[],"mappings":"AAwBA,OAAO,KAAwC,MAAM,OAAO,CAAC;AAG7D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAyRxD,MAAM,MAAM,eAAe,GAAG,oBAAoB,CAAC;AA+DnD,eAAO,MAAM,UAAU,GAAI,mLAcxB,eAAe,sBA+tDjB,CAAC"}
1
+ {"version":3,"file":"basic-chart.d.ts","sourceRoot":"","sources":["../../../../plotly/basic-chart/basic-chart.tsx"],"names":[],"mappings":"AA6BA,OAAO,KAAiD,MAAM,OAAO,CAAC;AAGtE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AA4VxD,MAAM,MAAM,eAAe,GAAG,oBAAoB,CAAC;AA0FnD,eAAO,MAAM,UAAU,GAAI,wOAiBxB,eAAe,sBAmrEjB,CAAC"}