@burdenoff/microfe-assethandler 2026.625.2 → 2026.703.1
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/AssetHandlerRoot.js +0 -24
- package/dist/assethandler/AssetHandlerRoot.js.map +1 -1
- package/dist/assethandler/AssetHandlerRoutes.js +92 -160
- package/dist/assethandler/AssetHandlerRoutes.js.map +1 -1
- package/dist/assethandler/pages/AnalyticsPage.js +367 -402
- package/dist/assethandler/pages/AnalyticsPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetCategoriesPage.js +29 -26
- package/dist/assethandler/pages/AssetsAssetCategoriesPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetCheckInOutPage.js +278 -164
- package/dist/assethandler/pages/AssetsAssetCheckInOutPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetCreatePage.js +200 -242
- package/dist/assethandler/pages/AssetsAssetCreatePage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetDetailPage.js +192 -286
- package/dist/assethandler/pages/AssetsAssetDetailPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetListPage.js +204 -296
- package/dist/assethandler/pages/AssetsAssetListPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetTrackingPage.js +38 -42
- package/dist/assethandler/pages/AssetsAssetTrackingPage.js.map +1 -1
- package/dist/assethandler/pages/DashboardPage.js +212 -236
- package/dist/assethandler/pages/DashboardPage.js.map +1 -1
- package/dist/assethandler/pages/ItilIncidentDetailPage.js +41 -85
- package/dist/assethandler/pages/ItilIncidentDetailPage.js.map +1 -1
- package/dist/assethandler/pages/MaintenanceMaintenanceCalendarPage.js +1 -1
- package/dist/assethandler/pages/MaintenanceMaintenanceCalendarPage.js.map +1 -1
- package/dist/assethandler/pages/MaintenanceMaintenanceSchedulerPage.js +37 -86
- package/dist/assethandler/pages/MaintenanceMaintenanceSchedulerPage.js.map +1 -1
- package/dist/assethandler/pages/OperationsMaintenanceDetailPage.js +82 -98
- package/dist/assethandler/pages/OperationsMaintenanceDetailPage.js.map +1 -1
- package/dist/assethandler/pages/OperationsOperationsHubPage.js +6 -22
- package/dist/assethandler/pages/OperationsOperationsHubPage.js.map +1 -1
- package/dist/assethandler/pages/OperationsWorkOrderDetailPage.js +4 -34
- package/dist/assethandler/pages/OperationsWorkOrderDetailPage.js.map +1 -1
- package/dist/assethandler/pages/PortfolioPortfolioOverviewPage.js +105 -150
- package/dist/assethandler/pages/PortfolioPortfolioOverviewPage.js.map +1 -1
- package/dist/assethandler/pages/TransactionsTransactionDetailPage.js +116 -152
- package/dist/assethandler/pages/TransactionsTransactionDetailPage.js.map +1 -1
- package/dist/assethandler/providers/AssetHandlerProvider.js.map +1 -1
- package/dist/assethandler/store/assethandlerStore.js +68 -2206
- package/dist/assethandler/store/assethandlerStore.js.map +1 -1
- package/dist/assethandler/utils/toast.js +33 -0
- package/dist/assethandler/utils/toast.js.map +1 -0
- package/package.json +5 -4
- package/dist/assethandler/pages/AssetsAssetEditPage.js +0 -353
- package/dist/assethandler/pages/AssetsAssetEditPage.js.map +0 -1
- package/dist/assethandler/pages/AuditTrailPage.js +0 -215
- package/dist/assethandler/pages/AuditTrailPage.js.map +0 -1
- package/dist/assethandler/pages/MarketplaceMarketplaceDetailPage.js +0 -177
- package/dist/assethandler/pages/MarketplaceMarketplaceDetailPage.js.map +0 -1
- package/dist/assethandler/pages/MarketplaceMarketplaceListPage.js +0 -162
- package/dist/assethandler/pages/MarketplaceMarketplaceListPage.js.map +0 -1
- package/dist/assethandler/pages/MarketplaceMarketplaceOrdersPage.js +0 -143
- package/dist/assethandler/pages/MarketplaceMarketplaceOrdersPage.js.map +0 -1
- package/dist/assethandler/pages/MarketplaceMarketplaceSellPage.js +0 -163
- package/dist/assethandler/pages/MarketplaceMarketplaceSellPage.js.map +0 -1
- package/dist/assethandler/pages/ReportsReportBuilderPage.js +0 -208
- package/dist/assethandler/pages/ReportsReportBuilderPage.js.map +0 -1
- package/dist/assethandler/pages/ReportsReportsDashboardPage.js +0 -236
- package/dist/assethandler/pages/ReportsReportsDashboardPage.js.map +0 -1
- package/dist/assethandler/pages/ReportsReportsListPage.js +0 -144
- package/dist/assethandler/pages/ReportsReportsListPage.js.map +0 -1
- package/dist/assethandler/pages/SecurityScheduleBackupPage.js +0 -149
- package/dist/assethandler/pages/SecurityScheduleBackupPage.js.map +0 -1
- package/dist/assethandler/pages/UsersPage.js +0 -208
- package/dist/assethandler/pages/UsersPage.js.map +0 -1
- package/dist/assethandler/pages/UsersUserCreatePage.js +0 -220
- package/dist/assethandler/pages/UsersUserCreatePage.js.map +0 -1
- package/dist/assethandler/pages/UsersUserManagementHubPage.js +0 -373
- package/dist/assethandler/pages/UsersUserManagementHubPage.js.map +0 -1
- package/dist/assethandler/pages/WorkflowsWorkflowBuilderPage.js +0 -264
- package/dist/assethandler/pages/WorkflowsWorkflowBuilderPage.js.map +0 -1
- package/dist/assethandler/pages/WorkflowsWorkflowExecutionsPage.js +0 -206
- package/dist/assethandler/pages/WorkflowsWorkflowExecutionsPage.js.map +0 -1
- package/dist/assethandler/pages/WorkflowsWorkflowListPage.js +0 -171
- package/dist/assethandler/pages/WorkflowsWorkflowListPage.js.map +0 -1
- package/dist/assethandler/pages/WorkflowsWorkflowTemplatesPage.js +0 -173
- package/dist/assethandler/pages/WorkflowsWorkflowTemplatesPage.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"UsersUserManagementHubPage.js","names":[],"sources":["../../../src/assethandler/pages/UsersUserManagementHubPage.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n GradientText,\n GlassCard,\n CTAOverflowMenu,\n PagePurpose,\n NextSteps,\n IllustratedEmptyState,\n} from '@burdenoff/fe-libs/ui';\nimport { Users, UserCheck, Shield, Upload, Download, Plus, Activity, Key } from 'lucide-react';\nimport { useNavigate } from 'react-router-dom';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\n\nconst roleDescriptions: Record<string, { description: string; permCount: number; color: string }> =\n {\n admin: {\n description: 'Full system access with all permissions',\n permCount: 11,\n color: 'bg-status-error-bg-subtle text-status-error-text',\n },\n manager: {\n description: 'Department-level management and reporting',\n permCount: 6,\n color: 'bg-status-info-bg-subtle text-status-info-text',\n },\n technician: {\n description: 'Asset maintenance and operational tasks',\n permCount: 4,\n color: 'bg-status-success-bg-subtle text-status-success-text',\n },\n viewer: {\n description: 'Read-only access to assets and reports',\n permCount: 2,\n color: 'bg-bg-sunken text-text-secondary',\n },\n auditor: {\n description: 'Audit trail access and compliance reporting',\n permCount: 4,\n color: 'bg-action-primary-bg/10 text-action-primary-bg',\n },\n };\n\nconst permissionMatrix = [\n {\n module: 'Assets',\n admin: 'Full',\n manager: 'Full',\n technician: 'Read/Update',\n viewer: 'Read',\n auditor: 'Read',\n },\n { module: 'Users', admin: 'Full', manager: 'Read', technician: '—', viewer: '—', auditor: '—' },\n {\n module: 'Reports',\n admin: 'Full',\n manager: 'Read',\n technician: '—',\n viewer: 'Read',\n auditor: 'Full',\n },\n {\n module: 'Maintenance',\n admin: 'Full',\n manager: 'Full',\n technician: 'Full',\n viewer: '—',\n auditor: '—',\n },\n { module: 'Audit', admin: 'Full', manager: '—', technician: '—', viewer: '—', auditor: 'Full' },\n {\n module: 'Compliance',\n admin: 'Full',\n manager: 'Read',\n technician: '—',\n viewer: '—',\n auditor: 'Full',\n },\n { module: 'Settings', admin: 'Full', manager: '—', technician: '—', viewer: '—', auditor: '—' },\n {\n module: 'Finance',\n admin: 'Full',\n manager: 'Full',\n technician: '—',\n viewer: 'Read',\n auditor: 'Read',\n },\n];\n\nconst RECENT_LOGIN_CUTOFF = Date.now() - 86400000;\n\nexport function UsersUserManagementHubPage() {\n const navigate = useNavigate();\n const { users } = useAssetHandlerStore();\n\n const activeUsers = users.filter((u) => u.status === 'active').length;\n const recentActivityCount = users.filter(\n (u) => new Date(u.lastLogin).getTime() > RECENT_LOGIN_CUTOFF\n ).length;\n const roleCounts = users.reduce<Record<string, number>>((acc, u) => {\n acc[u.role] = (acc[u.role] || 0) + 1;\n return acc;\n }, {});\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-semibold\">\n <GradientText>User Management</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n Manage users, roles, and access permissions across the organization.\n </p>\n </div>\n <CTAOverflowMenu\n primary={{ label: 'Add User', onSelect: () => {}, icon: <Plus className=\"h-4 w-4\" /> }}\n actions={[\n { label: 'Bulk Import', onSelect: () => {}, icon: <Upload className=\"h-4 w-4\" /> },\n { label: 'Export', onSelect: () => {}, icon: <Download className=\"h-4 w-4\" /> },\n ]}\n />\n </div>\n\n <PagePurpose>\n Control who can do what across Asset Handler. Add and offboard users, assign roles, and\n review the permission matrix so people see exactly the assets, reports and actions their job\n needs — keeping access least-privilege and audit-friendly.\n </PagePurpose>\n\n <NextSteps\n storageKey=\"assethandler-users-hub\"\n steps={[\n {\n id: 'add-user',\n label: 'Add a user',\n description: 'Invite a teammate and assign their starting role.',\n onClick: () => navigate('/users/user-create'),\n },\n {\n id: 'directory',\n label: 'Browse the user directory',\n description: 'See everyone, their status and assigned assets.',\n onClick: () => navigate('/users'),\n },\n {\n id: 'audit',\n label: 'Check the audit trail',\n description: 'See who accessed or changed assets recently.',\n onClick: () => navigate('/audit-trail'),\n },\n ]}\n />\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n <GlassCard treatment=\"glass\" glow className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Total Users</CardTitle>\n <Users className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{users.length}</div>\n </CardContent>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Active</CardTitle>\n <UserCheck className=\"h-4 w-4 text-status-success-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{activeUsers}</div>\n <p className=\"text-xs text-text-secondary\">\n {Math.round((activeUsers / users.length) * 100)}% of total\n </p>\n </CardContent>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Roles Defined</CardTitle>\n <Shield className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">\n {Object.keys(roleDescriptions).length}\n </div>\n </CardContent>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Recent Activity</CardTitle>\n <Activity className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{recentActivityCount}</div>\n <p className=\"text-xs text-text-secondary\">Logged in last 24h</p>\n </CardContent>\n </GlassCard>\n </div>\n\n <Tabs defaultValue=\"users\">\n <TabsList>\n <TabsTrigger value=\"users\">Users</TabsTrigger>\n <TabsTrigger value=\"roles\">Roles</TabsTrigger>\n <TabsTrigger value=\"permissions\">Permissions Matrix</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"users\" className=\"mt-4\">\n {users.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-people\"\n title=\"No users yet\"\n description=\"Add your first user to start managing access to Asset Handler.\"\n action={\n <Button size=\"sm\" onClick={() => navigate('/users/user-create')}>\n <Plus className=\"mr-2 h-4 w-4\" />\n Add User\n </Button>\n }\n />\n ) : (\n <Card>\n <CardContent className=\"pt-6\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Name</TableHead>\n <TableHead>Email</TableHead>\n <TableHead>Role</TableHead>\n <TableHead>Department</TableHead>\n <TableHead>Status</TableHead>\n <TableHead className=\"text-right\">Assets</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {users.map((user) => (\n <TableRow key={user.id}>\n <TableCell className=\"font-medium\">\n {user.firstName} {user.lastName}\n </TableCell>\n <TableCell>{user.email}</TableCell>\n <TableCell>\n <Badge variant={user.role === 'admin' ? 'destructive' : 'secondary'}>\n {user.role}\n </Badge>\n </TableCell>\n <TableCell>{user.department}</TableCell>\n <TableCell>\n <Badge variant={user.status === 'active' ? 'default' : 'outline'}>\n {user.status}\n </Badge>\n </TableCell>\n <TableCell className=\"text-right\">{user.assetsAssigned}</TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </CardContent>\n </Card>\n )}\n </TabsContent>\n\n <TabsContent value=\"roles\" className=\"mt-4\">\n <div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-3\">\n {Object.entries(roleDescriptions).map(([role, info]) => (\n <Card key={role}>\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-lg capitalize\">{role}</CardTitle>\n <Badge variant=\"outline\">{roleCounts[role] || 0} users</Badge>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <p className=\"text-sm text-text-secondary\">{info.description}</p>\n <div className=\"flex items-center gap-2 text-sm\">\n <Key className=\"h-4 w-4 text-text-secondary\" />\n <span>{info.permCount} permissions</span>\n </div>\n <Button variant=\"outline\" size=\"sm\" className=\"w-full\">\n Edit Role\n </Button>\n </CardContent>\n </Card>\n ))}\n </div>\n </TabsContent>\n\n <TabsContent value=\"permissions\" className=\"mt-4\">\n <Card>\n <CardHeader>\n <CardTitle>Permission Matrix</CardTitle>\n </CardHeader>\n <CardContent>\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Module</TableHead>\n <TableHead>Admin</TableHead>\n <TableHead>Manager</TableHead>\n <TableHead>Technician</TableHead>\n <TableHead>Viewer</TableHead>\n <TableHead>Auditor</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {permissionMatrix.map((row) => (\n <TableRow key={row.module}>\n <TableCell className=\"font-medium\">{row.module}</TableCell>\n <TableCell>\n <Badge\n variant={row.admin === 'Full' ? 'default' : 'outline'}\n className=\"text-xs\"\n >\n {row.admin}\n </Badge>\n </TableCell>\n <TableCell>\n <Badge\n variant={\n row.manager === 'Full'\n ? 'default'\n : row.manager === '—'\n ? 'outline'\n : 'secondary'\n }\n className=\"text-xs\"\n >\n {row.manager}\n </Badge>\n </TableCell>\n <TableCell>\n <Badge\n variant={\n row.technician === 'Full'\n ? 'default'\n : row.technician === '—'\n ? 'outline'\n : 'secondary'\n }\n className=\"text-xs\"\n >\n {row.technician}\n </Badge>\n </TableCell>\n <TableCell>\n <Badge\n variant={row.viewer === '—' ? 'outline' : 'secondary'}\n className=\"text-xs\"\n >\n {row.viewer}\n </Badge>\n </TableCell>\n <TableCell>\n <Badge\n variant={\n row.auditor === 'Full'\n ? 'default'\n : row.auditor === '—'\n ? 'outline'\n : 'secondary'\n }\n className=\"text-xs\"\n >\n {row.auditor}\n </Badge>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </CardContent>\n </Card>\n </TabsContent>\n </Tabs>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,264 +0,0 @@
|
|
|
1
|
-
import { useState as e } from "react";
|
|
2
|
-
import { ArrowLeft as t, Bell as n, Clock as r, Database as i, GitBranch as a, Mail as o, Play as s, Save as c, Upload as l, Zap as u } from "lucide-react";
|
|
3
|
-
import { useNavigate as d } from "react-router-dom";
|
|
4
|
-
import { Button as f, Card as p, CardContent as m, CardHeader as h, CardTitle as g, EmphasisPanel as _, GradientText as v, IllustratedEmptyState as y, Input as b, Label as x, NextSteps as S, PagePurpose as C, Select as w, SelectContent as T, SelectItem as E, SelectTrigger as D, SelectValue as O, Textarea as k } from "@burdenoff/fe-libs/ui";
|
|
5
|
-
import { jsx as A, jsxs as j } from "react/jsx-runtime";
|
|
6
|
-
//#region src/assethandler/pages/WorkflowsWorkflowBuilderPage.tsx
|
|
7
|
-
var M = [
|
|
8
|
-
{
|
|
9
|
-
icon: u,
|
|
10
|
-
label: "Trigger",
|
|
11
|
-
description: "Start the workflow"
|
|
12
|
-
},
|
|
13
|
-
{
|
|
14
|
-
icon: a,
|
|
15
|
-
label: "Condition",
|
|
16
|
-
description: "Branch logic"
|
|
17
|
-
},
|
|
18
|
-
{
|
|
19
|
-
icon: r,
|
|
20
|
-
label: "Delay",
|
|
21
|
-
description: "Wait for time"
|
|
22
|
-
},
|
|
23
|
-
{
|
|
24
|
-
icon: o,
|
|
25
|
-
label: "Send Email",
|
|
26
|
-
description: "Email notification"
|
|
27
|
-
},
|
|
28
|
-
{
|
|
29
|
-
icon: n,
|
|
30
|
-
label: "Notify",
|
|
31
|
-
description: "Push notification"
|
|
32
|
-
},
|
|
33
|
-
{
|
|
34
|
-
icon: i,
|
|
35
|
-
label: "Update Record",
|
|
36
|
-
description: "Modify data"
|
|
37
|
-
}
|
|
38
|
-
];
|
|
39
|
-
function N() {
|
|
40
|
-
let n = d(), [r, i] = e(""), [a, o] = e(""), [u, N] = e(""), [P, F] = e("");
|
|
41
|
-
return /* @__PURE__ */ j("div", {
|
|
42
|
-
className: "space-y-6 p-6",
|
|
43
|
-
children: [
|
|
44
|
-
/* @__PURE__ */ j("div", {
|
|
45
|
-
className: "flex items-center justify-between",
|
|
46
|
-
children: [/* @__PURE__ */ j("div", {
|
|
47
|
-
className: "flex items-center gap-3",
|
|
48
|
-
children: [/* @__PURE__ */ A(f, {
|
|
49
|
-
variant: "outline",
|
|
50
|
-
size: "sm",
|
|
51
|
-
onClick: () => n("/workflows/workflow-list"),
|
|
52
|
-
children: /* @__PURE__ */ A(t, { className: "h-4 w-4" })
|
|
53
|
-
}), /* @__PURE__ */ j("div", { children: [/* @__PURE__ */ A("h1", {
|
|
54
|
-
className: "text-2xl font-semibold",
|
|
55
|
-
children: /* @__PURE__ */ A(v, { children: "Workflow Builder" })
|
|
56
|
-
}), /* @__PURE__ */ A("p", {
|
|
57
|
-
className: "text-sm text-text-secondary",
|
|
58
|
-
children: "Design and configure automated workflows visually."
|
|
59
|
-
})] })]
|
|
60
|
-
}), /* @__PURE__ */ j("div", {
|
|
61
|
-
className: "flex gap-2",
|
|
62
|
-
children: [
|
|
63
|
-
/* @__PURE__ */ j(f, {
|
|
64
|
-
variant: "outline",
|
|
65
|
-
size: "sm",
|
|
66
|
-
children: [/* @__PURE__ */ A(c, { className: "mr-2 h-4 w-4" }), "Save Draft"]
|
|
67
|
-
}),
|
|
68
|
-
/* @__PURE__ */ j(f, {
|
|
69
|
-
variant: "outline",
|
|
70
|
-
size: "sm",
|
|
71
|
-
children: [/* @__PURE__ */ A(s, { className: "mr-2 h-4 w-4" }), "Test Run"]
|
|
72
|
-
}),
|
|
73
|
-
/* @__PURE__ */ j(f, {
|
|
74
|
-
size: "sm",
|
|
75
|
-
children: [/* @__PURE__ */ A(l, { className: "mr-2 h-4 w-4" }), "Publish"]
|
|
76
|
-
})
|
|
77
|
-
]
|
|
78
|
-
})]
|
|
79
|
-
}),
|
|
80
|
-
/* @__PURE__ */ A(C, { children: "Design an automation visually — pick what triggers it, drag in actions and conditions, then test and publish. Use the builder to wire up flows like — when a high-priority incident is raised, notify the owner and open a work order — without writing any code." }),
|
|
81
|
-
/* @__PURE__ */ A(S, {
|
|
82
|
-
storageKey: "assethandler-workflow-builder",
|
|
83
|
-
steps: [
|
|
84
|
-
{
|
|
85
|
-
id: "configure",
|
|
86
|
-
label: "Name it and pick a trigger",
|
|
87
|
-
description: "Set what starts the workflow before adding steps.",
|
|
88
|
-
done: !!(r && u)
|
|
89
|
-
},
|
|
90
|
-
{
|
|
91
|
-
id: "nodes",
|
|
92
|
-
label: "Drag nodes onto the canvas",
|
|
93
|
-
description: "Add actions and conditions from the node palette."
|
|
94
|
-
},
|
|
95
|
-
{
|
|
96
|
-
id: "templates",
|
|
97
|
-
label: "Or start from a template",
|
|
98
|
-
description: "Adapt a proven workflow instead of building from scratch.",
|
|
99
|
-
onClick: () => n("/workflows/workflow-templates")
|
|
100
|
-
}
|
|
101
|
-
]
|
|
102
|
-
}),
|
|
103
|
-
/* @__PURE__ */ j("div", {
|
|
104
|
-
className: "grid gap-6 lg:grid-cols-[320px_1fr]",
|
|
105
|
-
children: [/* @__PURE__ */ j("div", {
|
|
106
|
-
className: "space-y-4",
|
|
107
|
-
children: [/* @__PURE__ */ j(p, { children: [/* @__PURE__ */ A(h, { children: /* @__PURE__ */ A(g, {
|
|
108
|
-
className: "text-base",
|
|
109
|
-
children: "Workflow Configuration"
|
|
110
|
-
}) }), /* @__PURE__ */ j(m, {
|
|
111
|
-
className: "space-y-4",
|
|
112
|
-
children: [
|
|
113
|
-
/* @__PURE__ */ j("div", {
|
|
114
|
-
className: "space-y-2",
|
|
115
|
-
children: [/* @__PURE__ */ A(x, { children: "Workflow Name" }), /* @__PURE__ */ A(b, {
|
|
116
|
-
placeholder: "e.g. Asset Onboarding Flow",
|
|
117
|
-
value: r,
|
|
118
|
-
onChange: (e) => i(e.target.value)
|
|
119
|
-
})]
|
|
120
|
-
}),
|
|
121
|
-
/* @__PURE__ */ j("div", {
|
|
122
|
-
className: "space-y-2",
|
|
123
|
-
children: [/* @__PURE__ */ A(x, { children: "Description" }), /* @__PURE__ */ A(k, {
|
|
124
|
-
placeholder: "Describe what this workflow does...",
|
|
125
|
-
value: a,
|
|
126
|
-
onChange: (e) => o(e.target.value),
|
|
127
|
-
rows: 3
|
|
128
|
-
})]
|
|
129
|
-
}),
|
|
130
|
-
/* @__PURE__ */ j("div", {
|
|
131
|
-
className: "space-y-2",
|
|
132
|
-
children: [/* @__PURE__ */ A(x, { children: "Trigger Type" }), /* @__PURE__ */ j(w, {
|
|
133
|
-
value: u,
|
|
134
|
-
onValueChange: N,
|
|
135
|
-
children: [/* @__PURE__ */ A(D, { children: /* @__PURE__ */ A(O, { placeholder: "Select trigger..." }) }), /* @__PURE__ */ j(T, { children: [
|
|
136
|
-
/* @__PURE__ */ A(E, {
|
|
137
|
-
value: "event",
|
|
138
|
-
children: "Event-Based"
|
|
139
|
-
}),
|
|
140
|
-
/* @__PURE__ */ A(E, {
|
|
141
|
-
value: "scheduled",
|
|
142
|
-
children: "Scheduled"
|
|
143
|
-
}),
|
|
144
|
-
/* @__PURE__ */ A(E, {
|
|
145
|
-
value: "manual",
|
|
146
|
-
children: "Manual"
|
|
147
|
-
}),
|
|
148
|
-
/* @__PURE__ */ A(E, {
|
|
149
|
-
value: "webhook",
|
|
150
|
-
children: "Webhook"
|
|
151
|
-
}),
|
|
152
|
-
/* @__PURE__ */ A(E, {
|
|
153
|
-
value: "condition",
|
|
154
|
-
children: "Condition-Based"
|
|
155
|
-
})
|
|
156
|
-
] })]
|
|
157
|
-
})]
|
|
158
|
-
}),
|
|
159
|
-
/* @__PURE__ */ j("div", {
|
|
160
|
-
className: "space-y-2",
|
|
161
|
-
children: [/* @__PURE__ */ A(x, { children: "Category" }), /* @__PURE__ */ j(w, {
|
|
162
|
-
value: P,
|
|
163
|
-
onValueChange: F,
|
|
164
|
-
children: [/* @__PURE__ */ A(D, { children: /* @__PURE__ */ A(O, { placeholder: "Select category..." }) }), /* @__PURE__ */ j(T, { children: [
|
|
165
|
-
/* @__PURE__ */ A(E, {
|
|
166
|
-
value: "asset-management",
|
|
167
|
-
children: "Asset Management"
|
|
168
|
-
}),
|
|
169
|
-
/* @__PURE__ */ A(E, {
|
|
170
|
-
value: "maintenance",
|
|
171
|
-
children: "Maintenance"
|
|
172
|
-
}),
|
|
173
|
-
/* @__PURE__ */ A(E, {
|
|
174
|
-
value: "itil",
|
|
175
|
-
children: "ITIL"
|
|
176
|
-
}),
|
|
177
|
-
/* @__PURE__ */ A(E, {
|
|
178
|
-
value: "compliance",
|
|
179
|
-
children: "Compliance"
|
|
180
|
-
}),
|
|
181
|
-
/* @__PURE__ */ A(E, {
|
|
182
|
-
value: "security",
|
|
183
|
-
children: "Security"
|
|
184
|
-
}),
|
|
185
|
-
/* @__PURE__ */ A(E, {
|
|
186
|
-
value: "finance",
|
|
187
|
-
children: "Finance"
|
|
188
|
-
})
|
|
189
|
-
] })]
|
|
190
|
-
})]
|
|
191
|
-
})
|
|
192
|
-
]
|
|
193
|
-
})] }), /* @__PURE__ */ j(p, { children: [/* @__PURE__ */ A(h, { children: /* @__PURE__ */ A(g, {
|
|
194
|
-
className: "text-base",
|
|
195
|
-
children: "Node Palette"
|
|
196
|
-
}) }), /* @__PURE__ */ A(m, {
|
|
197
|
-
className: "space-y-2",
|
|
198
|
-
children: M.map((e) => {
|
|
199
|
-
let t = e.icon;
|
|
200
|
-
return /* @__PURE__ */ j("div", {
|
|
201
|
-
className: "flex items-center gap-3 rounded-lg border p-3 cursor-grab hover:bg-bg-sunken/50 transition-colors",
|
|
202
|
-
children: [/* @__PURE__ */ A("div", {
|
|
203
|
-
className: "rounded-md bg-action-primary-bg/10 p-2",
|
|
204
|
-
children: /* @__PURE__ */ A(t, { className: "h-4 w-4 text-primary" })
|
|
205
|
-
}), /* @__PURE__ */ j("div", { children: [/* @__PURE__ */ A("p", {
|
|
206
|
-
className: "text-sm font-medium",
|
|
207
|
-
children: e.label
|
|
208
|
-
}), /* @__PURE__ */ A("p", {
|
|
209
|
-
className: "text-xs text-text-secondary",
|
|
210
|
-
children: e.description
|
|
211
|
-
})] })]
|
|
212
|
-
}, e.label);
|
|
213
|
-
})
|
|
214
|
-
})] })]
|
|
215
|
-
}), /* @__PURE__ */ j(_, {
|
|
216
|
-
className: "min-h-[600px]",
|
|
217
|
-
children: [/* @__PURE__ */ A(h, {
|
|
218
|
-
className: "px-0 pt-0",
|
|
219
|
-
children: /* @__PURE__ */ j("div", {
|
|
220
|
-
className: "flex items-center justify-between",
|
|
221
|
-
children: [/* @__PURE__ */ A(g, {
|
|
222
|
-
className: "text-base",
|
|
223
|
-
children: "Workflow Canvas"
|
|
224
|
-
}), /* @__PURE__ */ j("div", {
|
|
225
|
-
className: "flex gap-2",
|
|
226
|
-
children: [
|
|
227
|
-
/* @__PURE__ */ A(f, {
|
|
228
|
-
variant: "outline",
|
|
229
|
-
size: "sm",
|
|
230
|
-
children: "Zoom In"
|
|
231
|
-
}),
|
|
232
|
-
/* @__PURE__ */ A(f, {
|
|
233
|
-
variant: "outline",
|
|
234
|
-
size: "sm",
|
|
235
|
-
children: "Zoom Out"
|
|
236
|
-
}),
|
|
237
|
-
/* @__PURE__ */ A(f, {
|
|
238
|
-
variant: "outline",
|
|
239
|
-
size: "sm",
|
|
240
|
-
children: "Fit View"
|
|
241
|
-
})
|
|
242
|
-
]
|
|
243
|
-
})]
|
|
244
|
-
})
|
|
245
|
-
}), /* @__PURE__ */ A(m, {
|
|
246
|
-
className: "flex-1 px-0 pb-0",
|
|
247
|
-
children: /* @__PURE__ */ A("div", {
|
|
248
|
-
className: "flex h-[500px] items-center justify-center rounded-lg border-2 border-dashed border-muted-foreground/25 bg-bg-sunken/20",
|
|
249
|
-
children: /* @__PURE__ */ A(y, {
|
|
250
|
-
illustration: "onboarding",
|
|
251
|
-
title: "Drag nodes here to build your workflow",
|
|
252
|
-
description: "Select a trigger to start, then add actions and conditions from the node palette."
|
|
253
|
-
})
|
|
254
|
-
})
|
|
255
|
-
})]
|
|
256
|
-
})]
|
|
257
|
-
})
|
|
258
|
-
]
|
|
259
|
-
});
|
|
260
|
-
}
|
|
261
|
-
//#endregion
|
|
262
|
-
export { N as WorkflowsWorkflowBuilderPage };
|
|
263
|
-
|
|
264
|
-
//# sourceMappingURL=WorkflowsWorkflowBuilderPage.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"WorkflowsWorkflowBuilderPage.js","names":[],"sources":["../../../src/assethandler/pages/WorkflowsWorkflowBuilderPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport {\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Input,\n Label,\n Textarea,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n GradientText,\n EmphasisPanel,\n PagePurpose,\n NextSteps,\n IllustratedEmptyState,\n} from '@burdenoff/fe-libs/ui';\nimport {\n Save,\n Play,\n Upload,\n ArrowLeft,\n Zap,\n Clock,\n GitBranch,\n Mail,\n Bell,\n Database,\n} from 'lucide-react';\nimport { useNavigate } from 'react-router-dom';\n\nconst nodeTypes = [\n { icon: Zap, label: 'Trigger', description: 'Start the workflow' },\n { icon: GitBranch, label: 'Condition', description: 'Branch logic' },\n { icon: Clock, label: 'Delay', description: 'Wait for time' },\n { icon: Mail, label: 'Send Email', description: 'Email notification' },\n { icon: Bell, label: 'Notify', description: 'Push notification' },\n { icon: Database, label: 'Update Record', description: 'Modify data' },\n];\n\nexport function WorkflowsWorkflowBuilderPage() {\n const navigate = useNavigate();\n const [name, setName] = useState('');\n const [description, setDescription] = useState('');\n const [triggerType, setTriggerType] = useState('');\n const [category, setCategory] = useState('');\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-3\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => navigate('/workflows/workflow-list')}>\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Workflow Builder</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n Design and configure automated workflows visually.\n </p>\n </div>\n </div>\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\">\n <Save className=\"mr-2 h-4 w-4\" />\n Save Draft\n </Button>\n <Button variant=\"outline\" size=\"sm\">\n <Play className=\"mr-2 h-4 w-4\" />\n Test Run\n </Button>\n <Button size=\"sm\">\n <Upload className=\"mr-2 h-4 w-4\" />\n Publish\n </Button>\n </div>\n </div>\n\n <PagePurpose>\n Design an automation visually — pick what triggers it, drag in actions and conditions, then\n test and publish. Use the builder to wire up flows like — when a high-priority incident is\n raised, notify the owner and open a work order — without writing any code.\n </PagePurpose>\n\n <NextSteps\n storageKey=\"assethandler-workflow-builder\"\n steps={[\n {\n id: 'configure',\n label: 'Name it and pick a trigger',\n description: 'Set what starts the workflow before adding steps.',\n done: Boolean(name && triggerType),\n },\n {\n id: 'nodes',\n label: 'Drag nodes onto the canvas',\n description: 'Add actions and conditions from the node palette.',\n },\n {\n id: 'templates',\n label: 'Or start from a template',\n description: 'Adapt a proven workflow instead of building from scratch.',\n onClick: () => navigate('/workflows/workflow-templates'),\n },\n ]}\n />\n\n <div className=\"grid gap-6 lg:grid-cols-[320px_1fr]\">\n <div className=\"space-y-4\">\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base\">Workflow Configuration</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Label>Workflow Name</Label>\n <Input\n placeholder=\"e.g. Asset Onboarding Flow\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Description</Label>\n <Textarea\n placeholder=\"Describe what this workflow does...\"\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n rows={3}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Trigger Type</Label>\n <Select value={triggerType} onValueChange={setTriggerType}>\n <SelectTrigger>\n <SelectValue placeholder=\"Select trigger...\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"event\">Event-Based</SelectItem>\n <SelectItem value=\"scheduled\">Scheduled</SelectItem>\n <SelectItem value=\"manual\">Manual</SelectItem>\n <SelectItem value=\"webhook\">Webhook</SelectItem>\n <SelectItem value=\"condition\">Condition-Based</SelectItem>\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-2\">\n <Label>Category</Label>\n <Select value={category} onValueChange={setCategory}>\n <SelectTrigger>\n <SelectValue placeholder=\"Select category...\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"asset-management\">Asset Management</SelectItem>\n <SelectItem value=\"maintenance\">Maintenance</SelectItem>\n <SelectItem value=\"itil\">ITIL</SelectItem>\n <SelectItem value=\"compliance\">Compliance</SelectItem>\n <SelectItem value=\"security\">Security</SelectItem>\n <SelectItem value=\"finance\">Finance</SelectItem>\n </SelectContent>\n </Select>\n </div>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base\">Node Palette</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n {nodeTypes.map((node) => {\n const Icon = node.icon;\n return (\n <div\n key={node.label}\n className=\"flex items-center gap-3 rounded-lg border p-3 cursor-grab hover:bg-bg-sunken/50 transition-colors\"\n >\n <div className=\"rounded-md bg-action-primary-bg/10 p-2\">\n <Icon className=\"h-4 w-4 text-primary\" />\n </div>\n <div>\n <p className=\"text-sm font-medium\">{node.label}</p>\n <p className=\"text-xs text-text-secondary\">{node.description}</p>\n </div>\n </div>\n );\n })}\n </CardContent>\n </Card>\n </div>\n\n <EmphasisPanel className=\"min-h-[600px]\">\n <CardHeader className=\"px-0 pt-0\">\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-base\">Workflow Canvas</CardTitle>\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\">\n Zoom In\n </Button>\n <Button variant=\"outline\" size=\"sm\">\n Zoom Out\n </Button>\n <Button variant=\"outline\" size=\"sm\">\n Fit View\n </Button>\n </div>\n </div>\n </CardHeader>\n <CardContent className=\"flex-1 px-0 pb-0\">\n <div className=\"flex h-[500px] items-center justify-center rounded-lg border-2 border-dashed border-muted-foreground/25 bg-bg-sunken/20\">\n <IllustratedEmptyState\n illustration=\"onboarding\"\n title=\"Drag nodes here to build your workflow\"\n description=\"Select a trigger to start, then add actions and conditions from the node palette.\"\n />\n </div>\n </CardContent>\n </EmphasisPanel>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,206 +0,0 @@
|
|
|
1
|
-
import { useAssetHandlerStore as e } from "../store/assethandlerStore.js";
|
|
2
|
-
import { useState as t } from "react";
|
|
3
|
-
import { CheckCircle2 as n, Clock as r, Download as i, Filter as a, Play as o, RefreshCw as s, XCircle as c } from "lucide-react";
|
|
4
|
-
import { Badge as l, Button as u, Card as d, CardContent as f, CardHeader as p, CardTitle as m, GlassCard as h, GradientText as g, IllustratedEmptyState as _, Input as v, PagePurpose as y, Select as b, SelectContent as x, SelectItem as S, SelectTrigger as C, SelectValue as w, Table as T, TableBody as E, TableCell as D, TableHead as O, TableHeader as k, TableRow as A } from "@burdenoff/fe-libs/ui";
|
|
5
|
-
import { jsx as j, jsxs as M } from "react/jsx-runtime";
|
|
6
|
-
//#region src/assethandler/pages/WorkflowsWorkflowExecutionsPage.tsx
|
|
7
|
-
function N() {
|
|
8
|
-
let { workflowExecutions: N } = e(), [P, F] = t("all"), [I, L] = t(""), R = N.filter((e) => !(P !== "all" && e.status !== P || I && !e.workflowName.toLowerCase().includes(I.toLowerCase()))), z = N.length, B = N.filter((e) => e.status === "completed").length, V = N.filter((e) => e.status === "failed").length, H = N.filter((e) => e.status === "running").length, U = z > 0 ? Math.round(B / z * 100) : 0, W = {
|
|
9
|
-
running: {
|
|
10
|
-
variant: "default",
|
|
11
|
-
icon: o
|
|
12
|
-
},
|
|
13
|
-
completed: {
|
|
14
|
-
variant: "secondary",
|
|
15
|
-
icon: n
|
|
16
|
-
},
|
|
17
|
-
failed: {
|
|
18
|
-
variant: "destructive",
|
|
19
|
-
icon: c
|
|
20
|
-
},
|
|
21
|
-
cancelled: {
|
|
22
|
-
variant: "outline",
|
|
23
|
-
icon: c
|
|
24
|
-
}
|
|
25
|
-
};
|
|
26
|
-
return /* @__PURE__ */ M("div", {
|
|
27
|
-
className: "space-y-6 p-6",
|
|
28
|
-
children: [
|
|
29
|
-
/* @__PURE__ */ M("div", {
|
|
30
|
-
className: "flex items-center justify-between",
|
|
31
|
-
children: [/* @__PURE__ */ M("div", { children: [/* @__PURE__ */ j("h1", {
|
|
32
|
-
className: "text-2xl font-semibold",
|
|
33
|
-
children: /* @__PURE__ */ j(g, { children: "Workflow Executions" })
|
|
34
|
-
}), /* @__PURE__ */ j("p", {
|
|
35
|
-
className: "text-sm text-text-secondary",
|
|
36
|
-
children: "Monitor and review workflow execution history and performance."
|
|
37
|
-
})] }), /* @__PURE__ */ M("div", {
|
|
38
|
-
className: "flex gap-2",
|
|
39
|
-
children: [/* @__PURE__ */ M(u, {
|
|
40
|
-
variant: "outline",
|
|
41
|
-
size: "sm",
|
|
42
|
-
children: [/* @__PURE__ */ j(i, { className: "mr-2 h-4 w-4" }), "Export"]
|
|
43
|
-
}), /* @__PURE__ */ M(u, {
|
|
44
|
-
size: "sm",
|
|
45
|
-
children: [/* @__PURE__ */ j(s, { className: "mr-2 h-4 w-4" }), "Refresh"]
|
|
46
|
-
})]
|
|
47
|
-
})]
|
|
48
|
-
}),
|
|
49
|
-
/* @__PURE__ */ j(y, { children: "The run history of your automations — every time a workflow fired, whether it succeeded, how long it took and why it failed. Use it to confirm automations are working, investigate failures, and prove the system is doing its job reliably." }),
|
|
50
|
-
/* @__PURE__ */ M("div", {
|
|
51
|
-
className: "grid gap-4 md:grid-cols-4",
|
|
52
|
-
children: [
|
|
53
|
-
/* @__PURE__ */ M(h, {
|
|
54
|
-
treatment: "glass",
|
|
55
|
-
glow: !0,
|
|
56
|
-
className: "border-border-seam",
|
|
57
|
-
children: [/* @__PURE__ */ M(p, {
|
|
58
|
-
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
59
|
-
children: [/* @__PURE__ */ j(m, {
|
|
60
|
-
className: "text-sm font-medium",
|
|
61
|
-
children: "Total Executions"
|
|
62
|
-
}), /* @__PURE__ */ j(o, { className: "h-4 w-4 text-text-secondary" })]
|
|
63
|
-
}), /* @__PURE__ */ M(f, { children: [/* @__PURE__ */ j("div", {
|
|
64
|
-
className: "text-2xl font-bold tabular-nums",
|
|
65
|
-
children: z
|
|
66
|
-
}), /* @__PURE__ */ j("p", {
|
|
67
|
-
className: "text-xs text-text-secondary",
|
|
68
|
-
children: "All time"
|
|
69
|
-
})] })]
|
|
70
|
-
}),
|
|
71
|
-
/* @__PURE__ */ M(h, {
|
|
72
|
-
treatment: "metric",
|
|
73
|
-
className: "border-border-seam",
|
|
74
|
-
children: [/* @__PURE__ */ M(p, {
|
|
75
|
-
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
76
|
-
children: [/* @__PURE__ */ j(m, {
|
|
77
|
-
className: "text-sm font-medium",
|
|
78
|
-
children: "Success Rate"
|
|
79
|
-
}), /* @__PURE__ */ j(n, { className: "h-4 w-4 text-status-success-text" })]
|
|
80
|
-
}), /* @__PURE__ */ M(f, { children: [/* @__PURE__ */ M("div", {
|
|
81
|
-
className: "text-2xl font-bold tabular-nums",
|
|
82
|
-
children: [U, "%"]
|
|
83
|
-
}), /* @__PURE__ */ M("p", {
|
|
84
|
-
className: "text-xs text-text-secondary",
|
|
85
|
-
children: [B, " completed successfully"]
|
|
86
|
-
})] })]
|
|
87
|
-
}),
|
|
88
|
-
/* @__PURE__ */ M(h, {
|
|
89
|
-
treatment: "metric",
|
|
90
|
-
className: "border-border-seam",
|
|
91
|
-
children: [/* @__PURE__ */ M(p, {
|
|
92
|
-
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
93
|
-
children: [/* @__PURE__ */ j(m, {
|
|
94
|
-
className: "text-sm font-medium",
|
|
95
|
-
children: "Failed"
|
|
96
|
-
}), /* @__PURE__ */ j(c, { className: "h-4 w-4 text-status-error-text" })]
|
|
97
|
-
}), /* @__PURE__ */ M(f, { children: [/* @__PURE__ */ j("div", {
|
|
98
|
-
className: "text-2xl font-bold tabular-nums",
|
|
99
|
-
children: V
|
|
100
|
-
}), /* @__PURE__ */ j("p", {
|
|
101
|
-
className: "text-xs text-text-secondary",
|
|
102
|
-
children: "Requires attention"
|
|
103
|
-
})] })]
|
|
104
|
-
}),
|
|
105
|
-
/* @__PURE__ */ M(h, {
|
|
106
|
-
treatment: "metric",
|
|
107
|
-
className: "border-border-seam",
|
|
108
|
-
children: [/* @__PURE__ */ M(p, {
|
|
109
|
-
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
110
|
-
children: [/* @__PURE__ */ j(m, {
|
|
111
|
-
className: "text-sm font-medium",
|
|
112
|
-
children: "Currently Running"
|
|
113
|
-
}), /* @__PURE__ */ j(r, { className: "h-4 w-4 text-status-info-text" })]
|
|
114
|
-
}), /* @__PURE__ */ M(f, { children: [/* @__PURE__ */ j("div", {
|
|
115
|
-
className: "text-2xl font-bold tabular-nums",
|
|
116
|
-
children: H
|
|
117
|
-
}), /* @__PURE__ */ j("p", {
|
|
118
|
-
className: "text-xs text-text-secondary",
|
|
119
|
-
children: "In progress now"
|
|
120
|
-
})] })]
|
|
121
|
-
})
|
|
122
|
-
]
|
|
123
|
-
}),
|
|
124
|
-
/* @__PURE__ */ M(d, { children: [/* @__PURE__ */ j(p, { children: /* @__PURE__ */ M("div", {
|
|
125
|
-
className: "flex items-center justify-between",
|
|
126
|
-
children: [/* @__PURE__ */ j(m, { children: "Execution History" }), /* @__PURE__ */ M("div", {
|
|
127
|
-
className: "flex items-center gap-2",
|
|
128
|
-
children: [/* @__PURE__ */ j(v, {
|
|
129
|
-
placeholder: "Search workflows...",
|
|
130
|
-
value: I,
|
|
131
|
-
onChange: (e) => L(e.target.value),
|
|
132
|
-
className: "w-[200px]"
|
|
133
|
-
}), /* @__PURE__ */ M(b, {
|
|
134
|
-
value: P,
|
|
135
|
-
onValueChange: F,
|
|
136
|
-
children: [/* @__PURE__ */ M(C, {
|
|
137
|
-
className: "w-[150px]",
|
|
138
|
-
children: [/* @__PURE__ */ j(a, { className: "mr-2 h-4 w-4" }), /* @__PURE__ */ j(w, { placeholder: "Status" })]
|
|
139
|
-
}), /* @__PURE__ */ M(x, { children: [
|
|
140
|
-
/* @__PURE__ */ j(S, {
|
|
141
|
-
value: "all",
|
|
142
|
-
children: "All Statuses"
|
|
143
|
-
}),
|
|
144
|
-
/* @__PURE__ */ j(S, {
|
|
145
|
-
value: "running",
|
|
146
|
-
children: "Running"
|
|
147
|
-
}),
|
|
148
|
-
/* @__PURE__ */ j(S, {
|
|
149
|
-
value: "completed",
|
|
150
|
-
children: "Completed"
|
|
151
|
-
}),
|
|
152
|
-
/* @__PURE__ */ j(S, {
|
|
153
|
-
value: "failed",
|
|
154
|
-
children: "Failed"
|
|
155
|
-
}),
|
|
156
|
-
/* @__PURE__ */ j(S, {
|
|
157
|
-
value: "cancelled",
|
|
158
|
-
children: "Cancelled"
|
|
159
|
-
})
|
|
160
|
-
] })]
|
|
161
|
-
})]
|
|
162
|
-
})]
|
|
163
|
-
}) }), /* @__PURE__ */ M(f, { children: [/* @__PURE__ */ M(T, { children: [/* @__PURE__ */ j(k, { children: /* @__PURE__ */ M(A, { children: [
|
|
164
|
-
/* @__PURE__ */ j(O, { children: "Execution ID" }),
|
|
165
|
-
/* @__PURE__ */ j(O, { children: "Workflow" }),
|
|
166
|
-
/* @__PURE__ */ j(O, { children: "Status" }),
|
|
167
|
-
/* @__PURE__ */ j(O, { children: "Triggered By" }),
|
|
168
|
-
/* @__PURE__ */ j(O, { children: "Started At" }),
|
|
169
|
-
/* @__PURE__ */ j(O, { children: "Duration" }),
|
|
170
|
-
/* @__PURE__ */ j(O, { children: "Error" })
|
|
171
|
-
] }) }), /* @__PURE__ */ j(E, { children: R.map((e) => {
|
|
172
|
-
let t = W[e.status] || W.cancelled, n = t.icon;
|
|
173
|
-
return /* @__PURE__ */ M(A, { children: [
|
|
174
|
-
/* @__PURE__ */ j(D, {
|
|
175
|
-
className: "font-mono text-sm",
|
|
176
|
-
children: e.id
|
|
177
|
-
}),
|
|
178
|
-
/* @__PURE__ */ j(D, {
|
|
179
|
-
className: "font-medium",
|
|
180
|
-
children: e.workflowName
|
|
181
|
-
}),
|
|
182
|
-
/* @__PURE__ */ j(D, { children: /* @__PURE__ */ M(l, {
|
|
183
|
-
variant: t.variant,
|
|
184
|
-
className: "gap-1",
|
|
185
|
-
children: [/* @__PURE__ */ j(n, { className: "h-3 w-3" }), e.status]
|
|
186
|
-
}) }),
|
|
187
|
-
/* @__PURE__ */ j(D, { children: e.triggeredBy }),
|
|
188
|
-
/* @__PURE__ */ j(D, { children: new Date(e.startedAt).toLocaleString() }),
|
|
189
|
-
/* @__PURE__ */ j(D, { children: e.duration == null ? "—" : `${e.duration}s` }),
|
|
190
|
-
/* @__PURE__ */ j(D, {
|
|
191
|
-
className: "max-w-[200px] truncate text-status-error-text",
|
|
192
|
-
children: e.error || "—"
|
|
193
|
-
})
|
|
194
|
-
] }, e.id);
|
|
195
|
-
}) })] }), R.length === 0 && /* @__PURE__ */ j(_, {
|
|
196
|
-
illustration: I || P !== "all" ? "empty-search" : "empty-data",
|
|
197
|
-
title: "No executions found",
|
|
198
|
-
description: I || P !== "all" ? "No runs match your search or filter — try clearing them." : "Once your workflows run, their execution history will appear here."
|
|
199
|
-
})] })] })
|
|
200
|
-
]
|
|
201
|
-
});
|
|
202
|
-
}
|
|
203
|
-
//#endregion
|
|
204
|
-
export { N as WorkflowsWorkflowExecutionsPage };
|
|
205
|
-
|
|
206
|
-
//# sourceMappingURL=WorkflowsWorkflowExecutionsPage.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"WorkflowsWorkflowExecutionsPage.js","names":[],"sources":["../../../src/assethandler/pages/WorkflowsWorkflowExecutionsPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Input,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n GradientText,\n GlassCard,\n PagePurpose,\n IllustratedEmptyState,\n} from '@burdenoff/fe-libs/ui';\nimport { Play, CheckCircle2, XCircle, Clock, RefreshCw, Download, Filter } from 'lucide-react';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\n\nexport function WorkflowsWorkflowExecutionsPage() {\n const { workflowExecutions } = useAssetHandlerStore();\n const [statusFilter, setStatusFilter] = useState('all');\n const [search, setSearch] = useState('');\n\n const filtered = workflowExecutions.filter((ex) => {\n if (statusFilter !== 'all' && ex.status !== statusFilter) return false;\n if (search && !ex.workflowName.toLowerCase().includes(search.toLowerCase())) return false;\n return true;\n });\n\n const total = workflowExecutions.length;\n const completed = workflowExecutions.filter((e) => e.status === 'completed').length;\n const failed = workflowExecutions.filter((e) => e.status === 'failed').length;\n const running = workflowExecutions.filter((e) => e.status === 'running').length;\n const successRate = total > 0 ? Math.round((completed / total) * 100) : 0;\n\n const statusConfig: Record<\n string,\n { variant: 'default' | 'secondary' | 'destructive' | 'outline'; icon: typeof Play }\n > = {\n running: { variant: 'default', icon: Play },\n completed: { variant: 'secondary', icon: CheckCircle2 },\n failed: { variant: 'destructive', icon: XCircle },\n cancelled: { variant: 'outline', icon: XCircle },\n };\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-semibold\">\n <GradientText>Workflow Executions</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n Monitor and review workflow execution history and performance.\n </p>\n </div>\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\">\n <Download className=\"mr-2 h-4 w-4\" />\n Export\n </Button>\n <Button size=\"sm\">\n <RefreshCw className=\"mr-2 h-4 w-4\" />\n Refresh\n </Button>\n </div>\n </div>\n\n <PagePurpose>\n The run history of your automations — every time a workflow fired, whether it succeeded, how\n long it took and why it failed. Use it to confirm automations are working, investigate\n failures, and prove the system is doing its job reliably.\n </PagePurpose>\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n <GlassCard treatment=\"glass\" glow className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Total Executions</CardTitle>\n <Play className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{total}</div>\n <p className=\"text-xs text-text-secondary\">All time</p>\n </CardContent>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Success Rate</CardTitle>\n <CheckCircle2 className=\"h-4 w-4 text-status-success-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{successRate}%</div>\n <p className=\"text-xs text-text-secondary\">{completed} completed successfully</p>\n </CardContent>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Failed</CardTitle>\n <XCircle className=\"h-4 w-4 text-status-error-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{failed}</div>\n <p className=\"text-xs text-text-secondary\">Requires attention</p>\n </CardContent>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Currently Running</CardTitle>\n <Clock className=\"h-4 w-4 text-status-info-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{running}</div>\n <p className=\"text-xs text-text-secondary\">In progress now</p>\n </CardContent>\n </GlassCard>\n </div>\n\n <Card>\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <CardTitle>Execution History</CardTitle>\n <div className=\"flex items-center gap-2\">\n <Input\n placeholder=\"Search workflows...\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className=\"w-[200px]\"\n />\n <Select value={statusFilter} onValueChange={setStatusFilter}>\n <SelectTrigger className=\"w-[150px]\">\n <Filter className=\"mr-2 h-4 w-4\" />\n <SelectValue placeholder=\"Status\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">All Statuses</SelectItem>\n <SelectItem value=\"running\">Running</SelectItem>\n <SelectItem value=\"completed\">Completed</SelectItem>\n <SelectItem value=\"failed\">Failed</SelectItem>\n <SelectItem value=\"cancelled\">Cancelled</SelectItem>\n </SelectContent>\n </Select>\n </div>\n </div>\n </CardHeader>\n <CardContent>\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Execution ID</TableHead>\n <TableHead>Workflow</TableHead>\n <TableHead>Status</TableHead>\n <TableHead>Triggered By</TableHead>\n <TableHead>Started At</TableHead>\n <TableHead>Duration</TableHead>\n <TableHead>Error</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {filtered.map((ex) => {\n const cfg = statusConfig[ex.status] || statusConfig.cancelled;\n const StatusIcon = cfg.icon;\n return (\n <TableRow key={ex.id}>\n <TableCell className=\"font-mono text-sm\">{ex.id}</TableCell>\n <TableCell className=\"font-medium\">{ex.workflowName}</TableCell>\n <TableCell>\n <Badge variant={cfg.variant} className=\"gap-1\">\n <StatusIcon className=\"h-3 w-3\" />\n {ex.status}\n </Badge>\n </TableCell>\n <TableCell>{ex.triggeredBy}</TableCell>\n <TableCell>{new Date(ex.startedAt).toLocaleString()}</TableCell>\n <TableCell>{ex.duration != null ? `${ex.duration}s` : '—'}</TableCell>\n <TableCell className=\"max-w-[200px] truncate text-status-error-text\">\n {ex.error || '—'}\n </TableCell>\n </TableRow>\n );\n })}\n </TableBody>\n </Table>\n {filtered.length === 0 && (\n <IllustratedEmptyState\n illustration={search || statusFilter !== 'all' ? 'empty-search' : 'empty-data'}\n title=\"No executions found\"\n description={\n search || statusFilter !== 'all'\n ? 'No runs match your search or filter — try clearing them.'\n : 'Once your workflows run, their execution history will appear here.'\n }\n />\n )}\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
|