@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.
Files changed (50) hide show
  1. package/dist/adaptercloud/AdapterCloudRoot.js +39 -33
  2. package/dist/adaptercloud/AdapterCloudRoot.js.map +1 -1
  3. package/dist/adaptercloud/AdapterCloudRoutes.js +5 -1
  4. package/dist/adaptercloud/AdapterCloudRoutes.js.map +1 -1
  5. package/dist/adaptercloud/components/ConfirmDialog.js +27 -0
  6. package/dist/adaptercloud/components/ConfirmDialog.js.map +1 -0
  7. package/dist/adaptercloud/components/DataState.js +1 -1
  8. package/dist/adaptercloud/components/DataState.js.map +1 -1
  9. package/dist/adaptercloud/hooks/useAdapterCloudApi.js +246 -220
  10. package/dist/adaptercloud/hooks/useAdapterCloudApi.js.map +1 -1
  11. package/dist/adaptercloud/lib/toast.js +36 -0
  12. package/dist/adaptercloud/lib/toast.js.map +1 -0
  13. package/dist/adaptercloud/pages/OverviewPage.js +159 -156
  14. package/dist/adaptercloud/pages/OverviewPage.js.map +1 -1
  15. package/dist/adaptercloud/pages/adapters/AdapterDetailPage.js +102 -89
  16. package/dist/adaptercloud/pages/adapters/AdapterDetailPage.js.map +1 -1
  17. package/dist/adaptercloud/pages/adapters/AdapterFormPage.js +2 -0
  18. package/dist/adaptercloud/pages/adapters/AdapterFormPage.js.map +1 -1
  19. package/dist/adaptercloud/pages/adapters/AdaptersListPage.js +2 -0
  20. package/dist/adaptercloud/pages/adapters/AdaptersListPage.js.map +1 -1
  21. package/dist/adaptercloud/pages/connections/ConnectionDetailPage.js +141 -124
  22. package/dist/adaptercloud/pages/connections/ConnectionDetailPage.js.map +1 -1
  23. package/dist/adaptercloud/pages/connections/ConnectionFormPage.js +2 -0
  24. package/dist/adaptercloud/pages/connections/ConnectionFormPage.js.map +1 -1
  25. package/dist/adaptercloud/pages/connections/ConnectionsListPage.js +1 -0
  26. package/dist/adaptercloud/pages/connections/ConnectionsListPage.js.map +1 -1
  27. package/dist/adaptercloud/pages/costs/CostsPage.js +112 -87
  28. package/dist/adaptercloud/pages/costs/CostsPage.js.map +1 -1
  29. package/dist/adaptercloud/pages/drift/DriftListPage.js +81 -59
  30. package/dist/adaptercloud/pages/drift/DriftListPage.js.map +1 -1
  31. package/dist/adaptercloud/pages/policies/PoliciesListPage.js +2 -0
  32. package/dist/adaptercloud/pages/policies/PoliciesListPage.js.map +1 -1
  33. package/dist/adaptercloud/pages/policies/PolicyDetailPage.js +109 -91
  34. package/dist/adaptercloud/pages/policies/PolicyDetailPage.js.map +1 -1
  35. package/dist/adaptercloud/pages/policies/PolicyFormPage.js +211 -184
  36. package/dist/adaptercloud/pages/policies/PolicyFormPage.js.map +1 -1
  37. package/dist/adaptercloud/pages/resources/ResourceDetailPage.js +153 -111
  38. package/dist/adaptercloud/pages/resources/ResourceDetailPage.js.map +1 -1
  39. package/dist/adaptercloud/pages/resources/ResourcesListPage.js +111 -83
  40. package/dist/adaptercloud/pages/resources/ResourcesListPage.js.map +1 -1
  41. package/dist/adaptercloud/pages/sync-runs/SyncRunsListPage.js +108 -86
  42. package/dist/adaptercloud/pages/sync-runs/SyncRunsListPage.js.map +1 -1
  43. package/dist/adaptercloud/pages/violations/ViolationsListPage.js +11 -3
  44. package/dist/adaptercloud/pages/violations/ViolationsListPage.js.map +1 -1
  45. package/dist/adaptercloud/utils/domain.js +1 -0
  46. package/dist/adaptercloud/utils/domain.js.map +1 -1
  47. package/dist/adaptercloud/utils/formatters.js +3 -15
  48. package/dist/adaptercloud/utils/formatters.js.map +1 -1
  49. package/dist/index.js +4 -4
  50. 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 { useCallback as f } from "react";
11
- import { useI18n as p } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
12
- import { AlertCircle as m, Archive as h, ArrowLeft as g } from "lucide-react";
13
- import { useParams as _ } from "react-router-dom";
14
- import { jsx as v, jsxs as y } from "react/jsx-runtime";
15
- import { GlassCard as b } from "@burdenoff/fe-libs/ui";
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 x() {
18
- let { id: x } = _(), { navigateTo: S } = e(), { t: C } = p(), w = f((e, t) => {
19
- let n = C(e);
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
- }, [C]), T = l(x), E = c(), D = T.data, O = f(() => {
22
- x && E.mutate(x, { onSuccess: () => S("/policies") });
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
- E,
25
- x,
26
- S
27
+ A,
28
+ T,
29
+ E
27
30
  ]);
28
- return /* @__PURE__ */ v(n, {
29
- title: D?.name ?? w("adaptercloud.policies.detailTitle", "Policy"),
30
- description: D ? i[D.kind] : void 0,
31
- actions: /* @__PURE__ */ y("div", {
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__ */ y("button", {
36
+ children: [/* @__PURE__ */ C("button", {
34
37
  type: "button",
35
- onClick: () => S("/policies"),
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(g, { className: "h-4 w-4" }), w("adaptercloud.common.back", "Back")]
38
- }), D && /* @__PURE__ */ y("button", {
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: O,
41
- disabled: E.isPending,
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__ */ v(h, { className: "h-4 w-4" }), w("adaptercloud.common.archive", "Archive")]
44
- })]
51
+ children: [/* @__PURE__ */ S(_, { className: "h-4 w-4" }), O("adaptercloud.common.archive", "Archive")]
52
+ })] })]
45
53
  }),
46
- children: /* @__PURE__ */ v(s, {
47
- isLoading: T.isLoading,
48
- isError: T.isError,
49
- isEmpty: !T.isLoading && !D,
50
- error: T.error,
51
- onRetry: () => void T.refetch(),
52
- emptyTitle: w("adaptercloud.policies.notFound", "Policy not found"),
53
- children: D && /* @__PURE__ */ y("div", {
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__ */ y(b, {
64
+ /* @__PURE__ */ C(w, {
57
65
  className: "p-6",
58
66
  children: [
59
- /* @__PURE__ */ y("div", {
67
+ /* @__PURE__ */ C("div", {
60
68
  className: "mb-4 flex flex-wrap items-center gap-3",
61
69
  children: [
62
- /* @__PURE__ */ v(o, { severity: D.severity }),
63
- /* @__PURE__ */ v("span", {
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[D.enforcement]
73
+ children: r[j.enforcement]
66
74
  }),
67
- /* @__PURE__ */ v("span", {
68
- className: t("inline-flex items-center gap-1 rounded-full px-2.5 py-0.5 text-xs font-medium", D.isActive ? "bg-status-success-bg-subtle text-status-success-text" : "bg-bg-sunken text-text-secondary"),
69
- children: D.isActive ? w("adaptercloud.policies.active", "Active") : w("adaptercloud.policies.inactive", "Inactive")
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
- D.description && /* @__PURE__ */ v("p", {
81
+ j.description && /* @__PURE__ */ S("p", {
74
82
  className: "mb-4 text-sm text-text-secondary",
75
- children: D.description
83
+ children: j.description
76
84
  }),
77
- /* @__PURE__ */ y("dl", {
85
+ /* @__PURE__ */ C("dl", {
78
86
  className: "grid grid-cols-2 gap-4 text-sm sm:grid-cols-3",
79
87
  children: [
80
- /* @__PURE__ */ y("div", { children: [/* @__PURE__ */ v("dt", {
88
+ /* @__PURE__ */ C("div", { children: [/* @__PURE__ */ S("dt", {
81
89
  className: "text-text-secondary",
82
- children: w("adaptercloud.policies.kind", "Kind")
83
- }), /* @__PURE__ */ v("dd", {
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[D.kind]
93
+ children: i[j.kind]
86
94
  })] }),
87
- /* @__PURE__ */ y("div", { children: [/* @__PURE__ */ v("dt", {
95
+ /* @__PURE__ */ C("div", { children: [/* @__PURE__ */ S("dt", {
88
96
  className: "text-text-secondary",
89
- children: w("adaptercloud.common.created", "Created")
90
- }), /* @__PURE__ */ v("dd", {
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(D.createdAt)
100
+ children: u(j.createdAt)
93
101
  })] }),
94
- /* @__PURE__ */ y("div", { children: [/* @__PURE__ */ v("dt", {
102
+ /* @__PURE__ */ C("div", { children: [/* @__PURE__ */ S("dt", {
95
103
  className: "text-text-secondary",
96
- children: w("adaptercloud.common.updated", "Updated")
97
- }), /* @__PURE__ */ v("dd", {
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(D.updatedAt)
107
+ children: u(j.updatedAt)
100
108
  })] })
101
109
  ]
102
110
  }),
103
- D.appliesTo.length > 0 && /* @__PURE__ */ y("div", {
111
+ j.appliesTo.length > 0 && /* @__PURE__ */ C("div", {
104
112
  className: "mt-5",
105
- children: [/* @__PURE__ */ v("h3", {
113
+ children: [/* @__PURE__ */ S("h3", {
106
114
  className: "mb-2 text-sm font-semibold text-text-primary",
107
- children: w("adaptercloud.policies.appliesTo", "Applies To")
108
- }), /* @__PURE__ */ v("div", {
115
+ children: O("adaptercloud.policies.appliesTo", "Applies To")
116
+ }), /* @__PURE__ */ S("div", {
109
117
  className: "flex flex-wrap gap-1.5",
110
- children: D.appliesTo.map((e) => /* @__PURE__ */ v("span", {
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
- D.tags.length > 0 && /* @__PURE__ */ y("div", {
124
+ j.tags.length > 0 && /* @__PURE__ */ C("div", {
117
125
  className: "mt-4",
118
- children: [/* @__PURE__ */ v("h3", {
126
+ children: [/* @__PURE__ */ S("h3", {
119
127
  className: "mb-2 text-sm font-semibold text-text-primary",
120
- children: w("adaptercloud.common.tags", "Tags")
121
- }), /* @__PURE__ */ v("div", {
128
+ children: O("adaptercloud.common.tags", "Tags")
129
+ }), /* @__PURE__ */ S("div", {
122
130
  className: "flex flex-wrap gap-1.5",
123
- children: D.tags.map((e) => /* @__PURE__ */ v("span", {
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__ */ y(b, {
139
+ /* @__PURE__ */ C(w, {
132
140
  className: "p-6",
133
- children: [/* @__PURE__ */ v("h3", {
141
+ children: [/* @__PURE__ */ S("h3", {
134
142
  className: "mb-3 text-sm font-semibold text-text-primary",
135
- children: w("adaptercloud.policies.expression", "Expression")
136
- }), /* @__PURE__ */ v("pre", {
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(D.expression, null, 2)
146
+ children: JSON.stringify(j.expression, null, 2)
139
147
  })]
140
148
  }),
141
- /* @__PURE__ */ y("section", { children: [/* @__PURE__ */ y("div", {
149
+ /* @__PURE__ */ C("section", { children: [/* @__PURE__ */ C("div", {
142
150
  className: "mb-3 flex items-center justify-between",
143
- children: [/* @__PURE__ */ v("h3", {
151
+ children: [/* @__PURE__ */ S("h3", {
144
152
  className: "text-base font-semibold text-text-primary",
145
- children: w("adaptercloud.policies.violations", "Violations")
146
- }), /* @__PURE__ */ v("button", {
153
+ children: O("adaptercloud.policies.violations", "Violations")
154
+ }), /* @__PURE__ */ S("button", {
147
155
  type: "button",
148
- onClick: () => S(`/violations?policyId=${D.id}`),
149
- className: "text-sm font-medium text-primary hover:underline",
150
- children: w("adaptercloud.common.viewAll", "View all")
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
- }), D.violations && D.violations.length > 0 ? /* @__PURE__ */ v("div", {
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: D.violations.slice(0, 10).map((e) => /* @__PURE__ */ y("button", {
162
+ children: j.violations.slice(0, 10).map((e) => /* @__PURE__ */ C("button", {
155
163
  type: "button",
156
- onClick: () => S(`/violations?policyId=${D.id}`),
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__ */ v(m, { className: "mt-0.5 h-4 w-4 shrink-0 text-status-error-text" }),
160
- /* @__PURE__ */ y("div", {
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__ */ v("p", {
170
+ children: [/* @__PURE__ */ S("p", {
163
171
  className: "truncate text-sm font-medium text-text-primary",
164
172
  children: e.message
165
- }), /* @__PURE__ */ v("p", {
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__ */ v(a, { status: e.status })
178
+ /* @__PURE__ */ S(a, { status: e.status })
171
179
  ]
172
180
  }, e.id))
173
- }) : /* @__PURE__ */ v("p", {
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: w("adaptercloud.policies.noViolations", "No violations recorded for this policy.")
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 { x as PolicyDetailPage };
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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"}