@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.
Files changed (113) hide show
  1. package/dist/assethandler/pages/AiPredictionsPage.js +42 -41
  2. package/dist/assethandler/pages/AiPredictionsPage.js.map +1 -1
  3. package/dist/assethandler/pages/AnalyticsPage.js +538 -534
  4. package/dist/assethandler/pages/AnalyticsPage.js.map +1 -1
  5. package/dist/assethandler/pages/AssetsAssetCategoriesPage.js +135 -125
  6. package/dist/assethandler/pages/AssetsAssetCategoriesPage.js.map +1 -1
  7. package/dist/assethandler/pages/AssetsAssetCheckInOutPage.js +90 -92
  8. package/dist/assethandler/pages/AssetsAssetCheckInOutPage.js.map +1 -1
  9. package/dist/assethandler/pages/AssetsAssetCreatePage.js +131 -124
  10. package/dist/assethandler/pages/AssetsAssetCreatePage.js.map +1 -1
  11. package/dist/assethandler/pages/AssetsAssetDetailPage.js +214 -185
  12. package/dist/assethandler/pages/AssetsAssetDetailPage.js.map +1 -1
  13. package/dist/assethandler/pages/AssetsAssetEditPage.js +168 -156
  14. package/dist/assethandler/pages/AssetsAssetEditPage.js.map +1 -1
  15. package/dist/assethandler/pages/AssetsAssetListPage.js +207 -187
  16. package/dist/assethandler/pages/AssetsAssetListPage.js.map +1 -1
  17. package/dist/assethandler/pages/AssetsAssetTrackingPage.js +82 -71
  18. package/dist/assethandler/pages/AssetsAssetTrackingPage.js.map +1 -1
  19. package/dist/assethandler/pages/AuditTrailPage.js +93 -91
  20. package/dist/assethandler/pages/AuditTrailPage.js.map +1 -1
  21. package/dist/assethandler/pages/CmdbBrowserPage.js +32 -33
  22. package/dist/assethandler/pages/CmdbBrowserPage.js.map +1 -1
  23. package/dist/assethandler/pages/DashboardPage.js +157 -126
  24. package/dist/assethandler/pages/DashboardPage.js.map +1 -1
  25. package/dist/assethandler/pages/DigitalTwinPage.js +25 -26
  26. package/dist/assethandler/pages/DigitalTwinPage.js.map +1 -1
  27. package/dist/assethandler/pages/DiscoveryJobsPage.js +50 -50
  28. package/dist/assethandler/pages/DiscoveryJobsPage.js.map +1 -1
  29. package/dist/assethandler/pages/EsgDashboardPage.js +43 -42
  30. package/dist/assethandler/pages/EsgDashboardPage.js.map +1 -1
  31. package/dist/assethandler/pages/FinanceBudgetDetailPage.js +96 -82
  32. package/dist/assethandler/pages/FinanceBudgetDetailPage.js.map +1 -1
  33. package/dist/assethandler/pages/FinanceFinanceHubPage.js +137 -103
  34. package/dist/assethandler/pages/FinanceFinanceHubPage.js.map +1 -1
  35. package/dist/assethandler/pages/FinanceInvoiceDetailPage.js +77 -66
  36. package/dist/assethandler/pages/FinanceInvoiceDetailPage.js.map +1 -1
  37. package/dist/assethandler/pages/IotDevicesPage.js +34 -35
  38. package/dist/assethandler/pages/IotDevicesPage.js.map +1 -1
  39. package/dist/assethandler/pages/ItilChangeDetailPage.js +236 -199
  40. package/dist/assethandler/pages/ItilChangeDetailPage.js.map +1 -1
  41. package/dist/assethandler/pages/ItilChangeManagementPage.js +66 -64
  42. package/dist/assethandler/pages/ItilChangeManagementPage.js.map +1 -1
  43. package/dist/assethandler/pages/ItilIncidentDetailPage.js +237 -200
  44. package/dist/assethandler/pages/ItilIncidentDetailPage.js.map +1 -1
  45. package/dist/assethandler/pages/ItilIncidentManagementPage.js +99 -97
  46. package/dist/assethandler/pages/ItilIncidentManagementPage.js.map +1 -1
  47. package/dist/assethandler/pages/ItilItilhubPage.js +166 -122
  48. package/dist/assethandler/pages/ItilItilhubPage.js.map +1 -1
  49. package/dist/assethandler/pages/ItilProblemDetailPage.js +193 -156
  50. package/dist/assethandler/pages/ItilProblemDetailPage.js.map +1 -1
  51. package/dist/assethandler/pages/ItilProblemManagementPage.js +63 -61
  52. package/dist/assethandler/pages/ItilProblemManagementPage.js.map +1 -1
  53. package/dist/assethandler/pages/KnowledgeBasePage.js +45 -43
  54. package/dist/assethandler/pages/KnowledgeBasePage.js.map +1 -1
  55. package/dist/assethandler/pages/MaintenanceMaintenanceCalendarPage.js +70 -68
  56. package/dist/assethandler/pages/MaintenanceMaintenanceCalendarPage.js.map +1 -1
  57. package/dist/assethandler/pages/MaintenanceMaintenanceSchedulerPage.js +77 -62
  58. package/dist/assethandler/pages/MaintenanceMaintenanceSchedulerPage.js.map +1 -1
  59. package/dist/assethandler/pages/MarketplaceMarketplaceDetailPage.js +162 -151
  60. package/dist/assethandler/pages/MarketplaceMarketplaceDetailPage.js.map +1 -1
  61. package/dist/assethandler/pages/MarketplaceMarketplaceListPage.js +64 -57
  62. package/dist/assethandler/pages/MarketplaceMarketplaceListPage.js.map +1 -1
  63. package/dist/assethandler/pages/MarketplaceMarketplaceOrdersPage.js +125 -108
  64. package/dist/assethandler/pages/MarketplaceMarketplaceOrdersPage.js.map +1 -1
  65. package/dist/assethandler/pages/MarketplaceMarketplaceSellPage.js +67 -61
  66. package/dist/assethandler/pages/MarketplaceMarketplaceSellPage.js.map +1 -1
  67. package/dist/assethandler/pages/OperationsMaintenanceDetailPage.js +203 -166
  68. package/dist/assethandler/pages/OperationsMaintenanceDetailPage.js.map +1 -1
  69. package/dist/assethandler/pages/OperationsOperationsHubPage.js +125 -95
  70. package/dist/assethandler/pages/OperationsOperationsHubPage.js.map +1 -1
  71. package/dist/assethandler/pages/OperationsWorkOrderDetailPage.js +165 -151
  72. package/dist/assethandler/pages/OperationsWorkOrderDetailPage.js.map +1 -1
  73. package/dist/assethandler/pages/PortfolioPortfolioOverviewPage.js +83 -81
  74. package/dist/assethandler/pages/PortfolioPortfolioOverviewPage.js.map +1 -1
  75. package/dist/assethandler/pages/ProvenancePage.js +56 -53
  76. package/dist/assethandler/pages/ProvenancePage.js.map +1 -1
  77. package/dist/assethandler/pages/ReportsReportBuilderPage.js +80 -73
  78. package/dist/assethandler/pages/ReportsReportBuilderPage.js.map +1 -1
  79. package/dist/assethandler/pages/ReportsReportsDashboardPage.js +112 -77
  80. package/dist/assethandler/pages/ReportsReportsDashboardPage.js.map +1 -1
  81. package/dist/assethandler/pages/ReportsReportsListPage.js +119 -103
  82. package/dist/assethandler/pages/ReportsReportsListPage.js.map +1 -1
  83. package/dist/assethandler/pages/SamLicensesPage.js +32 -33
  84. package/dist/assethandler/pages/SamLicensesPage.js.map +1 -1
  85. package/dist/assethandler/pages/SecurityComplianceDetailPage.js +60 -52
  86. package/dist/assethandler/pages/SecurityComplianceDetailPage.js.map +1 -1
  87. package/dist/assethandler/pages/SecurityPolicyDetailPage.js +134 -117
  88. package/dist/assethandler/pages/SecurityPolicyDetailPage.js.map +1 -1
  89. package/dist/assethandler/pages/SecurityScheduleBackupPage.js +63 -57
  90. package/dist/assethandler/pages/SecurityScheduleBackupPage.js.map +1 -1
  91. package/dist/assethandler/pages/SecuritySecurityEventDetailPage.js +131 -117
  92. package/dist/assethandler/pages/SecuritySecurityEventDetailPage.js.map +1 -1
  93. package/dist/assethandler/pages/SecuritySecurityHubPage.js +147 -113
  94. package/dist/assethandler/pages/SecuritySecurityHubPage.js.map +1 -1
  95. package/dist/assethandler/pages/TransactionsTransactionDetailPage.js +235 -218
  96. package/dist/assethandler/pages/TransactionsTransactionDetailPage.js.map +1 -1
  97. package/dist/assethandler/pages/TransactionsTransactionListPage.js +118 -116
  98. package/dist/assethandler/pages/TransactionsTransactionListPage.js.map +1 -1
  99. package/dist/assethandler/pages/UsersPage.js +108 -99
  100. package/dist/assethandler/pages/UsersPage.js.map +1 -1
  101. package/dist/assethandler/pages/UsersUserCreatePage.js +74 -67
  102. package/dist/assethandler/pages/UsersUserCreatePage.js.map +1 -1
  103. package/dist/assethandler/pages/UsersUserManagementHubPage.js +128 -93
  104. package/dist/assethandler/pages/UsersUserManagementHubPage.js.map +1 -1
  105. package/dist/assethandler/pages/WorkflowsWorkflowBuilderPage.js +211 -193
  106. package/dist/assethandler/pages/WorkflowsWorkflowBuilderPage.js.map +1 -1
  107. package/dist/assethandler/pages/WorkflowsWorkflowExecutionsPage.js +88 -86
  108. package/dist/assethandler/pages/WorkflowsWorkflowExecutionsPage.js.map +1 -1
  109. package/dist/assethandler/pages/WorkflowsWorkflowListPage.js +68 -60
  110. package/dist/assethandler/pages/WorkflowsWorkflowListPage.js.map +1 -1
  111. package/dist/assethandler/pages/WorkflowsWorkflowTemplatesPage.js +71 -68
  112. package/dist/assethandler/pages/WorkflowsWorkflowTemplatesPage.js.map +1 -1
  113. package/package.json +2 -2
@@ -1,128 +1,144 @@
1
1
  import { useAssetHandlerStore as e } from "../store/assethandlerStore.js";
2
2
  import { Play as t, Plus as n, Search as r } from "lucide-react";
3
- import { Badge as i, Button as a, Card as o, CardContent as s, GradientText as c, Input as l } from "@burdenoff/fe-libs/ui";
4
- import { jsx as u, jsxs as d } from "react/jsx-runtime";
3
+ import { useNavigate as i } from "react-router-dom";
4
+ import { Badge as a, Button as o, CardContent as s, GlassCard as c, GradientText as l, IllustratedEmptyState as u, Input as d, PagePurpose as f } from "@burdenoff/fe-libs/ui";
5
+ import { jsx as p, jsxs as m } from "react/jsx-runtime";
5
6
  //#region src/assethandler/pages/ReportsReportsListPage.tsx
6
- function f() {
7
- let { reports: f } = e();
8
- return /* @__PURE__ */ d("div", {
7
+ function h() {
8
+ let h = i(), { reports: g } = e();
9
+ return /* @__PURE__ */ m("div", {
9
10
  className: "space-y-6 p-6",
10
11
  children: [
11
- /* @__PURE__ */ d("div", {
12
+ /* @__PURE__ */ m("div", {
12
13
  className: "flex items-center justify-between",
13
- children: [/* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("h1", {
14
+ children: [/* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("h1", {
14
15
  className: "text-2xl font-bold",
15
- children: /* @__PURE__ */ u(c, { children: "Reports List" })
16
- }), /* @__PURE__ */ d("p", {
16
+ children: /* @__PURE__ */ p(l, { children: "Reports List" })
17
+ }), /* @__PURE__ */ m("p", {
17
18
  className: "text-sm text-text-secondary",
18
- children: [f.length, " configured reports"]
19
- })] }), /* @__PURE__ */ d(a, {
19
+ children: [g.length, " configured reports"]
20
+ })] }), /* @__PURE__ */ m(o, {
20
21
  size: "sm",
21
- children: [/* @__PURE__ */ u(n, { className: "mr-2 h-4 w-4" }), "Create Report"]
22
+ children: [/* @__PURE__ */ p(n, { className: "mr-2 h-4 w-4" }), "Create Report"]
22
23
  })]
23
24
  }),
24
- /* @__PURE__ */ d("div", {
25
+ /* @__PURE__ */ p(f, { children: "Every report your team has saved, in one searchable list. Run a report on demand, see when it last ran and how it is scheduled, and jump in to refine it — so the insight you need is always a click away." }),
26
+ /* @__PURE__ */ m("div", {
25
27
  className: "relative max-w-md",
26
- children: [/* @__PURE__ */ u(r, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary" }), /* @__PURE__ */ u(l, {
28
+ children: [/* @__PURE__ */ p(r, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary" }), /* @__PURE__ */ p(d, {
27
29
  placeholder: "Search reports...",
28
30
  className: "pl-9"
29
31
  })]
30
32
  }),
31
- /* @__PURE__ */ u(o, { children: /* @__PURE__ */ u(s, {
32
- className: "p-0",
33
- children: /* @__PURE__ */ u("div", {
34
- className: "overflow-x-auto",
35
- children: /* @__PURE__ */ d("table", {
36
- className: "w-full text-sm",
37
- children: [/* @__PURE__ */ u("thead", { children: /* @__PURE__ */ d("tr", {
38
- className: "border-b bg-bg-sunken/50",
39
- children: [
40
- /* @__PURE__ */ u("th", {
41
- className: "text-left p-3 font-medium",
42
- children: "Name"
43
- }),
44
- /* @__PURE__ */ u("th", {
45
- className: "text-left p-3 font-medium",
46
- children: "Category"
47
- }),
48
- /* @__PURE__ */ u("th", {
49
- className: "text-left p-3 font-medium",
50
- children: "Type"
51
- }),
52
- /* @__PURE__ */ u("th", {
53
- className: "text-left p-3 font-medium",
54
- children: "Schedule"
55
- }),
56
- /* @__PURE__ */ u("th", {
57
- className: "text-left p-3 font-medium",
58
- children: "Last Run"
59
- }),
60
- /* @__PURE__ */ u("th", {
61
- className: "text-left p-3 font-medium",
62
- children: "Tags"
63
- }),
64
- /* @__PURE__ */ u("th", { className: "p-3" })
65
- ]
66
- }) }), /* @__PURE__ */ u("tbody", { children: f.map((e) => /* @__PURE__ */ d("tr", {
67
- className: "border-b hover:bg-bg-sunken/50 cursor-pointer",
68
- children: [
69
- /* @__PURE__ */ d("td", {
70
- className: "p-3",
71
- children: [/* @__PURE__ */ u("p", {
72
- className: "font-medium",
73
- children: e.name
74
- }), /* @__PURE__ */ u("p", {
75
- className: "text-xs text-text-secondary",
76
- children: e.description
77
- })]
78
- }),
79
- /* @__PURE__ */ u("td", {
80
- className: "p-3",
81
- children: /* @__PURE__ */ u(i, {
82
- variant: "outline",
83
- children: e.category
84
- })
85
- }),
86
- /* @__PURE__ */ u("td", {
87
- className: "p-3 capitalize text-xs",
88
- children: e.type
89
- }),
90
- /* @__PURE__ */ u("td", {
91
- className: "p-3 text-xs",
92
- children: e.schedule || "Manual"
93
- }),
94
- /* @__PURE__ */ u("td", {
95
- className: "p-3 text-xs",
96
- children: e.lastRun ? new Date(e.lastRun).toLocaleDateString() : "Never"
97
- }),
98
- /* @__PURE__ */ u("td", {
99
- className: "p-3",
100
- children: /* @__PURE__ */ u("div", {
101
- className: "flex flex-wrap gap-1",
102
- children: e.tags.map((e) => /* @__PURE__ */ u(i, {
103
- variant: "secondary",
104
- className: "text-[10px]",
105
- children: e
106
- }, e))
107
- })
108
- }),
109
- /* @__PURE__ */ u("td", {
110
- className: "p-3",
111
- children: /* @__PURE__ */ u(a, {
112
- variant: "ghost",
113
- size: "sm",
114
- children: /* @__PURE__ */ u(t, { className: "h-3 w-3" })
33
+ g.length === 0 ? /* @__PURE__ */ p(u, {
34
+ illustration: "empty-files",
35
+ title: "No reports yet",
36
+ description: "Create your first report to run and schedule it from here.",
37
+ action: /* @__PURE__ */ m(o, {
38
+ size: "sm",
39
+ onClick: () => h("/reports/report-builder"),
40
+ children: [/* @__PURE__ */ p(n, { className: "mr-2 h-4 w-4" }), "Create Report"]
41
+ })
42
+ }) : /* @__PURE__ */ p(c, {
43
+ treatment: "glass",
44
+ glow: !0,
45
+ className: "overflow-hidden border-border-seam",
46
+ children: /* @__PURE__ */ p(s, {
47
+ className: "p-0",
48
+ children: /* @__PURE__ */ p("div", {
49
+ className: "overflow-x-auto",
50
+ children: /* @__PURE__ */ m("table", {
51
+ className: "w-full text-sm",
52
+ children: [/* @__PURE__ */ p("thead", { children: /* @__PURE__ */ m("tr", {
53
+ className: "border-b bg-bg-sunken/50",
54
+ children: [
55
+ /* @__PURE__ */ p("th", {
56
+ className: "text-left p-3 font-medium",
57
+ children: "Name"
58
+ }),
59
+ /* @__PURE__ */ p("th", {
60
+ className: "text-left p-3 font-medium",
61
+ children: "Category"
62
+ }),
63
+ /* @__PURE__ */ p("th", {
64
+ className: "text-left p-3 font-medium",
65
+ children: "Type"
66
+ }),
67
+ /* @__PURE__ */ p("th", {
68
+ className: "text-left p-3 font-medium",
69
+ children: "Schedule"
70
+ }),
71
+ /* @__PURE__ */ p("th", {
72
+ className: "text-left p-3 font-medium",
73
+ children: "Last Run"
74
+ }),
75
+ /* @__PURE__ */ p("th", {
76
+ className: "text-left p-3 font-medium",
77
+ children: "Tags"
78
+ }),
79
+ /* @__PURE__ */ p("th", { className: "p-3" })
80
+ ]
81
+ }) }), /* @__PURE__ */ p("tbody", { children: g.map((e) => /* @__PURE__ */ m("tr", {
82
+ className: "border-b hover:bg-bg-sunken/50 cursor-pointer",
83
+ children: [
84
+ /* @__PURE__ */ m("td", {
85
+ className: "p-3",
86
+ children: [/* @__PURE__ */ p("p", {
87
+ className: "font-medium",
88
+ children: e.name
89
+ }), /* @__PURE__ */ p("p", {
90
+ className: "text-xs text-text-secondary",
91
+ children: e.description
92
+ })]
93
+ }),
94
+ /* @__PURE__ */ p("td", {
95
+ className: "p-3",
96
+ children: /* @__PURE__ */ p(a, {
97
+ variant: "outline",
98
+ children: e.category
99
+ })
100
+ }),
101
+ /* @__PURE__ */ p("td", {
102
+ className: "p-3 capitalize text-xs",
103
+ children: e.type
104
+ }),
105
+ /* @__PURE__ */ p("td", {
106
+ className: "p-3 text-xs",
107
+ children: e.schedule || "Manual"
108
+ }),
109
+ /* @__PURE__ */ p("td", {
110
+ className: "p-3 text-xs",
111
+ children: e.lastRun ? new Date(e.lastRun).toLocaleDateString() : "Never"
112
+ }),
113
+ /* @__PURE__ */ p("td", {
114
+ className: "p-3",
115
+ children: /* @__PURE__ */ p("div", {
116
+ className: "flex flex-wrap gap-1",
117
+ children: e.tags.map((e) => /* @__PURE__ */ p(a, {
118
+ variant: "secondary",
119
+ className: "text-[10px]",
120
+ children: e
121
+ }, e))
122
+ })
123
+ }),
124
+ /* @__PURE__ */ p("td", {
125
+ className: "p-3",
126
+ children: /* @__PURE__ */ p(o, {
127
+ variant: "ghost",
128
+ size: "sm",
129
+ children: /* @__PURE__ */ p(t, { className: "h-3 w-3" })
130
+ })
115
131
  })
116
- })
117
- ]
118
- }, e.id)) })]
132
+ ]
133
+ }, e.id)) })]
134
+ })
119
135
  })
120
136
  })
121
- }) })
137
+ })
122
138
  ]
123
139
  });
124
140
  }
125
141
  //#endregion
126
- export { f as ReportsReportsListPage };
142
+ export { h as ReportsReportsListPage };
127
143
 
128
144
  //# sourceMappingURL=ReportsReportsListPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ReportsReportsListPage.js","names":[],"sources":["../../../src/assethandler/pages/ReportsReportsListPage.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Input,\n GradientText,\n} from '@burdenoff/fe-libs/ui';\nimport { FileText, Plus, Search, Play, Clock } from 'lucide-react';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\n\nexport function ReportsReportsListPage() {\n const { reports } = useAssetHandlerStore();\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>Reports List</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">{reports.length} configured reports</p>\n </div>\n <Button size=\"sm\">\n <Plus className=\"mr-2 h-4 w-4\" />\n Create Report\n </Button>\n </div>\n\n <div className=\"relative max-w-md\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary\" />\n <Input placeholder=\"Search reports...\" className=\"pl-9\" />\n </div>\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\">Type</th>\n <th className=\"text-left p-3 font-medium\">Schedule</th>\n <th className=\"text-left p-3 font-medium\">Last Run</th>\n <th className=\"text-left p-3 font-medium\">Tags</th>\n <th className=\"p-3\"></th>\n </tr>\n </thead>\n <tbody>\n {reports.map((report) => (\n <tr key={report.id} className=\"border-b hover:bg-bg-sunken/50 cursor-pointer\">\n <td className=\"p-3\">\n <p className=\"font-medium\">{report.name}</p>\n <p className=\"text-xs text-text-secondary\">{report.description}</p>\n </td>\n <td className=\"p-3\">\n <Badge variant=\"outline\">{report.category}</Badge>\n </td>\n <td className=\"p-3 capitalize text-xs\">{report.type}</td>\n <td className=\"p-3 text-xs\">{report.schedule || 'Manual'}</td>\n <td className=\"p-3 text-xs\">\n {report.lastRun ? new Date(report.lastRun).toLocaleDateString() : 'Never'}\n </td>\n <td className=\"p-3\">\n <div className=\"flex flex-wrap gap-1\">\n {report.tags.map((t) => (\n <Badge key={t} variant=\"secondary\" className=\"text-[10px]\">\n {t}\n </Badge>\n ))}\n </div>\n </td>\n <td className=\"p-3\">\n <Button variant=\"ghost\" size=\"sm\">\n <Play className=\"h-3 w-3\" />\n </Button>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":";;;;;AAaA,SAAgB,IAAyB;CACvC,IAAM,EAAE,eAAY,GAAsB;AAE1C,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;KAAI,WAAU;eACZ,kBAAC,GAAD,EAAA,UAAc,gBAA2B,CAAA;KACtC,CAAA,EACL,kBAAC,KAAD;KAAG,WAAU;eAAb,CAA4C,EAAQ,QAAO,sBAAuB;OAC9E,EAAA,CAAA,EACN,kBAAC,GAAD;KAAQ,MAAK;eAAb,CACE,kBAAC,GAAD,EAAM,WAAU,gBAAiB,CAAA,EAAA,gBAE1B;OACL;;GAEN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD,EAAQ,WAAU,wEAAyE,CAAA,EAC3F,kBAAC,GAAD;KAAO,aAAY;KAAoB,WAAU;KAAS,CAAA,CACtD;;GAEN,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;IAAa,WAAU;cACrB,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,SAAD;MAAO,WAAU;gBAAjB,CACE,kBAAC,SAAD,EAAA,UACE,kBAAC,MAAD;OAAI,WAAU;iBAAd;QACE,kBAAC,MAAD;SAAI,WAAU;mBAA4B;SAAS,CAAA;QACnD,kBAAC,MAAD;SAAI,WAAU;mBAA4B;SAAa,CAAA;QACvD,kBAAC,MAAD;SAAI,WAAU;mBAA4B;SAAS,CAAA;QACnD,kBAAC,MAAD;SAAI,WAAU;mBAA4B;SAAa,CAAA;QACvD,kBAAC,MAAD;SAAI,WAAU;mBAA4B;SAAa,CAAA;QACvD,kBAAC,MAAD;SAAI,WAAU;mBAA4B;SAAS,CAAA;QACnD,kBAAC,MAAD,EAAI,WAAU,OAAW,CAAA;QACtB;UACC,CAAA,EACR,kBAAC,SAAD,EAAA,UACG,EAAQ,KAAK,MACZ,kBAAC,MAAD;OAAoB,WAAU;iBAA9B;QACE,kBAAC,MAAD;SAAI,WAAU;mBAAd,CACE,kBAAC,KAAD;UAAG,WAAU;oBAAe,EAAO;UAAS,CAAA,EAC5C,kBAAC,KAAD;UAAG,WAAU;oBAA+B,EAAO;UAAgB,CAAA,CAChE;;QACL,kBAAC,MAAD;SAAI,WAAU;mBACZ,kBAAC,GAAD;UAAO,SAAQ;oBAAW,EAAO;UAAiB,CAAA;SAC/C,CAAA;QACL,kBAAC,MAAD;SAAI,WAAU;mBAA0B,EAAO;SAAU,CAAA;QACzD,kBAAC,MAAD;SAAI,WAAU;mBAAe,EAAO,YAAY;SAAc,CAAA;QAC9D,kBAAC,MAAD;SAAI,WAAU;mBACX,EAAO,UAAU,IAAI,KAAK,EAAO,QAAQ,CAAC,oBAAoB,GAAG;SAC/D,CAAA;QACL,kBAAC,MAAD;SAAI,WAAU;mBACZ,kBAAC,OAAD;UAAK,WAAU;oBACZ,EAAO,KAAK,KAAK,MAChB,kBAAC,GAAD;WAAe,SAAQ;WAAY,WAAU;qBAC1C;WACK,EAFI,EAEJ,CACR;UACE,CAAA;SACH,CAAA;QACL,kBAAC,MAAD;SAAI,WAAU;mBACZ,kBAAC,GAAD;UAAQ,SAAQ;UAAQ,MAAK;oBAC3B,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA;UACrB,CAAA;SACN,CAAA;QACF;SA3BI,EAAO,GA2BX,CACL,EACI,CAAA,CACF;;KACJ,CAAA;IACM,CAAA,EACT,CAAA;GACH"}
1
+ {"version":3,"file":"ReportsReportsListPage.js","names":[],"sources":["../../../src/assethandler/pages/ReportsReportsListPage.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n CardContent,\n Input,\n GradientText,\n GlassCard,\n PagePurpose,\n IllustratedEmptyState,\n} from '@burdenoff/fe-libs/ui';\nimport { Plus, Search, Play } from 'lucide-react';\nimport { useNavigate } from 'react-router-dom';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\n\nexport function ReportsReportsListPage() {\n const navigate = useNavigate();\n const { reports } = useAssetHandlerStore();\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>Reports List</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">{reports.length} configured reports</p>\n </div>\n <Button size=\"sm\">\n <Plus className=\"mr-2 h-4 w-4\" />\n Create Report\n </Button>\n </div>\n\n <PagePurpose>\n Every report your team has saved, in one searchable list. Run a report on demand, see when\n it last ran and how it is scheduled, and jump in to refine it — so the insight you need is\n always a click away.\n </PagePurpose>\n\n <div className=\"relative max-w-md\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary\" />\n <Input placeholder=\"Search reports...\" className=\"pl-9\" />\n </div>\n\n {reports.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-files\"\n title=\"No reports yet\"\n description=\"Create your first report to run and schedule it from here.\"\n action={\n <Button size=\"sm\" onClick={() => navigate('/reports/report-builder')}>\n <Plus className=\"mr-2 h-4 w-4\" />\n Create Report\n </Button>\n }\n />\n ) : (\n <GlassCard treatment=\"glass\" glow className=\"overflow-hidden border-border-seam\">\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\">Type</th>\n <th className=\"text-left p-3 font-medium\">Schedule</th>\n <th className=\"text-left p-3 font-medium\">Last Run</th>\n <th className=\"text-left p-3 font-medium\">Tags</th>\n <th className=\"p-3\"></th>\n </tr>\n </thead>\n <tbody>\n {reports.map((report) => (\n <tr key={report.id} className=\"border-b hover:bg-bg-sunken/50 cursor-pointer\">\n <td className=\"p-3\">\n <p className=\"font-medium\">{report.name}</p>\n <p className=\"text-xs text-text-secondary\">{report.description}</p>\n </td>\n <td className=\"p-3\">\n <Badge variant=\"outline\">{report.category}</Badge>\n </td>\n <td className=\"p-3 capitalize text-xs\">{report.type}</td>\n <td className=\"p-3 text-xs\">{report.schedule || 'Manual'}</td>\n <td className=\"p-3 text-xs\">\n {report.lastRun ? new Date(report.lastRun).toLocaleDateString() : 'Never'}\n </td>\n <td className=\"p-3\">\n <div className=\"flex flex-wrap gap-1\">\n {report.tags.map((t) => (\n <Badge key={t} variant=\"secondary\" className=\"text-[10px]\">\n {t}\n </Badge>\n ))}\n </div>\n </td>\n <td className=\"p-3\">\n <Button variant=\"ghost\" size=\"sm\">\n <Play className=\"h-3 w-3\" />\n </Button>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </CardContent>\n </GlassCard>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,10 +1,10 @@
1
1
  import { KeyRound as e } from "lucide-react";
2
- import { GradientText as t, IllustratedEmptyState as n } from "@burdenoff/fe-libs/ui";
3
- import { jsx as r, jsxs as i } from "react/jsx-runtime";
4
- import { gql as a } from "@apollo/client";
5
- import { useQuery as o } from "@apollo/client/react";
2
+ import { GlassCard as t, GradientText as n, IllustratedEmptyState as r, PagePurpose as i } from "@burdenoff/fe-libs/ui";
3
+ import { jsx as a, jsxs as o } from "react/jsx-runtime";
4
+ import { gql as s } from "@apollo/client";
5
+ import { useQuery as c } from "@apollo/client/react";
6
6
  //#region src/assethandler/pages/SamLicensesPage.tsx
7
- var s = a`
7
+ var l = s`
8
8
  query AssetHandlerSoftwareAssets {
9
9
  softwareAssets {
10
10
  id
@@ -18,60 +18,59 @@ var s = a`
18
18
  }
19
19
  }
20
20
  `;
21
- function c() {
22
- let { data: a, loading: c } = o(s, { fetchPolicy: "cache-and-network" }), l = a?.softwareAssets ?? [];
23
- return /* @__PURE__ */ i("div", {
21
+ function u() {
22
+ let { data: s, loading: u } = c(l, { fetchPolicy: "cache-and-network" }), d = s?.softwareAssets ?? [];
23
+ return /* @__PURE__ */ o("div", {
24
24
  className: "space-y-4 p-4",
25
25
  children: [
26
- /* @__PURE__ */ i("h1", {
26
+ /* @__PURE__ */ o("h1", {
27
27
  className: "flex items-center gap-2 text-2xl font-semibold",
28
28
  children: [
29
- /* @__PURE__ */ r(e, { className: "h-6 w-6" }),
29
+ /* @__PURE__ */ a(e, { className: "h-6 w-6" }),
30
30
  " ",
31
- /* @__PURE__ */ r(t, { children: "SAM Licenses" })
31
+ /* @__PURE__ */ a(n, { children: "SAM Licenses" })
32
32
  ]
33
33
  }),
34
- /* @__PURE__ */ r("p", {
35
- className: "text-text-secondary",
36
- children: "Manage software entitlements, utilization, and compliance posture."
37
- }),
38
- /* @__PURE__ */ i("div", {
39
- className: "rounded-lg border",
34
+ /* @__PURE__ */ a(i, { children: "Software Asset Management (SAM): track every software entitlement against actual usage so you stay license-compliant and stop paying for seats nobody uses. Spot over- and under-licensing here to avoid audit penalties and reclaim wasted spend." }),
35
+ /* @__PURE__ */ o(t, {
36
+ treatment: "glass",
37
+ glow: !0,
38
+ className: "overflow-hidden border-border-seam",
40
39
  children: [
41
- /* @__PURE__ */ i("div", {
40
+ /* @__PURE__ */ o("div", {
42
41
  className: "grid grid-cols-5 gap-3 border-b px-4 py-3 text-xs font-semibold uppercase tracking-wide text-text-secondary",
43
42
  children: [
44
- /* @__PURE__ */ r("span", { children: "Software" }),
45
- /* @__PURE__ */ r("span", { children: "Vendor" }),
46
- /* @__PURE__ */ r("span", { children: "Version" }),
47
- /* @__PURE__ */ r("span", { children: "Seats Used" }),
48
- /* @__PURE__ */ r("span", { children: "Compliance" })
43
+ /* @__PURE__ */ a("span", { children: "Software" }),
44
+ /* @__PURE__ */ a("span", { children: "Vendor" }),
45
+ /* @__PURE__ */ a("span", { children: "Version" }),
46
+ /* @__PURE__ */ a("span", { children: "Seats Used" }),
47
+ /* @__PURE__ */ a("span", { children: "Compliance" })
49
48
  ]
50
49
  }),
51
- c && l.length === 0 ? /* @__PURE__ */ r("div", {
50
+ u && d.length === 0 ? /* @__PURE__ */ a("div", {
52
51
  className: "space-y-2 px-4 py-4",
53
- children: Array.from({ length: 4 }).map((e, t) => /* @__PURE__ */ r("div", { className: "h-8 rounded-md bg-bg-sunken motion-safe:animate-vc-shimmer" }, t))
52
+ children: Array.from({ length: 4 }).map((e, t) => /* @__PURE__ */ a("div", { className: "h-8 rounded-md bg-bg-sunken motion-safe:animate-vc-shimmer" }, t))
54
53
  }) : null,
55
- !c && l.length === 0 ? /* @__PURE__ */ r(n, {
54
+ !u && d.length === 0 ? /* @__PURE__ */ a(r, {
56
55
  illustration: "empty-data",
57
56
  title: "No software assets found",
58
57
  description: "Discovered software assets and licenses will appear here."
59
58
  }) : null,
60
- l.map((e) => /* @__PURE__ */ i("div", {
59
+ d.map((e) => /* @__PURE__ */ o("div", {
61
60
  className: "grid grid-cols-5 gap-3 border-b px-4 py-3 text-sm last:border-b-0",
62
61
  children: [
63
- /* @__PURE__ */ r("span", {
62
+ /* @__PURE__ */ a("span", {
64
63
  className: "font-medium",
65
64
  children: e.name
66
65
  }),
67
- /* @__PURE__ */ r("span", { children: e.vendor }),
68
- /* @__PURE__ */ r("span", { children: e.version }),
69
- /* @__PURE__ */ i("span", { children: [
66
+ /* @__PURE__ */ a("span", { children: e.vendor }),
67
+ /* @__PURE__ */ a("span", { children: e.version }),
68
+ /* @__PURE__ */ o("span", { children: [
70
69
  e.seatsUsed ?? 0,
71
70
  "/",
72
71
  e.seatsPurchased ?? "-"
73
72
  ] }),
74
- /* @__PURE__ */ i("span", { children: [e.compliancePercent.toFixed(1), "%"] })
73
+ /* @__PURE__ */ o("span", { children: [e.compliancePercent.toFixed(1), "%"] })
75
74
  ]
76
75
  }, e.id))
77
76
  ]
@@ -80,6 +79,6 @@ function c() {
80
79
  });
81
80
  }
82
81
  //#endregion
83
- export { c as SamLicensesPage };
82
+ export { u as SamLicensesPage };
84
83
 
85
84
  //# sourceMappingURL=SamLicensesPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SamLicensesPage.js","names":[],"sources":["../../../src/assethandler/pages/SamLicensesPage.tsx"],"sourcesContent":["import { KeyRound } from 'lucide-react';\nimport { GradientText, IllustratedEmptyState } from '@burdenoff/fe-libs/ui';\nimport { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\n\nconst SOFTWARE_ASSETS_QUERY = gql`\n query AssetHandlerSoftwareAssets {\n softwareAssets {\n id\n name\n vendor\n version\n licenseType\n seatsPurchased\n seatsUsed\n compliancePercent\n }\n }\n`;\n\nexport function SamLicensesPage() {\n const { data, loading } = useQuery<{\n softwareAssets: Array<{\n id: string;\n name: string;\n vendor: string;\n version: string;\n licenseType: string;\n seatsPurchased: number | null;\n seatsUsed: number | null;\n compliancePercent: number;\n }>;\n }>(SOFTWARE_ASSETS_QUERY, { fetchPolicy: 'cache-and-network' });\n\n const softwareAssets = data?.softwareAssets ?? [];\n\n return (\n <div className=\"space-y-4 p-4\">\n <h1 className=\"flex items-center gap-2 text-2xl font-semibold\">\n <KeyRound className=\"h-6 w-6\" /> <GradientText>SAM Licenses</GradientText>\n </h1>\n <p className=\"text-text-secondary\">\n Manage software entitlements, utilization, and compliance posture.\n </p>\n <div className=\"rounded-lg border\">\n <div className=\"grid grid-cols-5 gap-3 border-b px-4 py-3 text-xs font-semibold uppercase tracking-wide text-text-secondary\">\n <span>Software</span>\n <span>Vendor</span>\n <span>Version</span>\n <span>Seats Used</span>\n <span>Compliance</span>\n </div>\n {loading && softwareAssets.length === 0 ? (\n <div className=\"space-y-2 px-4 py-4\">\n {Array.from({ length: 4 }).map((_, i) => (\n <div key={i} className=\"h-8 rounded-md bg-bg-sunken motion-safe:animate-vc-shimmer\" />\n ))}\n </div>\n ) : null}\n {!loading && softwareAssets.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title=\"No software assets found\"\n description=\"Discovered software assets and licenses will appear here.\"\n />\n ) : null}\n {softwareAssets.map((asset) => (\n <div\n key={asset.id}\n className=\"grid grid-cols-5 gap-3 border-b px-4 py-3 text-sm last:border-b-0\"\n >\n <span className=\"font-medium\">{asset.name}</span>\n <span>{asset.vendor}</span>\n <span>{asset.version}</span>\n <span>\n {asset.seatsUsed ?? 0}/{asset.seatsPurchased ?? '-'}\n </span>\n <span>{asset.compliancePercent.toFixed(1)}%</span>\n </div>\n ))}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;AAKA,IAAM,IAAwB,CAAG;;;;;;;;;;;;;;AAejC,SAAgB,IAAkB;CAChC,IAAM,EAAE,SAAM,eAAY,EAWvB,GAAuB,EAAE,aAAa,qBAAqB,CAAC,EAEzD,IAAiB,GAAM,kBAAkB,EAAE;AAEjD,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,MAAD;IAAI,WAAU;cAAd;KACE,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA;;KAAC,kBAAC,GAAD,EAAA,UAAc,gBAA2B,CAAA;KACvE;;GACL,kBAAC,KAAD;IAAG,WAAU;cAAsB;IAE/B,CAAA;GACJ,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,QAAD,EAAA,UAAM,YAAe,CAAA;OACrB,kBAAC,QAAD,EAAA,UAAM,UAAa,CAAA;OACnB,kBAAC,QAAD,EAAA,UAAM,WAAc,CAAA;OACpB,kBAAC,QAAD,EAAA,UAAM,cAAiB,CAAA;OACvB,kBAAC,QAAD,EAAA,UAAM,cAAiB,CAAA;OACnB;;KACL,KAAW,EAAe,WAAW,IACpC,kBAAC,OAAD;MAAK,WAAU;gBACZ,MAAM,KAAK,EAAE,QAAQ,GAAG,CAAC,CAAC,KAAK,GAAG,MACjC,kBAAC,OAAD,EAAa,WAAU,8DAA+D,EAA5E,EAA4E,CACtF;MACE,CAAA,GACJ;KACH,CAAC,KAAW,EAAe,WAAW,IACrC,kBAAC,GAAD;MACE,cAAa;MACb,OAAM;MACN,aAAY;MACZ,CAAA,GACA;KACH,EAAe,KAAK,MACnB,kBAAC,OAAD;MAEE,WAAU;gBAFZ;OAIE,kBAAC,QAAD;QAAM,WAAU;kBAAe,EAAM;QAAY,CAAA;OACjD,kBAAC,QAAD,EAAA,UAAO,EAAM,QAAc,CAAA;OAC3B,kBAAC,QAAD,EAAA,UAAO,EAAM,SAAe,CAAA;OAC5B,kBAAC,QAAD,EAAA,UAAA;QACG,EAAM,aAAa;QAAE;QAAE,EAAM,kBAAkB;QAC3C,EAAA,CAAA;OACP,kBAAC,QAAD,EAAA,UAAA,CAAO,EAAM,kBAAkB,QAAQ,EAAE,EAAC,IAAQ,EAAA,CAAA;OAC9C;QAVC,EAAM,GAUP,CACN;KACE;;GACF"}
1
+ {"version":3,"file":"SamLicensesPage.js","names":[],"sources":["../../../src/assethandler/pages/SamLicensesPage.tsx"],"sourcesContent":["import { KeyRound } from 'lucide-react';\nimport { GradientText, IllustratedEmptyState, GlassCard, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\n\nconst SOFTWARE_ASSETS_QUERY = gql`\n query AssetHandlerSoftwareAssets {\n softwareAssets {\n id\n name\n vendor\n version\n licenseType\n seatsPurchased\n seatsUsed\n compliancePercent\n }\n }\n`;\n\nexport function SamLicensesPage() {\n const { data, loading } = useQuery<{\n softwareAssets: Array<{\n id: string;\n name: string;\n vendor: string;\n version: string;\n licenseType: string;\n seatsPurchased: number | null;\n seatsUsed: number | null;\n compliancePercent: number;\n }>;\n }>(SOFTWARE_ASSETS_QUERY, { fetchPolicy: 'cache-and-network' });\n\n const softwareAssets = data?.softwareAssets ?? [];\n\n return (\n <div className=\"space-y-4 p-4\">\n <h1 className=\"flex items-center gap-2 text-2xl font-semibold\">\n <KeyRound className=\"h-6 w-6\" /> <GradientText>SAM Licenses</GradientText>\n </h1>\n <PagePurpose>\n Software Asset Management (SAM): track every software entitlement against actual usage so\n you stay license-compliant and stop paying for seats nobody uses. Spot over- and\n under-licensing here to avoid audit penalties and reclaim wasted spend.\n </PagePurpose>\n <GlassCard treatment=\"glass\" glow className=\"overflow-hidden border-border-seam\">\n <div className=\"grid grid-cols-5 gap-3 border-b px-4 py-3 text-xs font-semibold uppercase tracking-wide text-text-secondary\">\n <span>Software</span>\n <span>Vendor</span>\n <span>Version</span>\n <span>Seats Used</span>\n <span>Compliance</span>\n </div>\n {loading && softwareAssets.length === 0 ? (\n <div className=\"space-y-2 px-4 py-4\">\n {Array.from({ length: 4 }).map((_, i) => (\n <div key={i} className=\"h-8 rounded-md bg-bg-sunken motion-safe:animate-vc-shimmer\" />\n ))}\n </div>\n ) : null}\n {!loading && softwareAssets.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title=\"No software assets found\"\n description=\"Discovered software assets and licenses will appear here.\"\n />\n ) : null}\n {softwareAssets.map((asset) => (\n <div\n key={asset.id}\n className=\"grid grid-cols-5 gap-3 border-b px-4 py-3 text-sm last:border-b-0\"\n >\n <span className=\"font-medium\">{asset.name}</span>\n <span>{asset.vendor}</span>\n <span>{asset.version}</span>\n <span>\n {asset.seatsUsed ?? 0}/{asset.seatsPurchased ?? '-'}\n </span>\n <span>{asset.compliancePercent.toFixed(1)}%</span>\n </div>\n ))}\n </GlassCard>\n </div>\n );\n}\n"],"mappings":";;;;;;AAKA,IAAM,IAAwB,CAAG;;;;;;;;;;;;;;AAejC,SAAgB,IAAkB;CAChC,IAAM,EAAE,SAAM,eAAY,EAWvB,GAAuB,EAAE,aAAa,qBAAqB,CAAC,EAEzD,IAAiB,GAAM,kBAAkB,EAAE;AAEjD,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,MAAD;IAAI,WAAU;cAAd;KACE,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA;;KAAC,kBAAC,GAAD,EAAA,UAAc,gBAA2B,CAAA;KACvE;;GACL,kBAAC,GAAD,EAAA,UAAa,sPAIC,CAAA;GACd,kBAAC,GAAD;IAAW,WAAU;IAAQ,MAAA;IAAK,WAAU;cAA5C;KACE,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,QAAD,EAAA,UAAM,YAAe,CAAA;OACrB,kBAAC,QAAD,EAAA,UAAM,UAAa,CAAA;OACnB,kBAAC,QAAD,EAAA,UAAM,WAAc,CAAA;OACpB,kBAAC,QAAD,EAAA,UAAM,cAAiB,CAAA;OACvB,kBAAC,QAAD,EAAA,UAAM,cAAiB,CAAA;OACnB;;KACL,KAAW,EAAe,WAAW,IACpC,kBAAC,OAAD;MAAK,WAAU;gBACZ,MAAM,KAAK,EAAE,QAAQ,GAAG,CAAC,CAAC,KAAK,GAAG,MACjC,kBAAC,OAAD,EAAa,WAAU,8DAA+D,EAA5E,EAA4E,CACtF;MACE,CAAA,GACJ;KACH,CAAC,KAAW,EAAe,WAAW,IACrC,kBAAC,GAAD;MACE,cAAa;MACb,OAAM;MACN,aAAY;MACZ,CAAA,GACA;KACH,EAAe,KAAK,MACnB,kBAAC,OAAD;MAEE,WAAU;gBAFZ;OAIE,kBAAC,QAAD;QAAM,WAAU;kBAAe,EAAM;QAAY,CAAA;OACjD,kBAAC,QAAD,EAAA,UAAO,EAAM,QAAc,CAAA;OAC3B,kBAAC,QAAD,EAAA,UAAO,EAAM,SAAe,CAAA;OAC5B,kBAAC,QAAD,EAAA,UAAA;QACG,EAAM,aAAa;QAAE;QAAE,EAAM,kBAAkB;QAC3C,EAAA,CAAA;OACP,kBAAC,QAAD,EAAA,UAAA,CAAO,EAAM,kBAAkB,QAAQ,EAAE,EAAC,IAAQ,EAAA,CAAA;OAC9C;QAVC,EAAM,GAUP,CACN;KACQ;;GACR"}
@@ -1,109 +1,117 @@
1
1
  import { useAssetHandlerStore as e } from "../store/assethandlerStore.js";
2
2
  import { ArrowLeft as t, Shield as n } from "lucide-react";
3
- import { useParams as r } from "react-router-dom";
4
- import { Badge as i, Button as a, Card as o, CardContent as s, CardHeader as c, CardTitle as l, GradientText as u } from "@burdenoff/fe-libs/ui";
5
- import { jsx as d, jsxs as f } from "react/jsx-runtime";
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";
6
6
  //#region src/assethandler/pages/SecurityComplianceDetailPage.tsx
7
- function p() {
8
- let { frameworkId: p } = r(), { complianceFrameworks: m } = e(), h = m.find((e) => e.id === p) ?? m[0];
9
- return h ? /* @__PURE__ */ f("div", {
7
+ 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", {
10
10
  className: "space-y-6 p-6",
11
11
  children: [
12
- /* @__PURE__ */ f("div", {
12
+ /* @__PURE__ */ g("div", {
13
13
  className: "flex items-center justify-between",
14
- children: [/* @__PURE__ */ f("div", {
14
+ children: [/* @__PURE__ */ g("div", {
15
15
  className: "flex items-center gap-4",
16
- children: [/* @__PURE__ */ d(a, {
16
+ children: [/* @__PURE__ */ h(o, {
17
17
  variant: "ghost",
18
18
  size: "icon",
19
- children: /* @__PURE__ */ d(t, { className: "h-4 w-4" })
20
- }), /* @__PURE__ */ f("div", { children: [/* @__PURE__ */ f("div", {
19
+ onClick: () => _("/security/security-hub"),
20
+ children: /* @__PURE__ */ h(t, { className: "h-4 w-4" })
21
+ }), /* @__PURE__ */ g("div", { children: [/* @__PURE__ */ g("div", {
21
22
  className: "flex items-center gap-3",
22
- children: [/* @__PURE__ */ d("h1", {
23
+ children: [/* @__PURE__ */ h("h1", {
23
24
  className: "text-2xl font-bold",
24
- children: /* @__PURE__ */ f(u, { children: [
25
- h.name,
25
+ children: /* @__PURE__ */ g(f, { children: [
26
+ b.name,
26
27
  " ",
27
- h.version
28
+ b.version
28
29
  ] })
29
- }), /* @__PURE__ */ d(i, {
30
- variant: h.status === "compliant" ? "default" : h.status === "non_compliant" ? "destructive" : "secondary",
31
- children: h.status.replace("_", " ")
30
+ }), /* @__PURE__ */ h(a, {
31
+ variant: b.status === "compliant" ? "default" : b.status === "non_compliant" ? "destructive" : "secondary",
32
+ children: b.status.replace("_", " ")
32
33
  })]
33
- }), /* @__PURE__ */ d("p", {
34
+ }), /* @__PURE__ */ h("p", {
34
35
  className: "text-sm text-text-secondary mt-1",
35
36
  children: "Compliance framework assessment details"
36
37
  })] })]
37
- }), /* @__PURE__ */ f(a, {
38
+ }), /* @__PURE__ */ g(o, {
38
39
  size: "sm",
39
- children: [/* @__PURE__ */ d(n, { className: "mr-2 h-4 w-4" }), "Run Assessment"]
40
+ children: [/* @__PURE__ */ h(n, { className: "mr-2 h-4 w-4" }), "Run Assessment"]
40
41
  })]
41
42
  }),
42
- /* @__PURE__ */ f("div", {
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", {
43
45
  className: "grid gap-4 md:grid-cols-4",
44
46
  children: [
45
- /* @__PURE__ */ d(o, { children: /* @__PURE__ */ f(s, {
46
- className: "pt-4 text-center",
47
- children: [/* @__PURE__ */ f("p", {
48
- className: "text-4xl font-bold",
49
- children: [h.score, "%"]
50
- }), /* @__PURE__ */ d("p", {
47
+ /* @__PURE__ */ g(d, {
48
+ className: "text-center",
49
+ children: [/* @__PURE__ */ g("p", {
50
+ className: "text-4xl font-bold tabular-nums",
51
+ children: [b.score, "%"]
52
+ }), /* @__PURE__ */ h("p", {
51
53
  className: "text-xs text-text-secondary",
52
54
  children: "Overall Score"
53
55
  })]
54
- }) }),
55
- /* @__PURE__ */ d(o, { children: /* @__PURE__ */ f(s, {
56
+ }),
57
+ /* @__PURE__ */ h(s, { children: /* @__PURE__ */ g(c, {
56
58
  className: "pt-4 text-center",
57
- children: [/* @__PURE__ */ d("p", {
59
+ children: [/* @__PURE__ */ h("p", {
58
60
  className: "text-4xl font-bold text-status-success-text",
59
- children: h.passedControls
60
- }), /* @__PURE__ */ d("p", {
61
+ children: b.passedControls
62
+ }), /* @__PURE__ */ h("p", {
61
63
  className: "text-xs text-text-secondary",
62
64
  children: "Passed"
63
65
  })]
64
66
  }) }),
65
- /* @__PURE__ */ d(o, { children: /* @__PURE__ */ f(s, {
67
+ /* @__PURE__ */ h(s, { children: /* @__PURE__ */ g(c, {
66
68
  className: "pt-4 text-center",
67
- children: [/* @__PURE__ */ d("p", {
69
+ children: [/* @__PURE__ */ h("p", {
68
70
  className: "text-4xl font-bold text-status-error-text",
69
- children: h.failedControls
70
- }), /* @__PURE__ */ d("p", {
71
+ children: b.failedControls
72
+ }), /* @__PURE__ */ h("p", {
71
73
  className: "text-xs text-text-secondary",
72
74
  children: "Failed"
73
75
  })]
74
76
  }) }),
75
- /* @__PURE__ */ d(o, { children: /* @__PURE__ */ f(s, {
77
+ /* @__PURE__ */ h(s, { children: /* @__PURE__ */ g(c, {
76
78
  className: "pt-4 text-center",
77
- children: [/* @__PURE__ */ d("p", {
79
+ children: [/* @__PURE__ */ h("p", {
78
80
  className: "text-4xl font-bold",
79
- children: h.totalControls
80
- }), /* @__PURE__ */ d("p", {
81
+ children: b.totalControls
82
+ }), /* @__PURE__ */ h("p", {
81
83
  className: "text-xs text-text-secondary",
82
84
  children: "Total Controls"
83
85
  })]
84
86
  }) })
85
87
  ]
86
88
  }),
87
- /* @__PURE__ */ f(o, { children: [/* @__PURE__ */ d(c, { children: /* @__PURE__ */ d(l, { children: "Compliance Progress" }) }), /* @__PURE__ */ f(s, { children: [/* @__PURE__ */ d("div", {
89
+ /* @__PURE__ */ g(s, { children: [/* @__PURE__ */ h(l, { children: /* @__PURE__ */ h(u, { children: "Compliance Progress" }) }), /* @__PURE__ */ g(c, { children: [/* @__PURE__ */ h("div", {
88
90
  className: "h-4 rounded-full bg-bg-sunken overflow-hidden",
89
- children: /* @__PURE__ */ d("div", {
90
- className: `h-full rounded-full ${h.score >= 90 ? "bg-status-success-bg" : h.score >= 70 ? "bg-status-warning-bg" : "bg-status-error-bg"}`,
91
- style: { width: `${h.score}%` }
91
+ children: /* @__PURE__ */ h("div", {
92
+ className: `h-full rounded-full ${b.score >= 90 ? "bg-status-success-bg" : b.score >= 70 ? "bg-status-warning-bg" : "bg-status-error-bg"}`,
93
+ style: { width: `${b.score}%` }
92
94
  })
93
- }), /* @__PURE__ */ f("div", {
95
+ }), /* @__PURE__ */ g("div", {
94
96
  className: "flex justify-between mt-2 text-xs text-text-secondary",
95
- children: [/* @__PURE__ */ f("span", { children: ["Last Assessment: ", h.lastAssessment] }), /* @__PURE__ */ f("span", { children: ["Next Assessment: ", h.nextAssessment] })]
97
+ children: [/* @__PURE__ */ g("span", { children: ["Last Assessment: ", b.lastAssessment] }), /* @__PURE__ */ g("span", { children: ["Next Assessment: ", b.nextAssessment] })]
96
98
  })] })] })
97
99
  ]
98
- }) : /* @__PURE__ */ d("div", {
100
+ }) : /* @__PURE__ */ h("div", {
99
101
  className: "p-6",
100
- children: /* @__PURE__ */ d("p", {
101
- className: "text-text-secondary",
102
- children: "Framework not found."
102
+ children: /* @__PURE__ */ h(p, {
103
+ illustration: "empty-search",
104
+ title: "Framework not found",
105
+ description: "This compliance framework may have been removed. Return to the security hub to find it.",
106
+ action: /* @__PURE__ */ h(o, {
107
+ size: "sm",
108
+ onClick: () => _("/security/security-hub"),
109
+ children: "Back to security"
110
+ })
103
111
  })
104
112
  });
105
113
  }
106
114
  //#endregion
107
- export { p as SecurityComplianceDetailPage };
115
+ export { _ as SecurityComplianceDetailPage };
108
116
 
109
117
  //# sourceMappingURL=SecurityComplianceDetailPage.js.map