@quicdata/analytics 0.0.11 → 0.0.13
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/core/auth.d.ts +35 -11
- package/core/auth.d.ts.map +1 -1
- package/core/auth.js +48 -20
- package/core/fetch-data.d.ts +2 -0
- package/core/fetch-data.d.ts.map +1 -1
- package/core/fetch-data.js +1 -0
- package/core/index.d.ts +2 -1
- package/core/index.d.ts.map +1 -1
- package/core/index.js +1 -1
- package/core/types.d.ts +1 -0
- package/core/types.d.ts.map +1 -1
- package/dashboard/dashboard-container.d.ts +0 -1
- package/dashboard/dashboard-container.d.ts.map +1 -1
- package/dashboard/dashboard-container.js +0 -1
- package/index.d.ts +2 -2
- package/index.js +1 -1
- package/package.json +1 -1
- package/widgets/bar-chart.d.ts.map +1 -1
- package/widgets/bar-chart.js +10 -1
- package/widgets/base-chart.d.ts +12 -0
- package/widgets/base-chart.d.ts.map +1 -1
- package/widgets/base-chart.js +60 -22
- package/widgets/line-chart.d.ts.map +1 -1
- package/widgets/line-chart.js +1 -0
- package/widgets/number-kpi.d.ts +7 -1
- package/widgets/number-kpi.d.ts.map +1 -1
- package/widgets/number-kpi.js +102 -25
- package/widgets/pie-chart.d.ts.map +1 -1
- package/widgets/pie-chart.js +15 -5
package/core/auth.d.ts
CHANGED
|
@@ -1,19 +1,43 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Analytics API
|
|
3
|
-
*
|
|
2
|
+
* Analytics API request configuration.
|
|
3
|
+
*
|
|
4
|
+
* Supports two header source types:
|
|
5
|
+
* - Static: fixed value set at config time (e.g. Bearer token)
|
|
6
|
+
* - localStorage: value read from localStorage on each request (e.g. org ID)
|
|
4
7
|
*/
|
|
8
|
+
export interface AnalyticsHeaderSource {
|
|
9
|
+
/** Header name (e.g. 'Authorization', 'X-Organization-Id') */
|
|
10
|
+
header: string;
|
|
11
|
+
/** Fixed value — sent as-is on every request */
|
|
12
|
+
value?: string;
|
|
13
|
+
/** localStorage key — read on each request, header omitted if key is absent */
|
|
14
|
+
localStorageKey?: string;
|
|
15
|
+
}
|
|
5
16
|
/**
|
|
6
|
-
*
|
|
7
|
-
*
|
|
17
|
+
* Configure custom headers for all analytics API requests.
|
|
18
|
+
* Replaces any previously configured headers.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* // Bearer token (static)
|
|
22
|
+
* setAnalyticsHeaders([
|
|
23
|
+
* { header: 'Authorization', value: 'Bearer xxx' },
|
|
24
|
+
* ]);
|
|
25
|
+
*
|
|
26
|
+
* // Org ID from localStorage (dynamic)
|
|
27
|
+
* setAnalyticsHeaders([
|
|
28
|
+
* { header: 'X-Organization-Id', localStorageKey: 'current_org_id' },
|
|
29
|
+
* ]);
|
|
30
|
+
*
|
|
31
|
+
* // Both
|
|
32
|
+
* setAnalyticsHeaders([
|
|
33
|
+
* { header: 'Authorization', value: 'Bearer xxx' },
|
|
34
|
+
* { header: 'X-Organization-Id', localStorageKey: 'current_org_id' },
|
|
35
|
+
* ]);
|
|
8
36
|
*/
|
|
9
|
-
export declare function
|
|
37
|
+
export declare function setAnalyticsHeaders(sources: AnalyticsHeaderSource[]): void;
|
|
10
38
|
/**
|
|
11
|
-
*
|
|
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.
|
|
39
|
+
* Request init options for fetch: credentials + configured headers.
|
|
40
|
+
* Use in all analytics fetch() calls.
|
|
17
41
|
*/
|
|
18
42
|
export declare function getAnalyticsRequestInit(init?: RequestInit): RequestInit;
|
|
19
43
|
//# sourceMappingURL=auth.d.ts.map
|
package/core/auth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../../libs/analytics/src/core/auth.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../../libs/analytics/src/core/auth.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,qBAAqB;IACpC,8DAA8D;IAC9D,MAAM,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+EAA+E;IAC/E,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAID;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,qBAAqB,EAAE,GAAG,IAAI,CAG1E;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,WAAW,CA2BvE"}
|
package/core/auth.js
CHANGED
|
@@ -1,34 +1,62 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Analytics API
|
|
3
|
-
*
|
|
2
|
+
* Analytics API request configuration.
|
|
3
|
+
*
|
|
4
|
+
* Supports two header source types:
|
|
5
|
+
* - Static: fixed value set at config time (e.g. Bearer token)
|
|
6
|
+
* - localStorage: value read from localStorage on each request (e.g. org ID)
|
|
4
7
|
*/
|
|
5
|
-
|
|
8
|
+
const headerSources = [];
|
|
6
9
|
/**
|
|
7
|
-
*
|
|
8
|
-
*
|
|
10
|
+
* Configure custom headers for all analytics API requests.
|
|
11
|
+
* Replaces any previously configured headers.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* // Bearer token (static)
|
|
15
|
+
* setAnalyticsHeaders([
|
|
16
|
+
* { header: 'Authorization', value: 'Bearer xxx' },
|
|
17
|
+
* ]);
|
|
18
|
+
*
|
|
19
|
+
* // Org ID from localStorage (dynamic)
|
|
20
|
+
* setAnalyticsHeaders([
|
|
21
|
+
* { header: 'X-Organization-Id', localStorageKey: 'current_org_id' },
|
|
22
|
+
* ]);
|
|
23
|
+
*
|
|
24
|
+
* // Both
|
|
25
|
+
* setAnalyticsHeaders([
|
|
26
|
+
* { header: 'Authorization', value: 'Bearer xxx' },
|
|
27
|
+
* { header: 'X-Organization-Id', localStorageKey: 'current_org_id' },
|
|
28
|
+
* ]);
|
|
9
29
|
*/
|
|
10
|
-
export function
|
|
11
|
-
|
|
30
|
+
export function setAnalyticsHeaders(sources) {
|
|
31
|
+
headerSources.length = 0;
|
|
32
|
+
headerSources.push(...sources);
|
|
12
33
|
}
|
|
13
34
|
/**
|
|
14
|
-
*
|
|
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.
|
|
35
|
+
* Request init options for fetch: credentials + configured headers.
|
|
36
|
+
* Use in all analytics fetch() calls.
|
|
22
37
|
*/
|
|
23
38
|
export function getAnalyticsRequestInit(init) {
|
|
24
39
|
const base = {
|
|
25
40
|
credentials: 'same-origin',
|
|
26
41
|
...init,
|
|
27
42
|
};
|
|
28
|
-
if (
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
43
|
+
if (headerSources.length === 0) {
|
|
44
|
+
return base;
|
|
45
|
+
}
|
|
46
|
+
const headers = new Headers(init?.headers);
|
|
47
|
+
let added = false;
|
|
48
|
+
for (const src of headerSources) {
|
|
49
|
+
if (src.value) {
|
|
50
|
+
headers.set(src.header, src.value);
|
|
51
|
+
added = true;
|
|
52
|
+
}
|
|
53
|
+
else if (src.localStorageKey && typeof localStorage !== 'undefined') {
|
|
54
|
+
const val = localStorage.getItem(src.localStorageKey);
|
|
55
|
+
if (val) {
|
|
56
|
+
headers.set(src.header, val);
|
|
57
|
+
added = true;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
32
60
|
}
|
|
33
|
-
return base;
|
|
61
|
+
return added ? { ...base, headers } : base;
|
|
34
62
|
}
|
package/core/fetch-data.d.ts
CHANGED
|
@@ -108,6 +108,8 @@ export interface WidgetDataApiResponse {
|
|
|
108
108
|
refresh_rate?: number;
|
|
109
109
|
/** When true, widget filter toolbar is hidden and widget filter params are not sent. */
|
|
110
110
|
hide_filter?: boolean;
|
|
111
|
+
/** ECharts option overrides from widget definition (merged on top of buildOption result). */
|
|
112
|
+
options?: Record<string, unknown>;
|
|
111
113
|
}
|
|
112
114
|
/**
|
|
113
115
|
* Fetch widget data from Laravel widget/data endpoint. Returns full response including filters and refresh_rate.
|
package/core/fetch-data.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-data.d.ts","sourceRoot":"","sources":["../../../../libs/analytics/src/core/fetch-data.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"fetch-data.d.ts","sourceRoot":"","sources":["../../../../libs/analytics/src/core/fetch-data.ts"],"names":[],"mappings":"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"}
|
package/core/fetch-data.js
CHANGED
package/core/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { setAnalyticsHeaders, getAnalyticsRequestInit } from './auth.js';
|
|
2
|
+
export type { AnalyticsHeaderSource } from './auth.js';
|
|
2
3
|
export { buildWidgetDataUrl, buildWidgetDefinitionUrl, buildDatasetDataUrl, fetchAnalyticsData, fetchWidgetData, fetchWidgetDefinition, buildReportDefinitionUrl, buildReportFiltersUrl, buildReportPreviewUrl, buildReportPdfUrl, buildReportExcelUrl, fetchReportDefinition, fetchReportFilters, } from './fetch-data.js';
|
|
3
4
|
export type { AnalyticsRequestParams, WidgetDataApiResponse, WidgetChartType, WidgetDefinitionApiResponse, WidgetDefinitionSubset, ReportDefinitionApiResponse, ReportDefinitionResult, } from './fetch-data.js';
|
|
4
5
|
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';
|
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,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../libs/analytics/src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AACzE,YAAY,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,mBAAmB,EACnB,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;AACjG,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,kBAAkB,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACnG,YAAY,EACV,MAAM,EACN,gBAAgB,EAChB,gBAAgB,EAChB,wBAAwB,EACxB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,WAAW,CAAC"}
|
package/core/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { setAnalyticsHeaders, getAnalyticsRequestInit } from './auth.js';
|
|
2
2
|
export { buildWidgetDataUrl, buildWidgetDefinitionUrl, buildDatasetDataUrl, fetchAnalyticsData, fetchWidgetData, fetchWidgetDefinition, buildReportDefinitionUrl, buildReportFiltersUrl, buildReportPreviewUrl, buildReportPdfUrl, buildReportExcelUrl, fetchReportDefinition, fetchReportFilters, } from './fetch-data.js';
|
|
3
3
|
export { observeViewport } from './viewport-observer.js';
|
|
4
4
|
export { runWidgetTransform } from './widget-transform-runner.js';
|
package/core/types.d.ts
CHANGED
|
@@ -180,6 +180,7 @@ export interface NumberKpiWidgetData {
|
|
|
180
180
|
prefix?: string;
|
|
181
181
|
suffix?: string;
|
|
182
182
|
}>;
|
|
183
|
+
shorten_numbers?: boolean;
|
|
183
184
|
}
|
|
184
185
|
/** Single header cell: key maps to data column; missing key = presentational only. */
|
|
185
186
|
export interface TableHeaderCell {
|
package/core/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../libs/analytics/src/core/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../libs/analytics/src/core/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { LitElement } from 'lit';
|
|
2
2
|
import type { FilterDefinition } from '../core/types.js';
|
|
3
3
|
import '../filters/index.js';
|
|
4
|
-
import 'gridstack/dist/gridstack.min.css';
|
|
5
4
|
export interface DashboardSlot {
|
|
6
5
|
/** Widget type: analytics-bar-chart, analytics-line-chart, analytics-pie-chart, analytics-table, etc. */
|
|
7
6
|
type: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard-container.d.ts","sourceRoot":"","sources":["../../../../libs/analytics/src/dashboard/dashboard-container.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAG5C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"dashboard-container.d.ts","sourceRoot":"","sources":["../../../../libs/analytics/src/dashboard/dashboard-container.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,6 @@ import { LitElement, html, css } from 'lit';
|
|
|
3
3
|
import { customElement, property, state } from 'lit/decorators.js';
|
|
4
4
|
import { GridStack } from 'gridstack';
|
|
5
5
|
import '../filters/index.js';
|
|
6
|
-
import 'gridstack/dist/gridstack.min.css';
|
|
7
6
|
/** Normalized layout: children always array (possibly empty), slots always array. */
|
|
8
7
|
function getLayoutChildren(layout) {
|
|
9
8
|
return layout.children ?? [];
|
package/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export type { AnalyticsDataResponse, AnalyticsDataMeta, AnalyticsRequestParams, WidgetDataResponse, WidgetDataApiResponse, WidgetDataOptions, DatetimeGranularity, DimensionRef, MeasureRef, FilterDefinition, FilterOption, BarChartConfig, LineChartConfig, DonutPieChartConfig, NumberKpiChartConfig, TableChartConfig, ChartType, WidgetDefinitionConfig, } from './core/index.js';
|
|
1
|
+
export { setAnalyticsHeaders, buildWidgetDataUrl, fetchAnalyticsData, fetchWidgetData, } from './core/index.js';
|
|
2
|
+
export type { AnalyticsHeaderSource, AnalyticsDataResponse, AnalyticsDataMeta, AnalyticsRequestParams, WidgetDataResponse, WidgetDataApiResponse, WidgetDataOptions, DatetimeGranularity, DimensionRef, MeasureRef, FilterDefinition, FilterOption, BarChartConfig, LineChartConfig, DonutPieChartConfig, NumberKpiChartConfig, TableChartConfig, ChartType, WidgetDefinitionConfig, } from './core/index.js';
|
|
3
3
|
export { BaseChartWidget, BarChartWidget, LineChartWidget, PieChartWidget, TableWidget, AnalyticsWidget, AnalyticsReport, } from './widgets/index.js';
|
|
4
4
|
export { DashboardContainer, EVENT_DASHBOARD_FILTER_CHANGE, EVENT_DASHBOARD_REFRESH, EVENT_DASHBOARD_LAYOUT_CHANGE, } from './dashboard/index.js';
|
|
5
5
|
export type { DashboardLayout, DashboardSlot, GridsterGridItem } from './dashboard/index.js';
|
package/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { setAnalyticsHeaders, buildWidgetDataUrl, fetchAnalyticsData, fetchWidgetData, } from './core/index.js';
|
|
2
2
|
export { BaseChartWidget, BarChartWidget, LineChartWidget, PieChartWidget, TableWidget, AnalyticsWidget, AnalyticsReport, } from './widgets/index.js';
|
|
3
3
|
export { DashboardContainer, EVENT_DASHBOARD_FILTER_CHANGE, EVENT_DASHBOARD_REFRESH, EVENT_DASHBOARD_LAYOUT_CHANGE, } from './dashboard/index.js';
|
|
4
4
|
export { AnalyticsFilterBar, AnalyticsFilterButton, AnalyticsWidgetToolbar } from './filters/index.js';
|
package/package.json
CHANGED
|
@@ -1 +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;
|
|
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;AAwBlD;;;;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;CA+DjB"}
|
package/widgets/bar-chart.js
CHANGED
|
@@ -27,7 +27,15 @@ let BarChartWidget = class BarChartWidget extends BaseChartWidget {
|
|
|
27
27
|
const series = seriesList.map((s) => ({
|
|
28
28
|
name: String(s?.name ?? ''),
|
|
29
29
|
type: 'bar',
|
|
30
|
-
data: Array.isArray(s?.data)
|
|
30
|
+
data: Array.isArray(s?.data)
|
|
31
|
+
? s.data.map((v) => {
|
|
32
|
+
if (typeof v === 'object' && v !== null && 'value' in v) {
|
|
33
|
+
const obj = v;
|
|
34
|
+
return { ...obj, value: Number(obj.value) || 0 };
|
|
35
|
+
}
|
|
36
|
+
return Number(v) || 0;
|
|
37
|
+
})
|
|
38
|
+
: [],
|
|
31
39
|
stack: wd.stack ? 'total' : undefined,
|
|
32
40
|
}));
|
|
33
41
|
const multiSeries = series.length > 1;
|
|
@@ -44,6 +52,7 @@ let BarChartWidget = class BarChartWidget extends BaseChartWidget {
|
|
|
44
52
|
xAxis: isHorizontal ? { type: 'value' } : { type: 'category', data: categories },
|
|
45
53
|
yAxis: isHorizontal ? { type: 'category', data: categories } : { type: 'value' },
|
|
46
54
|
series,
|
|
55
|
+
...(wd.colors?.length ? { color: wd.colors } : {}),
|
|
47
56
|
};
|
|
48
57
|
}
|
|
49
58
|
const keys = data.length ? Object.keys(data[0]) : Object.keys(meta);
|
package/widgets/base-chart.d.ts
CHANGED
|
@@ -50,11 +50,15 @@ export declare abstract class BaseChartWidget extends LitElement {
|
|
|
50
50
|
private _widgetFilterParams;
|
|
51
51
|
private _hideFilter;
|
|
52
52
|
private _widgetData;
|
|
53
|
+
/** ECharts options from API response (widget definition options). */
|
|
54
|
+
private _apiOptions;
|
|
53
55
|
private _chart;
|
|
54
56
|
private _dashboardEl;
|
|
55
57
|
private _resizeObserver;
|
|
56
58
|
/** Single debounce: each resize cancels previous, then we wait and call chart.resize() once. */
|
|
57
59
|
private _resizeTimeoutId;
|
|
60
|
+
/** Bound window resize handler (fallback for shadow DOM nesting). */
|
|
61
|
+
private _boundWindowResize;
|
|
58
62
|
/** Delay (ms) after last resize event before calling chart.resize(). */
|
|
59
63
|
private static readonly _RESIZE_DELAY_MS;
|
|
60
64
|
private _viewportVisible;
|
|
@@ -70,6 +74,8 @@ export declare abstract class BaseChartWidget extends LitElement {
|
|
|
70
74
|
updated(changed: Map<string, unknown>): void;
|
|
71
75
|
private _attachDashboard;
|
|
72
76
|
private _detachDashboard;
|
|
77
|
+
/** Shared debounce logic for resize events (ResizeObserver + window resize). */
|
|
78
|
+
private _scheduleResize;
|
|
73
79
|
firstUpdated(): void;
|
|
74
80
|
private _getEffectiveDataUrl;
|
|
75
81
|
/** Display title: optional host `title` overrides definition title from API. */
|
|
@@ -79,6 +85,12 @@ export declare abstract class BaseChartWidget extends LitElement {
|
|
|
79
85
|
private _getEffectiveParams;
|
|
80
86
|
private _loadData;
|
|
81
87
|
private _renderChart;
|
|
88
|
+
/**
|
|
89
|
+
* Deep merge plain objects. Arrays and non-object values are replaced, not merged.
|
|
90
|
+
* Allows widget definition options like { yAxis: { inverse: true } } to extend
|
|
91
|
+
* the base chart option without overwriting existing keys (type, data, etc.).
|
|
92
|
+
*/
|
|
93
|
+
private _deepMerge;
|
|
82
94
|
/**
|
|
83
95
|
* Build ECharts option from API data. Override in subclasses (bar, line, pie).
|
|
84
96
|
* When widgetData has categories + series (e.g. from split_by), use those for bar/line.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-chart.d.ts","sourceRoot":"","sources":["../../../../libs/analytics/src/widgets/base-chart.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAsB,MAAM,KAAK,CAAC;AAErD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAG/D,OAAO,KAAK,EAA0B,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAO5F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAM9E,OAAO,qBAAqB,CAAC;AAE7B;;;;;GAKG;AACH,8BAAsB,eAAgB,SAAQ,UAAU;IACtD,OAAgB,MAAM,
|
|
1
|
+
{"version":3,"file":"base-chart.d.ts","sourceRoot":"","sources":["../../../../libs/analytics/src/widgets/base-chart.ts"],"names":[],"mappings":"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"}
|
package/widgets/base-chart.js
CHANGED
|
@@ -23,8 +23,8 @@ export class BaseChartWidget extends LitElement {
|
|
|
23
23
|
}
|
|
24
24
|
.chart {
|
|
25
25
|
width: 100%;
|
|
26
|
-
|
|
27
|
-
min-height:
|
|
26
|
+
flex: 1;
|
|
27
|
+
min-height: 0;
|
|
28
28
|
}
|
|
29
29
|
.error {
|
|
30
30
|
color: #c00;
|
|
@@ -225,10 +225,12 @@ export class BaseChartWidget extends LitElement {
|
|
|
225
225
|
min-height: 0;
|
|
226
226
|
position: relative;
|
|
227
227
|
box-sizing: border-box;
|
|
228
|
+
display: flex;
|
|
229
|
+
flex-direction: column;
|
|
228
230
|
}
|
|
229
231
|
.widget-body .chart {
|
|
230
|
-
|
|
231
|
-
min-height:
|
|
232
|
+
flex: 1;
|
|
233
|
+
min-height: 0;
|
|
232
234
|
}
|
|
233
235
|
.btn-refresh {
|
|
234
236
|
flex-shrink: 0;
|
|
@@ -265,11 +267,15 @@ export class BaseChartWidget extends LitElement {
|
|
|
265
267
|
this._loadGeneration = 0;
|
|
266
268
|
this._loadDataScheduled = false;
|
|
267
269
|
this._ignoreNextFilterChange = false;
|
|
270
|
+
/** ECharts options from API response (widget definition options). */
|
|
271
|
+
this._apiOptions = {};
|
|
268
272
|
this._chart = null;
|
|
269
273
|
this._dashboardEl = null;
|
|
270
274
|
this._resizeObserver = null;
|
|
271
275
|
/** Single debounce: each resize cancels previous, then we wait and call chart.resize() once. */
|
|
272
276
|
this._resizeTimeoutId = null;
|
|
277
|
+
/** Bound window resize handler (fallback for shadow DOM nesting). */
|
|
278
|
+
this._boundWindowResize = null;
|
|
273
279
|
this._hasLoadedOnce = false;
|
|
274
280
|
this._viewportUnobserve = null;
|
|
275
281
|
this._boundOnDashboardFilterChange = (e) => {
|
|
@@ -307,6 +313,13 @@ export class BaseChartWidget extends LitElement {
|
|
|
307
313
|
connectedCallback() {
|
|
308
314
|
super.connectedCallback();
|
|
309
315
|
this._attachDashboard();
|
|
316
|
+
// Re-attach window resize listener on reconnect (firstUpdated only runs once)
|
|
317
|
+
if (this._boundWindowResize) {
|
|
318
|
+
window.addEventListener('resize', this._boundWindowResize);
|
|
319
|
+
}
|
|
320
|
+
if (this._resizeObserver) {
|
|
321
|
+
this._resizeObserver.observe(this);
|
|
322
|
+
}
|
|
310
323
|
}
|
|
311
324
|
disconnectedCallback() {
|
|
312
325
|
this._viewportUnobserve?.();
|
|
@@ -316,6 +329,9 @@ export class BaseChartWidget extends LitElement {
|
|
|
316
329
|
clearTimeout(this._resizeTimeoutId);
|
|
317
330
|
this._resizeTimeoutId = null;
|
|
318
331
|
}
|
|
332
|
+
if (this._boundWindowResize) {
|
|
333
|
+
window.removeEventListener('resize', this._boundWindowResize);
|
|
334
|
+
}
|
|
319
335
|
this._resizeObserver?.disconnect();
|
|
320
336
|
this._chart?.dispose();
|
|
321
337
|
this._chart = null;
|
|
@@ -378,21 +394,25 @@ export class BaseChartWidget extends LitElement {
|
|
|
378
394
|
this._dashboardEl = null;
|
|
379
395
|
this._dashboardParams = {};
|
|
380
396
|
}
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
if (
|
|
384
|
-
this.
|
|
385
|
-
|
|
386
|
-
clearTimeout(this._resizeTimeoutId);
|
|
387
|
-
this._resizeTimeoutId = null;
|
|
388
|
-
}
|
|
389
|
-
this._resizeTimeoutId = setTimeout(() => {
|
|
390
|
-
this._resizeTimeoutId = null;
|
|
391
|
-
this._chart?.resize();
|
|
392
|
-
}, BaseChartWidget._RESIZE_DELAY_MS);
|
|
393
|
-
});
|
|
394
|
-
this._resizeObserver.observe(container);
|
|
397
|
+
/** Shared debounce logic for resize events (ResizeObserver + window resize). */
|
|
398
|
+
_scheduleResize() {
|
|
399
|
+
if (this._resizeTimeoutId != null) {
|
|
400
|
+
clearTimeout(this._resizeTimeoutId);
|
|
401
|
+
this._resizeTimeoutId = null;
|
|
395
402
|
}
|
|
403
|
+
this._resizeTimeoutId = setTimeout(() => {
|
|
404
|
+
this._resizeTimeoutId = null;
|
|
405
|
+
this._chart?.resize();
|
|
406
|
+
}, BaseChartWidget._RESIZE_DELAY_MS);
|
|
407
|
+
}
|
|
408
|
+
firstUpdated() {
|
|
409
|
+
// ResizeObserver on host — catches container-specific resizes (sidebar toggle, grid reflow).
|
|
410
|
+
this._resizeObserver = new ResizeObserver(() => this._scheduleResize());
|
|
411
|
+
this._resizeObserver.observe(this);
|
|
412
|
+
// Window resize listener — reliable fallback that always fires on window resize,
|
|
413
|
+
// regardless of shadow DOM nesting depth.
|
|
414
|
+
this._boundWindowResize = () => this._scheduleResize();
|
|
415
|
+
window.addEventListener('resize', this._boundWindowResize);
|
|
396
416
|
if (this.lazy) {
|
|
397
417
|
this._viewportVisible = false;
|
|
398
418
|
this._viewportUnobserve = observeViewport(this, { rootMargin: this.prefetchMargin || '200px', threshold: 0 }, {
|
|
@@ -506,6 +526,7 @@ export class BaseChartWidget extends LitElement {
|
|
|
506
526
|
this.data = data;
|
|
507
527
|
this.meta = meta;
|
|
508
528
|
this._widgetData = widgetData;
|
|
529
|
+
this._apiOptions = res.options ?? {};
|
|
509
530
|
if (filters?.length)
|
|
510
531
|
this._widgetFilters = filters;
|
|
511
532
|
if (hideFilter !== undefined)
|
|
@@ -554,10 +575,7 @@ export class BaseChartWidget extends LitElement {
|
|
|
554
575
|
const rows = this.data ?? [];
|
|
555
576
|
const meta = this.meta?.columns ?? {};
|
|
556
577
|
const baseOption = this.buildOption(rows, meta, this._widgetData ?? null);
|
|
557
|
-
const merged =
|
|
558
|
-
...baseOption,
|
|
559
|
-
...this.options,
|
|
560
|
-
};
|
|
578
|
+
const merged = this._deepMerge(baseOption, this._apiOptions, this.options);
|
|
561
579
|
// Re-init if container changed (e.g. after loading/error view replaced DOM)
|
|
562
580
|
if (this._chart && this._chart.getDom() !== container) {
|
|
563
581
|
this._chart.dispose();
|
|
@@ -568,6 +586,26 @@ export class BaseChartWidget extends LitElement {
|
|
|
568
586
|
}
|
|
569
587
|
this._chart.setOption(merged, { notMerge: true });
|
|
570
588
|
}
|
|
589
|
+
/**
|
|
590
|
+
* Deep merge plain objects. Arrays and non-object values are replaced, not merged.
|
|
591
|
+
* Allows widget definition options like { yAxis: { inverse: true } } to extend
|
|
592
|
+
* the base chart option without overwriting existing keys (type, data, etc.).
|
|
593
|
+
*/
|
|
594
|
+
_deepMerge(...objects) {
|
|
595
|
+
const result = {};
|
|
596
|
+
for (const obj of objects) {
|
|
597
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
598
|
+
if (value !== null && typeof value === 'object' && !Array.isArray(value)
|
|
599
|
+
&& result[key] !== null && typeof result[key] === 'object' && !Array.isArray(result[key])) {
|
|
600
|
+
result[key] = this._deepMerge(result[key], value);
|
|
601
|
+
}
|
|
602
|
+
else {
|
|
603
|
+
result[key] = value;
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
return result;
|
|
608
|
+
}
|
|
571
609
|
/**
|
|
572
610
|
* Build ECharts option from API data. Override in subclasses (bar, line, pie).
|
|
573
611
|
* When widgetData has categories + series (e.g. from split_by), use those for bar/line.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"line-chart.d.ts","sourceRoot":"","sources":["../../../../libs/analytics/src/widgets/line-chart.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"line-chart.d.ts","sourceRoot":"","sources":["../../../../libs/analytics/src/widgets/line-chart.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAwBlD;;;;GAIG;AACH,qBACa,eAAgB,SAAQ,eAAe;IACzC,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;CAiDjB"}
|
package/widgets/line-chart.js
CHANGED
|
@@ -38,6 +38,7 @@ let LineChartWidget = class LineChartWidget extends BaseChartWidget {
|
|
|
38
38
|
xAxis: { type: 'category', data: categories },
|
|
39
39
|
yAxis: { type: 'value' },
|
|
40
40
|
series,
|
|
41
|
+
...(wd.colors?.length ? { color: wd.colors } : {}),
|
|
41
42
|
};
|
|
42
43
|
}
|
|
43
44
|
const keys = data.length ? Object.keys(data[0]) : Object.keys(meta);
|
package/widgets/number-kpi.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { LitElement } from 'lit';
|
|
2
2
|
import type { WidgetDefinitionSubset } from '../core/fetch-data.js';
|
|
3
3
|
import type { DashboardContainer } from '../dashboard/dashboard-container.js';
|
|
4
|
+
import '../filters/index.js';
|
|
4
5
|
/**
|
|
5
6
|
* Number KPI widget. Displays one or more large formatted numbers with labels.
|
|
6
7
|
* Data shape from backend transformNumber(): { chartType: 'Number', values, labels, options }.
|
|
@@ -21,10 +22,14 @@ export declare class NumberKpiWidget extends LitElement {
|
|
|
21
22
|
private _loading;
|
|
22
23
|
private _error;
|
|
23
24
|
private _dashboardParams;
|
|
25
|
+
private _widgetFilters;
|
|
26
|
+
private _widgetFilterParams;
|
|
27
|
+
private _hideFilter;
|
|
24
28
|
private _viewportVisible;
|
|
25
29
|
private _definitionTitle;
|
|
26
30
|
private _loadGeneration;
|
|
27
31
|
private _hasLoadedOnce;
|
|
32
|
+
private _ignoreNextFilterChange;
|
|
28
33
|
private _dashboardEl;
|
|
29
34
|
private _viewportUnobserve;
|
|
30
35
|
private _loadDataInFlight;
|
|
@@ -45,7 +50,8 @@ export declare class NumberKpiWidget extends LitElement {
|
|
|
45
50
|
private _defer;
|
|
46
51
|
private _loadData;
|
|
47
52
|
private _onRefresh;
|
|
48
|
-
|
|
53
|
+
private _onWidgetFilterChange;
|
|
54
|
+
/** Format a number: apply decimal places, optionally shorten (1234 → 1.2K). */
|
|
49
55
|
private _formatValue;
|
|
50
56
|
render(): import("lit-html").TemplateResult<1>;
|
|
51
57
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"number-kpi.d.ts","sourceRoot":"","sources":["../../../../libs/analytics/src/widgets/number-kpi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAsB,MAAM,KAAK,CAAC;AAGrD,OAAO,KAAK,EAA0B,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAM5F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;
|
|
1
|
+
{"version":3,"file":"number-kpi.d.ts","sourceRoot":"","sources":["../../../../libs/analytics/src/widgets/number-kpi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAsB,MAAM,KAAK,CAAC;AAGrD,OAAO,KAAK,EAA0B,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAM5F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAM9E,OAAO,qBAAqB,CAAC;AAE7B;;;GAGG;AACH,qBACa,eAAgB,SAAQ,UAAU;IAC7C,OAAgB,MAAM,0BAsMpB;IAEkC,KAAK,EAAE,MAAM,CAAC;IACqB,iBAAiB,EAAE,OAAO,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACrC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;IACtD,SAAS,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACpC,IAAI,EAAE,OAAO,CAAC;IACe,cAAc,EAAE,MAAM,CAAC;IACrD,iBAAiB,EAAE,sBAAsB,GAAG,SAAS,CAAC;IAE1F,QAAyB,QAAQ,CAA6B;IAC9D,QAAyB,QAAQ,CAAU;IAC3C,QAAyB,MAAM,CAAgB;IAC/C,QAAyB,gBAAgB,CAA4C;IACrF,QAAyB,cAAc,CAAqB;IAC5D,QAAyB,mBAAmB,CAA4C;IACxF,QAAyB,WAAW,CAAU;IAC9C,QAAyB,gBAAgB,CAAU;IACnD,QAAyB,gBAAgB,CAAS;IAElD,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,uBAAuB,CAAS;IACxC,OAAO,CAAC,YAAY,CAAmC;IACvD,OAAO,CAAC,kBAAkB,CAA6B;IACvD,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,uBAAuB,CAAS;IACxC,OAAO,CAAC,kBAAkB,CAAS;;IAyBnC,OAAO,CAAC,6BAA6B,CAInC;IAEF,OAAO,CAAC,wBAAwB,CAG9B;IAEO,iBAAiB,IAAI,IAAI;IAKzB,oBAAoB,IAAI,IAAI;IAO5B,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAuC5C,YAAY,IAAI,IAAI;IAkB7B,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,oBAAoB;IAO5B,OAAO,CAAC,mBAAmB;IAyB3B,OAAO,KAAK,eAAe,GAE1B;IAED,OAAO,CAAC,MAAM;YAQA,SAAS;IA6EvB,OAAO,CAAC,UAAU;IAKlB,OAAO,CAAC,qBAAqB;IAI7B,+EAA+E;IAC/E,OAAO,CAAC,YAAY;IAsBX,MAAM;CAmGhB"}
|
package/widgets/number-kpi.js
CHANGED
|
@@ -4,6 +4,7 @@ import { customElement, property, state } from 'lit/decorators.js';
|
|
|
4
4
|
import { buildWidgetDataUrl, fetchWidgetData, fetchWidgetDefinition, } from '../core/fetch-data.js';
|
|
5
5
|
import { EVENT_DASHBOARD_FILTER_CHANGE, EVENT_DASHBOARD_REFRESH, } from '../dashboard/index.js';
|
|
6
6
|
import { observeViewport } from '../core/viewport-observer.js';
|
|
7
|
+
import '../filters/index.js';
|
|
7
8
|
/**
|
|
8
9
|
* Number KPI widget. Displays one or more large formatted numbers with labels.
|
|
9
10
|
* Data shape from backend transformNumber(): { chartType: 'Number', values, labels, options }.
|
|
@@ -212,6 +213,7 @@ let NumberKpiWidget = class NumberKpiWidget extends LitElement {
|
|
|
212
213
|
super();
|
|
213
214
|
this._loadGeneration = 0;
|
|
214
215
|
this._hasLoadedOnce = false;
|
|
216
|
+
this._ignoreNextFilterChange = false;
|
|
215
217
|
this._dashboardEl = null;
|
|
216
218
|
this._viewportUnobserve = null;
|
|
217
219
|
this._loadDataInFlight = false;
|
|
@@ -241,6 +243,9 @@ let NumberKpiWidget = class NumberKpiWidget extends LitElement {
|
|
|
241
243
|
this._loading = false;
|
|
242
244
|
this._error = null;
|
|
243
245
|
this._dashboardParams = {};
|
|
246
|
+
this._widgetFilters = [];
|
|
247
|
+
this._widgetFilterParams = {};
|
|
248
|
+
this._hideFilter = false;
|
|
244
249
|
this._viewportVisible = true;
|
|
245
250
|
this._definitionTitle = '';
|
|
246
251
|
}
|
|
@@ -261,11 +266,23 @@ let NumberKpiWidget = class NumberKpiWidget extends LitElement {
|
|
|
261
266
|
}
|
|
262
267
|
if (changed.has('widgetId') || changed.has('apiUrl')) {
|
|
263
268
|
this._definitionTitle = '';
|
|
269
|
+
this._widgetFilters = [];
|
|
270
|
+
this._widgetFilterParams = {};
|
|
271
|
+
this._ignoreNextFilterChange = true;
|
|
264
272
|
}
|
|
265
|
-
|
|
273
|
+
const onlyFilterState = (changed.has('_widgetFilterParams') || changed.has('_widgetFilters')) &&
|
|
274
|
+
!changed.has('dataUrl') &&
|
|
275
|
+
!changed.has('dataParams') &&
|
|
276
|
+
!changed.has('widgetId') &&
|
|
277
|
+
!changed.has('apiUrl');
|
|
278
|
+
if (onlyFilterState && this._ignoreNextFilterChange) {
|
|
279
|
+
this._ignoreNextFilterChange = false;
|
|
280
|
+
}
|
|
281
|
+
else if (changed.has('dataUrl') ||
|
|
266
282
|
changed.has('dataParams') ||
|
|
267
283
|
changed.has('widgetId') ||
|
|
268
|
-
changed.has('apiUrl')
|
|
284
|
+
changed.has('apiUrl') ||
|
|
285
|
+
changed.has('_widgetFilterParams')) {
|
|
269
286
|
if (this._getEffectiveDataUrl() && !this._loadDataScheduled) {
|
|
270
287
|
this._loadDataScheduled = true;
|
|
271
288
|
queueMicrotask(() => {
|
|
@@ -321,7 +338,26 @@ let NumberKpiWidget = class NumberKpiWidget extends LitElement {
|
|
|
321
338
|
return this.dataUrl;
|
|
322
339
|
}
|
|
323
340
|
_getEffectiveParams() {
|
|
324
|
-
|
|
341
|
+
let widgetFilterParams = {};
|
|
342
|
+
if (this._hideFilter) {
|
|
343
|
+
for (const f of this._widgetFilters) {
|
|
344
|
+
if (f.default_value !== undefined && f.default_value !== null) {
|
|
345
|
+
widgetFilterParams[f.param_name] = f.default_value;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
else if (this._widgetFilters.length > 0) {
|
|
350
|
+
for (const f of this._widgetFilters) {
|
|
351
|
+
const setByUser = f.param_name in this._widgetFilterParams;
|
|
352
|
+
widgetFilterParams[f.param_name] = setByUser
|
|
353
|
+
? (this._widgetFilterParams[f.param_name] ?? '')
|
|
354
|
+
: (f.default_value ?? '');
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
else {
|
|
358
|
+
widgetFilterParams = { ...this._widgetFilterParams };
|
|
359
|
+
}
|
|
360
|
+
const out = { ...widgetFilterParams, ...(this.dataParams ?? {}) };
|
|
325
361
|
if (Object.keys(this._dashboardParams).length > 0) {
|
|
326
362
|
out.dashboard_params = this._dashboardParams;
|
|
327
363
|
}
|
|
@@ -358,29 +394,45 @@ let NumberKpiWidget = class NumberKpiWidget extends LitElement {
|
|
|
358
394
|
try {
|
|
359
395
|
const useWidgetApi = Boolean(this.apiUrl && this.widgetId);
|
|
360
396
|
let params;
|
|
361
|
-
if (useWidgetApi &&
|
|
397
|
+
if (useWidgetApi && this._widgetFilters.length === 0) {
|
|
362
398
|
const def = this.initialDefinition ?? (await fetchWidgetDefinition(this.apiUrl, this.widgetId));
|
|
363
399
|
this._definitionTitle = def.title ?? '';
|
|
364
|
-
|
|
400
|
+
this._widgetFilters = def.filters ?? [];
|
|
401
|
+
this._hideFilter = def.hide_filter ?? false;
|
|
402
|
+
const defaultParams = {};
|
|
403
|
+
for (const f of (def.filters ?? [])) {
|
|
404
|
+
if (f.default_value !== undefined && f.default_value !== null) {
|
|
405
|
+
defaultParams[f.param_name] = f.default_value;
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
this._widgetFilterParams = { ...defaultParams, ...this._widgetFilterParams };
|
|
409
|
+
this._ignoreNextFilterChange = true;
|
|
410
|
+
params = { ...defaultParams, ...(this.dataParams ?? {}) };
|
|
411
|
+
if (Object.keys(this._dashboardParams).length > 0) {
|
|
412
|
+
params.dashboard_params = this._dashboardParams;
|
|
413
|
+
}
|
|
365
414
|
}
|
|
366
415
|
else {
|
|
367
416
|
params = this._getEffectiveParams();
|
|
368
417
|
}
|
|
369
|
-
if (Object.keys(this._dashboardParams).length > 0) {
|
|
370
|
-
params.dashboard_params = this._dashboardParams;
|
|
371
|
-
}
|
|
372
418
|
const res = await fetchWidgetData(dataUrl, params);
|
|
373
419
|
if (gen !== this._loadGeneration)
|
|
374
420
|
return;
|
|
375
421
|
const wd = res.widgetData;
|
|
376
422
|
const kpiData = wd && wd.chartType === 'Number'
|
|
377
|
-
? { chartType: 'Number', values: wd.values ?? [], labels: wd.labels ?? [], options: wd.options }
|
|
423
|
+
? { chartType: 'Number', values: wd.values ?? [], labels: wd.labels ?? [], options: wd.options, shorten_numbers: wd.shorten_numbers }
|
|
378
424
|
: null;
|
|
425
|
+
const filters = res.filters;
|
|
426
|
+
const hideFilter = res.hide_filter;
|
|
379
427
|
this._defer(() => {
|
|
380
428
|
if (gen !== this._loadGeneration)
|
|
381
429
|
return;
|
|
382
430
|
this._loadDataInFlight = false;
|
|
383
431
|
this._kpiData = kpiData;
|
|
432
|
+
if (filters?.length)
|
|
433
|
+
this._widgetFilters = filters;
|
|
434
|
+
if (hideFilter !== undefined)
|
|
435
|
+
this._hideFilter = hideFilter;
|
|
384
436
|
this._hasLoadedOnce = true;
|
|
385
437
|
this._loading = false;
|
|
386
438
|
if (this._loadDataPendingRefresh) {
|
|
@@ -410,31 +462,37 @@ let NumberKpiWidget = class NumberKpiWidget extends LitElement {
|
|
|
410
462
|
return;
|
|
411
463
|
this._loadData();
|
|
412
464
|
}
|
|
413
|
-
|
|
414
|
-
|
|
465
|
+
_onWidgetFilterChange(e) {
|
|
466
|
+
this._widgetFilterParams = { ...(e.detail?.params ?? {}) };
|
|
467
|
+
}
|
|
468
|
+
/** Format a number: apply decimal places, optionally shorten (1234 → 1.2K). */
|
|
469
|
+
_formatValue(value, decimal, shorten) {
|
|
415
470
|
const dec = decimal != null && decimal !== '' ? parseInt(decimal, 10) : undefined;
|
|
416
471
|
const abs = Math.abs(value);
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
472
|
+
if (shorten) {
|
|
473
|
+
if (abs >= 1_000_000_000) {
|
|
474
|
+
const v = value / 1_000_000_000;
|
|
475
|
+
return (dec != null ? v.toFixed(dec) : v.toFixed(1)) + 'B';
|
|
476
|
+
}
|
|
477
|
+
if (abs >= 1_000_000) {
|
|
478
|
+
const v = value / 1_000_000;
|
|
479
|
+
return (dec != null ? v.toFixed(dec) : v.toFixed(1)) + 'M';
|
|
480
|
+
}
|
|
481
|
+
if (abs >= 10_000) {
|
|
482
|
+
const v = value / 1_000;
|
|
483
|
+
return (dec != null ? v.toFixed(dec) : v.toFixed(1)) + 'K';
|
|
484
|
+
}
|
|
429
485
|
}
|
|
430
486
|
if (dec != null)
|
|
431
|
-
return value.
|
|
487
|
+
return value.toLocaleString(undefined, { minimumFractionDigits: dec, maximumFractionDigits: dec });
|
|
432
488
|
if (Number.isInteger(value))
|
|
433
489
|
return value.toLocaleString();
|
|
434
490
|
return value.toLocaleString(undefined, { maximumFractionDigits: 2 });
|
|
435
491
|
}
|
|
436
492
|
render() {
|
|
437
493
|
const canRefresh = Boolean(this._getEffectiveDataUrl()) && !this.hideRefreshButton;
|
|
494
|
+
const hasWidgetFilters = this._widgetFilters.length > 0 && !this._hideFilter;
|
|
495
|
+
const widgetActiveCount = Object.keys(this._widgetFilterParams).filter((k) => this._widgetFilterParams[k] !== '' && this._widgetFilterParams[k] != null).length;
|
|
438
496
|
const showSkeleton = this._loading && !this._hasLoadedOnce;
|
|
439
497
|
const showSpinnerOverlay = this._loading && this._hasLoadedOnce;
|
|
440
498
|
const showTitlePlaceholder = !this._effectiveTitle && !this.hideRefreshButton;
|
|
@@ -488,7 +546,7 @@ let NumberKpiWidget = class NumberKpiWidget extends LitElement {
|
|
|
488
546
|
const opt = this._kpiData.options?.[i];
|
|
489
547
|
const prefix = opt?.prefix ?? '';
|
|
490
548
|
const suffix = opt?.suffix ?? '';
|
|
491
|
-
const formatted = this._formatValue(value, opt?.decimal);
|
|
549
|
+
const formatted = this._formatValue(value, opt?.decimal, this._kpiData.shorten_numbers);
|
|
492
550
|
return html `
|
|
493
551
|
<div class="kpi-block">
|
|
494
552
|
<span class="kpi-value">
|
|
@@ -511,6 +569,16 @@ let NumberKpiWidget = class NumberKpiWidget extends LitElement {
|
|
|
511
569
|
<div class="loading-spinner" aria-hidden="true"></div>
|
|
512
570
|
</div>`
|
|
513
571
|
: nothing}
|
|
572
|
+
${hasWidgetFilters
|
|
573
|
+
? html `
|
|
574
|
+
<analytics-widget-toolbar
|
|
575
|
+
.filters=${this._widgetFilters}
|
|
576
|
+
.values=${this._widgetFilterParams}
|
|
577
|
+
.activeCount=${widgetActiveCount}
|
|
578
|
+
@analytics-filter-change=${this._onWidgetFilterChange}
|
|
579
|
+
></analytics-widget-toolbar>
|
|
580
|
+
`
|
|
581
|
+
: ''}
|
|
514
582
|
</div>
|
|
515
583
|
`;
|
|
516
584
|
}
|
|
@@ -557,6 +625,15 @@ __decorate([
|
|
|
557
625
|
__decorate([
|
|
558
626
|
state()
|
|
559
627
|
], NumberKpiWidget.prototype, "_dashboardParams", void 0);
|
|
628
|
+
__decorate([
|
|
629
|
+
state()
|
|
630
|
+
], NumberKpiWidget.prototype, "_widgetFilters", void 0);
|
|
631
|
+
__decorate([
|
|
632
|
+
state()
|
|
633
|
+
], NumberKpiWidget.prototype, "_widgetFilterParams", void 0);
|
|
634
|
+
__decorate([
|
|
635
|
+
state()
|
|
636
|
+
], NumberKpiWidget.prototype, "_hideFilter", void 0);
|
|
560
637
|
__decorate([
|
|
561
638
|
state()
|
|
562
639
|
], NumberKpiWidget.prototype, "_viewportVisible", void 0);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pie-chart.d.ts","sourceRoot":"","sources":["../../../../libs/analytics/src/widgets/pie-chart.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"pie-chart.d.ts","sourceRoot":"","sources":["../../../../libs/analytics/src/widgets/pie-chart.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AASlD;;;;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;CAqDjB"}
|
package/widgets/pie-chart.js
CHANGED
|
@@ -10,11 +10,17 @@ let PieChartWidget = class PieChartWidget extends BaseChartWidget {
|
|
|
10
10
|
buildOption(data, meta, widgetData) {
|
|
11
11
|
const wd = widgetData;
|
|
12
12
|
if (wd && typeof wd === 'object' && Array.isArray(wd.items) && wd.items.length > 0) {
|
|
13
|
-
const pieData = wd.items.map((item) =>
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
13
|
+
const pieData = wd.items.map((item) => {
|
|
14
|
+
const d = {
|
|
15
|
+
name: String(item?.name ?? ''),
|
|
16
|
+
value: Number(item?.value) || 0,
|
|
17
|
+
};
|
|
18
|
+
if (item?.itemStyle?.color) {
|
|
19
|
+
d.itemStyle = { color: item.itemStyle.color };
|
|
20
|
+
}
|
|
21
|
+
return d;
|
|
22
|
+
});
|
|
23
|
+
const opt = {
|
|
18
24
|
tooltip: { trigger: 'item' },
|
|
19
25
|
series: [
|
|
20
26
|
{
|
|
@@ -25,6 +31,10 @@ let PieChartWidget = class PieChartWidget extends BaseChartWidget {
|
|
|
25
31
|
},
|
|
26
32
|
],
|
|
27
33
|
};
|
|
34
|
+
if (wd.colors && wd.colors.length > 0) {
|
|
35
|
+
opt.color = wd.colors;
|
|
36
|
+
}
|
|
37
|
+
return opt;
|
|
28
38
|
}
|
|
29
39
|
const keys = data.length ? Object.keys(data[0]) : Object.keys(meta);
|
|
30
40
|
if (keys.length === 0) {
|