@miragon/pulse-analytics-connector 0.0.0-bootstrap.0 → 0.21.0
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/LICENSE +21 -0
- package/README.md +86 -3
- package/dist/bpmn-name-lookup.d.ts +72 -0
- package/dist/bpmn-name-lookup.d.ts.map +1 -0
- package/dist/bpmn-name-lookup.js +123 -0
- package/dist/bpmn-name-lookup.js.map +1 -0
- package/dist/bpmn-name-lookup.test.d.ts +2 -0
- package/dist/bpmn-name-lookup.test.d.ts.map +1 -0
- package/dist/bpmn-name-lookup.test.js +287 -0
- package/dist/bpmn-name-lookup.test.js.map +1 -0
- package/dist/bpmn-names.d.ts +38 -0
- package/dist/bpmn-names.d.ts.map +1 -0
- package/dist/bpmn-names.js +22 -0
- package/dist/bpmn-names.js.map +1 -0
- package/dist/brand-gates.test.d.ts +2 -0
- package/dist/brand-gates.test.d.ts.map +1 -0
- package/dist/brand-gates.test.js +58 -0
- package/dist/brand-gates.test.js.map +1 -0
- package/dist/builder-texts.d.ts +4 -0
- package/dist/builder-texts.d.ts.map +1 -0
- package/dist/builder-texts.js +14 -0
- package/dist/builder-texts.js.map +1 -0
- package/dist/builder-texts.test.d.ts +2 -0
- package/dist/builder-texts.test.d.ts.map +1 -0
- package/dist/builder-texts.test.js +32 -0
- package/dist/builder-texts.test.js.map +1 -0
- package/dist/definition.d.ts +3 -0
- package/dist/definition.d.ts.map +1 -0
- package/dist/definition.js +151 -0
- package/dist/definition.js.map +1 -0
- package/dist/engine-ids.d.ts +42 -0
- package/dist/engine-ids.d.ts.map +1 -0
- package/dist/engine-ids.js +50 -0
- package/dist/engine-ids.js.map +1 -0
- package/dist/engine-scope.test.d.ts +2 -0
- package/dist/engine-scope.test.d.ts.map +1 -0
- package/dist/engine-scope.test.js +260 -0
- package/dist/engine-scope.test.js.map +1 -0
- package/dist/heatmap-data.d.ts +15 -0
- package/dist/heatmap-data.d.ts.map +1 -0
- package/dist/heatmap-data.js +2 -0
- package/dist/heatmap-data.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/instructions.d.ts +8 -0
- package/dist/instructions.d.ts.map +1 -0
- package/dist/instructions.js +33 -0
- package/dist/instructions.js.map +1 -0
- package/dist/messages/de.ask-ai.d.ts +9 -0
- package/dist/messages/de.ask-ai.d.ts.map +1 -0
- package/dist/messages/de.ask-ai.js +18 -0
- package/dist/messages/de.ask-ai.js.map +1 -0
- package/dist/messages/de.builder.d.ts +12 -0
- package/dist/messages/de.builder.d.ts.map +1 -0
- package/dist/messages/de.builder.js +53 -0
- package/dist/messages/de.builder.js.map +1 -0
- package/dist/messages/de.server.d.ts +8 -0
- package/dist/messages/de.server.d.ts.map +1 -0
- package/dist/messages/de.server.js +26 -0
- package/dist/messages/de.server.js.map +1 -0
- package/dist/messages/de.sweep.d.ts +10 -0
- package/dist/messages/de.sweep.d.ts.map +1 -0
- package/dist/messages/de.sweep.js +203 -0
- package/dist/messages/de.sweep.js.map +1 -0
- package/dist/messages/en.ask-ai.d.ts +25 -0
- package/dist/messages/en.ask-ai.d.ts.map +1 -0
- package/dist/messages/en.ask-ai.js +24 -0
- package/dist/messages/en.ask-ai.js.map +1 -0
- package/dist/messages/en.builder.d.ts +12 -0
- package/dist/messages/en.builder.d.ts.map +1 -0
- package/dist/messages/en.builder.js +53 -0
- package/dist/messages/en.builder.js.map +1 -0
- package/dist/messages/en.server.d.ts +8 -0
- package/dist/messages/en.server.d.ts.map +1 -0
- package/dist/messages/en.server.js +26 -0
- package/dist/messages/en.server.js.map +1 -0
- package/dist/messages/en.sweep.d.ts +11 -0
- package/dist/messages/en.sweep.d.ts.map +1 -0
- package/dist/messages/en.sweep.js +204 -0
- package/dist/messages/en.sweep.js.map +1 -0
- package/dist/messages/glossary.d.ts +26 -0
- package/dist/messages/glossary.d.ts.map +1 -0
- package/dist/messages/glossary.js +37 -0
- package/dist/messages/glossary.js.map +1 -0
- package/dist/messages/glossary.test.d.ts +2 -0
- package/dist/messages/glossary.test.d.ts.map +1 -0
- package/dist/messages/glossary.test.js +109 -0
- package/dist/messages/glossary.test.js.map +1 -0
- package/dist/messages/index.d.ts +12 -0
- package/dist/messages/index.d.ts.map +1 -0
- package/dist/messages/index.js +23 -0
- package/dist/messages/index.js.map +1 -0
- package/dist/messages/plural.d.ts +10 -0
- package/dist/messages/plural.d.ts.map +1 -0
- package/dist/messages/plural.js +17 -0
- package/dist/messages/plural.js.map +1 -0
- package/dist/messages/use-t.d.ts +10 -0
- package/dist/messages/use-t.d.ts.map +1 -0
- package/dist/messages/use-t.js +10 -0
- package/dist/messages/use-t.js.map +1 -0
- package/dist/module.d.ts +48 -0
- package/dist/module.d.ts.map +1 -0
- package/dist/module.js +174 -0
- package/dist/module.js.map +1 -0
- package/dist/module.test.d.ts +2 -0
- package/dist/module.test.d.ts.map +1 -0
- package/dist/module.test.js +230 -0
- package/dist/module.test.js.map +1 -0
- package/dist/named-views.d.ts +27 -0
- package/dist/named-views.d.ts.map +1 -0
- package/dist/named-views.js +73 -0
- package/dist/named-views.js.map +1 -0
- package/dist/named-views.test.d.ts +2 -0
- package/dist/named-views.test.d.ts.map +1 -0
- package/dist/named-views.test.js +110 -0
- package/dist/named-views.test.js.map +1 -0
- package/dist/plugin.d.ts +44 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +52 -0
- package/dist/plugin.js.map +1 -0
- package/dist/prometheus-wiring.test.d.ts +2 -0
- package/dist/prometheus-wiring.test.d.ts.map +1 -0
- package/dist/prometheus-wiring.test.js +142 -0
- package/dist/prometheus-wiring.test.js.map +1 -0
- package/dist/server-locale.d.ts +48 -0
- package/dist/server-locale.d.ts.map +1 -0
- package/dist/server-locale.js +33 -0
- package/dist/server-locale.js.map +1 -0
- package/dist/settings-tools.d.ts +23 -0
- package/dist/settings-tools.d.ts.map +1 -0
- package/dist/settings-tools.js +100 -0
- package/dist/settings-tools.js.map +1 -0
- package/dist/settings.d.ts +77 -0
- package/dist/settings.d.ts.map +1 -0
- package/dist/settings.js +99 -0
- package/dist/settings.js.map +1 -0
- package/dist/settings.test.d.ts +2 -0
- package/dist/settings.test.d.ts.map +1 -0
- package/dist/settings.test.js +299 -0
- package/dist/settings.test.js.map +1 -0
- package/dist/steps/app-config.d.ts +30 -0
- package/dist/steps/app-config.d.ts.map +1 -0
- package/dist/steps/app-config.js +46 -0
- package/dist/steps/app-config.js.map +1 -0
- package/dist/steps/dashboard.d.ts +12 -0
- package/dist/steps/dashboard.d.ts.map +1 -0
- package/dist/steps/dashboard.js +58 -0
- package/dist/steps/dashboard.js.map +1 -0
- package/dist/steps/failure-dashboard.d.ts +10 -0
- package/dist/steps/failure-dashboard.d.ts.map +1 -0
- package/dist/steps/failure-dashboard.js +32 -0
- package/dist/steps/failure-dashboard.js.map +1 -0
- package/dist/steps/index.d.ts +3 -0
- package/dist/steps/index.d.ts.map +1 -0
- package/dist/steps/index.js +3 -0
- package/dist/steps/index.js.map +1 -0
- package/dist/steps/steps.test.d.ts +2 -0
- package/dist/steps/steps.test.d.ts.map +1 -0
- package/dist/steps/steps.test.js +153 -0
- package/dist/steps/steps.test.js.map +1 -0
- package/dist/tool-names.d.ts +13 -0
- package/dist/tool-names.d.ts.map +1 -0
- package/dist/tool-names.js +27 -0
- package/dist/tool-names.js.map +1 -0
- package/dist/tools/cluster-compare.d.ts +8 -0
- package/dist/tools/cluster-compare.d.ts.map +1 -0
- package/dist/tools/cluster-compare.js +17 -0
- package/dist/tools/cluster-compare.js.map +1 -0
- package/dist/tools/element.d.ts +8 -0
- package/dist/tools/element.d.ts.map +1 -0
- package/dist/tools/element.js +25 -0
- package/dist/tools/element.js.map +1 -0
- package/dist/tools/engine-compare.d.ts +8 -0
- package/dist/tools/engine-compare.d.ts.map +1 -0
- package/dist/tools/engine-compare.js +18 -0
- package/dist/tools/engine-compare.js.map +1 -0
- package/dist/tools/engine-compare.test.d.ts +2 -0
- package/dist/tools/engine-compare.test.d.ts.map +1 -0
- package/dist/tools/engine-compare.test.js +166 -0
- package/dist/tools/engine-compare.test.js.map +1 -0
- package/dist/tools/engine-landscape.d.ts +7 -0
- package/dist/tools/engine-landscape.d.ts.map +1 -0
- package/dist/tools/engine-landscape.js +13 -0
- package/dist/tools/engine-landscape.js.map +1 -0
- package/dist/tools/engine-landscape.test.d.ts +2 -0
- package/dist/tools/engine-landscape.test.d.ts.map +1 -0
- package/dist/tools/engine-landscape.test.js +110 -0
- package/dist/tools/engine-landscape.test.js.map +1 -0
- package/dist/tools/failures.d.ts +7 -0
- package/dist/tools/failures.d.ts.map +1 -0
- package/dist/tools/failures.js +13 -0
- package/dist/tools/failures.js.map +1 -0
- package/dist/tools/health.d.ts +7 -0
- package/dist/tools/health.d.ts.map +1 -0
- package/dist/tools/health.js +23 -0
- package/dist/tools/health.js.map +1 -0
- package/dist/tools/health.test.d.ts +2 -0
- package/dist/tools/health.test.d.ts.map +1 -0
- package/dist/tools/health.test.js +119 -0
- package/dist/tools/health.test.js.map +1 -0
- package/dist/tools/index.d.ts +18 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +35 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/performance.d.ts +8 -0
- package/dist/tools/performance.d.ts.map +1 -0
- package/dist/tools/performance.js +25 -0
- package/dist/tools/performance.js.map +1 -0
- package/dist/tools/performance.test.d.ts +2 -0
- package/dist/tools/performance.test.d.ts.map +1 -0
- package/dist/tools/performance.test.js +176 -0
- package/dist/tools/performance.test.js.map +1 -0
- package/dist/tools/version-compare.d.ts +8 -0
- package/dist/tools/version-compare.d.ts.map +1 -0
- package/dist/tools/version-compare.js +17 -0
- package/dist/tools/version-compare.js.map +1 -0
- package/dist/tools/version-compare.test.d.ts +2 -0
- package/dist/tools/version-compare.test.d.ts.map +1 -0
- package/dist/tools/version-compare.test.js +82 -0
- package/dist/tools/version-compare.test.js.map +1 -0
- package/dist/toolsets.d.ts +17 -0
- package/dist/toolsets.d.ts.map +1 -0
- package/dist/toolsets.js +47 -0
- package/dist/toolsets.js.map +1 -0
- package/dist/toolsets.test.d.ts +2 -0
- package/dist/toolsets.test.d.ts.map +1 -0
- package/dist/toolsets.test.js +91 -0
- package/dist/toolsets.test.js.map +1 -0
- package/dist/view-title.test.d.ts +2 -0
- package/dist/view-title.test.d.ts.map +1 -0
- package/dist/view-title.test.js +91 -0
- package/dist/view-title.test.js.map +1 -0
- package/dist/widget-tools/comparisons.d.ts +13 -0
- package/dist/widget-tools/comparisons.d.ts.map +1 -0
- package/dist/widget-tools/comparisons.js +177 -0
- package/dist/widget-tools/comparisons.js.map +1 -0
- package/dist/widget-tools/comparisons.test.d.ts +2 -0
- package/dist/widget-tools/comparisons.test.d.ts.map +1 -0
- package/dist/widget-tools/comparisons.test.js +123 -0
- package/dist/widget-tools/comparisons.test.js.map +1 -0
- package/dist/widget-tools/shared.d.ts +36 -0
- package/dist/widget-tools/shared.d.ts.map +1 -0
- package/dist/widget-tools/shared.js +39 -0
- package/dist/widget-tools/shared.js.map +1 -0
- package/dist/widget-tools.d.ts +25 -0
- package/dist/widget-tools.d.ts.map +1 -0
- package/dist/widget-tools.js +269 -0
- package/dist/widget-tools.js.map +1 -0
- package/dist/widget-tools.test.d.ts +2 -0
- package/dist/widget-tools.test.d.ts.map +1 -0
- package/dist/widget-tools.test.js +272 -0
- package/dist/widget-tools.test.js.map +1 -0
- package/package.json +91 -5
- package/src/bpmn-name-lookup.test.ts +333 -0
- package/src/bpmn-name-lookup.ts +197 -0
- package/src/bpmn-names.ts +51 -0
- package/src/brand-gates.test.ts +69 -0
- package/src/builder-texts.test.ts +40 -0
- package/src/builder-texts.ts +15 -0
- package/src/definition.ts +181 -0
- package/src/engine-ids.ts +85 -0
- package/src/engine-scope.test.ts +324 -0
- package/src/heatmap-data.ts +14 -0
- package/src/index.ts +4 -0
- package/src/instructions.ts +33 -0
- package/src/messages/GLOSSARY.md +88 -0
- package/src/messages/de.ask-ai.ts +28 -0
- package/src/messages/de.builder.ts +77 -0
- package/src/messages/de.server.ts +39 -0
- package/src/messages/de.sweep.ts +244 -0
- package/src/messages/en.ask-ai.ts +34 -0
- package/src/messages/en.builder.ts +76 -0
- package/src/messages/en.server.ts +39 -0
- package/src/messages/en.sweep.ts +240 -0
- package/src/messages/glossary.test.ts +122 -0
- package/src/messages/glossary.ts +62 -0
- package/src/messages/index.ts +24 -0
- package/src/messages/plural.ts +18 -0
- package/src/messages/use-t.ts +12 -0
- package/src/module.test.ts +319 -0
- package/src/module.ts +211 -0
- package/src/named-views.test.ts +141 -0
- package/src/named-views.ts +97 -0
- package/src/plugin.ts +94 -0
- package/src/prometheus-wiring.test.ts +174 -0
- package/src/server-locale.ts +59 -0
- package/src/settings-tools.ts +170 -0
- package/src/settings.test.ts +402 -0
- package/src/settings.ts +114 -0
- package/src/steps/app-config.ts +75 -0
- package/src/steps/dashboard.ts +73 -0
- package/src/steps/failure-dashboard.ts +38 -0
- package/src/steps/index.ts +2 -0
- package/src/steps/steps.test.ts +216 -0
- package/src/tool-names.ts +26 -0
- package/src/tools/cluster-compare.ts +28 -0
- package/src/tools/element.ts +35 -0
- package/src/tools/engine-compare.test.ts +210 -0
- package/src/tools/engine-compare.ts +30 -0
- package/src/tools/engine-landscape.test.ts +138 -0
- package/src/tools/engine-landscape.ts +21 -0
- package/src/tools/failures.ts +19 -0
- package/src/tools/health.test.ts +156 -0
- package/src/tools/health.ts +29 -0
- package/src/tools/index.ts +44 -0
- package/src/tools/performance.test.ts +210 -0
- package/src/tools/performance.ts +38 -0
- package/src/tools/version-compare.test.ts +97 -0
- package/src/tools/version-compare.ts +28 -0
- package/src/toolsets.test.ts +107 -0
- package/src/toolsets.ts +56 -0
- package/src/view-title.test.ts +123 -0
- package/src/widget-tools/comparisons.test.ts +170 -0
- package/src/widget-tools/comparisons.ts +229 -0
- package/src/widget-tools/shared.ts +67 -0
- package/src/widget-tools.test.ts +306 -0
- package/src/widget-tools.ts +375 -0
- package/src/widgets/analytics-dashboard/activity-bottleneck-table.tsx +179 -0
- package/src/widgets/analytics-dashboard/definition-breakdown.tsx +108 -0
- package/src/widgets/analytics-dashboard/execution-performance-kpi.tsx +94 -0
- package/src/widgets/analytics-dashboard/execution-summary-kpi.tsx +122 -0
- package/src/widgets/analytics-dashboard/lib.ts +43 -0
- package/src/widgets/bpmn-heatmap.test.tsx +75 -0
- package/src/widgets/bpmn-heatmap.tsx +127 -0
- package/src/widgets/catalogue-sync.test.ts +16 -0
- package/src/widgets/cluster-compare.tsx +148 -0
- package/src/widgets/comparison-shared.test.ts +237 -0
- package/src/widgets/comparison-shared.tsx +371 -0
- package/src/widgets/comparison-widgets.test.tsx +307 -0
- package/src/widgets/dashboard-widgets.test.tsx +397 -0
- package/src/widgets/engine-compare.tsx +87 -0
- package/src/widgets/engine-landscape.tsx +352 -0
- package/src/widgets/failure-dashboard/error-patterns-table.tsx +122 -0
- package/src/widgets/failure-dashboard/failure-rate-table.test.ts +80 -0
- package/src/widgets/failure-dashboard/failure-rate-table.tsx +170 -0
- package/src/widgets/failure-dashboard/lib.ts +32 -0
- package/src/widgets/failure-dashboard/summary-kpi.tsx +122 -0
- package/src/widgets/failure-landscape-widgets.test.tsx +393 -0
- package/src/widgets/figure.tsx +79 -0
- package/src/widgets/hand-off.test.ts +126 -0
- package/src/widgets/hand-off.ts +102 -0
- package/src/widgets/index.ts +124 -0
- package/src/widgets/model-descriptions.dashboard.test.ts +280 -0
- package/src/widgets/model-descriptions.test.ts +251 -0
- package/src/widgets/model-descriptions.ts +428 -0
- package/src/widgets/names.test.ts +32 -0
- package/src/widgets/names.ts +39 -0
- package/src/widgets/query-gate.test.tsx +57 -0
- package/src/widgets/query-gate.tsx +50 -0
- package/src/widgets/settings-section.test.tsx +174 -0
- package/src/widgets/settings-section.tsx +244 -0
- package/src/widgets/version-compare.test.ts +68 -0
- package/src/widgets/version-compare.tsx +96 -0
- package/src/widgets/view-meta.ts +18 -0
- package/src/widgets/widget-render.test-support.tsx +103 -0
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { Badge } from "@miragon/mcp-toolkit-ui"
|
|
2
|
+
import type { VersionCompareResult } from "@miragon/pulse-analytics-client"
|
|
3
|
+
import {
|
|
4
|
+
HandOffButton,
|
|
5
|
+
ViewMeta,
|
|
6
|
+
formatLookback,
|
|
7
|
+
formatNumber,
|
|
8
|
+
} from "@miragon/pulse-widget-shell/widgets"
|
|
9
|
+
import { useT } from "../messages/use-t.js"
|
|
10
|
+
import {
|
|
11
|
+
ComparisonCard,
|
|
12
|
+
ComparisonEmptyState,
|
|
13
|
+
SuppressedBadge,
|
|
14
|
+
buildComparisonMetrics,
|
|
15
|
+
deltaFacts,
|
|
16
|
+
} from "./comparison-shared.js"
|
|
17
|
+
import { engineIdsOf, useHandOff, type HandOff } from "./hand-off.js"
|
|
18
|
+
import { enginesMeta } from "./view-meta.js"
|
|
19
|
+
|
|
20
|
+
export type VersionCompareData = VersionCompareResult | null
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Interpret a version comparison. The comparison is process-wide: the tool
|
|
24
|
+
* takes no element scope (#336).
|
|
25
|
+
*/
|
|
26
|
+
export function versionCompareHandOff(data: VersionCompareResult): HandOff {
|
|
27
|
+
return {
|
|
28
|
+
intent: "askAi.versionCompare",
|
|
29
|
+
ids: {
|
|
30
|
+
engine: engineIdsOf(data.engines),
|
|
31
|
+
processDefinitionKey: data.processDefinitionKey,
|
|
32
|
+
versionA: data.versionA,
|
|
33
|
+
versionB: data.versionB,
|
|
34
|
+
windowDays: data.windowDays,
|
|
35
|
+
},
|
|
36
|
+
facts: deltaFacts(data.delta, data.suppressed),
|
|
37
|
+
tools: ["analytics_version_compare", "analytics_element_bottleneck"],
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function VersionCompareWidget({ data }: { data: VersionCompareData }) {
|
|
42
|
+
const t = useT()
|
|
43
|
+
const { ask } = useHandOff()
|
|
44
|
+
if (!data) return <ComparisonEmptyState>{t("aVersionCompare.emptyNoData")}</ComparisonEmptyState>
|
|
45
|
+
|
|
46
|
+
const a = data.kpis.find((k) => k.bucket === "versionA")
|
|
47
|
+
const b = data.kpis.find((k) => k.bucket === "versionB")
|
|
48
|
+
if (!a || !b) {
|
|
49
|
+
return <ComparisonEmptyState>{t("aVersionCompare.emptyIncomplete")}</ComparisonEmptyState>
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const metrics = buildComparisonMetrics(t, a, b, data.delta)
|
|
53
|
+
|
|
54
|
+
return (
|
|
55
|
+
<ComparisonCard
|
|
56
|
+
title={t("aVersionCompare.title")}
|
|
57
|
+
tableLabel={t("aVersionCompare.tableLabel")}
|
|
58
|
+
beforeLabel={`v${data.versionA}`}
|
|
59
|
+
afterLabel={`v${data.versionB}`}
|
|
60
|
+
metrics={metrics}
|
|
61
|
+
suppressed={data.suppressed}
|
|
62
|
+
actions={
|
|
63
|
+
<HandOffButton
|
|
64
|
+
action="assess"
|
|
65
|
+
prompt={ask(versionCompareHandOff(data))}
|
|
66
|
+
variant="primary"
|
|
67
|
+
/>
|
|
68
|
+
}
|
|
69
|
+
meta={
|
|
70
|
+
<ViewMeta
|
|
71
|
+
period={formatLookback(`${data.windowDays}d`)}
|
|
72
|
+
engines={enginesMeta(data.engines)}
|
|
73
|
+
asOf={data.asOf}
|
|
74
|
+
/>
|
|
75
|
+
}
|
|
76
|
+
badges={
|
|
77
|
+
<>
|
|
78
|
+
<Badge>{data.processDefinitionKey}</Badge>
|
|
79
|
+
<Badge variant="secondary">
|
|
80
|
+
{t("aVersionCompare.versionsBadge", {
|
|
81
|
+
versionA: data.versionA,
|
|
82
|
+
versionB: data.versionB,
|
|
83
|
+
})}
|
|
84
|
+
</Badge>
|
|
85
|
+
{data.suppressed && (
|
|
86
|
+
<SuppressedBadge>
|
|
87
|
+
{t("aVersionCompare.badgeInsufficientSignal", {
|
|
88
|
+
min: formatNumber(data.minBucketSize),
|
|
89
|
+
})}
|
|
90
|
+
</SuppressedBadge>
|
|
91
|
+
)}
|
|
92
|
+
</>
|
|
93
|
+
}
|
|
94
|
+
/>
|
|
95
|
+
)
|
|
96
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ViewMetaEngines } from "@miragon/pulse-widget-shell/widgets"
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The engine part of an analytics view's meta line (U7) from the result's
|
|
5
|
+
* echo: how many engines the figures add up and, where the result names
|
|
6
|
+
* the reporting ones, how many of them send no metrics. `null` for an
|
|
7
|
+
* unscoped result (every engine Prometheus holds), which names none.
|
|
8
|
+
*/
|
|
9
|
+
export function enginesMeta(
|
|
10
|
+
engines: readonly string[] | null | undefined,
|
|
11
|
+
reporting?: readonly string[],
|
|
12
|
+
): ViewMetaEngines | null {
|
|
13
|
+
if (!engines || engines.length === 0) return null
|
|
14
|
+
return {
|
|
15
|
+
count: engines.length,
|
|
16
|
+
silent: reporting ? engines.filter((id) => !reporting.includes(id)).length : null,
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { afterEach, beforeEach, vi } from "vitest"
|
|
2
|
+
import type { ComponentType } from "react"
|
|
3
|
+
import { cleanup, render, screen, within } from "@testing-library/react"
|
|
4
|
+
import { LocaleProvider, queryClient } from "@miragon/mcp-toolkit-ui"
|
|
5
|
+
import { WidgetFixtureHost } from "@miragon/mcp-toolkit-ui/app"
|
|
6
|
+
import { setFormatLocale } from "@miragon/pulse-widget-shell/testing"
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Rendering the analytics widgets as a person reads them, for the DOM suites
|
|
10
|
+
* (`*-widgets.test.tsx`): a widget in a language, at a fixed clock, and the
|
|
11
|
+
* readers those suites share.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
export const NOW = "2026-10-10T12:40:00.000Z"
|
|
15
|
+
export const AS_OF = "2026-10-10T12:32:00.000Z"
|
|
16
|
+
|
|
17
|
+
/** Fixes the clock at {@link NOW} and resets the view state after each test. */
|
|
18
|
+
export function withWidgetClock() {
|
|
19
|
+
beforeEach(() => {
|
|
20
|
+
vi.useFakeTimers({ toFake: ["Date"] })
|
|
21
|
+
vi.setSystemTime(new Date(NOW))
|
|
22
|
+
})
|
|
23
|
+
afterEach(() => {
|
|
24
|
+
cleanup()
|
|
25
|
+
queryClient.clear()
|
|
26
|
+
setFormatLocale(undefined)
|
|
27
|
+
vi.useRealTimers()
|
|
28
|
+
})
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export function renderIn(
|
|
32
|
+
language: "de" | "en",
|
|
33
|
+
Widget: ComponentType<{ data: never }>,
|
|
34
|
+
data: unknown,
|
|
35
|
+
/** The tools a self-fetching widget calls (e.g. the heatmap's diagram feed). */
|
|
36
|
+
tools?: Record<string, unknown>,
|
|
37
|
+
) {
|
|
38
|
+
setFormatLocale({
|
|
39
|
+
language,
|
|
40
|
+
locale: language === "de" ? "de-DE" : "en-GB",
|
|
41
|
+
timeZone: "Europe/Berlin",
|
|
42
|
+
})
|
|
43
|
+
return render(
|
|
44
|
+
<LocaleProvider locale={language}>
|
|
45
|
+
<WidgetFixtureHost
|
|
46
|
+
widget={Widget as unknown as ComponentType<Record<string, unknown>>}
|
|
47
|
+
data={data as Record<string, unknown>}
|
|
48
|
+
tools={tools}
|
|
49
|
+
/>
|
|
50
|
+
</LocaleProvider>,
|
|
51
|
+
)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const NBSP = String.fromCharCode(0xa0)
|
|
55
|
+
|
|
56
|
+
/** Text with the formatters' no-break spaces as plain spaces. */
|
|
57
|
+
export const plain = (s: string | null | undefined) => s?.replaceAll(NBSP, " ")
|
|
58
|
+
export const metaLine = () => plain(document.querySelector("[data-view-meta]")?.textContent)
|
|
59
|
+
export const iconOf = (el: HTMLElement) => el.querySelector("svg")?.getAttribute("class") ?? ""
|
|
60
|
+
|
|
61
|
+
/** The tone of the KPI cell labelled `label` (its dot), or undefined for a neutral one. */
|
|
62
|
+
export const kpiTone = (label: string) =>
|
|
63
|
+
screen.getByText(label).closest("[data-tone]")?.getAttribute("data-tone") ?? undefined
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* The column heads, the ones a narrow region hides included: happy-dom has no
|
|
67
|
+
* layout, so every `hideBelow` container query reads as "too narrow". The
|
|
68
|
+
* heads of a column GROUP (the row above, `data-list-table-groups`) are not
|
|
69
|
+
* column heads.
|
|
70
|
+
*/
|
|
71
|
+
export const headers = (table: HTMLElement) =>
|
|
72
|
+
within(table)
|
|
73
|
+
.getAllByRole("columnheader", { hidden: true })
|
|
74
|
+
.filter((th) => th.getAttribute("scope") === "col" && !inGroupRow(th))
|
|
75
|
+
.map((th) => plain(th.textContent)?.trim())
|
|
76
|
+
|
|
77
|
+
const inGroupRow = (th: HTMLElement) => th.closest("tr")?.hasAttribute("data-list-table-groups")
|
|
78
|
+
|
|
79
|
+
/** The heads of the column groups: their text and how many columns each spans. */
|
|
80
|
+
export const groupHeads = (table: HTMLElement) =>
|
|
81
|
+
within(table)
|
|
82
|
+
.getAllByRole("columnheader", { hidden: true })
|
|
83
|
+
.filter(inGroupRow)
|
|
84
|
+
.map((th) => [plain(th.textContent)?.trim(), th.getAttribute("colspan")])
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Each "—" for a missing figure (`Figure`) as each reader gets it: the sign
|
|
88
|
+
* on screen (hidden from assistive tech), the reason a screen reader reads in
|
|
89
|
+
* its place, and the tooltip.
|
|
90
|
+
*/
|
|
91
|
+
export const missingFigures = (root: ParentNode) =>
|
|
92
|
+
[...root.querySelectorAll<HTMLElement>("[data-figure='missing']")].map((el) => ({
|
|
93
|
+
shown: el.querySelector("[aria-hidden='true']")?.textContent,
|
|
94
|
+
read: el.querySelector(".sr-only")?.textContent,
|
|
95
|
+
title: el.getAttribute("title"),
|
|
96
|
+
}))
|
|
97
|
+
|
|
98
|
+
/** One missing figure as {@link missingFigures} reports it: "—", its reason read out and as the tooltip. */
|
|
99
|
+
export const missing = (why: string) => ({ shown: "—", read: why, title: why })
|
|
100
|
+
|
|
101
|
+
/** The notes under the tables (`Legend`), as text. */
|
|
102
|
+
export const legendLines = () =>
|
|
103
|
+
[...document.querySelectorAll("[data-legend]")].map((p) => plain(p.textContent)?.trim())
|