@quicdata/analytics 0.0.3 → 0.0.5
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/analytics.css +69 -0
- package/core/auth.d.ts +19 -0
- package/core/auth.d.ts.map +1 -0
- package/core/auth.js +34 -0
- package/core/fetch-data.d.ts +115 -0
- package/core/fetch-data.d.ts.map +1 -0
- package/core/fetch-data.js +210 -0
- package/core/index.d.ts +8 -1
- package/core/index.d.ts.map +1 -1
- package/core/index.js +4 -3
- package/core/types.d.ts +250 -0
- package/core/types.d.ts.map +1 -0
- package/core/types.js +1 -0
- package/core/viewport-observer.d.ts +26 -0
- package/core/viewport-observer.d.ts.map +1 -0
- package/core/viewport-observer.js +38 -0
- package/core/widget-transform-runner.d.ts +22 -0
- package/core/widget-transform-runner.d.ts.map +1 -0
- package/core/widget-transform-runner.js +102 -0
- package/dashboard/dashboard-container.d.ts +100 -0
- package/dashboard/dashboard-container.d.ts.map +1 -0
- package/dashboard/dashboard-container.js +315 -0
- package/dashboard/index.d.ts +4 -0
- package/dashboard/index.d.ts.map +1 -0
- package/dashboard/index.js +2 -0
- package/designer/analytics-designer.d.ts +40 -0
- package/designer/analytics-designer.d.ts.map +1 -0
- package/designer/analytics-designer.js +267 -0
- package/designer/index.d.ts +5 -0
- package/designer/index.d.ts.map +1 -0
- package/designer/index.js +3 -0
- package/filters/filter-bar.d.ts +34 -0
- package/filters/filter-bar.d.ts.map +1 -0
- package/filters/filter-bar.js +233 -0
- package/filters/filter-button.d.ts +22 -0
- package/filters/filter-button.d.ts.map +1 -0
- package/filters/filter-button.js +86 -0
- package/filters/index.d.ts +7 -0
- package/filters/index.d.ts.map +1 -0
- package/filters/index.js +6 -0
- package/filters/widget-toolbar.d.ts +24 -0
- package/filters/widget-toolbar.d.ts.map +1 -0
- package/filters/widget-toolbar.js +219 -0
- package/index.d.ts +9 -1
- package/index.js +6 -1
- package/package.json +34 -9
- package/widgets/analytics-report.d.ts +49 -0
- package/widgets/analytics-report.d.ts.map +1 -0
- package/widgets/analytics-report.js +306 -0
- package/widgets/analytics-widget.d.ts +39 -0
- package/widgets/analytics-widget.d.ts.map +1 -0
- package/widgets/analytics-widget.js +230 -0
- package/widgets/bar-chart.d.ts +13 -0
- package/widgets/bar-chart.d.ts.map +1 -0
- package/widgets/bar-chart.js +77 -0
- package/widgets/base-chart.d.ts +92 -0
- package/widgets/base-chart.d.ts.map +1 -0
- package/widgets/base-chart.js +524 -0
- package/widgets/index.d.ts +13 -1
- package/widgets/index.d.ts.map +1 -1
- package/widgets/index.js +14 -3
- package/widgets/line-chart.d.ts +13 -0
- package/widgets/line-chart.d.ts.map +1 -0
- package/widgets/line-chart.js +71 -0
- package/widgets/pie-chart.d.ts +13 -0
- package/widgets/pie-chart.d.ts.map +1 -0
- package/widgets/pie-chart.js +55 -0
- package/widgets/table.d.ts +96 -0
- package/widgets/table.d.ts.map +1 -0
- package/widgets/table.js +721 -0
- package/index.d.ts.map +0 -1
package/core/types.d.ts
ADDED
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API response shape from Laravel analytics dataset/widget data endpoints.
|
|
3
|
+
* KoolReport returns { data: rows, meta: { columns: Record<string, { type: string }> } }.
|
|
4
|
+
*/
|
|
5
|
+
export interface AnalyticsDataMeta {
|
|
6
|
+
columns: Record<string, {
|
|
7
|
+
type?: string;
|
|
8
|
+
}>;
|
|
9
|
+
}
|
|
10
|
+
export interface AnalyticsDataResponse {
|
|
11
|
+
data: Record<string, unknown>[];
|
|
12
|
+
meta: AnalyticsDataMeta;
|
|
13
|
+
}
|
|
14
|
+
/** Full widget/data API response: widgetData, data, meta, filters, refresh_rate. */
|
|
15
|
+
export interface WidgetDataResponse extends AnalyticsDataResponse {
|
|
16
|
+
widgetData?: unknown;
|
|
17
|
+
filters?: FilterDefinition[];
|
|
18
|
+
refresh_rate?: number;
|
|
19
|
+
}
|
|
20
|
+
export interface WidgetDataOptions {
|
|
21
|
+
/** Base URL for API (e.g. /api/analytics). */
|
|
22
|
+
baseUrl?: string;
|
|
23
|
+
/** Query params to append (e.g. date_from, date_to). */
|
|
24
|
+
params?: Record<string, string | number | boolean>;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Insights-inspired widget config types.
|
|
28
|
+
* Emphasis on granularity for datetime dimensions (year, month, quarter, day, week).
|
|
29
|
+
*/
|
|
30
|
+
/** Supported granularity for datetime columns. */
|
|
31
|
+
export type DatetimeGranularity = 'year' | 'quarter' | 'month' | 'week' | 'day' | 'hour';
|
|
32
|
+
export interface DimensionRef {
|
|
33
|
+
column_name: string;
|
|
34
|
+
data_type: string;
|
|
35
|
+
dimension_name?: string;
|
|
36
|
+
label?: string;
|
|
37
|
+
value?: string;
|
|
38
|
+
/** Only for datetime columns. */
|
|
39
|
+
granularity?: DatetimeGranularity;
|
|
40
|
+
}
|
|
41
|
+
export interface MeasureRef {
|
|
42
|
+
aggregation: 'count' | 'sum' | 'avg' | 'min' | 'max';
|
|
43
|
+
column_name: string;
|
|
44
|
+
data_type: string;
|
|
45
|
+
measure_name?: string;
|
|
46
|
+
}
|
|
47
|
+
export interface FilterItem {
|
|
48
|
+
column?: string;
|
|
49
|
+
operator?: string;
|
|
50
|
+
value?: unknown;
|
|
51
|
+
}
|
|
52
|
+
export interface CommonChartConfig {
|
|
53
|
+
filters?: {
|
|
54
|
+
filters: FilterItem[];
|
|
55
|
+
logical_operator: 'And' | 'Or';
|
|
56
|
+
};
|
|
57
|
+
limit?: string;
|
|
58
|
+
order_by?: Array<{
|
|
59
|
+
column: {
|
|
60
|
+
column_name: string;
|
|
61
|
+
type: string;
|
|
62
|
+
};
|
|
63
|
+
direction: 'asc' | 'desc';
|
|
64
|
+
}>;
|
|
65
|
+
}
|
|
66
|
+
export interface BarChartConfig extends CommonChartConfig {
|
|
67
|
+
x_axis: {
|
|
68
|
+
dimension: DimensionRef;
|
|
69
|
+
};
|
|
70
|
+
y_axis: {
|
|
71
|
+
series: Array<{
|
|
72
|
+
measure: MeasureRef;
|
|
73
|
+
}>;
|
|
74
|
+
stack?: boolean;
|
|
75
|
+
overlap?: boolean;
|
|
76
|
+
normalize?: boolean;
|
|
77
|
+
show_axis_label?: boolean;
|
|
78
|
+
show_data_labels?: boolean;
|
|
79
|
+
show_scrollbar?: boolean;
|
|
80
|
+
};
|
|
81
|
+
split_by?: {
|
|
82
|
+
dimension: DimensionRef;
|
|
83
|
+
max_split_values?: string;
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
export interface LineChartConfig extends CommonChartConfig {
|
|
87
|
+
x_axis: {
|
|
88
|
+
dimension: DimensionRef;
|
|
89
|
+
};
|
|
90
|
+
y_axis: {
|
|
91
|
+
series: Array<{
|
|
92
|
+
measure: MeasureRef;
|
|
93
|
+
}>;
|
|
94
|
+
stack?: boolean;
|
|
95
|
+
show_axis_label?: boolean;
|
|
96
|
+
show_data_labels?: boolean;
|
|
97
|
+
};
|
|
98
|
+
split_by?: {
|
|
99
|
+
dimension: DimensionRef;
|
|
100
|
+
max_split_values?: string;
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
export interface DonutPieChartConfig extends CommonChartConfig {
|
|
104
|
+
label_column: {
|
|
105
|
+
dimension: DimensionRef;
|
|
106
|
+
};
|
|
107
|
+
value_column: {
|
|
108
|
+
measure: MeasureRef;
|
|
109
|
+
};
|
|
110
|
+
label_position?: 'left' | 'right' | 'top' | 'bottom';
|
|
111
|
+
legend_position?: 'left' | 'right' | 'top' | 'bottom';
|
|
112
|
+
max_slices?: string;
|
|
113
|
+
show_inline_labels?: boolean;
|
|
114
|
+
}
|
|
115
|
+
export interface NumberKpiChartConfig extends CommonChartConfig {
|
|
116
|
+
number_columns: Array<{
|
|
117
|
+
measure: MeasureRef;
|
|
118
|
+
}>;
|
|
119
|
+
number_column_options?: Array<{
|
|
120
|
+
decimal?: string;
|
|
121
|
+
prefix?: string;
|
|
122
|
+
suffix?: string;
|
|
123
|
+
}>;
|
|
124
|
+
date_column?: {
|
|
125
|
+
dimension: DimensionRef;
|
|
126
|
+
};
|
|
127
|
+
comparison?: boolean;
|
|
128
|
+
shorten_numbers?: boolean;
|
|
129
|
+
sparkline?: boolean;
|
|
130
|
+
}
|
|
131
|
+
export interface TableChartConfig extends CommonChartConfig {
|
|
132
|
+
columns?: Array<{
|
|
133
|
+
column_name: string;
|
|
134
|
+
label?: string;
|
|
135
|
+
format?: string;
|
|
136
|
+
type?: string;
|
|
137
|
+
}>;
|
|
138
|
+
page_size?: number;
|
|
139
|
+
}
|
|
140
|
+
export type ChartType = 'Bar' | 'BarHorizontal' | 'Line' | 'Donut' | 'Pie' | 'Number' | 'Table';
|
|
141
|
+
export interface WidgetDefinitionConfig {
|
|
142
|
+
chart_type: ChartType;
|
|
143
|
+
config: BarChartConfig | LineChartConfig | DonutPieChartConfig | NumberKpiChartConfig | TableChartConfig;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Transformed widget data shapes for easier rendering by chart type.
|
|
147
|
+
* Produced by WidgetDataTransformer from originalData + widget definition.
|
|
148
|
+
*/
|
|
149
|
+
export interface BarWidgetData {
|
|
150
|
+
chartType: 'Bar' | 'BarHorizontal';
|
|
151
|
+
categories: string[];
|
|
152
|
+
series: Array<{
|
|
153
|
+
name: string;
|
|
154
|
+
data: number[];
|
|
155
|
+
}>;
|
|
156
|
+
stack?: boolean;
|
|
157
|
+
}
|
|
158
|
+
export interface LineWidgetData {
|
|
159
|
+
chartType: 'Line';
|
|
160
|
+
categories: string[];
|
|
161
|
+
series: Array<{
|
|
162
|
+
name: string;
|
|
163
|
+
data: number[];
|
|
164
|
+
}>;
|
|
165
|
+
stack?: boolean;
|
|
166
|
+
}
|
|
167
|
+
export interface PieWidgetData {
|
|
168
|
+
chartType: 'Pie' | 'Donut';
|
|
169
|
+
items: Array<{
|
|
170
|
+
name: string;
|
|
171
|
+
value: number;
|
|
172
|
+
}>;
|
|
173
|
+
}
|
|
174
|
+
export interface NumberKpiWidgetData {
|
|
175
|
+
chartType: 'Number';
|
|
176
|
+
values: number[];
|
|
177
|
+
labels: string[];
|
|
178
|
+
options?: Array<{
|
|
179
|
+
decimal?: string;
|
|
180
|
+
prefix?: string;
|
|
181
|
+
suffix?: string;
|
|
182
|
+
}>;
|
|
183
|
+
}
|
|
184
|
+
/** Single header cell: key maps to data column; missing key = presentational only. */
|
|
185
|
+
export interface TableHeaderCell {
|
|
186
|
+
key?: string;
|
|
187
|
+
label: string;
|
|
188
|
+
colspan?: number;
|
|
189
|
+
rowspan?: number;
|
|
190
|
+
hide?: boolean;
|
|
191
|
+
}
|
|
192
|
+
/** Column definition from backend (order, visibility, label, align, format, rowspan). */
|
|
193
|
+
export interface TableColumnDef {
|
|
194
|
+
key: string;
|
|
195
|
+
label: string;
|
|
196
|
+
hide?: boolean;
|
|
197
|
+
align?: string | null;
|
|
198
|
+
format?: string | null;
|
|
199
|
+
rowspan?: boolean;
|
|
200
|
+
}
|
|
201
|
+
export interface TableWidgetData {
|
|
202
|
+
chartType: 'Table';
|
|
203
|
+
/** Column keys in display order (body cells). */
|
|
204
|
+
columns: string[];
|
|
205
|
+
/** Full column definitions (labels, align, format, rowspan, hide). When present, use for headers and styling. */
|
|
206
|
+
columnDefs?: TableColumnDef[];
|
|
207
|
+
/** Multi-row header: array of rows, each row array of cells. When present, use instead of single row from columns. */
|
|
208
|
+
header_rows?: TableHeaderCell[][];
|
|
209
|
+
/** Body rows. Prefer over raw API `data` when widgetData is from backend. */
|
|
210
|
+
rows: Record<string, unknown>[];
|
|
211
|
+
/** Per-column rowspan runs: key -> array of length rows; 0 = merged with above, N = rowspan count. */
|
|
212
|
+
rowSpanRuns?: Record<string, number[]>;
|
|
213
|
+
/** Optional font size for table (e.g. '0.75rem', '12px') to adjust for table complexity. */
|
|
214
|
+
font_size?: string;
|
|
215
|
+
/** When true, the summary/totals row is sticky (stays visible when scrolling). */
|
|
216
|
+
totals_sticky?: boolean;
|
|
217
|
+
/** When totals_sticky is true, 'top' or 'bottom' – where the totals row sticks. */
|
|
218
|
+
totals_position?: 'top' | 'bottom';
|
|
219
|
+
}
|
|
220
|
+
export type WidgetData = BarWidgetData | LineWidgetData | PieWidgetData | NumberKpiWidgetData | TableWidgetData;
|
|
221
|
+
/** Filter option from API (preset or static options). */
|
|
222
|
+
export interface FilterOption {
|
|
223
|
+
value: string | number;
|
|
224
|
+
label?: string;
|
|
225
|
+
}
|
|
226
|
+
/** Filter definition from dashboard or widget API (param_name, type, label, options, default_value). */
|
|
227
|
+
export interface FilterDefinition {
|
|
228
|
+
param_name: string;
|
|
229
|
+
type: string;
|
|
230
|
+
/** UI label (e.g. "Year", "Month"); falls back to param_name if omitted. */
|
|
231
|
+
label?: string;
|
|
232
|
+
options?: FilterOption[];
|
|
233
|
+
/** Default value when none selected; sent as param value if user has not chosen a value. */
|
|
234
|
+
default_value?: string | number | boolean;
|
|
235
|
+
}
|
|
236
|
+
/** Options for lazy viewport-based rendering of widgets. */
|
|
237
|
+
export interface LazyWidgetOptions {
|
|
238
|
+
/** When true, only fetch/render when widget enters viewport; pause refresh when out of viewport. */
|
|
239
|
+
lazy?: boolean;
|
|
240
|
+
/** CSS margin around viewport to trigger visibility earlier (e.g. '200px'). Used as IntersectionObserver rootMargin. */
|
|
241
|
+
prefetch_margin?: string;
|
|
242
|
+
}
|
|
243
|
+
/** Options for offloading heavy transforms to a Web Worker. */
|
|
244
|
+
export interface WorkerWidgetOptions {
|
|
245
|
+
/** When true, attempt to run dataset transform (pivot/aggregation) in a worker. Fallback to main thread if unsupported or data small. */
|
|
246
|
+
use_worker?: boolean;
|
|
247
|
+
/** Minimum row count to use worker (below this, main thread is used). Default 500. */
|
|
248
|
+
worker_min_rows?: number;
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../libs/analytics/src/core/types.ts"],"names":[],"mappings":"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"}
|
package/core/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Viewport observer for lazy rendering: only fetch/render when widget enters viewport.
|
|
3
|
+
* Uses IntersectionObserver with configurable rootMargin (prefetch_margin).
|
|
4
|
+
*/
|
|
5
|
+
export interface ViewportObserverOptions {
|
|
6
|
+
/** CSS margin around root to trigger "in view" earlier (e.g. '200px' for prefetch). */
|
|
7
|
+
rootMargin?: string;
|
|
8
|
+
/** Intersection ratio threshold (0–1). Default 0. */
|
|
9
|
+
threshold?: number;
|
|
10
|
+
}
|
|
11
|
+
export interface ViewportObserverCallbacks {
|
|
12
|
+
/** Called when element enters viewport (or is already visible). */
|
|
13
|
+
onEnter: () => void;
|
|
14
|
+
/** Called when element leaves viewport. */
|
|
15
|
+
onLeave?: () => void;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Observes an element for viewport visibility. When the element intersects the viewport
|
|
19
|
+
* (with optional rootMargin), onEnter is called; when it leaves, onLeave is called.
|
|
20
|
+
* @param element - DOM element to observe (e.g. widget container).
|
|
21
|
+
* @param options - rootMargin (e.g. '200px'), threshold.
|
|
22
|
+
* @param callbacks - onEnter (required), onLeave (optional).
|
|
23
|
+
* @returns Cleanup function (disconnect observer).
|
|
24
|
+
*/
|
|
25
|
+
export declare function observeViewport(element: Element, options: ViewportObserverOptions, callbacks: ViewportObserverCallbacks): () => void;
|
|
26
|
+
//# sourceMappingURL=viewport-observer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"viewport-observer.d.ts","sourceRoot":"","sources":["../../../../libs/analytics/src/core/viewport-observer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,uBAAuB;IACtC,uFAAuF;IACvF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,yBAAyB;IACxC,mEAAmE;IACnE,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,2CAA2C;IAC3C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,uBAAuB,EAChC,SAAS,EAAE,yBAAyB,GACnC,MAAM,IAAI,CA6BZ"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Viewport observer for lazy rendering: only fetch/render when widget enters viewport.
|
|
3
|
+
* Uses IntersectionObserver with configurable rootMargin (prefetch_margin).
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Observes an element for viewport visibility. When the element intersects the viewport
|
|
7
|
+
* (with optional rootMargin), onEnter is called; when it leaves, onLeave is called.
|
|
8
|
+
* @param element - DOM element to observe (e.g. widget container).
|
|
9
|
+
* @param options - rootMargin (e.g. '200px'), threshold.
|
|
10
|
+
* @param callbacks - onEnter (required), onLeave (optional).
|
|
11
|
+
* @returns Cleanup function (disconnect observer).
|
|
12
|
+
*/
|
|
13
|
+
export function observeViewport(element, options, callbacks) {
|
|
14
|
+
if (typeof IntersectionObserver === 'undefined') {
|
|
15
|
+
callbacks.onEnter();
|
|
16
|
+
return () => { };
|
|
17
|
+
}
|
|
18
|
+
const { rootMargin = '0px', threshold = 0 } = options;
|
|
19
|
+
let connected = true;
|
|
20
|
+
const observer = new IntersectionObserver((entries) => {
|
|
21
|
+
if (!connected)
|
|
22
|
+
return;
|
|
23
|
+
const entry = entries[0];
|
|
24
|
+
if (!entry)
|
|
25
|
+
return;
|
|
26
|
+
if (entry.isIntersecting) {
|
|
27
|
+
callbacks.onEnter();
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
callbacks.onLeave?.();
|
|
31
|
+
}
|
|
32
|
+
}, { root: null, rootMargin, threshold });
|
|
33
|
+
observer.observe(element);
|
|
34
|
+
return () => {
|
|
35
|
+
connected = false;
|
|
36
|
+
observer.disconnect();
|
|
37
|
+
};
|
|
38
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runs widget data transform in a Web Worker (optional) with fallback to main thread.
|
|
3
|
+
* Use for large datasets to avoid blocking the UI. Worker is lazy-loaded on first use.
|
|
4
|
+
*/
|
|
5
|
+
import type { WorkerWidgetOptions } from './types.js';
|
|
6
|
+
export interface WidgetTransformInput {
|
|
7
|
+
widgetDefinition: Record<string, unknown>;
|
|
8
|
+
data: Record<string, unknown>[];
|
|
9
|
+
}
|
|
10
|
+
export interface WidgetTransformOptions extends WorkerWidgetOptions {
|
|
11
|
+
/** Override worker script URL (for environments where import.meta.url is not available). */
|
|
12
|
+
workerUrl?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Run widget data transform. Uses Web Worker when use_worker is true and data length >= worker_min_rows;
|
|
16
|
+
* otherwise runs on main thread.
|
|
17
|
+
* @param input - widgetDefinition and data
|
|
18
|
+
* @param options - use_worker, worker_min_rows, workerUrl
|
|
19
|
+
* @returns Promise resolving to widgetData (e.g. TableWidgetData)
|
|
20
|
+
*/
|
|
21
|
+
export declare function runWidgetTransform(input: WidgetTransformInput, options?: WidgetTransformOptions): Promise<unknown>;
|
|
22
|
+
//# sourceMappingURL=widget-transform-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"widget-transform-runner.d.ts","sourceRoot":"","sources":["../../../../libs/analytics/src/core/widget-transform-runner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD,MAAM,WAAW,oBAAoB;IACnC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,sBAAuB,SAAQ,mBAAmB;IACjE,4FAA4F;IAC5F,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAyED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,oBAAoB,EAC3B,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,OAAO,CAAC,CA2BlB"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runs widget data transform in a Web Worker (optional) with fallback to main thread.
|
|
3
|
+
* Use for large datasets to avoid blocking the UI. Worker is lazy-loaded on first use.
|
|
4
|
+
*/
|
|
5
|
+
let _worker = null;
|
|
6
|
+
let _workerLoadPromise = null;
|
|
7
|
+
let _nextId = 0;
|
|
8
|
+
const _pending = new Map();
|
|
9
|
+
const DEFAULT_WORKER_MIN_ROWS = 500;
|
|
10
|
+
function mainThreadTransform(widgetDefinition, data) {
|
|
11
|
+
if (!Array.isArray(data) || data.length === 0) {
|
|
12
|
+
return { chartType: 'Table', columns: [], rows: [] };
|
|
13
|
+
}
|
|
14
|
+
const columns = Object.keys(data[0]);
|
|
15
|
+
return { chartType: 'Table', columns, rows: data };
|
|
16
|
+
}
|
|
17
|
+
function getWorkerUrl() {
|
|
18
|
+
try {
|
|
19
|
+
return new URL('../workers/widget-transform.worker.js', import.meta.url).href;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function loadWorker(workerUrl) {
|
|
26
|
+
if (_worker)
|
|
27
|
+
return Promise.resolve(_worker);
|
|
28
|
+
if (_workerLoadPromise)
|
|
29
|
+
return _workerLoadPromise;
|
|
30
|
+
const url = workerUrl ?? getWorkerUrl();
|
|
31
|
+
if (!url || typeof Worker === 'undefined') {
|
|
32
|
+
return Promise.reject(new Error('Worker not supported or URL not available'));
|
|
33
|
+
}
|
|
34
|
+
_workerLoadPromise = new Promise((resolve, reject) => {
|
|
35
|
+
try {
|
|
36
|
+
const w = new Worker(url, { type: 'module' });
|
|
37
|
+
w.onmessage = (e) => {
|
|
38
|
+
const d = e.data;
|
|
39
|
+
if (d?.type === 'result' && typeof d.id === 'number') {
|
|
40
|
+
const pending = _pending.get(d.id);
|
|
41
|
+
if (pending) {
|
|
42
|
+
clearTimeout(pending.timeoutId);
|
|
43
|
+
_pending.delete(d.id);
|
|
44
|
+
pending.resolve(d.widgetData);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
else if (d?.type === 'error' && typeof d.id === 'number') {
|
|
48
|
+
const pending = _pending.get(d.id);
|
|
49
|
+
if (pending) {
|
|
50
|
+
clearTimeout(pending.timeoutId);
|
|
51
|
+
_pending.delete(d.id);
|
|
52
|
+
pending.reject(new Error(d.error ?? 'Worker error'));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
w.onerror = () => {
|
|
57
|
+
_workerLoadPromise = null;
|
|
58
|
+
reject(new Error('Worker failed to load'));
|
|
59
|
+
};
|
|
60
|
+
_worker = w;
|
|
61
|
+
resolve(w);
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
_workerLoadPromise = null;
|
|
65
|
+
reject(err instanceof Error ? err : new Error(String(err)));
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
return _workerLoadPromise;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Run widget data transform. Uses Web Worker when use_worker is true and data length >= worker_min_rows;
|
|
72
|
+
* otherwise runs on main thread.
|
|
73
|
+
* @param input - widgetDefinition and data
|
|
74
|
+
* @param options - use_worker, worker_min_rows, workerUrl
|
|
75
|
+
* @returns Promise resolving to widgetData (e.g. TableWidgetData)
|
|
76
|
+
*/
|
|
77
|
+
export function runWidgetTransform(input, options = {}) {
|
|
78
|
+
const { use_worker = false, worker_min_rows = DEFAULT_WORKER_MIN_ROWS, workerUrl } = options;
|
|
79
|
+
const { widgetDefinition, data } = input;
|
|
80
|
+
const rows = Array.isArray(data) ? data.length : 0;
|
|
81
|
+
const useWorker = use_worker && rows >= worker_min_rows;
|
|
82
|
+
if (!useWorker) {
|
|
83
|
+
return Promise.resolve(mainThreadTransform(widgetDefinition, data ?? []));
|
|
84
|
+
}
|
|
85
|
+
const id = ++_nextId;
|
|
86
|
+
return loadWorker(workerUrl)
|
|
87
|
+
.then((worker) => {
|
|
88
|
+
return new Promise((resolve, reject) => {
|
|
89
|
+
const timeoutId = setTimeout(() => {
|
|
90
|
+
if (_pending.has(id)) {
|
|
91
|
+
_pending.delete(id);
|
|
92
|
+
reject(new Error('Worker transform timeout'));
|
|
93
|
+
}
|
|
94
|
+
}, 60000);
|
|
95
|
+
_pending.set(id, { resolve, reject, timeoutId });
|
|
96
|
+
worker.postMessage({ type: 'transform', id, widgetDefinition, data: data ?? [] });
|
|
97
|
+
});
|
|
98
|
+
})
|
|
99
|
+
.catch(() => {
|
|
100
|
+
return mainThreadTransform(widgetDefinition, data ?? []);
|
|
101
|
+
});
|
|
102
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { LitElement } from 'lit';
|
|
2
|
+
import type { FilterDefinition } from '../core/types.js';
|
|
3
|
+
import '../filters/index.js';
|
|
4
|
+
import 'gridstack/dist/gridstack.min.css';
|
|
5
|
+
export interface DashboardSlot {
|
|
6
|
+
/** Widget type: analytics-bar-chart, analytics-line-chart, analytics-pie-chart, analytics-table, etc. */
|
|
7
|
+
type: string;
|
|
8
|
+
/** Data URL (e.g. /api/analytics/widgets/1/data). */
|
|
9
|
+
dataUrl?: string;
|
|
10
|
+
/** Query params for data-url. */
|
|
11
|
+
dataParams?: Record<string, string | number | boolean>;
|
|
12
|
+
/** Grid area: row start, col start, row span, col span. */
|
|
13
|
+
gridArea?: string;
|
|
14
|
+
/** Optional title. */
|
|
15
|
+
title?: string;
|
|
16
|
+
/** When true, only fetch/render when widget enters viewport. */
|
|
17
|
+
lazy?: boolean;
|
|
18
|
+
/** CSS margin for viewport prefetch (e.g. '200px'). Used when lazy is true. */
|
|
19
|
+
prefetch_margin?: string;
|
|
20
|
+
}
|
|
21
|
+
/** Gridster/GridStack item: widget id + position/size. Stored in dashboard layout. */
|
|
22
|
+
export interface GridsterGridItem {
|
|
23
|
+
/** Widget id (used to build /widgets/{id}/data URL). */
|
|
24
|
+
widgetId: string;
|
|
25
|
+
/** Widget type: bar, line, pie, table (for rendering the right component). */
|
|
26
|
+
type?: string;
|
|
27
|
+
x: number;
|
|
28
|
+
y: number;
|
|
29
|
+
w: number;
|
|
30
|
+
h: number;
|
|
31
|
+
/** GridStack node id (optional; can use widgetId). */
|
|
32
|
+
id?: string;
|
|
33
|
+
/** Optional title. */
|
|
34
|
+
title?: string;
|
|
35
|
+
/** When true, only fetch/render when widget enters viewport. */
|
|
36
|
+
lazy?: boolean;
|
|
37
|
+
/** CSS margin for viewport prefetch (e.g. '200px'). Used when lazy is true. */
|
|
38
|
+
prefetch_margin?: string;
|
|
39
|
+
}
|
|
40
|
+
export interface DashboardLayout {
|
|
41
|
+
/** API base URL (host + prefix, e.g. https://api.example.com/api/analytics). Used with widgetId to build data URL. */
|
|
42
|
+
apiUrl?: string;
|
|
43
|
+
/** Gridster/GridStack: number of columns (default 12). */
|
|
44
|
+
column?: number;
|
|
45
|
+
/** Gridster/GridStack: layout children (widgetId, type, x, y, w, h). When set, dashboard uses GridStack. */
|
|
46
|
+
children?: GridsterGridItem[];
|
|
47
|
+
/** Legacy: grid columns (e.g. "1fr 1fr"). */
|
|
48
|
+
columns?: string;
|
|
49
|
+
/** Legacy: grid rows (e.g. "auto 1fr"). */
|
|
50
|
+
rows?: string;
|
|
51
|
+
/** Legacy: gap between items. */
|
|
52
|
+
gap?: string;
|
|
53
|
+
/** Legacy: slots to render (when children is not set). */
|
|
54
|
+
slots?: DashboardSlot[];
|
|
55
|
+
/** Dashboard-level filter definitions (from API). */
|
|
56
|
+
filters?: FilterDefinition[];
|
|
57
|
+
/** When true, dashboard filter bar is hidden and dashboard params are not sent to widgets. */
|
|
58
|
+
hide_filter?: boolean;
|
|
59
|
+
/** Refresh interval in seconds (0 = no auto refresh). */
|
|
60
|
+
refresh_rate?: number;
|
|
61
|
+
}
|
|
62
|
+
export declare const EVENT_DASHBOARD_FILTER_CHANGE = "analytics-dashboard-filter-change";
|
|
63
|
+
export declare const EVENT_DASHBOARD_REFRESH = "analytics-dashboard-refresh";
|
|
64
|
+
export declare const EVENT_DASHBOARD_LAYOUT_CHANGE = "analytics-dashboard-layout-change";
|
|
65
|
+
/**
|
|
66
|
+
* Dashboard container: renders a grid of analytics widgets (Lit web components).
|
|
67
|
+
* Shows filter button and filter bar when layout.filters is set; dispatches filter-change and refresh
|
|
68
|
+
* When layout.children is set, uses GridStack (gridster); otherwise legacy slots + CSS grid.
|
|
69
|
+
* Passes apiUrl + widgetId to widgets; dispatches layout-change when grid layout changes.
|
|
70
|
+
*/
|
|
71
|
+
export declare class DashboardContainer extends LitElement {
|
|
72
|
+
static styles: import("lit").CSSResult;
|
|
73
|
+
layout: DashboardLayout;
|
|
74
|
+
private _dashboardParams;
|
|
75
|
+
private _filterBarOpen;
|
|
76
|
+
private _refreshIntervalId;
|
|
77
|
+
private _gridStack;
|
|
78
|
+
connectedCallback(): void;
|
|
79
|
+
disconnectedCallback(): void;
|
|
80
|
+
firstUpdated(): void;
|
|
81
|
+
updated(changed: Map<string, unknown>): void;
|
|
82
|
+
private _destroyGridStack;
|
|
83
|
+
private _initGridStack;
|
|
84
|
+
private _loadGridStackChildren;
|
|
85
|
+
private _startRefreshInterval;
|
|
86
|
+
private _stopRefreshInterval;
|
|
87
|
+
/** Current dashboard-level filter params (for widgets to merge). Returns {} when layout.hide_filter is true. */
|
|
88
|
+
getDashboardParams(): Record<string, string | number | boolean>;
|
|
89
|
+
private _onFilterChange;
|
|
90
|
+
private _onFilterClose;
|
|
91
|
+
private _onFilterToggle;
|
|
92
|
+
render(): import("lit-html").TemplateResult<1>;
|
|
93
|
+
private _renderSlot;
|
|
94
|
+
}
|
|
95
|
+
declare global {
|
|
96
|
+
interface HTMLElementTagNameMap {
|
|
97
|
+
'analytics-dashboard': DashboardContainer;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=dashboard-container.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard-container.d.ts","sourceRoot":"","sources":["../../../../libs/analytics/src/dashboard/dashboard-container.ts"],"names":[],"mappings":"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"}
|