@burdenoff/microfe-adaptercloud 2026.801.1 → 2026.802.2
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/dist/adaptercloud/components/viz/StackedBar.js +35 -1
- package/dist/adaptercloud/components/viz/StackedBar.js.map +1 -0
- package/dist/adaptercloud/pages/OverviewPage.d.ts.map +1 -1
- package/dist/adaptercloud/pages/OverviewPage.js +178 -163
- package/dist/adaptercloud/pages/OverviewPage.js.map +1 -1
- package/dist/adaptercloud/pages/connections/ConnectionDetailPage.d.ts.map +1 -1
- package/dist/adaptercloud/pages/connections/ConnectionDetailPage.js +136 -139
- package/dist/adaptercloud/pages/connections/ConnectionDetailPage.js.map +1 -1
- package/dist/adaptercloud/pages/costs/CostsPage.js +9 -9
- package/dist/adaptercloud/pages/policies/PolicyFormPage.d.ts.map +1 -1
- package/dist/adaptercloud/pages/policies/PolicyFormPage.js +34 -31
- package/dist/adaptercloud/pages/policies/PolicyFormPage.js.map +1 -1
- package/dist/adaptercloud/pages/resources/ResourceDetailPage.d.ts.map +1 -1
- package/dist/adaptercloud/pages/resources/ResourceDetailPage.js +149 -128
- package/dist/adaptercloud/pages/resources/ResourceDetailPage.js.map +1 -1
- package/dist/adaptercloud/pages/topology/TopologyPage.js +4 -4
- package/dist/adaptercloud/pages/topology/TopologyPage.js.map +1 -1
- package/dist/adaptercloud/types/index.d.ts.map +1 -1
- package/dist/types/assistant.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1,35 @@
|
|
|
1
|
-
import "react/jsx-runtime";
|
|
1
|
+
import { jsx as e, jsxs as t } from "react/jsx-runtime";
|
|
2
|
+
//#region src/adaptercloud/components/viz/StackedBar.tsx
|
|
3
|
+
var n = ({ segments: n, showLegend: r = !0, heightClassName: i = "h-3", ariaLabel: a }) => {
|
|
4
|
+
let o = n.reduce((e, t) => e + Math.max(0, t.value), 0);
|
|
5
|
+
return /* @__PURE__ */ t("div", { children: [/* @__PURE__ */ e("div", {
|
|
6
|
+
className: `flex ${i} w-full overflow-hidden rounded-full bg-bg-sunken`,
|
|
7
|
+
role: "img",
|
|
8
|
+
"aria-label": a ?? n.map((e) => `${e.label}: ${e.value}`).join(", "),
|
|
9
|
+
children: o === 0 ? /* @__PURE__ */ e("div", { className: "h-full w-full bg-bg-muted/50" }) : n.filter((e) => e.value > 0).map((t) => /* @__PURE__ */ e("div", {
|
|
10
|
+
className: `h-full ${t.className} transition-[width] duration-500`,
|
|
11
|
+
style: { width: `${t.value / o * 100}%` },
|
|
12
|
+
title: `${t.label}: ${t.value}`
|
|
13
|
+
}, t.key))
|
|
14
|
+
}), r && /* @__PURE__ */ e("ul", {
|
|
15
|
+
className: "mt-3 flex flex-wrap gap-x-4 gap-y-2",
|
|
16
|
+
children: n.map((n) => /* @__PURE__ */ t("li", {
|
|
17
|
+
className: "flex items-center gap-1.5 text-xs text-text-secondary",
|
|
18
|
+
children: [
|
|
19
|
+
/* @__PURE__ */ e("span", {
|
|
20
|
+
className: `h-2.5 w-2.5 shrink-0 rounded-full ${n.className}`,
|
|
21
|
+
"aria-hidden": !0
|
|
22
|
+
}),
|
|
23
|
+
/* @__PURE__ */ e("span", { children: n.label }),
|
|
24
|
+
/* @__PURE__ */ e("span", {
|
|
25
|
+
className: "font-semibold tabular-nums text-text-primary",
|
|
26
|
+
children: n.value
|
|
27
|
+
})
|
|
28
|
+
]
|
|
29
|
+
}, n.key))
|
|
30
|
+
})] });
|
|
31
|
+
};
|
|
32
|
+
//#endregion
|
|
33
|
+
export { n as StackedBar };
|
|
34
|
+
|
|
35
|
+
//# sourceMappingURL=StackedBar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StackedBar.js","names":[],"sources":["../../../../src/adaptercloud/components/viz/StackedBar.tsx"],"sourcesContent":["/**\n * StackedBar — a proportional horizontal stacked bar with an optional legend.\n * Fully tokenized (no raw colors); each segment supplies a semantic-token bar\n * class. Used for breakdowns like connection health or violation severity mix.\n */\nimport type { FC } from 'react';\n\nexport interface StackedSegment {\n key: string;\n label: string;\n value: number;\n /** Semantic-token background class for the segment + legend dot, e.g. `bg-status-success-text`. */\n className: string;\n}\n\ninterface StackedBarProps {\n segments: StackedSegment[];\n showLegend?: boolean;\n /** Bar thickness class (default h-3). */\n heightClassName?: string;\n ariaLabel?: string;\n}\n\nexport const StackedBar: FC<StackedBarProps> = ({\n segments,\n showLegend = true,\n heightClassName = 'h-3',\n ariaLabel,\n}) => {\n const total = segments.reduce((acc, s) => acc + Math.max(0, s.value), 0);\n\n return (\n <div>\n <div\n className={`flex ${heightClassName} w-full overflow-hidden rounded-full bg-bg-sunken`}\n role=\"img\"\n aria-label={ariaLabel ?? segments.map((s) => `${s.label}: ${s.value}`).join(', ')}\n >\n {total === 0 ? (\n <div className=\"h-full w-full bg-bg-muted/50\" />\n ) : (\n segments\n .filter((s) => s.value > 0)\n .map((s) => (\n <div\n key={s.key}\n className={`h-full ${s.className} transition-[width] duration-500`}\n style={{ width: `${(s.value / total) * 100}%` }}\n title={`${s.label}: ${s.value}`}\n />\n ))\n )}\n </div>\n\n {showLegend && (\n <ul className=\"mt-3 flex flex-wrap gap-x-4 gap-y-2\">\n {segments.map((s) => (\n <li key={s.key} className=\"flex items-center gap-1.5 text-xs text-text-secondary\">\n <span className={`h-2.5 w-2.5 shrink-0 rounded-full ${s.className}`} aria-hidden />\n <span>{s.label}</span>\n <span className=\"font-semibold tabular-nums text-text-primary\">{s.value}</span>\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n};\n"],"mappings":";;AAuBA,IAAa,KAAmC,EAC9C,aACA,gBAAa,IACb,qBAAkB,OAClB,mBACI;CACJ,IAAM,IAAQ,EAAS,QAAQ,GAAK,MAAM,IAAM,KAAK,IAAI,GAAG,EAAE,KAAK,GAAG,CAAC;CAEvE,OACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;EACE,WAAW,QAAQ,EAAgB;EACnC,MAAK;EACL,cAAY,KAAa,EAAS,KAAK,MAAM,GAAG,EAAE,MAAM,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI;YAE/E,MAAU,IACT,kBAAC,OAAD,EAAK,WAAU,+BAAgC,CAAA,IAE/C,EACG,QAAQ,MAAM,EAAE,QAAQ,CAAC,EACzB,KAAK,MACJ,kBAAC,OAAD;GAEE,WAAW,UAAU,EAAE,UAAU;GACjC,OAAO,EAAE,OAAO,GAAI,EAAE,QAAQ,IAAS,IAAI,GAAG;GAC9C,OAAO,GAAG,EAAE,MAAM,IAAI,EAAE;EACzB,GAJM,EAAE,GAIR,CACF;CAEF,CAAA,GAEJ,KACC,kBAAC,MAAD;EAAI,WAAU;YACX,EAAS,KAAK,MACb,kBAAC,MAAD;GAAgB,WAAU;aAA1B;IACE,kBAAC,QAAD;KAAM,WAAW,qCAAqC,EAAE;KAAa,eAAA;IAAa,CAAA;IAClF,kBAAC,QAAD,EAAA,UAAO,EAAE,MAAY,CAAA;IACrB,kBAAC,QAAD;KAAM,WAAU;eAAgD,EAAE;IAAY,CAAA;GAC5E;KAJK,EAAE,GAIP,CACL;CACC,CAAA,CAEH,EAAA,CAAA;AAET"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OverviewPage.d.ts","sourceRoot":"","sources":["../../../src/adaptercloud/pages/OverviewPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"OverviewPage.d.ts","sourceRoot":"","sources":["../../../src/adaptercloud/pages/OverviewPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAgDH,wBAAgB,YAAY,gCAmY3B"}
|
|
@@ -4,27 +4,30 @@ import { MetricsCard as n } from "../components/MetricsCard.js";
|
|
|
4
4
|
import { formatMoney as r, severityRank as i, syncKindLabels as a } from "../utils/domain.js";
|
|
5
5
|
import { StatusBadge as o } from "../components/StatusBadge.js";
|
|
6
6
|
import { SeverityBadge as s } from "../components/SeverityBadge.js";
|
|
7
|
-
import { DataState as
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
7
|
+
import { DataState as ee } from "../components/DataState.js";
|
|
8
|
+
import { StackedBar as c } from "../components/viz/StackedBar.js";
|
|
9
|
+
import { BarChart as l } from "../components/viz/BarChart.js";
|
|
10
|
+
import "../components/viz/index.js";
|
|
11
|
+
import { useAdapters as u, useConnections as d, useCostSummary as f, useDriftRecords as p, useResources as m, useSyncRuns as h, useViolations as g } from "../hooks/useAdapterCloudApi.js";
|
|
12
|
+
import { formatRelativeTime as _ } from "../utils/formatters.js";
|
|
13
|
+
import { useCallback as v, useMemo as y } from "react";
|
|
14
|
+
import { useI18n as te } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
15
|
+
import { Activity as b, AlertCircle as x, ArrowRight as S, Boxes as C, Cable as w, DollarSign as T, GitCompareArrows as E, Plug as ne, RefreshCw as D, Server as re, ShieldAlert as O } from "lucide-react";
|
|
16
|
+
import { jsx as k, jsxs as A } from "react/jsx-runtime";
|
|
17
|
+
import { EmphasisPanel as j, GlassCard as M, PagePurpose as N } from "@burdenoff/fe-libs/ui";
|
|
15
18
|
//#region src/adaptercloud/pages/OverviewPage.tsx
|
|
16
|
-
function
|
|
19
|
+
function P(e) {
|
|
17
20
|
return e ? String(e.pageInfo.totalCount ?? e.items.length) : "—";
|
|
18
21
|
}
|
|
19
|
-
function
|
|
20
|
-
let { navigateTo:
|
|
21
|
-
let n =
|
|
22
|
+
function F() {
|
|
23
|
+
let { navigateTo: F, currentUser: I } = e(), { t: L } = te(), R = v((e, t) => {
|
|
24
|
+
let n = L(e);
|
|
22
25
|
return n === e ? t : n;
|
|
23
|
-
}, [
|
|
26
|
+
}, [L]), z = u({ pagination: { limit: 100 } }), B = d({ pagination: { limit: 100 } }), V = m({ pagination: { limit: 100 } }), H = g({
|
|
24
27
|
status: "OPEN",
|
|
25
28
|
pagination: { limit: 50 }
|
|
26
|
-
}),
|
|
27
|
-
let e =
|
|
29
|
+
}), U = p({ status: "DETECTED" }), W = h({ pagination: { limit: 5 } }), G = f(), K = I?.firstName ?? I?.name ?? "there", q = y(() => {
|
|
30
|
+
let e = B.data?.items ?? [], t = {
|
|
28
31
|
CONNECTED: 0,
|
|
29
32
|
DEGRADED: 0,
|
|
30
33
|
ERROR: 0,
|
|
@@ -33,72 +36,108 @@ function I() {
|
|
|
33
36
|
};
|
|
34
37
|
for (let n of e) t[n.status] += 1;
|
|
35
38
|
return t;
|
|
36
|
-
}, [
|
|
37
|
-
|
|
39
|
+
}, [B.data]), J = y(() => [
|
|
40
|
+
{
|
|
41
|
+
key: "CONNECTED",
|
|
42
|
+
label: "Connected",
|
|
43
|
+
value: q.CONNECTED,
|
|
44
|
+
className: "bg-status-success-text"
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
key: "DEGRADED",
|
|
48
|
+
label: "Degraded",
|
|
49
|
+
value: q.DEGRADED,
|
|
50
|
+
className: "bg-status-warning-text"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
key: "ERROR",
|
|
54
|
+
label: "Error",
|
|
55
|
+
value: q.ERROR,
|
|
56
|
+
className: "bg-status-error-text"
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
key: "PENDING",
|
|
60
|
+
label: "Pending",
|
|
61
|
+
value: q.PENDING,
|
|
62
|
+
className: "bg-accent-blue"
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
key: "DISABLED",
|
|
66
|
+
label: "Disabled",
|
|
67
|
+
value: q.DISABLED,
|
|
68
|
+
className: "bg-text-secondary"
|
|
69
|
+
}
|
|
70
|
+
], [q]), Y = y(() => [...H.data?.items ?? []].sort((e, t) => i[t.severity] - i[e.severity]).slice(0, 5), [H.data]), X = W.data?.items ?? [], Z = y(() => [...G.data?.lines ?? []].sort((e, t) => t.total - e.total).slice(0, 6), [G.data]), Q = y(() => Z.map((e) => ({
|
|
71
|
+
key: e.service,
|
|
72
|
+
label: e.service,
|
|
73
|
+
value: e.total,
|
|
74
|
+
display: r(e.total, G.data?.currency ?? "USD")
|
|
75
|
+
})), [Z, G.data?.currency]), ie = z.isLoading || B.isLoading || V.isLoading || H.isLoading || U.isLoading || G.isLoading, ae = z.isError || B.isError || V.isError || H.isError || U.isError || G.isError, $ = v(() => {
|
|
76
|
+
z.refetch(), B.refetch(), V.refetch(), H.refetch(), U.refetch(), W.refetch(), G.refetch();
|
|
38
77
|
}, [
|
|
78
|
+
z,
|
|
39
79
|
B,
|
|
40
80
|
V,
|
|
41
81
|
H,
|
|
42
82
|
U,
|
|
43
83
|
W,
|
|
44
|
-
G
|
|
45
|
-
|
|
46
|
-
]), ne = [
|
|
84
|
+
G
|
|
85
|
+
]), oe = [
|
|
47
86
|
{
|
|
48
|
-
icon: /* @__PURE__ */
|
|
49
|
-
value:
|
|
50
|
-
label:
|
|
51
|
-
onClick: () =>
|
|
87
|
+
icon: /* @__PURE__ */ k(C, { className: "h-5 w-5" }),
|
|
88
|
+
value: P(z.data),
|
|
89
|
+
label: R("adaptercloud.overview.adapters", "Adapters"),
|
|
90
|
+
onClick: () => F("/adapters")
|
|
52
91
|
},
|
|
53
92
|
{
|
|
54
|
-
icon: /* @__PURE__ */
|
|
55
|
-
value:
|
|
56
|
-
label:
|
|
57
|
-
onClick: () =>
|
|
93
|
+
icon: /* @__PURE__ */ k(w, { className: "h-5 w-5" }),
|
|
94
|
+
value: P(B.data),
|
|
95
|
+
label: R("adaptercloud.overview.connections", "Connections"),
|
|
96
|
+
onClick: () => F("/connections")
|
|
58
97
|
},
|
|
59
98
|
{
|
|
60
|
-
icon: /* @__PURE__ */
|
|
61
|
-
value:
|
|
62
|
-
label:
|
|
63
|
-
onClick: () =>
|
|
99
|
+
icon: /* @__PURE__ */ k(re, { className: "h-5 w-5" }),
|
|
100
|
+
value: P(V.data),
|
|
101
|
+
label: R("adaptercloud.overview.resources", "Resources"),
|
|
102
|
+
onClick: () => F("/resources")
|
|
64
103
|
},
|
|
65
104
|
{
|
|
66
|
-
icon: /* @__PURE__ */
|
|
67
|
-
value:
|
|
68
|
-
label:
|
|
69
|
-
onClick: () =>
|
|
105
|
+
icon: /* @__PURE__ */ k(O, { className: "h-5 w-5" }),
|
|
106
|
+
value: P(H.data),
|
|
107
|
+
label: R("adaptercloud.overview.openViolations", "Open Violations"),
|
|
108
|
+
onClick: () => F("/violations")
|
|
70
109
|
}
|
|
71
110
|
];
|
|
72
|
-
return /* @__PURE__ */
|
|
73
|
-
title: `${
|
|
74
|
-
description:
|
|
75
|
-
actions: /* @__PURE__ */
|
|
111
|
+
return /* @__PURE__ */ A(t, {
|
|
112
|
+
title: `${R("adaptercloud.overview.hello", "Welcome back")}, ${K}`,
|
|
113
|
+
description: R("adaptercloud.overview.subtitle", "Your infrastructure continuum at a glance — fabric, governance, operations and cost."),
|
|
114
|
+
actions: /* @__PURE__ */ A("button", {
|
|
76
115
|
type: "button",
|
|
77
116
|
onClick: $,
|
|
78
117
|
className: "inline-flex items-center gap-2 rounded-lg border border-border-subtle bg-bg-surface px-3 py-2 text-sm font-medium text-text-primary transition-colors hover:bg-accent",
|
|
79
|
-
children: [/* @__PURE__ */
|
|
118
|
+
children: [/* @__PURE__ */ k(D, { className: "h-4 w-4" }), R("adaptercloud.common.refresh", "Refresh")]
|
|
80
119
|
}),
|
|
81
|
-
children: [/* @__PURE__ */
|
|
120
|
+
children: [/* @__PURE__ */ k(N, {
|
|
82
121
|
className: "mb-6",
|
|
83
|
-
children:
|
|
84
|
-
}), /* @__PURE__ */
|
|
85
|
-
isLoading:
|
|
86
|
-
isError:
|
|
87
|
-
error:
|
|
122
|
+
children: R("adaptercloud.overview.purpose", "AdapterCloud connects your fragmented infrastructure — multi-cloud, on-prem, edge and SaaS — into one governable fabric. This overview is your control plane: see what you run, how connected it is, what is out of policy, and what it costs.")
|
|
123
|
+
}), /* @__PURE__ */ A(ee, {
|
|
124
|
+
isLoading: ie,
|
|
125
|
+
isError: ae,
|
|
126
|
+
error: z.error,
|
|
88
127
|
onRetry: $,
|
|
89
128
|
children: [
|
|
90
|
-
/* @__PURE__ */
|
|
129
|
+
/* @__PURE__ */ A(j, {
|
|
91
130
|
className: "mb-8",
|
|
92
|
-
children: [/* @__PURE__ */
|
|
131
|
+
children: [/* @__PURE__ */ k("h2", {
|
|
93
132
|
className: "mb-4 text-lg font-semibold text-text-primary",
|
|
94
|
-
children:
|
|
95
|
-
}), /* @__PURE__ */
|
|
133
|
+
children: R("adaptercloud.overview.estate", "Estate Summary")
|
|
134
|
+
}), /* @__PURE__ */ k("div", {
|
|
96
135
|
className: "grid grid-cols-2 gap-4 lg:grid-cols-4",
|
|
97
|
-
children:
|
|
136
|
+
children: oe.map((e) => /* @__PURE__ */ k("button", {
|
|
98
137
|
type: "button",
|
|
99
138
|
onClick: e.onClick,
|
|
100
139
|
className: "text-left",
|
|
101
|
-
children: /* @__PURE__ */
|
|
140
|
+
children: /* @__PURE__ */ k(n, {
|
|
102
141
|
icon: e.icon,
|
|
103
142
|
value: e.value,
|
|
104
143
|
label: e.label
|
|
@@ -106,223 +145,199 @@ function I() {
|
|
|
106
145
|
}, e.label))
|
|
107
146
|
})]
|
|
108
147
|
}),
|
|
109
|
-
/* @__PURE__ */
|
|
148
|
+
/* @__PURE__ */ A("div", {
|
|
110
149
|
className: "mb-8 grid grid-cols-1 gap-6 lg:grid-cols-2",
|
|
111
|
-
children: [/* @__PURE__ */
|
|
150
|
+
children: [/* @__PURE__ */ A("section", { children: [/* @__PURE__ */ A("div", {
|
|
112
151
|
className: "mb-4 flex items-center justify-between",
|
|
113
|
-
children: [/* @__PURE__ */
|
|
152
|
+
children: [/* @__PURE__ */ k("h2", {
|
|
114
153
|
className: "text-lg font-semibold text-text-primary",
|
|
115
|
-
children:
|
|
116
|
-
}), /* @__PURE__ */
|
|
154
|
+
children: R("adaptercloud.overview.connectionHealth", "Connection Health")
|
|
155
|
+
}), /* @__PURE__ */ A("button", {
|
|
117
156
|
type: "button",
|
|
118
|
-
onClick: () =>
|
|
157
|
+
onClick: () => F("/connections"),
|
|
119
158
|
className: "flex items-center gap-1 text-sm font-medium text-accent-blue hover:underline",
|
|
120
159
|
children: [
|
|
121
|
-
|
|
160
|
+
R("adaptercloud.common.viewAll", "View all"),
|
|
122
161
|
" ",
|
|
123
|
-
/* @__PURE__ */
|
|
162
|
+
/* @__PURE__ */ k(S, { className: "h-3.5 w-3.5" })
|
|
124
163
|
]
|
|
125
164
|
})]
|
|
126
|
-
}), /* @__PURE__ */
|
|
165
|
+
}), /* @__PURE__ */ k(M, {
|
|
127
166
|
className: "p-5",
|
|
128
|
-
children:
|
|
129
|
-
className: "space-y-3",
|
|
130
|
-
children: [
|
|
131
|
-
["CONNECTED", J.CONNECTED],
|
|
132
|
-
["DEGRADED", J.DEGRADED],
|
|
133
|
-
["ERROR", J.ERROR],
|
|
134
|
-
["PENDING", J.PENDING],
|
|
135
|
-
["DISABLED", J.DISABLED]
|
|
136
|
-
].map(([e, t]) => /* @__PURE__ */ M("li", {
|
|
137
|
-
className: "flex items-center justify-between",
|
|
138
|
-
children: [/* @__PURE__ */ j(o, { status: e }), /* @__PURE__ */ j("span", {
|
|
139
|
-
className: "text-sm font-semibold tabular-nums text-text-primary",
|
|
140
|
-
children: t
|
|
141
|
-
})]
|
|
142
|
-
}, e))
|
|
143
|
-
}) : /* @__PURE__ */ M("div", {
|
|
167
|
+
children: B.data && B.data.items.length > 0 ? /* @__PURE__ */ k(c, { segments: J }) : /* @__PURE__ */ A("div", {
|
|
144
168
|
className: "flex flex-col items-center gap-3 py-6 text-center",
|
|
145
169
|
children: [
|
|
146
|
-
/* @__PURE__ */
|
|
147
|
-
/* @__PURE__ */
|
|
170
|
+
/* @__PURE__ */ k(ne, { className: "h-8 w-8 text-text-secondary" }),
|
|
171
|
+
/* @__PURE__ */ k("p", {
|
|
148
172
|
className: "text-sm text-text-secondary",
|
|
149
|
-
children:
|
|
173
|
+
children: R("adaptercloud.overview.noConnections", "No connections yet. Connect a target to start discovering resources.")
|
|
150
174
|
}),
|
|
151
|
-
/* @__PURE__ */
|
|
175
|
+
/* @__PURE__ */ k("button", {
|
|
152
176
|
type: "button",
|
|
153
|
-
onClick: () =>
|
|
177
|
+
onClick: () => F("/connections/new"),
|
|
154
178
|
className: "rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text transition-colors hover:opacity-90",
|
|
155
|
-
children:
|
|
179
|
+
children: R("adaptercloud.overview.addConnection", "Add connection")
|
|
156
180
|
})
|
|
157
181
|
]
|
|
158
182
|
})
|
|
159
|
-
})] }), /* @__PURE__ */
|
|
183
|
+
})] }), /* @__PURE__ */ A("section", { children: [/* @__PURE__ */ A("div", {
|
|
160
184
|
className: "mb-4 flex items-center justify-between",
|
|
161
|
-
children: [/* @__PURE__ */
|
|
185
|
+
children: [/* @__PURE__ */ k("h2", {
|
|
162
186
|
className: "text-lg font-semibold text-text-primary",
|
|
163
|
-
children:
|
|
164
|
-
}), /* @__PURE__ */
|
|
187
|
+
children: R("adaptercloud.overview.costByService", "Cost by Service")
|
|
188
|
+
}), /* @__PURE__ */ A("button", {
|
|
165
189
|
type: "button",
|
|
166
|
-
onClick: () =>
|
|
190
|
+
onClick: () => F("/costs"),
|
|
167
191
|
className: "flex items-center gap-1 text-sm font-medium text-accent-blue hover:underline",
|
|
168
192
|
children: [
|
|
169
|
-
|
|
193
|
+
R("adaptercloud.overview.finops", "FinOps"),
|
|
170
194
|
" ",
|
|
171
|
-
/* @__PURE__ */
|
|
195
|
+
/* @__PURE__ */ k(S, { className: "h-3.5 w-3.5" })
|
|
172
196
|
]
|
|
173
197
|
})]
|
|
174
|
-
}), /* @__PURE__ */ M
|
|
198
|
+
}), /* @__PURE__ */ A(M, {
|
|
175
199
|
className: "p-5",
|
|
176
|
-
children: [/* @__PURE__ */
|
|
200
|
+
children: [/* @__PURE__ */ A("div", {
|
|
177
201
|
className: "mb-4 flex items-baseline gap-2",
|
|
178
202
|
children: [
|
|
179
|
-
/* @__PURE__ */
|
|
180
|
-
/* @__PURE__ */
|
|
203
|
+
/* @__PURE__ */ k(T, { className: "h-5 w-5 text-text-secondary" }),
|
|
204
|
+
/* @__PURE__ */ k("span", {
|
|
181
205
|
className: "text-2xl font-bold tabular-nums text-text-primary",
|
|
182
|
-
children:
|
|
206
|
+
children: G.data ? r(G.data.total, G.data.currency) : "—"
|
|
183
207
|
}),
|
|
184
|
-
/* @__PURE__ */
|
|
208
|
+
/* @__PURE__ */ k("span", {
|
|
185
209
|
className: "text-sm text-text-secondary",
|
|
186
|
-
children:
|
|
210
|
+
children: R("adaptercloud.overview.totalSpend", "total spend")
|
|
187
211
|
})
|
|
188
212
|
]
|
|
189
|
-
}),
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
children: [/* @__PURE__ */ j("span", {
|
|
194
|
-
className: "truncate text-text-primary",
|
|
195
|
-
children: e.service
|
|
196
|
-
}), /* @__PURE__ */ j("span", {
|
|
197
|
-
className: "tabular-nums text-text-secondary",
|
|
198
|
-
children: r(e.total, K.data?.currency ?? "USD")
|
|
199
|
-
})]
|
|
200
|
-
}, e.service))
|
|
201
|
-
}) : /* @__PURE__ */ j("p", {
|
|
213
|
+
}), Q.length > 0 ? /* @__PURE__ */ k(l, {
|
|
214
|
+
data: Q,
|
|
215
|
+
labelWidthClassName: "w-24 sm:w-32"
|
|
216
|
+
}) : /* @__PURE__ */ k("p", {
|
|
202
217
|
className: "py-4 text-center text-sm text-text-secondary",
|
|
203
|
-
children:
|
|
218
|
+
children: R("adaptercloud.overview.noCost", "No cost records ingested yet. Run a cost-ingest sync to populate FinOps.")
|
|
204
219
|
})]
|
|
205
220
|
})] })]
|
|
206
221
|
}),
|
|
207
|
-
/* @__PURE__ */
|
|
222
|
+
/* @__PURE__ */ A("div", {
|
|
208
223
|
className: "grid grid-cols-1 gap-6 lg:grid-cols-2",
|
|
209
|
-
children: [/* @__PURE__ */
|
|
210
|
-
/* @__PURE__ */
|
|
224
|
+
children: [/* @__PURE__ */ A("section", { children: [
|
|
225
|
+
/* @__PURE__ */ A("div", {
|
|
211
226
|
className: "mb-4 flex items-center justify-between",
|
|
212
|
-
children: [/* @__PURE__ */
|
|
227
|
+
children: [/* @__PURE__ */ k("h2", {
|
|
213
228
|
className: "text-lg font-semibold text-text-primary",
|
|
214
|
-
children:
|
|
215
|
-
}), /* @__PURE__ */
|
|
229
|
+
children: R("adaptercloud.overview.priorityViolations", "Priority Violations")
|
|
230
|
+
}), /* @__PURE__ */ A("button", {
|
|
216
231
|
type: "button",
|
|
217
|
-
onClick: () =>
|
|
232
|
+
onClick: () => F("/violations"),
|
|
218
233
|
className: "flex items-center gap-1 text-sm font-medium text-accent-blue hover:underline",
|
|
219
234
|
children: [
|
|
220
|
-
|
|
235
|
+
R("adaptercloud.overview.queue", "Queue"),
|
|
221
236
|
" ",
|
|
222
|
-
/* @__PURE__ */
|
|
237
|
+
/* @__PURE__ */ k(S, { className: "h-3.5 w-3.5" })
|
|
223
238
|
]
|
|
224
239
|
})]
|
|
225
240
|
}),
|
|
226
|
-
/* @__PURE__ */
|
|
241
|
+
/* @__PURE__ */ k("div", {
|
|
227
242
|
className: "divide-y divide-border rounded-xl border border-border-subtle bg-bg-surface",
|
|
228
|
-
children: Y.length > 0 ? Y.map((e) => /* @__PURE__ */
|
|
243
|
+
children: Y.length > 0 ? Y.map((e) => /* @__PURE__ */ A("button", {
|
|
229
244
|
type: "button",
|
|
230
|
-
onClick: () =>
|
|
245
|
+
onClick: () => F("/violations"),
|
|
231
246
|
className: "flex w-full items-start gap-3 px-4 py-3 text-left transition-colors hover:bg-accent/50",
|
|
232
247
|
children: [
|
|
233
|
-
/* @__PURE__ */
|
|
234
|
-
/* @__PURE__ */
|
|
248
|
+
/* @__PURE__ */ k(x, { className: "mt-0.5 h-4 w-4 shrink-0 text-status-error-text" }),
|
|
249
|
+
/* @__PURE__ */ A("div", {
|
|
235
250
|
className: "min-w-0 flex-1",
|
|
236
|
-
children: [/* @__PURE__ */
|
|
251
|
+
children: [/* @__PURE__ */ k("p", {
|
|
237
252
|
className: "truncate text-sm font-medium text-text-primary",
|
|
238
253
|
children: e.message
|
|
239
|
-
}), /* @__PURE__ */
|
|
254
|
+
}), /* @__PURE__ */ A("p", {
|
|
240
255
|
className: "mt-0.5 text-xs text-text-secondary",
|
|
241
256
|
children: [
|
|
242
|
-
e.policy?.name ??
|
|
257
|
+
e.policy?.name ?? R("adaptercloud.overview.policy", "Policy"),
|
|
243
258
|
" ·",
|
|
244
259
|
" ",
|
|
245
|
-
|
|
260
|
+
_(e.detectedAt)
|
|
246
261
|
]
|
|
247
262
|
})]
|
|
248
263
|
}),
|
|
249
|
-
/* @__PURE__ */
|
|
264
|
+
/* @__PURE__ */ k(s, { severity: e.severity })
|
|
250
265
|
]
|
|
251
|
-
}, e.id)) : /* @__PURE__ */
|
|
266
|
+
}, e.id)) : /* @__PURE__ */ A("div", {
|
|
252
267
|
className: "flex flex-col items-center gap-2 px-4 py-8 text-center",
|
|
253
|
-
children: [/* @__PURE__ */
|
|
268
|
+
children: [/* @__PURE__ */ k(O, { className: "h-8 w-8 text-status-success-text" }), /* @__PURE__ */ k("p", {
|
|
254
269
|
className: "text-sm text-text-secondary",
|
|
255
|
-
children:
|
|
270
|
+
children: R("adaptercloud.overview.noViolations", "No open violations. Estate is clean.")
|
|
256
271
|
})]
|
|
257
272
|
})
|
|
258
273
|
}),
|
|
259
|
-
|
|
274
|
+
U.data && U.data.length > 0 && /* @__PURE__ */ A("button", {
|
|
260
275
|
type: "button",
|
|
261
|
-
onClick: () =>
|
|
276
|
+
onClick: () => F("/drift"),
|
|
262
277
|
className: "mt-3 flex w-full items-center gap-2 rounded-lg border border-border-subtle bg-bg-surface px-4 py-3 text-left text-sm transition-colors hover:bg-accent/50",
|
|
263
278
|
children: [
|
|
264
|
-
/* @__PURE__ */
|
|
265
|
-
/* @__PURE__ */
|
|
279
|
+
/* @__PURE__ */ k(E, { className: "h-4 w-4 text-status-warning-text" }),
|
|
280
|
+
/* @__PURE__ */ A("span", {
|
|
266
281
|
className: "text-text-primary",
|
|
267
282
|
children: [
|
|
268
|
-
|
|
283
|
+
U.data.length,
|
|
269
284
|
" ",
|
|
270
|
-
|
|
285
|
+
R("adaptercloud.overview.driftDetected", "drift records detected")
|
|
271
286
|
]
|
|
272
287
|
}),
|
|
273
|
-
/* @__PURE__ */
|
|
288
|
+
/* @__PURE__ */ k(S, { className: "ml-auto h-3.5 w-3.5 text-text-secondary" })
|
|
274
289
|
]
|
|
275
290
|
})
|
|
276
|
-
] }), /* @__PURE__ */
|
|
291
|
+
] }), /* @__PURE__ */ A("section", { children: [/* @__PURE__ */ A("div", {
|
|
277
292
|
className: "mb-4 flex items-center justify-between",
|
|
278
|
-
children: [/* @__PURE__ */
|
|
293
|
+
children: [/* @__PURE__ */ k("h2", {
|
|
279
294
|
className: "text-lg font-semibold text-text-primary",
|
|
280
|
-
children:
|
|
281
|
-
}), /* @__PURE__ */
|
|
295
|
+
children: R("adaptercloud.overview.recentRuns", "Recent Sync Runs")
|
|
296
|
+
}), /* @__PURE__ */ A("button", {
|
|
282
297
|
type: "button",
|
|
283
|
-
onClick: () =>
|
|
298
|
+
onClick: () => F("/sync-runs"),
|
|
284
299
|
className: "flex items-center gap-1 text-sm font-medium text-accent-blue hover:underline",
|
|
285
300
|
children: [
|
|
286
|
-
|
|
301
|
+
R("adaptercloud.common.viewAll", "View all"),
|
|
287
302
|
" ",
|
|
288
|
-
/* @__PURE__ */
|
|
303
|
+
/* @__PURE__ */ k(S, { className: "h-3.5 w-3.5" })
|
|
289
304
|
]
|
|
290
305
|
})]
|
|
291
|
-
}), /* @__PURE__ */
|
|
306
|
+
}), /* @__PURE__ */ k("div", {
|
|
292
307
|
className: "divide-y divide-border rounded-xl border border-border-subtle bg-bg-surface",
|
|
293
|
-
children: X.length > 0 ? X.map((e) => /* @__PURE__ */
|
|
308
|
+
children: X.length > 0 ? X.map((e) => /* @__PURE__ */ A("button", {
|
|
294
309
|
type: "button",
|
|
295
|
-
onClick: () =>
|
|
310
|
+
onClick: () => F("/sync-runs"),
|
|
296
311
|
className: "flex w-full items-center gap-3 px-4 py-3 text-left transition-colors hover:bg-accent/50",
|
|
297
312
|
children: [
|
|
298
|
-
/* @__PURE__ */
|
|
313
|
+
/* @__PURE__ */ k("div", {
|
|
299
314
|
className: "flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-bg-sunken",
|
|
300
|
-
children: /* @__PURE__ */
|
|
315
|
+
children: /* @__PURE__ */ k(b, { className: "h-4 w-4 text-text-secondary" })
|
|
301
316
|
}),
|
|
302
|
-
/* @__PURE__ */
|
|
317
|
+
/* @__PURE__ */ A("div", {
|
|
303
318
|
className: "min-w-0 flex-1",
|
|
304
|
-
children: [/* @__PURE__ */
|
|
319
|
+
children: [/* @__PURE__ */ k("p", {
|
|
305
320
|
className: "text-sm font-medium text-text-primary",
|
|
306
321
|
children: a[e.kind]
|
|
307
|
-
}), /* @__PURE__ */
|
|
322
|
+
}), /* @__PURE__ */ A("p", {
|
|
308
323
|
className: "mt-0.5 text-xs text-text-secondary",
|
|
309
324
|
children: [
|
|
310
325
|
e.discoveredCount,
|
|
311
326
|
" ",
|
|
312
|
-
|
|
327
|
+
R("adaptercloud.overview.discovered", "discovered"),
|
|
313
328
|
" ",
|
|
314
329
|
"· ",
|
|
315
|
-
|
|
330
|
+
_(e.createdAt)
|
|
316
331
|
]
|
|
317
332
|
})]
|
|
318
333
|
}),
|
|
319
|
-
/* @__PURE__ */
|
|
334
|
+
/* @__PURE__ */ k(o, { status: e.status })
|
|
320
335
|
]
|
|
321
|
-
}, e.id)) : /* @__PURE__ */
|
|
336
|
+
}, e.id)) : /* @__PURE__ */ A("div", {
|
|
322
337
|
className: "flex flex-col items-center gap-2 px-4 py-8 text-center",
|
|
323
|
-
children: [/* @__PURE__ */
|
|
338
|
+
children: [/* @__PURE__ */ k(D, { className: "h-8 w-8 text-text-secondary" }), /* @__PURE__ */ k("p", {
|
|
324
339
|
className: "text-sm text-text-secondary",
|
|
325
|
-
children:
|
|
340
|
+
children: R("adaptercloud.overview.noRuns", "No sync runs yet.")
|
|
326
341
|
})]
|
|
327
342
|
})
|
|
328
343
|
})] })]
|
|
@@ -332,6 +347,6 @@ function I() {
|
|
|
332
347
|
});
|
|
333
348
|
}
|
|
334
349
|
//#endregion
|
|
335
|
-
export {
|
|
350
|
+
export { F as OverviewPage };
|
|
336
351
|
|
|
337
352
|
//# sourceMappingURL=OverviewPage.js.map
|