@rowsncolumns/charts 27.0.34 → 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.
- package/dist/cjs/atoms/pivot-chart.atom.d.ts +14 -0
- package/dist/cjs/atoms/pivot-chart.atom.d.ts.map +1 -0
- package/dist/cjs/atoms/pivot-chart.atom.js +9 -0
- package/dist/cjs/basic-chart/basic-chart.d.ts +1 -1
- package/dist/cjs/basic-chart/basic-chart.d.ts.map +1 -1
- package/dist/cjs/basic-chart/basic-chart.js +863 -371
- package/dist/cjs/components/dialogs/pivot-chart-dialog.d.ts +39 -0
- package/dist/cjs/components/dialogs/pivot-chart-dialog.d.ts.map +1 -0
- package/dist/cjs/components/dialogs/pivot-chart-dialog.js +100 -0
- package/dist/cjs/components/editors/chart-editor.d.ts +13 -1
- package/dist/cjs/components/editors/chart-editor.d.ts.map +1 -1
- package/dist/cjs/components/editors/chart-editor.js +225 -59
- package/dist/cjs/config.d.ts.map +1 -1
- package/dist/cjs/config.js +149 -12
- package/dist/cjs/hooks/use-charts.d.ts +21 -6
- package/dist/cjs/hooks/use-charts.d.ts.map +1 -1
- package/dist/cjs/hooks/use-charts.js +13 -1
- package/dist/cjs/hooks/use-on-create-chart.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-create-chart.js +7 -1
- package/dist/cjs/hooks/use-on-move-chart-to-sheet.d.ts +12 -0
- package/dist/cjs/hooks/use-on-move-chart-to-sheet.d.ts.map +1 -0
- package/dist/cjs/hooks/use-on-move-chart-to-sheet.js +26 -0
- package/dist/cjs/hooks/use-on-move-chart.d.ts +1 -1
- package/dist/cjs/hooks/use-on-move-chart.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-move-chart.js +2 -2
- package/dist/cjs/hooks/use-on-resize-chart.d.ts +1 -1
- package/dist/cjs/hooks/use-on-resize-chart.d.ts.map +1 -1
- package/dist/cjs/hooks/use-on-resize-chart.js +2 -2
- package/dist/cjs/index.d.ts +11 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +34 -1
- package/dist/cjs/interface/create-chart.d.ts.map +1 -1
- package/dist/cjs/interface/create-chart.js +33 -42
- package/dist/cjs/interface/delete-chart.d.ts.map +1 -1
- package/dist/cjs/interface/delete-chart.js +4 -0
- package/dist/cjs/interface/move-chart-to-sheet.d.ts +13 -0
- package/dist/cjs/interface/move-chart-to-sheet.d.ts.map +1 -0
- package/dist/cjs/interface/move-chart-to-sheet.js +136 -0
- package/dist/cjs/interface/move-chart.d.ts +2 -2
- package/dist/cjs/interface/move-chart.d.ts.map +1 -1
- package/dist/cjs/interface/move-chart.js +7 -1
- package/dist/cjs/interface/resize-chart.d.ts +2 -2
- package/dist/cjs/interface/resize-chart.d.ts.map +1 -1
- package/dist/cjs/interface/resize-chart.js +7 -1
- package/dist/cjs/interface/update-chart.d.ts.map +1 -1
- package/dist/cjs/interface/update-chart.js +4 -0
- package/dist/cjs/plotly/basic-chart/basic-chart.d.ts +1 -1
- package/dist/cjs/plotly/basic-chart/basic-chart.d.ts.map +1 -1
- package/dist/cjs/plotly/basic-chart/basic-chart.js +970 -585
- package/dist/cjs/plotly/basic-chart/helpers.d.ts.map +1 -1
- package/dist/cjs/plotly/basic-chart/helpers.js +3 -0
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/cjs/types.d.ts +7 -0
- package/dist/cjs/types.d.ts.map +1 -1
- package/dist/cjs/utils/axis-number-format.d.ts +69 -0
- package/dist/cjs/utils/axis-number-format.d.ts.map +1 -0
- package/dist/cjs/utils/axis-number-format.js +217 -0
- package/dist/cjs/utils/category-levels.d.ts +27 -0
- package/dist/cjs/utils/category-levels.d.ts.map +1 -0
- package/dist/cjs/utils/category-levels.js +80 -0
- package/dist/cjs/utils/chart-image.d.ts +8 -0
- package/dist/cjs/utils/chart-image.d.ts.map +1 -0
- package/dist/cjs/utils/chart-image.js +28 -0
- package/dist/cjs/utils/chart-orientation.d.ts +67 -0
- package/dist/cjs/utils/chart-orientation.d.ts.map +1 -0
- package/dist/cjs/utils/chart-orientation.js +265 -0
- package/dist/cjs/utils/chart-spec-utils.d.ts +3 -0
- package/dist/cjs/utils/chart-spec-utils.d.ts.map +1 -1
- package/dist/cjs/utils/chart-spec-utils.js +12 -4
- package/dist/cjs/utils/chart-styles.d.ts +75 -0
- package/dist/cjs/utils/chart-styles.d.ts.map +1 -0
- package/dist/cjs/utils/chart-styles.js +283 -0
- package/dist/cjs/utils/empty-cells.d.ts +30 -0
- package/dist/cjs/utils/empty-cells.d.ts.map +1 -0
- package/dist/cjs/utils/empty-cells.js +91 -0
- package/dist/cjs/utils/overrides.d.ts +6 -1
- package/dist/cjs/utils/overrides.d.ts.map +1 -1
- package/dist/cjs/utils/overrides.js +19 -7
- package/dist/cjs/utils/pie-explosion.d.ts +30 -0
- package/dist/cjs/utils/pie-explosion.d.ts.map +1 -0
- package/dist/cjs/utils/pie-explosion.js +55 -0
- package/dist/cjs/utils/plotly-click.d.ts +34 -0
- package/dist/cjs/utils/plotly-click.d.ts.map +1 -0
- package/dist/cjs/utils/plotly-click.js +49 -0
- package/dist/cjs/utils/plotly-surface.d.ts +14 -0
- package/dist/cjs/utils/plotly-surface.d.ts.map +1 -0
- package/dist/cjs/utils/plotly-surface.js +64 -0
- package/dist/cjs/utils/plotly-title.d.ts +12 -0
- package/dist/cjs/utils/plotly-title.d.ts.map +1 -0
- package/dist/cjs/utils/plotly-title.js +24 -0
- package/dist/cjs/utils/series-click.d.ts +39 -0
- package/dist/cjs/utils/series-click.d.ts.map +1 -0
- package/dist/cjs/utils/series-click.js +75 -0
- package/dist/cjs/utils/three-d.d.ts +17 -1
- package/dist/cjs/utils/three-d.d.ts.map +1 -1
- package/dist/cjs/utils/three-d.js +32 -4
- package/dist/esm/atoms/pivot-chart.atom.d.ts +14 -0
- package/dist/esm/atoms/pivot-chart.atom.d.ts.map +1 -0
- package/dist/esm/atoms/pivot-chart.atom.js +4 -0
- package/dist/esm/basic-chart/basic-chart.d.ts +1 -1
- package/dist/esm/basic-chart/basic-chart.d.ts.map +1 -1
- package/dist/esm/basic-chart/basic-chart.js +680 -178
- package/dist/esm/components/dialogs/pivot-chart-dialog.d.ts +39 -0
- package/dist/esm/components/dialogs/pivot-chart-dialog.d.ts.map +1 -0
- package/dist/esm/components/dialogs/pivot-chart-dialog.js +89 -0
- package/dist/esm/components/editors/chart-editor.d.ts +13 -1
- package/dist/esm/components/editors/chart-editor.d.ts.map +1 -1
- package/dist/esm/components/editors/chart-editor.js +164 -20
- package/dist/esm/config.d.ts.map +1 -1
- package/dist/esm/config.js +149 -12
- package/dist/esm/hooks/use-charts.d.ts +21 -6
- package/dist/esm/hooks/use-charts.d.ts.map +1 -1
- package/dist/esm/hooks/use-charts.js +13 -1
- package/dist/esm/hooks/use-on-create-chart.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-create-chart.js +7 -1
- package/dist/esm/hooks/use-on-move-chart-to-sheet.d.ts +12 -0
- package/dist/esm/hooks/use-on-move-chart-to-sheet.d.ts.map +1 -0
- package/dist/esm/hooks/use-on-move-chart-to-sheet.js +19 -0
- package/dist/esm/hooks/use-on-move-chart.d.ts +1 -1
- package/dist/esm/hooks/use-on-move-chart.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-move-chart.js +2 -2
- package/dist/esm/hooks/use-on-resize-chart.d.ts +1 -1
- package/dist/esm/hooks/use-on-resize-chart.d.ts.map +1 -1
- package/dist/esm/hooks/use-on-resize-chart.js +2 -2
- package/dist/esm/index.d.ts +11 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +14 -0
- package/dist/esm/interface/create-chart.d.ts.map +1 -1
- package/dist/esm/interface/create-chart.js +36 -58
- package/dist/esm/interface/delete-chart.d.ts.map +1 -1
- package/dist/esm/interface/delete-chart.js +4 -0
- package/dist/esm/interface/move-chart-to-sheet.d.ts +13 -0
- package/dist/esm/interface/move-chart-to-sheet.d.ts.map +1 -0
- package/dist/esm/interface/move-chart-to-sheet.js +126 -0
- package/dist/esm/interface/move-chart.d.ts +2 -2
- package/dist/esm/interface/move-chart.d.ts.map +1 -1
- package/dist/esm/interface/move-chart.js +7 -1
- package/dist/esm/interface/resize-chart.d.ts +2 -2
- package/dist/esm/interface/resize-chart.d.ts.map +1 -1
- package/dist/esm/interface/resize-chart.js +7 -1
- package/dist/esm/interface/update-chart.d.ts.map +1 -1
- package/dist/esm/interface/update-chart.js +4 -0
- package/dist/esm/plotly/basic-chart/basic-chart.d.ts +1 -1
- package/dist/esm/plotly/basic-chart/basic-chart.d.ts.map +1 -1
- package/dist/esm/plotly/basic-chart/basic-chart.js +858 -463
- package/dist/esm/plotly/basic-chart/helpers.d.ts.map +1 -1
- package/dist/esm/plotly/basic-chart/helpers.js +3 -0
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/esm/types.d.ts +7 -0
- package/dist/esm/types.d.ts.map +1 -1
- package/dist/esm/utils/axis-number-format.d.ts +69 -0
- package/dist/esm/utils/axis-number-format.d.ts.map +1 -0
- package/dist/esm/utils/axis-number-format.js +170 -0
- package/dist/esm/utils/category-levels.d.ts +27 -0
- package/dist/esm/utils/category-levels.d.ts.map +1 -0
- package/dist/esm/utils/category-levels.js +65 -0
- package/dist/esm/utils/chart-image.d.ts +8 -0
- package/dist/esm/utils/chart-image.d.ts.map +1 -0
- package/dist/esm/utils/chart-image.js +24 -0
- package/dist/esm/utils/chart-orientation.d.ts +67 -0
- package/dist/esm/utils/chart-orientation.d.ts.map +1 -0
- package/dist/esm/utils/chart-orientation.js +234 -0
- package/dist/esm/utils/chart-spec-utils.d.ts +3 -0
- package/dist/esm/utils/chart-spec-utils.d.ts.map +1 -1
- package/dist/esm/utils/chart-spec-utils.js +10 -2
- package/dist/esm/utils/chart-styles.d.ts +75 -0
- package/dist/esm/utils/chart-styles.d.ts.map +1 -0
- package/dist/esm/utils/chart-styles.js +357 -0
- package/dist/esm/utils/empty-cells.d.ts +30 -0
- package/dist/esm/utils/empty-cells.d.ts.map +1 -0
- package/dist/esm/utils/empty-cells.js +67 -0
- package/dist/esm/utils/overrides.d.ts +6 -1
- package/dist/esm/utils/overrides.d.ts.map +1 -1
- package/dist/esm/utils/overrides.js +14 -2
- package/dist/esm/utils/pie-explosion.d.ts +30 -0
- package/dist/esm/utils/pie-explosion.d.ts.map +1 -0
- package/dist/esm/utils/pie-explosion.js +43 -0
- package/dist/esm/utils/plotly-click.d.ts +34 -0
- package/dist/esm/utils/plotly-click.d.ts.map +1 -0
- package/dist/esm/utils/plotly-click.js +44 -0
- package/dist/esm/utils/plotly-surface.d.ts +14 -0
- package/dist/esm/utils/plotly-surface.d.ts.map +1 -0
- package/dist/esm/utils/plotly-surface.js +45 -0
- package/dist/esm/utils/plotly-title.d.ts +12 -0
- package/dist/esm/utils/plotly-title.d.ts.map +1 -0
- package/dist/esm/utils/plotly-title.js +20 -0
- package/dist/esm/utils/series-click.d.ts +39 -0
- package/dist/esm/utils/series-click.d.ts.map +1 -0
- package/dist/esm/utils/series-click.js +66 -0
- package/dist/esm/utils/three-d.d.ts +17 -1
- package/dist/esm/utils/three-d.d.ts.map +1 -1
- package/dist/esm/utils/three-d.js +29 -3
- package/package.json +16 -12
|
@@ -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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
];
|
|
26
|
-
const len =
|
|
27
|
-
//
|
|
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
|
-
:
|
|
37
|
-
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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
|
-
|
|
72
|
-
|
|
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
|
-
|
|
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,
|
|
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"}
|
|
@@ -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;
|
|
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;
|
|
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,
|
|
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"}
|
|
@@ -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":"
|
|
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"}
|