@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.
Files changed (71) hide show
  1. package/analytics.css +69 -0
  2. package/core/auth.d.ts +19 -0
  3. package/core/auth.d.ts.map +1 -0
  4. package/core/auth.js +34 -0
  5. package/core/fetch-data.d.ts +115 -0
  6. package/core/fetch-data.d.ts.map +1 -0
  7. package/core/fetch-data.js +210 -0
  8. package/core/index.d.ts +8 -1
  9. package/core/index.d.ts.map +1 -1
  10. package/core/index.js +4 -3
  11. package/core/types.d.ts +250 -0
  12. package/core/types.d.ts.map +1 -0
  13. package/core/types.js +1 -0
  14. package/core/viewport-observer.d.ts +26 -0
  15. package/core/viewport-observer.d.ts.map +1 -0
  16. package/core/viewport-observer.js +38 -0
  17. package/core/widget-transform-runner.d.ts +22 -0
  18. package/core/widget-transform-runner.d.ts.map +1 -0
  19. package/core/widget-transform-runner.js +102 -0
  20. package/dashboard/dashboard-container.d.ts +100 -0
  21. package/dashboard/dashboard-container.d.ts.map +1 -0
  22. package/dashboard/dashboard-container.js +315 -0
  23. package/dashboard/index.d.ts +4 -0
  24. package/dashboard/index.d.ts.map +1 -0
  25. package/dashboard/index.js +2 -0
  26. package/designer/analytics-designer.d.ts +40 -0
  27. package/designer/analytics-designer.d.ts.map +1 -0
  28. package/designer/analytics-designer.js +267 -0
  29. package/designer/index.d.ts +5 -0
  30. package/designer/index.d.ts.map +1 -0
  31. package/designer/index.js +3 -0
  32. package/filters/filter-bar.d.ts +34 -0
  33. package/filters/filter-bar.d.ts.map +1 -0
  34. package/filters/filter-bar.js +233 -0
  35. package/filters/filter-button.d.ts +22 -0
  36. package/filters/filter-button.d.ts.map +1 -0
  37. package/filters/filter-button.js +86 -0
  38. package/filters/index.d.ts +7 -0
  39. package/filters/index.d.ts.map +1 -0
  40. package/filters/index.js +6 -0
  41. package/filters/widget-toolbar.d.ts +24 -0
  42. package/filters/widget-toolbar.d.ts.map +1 -0
  43. package/filters/widget-toolbar.js +219 -0
  44. package/index.d.ts +9 -1
  45. package/index.js +6 -1
  46. package/package.json +34 -9
  47. package/widgets/analytics-report.d.ts +49 -0
  48. package/widgets/analytics-report.d.ts.map +1 -0
  49. package/widgets/analytics-report.js +306 -0
  50. package/widgets/analytics-widget.d.ts +39 -0
  51. package/widgets/analytics-widget.d.ts.map +1 -0
  52. package/widgets/analytics-widget.js +230 -0
  53. package/widgets/bar-chart.d.ts +13 -0
  54. package/widgets/bar-chart.d.ts.map +1 -0
  55. package/widgets/bar-chart.js +77 -0
  56. package/widgets/base-chart.d.ts +92 -0
  57. package/widgets/base-chart.d.ts.map +1 -0
  58. package/widgets/base-chart.js +524 -0
  59. package/widgets/index.d.ts +13 -1
  60. package/widgets/index.d.ts.map +1 -1
  61. package/widgets/index.js +14 -3
  62. package/widgets/line-chart.d.ts +13 -0
  63. package/widgets/line-chart.d.ts.map +1 -0
  64. package/widgets/line-chart.js +71 -0
  65. package/widgets/pie-chart.d.ts +13 -0
  66. package/widgets/pie-chart.d.ts.map +1 -0
  67. package/widgets/pie-chart.js +55 -0
  68. package/widgets/table.d.ts +96 -0
  69. package/widgets/table.d.ts.map +1 -0
  70. package/widgets/table.js +721 -0
  71. package/index.d.ts.map +0 -1
@@ -0,0 +1,230 @@
1
+ import { __decorate } from "tslib";
2
+ import { LitElement, html, css, nothing } from 'lit';
3
+ import { customElement, property, state } from 'lit/decorators.js';
4
+ import { fetchWidgetDefinition } from '../core/fetch-data.js';
5
+ // Register inner widgets so they are defined when we render them
6
+ import './bar-chart.js';
7
+ import './line-chart.js';
8
+ import './pie-chart.js';
9
+ import './table.js';
10
+ /** Map API chart_type to inner widget type. */
11
+ const CHART_TYPE_TO_TAG = {
12
+ Bar: 'analytics-bar-chart',
13
+ BarHorizontal: 'analytics-bar-chart',
14
+ Line: 'analytics-line-chart',
15
+ Pie: 'analytics-pie-chart',
16
+ Donut: 'analytics-pie-chart',
17
+ Number: 'analytics-table', // KPI: fallback to table for now
18
+ Table: 'analytics-table',
19
+ };
20
+ /**
21
+ * Generic analytics widget: pass widgetId + apiUrl (and optional config);
22
+ * fetches the widget definition and renders the appropriate chart/table internally.
23
+ * Use this so developers don't need to know the chart type.
24
+ */
25
+ let AnalyticsWidget = class AnalyticsWidget extends LitElement {
26
+ static { this.styles = css `
27
+ :host {
28
+ display: block;
29
+ width: 100%;
30
+ height: 100%;
31
+ min-height: 120px;
32
+ }
33
+ .widget-inner {
34
+ width: 100%;
35
+ height: 100%;
36
+ min-height: 120px;
37
+ }
38
+ .loading,
39
+ .error {
40
+ display: flex;
41
+ align-items: center;
42
+ justify-content: center;
43
+ min-height: 120px;
44
+ padding: 1rem;
45
+ color: #6b7280;
46
+ }
47
+ .error {
48
+ color: #b91c1c;
49
+ }
50
+ .loading-spinner {
51
+ width: 2rem;
52
+ height: 2rem;
53
+ border: 2px solid #e5e7eb;
54
+ border-top-color: #3b82f6;
55
+ border-radius: 50%;
56
+ animation: analytics-widget-spin 0.7s linear infinite;
57
+ }
58
+ @keyframes analytics-widget-spin {
59
+ to { transform: rotate(360deg); }
60
+ }
61
+ `; }
62
+ constructor() {
63
+ super();
64
+ this.widgetId = '';
65
+ this.apiUrl = '';
66
+ this.title = '';
67
+ this.dataParams = {};
68
+ this.dashboard = null;
69
+ this.lazy = false;
70
+ this.prefetchMargin = '200px';
71
+ this._chartType = '';
72
+ this._definition = null;
73
+ this._loading = false;
74
+ this._error = null;
75
+ }
76
+ updated(changed) {
77
+ if (!this.apiUrl || !this.widgetId || this._loading)
78
+ return;
79
+ if (changed.has('widgetId') || changed.has('apiUrl')) {
80
+ this._chartType = '';
81
+ this._definition = null;
82
+ this._loadDefinition();
83
+ }
84
+ else if (!this._chartType) {
85
+ this._loadDefinition();
86
+ }
87
+ }
88
+ async _loadDefinition() {
89
+ if (!this.apiUrl || !this.widgetId || this._loading)
90
+ return;
91
+ this._loading = true;
92
+ this._error = null;
93
+ try {
94
+ const def = await fetchWidgetDefinition(this.apiUrl, this.widgetId);
95
+ this._chartType = def.chart_type;
96
+ this._definition = {
97
+ title: def.title,
98
+ filters: def.filters,
99
+ hide_filter: def.hide_filter,
100
+ };
101
+ }
102
+ catch (e) {
103
+ this._error = e instanceof Error ? e.message : String(e);
104
+ this._chartType = '';
105
+ this._definition = null;
106
+ }
107
+ finally {
108
+ this._loading = false;
109
+ }
110
+ }
111
+ get _innerTag() {
112
+ if (!this._chartType)
113
+ return '';
114
+ return CHART_TYPE_TO_TAG[this._chartType] ?? 'analytics-table';
115
+ }
116
+ _renderInnerWidget() {
117
+ const common = {
118
+ widgetId: this.widgetId,
119
+ apiUrl: this.apiUrl,
120
+ title: this.title,
121
+ dataParams: this.dataParams ?? {},
122
+ dashboard: this.dashboard,
123
+ lazy: this.lazy,
124
+ prefetchMargin: this.prefetchMargin || '200px',
125
+ initialDefinition: this._definition ?? undefined,
126
+ };
127
+ const tag = this._innerTag;
128
+ switch (tag) {
129
+ case 'analytics-bar-chart':
130
+ return html `<analytics-bar-chart
131
+ widget-id=${common.widgetId}
132
+ api-url=${common.apiUrl}
133
+ .title=${common.title}
134
+ .dataParams=${common.dataParams}
135
+ .dashboard=${common.dashboard}
136
+ .initialDefinition=${common.initialDefinition}
137
+ ?lazy=${common.lazy}
138
+ prefetch-margin=${common.prefetchMargin}
139
+ ></analytics-bar-chart>`;
140
+ case 'analytics-line-chart':
141
+ return html `<analytics-line-chart
142
+ widget-id=${common.widgetId}
143
+ api-url=${common.apiUrl}
144
+ .title=${common.title}
145
+ .dataParams=${common.dataParams}
146
+ .dashboard=${common.dashboard}
147
+ .initialDefinition=${common.initialDefinition}
148
+ ?lazy=${common.lazy}
149
+ prefetch-margin=${common.prefetchMargin}
150
+ ></analytics-line-chart>`;
151
+ case 'analytics-pie-chart':
152
+ return html `<analytics-pie-chart
153
+ widget-id=${common.widgetId}
154
+ api-url=${common.apiUrl}
155
+ .title=${common.title}
156
+ .dataParams=${common.dataParams}
157
+ .dashboard=${common.dashboard}
158
+ .initialDefinition=${common.initialDefinition}
159
+ ?lazy=${common.lazy}
160
+ prefetch-margin=${common.prefetchMargin}
161
+ ></analytics-pie-chart>`;
162
+ case 'analytics-table':
163
+ return html `<analytics-table
164
+ widget-id=${common.widgetId}
165
+ api-url=${common.apiUrl}
166
+ .title=${common.title}
167
+ .dataParams=${common.dataParams}
168
+ .dashboard=${common.dashboard}
169
+ .initialDefinition=${common.initialDefinition}
170
+ ?lazy=${common.lazy}
171
+ prefetch-margin=${common.prefetchMargin}
172
+ ></analytics-table>`;
173
+ default:
174
+ return nothing;
175
+ }
176
+ }
177
+ render() {
178
+ if (this._loading) {
179
+ return html `
180
+ <div class="loading" aria-busy="true" aria-live="polite">
181
+ <div class="loading-spinner" aria-hidden="true"></div>
182
+ </div>
183
+ `;
184
+ }
185
+ if (this._error) {
186
+ return html `<div class="error" role="alert">${this._error}</div>`;
187
+ }
188
+ if (!this._innerTag) {
189
+ return nothing;
190
+ }
191
+ return html `<div class="widget-inner">${this._renderInnerWidget()}</div>`;
192
+ }
193
+ };
194
+ __decorate([
195
+ property({ type: String, attribute: 'widget-id' })
196
+ ], AnalyticsWidget.prototype, "widgetId", void 0);
197
+ __decorate([
198
+ property({ type: String, attribute: 'api-url' })
199
+ ], AnalyticsWidget.prototype, "apiUrl", void 0);
200
+ __decorate([
201
+ property({ type: String })
202
+ ], AnalyticsWidget.prototype, "title", void 0);
203
+ __decorate([
204
+ property({ type: Object })
205
+ ], AnalyticsWidget.prototype, "dataParams", void 0);
206
+ __decorate([
207
+ property({ type: Object })
208
+ ], AnalyticsWidget.prototype, "dashboard", void 0);
209
+ __decorate([
210
+ property({ type: Boolean })
211
+ ], AnalyticsWidget.prototype, "lazy", void 0);
212
+ __decorate([
213
+ property({ type: String, attribute: 'prefetch-margin' })
214
+ ], AnalyticsWidget.prototype, "prefetchMargin", void 0);
215
+ __decorate([
216
+ state()
217
+ ], AnalyticsWidget.prototype, "_chartType", void 0);
218
+ __decorate([
219
+ state()
220
+ ], AnalyticsWidget.prototype, "_definition", void 0);
221
+ __decorate([
222
+ state()
223
+ ], AnalyticsWidget.prototype, "_loading", void 0);
224
+ __decorate([
225
+ state()
226
+ ], AnalyticsWidget.prototype, "_error", void 0);
227
+ AnalyticsWidget = __decorate([
228
+ customElement('analytics-widget')
229
+ ], AnalyticsWidget);
230
+ export { AnalyticsWidget };
@@ -0,0 +1,13 @@
1
+ import type { EChartsOption } from 'echarts/types/dist/option';
2
+ import { BaseChartWidget } from './base-chart.js';
3
+ /**
4
+ * Bar chart widget (Apache ECharts). Use data-url or inline data.
5
+ * When widgetData is present (from API), use its categories + series so x-axis is correct (e.g. split_by).
6
+ * Otherwise first column = categories, remaining = series.
7
+ */
8
+ export declare class BarChartWidget extends BaseChartWidget {
9
+ buildOption(data: Record<string, unknown>[], meta: Record<string, {
10
+ type?: string;
11
+ }>, widgetData?: unknown): EChartsOption;
12
+ }
13
+ //# sourceMappingURL=bar-chart.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bar-chart.d.ts","sourceRoot":"","sources":["../../../../libs/analytics/src/widgets/bar-chart.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAuBlD;;;;GAIG;AACH,qBACa,cAAe,SAAQ,eAAe;IACxC,WAAW,CAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAC/B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,EACvC,UAAU,CAAC,EAAE,OAAO,GACnB,aAAa;CAsDjB"}
@@ -0,0 +1,77 @@
1
+ import { __decorate } from "tslib";
2
+ import { customElement } from 'lit/decorators.js';
3
+ import { BaseChartWidget } from './base-chart.js';
4
+ const LEGEND_NAME_MAX_LEN = 25;
5
+ function legendConfig(multipleSeries) {
6
+ if (!multipleSeries)
7
+ return undefined;
8
+ return {
9
+ type: 'scroll',
10
+ bottom: 8,
11
+ left: 'center',
12
+ formatter: (name) => name.length > LEGEND_NAME_MAX_LEN ? name.slice(0, LEGEND_NAME_MAX_LEN) + '…' : name,
13
+ };
14
+ }
15
+ /**
16
+ * Bar chart widget (Apache ECharts). Use data-url or inline data.
17
+ * When widgetData is present (from API), use its categories + series so x-axis is correct (e.g. split_by).
18
+ * Otherwise first column = categories, remaining = series.
19
+ */
20
+ let BarChartWidget = class BarChartWidget extends BaseChartWidget {
21
+ buildOption(data, meta, widgetData) {
22
+ const wd = widgetData;
23
+ // Prefer widgetData whenever API sent it (categories = x-axis, series = one per split) so x-axis is never wrong.
24
+ if (wd && typeof wd === 'object' && Array.isArray(wd.categories)) {
25
+ const categories = wd.categories.map(String);
26
+ const seriesList = Array.isArray(wd.series) ? wd.series : [];
27
+ const series = seriesList.map((s) => ({
28
+ name: String(s?.name ?? ''),
29
+ type: 'bar',
30
+ data: Array.isArray(s?.data) ? s.data.map((v) => Number(v) || 0) : [],
31
+ stack: wd.stack ? 'total' : undefined,
32
+ }));
33
+ const multiSeries = series.length > 1;
34
+ const isHorizontal = wd.chartType === 'BarHorizontal';
35
+ return {
36
+ grid: {
37
+ left: isHorizontal ? 120 : 48,
38
+ right: 24,
39
+ top: 24,
40
+ bottom: multiSeries ? 80 : 48,
41
+ },
42
+ tooltip: { trigger: 'axis' },
43
+ legend: legendConfig(multiSeries),
44
+ xAxis: isHorizontal ? { type: 'value' } : { type: 'category', data: categories },
45
+ yAxis: isHorizontal ? { type: 'category', data: categories } : { type: 'value' },
46
+ series,
47
+ };
48
+ }
49
+ const keys = data.length ? Object.keys(data[0]) : Object.keys(meta);
50
+ if (keys.length === 0) {
51
+ return { xAxis: { type: 'category', data: [] }, yAxis: { type: 'value' }, series: [] };
52
+ }
53
+ const categoryKey = keys[0];
54
+ const valueKeys = keys.slice(1).filter((k) => meta[k]?.type === 'number' || typeof (data[0]?.[k]) === 'number');
55
+ const categories = [...new Set(data.map((r) => String(r[categoryKey] ?? '')))];
56
+ const series = valueKeys.length
57
+ ? valueKeys.map((name) => ({
58
+ name,
59
+ type: 'bar',
60
+ data: data.map((r) => Number(r[name]) || 0),
61
+ }))
62
+ : [{ name: categoryKey, type: 'bar', data: data.map((r) => Number(r[categoryKey]) || 0) }];
63
+ const multiSeries = series.length > 1;
64
+ return {
65
+ grid: { left: 48, right: 24, top: 24, bottom: multiSeries ? 80 : 48 },
66
+ tooltip: { trigger: 'axis' },
67
+ legend: legendConfig(multiSeries),
68
+ xAxis: { type: 'category', data: categories },
69
+ yAxis: { type: 'value' },
70
+ series,
71
+ };
72
+ }
73
+ };
74
+ BarChartWidget = __decorate([
75
+ customElement('analytics-bar-chart')
76
+ ], BarChartWidget);
77
+ export { BarChartWidget };
@@ -0,0 +1,92 @@
1
+ import { LitElement } from 'lit';
2
+ import type { EChartsOption } from 'echarts/types/dist/option';
3
+ import type { WidgetDefinitionSubset } from '../core/fetch-data.js';
4
+ import type { DashboardContainer } from '../dashboard/dashboard-container.js';
5
+ import '../filters/index.js';
6
+ /**
7
+ * Base Lit + ECharts widget. Fetches data from data-url (Laravel analytics API)
8
+ * or uses inline data, then renders Apache ECharts.
9
+ * When dashboard is set, merges dashboard params with dataParams and listens for
10
+ * analytics-dashboard-filter-change and analytics-dashboard-refresh.
11
+ */
12
+ export declare abstract class BaseChartWidget extends LitElement {
13
+ static styles: import("lit").CSSResult;
14
+ /** Optional title override. When unset, the widget uses the title from the API definition. */
15
+ title: string;
16
+ /** API URL to fetch data (e.g. /api/analytics/widgets/1/data). When widgetId + apiUrl are set, this is overridden by buildWidgetDataUrl(apiUrl, widgetId). */
17
+ dataUrl: string;
18
+ /** Widget id (used with apiUrl to build data URL: /widgets/{id}/data). */
19
+ widgetId: string;
20
+ /** API base URL (host + prefix, e.g. /api/analytics). Used with widgetId to build data URL. */
21
+ apiUrl: string;
22
+ /** Query params for data-url (e.g. date_from, date_to). Widget params override dashboard params for same key. */
23
+ dataParams: Record<string, string | number | boolean>;
24
+ /** When set, widget receives dashboard filter/refresh events and merges dashboard params into requests. */
25
+ dashboard: DashboardContainer | null;
26
+ /** Inline data instead of fetching (for designer preview). */
27
+ data: Record<string, unknown>[] | null;
28
+ /** Inline meta (columns) when using inline data. */
29
+ meta: {
30
+ columns: Record<string, {
31
+ type?: string;
32
+ }>;
33
+ };
34
+ /** ECharts option overrides merged on top of buildOption() result. */
35
+ options: Partial<EChartsOption>;
36
+ /** When true, only fetch/render when widget enters viewport; pause refresh when out of viewport. */
37
+ lazy: boolean;
38
+ /** CSS margin around viewport to trigger visibility earlier (e.g. '200px'). Used when lazy is true. */
39
+ prefetchMargin: string;
40
+ /** When set (e.g. by analytics-widget), definition is not fetched again; used to avoid duplicate definition requests. */
41
+ initialDefinition: WidgetDefinitionSubset | undefined;
42
+ private _loading;
43
+ private _error;
44
+ private _loadGeneration;
45
+ private _loadDataScheduled;
46
+ private _ignoreNextFilterChange;
47
+ private _dashboardParams;
48
+ private _widgetFilters;
49
+ private _widgetFilterParams;
50
+ private _hideFilter;
51
+ private _widgetData;
52
+ private _chart;
53
+ private _dashboardEl;
54
+ private _resizeObserver;
55
+ /** Single debounce: each resize cancels previous, then we wait and call chart.resize() once. */
56
+ private _resizeTimeoutId;
57
+ /** Delay (ms) after last resize event before calling chart.resize(). */
58
+ private static readonly _RESIZE_DELAY_MS;
59
+ private _viewportVisible;
60
+ /** Title from widget definition (API). Optional `title` attribute overrides this. */
61
+ private _definitionTitle;
62
+ private _hasLoadedOnce;
63
+ private _viewportUnobserve;
64
+ constructor();
65
+ private _boundOnDashboardFilterChange;
66
+ private _boundOnDashboardRefresh;
67
+ connectedCallback(): void;
68
+ disconnectedCallback(): void;
69
+ updated(changed: Map<string, unknown>): void;
70
+ private _attachDashboard;
71
+ private _detachDashboard;
72
+ firstUpdated(): void;
73
+ private _getEffectiveDataUrl;
74
+ /** Display title: optional host `title` overrides definition title from API. */
75
+ private get _effectiveTitle();
76
+ /** Run a callback after the current update cycle to avoid Lit "change-in-update" warning. */
77
+ private _defer;
78
+ private _getEffectiveParams;
79
+ private _loadData;
80
+ private _renderChart;
81
+ /**
82
+ * Build ECharts option from API data. Override in subclasses (bar, line, pie).
83
+ * When widgetData has categories + series (e.g. from split_by), use those for bar/line.
84
+ * Default: generic grid + empty series.
85
+ */
86
+ buildOption(_data: Record<string, unknown>[], _meta: Record<string, {
87
+ type?: string;
88
+ }>, _widgetData?: unknown): EChartsOption;
89
+ private _onWidgetFilterChange;
90
+ render(): import("lit-html").TemplateResult<1>;
91
+ }
92
+ //# sourceMappingURL=base-chart.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-chart.d.ts","sourceRoot":"","sources":["../../../../libs/analytics/src/widgets/base-chart.ts"],"names":[],"mappings":"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"}