photon-grid-core 0.0.3 → 1.0.1

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 (68) hide show
  1. package/README.md +304 -304
  2. package/chart/chart-config/chart-controls.d.ts +49 -0
  3. package/chart/chart-config/chart-controls.d.ts.map +1 -0
  4. package/chart/chart-config/chart-controls.js +229 -0
  5. package/chart/chart-config/chart-controls.js.map +1 -0
  6. package/chart/chart-config/chart-tool-panel.d.ts +86 -0
  7. package/chart/chart-config/chart-tool-panel.d.ts.map +1 -0
  8. package/chart/chart-config/chart-tool-panel.js +402 -0
  9. package/chart/chart-config/chart-tool-panel.js.map +1 -0
  10. package/chart/chart-panel.d.ts +97 -0
  11. package/chart/chart-panel.d.ts.map +1 -1
  12. package/chart/chart-panel.js +211 -58
  13. package/chart/chart-panel.js.map +1 -1
  14. package/chart/chart-renderer.d.ts +97 -0
  15. package/chart/chart-renderer.d.ts.map +1 -1
  16. package/chart/chart-renderer.js +335 -72
  17. package/chart/chart-renderer.js.map +1 -1
  18. package/chart/chart-theme.d.ts +38 -0
  19. package/chart/chart-theme.d.ts.map +1 -0
  20. package/chart/chart-theme.js +47 -0
  21. package/chart/chart-theme.js.map +1 -0
  22. package/chart/model/chart-model-mapper.d.ts +38 -0
  23. package/chart/model/chart-model-mapper.d.ts.map +1 -0
  24. package/chart/model/chart-model-mapper.js +128 -0
  25. package/chart/model/chart-model-mapper.js.map +1 -0
  26. package/chart/model/chart-model.d.ts +153 -0
  27. package/chart/model/chart-model.d.ts.map +1 -0
  28. package/chart/model/chart-model.js +79 -0
  29. package/chart/model/chart-model.js.map +1 -0
  30. package/chart/range-chart-controller.d.ts +68 -0
  31. package/chart/range-chart-controller.d.ts.map +1 -0
  32. package/chart/range-chart-controller.js +209 -0
  33. package/chart/range-chart-controller.js.map +1 -0
  34. package/chart/range-chart-service.d.ts +78 -0
  35. package/chart/range-chart-service.d.ts.map +1 -0
  36. package/chart/range-chart-service.js +162 -0
  37. package/chart/range-chart-service.js.map +1 -0
  38. package/core/grid-api.d.ts +20 -0
  39. package/core/grid-api.d.ts.map +1 -1
  40. package/core/grid-api.js +41 -0
  41. package/core/grid-api.js.map +1 -1
  42. package/core/grid-context.d.ts +7 -0
  43. package/core/grid-context.d.ts.map +1 -1
  44. package/core/grid-core.d.ts.map +1 -1
  45. package/core/grid-core.js +21 -9
  46. package/core/grid-core.js.map +1 -1
  47. package/package.json +57 -70
  48. package/styles/base/chart-config.css.d.ts +10 -0
  49. package/styles/base/chart-config.css.d.ts.map +1 -0
  50. package/styles/base/chart-config.css.js +126 -0
  51. package/styles/base/chart-config.css.js.map +1 -0
  52. package/styles/base/chart-controls.css.d.ts +7 -0
  53. package/styles/base/chart-controls.css.d.ts.map +1 -0
  54. package/styles/base/chart-controls.css.js +165 -0
  55. package/styles/base/chart-controls.css.js.map +1 -0
  56. package/styles/base/chart-panel.css.d.ts +1 -1
  57. package/styles/base/chart-panel.css.d.ts.map +1 -1
  58. package/styles/base/chart-panel.css.js +12 -4
  59. package/styles/base/chart-panel.css.js.map +1 -1
  60. package/styles/base-styles.d.ts.map +1 -1
  61. package/styles/base-styles.js +4 -0
  62. package/styles/base-styles.js.map +1 -1
  63. package/types/event.types.d.ts +29 -0
  64. package/types/event.types.d.ts.map +1 -1
  65. package/types/event.types.js +1 -0
  66. package/types/event.types.js.map +1 -1
  67. package/types/grid.types.d.ts +51 -0
  68. package/types/grid.types.d.ts.map +1 -1
@@ -0,0 +1,153 @@
1
+ import type { CellRange } from '../../types/grid.types';
2
+ import type { ChartPanelType } from '../chart-panel';
3
+ /**
4
+ * How multiple grid rows sharing a category value are collapsed into a single
5
+ * chart data point.
6
+ *
7
+ * - `sum` / `avg` / `count` / `min` / `max` — standard reductions.
8
+ * - `none` — no aggregation: every selected data row becomes its own category
9
+ * (matches AG Grid's "Aggregate" toggle in the off position).
10
+ */
11
+ export type ChartAggregation = 'sum' | 'avg' | 'count' | 'min' | 'max' | 'none';
12
+ /** Placement of the series legend relative to the plot area. */
13
+ export type LegendPosition = 'top' | 'bottom' | 'left' | 'right';
14
+ /** Horizontal text alignment used by titles and subtitles. */
15
+ export type TextAlign = 'left' | 'center' | 'right';
16
+ /**
17
+ * Title / subtitle configuration. All fields are optional; an empty or absent
18
+ * {@link TitleOptions.text} suppresses the band entirely and reclaims its space.
19
+ */
20
+ export interface TitleOptions {
21
+ readonly text?: string;
22
+ readonly color?: string;
23
+ readonly fontSize?: number;
24
+ readonly align?: TextAlign;
25
+ }
26
+ /** Legend visibility and placement. */
27
+ export interface LegendOptions {
28
+ readonly enabled: boolean;
29
+ readonly position: LegendPosition;
30
+ }
31
+ /** Per-axis presentation. Colors are optional so they can fall back to theme tokens. */
32
+ export interface AxisOptions {
33
+ readonly title?: string;
34
+ readonly titleColor?: string;
35
+ readonly labelColor?: string;
36
+ readonly lineColor?: string;
37
+ readonly showGridLines?: boolean;
38
+ readonly showTicks?: boolean;
39
+ readonly showLabels?: boolean;
40
+ }
41
+ /**
42
+ * Series styling. {@link SeriesStyle.colorByKey} maps a series' column id (or
43
+ * label) to an explicit color override; unmapped series fall back to the theme
44
+ * palette. Stroke / fill apply to line and area series.
45
+ */
46
+ export interface SeriesStyle {
47
+ readonly colorByKey: Readonly<Record<string, string>>;
48
+ readonly strokeWidth?: number;
49
+ readonly fillOpacity?: number;
50
+ }
51
+ /** Chart-wide presentation not tied to a specific axis or series. */
52
+ export interface ChartStyleOptions {
53
+ readonly backgroundColor?: string;
54
+ readonly fontFamily?: string;
55
+ readonly fontSize?: number;
56
+ }
57
+ /**
58
+ * The complete, serializable definition of a range chart. This is the single
59
+ * source of truth a {@link RangeChartController} renders from — it can be read
60
+ * via `api.getChartModels()` and re-applied via `api.restoreChart(model)`.
61
+ *
62
+ * The model is treated as immutable: mutations go through {@link applyModelChange},
63
+ * which returns a new frozen instance rather than editing in place.
64
+ */
65
+ export interface ChartModel {
66
+ /** Stable identifier, unique within a grid. */
67
+ readonly chartId: string;
68
+ /** Concrete chart type drawn by the renderer. */
69
+ readonly chartType: ChartPanelType;
70
+ /** The grid cell range the chart was created from. */
71
+ readonly cellRange: CellRange;
72
+ /**
73
+ * Column ids that form the chart's candidate pool — the union of every source
74
+ * cell range's columns, in visible order. Drives which columns the Set Up tab
75
+ * offers for the category and series roles, so non-contiguous multi-range
76
+ * selections are represented faithfully (not just the bounding {@link cellRange}).
77
+ */
78
+ readonly chartColIds: readonly string[];
79
+ /** Column id whose values form the category (x) axis. */
80
+ readonly categoryColId: string;
81
+ /** Column ids plotted as series (one dataset each). */
82
+ readonly seriesColIds: readonly string[];
83
+ /** Aggregation applied when rows share a category value. */
84
+ readonly aggregation: ChartAggregation;
85
+ /** When `true`, categories and series are transposed. */
86
+ readonly switchCategorySeries: boolean;
87
+ /**
88
+ * When `true` the chart is detached from the grid: it no longer re-renders on
89
+ * data / sort / filter changes and keeps its last-built snapshot.
90
+ */
91
+ readonly unlinked: boolean;
92
+ readonly title: TitleOptions;
93
+ readonly subtitle: TitleOptions;
94
+ readonly legend: LegendOptions;
95
+ readonly xAxis: AxisOptions;
96
+ readonly yAxis: AxisOptions;
97
+ readonly series: SeriesStyle;
98
+ readonly style: ChartStyleOptions;
99
+ }
100
+ /** The subset of {@link ChartModel} a caller must supply to build a default. */
101
+ export interface ChartModelSeed {
102
+ readonly chartId: string;
103
+ readonly chartType: ChartPanelType;
104
+ readonly cellRange: CellRange;
105
+ readonly categoryColId: string;
106
+ readonly seriesColIds: readonly string[];
107
+ /** Candidate column pool. Defaults to the category plus every series column. */
108
+ readonly chartColIds?: readonly string[];
109
+ readonly aggregation?: ChartAggregation;
110
+ readonly title?: string;
111
+ }
112
+ /**
113
+ * Builds a fully-populated {@link ChartModel} from the minimal information
114
+ * available at creation time, filling every optional section with sensible
115
+ * defaults. The returned model is deep-frozen.
116
+ *
117
+ * @param seed - Identity, type, range and column roles for the new chart.
118
+ * @returns A frozen, ready-to-render chart model.
119
+ */
120
+ export declare function createDefaultChartModel(seed: ChartModelSeed): ChartModel;
121
+ /**
122
+ * Produces a new {@link ChartModel} with `patch` applied over `model`. Nested
123
+ * object sections (title, legend, axes, series, style) are shallow-merged so a
124
+ * caller can patch a single field without restating the whole section. The
125
+ * result is deep-frozen; the input is never mutated.
126
+ *
127
+ * @param model - The current model.
128
+ * @param patch - Partial fields to overlay. Nested sections merge; scalars replace.
129
+ * @returns A new frozen model.
130
+ */
131
+ export declare function applyModelChange(model: ChartModel, patch: ChartModelPatch): ChartModel;
132
+ /**
133
+ * A partial chart model used by {@link applyModelChange}. Every top-level field
134
+ * and nested section is optional and independently patchable.
135
+ */
136
+ export interface ChartModelPatch {
137
+ readonly chartType?: ChartPanelType;
138
+ readonly cellRange?: CellRange;
139
+ readonly chartColIds?: readonly string[];
140
+ readonly categoryColId?: string;
141
+ readonly seriesColIds?: readonly string[];
142
+ readonly aggregation?: ChartAggregation;
143
+ readonly switchCategorySeries?: boolean;
144
+ readonly unlinked?: boolean;
145
+ readonly title?: Partial<TitleOptions>;
146
+ readonly subtitle?: Partial<TitleOptions>;
147
+ readonly legend?: Partial<LegendOptions>;
148
+ readonly xAxis?: Partial<AxisOptions>;
149
+ readonly yAxis?: Partial<AxisOptions>;
150
+ readonly series?: Partial<SeriesStyle>;
151
+ readonly style?: Partial<ChartStyleOptions>;
152
+ }
153
+ //# sourceMappingURL=chart-model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart-model.d.ts","sourceRoot":"","sources":["../../../src/chart/model/chart-model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Builds a fully-populated {@link ChartModel} from the minimal information
3
+ * available at creation time, filling every optional section with sensible
4
+ * defaults. The returned model is deep-frozen.
5
+ *
6
+ * @param seed - Identity, type, range and column roles for the new chart.
7
+ * @returns A frozen, ready-to-render chart model.
8
+ */
9
+ export function createDefaultChartModel(seed) {
10
+ const model = {
11
+ chartId: seed.chartId,
12
+ chartType: seed.chartType,
13
+ cellRange: seed.cellRange,
14
+ chartColIds: seed.chartColIds
15
+ ? [...seed.chartColIds]
16
+ : [seed.categoryColId, ...seed.seriesColIds],
17
+ categoryColId: seed.categoryColId,
18
+ seriesColIds: [...seed.seriesColIds],
19
+ aggregation: seed.aggregation ?? 'sum',
20
+ switchCategorySeries: false,
21
+ unlinked: false,
22
+ title: { text: seed.title ?? '', align: 'left' },
23
+ subtitle: { text: '', align: 'left' },
24
+ legend: { enabled: seed.seriesColIds.length > 1, position: 'bottom' },
25
+ xAxis: { showGridLines: false, showTicks: true, showLabels: true },
26
+ yAxis: { showGridLines: true, showTicks: true, showLabels: true },
27
+ series: { colorByKey: {}, strokeWidth: 2, fillOpacity: 0.4 },
28
+ style: {},
29
+ };
30
+ return deepFreeze(model);
31
+ }
32
+ /**
33
+ * Produces a new {@link ChartModel} with `patch` applied over `model`. Nested
34
+ * object sections (title, legend, axes, series, style) are shallow-merged so a
35
+ * caller can patch a single field without restating the whole section. The
36
+ * result is deep-frozen; the input is never mutated.
37
+ *
38
+ * @param model - The current model.
39
+ * @param patch - Partial fields to overlay. Nested sections merge; scalars replace.
40
+ * @returns A new frozen model.
41
+ */
42
+ export function applyModelChange(model, patch) {
43
+ const next = {
44
+ ...model,
45
+ ...patch,
46
+ chartColIds: patch.chartColIds ? [...patch.chartColIds] : model.chartColIds,
47
+ seriesColIds: patch.seriesColIds ? [...patch.seriesColIds] : model.seriesColIds,
48
+ title: patch.title ? { ...model.title, ...patch.title } : model.title,
49
+ subtitle: patch.subtitle ? { ...model.subtitle, ...patch.subtitle } : model.subtitle,
50
+ legend: patch.legend ? { ...model.legend, ...patch.legend } : model.legend,
51
+ xAxis: patch.xAxis ? { ...model.xAxis, ...patch.xAxis } : model.xAxis,
52
+ yAxis: patch.yAxis ? { ...model.yAxis, ...patch.yAxis } : model.yAxis,
53
+ series: patch.series ? mergeSeries(model.series, patch.series) : model.series,
54
+ style: patch.style ? { ...model.style, ...patch.style } : model.style,
55
+ };
56
+ return deepFreeze(next);
57
+ }
58
+ /** Merges a series patch, deep-merging the {@link SeriesStyle.colorByKey} map. */
59
+ function mergeSeries(current, patch) {
60
+ return {
61
+ ...current,
62
+ ...patch,
63
+ colorByKey: patch.colorByKey ? { ...current.colorByKey, ...patch.colorByKey } : current.colorByKey,
64
+ };
65
+ }
66
+ /**
67
+ * Recursively freezes an object graph so a model cannot be mutated after
68
+ * construction. Arrays and plain nested objects are frozen; primitives are
69
+ * returned as-is.
70
+ */
71
+ function deepFreeze(value) {
72
+ if (value === null || typeof value !== 'object' || Object.isFrozen(value))
73
+ return value;
74
+ for (const key of Object.keys(value)) {
75
+ deepFreeze(value[key]);
76
+ }
77
+ return Object.freeze(value);
78
+ }
79
+ //# sourceMappingURL=chart-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart-model.js","sourceRoot":"","sources":["../../../src/chart/model/chart-model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ import type { GridContext } from '../core/grid-context';
2
+ import type { ChartToolbarItem, ChartToolPanelName } from '../types/grid.types';
3
+ import { type ChartPanelHost } from './chart-panel';
4
+ import type { ChartRenderOptions } from './chart-renderer';
5
+ import { type ChartColumnOption, type ChartToolPanelHost } from './chart-config/chart-tool-panel';
6
+ import { type ChartModel, type ChartModelPatch } from './model/chart-model';
7
+ /**
8
+ * Owns a single range chart: its serializable {@link ChartModel}, the floating
9
+ * {@link ChartPanel} view, the docked {@link ChartToolPanel}, and the grid
10
+ * subscription that keeps a linked chart in sync with the data.
11
+ *
12
+ * Implements both {@link ChartPanelHost} (render options + toolbar actions) and
13
+ * {@link ChartToolPanelHost} (model + column options for the config tabs), so
14
+ * the two views can be pure and stateless.
15
+ */
16
+ export declare class RangeChartController implements ChartPanelHost, ChartToolPanelHost {
17
+ private readonly ctx;
18
+ private readonly hostEl;
19
+ private readonly onDestroyed;
20
+ private model;
21
+ private readonly panel;
22
+ private toolPanel;
23
+ private unsubscribeRows;
24
+ private refreshRaf;
25
+ private disposed;
26
+ constructor(ctx: GridContext, hostEl: HTMLElement, model: ChartModel, onDestroyed: (chartId: string) => void);
27
+ /** Opens the chart and, for a linked chart, subscribes to grid data changes. */
28
+ start(): void;
29
+ /** The current chart model (a frozen snapshot). */
30
+ getModel(): ChartModel;
31
+ /**
32
+ * Applies a model patch, rebuilds the chart, and notifies listeners. Central
33
+ * mutation path for every config control and API `updateChart` call.
34
+ */
35
+ updateModel(patch: ChartModelPatch): void;
36
+ /** Rebuilds chart data from the latest grid rows. No-op when unlinked. */
37
+ refreshFromGrid(): void;
38
+ /** Opens the configuration drawer inside the chart card, optionally on a tab. */
39
+ openToolPanel(tab?: ChartToolPanelName): void;
40
+ /** Detaches the chart from the grid, freezing its current snapshot. */
41
+ unlink(): void;
42
+ /** A data-URL snapshot of the chart. */
43
+ getImageDataURL(format?: 'png' | 'jpeg'): string | null;
44
+ /** Triggers a browser download of the chart. */
45
+ downloadImage(format?: 'png' | 'jpeg'): void;
46
+ /** Tears down the chart, its views, and its subscription. Idempotent. */
47
+ dispose(): void;
48
+ getRenderOptions(size: {
49
+ width: number;
50
+ height: number;
51
+ }): ChartRenderOptions;
52
+ getToolbarItems(): ChartToolbarItem[];
53
+ isUnlinked(): boolean;
54
+ onEditChart(): void;
55
+ onAdvancedSettings(): void;
56
+ onUnlink(): void;
57
+ onMove(_rect: DOMRect): void;
58
+ onClose(): void;
59
+ getColumnOptions(): ChartColumnOption[];
60
+ getPanels(): ChartToolPanelName[];
61
+ getDefaultPanel(): ChartToolPanelName;
62
+ private buildData;
63
+ private subscribe;
64
+ private teardownSubscription;
65
+ /** Coalesces multiple grid updates in a frame into a single rebuild. */
66
+ private scheduleRefresh;
67
+ }
68
+ //# sourceMappingURL=range-chart-controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"range-chart-controller.d.ts","sourceRoot":"","sources":["../../src/chart/range-chart-controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEhF,OAAO,EAAc,KAAK,cAAc,EAAuB,MAAM,eAAe,CAAC;AACrF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAkB,KAAK,iBAAiB,EAAE,KAAK,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAClH,OAAO,EAAoB,KAAK,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAW9F;;;;;;;;GAQG;AACH,qBAAa,oBAAqB,YAAW,cAAc,EAAE,kBAAkB;IAS3E,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAEvB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAX9B,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,eAAe,CAA6B;IACpD,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,QAAQ,CAAS;gBAGN,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,WAAW,EACpC,KAAK,EAAE,UAAU,EACA,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI;IAMzD,gFAAgF;IAChF,KAAK,IAAI,IAAI;IAOb,mDAAmD;IACnD,QAAQ,IAAI,UAAU;IAItB;;;OAGG;IACH,WAAW,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IAsBzC,0EAA0E;IAC1E,eAAe,IAAI,IAAI;IASvB,iFAAiF;IACjF,aAAa,CAAC,GAAG,CAAC,EAAE,kBAAkB,GAAG,IAAI;IAS7C,uEAAuE;IACvE,MAAM,IAAI,IAAI;IAKd,wCAAwC;IACxC,eAAe,CAAC,MAAM,GAAE,KAAK,GAAG,MAAc,GAAG,MAAM,GAAG,IAAI;IAI9D,gDAAgD;IAChD,aAAa,CAAC,MAAM,GAAE,KAAK,GAAG,MAAc,GAAG,IAAI;IAInD,yEAAyE;IACzE,OAAO,IAAI,IAAI;IAoBf,gBAAgB,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,kBAAkB;IAI7E,eAAe,IAAI,gBAAgB,EAAE;IAMrC,UAAU,IAAI,OAAO;IAIrB,WAAW,IAAI,IAAI;IAInB,kBAAkB,IAAI,IAAI;IAI1B,QAAQ,IAAI,IAAI;IAIhB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAK5B,OAAO,IAAI,IAAI;IAMf,gBAAgB,IAAI,iBAAiB,EAAE;IA0BvC,SAAS,IAAI,kBAAkB,EAAE;IAIjC,eAAe,IAAI,kBAAkB;IAMrC,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,oBAAoB;IAK5B,wEAAwE;IACxE,OAAO,CAAC,eAAe;CAOxB"}
@@ -0,0 +1,209 @@
1
+ import { GridEventType } from '../types/event.types';
2
+ import { ChartPanel } from './chart-panel';
3
+ import { ChartToolPanel } from './chart-config/chart-tool-panel';
4
+ import { applyModelChange } from './model/chart-model';
5
+ import { buildChartData, toRenderOptions } from './model/chart-model-mapper';
6
+ /** Column data types treated as measures (plottable series). */
7
+ const MEASURE_TYPES = new Set(['number', 'currency', 'percentage']);
8
+ /** Column data types treated as dimensions (category candidates). */
9
+ const DIMENSION_TYPES = new Set(['string', 'dropdown', 'date', 'boolean', 'email']);
10
+ /** Default `⋮` toolbar items in display order. */
11
+ const DEFAULT_TOOLBAR_ITEMS = ['edit', 'advancedSettings', 'unlink', 'download'];
12
+ /**
13
+ * Owns a single range chart: its serializable {@link ChartModel}, the floating
14
+ * {@link ChartPanel} view, the docked {@link ChartToolPanel}, and the grid
15
+ * subscription that keeps a linked chart in sync with the data.
16
+ *
17
+ * Implements both {@link ChartPanelHost} (render options + toolbar actions) and
18
+ * {@link ChartToolPanelHost} (model + column options for the config tabs), so
19
+ * the two views can be pure and stateless.
20
+ */
21
+ export class RangeChartController {
22
+ constructor(ctx, hostEl, model, onDestroyed) {
23
+ this.ctx = ctx;
24
+ this.hostEl = hostEl;
25
+ this.onDestroyed = onDestroyed;
26
+ this.toolPanel = null;
27
+ this.unsubscribeRows = null;
28
+ this.refreshRaf = null;
29
+ this.disposed = false;
30
+ this.model = model;
31
+ this.panel = new ChartPanel(hostEl);
32
+ }
33
+ /** Opens the chart and, for a linked chart, subscribes to grid data changes. */
34
+ start() {
35
+ this.panel.setHost(this);
36
+ this.panel.setChartType(this.model.chartType);
37
+ this.panel.open(this.model.chartType, this.model.title.text || 'Range Chart', this.buildData());
38
+ if (!this.model.unlinked)
39
+ this.subscribe();
40
+ }
41
+ /** The current chart model (a frozen snapshot). */
42
+ getModel() {
43
+ return this.model;
44
+ }
45
+ /**
46
+ * Applies a model patch, rebuilds the chart, and notifies listeners. Central
47
+ * mutation path for every config control and API `updateChart` call.
48
+ */
49
+ updateModel(patch) {
50
+ if (this.disposed)
51
+ return;
52
+ const wasLinked = !this.model.unlinked;
53
+ this.model = applyModelChange(this.model, patch);
54
+ if (patch.unlinked === true && wasLinked)
55
+ this.teardownSubscription();
56
+ else if (patch.unlinked === false && !wasLinked)
57
+ this.subscribe();
58
+ this.panel.setChartType(this.model.chartType);
59
+ this.panel.update(this.buildData());
60
+ // Note: the tool panel is NOT rebuilt here. Rebuilding on every edit would
61
+ // destroy the control mid-interaction (e.g. an open color picker). Structural
62
+ // controls (chart-type gallery, series add/remove) refresh themselves; live
63
+ // style controls keep their own DOM state and only drive the chart.
64
+ this.ctx.eventBus.emit(GridEventType.CHART_OPTIONS_CHANGED, {
65
+ chartId: this.model.chartId,
66
+ chartType: this.model.chartType,
67
+ chartModel: this.model,
68
+ });
69
+ }
70
+ /** Rebuilds chart data from the latest grid rows. No-op when unlinked. */
71
+ refreshFromGrid() {
72
+ if (this.disposed || this.model.unlinked)
73
+ return;
74
+ this.panel.update(this.buildData());
75
+ this.ctx.eventBus.emit(GridEventType.CHART_RANGE_SELECTION_CHANGED, {
76
+ chartId: this.model.chartId,
77
+ cellRange: this.model.cellRange,
78
+ });
79
+ }
80
+ /** Opens the configuration drawer inside the chart card, optionally on a tab. */
81
+ openToolPanel(tab) {
82
+ const body = this.panel.getBodyElement();
83
+ if (!body)
84
+ return;
85
+ if (!this.toolPanel) {
86
+ this.toolPanel = new ChartToolPanel(body, this, (px) => this.panel.setConfigReserve(px));
87
+ }
88
+ this.toolPanel.open(tab);
89
+ }
90
+ /** Detaches the chart from the grid, freezing its current snapshot. */
91
+ unlink() {
92
+ if (this.model.unlinked)
93
+ return;
94
+ this.updateModel({ unlinked: true });
95
+ }
96
+ /** A data-URL snapshot of the chart. */
97
+ getImageDataURL(format = 'png') {
98
+ return this.panel.getImageDataURL(format);
99
+ }
100
+ /** Triggers a browser download of the chart. */
101
+ downloadImage(format = 'png') {
102
+ this.panel.download(format);
103
+ }
104
+ /** Tears down the chart, its views, and its subscription. Idempotent. */
105
+ dispose() {
106
+ if (this.disposed)
107
+ return;
108
+ this.disposed = true;
109
+ this.teardownSubscription();
110
+ if (this.refreshRaf !== null) {
111
+ cancelAnimationFrame(this.refreshRaf);
112
+ this.refreshRaf = null;
113
+ }
114
+ this.toolPanel?.destroy();
115
+ this.toolPanel = null;
116
+ this.panel.close();
117
+ this.ctx.eventBus.emit(GridEventType.CHART_DESTROYED, {
118
+ chartId: this.model.chartId,
119
+ chartType: this.model.chartType,
120
+ });
121
+ this.onDestroyed(this.model.chartId);
122
+ }
123
+ // ── ChartPanelHost ─────────────────────────────────────────────────────────
124
+ getRenderOptions(size) {
125
+ return toRenderOptions(this.model, size);
126
+ }
127
+ getToolbarItems() {
128
+ const custom = this.ctx.options.getChartToolbarItems;
129
+ const base = [...DEFAULT_TOOLBAR_ITEMS];
130
+ return custom ? custom(base) : base;
131
+ }
132
+ isUnlinked() {
133
+ return this.model.unlinked;
134
+ }
135
+ onEditChart() {
136
+ this.openToolPanel();
137
+ }
138
+ onAdvancedSettings() {
139
+ this.openToolPanel('customize');
140
+ }
141
+ onUnlink() {
142
+ this.unlink();
143
+ }
144
+ onMove(_rect) {
145
+ // The configuration drawer is a child of the chart card, so it moves with
146
+ // the card automatically — no external re-docking is required.
147
+ }
148
+ onClose() {
149
+ this.dispose();
150
+ }
151
+ // ── ChartToolPanelHost ─────────────────────────────────────────────────────
152
+ getColumnOptions() {
153
+ const visible = this.ctx.columnModel.getVisibleColumns();
154
+ // Prefer the model's explicit candidate pool (union of the source ranges);
155
+ // fall back to the bounding cellRange for models seeded before chartColIds,
156
+ // then to all visible columns.
157
+ let cols;
158
+ if (this.model.chartColIds && this.model.chartColIds.length > 0) {
159
+ const byId = new Map(visible.map((c) => [c.colId, c]));
160
+ cols = this.model.chartColIds
161
+ .map((id) => byId.get(id))
162
+ .filter((c) => c !== undefined);
163
+ }
164
+ else {
165
+ const { startColIndex, endColIndex } = this.model.cellRange;
166
+ const lo = Math.min(startColIndex, endColIndex);
167
+ const hi = Math.max(startColIndex, endColIndex);
168
+ const inRange = visible.slice(lo, hi + 1);
169
+ cols = inRange.length > 0 ? inRange : visible;
170
+ }
171
+ return cols.map((c) => ({
172
+ colId: c.colId,
173
+ header: c.header,
174
+ isMeasure: MEASURE_TYPES.has(c.type),
175
+ isDimension: DIMENSION_TYPES.has(c.type),
176
+ }));
177
+ }
178
+ getPanels() {
179
+ return this.ctx.options.chartToolPanelsDef?.panels ?? ['chart', 'setup', 'customize'];
180
+ }
181
+ getDefaultPanel() {
182
+ return this.ctx.options.chartToolPanelsDef?.defaultToolPanel ?? 'chart';
183
+ }
184
+ // ── Internals ──────────────────────────────────────────────────────────────
185
+ buildData() {
186
+ const rows = this.ctx.store.get('visibleRows');
187
+ const columns = this.ctx.columnModel.getAllColumns();
188
+ return buildChartData(this.model, rows, columns);
189
+ }
190
+ subscribe() {
191
+ if (this.unsubscribeRows)
192
+ return;
193
+ this.unsubscribeRows = this.ctx.store.watch('visibleRows', () => this.scheduleRefresh());
194
+ }
195
+ teardownSubscription() {
196
+ this.unsubscribeRows?.();
197
+ this.unsubscribeRows = null;
198
+ }
199
+ /** Coalesces multiple grid updates in a frame into a single rebuild. */
200
+ scheduleRefresh() {
201
+ if (this.refreshRaf !== null || this.disposed)
202
+ return;
203
+ this.refreshRaf = requestAnimationFrame(() => {
204
+ this.refreshRaf = null;
205
+ this.refreshFromGrid();
206
+ });
207
+ }
208
+ }
209
+ //# sourceMappingURL=range-chart-controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"range-chart-controller.js","sourceRoot":"","sources":["../../src/chart/range-chart-controller.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ import type { GridContext } from '../core/grid-context';
2
+ import type { CellRange } from '../types/grid.types';
3
+ import type { ChartPanelType } from './chart-panel';
4
+ import { type ChartAggregation, type ChartModel } from './model/chart-model';
5
+ /** Parameters for {@link RangeChartService.createRangeChart}. */
6
+ export interface CreateRangeChartParams {
7
+ /**
8
+ * Grid cell range the chart is built from. For a single-range selection this
9
+ * is the range; for a multi-range selection it should be the primary range,
10
+ * with the full set passed via {@link CreateRangeChartParams.cellRanges}.
11
+ */
12
+ readonly cellRange: CellRange;
13
+ /**
14
+ * All selected cell ranges when charting a multi-range (e.g. non-contiguous
15
+ * column) selection. Their columns are unioned into the candidate pool. When
16
+ * omitted, only {@link CreateRangeChartParams.cellRange} is used.
17
+ */
18
+ readonly cellRanges?: readonly CellRange[];
19
+ /** Chart type. Defaults to the grid's `defaultChartType`, then `column-grouped`. */
20
+ readonly chartType?: ChartPanelType;
21
+ /** Category (x-axis) column id. Auto-detected from the range when omitted. */
22
+ readonly categoryColId?: string;
23
+ /** Series column ids. Auto-detected (numeric columns) when omitted. */
24
+ readonly seriesColIds?: readonly string[];
25
+ /** Aggregation for rows sharing a category. Defaults to `sum`. */
26
+ readonly aggregation?: ChartAggregation;
27
+ /** When `true`, the floating panel is not opened (headless model only). */
28
+ readonly suppressPanel?: boolean;
29
+ }
30
+ /**
31
+ * Owns every range chart in a grid. Seeds serializable {@link ChartModel}s from
32
+ * cell ranges, constructs a {@link RangeChartController} per chart, routes the
33
+ * GridApi chart surface, and disposes everything on grid teardown.
34
+ */
35
+ export declare class RangeChartService {
36
+ private readonly ctx;
37
+ private readonly charts;
38
+ private readonly hostEl;
39
+ private nextId;
40
+ constructor(ctx: GridContext);
41
+ /**
42
+ * Creates a range chart from a cell range and opens its panel.
43
+ *
44
+ * @param params - Range, type, and optional column roles.
45
+ * @returns The new chart id, or an empty string when the range has no numeric
46
+ * columns to plot.
47
+ */
48
+ createRangeChart(params: CreateRangeChartParams): string;
49
+ /** Serializable models for every live chart (for save / restore). */
50
+ getChartModels(): ChartModel[];
51
+ /** Applies a full model to an existing chart, matched by `chartId`. */
52
+ updateChart(model: ChartModel): void;
53
+ /** Recreates a chart from a previously saved model, opening its panel. */
54
+ restoreChart(model: ChartModel): string;
55
+ /** A data-URL image of a chart, or null if unknown. */
56
+ getChartImageDataURL(chartId: string, format?: 'png' | 'jpeg'): string | null;
57
+ /** Triggers a browser download of a chart. */
58
+ downloadChart(chartId: string, format?: 'png' | 'jpeg'): void;
59
+ /** Destroys a single chart. */
60
+ destroyChart(chartId: string): void;
61
+ /** Destroys every chart. Called on grid teardown. */
62
+ disposeAll(): void;
63
+ /**
64
+ * Builds a default model from the params, auto-detecting the category and
65
+ * series columns from the selection when the caller didn't specify them.
66
+ * Collapses one or many cell ranges into a single ordered, de-duplicated pool
67
+ * of candidate columns. Returns `null` when the selection contains no numeric
68
+ * column to plot.
69
+ */
70
+ private seedModel;
71
+ /**
72
+ * Unions the visible columns spanned by every cell range into a single list in
73
+ * visible (left-to-right) order, without duplicates. Falls back to all visible
74
+ * columns when the ranges resolve to an empty span. `O(ranges + columns)`.
75
+ */
76
+ private collectRangeColumns;
77
+ }
78
+ //# sourceMappingURL=range-chart-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"range-chart-service.d.ts","sourceRoot":"","sources":["../../src/chart/range-chart-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAGL,KAAK,gBAAgB,EACrB,KAAK,UAAU,EAChB,MAAM,qBAAqB,CAAC;AAQ7B,iEAAiE;AACjE,MAAM,WAAW,sBAAsB;IACrC;;;;OAIG;IACH,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B;;;;OAIG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;IAC3C,oFAAoF;IACpF,QAAQ,CAAC,SAAS,CAAC,EAAE,cAAc,CAAC;IACpC,8EAA8E;IAC9E,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,uEAAuE;IACvE,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,kEAAkE;IAClE,QAAQ,CAAC,WAAW,CAAC,EAAE,gBAAgB,CAAC;IACxC,2EAA2E;IAC3E,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;CAClC;AAED;;;;GAIG;AACH,qBAAa,iBAAiB;IAKhB,OAAO,CAAC,QAAQ,CAAC,GAAG;IAJhC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2C;IAClE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,MAAM,CAAK;gBAEU,GAAG,EAAE,WAAW;IAI7C;;;;;;OAMG;IACH,gBAAgB,CAAC,MAAM,EAAE,sBAAsB,GAAG,MAAM;IAoBxD,qEAAqE;IACrE,cAAc,IAAI,UAAU,EAAE;IAI9B,uEAAuE;IACvE,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAsBpC,0EAA0E;IAC1E,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM;IAevC,uDAAuD;IACvD,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,GAAE,KAAK,GAAG,MAAc,GAAG,MAAM,GAAG,IAAI;IAIpF,8CAA8C;IAC9C,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,GAAE,KAAK,GAAG,MAAc,GAAG,IAAI;IAIpE,+BAA+B;IAC/B,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAInC,qDAAqD;IACrD,UAAU,IAAI,IAAI;IAKlB;;;;;;OAMG;IACH,OAAO,CAAC,SAAS;IAqCjB;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;CAW5B"}