photon-grid-core 0.0.2 → 1.0.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/README.md +304 -304
- package/chart/chart-config/chart-controls.d.ts +49 -0
- package/chart/chart-config/chart-controls.d.ts.map +1 -0
- package/chart/chart-config/chart-controls.js +229 -0
- package/chart/chart-config/chart-controls.js.map +1 -0
- package/chart/chart-config/chart-tool-panel.d.ts +86 -0
- package/chart/chart-config/chart-tool-panel.d.ts.map +1 -0
- package/chart/chart-config/chart-tool-panel.js +402 -0
- package/chart/chart-config/chart-tool-panel.js.map +1 -0
- package/chart/chart-panel.d.ts +97 -0
- package/chart/chart-panel.d.ts.map +1 -1
- package/chart/chart-panel.js +211 -58
- package/chart/chart-panel.js.map +1 -1
- package/chart/chart-renderer.d.ts +97 -0
- package/chart/chart-renderer.d.ts.map +1 -1
- package/chart/chart-renderer.js +335 -72
- package/chart/chart-renderer.js.map +1 -1
- package/chart/chart-theme.d.ts +38 -0
- package/chart/chart-theme.d.ts.map +1 -0
- package/chart/chart-theme.js +47 -0
- package/chart/chart-theme.js.map +1 -0
- package/chart/model/chart-model-mapper.d.ts +38 -0
- package/chart/model/chart-model-mapper.d.ts.map +1 -0
- package/chart/model/chart-model-mapper.js +128 -0
- package/chart/model/chart-model-mapper.js.map +1 -0
- package/chart/model/chart-model.d.ts +153 -0
- package/chart/model/chart-model.d.ts.map +1 -0
- package/chart/model/chart-model.js +79 -0
- package/chart/model/chart-model.js.map +1 -0
- package/chart/range-chart-controller.d.ts +68 -0
- package/chart/range-chart-controller.d.ts.map +1 -0
- package/chart/range-chart-controller.js +209 -0
- package/chart/range-chart-controller.js.map +1 -0
- package/chart/range-chart-service.d.ts +78 -0
- package/chart/range-chart-service.d.ts.map +1 -0
- package/chart/range-chart-service.js +162 -0
- package/chart/range-chart-service.js.map +1 -0
- package/core/grid-api.d.ts +20 -0
- package/core/grid-api.d.ts.map +1 -1
- package/core/grid-api.js +41 -0
- package/core/grid-api.js.map +1 -1
- package/core/grid-context.d.ts +7 -0
- package/core/grid-context.d.ts.map +1 -1
- package/core/grid-core.d.ts.map +1 -1
- package/core/grid-core.js +21 -9
- package/core/grid-core.js.map +1 -1
- package/icons/icon-sets/core-icons.js +1 -1
- package/icons/icon-sets/core-icons.js.map +1 -1
- package/index.d.ts +1 -0
- package/index.d.ts.map +1 -1
- package/package.json +57 -70
- package/renderer/body-renderer.d.ts.map +1 -1
- package/renderer/body-renderer.js +21 -4
- package/renderer/body-renderer.js.map +1 -1
- package/renderer/cell-renderer.js +1 -1
- package/renderer/cell-renderer.js.map +1 -1
- package/renderer/column-menu.js +24 -25
- package/renderer/column-menu.js.map +1 -1
- package/renderer/column-style-manager.d.ts.map +1 -1
- package/renderer/column-style-manager.js +11 -2
- package/renderer/column-style-manager.js.map +1 -1
- package/renderer/grid-renderer.js +1 -1
- package/renderer/grid-renderer.js.map +1 -1
- package/renderer/header-renderer.d.ts.map +1 -1
- package/renderer/header-renderer.js +17 -3
- package/renderer/header-renderer.js.map +1 -1
- package/renderer/row-drag-renderer.d.ts +18 -0
- package/renderer/row-drag-renderer.d.ts.map +1 -1
- package/renderer/row-drag-renderer.js +53 -0
- package/renderer/row-drag-renderer.js.map +1 -1
- package/styles/base/cells.css.d.ts +9 -0
- package/styles/base/cells.css.d.ts.map +1 -0
- package/styles/base/cells.css.js +233 -0
- package/styles/base/cells.css.js.map +1 -0
- package/styles/base/chart-config.css.d.ts +10 -0
- package/styles/base/chart-config.css.d.ts.map +1 -0
- package/styles/base/chart-config.css.js +126 -0
- package/styles/base/chart-config.css.js.map +1 -0
- package/styles/base/chart-controls.css.d.ts +7 -0
- package/styles/base/chart-controls.css.d.ts.map +1 -0
- package/styles/base/chart-controls.css.js +165 -0
- package/styles/base/chart-controls.css.js.map +1 -0
- package/styles/base/chart-panel.css.d.ts +9 -0
- package/styles/base/chart-panel.css.d.ts.map +1 -0
- package/styles/base/chart-panel.css.js +148 -0
- package/styles/base/chart-panel.css.js.map +1 -0
- package/styles/base/column-context-menu.css.d.ts +9 -0
- package/styles/base/column-context-menu.css.d.ts.map +1 -0
- package/styles/base/column-context-menu.css.js +153 -0
- package/styles/base/column-context-menu.css.js.map +1 -0
- package/styles/base/column-group-header.css.d.ts +9 -0
- package/styles/base/column-group-header.css.d.ts.map +1 -0
- package/styles/base/column-group-header.css.js +270 -0
- package/styles/base/column-group-header.css.js.map +1 -0
- package/styles/base/context-menu.css.d.ts +9 -0
- package/styles/base/context-menu.css.d.ts.map +1 -0
- package/styles/base/context-menu.css.js +103 -0
- package/styles/base/context-menu.css.js.map +1 -0
- package/styles/base/editors.css.d.ts +9 -0
- package/styles/base/editors.css.d.ts.map +1 -0
- package/styles/base/editors.css.js +291 -0
- package/styles/base/editors.css.js.map +1 -0
- package/styles/base/filter.css.d.ts +9 -0
- package/styles/base/filter.css.d.ts.map +1 -0
- package/styles/base/filter.css.js +312 -0
- package/styles/base/filter.css.js.map +1 -0
- package/styles/base/footer.css.d.ts +9 -0
- package/styles/base/footer.css.d.ts.map +1 -0
- package/styles/base/footer.css.js +78 -0
- package/styles/base/footer.css.js.map +1 -0
- package/styles/base/group-bar-search.css.d.ts +9 -0
- package/styles/base/group-bar-search.css.d.ts.map +1 -0
- package/styles/base/group-bar-search.css.js +86 -0
- package/styles/base/group-bar-search.css.js.map +1 -0
- package/styles/base/group-drop-zone.css.d.ts +9 -0
- package/styles/base/group-drop-zone.css.d.ts.map +1 -0
- package/styles/base/group-drop-zone.css.js +173 -0
- package/styles/base/group-drop-zone.css.js.map +1 -0
- package/styles/base/header.css.d.ts +9 -0
- package/styles/base/header.css.d.ts.map +1 -0
- package/styles/base/header.css.js +206 -0
- package/styles/base/header.css.js.map +1 -0
- package/styles/base/master-detail.css.d.ts +9 -0
- package/styles/base/master-detail.css.d.ts.map +1 -0
- package/styles/base/master-detail.css.js +202 -0
- package/styles/base/master-detail.css.js.map +1 -0
- package/styles/base/misc.css.d.ts +9 -0
- package/styles/base/misc.css.d.ts.map +1 -0
- package/styles/base/misc.css.js +65 -0
- package/styles/base/misc.css.js.map +1 -0
- package/styles/base/panels.css.d.ts +9 -0
- package/styles/base/panels.css.d.ts.map +1 -0
- package/styles/base/panels.css.js +162 -0
- package/styles/base/panels.css.js.map +1 -0
- package/styles/base/photon-ai.css.d.ts +9 -0
- package/styles/base/photon-ai.css.d.ts.map +1 -0
- package/styles/base/photon-ai.css.js +200 -0
- package/styles/base/photon-ai.css.js.map +1 -0
- package/styles/base/root.css.d.ts +9 -0
- package/styles/base/root.css.d.ts.map +1 -0
- package/styles/base/root.css.js +56 -0
- package/styles/base/root.css.js.map +1 -0
- package/styles/base/row-drag.css.d.ts +9 -0
- package/styles/base/row-drag.css.d.ts.map +1 -0
- package/styles/base/row-drag.css.js +93 -0
- package/styles/base/row-drag.css.js.map +1 -0
- package/styles/base/row-group.css.d.ts +9 -0
- package/styles/base/row-group.css.d.ts.map +1 -0
- package/styles/base/row-group.css.js +79 -0
- package/styles/base/row-group.css.js.map +1 -0
- package/styles/base/rows.css.d.ts +9 -0
- package/styles/base/rows.css.d.ts.map +1 -0
- package/styles/base/rows.css.js +83 -0
- package/styles/base/rows.css.js.map +1 -0
- package/styles/base/scrollbars.css.d.ts +9 -0
- package/styles/base/scrollbars.css.d.ts.map +1 -0
- package/styles/base/scrollbars.css.js +56 -0
- package/styles/base/scrollbars.css.js.map +1 -0
- package/styles/base/sparkline.css.d.ts +9 -0
- package/styles/base/sparkline.css.d.ts.map +1 -0
- package/styles/base/sparkline.css.js +109 -0
- package/styles/base/sparkline.css.js.map +1 -0
- package/styles/base/tooltip.css.d.ts +9 -0
- package/styles/base/tooltip.css.d.ts.map +1 -0
- package/styles/base/tooltip.css.js +39 -0
- package/styles/base/tooltip.css.js.map +1 -0
- package/styles/base/tree.css.d.ts +9 -0
- package/styles/base/tree.css.d.ts.map +1 -0
- package/styles/base/tree.css.js +78 -0
- package/styles/base/tree.css.js.map +1 -0
- package/styles/base-styles.d.ts.map +1 -1
- package/styles/base-styles.js +60 -3026
- package/styles/base-styles.js.map +1 -1
- package/styles/themes/theme-alpine.d.ts +1 -1
- package/styles/themes/theme-alpine.d.ts.map +1 -1
- package/styles/themes/theme-alpine.js +1 -1
- package/styles/themes/theme-balham.d.ts +1 -1
- package/styles/themes/theme-balham.d.ts.map +1 -1
- package/styles/themes/theme-balham.js +0 -1
- package/styles/themes/theme-balham.js.map +1 -1
- package/styles/themes/theme-dark.d.ts +1 -1
- package/styles/themes/theme-dark.d.ts.map +1 -1
- package/styles/themes/theme-dark.js +1 -1
- package/styles/themes/theme-material.d.ts +1 -1
- package/styles/themes/theme-material.d.ts.map +1 -1
- package/styles/themes/theme-material.js +0 -1
- package/styles/themes/theme-material.js.map +1 -1
- package/styles/themes/theme-quartz.d.ts +1 -1
- package/styles/themes/theme-quartz.d.ts.map +1 -1
- package/styles/themes/theme-quartz.js +1 -1
- package/types/event.types.d.ts +29 -0
- package/types/event.types.d.ts.map +1 -1
- package/types/event.types.js +1 -0
- package/types/event.types.js.map +1 -1
- package/types/grid.types.d.ts +51 -0
- package/types/grid.types.d.ts.map +1 -1
- package/LICENSE +0 -1
- package/chart/chart-analyzer.d.ts +0 -12
- package/chart/chart-analyzer.d.ts.map +0 -1
- package/chart/chart-analyzer.js +0 -77
- package/chart/chart-analyzer.js.map +0 -1
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
import { ChartRenderer } from '../chart-renderer';
|
|
2
|
+
import { AGGREGATION_OPTIONS } from '../model/chart-model-mapper';
|
|
3
|
+
import { createCollapsibleSection, createColorInput, createDropdown, createNumberInput, createReorderableList, createSegmented, createTextInput, createToggle, } from './chart-controls';
|
|
4
|
+
/** Gallery groups mirroring AG Grid's Chart tab. */
|
|
5
|
+
const GALLERY = [
|
|
6
|
+
{
|
|
7
|
+
group: 'Column',
|
|
8
|
+
entries: [
|
|
9
|
+
{ type: 'column-grouped', label: 'Grouped' },
|
|
10
|
+
{ type: 'column-stacked', label: 'Stacked' },
|
|
11
|
+
{ type: 'column-100stacked', label: '100% Stacked' },
|
|
12
|
+
],
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
group: 'Bar',
|
|
16
|
+
entries: [
|
|
17
|
+
{ type: 'bar-grouped', label: 'Grouped' },
|
|
18
|
+
{ type: 'bar-stacked', label: 'Stacked' },
|
|
19
|
+
{ type: 'bar-100stacked', label: '100% Stacked' },
|
|
20
|
+
],
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
group: 'Pie',
|
|
24
|
+
entries: [
|
|
25
|
+
{ type: 'pie', label: 'Pie' },
|
|
26
|
+
{ type: 'doughnut', label: 'Doughnut' },
|
|
27
|
+
{ type: 'polar', label: 'Polar' },
|
|
28
|
+
],
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
group: 'Line & Area',
|
|
32
|
+
entries: [
|
|
33
|
+
{ type: 'line', label: 'Line' },
|
|
34
|
+
{ type: 'area', label: 'Area' },
|
|
35
|
+
{ type: 'scatter', label: 'Scatter' },
|
|
36
|
+
],
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
group: 'Other',
|
|
40
|
+
entries: [{ type: 'funnel', label: 'Funnel' }],
|
|
41
|
+
},
|
|
42
|
+
];
|
|
43
|
+
/**
|
|
44
|
+
* Fixed sample data used to draw each gallery thumbnail. Two short series give
|
|
45
|
+
* every chart family a representative silhouette (grouped vs. stacked columns,
|
|
46
|
+
* multi-slice pies, two-line charts). Labels are intentionally empty so previews
|
|
47
|
+
* render as pure, full-bleed charts with no category text.
|
|
48
|
+
*/
|
|
49
|
+
const PREVIEW_DATA = {
|
|
50
|
+
labels: ['', '', '', ''],
|
|
51
|
+
datasets: [
|
|
52
|
+
{ label: 'Series 1', data: [6, 9, 5, 8] },
|
|
53
|
+
{ label: 'Series 2', data: [4, 6, 8, 5] },
|
|
54
|
+
],
|
|
55
|
+
};
|
|
56
|
+
/** Fallback thumbnail resolution used before the canvas has been laid out. */
|
|
57
|
+
const THUMB_W = 132;
|
|
58
|
+
const THUMB_H = 64;
|
|
59
|
+
/** Drawer slide duration; must match the CSS `transition` on `.pg-chart-config`. */
|
|
60
|
+
const DRAWER_TRANSITION_MS = 240;
|
|
61
|
+
const LEGEND_POSITIONS = [
|
|
62
|
+
{ value: 'top', label: 'Top' },
|
|
63
|
+
{ value: 'right', label: 'Right' },
|
|
64
|
+
{ value: 'bottom', label: 'Bottom' },
|
|
65
|
+
{ value: 'left', label: 'Left' },
|
|
66
|
+
];
|
|
67
|
+
const ALIGNMENTS = [
|
|
68
|
+
{ value: 'left', label: 'Left' },
|
|
69
|
+
{ value: 'center', label: 'Center' },
|
|
70
|
+
{ value: 'right', label: 'Right' },
|
|
71
|
+
];
|
|
72
|
+
/** Font-family presets offered in the Customize tab. Empty value inherits the theme font. */
|
|
73
|
+
const FONT_FAMILIES = [
|
|
74
|
+
{ value: '', label: 'Theme default' },
|
|
75
|
+
{ value: 'Inter, system-ui, sans-serif', label: 'Inter' },
|
|
76
|
+
{ value: 'system-ui, sans-serif', label: 'System UI' },
|
|
77
|
+
{ value: 'Arial, Helvetica, sans-serif', label: 'Arial' },
|
|
78
|
+
{ value: 'Roboto, Arial, sans-serif', label: 'Roboto' },
|
|
79
|
+
{ value: 'Georgia, "Times New Roman", serif', label: 'Georgia' },
|
|
80
|
+
{ value: '"Courier New", monospace', label: 'Monospace' },
|
|
81
|
+
];
|
|
82
|
+
const ICON_CLOSE = `<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg>`;
|
|
83
|
+
const TAB_LABELS = {
|
|
84
|
+
chart: 'Chart',
|
|
85
|
+
setup: 'Set Up',
|
|
86
|
+
customize: 'Customize',
|
|
87
|
+
};
|
|
88
|
+
/**
|
|
89
|
+
* The docked chart configuration panel. Renders the Chart / Set Up / Customize
|
|
90
|
+
* tabs from the current {@link ChartModel} and forwards every edit back to the
|
|
91
|
+
* host as a model patch. Purely presentational — it holds no chart state.
|
|
92
|
+
*/
|
|
93
|
+
export class ChartToolPanel {
|
|
94
|
+
constructor(containerEl, host,
|
|
95
|
+
/** Notified with the drawer's width on open and 0 on close, so the host can
|
|
96
|
+
* reflow the chart beside the drawer instead of behind it. */
|
|
97
|
+
onReserveChange) {
|
|
98
|
+
this.containerEl = containerEl;
|
|
99
|
+
this.host = host;
|
|
100
|
+
this.onReserveChange = onReserveChange;
|
|
101
|
+
this.rootEl = null;
|
|
102
|
+
this.tabsEl = null;
|
|
103
|
+
this.bodyEl = null;
|
|
104
|
+
/** Live renderers backing the Chart-tab preview thumbnails; disposed on rebuild. */
|
|
105
|
+
this.thumbRenderers = [];
|
|
106
|
+
/** Pending slide-in RAF handle, so an immediate destroy can cancel it. */
|
|
107
|
+
this.openRaf = null;
|
|
108
|
+
/** Pending slide-out timer, cleared if the panel is reopened or destroyed. */
|
|
109
|
+
this.closeTimer = null;
|
|
110
|
+
this.activeTab = host.getDefaultPanel();
|
|
111
|
+
}
|
|
112
|
+
/** Whether the panel is currently mounted. */
|
|
113
|
+
isOpen() {
|
|
114
|
+
return this.rootEl !== null;
|
|
115
|
+
}
|
|
116
|
+
/** Mounts the drawer (optionally on a specific tab), rendering and sliding it in. */
|
|
117
|
+
open(tab) {
|
|
118
|
+
if (tab)
|
|
119
|
+
this.activeTab = tab;
|
|
120
|
+
// A pending slide-out is aborted so a reopen resolves to the open state.
|
|
121
|
+
if (this.closeTimer !== null) {
|
|
122
|
+
clearTimeout(this.closeTimer);
|
|
123
|
+
this.closeTimer = null;
|
|
124
|
+
}
|
|
125
|
+
if (!this.rootEl)
|
|
126
|
+
this.build();
|
|
127
|
+
else
|
|
128
|
+
this.render();
|
|
129
|
+
this.slideIn();
|
|
130
|
+
// Reserve the chart space for the drawer's width so the chart reflows beside it.
|
|
131
|
+
this.onReserveChange?.(this.rootEl ? this.rootEl.offsetWidth : 0);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Slides the drawer out (left → right) and unmounts it once the transition
|
|
135
|
+
* ends. The instance is retained so a later {@link open} rebuilds cleanly.
|
|
136
|
+
*/
|
|
137
|
+
close() {
|
|
138
|
+
if (!this.rootEl)
|
|
139
|
+
return;
|
|
140
|
+
if (this.openRaf !== null) {
|
|
141
|
+
cancelAnimationFrame(this.openRaf);
|
|
142
|
+
this.openRaf = null;
|
|
143
|
+
}
|
|
144
|
+
this.rootEl.classList.remove('pg-chart-config--open');
|
|
145
|
+
this.onReserveChange?.(0);
|
|
146
|
+
const root = this.rootEl;
|
|
147
|
+
this.closeTimer = window.setTimeout(() => {
|
|
148
|
+
this.closeTimer = null;
|
|
149
|
+
if (this.rootEl === root)
|
|
150
|
+
this.teardown();
|
|
151
|
+
}, DRAWER_TRANSITION_MS);
|
|
152
|
+
}
|
|
153
|
+
/** Immediately unmounts and disposes the drawer with no exit animation. */
|
|
154
|
+
destroy() {
|
|
155
|
+
if (this.openRaf !== null) {
|
|
156
|
+
cancelAnimationFrame(this.openRaf);
|
|
157
|
+
this.openRaf = null;
|
|
158
|
+
}
|
|
159
|
+
if (this.closeTimer !== null) {
|
|
160
|
+
clearTimeout(this.closeTimer);
|
|
161
|
+
this.closeTimer = null;
|
|
162
|
+
}
|
|
163
|
+
this.onReserveChange?.(0);
|
|
164
|
+
this.teardown();
|
|
165
|
+
}
|
|
166
|
+
/** Removes the DOM and releases the preview renderers. */
|
|
167
|
+
teardown() {
|
|
168
|
+
this.disposeThumbnails();
|
|
169
|
+
this.rootEl?.remove();
|
|
170
|
+
this.rootEl = null;
|
|
171
|
+
this.tabsEl = null;
|
|
172
|
+
this.bodyEl = null;
|
|
173
|
+
}
|
|
174
|
+
/** Adds the open modifier on the next frame so the slide-in transition runs. */
|
|
175
|
+
slideIn() {
|
|
176
|
+
if (!this.rootEl)
|
|
177
|
+
return;
|
|
178
|
+
const root = this.rootEl;
|
|
179
|
+
if (root.classList.contains('pg-chart-config--open'))
|
|
180
|
+
return;
|
|
181
|
+
this.openRaf = requestAnimationFrame(() => {
|
|
182
|
+
this.openRaf = null;
|
|
183
|
+
root.classList.add('pg-chart-config--open');
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
/** Rebuilds the tab strip and active tab body from the current model. */
|
|
187
|
+
render() {
|
|
188
|
+
if (!this.tabsEl || !this.bodyEl)
|
|
189
|
+
return;
|
|
190
|
+
this.renderTabs();
|
|
191
|
+
this.renderBody();
|
|
192
|
+
}
|
|
193
|
+
build() {
|
|
194
|
+
const root = document.createElement('div');
|
|
195
|
+
root.className = 'pg-chart-config';
|
|
196
|
+
const header = document.createElement('div');
|
|
197
|
+
header.className = 'pg-chart-config__header';
|
|
198
|
+
const closeBtn = document.createElement('button');
|
|
199
|
+
closeBtn.className = 'pg-chart-config__close';
|
|
200
|
+
closeBtn.title = 'Close settings';
|
|
201
|
+
closeBtn.innerHTML = ICON_CLOSE;
|
|
202
|
+
closeBtn.addEventListener('click', () => this.close());
|
|
203
|
+
const tabs = document.createElement('div');
|
|
204
|
+
tabs.className = 'pg-chart-config__tabs';
|
|
205
|
+
header.appendChild(closeBtn);
|
|
206
|
+
header.appendChild(tabs);
|
|
207
|
+
const body = document.createElement('div');
|
|
208
|
+
body.className = 'pg-chart-config__body';
|
|
209
|
+
root.appendChild(header);
|
|
210
|
+
root.appendChild(body);
|
|
211
|
+
this.containerEl.appendChild(root);
|
|
212
|
+
this.rootEl = root;
|
|
213
|
+
this.tabsEl = tabs;
|
|
214
|
+
this.bodyEl = body;
|
|
215
|
+
this.render();
|
|
216
|
+
}
|
|
217
|
+
renderTabs() {
|
|
218
|
+
const tabs = this.tabsEl;
|
|
219
|
+
tabs.innerHTML = '';
|
|
220
|
+
for (const name of this.host.getPanels()) {
|
|
221
|
+
const btn = document.createElement('button');
|
|
222
|
+
btn.className = 'pg-chart-config__tab';
|
|
223
|
+
btn.classList.toggle('pg-chart-config__tab--active', name === this.activeTab);
|
|
224
|
+
btn.textContent = TAB_LABELS[name];
|
|
225
|
+
btn.addEventListener('click', () => {
|
|
226
|
+
this.activeTab = name;
|
|
227
|
+
this.render();
|
|
228
|
+
});
|
|
229
|
+
tabs.appendChild(btn);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
renderBody() {
|
|
233
|
+
// Preview renderers only exist on the Chart tab; release them before any
|
|
234
|
+
// rebuild so switching tabs or editing never leaks canvases/animation RAFs.
|
|
235
|
+
this.disposeThumbnails();
|
|
236
|
+
const body = this.bodyEl;
|
|
237
|
+
body.innerHTML = '';
|
|
238
|
+
const model = this.host.getModel();
|
|
239
|
+
switch (this.activeTab) {
|
|
240
|
+
case 'chart':
|
|
241
|
+
this.renderChartTab(body, model);
|
|
242
|
+
break;
|
|
243
|
+
case 'setup':
|
|
244
|
+
this.renderSetupTab(body, model);
|
|
245
|
+
break;
|
|
246
|
+
case 'customize':
|
|
247
|
+
this.renderCustomizeTab(body, model);
|
|
248
|
+
break;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
// ── Chart tab: type gallery with live previews ─────────────────────────────
|
|
252
|
+
renderChartTab(body, model) {
|
|
253
|
+
// Collect (canvas, type) pairs while building, then render in a second pass
|
|
254
|
+
// once every canvas is attached to the DOM — the renderer resolves theme
|
|
255
|
+
// tokens via getComputedStyle, which only works on connected elements.
|
|
256
|
+
const pending = [];
|
|
257
|
+
for (const { group, entries } of GALLERY) {
|
|
258
|
+
const heading = document.createElement('div');
|
|
259
|
+
heading.className = 'pg-chart-config__group-title';
|
|
260
|
+
heading.textContent = group;
|
|
261
|
+
body.appendChild(heading);
|
|
262
|
+
const grid = document.createElement('div');
|
|
263
|
+
grid.className = 'pg-chart-config__gallery';
|
|
264
|
+
for (const entry of entries) {
|
|
265
|
+
grid.appendChild(this.buildGalleryItem(entry, entry.type === model.chartType, pending));
|
|
266
|
+
}
|
|
267
|
+
body.appendChild(grid);
|
|
268
|
+
}
|
|
269
|
+
for (const { canvas, type } of pending)
|
|
270
|
+
this.renderThumbnail(canvas, type);
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Builds one gallery cell: a real, full-bleed mini-chart of {@link PREVIEW_DATA}
|
|
274
|
+
* rendered in the entry's type. Clicking applies the type to the model, which
|
|
275
|
+
* updates the live chart in real time. The canvas is queued in `pending` for
|
|
276
|
+
* rendering after DOM insertion (so it has a measured size and theme tokens).
|
|
277
|
+
*/
|
|
278
|
+
buildGalleryItem(entry, active, pending) {
|
|
279
|
+
const cell = document.createElement('button');
|
|
280
|
+
cell.type = 'button';
|
|
281
|
+
cell.className = 'pg-chart-config__gallery-item';
|
|
282
|
+
cell.classList.toggle('pg-chart-config__gallery-item--active', active);
|
|
283
|
+
cell.title = entry.label;
|
|
284
|
+
cell.setAttribute('aria-label', entry.label);
|
|
285
|
+
const canvas = document.createElement('canvas');
|
|
286
|
+
canvas.className = 'pg-chart-config__gallery-canvas';
|
|
287
|
+
cell.appendChild(canvas);
|
|
288
|
+
// Structural change: apply the type, then re-render the tab so the active
|
|
289
|
+
// highlight moves. Safe to rebuild here — a gallery click has no open input.
|
|
290
|
+
cell.addEventListener('click', () => { this.host.updateModel({ chartType: entry.type }); this.render(); });
|
|
291
|
+
pending.push({ canvas, type: entry.type });
|
|
292
|
+
return cell;
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Draws a static, full-bleed preview of a chart type into a thumbnail canvas.
|
|
296
|
+
* The backing store is sized to the canvas's measured display size × DPR for a
|
|
297
|
+
* crisp, undistorted image; `compact` collapses the axis gutters so the chart
|
|
298
|
+
* fills the cell edge-to-edge.
|
|
299
|
+
*/
|
|
300
|
+
renderThumbnail(canvas, type) {
|
|
301
|
+
const dpr = Math.min(window.devicePixelRatio || 1, 2);
|
|
302
|
+
const cssW = canvas.clientWidth || THUMB_W;
|
|
303
|
+
const cssH = canvas.clientHeight || THUMB_H;
|
|
304
|
+
const renderer = new ChartRenderer(canvas);
|
|
305
|
+
renderer.render(PREVIEW_DATA, {
|
|
306
|
+
type,
|
|
307
|
+
width: Math.round(cssW * dpr),
|
|
308
|
+
height: Math.round(cssH * dpr),
|
|
309
|
+
padding: Math.round(6 * dpr),
|
|
310
|
+
compact: true,
|
|
311
|
+
animationDuration: 0,
|
|
312
|
+
showGrid: false,
|
|
313
|
+
showLegend: false,
|
|
314
|
+
});
|
|
315
|
+
this.thumbRenderers.push(renderer);
|
|
316
|
+
}
|
|
317
|
+
/** Disposes every preview renderer created for the Chart tab. */
|
|
318
|
+
disposeThumbnails() {
|
|
319
|
+
for (const renderer of this.thumbRenderers)
|
|
320
|
+
renderer.destroy();
|
|
321
|
+
this.thumbRenderers = [];
|
|
322
|
+
}
|
|
323
|
+
// ── Set Up tab: category / series / aggregate / switch ─────────────────────
|
|
324
|
+
renderSetupTab(body, model) {
|
|
325
|
+
const columns = this.host.getColumnOptions();
|
|
326
|
+
const catSection = createCollapsibleSection('Categories', true);
|
|
327
|
+
const dimOptions = columns
|
|
328
|
+
.filter((c) => c.isDimension || !c.isMeasure)
|
|
329
|
+
.map((c) => ({ value: c.colId, label: c.header }));
|
|
330
|
+
catSection.body.appendChild(createDropdown(dimOptions.length > 0 ? dimOptions : columns.map((c) => ({ value: c.colId, label: c.header })), model.categoryColId, (colId) => this.host.updateModel({ categoryColId: colId })));
|
|
331
|
+
catSection.body.appendChild(createToggle(model.aggregation !== 'none', (on) => this.host.updateModel({ aggregation: on ? 'sum' : 'none' }), 'Aggregate'));
|
|
332
|
+
body.appendChild(catSection.section);
|
|
333
|
+
const seriesSection = createCollapsibleSection('Series', true);
|
|
334
|
+
const seriesItems = model.seriesColIds.map((id) => {
|
|
335
|
+
const col = columns.find((c) => c.colId === id);
|
|
336
|
+
return { id, label: col?.header ?? id, color: model.series.colorByKey[col?.header ?? id] };
|
|
337
|
+
});
|
|
338
|
+
seriesSection.body.appendChild(createReorderableList(seriesItems, (orderedIds) => this.host.updateModel({ seriesColIds: orderedIds }),
|
|
339
|
+
// Removing a series changes the list structure → refresh the tab.
|
|
340
|
+
(id) => { this.host.updateModel({ seriesColIds: model.seriesColIds.filter((s) => s !== id) }); this.render(); }));
|
|
341
|
+
// "Add series" dropdown of measure columns not already plotted.
|
|
342
|
+
const addable = columns.filter((c) => c.isMeasure && !model.seriesColIds.includes(c.colId));
|
|
343
|
+
if (addable.length > 0) {
|
|
344
|
+
seriesSection.body.appendChild(createDropdown([{ value: '', label: '+ Add series…' }, ...addable.map((c) => ({ value: c.colId, label: c.header }))], '', (colId) => {
|
|
345
|
+
if (colId) {
|
|
346
|
+
this.host.updateModel({ seriesColIds: [...model.seriesColIds, colId] });
|
|
347
|
+
this.render();
|
|
348
|
+
}
|
|
349
|
+
}));
|
|
350
|
+
}
|
|
351
|
+
body.appendChild(seriesSection.section);
|
|
352
|
+
const optSection = createCollapsibleSection('Aggregation', false);
|
|
353
|
+
optSection.body.appendChild(createDropdown(AGGREGATION_OPTIONS.map((a) => ({ value: a, label: a === 'none' ? 'None' : a.toUpperCase() })), model.aggregation, (agg) => this.host.updateModel({ aggregation: agg }), 'Function'));
|
|
354
|
+
optSection.body.appendChild(createToggle(model.switchCategorySeries, (on) => this.host.updateModel({ switchCategorySeries: on }), 'Switch Category / Series'));
|
|
355
|
+
body.appendChild(optSection.section);
|
|
356
|
+
}
|
|
357
|
+
// ── Customize tab: style / titles / legend / series / axes ─────────────────
|
|
358
|
+
renderCustomizeTab(body, model) {
|
|
359
|
+
const style = createCollapsibleSection('Chart Style', true);
|
|
360
|
+
style.body.appendChild(createColorInput(model.style.backgroundColor ?? '#ffffff', (c) => this.host.updateModel({ style: { backgroundColor: c } }), 'Background'));
|
|
361
|
+
style.body.appendChild(createDropdown(FONT_FAMILIES, model.style.fontFamily ?? '', (f) => this.host.updateModel({ style: { fontFamily: f } }), 'Font family'));
|
|
362
|
+
style.body.appendChild(createNumberInput(model.style.fontSize ?? 12, (n) => this.host.updateModel({ style: { fontSize: n } }), 'Font size', 8, 32));
|
|
363
|
+
body.appendChild(style.section);
|
|
364
|
+
const titles = createCollapsibleSection('Titles', false);
|
|
365
|
+
titles.body.appendChild(createTextInput(model.title.text ?? '', (t) => this.host.updateModel({ title: { text: t } }), 'Title', 'Chart title'));
|
|
366
|
+
titles.body.appendChild(createColorInput(model.title.color ?? '#0f172a', (c) => this.host.updateModel({ title: { color: c } }), 'Title color'));
|
|
367
|
+
titles.body.appendChild(createSegmented(ALIGNMENTS, model.title.align ?? 'left', (a) => this.host.updateModel({ title: { align: a } }), 'Title align'));
|
|
368
|
+
titles.body.appendChild(createTextInput(model.subtitle.text ?? '', (t) => this.host.updateModel({ subtitle: { text: t } }), 'Subtitle', 'Subtitle'));
|
|
369
|
+
titles.body.appendChild(createColorInput(model.subtitle.color ?? '#64748b', (c) => this.host.updateModel({ subtitle: { color: c } }), 'Subtitle color'));
|
|
370
|
+
titles.body.appendChild(createSegmented(ALIGNMENTS, model.subtitle.align ?? 'left', (a) => this.host.updateModel({ subtitle: { align: a } }), 'Subtitle align'));
|
|
371
|
+
body.appendChild(titles.section);
|
|
372
|
+
const legend = createCollapsibleSection('Legend', false);
|
|
373
|
+
legend.body.appendChild(createToggle(model.legend.enabled, (on) => this.host.updateModel({ legend: { enabled: on } }), 'Show legend'));
|
|
374
|
+
legend.body.appendChild(createSegmented(LEGEND_POSITIONS, model.legend.position, (p) => this.host.updateModel({ legend: { position: p } }), 'Position'));
|
|
375
|
+
body.appendChild(legend.section);
|
|
376
|
+
const series = createCollapsibleSection('Series', false);
|
|
377
|
+
const columns = this.host.getColumnOptions();
|
|
378
|
+
for (const id of model.seriesColIds) {
|
|
379
|
+
const header = columns.find((c) => c.colId === id)?.header ?? id;
|
|
380
|
+
series.body.appendChild(createColorInput(model.series.colorByKey[header] ?? '#008ffb', (c) => this.host.updateModel({ series: { colorByKey: { [header]: c } } }), header));
|
|
381
|
+
}
|
|
382
|
+
// Stroke width and fill opacity apply to line/area series across the chart.
|
|
383
|
+
series.body.appendChild(createNumberInput(model.series.strokeWidth ?? 2, (n) => this.host.updateModel({ series: { strokeWidth: n } }), 'Stroke width', 0, 10, 0.5));
|
|
384
|
+
series.body.appendChild(createNumberInput(model.series.fillOpacity ?? 0.4, (n) => this.host.updateModel({ series: { fillOpacity: n } }), 'Fill opacity', 0, 1, 0.05));
|
|
385
|
+
body.appendChild(series.section);
|
|
386
|
+
const xAxis = createCollapsibleSection('Horizontal Axis', false);
|
|
387
|
+
xAxis.body.appendChild(createTextInput(model.xAxis.title ?? '', (t) => this.host.updateModel({ xAxis: { title: t } }), 'Title', 'X-axis title'));
|
|
388
|
+
xAxis.body.appendChild(createColorInput(model.xAxis.labelColor ?? '#64748b', (c) => this.host.updateModel({ xAxis: { labelColor: c } }), 'Label color'));
|
|
389
|
+
xAxis.body.appendChild(createColorInput(model.xAxis.lineColor ?? '#e2e8f0', (c) => this.host.updateModel({ xAxis: { lineColor: c } }), 'Line color'));
|
|
390
|
+
xAxis.body.appendChild(createToggle(model.xAxis.showGridLines ?? false, (on) => this.host.updateModel({ xAxis: { showGridLines: on } }), 'Show grid lines'));
|
|
391
|
+
xAxis.body.appendChild(createToggle(model.xAxis.showLabels ?? true, (on) => this.host.updateModel({ xAxis: { showLabels: on } }), 'Show labels'));
|
|
392
|
+
body.appendChild(xAxis.section);
|
|
393
|
+
const yAxis = createCollapsibleSection('Vertical Axis', false);
|
|
394
|
+
yAxis.body.appendChild(createTextInput(model.yAxis.title ?? '', (t) => this.host.updateModel({ yAxis: { title: t } }), 'Title', 'Y-axis title'));
|
|
395
|
+
yAxis.body.appendChild(createColorInput(model.yAxis.labelColor ?? '#64748b', (c) => this.host.updateModel({ yAxis: { labelColor: c } }), 'Label color'));
|
|
396
|
+
yAxis.body.appendChild(createColorInput(model.yAxis.lineColor ?? '#e2e8f0', (c) => this.host.updateModel({ yAxis: { lineColor: c } }), 'Line color'));
|
|
397
|
+
yAxis.body.appendChild(createToggle(model.yAxis.showGridLines ?? true, (on) => this.host.updateModel({ yAxis: { showGridLines: on } }), 'Show grid lines'));
|
|
398
|
+
yAxis.body.appendChild(createToggle(model.yAxis.showLabels ?? true, (on) => this.host.updateModel({ yAxis: { showLabels: on } }), 'Show labels'));
|
|
399
|
+
body.appendChild(yAxis.section);
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
//# sourceMappingURL=chart-tool-panel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-tool-panel.js","sourceRoot":"","sources":["../../../src/chart/chart-config/chart-tool-panel.ts"],"names":[],"mappings":"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"}
|
package/chart/chart-panel.d.ts
CHANGED
|
@@ -1,12 +1,48 @@
|
|
|
1
1
|
import type { ChartData } from './chart-data-transformer';
|
|
2
|
+
import type { ChartRenderOptions } from './chart-renderer';
|
|
3
|
+
import type { ChartToolbarItem } from '../types/grid.types';
|
|
2
4
|
export type ChartPanelType = 'column-grouped' | 'column-stacked' | 'column-100stacked' | 'bar-grouped' | 'bar-stacked' | 'bar-100stacked' | 'pie' | 'doughnut' | 'line' | 'area' | 'scatter' | 'polar' | 'funnel';
|
|
5
|
+
/**
|
|
6
|
+
* The controller behind a {@link ChartPanel}. The panel is a passive view: it
|
|
7
|
+
* measures itself, asks the host for render options, and forwards toolbar-menu
|
|
8
|
+
* actions and drag events back to the host. All chart state lives in the host.
|
|
9
|
+
*/
|
|
10
|
+
export interface ChartPanelHost {
|
|
11
|
+
/** Render options (from the chart model) sized to the panel's plot area. */
|
|
12
|
+
getRenderOptions(size: {
|
|
13
|
+
width: number;
|
|
14
|
+
height: number;
|
|
15
|
+
}): ChartRenderOptions;
|
|
16
|
+
/** Which `⋮` menu items to show, in order. Empty hides the menu. */
|
|
17
|
+
getToolbarItems(): ChartToolbarItem[];
|
|
18
|
+
/** Whether the chart is currently detached from the grid. */
|
|
19
|
+
isUnlinked(): boolean;
|
|
20
|
+
/** "Edit Chart" — open the configuration tool panel. */
|
|
21
|
+
onEditChart(): void;
|
|
22
|
+
/** "Advanced Settings" — open the tool panel on the Customize tab. */
|
|
23
|
+
onAdvancedSettings(): void;
|
|
24
|
+
/** "Unlink from Grid" — freeze the chart as a snapshot. */
|
|
25
|
+
onUnlink(): void;
|
|
26
|
+
/** Fired as the panel card moves (drag / fullscreen / recenter) so the tool panel can re-dock. */
|
|
27
|
+
onMove(rect: DOMRect): void;
|
|
28
|
+
/** Fired when the panel closes so the host can dispose its chart. */
|
|
29
|
+
onClose(): void;
|
|
30
|
+
}
|
|
3
31
|
export declare class ChartPanel {
|
|
4
32
|
private containerEl;
|
|
5
33
|
private backdropEl;
|
|
6
34
|
private cardEl;
|
|
35
|
+
private bodyEl;
|
|
36
|
+
private chartAreaEl;
|
|
7
37
|
private canvasEl;
|
|
8
38
|
private dotsMenuEl;
|
|
9
39
|
private dotsBtnEl;
|
|
40
|
+
/**
|
|
41
|
+
* Document-level `mousedown` listener that dismisses the download menu when
|
|
42
|
+
* the user clicks outside it. Held so it can be detached on close, avoiding a
|
|
43
|
+
* leaked listener across panel lifecycles.
|
|
44
|
+
*/
|
|
45
|
+
private outsideMousedownHandler;
|
|
10
46
|
private fullscreenBtnEl;
|
|
11
47
|
private legendEl;
|
|
12
48
|
private renderer;
|
|
@@ -20,10 +56,50 @@ export declare class ChartPanel {
|
|
|
20
56
|
/** Current top-left position of the card within the backdrop. */
|
|
21
57
|
private panelX;
|
|
22
58
|
private panelY;
|
|
59
|
+
/** Controller that supplies render options and handles menu/drag events. */
|
|
60
|
+
private host;
|
|
61
|
+
/** Guards {@link close} against re-entrancy when the host disposes us. */
|
|
62
|
+
private closing;
|
|
23
63
|
constructor(containerEl: HTMLElement);
|
|
64
|
+
/** Attaches the controlling host. Must be set before {@link open}. */
|
|
65
|
+
setHost(host: ChartPanelHost): void;
|
|
66
|
+
/**
|
|
67
|
+
* Replaces the chart data and re-renders. Called by the host when the model
|
|
68
|
+
* changes or the linked grid data refreshes. Rebuilds the interactive legend.
|
|
69
|
+
*/
|
|
70
|
+
update(data: ChartData | null): void;
|
|
71
|
+
/** The chart card element, for external docking (e.g. the config tool panel). */
|
|
72
|
+
getCardElement(): HTMLElement | null;
|
|
73
|
+
/**
|
|
74
|
+
* The scrollable body element that hosts the canvas. The configuration drawer
|
|
75
|
+
* mounts here so it slides in over the plot area while the header (close /
|
|
76
|
+
* fullscreen) and legend stay accessible.
|
|
77
|
+
*/
|
|
78
|
+
getBodyElement(): HTMLElement | null;
|
|
79
|
+
/**
|
|
80
|
+
* Reserves `px` of space on the right of the plot for the configuration drawer,
|
|
81
|
+
* so the chart reflows beside it instead of being hidden underneath. Passing 0
|
|
82
|
+
* releases the reservation. The chart re-renders to fill the new area (the
|
|
83
|
+
* chart-area ResizeObserver also fires as the reflow transition runs).
|
|
84
|
+
*/
|
|
85
|
+
setConfigReserve(px: number): void;
|
|
86
|
+
/** Updates the chart type used for subsequent renders. */
|
|
87
|
+
setChartType(type: ChartPanelType): void;
|
|
88
|
+
/** Returns a data-URL snapshot of the current chart, or null if not rendered. */
|
|
89
|
+
getImageDataURL(format?: 'png' | 'jpeg'): string | null;
|
|
90
|
+
/** Triggers a browser download of the chart. */
|
|
91
|
+
download(format?: 'png' | 'jpeg'): void;
|
|
24
92
|
open(type: ChartPanelType, title: string, data: ChartData | null): void;
|
|
25
93
|
close(): void;
|
|
26
94
|
private buildDom;
|
|
95
|
+
/**
|
|
96
|
+
* Builds the `⋮` toolbar button and its dropdown menu. Items come from the
|
|
97
|
+
* host (Edit Chart / Advanced Settings / Unlink / Download); Download is always
|
|
98
|
+
* handled internally. Skipped entirely when the host returns no items.
|
|
99
|
+
*/
|
|
100
|
+
private buildDotsMenu;
|
|
101
|
+
/** Expands the requested toolbar items into concrete menu entries (labels + actions). */
|
|
102
|
+
private resolveMenuEntries;
|
|
27
103
|
/**
|
|
28
104
|
* Position the card at the center of the backdrop.
|
|
29
105
|
* Called once after building the DOM and on fullscreen exit.
|
|
@@ -36,8 +112,29 @@ export declare class ChartPanel {
|
|
|
36
112
|
*/
|
|
37
113
|
private attachDrag;
|
|
38
114
|
private closeDotsMenu;
|
|
115
|
+
/**
|
|
116
|
+
* Registers a document-level `mousedown` listener that dismisses the download
|
|
117
|
+
* menu on an outside click.
|
|
118
|
+
*
|
|
119
|
+
* Clicks that land on the menu or its trigger button are deliberately ignored:
|
|
120
|
+
* `mousedown` fires before `click`, so closing the menu here (which sets it to
|
|
121
|
+
* `display: none`) would remove the menu item from the layout before its own
|
|
122
|
+
* `click` handler could run — silently swallowing the download. Guarding on the
|
|
123
|
+
* target keeps the menu alive long enough for the item's `click` to fire, then
|
|
124
|
+
* that handler closes the menu itself.
|
|
125
|
+
*/
|
|
126
|
+
private attachOutsideMousedown;
|
|
127
|
+
/** Removes the outside-click listener registered by {@link attachOutsideMousedown}. */
|
|
128
|
+
private detachOutsideMousedown;
|
|
39
129
|
private toggleFullscreen;
|
|
40
130
|
private renderChart;
|
|
131
|
+
/**
|
|
132
|
+
* Builds the render options for the current size. Prefers the host's model-derived
|
|
133
|
+
* options, then forces `showLegend: false` because the panel draws its own
|
|
134
|
+
* interactive HTML legend below the canvas. Falls back to a minimal default when
|
|
135
|
+
* no host is attached.
|
|
136
|
+
*/
|
|
137
|
+
private resolveRenderOptions;
|
|
41
138
|
/**
|
|
42
139
|
* Populates the HTML legend bar with one clickable button per dataset.
|
|
43
140
|
* Each button acts as a toggle: clicking animates the corresponding bars
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chart-panel.d.ts","sourceRoot":"","sources":["../../src/chart/chart-panel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"chart-panel.d.ts","sourceRoot":"","sources":["../../src/chart/chart-panel.ts"],"names":[],"mappings":"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"}
|