@burdenoff/microfe-adaptercloud 2026.629.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/AdapterCloudRoot.js +39 -33
- package/dist/adaptercloud/AdapterCloudRoot.js.map +1 -1
- 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 +246 -220
- package/dist/adaptercloud/hooks/useAdapterCloudApi.js.map +1 -1
- package/dist/adaptercloud/lib/toast.js +36 -0
- package/dist/adaptercloud/lib/toast.js.map +1 -0
- 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/dist/adaptercloud/utils/domain.js +1 -0
- package/dist/adaptercloud/utils/domain.js.map +1 -1
- package/dist/adaptercloud/utils/formatters.js +3 -15
- package/dist/adaptercloud/utils/formatters.js.map +1 -1
- package/dist/index.js +4 -4
- package/package.json +2 -1
|
@@ -7,120 +7,128 @@ import { SeverityBadge as o } from "../../components/SeverityBadge.js";
|
|
|
7
7
|
import { DataState as s } from "../../components/DataState.js";
|
|
8
8
|
import { useArchivePolicy as c, usePolicy as l } from "../../hooks/useAdapterCloudApi.js";
|
|
9
9
|
import { formatDate as u, formatRelativeTime as d } from "../../utils/formatters.js";
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
10
|
+
import { ConfirmDialog as f } from "../../components/ConfirmDialog.js";
|
|
11
|
+
import { useCallback as p, useState as m } from "react";
|
|
12
|
+
import { useI18n as h } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
13
|
+
import { AlertCircle as g, Archive as _, ArrowLeft as v, Pencil as y } from "lucide-react";
|
|
14
|
+
import { useParams as b } from "react-router-dom";
|
|
15
|
+
import { Fragment as x, jsx as S, jsxs as C } from "react/jsx-runtime";
|
|
16
|
+
import { GlassCard as w } from "@burdenoff/fe-libs/ui";
|
|
16
17
|
//#region src/adaptercloud/pages/policies/PolicyDetailPage.tsx
|
|
17
|
-
function
|
|
18
|
-
let { id:
|
|
19
|
-
let n =
|
|
18
|
+
function T() {
|
|
19
|
+
let { id: T } = b(), { navigateTo: E } = e(), { t: D } = h(), O = p((e, t) => {
|
|
20
|
+
let n = D(e);
|
|
20
21
|
return n === e ? t : n;
|
|
21
|
-
}, [
|
|
22
|
-
|
|
22
|
+
}, [D]), k = l(T), A = c(), j = k.data, [M, N] = m(!1), P = p(() => {
|
|
23
|
+
T && A.mutate(T, { onSuccess: () => {
|
|
24
|
+
N(!1), E("/policies");
|
|
25
|
+
} });
|
|
23
26
|
}, [
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
+
A,
|
|
28
|
+
T,
|
|
29
|
+
E
|
|
27
30
|
]);
|
|
28
|
-
return /* @__PURE__ */
|
|
29
|
-
title:
|
|
30
|
-
description:
|
|
31
|
-
actions: /* @__PURE__ */
|
|
31
|
+
return /* @__PURE__ */ C(n, {
|
|
32
|
+
title: j?.name ?? O("adaptercloud.policies.detailTitle", "Policy"),
|
|
33
|
+
description: j ? i[j.kind] : void 0,
|
|
34
|
+
actions: /* @__PURE__ */ C("div", {
|
|
32
35
|
className: "flex items-center gap-2",
|
|
33
|
-
children: [/* @__PURE__ */
|
|
36
|
+
children: [/* @__PURE__ */ C("button", {
|
|
34
37
|
type: "button",
|
|
35
|
-
onClick: () =>
|
|
38
|
+
onClick: () => E("/policies"),
|
|
36
39
|
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",
|
|
37
|
-
children: [/* @__PURE__ */ v
|
|
38
|
-
}),
|
|
40
|
+
children: [/* @__PURE__ */ S(v, { className: "h-4 w-4" }), O("adaptercloud.common.back", "Back")]
|
|
41
|
+
}), j && /* @__PURE__ */ C(x, { children: [/* @__PURE__ */ C("button", {
|
|
39
42
|
type: "button",
|
|
40
|
-
onClick:
|
|
41
|
-
|
|
43
|
+
onClick: () => E(`/policies/${j.id}/edit`),
|
|
44
|
+
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",
|
|
45
|
+
children: [/* @__PURE__ */ S(y, { className: "h-4 w-4" }), O("adaptercloud.common.edit", "Edit")]
|
|
46
|
+
}), /* @__PURE__ */ C("button", {
|
|
47
|
+
type: "button",
|
|
48
|
+
onClick: () => N(!0),
|
|
49
|
+
disabled: A.isPending,
|
|
42
50
|
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-status-error-text transition-colors hover:bg-status-error-bg-subtle disabled:opacity-50",
|
|
43
|
-
children: [/* @__PURE__ */
|
|
44
|
-
})]
|
|
51
|
+
children: [/* @__PURE__ */ S(_, { className: "h-4 w-4" }), O("adaptercloud.common.archive", "Archive")]
|
|
52
|
+
})] })]
|
|
45
53
|
}),
|
|
46
|
-
children: /* @__PURE__ */
|
|
47
|
-
isLoading:
|
|
48
|
-
isError:
|
|
49
|
-
isEmpty: !
|
|
50
|
-
error:
|
|
51
|
-
onRetry: () => void
|
|
52
|
-
emptyTitle:
|
|
53
|
-
children:
|
|
54
|
+
children: [/* @__PURE__ */ S(s, {
|
|
55
|
+
isLoading: k.isLoading,
|
|
56
|
+
isError: k.isError,
|
|
57
|
+
isEmpty: !k.isLoading && !j,
|
|
58
|
+
error: k.error,
|
|
59
|
+
onRetry: () => void k.refetch(),
|
|
60
|
+
emptyTitle: O("adaptercloud.policies.notFound", "Policy not found"),
|
|
61
|
+
children: j && /* @__PURE__ */ C("div", {
|
|
54
62
|
className: "space-y-6",
|
|
55
63
|
children: [
|
|
56
|
-
/* @__PURE__ */
|
|
64
|
+
/* @__PURE__ */ C(w, {
|
|
57
65
|
className: "p-6",
|
|
58
66
|
children: [
|
|
59
|
-
/* @__PURE__ */
|
|
67
|
+
/* @__PURE__ */ C("div", {
|
|
60
68
|
className: "mb-4 flex flex-wrap items-center gap-3",
|
|
61
69
|
children: [
|
|
62
|
-
/* @__PURE__ */
|
|
63
|
-
/* @__PURE__ */
|
|
70
|
+
/* @__PURE__ */ S(o, { severity: j.severity }),
|
|
71
|
+
/* @__PURE__ */ S("span", {
|
|
64
72
|
className: "inline-flex items-center rounded-full bg-bg-sunken px-2.5 py-0.5 text-xs font-medium text-text-secondary",
|
|
65
|
-
children: r[
|
|
73
|
+
children: r[j.enforcement]
|
|
66
74
|
}),
|
|
67
|
-
/* @__PURE__ */
|
|
68
|
-
className: t("inline-flex items-center gap-1 rounded-full px-2.5 py-0.5 text-xs font-medium",
|
|
69
|
-
children:
|
|
75
|
+
/* @__PURE__ */ S("span", {
|
|
76
|
+
className: t("inline-flex items-center gap-1 rounded-full px-2.5 py-0.5 text-xs font-medium", j.isActive ? "bg-status-success-bg-subtle text-status-success-text" : "bg-bg-sunken text-text-secondary"),
|
|
77
|
+
children: j.isActive ? O("adaptercloud.policies.active", "Active") : O("adaptercloud.policies.inactive", "Inactive")
|
|
70
78
|
})
|
|
71
79
|
]
|
|
72
80
|
}),
|
|
73
|
-
|
|
81
|
+
j.description && /* @__PURE__ */ S("p", {
|
|
74
82
|
className: "mb-4 text-sm text-text-secondary",
|
|
75
|
-
children:
|
|
83
|
+
children: j.description
|
|
76
84
|
}),
|
|
77
|
-
/* @__PURE__ */
|
|
85
|
+
/* @__PURE__ */ C("dl", {
|
|
78
86
|
className: "grid grid-cols-2 gap-4 text-sm sm:grid-cols-3",
|
|
79
87
|
children: [
|
|
80
|
-
/* @__PURE__ */
|
|
88
|
+
/* @__PURE__ */ C("div", { children: [/* @__PURE__ */ S("dt", {
|
|
81
89
|
className: "text-text-secondary",
|
|
82
|
-
children:
|
|
83
|
-
}), /* @__PURE__ */
|
|
90
|
+
children: O("adaptercloud.policies.kind", "Kind")
|
|
91
|
+
}), /* @__PURE__ */ S("dd", {
|
|
84
92
|
className: "mt-0.5 font-medium text-text-primary",
|
|
85
|
-
children: i[
|
|
93
|
+
children: i[j.kind]
|
|
86
94
|
})] }),
|
|
87
|
-
/* @__PURE__ */
|
|
95
|
+
/* @__PURE__ */ C("div", { children: [/* @__PURE__ */ S("dt", {
|
|
88
96
|
className: "text-text-secondary",
|
|
89
|
-
children:
|
|
90
|
-
}), /* @__PURE__ */
|
|
97
|
+
children: O("adaptercloud.common.created", "Created")
|
|
98
|
+
}), /* @__PURE__ */ S("dd", {
|
|
91
99
|
className: "mt-0.5 font-medium text-text-primary",
|
|
92
|
-
children: u(
|
|
100
|
+
children: u(j.createdAt)
|
|
93
101
|
})] }),
|
|
94
|
-
/* @__PURE__ */
|
|
102
|
+
/* @__PURE__ */ C("div", { children: [/* @__PURE__ */ S("dt", {
|
|
95
103
|
className: "text-text-secondary",
|
|
96
|
-
children:
|
|
97
|
-
}), /* @__PURE__ */
|
|
104
|
+
children: O("adaptercloud.common.updated", "Updated")
|
|
105
|
+
}), /* @__PURE__ */ S("dd", {
|
|
98
106
|
className: "mt-0.5 font-medium text-text-primary",
|
|
99
|
-
children: u(
|
|
107
|
+
children: u(j.updatedAt)
|
|
100
108
|
})] })
|
|
101
109
|
]
|
|
102
110
|
}),
|
|
103
|
-
|
|
111
|
+
j.appliesTo.length > 0 && /* @__PURE__ */ C("div", {
|
|
104
112
|
className: "mt-5",
|
|
105
|
-
children: [/* @__PURE__ */
|
|
113
|
+
children: [/* @__PURE__ */ S("h3", {
|
|
106
114
|
className: "mb-2 text-sm font-semibold text-text-primary",
|
|
107
|
-
children:
|
|
108
|
-
}), /* @__PURE__ */
|
|
115
|
+
children: O("adaptercloud.policies.appliesTo", "Applies To")
|
|
116
|
+
}), /* @__PURE__ */ S("div", {
|
|
109
117
|
className: "flex flex-wrap gap-1.5",
|
|
110
|
-
children:
|
|
118
|
+
children: j.appliesTo.map((e) => /* @__PURE__ */ S("span", {
|
|
111
119
|
className: "inline-flex items-center rounded-full bg-accent-blue-subtle px-2.5 py-0.5 font-mono text-xs text-accent-blue",
|
|
112
120
|
children: e
|
|
113
121
|
}, e))
|
|
114
122
|
})]
|
|
115
123
|
}),
|
|
116
|
-
|
|
124
|
+
j.tags.length > 0 && /* @__PURE__ */ C("div", {
|
|
117
125
|
className: "mt-4",
|
|
118
|
-
children: [/* @__PURE__ */
|
|
126
|
+
children: [/* @__PURE__ */ S("h3", {
|
|
119
127
|
className: "mb-2 text-sm font-semibold text-text-primary",
|
|
120
|
-
children:
|
|
121
|
-
}), /* @__PURE__ */
|
|
128
|
+
children: O("adaptercloud.common.tags", "Tags")
|
|
129
|
+
}), /* @__PURE__ */ S("div", {
|
|
122
130
|
className: "flex flex-wrap gap-1.5",
|
|
123
|
-
children:
|
|
131
|
+
children: j.tags.map((e) => /* @__PURE__ */ S("span", {
|
|
124
132
|
className: "inline-flex items-center rounded-full bg-bg-sunken px-2.5 py-0.5 text-xs text-text-secondary",
|
|
125
133
|
children: e
|
|
126
134
|
}, e))
|
|
@@ -128,58 +136,68 @@ function x() {
|
|
|
128
136
|
})
|
|
129
137
|
]
|
|
130
138
|
}),
|
|
131
|
-
/* @__PURE__ */
|
|
139
|
+
/* @__PURE__ */ C(w, {
|
|
132
140
|
className: "p-6",
|
|
133
|
-
children: [/* @__PURE__ */
|
|
141
|
+
children: [/* @__PURE__ */ S("h3", {
|
|
134
142
|
className: "mb-3 text-sm font-semibold text-text-primary",
|
|
135
|
-
children:
|
|
136
|
-
}), /* @__PURE__ */
|
|
143
|
+
children: O("adaptercloud.policies.expression", "Expression")
|
|
144
|
+
}), /* @__PURE__ */ S("pre", {
|
|
137
145
|
className: "overflow-auto rounded-lg bg-bg-sunken p-4 text-xs text-text-secondary",
|
|
138
|
-
children: JSON.stringify(
|
|
146
|
+
children: JSON.stringify(j.expression, null, 2)
|
|
139
147
|
})]
|
|
140
148
|
}),
|
|
141
|
-
/* @__PURE__ */
|
|
149
|
+
/* @__PURE__ */ C("section", { children: [/* @__PURE__ */ C("div", {
|
|
142
150
|
className: "mb-3 flex items-center justify-between",
|
|
143
|
-
children: [/* @__PURE__ */
|
|
151
|
+
children: [/* @__PURE__ */ S("h3", {
|
|
144
152
|
className: "text-base font-semibold text-text-primary",
|
|
145
|
-
children:
|
|
146
|
-
}), /* @__PURE__ */
|
|
153
|
+
children: O("adaptercloud.policies.violations", "Violations")
|
|
154
|
+
}), /* @__PURE__ */ S("button", {
|
|
147
155
|
type: "button",
|
|
148
|
-
onClick: () =>
|
|
149
|
-
className: "text-sm font-medium text-
|
|
150
|
-
children:
|
|
156
|
+
onClick: () => E(`/violations?policyId=${j.id}`),
|
|
157
|
+
className: "text-sm font-medium text-accent-blue hover:underline",
|
|
158
|
+
children: O("adaptercloud.common.viewAll", "View all")
|
|
151
159
|
})]
|
|
152
|
-
}),
|
|
160
|
+
}), j.violations && j.violations.length > 0 ? /* @__PURE__ */ S("div", {
|
|
153
161
|
className: "divide-y divide-border rounded-xl border border-border-subtle bg-bg-surface",
|
|
154
|
-
children:
|
|
162
|
+
children: j.violations.slice(0, 10).map((e) => /* @__PURE__ */ C("button", {
|
|
155
163
|
type: "button",
|
|
156
|
-
onClick: () =>
|
|
164
|
+
onClick: () => E(`/violations?policyId=${j.id}`),
|
|
157
165
|
className: "flex w-full items-start gap-3 px-4 py-3 text-left transition-colors hover:bg-accent/50",
|
|
158
166
|
children: [
|
|
159
|
-
/* @__PURE__ */
|
|
160
|
-
/* @__PURE__ */
|
|
167
|
+
/* @__PURE__ */ S(g, { className: "mt-0.5 h-4 w-4 shrink-0 text-status-error-text" }),
|
|
168
|
+
/* @__PURE__ */ C("div", {
|
|
161
169
|
className: "min-w-0 flex-1",
|
|
162
|
-
children: [/* @__PURE__ */
|
|
170
|
+
children: [/* @__PURE__ */ S("p", {
|
|
163
171
|
className: "truncate text-sm font-medium text-text-primary",
|
|
164
172
|
children: e.message
|
|
165
|
-
}), /* @__PURE__ */
|
|
173
|
+
}), /* @__PURE__ */ S("p", {
|
|
166
174
|
className: "mt-0.5 text-xs text-text-secondary",
|
|
167
175
|
children: d(e.detectedAt)
|
|
168
176
|
})]
|
|
169
177
|
}),
|
|
170
|
-
/* @__PURE__ */
|
|
178
|
+
/* @__PURE__ */ S(a, { status: e.status })
|
|
171
179
|
]
|
|
172
180
|
}, e.id))
|
|
173
|
-
}) : /* @__PURE__ */
|
|
181
|
+
}) : /* @__PURE__ */ S("p", {
|
|
174
182
|
className: "rounded-xl border border-border-subtle bg-bg-surface px-4 py-6 text-center text-sm text-text-secondary",
|
|
175
|
-
children:
|
|
183
|
+
children: O("adaptercloud.policies.noViolations", "No violations recorded for this policy.")
|
|
176
184
|
})] })
|
|
177
185
|
]
|
|
178
186
|
})
|
|
179
|
-
})
|
|
187
|
+
}), /* @__PURE__ */ S(f, {
|
|
188
|
+
open: M,
|
|
189
|
+
onOpenChange: N,
|
|
190
|
+
title: O("adaptercloud.policies.archiveTitle", "Archive this policy?"),
|
|
191
|
+
description: O("adaptercloud.policies.archivePrompt", "The policy will be archived and removed from every governance view. This cannot be undone from the UI."),
|
|
192
|
+
confirmLabel: O("adaptercloud.common.archive", "Archive"),
|
|
193
|
+
cancelLabel: O("adaptercloud.common.cancel", "Cancel"),
|
|
194
|
+
onConfirm: P,
|
|
195
|
+
isPending: A.isPending,
|
|
196
|
+
tone: "danger"
|
|
197
|
+
})]
|
|
180
198
|
});
|
|
181
199
|
}
|
|
182
200
|
//#endregion
|
|
183
|
-
export {
|
|
201
|
+
export { T as PolicyDetailPage };
|
|
184
202
|
|
|
185
203
|
//# sourceMappingURL=PolicyDetailPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PolicyDetailPage.js","names":[],"sources":["../../../../src/adaptercloud/pages/policies/PolicyDetailPage.tsx"],"sourcesContent":["/**\n * Policy Detail Page\n * @module adaptercloud/pages/policies\n *\n * One governance policy (`adaPolicy`) — its kind, enforcement, severity, JSON\n * expression, applies-to selector, and the violations it has produced. Supports\n * archiving via `adaArchivePolicy`.\n */\n\nimport { useCallback } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { ArrowLeft, Archive, AlertCircle } from 'lucide-react';\nimport { GlassCard } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { StatusBadge } from '../../components/StatusBadge';\nimport { SeverityBadge } from '../../components/SeverityBadge';\nimport { DataState } from '../../components/DataState';\nimport { useAdapterCloud } from '../../context/AdapterCloudContext';\nimport { usePolicy, useArchivePolicy } from '../../hooks/useAdapterCloudApi';\nimport { policyKindLabels, policyEnforcementLabels } from '../../utils/domain';\nimport { formatDate, formatRelativeTime } from '../../utils/formatters';\nimport { cn } from '../../utils/cn';\n\nexport function PolicyDetailPage() {\n const { id } = useParams<{ id: string }>();\n const { navigateTo } = useAdapterCloud();\n const { t: translate } = useI18n();\n const t = useCallback(\n (key: string, fallback: string): string => {\n const value = translate(key);\n return value === key ? fallback : value;\n },\n [translate]\n );\n\n const query = usePolicy(id);\n const archive = useArchivePolicy();\n const policy = query.data;\n\n const handleArchive = useCallback(() => {\n if (!id) return;\n archive.mutate(id, { onSuccess: () => navigateTo('/policies') });\n }, [archive, id, navigateTo]);\n\n return (\n <PageLayout\n title={policy?.name ?? t('adaptercloud.policies.detailTitle', 'Policy')}\n description={policy ? policyKindLabels[policy.kind] : undefined}\n actions={\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/policies')}\n 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\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n {t('adaptercloud.common.back', 'Back')}\n </button>\n {policy && (\n <button\n type=\"button\"\n onClick={handleArchive}\n disabled={archive.isPending}\n 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-status-error-text transition-colors hover:bg-status-error-bg-subtle disabled:opacity-50\"\n >\n <Archive className=\"h-4 w-4\" />\n {t('adaptercloud.common.archive', 'Archive')}\n </button>\n )}\n </div>\n }\n >\n <DataState\n isLoading={query.isLoading}\n isError={query.isError}\n isEmpty={!query.isLoading && !policy}\n error={query.error}\n onRetry={() => void query.refetch()}\n emptyTitle={t('adaptercloud.policies.notFound', 'Policy not found')}\n >\n {policy && (\n <div className=\"space-y-6\">\n <GlassCard className=\"p-6\">\n <div className=\"mb-4 flex flex-wrap items-center gap-3\">\n <SeverityBadge severity={policy.severity} />\n <span className=\"inline-flex items-center rounded-full bg-bg-sunken px-2.5 py-0.5 text-xs font-medium text-text-secondary\">\n {policyEnforcementLabels[policy.enforcement]}\n </span>\n <span\n className={cn(\n 'inline-flex items-center gap-1 rounded-full px-2.5 py-0.5 text-xs font-medium',\n policy.isActive\n ? 'bg-status-success-bg-subtle text-status-success-text'\n : 'bg-bg-sunken text-text-secondary'\n )}\n >\n {policy.isActive\n ? t('adaptercloud.policies.active', 'Active')\n : t('adaptercloud.policies.inactive', 'Inactive')}\n </span>\n </div>\n\n {policy.description && (\n <p className=\"mb-4 text-sm text-text-secondary\">{policy.description}</p>\n )}\n\n <dl className=\"grid grid-cols-2 gap-4 text-sm sm:grid-cols-3\">\n <div>\n <dt className=\"text-text-secondary\">{t('adaptercloud.policies.kind', 'Kind')}</dt>\n <dd className=\"mt-0.5 font-medium text-text-primary\">\n {policyKindLabels[policy.kind]}\n </dd>\n </div>\n <div>\n <dt className=\"text-text-secondary\">\n {t('adaptercloud.common.created', 'Created')}\n </dt>\n <dd className=\"mt-0.5 font-medium text-text-primary\">\n {formatDate(policy.createdAt)}\n </dd>\n </div>\n <div>\n <dt className=\"text-text-secondary\">\n {t('adaptercloud.common.updated', 'Updated')}\n </dt>\n <dd className=\"mt-0.5 font-medium text-text-primary\">\n {formatDate(policy.updatedAt)}\n </dd>\n </div>\n </dl>\n\n {policy.appliesTo.length > 0 && (\n <div className=\"mt-5\">\n <h3 className=\"mb-2 text-sm font-semibold text-text-primary\">\n {t('adaptercloud.policies.appliesTo', 'Applies To')}\n </h3>\n <div className=\"flex flex-wrap gap-1.5\">\n {policy.appliesTo.map((sel) => (\n <span\n key={sel}\n className=\"inline-flex items-center rounded-full bg-accent-blue-subtle px-2.5 py-0.5 font-mono text-xs text-accent-blue\"\n >\n {sel}\n </span>\n ))}\n </div>\n </div>\n )}\n\n {policy.tags.length > 0 && (\n <div className=\"mt-4\">\n <h3 className=\"mb-2 text-sm font-semibold text-text-primary\">\n {t('adaptercloud.common.tags', 'Tags')}\n </h3>\n <div className=\"flex flex-wrap gap-1.5\">\n {policy.tags.map((tag) => (\n <span\n key={tag}\n className=\"inline-flex items-center rounded-full bg-bg-sunken px-2.5 py-0.5 text-xs text-text-secondary\"\n >\n {tag}\n </span>\n ))}\n </div>\n </div>\n )}\n </GlassCard>\n\n {/* Expression */}\n <GlassCard className=\"p-6\">\n <h3 className=\"mb-3 text-sm font-semibold text-text-primary\">\n {t('adaptercloud.policies.expression', 'Expression')}\n </h3>\n <pre className=\"overflow-auto rounded-lg bg-bg-sunken p-4 text-xs text-text-secondary\">\n {JSON.stringify(policy.expression, null, 2)}\n </pre>\n </GlassCard>\n\n {/* Violations */}\n <section>\n <div className=\"mb-3 flex items-center justify-between\">\n <h3 className=\"text-base font-semibold text-text-primary\">\n {t('adaptercloud.policies.violations', 'Violations')}\n </h3>\n <button\n type=\"button\"\n onClick={() => navigateTo(`/violations?policyId=${policy.id}`)}\n className=\"text-sm font-medium text-primary hover:underline\"\n >\n {t('adaptercloud.common.viewAll', 'View all')}\n </button>\n </div>\n {policy.violations && policy.violations.length > 0 ? (\n <div className=\"divide-y divide-border rounded-xl border border-border-subtle bg-bg-surface\">\n {policy.violations.slice(0, 10).map((v) => (\n <button\n key={v.id}\n type=\"button\"\n onClick={() => navigateTo(`/violations?policyId=${policy.id}`)}\n className=\"flex w-full items-start gap-3 px-4 py-3 text-left transition-colors hover:bg-accent/50\"\n >\n <AlertCircle className=\"mt-0.5 h-4 w-4 shrink-0 text-status-error-text\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium text-text-primary\">\n {v.message}\n </p>\n <p className=\"mt-0.5 text-xs text-text-secondary\">\n {formatRelativeTime(v.detectedAt)}\n </p>\n </div>\n <StatusBadge status={v.status} />\n </button>\n ))}\n </div>\n ) : (\n <p className=\"rounded-xl border border-border-subtle bg-bg-surface px-4 py-6 text-center text-sm text-text-secondary\">\n {t(\n 'adaptercloud.policies.noViolations',\n 'No violations recorded for this policy.'\n )}\n </p>\n )}\n </section>\n </div>\n )}\n </DataState>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PolicyDetailPage.js","names":[],"sources":["../../../../src/adaptercloud/pages/policies/PolicyDetailPage.tsx"],"sourcesContent":["/**\n * Policy Detail Page\n * @module adaptercloud/pages/policies\n *\n * One governance policy (`adaPolicy`) — its kind, enforcement, severity, JSON\n * expression, applies-to selector, and the violations it has produced. Supports\n * archiving via `adaArchivePolicy`.\n */\n\nimport { useCallback, useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { ArrowLeft, Archive, AlertCircle, Pencil } from 'lucide-react';\nimport { GlassCard } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { StatusBadge } from '../../components/StatusBadge';\nimport { SeverityBadge } from '../../components/SeverityBadge';\nimport { DataState } from '../../components/DataState';\nimport { ConfirmDialog } from '../../components/ConfirmDialog';\nimport { useAdapterCloud } from '../../context/AdapterCloudContext';\nimport { usePolicy, useArchivePolicy } from '../../hooks/useAdapterCloudApi';\nimport { policyKindLabels, policyEnforcementLabels } from '../../utils/domain';\nimport { formatDate, formatRelativeTime } from '../../utils/formatters';\nimport { cn } from '../../utils/cn';\n\nexport function PolicyDetailPage() {\n const { id } = useParams<{ id: string }>();\n const { navigateTo } = useAdapterCloud();\n const { t: translate } = useI18n();\n const t = useCallback(\n (key: string, fallback: string): string => {\n const value = translate(key);\n return value === key ? fallback : value;\n },\n [translate]\n );\n\n const query = usePolicy(id);\n const archive = useArchivePolicy();\n const policy = query.data;\n\n const [confirmArchiveOpen, setConfirmArchiveOpen] = useState(false);\n\n const handleArchive = useCallback(() => {\n if (!id) return;\n archive.mutate(id, {\n onSuccess: () => {\n setConfirmArchiveOpen(false);\n navigateTo('/policies');\n },\n });\n }, [archive, id, navigateTo]);\n\n return (\n <PageLayout\n title={policy?.name ?? t('adaptercloud.policies.detailTitle', 'Policy')}\n description={policy ? policyKindLabels[policy.kind] : undefined}\n actions={\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/policies')}\n 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\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n {t('adaptercloud.common.back', 'Back')}\n </button>\n {policy && (\n <>\n <button\n type=\"button\"\n onClick={() => navigateTo(`/policies/${policy.id}/edit`)}\n 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\"\n >\n <Pencil className=\"h-4 w-4\" />\n {t('adaptercloud.common.edit', 'Edit')}\n </button>\n <button\n type=\"button\"\n onClick={() => setConfirmArchiveOpen(true)}\n disabled={archive.isPending}\n 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-status-error-text transition-colors hover:bg-status-error-bg-subtle disabled:opacity-50\"\n >\n <Archive className=\"h-4 w-4\" />\n {t('adaptercloud.common.archive', 'Archive')}\n </button>\n </>\n )}\n </div>\n }\n >\n <DataState\n isLoading={query.isLoading}\n isError={query.isError}\n isEmpty={!query.isLoading && !policy}\n error={query.error}\n onRetry={() => void query.refetch()}\n emptyTitle={t('adaptercloud.policies.notFound', 'Policy not found')}\n >\n {policy && (\n <div className=\"space-y-6\">\n <GlassCard className=\"p-6\">\n <div className=\"mb-4 flex flex-wrap items-center gap-3\">\n <SeverityBadge severity={policy.severity} />\n <span className=\"inline-flex items-center rounded-full bg-bg-sunken px-2.5 py-0.5 text-xs font-medium text-text-secondary\">\n {policyEnforcementLabels[policy.enforcement]}\n </span>\n <span\n className={cn(\n 'inline-flex items-center gap-1 rounded-full px-2.5 py-0.5 text-xs font-medium',\n policy.isActive\n ? 'bg-status-success-bg-subtle text-status-success-text'\n : 'bg-bg-sunken text-text-secondary'\n )}\n >\n {policy.isActive\n ? t('adaptercloud.policies.active', 'Active')\n : t('adaptercloud.policies.inactive', 'Inactive')}\n </span>\n </div>\n\n {policy.description && (\n <p className=\"mb-4 text-sm text-text-secondary\">{policy.description}</p>\n )}\n\n <dl className=\"grid grid-cols-2 gap-4 text-sm sm:grid-cols-3\">\n <div>\n <dt className=\"text-text-secondary\">{t('adaptercloud.policies.kind', 'Kind')}</dt>\n <dd className=\"mt-0.5 font-medium text-text-primary\">\n {policyKindLabels[policy.kind]}\n </dd>\n </div>\n <div>\n <dt className=\"text-text-secondary\">\n {t('adaptercloud.common.created', 'Created')}\n </dt>\n <dd className=\"mt-0.5 font-medium text-text-primary\">\n {formatDate(policy.createdAt)}\n </dd>\n </div>\n <div>\n <dt className=\"text-text-secondary\">\n {t('adaptercloud.common.updated', 'Updated')}\n </dt>\n <dd className=\"mt-0.5 font-medium text-text-primary\">\n {formatDate(policy.updatedAt)}\n </dd>\n </div>\n </dl>\n\n {policy.appliesTo.length > 0 && (\n <div className=\"mt-5\">\n <h3 className=\"mb-2 text-sm font-semibold text-text-primary\">\n {t('adaptercloud.policies.appliesTo', 'Applies To')}\n </h3>\n <div className=\"flex flex-wrap gap-1.5\">\n {policy.appliesTo.map((sel) => (\n <span\n key={sel}\n className=\"inline-flex items-center rounded-full bg-accent-blue-subtle px-2.5 py-0.5 font-mono text-xs text-accent-blue\"\n >\n {sel}\n </span>\n ))}\n </div>\n </div>\n )}\n\n {policy.tags.length > 0 && (\n <div className=\"mt-4\">\n <h3 className=\"mb-2 text-sm font-semibold text-text-primary\">\n {t('adaptercloud.common.tags', 'Tags')}\n </h3>\n <div className=\"flex flex-wrap gap-1.5\">\n {policy.tags.map((tag) => (\n <span\n key={tag}\n className=\"inline-flex items-center rounded-full bg-bg-sunken px-2.5 py-0.5 text-xs text-text-secondary\"\n >\n {tag}\n </span>\n ))}\n </div>\n </div>\n )}\n </GlassCard>\n\n {/* Expression */}\n <GlassCard className=\"p-6\">\n <h3 className=\"mb-3 text-sm font-semibold text-text-primary\">\n {t('adaptercloud.policies.expression', 'Expression')}\n </h3>\n <pre className=\"overflow-auto rounded-lg bg-bg-sunken p-4 text-xs text-text-secondary\">\n {JSON.stringify(policy.expression, null, 2)}\n </pre>\n </GlassCard>\n\n {/* Violations */}\n <section>\n <div className=\"mb-3 flex items-center justify-between\">\n <h3 className=\"text-base font-semibold text-text-primary\">\n {t('adaptercloud.policies.violations', 'Violations')}\n </h3>\n <button\n type=\"button\"\n onClick={() => navigateTo(`/violations?policyId=${policy.id}`)}\n className=\"text-sm font-medium text-accent-blue hover:underline\"\n >\n {t('adaptercloud.common.viewAll', 'View all')}\n </button>\n </div>\n {policy.violations && policy.violations.length > 0 ? (\n <div className=\"divide-y divide-border rounded-xl border border-border-subtle bg-bg-surface\">\n {policy.violations.slice(0, 10).map((v) => (\n <button\n key={v.id}\n type=\"button\"\n onClick={() => navigateTo(`/violations?policyId=${policy.id}`)}\n className=\"flex w-full items-start gap-3 px-4 py-3 text-left transition-colors hover:bg-accent/50\"\n >\n <AlertCircle className=\"mt-0.5 h-4 w-4 shrink-0 text-status-error-text\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium text-text-primary\">\n {v.message}\n </p>\n <p className=\"mt-0.5 text-xs text-text-secondary\">\n {formatRelativeTime(v.detectedAt)}\n </p>\n </div>\n <StatusBadge status={v.status} />\n </button>\n ))}\n </div>\n ) : (\n <p className=\"rounded-xl border border-border-subtle bg-bg-surface px-4 py-6 text-center text-sm text-text-secondary\">\n {t(\n 'adaptercloud.policies.noViolations',\n 'No violations recorded for this policy.'\n )}\n </p>\n )}\n </section>\n </div>\n )}\n </DataState>\n\n <ConfirmDialog\n open={confirmArchiveOpen}\n onOpenChange={setConfirmArchiveOpen}\n title={t('adaptercloud.policies.archiveTitle', 'Archive this policy?')}\n description={t(\n 'adaptercloud.policies.archivePrompt',\n 'The policy will be archived and removed from every governance view. This cannot be undone from the UI.'\n )}\n confirmLabel={t('adaptercloud.common.archive', 'Archive')}\n cancelLabel={t('adaptercloud.common.cancel', 'Cancel')}\n onConfirm={handleArchive}\n isPending={archive.isPending}\n tone=\"danger\"\n />\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|