@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/analytics.css
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @quicdata/analytics – default CSS variables
|
|
3
|
+
*
|
|
4
|
+
* Import this file once in your app (e.g. in your root layout or main entry):
|
|
5
|
+
* import '@quicdata/analytics/analytics.css';
|
|
6
|
+
*
|
|
7
|
+
* Override any variable in your own CSS by redefining it on :root or a
|
|
8
|
+
* container that wraps the analytics components.
|
|
9
|
+
*/
|
|
10
|
+
:root {
|
|
11
|
+
/* ----- Filter bar (dashboard & widget toolbar) ----- */
|
|
12
|
+
--analytics-filter-bar-bg: transparent;
|
|
13
|
+
--analytics-filter-bar-border: #e2e8f0;
|
|
14
|
+
--analytics-filter-bar-label-color: #475569;
|
|
15
|
+
--analytics-filter-bar-input-bg: #fff;
|
|
16
|
+
--analytics-filter-bar-input-border: #cbd5e1;
|
|
17
|
+
--analytics-filter-bar-input-color: inherit;
|
|
18
|
+
--analytics-filter-bar-close-color: #64748b;
|
|
19
|
+
--analytics-filter-bar-close-hover-bg: #f1f5f9;
|
|
20
|
+
--analytics-filter-bar-close-hover-color: #334155;
|
|
21
|
+
|
|
22
|
+
/* ----- Report (analytics-report) ----- */
|
|
23
|
+
--analytics-report-border: #e2e8f0;
|
|
24
|
+
--analytics-report-header-bg: #f8fafc;
|
|
25
|
+
--analytics-report-title-color: #1e293b;
|
|
26
|
+
--analytics-report-btn-border: #cbd5e1;
|
|
27
|
+
--analytics-report-btn-bg: #fff;
|
|
28
|
+
--analytics-report-btn-color: #334155;
|
|
29
|
+
--analytics-report-btn-hover-bg: #f1f5f9;
|
|
30
|
+
--analytics-report-btn-hover-color: #0f172a;
|
|
31
|
+
|
|
32
|
+
/* ----- Table widget ----- */
|
|
33
|
+
--table-font-size: 0.875rem;
|
|
34
|
+
--analytics-table-font-size: 0.875rem;
|
|
35
|
+
--analytics-table-border-color: #e5e7eb;
|
|
36
|
+
--analytics-table-header-bg: #f9fafb;
|
|
37
|
+
--analytics-table-header-color: #374151;
|
|
38
|
+
--analytics-table-row-hover-bg: #f9fafb;
|
|
39
|
+
--analytics-table-totals-bg: #f3f4f6;
|
|
40
|
+
--analytics-table-totals-border: #e5e7eb;
|
|
41
|
+
--analytics-table-error-color: #c00;
|
|
42
|
+
--analytics-table-empty-color: #6b7280;
|
|
43
|
+
--analytics-table-placeholder-color: #9ca3af;
|
|
44
|
+
--analytics-table-loading-overlay-bg: rgba(255, 255, 255, 0.65);
|
|
45
|
+
--analytics-table-spinner-border: #e5e7eb;
|
|
46
|
+
--analytics-table-spinner-accent: #3b82f6;
|
|
47
|
+
|
|
48
|
+
/* ----- Charts (base-chart, bar, line, pie) ----- */
|
|
49
|
+
--analytics-chart-title-color: #374151;
|
|
50
|
+
--analytics-chart-error-color: #c00;
|
|
51
|
+
--analytics-chart-loading-overlay-bg: rgba(255, 255, 255, 0.65);
|
|
52
|
+
--analytics-chart-spinner-border: #e5e7eb;
|
|
53
|
+
--analytics-chart-spinner-accent: #3b82f6;
|
|
54
|
+
|
|
55
|
+
/* ----- Widget toolbar (floating filter button + overlay) ----- */
|
|
56
|
+
--analytics-widget-toolbar-z-index: 20;
|
|
57
|
+
--analytics-widget-toolbar-bg: rgba(0, 0, 0, 0.55);
|
|
58
|
+
--analytics-widget-toolbar-border: rgba(255, 255, 255, 0.1);
|
|
59
|
+
--analytics-widget-toolbar-color: rgba(255, 255, 255, 0.9);
|
|
60
|
+
--analytics-widget-toolbar-hover-bg: rgba(255, 255, 255, 0.15);
|
|
61
|
+
--analytics-widget-toolbar-badge-bg: #3b82f6;
|
|
62
|
+
--analytics-widget-toolbar-badge-color: #fff;
|
|
63
|
+
/* Overlay (filter dialog backdrop) */
|
|
64
|
+
--analytics-widget-toolbar-overlay-z-index: 1000;
|
|
65
|
+
--analytics-widget-toolbar-overlay-bg: rgba(0, 0, 0, 0.35);
|
|
66
|
+
--analytics-widget-toolbar-overlay-backdrop-filter: blur(2px);
|
|
67
|
+
/* Dialog (filter panel) */
|
|
68
|
+
--analytics-widget-toolbar-dialog-z-index: 1;
|
|
69
|
+
}
|
package/core/auth.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Analytics API auth: Bearer token for all requests (reports, widgets, datasets).
|
|
3
|
+
* Set once via setAnalyticsApiKey(); every fetch in this package will include it.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Set the API key (Bearer token) for all subsequent analytics API requests.
|
|
7
|
+
* Pass null or '' to clear. Used by report, chart widget, and table widget requests.
|
|
8
|
+
*/
|
|
9
|
+
export declare function setAnalyticsApiKey(key: string | null): void;
|
|
10
|
+
/**
|
|
11
|
+
* Get the current API key (for tests or inspection). Prefer setAnalyticsApiKey for configuration.
|
|
12
|
+
*/
|
|
13
|
+
export declare function getAnalyticsApiKey(): string | null;
|
|
14
|
+
/**
|
|
15
|
+
* Request init options for fetch: credentials and optional Authorization header.
|
|
16
|
+
* Use in all analytics fetch() calls so Bearer token is applied when set.
|
|
17
|
+
*/
|
|
18
|
+
export declare function getAnalyticsRequestInit(init?: RequestInit): RequestInit;
|
|
19
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../../libs/analytics/src/core/auth.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAE3D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,GAAG,IAAI,CAElD;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,WAAW,CAWvE"}
|
package/core/auth.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Analytics API auth: Bearer token for all requests (reports, widgets, datasets).
|
|
3
|
+
* Set once via setAnalyticsApiKey(); every fetch in this package will include it.
|
|
4
|
+
*/
|
|
5
|
+
let apiKey = null;
|
|
6
|
+
/**
|
|
7
|
+
* Set the API key (Bearer token) for all subsequent analytics API requests.
|
|
8
|
+
* Pass null or '' to clear. Used by report, chart widget, and table widget requests.
|
|
9
|
+
*/
|
|
10
|
+
export function setAnalyticsApiKey(key) {
|
|
11
|
+
apiKey = key && String(key).trim() ? String(key).trim() : null;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Get the current API key (for tests or inspection). Prefer setAnalyticsApiKey for configuration.
|
|
15
|
+
*/
|
|
16
|
+
export function getAnalyticsApiKey() {
|
|
17
|
+
return apiKey;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Request init options for fetch: credentials and optional Authorization header.
|
|
21
|
+
* Use in all analytics fetch() calls so Bearer token is applied when set.
|
|
22
|
+
*/
|
|
23
|
+
export function getAnalyticsRequestInit(init) {
|
|
24
|
+
const base = {
|
|
25
|
+
credentials: 'same-origin',
|
|
26
|
+
...init,
|
|
27
|
+
};
|
|
28
|
+
if (apiKey) {
|
|
29
|
+
const headers = new Headers(init?.headers);
|
|
30
|
+
headers.set('Authorization', `Bearer ${apiKey}`);
|
|
31
|
+
return { ...base, headers };
|
|
32
|
+
}
|
|
33
|
+
return base;
|
|
34
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import type { AnalyticsDataResponse, FilterDefinition } from './types.js';
|
|
2
|
+
/** Build widget data URL from API base (host + prefix) and widget id. Path: /widgets/{id}/data */
|
|
3
|
+
export declare function buildWidgetDataUrl(apiUrl: string, widgetId: string | number): string;
|
|
4
|
+
/** Build widget definition URL. Path: /widgets/{id} (no data). */
|
|
5
|
+
export declare function buildWidgetDefinitionUrl(apiUrl: string, widgetId: string | number): string;
|
|
6
|
+
/** Build report definition URL. GET /reports/definitions/{id} */
|
|
7
|
+
export declare function buildReportDefinitionUrl(apiUrl: string, reportId: string | number): string;
|
|
8
|
+
/** Build report filters URL (with optional query params for context). GET /reports/definitions/{id}/filters */
|
|
9
|
+
export declare function buildReportFiltersUrl(apiUrl: string, reportId: string | number, params?: AnalyticsRequestParams): string;
|
|
10
|
+
/** Build report data URL (JSON, same shape as widget/data). GET /reports/definitions/{id}/data */
|
|
11
|
+
export declare function buildReportDataUrl(apiUrl: string, reportId: string | number, params?: AnalyticsRequestParams): string;
|
|
12
|
+
/** Build report preview URL (HTML). GET /reports/definitions/{id}/preview */
|
|
13
|
+
export declare function buildReportPreviewUrl(apiUrl: string, reportId: string | number, params?: AnalyticsRequestParams): string;
|
|
14
|
+
/** Build report PDF download URL. GET /reports/definitions/{id}/pdf */
|
|
15
|
+
export declare function buildReportPdfUrl(apiUrl: string, reportId: string | number, params?: AnalyticsRequestParams): string;
|
|
16
|
+
/** Build report Excel download URL. GET /reports/definitions/{id}/excel */
|
|
17
|
+
export declare function buildReportExcelUrl(apiUrl: string, reportId: string | number, params?: AnalyticsRequestParams): string;
|
|
18
|
+
/** Append query params to a base URL (e.g. from definition preview_url). */
|
|
19
|
+
export declare function appendParamsToUrl(baseUrl: string, params?: Record<string, string | number | boolean>): string;
|
|
20
|
+
/** Report definition API response (GET /reports/definitions/{id}). */
|
|
21
|
+
export interface ReportDefinitionApiResponse {
|
|
22
|
+
id?: number;
|
|
23
|
+
name?: string;
|
|
24
|
+
definition?: Record<string, unknown>;
|
|
25
|
+
/** Resolved filters (with options for presets); use when present instead of definition.filters. */
|
|
26
|
+
resolved_filters?: FilterDefinition[];
|
|
27
|
+
/** URLs from definition model (preview, PDF, Excel). Use these when present. */
|
|
28
|
+
preview_url?: string;
|
|
29
|
+
download_pdf_url?: string;
|
|
30
|
+
download_excel_url?: string;
|
|
31
|
+
data?: {
|
|
32
|
+
id?: number;
|
|
33
|
+
name?: string;
|
|
34
|
+
definition?: Record<string, unknown>;
|
|
35
|
+
resolved_filters?: FilterDefinition[];
|
|
36
|
+
preview_url?: string;
|
|
37
|
+
download_pdf_url?: string;
|
|
38
|
+
download_excel_url?: string;
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/** Result of fetchReportDefinition: name, filters, and optional export URLs from definition. */
|
|
42
|
+
export interface ReportDefinitionResult {
|
|
43
|
+
name: string;
|
|
44
|
+
/** Filter definitions from definition.filters (same shape as FilterDefinition). */
|
|
45
|
+
filters: FilterDefinition[];
|
|
46
|
+
/** When present, use for toolbar links (append current params as query). */
|
|
47
|
+
preview_url?: string;
|
|
48
|
+
download_pdf_url?: string;
|
|
49
|
+
download_excel_url?: string;
|
|
50
|
+
}
|
|
51
|
+
/** Fetch report definition (name, filters) from GET /reports/definitions/{id}. No separate filters API call. */
|
|
52
|
+
export declare function fetchReportDefinition(apiUrl: string, reportId: string | number): Promise<ReportDefinitionResult>;
|
|
53
|
+
/** Fetch resolved report filters (with options) from GET /reports/definitions/{id}/filters. */
|
|
54
|
+
export declare function fetchReportFilters(apiUrl: string, reportId: string | number, params?: AnalyticsRequestParams): Promise<{
|
|
55
|
+
filters: FilterDefinition[];
|
|
56
|
+
}>;
|
|
57
|
+
/** Chart type from API: Bar, BarHorizontal, Line, Pie, Donut, Number, Table. */
|
|
58
|
+
export type WidgetChartType = 'Bar' | 'BarHorizontal' | 'Line' | 'Pie' | 'Donut' | 'Number' | 'Table';
|
|
59
|
+
/** Definition subset passed from analytics-widget to inner chart/table to avoid refetching. */
|
|
60
|
+
export interface WidgetDefinitionSubset {
|
|
61
|
+
title: string;
|
|
62
|
+
filters: FilterDefinition[];
|
|
63
|
+
hide_filter: boolean;
|
|
64
|
+
}
|
|
65
|
+
/** Widget definition response (GET /widgets/{id}): definition.title, definition.chart_type, definition.filters, etc. */
|
|
66
|
+
export interface WidgetDefinitionApiResponse {
|
|
67
|
+
definition?: {
|
|
68
|
+
title?: string;
|
|
69
|
+
chart_type?: string;
|
|
70
|
+
filters?: FilterDefinition[];
|
|
71
|
+
hide_filter?: boolean;
|
|
72
|
+
refresh_rate?: number;
|
|
73
|
+
};
|
|
74
|
+
/** Top-level name when response is not wrapped in data (e.g. from some backends). */
|
|
75
|
+
name?: string;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Fetch widget definition (no data) from Laravel GET /widgets/{id}. Use first so filters (and default_value) are available before fetching data.
|
|
79
|
+
*/
|
|
80
|
+
export declare function fetchWidgetDefinition(apiUrl: string, widgetId: string | number): Promise<{
|
|
81
|
+
title: string;
|
|
82
|
+
chart_type: WidgetChartType;
|
|
83
|
+
filters: FilterDefinition[];
|
|
84
|
+
hide_filter: boolean;
|
|
85
|
+
refresh_rate: number;
|
|
86
|
+
}>;
|
|
87
|
+
/** Params for analytics request. dashboard_params is sent as nested query keys (dashboard_params[key]=value). */
|
|
88
|
+
export type AnalyticsRequestParams = Record<string, string | number | boolean | Record<string, string | number | boolean>>;
|
|
89
|
+
/**
|
|
90
|
+
* Fetch widget/dataset data from Laravel analytics API.
|
|
91
|
+
* @param dataUrl Full URL (e.g. /api/analytics/widgets/1/data) or path; optional params appended.
|
|
92
|
+
* @param params Query params merged into URL. Use dashboard_params key for dashboard-level filters (sent as dashboard_params[key]=value).
|
|
93
|
+
* @returns Parsed { data, meta } from API.
|
|
94
|
+
*/
|
|
95
|
+
export declare function fetchAnalyticsData(dataUrl: string, params?: AnalyticsRequestParams): Promise<AnalyticsDataResponse>;
|
|
96
|
+
/** Full widget/data response shape from Laravel (widgetData, data, meta, filters, refresh_rate, hide_filter). */
|
|
97
|
+
export interface WidgetDataApiResponse {
|
|
98
|
+
data?: Record<string, unknown>[];
|
|
99
|
+
meta?: {
|
|
100
|
+
columns: Record<string, {
|
|
101
|
+
type?: string;
|
|
102
|
+
}>;
|
|
103
|
+
};
|
|
104
|
+
widgetData?: unknown;
|
|
105
|
+
filters?: FilterDefinition[];
|
|
106
|
+
refresh_rate?: number;
|
|
107
|
+
/** When true, widget filter toolbar is hidden and widget filter params are not sent. */
|
|
108
|
+
hide_filter?: boolean;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Fetch widget data from Laravel widget/data endpoint. Returns full response including filters and refresh_rate.
|
|
112
|
+
* Use for widgets that need filter definitions from the API (e.g. per-widget filter bar).
|
|
113
|
+
*/
|
|
114
|
+
export declare function fetchWidgetData(dataUrl: string, params?: AnalyticsRequestParams): Promise<WidgetDataApiResponse>;
|
|
115
|
+
//# sourceMappingURL=fetch-data.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-data.d.ts","sourceRoot":"","sources":["../../../../libs/analytics/src/core/fetch-data.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { getAnalyticsRequestInit } from './auth.js';
|
|
2
|
+
/** Build widget data URL from API base (host + prefix) and widget id. Path: /widgets/{id}/data */
|
|
3
|
+
export function buildWidgetDataUrl(apiUrl, widgetId) {
|
|
4
|
+
const base = (apiUrl || '').replace(/\/$/, '');
|
|
5
|
+
return `${base}/widgets/${widgetId}/data`;
|
|
6
|
+
}
|
|
7
|
+
/** Build widget definition URL. Path: /widgets/{id} (no data). */
|
|
8
|
+
export function buildWidgetDefinitionUrl(apiUrl, widgetId) {
|
|
9
|
+
const base = (apiUrl || '').replace(/\/$/, '');
|
|
10
|
+
return `${base}/widgets/${widgetId}`;
|
|
11
|
+
}
|
|
12
|
+
/** Report definition base path. Path: /reports/definitions/{id} */
|
|
13
|
+
function reportDefinitionBase(apiUrl, reportId) {
|
|
14
|
+
const base = (apiUrl || '').replace(/\/$/, '');
|
|
15
|
+
return `${base}/reports/definitions/${reportId}`;
|
|
16
|
+
}
|
|
17
|
+
/** Build report definition URL. GET /reports/definitions/{id} */
|
|
18
|
+
export function buildReportDefinitionUrl(apiUrl, reportId) {
|
|
19
|
+
return reportDefinitionBase(apiUrl, reportId);
|
|
20
|
+
}
|
|
21
|
+
/** Build report filters URL (with optional query params for context). GET /reports/definitions/{id}/filters */
|
|
22
|
+
export function buildReportFiltersUrl(apiUrl, reportId, params) {
|
|
23
|
+
const url = new URL(reportDefinitionBase(apiUrl, reportId) + '/filters', typeof window !== 'undefined' ? window.location.origin : undefined);
|
|
24
|
+
if (params) {
|
|
25
|
+
const flat = flattenParams(params);
|
|
26
|
+
Object.entries(flat).forEach(([k, v]) => url.searchParams.set(k, v));
|
|
27
|
+
}
|
|
28
|
+
return url.toString();
|
|
29
|
+
}
|
|
30
|
+
/** Build report data URL (JSON, same shape as widget/data). GET /reports/definitions/{id}/data */
|
|
31
|
+
export function buildReportDataUrl(apiUrl, reportId, params) {
|
|
32
|
+
const url = new URL(reportDefinitionBase(apiUrl, reportId) + '/data', typeof window !== 'undefined' ? window.location.origin : undefined);
|
|
33
|
+
if (params) {
|
|
34
|
+
const flat = flattenParams(params);
|
|
35
|
+
Object.entries(flat).forEach(([k, v]) => url.searchParams.set(k, v));
|
|
36
|
+
}
|
|
37
|
+
return url.toString();
|
|
38
|
+
}
|
|
39
|
+
/** Build report preview URL (HTML). GET /reports/definitions/{id}/preview */
|
|
40
|
+
export function buildReportPreviewUrl(apiUrl, reportId, params) {
|
|
41
|
+
const url = new URL(reportDefinitionBase(apiUrl, reportId) + '/preview', typeof window !== 'undefined' ? window.location.origin : undefined);
|
|
42
|
+
if (params) {
|
|
43
|
+
const flat = flattenParams(params);
|
|
44
|
+
Object.entries(flat).forEach(([k, v]) => url.searchParams.set(k, v));
|
|
45
|
+
}
|
|
46
|
+
return url.toString();
|
|
47
|
+
}
|
|
48
|
+
/** Build report PDF download URL. GET /reports/definitions/{id}/pdf */
|
|
49
|
+
export function buildReportPdfUrl(apiUrl, reportId, params) {
|
|
50
|
+
const url = new URL(reportDefinitionBase(apiUrl, reportId) + '/pdf', typeof window !== 'undefined' ? window.location.origin : undefined);
|
|
51
|
+
if (params) {
|
|
52
|
+
const flat = flattenParams(params);
|
|
53
|
+
Object.entries(flat).forEach(([k, v]) => url.searchParams.set(k, v));
|
|
54
|
+
}
|
|
55
|
+
return url.toString();
|
|
56
|
+
}
|
|
57
|
+
/** Build report Excel download URL. GET /reports/definitions/{id}/excel */
|
|
58
|
+
export function buildReportExcelUrl(apiUrl, reportId, params) {
|
|
59
|
+
const url = new URL(reportDefinitionBase(apiUrl, reportId) + '/excel', typeof window !== 'undefined' ? window.location.origin : undefined);
|
|
60
|
+
if (params) {
|
|
61
|
+
const flat = flattenParams(params);
|
|
62
|
+
Object.entries(flat).forEach(([k, v]) => url.searchParams.set(k, v));
|
|
63
|
+
}
|
|
64
|
+
return url.toString();
|
|
65
|
+
}
|
|
66
|
+
/** Append query params to a base URL (e.g. from definition preview_url). */
|
|
67
|
+
export function appendParamsToUrl(baseUrl, params) {
|
|
68
|
+
if (!params || Object.keys(params).length === 0)
|
|
69
|
+
return baseUrl;
|
|
70
|
+
try {
|
|
71
|
+
const url = new URL(baseUrl, typeof window !== 'undefined' ? window.location.origin : undefined);
|
|
72
|
+
const flat = flattenParams(params);
|
|
73
|
+
Object.entries(flat).forEach(([k, v]) => url.searchParams.set(k, String(v)));
|
|
74
|
+
return url.toString();
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
const sep = baseUrl.includes('?') ? '&' : '?';
|
|
78
|
+
const qs = new URLSearchParams(Object.entries(flattenParams(params))).toString();
|
|
79
|
+
return qs ? `${baseUrl}${sep}${qs}` : baseUrl;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/** Fetch report definition (name, filters) from GET /reports/definitions/{id}. No separate filters API call. */
|
|
83
|
+
export async function fetchReportDefinition(apiUrl, reportId) {
|
|
84
|
+
const url = buildReportDefinitionUrl(apiUrl, reportId);
|
|
85
|
+
const res = await fetch(url, getAnalyticsRequestInit());
|
|
86
|
+
if (!res.ok) {
|
|
87
|
+
throw new Error(`Report definition failed: ${res.status} ${res.statusText}`);
|
|
88
|
+
}
|
|
89
|
+
const json = (await res.json());
|
|
90
|
+
const data = json.data ?? json;
|
|
91
|
+
const name = (data && typeof data === 'object' && 'name' in data && data.name != null)
|
|
92
|
+
? String(data.name)
|
|
93
|
+
: (json.name != null ? String(json.name) : '');
|
|
94
|
+
const def = (data && typeof data === 'object' && 'definition' in data && data.definition) ?? json.definition;
|
|
95
|
+
const rawDef = def && typeof def === 'object' ? def : null;
|
|
96
|
+
const rawFiltersArr = rawDef && Array.isArray(rawDef.filters) ? rawDef.filters : [];
|
|
97
|
+
const resolved = (data && typeof data === 'object' && 'resolved_filters' in data && data.resolved_filters)
|
|
98
|
+
?? json.resolved_filters;
|
|
99
|
+
const filters = (Array.isArray(resolved) ? resolved : rawFiltersArr);
|
|
100
|
+
const previewUrl = (data && typeof data === 'object' && 'preview_url' in data && data.preview_url) ?? json.preview_url;
|
|
101
|
+
const downloadPdfUrl = (data && typeof data === 'object' && 'download_pdf_url' in data && data.download_pdf_url) ?? json.download_pdf_url;
|
|
102
|
+
const downloadExcelUrl = (data && typeof data === 'object' && 'download_excel_url' in data && data.download_excel_url) ?? json.download_excel_url;
|
|
103
|
+
return {
|
|
104
|
+
name,
|
|
105
|
+
filters,
|
|
106
|
+
...(typeof previewUrl === 'string' && previewUrl && { preview_url: previewUrl }),
|
|
107
|
+
...(typeof downloadPdfUrl === 'string' && downloadPdfUrl && { download_pdf_url: downloadPdfUrl }),
|
|
108
|
+
...(typeof downloadExcelUrl === 'string' && downloadExcelUrl && { download_excel_url: downloadExcelUrl }),
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
/** Fetch resolved report filters (with options) from GET /reports/definitions/{id}/filters. */
|
|
112
|
+
export async function fetchReportFilters(apiUrl, reportId, params) {
|
|
113
|
+
const url = buildReportFiltersUrl(apiUrl, reportId, params);
|
|
114
|
+
const res = await fetch(url, getAnalyticsRequestInit());
|
|
115
|
+
if (!res.ok) {
|
|
116
|
+
throw new Error(`Report filters failed: ${res.status} ${res.statusText}`);
|
|
117
|
+
}
|
|
118
|
+
const json = (await res.json());
|
|
119
|
+
return { filters: json.filters ?? [] };
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Fetch widget definition (no data) from Laravel GET /widgets/{id}. Use first so filters (and default_value) are available before fetching data.
|
|
123
|
+
*/
|
|
124
|
+
export async function fetchWidgetDefinition(apiUrl, widgetId) {
|
|
125
|
+
const url = buildWidgetDefinitionUrl(apiUrl, widgetId);
|
|
126
|
+
const res = await fetch(url.toString(), getAnalyticsRequestInit());
|
|
127
|
+
if (!res.ok) {
|
|
128
|
+
throw new Error(`Widget definition failed: ${res.status} ${res.statusText}`);
|
|
129
|
+
}
|
|
130
|
+
const json = (await res.json());
|
|
131
|
+
const def = json.definition ?? json.data?.definition ?? {};
|
|
132
|
+
const title = (def.title != null && def.title !== '')
|
|
133
|
+
? String(def.title)
|
|
134
|
+
: (json.data?.name != null ? String(json.data.name) : json.name != null ? String(json.name) : '');
|
|
135
|
+
const rawChartType = def.chart_type ?? '';
|
|
136
|
+
const chart_type = ['Bar', 'BarHorizontal', 'Line', 'Pie', 'Donut', 'Number', 'Table'].includes(rawChartType)
|
|
137
|
+
? rawChartType
|
|
138
|
+
: 'Table';
|
|
139
|
+
return {
|
|
140
|
+
title: title ?? '',
|
|
141
|
+
chart_type,
|
|
142
|
+
filters: def.filters ?? [],
|
|
143
|
+
hide_filter: def.hide_filter ?? false,
|
|
144
|
+
refresh_rate: def.refresh_rate ?? 0,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
function flattenParams(params) {
|
|
148
|
+
const out = {};
|
|
149
|
+
for (const [k, v] of Object.entries(params)) {
|
|
150
|
+
if (v === undefined || v === null || v === '')
|
|
151
|
+
continue;
|
|
152
|
+
if (k === 'dashboard_params' && typeof v === 'object' && v !== null && !Array.isArray(v)) {
|
|
153
|
+
for (const [dk, dv] of Object.entries(v)) {
|
|
154
|
+
if (dv !== undefined && dv !== null && dv !== '') {
|
|
155
|
+
out[`dashboard_params[${dk}]`] = String(dv);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
out[k] = String(v);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return out;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Fetch widget/dataset data from Laravel analytics API.
|
|
167
|
+
* @param dataUrl Full URL (e.g. /api/analytics/widgets/1/data) or path; optional params appended.
|
|
168
|
+
* @param params Query params merged into URL. Use dashboard_params key for dashboard-level filters (sent as dashboard_params[key]=value).
|
|
169
|
+
* @returns Parsed { data, meta } from API.
|
|
170
|
+
*/
|
|
171
|
+
export async function fetchAnalyticsData(dataUrl, params) {
|
|
172
|
+
const url = new URL(dataUrl, typeof window !== 'undefined' ? window.location.origin : undefined);
|
|
173
|
+
if (params) {
|
|
174
|
+
const flat = flattenParams(params);
|
|
175
|
+
Object.entries(flat).forEach(([k, v]) => url.searchParams.set(k, v));
|
|
176
|
+
}
|
|
177
|
+
const res = await fetch(url.toString(), getAnalyticsRequestInit());
|
|
178
|
+
if (!res.ok) {
|
|
179
|
+
throw new Error(`Analytics data failed: ${res.status} ${res.statusText}`);
|
|
180
|
+
}
|
|
181
|
+
const json = (await res.json());
|
|
182
|
+
return {
|
|
183
|
+
data: json.data ?? [],
|
|
184
|
+
meta: json.meta ?? { columns: {} },
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Fetch widget data from Laravel widget/data endpoint. Returns full response including filters and refresh_rate.
|
|
189
|
+
* Use for widgets that need filter definitions from the API (e.g. per-widget filter bar).
|
|
190
|
+
*/
|
|
191
|
+
export async function fetchWidgetData(dataUrl, params) {
|
|
192
|
+
const url = new URL(dataUrl, typeof window !== 'undefined' ? window.location.origin : undefined);
|
|
193
|
+
if (params) {
|
|
194
|
+
const flat = flattenParams(params);
|
|
195
|
+
Object.entries(flat).forEach(([k, v]) => url.searchParams.set(k, v));
|
|
196
|
+
}
|
|
197
|
+
const res = await fetch(url.toString(), getAnalyticsRequestInit());
|
|
198
|
+
if (!res.ok) {
|
|
199
|
+
throw new Error(`Widget data failed: ${res.status} ${res.statusText}`);
|
|
200
|
+
}
|
|
201
|
+
const json = (await res.json());
|
|
202
|
+
return {
|
|
203
|
+
data: json.data ?? [],
|
|
204
|
+
meta: json.meta ?? { columns: {} },
|
|
205
|
+
widgetData: json.widgetData,
|
|
206
|
+
filters: json.filters ?? [],
|
|
207
|
+
refresh_rate: json.refresh_rate,
|
|
208
|
+
hide_filter: json.hide_filter ?? false,
|
|
209
|
+
};
|
|
210
|
+
}
|
package/core/index.d.ts
CHANGED
|
@@ -1,2 +1,9 @@
|
|
|
1
|
-
export
|
|
1
|
+
export { setAnalyticsApiKey, getAnalyticsApiKey, getAnalyticsRequestInit } from './auth.js';
|
|
2
|
+
export { buildWidgetDataUrl, buildWidgetDefinitionUrl, fetchAnalyticsData, fetchWidgetData, fetchWidgetDefinition, buildReportDefinitionUrl, buildReportFiltersUrl, buildReportPreviewUrl, buildReportPdfUrl, buildReportExcelUrl, fetchReportDefinition, fetchReportFilters, } from './fetch-data.js';
|
|
3
|
+
export type { AnalyticsRequestParams, WidgetDataApiResponse, WidgetChartType, WidgetDefinitionApiResponse, WidgetDefinitionSubset, ReportDefinitionApiResponse, ReportDefinitionResult, } from './fetch-data.js';
|
|
4
|
+
export type { AnalyticsDataResponse, AnalyticsDataMeta, WidgetDataResponse, WidgetDataOptions, DatetimeGranularity, DimensionRef, MeasureRef, FilterItem, FilterDefinition, FilterOption, CommonChartConfig, BarChartConfig, LineChartConfig, DonutPieChartConfig, NumberKpiChartConfig, TableChartConfig, ChartType, WidgetDefinitionConfig, LazyWidgetOptions, WorkerWidgetOptions, } from './types.js';
|
|
5
|
+
export { observeViewport } from './viewport-observer.js';
|
|
6
|
+
export type { ViewportObserverOptions, ViewportObserverCallbacks } from './viewport-observer.js';
|
|
7
|
+
export { runWidgetTransform } from './widget-transform-runner.js';
|
|
8
|
+
export type { WidgetTransformInput, WidgetTransformOptions } from './widget-transform-runner.js';
|
|
2
9
|
//# sourceMappingURL=index.d.ts.map
|
package/core/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../libs/analytics/src/core/index.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../libs/analytics/src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AAC5F,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,kBAAkB,EAClB,eAAe,EACf,qBAAqB,EACrB,wBAAwB,EACxB,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,sBAAsB,EACtB,qBAAqB,EACrB,eAAe,EACf,2BAA2B,EAC3B,sBAAsB,EACtB,2BAA2B,EAC3B,sBAAsB,GACvB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,YAAY,EACZ,UAAU,EACV,UAAU,EACV,gBAAgB,EAChB,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACpB,gBAAgB,EAChB,SAAS,EACT,sBAAsB,EACtB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,YAAY,EAAE,uBAAuB,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACjG,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,YAAY,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC"}
|
package/core/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
export
|
|
2
|
-
|
|
3
|
-
}
|
|
1
|
+
export { setAnalyticsApiKey, getAnalyticsApiKey, getAnalyticsRequestInit } from './auth.js';
|
|
2
|
+
export { buildWidgetDataUrl, buildWidgetDefinitionUrl, fetchAnalyticsData, fetchWidgetData, fetchWidgetDefinition, buildReportDefinitionUrl, buildReportFiltersUrl, buildReportPreviewUrl, buildReportPdfUrl, buildReportExcelUrl, fetchReportDefinition, fetchReportFilters, } from './fetch-data.js';
|
|
3
|
+
export { observeViewport } from './viewport-observer.js';
|
|
4
|
+
export { runWidgetTransform } from './widget-transform-runner.js';
|