@burdenoff/microfe-adaptercloud 2026.706.1 → 2026.706.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/AdapterCloudRoutes.js +5 -1
- package/dist/adaptercloud/AdapterCloudRoutes.js.map +1 -1
- package/dist/adaptercloud/components/ConfirmDialog.js +27 -0
- package/dist/adaptercloud/components/ConfirmDialog.js.map +1 -0
- package/dist/adaptercloud/components/DataState.js +1 -1
- package/dist/adaptercloud/components/DataState.js.map +1 -1
- package/dist/adaptercloud/hooks/useAdapterCloudApi.js +50 -31
- package/dist/adaptercloud/hooks/useAdapterCloudApi.js.map +1 -1
- package/dist/adaptercloud/pages/OverviewPage.js +159 -156
- package/dist/adaptercloud/pages/OverviewPage.js.map +1 -1
- package/dist/adaptercloud/pages/adapters/AdapterDetailPage.js +102 -89
- package/dist/adaptercloud/pages/adapters/AdapterDetailPage.js.map +1 -1
- package/dist/adaptercloud/pages/adapters/AdapterFormPage.js +2 -0
- package/dist/adaptercloud/pages/adapters/AdapterFormPage.js.map +1 -1
- package/dist/adaptercloud/pages/adapters/AdaptersListPage.js +2 -0
- package/dist/adaptercloud/pages/adapters/AdaptersListPage.js.map +1 -1
- package/dist/adaptercloud/pages/connections/ConnectionDetailPage.js +141 -124
- package/dist/adaptercloud/pages/connections/ConnectionDetailPage.js.map +1 -1
- package/dist/adaptercloud/pages/connections/ConnectionFormPage.js +2 -0
- package/dist/adaptercloud/pages/connections/ConnectionFormPage.js.map +1 -1
- package/dist/adaptercloud/pages/connections/ConnectionsListPage.js +1 -0
- package/dist/adaptercloud/pages/connections/ConnectionsListPage.js.map +1 -1
- package/dist/adaptercloud/pages/costs/CostsPage.js +112 -87
- package/dist/adaptercloud/pages/costs/CostsPage.js.map +1 -1
- package/dist/adaptercloud/pages/drift/DriftListPage.js +81 -59
- package/dist/adaptercloud/pages/drift/DriftListPage.js.map +1 -1
- package/dist/adaptercloud/pages/policies/PoliciesListPage.js +2 -0
- package/dist/adaptercloud/pages/policies/PoliciesListPage.js.map +1 -1
- package/dist/adaptercloud/pages/policies/PolicyDetailPage.js +109 -91
- package/dist/adaptercloud/pages/policies/PolicyDetailPage.js.map +1 -1
- package/dist/adaptercloud/pages/policies/PolicyFormPage.js +211 -184
- package/dist/adaptercloud/pages/policies/PolicyFormPage.js.map +1 -1
- package/dist/adaptercloud/pages/resources/ResourceDetailPage.js +153 -111
- package/dist/adaptercloud/pages/resources/ResourceDetailPage.js.map +1 -1
- package/dist/adaptercloud/pages/resources/ResourcesListPage.js +111 -83
- package/dist/adaptercloud/pages/resources/ResourcesListPage.js.map +1 -1
- package/dist/adaptercloud/pages/sync-runs/SyncRunsListPage.js +108 -86
- package/dist/adaptercloud/pages/sync-runs/SyncRunsListPage.js.map +1 -1
- package/dist/adaptercloud/pages/violations/ViolationsListPage.js +11 -3
- package/dist/adaptercloud/pages/violations/ViolationsListPage.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,27 +1,30 @@
|
|
|
1
1
|
import { useAdapterCloud as e } from "../context/AdapterCloudContext.js";
|
|
2
2
|
import { PageLayout as t } from "../components/PageLayout.js";
|
|
3
3
|
import { MetricsCard as n } from "../components/MetricsCard.js";
|
|
4
|
-
import { formatMoney as r, severityRank as i, syncKindLabels as
|
|
5
|
-
import { StatusBadge as
|
|
6
|
-
import { SeverityBadge as
|
|
7
|
-
import { DataState as
|
|
8
|
-
import { useAdapters as
|
|
9
|
-
import { formatRelativeTime as
|
|
10
|
-
import { useCallback as
|
|
11
|
-
import { useI18n as
|
|
12
|
-
import { Activity as
|
|
13
|
-
import { jsx as
|
|
14
|
-
import { EmphasisPanel as
|
|
4
|
+
import { formatMoney as r, severityRank as i, syncKindLabels as a } from "../utils/domain.js";
|
|
5
|
+
import { StatusBadge as o } from "../components/StatusBadge.js";
|
|
6
|
+
import { SeverityBadge as s } from "../components/SeverityBadge.js";
|
|
7
|
+
import { DataState as c } from "../components/DataState.js";
|
|
8
|
+
import { useAdapters as l, useConnections as u, useCostSummary as d, useDriftRecords as f, useResources as p, useSyncRuns as m, useViolations as h } from "../hooks/useAdapterCloudApi.js";
|
|
9
|
+
import { formatRelativeTime as g } from "../utils/formatters.js";
|
|
10
|
+
import { useCallback as _, useMemo as v } from "react";
|
|
11
|
+
import { useI18n as y } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
12
|
+
import { Activity as b, AlertCircle as x, ArrowRight as S, Boxes as C, Cable as w, DollarSign as T, GitCompareArrows as E, Plug as D, RefreshCw as O, Server as k, ShieldAlert as A } from "lucide-react";
|
|
13
|
+
import { jsx as j, jsxs as M } from "react/jsx-runtime";
|
|
14
|
+
import { EmphasisPanel as ee, GlassCard as N, PagePurpose as P } from "@burdenoff/fe-libs/ui";
|
|
15
15
|
//#region src/adaptercloud/pages/OverviewPage.tsx
|
|
16
|
-
function F() {
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
function F(e) {
|
|
17
|
+
return e ? String(e.pageInfo.totalCount ?? e.items.length) : "—";
|
|
18
|
+
}
|
|
19
|
+
function I() {
|
|
20
|
+
let { navigateTo: I, currentUser: L } = e(), { t: R } = y(), z = _((e, t) => {
|
|
21
|
+
let n = R(e);
|
|
19
22
|
return n === e ? t : n;
|
|
20
|
-
}, [
|
|
23
|
+
}, [R]), B = l({ pagination: { limit: 100 } }), V = u({ pagination: { limit: 100 } }), H = p({ pagination: { limit: 100 } }), U = h({
|
|
21
24
|
status: "OPEN",
|
|
22
25
|
pagination: { limit: 50 }
|
|
23
|
-
}),
|
|
24
|
-
let e =
|
|
26
|
+
}), W = f({ status: "DETECTED" }), G = m({ pagination: { limit: 5 } }), K = d(), q = L?.firstName ?? L?.name ?? "there", J = v(() => {
|
|
27
|
+
let e = V.data?.items ?? [], t = {
|
|
25
28
|
CONNECTED: 0,
|
|
26
29
|
DEGRADED: 0,
|
|
27
30
|
ERROR: 0,
|
|
@@ -30,72 +33,72 @@ function F() {
|
|
|
30
33
|
};
|
|
31
34
|
for (let n of e) t[n.status] += 1;
|
|
32
35
|
return t;
|
|
33
|
-
}, [
|
|
34
|
-
|
|
36
|
+
}, [V.data]), Y = v(() => [...U.data?.items ?? []].sort((e, t) => i[t.severity] - i[e.severity]).slice(0, 5), [U.data]), X = G.data?.items ?? [], Z = v(() => [...K.data?.lines ?? []].sort((e, t) => t.total - e.total).slice(0, 6), [K.data]), Q = B.isLoading || V.isLoading || H.isLoading || U.isLoading || W.isLoading || K.isLoading, te = B.isError || V.isError || H.isError || U.isError || W.isError || K.isError, $ = _(() => {
|
|
37
|
+
B.refetch(), V.refetch(), H.refetch(), U.refetch(), W.refetch(), G.refetch(), K.refetch();
|
|
35
38
|
}, [
|
|
36
|
-
z,
|
|
37
39
|
B,
|
|
38
40
|
V,
|
|
39
41
|
H,
|
|
40
42
|
U,
|
|
41
43
|
W,
|
|
42
|
-
G
|
|
43
|
-
|
|
44
|
+
G,
|
|
45
|
+
K
|
|
46
|
+
]), ne = [
|
|
44
47
|
{
|
|
45
|
-
icon: /* @__PURE__ */
|
|
46
|
-
value:
|
|
47
|
-
label:
|
|
48
|
-
onClick: () =>
|
|
48
|
+
icon: /* @__PURE__ */ j(C, { className: "h-5 w-5" }),
|
|
49
|
+
value: F(B.data),
|
|
50
|
+
label: z("adaptercloud.overview.adapters", "Adapters"),
|
|
51
|
+
onClick: () => I("/adapters")
|
|
49
52
|
},
|
|
50
53
|
{
|
|
51
|
-
icon: /* @__PURE__ */
|
|
52
|
-
value:
|
|
53
|
-
label:
|
|
54
|
-
onClick: () =>
|
|
54
|
+
icon: /* @__PURE__ */ j(w, { className: "h-5 w-5" }),
|
|
55
|
+
value: F(V.data),
|
|
56
|
+
label: z("adaptercloud.overview.connections", "Connections"),
|
|
57
|
+
onClick: () => I("/connections")
|
|
55
58
|
},
|
|
56
59
|
{
|
|
57
|
-
icon: /* @__PURE__ */
|
|
58
|
-
value:
|
|
59
|
-
label:
|
|
60
|
-
onClick: () =>
|
|
60
|
+
icon: /* @__PURE__ */ j(k, { className: "h-5 w-5" }),
|
|
61
|
+
value: F(H.data),
|
|
62
|
+
label: z("adaptercloud.overview.resources", "Resources"),
|
|
63
|
+
onClick: () => I("/resources")
|
|
61
64
|
},
|
|
62
65
|
{
|
|
63
|
-
icon: /* @__PURE__ */ A
|
|
64
|
-
value:
|
|
65
|
-
label:
|
|
66
|
-
onClick: () =>
|
|
66
|
+
icon: /* @__PURE__ */ j(A, { className: "h-5 w-5" }),
|
|
67
|
+
value: F(U.data),
|
|
68
|
+
label: z("adaptercloud.overview.openViolations", "Open Violations"),
|
|
69
|
+
onClick: () => I("/violations")
|
|
67
70
|
}
|
|
68
71
|
];
|
|
69
|
-
return /* @__PURE__ */
|
|
70
|
-
title: `${
|
|
71
|
-
description:
|
|
72
|
-
actions: /* @__PURE__ */
|
|
72
|
+
return /* @__PURE__ */ M(t, {
|
|
73
|
+
title: `${z("adaptercloud.overview.hello", "Welcome back")}, ${q}`,
|
|
74
|
+
description: z("adaptercloud.overview.subtitle", "Your infrastructure continuum at a glance — fabric, governance, operations and cost."),
|
|
75
|
+
actions: /* @__PURE__ */ M("button", {
|
|
73
76
|
type: "button",
|
|
74
77
|
onClick: $,
|
|
75
78
|
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",
|
|
76
|
-
children: [/* @__PURE__ */
|
|
79
|
+
children: [/* @__PURE__ */ j(O, { className: "h-4 w-4" }), z("adaptercloud.common.refresh", "Refresh")]
|
|
77
80
|
}),
|
|
78
|
-
children: [/* @__PURE__ */
|
|
81
|
+
children: [/* @__PURE__ */ j(P, {
|
|
79
82
|
className: "mb-6",
|
|
80
|
-
children:
|
|
81
|
-
}), /* @__PURE__ */
|
|
82
|
-
isLoading:
|
|
83
|
-
isError:
|
|
84
|
-
error:
|
|
83
|
+
children: z("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.")
|
|
84
|
+
}), /* @__PURE__ */ M(c, {
|
|
85
|
+
isLoading: Q,
|
|
86
|
+
isError: te,
|
|
87
|
+
error: B.error,
|
|
85
88
|
onRetry: $,
|
|
86
89
|
children: [
|
|
87
|
-
/* @__PURE__ */
|
|
90
|
+
/* @__PURE__ */ M(ee, {
|
|
88
91
|
className: "mb-8",
|
|
89
|
-
children: [/* @__PURE__ */
|
|
92
|
+
children: [/* @__PURE__ */ j("h2", {
|
|
90
93
|
className: "mb-4 text-lg font-semibold text-text-primary",
|
|
91
|
-
children:
|
|
92
|
-
}), /* @__PURE__ */
|
|
94
|
+
children: z("adaptercloud.overview.estate", "Estate Summary")
|
|
95
|
+
}), /* @__PURE__ */ j("div", {
|
|
93
96
|
className: "grid grid-cols-2 gap-4 lg:grid-cols-4",
|
|
94
|
-
children:
|
|
97
|
+
children: ne.map((e) => /* @__PURE__ */ j("button", {
|
|
95
98
|
type: "button",
|
|
96
99
|
onClick: e.onClick,
|
|
97
100
|
className: "text-left",
|
|
98
|
-
children: /* @__PURE__ */
|
|
101
|
+
children: /* @__PURE__ */ j(n, {
|
|
99
102
|
icon: e.icon,
|
|
100
103
|
value: e.value,
|
|
101
104
|
label: e.label
|
|
@@ -103,223 +106,223 @@ function F() {
|
|
|
103
106
|
}, e.label))
|
|
104
107
|
})]
|
|
105
108
|
}),
|
|
106
|
-
/* @__PURE__ */
|
|
109
|
+
/* @__PURE__ */ M("div", {
|
|
107
110
|
className: "mb-8 grid grid-cols-1 gap-6 lg:grid-cols-2",
|
|
108
|
-
children: [/* @__PURE__ */
|
|
111
|
+
children: [/* @__PURE__ */ M("section", { children: [/* @__PURE__ */ M("div", {
|
|
109
112
|
className: "mb-4 flex items-center justify-between",
|
|
110
|
-
children: [/* @__PURE__ */
|
|
113
|
+
children: [/* @__PURE__ */ j("h2", {
|
|
111
114
|
className: "text-lg font-semibold text-text-primary",
|
|
112
|
-
children:
|
|
113
|
-
}), /* @__PURE__ */
|
|
115
|
+
children: z("adaptercloud.overview.connectionHealth", "Connection Health")
|
|
116
|
+
}), /* @__PURE__ */ M("button", {
|
|
114
117
|
type: "button",
|
|
115
|
-
onClick: () =>
|
|
116
|
-
className: "flex items-center gap-1 text-sm font-medium text-
|
|
118
|
+
onClick: () => I("/connections"),
|
|
119
|
+
className: "flex items-center gap-1 text-sm font-medium text-accent-blue hover:underline",
|
|
117
120
|
children: [
|
|
118
|
-
|
|
121
|
+
z("adaptercloud.common.viewAll", "View all"),
|
|
119
122
|
" ",
|
|
120
|
-
/* @__PURE__ */
|
|
123
|
+
/* @__PURE__ */ j(S, { className: "h-3.5 w-3.5" })
|
|
121
124
|
]
|
|
122
125
|
})]
|
|
123
|
-
}), /* @__PURE__ */
|
|
126
|
+
}), /* @__PURE__ */ j(N, {
|
|
124
127
|
className: "p-5",
|
|
125
|
-
children:
|
|
128
|
+
children: V.data && V.data.items.length > 0 ? /* @__PURE__ */ j("ul", {
|
|
126
129
|
className: "space-y-3",
|
|
127
130
|
children: [
|
|
128
|
-
["CONNECTED",
|
|
129
|
-
["DEGRADED",
|
|
130
|
-
["ERROR",
|
|
131
|
-
["PENDING",
|
|
132
|
-
["DISABLED",
|
|
133
|
-
].map(([e, t]) => /* @__PURE__ */
|
|
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", {
|
|
134
137
|
className: "flex items-center justify-between",
|
|
135
|
-
children: [/* @__PURE__ */
|
|
138
|
+
children: [/* @__PURE__ */ j(o, { status: e }), /* @__PURE__ */ j("span", {
|
|
136
139
|
className: "text-sm font-semibold tabular-nums text-text-primary",
|
|
137
140
|
children: t
|
|
138
141
|
})]
|
|
139
142
|
}, e))
|
|
140
|
-
}) : /* @__PURE__ */
|
|
143
|
+
}) : /* @__PURE__ */ M("div", {
|
|
141
144
|
className: "flex flex-col items-center gap-3 py-6 text-center",
|
|
142
145
|
children: [
|
|
143
|
-
/* @__PURE__ */
|
|
144
|
-
/* @__PURE__ */
|
|
146
|
+
/* @__PURE__ */ j(D, { className: "h-8 w-8 text-text-secondary" }),
|
|
147
|
+
/* @__PURE__ */ j("p", {
|
|
145
148
|
className: "text-sm text-text-secondary",
|
|
146
|
-
children:
|
|
149
|
+
children: z("adaptercloud.overview.noConnections", "No connections yet. Connect a target to start discovering resources.")
|
|
147
150
|
}),
|
|
148
|
-
/* @__PURE__ */
|
|
151
|
+
/* @__PURE__ */ j("button", {
|
|
149
152
|
type: "button",
|
|
150
|
-
onClick: () =>
|
|
153
|
+
onClick: () => I("/connections/new"),
|
|
151
154
|
className: "rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text transition-colors hover:opacity-90",
|
|
152
|
-
children:
|
|
155
|
+
children: z("adaptercloud.overview.addConnection", "Add connection")
|
|
153
156
|
})
|
|
154
157
|
]
|
|
155
158
|
})
|
|
156
|
-
})] }), /* @__PURE__ */
|
|
159
|
+
})] }), /* @__PURE__ */ M("section", { children: [/* @__PURE__ */ M("div", {
|
|
157
160
|
className: "mb-4 flex items-center justify-between",
|
|
158
|
-
children: [/* @__PURE__ */
|
|
161
|
+
children: [/* @__PURE__ */ j("h2", {
|
|
159
162
|
className: "text-lg font-semibold text-text-primary",
|
|
160
|
-
children:
|
|
161
|
-
}), /* @__PURE__ */
|
|
163
|
+
children: z("adaptercloud.overview.costByService", "Cost by Service")
|
|
164
|
+
}), /* @__PURE__ */ M("button", {
|
|
162
165
|
type: "button",
|
|
163
|
-
onClick: () =>
|
|
164
|
-
className: "flex items-center gap-1 text-sm font-medium text-
|
|
166
|
+
onClick: () => I("/costs"),
|
|
167
|
+
className: "flex items-center gap-1 text-sm font-medium text-accent-blue hover:underline",
|
|
165
168
|
children: [
|
|
166
|
-
|
|
169
|
+
z("adaptercloud.overview.finops", "FinOps"),
|
|
167
170
|
" ",
|
|
168
|
-
/* @__PURE__ */
|
|
171
|
+
/* @__PURE__ */ j(S, { className: "h-3.5 w-3.5" })
|
|
169
172
|
]
|
|
170
173
|
})]
|
|
171
|
-
}), /* @__PURE__ */
|
|
174
|
+
}), /* @__PURE__ */ M(N, {
|
|
172
175
|
className: "p-5",
|
|
173
|
-
children: [/* @__PURE__ */
|
|
176
|
+
children: [/* @__PURE__ */ M("div", {
|
|
174
177
|
className: "mb-4 flex items-baseline gap-2",
|
|
175
178
|
children: [
|
|
176
|
-
/* @__PURE__ */
|
|
177
|
-
/* @__PURE__ */
|
|
179
|
+
/* @__PURE__ */ j(T, { className: "h-5 w-5 text-text-secondary" }),
|
|
180
|
+
/* @__PURE__ */ j("span", {
|
|
178
181
|
className: "text-2xl font-bold tabular-nums text-text-primary",
|
|
179
|
-
children:
|
|
182
|
+
children: K.data ? r(K.data.total, K.data.currency) : "—"
|
|
180
183
|
}),
|
|
181
|
-
/* @__PURE__ */
|
|
184
|
+
/* @__PURE__ */ j("span", {
|
|
182
185
|
className: "text-sm text-text-secondary",
|
|
183
|
-
children:
|
|
186
|
+
children: z("adaptercloud.overview.totalSpend", "total spend")
|
|
184
187
|
})
|
|
185
188
|
]
|
|
186
|
-
}),
|
|
189
|
+
}), Z.length > 0 ? /* @__PURE__ */ j("ul", {
|
|
187
190
|
className: "space-y-2",
|
|
188
|
-
children:
|
|
191
|
+
children: Z.map((e) => /* @__PURE__ */ M("li", {
|
|
189
192
|
className: "flex items-center justify-between text-sm",
|
|
190
|
-
children: [/* @__PURE__ */
|
|
193
|
+
children: [/* @__PURE__ */ j("span", {
|
|
191
194
|
className: "truncate text-text-primary",
|
|
192
195
|
children: e.service
|
|
193
|
-
}), /* @__PURE__ */
|
|
196
|
+
}), /* @__PURE__ */ j("span", {
|
|
194
197
|
className: "tabular-nums text-text-secondary",
|
|
195
|
-
children: r(e.total,
|
|
198
|
+
children: r(e.total, K.data?.currency ?? "USD")
|
|
196
199
|
})]
|
|
197
200
|
}, e.service))
|
|
198
|
-
}) : /* @__PURE__ */
|
|
201
|
+
}) : /* @__PURE__ */ j("p", {
|
|
199
202
|
className: "py-4 text-center text-sm text-text-secondary",
|
|
200
|
-
children:
|
|
203
|
+
children: z("adaptercloud.overview.noCost", "No cost records ingested yet. Run a cost-ingest sync to populate FinOps.")
|
|
201
204
|
})]
|
|
202
205
|
})] })]
|
|
203
206
|
}),
|
|
204
|
-
/* @__PURE__ */
|
|
207
|
+
/* @__PURE__ */ M("div", {
|
|
205
208
|
className: "grid grid-cols-1 gap-6 lg:grid-cols-2",
|
|
206
|
-
children: [/* @__PURE__ */
|
|
207
|
-
/* @__PURE__ */
|
|
209
|
+
children: [/* @__PURE__ */ M("section", { children: [
|
|
210
|
+
/* @__PURE__ */ M("div", {
|
|
208
211
|
className: "mb-4 flex items-center justify-between",
|
|
209
|
-
children: [/* @__PURE__ */
|
|
212
|
+
children: [/* @__PURE__ */ j("h2", {
|
|
210
213
|
className: "text-lg font-semibold text-text-primary",
|
|
211
|
-
children:
|
|
212
|
-
}), /* @__PURE__ */
|
|
214
|
+
children: z("adaptercloud.overview.priorityViolations", "Priority Violations")
|
|
215
|
+
}), /* @__PURE__ */ M("button", {
|
|
213
216
|
type: "button",
|
|
214
|
-
onClick: () =>
|
|
215
|
-
className: "flex items-center gap-1 text-sm font-medium text-
|
|
217
|
+
onClick: () => I("/violations"),
|
|
218
|
+
className: "flex items-center gap-1 text-sm font-medium text-accent-blue hover:underline",
|
|
216
219
|
children: [
|
|
217
|
-
|
|
220
|
+
z("adaptercloud.overview.queue", "Queue"),
|
|
218
221
|
" ",
|
|
219
|
-
/* @__PURE__ */
|
|
222
|
+
/* @__PURE__ */ j(S, { className: "h-3.5 w-3.5" })
|
|
220
223
|
]
|
|
221
224
|
})]
|
|
222
225
|
}),
|
|
223
|
-
/* @__PURE__ */
|
|
226
|
+
/* @__PURE__ */ j("div", {
|
|
224
227
|
className: "divide-y divide-border rounded-xl border border-border-subtle bg-bg-surface",
|
|
225
|
-
children:
|
|
228
|
+
children: Y.length > 0 ? Y.map((e) => /* @__PURE__ */ M("button", {
|
|
226
229
|
type: "button",
|
|
227
|
-
onClick: () =>
|
|
230
|
+
onClick: () => I("/violations"),
|
|
228
231
|
className: "flex w-full items-start gap-3 px-4 py-3 text-left transition-colors hover:bg-accent/50",
|
|
229
232
|
children: [
|
|
230
|
-
/* @__PURE__ */
|
|
231
|
-
/* @__PURE__ */
|
|
233
|
+
/* @__PURE__ */ j(x, { className: "mt-0.5 h-4 w-4 shrink-0 text-status-error-text" }),
|
|
234
|
+
/* @__PURE__ */ M("div", {
|
|
232
235
|
className: "min-w-0 flex-1",
|
|
233
|
-
children: [/* @__PURE__ */
|
|
236
|
+
children: [/* @__PURE__ */ j("p", {
|
|
234
237
|
className: "truncate text-sm font-medium text-text-primary",
|
|
235
238
|
children: e.message
|
|
236
|
-
}), /* @__PURE__ */
|
|
239
|
+
}), /* @__PURE__ */ M("p", {
|
|
237
240
|
className: "mt-0.5 text-xs text-text-secondary",
|
|
238
241
|
children: [
|
|
239
|
-
e.policy?.name ??
|
|
242
|
+
e.policy?.name ?? z("adaptercloud.overview.policy", "Policy"),
|
|
240
243
|
" ·",
|
|
241
244
|
" ",
|
|
242
|
-
|
|
245
|
+
g(e.detectedAt)
|
|
243
246
|
]
|
|
244
247
|
})]
|
|
245
248
|
}),
|
|
246
|
-
/* @__PURE__ */
|
|
249
|
+
/* @__PURE__ */ j(s, { severity: e.severity })
|
|
247
250
|
]
|
|
248
|
-
}, e.id)) : /* @__PURE__ */
|
|
251
|
+
}, e.id)) : /* @__PURE__ */ M("div", {
|
|
249
252
|
className: "flex flex-col items-center gap-2 px-4 py-8 text-center",
|
|
250
|
-
children: [/* @__PURE__ */ A
|
|
253
|
+
children: [/* @__PURE__ */ j(A, { className: "h-8 w-8 text-status-success-text" }), /* @__PURE__ */ j("p", {
|
|
251
254
|
className: "text-sm text-text-secondary",
|
|
252
|
-
children:
|
|
255
|
+
children: z("adaptercloud.overview.noViolations", "No open violations. Estate is clean.")
|
|
253
256
|
})]
|
|
254
257
|
})
|
|
255
258
|
}),
|
|
256
|
-
|
|
259
|
+
W.data && W.data.length > 0 && /* @__PURE__ */ M("button", {
|
|
257
260
|
type: "button",
|
|
258
|
-
onClick: () =>
|
|
261
|
+
onClick: () => I("/drift"),
|
|
259
262
|
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",
|
|
260
263
|
children: [
|
|
261
|
-
/* @__PURE__ */
|
|
262
|
-
/* @__PURE__ */
|
|
264
|
+
/* @__PURE__ */ j(E, { className: "h-4 w-4 text-status-warning-text" }),
|
|
265
|
+
/* @__PURE__ */ M("span", {
|
|
263
266
|
className: "text-text-primary",
|
|
264
267
|
children: [
|
|
265
|
-
|
|
268
|
+
W.data.length,
|
|
266
269
|
" ",
|
|
267
|
-
|
|
270
|
+
z("adaptercloud.overview.driftDetected", "drift records detected")
|
|
268
271
|
]
|
|
269
272
|
}),
|
|
270
|
-
/* @__PURE__ */
|
|
273
|
+
/* @__PURE__ */ j(S, { className: "ml-auto h-3.5 w-3.5 text-text-secondary" })
|
|
271
274
|
]
|
|
272
275
|
})
|
|
273
|
-
] }), /* @__PURE__ */
|
|
276
|
+
] }), /* @__PURE__ */ M("section", { children: [/* @__PURE__ */ M("div", {
|
|
274
277
|
className: "mb-4 flex items-center justify-between",
|
|
275
|
-
children: [/* @__PURE__ */
|
|
278
|
+
children: [/* @__PURE__ */ j("h2", {
|
|
276
279
|
className: "text-lg font-semibold text-text-primary",
|
|
277
|
-
children:
|
|
278
|
-
}), /* @__PURE__ */
|
|
280
|
+
children: z("adaptercloud.overview.recentRuns", "Recent Sync Runs")
|
|
281
|
+
}), /* @__PURE__ */ M("button", {
|
|
279
282
|
type: "button",
|
|
280
|
-
onClick: () =>
|
|
281
|
-
className: "flex items-center gap-1 text-sm font-medium text-
|
|
283
|
+
onClick: () => I("/sync-runs"),
|
|
284
|
+
className: "flex items-center gap-1 text-sm font-medium text-accent-blue hover:underline",
|
|
282
285
|
children: [
|
|
283
|
-
|
|
286
|
+
z("adaptercloud.common.viewAll", "View all"),
|
|
284
287
|
" ",
|
|
285
|
-
/* @__PURE__ */
|
|
288
|
+
/* @__PURE__ */ j(S, { className: "h-3.5 w-3.5" })
|
|
286
289
|
]
|
|
287
290
|
})]
|
|
288
|
-
}), /* @__PURE__ */
|
|
291
|
+
}), /* @__PURE__ */ j("div", {
|
|
289
292
|
className: "divide-y divide-border rounded-xl border border-border-subtle bg-bg-surface",
|
|
290
|
-
children:
|
|
293
|
+
children: X.length > 0 ? X.map((e) => /* @__PURE__ */ M("button", {
|
|
291
294
|
type: "button",
|
|
292
|
-
onClick: () =>
|
|
295
|
+
onClick: () => I("/sync-runs"),
|
|
293
296
|
className: "flex w-full items-center gap-3 px-4 py-3 text-left transition-colors hover:bg-accent/50",
|
|
294
297
|
children: [
|
|
295
|
-
/* @__PURE__ */
|
|
298
|
+
/* @__PURE__ */ j("div", {
|
|
296
299
|
className: "flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-bg-sunken",
|
|
297
|
-
children: /* @__PURE__ */
|
|
300
|
+
children: /* @__PURE__ */ j(b, { className: "h-4 w-4 text-text-secondary" })
|
|
298
301
|
}),
|
|
299
|
-
/* @__PURE__ */
|
|
302
|
+
/* @__PURE__ */ M("div", {
|
|
300
303
|
className: "min-w-0 flex-1",
|
|
301
|
-
children: [/* @__PURE__ */
|
|
304
|
+
children: [/* @__PURE__ */ j("p", {
|
|
302
305
|
className: "text-sm font-medium text-text-primary",
|
|
303
|
-
children:
|
|
304
|
-
}), /* @__PURE__ */
|
|
306
|
+
children: a[e.kind]
|
|
307
|
+
}), /* @__PURE__ */ M("p", {
|
|
305
308
|
className: "mt-0.5 text-xs text-text-secondary",
|
|
306
309
|
children: [
|
|
307
310
|
e.discoveredCount,
|
|
308
311
|
" ",
|
|
309
|
-
|
|
312
|
+
z("adaptercloud.overview.discovered", "discovered"),
|
|
310
313
|
" ",
|
|
311
314
|
"· ",
|
|
312
|
-
|
|
315
|
+
g(e.createdAt)
|
|
313
316
|
]
|
|
314
317
|
})]
|
|
315
318
|
}),
|
|
316
|
-
/* @__PURE__ */
|
|
319
|
+
/* @__PURE__ */ j(o, { status: e.status })
|
|
317
320
|
]
|
|
318
|
-
}, e.id)) : /* @__PURE__ */
|
|
321
|
+
}, e.id)) : /* @__PURE__ */ M("div", {
|
|
319
322
|
className: "flex flex-col items-center gap-2 px-4 py-8 text-center",
|
|
320
|
-
children: [/* @__PURE__ */
|
|
323
|
+
children: [/* @__PURE__ */ j(O, { className: "h-8 w-8 text-text-secondary" }), /* @__PURE__ */ j("p", {
|
|
321
324
|
className: "text-sm text-text-secondary",
|
|
322
|
-
children:
|
|
325
|
+
children: z("adaptercloud.overview.noRuns", "No sync runs yet.")
|
|
323
326
|
})]
|
|
324
327
|
})
|
|
325
328
|
})] })]
|
|
@@ -329,6 +332,6 @@ function F() {
|
|
|
329
332
|
});
|
|
330
333
|
}
|
|
331
334
|
//#endregion
|
|
332
|
-
export {
|
|
335
|
+
export { I as OverviewPage };
|
|
333
336
|
|
|
334
337
|
//# sourceMappingURL=OverviewPage.js.map
|