@burdenoff/microfe-assethandler 2026.703.2 → 2026.703.4

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 (64) hide show
  1. package/dist/assethandler/AssetHandlerRoot.js +18 -18
  2. package/dist/assethandler/hooks/useAssetHandlerNavigate.js +19 -0
  3. package/dist/assethandler/hooks/useAssetHandlerNavigate.js.map +1 -0
  4. package/dist/assethandler/pages/AiPredictionsPage.js +29 -29
  5. package/dist/assethandler/pages/AnalyticsPage.js +154 -154
  6. package/dist/assethandler/pages/AssetsAssetCategoriesPage.js +48 -48
  7. package/dist/assethandler/pages/AssetsAssetCheckInOutPage.js +84 -84
  8. package/dist/assethandler/pages/AssetsAssetCheckInOutPage.js.map +1 -1
  9. package/dist/assethandler/pages/AssetsAssetCreatePage.js +82 -82
  10. package/dist/assethandler/pages/AssetsAssetCreatePage.js.map +1 -1
  11. package/dist/assethandler/pages/AssetsAssetDetailPage.js +104 -103
  12. package/dist/assethandler/pages/AssetsAssetDetailPage.js.map +1 -1
  13. package/dist/assethandler/pages/AssetsAssetListPage.js +132 -132
  14. package/dist/assethandler/pages/AssetsAssetListPage.js.map +1 -1
  15. package/dist/assethandler/pages/AssetsAssetTrackingPage.js +52 -52
  16. package/dist/assethandler/pages/CmdbBrowserPage.js +27 -27
  17. package/dist/assethandler/pages/DashboardPage.js +119 -119
  18. package/dist/assethandler/pages/DashboardPage.js.map +1 -1
  19. package/dist/assethandler/pages/DigitalTwinPage.js +22 -22
  20. package/dist/assethandler/pages/DiscoveryJobsPage.js +35 -35
  21. package/dist/assethandler/pages/EsgDashboardPage.js +32 -32
  22. package/dist/assethandler/pages/FinanceBudgetDetailPage.js +57 -56
  23. package/dist/assethandler/pages/FinanceBudgetDetailPage.js.map +1 -1
  24. package/dist/assethandler/pages/FinanceFinanceHubPage.js +98 -98
  25. package/dist/assethandler/pages/FinanceFinanceHubPage.js.map +1 -1
  26. package/dist/assethandler/pages/FinanceInvoiceDetailPage.js +58 -57
  27. package/dist/assethandler/pages/FinanceInvoiceDetailPage.js.map +1 -1
  28. package/dist/assethandler/pages/IotDevicesPage.js +29 -29
  29. package/dist/assethandler/pages/ItilChangeDetailPage.js +76 -75
  30. package/dist/assethandler/pages/ItilChangeDetailPage.js.map +1 -1
  31. package/dist/assethandler/pages/ItilChangeManagementPage.js +49 -49
  32. package/dist/assethandler/pages/ItilIncidentDetailPage.js +63 -62
  33. package/dist/assethandler/pages/ItilIncidentDetailPage.js.map +1 -1
  34. package/dist/assethandler/pages/ItilIncidentManagementPage.js +72 -72
  35. package/dist/assethandler/pages/ItilItilhubPage.js +112 -112
  36. package/dist/assethandler/pages/ItilItilhubPage.js.map +1 -1
  37. package/dist/assethandler/pages/ItilProblemDetailPage.js +61 -60
  38. package/dist/assethandler/pages/ItilProblemDetailPage.js.map +1 -1
  39. package/dist/assethandler/pages/ItilProblemManagementPage.js +46 -46
  40. package/dist/assethandler/pages/KnowledgeBasePage.js +28 -28
  41. package/dist/assethandler/pages/MaintenanceMaintenanceCalendarPage.js +52 -52
  42. package/dist/assethandler/pages/MaintenanceMaintenanceSchedulerPage.js +29 -29
  43. package/dist/assethandler/pages/OperationsMaintenanceDetailPage.js +58 -57
  44. package/dist/assethandler/pages/OperationsMaintenanceDetailPage.js.map +1 -1
  45. package/dist/assethandler/pages/OperationsOperationsHubPage.js +80 -80
  46. package/dist/assethandler/pages/OperationsOperationsHubPage.js.map +1 -1
  47. package/dist/assethandler/pages/OperationsWorkOrderDetailPage.js +49 -48
  48. package/dist/assethandler/pages/OperationsWorkOrderDetailPage.js.map +1 -1
  49. package/dist/assethandler/pages/PortfolioPortfolioOverviewPage.js +52 -52
  50. package/dist/assethandler/pages/ProvenancePage.js +36 -36
  51. package/dist/assethandler/pages/SamLicensesPage.js +27 -27
  52. package/dist/assethandler/pages/SecurityComplianceDetailPage.js +39 -38
  53. package/dist/assethandler/pages/SecurityComplianceDetailPage.js.map +1 -1
  54. package/dist/assethandler/pages/SecurityPolicyDetailPage.js +50 -49
  55. package/dist/assethandler/pages/SecurityPolicyDetailPage.js.map +1 -1
  56. package/dist/assethandler/pages/SecuritySecurityEventDetailPage.js +47 -46
  57. package/dist/assethandler/pages/SecuritySecurityEventDetailPage.js.map +1 -1
  58. package/dist/assethandler/pages/SecuritySecurityHubPage.js +104 -104
  59. package/dist/assethandler/pages/SecuritySecurityHubPage.js.map +1 -1
  60. package/dist/assethandler/pages/TransactionsTransactionDetailPage.js +74 -73
  61. package/dist/assethandler/pages/TransactionsTransactionDetailPage.js.map +1 -1
  62. package/dist/assethandler/pages/TransactionsTransactionListPage.js +77 -77
  63. package/dist/assethandler/providers/AssetHandlerProvider.js +12 -12
  64. package/package.json +1 -1
@@ -1,109 +1,110 @@
1
1
  import { useAssetHandlerStore as e } from "../store/assethandlerStore.js";
2
- import { ArrowLeft as t, Shield as n } from "lucide-react";
3
- import { useNavigate as r, useParams as i } from "react-router-dom";
4
- import { Badge as a, Button as o, Card as s, CardContent as c, CardHeader as l, CardTitle as u, EmphasisPanel as d, GradientText as f, IllustratedEmptyState as p, PagePurpose as m } from "@burdenoff/fe-libs/ui";
5
- import { jsx as h, jsxs as g } from "react/jsx-runtime";
2
+ import { useAssetHandlerNavigate as t } from "../hooks/useAssetHandlerNavigate.js";
3
+ import { ArrowLeft as n, Shield as r } from "lucide-react";
4
+ import { useParams as i } from "react-router-dom";
5
+ import { jsx as a, jsxs as o } from "react/jsx-runtime";
6
+ import { Badge as s, Button as c, Card as l, CardContent as u, CardHeader as d, CardTitle as f, EmphasisPanel as p, GradientText as m, IllustratedEmptyState as h, PagePurpose as g } from "@burdenoff/fe-libs/ui";
6
7
  //#region src/assethandler/pages/SecurityComplianceDetailPage.tsx
7
8
  function _() {
8
- let _ = r(), { frameworkId: v } = i(), { complianceFrameworks: y } = e(), b = y.find((e) => e.id === v) ?? y[0];
9
- return b ? /* @__PURE__ */ g("div", {
9
+ let _ = t(), { frameworkId: v } = i(), { complianceFrameworks: y } = e(), b = y.find((e) => e.id === v) ?? y[0];
10
+ return b ? /* @__PURE__ */ o("div", {
10
11
  className: "space-y-6 p-6",
11
12
  children: [
12
- /* @__PURE__ */ g("div", {
13
+ /* @__PURE__ */ o("div", {
13
14
  className: "flex items-center justify-between",
14
- children: [/* @__PURE__ */ g("div", {
15
+ children: [/* @__PURE__ */ o("div", {
15
16
  className: "flex items-center gap-4",
16
- children: [/* @__PURE__ */ h(o, {
17
+ children: [/* @__PURE__ */ a(c, {
17
18
  variant: "ghost",
18
19
  size: "icon",
19
20
  onClick: () => _("/security/security-hub"),
20
- children: /* @__PURE__ */ h(t, { className: "h-4 w-4" })
21
- }), /* @__PURE__ */ g("div", { children: [/* @__PURE__ */ g("div", {
21
+ children: /* @__PURE__ */ a(n, { className: "h-4 w-4" })
22
+ }), /* @__PURE__ */ o("div", { children: [/* @__PURE__ */ o("div", {
22
23
  className: "flex items-center gap-3",
23
- children: [/* @__PURE__ */ h("h1", {
24
+ children: [/* @__PURE__ */ a("h1", {
24
25
  className: "text-2xl font-bold",
25
- children: /* @__PURE__ */ g(f, { children: [
26
+ children: /* @__PURE__ */ o(m, { children: [
26
27
  b.name,
27
28
  " ",
28
29
  b.version
29
30
  ] })
30
- }), /* @__PURE__ */ h(a, {
31
+ }), /* @__PURE__ */ a(s, {
31
32
  variant: b.status === "compliant" ? "default" : b.status === "non_compliant" ? "destructive" : "secondary",
32
33
  children: b.status.replace("_", " ")
33
34
  })]
34
- }), /* @__PURE__ */ h("p", {
35
+ }), /* @__PURE__ */ a("p", {
35
36
  className: "text-sm text-text-secondary mt-1",
36
37
  children: "Compliance framework assessment details"
37
38
  })] })]
38
- }), /* @__PURE__ */ g(o, {
39
+ }), /* @__PURE__ */ o(c, {
39
40
  size: "sm",
40
- children: [/* @__PURE__ */ h(n, { className: "mr-2 h-4 w-4" }), "Run Assessment"]
41
+ children: [/* @__PURE__ */ a(r, { className: "mr-2 h-4 w-4" }), "Run Assessment"]
41
42
  })]
42
43
  }),
43
- /* @__PURE__ */ h(m, { children: "See exactly how you measure up against a single compliance framework — your overall score, which controls pass or fail, and when the next assessment is due. Use it to close control gaps and stay audit-ready for standards like ISO 27001 or SOC 2." }),
44
- /* @__PURE__ */ g("div", {
44
+ /* @__PURE__ */ a(g, { children: "See exactly how you measure up against a single compliance framework — your overall score, which controls pass or fail, and when the next assessment is due. Use it to close control gaps and stay audit-ready for standards like ISO 27001 or SOC 2." }),
45
+ /* @__PURE__ */ o("div", {
45
46
  className: "grid gap-4 md:grid-cols-4",
46
47
  children: [
47
- /* @__PURE__ */ g(d, {
48
+ /* @__PURE__ */ o(p, {
48
49
  className: "text-center",
49
- children: [/* @__PURE__ */ g("p", {
50
+ children: [/* @__PURE__ */ o("p", {
50
51
  className: "text-4xl font-bold tabular-nums",
51
52
  children: [b.score, "%"]
52
- }), /* @__PURE__ */ h("p", {
53
+ }), /* @__PURE__ */ a("p", {
53
54
  className: "text-xs text-text-secondary",
54
55
  children: "Overall Score"
55
56
  })]
56
57
  }),
57
- /* @__PURE__ */ h(s, { children: /* @__PURE__ */ g(c, {
58
+ /* @__PURE__ */ a(l, { children: /* @__PURE__ */ o(u, {
58
59
  className: "pt-4 text-center",
59
- children: [/* @__PURE__ */ h("p", {
60
+ children: [/* @__PURE__ */ a("p", {
60
61
  className: "text-4xl font-bold text-status-success-text",
61
62
  children: b.passedControls
62
- }), /* @__PURE__ */ h("p", {
63
+ }), /* @__PURE__ */ a("p", {
63
64
  className: "text-xs text-text-secondary",
64
65
  children: "Passed"
65
66
  })]
66
67
  }) }),
67
- /* @__PURE__ */ h(s, { children: /* @__PURE__ */ g(c, {
68
+ /* @__PURE__ */ a(l, { children: /* @__PURE__ */ o(u, {
68
69
  className: "pt-4 text-center",
69
- children: [/* @__PURE__ */ h("p", {
70
+ children: [/* @__PURE__ */ a("p", {
70
71
  className: "text-4xl font-bold text-status-error-text",
71
72
  children: b.failedControls
72
- }), /* @__PURE__ */ h("p", {
73
+ }), /* @__PURE__ */ a("p", {
73
74
  className: "text-xs text-text-secondary",
74
75
  children: "Failed"
75
76
  })]
76
77
  }) }),
77
- /* @__PURE__ */ h(s, { children: /* @__PURE__ */ g(c, {
78
+ /* @__PURE__ */ a(l, { children: /* @__PURE__ */ o(u, {
78
79
  className: "pt-4 text-center",
79
- children: [/* @__PURE__ */ h("p", {
80
+ children: [/* @__PURE__ */ a("p", {
80
81
  className: "text-4xl font-bold",
81
82
  children: b.totalControls
82
- }), /* @__PURE__ */ h("p", {
83
+ }), /* @__PURE__ */ a("p", {
83
84
  className: "text-xs text-text-secondary",
84
85
  children: "Total Controls"
85
86
  })]
86
87
  }) })
87
88
  ]
88
89
  }),
89
- /* @__PURE__ */ g(s, { children: [/* @__PURE__ */ h(l, { children: /* @__PURE__ */ h(u, { children: "Compliance Progress" }) }), /* @__PURE__ */ g(c, { children: [/* @__PURE__ */ h("div", {
90
+ /* @__PURE__ */ o(l, { children: [/* @__PURE__ */ a(d, { children: /* @__PURE__ */ a(f, { children: "Compliance Progress" }) }), /* @__PURE__ */ o(u, { children: [/* @__PURE__ */ a("div", {
90
91
  className: "h-4 rounded-full bg-bg-sunken overflow-hidden",
91
- children: /* @__PURE__ */ h("div", {
92
+ children: /* @__PURE__ */ a("div", {
92
93
  className: `h-full rounded-full ${b.score >= 90 ? "bg-status-success-bg" : b.score >= 70 ? "bg-status-warning-bg" : "bg-status-error-bg"}`,
93
94
  style: { width: `${b.score}%` }
94
95
  })
95
- }), /* @__PURE__ */ g("div", {
96
+ }), /* @__PURE__ */ o("div", {
96
97
  className: "flex justify-between mt-2 text-xs text-text-secondary",
97
- children: [/* @__PURE__ */ g("span", { children: ["Last Assessment: ", b.lastAssessment] }), /* @__PURE__ */ g("span", { children: ["Next Assessment: ", b.nextAssessment] })]
98
+ children: [/* @__PURE__ */ o("span", { children: ["Last Assessment: ", b.lastAssessment] }), /* @__PURE__ */ o("span", { children: ["Next Assessment: ", b.nextAssessment] })]
98
99
  })] })] })
99
100
  ]
100
- }) : /* @__PURE__ */ h("div", {
101
+ }) : /* @__PURE__ */ a("div", {
101
102
  className: "p-6",
102
- children: /* @__PURE__ */ h(p, {
103
+ children: /* @__PURE__ */ a(h, {
103
104
  illustration: "empty-search",
104
105
  title: "Framework not found",
105
106
  description: "This compliance framework may have been removed. Return to the security hub to find it.",
106
- action: /* @__PURE__ */ h(o, {
107
+ action: /* @__PURE__ */ a(c, {
107
108
  size: "sm",
108
109
  onClick: () => _("/security/security-hub"),
109
110
  children: "Back to security"
@@ -1 +1 @@
1
- {"version":3,"file":"SecurityComplianceDetailPage.js","names":[],"sources":["../../../src/assethandler/pages/SecurityComplianceDetailPage.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n GradientText,\n EmphasisPanel,\n PagePurpose,\n IllustratedEmptyState,\n} from '@burdenoff/fe-libs/ui';\nimport { ArrowLeft, Shield } from 'lucide-react';\nimport { useNavigate, useParams } from 'react-router-dom';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\n\nexport function SecurityComplianceDetailPage() {\n const navigate = useNavigate();\n const { frameworkId } = useParams<{ frameworkId: string }>();\n const { complianceFrameworks } = useAssetHandlerStore();\n const framework =\n complianceFrameworks.find((item) => item.id === frameworkId) ?? complianceFrameworks[0];\n\n if (!framework)\n return (\n <div className=\"p-6\">\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title=\"Framework not found\"\n description=\"This compliance framework may have been removed. Return to the security hub to find it.\"\n action={\n <Button size=\"sm\" onClick={() => navigate('/security/security-hub')}>\n Back to security\n </Button>\n }\n />\n </div>\n );\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-4\">\n <Button variant=\"ghost\" size=\"icon\" onClick={() => navigate('/security/security-hub')}>\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n <div>\n <div className=\"flex items-center gap-3\">\n <h1 className=\"text-2xl font-bold\">\n <GradientText>\n {framework.name} {framework.version}\n </GradientText>\n </h1>\n <Badge\n variant={\n framework.status === 'compliant'\n ? 'default'\n : framework.status === 'non_compliant'\n ? 'destructive'\n : 'secondary'\n }\n >\n {framework.status.replace('_', ' ')}\n </Badge>\n </div>\n <p className=\"text-sm text-text-secondary mt-1\">\n Compliance framework assessment details\n </p>\n </div>\n </div>\n <Button size=\"sm\">\n <Shield className=\"mr-2 h-4 w-4\" />\n Run Assessment\n </Button>\n </div>\n\n <PagePurpose>\n See exactly how you measure up against a single compliance framework — your overall score,\n which controls pass or fail, and when the next assessment is due. Use it to close control\n gaps and stay audit-ready for standards like ISO 27001 or SOC 2.\n </PagePurpose>\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n <EmphasisPanel className=\"text-center\">\n <p className=\"text-4xl font-bold tabular-nums\">{framework.score}%</p>\n <p className=\"text-xs text-text-secondary\">Overall Score</p>\n </EmphasisPanel>\n <Card>\n <CardContent className=\"pt-4 text-center\">\n <p className=\"text-4xl font-bold text-status-success-text\">\n {framework.passedControls}\n </p>\n <p className=\"text-xs text-text-secondary\">Passed</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4 text-center\">\n <p className=\"text-4xl font-bold text-status-error-text\">{framework.failedControls}</p>\n <p className=\"text-xs text-text-secondary\">Failed</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4 text-center\">\n <p className=\"text-4xl font-bold\">{framework.totalControls}</p>\n <p className=\"text-xs text-text-secondary\">Total Controls</p>\n </CardContent>\n </Card>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>Compliance Progress</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"h-4 rounded-full bg-bg-sunken overflow-hidden\">\n <div\n className={`h-full rounded-full ${framework.score >= 90 ? 'bg-status-success-bg' : framework.score >= 70 ? 'bg-status-warning-bg' : 'bg-status-error-bg'}`}\n style={{ width: `${framework.score}%` }}\n />\n </div>\n <div className=\"flex justify-between mt-2 text-xs text-text-secondary\">\n <span>Last Assessment: {framework.lastAssessment}</span>\n <span>Next Assessment: {framework.nextAssessment}</span>\n </div>\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"SecurityComplianceDetailPage.js","names":[],"sources":["../../../src/assethandler/pages/SecurityComplianceDetailPage.tsx"],"sourcesContent":["import { useAssetHandlerNavigate } from '../hooks/useAssetHandlerNavigate';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n GradientText,\n EmphasisPanel,\n PagePurpose,\n IllustratedEmptyState,\n} from '@burdenoff/fe-libs/ui';\nimport { ArrowLeft, Shield } from 'lucide-react';\nimport { useParams } from 'react-router-dom';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\n\nexport function SecurityComplianceDetailPage() {\n const navigate = useAssetHandlerNavigate();\n const { frameworkId } = useParams<{ frameworkId: string }>();\n const { complianceFrameworks } = useAssetHandlerStore();\n const framework =\n complianceFrameworks.find((item) => item.id === frameworkId) ?? complianceFrameworks[0];\n\n if (!framework)\n return (\n <div className=\"p-6\">\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title=\"Framework not found\"\n description=\"This compliance framework may have been removed. Return to the security hub to find it.\"\n action={\n <Button size=\"sm\" onClick={() => navigate('/security/security-hub')}>\n Back to security\n </Button>\n }\n />\n </div>\n );\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-4\">\n <Button variant=\"ghost\" size=\"icon\" onClick={() => navigate('/security/security-hub')}>\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n <div>\n <div className=\"flex items-center gap-3\">\n <h1 className=\"text-2xl font-bold\">\n <GradientText>\n {framework.name} {framework.version}\n </GradientText>\n </h1>\n <Badge\n variant={\n framework.status === 'compliant'\n ? 'default'\n : framework.status === 'non_compliant'\n ? 'destructive'\n : 'secondary'\n }\n >\n {framework.status.replace('_', ' ')}\n </Badge>\n </div>\n <p className=\"text-sm text-text-secondary mt-1\">\n Compliance framework assessment details\n </p>\n </div>\n </div>\n <Button size=\"sm\">\n <Shield className=\"mr-2 h-4 w-4\" />\n Run Assessment\n </Button>\n </div>\n\n <PagePurpose>\n See exactly how you measure up against a single compliance framework — your overall score,\n which controls pass or fail, and when the next assessment is due. Use it to close control\n gaps and stay audit-ready for standards like ISO 27001 or SOC 2.\n </PagePurpose>\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n <EmphasisPanel className=\"text-center\">\n <p className=\"text-4xl font-bold tabular-nums\">{framework.score}%</p>\n <p className=\"text-xs text-text-secondary\">Overall Score</p>\n </EmphasisPanel>\n <Card>\n <CardContent className=\"pt-4 text-center\">\n <p className=\"text-4xl font-bold text-status-success-text\">\n {framework.passedControls}\n </p>\n <p className=\"text-xs text-text-secondary\">Passed</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4 text-center\">\n <p className=\"text-4xl font-bold text-status-error-text\">{framework.failedControls}</p>\n <p className=\"text-xs text-text-secondary\">Failed</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4 text-center\">\n <p className=\"text-4xl font-bold\">{framework.totalControls}</p>\n <p className=\"text-xs text-text-secondary\">Total Controls</p>\n </CardContent>\n </Card>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>Compliance Progress</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"h-4 rounded-full bg-bg-sunken overflow-hidden\">\n <div\n className={`h-full rounded-full ${framework.score >= 90 ? 'bg-status-success-bg' : framework.score >= 70 ? 'bg-status-warning-bg' : 'bg-status-error-bg'}`}\n style={{ width: `${framework.score}%` }}\n />\n </div>\n <div className=\"flex justify-between mt-2 text-xs text-text-secondary\">\n <span>Last Assessment: {framework.lastAssessment}</span>\n <span>Next Assessment: {framework.nextAssessment}</span>\n </div>\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,116 +1,117 @@
1
1
  import { useAssetHandlerStore as e } from "../store/assethandlerStore.js";
2
- import { ArrowLeft as t, Edit as n, FileText as r } from "lucide-react";
3
- import { useNavigate as i, useParams as a } from "react-router-dom";
4
- import { Badge as o, Button as s, Card as c, CardContent as l, CardHeader as u, CardTitle as d, EmphasisPanel as f, GradientText as p, IllustratedEmptyState as m, PagePurpose as h, Separator as g } from "@burdenoff/fe-libs/ui";
5
- import { jsx as _, jsxs as v } from "react/jsx-runtime";
2
+ import { useAssetHandlerNavigate as t } from "../hooks/useAssetHandlerNavigate.js";
3
+ import { ArrowLeft as n, Edit as r, FileText as i } from "lucide-react";
4
+ import { useParams as a } from "react-router-dom";
5
+ import { jsx as o, jsxs as s } from "react/jsx-runtime";
6
+ import { Badge as c, Button as l, Card as u, CardContent as d, CardHeader as f, CardTitle as p, EmphasisPanel as m, GradientText as h, IllustratedEmptyState as g, PagePurpose as _, Separator as v } from "@burdenoff/fe-libs/ui";
6
7
  //#region src/assethandler/pages/SecurityPolicyDetailPage.tsx
7
8
  function y() {
8
- let y = i(), { policyId: b } = a(), { securityPolicies: x } = e(), S = x.find((e) => e.id === b) ?? x[0];
9
- return S ? /* @__PURE__ */ v("div", {
9
+ let y = t(), { policyId: b } = a(), { securityPolicies: x } = e(), S = x.find((e) => e.id === b) ?? x[0];
10
+ return S ? /* @__PURE__ */ s("div", {
10
11
  className: "space-y-6 p-6",
11
12
  children: [
12
- /* @__PURE__ */ v("div", {
13
+ /* @__PURE__ */ s("div", {
13
14
  className: "flex items-center justify-between",
14
- children: [/* @__PURE__ */ v("div", {
15
+ children: [/* @__PURE__ */ s("div", {
15
16
  className: "flex items-center gap-4",
16
- children: [/* @__PURE__ */ _(s, {
17
+ children: [/* @__PURE__ */ o(l, {
17
18
  variant: "ghost",
18
19
  size: "icon",
19
20
  onClick: () => y("/security/security-hub"),
20
- children: /* @__PURE__ */ _(t, { className: "h-4 w-4" })
21
- }), /* @__PURE__ */ v("div", { children: [/* @__PURE__ */ v("div", {
21
+ children: /* @__PURE__ */ o(n, { className: "h-4 w-4" })
22
+ }), /* @__PURE__ */ s("div", { children: [/* @__PURE__ */ s("div", {
22
23
  className: "flex items-center gap-3",
23
24
  children: [
24
- /* @__PURE__ */ _("h1", {
25
+ /* @__PURE__ */ o("h1", {
25
26
  className: "text-2xl font-bold",
26
- children: /* @__PURE__ */ _(p, { children: S.name })
27
+ children: /* @__PURE__ */ o(h, { children: S.name })
27
28
  }),
28
- /* @__PURE__ */ _(o, {
29
+ /* @__PURE__ */ o(c, {
29
30
  variant: S.status === "active" ? "default" : S.status === "deprecated" ? "destructive" : "outline",
30
31
  children: S.status.replace("_", " ")
31
32
  }),
32
- /* @__PURE__ */ v(o, {
33
+ /* @__PURE__ */ s(c, {
33
34
  variant: "secondary",
34
35
  children: ["v", S.version]
35
36
  })
36
37
  ]
37
- }), /* @__PURE__ */ _("p", {
38
+ }), /* @__PURE__ */ o("p", {
38
39
  className: "text-sm text-text-secondary mt-1",
39
40
  children: S.description
40
41
  })] })]
41
- }), /* @__PURE__ */ v(s, {
42
+ }), /* @__PURE__ */ s(l, {
42
43
  size: "sm",
43
- children: [/* @__PURE__ */ _(n, { className: "mr-2 h-4 w-4" }), "Edit Policy"]
44
+ children: [/* @__PURE__ */ o(r, { className: "mr-2 h-4 w-4" }), "Edit Policy"]
44
45
  })]
45
46
  }),
46
- /* @__PURE__ */ _(h, { children: "The authoritative record of a single security policy — what it covers, who owns it, who it applies to, and when it is next due for review. Use this page to confirm the policy is current and that the right teams are bound by it." }),
47
- /* @__PURE__ */ v("div", {
47
+ /* @__PURE__ */ o(_, { children: "The authoritative record of a single security policy — what it covers, who owns it, who it applies to, and when it is next due for review. Use this page to confirm the policy is current and that the right teams are bound by it." }),
48
+ /* @__PURE__ */ s("div", {
48
49
  className: "grid gap-6 lg:grid-cols-3",
49
- children: [/* @__PURE__ */ v(f, {
50
+ children: [/* @__PURE__ */ s(m, {
50
51
  className: "lg:col-span-2",
51
- children: [/* @__PURE__ */ _(u, {
52
+ children: [/* @__PURE__ */ o(f, {
52
53
  className: "px-0 pt-0",
53
- children: /* @__PURE__ */ _(d, { children: "Policy Details" })
54
- }), /* @__PURE__ */ _(l, {
54
+ children: /* @__PURE__ */ o(p, { children: "Policy Details" })
55
+ }), /* @__PURE__ */ o(d, {
55
56
  className: "px-0 pb-0",
56
- children: /* @__PURE__ */ v("dl", {
57
+ children: /* @__PURE__ */ s("dl", {
57
58
  className: "space-y-4 text-sm",
58
59
  children: [
59
- /* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("dt", {
60
+ /* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("dt", {
60
61
  className: "text-text-secondary",
61
62
  children: "Description"
62
- }), /* @__PURE__ */ _("dd", {
63
+ }), /* @__PURE__ */ o("dd", {
63
64
  className: "mt-1",
64
65
  children: S.description
65
66
  })] }),
66
- /* @__PURE__ */ _(g, {}),
67
- /* @__PURE__ */ v("div", {
67
+ /* @__PURE__ */ o(v, {}),
68
+ /* @__PURE__ */ s("div", {
68
69
  className: "grid grid-cols-2 gap-4",
69
70
  children: [
70
- /* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("dt", {
71
+ /* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("dt", {
71
72
  className: "text-text-secondary",
72
73
  children: "Category"
73
- }), /* @__PURE__ */ _("dd", {
74
+ }), /* @__PURE__ */ o("dd", {
74
75
  className: "font-medium",
75
76
  children: S.category
76
77
  })] }),
77
- /* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("dt", {
78
+ /* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("dt", {
78
79
  className: "text-text-secondary",
79
80
  children: "Version"
80
- }), /* @__PURE__ */ _("dd", {
81
+ }), /* @__PURE__ */ o("dd", {
81
82
  className: "font-medium",
82
83
  children: S.version
83
84
  })] }),
84
- /* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("dt", {
85
+ /* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("dt", {
85
86
  className: "text-text-secondary",
86
87
  children: "Effective Date"
87
- }), /* @__PURE__ */ _("dd", {
88
+ }), /* @__PURE__ */ o("dd", {
88
89
  className: "font-medium",
89
90
  children: S.effectiveDate
90
91
  })] }),
91
- /* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("dt", {
92
+ /* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("dt", {
92
93
  className: "text-text-secondary",
93
94
  children: "Review Date"
94
- }), /* @__PURE__ */ _("dd", {
95
+ }), /* @__PURE__ */ o("dd", {
95
96
  className: "font-medium",
96
97
  children: S.reviewDate
97
98
  })] }),
98
- /* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("dt", {
99
+ /* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("dt", {
99
100
  className: "text-text-secondary",
100
101
  children: "Owner"
101
- }), /* @__PURE__ */ _("dd", {
102
+ }), /* @__PURE__ */ o("dd", {
102
103
  className: "font-medium",
103
104
  children: S.owner
104
105
  })] })
105
106
  ]
106
107
  }),
107
- /* @__PURE__ */ _(g, {}),
108
- /* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("dt", {
108
+ /* @__PURE__ */ o(v, {}),
109
+ /* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("dt", {
109
110
  className: "text-text-secondary mb-2",
110
111
  children: "Applicable To"
111
- }), /* @__PURE__ */ _("dd", {
112
+ }), /* @__PURE__ */ o("dd", {
112
113
  className: "flex flex-wrap gap-1.5",
113
- children: S.applicableTo.map((e) => /* @__PURE__ */ _(o, {
114
+ children: S.applicableTo.map((e) => /* @__PURE__ */ o(c, {
114
115
  variant: "secondary",
115
116
  children: e
116
117
  }, e))
@@ -118,25 +119,25 @@ function y() {
118
119
  ]
119
120
  })
120
121
  })]
121
- }), /* @__PURE__ */ v(c, { children: [/* @__PURE__ */ _(u, { children: /* @__PURE__ */ _(d, {
122
+ }), /* @__PURE__ */ s(u, { children: [/* @__PURE__ */ o(f, { children: /* @__PURE__ */ o(p, {
122
123
  className: "text-base",
123
124
  children: "Status"
124
- }) }), /* @__PURE__ */ _(l, { children: /* @__PURE__ */ v("div", {
125
+ }) }), /* @__PURE__ */ o(d, { children: /* @__PURE__ */ s("div", {
125
126
  className: `p-4 rounded-lg text-center ${S.status === "active" ? "bg-status-success-bg-subtle text-status-success-text" : S.status === "deprecated" ? "bg-status-error-bg-subtle text-status-error-text" : "bg-status-warning-bg-subtle text-status-warning-text"}`,
126
- children: [/* @__PURE__ */ _(r, { className: "h-8 w-8 mx-auto mb-2" }), /* @__PURE__ */ _("p", {
127
+ children: [/* @__PURE__ */ o(i, { className: "h-8 w-8 mx-auto mb-2" }), /* @__PURE__ */ o("p", {
127
128
  className: "text-lg font-bold uppercase",
128
129
  children: S.status.replace("_", " ")
129
130
  })]
130
131
  }) })] })]
131
132
  })
132
133
  ]
133
- }) : /* @__PURE__ */ _("div", {
134
+ }) : /* @__PURE__ */ o("div", {
134
135
  className: "p-6",
135
- children: /* @__PURE__ */ _(m, {
136
+ children: /* @__PURE__ */ o(g, {
136
137
  illustration: "empty-files",
137
138
  title: "Policy not found",
138
139
  description: "This security policy may have been retired. Return to the security hub to find it.",
139
- action: /* @__PURE__ */ _(s, {
140
+ action: /* @__PURE__ */ o(l, {
140
141
  size: "sm",
141
142
  onClick: () => y("/security/security-hub"),
142
143
  children: "Back to security"
@@ -1 +1 @@
1
- {"version":3,"file":"SecurityPolicyDetailPage.js","names":[],"sources":["../../../src/assethandler/pages/SecurityPolicyDetailPage.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Separator,\n GradientText,\n EmphasisPanel,\n PagePurpose,\n IllustratedEmptyState,\n} from '@burdenoff/fe-libs/ui';\nimport { ArrowLeft, Edit, FileText } from 'lucide-react';\nimport { useNavigate, useParams } from 'react-router-dom';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\n\nexport function SecurityPolicyDetailPage() {\n const navigate = useNavigate();\n const { policyId } = useParams<{ policyId: string }>();\n const { securityPolicies } = useAssetHandlerStore();\n const policy = securityPolicies.find((item) => item.id === policyId) ?? securityPolicies[0];\n\n if (!policy)\n return (\n <div className=\"p-6\">\n <IllustratedEmptyState\n illustration=\"empty-files\"\n title=\"Policy not found\"\n description=\"This security policy may have been retired. Return to the security hub to find it.\"\n action={\n <Button size=\"sm\" onClick={() => navigate('/security/security-hub')}>\n Back to security\n </Button>\n }\n />\n </div>\n );\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-4\">\n <Button variant=\"ghost\" size=\"icon\" onClick={() => navigate('/security/security-hub')}>\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n <div>\n <div className=\"flex items-center gap-3\">\n <h1 className=\"text-2xl font-bold\">\n <GradientText>{policy.name}</GradientText>\n </h1>\n <Badge\n variant={\n policy.status === 'active'\n ? 'default'\n : policy.status === 'deprecated'\n ? 'destructive'\n : 'outline'\n }\n >\n {policy.status.replace('_', ' ')}\n </Badge>\n <Badge variant=\"secondary\">v{policy.version}</Badge>\n </div>\n <p className=\"text-sm text-text-secondary mt-1\">{policy.description}</p>\n </div>\n </div>\n <Button size=\"sm\">\n <Edit className=\"mr-2 h-4 w-4\" />\n Edit Policy\n </Button>\n </div>\n\n <PagePurpose>\n The authoritative record of a single security policy — what it covers, who owns it, who it\n applies to, and when it is next due for review. Use this page to confirm the policy is\n current and that the right teams are bound by it.\n </PagePurpose>\n\n <div className=\"grid gap-6 lg:grid-cols-3\">\n <EmphasisPanel className=\"lg:col-span-2\">\n <CardHeader className=\"px-0 pt-0\">\n <CardTitle>Policy Details</CardTitle>\n </CardHeader>\n <CardContent className=\"px-0 pb-0\">\n <dl className=\"space-y-4 text-sm\">\n <div>\n <dt className=\"text-text-secondary\">Description</dt>\n <dd className=\"mt-1\">{policy.description}</dd>\n </div>\n <Separator />\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <dt className=\"text-text-secondary\">Category</dt>\n <dd className=\"font-medium\">{policy.category}</dd>\n </div>\n <div>\n <dt className=\"text-text-secondary\">Version</dt>\n <dd className=\"font-medium\">{policy.version}</dd>\n </div>\n <div>\n <dt className=\"text-text-secondary\">Effective Date</dt>\n <dd className=\"font-medium\">{policy.effectiveDate}</dd>\n </div>\n <div>\n <dt className=\"text-text-secondary\">Review Date</dt>\n <dd className=\"font-medium\">{policy.reviewDate}</dd>\n </div>\n <div>\n <dt className=\"text-text-secondary\">Owner</dt>\n <dd className=\"font-medium\">{policy.owner}</dd>\n </div>\n </div>\n <Separator />\n <div>\n <dt className=\"text-text-secondary mb-2\">Applicable To</dt>\n <dd className=\"flex flex-wrap gap-1.5\">\n {policy.applicableTo.map((dept) => (\n <Badge key={dept} variant=\"secondary\">\n {dept}\n </Badge>\n ))}\n </dd>\n </div>\n </dl>\n </CardContent>\n </EmphasisPanel>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base\">Status</CardTitle>\n </CardHeader>\n <CardContent>\n <div\n className={`p-4 rounded-lg text-center ${policy.status === 'active' ? 'bg-status-success-bg-subtle text-status-success-text' : policy.status === 'deprecated' ? 'bg-status-error-bg-subtle text-status-error-text' : 'bg-status-warning-bg-subtle text-status-warning-text'}`}\n >\n <FileText className=\"h-8 w-8 mx-auto mb-2\" />\n <p className=\"text-lg font-bold uppercase\">{policy.status.replace('_', ' ')}</p>\n </div>\n </CardContent>\n </Card>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"SecurityPolicyDetailPage.js","names":[],"sources":["../../../src/assethandler/pages/SecurityPolicyDetailPage.tsx"],"sourcesContent":["import { useAssetHandlerNavigate } from '../hooks/useAssetHandlerNavigate';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Separator,\n GradientText,\n EmphasisPanel,\n PagePurpose,\n IllustratedEmptyState,\n} from '@burdenoff/fe-libs/ui';\nimport { ArrowLeft, Edit, FileText } from 'lucide-react';\nimport { useParams } from 'react-router-dom';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\n\nexport function SecurityPolicyDetailPage() {\n const navigate = useAssetHandlerNavigate();\n const { policyId } = useParams<{ policyId: string }>();\n const { securityPolicies } = useAssetHandlerStore();\n const policy = securityPolicies.find((item) => item.id === policyId) ?? securityPolicies[0];\n\n if (!policy)\n return (\n <div className=\"p-6\">\n <IllustratedEmptyState\n illustration=\"empty-files\"\n title=\"Policy not found\"\n description=\"This security policy may have been retired. Return to the security hub to find it.\"\n action={\n <Button size=\"sm\" onClick={() => navigate('/security/security-hub')}>\n Back to security\n </Button>\n }\n />\n </div>\n );\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-4\">\n <Button variant=\"ghost\" size=\"icon\" onClick={() => navigate('/security/security-hub')}>\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n <div>\n <div className=\"flex items-center gap-3\">\n <h1 className=\"text-2xl font-bold\">\n <GradientText>{policy.name}</GradientText>\n </h1>\n <Badge\n variant={\n policy.status === 'active'\n ? 'default'\n : policy.status === 'deprecated'\n ? 'destructive'\n : 'outline'\n }\n >\n {policy.status.replace('_', ' ')}\n </Badge>\n <Badge variant=\"secondary\">v{policy.version}</Badge>\n </div>\n <p className=\"text-sm text-text-secondary mt-1\">{policy.description}</p>\n </div>\n </div>\n <Button size=\"sm\">\n <Edit className=\"mr-2 h-4 w-4\" />\n Edit Policy\n </Button>\n </div>\n\n <PagePurpose>\n The authoritative record of a single security policy — what it covers, who owns it, who it\n applies to, and when it is next due for review. Use this page to confirm the policy is\n current and that the right teams are bound by it.\n </PagePurpose>\n\n <div className=\"grid gap-6 lg:grid-cols-3\">\n <EmphasisPanel className=\"lg:col-span-2\">\n <CardHeader className=\"px-0 pt-0\">\n <CardTitle>Policy Details</CardTitle>\n </CardHeader>\n <CardContent className=\"px-0 pb-0\">\n <dl className=\"space-y-4 text-sm\">\n <div>\n <dt className=\"text-text-secondary\">Description</dt>\n <dd className=\"mt-1\">{policy.description}</dd>\n </div>\n <Separator />\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <dt className=\"text-text-secondary\">Category</dt>\n <dd className=\"font-medium\">{policy.category}</dd>\n </div>\n <div>\n <dt className=\"text-text-secondary\">Version</dt>\n <dd className=\"font-medium\">{policy.version}</dd>\n </div>\n <div>\n <dt className=\"text-text-secondary\">Effective Date</dt>\n <dd className=\"font-medium\">{policy.effectiveDate}</dd>\n </div>\n <div>\n <dt className=\"text-text-secondary\">Review Date</dt>\n <dd className=\"font-medium\">{policy.reviewDate}</dd>\n </div>\n <div>\n <dt className=\"text-text-secondary\">Owner</dt>\n <dd className=\"font-medium\">{policy.owner}</dd>\n </div>\n </div>\n <Separator />\n <div>\n <dt className=\"text-text-secondary mb-2\">Applicable To</dt>\n <dd className=\"flex flex-wrap gap-1.5\">\n {policy.applicableTo.map((dept) => (\n <Badge key={dept} variant=\"secondary\">\n {dept}\n </Badge>\n ))}\n </dd>\n </div>\n </dl>\n </CardContent>\n </EmphasisPanel>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base\">Status</CardTitle>\n </CardHeader>\n <CardContent>\n <div\n className={`p-4 rounded-lg text-center ${policy.status === 'active' ? 'bg-status-success-bg-subtle text-status-success-text' : policy.status === 'deprecated' ? 'bg-status-error-bg-subtle text-status-error-text' : 'bg-status-warning-bg-subtle text-status-warning-text'}`}\n >\n <FileText className=\"h-8 w-8 mx-auto mb-2\" />\n <p className=\"text-lg font-bold uppercase\">{policy.status.replace('_', ' ')}</p>\n </div>\n </CardContent>\n </Card>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}