@acorex-platform/module-dashboard-management-client 0.0.38 → 0.0.48
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/fesm2022/{acorex-platform-module-dashboard-management-client-acorex-platform-module-dashboard-management-client-BUmHWNqL.mjs → acorex-platform-module-dashboard-management-client-acorex-platform-module-dashboard-management-client-61Q_QY8l.mjs} +976 -2957
- package/fesm2022/acorex-platform-module-dashboard-management-client-acorex-platform-module-dashboard-management-client-61Q_QY8l.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-dashboard-management-client-bar-chart-widget.component-kw130ESN.mjs +151 -0
- package/fesm2022/acorex-platform-module-dashboard-management-client-bar-chart-widget.component-kw130ESN.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-dashboard-management-client-chart-card-widget.component-B2ztaswG.mjs +126 -0
- package/fesm2022/acorex-platform-module-dashboard-management-client-chart-card-widget.component-B2ztaswG.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-dashboard-management-client-chart-configurator-widget-column.component-DxNKy3bB.mjs +76 -0
- package/fesm2022/acorex-platform-module-dashboard-management-client-chart-configurator-widget-column.component-DxNKy3bB.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-dashboard-management-client-chart-configurator-widget-edit.component-BgR51eZ1.mjs +559 -0
- package/fesm2022/acorex-platform-module-dashboard-management-client-chart-configurator-widget-edit.component-BgR51eZ1.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-dashboard-management-client-chart-legend.util-C1zqTQEf.mjs +31 -0
- package/fesm2022/acorex-platform-module-dashboard-management-client-chart-legend.util-C1zqTQEf.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-dashboard-management-client-chart-widget-data.util-BLtv9sOm.mjs +589 -0
- package/fesm2022/acorex-platform-module-dashboard-management-client-chart-widget-data.util-BLtv9sOm.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-dashboard-management-client-contracts-entities-dashboard.mjs +30 -1
- package/fesm2022/acorex-platform-module-dashboard-management-client-contracts-entities-dashboard.mjs.map +1 -1
- package/fesm2022/{acorex-platform-module-dashboard-management-client-contracts-entity-catalog-acorex-platform-module-dashboard-management-client-contracts-entity-catalog-CPDwiLWC.mjs → acorex-platform-module-dashboard-management-client-contracts-entity-catalog-acorex-platform-module-dashboard-management-client-contracts-entity-catalog-C3ZKIYgQ.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-dashboard-management-client-contracts-entity-catalog-acorex-platform-module-dashboard-management-client-contracts-entity-catalog-CPDwiLWC.mjs.map → acorex-platform-module-dashboard-management-client-contracts-entity-catalog-acorex-platform-module-dashboard-management-client-contracts-entity-catalog-C3ZKIYgQ.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-dashboard-management-client-contracts-entity-catalog-dashboard.entity-C1ju-BQM.mjs → acorex-platform-module-dashboard-management-client-contracts-entity-catalog-dashboard.entity-D2uqZMd4.mjs} +32 -3
- package/fesm2022/acorex-platform-module-dashboard-management-client-contracts-entity-catalog-dashboard.entity-D2uqZMd4.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-dashboard-management-client-contracts-entity-catalog.mjs +1 -1
- package/fesm2022/acorex-platform-module-dashboard-management-client-contracts.mjs +21 -1
- package/fesm2022/acorex-platform-module-dashboard-management-client-contracts.mjs.map +1 -1
- package/fesm2022/acorex-platform-module-dashboard-management-client-donut-chart-widget.component-DB_7rLmK.mjs +145 -0
- package/fesm2022/acorex-platform-module-dashboard-management-client-donut-chart-widget.component-DB_7rLmK.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-dashboard-management-client-funnel-chart-widget.component-CltmXb8c.mjs +135 -0
- package/fesm2022/acorex-platform-module-dashboard-management-client-funnel-chart-widget.component-CltmXb8c.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-dashboard-management-client-gauge-chart-widget.component-Ci1cRFmt.mjs +138 -0
- package/fesm2022/acorex-platform-module-dashboard-management-client-gauge-chart-widget.component-Ci1cRFmt.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-dashboard-management-client-heatmap-chart-widget.component-CzJTc6rm.mjs +154 -0
- package/fesm2022/acorex-platform-module-dashboard-management-client-heatmap-chart-widget.component-CzJTc6rm.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-dashboard-management-client-index-C1Te5cDf.mjs → acorex-platform-module-dashboard-management-client-index-z10pHL3b.mjs} +3 -3
- package/fesm2022/{acorex-platform-module-dashboard-management-client-index-C1Te5cDf.mjs.map → acorex-platform-module-dashboard-management-client-index-z10pHL3b.mjs.map} +1 -1
- package/fesm2022/acorex-platform-module-dashboard-management-client-line-chart-widget.component-Fu_lheQe.mjs +158 -0
- package/fesm2022/acorex-platform-module-dashboard-management-client-line-chart-widget.component-Fu_lheQe.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-dashboard-management-client.mjs +1 -1
- package/package.json +1 -1
- package/types/acorex-platform-module-dashboard-management-client-contracts.d.ts +19 -5
- package/types/acorex-platform-module-dashboard-management-client.d.ts +49 -267
- package/fesm2022/acorex-platform-module-dashboard-management-client-acorex-platform-module-dashboard-management-client-BUmHWNqL.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-dashboard-management-client-contracts-entity-catalog-dashboard.entity-C1ju-BQM.mjs.map +0 -1
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { AXGaugeChartComponent } from '@acorex/charts/gauge-chart';
|
|
2
|
+
import { AXTranslationService } from '@acorex/core/translation';
|
|
3
|
+
import { AXPQueryExecutor } from '@acorex-platform/framework-client/runtime';
|
|
4
|
+
import * as i0 from '@angular/core';
|
|
5
|
+
import { inject, signal, effect, computed, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
6
|
+
import { e as AXPDashboardWidgetComponent, f as resolveChartQueryTabs, g as AXPChartQueryTabsComponent } from './acorex-platform-module-dashboard-management-client-acorex-platform-module-dashboard-management-client-61Q_QY8l.mjs';
|
|
7
|
+
import { c as loadGaugeChartValue } from './acorex-platform-module-dashboard-management-client-chart-widget-data.util-BLtv9sOm.mjs';
|
|
8
|
+
import { o as omitChartFixedSize } from './acorex-platform-module-dashboard-management-client-chart-legend.util-C1zqTQEf.mjs';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Gauge Chart Widget Component
|
|
12
|
+
* Renders a semi-circular gauge chart with animated needle and thresholds
|
|
13
|
+
*/
|
|
14
|
+
class AXPGaugeChartWidgetViewComponent extends AXPDashboardWidgetComponent {
|
|
15
|
+
//#endregion
|
|
16
|
+
//#region ----- Localization -----
|
|
17
|
+
async resolveChartOptionLabel(value) {
|
|
18
|
+
if (value != null && typeof value === 'object' && !Array.isArray(value)) {
|
|
19
|
+
return this.translationService.resolve(value);
|
|
20
|
+
}
|
|
21
|
+
const s = String(value ?? '');
|
|
22
|
+
if (s.startsWith('@')) {
|
|
23
|
+
return this.translationService.translateAsync(s);
|
|
24
|
+
}
|
|
25
|
+
return s;
|
|
26
|
+
}
|
|
27
|
+
selectQueryTab(index) {
|
|
28
|
+
this.activeTabIndex.set(index);
|
|
29
|
+
}
|
|
30
|
+
//#endregion
|
|
31
|
+
constructor() {
|
|
32
|
+
super();
|
|
33
|
+
//#region ----- Services & Dependencies -----
|
|
34
|
+
this.queryExecutor = inject(AXPQueryExecutor);
|
|
35
|
+
this.translationService = inject(AXTranslationService);
|
|
36
|
+
//#endregion
|
|
37
|
+
//#region ----- Chart state -----
|
|
38
|
+
this.value = signal(0, /* @ts-ignore */
|
|
39
|
+
...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
|
|
40
|
+
/** Options with resolved title, label, and threshold labels for the chart SVG/layer. */
|
|
41
|
+
this.gaugeChartOptions = signal({}, /* @ts-ignore */
|
|
42
|
+
...(ngDevMode ? [{ debugName: "gaugeChartOptions" }] : /* istanbul ignore next */ []));
|
|
43
|
+
this.labelResolveGeneration = 0;
|
|
44
|
+
this.resolveGaugeOptionsEffect = effect(() => {
|
|
45
|
+
const raw = this.options();
|
|
46
|
+
const generation = ++this.labelResolveGeneration;
|
|
47
|
+
const thresholdSource = raw['thresholds'];
|
|
48
|
+
void (async () => {
|
|
49
|
+
const [title, label] = await Promise.all([
|
|
50
|
+
this.resolveChartOptionLabel(raw['title']),
|
|
51
|
+
this.resolveChartOptionLabel(raw['label']),
|
|
52
|
+
]);
|
|
53
|
+
let thresholds;
|
|
54
|
+
if (Array.isArray(thresholdSource)) {
|
|
55
|
+
thresholds = await Promise.all(thresholdSource.map(async (t) => {
|
|
56
|
+
const entry = t;
|
|
57
|
+
const labelRaw = entry['label'];
|
|
58
|
+
return {
|
|
59
|
+
value: entry['value'],
|
|
60
|
+
color: String(entry['color'] ?? ''),
|
|
61
|
+
...(labelRaw != null && labelRaw !== '' ? { label: await this.resolveChartOptionLabel(labelRaw) } : {}),
|
|
62
|
+
};
|
|
63
|
+
}));
|
|
64
|
+
}
|
|
65
|
+
if (generation !== this.labelResolveGeneration) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
const base = omitChartFixedSize(raw);
|
|
69
|
+
this.gaugeChartOptions.set({
|
|
70
|
+
...base,
|
|
71
|
+
title,
|
|
72
|
+
label,
|
|
73
|
+
showValue: base.showValue !== false,
|
|
74
|
+
showDataLabels: base.showDataLabels !== false,
|
|
75
|
+
...(thresholds ? { thresholds } : {}),
|
|
76
|
+
});
|
|
77
|
+
})();
|
|
78
|
+
}, /* @ts-ignore */
|
|
79
|
+
...(ngDevMode ? [{ debugName: "resolveGaugeOptionsEffect" }] : /* istanbul ignore next */ []));
|
|
80
|
+
//#endregion
|
|
81
|
+
//#region ----- Query tabs -----
|
|
82
|
+
this.queryTabs = computed(() => resolveChartQueryTabs(this.options(), this.entityContext()?.entityId), /* @ts-ignore */
|
|
83
|
+
...(ngDevMode ? [{ debugName: "queryTabs" }] : /* istanbul ignore next */ []));
|
|
84
|
+
this.activeTabIndex = signal(0, /* @ts-ignore */
|
|
85
|
+
...(ngDevMode ? [{ debugName: "activeTabIndex" }] : /* istanbul ignore next */ []));
|
|
86
|
+
this.activeQuery = computed(() => {
|
|
87
|
+
const tabs = this.queryTabs();
|
|
88
|
+
if (tabs.length === 0) {
|
|
89
|
+
return undefined;
|
|
90
|
+
}
|
|
91
|
+
const index = Math.min(Math.max(this.activeTabIndex(), 0), tabs.length - 1);
|
|
92
|
+
return tabs[index];
|
|
93
|
+
}, /* @ts-ignore */
|
|
94
|
+
...(ngDevMode ? [{ debugName: "activeQuery" }] : /* istanbul ignore next */ []));
|
|
95
|
+
this.clampTabIndexEffect = effect(() => {
|
|
96
|
+
const tabs = this.queryTabs();
|
|
97
|
+
if (this.activeTabIndex() >= tabs.length) {
|
|
98
|
+
this.activeTabIndex.set(0);
|
|
99
|
+
}
|
|
100
|
+
}, /* @ts-ignore */
|
|
101
|
+
...(ngDevMode ? [{ debugName: "clampTabIndexEffect" }] : /* istanbul ignore next */ []));
|
|
102
|
+
//#endregion
|
|
103
|
+
//#region ----- Query loading -----
|
|
104
|
+
this.dataLoadEffect = effect(async () => {
|
|
105
|
+
const opts = this.options();
|
|
106
|
+
const active = this.activeQuery();
|
|
107
|
+
const value = await loadGaugeChartValue(opts, {
|
|
108
|
+
queryExecutor: this.queryExecutor,
|
|
109
|
+
queryKey: active?.query,
|
|
110
|
+
queryInput: active?.queryInput,
|
|
111
|
+
});
|
|
112
|
+
this.value.set(value);
|
|
113
|
+
}, /* @ts-ignore */
|
|
114
|
+
...(ngDevMode ? [{ debugName: "dataLoadEffect" }] : /* istanbul ignore next */ []));
|
|
115
|
+
this.setOptions({
|
|
116
|
+
minValue: 0,
|
|
117
|
+
maxValue: 100,
|
|
118
|
+
showTooltip: true,
|
|
119
|
+
showValue: true,
|
|
120
|
+
showDataLabels: true,
|
|
121
|
+
gaugeWidth: 18,
|
|
122
|
+
cornerRadius: 4,
|
|
123
|
+
animationEasing: 'cubic-out',
|
|
124
|
+
animationDuration: 800,
|
|
125
|
+
...omitChartFixedSize(this.options()),
|
|
126
|
+
});
|
|
127
|
+
this.gaugeChartOptions.set(omitChartFixedSize(this.options()));
|
|
128
|
+
}
|
|
129
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPGaugeChartWidgetViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
130
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.8", type: AXPGaugeChartWidgetViewComponent, isStandalone: true, selector: "ng-component", usesInheritance: true, ngImport: i0, template: "<div class=\"axp-chart-widget-host\">\n <axp-chart-query-tabs\n [tabs]=\"queryTabs()\"\n [activeIndex]=\"activeTabIndex()\"\n (activeIndexChange)=\"selectQueryTab($event)\"\n />\n <div class=\"axp-chart-widget-host__body\">\n <div class=\"axp-chart-widget-host__chart axp-chart-widget-host__chart--radial\">\n <ax-gauge-chart [value]=\"value()\" [options]=\"gaugeChartOptions()\"></ax-gauge-chart>\n </div>\n </div>\n</div>\n", styles: ["@layer properties;:host{display:block;width:100%;height:100%;min-height:0px;overflow:hidden}:host:has(.axp-chart-widget-host__chart--heatmap){block-size:auto;overflow:visible;min-block-size:0}.axp-chart-widget-host{display:flex;height:100%;min-height:0px;width:100%;flex-direction:column;gap:var(--spacing, .25rem)}.axp-chart-widget-host:has(.axp-chart-widget-host__chart--heatmap){block-size:auto;min-block-size:0;overflow:visible}.axp-chart-widget-host__body{display:flex;min-height:0px;flex:1;flex-direction:column;gap:var(--spacing, .25rem);padding-bottom:calc(var(--spacing, .25rem) * 2)}.axp-chart-widget-host__body:not(.axp-chart-widget-host__body--with-legend)>.axp-chart-widget-host__chart--radial{flex:1 1 auto}.axp-chart-widget-host__body--with-legend{min-height:0px;flex:1;gap:var(--spacing, .25rem);display:grid;grid-template-rows:minmax(0,1fr) auto}.axp-chart-widget-host__chart{position:relative;min-height:calc(var(--spacing, .25rem) * 64);width:100%;overflow:hidden;grid-row:1}.axp-chart-widget-host__chart--radial{position:relative;margin-inline:auto;align-self:center;justify-self:center;overflow:hidden;grid-row:1;flex:0 0 auto;height:auto;width:min(100%,18rem);max-width:100%;min-height:12rem;min-width:8rem;aspect-ratio:1 / 1}.axp-chart-widget-host__chart--funnel{position:relative;width:100%;overflow:hidden;block-size:20rem;flex:0 0 auto;max-block-size:24rem;min-block-size:16rem}.axp-chart-widget-host__chart--funnel ax-funnel-chart,.axp-chart-widget-host__chart--funnel .ax-funnel-chart-container{display:block;block-size:100%;inline-size:100%;min-block-size:0}.axp-chart-widget-host__body:has(.axp-chart-widget-host__chart--funnel){flex:none}.axp-chart-widget-host__chart--heatmap{position:relative;width:100%;max-width:100%;inline-size:100%;block-size:auto;flex:0 0 auto;overflow:visible;min-height:0!important;min-block-size:0!important;max-block-size:none}.axp-chart-widget-host__chart--heatmap ax-heatmap-chart,.axp-chart-widget-host__chart--heatmap .ax-heatmap-chart-container{display:block;inline-size:100%;max-inline-size:100%;block-size:auto;min-block-size:0;overflow:visible}.axp-chart-widget-host__body:has(.axp-chart-widget-host__chart--heatmap){flex:none;block-size:auto;min-block-size:0;overflow:visible}.axp-chart-widget-host__legend{width:100%;flex:none;grid-row:2;min-height:0;min-width:0;max-width:100%;display:flex;justify-content:flex-start;overflow-x:auto;overflow-y:hidden;scrollbar-width:thin;scrollbar-color:rgb(var(--ax-sys-color-border-lighter-surface)) transparent}:host ::ng-deep ax-chart-legend{display:block!important;height:auto!important;max-height:none;width:max-content;min-width:100%;max-width:none}:host ::ng-deep .ax-chart-legend{--ax-legend-bg: var(--ax-sys-color-lighter-surface);--ax-legend-text: var(--ax-sys-color-on-lighter-surface);--ax-legend-border: var(--ax-sys-color-border-lighter-surface);--ax-legend-radius: .625rem;--ax-legend-padding: .375rem .5rem;--ax-legend-gap: .375rem;--ax-legend-item-height: auto;height:auto;max-height:none;width:100%;overflow:visible;padding:var(--ax-legend-padding);gap:var(--ax-legend-gap);color:rgb(var(--ax-legend-text))}:host ::ng-deep .ax-chart-legend.ax-legend-horizontal{flex-direction:row;flex-wrap:nowrap;align-items:center;justify-content:flex-start;width:max-content;min-width:100%;max-width:none;overflow:visible;border:none;background:transparent;background-color:transparent;padding:.125rem .75rem .7rem;gap:.5rem}:host ::ng-deep .ax-legend-item{align-items:center;flex-shrink:0;gap:.375rem;height:auto;min-height:1.5rem;padding-block:.2rem;padding-inline:.5rem;border-radius:9999px;border:1px solid rgb(var(--ax-sys-color-border-lightest-surface));background-color:rgb(var(--ax-sys-color-lightest-surface));white-space:nowrap;transition:background-color .15s ease,border-color .15s ease,box-shadow .15s ease,opacity .15s ease,transform .15s ease}:host ::ng-deep .ax-legend-item:hover{border-color:rgb(var(--ax-sys-color-primary-500));background-color:rgb(var(--ax-sys-color-primary-500));box-shadow:0 1px 2px #0f172a0f}@supports (color: color-mix(in lab,red,red)){:host ::ng-deep .ax-legend-item:hover{border-color:color-mix(in srgb,rgb(var(--ax-sys-color-primary-500)) 35%,rgb(var(--ax-sys-color-border-lightest-surface)))}}@supports (color: color-mix(in lab,red,red)){:host ::ng-deep .ax-legend-item:hover{background-color:color-mix(in srgb,rgb(var(--ax-sys-color-primary-500)) 6%,rgb(var(--ax-sys-color-lightest-surface)))}}:host ::ng-deep .ax-legend-item:active{transform:scale(.98)}:host ::ng-deep .ax-legend-item.ax-legend-item-hidden{opacity:.62}:host ::ng-deep .ax-legend-color{width:.625rem;height:.625rem;flex-shrink:0;border-radius:9999px;box-shadow:0 0 0 1px rgb(var(--ax-legend-text))}@supports (color: color-mix(in lab,red,red)){:host ::ng-deep .ax-legend-color{box-shadow:0 0 0 1px color-mix(in srgb,rgb(var(--ax-legend-text)) 18%,transparent)}}:host ::ng-deep .ax-legend-name{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);max-width:9rem;overflow:hidden;text-overflow:ellipsis}:host ::ng-deep .ax-legend-value{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,);margin-inline-start:0;opacity:1;color:rgb(var(--ax-sys-color-on-lightest-surface))}:host ::ng-deep .ax-legend-percentage{margin-inline-start:0;border-radius:9999px;padding-inline:.4rem;padding-block:.125rem;font-size:.6875rem;line-height:1;font-weight:600;font-variant-numeric:tabular-nums;background-color:rgb(var(--ax-legend-text))}@supports (color: color-mix(in lab,red,red)){:host ::ng-deep .ax-legend-percentage{background-color:color-mix(in srgb,rgb(var(--ax-legend-text)) 12%,transparent)}}:host ::ng-deep ax-donut-chart,:host ::ng-deep ax-gauge-chart,:host ::ng-deep ax-bar-chart,:host ::ng-deep ax-line-chart,:host ::ng-deep ax-funnel-chart{display:block!important;width:100%!important;height:100%!important;min-height:0!important;max-height:100%!important}:host ::ng-deep .axp-chart-widget-host__chart--heatmap ax-heatmap-chart{display:block!important;width:100%!important;max-width:100%!important;height:auto!important;min-height:0!important;max-height:none!important;overflow:visible!important}:host ::ng-deep ax-donut-chart .ax-donut-chart,:host ::ng-deep ax-gauge-chart .ax-gauge-chart,:host ::ng-deep ax-bar-chart .ax-bar-chart,:host ::ng-deep ax-line-chart .ax-line-chart,:host ::ng-deep ax-funnel-chart .ax-funnel-chart-container{min-height:0!important;height:100%!important;width:100%!important;padding:.25rem!important}:host ::ng-deep .axp-chart-widget-host__chart--heatmap ax-heatmap-chart .ax-heatmap-chart-container,:host ::ng-deep .axp-chart-widget-host__chart--heatmap .ax-heatmap-chart{min-height:0!important;height:auto!important;width:100%!important;max-width:100%!important;padding:.25rem!important;overflow:visible!important}:host ::ng-deep .axp-chart-widget-host__chart--heatmap svg{display:block;width:100%!important;max-width:100%!important;height:auto!important;overflow:visible!important}:host:has(.ax-chart-empty){block-size:100%;overflow:hidden}.axp-chart-widget-host:has(.ax-chart-empty){block-size:100%;overflow:hidden}.axp-chart-widget-host__body:has(.ax-chart-empty){flex:1 1 auto;min-block-size:0;overflow:hidden}.axp-chart-widget-host__chart--heatmap:has(.ax-chart-empty){flex:1 1 auto;block-size:100%;min-block-size:16rem!important;overflow:hidden}:host ::ng-deep .axp-chart-widget-host__chart--heatmap:has(.ax-chart-empty) ax-heatmap-chart,:host ::ng-deep .axp-chart-widget-host__chart--heatmap:has(.ax-chart-empty) ax-heatmap-chart .ax-heatmap-chart-container{display:block!important;width:100%!important;max-width:100%!important;height:100%!important;min-height:16rem!important;max-height:none!important;overflow:hidden!important}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-ordinal{syntax: \"*\"; inherits: false;}@property --tw-slashed-zero{syntax: \"*\"; inherits: false;}@property --tw-numeric-figure{syntax: \"*\"; inherits: false;}@property --tw-numeric-spacing{syntax: \"*\"; inherits: false;}@property --tw-numeric-fraction{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-font-weight: initial;--tw-ordinal: initial;--tw-slashed-zero: initial;--tw-numeric-figure: initial;--tw-numeric-spacing: initial;--tw-numeric-fraction: initial}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "component", type: AXGaugeChartComponent, selector: "ax-gauge-chart", inputs: ["value", "options"] }, { kind: "component", type: AXPChartQueryTabsComponent, selector: "axp-chart-query-tabs", inputs: ["tabs", "activeIndex"], outputs: ["activeIndexChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
131
|
+
}
|
|
132
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPGaugeChartWidgetViewComponent, decorators: [{
|
|
133
|
+
type: Component,
|
|
134
|
+
args: [{ imports: [AXGaugeChartComponent, AXPChartQueryTabsComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"axp-chart-widget-host\">\n <axp-chart-query-tabs\n [tabs]=\"queryTabs()\"\n [activeIndex]=\"activeTabIndex()\"\n (activeIndexChange)=\"selectQueryTab($event)\"\n />\n <div class=\"axp-chart-widget-host__body\">\n <div class=\"axp-chart-widget-host__chart axp-chart-widget-host__chart--radial\">\n <ax-gauge-chart [value]=\"value()\" [options]=\"gaugeChartOptions()\"></ax-gauge-chart>\n </div>\n </div>\n</div>\n", styles: ["@layer properties;:host{display:block;width:100%;height:100%;min-height:0px;overflow:hidden}:host:has(.axp-chart-widget-host__chart--heatmap){block-size:auto;overflow:visible;min-block-size:0}.axp-chart-widget-host{display:flex;height:100%;min-height:0px;width:100%;flex-direction:column;gap:var(--spacing, .25rem)}.axp-chart-widget-host:has(.axp-chart-widget-host__chart--heatmap){block-size:auto;min-block-size:0;overflow:visible}.axp-chart-widget-host__body{display:flex;min-height:0px;flex:1;flex-direction:column;gap:var(--spacing, .25rem);padding-bottom:calc(var(--spacing, .25rem) * 2)}.axp-chart-widget-host__body:not(.axp-chart-widget-host__body--with-legend)>.axp-chart-widget-host__chart--radial{flex:1 1 auto}.axp-chart-widget-host__body--with-legend{min-height:0px;flex:1;gap:var(--spacing, .25rem);display:grid;grid-template-rows:minmax(0,1fr) auto}.axp-chart-widget-host__chart{position:relative;min-height:calc(var(--spacing, .25rem) * 64);width:100%;overflow:hidden;grid-row:1}.axp-chart-widget-host__chart--radial{position:relative;margin-inline:auto;align-self:center;justify-self:center;overflow:hidden;grid-row:1;flex:0 0 auto;height:auto;width:min(100%,18rem);max-width:100%;min-height:12rem;min-width:8rem;aspect-ratio:1 / 1}.axp-chart-widget-host__chart--funnel{position:relative;width:100%;overflow:hidden;block-size:20rem;flex:0 0 auto;max-block-size:24rem;min-block-size:16rem}.axp-chart-widget-host__chart--funnel ax-funnel-chart,.axp-chart-widget-host__chart--funnel .ax-funnel-chart-container{display:block;block-size:100%;inline-size:100%;min-block-size:0}.axp-chart-widget-host__body:has(.axp-chart-widget-host__chart--funnel){flex:none}.axp-chart-widget-host__chart--heatmap{position:relative;width:100%;max-width:100%;inline-size:100%;block-size:auto;flex:0 0 auto;overflow:visible;min-height:0!important;min-block-size:0!important;max-block-size:none}.axp-chart-widget-host__chart--heatmap ax-heatmap-chart,.axp-chart-widget-host__chart--heatmap .ax-heatmap-chart-container{display:block;inline-size:100%;max-inline-size:100%;block-size:auto;min-block-size:0;overflow:visible}.axp-chart-widget-host__body:has(.axp-chart-widget-host__chart--heatmap){flex:none;block-size:auto;min-block-size:0;overflow:visible}.axp-chart-widget-host__legend{width:100%;flex:none;grid-row:2;min-height:0;min-width:0;max-width:100%;display:flex;justify-content:flex-start;overflow-x:auto;overflow-y:hidden;scrollbar-width:thin;scrollbar-color:rgb(var(--ax-sys-color-border-lighter-surface)) transparent}:host ::ng-deep ax-chart-legend{display:block!important;height:auto!important;max-height:none;width:max-content;min-width:100%;max-width:none}:host ::ng-deep .ax-chart-legend{--ax-legend-bg: var(--ax-sys-color-lighter-surface);--ax-legend-text: var(--ax-sys-color-on-lighter-surface);--ax-legend-border: var(--ax-sys-color-border-lighter-surface);--ax-legend-radius: .625rem;--ax-legend-padding: .375rem .5rem;--ax-legend-gap: .375rem;--ax-legend-item-height: auto;height:auto;max-height:none;width:100%;overflow:visible;padding:var(--ax-legend-padding);gap:var(--ax-legend-gap);color:rgb(var(--ax-legend-text))}:host ::ng-deep .ax-chart-legend.ax-legend-horizontal{flex-direction:row;flex-wrap:nowrap;align-items:center;justify-content:flex-start;width:max-content;min-width:100%;max-width:none;overflow:visible;border:none;background:transparent;background-color:transparent;padding:.125rem .75rem .7rem;gap:.5rem}:host ::ng-deep .ax-legend-item{align-items:center;flex-shrink:0;gap:.375rem;height:auto;min-height:1.5rem;padding-block:.2rem;padding-inline:.5rem;border-radius:9999px;border:1px solid rgb(var(--ax-sys-color-border-lightest-surface));background-color:rgb(var(--ax-sys-color-lightest-surface));white-space:nowrap;transition:background-color .15s ease,border-color .15s ease,box-shadow .15s ease,opacity .15s ease,transform .15s ease}:host ::ng-deep .ax-legend-item:hover{border-color:rgb(var(--ax-sys-color-primary-500));background-color:rgb(var(--ax-sys-color-primary-500));box-shadow:0 1px 2px #0f172a0f}@supports (color: color-mix(in lab,red,red)){:host ::ng-deep .ax-legend-item:hover{border-color:color-mix(in srgb,rgb(var(--ax-sys-color-primary-500)) 35%,rgb(var(--ax-sys-color-border-lightest-surface)))}}@supports (color: color-mix(in lab,red,red)){:host ::ng-deep .ax-legend-item:hover{background-color:color-mix(in srgb,rgb(var(--ax-sys-color-primary-500)) 6%,rgb(var(--ax-sys-color-lightest-surface)))}}:host ::ng-deep .ax-legend-item:active{transform:scale(.98)}:host ::ng-deep .ax-legend-item.ax-legend-item-hidden{opacity:.62}:host ::ng-deep .ax-legend-color{width:.625rem;height:.625rem;flex-shrink:0;border-radius:9999px;box-shadow:0 0 0 1px rgb(var(--ax-legend-text))}@supports (color: color-mix(in lab,red,red)){:host ::ng-deep .ax-legend-color{box-shadow:0 0 0 1px color-mix(in srgb,rgb(var(--ax-legend-text)) 18%,transparent)}}:host ::ng-deep .ax-legend-name{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);max-width:9rem;overflow:hidden;text-overflow:ellipsis}:host ::ng-deep .ax-legend-value{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,);margin-inline-start:0;opacity:1;color:rgb(var(--ax-sys-color-on-lightest-surface))}:host ::ng-deep .ax-legend-percentage{margin-inline-start:0;border-radius:9999px;padding-inline:.4rem;padding-block:.125rem;font-size:.6875rem;line-height:1;font-weight:600;font-variant-numeric:tabular-nums;background-color:rgb(var(--ax-legend-text))}@supports (color: color-mix(in lab,red,red)){:host ::ng-deep .ax-legend-percentage{background-color:color-mix(in srgb,rgb(var(--ax-legend-text)) 12%,transparent)}}:host ::ng-deep ax-donut-chart,:host ::ng-deep ax-gauge-chart,:host ::ng-deep ax-bar-chart,:host ::ng-deep ax-line-chart,:host ::ng-deep ax-funnel-chart{display:block!important;width:100%!important;height:100%!important;min-height:0!important;max-height:100%!important}:host ::ng-deep .axp-chart-widget-host__chart--heatmap ax-heatmap-chart{display:block!important;width:100%!important;max-width:100%!important;height:auto!important;min-height:0!important;max-height:none!important;overflow:visible!important}:host ::ng-deep ax-donut-chart .ax-donut-chart,:host ::ng-deep ax-gauge-chart .ax-gauge-chart,:host ::ng-deep ax-bar-chart .ax-bar-chart,:host ::ng-deep ax-line-chart .ax-line-chart,:host ::ng-deep ax-funnel-chart .ax-funnel-chart-container{min-height:0!important;height:100%!important;width:100%!important;padding:.25rem!important}:host ::ng-deep .axp-chart-widget-host__chart--heatmap ax-heatmap-chart .ax-heatmap-chart-container,:host ::ng-deep .axp-chart-widget-host__chart--heatmap .ax-heatmap-chart{min-height:0!important;height:auto!important;width:100%!important;max-width:100%!important;padding:.25rem!important;overflow:visible!important}:host ::ng-deep .axp-chart-widget-host__chart--heatmap svg{display:block;width:100%!important;max-width:100%!important;height:auto!important;overflow:visible!important}:host:has(.ax-chart-empty){block-size:100%;overflow:hidden}.axp-chart-widget-host:has(.ax-chart-empty){block-size:100%;overflow:hidden}.axp-chart-widget-host__body:has(.ax-chart-empty){flex:1 1 auto;min-block-size:0;overflow:hidden}.axp-chart-widget-host__chart--heatmap:has(.ax-chart-empty){flex:1 1 auto;block-size:100%;min-block-size:16rem!important;overflow:hidden}:host ::ng-deep .axp-chart-widget-host__chart--heatmap:has(.ax-chart-empty) ax-heatmap-chart,:host ::ng-deep .axp-chart-widget-host__chart--heatmap:has(.ax-chart-empty) ax-heatmap-chart .ax-heatmap-chart-container{display:block!important;width:100%!important;max-width:100%!important;height:100%!important;min-height:16rem!important;max-height:none!important;overflow:hidden!important}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-ordinal{syntax: \"*\"; inherits: false;}@property --tw-slashed-zero{syntax: \"*\"; inherits: false;}@property --tw-numeric-figure{syntax: \"*\"; inherits: false;}@property --tw-numeric-spacing{syntax: \"*\"; inherits: false;}@property --tw-numeric-fraction{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-font-weight: initial;--tw-ordinal: initial;--tw-slashed-zero: initial;--tw-numeric-figure: initial;--tw-numeric-spacing: initial;--tw-numeric-fraction: initial}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"] }]
|
|
135
|
+
}], ctorParameters: () => [] });
|
|
136
|
+
|
|
137
|
+
export { AXPGaugeChartWidgetViewComponent };
|
|
138
|
+
//# sourceMappingURL=acorex-platform-module-dashboard-management-client-gauge-chart-widget.component-Ci1cRFmt.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-dashboard-management-client-gauge-chart-widget.component-Ci1cRFmt.mjs","sources":["../../../../libs/modules/dashboard-management/client/src/lib/features/shared/widgets/chart/gauge-chart/gauge-chart-widget.component.ts","../../../../libs/modules/dashboard-management/client/src/lib/features/shared/widgets/chart/gauge-chart/gauge-chart-widget.component.html"],"sourcesContent":["import { AXGaugeChartComponent, AXGaugeChartOption } from '@acorex/charts/gauge-chart';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { AXPMultiLanguageString } from '@acorex-platform/framework-shared/core';\nimport { AXPQueryExecutor } from '@acorex-platform/framework-client/runtime';\nimport { ChangeDetectionStrategy, Component, computed, effect, inject, signal } from '@angular/core';\nimport { AXPDashboardWidgetComponent } from '../../dashboard-widget-base';\nimport { resolveChartQueryTabs } from '../chart-query-load.util';\nimport { loadGaugeChartValue } from '../chart-widget-data.util';\nimport { omitChartFixedSize } from '../chart-legend.util';\nimport { AXPChartQueryTabsComponent } from '../chart-query-tabs.component';\n\n/**\n * Gauge Chart Widget Component\n * Renders a semi-circular gauge chart with animated needle and thresholds\n */\n@Component({\n templateUrl: './gauge-chart-widget.component.html',\n styleUrls: ['./gauge-chart-widget.component.css'],\n imports: [AXGaugeChartComponent, AXPChartQueryTabsComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AXPGaugeChartWidgetViewComponent extends AXPDashboardWidgetComponent {\n //#region ----- Services & Dependencies -----\n\n private readonly queryExecutor = inject(AXPQueryExecutor);\n private readonly translationService = inject(AXTranslationService);\n\n //#endregion\n\n //#region ----- Chart state -----\n\n protected value = signal<number>(0);\n\n /** Options with resolved title, label, and threshold labels for the chart SVG/layer. */\n protected gaugeChartOptions = signal<AXGaugeChartOption & { title?: string }>(\n {} as AXGaugeChartOption & { title?: string },\n );\n\n private labelResolveGeneration = 0;\n\n //#endregion\n\n //#region ----- Localization -----\n\n private async resolveChartOptionLabel(value: unknown): Promise<string> {\n if (value != null && typeof value === 'object' && !Array.isArray(value)) {\n return this.translationService.resolve(value as AXPMultiLanguageString);\n }\n const s = String(value ?? '');\n if (s.startsWith('@')) {\n return this.translationService.translateAsync(s);\n }\n return s;\n }\n\n private readonly resolveGaugeOptionsEffect = effect(() => {\n const raw = this.options() as Record<string, unknown>;\n const generation = ++this.labelResolveGeneration;\n const thresholdSource = raw['thresholds'];\n void (async () => {\n const [title, label] = await Promise.all([\n this.resolveChartOptionLabel(raw['title']),\n this.resolveChartOptionLabel(raw['label']),\n ]);\n let thresholds: AXGaugeChartOption['thresholds'];\n if (Array.isArray(thresholdSource)) {\n thresholds = await Promise.all(\n thresholdSource.map(async (t) => {\n const entry = t as Record<string, unknown>;\n const labelRaw = entry['label'];\n return {\n value: entry['value'] as number,\n color: String(entry['color'] ?? ''),\n ...(labelRaw != null && labelRaw !== '' ? { label: await this.resolveChartOptionLabel(labelRaw) } : {}),\n };\n }),\n );\n }\n if (generation !== this.labelResolveGeneration) {\n return;\n }\n const base = omitChartFixedSize(raw) as unknown as AXGaugeChartOption & { title?: string };\n this.gaugeChartOptions.set({\n ...base,\n title,\n label,\n showValue: base.showValue !== false,\n showDataLabels: base.showDataLabels !== false,\n ...(thresholds ? { thresholds } : {}),\n });\n })();\n });\n\n //#endregion\n\n //#region ----- Query tabs -----\n\n protected readonly queryTabs = computed(() =>\n resolveChartQueryTabs(this.options() as Record<string, unknown>, this.entityContext()?.entityId),\n );\n\n protected readonly activeTabIndex = signal(0);\n\n private readonly activeQuery = computed(() => {\n const tabs = this.queryTabs();\n if (tabs.length === 0) {\n return undefined;\n }\n const index = Math.min(Math.max(this.activeTabIndex(), 0), tabs.length - 1);\n return tabs[index];\n });\n\n protected selectQueryTab(index: number): void {\n this.activeTabIndex.set(index);\n }\n\n private readonly clampTabIndexEffect = effect(() => {\n const tabs = this.queryTabs();\n if (this.activeTabIndex() >= tabs.length) {\n this.activeTabIndex.set(0);\n }\n });\n\n //#endregion\n\n //#region ----- Query loading -----\n\n private readonly dataLoadEffect = effect(async () => {\n const opts = this.options() as Record<string, unknown>;\n const active = this.activeQuery();\n const value = await loadGaugeChartValue(opts, {\n queryExecutor: this.queryExecutor,\n queryKey: active?.query,\n queryInput: active?.queryInput,\n });\n this.value.set(value);\n });\n\n //#endregion\n\n constructor() {\n super();\n this.setOptions({\n minValue: 0,\n maxValue: 100,\n showTooltip: true,\n showValue: true,\n showDataLabels: true,\n gaugeWidth: 18,\n cornerRadius: 4,\n animationEasing: 'cubic-out',\n animationDuration: 800,\n ...omitChartFixedSize(this.options() as Record<string, unknown>),\n });\n this.gaugeChartOptions.set(\n omitChartFixedSize(this.options() as Record<string, unknown>) as unknown as AXGaugeChartOption & {\n title?: string;\n },\n );\n }\n}\n","<div class=\"axp-chart-widget-host\">\n <axp-chart-query-tabs\n [tabs]=\"queryTabs()\"\n [activeIndex]=\"activeTabIndex()\"\n (activeIndexChange)=\"selectQueryTab($event)\"\n />\n <div class=\"axp-chart-widget-host__body\">\n <div class=\"axp-chart-widget-host__chart axp-chart-widget-host__chart--radial\">\n <ax-gauge-chart [value]=\"value()\" [options]=\"gaugeChartOptions()\"></ax-gauge-chart>\n </div>\n </div>\n</div>\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { AXHeatmapChartComponent } from '@acorex/charts/heatmap-chart';
|
|
2
|
+
import { AXTranslationService } from '@acorex/core/translation';
|
|
3
|
+
import { AXPQueryExecutor } from '@acorex-platform/framework-client/runtime';
|
|
4
|
+
import * as i0 from '@angular/core';
|
|
5
|
+
import { inject, signal, computed, effect, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
6
|
+
import { e as AXPDashboardWidgetComponent, f as resolveChartQueryTabs, g as AXPChartQueryTabsComponent } from './acorex-platform-module-dashboard-management-client-acorex-platform-module-dashboard-management-client-61Q_QY8l.mjs';
|
|
7
|
+
import { r as resolveChartAxisLabels, d as loadHeatmapChartItems } from './acorex-platform-module-dashboard-management-client-chart-widget-data.util-BLtv9sOm.mjs';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Heatmap Chart Widget Component
|
|
11
|
+
* Displays matrix-like data with color intensity based on value.
|
|
12
|
+
*/
|
|
13
|
+
class AXPHeatmapChartWidgetViewComponent extends AXPDashboardWidgetComponent {
|
|
14
|
+
selectQueryTab(index) {
|
|
15
|
+
this.activeTabIndex.set(index);
|
|
16
|
+
}
|
|
17
|
+
//#endregion
|
|
18
|
+
//#region ----- Localization -----
|
|
19
|
+
async resolveChartText(value) {
|
|
20
|
+
if (value == null) {
|
|
21
|
+
return '';
|
|
22
|
+
}
|
|
23
|
+
if (typeof value === 'string') {
|
|
24
|
+
return value.startsWith('@') ? this.translationService.translateAsync(value) : value;
|
|
25
|
+
}
|
|
26
|
+
if (typeof value === 'object' &&
|
|
27
|
+
!Array.isArray(value) &&
|
|
28
|
+
this.translationService.isValidMultiLanguageObject(value)) {
|
|
29
|
+
return this.translationService.resolve(value);
|
|
30
|
+
}
|
|
31
|
+
return String(value);
|
|
32
|
+
}
|
|
33
|
+
//#endregion
|
|
34
|
+
constructor() {
|
|
35
|
+
super();
|
|
36
|
+
//#region ----- Services & Dependencies -----
|
|
37
|
+
this.queryExecutor = inject(AXPQueryExecutor);
|
|
38
|
+
this.translationService = inject(AXTranslationService);
|
|
39
|
+
//#endregion
|
|
40
|
+
//#region ----- Chart state -----
|
|
41
|
+
this.data = signal([], /* @ts-ignore */
|
|
42
|
+
...(ngDevMode ? [{ debugName: "data" }] : /* istanbul ignore next */ []));
|
|
43
|
+
/** Options passed to the chart with resolved string labels (multi-language and @i18n keys). */
|
|
44
|
+
this.heatmapOptions = signal({}, /* @ts-ignore */
|
|
45
|
+
...(ngDevMode ? [{ debugName: "heatmapOptions" }] : /* istanbul ignore next */ []));
|
|
46
|
+
this.labelResolveGeneration = 0;
|
|
47
|
+
//#endregion
|
|
48
|
+
//#region ----- Query tabs -----
|
|
49
|
+
this.queryTabs = computed(() => resolveChartQueryTabs(this.options(), this.entityContext()?.entityId), /* @ts-ignore */
|
|
50
|
+
...(ngDevMode ? [{ debugName: "queryTabs" }] : /* istanbul ignore next */ []));
|
|
51
|
+
this.activeTabIndex = signal(0, /* @ts-ignore */
|
|
52
|
+
...(ngDevMode ? [{ debugName: "activeTabIndex" }] : /* istanbul ignore next */ []));
|
|
53
|
+
this.activeQuery = computed(() => {
|
|
54
|
+
const tabs = this.queryTabs();
|
|
55
|
+
if (tabs.length === 0) {
|
|
56
|
+
return undefined;
|
|
57
|
+
}
|
|
58
|
+
const index = Math.min(Math.max(this.activeTabIndex(), 0), tabs.length - 1);
|
|
59
|
+
return tabs[index];
|
|
60
|
+
}, /* @ts-ignore */
|
|
61
|
+
...(ngDevMode ? [{ debugName: "activeQuery" }] : /* istanbul ignore next */ []));
|
|
62
|
+
this.resolveOptionLabelsEffect = effect(() => {
|
|
63
|
+
const raw = this.options();
|
|
64
|
+
const generation = ++this.labelResolveGeneration;
|
|
65
|
+
void (async () => {
|
|
66
|
+
const axisLabels = resolveChartAxisLabels(raw);
|
|
67
|
+
const [xAxisLabel, yAxisLabel] = await Promise.all([
|
|
68
|
+
this.resolveChartText(axisLabels.xAxisLabel),
|
|
69
|
+
this.resolveChartText(axisLabels.yAxisLabel),
|
|
70
|
+
]);
|
|
71
|
+
const messagesRaw = raw['messages'];
|
|
72
|
+
const messages = messagesRaw && typeof messagesRaw === 'object' && !Array.isArray(messagesRaw)
|
|
73
|
+
? messagesRaw
|
|
74
|
+
: undefined;
|
|
75
|
+
const [noData, noDataHelp] = await Promise.all([
|
|
76
|
+
this.resolveChartText(messages?.['noData']),
|
|
77
|
+
this.resolveChartText(messages?.['noDataHelp']),
|
|
78
|
+
]);
|
|
79
|
+
if (generation !== this.labelResolveGeneration) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const base = raw;
|
|
83
|
+
this.heatmapOptions.set({
|
|
84
|
+
...base,
|
|
85
|
+
xAxisLabel,
|
|
86
|
+
yAxisLabel,
|
|
87
|
+
...(messages
|
|
88
|
+
? {
|
|
89
|
+
messages: {
|
|
90
|
+
...base.messages,
|
|
91
|
+
...(noData ? { noData } : {}),
|
|
92
|
+
...(noDataHelp ? { noDataHelp } : {}),
|
|
93
|
+
...(messages['noDataIcon'] ? { noDataIcon: String(messages['noDataIcon']) } : {}),
|
|
94
|
+
},
|
|
95
|
+
}
|
|
96
|
+
: {}),
|
|
97
|
+
});
|
|
98
|
+
})();
|
|
99
|
+
}, /* @ts-ignore */
|
|
100
|
+
...(ngDevMode ? [{ debugName: "resolveOptionLabelsEffect" }] : /* istanbul ignore next */ []));
|
|
101
|
+
//#endregion
|
|
102
|
+
//#region ----- Query loading -----
|
|
103
|
+
this.clampTabIndexEffect = effect(() => {
|
|
104
|
+
const tabs = this.queryTabs();
|
|
105
|
+
if (this.activeTabIndex() >= tabs.length) {
|
|
106
|
+
this.activeTabIndex.set(0);
|
|
107
|
+
}
|
|
108
|
+
}, /* @ts-ignore */
|
|
109
|
+
...(ngDevMode ? [{ debugName: "clampTabIndexEffect" }] : /* istanbul ignore next */ []));
|
|
110
|
+
this.dataLoadEffect = effect(async () => {
|
|
111
|
+
const opts = this.options();
|
|
112
|
+
const active = this.activeQuery();
|
|
113
|
+
const items = await loadHeatmapChartItems(opts, {
|
|
114
|
+
queryExecutor: this.queryExecutor,
|
|
115
|
+
queryKey: active?.query,
|
|
116
|
+
queryInput: active?.queryInput,
|
|
117
|
+
});
|
|
118
|
+
const resolved = await Promise.all(items.map(async (item) => {
|
|
119
|
+
const x = item.x;
|
|
120
|
+
const y = item.y;
|
|
121
|
+
const label = item.label;
|
|
122
|
+
return {
|
|
123
|
+
...item,
|
|
124
|
+
x: typeof x === 'number' ? x : await this.resolveChartText(x),
|
|
125
|
+
y: typeof y === 'number' ? y : await this.resolveChartText(y),
|
|
126
|
+
...(label !== undefined ? { label: await this.resolveChartText(label) } : {}),
|
|
127
|
+
};
|
|
128
|
+
}));
|
|
129
|
+
this.data.set(resolved);
|
|
130
|
+
}, /* @ts-ignore */
|
|
131
|
+
...(ngDevMode ? [{ debugName: "dataLoadEffect" }] : /* istanbul ignore next */ []));
|
|
132
|
+
this.setOptions({
|
|
133
|
+
showXAxis: true,
|
|
134
|
+
showYAxis: true,
|
|
135
|
+
showTooltip: true,
|
|
136
|
+
cellPadding: 0.05,
|
|
137
|
+
borderRadius: 2,
|
|
138
|
+
color: 'rgb(var(--ax-sys-color-primary-500))',
|
|
139
|
+
animationEasing: 'cubic-out',
|
|
140
|
+
animationDuration: 800,
|
|
141
|
+
...this.options(),
|
|
142
|
+
});
|
|
143
|
+
this.heatmapOptions.set(this.options());
|
|
144
|
+
}
|
|
145
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPHeatmapChartWidgetViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
146
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.8", type: AXPHeatmapChartWidgetViewComponent, isStandalone: true, selector: "ng-component", usesInheritance: true, ngImport: i0, template: "<div class=\"axp-chart-widget-host\">\n <axp-chart-query-tabs\n [tabs]=\"queryTabs()\"\n [activeIndex]=\"activeTabIndex()\"\n (activeIndexChange)=\"selectQueryTab($event)\"\n />\n <div class=\"axp-chart-widget-host__body\">\n <div class=\"axp-chart-widget-host__chart axp-chart-widget-host__chart--heatmap\">\n <ax-heatmap-chart [data]=\"data()\" [options]=\"heatmapOptions()\"></ax-heatmap-chart>\n </div>\n </div>\n</div>\n", styles: ["@layer properties;:host{display:block;width:100%;height:100%;min-height:0px;overflow:hidden}:host:has(.axp-chart-widget-host__chart--heatmap){block-size:auto;overflow:visible;min-block-size:0}.axp-chart-widget-host{display:flex;height:100%;min-height:0px;width:100%;flex-direction:column;gap:var(--spacing, .25rem)}.axp-chart-widget-host:has(.axp-chart-widget-host__chart--heatmap){block-size:auto;min-block-size:0;overflow:visible}.axp-chart-widget-host__body{display:flex;min-height:0px;flex:1;flex-direction:column;gap:var(--spacing, .25rem);padding-bottom:calc(var(--spacing, .25rem) * 2)}.axp-chart-widget-host__body:not(.axp-chart-widget-host__body--with-legend)>.axp-chart-widget-host__chart--radial{flex:1 1 auto}.axp-chart-widget-host__body--with-legend{min-height:0px;flex:1;gap:var(--spacing, .25rem);display:grid;grid-template-rows:minmax(0,1fr) auto}.axp-chart-widget-host__chart{position:relative;min-height:calc(var(--spacing, .25rem) * 64);width:100%;overflow:hidden;grid-row:1}.axp-chart-widget-host__chart--radial{position:relative;margin-inline:auto;align-self:center;justify-self:center;overflow:hidden;grid-row:1;flex:0 0 auto;height:auto;width:min(100%,18rem);max-width:100%;min-height:12rem;min-width:8rem;aspect-ratio:1 / 1}.axp-chart-widget-host__chart--funnel{position:relative;width:100%;overflow:hidden;block-size:20rem;flex:0 0 auto;max-block-size:24rem;min-block-size:16rem}.axp-chart-widget-host__chart--funnel ax-funnel-chart,.axp-chart-widget-host__chart--funnel .ax-funnel-chart-container{display:block;block-size:100%;inline-size:100%;min-block-size:0}.axp-chart-widget-host__body:has(.axp-chart-widget-host__chart--funnel){flex:none}.axp-chart-widget-host__chart--heatmap{position:relative;width:100%;max-width:100%;inline-size:100%;block-size:auto;flex:0 0 auto;overflow:visible;min-height:0!important;min-block-size:0!important;max-block-size:none}.axp-chart-widget-host__chart--heatmap ax-heatmap-chart,.axp-chart-widget-host__chart--heatmap .ax-heatmap-chart-container{display:block;inline-size:100%;max-inline-size:100%;block-size:auto;min-block-size:0;overflow:visible}.axp-chart-widget-host__body:has(.axp-chart-widget-host__chart--heatmap){flex:none;block-size:auto;min-block-size:0;overflow:visible}.axp-chart-widget-host__legend{width:100%;flex:none;grid-row:2;min-height:0;min-width:0;max-width:100%;display:flex;justify-content:flex-start;overflow-x:auto;overflow-y:hidden;scrollbar-width:thin;scrollbar-color:rgb(var(--ax-sys-color-border-lighter-surface)) transparent}:host ::ng-deep ax-chart-legend{display:block!important;height:auto!important;max-height:none;width:max-content;min-width:100%;max-width:none}:host ::ng-deep .ax-chart-legend{--ax-legend-bg: var(--ax-sys-color-lighter-surface);--ax-legend-text: var(--ax-sys-color-on-lighter-surface);--ax-legend-border: var(--ax-sys-color-border-lighter-surface);--ax-legend-radius: .625rem;--ax-legend-padding: .375rem .5rem;--ax-legend-gap: .375rem;--ax-legend-item-height: auto;height:auto;max-height:none;width:100%;overflow:visible;padding:var(--ax-legend-padding);gap:var(--ax-legend-gap);color:rgb(var(--ax-legend-text))}:host ::ng-deep .ax-chart-legend.ax-legend-horizontal{flex-direction:row;flex-wrap:nowrap;align-items:center;justify-content:flex-start;width:max-content;min-width:100%;max-width:none;overflow:visible;border:none;background:transparent;background-color:transparent;padding:.125rem .75rem .7rem;gap:.5rem}:host ::ng-deep .ax-legend-item{align-items:center;flex-shrink:0;gap:.375rem;height:auto;min-height:1.5rem;padding-block:.2rem;padding-inline:.5rem;border-radius:9999px;border:1px solid rgb(var(--ax-sys-color-border-lightest-surface));background-color:rgb(var(--ax-sys-color-lightest-surface));white-space:nowrap;transition:background-color .15s ease,border-color .15s ease,box-shadow .15s ease,opacity .15s ease,transform .15s ease}:host ::ng-deep .ax-legend-item:hover{border-color:rgb(var(--ax-sys-color-primary-500));background-color:rgb(var(--ax-sys-color-primary-500));box-shadow:0 1px 2px #0f172a0f}@supports (color: color-mix(in lab,red,red)){:host ::ng-deep .ax-legend-item:hover{border-color:color-mix(in srgb,rgb(var(--ax-sys-color-primary-500)) 35%,rgb(var(--ax-sys-color-border-lightest-surface)))}}@supports (color: color-mix(in lab,red,red)){:host ::ng-deep .ax-legend-item:hover{background-color:color-mix(in srgb,rgb(var(--ax-sys-color-primary-500)) 6%,rgb(var(--ax-sys-color-lightest-surface)))}}:host ::ng-deep .ax-legend-item:active{transform:scale(.98)}:host ::ng-deep .ax-legend-item.ax-legend-item-hidden{opacity:.62}:host ::ng-deep .ax-legend-color{width:.625rem;height:.625rem;flex-shrink:0;border-radius:9999px;box-shadow:0 0 0 1px rgb(var(--ax-legend-text))}@supports (color: color-mix(in lab,red,red)){:host ::ng-deep .ax-legend-color{box-shadow:0 0 0 1px color-mix(in srgb,rgb(var(--ax-legend-text)) 18%,transparent)}}:host ::ng-deep .ax-legend-name{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);max-width:9rem;overflow:hidden;text-overflow:ellipsis}:host ::ng-deep .ax-legend-value{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,);margin-inline-start:0;opacity:1;color:rgb(var(--ax-sys-color-on-lightest-surface))}:host ::ng-deep .ax-legend-percentage{margin-inline-start:0;border-radius:9999px;padding-inline:.4rem;padding-block:.125rem;font-size:.6875rem;line-height:1;font-weight:600;font-variant-numeric:tabular-nums;background-color:rgb(var(--ax-legend-text))}@supports (color: color-mix(in lab,red,red)){:host ::ng-deep .ax-legend-percentage{background-color:color-mix(in srgb,rgb(var(--ax-legend-text)) 12%,transparent)}}:host ::ng-deep ax-donut-chart,:host ::ng-deep ax-gauge-chart,:host ::ng-deep ax-bar-chart,:host ::ng-deep ax-line-chart,:host ::ng-deep ax-funnel-chart{display:block!important;width:100%!important;height:100%!important;min-height:0!important;max-height:100%!important}:host ::ng-deep .axp-chart-widget-host__chart--heatmap ax-heatmap-chart{display:block!important;width:100%!important;max-width:100%!important;height:auto!important;min-height:0!important;max-height:none!important;overflow:visible!important}:host ::ng-deep ax-donut-chart .ax-donut-chart,:host ::ng-deep ax-gauge-chart .ax-gauge-chart,:host ::ng-deep ax-bar-chart .ax-bar-chart,:host ::ng-deep ax-line-chart .ax-line-chart,:host ::ng-deep ax-funnel-chart .ax-funnel-chart-container{min-height:0!important;height:100%!important;width:100%!important;padding:.25rem!important}:host ::ng-deep .axp-chart-widget-host__chart--heatmap ax-heatmap-chart .ax-heatmap-chart-container,:host ::ng-deep .axp-chart-widget-host__chart--heatmap .ax-heatmap-chart{min-height:0!important;height:auto!important;width:100%!important;max-width:100%!important;padding:.25rem!important;overflow:visible!important}:host ::ng-deep .axp-chart-widget-host__chart--heatmap svg{display:block;width:100%!important;max-width:100%!important;height:auto!important;overflow:visible!important}:host:has(.ax-chart-empty){block-size:100%;overflow:hidden}.axp-chart-widget-host:has(.ax-chart-empty){block-size:100%;overflow:hidden}.axp-chart-widget-host__body:has(.ax-chart-empty){flex:1 1 auto;min-block-size:0;overflow:hidden}.axp-chart-widget-host__chart--heatmap:has(.ax-chart-empty){flex:1 1 auto;block-size:100%;min-block-size:16rem!important;overflow:hidden}:host ::ng-deep .axp-chart-widget-host__chart--heatmap:has(.ax-chart-empty) ax-heatmap-chart,:host ::ng-deep .axp-chart-widget-host__chart--heatmap:has(.ax-chart-empty) ax-heatmap-chart .ax-heatmap-chart-container{display:block!important;width:100%!important;max-width:100%!important;height:100%!important;min-height:16rem!important;max-height:none!important;overflow:hidden!important}:host{display:block;width:100%;block-size:auto;min-height:0;overflow:visible}:host .axp-chart-widget-host{width:100%;block-size:auto;min-height:0;overflow:visible}:host ax-heatmap-chart{display:block;min-height:0px;width:100%;max-width:100%;block-size:auto;overflow:visible}:host:has(.ax-chart-empty){block-size:100%;flex:1 1 auto;min-block-size:16rem;overflow:hidden}:host:has(.ax-chart-empty) .axp-chart-widget-host{block-size:100%;overflow:hidden}:host:has(.ax-chart-empty) ax-heatmap-chart,:host:has(.ax-chart-empty) .ax-heatmap-chart-container{block-size:100%;overflow:hidden}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-ordinal{syntax: \"*\"; inherits: false;}@property --tw-slashed-zero{syntax: \"*\"; inherits: false;}@property --tw-numeric-figure{syntax: \"*\"; inherits: false;}@property --tw-numeric-spacing{syntax: \"*\"; inherits: false;}@property --tw-numeric-fraction{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-font-weight: initial;--tw-ordinal: initial;--tw-slashed-zero: initial;--tw-numeric-figure: initial;--tw-numeric-spacing: initial;--tw-numeric-fraction: initial}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "component", type: AXHeatmapChartComponent, selector: "ax-heatmap-chart", inputs: ["data", "options"], outputs: ["cellClick"] }, { kind: "component", type: AXPChartQueryTabsComponent, selector: "axp-chart-query-tabs", inputs: ["tabs", "activeIndex"], outputs: ["activeIndexChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
147
|
+
}
|
|
148
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPHeatmapChartWidgetViewComponent, decorators: [{
|
|
149
|
+
type: Component,
|
|
150
|
+
args: [{ imports: [AXHeatmapChartComponent, AXPChartQueryTabsComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"axp-chart-widget-host\">\n <axp-chart-query-tabs\n [tabs]=\"queryTabs()\"\n [activeIndex]=\"activeTabIndex()\"\n (activeIndexChange)=\"selectQueryTab($event)\"\n />\n <div class=\"axp-chart-widget-host__body\">\n <div class=\"axp-chart-widget-host__chart axp-chart-widget-host__chart--heatmap\">\n <ax-heatmap-chart [data]=\"data()\" [options]=\"heatmapOptions()\"></ax-heatmap-chart>\n </div>\n </div>\n</div>\n", styles: ["@layer properties;:host{display:block;width:100%;height:100%;min-height:0px;overflow:hidden}:host:has(.axp-chart-widget-host__chart--heatmap){block-size:auto;overflow:visible;min-block-size:0}.axp-chart-widget-host{display:flex;height:100%;min-height:0px;width:100%;flex-direction:column;gap:var(--spacing, .25rem)}.axp-chart-widget-host:has(.axp-chart-widget-host__chart--heatmap){block-size:auto;min-block-size:0;overflow:visible}.axp-chart-widget-host__body{display:flex;min-height:0px;flex:1;flex-direction:column;gap:var(--spacing, .25rem);padding-bottom:calc(var(--spacing, .25rem) * 2)}.axp-chart-widget-host__body:not(.axp-chart-widget-host__body--with-legend)>.axp-chart-widget-host__chart--radial{flex:1 1 auto}.axp-chart-widget-host__body--with-legend{min-height:0px;flex:1;gap:var(--spacing, .25rem);display:grid;grid-template-rows:minmax(0,1fr) auto}.axp-chart-widget-host__chart{position:relative;min-height:calc(var(--spacing, .25rem) * 64);width:100%;overflow:hidden;grid-row:1}.axp-chart-widget-host__chart--radial{position:relative;margin-inline:auto;align-self:center;justify-self:center;overflow:hidden;grid-row:1;flex:0 0 auto;height:auto;width:min(100%,18rem);max-width:100%;min-height:12rem;min-width:8rem;aspect-ratio:1 / 1}.axp-chart-widget-host__chart--funnel{position:relative;width:100%;overflow:hidden;block-size:20rem;flex:0 0 auto;max-block-size:24rem;min-block-size:16rem}.axp-chart-widget-host__chart--funnel ax-funnel-chart,.axp-chart-widget-host__chart--funnel .ax-funnel-chart-container{display:block;block-size:100%;inline-size:100%;min-block-size:0}.axp-chart-widget-host__body:has(.axp-chart-widget-host__chart--funnel){flex:none}.axp-chart-widget-host__chart--heatmap{position:relative;width:100%;max-width:100%;inline-size:100%;block-size:auto;flex:0 0 auto;overflow:visible;min-height:0!important;min-block-size:0!important;max-block-size:none}.axp-chart-widget-host__chart--heatmap ax-heatmap-chart,.axp-chart-widget-host__chart--heatmap .ax-heatmap-chart-container{display:block;inline-size:100%;max-inline-size:100%;block-size:auto;min-block-size:0;overflow:visible}.axp-chart-widget-host__body:has(.axp-chart-widget-host__chart--heatmap){flex:none;block-size:auto;min-block-size:0;overflow:visible}.axp-chart-widget-host__legend{width:100%;flex:none;grid-row:2;min-height:0;min-width:0;max-width:100%;display:flex;justify-content:flex-start;overflow-x:auto;overflow-y:hidden;scrollbar-width:thin;scrollbar-color:rgb(var(--ax-sys-color-border-lighter-surface)) transparent}:host ::ng-deep ax-chart-legend{display:block!important;height:auto!important;max-height:none;width:max-content;min-width:100%;max-width:none}:host ::ng-deep .ax-chart-legend{--ax-legend-bg: var(--ax-sys-color-lighter-surface);--ax-legend-text: var(--ax-sys-color-on-lighter-surface);--ax-legend-border: var(--ax-sys-color-border-lighter-surface);--ax-legend-radius: .625rem;--ax-legend-padding: .375rem .5rem;--ax-legend-gap: .375rem;--ax-legend-item-height: auto;height:auto;max-height:none;width:100%;overflow:visible;padding:var(--ax-legend-padding);gap:var(--ax-legend-gap);color:rgb(var(--ax-legend-text))}:host ::ng-deep .ax-chart-legend.ax-legend-horizontal{flex-direction:row;flex-wrap:nowrap;align-items:center;justify-content:flex-start;width:max-content;min-width:100%;max-width:none;overflow:visible;border:none;background:transparent;background-color:transparent;padding:.125rem .75rem .7rem;gap:.5rem}:host ::ng-deep .ax-legend-item{align-items:center;flex-shrink:0;gap:.375rem;height:auto;min-height:1.5rem;padding-block:.2rem;padding-inline:.5rem;border-radius:9999px;border:1px solid rgb(var(--ax-sys-color-border-lightest-surface));background-color:rgb(var(--ax-sys-color-lightest-surface));white-space:nowrap;transition:background-color .15s ease,border-color .15s ease,box-shadow .15s ease,opacity .15s ease,transform .15s ease}:host ::ng-deep .ax-legend-item:hover{border-color:rgb(var(--ax-sys-color-primary-500));background-color:rgb(var(--ax-sys-color-primary-500));box-shadow:0 1px 2px #0f172a0f}@supports (color: color-mix(in lab,red,red)){:host ::ng-deep .ax-legend-item:hover{border-color:color-mix(in srgb,rgb(var(--ax-sys-color-primary-500)) 35%,rgb(var(--ax-sys-color-border-lightest-surface)))}}@supports (color: color-mix(in lab,red,red)){:host ::ng-deep .ax-legend-item:hover{background-color:color-mix(in srgb,rgb(var(--ax-sys-color-primary-500)) 6%,rgb(var(--ax-sys-color-lightest-surface)))}}:host ::ng-deep .ax-legend-item:active{transform:scale(.98)}:host ::ng-deep .ax-legend-item.ax-legend-item-hidden{opacity:.62}:host ::ng-deep .ax-legend-color{width:.625rem;height:.625rem;flex-shrink:0;border-radius:9999px;box-shadow:0 0 0 1px rgb(var(--ax-legend-text))}@supports (color: color-mix(in lab,red,red)){:host ::ng-deep .ax-legend-color{box-shadow:0 0 0 1px color-mix(in srgb,rgb(var(--ax-legend-text)) 18%,transparent)}}:host ::ng-deep .ax-legend-name{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500);max-width:9rem;overflow:hidden;text-overflow:ellipsis}:host ::ng-deep .ax-legend-value{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,);margin-inline-start:0;opacity:1;color:rgb(var(--ax-sys-color-on-lightest-surface))}:host ::ng-deep .ax-legend-percentage{margin-inline-start:0;border-radius:9999px;padding-inline:.4rem;padding-block:.125rem;font-size:.6875rem;line-height:1;font-weight:600;font-variant-numeric:tabular-nums;background-color:rgb(var(--ax-legend-text))}@supports (color: color-mix(in lab,red,red)){:host ::ng-deep .ax-legend-percentage{background-color:color-mix(in srgb,rgb(var(--ax-legend-text)) 12%,transparent)}}:host ::ng-deep ax-donut-chart,:host ::ng-deep ax-gauge-chart,:host ::ng-deep ax-bar-chart,:host ::ng-deep ax-line-chart,:host ::ng-deep ax-funnel-chart{display:block!important;width:100%!important;height:100%!important;min-height:0!important;max-height:100%!important}:host ::ng-deep .axp-chart-widget-host__chart--heatmap ax-heatmap-chart{display:block!important;width:100%!important;max-width:100%!important;height:auto!important;min-height:0!important;max-height:none!important;overflow:visible!important}:host ::ng-deep ax-donut-chart .ax-donut-chart,:host ::ng-deep ax-gauge-chart .ax-gauge-chart,:host ::ng-deep ax-bar-chart .ax-bar-chart,:host ::ng-deep ax-line-chart .ax-line-chart,:host ::ng-deep ax-funnel-chart .ax-funnel-chart-container{min-height:0!important;height:100%!important;width:100%!important;padding:.25rem!important}:host ::ng-deep .axp-chart-widget-host__chart--heatmap ax-heatmap-chart .ax-heatmap-chart-container,:host ::ng-deep .axp-chart-widget-host__chart--heatmap .ax-heatmap-chart{min-height:0!important;height:auto!important;width:100%!important;max-width:100%!important;padding:.25rem!important;overflow:visible!important}:host ::ng-deep .axp-chart-widget-host__chart--heatmap svg{display:block;width:100%!important;max-width:100%!important;height:auto!important;overflow:visible!important}:host:has(.ax-chart-empty){block-size:100%;overflow:hidden}.axp-chart-widget-host:has(.ax-chart-empty){block-size:100%;overflow:hidden}.axp-chart-widget-host__body:has(.ax-chart-empty){flex:1 1 auto;min-block-size:0;overflow:hidden}.axp-chart-widget-host__chart--heatmap:has(.ax-chart-empty){flex:1 1 auto;block-size:100%;min-block-size:16rem!important;overflow:hidden}:host ::ng-deep .axp-chart-widget-host__chart--heatmap:has(.ax-chart-empty) ax-heatmap-chart,:host ::ng-deep .axp-chart-widget-host__chart--heatmap:has(.ax-chart-empty) ax-heatmap-chart .ax-heatmap-chart-container{display:block!important;width:100%!important;max-width:100%!important;height:100%!important;min-height:16rem!important;max-height:none!important;overflow:hidden!important}:host{display:block;width:100%;block-size:auto;min-height:0;overflow:visible}:host .axp-chart-widget-host{width:100%;block-size:auto;min-height:0;overflow:visible}:host ax-heatmap-chart{display:block;min-height:0px;width:100%;max-width:100%;block-size:auto;overflow:visible}:host:has(.ax-chart-empty){block-size:100%;flex:1 1 auto;min-block-size:16rem;overflow:hidden}:host:has(.ax-chart-empty) .axp-chart-widget-host{block-size:100%;overflow:hidden}:host:has(.ax-chart-empty) ax-heatmap-chart,:host:has(.ax-chart-empty) .ax-heatmap-chart-container{block-size:100%;overflow:hidden}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-ordinal{syntax: \"*\"; inherits: false;}@property --tw-slashed-zero{syntax: \"*\"; inherits: false;}@property --tw-numeric-figure{syntax: \"*\"; inherits: false;}@property --tw-numeric-spacing{syntax: \"*\"; inherits: false;}@property --tw-numeric-fraction{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-font-weight: initial;--tw-ordinal: initial;--tw-slashed-zero: initial;--tw-numeric-figure: initial;--tw-numeric-spacing: initial;--tw-numeric-fraction: initial}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"] }]
|
|
151
|
+
}], ctorParameters: () => [] });
|
|
152
|
+
|
|
153
|
+
export { AXPHeatmapChartWidgetViewComponent };
|
|
154
|
+
//# sourceMappingURL=acorex-platform-module-dashboard-management-client-heatmap-chart-widget.component-CzJTc6rm.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-dashboard-management-client-heatmap-chart-widget.component-CzJTc6rm.mjs","sources":["../../../../libs/modules/dashboard-management/client/src/lib/features/shared/widgets/chart/heatmap-chart/heatmap-chart-widget.component.ts","../../../../libs/modules/dashboard-management/client/src/lib/features/shared/widgets/chart/heatmap-chart/heatmap-chart-widget.component.html"],"sourcesContent":["import { AXHeatmapChartComponent, AXHeatmapChartOption, AXHeatmapData } from '@acorex/charts/heatmap-chart';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { AXPMultiLanguageString } from '@acorex-platform/framework-shared/core';\nimport { AXPQueryExecutor } from '@acorex-platform/framework-client/runtime';\nimport { ChangeDetectionStrategy, Component, computed, effect, inject, signal } from '@angular/core';\nimport { AXPDashboardWidgetComponent } from '../../dashboard-widget-base';\nimport { resolveChartQueryTabs } from '../chart-query-load.util';\nimport { loadHeatmapChartItems, resolveChartAxisLabels } from '../chart-widget-data.util';\nimport { AXPChartQueryTabsComponent } from '../chart-query-tabs.component';\n\n/**\n * Heatmap Chart Widget Component\n * Displays matrix-like data with color intensity based on value.\n */\n@Component({\n templateUrl: './heatmap-chart-widget.component.html',\n styleUrls: ['./heatmap-chart-widget.component.css'],\n imports: [AXHeatmapChartComponent, AXPChartQueryTabsComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AXPHeatmapChartWidgetViewComponent extends AXPDashboardWidgetComponent {\n //#region ----- Services & Dependencies -----\n\n private readonly queryExecutor = inject(AXPQueryExecutor);\n private readonly translationService = inject(AXTranslationService);\n\n //#endregion\n\n //#region ----- Chart state -----\n\n protected data = signal<AXHeatmapData[]>([]);\n\n /** Options passed to the chart with resolved string labels (multi-language and @i18n keys). */\n protected heatmapOptions = signal<AXHeatmapChartOption>({} as AXHeatmapChartOption);\n\n private labelResolveGeneration = 0;\n\n //#endregion\n\n //#region ----- Query tabs -----\n\n protected readonly queryTabs = computed(() =>\n resolveChartQueryTabs(this.options() as Record<string, unknown>, this.entityContext()?.entityId),\n );\n\n protected readonly activeTabIndex = signal(0);\n\n private readonly activeQuery = computed(() => {\n const tabs = this.queryTabs();\n if (tabs.length === 0) {\n return undefined;\n }\n const index = Math.min(Math.max(this.activeTabIndex(), 0), tabs.length - 1);\n return tabs[index];\n });\n\n protected selectQueryTab(index: number): void {\n this.activeTabIndex.set(index);\n }\n\n //#endregion\n\n //#region ----- Localization -----\n\n private async resolveChartText(value: unknown): Promise<string> {\n if (value == null) {\n return '';\n }\n if (typeof value === 'string') {\n return value.startsWith('@') ? this.translationService.translateAsync(value) : value;\n }\n if (\n typeof value === 'object' &&\n !Array.isArray(value) &&\n this.translationService.isValidMultiLanguageObject(value)\n ) {\n return this.translationService.resolve(value as AXPMultiLanguageString);\n }\n return String(value);\n }\n\n private readonly resolveOptionLabelsEffect = effect(() => {\n const raw = this.options() as Record<string, unknown>;\n const generation = ++this.labelResolveGeneration;\n\n void (async () => {\n const axisLabels = resolveChartAxisLabels(raw);\n const [xAxisLabel, yAxisLabel] = await Promise.all([\n this.resolveChartText(axisLabels.xAxisLabel),\n this.resolveChartText(axisLabels.yAxisLabel),\n ]);\n\n const messagesRaw = raw['messages'];\n const messages =\n messagesRaw && typeof messagesRaw === 'object' && !Array.isArray(messagesRaw)\n ? (messagesRaw as Record<string, unknown>)\n : undefined;\n\n const [noData, noDataHelp] = await Promise.all([\n this.resolveChartText(messages?.['noData']),\n this.resolveChartText(messages?.['noDataHelp']),\n ]);\n\n if (generation !== this.labelResolveGeneration) {\n return;\n }\n\n const base = raw as unknown as AXHeatmapChartOption;\n this.heatmapOptions.set({\n ...base,\n xAxisLabel,\n yAxisLabel,\n ...(messages\n ? {\n messages: {\n ...base.messages,\n ...(noData ? { noData } : {}),\n ...(noDataHelp ? { noDataHelp } : {}),\n ...(messages['noDataIcon'] ? { noDataIcon: String(messages['noDataIcon']) } : {}),\n },\n }\n : {}),\n });\n })();\n });\n\n //#endregion\n\n //#region ----- Query loading -----\n\n private readonly clampTabIndexEffect = effect(() => {\n const tabs = this.queryTabs();\n if (this.activeTabIndex() >= tabs.length) {\n this.activeTabIndex.set(0);\n }\n });\n\n private readonly dataLoadEffect = effect(async () => {\n const opts = this.options() as Record<string, unknown>;\n const active = this.activeQuery();\n const items = await loadHeatmapChartItems(opts, {\n queryExecutor: this.queryExecutor,\n queryKey: active?.query,\n queryInput: active?.queryInput,\n });\n const resolved = await Promise.all(\n items.map(async (item) => {\n const x = item.x;\n const y = item.y;\n const label = item.label;\n\n return {\n ...item,\n x: typeof x === 'number' ? x : await this.resolveChartText(x),\n y: typeof y === 'number' ? y : await this.resolveChartText(y),\n ...(label !== undefined ? { label: await this.resolveChartText(label) } : {}),\n };\n }),\n );\n\n this.data.set(resolved as AXHeatmapData[]);\n });\n\n //#endregion\n\n constructor() {\n super();\n this.setOptions({\n showXAxis: true,\n showYAxis: true,\n showTooltip: true,\n cellPadding: 0.05,\n borderRadius: 2,\n color: 'rgb(var(--ax-sys-color-primary-500))',\n animationEasing: 'cubic-out',\n animationDuration: 800,\n ...this.options(),\n });\n\n this.heatmapOptions.set(this.options() as AXHeatmapChartOption);\n }\n}\n","<div class=\"axp-chart-widget-host\">\n <axp-chart-query-tabs\n [tabs]=\"queryTabs()\"\n [activeIndex]=\"activeTabIndex()\"\n (activeIndexChange)=\"selectQueryTab($event)\"\n />\n <div class=\"axp-chart-widget-host__body\">\n <div class=\"axp-chart-widget-host__chart axp-chart-widget-host__chart--heatmap\">\n <ax-heatmap-chart [data]=\"data()\" [options]=\"heatmapOptions()\"></ax-heatmap-chart>\n </div>\n </div>\n</div>\n"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as contracts from '@acorex-platform/module-dashboard-management-client/contracts';
|
|
2
2
|
import { DASHBOARD_LAYOUT_PAGE_COMPONENT_KEY } from '@acorex-platform/module-dashboard-management-client/contracts';
|
|
3
3
|
export * from '@acorex-platform/module-dashboard-management-client/contracts';
|
|
4
|
-
import {
|
|
4
|
+
import { b as AXMDashboardStore, d as AXMDashboardGridLayoutSectionComponent, D as DASHBOARD_LAYOUT_ENTITY_MODE } from './acorex-platform-module-dashboard-management-client-acorex-platform-module-dashboard-management-client-61Q_QY8l.mjs';
|
|
5
5
|
import * as i0 from '@angular/core';
|
|
6
6
|
import { Injectable, inject, input, signal, effect, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
7
7
|
import { resolveMultiLanguageString } from '@acorex/core/translation';
|
|
@@ -86,7 +86,7 @@ class AXMDashboardLayoutPageComponent extends AXPPageLayoutBaseComponent {
|
|
|
86
86
|
title: await this.translateService.translateAsync('@dashboard:widget'),
|
|
87
87
|
icon: 'fa-light fa-window-restore',
|
|
88
88
|
command: { name: 'new-widget' },
|
|
89
|
-
disabled: this.store.
|
|
89
|
+
disabled: this.store.readonly(),
|
|
90
90
|
},
|
|
91
91
|
],
|
|
92
92
|
},
|
|
@@ -130,4 +130,4 @@ var dashboardLayoutPage_component = /*#__PURE__*/Object.freeze({
|
|
|
130
130
|
});
|
|
131
131
|
|
|
132
132
|
export { AXMDashboardLayoutPageComponent, AXMDashboardLayoutPageComponentProvider, DASHBOARD_LAYOUT_ENTITY_MODE };
|
|
133
|
-
//# sourceMappingURL=acorex-platform-module-dashboard-management-client-index-
|
|
133
|
+
//# sourceMappingURL=acorex-platform-module-dashboard-management-client-index-z10pHL3b.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-platform-module-dashboard-management-client-index-
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-dashboard-management-client-index-z10pHL3b.mjs","sources":["../../../../libs/modules/dashboard-management/client/src/lib/features/dashboard-layout-page/dashboard-layout-page-component.provider.ts","../../../../libs/modules/dashboard-management/client/src/lib/features/dashboard-layout-page/dashboard-layout-page.component.ts","../../../../libs/modules/dashboard-management/client/src/lib/features/dashboard-layout-page/dashboard-layout-page.component.html"],"sourcesContent":["import {\n AXPPageComponentDefinition,\n AXPPageComponentProvider,\n} from '@acorex-platform/framework-client/layout/components';\nimport { Injectable } from '@angular/core';\nimport { DASHBOARD_LAYOUT_PAGE_COMPONENT_KEY } from '@acorex-platform/module-dashboard-management-client/contracts';\n\n//#region ---- Dashboard layout page provider ----\n\n@Injectable()\nexport class AXMDashboardLayoutPageComponentProvider implements AXPPageComponentProvider {\n async components(): Promise<AXPPageComponentDefinition[]> {\n return [\n {\n key: DASHBOARD_LAYOUT_PAGE_COMPONENT_KEY,\n loader: () =>\n import('./dashboard-layout-page.component').then((m) => m.AXMDashboardLayoutPageComponent),\n },\n ];\n }\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXPActionMenuItem, AXPExecuteCommand } from '@acorex-platform/framework-shared/core';\nimport {\n ChangeDetectionStrategy,\n Component,\n effect,\n inject,\n input,\n signal,\n} from '@angular/core';\n\nimport { resolveMultiLanguageString } from '@acorex/core/translation';\n\nimport { AXPDesignerService } from '@acorex-platform/framework-client/layout/designer';\nimport { AXPPageLayoutBase, AXPPageLayoutBaseComponent } from '@acorex-platform/framework-client/layout/views';\n\nimport { AXMCommonDashboardEntityModel } from '@acorex-platform/module-dashboard-management-client/contracts';\nimport { AXMDashboardStore } from '../dashboard-services/home-dashboard.store';\nimport { AXMDashboardGridLayoutSectionComponent } from '../shared/dashboard-grid-layout-section';\nimport { DASHBOARD_LAYOUT_ENTITY_MODE } from './dashboard-layout-entity-mode.token';\n\n//#endregion\n\n@Component({\n selector: 'axm-dashboard-layout-page',\n templateUrl: './dashboard-layout-page.component.html',\n imports: [AXMDashboardGridLayoutSectionComponent],\n providers: [\n AXPDesignerService,\n { provide: DASHBOARD_LAYOUT_ENTITY_MODE, useValue: true },\n AXMDashboardStore,\n {\n provide: AXPPageLayoutBase,\n useExisting: AXMDashboardLayoutPageComponent,\n },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AXMDashboardLayoutPageComponent extends AXPPageLayoutBaseComponent {\n //#region ---- Services & Dependencies ----\n\n protected readonly store = inject(AXMDashboardStore);\n\n //#endregion\n\n //#region ---- Inputs (entity page renderer) ----\n\n rootContext = input<Record<string, unknown>>();\n pageConfig = input<Record<string, unknown>>();\n\n //#endregion\n\n //#region ---- Local state ----\n\n protected readonly context = signal<Record<string, unknown>>({});\n\n //#endregion\n\n //#region ---- Effects ----\n\n #syncFromRootContext = effect(() => {\n const ctx = this.rootContext();\n if (!ctx || typeof ctx['id'] !== 'string') {\n return;\n }\n this.store.hydrateFromEntityDetailModel(ctx as unknown as AXMCommonDashboardEntityModel);\n this.context.set({ ...ctx });\n });\n\n //#endregion\n\n //#region ---- Page chrome (AXPPageLayoutBase) ----\n\n override getPageTitle(): string {\n const title = this.store.selectedDashboard()?.title;\n if (title == null || title === '') {\n return '';\n }\n return resolveMultiLanguageString(title, 'en-US');\n }\n\n override async getPageDescription(): Promise<string> {\n const raw = this.store.selectedDashboard()?.description;\n if (raw == null || raw === '') {\n return '';\n }\n if (typeof raw === 'object' && !Array.isArray(raw) && this.translateService.isValidMultiLanguageObject(raw)) {\n return this.translateService.resolve(raw);\n }\n return String(raw);\n }\n\n override async getPrimaryMenuItems(): Promise<AXPActionMenuItem[]> {\n return [\n {\n title: await this.translateService.translateAsync('@general:actions.add-item.title'),\n icon: 'fa-light fa-square-plus',\n color: 'primary',\n items: [\n {\n title: await this.translateService.translateAsync('@dashboard:widget'),\n icon: 'fa-light fa-window-restore',\n command: { name: 'new-widget' },\n disabled: this.store.readonly(),\n },\n ],\n },\n ];\n }\n\n override async execute(command: AXPExecuteCommand): Promise<void> {\n switch (command.name) {\n case 'new-widget':\n await this.store.addWidget();\n this.recompute();\n break;\n }\n }\n\n //#endregion\n}\n","<axm-dashboard-grid-layout-section\n [widgetsContext]=\"context()\"\n (addWidget)=\"execute({ name: 'new-widget' })\"\n></axm-dashboard-grid-layout-section>\n"],"names":[],"mappings":"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"}
|