@matthieumordrel/chart-studio 0.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/LICENSE +21 -0
- package/README.md +371 -0
- package/dist/core/chart-capabilities.d.ts +60 -0
- package/dist/core/chart-capabilities.d.ts.map +1 -0
- package/dist/core/chart-capabilities.js +55 -0
- package/dist/core/chart-capabilities.js.map +1 -0
- package/dist/core/colors.d.ts +25 -0
- package/dist/core/colors.d.ts.map +1 -0
- package/dist/core/colors.js +55 -0
- package/dist/core/colors.js.map +1 -0
- package/dist/core/config-utils.d.ts +43 -0
- package/dist/core/config-utils.d.ts.map +1 -0
- package/dist/core/config-utils.js +81 -0
- package/dist/core/config-utils.js.map +1 -0
- package/dist/core/date-utils.d.ts +29 -0
- package/dist/core/date-utils.d.ts.map +1 -0
- package/dist/core/date-utils.js +59 -0
- package/dist/core/date-utils.js.map +1 -0
- package/dist/core/define-chart-schema.d.ts +105 -0
- package/dist/core/define-chart-schema.d.ts.map +1 -0
- package/dist/core/define-chart-schema.js +45 -0
- package/dist/core/define-chart-schema.js.map +1 -0
- package/dist/core/formatting.d.ts +47 -0
- package/dist/core/formatting.d.ts.map +1 -0
- package/dist/core/formatting.js +397 -0
- package/dist/core/formatting.js.map +1 -0
- package/dist/core/index.d.ts +17 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +13 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/infer-columns.d.ts +6 -0
- package/dist/core/infer-columns.d.ts.map +1 -0
- package/dist/core/infer-columns.js +513 -0
- package/dist/core/infer-columns.js.map +1 -0
- package/dist/core/metric-utils.d.ts +43 -0
- package/dist/core/metric-utils.d.ts.map +1 -0
- package/dist/core/metric-utils.js +142 -0
- package/dist/core/metric-utils.js.map +1 -0
- package/dist/core/pipeline-data-points.d.ts +23 -0
- package/dist/core/pipeline-data-points.d.ts.map +1 -0
- package/dist/core/pipeline-data-points.js +236 -0
- package/dist/core/pipeline-data-points.js.map +1 -0
- package/dist/core/pipeline-helpers.d.ts +38 -0
- package/dist/core/pipeline-helpers.d.ts.map +1 -0
- package/dist/core/pipeline-helpers.js +98 -0
- package/dist/core/pipeline-helpers.js.map +1 -0
- package/dist/core/pipeline.d.ts +70 -0
- package/dist/core/pipeline.d.ts.map +1 -0
- package/dist/core/pipeline.js +157 -0
- package/dist/core/pipeline.js.map +1 -0
- package/dist/core/types.d.ts +1109 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +15 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/use-chart-options.d.ts +66 -0
- package/dist/core/use-chart-options.d.ts.map +1 -0
- package/dist/core/use-chart-options.js +5 -0
- package/dist/core/use-chart-options.js.map +1 -0
- package/dist/core/use-chart-resolvers.d.ts +14 -0
- package/dist/core/use-chart-resolvers.d.ts.map +1 -0
- package/dist/core/use-chart-resolvers.js +42 -0
- package/dist/core/use-chart-resolvers.js.map +1 -0
- package/dist/core/use-chart.d.ts +47 -0
- package/dist/core/use-chart.d.ts.map +1 -0
- package/dist/core/use-chart.js +266 -0
- package/dist/core/use-chart.js.map +1 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/ui/chart-axis-ticks.d.ts +35 -0
- package/dist/ui/chart-axis-ticks.d.ts.map +1 -0
- package/dist/ui/chart-axis-ticks.js +80 -0
- package/dist/ui/chart-axis-ticks.js.map +1 -0
- package/dist/ui/chart-canvas.d.ts +22 -0
- package/dist/ui/chart-canvas.d.ts.map +1 -0
- package/dist/ui/chart-canvas.js +338 -0
- package/dist/ui/chart-canvas.js.map +1 -0
- package/dist/ui/chart-context.d.ts +89 -0
- package/dist/ui/chart-context.d.ts.map +1 -0
- package/dist/ui/chart-context.js +129 -0
- package/dist/ui/chart-context.js.map +1 -0
- package/dist/ui/chart-date-range-badge.d.ts +14 -0
- package/dist/ui/chart-date-range-badge.d.ts.map +1 -0
- package/dist/ui/chart-date-range-badge.js +31 -0
- package/dist/ui/chart-date-range-badge.js.map +1 -0
- package/dist/ui/chart-date-range-panel.d.ts +25 -0
- package/dist/ui/chart-date-range-panel.d.ts.map +1 -0
- package/dist/ui/chart-date-range-panel.js +126 -0
- package/dist/ui/chart-date-range-panel.js.map +1 -0
- package/dist/ui/chart-date-range.d.ts +14 -0
- package/dist/ui/chart-date-range.d.ts.map +1 -0
- package/dist/ui/chart-date-range.js +38 -0
- package/dist/ui/chart-date-range.js.map +1 -0
- package/dist/ui/chart-debug.d.ts +10 -0
- package/dist/ui/chart-debug.d.ts.map +1 -0
- package/dist/ui/chart-debug.js +127 -0
- package/dist/ui/chart-debug.js.map +1 -0
- package/dist/ui/chart-dropdown.d.ts +35 -0
- package/dist/ui/chart-dropdown.d.ts.map +1 -0
- package/dist/ui/chart-dropdown.js +77 -0
- package/dist/ui/chart-dropdown.js.map +1 -0
- package/dist/ui/chart-filters-panel.d.ts +19 -0
- package/dist/ui/chart-filters-panel.d.ts.map +1 -0
- package/dist/ui/chart-filters-panel.js +47 -0
- package/dist/ui/chart-filters-panel.js.map +1 -0
- package/dist/ui/chart-filters.d.ts +12 -0
- package/dist/ui/chart-filters.d.ts.map +1 -0
- package/dist/ui/chart-filters.js +27 -0
- package/dist/ui/chart-filters.js.map +1 -0
- package/dist/ui/chart-group-by-selector.d.ts +8 -0
- package/dist/ui/chart-group-by-selector.d.ts.map +1 -0
- package/dist/ui/chart-group-by-selector.js +20 -0
- package/dist/ui/chart-group-by-selector.js.map +1 -0
- package/dist/ui/chart-metric-panel.d.ts +18 -0
- package/dist/ui/chart-metric-panel.d.ts.map +1 -0
- package/dist/ui/chart-metric-panel.js +119 -0
- package/dist/ui/chart-metric-panel.js.map +1 -0
- package/dist/ui/chart-metric-selector.d.ts +10 -0
- package/dist/ui/chart-metric-selector.d.ts.map +1 -0
- package/dist/ui/chart-metric-selector.js +28 -0
- package/dist/ui/chart-metric-selector.js.map +1 -0
- package/dist/ui/chart-select.d.ts +25 -0
- package/dist/ui/chart-select.d.ts.map +1 -0
- package/dist/ui/chart-select.js +36 -0
- package/dist/ui/chart-select.js.map +1 -0
- package/dist/ui/chart-source-switcher.d.ts +16 -0
- package/dist/ui/chart-source-switcher.d.ts.map +1 -0
- package/dist/ui/chart-source-switcher.js +32 -0
- package/dist/ui/chart-source-switcher.js.map +1 -0
- package/dist/ui/chart-time-bucket-selector.d.ts +9 -0
- package/dist/ui/chart-time-bucket-selector.d.ts.map +1 -0
- package/dist/ui/chart-time-bucket-selector.js +26 -0
- package/dist/ui/chart-time-bucket-selector.js.map +1 -0
- package/dist/ui/chart-toolbar-overflow.d.ts +29 -0
- package/dist/ui/chart-toolbar-overflow.d.ts.map +1 -0
- package/dist/ui/chart-toolbar-overflow.js +110 -0
- package/dist/ui/chart-toolbar-overflow.js.map +1 -0
- package/dist/ui/chart-toolbar.d.ts +45 -0
- package/dist/ui/chart-toolbar.d.ts.map +1 -0
- package/dist/ui/chart-toolbar.js +45 -0
- package/dist/ui/chart-toolbar.js.map +1 -0
- package/dist/ui/chart-type-selector.d.ts +8 -0
- package/dist/ui/chart-type-selector.d.ts.map +1 -0
- package/dist/ui/chart-type-selector.js +23 -0
- package/dist/ui/chart-type-selector.js.map +1 -0
- package/dist/ui/chart-x-axis-selector.d.ts +8 -0
- package/dist/ui/chart-x-axis-selector.d.ts.map +1 -0
- package/dist/ui/chart-x-axis-selector.js +15 -0
- package/dist/ui/chart-x-axis-selector.js.map +1 -0
- package/dist/ui/index.d.ts +25 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +24 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/theme.css +62 -0
- package/dist/ui/toolbar-types.d.ts +43 -0
- package/dist/ui/toolbar-types.d.ts.map +1 -0
- package/dist/ui/toolbar-types.js +51 -0
- package/dist/ui/toolbar-types.js.map +1 -0
- package/package.json +76 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-context.d.ts","sourceRoot":"","sources":["../../src/ui/chart-context.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* React context for sharing the chart instance across composable UI components.
|
|
4
|
+
*/
|
|
5
|
+
import { createContext, useContext, useMemo } from 'react';
|
|
6
|
+
const ChartContext = createContext(null);
|
|
7
|
+
/**
|
|
8
|
+
* Check whether a candidate column ID exists in the current chart.
|
|
9
|
+
*/
|
|
10
|
+
function isKnownColumnId(columnIds, columnId) {
|
|
11
|
+
return columnIds.has(columnId);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Create the broad-but-safe chart shape shared through React context.
|
|
15
|
+
*/
|
|
16
|
+
function createChartContextChart(chart) {
|
|
17
|
+
const columnIds = new Set(chart.columns.map((column) => column.id));
|
|
18
|
+
return {
|
|
19
|
+
activeSourceId: chart.activeSourceId,
|
|
20
|
+
setActiveSource: chart.setActiveSource,
|
|
21
|
+
hasMultipleSources: chart.hasMultipleSources,
|
|
22
|
+
sources: chart.sources,
|
|
23
|
+
chartType: chart.chartType,
|
|
24
|
+
setChartType: chart.setChartType,
|
|
25
|
+
availableChartTypes: chart.availableChartTypes,
|
|
26
|
+
xAxisId: chart.xAxisId,
|
|
27
|
+
setXAxis: (columnId) => {
|
|
28
|
+
if (!isKnownColumnId(columnIds, columnId)) {
|
|
29
|
+
throw new Error(`Unknown chart column ID: "${columnId}"`);
|
|
30
|
+
}
|
|
31
|
+
;
|
|
32
|
+
chart.setXAxis(columnId);
|
|
33
|
+
},
|
|
34
|
+
availableXAxes: chart.availableXAxes,
|
|
35
|
+
groupById: chart.groupById,
|
|
36
|
+
setGroupBy: (columnId) => {
|
|
37
|
+
if (columnId === null) {
|
|
38
|
+
;
|
|
39
|
+
chart.setGroupBy(null);
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
if (!isKnownColumnId(columnIds, columnId)) {
|
|
43
|
+
throw new Error(`Unknown chart column ID: "${columnId}"`);
|
|
44
|
+
}
|
|
45
|
+
;
|
|
46
|
+
chart.setGroupBy(columnId);
|
|
47
|
+
},
|
|
48
|
+
availableGroupBys: chart.availableGroupBys,
|
|
49
|
+
metric: chart.metric,
|
|
50
|
+
setMetric: (metric) => {
|
|
51
|
+
if (metric.kind === 'aggregate' && !isKnownColumnId(columnIds, metric.columnId)) {
|
|
52
|
+
throw new Error(`Unknown metric column ID: "${metric.columnId}"`);
|
|
53
|
+
}
|
|
54
|
+
;
|
|
55
|
+
chart.setMetric(metric);
|
|
56
|
+
},
|
|
57
|
+
availableMetrics: chart.availableMetrics,
|
|
58
|
+
timeBucket: chart.timeBucket,
|
|
59
|
+
setTimeBucket: chart.setTimeBucket,
|
|
60
|
+
availableTimeBuckets: chart.availableTimeBuckets,
|
|
61
|
+
isTimeSeries: chart.isTimeSeries,
|
|
62
|
+
filters: new Map(chart.filters),
|
|
63
|
+
toggleFilter: (columnId, value) => {
|
|
64
|
+
if (!isKnownColumnId(columnIds, columnId)) {
|
|
65
|
+
throw new Error(`Unknown chart column ID: "${columnId}"`);
|
|
66
|
+
}
|
|
67
|
+
;
|
|
68
|
+
chart.toggleFilter(columnId, value);
|
|
69
|
+
},
|
|
70
|
+
clearFilter: (columnId) => {
|
|
71
|
+
if (!isKnownColumnId(columnIds, columnId)) {
|
|
72
|
+
throw new Error(`Unknown chart column ID: "${columnId}"`);
|
|
73
|
+
}
|
|
74
|
+
;
|
|
75
|
+
chart.clearFilter(columnId);
|
|
76
|
+
},
|
|
77
|
+
clearAllFilters: chart.clearAllFilters,
|
|
78
|
+
availableFilters: chart.availableFilters,
|
|
79
|
+
sorting: chart.sorting,
|
|
80
|
+
setSorting: chart.setSorting,
|
|
81
|
+
dateRange: chart.dateRange,
|
|
82
|
+
referenceDateId: chart.referenceDateId,
|
|
83
|
+
setReferenceDateId: (columnId) => {
|
|
84
|
+
if (!isKnownColumnId(columnIds, columnId)) {
|
|
85
|
+
throw new Error(`Unknown chart column ID: "${columnId}"`);
|
|
86
|
+
}
|
|
87
|
+
;
|
|
88
|
+
chart.setReferenceDateId(columnId);
|
|
89
|
+
},
|
|
90
|
+
availableDateColumns: chart.availableDateColumns,
|
|
91
|
+
dateRangeFilter: chart.dateRangeFilter,
|
|
92
|
+
setDateRangeFilter: chart.setDateRangeFilter,
|
|
93
|
+
transformedData: chart.transformedData,
|
|
94
|
+
series: chart.series,
|
|
95
|
+
columns: chart.columns,
|
|
96
|
+
rawData: chart.rawData,
|
|
97
|
+
recordCount: chart.recordCount,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
export function useChartContext() {
|
|
101
|
+
const ctx = useContext(ChartContext);
|
|
102
|
+
if (!ctx) {
|
|
103
|
+
throw new Error('useChartContext must be used within a <Chart> provider');
|
|
104
|
+
}
|
|
105
|
+
return ctx.chart;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Typed single-source chart context escape hatch for inferred charts.
|
|
109
|
+
* React cannot infer provider generics through arbitrary subtrees, so callers
|
|
110
|
+
* provide the row type (and optional schema type) explicitly.
|
|
111
|
+
*/
|
|
112
|
+
export function useTypedChartContext() {
|
|
113
|
+
const ctx = useContext(ChartContext);
|
|
114
|
+
if (!ctx) {
|
|
115
|
+
throw new Error('useTypedChartContext must be used within a <Chart> provider');
|
|
116
|
+
}
|
|
117
|
+
if (ctx.chart.hasMultipleSources) {
|
|
118
|
+
throw new Error('useTypedChartContext only supports single-source charts right now. Multi-source charts stay broad because the active source schema can change.');
|
|
119
|
+
}
|
|
120
|
+
return ctx.typedChart;
|
|
121
|
+
}
|
|
122
|
+
export function Chart({ chart, children, className, }) {
|
|
123
|
+
const contextValue = useMemo(() => ({
|
|
124
|
+
chart: createChartContextChart(chart),
|
|
125
|
+
typedChart: chart,
|
|
126
|
+
}), [chart]);
|
|
127
|
+
return (_jsx(ChartContext.Provider, { value: contextValue, children: _jsx("div", { className: className, children: children }) }));
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=chart-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-context.js","sourceRoot":"","sources":["../../src/ui/chart-context.tsx"],"names":[],"mappings":";AAAA;;GAEG;AAEH,OAAO,EAAC,aAAa,EAAE,UAAU,EAAE,OAAO,EAAoC,MAAM,OAAO,CAAA;AAkE3F,MAAM,YAAY,GAAG,aAAa,CAA2B,IAAI,CAAC,CAAA;AAElE;;GAEG;AACH,SAAS,eAAe,CACtB,SAA8B,EAC9B,QAAgB;IAEhB,OAAO,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;AAChC,CAAC;AAED;;GAEG;AACH,SAAS,uBAAuB,CAAC,KAAuB;IACtD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAA;IAEnE,OAAO;QACL,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;QAC5C,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,mBAAmB,EAAE,KAAK,CAAC,mBAAmB;QAC9C,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,QAAQ,EAAE,CAAC,QAAQ,EAAE,EAAE;YACrB,IAAI,CAAC,eAAe,CAAS,SAAS,EAAE,QAAQ,CAAC,EAAE,CAAC;gBAClD,MAAM,IAAI,KAAK,CAAC,6BAA6B,QAAQ,GAAG,CAAC,CAAA;YAC3D,CAAC;YAED,CAAC;YAAC,KAAK,CAAC,QAAuC,CAAC,QAAQ,CAAC,CAAA;QAC3D,CAAC;QACD,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,UAAU,EAAE,CAAC,QAAQ,EAAE,EAAE;YACvB,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;gBACtB,CAAC;gBAAC,KAAK,CAAC,UAAgD,CAAC,IAAI,CAAC,CAAA;gBAC9D,OAAM;YACR,CAAC;YAED,IAAI,CAAC,eAAe,CAAS,SAAS,EAAE,QAAQ,CAAC,EAAE,CAAC;gBAClD,MAAM,IAAI,KAAK,CAAC,6BAA6B,QAAQ,GAAG,CAAC,CAAA;YAC3D,CAAC;YAED,CAAC;YAAC,KAAK,CAAC,UAAgD,CAAC,QAAQ,CAAC,CAAA;QACpE,CAAC;QACD,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;QAC1C,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE;YACpB,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,eAAe,CAAS,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACxF,MAAM,IAAI,KAAK,CAAC,8BAA8B,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAA;YACnE,CAAC;YAED,CAAC;YAAC,KAAK,CAAC,SAA8C,CAAC,MAAM,CAAC,CAAA;QAChE,CAAC;QACD,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,oBAAoB,EAAE,KAAK,CAAC,oBAAoB;QAChD,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,OAAO,EAAE,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC;QAC/B,YAAY,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE;YAChC,IAAI,CAAC,eAAe,CAAS,SAAS,EAAE,QAAQ,CAAC,EAAE,CAAC;gBAClD,MAAM,IAAI,KAAK,CAAC,6BAA6B,QAAQ,GAAG,CAAC,CAAA;YAC3D,CAAC;YAED,CAAC;YAAC,KAAK,CAAC,YAA0D,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;QACrF,CAAC;QACD,WAAW,EAAE,CAAC,QAAQ,EAAE,EAAE;YACxB,IAAI,CAAC,eAAe,CAAS,SAAS,EAAE,QAAQ,CAAC,EAAE,CAAC;gBAClD,MAAM,IAAI,KAAK,CAAC,6BAA6B,QAAQ,GAAG,CAAC,CAAA;YAC3D,CAAC;YAED,CAAC;YAAC,KAAK,CAAC,WAA0C,CAAC,QAAQ,CAAC,CAAA;QAC9D,CAAC;QACD,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,kBAAkB,EAAE,CAAC,QAAQ,EAAE,EAAE;YAC/B,IAAI,CAAC,eAAe,CAAS,SAAS,EAAE,QAAQ,CAAC,EAAE,CAAC;gBAClD,MAAM,IAAI,KAAK,CAAC,6BAA6B,QAAQ,GAAG,CAAC,CAAA;YAC3D,CAAC;YAED,CAAC;YAAC,KAAK,CAAC,kBAAiD,CAAC,QAAQ,CAAC,CAAA;QACrE,CAAC;QACD,oBAAoB,EAAE,KAAK,CAAC,oBAAoB;QAChD,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;QAC5C,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,WAAW,EAAE,KAAK,CAAC,WAAW;KAC/B,CAAA;AACH,CAAC;AAUD,MAAM,UAAU,eAAe;IAC7B,MAAM,GAAG,GAAG,UAAU,CAAC,YAAY,CAAC,CAAA;IACpC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAA;IAC3E,CAAC;IAED,OAAO,GAAG,CAAC,KAAK,CAAA;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB;IAIlC,MAAM,GAAG,GAAG,UAAU,CAAC,YAAY,CAAC,CAAA;IACpC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAA;IAChF,CAAC;IAED,IAAI,GAAG,CAAC,KAAK,CAAC,kBAAkB,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CACb,gJAAgJ,CACjJ,CAAA;IACH,CAAC;IAED,OAAO,GAAG,CAAC,UAAoF,CAAA;AACjG,CAAC;AAsBD,MAAM,UAAU,KAAK,CAAC,EACpB,KAAK,EACL,QAAQ,EACR,SAAS,GAKV;IACC,MAAM,YAAY,GAAG,OAAO,CAC1B,GAAG,EAAE,CAAC,CAAC;QACL,KAAK,EAAE,uBAAuB,CAAC,KAAK,CAAC;QACrC,UAAU,EAAE,KAAK;KAClB,CAAC,EACF,CAAC,KAAK,CAAC,CACR,CAAA;IAED,OAAO,CACL,KAAC,YAAY,CAAC,QAAQ,IAAC,KAAK,EAAE,YAAY,YACxC,cAAK,SAAS,EAAE,SAAS,YAAG,QAAQ,GAAO,GACrB,CACzB,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read-only badge that always displays the current date range in the toolbar.
|
|
3
|
+
*
|
|
4
|
+
* Shows the preset label (e.g. "All time") and the computed min–max range.
|
|
5
|
+
* Non-interactive — purely informational so users always know the date window.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Read-only badge showing the active date range preset and computed bounds.
|
|
9
|
+
* Renders nothing if no date columns are available.
|
|
10
|
+
*/
|
|
11
|
+
export declare function ChartDateRangeBadge({ className }: {
|
|
12
|
+
className?: string;
|
|
13
|
+
}): import("react/jsx-runtime").JSX.Element | null;
|
|
14
|
+
//# sourceMappingURL=chart-date-range-badge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-date-range-badge.d.ts","sourceRoot":"","sources":["../../src/ui/chart-date-range-badge.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAeH;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,EAAC,SAAS,EAAC,EAAE;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAC,kDAwBpE"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Read-only badge that always displays the current date range in the toolbar.
|
|
4
|
+
*
|
|
5
|
+
* Shows the preset label (e.g. "All time") and the computed min–max range.
|
|
6
|
+
* Non-interactive — purely informational so users always know the date window.
|
|
7
|
+
*/
|
|
8
|
+
import { Calendar } from 'lucide-react';
|
|
9
|
+
import { useChartContext } from './chart-context.js';
|
|
10
|
+
import { resolvePresetLabel } from './chart-date-range-panel.js';
|
|
11
|
+
/** Format a Date into a compact, readable string (e.g. "Jan 5, 25"). */
|
|
12
|
+
function formatDate(date) {
|
|
13
|
+
return date.toLocaleDateString('en-US', {
|
|
14
|
+
month: 'short',
|
|
15
|
+
day: 'numeric',
|
|
16
|
+
year: '2-digit',
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Read-only badge showing the active date range preset and computed bounds.
|
|
21
|
+
* Renders nothing if no date columns are available.
|
|
22
|
+
*/
|
|
23
|
+
export function ChartDateRangeBadge({ className }) {
|
|
24
|
+
const { dateRange, dateRangeFilter, availableDateColumns } = useChartContext();
|
|
25
|
+
if (availableDateColumns.length === 0)
|
|
26
|
+
return null;
|
|
27
|
+
const activeLabel = resolvePresetLabel(dateRangeFilter);
|
|
28
|
+
const hasRange = dateRange?.min && dateRange?.max;
|
|
29
|
+
return (_jsxs("div", { className: `inline-flex h-7 items-center gap-1.5 rounded-lg border border-border/50 bg-muted/30 px-2.5 text-xs text-muted-foreground ${className ?? ''}`, children: [_jsx(Calendar, { className: "h-3 w-3 shrink-0" }), _jsx("span", { className: "font-medium", children: activeLabel }), hasRange && (_jsxs(_Fragment, { children: [_jsx("span", { className: "text-muted-foreground/40", children: "\u00B7" }), _jsxs("span", { children: [formatDate(dateRange.min), " \u2013 ", formatDate(dateRange.max)] })] }))] }));
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=chart-date-range-badge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-date-range-badge.js","sourceRoot":"","sources":["../../src/ui/chart-date-range-badge.tsx"],"names":[],"mappings":";AAAA;;;;;GAKG;AAEH,OAAO,EAAC,QAAQ,EAAC,MAAM,cAAc,CAAA;AACrC,OAAO,EAAC,eAAe,EAAC,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAC,kBAAkB,EAAC,MAAM,6BAA6B,CAAA;AAE9D,wEAAwE;AACxE,SAAS,UAAU,CAAC,IAAU;IAC5B,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE;QACtC,KAAK,EAAE,OAAO;QACd,GAAG,EAAE,SAAS;QACd,IAAI,EAAE,SAAS;KAChB,CAAC,CAAA;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,EAAC,SAAS,EAAuB;IACnE,MAAM,EAAC,SAAS,EAAE,eAAe,EAAE,oBAAoB,EAAC,GAAG,eAAe,EAAE,CAAA;IAE5E,IAAI,oBAAoB,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IAElD,MAAM,WAAW,GAAG,kBAAkB,CAAC,eAAe,CAAC,CAAA;IACvD,MAAM,QAAQ,GAAG,SAAS,EAAE,GAAG,IAAI,SAAS,EAAE,GAAG,CAAA;IAEjD,OAAO,CACL,eACE,SAAS,EAAE,4HAA4H,SAAS,IAAI,EAAE,EAAE,aAExJ,KAAC,QAAQ,IAAC,SAAS,EAAC,kBAAkB,GAAG,EACzC,eAAM,SAAS,EAAC,aAAa,YAAE,WAAW,GAAQ,EACjD,QAAQ,IAAI,CACX,8BACE,eAAM,SAAS,EAAC,0BAA0B,uBAAS,EACnD,2BACG,UAAU,CAAC,SAAU,CAAC,GAAI,CAAC,cAAK,UAAU,CAAC,SAAU,CAAC,GAAI,CAAC,IACvD,IACN,CACJ,IACG,CACP,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Date range panel content — reusable by both ChartDateRange (inside a popover)
|
|
3
|
+
* and ChartToolbarOverflow (rendered inline).
|
|
4
|
+
*
|
|
5
|
+
* Shows preset buttons (All time, Last 7 days, etc.), a reference date
|
|
6
|
+
* column picker, and custom date inputs.
|
|
7
|
+
*/
|
|
8
|
+
import type { DateRangeFilter } from '../core/types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Determine which preset label matches the current filter, or "Custom".
|
|
11
|
+
* null → "All time" (no date filtering)
|
|
12
|
+
* Compares dates at day-level precision.
|
|
13
|
+
*/
|
|
14
|
+
export declare function resolvePresetLabel(filter: DateRangeFilter | null): string;
|
|
15
|
+
/**
|
|
16
|
+
* Date range panel content (no popover wrapper).
|
|
17
|
+
*
|
|
18
|
+
* @property onClose - Optional callback when user selects a preset
|
|
19
|
+
* @property className - Additional CSS classes
|
|
20
|
+
*/
|
|
21
|
+
export declare function ChartDateRangePanel({ onClose, className, }: {
|
|
22
|
+
onClose?: () => void;
|
|
23
|
+
className?: string;
|
|
24
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
25
|
+
//# sourceMappingURL=chart-date-range-panel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-date-range-panel.d.ts","sourceRoot":"","sources":["../../src/ui/chart-date-range-panel.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,kBAAkB,CAAA;AAqErD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,GAAG,MAAM,CAYzE;AAgBD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,OAAO,EACP,SAAS,GACV,EAAE;IACD,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,2CAwGA"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Date range panel content — reusable by both ChartDateRange (inside a popover)
|
|
4
|
+
* and ChartToolbarOverflow (rendered inline).
|
|
5
|
+
*
|
|
6
|
+
* Shows preset buttons (All time, Last 7 days, etc.), a reference date
|
|
7
|
+
* column picker, and custom date inputs.
|
|
8
|
+
*/
|
|
9
|
+
import { useMemo } from 'react';
|
|
10
|
+
import { useChartContext } from './chart-context.js';
|
|
11
|
+
/**
|
|
12
|
+
* Build the list of date range presets relative to "now".
|
|
13
|
+
*
|
|
14
|
+
* "All time" → null (no date filtering)
|
|
15
|
+
* Other presets → { from: Date, to: null } (bounded filter)
|
|
16
|
+
*/
|
|
17
|
+
function getPresets() {
|
|
18
|
+
return [
|
|
19
|
+
{ label: 'All time', buildFilter: () => null },
|
|
20
|
+
{ label: 'Last 7 days', buildFilter: () => ({ from: daysAgo(7), to: null }) },
|
|
21
|
+
{ label: 'Last 30 days', buildFilter: () => ({ from: daysAgo(30), to: null }) },
|
|
22
|
+
{ label: 'Last 3 months', buildFilter: () => ({ from: monthsAgo(3), to: null }) },
|
|
23
|
+
{ label: 'Last 6 months', buildFilter: () => ({ from: monthsAgo(6), to: null }) },
|
|
24
|
+
{ label: 'Last 12 months', buildFilter: () => ({ from: monthsAgo(12), to: null }) },
|
|
25
|
+
{ label: 'Year to date', buildFilter: () => ({ from: startOfYear(), to: null }) },
|
|
26
|
+
];
|
|
27
|
+
}
|
|
28
|
+
function daysAgo(n) {
|
|
29
|
+
const d = new Date();
|
|
30
|
+
d.setDate(d.getDate() - n);
|
|
31
|
+
d.setHours(0, 0, 0, 0);
|
|
32
|
+
return d;
|
|
33
|
+
}
|
|
34
|
+
function monthsAgo(n) {
|
|
35
|
+
const d = new Date();
|
|
36
|
+
d.setMonth(d.getMonth() - n);
|
|
37
|
+
d.setHours(0, 0, 0, 0);
|
|
38
|
+
return d;
|
|
39
|
+
}
|
|
40
|
+
function startOfYear() {
|
|
41
|
+
const d = new Date();
|
|
42
|
+
return new Date(d.getFullYear(), 0, 1);
|
|
43
|
+
}
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
// Helpers
|
|
46
|
+
// ---------------------------------------------------------------------------
|
|
47
|
+
/** Format a Date as YYYY-MM-DD for native date input value. */
|
|
48
|
+
function toInputValue(date) {
|
|
49
|
+
if (!date)
|
|
50
|
+
return '';
|
|
51
|
+
const y = date.getFullYear();
|
|
52
|
+
const m = String(date.getMonth() + 1).padStart(2, '0');
|
|
53
|
+
const d = String(date.getDate()).padStart(2, '0');
|
|
54
|
+
return `${y}-${m}-${d}`;
|
|
55
|
+
}
|
|
56
|
+
/** Parse a YYYY-MM-DD string into a Date, or null if empty/invalid. */
|
|
57
|
+
function fromInputValue(value) {
|
|
58
|
+
if (!value)
|
|
59
|
+
return null;
|
|
60
|
+
const d = new Date(value + 'T00:00:00');
|
|
61
|
+
return Number.isNaN(d.getTime()) ? null : d;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Determine which preset label matches the current filter, or "Custom".
|
|
65
|
+
* null → "All time" (no date filtering)
|
|
66
|
+
* Compares dates at day-level precision.
|
|
67
|
+
*/
|
|
68
|
+
export function resolvePresetLabel(filter) {
|
|
69
|
+
if (filter === null)
|
|
70
|
+
return 'All time';
|
|
71
|
+
const presets = getPresets();
|
|
72
|
+
for (const preset of presets) {
|
|
73
|
+
const pf = preset.buildFilter();
|
|
74
|
+
if (pf === null)
|
|
75
|
+
continue;
|
|
76
|
+
if (sameDay(pf.from, filter.from) && sameDay(pf.to, filter.to)) {
|
|
77
|
+
return preset.label;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return 'Custom';
|
|
81
|
+
}
|
|
82
|
+
function sameDay(a, b) {
|
|
83
|
+
if (!a && !b)
|
|
84
|
+
return true;
|
|
85
|
+
if (!a || !b)
|
|
86
|
+
return false;
|
|
87
|
+
return (a.getFullYear() === b.getFullYear() &&
|
|
88
|
+
a.getMonth() === b.getMonth() &&
|
|
89
|
+
a.getDate() === b.getDate());
|
|
90
|
+
}
|
|
91
|
+
// ---------------------------------------------------------------------------
|
|
92
|
+
// Component
|
|
93
|
+
// ---------------------------------------------------------------------------
|
|
94
|
+
/**
|
|
95
|
+
* Date range panel content (no popover wrapper).
|
|
96
|
+
*
|
|
97
|
+
* @property onClose - Optional callback when user selects a preset
|
|
98
|
+
* @property className - Additional CSS classes
|
|
99
|
+
*/
|
|
100
|
+
export function ChartDateRangePanel({ onClose, className, }) {
|
|
101
|
+
const { dateRangeFilter, setDateRangeFilter, referenceDateId, setReferenceDateId, availableDateColumns, } = useChartContext();
|
|
102
|
+
const presets = useMemo(() => getPresets(), []);
|
|
103
|
+
const activeLabel = resolvePresetLabel(dateRangeFilter);
|
|
104
|
+
const hasMultipleDateColumns = availableDateColumns.length > 1;
|
|
105
|
+
const handlePreset = (preset) => {
|
|
106
|
+
setDateRangeFilter(preset.buildFilter());
|
|
107
|
+
if (preset.label !== 'Custom') {
|
|
108
|
+
onClose?.();
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
const handleCustomFrom = (value) => {
|
|
112
|
+
const from = fromInputValue(value);
|
|
113
|
+
setDateRangeFilter({ from, to: dateRangeFilter?.to ?? null });
|
|
114
|
+
};
|
|
115
|
+
const handleCustomTo = (value) => {
|
|
116
|
+
const to = fromInputValue(value);
|
|
117
|
+
setDateRangeFilter({ from: dateRangeFilter?.from ?? null, to });
|
|
118
|
+
};
|
|
119
|
+
return (_jsxs("div", { className: className, children: [hasMultipleDateColumns && (_jsxs("div", { className: "mb-3", children: [_jsx("div", { className: "mb-1 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground", children: "Date field" }), _jsx("select", { className: "h-7 w-full rounded-md border border-border bg-background px-2 text-xs text-foreground focus:outline-none focus:ring-1 focus:ring-ring", value: referenceDateId ?? '', onChange: (e) => setReferenceDateId(e.target.value), "aria-label": "Reference date column", children: availableDateColumns.map((col) => (_jsx("option", { value: col.id, children: col.label }, col.id))) })] })), _jsxs("div", { className: "mb-3", children: [_jsx("div", { className: "mb-1 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground", children: "Range" }), _jsx("div", { className: "grid grid-cols-2 gap-1", children: presets.map((preset) => {
|
|
120
|
+
const isActive = activeLabel === preset.label;
|
|
121
|
+
return (_jsx("button", { onClick: () => handlePreset(preset), className: `rounded-md px-2 py-1.5 text-left text-xs transition-colors ${isActive
|
|
122
|
+
? 'bg-primary/10 font-medium text-primary'
|
|
123
|
+
: 'text-foreground hover:bg-muted'}`, children: preset.label }, preset.label));
|
|
124
|
+
}) })] }), _jsxs("div", { children: [_jsx("div", { className: "mb-1 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground", children: "Custom range" }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("input", { type: "date", className: "h-7 min-w-0 flex-1 rounded-md border border-border bg-background px-2 text-xs text-foreground focus:outline-none focus:ring-1 focus:ring-ring", value: toInputValue(dateRangeFilter?.from ?? null), onChange: (e) => handleCustomFrom(e.target.value), "aria-label": "From date" }), _jsx("span", { className: "text-xs text-muted-foreground", children: "\u2013" }), _jsx("input", { type: "date", className: "h-7 min-w-0 flex-1 rounded-md border border-border bg-background px-2 text-xs text-foreground focus:outline-none focus:ring-1 focus:ring-ring", value: toInputValue(dateRangeFilter?.to ?? null), onChange: (e) => handleCustomTo(e.target.value), "aria-label": "To date" })] })] })] }));
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=chart-date-range-panel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-date-range-panel.js","sourceRoot":"","sources":["../../src/ui/chart-date-range-panel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Date range control — interactive button that shows the current date range
|
|
3
|
+
* and opens a popover wrapping ChartDateRangePanel.
|
|
4
|
+
*
|
|
5
|
+
* Acts as both a display and a filter control for the reference date column.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Interactive date range control with presets and custom date inputs.
|
|
9
|
+
* Also serves as the reference date column picker when multiple date columns exist.
|
|
10
|
+
*/
|
|
11
|
+
export declare function ChartDateRange({ className }: {
|
|
12
|
+
className?: string;
|
|
13
|
+
}): import("react/jsx-runtime").JSX.Element | null;
|
|
14
|
+
//# sourceMappingURL=chart-date-range.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-date-range.d.ts","sourceRoot":"","sources":["../../src/ui/chart-date-range.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAiBH;;;GAGG;AACH,wBAAgB,cAAc,CAAC,EAAC,SAAS,EAAC,EAAE;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAC,kDAgD/D"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Date range control — interactive button that shows the current date range
|
|
4
|
+
* and opens a popover wrapping ChartDateRangePanel.
|
|
5
|
+
*
|
|
6
|
+
* Acts as both a display and a filter control for the reference date column.
|
|
7
|
+
*/
|
|
8
|
+
import { useRef, useState } from 'react';
|
|
9
|
+
import { Calendar } from 'lucide-react';
|
|
10
|
+
import { useChartContext } from './chart-context.js';
|
|
11
|
+
import { ChartDropdownPanel } from './chart-dropdown.js';
|
|
12
|
+
import { ChartDateRangePanel, resolvePresetLabel } from './chart-date-range-panel.js';
|
|
13
|
+
/** Format a Date into a compact, readable string (e.g. "Jan 5, 25"). */
|
|
14
|
+
function formatDate(date) {
|
|
15
|
+
return date.toLocaleDateString('en-US', {
|
|
16
|
+
month: 'short',
|
|
17
|
+
day: 'numeric',
|
|
18
|
+
year: '2-digit',
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Interactive date range control with presets and custom date inputs.
|
|
23
|
+
* Also serves as the reference date column picker when multiple date columns exist.
|
|
24
|
+
*/
|
|
25
|
+
export function ChartDateRange({ className }) {
|
|
26
|
+
const { dateRange, dateRangeFilter, availableDateColumns } = useChartContext();
|
|
27
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
28
|
+
const triggerRef = useRef(null);
|
|
29
|
+
if (availableDateColumns.length === 0)
|
|
30
|
+
return null;
|
|
31
|
+
const activeLabel = resolvePresetLabel(dateRangeFilter);
|
|
32
|
+
const isFiltered = dateRangeFilter !== null;
|
|
33
|
+
const hasRange = dateRange?.min && dateRange?.max;
|
|
34
|
+
return (_jsxs("div", { className: className, children: [_jsxs("button", { ref: triggerRef, onClick: () => setIsOpen(!isOpen), className: `inline-flex h-7 items-center gap-1.5 rounded-lg border px-2.5 text-xs font-medium transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring/20 ${isFiltered
|
|
35
|
+
? 'border-primary/30 bg-primary/5 text-primary shadow-sm shadow-primary/5 hover:bg-primary/8'
|
|
36
|
+
: 'border-border/50 bg-background text-muted-foreground shadow-sm hover:border-border hover:bg-muted/30 hover:shadow hover:text-foreground'}`, children: [_jsx(Calendar, { className: "h-3 w-3" }), _jsx("span", { children: activeLabel }), hasRange && (_jsxs(_Fragment, { children: [_jsx("span", { className: "text-muted-foreground/40", children: "\u00B7" }), _jsxs("span", { className: "font-normal", children: [formatDate(dateRange.min), " \u2013 ", formatDate(dateRange.max)] })] }))] }), _jsx(ChartDropdownPanel, { isOpen: isOpen, onClose: () => setIsOpen(false), triggerRef: triggerRef, align: "right", width: 288, className: "p-3", children: _jsx(ChartDateRangePanel, { onClose: () => setIsOpen(false) }) })] }));
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=chart-date-range.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-date-range.js","sourceRoot":"","sources":["../../src/ui/chart-date-range.tsx"],"names":[],"mappings":";AAAA;;;;;GAKG;AAEH,OAAO,EAAC,MAAM,EAAE,QAAQ,EAAC,MAAM,OAAO,CAAA;AACtC,OAAO,EAAC,QAAQ,EAAC,MAAM,cAAc,CAAA;AACrC,OAAO,EAAC,eAAe,EAAC,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAC,kBAAkB,EAAC,MAAM,qBAAqB,CAAA;AACtD,OAAO,EAAC,mBAAmB,EAAE,kBAAkB,EAAC,MAAM,6BAA6B,CAAA;AAEnF,wEAAwE;AACxE,SAAS,UAAU,CAAC,IAAU;IAC5B,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE;QACtC,KAAK,EAAE,OAAO;QACd,GAAG,EAAE,SAAS;QACd,IAAI,EAAE,SAAS;KAChB,CAAC,CAAA;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,EAAC,SAAS,EAAuB;IAC9D,MAAM,EAAC,SAAS,EAAE,eAAe,EAAE,oBAAoB,EAAC,GAAG,eAAe,EAAE,CAAA;IAC5E,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC3C,MAAM,UAAU,GAAG,MAAM,CAAoB,IAAI,CAAC,CAAA;IAElD,IAAI,oBAAoB,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IAElD,MAAM,WAAW,GAAG,kBAAkB,CAAC,eAAe,CAAC,CAAA;IACvD,MAAM,UAAU,GAAG,eAAe,KAAK,IAAI,CAAA;IAC3C,MAAM,QAAQ,GAAG,SAAS,EAAE,GAAG,IAAI,SAAS,EAAE,GAAG,CAAA;IAEjD,OAAO,CACL,eAAK,SAAS,EAAE,SAAS,aAEvB,kBACE,GAAG,EAAE,UAAU,EACf,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,EACjC,SAAS,EAAE,+KACT,UAAU;oBACR,CAAC,CAAC,2FAA2F;oBAC7F,CAAC,CAAC,yIACN,EAAE,aAEF,KAAC,QAAQ,IAAC,SAAS,EAAC,SAAS,GAAG,EAChC,yBAAO,WAAW,GAAQ,EACzB,QAAQ,IAAI,CACX,8BACE,eAAM,SAAS,EAAC,0BAA0B,uBAAS,EACnD,gBAAM,SAAS,EAAC,aAAa,aAC1B,UAAU,CAAC,SAAU,CAAC,GAAI,CAAC,cAAK,UAAU,CAAC,SAAU,CAAC,GAAI,CAAC,IACvD,IACN,CACJ,IACM,EAGT,KAAC,kBAAkB,IACjB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,EAC/B,UAAU,EAAE,UAAU,EACtB,KAAK,EAAC,OAAO,EACb,KAAK,EAAE,GAAG,EACV,SAAS,EAAC,KAAK,YAEf,KAAC,mBAAmB,IAAC,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,GAAI,GACrC,IACjB,CACP,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Debug panel — shows raw data, transformed data, series, and current state.
|
|
3
|
+
* Drop `<ChartDebug />` inside a `<Chart>` to inspect what's happening.
|
|
4
|
+
*/
|
|
5
|
+
/** Debug panel that renders chart internals as formatted JSON. */
|
|
6
|
+
export declare function ChartDebug({ className, defaultOpen, }: {
|
|
7
|
+
className?: string;
|
|
8
|
+
defaultOpen?: boolean;
|
|
9
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
//# sourceMappingURL=chart-debug.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-debug.d.ts","sourceRoot":"","sources":["../../src/ui/chart-debug.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAkKH,kEAAkE;AAClE,wBAAgB,UAAU,CAAC,EACzB,SAAS,EACT,WAAmB,GACpB,EAAE;IACD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB,2CAsDA"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Debug panel — shows raw data, transformed data, series, and current state.
|
|
4
|
+
* Drop `<ChartDebug />` inside a `<Chart>` to inspect what's happening.
|
|
5
|
+
*/
|
|
6
|
+
import { computeDateRange, filterByDateRange } from '../core/date-utils.js';
|
|
7
|
+
import { applyFilters } from '../core/pipeline.js';
|
|
8
|
+
import { useState } from 'react';
|
|
9
|
+
import { useChartContext } from './chart-context.js';
|
|
10
|
+
const TABS = [
|
|
11
|
+
{ id: 'raw', label: 'Raw' },
|
|
12
|
+
{ id: 'transformed', label: 'Transformed' },
|
|
13
|
+
{ id: 'series', label: 'Series' },
|
|
14
|
+
{ id: 'state', label: 'State' },
|
|
15
|
+
];
|
|
16
|
+
/**
|
|
17
|
+
* Format a date as a full calendar label to avoid ambiguous numeric dates.
|
|
18
|
+
*/
|
|
19
|
+
function formatFullDay(date) {
|
|
20
|
+
return new Intl.DateTimeFormat('en-US', {
|
|
21
|
+
month: 'long',
|
|
22
|
+
day: 'numeric',
|
|
23
|
+
year: 'numeric',
|
|
24
|
+
timeZone: 'UTC',
|
|
25
|
+
}).format(date);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Get the exact earliest and latest visible dates for the active date X-axis.
|
|
29
|
+
*/
|
|
30
|
+
function getVisibleDateRange(chart) {
|
|
31
|
+
if (!chart.isTimeSeries || !chart.xAxisId) {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
const xAxisColumn = chart.columns.find((column) => column.id === chart.xAxisId);
|
|
35
|
+
if (!xAxisColumn || xAxisColumn.type !== 'date') {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
let visibleData = chart.rawData;
|
|
39
|
+
if (chart.dateRangeFilter && chart.referenceDateId) {
|
|
40
|
+
const referenceDateColumn = chart.columns.find((column) => column.id === chart.referenceDateId);
|
|
41
|
+
if (referenceDateColumn?.type === 'date') {
|
|
42
|
+
visibleData = filterByDateRange(visibleData, referenceDateColumn, chart.dateRangeFilter);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
visibleData = applyFilters(visibleData, chart.columns, chart.filters);
|
|
46
|
+
const { min, max } = computeDateRange(visibleData, xAxisColumn);
|
|
47
|
+
if (!min || !max) {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
columnId: xAxisColumn.id,
|
|
52
|
+
columnLabel: xAxisColumn.label,
|
|
53
|
+
earliest: { label: formatFullDay(min) },
|
|
54
|
+
latest: { label: formatFullDay(max) },
|
|
55
|
+
rule: 'Uses exact dates from visible rows on the active X-axis date column.',
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Build a compact UI label for the visible time range.
|
|
60
|
+
*/
|
|
61
|
+
function getVisibleDateRangeLabel(range) {
|
|
62
|
+
if (!range) {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
const columnLabel = `${range.columnLabel} (${range.columnId})`;
|
|
66
|
+
if (range.earliest.label === range.latest.label) {
|
|
67
|
+
return `Visible exact date: ${range.earliest.label} via ${columnLabel}`;
|
|
68
|
+
}
|
|
69
|
+
return `Visible exact date range: ${range.earliest.label} -> ${range.latest.label} via ${columnLabel}`;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Resolve the currently selected debug payload.
|
|
73
|
+
*/
|
|
74
|
+
function getDebugContent(chart, activeTab) {
|
|
75
|
+
switch (activeTab) {
|
|
76
|
+
case 'raw':
|
|
77
|
+
return chart.rawData;
|
|
78
|
+
case 'transformed':
|
|
79
|
+
return chart.transformedData;
|
|
80
|
+
case 'series':
|
|
81
|
+
return chart.series;
|
|
82
|
+
case 'state':
|
|
83
|
+
return {
|
|
84
|
+
activeSourceId: chart.activeSourceId,
|
|
85
|
+
chartType: chart.chartType,
|
|
86
|
+
xAxisId: chart.xAxisId,
|
|
87
|
+
groupById: chart.groupById,
|
|
88
|
+
metric: chart.metric,
|
|
89
|
+
timeBucket: chart.timeBucket,
|
|
90
|
+
availableTimeBuckets: chart.availableTimeBuckets,
|
|
91
|
+
isTimeSeries: chart.isTimeSeries,
|
|
92
|
+
filters: Object.fromEntries([...chart.filters.entries()].map(([k, v]) => [k, [...v]])),
|
|
93
|
+
sorting: chart.sorting,
|
|
94
|
+
availableChartTypes: chart.availableChartTypes,
|
|
95
|
+
availableGroupBys: chart.availableGroupBys,
|
|
96
|
+
availableMetrics: chart.availableMetrics,
|
|
97
|
+
columns: chart.columns,
|
|
98
|
+
availableFilters: chart.availableFilters.map((filter) => ({
|
|
99
|
+
...filter,
|
|
100
|
+
options: filter.options.length > 5
|
|
101
|
+
? [
|
|
102
|
+
...filter.options.slice(0, 5),
|
|
103
|
+
{ value: '...', label: `+${filter.options.length - 5} more`, count: 0 },
|
|
104
|
+
]
|
|
105
|
+
: filter.options,
|
|
106
|
+
})),
|
|
107
|
+
visibleDateRange: getVisibleDateRange(chart),
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/** Tab bar button. */
|
|
112
|
+
function TabButton({ tab, isActive, onClick, }) {
|
|
113
|
+
return (_jsx("button", { onClick: onClick, className: `border-b-2 px-3 py-1.5 text-[11px] font-mono transition-colors ${isActive
|
|
114
|
+
? 'border-primary bg-primary/10 text-primary'
|
|
115
|
+
: 'border-transparent text-muted-foreground hover:text-foreground'}`, children: tab.label }));
|
|
116
|
+
}
|
|
117
|
+
/** Debug panel that renders chart internals as formatted JSON. */
|
|
118
|
+
export function ChartDebug({ className, defaultOpen = false, }) {
|
|
119
|
+
const chart = useChartContext();
|
|
120
|
+
const [isOpen, setIsOpen] = useState(defaultOpen);
|
|
121
|
+
const [activeTab, setActiveTab] = useState('raw');
|
|
122
|
+
const content = getDebugContent(chart, activeTab);
|
|
123
|
+
const visibleDateRange = getVisibleDateRange(chart);
|
|
124
|
+
const visibleDateRangeLabel = getVisibleDateRangeLabel(visibleDateRange);
|
|
125
|
+
return (_jsxs("div", { className: `overflow-hidden rounded-lg border border-dashed border-border bg-background ${className ?? ''}`, children: [_jsx("button", { onClick: () => setIsOpen(!isOpen), className: "flex w-full items-center gap-2 px-3 py-2 text-left text-xs font-mono text-foreground transition-colors hover:bg-muted/50", children: _jsxs("span", { className: "flex items-center gap-2", children: [_jsx("span", { children: isOpen ? '▼' : '▶' }), _jsx("span", { children: "chart-studio debug" }), _jsxs("span", { className: "text-muted-foreground", children: ["(", chart.rawData.length, " raw, ", chart.transformedData.length, " points, ", chart.series.length, ' ', "series)"] }), visibleDateRangeLabel ? (_jsxs("span", { className: "text-[11px] text-muted-foreground", children: ["\u2022 ", visibleDateRangeLabel] })) : null] }) }), isOpen && (_jsxs("div", { className: "border-t border-dashed border-border", children: [_jsx("div", { className: "flex gap-0 border-b border-border bg-muted/20", children: TABS.map((tab) => (_jsx(TabButton, { tab: tab, isActive: activeTab === tab.id, onClick: () => setActiveTab(tab.id) }, tab.id))) }), _jsx("pre", { className: "max-h-64 overflow-auto bg-muted/20 p-3 font-mono text-[11px] leading-relaxed text-foreground", onWheel: (e) => e.stopPropagation(), children: JSON.stringify(content, null, 2) })] }))] }));
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=chart-debug.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-debug.js","sourceRoot":"","sources":["../../src/ui/chart-debug.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared dropdown panel primitive for chart-studio popover controls.
|
|
3
|
+
* Provides a positioned floating panel with backdrop, premium layered
|
|
4
|
+
* shadows, and close-on-click-outside.
|
|
5
|
+
*/
|
|
6
|
+
import { type ReactNode, type RefObject } from 'react';
|
|
7
|
+
/**
|
|
8
|
+
* Positioned dropdown panel with premium styling.
|
|
9
|
+
* Renders a transparent backdrop overlay and a fixed-position content panel
|
|
10
|
+
* anchored to a trigger element.
|
|
11
|
+
*
|
|
12
|
+
* @property isOpen - Whether the panel is visible
|
|
13
|
+
* @property onClose - Callback to close the panel
|
|
14
|
+
* @property triggerRef - Ref to the button or element that anchors the panel
|
|
15
|
+
* @property align - Horizontal alignment relative to trigger ('left' | 'right')
|
|
16
|
+
* @property width - Fixed panel width in pixels
|
|
17
|
+
* @property minWidth - Minimum panel width in pixels or equal to trigger width
|
|
18
|
+
* @property offset - Gap between trigger and panel
|
|
19
|
+
* @property repositionKey - Value that forces re-measurement when panel content changes
|
|
20
|
+
* @property className - Additional CSS classes for the content area
|
|
21
|
+
* @property children - Panel content
|
|
22
|
+
*/
|
|
23
|
+
export declare function ChartDropdownPanel({ isOpen, onClose, triggerRef, align, width, minWidth, offset, repositionKey, className, children, }: {
|
|
24
|
+
isOpen: boolean;
|
|
25
|
+
onClose: () => void;
|
|
26
|
+
triggerRef: RefObject<HTMLElement | null>;
|
|
27
|
+
align?: 'left' | 'right';
|
|
28
|
+
width?: number;
|
|
29
|
+
minWidth?: number | 'trigger';
|
|
30
|
+
offset?: number;
|
|
31
|
+
repositionKey?: string | number;
|
|
32
|
+
className?: string;
|
|
33
|
+
children: ReactNode;
|
|
34
|
+
}): import("react").ReactPortal | null;
|
|
35
|
+
//# sourceMappingURL=chart-dropdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-dropdown.d.ts","sourceRoot":"","sources":["../../src/ui/chart-dropdown.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAoC,KAAK,SAAS,EAAE,KAAK,SAAS,EAAC,MAAM,OAAO,CAAA;AAQvF;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,MAAM,EACN,OAAO,EACP,UAAU,EACV,KAAc,EACd,KAAK,EACL,QAAQ,EACR,MAAU,EACV,aAAa,EACb,SAAS,EACT,QAAQ,GACT,EAAE;IACD,MAAM,EAAE,OAAO,CAAA;IACf,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,UAAU,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAA;IACzC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;IACxB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,SAAS,CAAA;CACpB,sCA6EA"}
|