@burdenoff/microfe-assethandler 2026.625.1 → 2026.625.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/assethandler/pages/AiPredictionsPage.js +42 -41
- package/dist/assethandler/pages/AiPredictionsPage.js.map +1 -1
- package/dist/assethandler/pages/AnalyticsPage.js +538 -534
- package/dist/assethandler/pages/AnalyticsPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetCategoriesPage.js +135 -125
- package/dist/assethandler/pages/AssetsAssetCategoriesPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetCheckInOutPage.js +90 -92
- package/dist/assethandler/pages/AssetsAssetCheckInOutPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetCreatePage.js +131 -124
- package/dist/assethandler/pages/AssetsAssetCreatePage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetDetailPage.js +214 -185
- package/dist/assethandler/pages/AssetsAssetDetailPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetEditPage.js +168 -156
- package/dist/assethandler/pages/AssetsAssetEditPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetListPage.js +207 -187
- package/dist/assethandler/pages/AssetsAssetListPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetTrackingPage.js +82 -71
- package/dist/assethandler/pages/AssetsAssetTrackingPage.js.map +1 -1
- package/dist/assethandler/pages/AuditTrailPage.js +93 -91
- package/dist/assethandler/pages/AuditTrailPage.js.map +1 -1
- package/dist/assethandler/pages/CmdbBrowserPage.js +32 -33
- package/dist/assethandler/pages/CmdbBrowserPage.js.map +1 -1
- package/dist/assethandler/pages/DashboardPage.js +157 -126
- package/dist/assethandler/pages/DashboardPage.js.map +1 -1
- package/dist/assethandler/pages/DigitalTwinPage.js +25 -26
- package/dist/assethandler/pages/DigitalTwinPage.js.map +1 -1
- package/dist/assethandler/pages/DiscoveryJobsPage.js +50 -50
- package/dist/assethandler/pages/DiscoveryJobsPage.js.map +1 -1
- package/dist/assethandler/pages/EsgDashboardPage.js +43 -42
- package/dist/assethandler/pages/EsgDashboardPage.js.map +1 -1
- package/dist/assethandler/pages/FinanceBudgetDetailPage.js +96 -82
- package/dist/assethandler/pages/FinanceBudgetDetailPage.js.map +1 -1
- package/dist/assethandler/pages/FinanceFinanceHubPage.js +137 -103
- package/dist/assethandler/pages/FinanceFinanceHubPage.js.map +1 -1
- package/dist/assethandler/pages/FinanceInvoiceDetailPage.js +77 -66
- package/dist/assethandler/pages/FinanceInvoiceDetailPage.js.map +1 -1
- package/dist/assethandler/pages/IotDevicesPage.js +34 -35
- package/dist/assethandler/pages/IotDevicesPage.js.map +1 -1
- package/dist/assethandler/pages/ItilChangeDetailPage.js +236 -199
- package/dist/assethandler/pages/ItilChangeDetailPage.js.map +1 -1
- package/dist/assethandler/pages/ItilChangeManagementPage.js +66 -64
- package/dist/assethandler/pages/ItilChangeManagementPage.js.map +1 -1
- package/dist/assethandler/pages/ItilIncidentDetailPage.js +237 -200
- package/dist/assethandler/pages/ItilIncidentDetailPage.js.map +1 -1
- package/dist/assethandler/pages/ItilIncidentManagementPage.js +99 -97
- package/dist/assethandler/pages/ItilIncidentManagementPage.js.map +1 -1
- package/dist/assethandler/pages/ItilItilhubPage.js +166 -122
- package/dist/assethandler/pages/ItilItilhubPage.js.map +1 -1
- package/dist/assethandler/pages/ItilProblemDetailPage.js +193 -156
- package/dist/assethandler/pages/ItilProblemDetailPage.js.map +1 -1
- package/dist/assethandler/pages/ItilProblemManagementPage.js +63 -61
- package/dist/assethandler/pages/ItilProblemManagementPage.js.map +1 -1
- package/dist/assethandler/pages/KnowledgeBasePage.js +45 -43
- package/dist/assethandler/pages/KnowledgeBasePage.js.map +1 -1
- package/dist/assethandler/pages/MaintenanceMaintenanceCalendarPage.js +70 -68
- package/dist/assethandler/pages/MaintenanceMaintenanceCalendarPage.js.map +1 -1
- package/dist/assethandler/pages/MaintenanceMaintenanceSchedulerPage.js +77 -62
- package/dist/assethandler/pages/MaintenanceMaintenanceSchedulerPage.js.map +1 -1
- package/dist/assethandler/pages/MarketplaceMarketplaceDetailPage.js +162 -151
- package/dist/assethandler/pages/MarketplaceMarketplaceDetailPage.js.map +1 -1
- package/dist/assethandler/pages/MarketplaceMarketplaceListPage.js +64 -57
- package/dist/assethandler/pages/MarketplaceMarketplaceListPage.js.map +1 -1
- package/dist/assethandler/pages/MarketplaceMarketplaceOrdersPage.js +125 -108
- package/dist/assethandler/pages/MarketplaceMarketplaceOrdersPage.js.map +1 -1
- package/dist/assethandler/pages/MarketplaceMarketplaceSellPage.js +67 -61
- package/dist/assethandler/pages/MarketplaceMarketplaceSellPage.js.map +1 -1
- package/dist/assethandler/pages/OperationsMaintenanceDetailPage.js +203 -166
- package/dist/assethandler/pages/OperationsMaintenanceDetailPage.js.map +1 -1
- package/dist/assethandler/pages/OperationsOperationsHubPage.js +125 -95
- package/dist/assethandler/pages/OperationsOperationsHubPage.js.map +1 -1
- package/dist/assethandler/pages/OperationsWorkOrderDetailPage.js +165 -151
- package/dist/assethandler/pages/OperationsWorkOrderDetailPage.js.map +1 -1
- package/dist/assethandler/pages/PortfolioPortfolioOverviewPage.js +83 -81
- package/dist/assethandler/pages/PortfolioPortfolioOverviewPage.js.map +1 -1
- package/dist/assethandler/pages/ProvenancePage.js +56 -53
- package/dist/assethandler/pages/ProvenancePage.js.map +1 -1
- package/dist/assethandler/pages/ReportsReportBuilderPage.js +80 -73
- package/dist/assethandler/pages/ReportsReportBuilderPage.js.map +1 -1
- package/dist/assethandler/pages/ReportsReportsDashboardPage.js +112 -77
- package/dist/assethandler/pages/ReportsReportsDashboardPage.js.map +1 -1
- package/dist/assethandler/pages/ReportsReportsListPage.js +119 -103
- package/dist/assethandler/pages/ReportsReportsListPage.js.map +1 -1
- package/dist/assethandler/pages/SamLicensesPage.js +32 -33
- package/dist/assethandler/pages/SamLicensesPage.js.map +1 -1
- package/dist/assethandler/pages/SecurityComplianceDetailPage.js +60 -52
- package/dist/assethandler/pages/SecurityComplianceDetailPage.js.map +1 -1
- package/dist/assethandler/pages/SecurityPolicyDetailPage.js +134 -117
- package/dist/assethandler/pages/SecurityPolicyDetailPage.js.map +1 -1
- package/dist/assethandler/pages/SecurityScheduleBackupPage.js +63 -57
- package/dist/assethandler/pages/SecurityScheduleBackupPage.js.map +1 -1
- package/dist/assethandler/pages/SecuritySecurityEventDetailPage.js +131 -117
- package/dist/assethandler/pages/SecuritySecurityEventDetailPage.js.map +1 -1
- package/dist/assethandler/pages/SecuritySecurityHubPage.js +147 -113
- package/dist/assethandler/pages/SecuritySecurityHubPage.js.map +1 -1
- package/dist/assethandler/pages/TransactionsTransactionDetailPage.js +235 -218
- package/dist/assethandler/pages/TransactionsTransactionDetailPage.js.map +1 -1
- package/dist/assethandler/pages/TransactionsTransactionListPage.js +118 -116
- package/dist/assethandler/pages/TransactionsTransactionListPage.js.map +1 -1
- package/dist/assethandler/pages/UsersPage.js +108 -99
- package/dist/assethandler/pages/UsersPage.js.map +1 -1
- package/dist/assethandler/pages/UsersUserCreatePage.js +74 -67
- package/dist/assethandler/pages/UsersUserCreatePage.js.map +1 -1
- package/dist/assethandler/pages/UsersUserManagementHubPage.js +128 -93
- package/dist/assethandler/pages/UsersUserManagementHubPage.js.map +1 -1
- package/dist/assethandler/pages/WorkflowsWorkflowBuilderPage.js +211 -193
- package/dist/assethandler/pages/WorkflowsWorkflowBuilderPage.js.map +1 -1
- package/dist/assethandler/pages/WorkflowsWorkflowExecutionsPage.js +88 -86
- package/dist/assethandler/pages/WorkflowsWorkflowExecutionsPage.js.map +1 -1
- package/dist/assethandler/pages/WorkflowsWorkflowListPage.js +68 -60
- package/dist/assethandler/pages/WorkflowsWorkflowListPage.js.map +1 -1
- package/dist/assethandler/pages/WorkflowsWorkflowTemplatesPage.js +71 -68
- package/dist/assethandler/pages/WorkflowsWorkflowTemplatesPage.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,180 +1,206 @@
|
|
|
1
1
|
import { useAssetHandlerStore as e } from "../store/assethandlerStore.js";
|
|
2
2
|
import { AlertTriangle as t, Eye as n, FileText as r, Shield as i } from "lucide-react";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { useNavigate 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, NextSteps as h, PagePurpose as g, Tabs as _, TabsContent as v, TabsList as y, TabsTrigger as b } from "@burdenoff/fe-libs/ui";
|
|
5
|
+
import { jsx as x, jsxs as S } from "react/jsx-runtime";
|
|
5
6
|
//#region src/assethandler/pages/SecuritySecurityHubPage.tsx
|
|
6
|
-
var
|
|
7
|
+
var C = {
|
|
7
8
|
critical: "destructive",
|
|
8
9
|
high: "destructive",
|
|
9
10
|
medium: "default",
|
|
10
11
|
low: "secondary",
|
|
11
12
|
info: "outline"
|
|
12
13
|
};
|
|
13
|
-
function
|
|
14
|
-
let { securityEvents:
|
|
15
|
-
|
|
16
|
-
let
|
|
17
|
-
return /* @__PURE__ */
|
|
14
|
+
function w() {
|
|
15
|
+
let w = a(), { securityEvents: T, complianceFrameworks: E, securityPolicies: D } = e(), O = T.filter((e) => !e.resolved);
|
|
16
|
+
T.filter((e) => e.severity === "critical" || e.severity === "high");
|
|
17
|
+
let k = D.filter((e) => e.status === "active"), A = E.length > 0 ? Math.round(E.reduce((e, t) => e + t.score, 0) / E.length) : 0;
|
|
18
|
+
return /* @__PURE__ */ S("div", {
|
|
18
19
|
className: "space-y-6 p-6",
|
|
19
20
|
children: [
|
|
20
|
-
/* @__PURE__ */
|
|
21
|
+
/* @__PURE__ */ S("div", {
|
|
21
22
|
className: "flex items-center justify-between",
|
|
22
|
-
children: [/* @__PURE__ */
|
|
23
|
+
children: [/* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("h1", {
|
|
23
24
|
className: "text-2xl font-bold",
|
|
24
|
-
children: /* @__PURE__ */
|
|
25
|
-
}), /* @__PURE__ */
|
|
25
|
+
children: /* @__PURE__ */ x(p, { children: "Security Hub" })
|
|
26
|
+
}), /* @__PURE__ */ x("p", {
|
|
26
27
|
className: "text-sm text-text-secondary",
|
|
27
28
|
children: "Security monitoring, compliance, and policy management"
|
|
28
|
-
})] }), /* @__PURE__ */
|
|
29
|
+
})] }), /* @__PURE__ */ S(s, {
|
|
29
30
|
size: "sm",
|
|
30
|
-
children: [/* @__PURE__ */
|
|
31
|
+
children: [/* @__PURE__ */ x(i, { className: "mr-2 h-4 w-4" }), "Security Report"]
|
|
31
32
|
})]
|
|
32
33
|
}),
|
|
33
|
-
/* @__PURE__ */
|
|
34
|
+
/* @__PURE__ */ x(g, { children: "Your asset-security control room: watch security events as they happen, track how you score against compliance frameworks, and manage the policies that govern your estate. Use it to close out the highest-severity, unresolved events first and prove you are audit-ready." }),
|
|
35
|
+
/* @__PURE__ */ x(h, {
|
|
36
|
+
storageKey: "assethandler-security-hub",
|
|
37
|
+
steps: [
|
|
38
|
+
{
|
|
39
|
+
id: "events",
|
|
40
|
+
label: "Generate a security report",
|
|
41
|
+
description: "Summarise events, compliance and policy posture.",
|
|
42
|
+
onClick: () => w("/reports/report-builder")
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
id: "audit",
|
|
46
|
+
label: "Review the audit trail",
|
|
47
|
+
description: "See who changed what across your assets.",
|
|
48
|
+
onClick: () => w("/audit-trail")
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
id: "backup",
|
|
52
|
+
label: "Schedule a backup",
|
|
53
|
+
description: "Protect critical asset data on a recurring schedule.",
|
|
54
|
+
onClick: () => w("/security/schedule-backup")
|
|
55
|
+
}
|
|
56
|
+
]
|
|
57
|
+
}),
|
|
58
|
+
/* @__PURE__ */ S("div", {
|
|
34
59
|
className: "grid gap-4 md:grid-cols-4",
|
|
35
60
|
children: [
|
|
36
|
-
/* @__PURE__ */
|
|
37
|
-
className: "
|
|
38
|
-
children: [/* @__PURE__ */
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
})]
|
|
45
|
-
}) }),
|
|
46
|
-
/* @__PURE__ */ g(s, { children: /* @__PURE__ */ _(c, {
|
|
61
|
+
/* @__PURE__ */ S(f, { children: [/* @__PURE__ */ S("div", {
|
|
62
|
+
className: "flex items-center gap-2 text-sm text-text-secondary",
|
|
63
|
+
children: [/* @__PURE__ */ x(t, { className: "h-4 w-4" }), "Unresolved Events"]
|
|
64
|
+
}), /* @__PURE__ */ x("p", {
|
|
65
|
+
className: "text-2xl font-bold mt-1 tabular-nums text-status-error-text",
|
|
66
|
+
children: O.length
|
|
67
|
+
})] }),
|
|
68
|
+
/* @__PURE__ */ x(c, { children: /* @__PURE__ */ S(l, {
|
|
47
69
|
className: "pt-4",
|
|
48
|
-
children: [/* @__PURE__ */
|
|
70
|
+
children: [/* @__PURE__ */ S("div", {
|
|
49
71
|
className: "flex items-center gap-2 text-sm text-text-secondary",
|
|
50
|
-
children: [/* @__PURE__ */
|
|
51
|
-
}), /* @__PURE__ */
|
|
72
|
+
children: [/* @__PURE__ */ x(i, { className: "h-4 w-4" }), "Compliance Score"]
|
|
73
|
+
}), /* @__PURE__ */ S("p", {
|
|
52
74
|
className: "text-2xl font-bold mt-1",
|
|
53
|
-
children: [
|
|
75
|
+
children: [A, "%"]
|
|
54
76
|
})]
|
|
55
77
|
}) }),
|
|
56
|
-
/* @__PURE__ */
|
|
78
|
+
/* @__PURE__ */ x(c, { children: /* @__PURE__ */ S(l, {
|
|
57
79
|
className: "pt-4",
|
|
58
|
-
children: [/* @__PURE__ */
|
|
80
|
+
children: [/* @__PURE__ */ S("div", {
|
|
59
81
|
className: "flex items-center gap-2 text-sm text-text-secondary",
|
|
60
|
-
children: [/* @__PURE__ */
|
|
61
|
-
}), /* @__PURE__ */
|
|
82
|
+
children: [/* @__PURE__ */ x(r, { className: "h-4 w-4" }), "Active Policies"]
|
|
83
|
+
}), /* @__PURE__ */ x("p", {
|
|
62
84
|
className: "text-2xl font-bold mt-1",
|
|
63
|
-
children:
|
|
85
|
+
children: k.length
|
|
64
86
|
})]
|
|
65
87
|
}) }),
|
|
66
|
-
/* @__PURE__ */
|
|
88
|
+
/* @__PURE__ */ x(c, { children: /* @__PURE__ */ S(l, {
|
|
67
89
|
className: "pt-4",
|
|
68
|
-
children: [/* @__PURE__ */
|
|
90
|
+
children: [/* @__PURE__ */ S("div", {
|
|
69
91
|
className: "flex items-center gap-2 text-sm text-text-secondary",
|
|
70
|
-
children: [/* @__PURE__ */
|
|
71
|
-
}), /* @__PURE__ */
|
|
92
|
+
children: [/* @__PURE__ */ x(n, { className: "h-4 w-4" }), "Total Events"]
|
|
93
|
+
}), /* @__PURE__ */ x("p", {
|
|
72
94
|
className: "text-2xl font-bold mt-1",
|
|
73
|
-
children:
|
|
95
|
+
children: T.length
|
|
74
96
|
})]
|
|
75
97
|
}) })
|
|
76
98
|
]
|
|
77
99
|
}),
|
|
78
|
-
/* @__PURE__ */ _
|
|
100
|
+
/* @__PURE__ */ S(_, {
|
|
79
101
|
defaultValue: "events",
|
|
80
102
|
children: [
|
|
81
|
-
/* @__PURE__ */
|
|
82
|
-
/* @__PURE__ */
|
|
103
|
+
/* @__PURE__ */ S(y, { children: [
|
|
104
|
+
/* @__PURE__ */ x(b, {
|
|
83
105
|
value: "events",
|
|
84
106
|
children: "Security Events"
|
|
85
107
|
}),
|
|
86
|
-
/* @__PURE__ */
|
|
108
|
+
/* @__PURE__ */ x(b, {
|
|
87
109
|
value: "compliance",
|
|
88
110
|
children: "Compliance"
|
|
89
111
|
}),
|
|
90
|
-
/* @__PURE__ */
|
|
112
|
+
/* @__PURE__ */ x(b, {
|
|
91
113
|
value: "policies",
|
|
92
114
|
children: "Policies"
|
|
93
115
|
})
|
|
94
116
|
] }),
|
|
95
|
-
/* @__PURE__ */
|
|
117
|
+
/* @__PURE__ */ x(v, {
|
|
96
118
|
value: "events",
|
|
97
119
|
className: "mt-4",
|
|
98
|
-
children:
|
|
120
|
+
children: T.length === 0 ? /* @__PURE__ */ x(m, {
|
|
121
|
+
illustration: "empty-notifications",
|
|
122
|
+
title: "No security events",
|
|
123
|
+
description: "Security alerts detected across your assets will appear here for triage."
|
|
124
|
+
}) : /* @__PURE__ */ x(c, { children: /* @__PURE__ */ x(l, {
|
|
99
125
|
className: "p-0",
|
|
100
|
-
children: /* @__PURE__ */
|
|
126
|
+
children: /* @__PURE__ */ x("div", {
|
|
101
127
|
className: "overflow-x-auto",
|
|
102
|
-
children: /* @__PURE__ */
|
|
128
|
+
children: /* @__PURE__ */ S("table", {
|
|
103
129
|
className: "w-full text-sm",
|
|
104
|
-
children: [/* @__PURE__ */
|
|
130
|
+
children: [/* @__PURE__ */ x("thead", { children: /* @__PURE__ */ S("tr", {
|
|
105
131
|
className: "border-b bg-bg-sunken/50",
|
|
106
132
|
children: [
|
|
107
|
-
/* @__PURE__ */
|
|
133
|
+
/* @__PURE__ */ x("th", {
|
|
108
134
|
className: "text-left p-3 font-medium",
|
|
109
135
|
children: "ID"
|
|
110
136
|
}),
|
|
111
|
-
/* @__PURE__ */
|
|
137
|
+
/* @__PURE__ */ x("th", {
|
|
112
138
|
className: "text-left p-3 font-medium",
|
|
113
139
|
children: "Type"
|
|
114
140
|
}),
|
|
115
|
-
/* @__PURE__ */
|
|
141
|
+
/* @__PURE__ */ x("th", {
|
|
116
142
|
className: "text-left p-3 font-medium",
|
|
117
143
|
children: "Title"
|
|
118
144
|
}),
|
|
119
|
-
/* @__PURE__ */
|
|
145
|
+
/* @__PURE__ */ x("th", {
|
|
120
146
|
className: "text-left p-3 font-medium",
|
|
121
147
|
children: "Severity"
|
|
122
148
|
}),
|
|
123
|
-
/* @__PURE__ */
|
|
149
|
+
/* @__PURE__ */ x("th", {
|
|
124
150
|
className: "text-left p-3 font-medium",
|
|
125
151
|
children: "Source"
|
|
126
152
|
}),
|
|
127
|
-
/* @__PURE__ */
|
|
153
|
+
/* @__PURE__ */ x("th", {
|
|
128
154
|
className: "text-left p-3 font-medium",
|
|
129
155
|
children: "Time"
|
|
130
156
|
}),
|
|
131
|
-
/* @__PURE__ */
|
|
157
|
+
/* @__PURE__ */ x("th", {
|
|
132
158
|
className: "text-left p-3 font-medium",
|
|
133
159
|
children: "Status"
|
|
134
160
|
})
|
|
135
161
|
]
|
|
136
|
-
}) }), /* @__PURE__ */
|
|
162
|
+
}) }), /* @__PURE__ */ x("tbody", { children: T.map((e) => /* @__PURE__ */ S("tr", {
|
|
137
163
|
className: "border-b hover:bg-bg-sunken/50 cursor-pointer",
|
|
138
164
|
children: [
|
|
139
|
-
/* @__PURE__ */
|
|
165
|
+
/* @__PURE__ */ x("td", {
|
|
140
166
|
className: "p-3 font-mono text-xs",
|
|
141
167
|
children: e.id
|
|
142
168
|
}),
|
|
143
|
-
/* @__PURE__ */
|
|
169
|
+
/* @__PURE__ */ x("td", {
|
|
144
170
|
className: "p-3 capitalize text-xs",
|
|
145
171
|
children: e.type.replace("_", " ")
|
|
146
172
|
}),
|
|
147
|
-
/* @__PURE__ */
|
|
173
|
+
/* @__PURE__ */ S("td", {
|
|
148
174
|
className: "p-3",
|
|
149
|
-
children: [/* @__PURE__ */
|
|
175
|
+
children: [/* @__PURE__ */ x("p", {
|
|
150
176
|
className: "font-medium",
|
|
151
177
|
children: e.title
|
|
152
|
-
}), /* @__PURE__ */
|
|
178
|
+
}), /* @__PURE__ */ x("p", {
|
|
153
179
|
className: "text-xs text-text-secondary truncate max-w-xs",
|
|
154
180
|
children: e.description
|
|
155
181
|
})]
|
|
156
182
|
}),
|
|
157
|
-
/* @__PURE__ */
|
|
183
|
+
/* @__PURE__ */ x("td", {
|
|
158
184
|
className: "p-3",
|
|
159
|
-
children: /* @__PURE__ */
|
|
160
|
-
variant:
|
|
185
|
+
children: /* @__PURE__ */ x(o, {
|
|
186
|
+
variant: C[e.severity],
|
|
161
187
|
children: e.severity
|
|
162
188
|
})
|
|
163
189
|
}),
|
|
164
|
-
/* @__PURE__ */
|
|
190
|
+
/* @__PURE__ */ x("td", {
|
|
165
191
|
className: "p-3 text-xs",
|
|
166
192
|
children: e.source
|
|
167
193
|
}),
|
|
168
|
-
/* @__PURE__ */
|
|
194
|
+
/* @__PURE__ */ x("td", {
|
|
169
195
|
className: "p-3 text-xs",
|
|
170
196
|
children: new Date(e.timestamp).toLocaleString()
|
|
171
197
|
}),
|
|
172
|
-
/* @__PURE__ */
|
|
198
|
+
/* @__PURE__ */ x("td", {
|
|
173
199
|
className: "p-3",
|
|
174
|
-
children: e.resolved ? /* @__PURE__ */
|
|
200
|
+
children: e.resolved ? /* @__PURE__ */ x(o, {
|
|
175
201
|
variant: "default",
|
|
176
202
|
children: "Resolved"
|
|
177
|
-
}) : /* @__PURE__ */
|
|
203
|
+
}) : /* @__PURE__ */ x(o, {
|
|
178
204
|
variant: "destructive",
|
|
179
205
|
children: "Open"
|
|
180
206
|
})
|
|
@@ -185,74 +211,78 @@ function y() {
|
|
|
185
211
|
})
|
|
186
212
|
}) })
|
|
187
213
|
}),
|
|
188
|
-
/* @__PURE__ */
|
|
214
|
+
/* @__PURE__ */ x(v, {
|
|
189
215
|
value: "compliance",
|
|
190
216
|
className: "mt-4",
|
|
191
|
-
children: /* @__PURE__ */
|
|
217
|
+
children: E.length === 0 ? /* @__PURE__ */ x(m, {
|
|
218
|
+
illustration: "empty-generic",
|
|
219
|
+
title: "No compliance frameworks",
|
|
220
|
+
description: "Add frameworks (e.g. ISO 27001, SOC 2) to track your control coverage and score."
|
|
221
|
+
}) : /* @__PURE__ */ x("div", {
|
|
192
222
|
className: "grid gap-4 md:grid-cols-2",
|
|
193
|
-
children:
|
|
223
|
+
children: E.map((e) => /* @__PURE__ */ S(c, { children: [/* @__PURE__ */ x(u, {
|
|
194
224
|
className: "pb-2",
|
|
195
|
-
children: /* @__PURE__ */
|
|
225
|
+
children: /* @__PURE__ */ S("div", {
|
|
196
226
|
className: "flex items-center justify-between",
|
|
197
|
-
children: [/* @__PURE__ */
|
|
227
|
+
children: [/* @__PURE__ */ S(d, {
|
|
198
228
|
className: "text-base",
|
|
199
229
|
children: [
|
|
200
230
|
e.name,
|
|
201
231
|
" ",
|
|
202
232
|
e.version
|
|
203
233
|
]
|
|
204
|
-
}), /* @__PURE__ */
|
|
234
|
+
}), /* @__PURE__ */ x(o, {
|
|
205
235
|
variant: e.status === "compliant" ? "default" : e.status === "non_compliant" ? "destructive" : "secondary",
|
|
206
236
|
children: e.status.replace("_", " ")
|
|
207
237
|
})]
|
|
208
238
|
})
|
|
209
|
-
}), /* @__PURE__ */
|
|
239
|
+
}), /* @__PURE__ */ x(l, { children: /* @__PURE__ */ S("div", {
|
|
210
240
|
className: "space-y-3",
|
|
211
241
|
children: [
|
|
212
|
-
/* @__PURE__ */
|
|
242
|
+
/* @__PURE__ */ S("div", {
|
|
213
243
|
className: "text-center",
|
|
214
|
-
children: [/* @__PURE__ */
|
|
244
|
+
children: [/* @__PURE__ */ S("p", {
|
|
215
245
|
className: "text-3xl font-bold tabular-nums",
|
|
216
246
|
children: [e.score, "%"]
|
|
217
|
-
}), /* @__PURE__ */
|
|
247
|
+
}), /* @__PURE__ */ x("p", {
|
|
218
248
|
className: "text-xs text-text-secondary",
|
|
219
249
|
children: "Compliance Score"
|
|
220
250
|
})]
|
|
221
251
|
}),
|
|
222
|
-
/* @__PURE__ */
|
|
252
|
+
/* @__PURE__ */ x("div", {
|
|
223
253
|
className: "h-2 rounded-full bg-bg-sunken overflow-hidden",
|
|
224
|
-
children: /* @__PURE__ */
|
|
254
|
+
children: /* @__PURE__ */ x("div", {
|
|
225
255
|
className: `h-full rounded-full ${e.score >= 90 ? "bg-status-success-bg" : e.score >= 70 ? "bg-status-warning-bg" : "bg-status-error-bg"}`,
|
|
226
256
|
style: { width: `${e.score}%` }
|
|
227
257
|
})
|
|
228
258
|
}),
|
|
229
|
-
/* @__PURE__ */
|
|
259
|
+
/* @__PURE__ */ S("div", {
|
|
230
260
|
className: "grid grid-cols-3 gap-2 text-center text-xs",
|
|
231
261
|
children: [
|
|
232
|
-
/* @__PURE__ */
|
|
262
|
+
/* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("p", {
|
|
233
263
|
className: "font-bold text-status-success-text",
|
|
234
264
|
children: e.passedControls
|
|
235
|
-
}), /* @__PURE__ */
|
|
265
|
+
}), /* @__PURE__ */ x("p", {
|
|
236
266
|
className: "text-text-secondary",
|
|
237
267
|
children: "Passed"
|
|
238
268
|
})] }),
|
|
239
|
-
/* @__PURE__ */
|
|
269
|
+
/* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("p", {
|
|
240
270
|
className: "font-bold text-status-error-text",
|
|
241
271
|
children: e.failedControls
|
|
242
|
-
}), /* @__PURE__ */
|
|
272
|
+
}), /* @__PURE__ */ x("p", {
|
|
243
273
|
className: "text-text-secondary",
|
|
244
274
|
children: "Failed"
|
|
245
275
|
})] }),
|
|
246
|
-
/* @__PURE__ */
|
|
276
|
+
/* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("p", {
|
|
247
277
|
className: "font-bold",
|
|
248
278
|
children: e.totalControls
|
|
249
|
-
}), /* @__PURE__ */
|
|
279
|
+
}), /* @__PURE__ */ x("p", {
|
|
250
280
|
className: "text-text-secondary",
|
|
251
281
|
children: "Total"
|
|
252
282
|
})] })
|
|
253
283
|
]
|
|
254
284
|
}),
|
|
255
|
-
/* @__PURE__ */
|
|
285
|
+
/* @__PURE__ */ S("div", {
|
|
256
286
|
className: "text-xs text-text-secondary",
|
|
257
287
|
children: [
|
|
258
288
|
"Last: ",
|
|
@@ -265,76 +295,80 @@ function y() {
|
|
|
265
295
|
}) })] }, e.id))
|
|
266
296
|
})
|
|
267
297
|
}),
|
|
268
|
-
/* @__PURE__ */
|
|
298
|
+
/* @__PURE__ */ x(v, {
|
|
269
299
|
value: "policies",
|
|
270
300
|
className: "mt-4",
|
|
271
|
-
children:
|
|
301
|
+
children: D.length === 0 ? /* @__PURE__ */ x(m, {
|
|
302
|
+
illustration: "empty-files",
|
|
303
|
+
title: "No security policies",
|
|
304
|
+
description: "Define the policies that govern how your assets are secured and managed."
|
|
305
|
+
}) : /* @__PURE__ */ x(c, { children: /* @__PURE__ */ x(l, {
|
|
272
306
|
className: "p-0",
|
|
273
|
-
children: /* @__PURE__ */
|
|
307
|
+
children: /* @__PURE__ */ x("div", {
|
|
274
308
|
className: "overflow-x-auto",
|
|
275
|
-
children: /* @__PURE__ */
|
|
309
|
+
children: /* @__PURE__ */ S("table", {
|
|
276
310
|
className: "w-full text-sm",
|
|
277
|
-
children: [/* @__PURE__ */
|
|
311
|
+
children: [/* @__PURE__ */ x("thead", { children: /* @__PURE__ */ S("tr", {
|
|
278
312
|
className: "border-b bg-bg-sunken/50",
|
|
279
313
|
children: [
|
|
280
|
-
/* @__PURE__ */
|
|
314
|
+
/* @__PURE__ */ x("th", {
|
|
281
315
|
className: "text-left p-3 font-medium",
|
|
282
316
|
children: "Name"
|
|
283
317
|
}),
|
|
284
|
-
/* @__PURE__ */
|
|
318
|
+
/* @__PURE__ */ x("th", {
|
|
285
319
|
className: "text-left p-3 font-medium",
|
|
286
320
|
children: "Category"
|
|
287
321
|
}),
|
|
288
|
-
/* @__PURE__ */
|
|
322
|
+
/* @__PURE__ */ x("th", {
|
|
289
323
|
className: "text-left p-3 font-medium",
|
|
290
324
|
children: "Version"
|
|
291
325
|
}),
|
|
292
|
-
/* @__PURE__ */
|
|
326
|
+
/* @__PURE__ */ x("th", {
|
|
293
327
|
className: "text-left p-3 font-medium",
|
|
294
328
|
children: "Status"
|
|
295
329
|
}),
|
|
296
|
-
/* @__PURE__ */
|
|
330
|
+
/* @__PURE__ */ x("th", {
|
|
297
331
|
className: "text-left p-3 font-medium",
|
|
298
332
|
children: "Owner"
|
|
299
333
|
}),
|
|
300
|
-
/* @__PURE__ */
|
|
334
|
+
/* @__PURE__ */ x("th", {
|
|
301
335
|
className: "text-left p-3 font-medium",
|
|
302
336
|
children: "Review Date"
|
|
303
337
|
})
|
|
304
338
|
]
|
|
305
|
-
}) }), /* @__PURE__ */
|
|
339
|
+
}) }), /* @__PURE__ */ x("tbody", { children: D.map((e) => /* @__PURE__ */ S("tr", {
|
|
306
340
|
className: "border-b hover:bg-bg-sunken/50 cursor-pointer",
|
|
307
341
|
children: [
|
|
308
|
-
/* @__PURE__ */
|
|
342
|
+
/* @__PURE__ */ S("td", {
|
|
309
343
|
className: "p-3",
|
|
310
|
-
children: [/* @__PURE__ */
|
|
344
|
+
children: [/* @__PURE__ */ x("p", {
|
|
311
345
|
className: "font-medium",
|
|
312
346
|
children: e.name
|
|
313
|
-
}), /* @__PURE__ */
|
|
347
|
+
}), /* @__PURE__ */ x("p", {
|
|
314
348
|
className: "text-xs text-text-secondary truncate max-w-xs",
|
|
315
349
|
children: e.description
|
|
316
350
|
})]
|
|
317
351
|
}),
|
|
318
|
-
/* @__PURE__ */
|
|
352
|
+
/* @__PURE__ */ x("td", {
|
|
319
353
|
className: "p-3 text-xs",
|
|
320
354
|
children: e.category
|
|
321
355
|
}),
|
|
322
|
-
/* @__PURE__ */
|
|
356
|
+
/* @__PURE__ */ S("td", {
|
|
323
357
|
className: "p-3 text-xs",
|
|
324
358
|
children: ["v", e.version]
|
|
325
359
|
}),
|
|
326
|
-
/* @__PURE__ */
|
|
360
|
+
/* @__PURE__ */ x("td", {
|
|
327
361
|
className: "p-3",
|
|
328
|
-
children: /* @__PURE__ */
|
|
362
|
+
children: /* @__PURE__ */ x(o, {
|
|
329
363
|
variant: e.status === "active" ? "default" : e.status === "deprecated" ? "destructive" : "outline",
|
|
330
364
|
children: e.status.replace("_", " ")
|
|
331
365
|
})
|
|
332
366
|
}),
|
|
333
|
-
/* @__PURE__ */
|
|
367
|
+
/* @__PURE__ */ x("td", {
|
|
334
368
|
className: "p-3 text-xs",
|
|
335
369
|
children: e.owner
|
|
336
370
|
}),
|
|
337
|
-
/* @__PURE__ */
|
|
371
|
+
/* @__PURE__ */ x("td", {
|
|
338
372
|
className: "p-3 text-xs",
|
|
339
373
|
children: e.reviewDate
|
|
340
374
|
})
|
|
@@ -350,6 +384,6 @@ function y() {
|
|
|
350
384
|
});
|
|
351
385
|
}
|
|
352
386
|
//#endregion
|
|
353
|
-
export {
|
|
387
|
+
export { w as SecuritySecurityHubPage };
|
|
354
388
|
|
|
355
389
|
//# sourceMappingURL=SecuritySecurityHubPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SecuritySecurityHubPage.js","names":[],"sources":["../../../src/assethandler/pages/SecuritySecurityHubPage.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n GradientText,\n} from '@burdenoff/fe-libs/ui';\nimport { Shield, AlertTriangle, CheckCircle, FileText, Lock, Eye } from 'lucide-react';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\n\nconst severityColors: Record<string, 'destructive' | 'default' | 'secondary' | 'outline'> = {\n critical: 'destructive',\n high: 'destructive',\n medium: 'default',\n low: 'secondary',\n info: 'outline',\n};\n\nexport function SecuritySecurityHubPage() {\n const { securityEvents, complianceFrameworks, securityPolicies } = useAssetHandlerStore();\n\n const unresolvedEvents = securityEvents.filter((e) => !e.resolved);\n const criticalEvents = securityEvents.filter(\n (e) => e.severity === 'critical' || e.severity === 'high'\n );\n const activePolicies = securityPolicies.filter((p) => p.status === 'active');\n const avgCompliance =\n complianceFrameworks.length > 0\n ? Math.round(\n complianceFrameworks.reduce((s, f) => s + f.score, 0) / complianceFrameworks.length\n )\n : 0;\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-bold\">\n <GradientText>Security Hub</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n Security monitoring, compliance, and policy management\n </p>\n </div>\n <Button size=\"sm\">\n <Shield className=\"mr-2 h-4 w-4\" />\n Security Report\n </Button>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <AlertTriangle className=\"h-4 w-4\" />\n Unresolved Events\n </div>\n <p className=\"text-2xl font-bold mt-1 text-status-error-text\">\n {unresolvedEvents.length}\n </p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <Shield className=\"h-4 w-4\" />\n Compliance Score\n </div>\n <p className=\"text-2xl font-bold mt-1\">{avgCompliance}%</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <FileText className=\"h-4 w-4\" />\n Active Policies\n </div>\n <p className=\"text-2xl font-bold mt-1\">{activePolicies.length}</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <Eye className=\"h-4 w-4\" />\n Total Events\n </div>\n <p className=\"text-2xl font-bold mt-1\">{securityEvents.length}</p>\n </CardContent>\n </Card>\n </div>\n\n <Tabs defaultValue=\"events\">\n <TabsList>\n <TabsTrigger value=\"events\">Security Events</TabsTrigger>\n <TabsTrigger value=\"compliance\">Compliance</TabsTrigger>\n <TabsTrigger value=\"policies\">Policies</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"events\" className=\"mt-4\">\n <Card>\n <CardContent className=\"p-0\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b bg-bg-sunken/50\">\n <th className=\"text-left p-3 font-medium\">ID</th>\n <th className=\"text-left p-3 font-medium\">Type</th>\n <th className=\"text-left p-3 font-medium\">Title</th>\n <th className=\"text-left p-3 font-medium\">Severity</th>\n <th className=\"text-left p-3 font-medium\">Source</th>\n <th className=\"text-left p-3 font-medium\">Time</th>\n <th className=\"text-left p-3 font-medium\">Status</th>\n </tr>\n </thead>\n <tbody>\n {securityEvents.map((evt) => (\n <tr key={evt.id} className=\"border-b hover:bg-bg-sunken/50 cursor-pointer\">\n <td className=\"p-3 font-mono text-xs\">{evt.id}</td>\n <td className=\"p-3 capitalize text-xs\">{evt.type.replace('_', ' ')}</td>\n <td className=\"p-3\">\n <p className=\"font-medium\">{evt.title}</p>\n <p className=\"text-xs text-text-secondary truncate max-w-xs\">\n {evt.description}\n </p>\n </td>\n <td className=\"p-3\">\n <Badge variant={severityColors[evt.severity]}>{evt.severity}</Badge>\n </td>\n <td className=\"p-3 text-xs\">{evt.source}</td>\n <td className=\"p-3 text-xs\">{new Date(evt.timestamp).toLocaleString()}</td>\n <td className=\"p-3\">\n {evt.resolved ? (\n <Badge variant=\"default\">Resolved</Badge>\n ) : (\n <Badge variant=\"destructive\">Open</Badge>\n )}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </CardContent>\n </Card>\n </TabsContent>\n\n <TabsContent value=\"compliance\" className=\"mt-4\">\n <div className=\"grid gap-4 md:grid-cols-2\">\n {complianceFrameworks.map((fw) => (\n <Card key={fw.id}>\n <CardHeader className=\"pb-2\">\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-base\">\n {fw.name} {fw.version}\n </CardTitle>\n <Badge\n variant={\n fw.status === 'compliant'\n ? 'default'\n : fw.status === 'non_compliant'\n ? 'destructive'\n : 'secondary'\n }\n >\n {fw.status.replace('_', ' ')}\n </Badge>\n </div>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-3\">\n <div className=\"text-center\">\n <p className=\"text-3xl font-bold tabular-nums\">{fw.score}%</p>\n <p className=\"text-xs text-text-secondary\">Compliance Score</p>\n </div>\n <div className=\"h-2 rounded-full bg-bg-sunken overflow-hidden\">\n <div\n className={`h-full rounded-full ${fw.score >= 90 ? 'bg-status-success-bg' : fw.score >= 70 ? 'bg-status-warning-bg' : 'bg-status-error-bg'}`}\n style={{ width: `${fw.score}%` }}\n />\n </div>\n <div className=\"grid grid-cols-3 gap-2 text-center text-xs\">\n <div>\n <p className=\"font-bold text-status-success-text\">{fw.passedControls}</p>\n <p className=\"text-text-secondary\">Passed</p>\n </div>\n <div>\n <p className=\"font-bold text-status-error-text\">{fw.failedControls}</p>\n <p className=\"text-text-secondary\">Failed</p>\n </div>\n <div>\n <p className=\"font-bold\">{fw.totalControls}</p>\n <p className=\"text-text-secondary\">Total</p>\n </div>\n </div>\n <div className=\"text-xs text-text-secondary\">\n Last: {fw.lastAssessment} · Next: {fw.nextAssessment}\n </div>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n </TabsContent>\n\n <TabsContent value=\"policies\" className=\"mt-4\">\n <Card>\n <CardContent className=\"p-0\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b bg-bg-sunken/50\">\n <th className=\"text-left p-3 font-medium\">Name</th>\n <th className=\"text-left p-3 font-medium\">Category</th>\n <th className=\"text-left p-3 font-medium\">Version</th>\n <th className=\"text-left p-3 font-medium\">Status</th>\n <th className=\"text-left p-3 font-medium\">Owner</th>\n <th className=\"text-left p-3 font-medium\">Review Date</th>\n </tr>\n </thead>\n <tbody>\n {securityPolicies.map((pol) => (\n <tr key={pol.id} className=\"border-b hover:bg-bg-sunken/50 cursor-pointer\">\n <td className=\"p-3\">\n <p className=\"font-medium\">{pol.name}</p>\n <p className=\"text-xs text-text-secondary truncate max-w-xs\">\n {pol.description}\n </p>\n </td>\n <td className=\"p-3 text-xs\">{pol.category}</td>\n <td className=\"p-3 text-xs\">v{pol.version}</td>\n <td className=\"p-3\">\n <Badge\n variant={\n pol.status === 'active'\n ? 'default'\n : pol.status === 'deprecated'\n ? 'destructive'\n : 'outline'\n }\n >\n {pol.status.replace('_', ' ')}\n </Badge>\n </td>\n <td className=\"p-3 text-xs\">{pol.owner}</td>\n <td className=\"p-3 text-xs\">{pol.reviewDate}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </CardContent>\n </Card>\n </TabsContent>\n </Tabs>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SecuritySecurityHubPage.js","names":[],"sources":["../../../src/assethandler/pages/SecuritySecurityHubPage.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n GradientText,\n EmphasisPanel,\n PagePurpose,\n NextSteps,\n IllustratedEmptyState,\n} from '@burdenoff/fe-libs/ui';\nimport { Shield, AlertTriangle, FileText, Eye } from 'lucide-react';\nimport { useNavigate } from 'react-router-dom';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\n\nconst severityColors: Record<string, 'destructive' | 'default' | 'secondary' | 'outline'> = {\n critical: 'destructive',\n high: 'destructive',\n medium: 'default',\n low: 'secondary',\n info: 'outline',\n};\n\nexport function SecuritySecurityHubPage() {\n const navigate = useNavigate();\n const { securityEvents, complianceFrameworks, securityPolicies } = useAssetHandlerStore();\n\n const unresolvedEvents = securityEvents.filter((e) => !e.resolved);\n const criticalEvents = securityEvents.filter(\n (e) => e.severity === 'critical' || e.severity === 'high'\n );\n const activePolicies = securityPolicies.filter((p) => p.status === 'active');\n const avgCompliance =\n complianceFrameworks.length > 0\n ? Math.round(\n complianceFrameworks.reduce((s, f) => s + f.score, 0) / complianceFrameworks.length\n )\n : 0;\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-bold\">\n <GradientText>Security Hub</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n Security monitoring, compliance, and policy management\n </p>\n </div>\n <Button size=\"sm\">\n <Shield className=\"mr-2 h-4 w-4\" />\n Security Report\n </Button>\n </div>\n\n <PagePurpose>\n Your asset-security control room: watch security events as they happen, track how you score\n against compliance frameworks, and manage the policies that govern your estate. Use it to\n close out the highest-severity, unresolved events first and prove you are audit-ready.\n </PagePurpose>\n\n <NextSteps\n storageKey=\"assethandler-security-hub\"\n steps={[\n {\n id: 'events',\n label: 'Generate a security report',\n description: 'Summarise events, compliance and policy posture.',\n onClick: () => navigate('/reports/report-builder'),\n },\n {\n id: 'audit',\n label: 'Review the audit trail',\n description: 'See who changed what across your assets.',\n onClick: () => navigate('/audit-trail'),\n },\n {\n id: 'backup',\n label: 'Schedule a backup',\n description: 'Protect critical asset data on a recurring schedule.',\n onClick: () => navigate('/security/schedule-backup'),\n },\n ]}\n />\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n <EmphasisPanel>\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <AlertTriangle className=\"h-4 w-4\" />\n Unresolved Events\n </div>\n <p className=\"text-2xl font-bold mt-1 tabular-nums text-status-error-text\">\n {unresolvedEvents.length}\n </p>\n </EmphasisPanel>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <Shield className=\"h-4 w-4\" />\n Compliance Score\n </div>\n <p className=\"text-2xl font-bold mt-1\">{avgCompliance}%</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <FileText className=\"h-4 w-4\" />\n Active Policies\n </div>\n <p className=\"text-2xl font-bold mt-1\">{activePolicies.length}</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <Eye className=\"h-4 w-4\" />\n Total Events\n </div>\n <p className=\"text-2xl font-bold mt-1\">{securityEvents.length}</p>\n </CardContent>\n </Card>\n </div>\n\n <Tabs defaultValue=\"events\">\n <TabsList>\n <TabsTrigger value=\"events\">Security Events</TabsTrigger>\n <TabsTrigger value=\"compliance\">Compliance</TabsTrigger>\n <TabsTrigger value=\"policies\">Policies</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"events\" className=\"mt-4\">\n {securityEvents.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-notifications\"\n title=\"No security events\"\n description=\"Security alerts detected across your assets will appear here for triage.\"\n />\n ) : (\n <Card>\n <CardContent className=\"p-0\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b bg-bg-sunken/50\">\n <th className=\"text-left p-3 font-medium\">ID</th>\n <th className=\"text-left p-3 font-medium\">Type</th>\n <th className=\"text-left p-3 font-medium\">Title</th>\n <th className=\"text-left p-3 font-medium\">Severity</th>\n <th className=\"text-left p-3 font-medium\">Source</th>\n <th className=\"text-left p-3 font-medium\">Time</th>\n <th className=\"text-left p-3 font-medium\">Status</th>\n </tr>\n </thead>\n <tbody>\n {securityEvents.map((evt) => (\n <tr key={evt.id} className=\"border-b hover:bg-bg-sunken/50 cursor-pointer\">\n <td className=\"p-3 font-mono text-xs\">{evt.id}</td>\n <td className=\"p-3 capitalize text-xs\">{evt.type.replace('_', ' ')}</td>\n <td className=\"p-3\">\n <p className=\"font-medium\">{evt.title}</p>\n <p className=\"text-xs text-text-secondary truncate max-w-xs\">\n {evt.description}\n </p>\n </td>\n <td className=\"p-3\">\n <Badge variant={severityColors[evt.severity]}>{evt.severity}</Badge>\n </td>\n <td className=\"p-3 text-xs\">{evt.source}</td>\n <td className=\"p-3 text-xs\">{new Date(evt.timestamp).toLocaleString()}</td>\n <td className=\"p-3\">\n {evt.resolved ? (\n <Badge variant=\"default\">Resolved</Badge>\n ) : (\n <Badge variant=\"destructive\">Open</Badge>\n )}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </CardContent>\n </Card>\n )}\n </TabsContent>\n\n <TabsContent value=\"compliance\" className=\"mt-4\">\n {complianceFrameworks.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-generic\"\n title=\"No compliance frameworks\"\n description=\"Add frameworks (e.g. ISO 27001, SOC 2) to track your control coverage and score.\"\n />\n ) : (\n <div className=\"grid gap-4 md:grid-cols-2\">\n {complianceFrameworks.map((fw) => (\n <Card key={fw.id}>\n <CardHeader className=\"pb-2\">\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-base\">\n {fw.name} {fw.version}\n </CardTitle>\n <Badge\n variant={\n fw.status === 'compliant'\n ? 'default'\n : fw.status === 'non_compliant'\n ? 'destructive'\n : 'secondary'\n }\n >\n {fw.status.replace('_', ' ')}\n </Badge>\n </div>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-3\">\n <div className=\"text-center\">\n <p className=\"text-3xl font-bold tabular-nums\">{fw.score}%</p>\n <p className=\"text-xs text-text-secondary\">Compliance Score</p>\n </div>\n <div className=\"h-2 rounded-full bg-bg-sunken overflow-hidden\">\n <div\n className={`h-full rounded-full ${fw.score >= 90 ? 'bg-status-success-bg' : fw.score >= 70 ? 'bg-status-warning-bg' : 'bg-status-error-bg'}`}\n style={{ width: `${fw.score}%` }}\n />\n </div>\n <div className=\"grid grid-cols-3 gap-2 text-center text-xs\">\n <div>\n <p className=\"font-bold text-status-success-text\">{fw.passedControls}</p>\n <p className=\"text-text-secondary\">Passed</p>\n </div>\n <div>\n <p className=\"font-bold text-status-error-text\">{fw.failedControls}</p>\n <p className=\"text-text-secondary\">Failed</p>\n </div>\n <div>\n <p className=\"font-bold\">{fw.totalControls}</p>\n <p className=\"text-text-secondary\">Total</p>\n </div>\n </div>\n <div className=\"text-xs text-text-secondary\">\n Last: {fw.lastAssessment} · Next: {fw.nextAssessment}\n </div>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n )}\n </TabsContent>\n\n <TabsContent value=\"policies\" className=\"mt-4\">\n {securityPolicies.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-files\"\n title=\"No security policies\"\n description=\"Define the policies that govern how your assets are secured and managed.\"\n />\n ) : (\n <Card>\n <CardContent className=\"p-0\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b bg-bg-sunken/50\">\n <th className=\"text-left p-3 font-medium\">Name</th>\n <th className=\"text-left p-3 font-medium\">Category</th>\n <th className=\"text-left p-3 font-medium\">Version</th>\n <th className=\"text-left p-3 font-medium\">Status</th>\n <th className=\"text-left p-3 font-medium\">Owner</th>\n <th className=\"text-left p-3 font-medium\">Review Date</th>\n </tr>\n </thead>\n <tbody>\n {securityPolicies.map((pol) => (\n <tr key={pol.id} className=\"border-b hover:bg-bg-sunken/50 cursor-pointer\">\n <td className=\"p-3\">\n <p className=\"font-medium\">{pol.name}</p>\n <p className=\"text-xs text-text-secondary truncate max-w-xs\">\n {pol.description}\n </p>\n </td>\n <td className=\"p-3 text-xs\">{pol.category}</td>\n <td className=\"p-3 text-xs\">v{pol.version}</td>\n <td className=\"p-3\">\n <Badge\n variant={\n pol.status === 'active'\n ? 'default'\n : pol.status === 'deprecated'\n ? 'destructive'\n : 'outline'\n }\n >\n {pol.status.replace('_', ' ')}\n </Badge>\n </td>\n <td className=\"p-3 text-xs\">{pol.owner}</td>\n <td className=\"p-3 text-xs\">{pol.reviewDate}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </CardContent>\n </Card>\n )}\n </TabsContent>\n </Tabs>\n </div>\n );\n}\n"],"mappings":"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"}
|