@burdenoff/microfe-assethandler 2026.703.2 → 2026.703.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/dist/assethandler/AssetHandlerRoot.js +18 -18
  2. package/dist/assethandler/hooks/useAssetHandlerNavigate.js +19 -0
  3. package/dist/assethandler/hooks/useAssetHandlerNavigate.js.map +1 -0
  4. package/dist/assethandler/pages/AiPredictionsPage.js +29 -29
  5. package/dist/assethandler/pages/AnalyticsPage.js +154 -154
  6. package/dist/assethandler/pages/AssetsAssetCategoriesPage.js +48 -48
  7. package/dist/assethandler/pages/AssetsAssetCheckInOutPage.js +84 -84
  8. package/dist/assethandler/pages/AssetsAssetCheckInOutPage.js.map +1 -1
  9. package/dist/assethandler/pages/AssetsAssetCreatePage.js +82 -82
  10. package/dist/assethandler/pages/AssetsAssetCreatePage.js.map +1 -1
  11. package/dist/assethandler/pages/AssetsAssetDetailPage.js +104 -103
  12. package/dist/assethandler/pages/AssetsAssetDetailPage.js.map +1 -1
  13. package/dist/assethandler/pages/AssetsAssetListPage.js +132 -132
  14. package/dist/assethandler/pages/AssetsAssetListPage.js.map +1 -1
  15. package/dist/assethandler/pages/AssetsAssetTrackingPage.js +52 -52
  16. package/dist/assethandler/pages/CmdbBrowserPage.js +27 -27
  17. package/dist/assethandler/pages/DashboardPage.js +119 -119
  18. package/dist/assethandler/pages/DashboardPage.js.map +1 -1
  19. package/dist/assethandler/pages/DigitalTwinPage.js +22 -22
  20. package/dist/assethandler/pages/DiscoveryJobsPage.js +35 -35
  21. package/dist/assethandler/pages/EsgDashboardPage.js +32 -32
  22. package/dist/assethandler/pages/FinanceBudgetDetailPage.js +57 -56
  23. package/dist/assethandler/pages/FinanceBudgetDetailPage.js.map +1 -1
  24. package/dist/assethandler/pages/FinanceFinanceHubPage.js +98 -98
  25. package/dist/assethandler/pages/FinanceFinanceHubPage.js.map +1 -1
  26. package/dist/assethandler/pages/FinanceInvoiceDetailPage.js +58 -57
  27. package/dist/assethandler/pages/FinanceInvoiceDetailPage.js.map +1 -1
  28. package/dist/assethandler/pages/IotDevicesPage.js +29 -29
  29. package/dist/assethandler/pages/ItilChangeDetailPage.js +76 -75
  30. package/dist/assethandler/pages/ItilChangeDetailPage.js.map +1 -1
  31. package/dist/assethandler/pages/ItilChangeManagementPage.js +49 -49
  32. package/dist/assethandler/pages/ItilIncidentDetailPage.js +63 -62
  33. package/dist/assethandler/pages/ItilIncidentDetailPage.js.map +1 -1
  34. package/dist/assethandler/pages/ItilIncidentManagementPage.js +72 -72
  35. package/dist/assethandler/pages/ItilItilhubPage.js +112 -112
  36. package/dist/assethandler/pages/ItilItilhubPage.js.map +1 -1
  37. package/dist/assethandler/pages/ItilProblemDetailPage.js +61 -60
  38. package/dist/assethandler/pages/ItilProblemDetailPage.js.map +1 -1
  39. package/dist/assethandler/pages/ItilProblemManagementPage.js +46 -46
  40. package/dist/assethandler/pages/KnowledgeBasePage.js +28 -28
  41. package/dist/assethandler/pages/MaintenanceMaintenanceCalendarPage.js +52 -52
  42. package/dist/assethandler/pages/MaintenanceMaintenanceSchedulerPage.js +29 -29
  43. package/dist/assethandler/pages/OperationsMaintenanceDetailPage.js +58 -57
  44. package/dist/assethandler/pages/OperationsMaintenanceDetailPage.js.map +1 -1
  45. package/dist/assethandler/pages/OperationsOperationsHubPage.js +80 -80
  46. package/dist/assethandler/pages/OperationsOperationsHubPage.js.map +1 -1
  47. package/dist/assethandler/pages/OperationsWorkOrderDetailPage.js +49 -48
  48. package/dist/assethandler/pages/OperationsWorkOrderDetailPage.js.map +1 -1
  49. package/dist/assethandler/pages/PortfolioPortfolioOverviewPage.js +52 -52
  50. package/dist/assethandler/pages/ProvenancePage.js +36 -36
  51. package/dist/assethandler/pages/SamLicensesPage.js +27 -27
  52. package/dist/assethandler/pages/SecurityComplianceDetailPage.js +39 -38
  53. package/dist/assethandler/pages/SecurityComplianceDetailPage.js.map +1 -1
  54. package/dist/assethandler/pages/SecurityPolicyDetailPage.js +50 -49
  55. package/dist/assethandler/pages/SecurityPolicyDetailPage.js.map +1 -1
  56. package/dist/assethandler/pages/SecuritySecurityEventDetailPage.js +47 -46
  57. package/dist/assethandler/pages/SecuritySecurityEventDetailPage.js.map +1 -1
  58. package/dist/assethandler/pages/SecuritySecurityHubPage.js +104 -104
  59. package/dist/assethandler/pages/SecuritySecurityHubPage.js.map +1 -1
  60. package/dist/assethandler/pages/TransactionsTransactionDetailPage.js +74 -73
  61. package/dist/assethandler/pages/TransactionsTransactionDetailPage.js.map +1 -1
  62. package/dist/assethandler/pages/TransactionsTransactionListPage.js +77 -77
  63. package/dist/assethandler/providers/AssetHandlerProvider.js +12 -12
  64. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"AssetsAssetCheckInOutPage.js","names":[],"sources":["../../../src/assethandler/pages/AssetsAssetCheckInOutPage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n Input,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n GradientText,\n EmphasisPanel,\n PagePurpose,\n IllustratedEmptyState,\n} from '@burdenoff/fe-libs/ui';\nimport { ArrowDownToLine, ArrowUpFromLine, Clock, Search, AlertTriangle } from 'lucide-react';\nimport { gql } from '@apollo/client';\nimport { useMutation, useQuery } from '@apollo/client/react';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\nimport { notify } from '../utils/toast';\n\n// ─── Backend types (mirror wspace-assethandler-svc AssetAssignment) ───────────\ntype AssignmentStatus = 'CHECKED_OUT' | 'OVERDUE' | 'RETURNED';\n\ninterface AssetAssignment {\n id: string;\n assetId: string;\n assetName: string;\n assignedTo: string;\n assignedBy: string;\n checkedOutAt: string;\n dueAt: string | null;\n checkedInAt: string | null;\n status: AssignmentStatus;\n notes: string | null;\n}\n\nconst ASSET_ASSIGNMENTS_QUERY = gql`\n query AssetHandlerAssetAssignments {\n assetAssignments {\n id\n assetId\n assetName\n assignedTo\n assignedBy\n checkedOutAt\n dueAt\n checkedInAt\n status\n notes\n }\n }\n`;\n\nconst CHECK_OUT_ASSET_MUTATION = gql`\n mutation AssetHandlerCheckOutAsset($input: CheckOutAssetInput!) {\n checkOutAsset(input: $input) {\n id\n status\n }\n }\n`;\n\nconst CHECK_IN_ASSET_MUTATION = gql`\n mutation AssetHandlerCheckInAsset($input: CheckInAssetInput!) {\n checkInAsset(input: $input) {\n id\n status\n }\n }\n`;\n\nconst statusColors: Record<AssignmentStatus, 'default' | 'secondary' | 'destructive' | 'outline'> =\n {\n CHECKED_OUT: 'default',\n RETURNED: 'secondary',\n OVERDUE: 'destructive',\n };\n\nconst statusLabels: Record<AssignmentStatus, string> = {\n CHECKED_OUT: 'checked out',\n RETURNED: 'returned',\n OVERDUE: 'overdue',\n};\n\nexport function AssetsAssetCheckInOutPage() {\n const { assets } = useAssetHandlerStore();\n const [searchQuery, setSearchQuery] = useState('');\n const [showCheckout, setShowCheckout] = useState(false);\n const [assetId, setAssetId] = useState('');\n const [assignedTo, setAssignedTo] = useState('');\n const [dueAt, setDueAt] = useState('');\n const [notes, setNotes] = useState('');\n\n const { data, loading, refetch } = useQuery<{ assetAssignments: AssetAssignment[] }>(\n ASSET_ASSIGNMENTS_QUERY,\n { fetchPolicy: 'cache-and-network' }\n );\n\n const [checkOutAsset, { loading: checkingOut }] = useMutation(CHECK_OUT_ASSET_MUTATION, {\n onCompleted: () => {\n notify.success('Asset checked out', 'The assignment has been recorded.');\n setShowCheckout(false);\n setAssetId('');\n setAssignedTo('');\n setDueAt('');\n setNotes('');\n void refetch();\n },\n onError: (error) => notify.error('Check-out failed', error.message),\n });\n\n const [checkInAsset, { loading: checkingIn }] = useMutation(CHECK_IN_ASSET_MUTATION, {\n onCompleted: () => {\n notify.success('Asset checked in', 'The asset has been returned.');\n void refetch();\n },\n onError: (error) => notify.error('Check-in failed', error.message),\n });\n\n const assignments = useMemo(() => data?.assetAssignments ?? [], [data]);\n\n const activeCheckouts = assignments.filter((a) => a.status === 'CHECKED_OUT');\n const overdueCheckouts = assignments.filter((a) => a.status === 'OVERDUE');\n const returnedRecords = assignments.filter((a) => a.status === 'RETURNED');\n\n const filteredRecords = assignments.filter(\n (a) =>\n searchQuery === '' ||\n a.assetName.toLowerCase().includes(searchQuery.toLowerCase()) ||\n a.assignedTo.toLowerCase().includes(searchQuery.toLowerCase())\n );\n\n const submitCheckout = (event: React.FormEvent) => {\n event.preventDefault();\n if (!assetId || !assignedTo.trim()) {\n notify.warning('Missing details', 'Choose an asset and who is receiving it.');\n return;\n }\n void checkOutAsset({\n variables: {\n input: {\n assetId,\n assignedTo: assignedTo.trim(),\n dueAt: dueAt ? new Date(dueAt).toISOString() : null,\n notes: notes.trim() || null,\n },\n },\n });\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-bold\">\n <GradientText>Asset Check-In / Check-Out</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">Manage asset assignments and returns</p>\n </div>\n <div className=\"flex gap-2\">\n <Button size=\"sm\" onClick={() => setShowCheckout((v) => !v)}>\n <ArrowUpFromLine className=\"mr-2 h-4 w-4\" />\n Check Out\n </Button>\n </div>\n </div>\n\n <PagePurpose>\n Know who has what, right now. Check assets out to people for a job or loan period and check\n them back in on return. Use it to chase overdue items and make sure nothing walks off\n without a trace.\n </PagePurpose>\n\n {showCheckout && (\n <EmphasisPanel>\n <h2 className=\"text-sm font-semibold mb-3\">Check out an asset</h2>\n <form className=\"grid gap-3 md:grid-cols-2 lg:grid-cols-4\" onSubmit={submitCheckout}>\n <select\n className=\"rounded-md border px-3 py-2 bg-bg-base\"\n value={assetId}\n onChange={(event) => setAssetId(event.target.value)}\n aria-label=\"Asset to check out\"\n >\n <option value=\"\">Select an asset…</option>\n {assets.map((asset) => (\n <option key={asset.id} value={asset.id}>\n {asset.name} ({asset.assetTag})\n </option>\n ))}\n </select>\n <Input\n placeholder=\"Assign to (name or email)\"\n value={assignedTo}\n onChange={(event) => setAssignedTo(event.target.value)}\n />\n <Input\n type=\"date\"\n aria-label=\"Due date\"\n value={dueAt}\n onChange={(event) => setDueAt(event.target.value)}\n />\n <Input\n placeholder=\"Notes (optional)\"\n value={notes}\n onChange={(event) => setNotes(event.target.value)}\n />\n <div className=\"md:col-span-2 lg:col-span-4 flex gap-2\">\n <Button type=\"submit\" size=\"sm\" disabled={checkingOut}>\n {checkingOut ? 'Checking out…' : 'Confirm check-out'}\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setShowCheckout(false)}\n >\n Cancel\n </Button>\n </div>\n </form>\n </EmphasisPanel>\n )}\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n <EmphasisPanel>\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <ArrowUpFromLine className=\"h-4 w-4\" />\n Active Checkouts\n </div>\n <p className=\"text-2xl font-bold mt-1 tabular-nums\">{activeCheckouts.length}</p>\n </EmphasisPanel>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <AlertTriangle className=\"h-4 w-4 text-status-error-text\" />\n Overdue\n </div>\n <p className=\"text-2xl font-bold mt-1 text-status-error-text\">\n {overdueCheckouts.length}\n </p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <ArrowDownToLine className=\"h-4 w-4\" />\n Returned\n </div>\n <p className=\"text-2xl font-bold mt-1\">{returnedRecords.length}</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <Clock className=\"h-4 w-4\" />\n Total Records\n </div>\n <p className=\"text-2xl font-bold mt-1\">{assignments.length}</p>\n </CardContent>\n </Card>\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\n placeholder=\"Search by asset or person…\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"pl-9\"\n />\n </div>\n\n <Tabs defaultValue=\"all\">\n <TabsList>\n <TabsTrigger value=\"all\">All ({filteredRecords.length})</TabsTrigger>\n <TabsTrigger value=\"active\">Active ({activeCheckouts.length})</TabsTrigger>\n <TabsTrigger value=\"overdue\">Overdue ({overdueCheckouts.length})</TabsTrigger>\n <TabsTrigger value=\"returned\">Returned ({returnedRecords.length})</TabsTrigger>\n </TabsList>\n {(\n [\n ['all', null],\n ['active', 'CHECKED_OUT'],\n ['overdue', 'OVERDUE'],\n ['returned', 'RETURNED'],\n ] as const\n ).map(([tab, status]) => {\n const records =\n status === null ? filteredRecords : filteredRecords.filter((r) => r.status === status);\n return (\n <TabsContent key={tab} value={tab} className=\"mt-4\">\n <Card>\n <CardContent className=\"p-0\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b bg-bg-sunken/50\">\n <th className=\"text-left p-3 font-medium\">Asset</th>\n <th className=\"text-left p-3 font-medium\">Assigned To</th>\n <th className=\"text-left p-3 font-medium\">Checked Out</th>\n <th className=\"text-left p-3 font-medium\">Due</th>\n <th className=\"text-left p-3 font-medium\">Returned</th>\n <th className=\"text-left p-3 font-medium\">Status</th>\n <th className=\"text-right p-3 font-medium\">Action</th>\n </tr>\n </thead>\n <tbody>\n {records.map((rec) => (\n <tr key={rec.id} className=\"border-b hover:bg-bg-sunken/50\">\n <td className=\"p-3\">\n <p className=\"font-medium\">{rec.assetName}</p>\n <p className=\"text-xs text-text-secondary\">{rec.assetId}</p>\n </td>\n <td className=\"p-3\">\n <p className=\"text-sm\">{rec.assignedTo}</p>\n <p className=\"text-xs text-text-secondary\">by {rec.assignedBy}</p>\n </td>\n <td className=\"p-3 text-xs\">\n {new Date(rec.checkedOutAt).toLocaleDateString()}\n </td>\n <td className=\"p-3 text-xs\">\n {rec.dueAt ? new Date(rec.dueAt).toLocaleDateString() : '—'}\n </td>\n <td className=\"p-3 text-xs\">\n {rec.checkedInAt\n ? new Date(rec.checkedInAt).toLocaleDateString()\n : '—'}\n </td>\n <td className=\"p-3\">\n <Badge variant={statusColors[rec.status]}>\n {statusLabels[rec.status]}\n </Badge>\n </td>\n <td className=\"p-3 text-right\">\n {rec.status !== 'RETURNED' ? (\n <Button\n size=\"sm\"\n variant=\"outline\"\n disabled={checkingIn}\n onClick={() =>\n void checkInAsset({\n variables: { input: { assignmentId: rec.id } },\n })\n }\n >\n <ArrowDownToLine className=\"mr-1.5 h-3.5 w-3.5\" />\n Check In\n </Button>\n ) : null}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n {records.length === 0 && !loading && (\n <IllustratedEmptyState\n illustration={searchQuery ? 'empty-search' : 'empty-people'}\n title={searchQuery ? 'No matching records' : 'No check-in / out records'}\n description={\n searchQuery\n ? 'No records match your search — try a different name.'\n : 'Check an asset out to someone and the activity will appear here.'\n }\n />\n )}\n {loading && records.length === 0 ? (\n <div className=\"space-y-2 p-4\">\n {Array.from({ length: 4 }).map((_, i) => (\n <div\n key={i}\n className=\"h-8 rounded-md bg-bg-sunken motion-safe:animate-vc-shimmer\"\n />\n ))}\n </div>\n ) : null}\n </div>\n </CardContent>\n </Card>\n </TabsContent>\n );\n })}\n </Tabs>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"AssetsAssetCheckInOutPage.js","names":[],"sources":["../../../src/assethandler/pages/AssetsAssetCheckInOutPage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n Input,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n GradientText,\n EmphasisPanel,\n PagePurpose,\n IllustratedEmptyState,\n} from '@burdenoff/fe-libs/ui';\nimport { ArrowDownToLine, ArrowUpFromLine, Clock, Search, AlertTriangle } from 'lucide-react';\nimport { gql } from '@apollo/client';\nimport { useMutation, useQuery } from '@apollo/client/react';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\nimport { notify } from '../utils/toast';\n\n// ─── Backend types (mirror wspace-assethandler-svc AssetAssignment) ───────────\ntype AssignmentStatus = 'CHECKED_OUT' | 'OVERDUE' | 'RETURNED';\n\ninterface AssetAssignment {\n id: string;\n assetId: string;\n assetName: string;\n assignedTo: string;\n assignedBy: string;\n checkedOutAt: string;\n dueAt: string | null;\n checkedInAt: string | null;\n status: AssignmentStatus;\n notes: string | null;\n}\n\nconst ASSET_ASSIGNMENTS_QUERY = gql`\n query AssetHandlerAssetAssignments {\n assetAssignments {\n id\n assetId\n assetName\n assignedTo\n assignedBy\n checkedOutAt\n dueAt\n checkedInAt\n status\n notes\n }\n }\n`;\n\nconst CHECK_OUT_ASSET_MUTATION = gql`\n mutation AssetHandlerCheckOutAsset($input: CheckOutAssetInput!) {\n checkOutAsset(input: $input) {\n id\n status\n }\n }\n`;\n\nconst CHECK_IN_ASSET_MUTATION = gql`\n mutation AssetHandlerCheckInAsset($input: CheckInAssetInput!) {\n checkInAsset(input: $input) {\n id\n status\n }\n }\n`;\n\nconst statusColors: Record<AssignmentStatus, 'default' | 'secondary' | 'destructive' | 'outline'> =\n {\n CHECKED_OUT: 'default',\n RETURNED: 'secondary',\n OVERDUE: 'destructive',\n };\n\nconst statusLabels: Record<AssignmentStatus, string> = {\n CHECKED_OUT: 'checked out',\n RETURNED: 'returned',\n OVERDUE: 'overdue',\n};\n\nexport function AssetsAssetCheckInOutPage() {\n const { assets } = useAssetHandlerStore();\n const [searchQuery, setSearchQuery] = useState('');\n const [showCheckout, setShowCheckout] = useState(false);\n const [assetId, setAssetId] = useState('');\n const [assignedTo, setAssignedTo] = useState('');\n const [dueAt, setDueAt] = useState('');\n const [notes, setNotes] = useState('');\n\n const { data, loading, refetch } = useQuery<{ assetAssignments: AssetAssignment[] }>(\n ASSET_ASSIGNMENTS_QUERY,\n { fetchPolicy: 'cache-and-network' }\n );\n\n const [checkOutAsset, { loading: checkingOut }] = useMutation(CHECK_OUT_ASSET_MUTATION, {\n onCompleted: () => {\n notify.success('Asset checked out', 'The assignment has been recorded.');\n setShowCheckout(false);\n setAssetId('');\n setAssignedTo('');\n setDueAt('');\n setNotes('');\n void refetch();\n },\n onError: (error) => notify.error('Check-out failed', error.message),\n });\n\n const [checkInAsset, { loading: checkingIn }] = useMutation(CHECK_IN_ASSET_MUTATION, {\n onCompleted: () => {\n notify.success('Asset checked in', 'The asset has been returned.');\n void refetch();\n },\n onError: (error) => notify.error('Check-in failed', error.message),\n });\n\n const assignments = useMemo(() => data?.assetAssignments ?? [], [data]);\n\n const activeCheckouts = assignments.filter((a) => a.status === 'CHECKED_OUT');\n const overdueCheckouts = assignments.filter((a) => a.status === 'OVERDUE');\n const returnedRecords = assignments.filter((a) => a.status === 'RETURNED');\n\n const filteredRecords = assignments.filter(\n (a) =>\n searchQuery === '' ||\n a.assetName.toLowerCase().includes(searchQuery.toLowerCase()) ||\n a.assignedTo.toLowerCase().includes(searchQuery.toLowerCase())\n );\n\n const submitCheckout = (event: React.FormEvent) => {\n event.preventDefault();\n if (!assetId || !assignedTo.trim()) {\n notify.warning('Missing details', 'Choose an asset and who is receiving it.');\n return;\n }\n void checkOutAsset({\n variables: {\n input: {\n assetId,\n assignedTo: assignedTo.trim(),\n dueAt: dueAt ? new Date(dueAt).toISOString() : null,\n notes: notes.trim() || null,\n },\n },\n });\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-bold\">\n <GradientText>Asset Check-In / Check-Out</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">Manage asset assignments and returns</p>\n </div>\n <div className=\"flex gap-2\">\n <Button size=\"sm\" onClick={() => setShowCheckout((v) => !v)}>\n <ArrowUpFromLine className=\"mr-2 h-4 w-4\" />\n Check Out\n </Button>\n </div>\n </div>\n\n <PagePurpose>\n Know who has what, right now. Check assets out to people for a job or loan period and check\n them back in on return. Use it to chase overdue items and make sure nothing walks off\n without a trace.\n </PagePurpose>\n\n {showCheckout && (\n <EmphasisPanel>\n <h2 className=\"text-sm font-semibold mb-3\">Check out an asset</h2>\n <form className=\"grid gap-3 md:grid-cols-2 lg:grid-cols-4\" onSubmit={submitCheckout}>\n <select\n className=\"rounded-md border px-3 py-2 bg-bg-base\"\n value={assetId}\n onChange={(event) => setAssetId(event.target.value)}\n aria-label=\"Asset to check out\"\n >\n <option value=\"\">Select an asset…</option>\n {assets.map((asset) => (\n <option key={asset.id} value={asset.id}>\n {asset.name} ({asset.assetTag})\n </option>\n ))}\n </select>\n <Input\n placeholder=\"Assign to (name or email)\"\n value={assignedTo}\n onChange={(event) => setAssignedTo(event.target.value)}\n />\n <Input\n type=\"date\"\n aria-label=\"Due date\"\n value={dueAt}\n onChange={(event) => setDueAt(event.target.value)}\n />\n <Input\n placeholder=\"Notes (optional)\"\n value={notes}\n onChange={(event) => setNotes(event.target.value)}\n />\n <div className=\"md:col-span-2 lg:col-span-4 flex gap-2\">\n <Button type=\"submit\" size=\"sm\" disabled={checkingOut}>\n {checkingOut ? 'Checking out…' : 'Confirm check-out'}\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setShowCheckout(false)}\n >\n Cancel\n </Button>\n </div>\n </form>\n </EmphasisPanel>\n )}\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n <EmphasisPanel>\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <ArrowUpFromLine className=\"h-4 w-4\" />\n Active Checkouts\n </div>\n <p className=\"text-2xl font-bold mt-1 tabular-nums\">{activeCheckouts.length}</p>\n </EmphasisPanel>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <AlertTriangle className=\"h-4 w-4 text-status-error-text\" />\n Overdue\n </div>\n <p className=\"text-2xl font-bold mt-1 text-status-error-text\">\n {overdueCheckouts.length}\n </p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <ArrowDownToLine className=\"h-4 w-4\" />\n Returned\n </div>\n <p className=\"text-2xl font-bold mt-1\">{returnedRecords.length}</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <Clock className=\"h-4 w-4\" />\n Total Records\n </div>\n <p className=\"text-2xl font-bold mt-1\">{assignments.length}</p>\n </CardContent>\n </Card>\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\n placeholder=\"Search by asset or person…\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"pl-9\"\n />\n </div>\n\n <Tabs defaultValue=\"all\">\n <TabsList>\n <TabsTrigger value=\"all\">All ({filteredRecords.length})</TabsTrigger>\n <TabsTrigger value=\"active\">Active ({activeCheckouts.length})</TabsTrigger>\n <TabsTrigger value=\"overdue\">Overdue ({overdueCheckouts.length})</TabsTrigger>\n <TabsTrigger value=\"returned\">Returned ({returnedRecords.length})</TabsTrigger>\n </TabsList>\n {(\n [\n ['all', null],\n ['active', 'CHECKED_OUT'],\n ['overdue', 'OVERDUE'],\n ['returned', 'RETURNED'],\n ] as const\n ).map(([tab, status]) => {\n const records =\n status === null ? filteredRecords : filteredRecords.filter((r) => r.status === status);\n return (\n <TabsContent key={tab} value={tab} className=\"mt-4\">\n <Card>\n <CardContent className=\"p-0\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b bg-bg-sunken/50\">\n <th className=\"text-left p-3 font-medium\">Asset</th>\n <th className=\"text-left p-3 font-medium\">Assigned To</th>\n <th className=\"text-left p-3 font-medium\">Checked Out</th>\n <th className=\"text-left p-3 font-medium\">Due</th>\n <th className=\"text-left p-3 font-medium\">Returned</th>\n <th className=\"text-left p-3 font-medium\">Status</th>\n <th className=\"text-right p-3 font-medium\">Action</th>\n </tr>\n </thead>\n <tbody>\n {records.map((rec) => (\n <tr key={rec.id} className=\"border-b hover:bg-bg-sunken/50\">\n <td className=\"p-3\">\n <p className=\"font-medium\">{rec.assetName}</p>\n <p className=\"text-xs text-text-secondary\">{rec.assetId}</p>\n </td>\n <td className=\"p-3\">\n <p className=\"text-sm\">{rec.assignedTo}</p>\n <p className=\"text-xs text-text-secondary\">by {rec.assignedBy}</p>\n </td>\n <td className=\"p-3 text-xs\">\n {new Date(rec.checkedOutAt).toLocaleDateString()}\n </td>\n <td className=\"p-3 text-xs\">\n {rec.dueAt ? new Date(rec.dueAt).toLocaleDateString() : '—'}\n </td>\n <td className=\"p-3 text-xs\">\n {rec.checkedInAt\n ? new Date(rec.checkedInAt).toLocaleDateString()\n : '—'}\n </td>\n <td className=\"p-3\">\n <Badge variant={statusColors[rec.status]}>\n {statusLabels[rec.status]}\n </Badge>\n </td>\n <td className=\"p-3 text-right\">\n {rec.status !== 'RETURNED' ? (\n <Button\n size=\"sm\"\n variant=\"outline\"\n disabled={checkingIn}\n onClick={() =>\n void checkInAsset({\n variables: { input: { assignmentId: rec.id } },\n })\n }\n >\n <ArrowDownToLine className=\"mr-1.5 h-3.5 w-3.5\" />\n Check In\n </Button>\n ) : null}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n {records.length === 0 && !loading && (\n <IllustratedEmptyState\n illustration={searchQuery ? 'empty-search' : 'empty-people'}\n title={searchQuery ? 'No matching records' : 'No check-in / out records'}\n description={\n searchQuery\n ? 'No records match your search — try a different name.'\n : 'Check an asset out to someone and the activity will appear here.'\n }\n />\n )}\n {loading && records.length === 0 ? (\n <div className=\"space-y-2 p-4\">\n {Array.from({ length: 4 }).map((_, i) => (\n <div\n key={i}\n className=\"h-8 rounded-md bg-bg-sunken motion-safe:animate-vc-shimmer\"\n />\n ))}\n </div>\n ) : null}\n </div>\n </CardContent>\n </Card>\n </TabsContent>\n );\n })}\n </Tabs>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,13 +1,13 @@
1
- import { notify as e } from "../utils/toast.js";
2
- import { useState as t } from "react";
3
- import { ArrowLeft as n, Loader2 as r, Save as i, X as a } from "lucide-react";
4
- import { useNavigate as o } from "react-router-dom";
5
- import { Button as s, Card as c, CardContent as l, CardDescription as u, CardHeader as d, CardTitle as f, EmphasisPanel as p, GradientText as m, Input as h, Label as g, PagePurpose as _, Select as v, SelectContent as y, SelectItem as b, SelectTrigger as x, SelectValue as S, Textarea as C } from "@burdenoff/fe-libs/ui";
6
- import { jsx as w, jsxs as T } from "react/jsx-runtime";
7
- import { gql as E } from "@apollo/client";
8
- import { useMutation as D } from "@apollo/client/react";
1
+ import { useAssetHandlerNavigate as e } from "../hooks/useAssetHandlerNavigate.js";
2
+ import { notify as t } from "../utils/toast.js";
3
+ import { useState as n } from "react";
4
+ import { ArrowLeft as r, Loader2 as i, Save as a, X as o } from "lucide-react";
5
+ import { gql as s } from "@apollo/client";
6
+ import { useMutation as c } from "@apollo/client/react";
7
+ import { jsx as l, jsxs as u } from "react/jsx-runtime";
8
+ import { Button as d, Card as f, CardContent as p, CardDescription as m, CardHeader as h, CardTitle as g, EmphasisPanel as _, GradientText as v, Input as y, Label as b, PagePurpose as x, Select as S, SelectContent as C, SelectItem as w, SelectTrigger as T, SelectValue as E, Textarea as D } from "@burdenoff/fe-libs/ui";
9
9
  //#region src/assethandler/pages/AssetsAssetCreatePage.tsx
10
- var O = E`
10
+ var O = s`
11
11
  mutation AssetHandlerCreateAsset($input: CreateAssetInput!) {
12
12
  createAsset(input: $input) {
13
13
  id
@@ -26,7 +26,7 @@ var O = E`
26
26
  "servers"
27
27
  ];
28
28
  function A() {
29
- let E = o(), [A, j] = t({
29
+ let s = e(), [A, j] = n({
30
30
  name: "",
31
31
  description: "",
32
32
  category: "it_hardware",
@@ -37,13 +37,13 @@ function A() {
37
37
  locationName: "",
38
38
  assignedTo: "",
39
39
  tags: ""
40
- }), [M, N] = t({}), [P, { loading: F }] = D(O, {
40
+ }), [M, N] = n({}), [P, { loading: F }] = c(O, {
41
41
  refetchQueries: ["AssetHandlerBootstrap"],
42
- onCompleted: (t) => {
43
- e.success("Asset created", `${t.createAsset.name} was registered in the inventory.`), E(`/assets/${t.createAsset.id}`);
42
+ onCompleted: (e) => {
43
+ t.success("Asset created", `${e.createAsset.name} was registered in the inventory.`), s(`/assets/${e.createAsset.id}`);
44
44
  },
45
- onError: (t) => {
46
- e.error("Could not create asset", t.message);
45
+ onError: (e) => {
46
+ t.error("Could not create asset", e.message);
47
47
  }
48
48
  }), I = (e, t) => {
49
49
  j((n) => ({
@@ -55,9 +55,9 @@ function A() {
55
55
  return delete n[e], n;
56
56
  });
57
57
  }, L = () => {
58
- let t = {};
59
- if (A.name.trim() || (t.name = "Asset name is required"), A.assetNumber.trim() || (t.assetNumber = "Asset tag is required"), A.category.trim() || (t.category = "Category is required"), N(t), Object.keys(t).length > 0) {
60
- e.warning("Missing required fields", "Fill in the highlighted fields and try again.");
58
+ let e = {};
59
+ if (A.name.trim() || (e.name = "Asset name is required"), A.assetNumber.trim() || (e.assetNumber = "Asset tag is required"), A.category.trim() || (e.category = "Category is required"), N(e), Object.keys(e).length > 0) {
60
+ t.warning("Missing required fields", "Fill in the highlighted fields and try again.");
61
61
  return;
62
62
  }
63
63
  let n = A.tags.split(",").map((e) => e.trim()).filter(Boolean);
@@ -74,153 +74,153 @@ function A() {
74
74
  tags: n
75
75
  } } });
76
76
  };
77
- return /* @__PURE__ */ T("div", {
77
+ return /* @__PURE__ */ u("div", {
78
78
  className: "space-y-6 p-6 max-w-4xl",
79
79
  children: [
80
- /* @__PURE__ */ T("div", {
80
+ /* @__PURE__ */ u("div", {
81
81
  className: "flex items-center justify-between",
82
- children: [/* @__PURE__ */ T("div", {
82
+ children: [/* @__PURE__ */ u("div", {
83
83
  className: "flex items-center gap-4",
84
- children: [/* @__PURE__ */ w(s, {
84
+ children: [/* @__PURE__ */ l(d, {
85
85
  variant: "ghost",
86
86
  size: "icon",
87
- onClick: () => E("/assets/asset-list"),
88
- children: /* @__PURE__ */ w(n, { className: "h-4 w-4" })
89
- }), /* @__PURE__ */ T("div", { children: [/* @__PURE__ */ w("h1", {
87
+ onClick: () => s("/assets/asset-list"),
88
+ children: /* @__PURE__ */ l(r, { className: "h-4 w-4" })
89
+ }), /* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("h1", {
90
90
  className: "text-2xl font-bold",
91
- children: /* @__PURE__ */ w(m, { children: "Create New Asset" })
92
- }), /* @__PURE__ */ w("p", {
91
+ children: /* @__PURE__ */ l(v, { children: "Create New Asset" })
92
+ }), /* @__PURE__ */ l("p", {
93
93
  className: "text-sm text-text-secondary",
94
94
  children: "Register a new asset in the inventory"
95
95
  })] })]
96
- }), /* @__PURE__ */ T("div", {
96
+ }), /* @__PURE__ */ u("div", {
97
97
  className: "flex gap-2",
98
- children: [/* @__PURE__ */ T(s, {
98
+ children: [/* @__PURE__ */ u(d, {
99
99
  variant: "outline",
100
100
  size: "sm",
101
- onClick: () => E("/assets/asset-list"),
102
- children: [/* @__PURE__ */ w(a, { className: "mr-2 h-4 w-4" }), "Cancel"]
103
- }), /* @__PURE__ */ T(s, {
101
+ onClick: () => s("/assets/asset-list"),
102
+ children: [/* @__PURE__ */ l(o, { className: "mr-2 h-4 w-4" }), "Cancel"]
103
+ }), /* @__PURE__ */ u(d, {
104
104
  size: "sm",
105
105
  onClick: L,
106
106
  disabled: F,
107
- children: [F ? /* @__PURE__ */ w(r, { className: "mr-2 h-4 w-4 animate-spin" }) : /* @__PURE__ */ w(i, { className: "mr-2 h-4 w-4" }), F ? "Creating..." : "Create Asset"]
107
+ children: [F ? /* @__PURE__ */ l(i, { className: "mr-2 h-4 w-4 animate-spin" }) : /* @__PURE__ */ l(a, { className: "mr-2 h-4 w-4" }), F ? "Creating..." : "Create Asset"]
108
108
  })]
109
109
  })]
110
110
  }),
111
- /* @__PURE__ */ w(_, { children: "Register a new asset so it can be tracked, maintained and assigned from day one. Capture its identity (name, tag, serial), category and condition, then the location and assignment details — the more you fill in now, the better your reports and audits later." }),
112
- /* @__PURE__ */ T(p, { children: [/* @__PURE__ */ T(d, {
111
+ /* @__PURE__ */ l(x, { children: "Register a new asset so it can be tracked, maintained and assigned from day one. Capture its identity (name, tag, serial), category and condition, then the location and assignment details — the more you fill in now, the better your reports and audits later." }),
112
+ /* @__PURE__ */ u(_, { children: [/* @__PURE__ */ u(h, {
113
113
  className: "px-0 pt-0",
114
- children: [/* @__PURE__ */ w(f, { children: "General Information" }), /* @__PURE__ */ w(u, { children: "Basic asset details and identification" })]
115
- }), /* @__PURE__ */ T(l, {
114
+ children: [/* @__PURE__ */ l(g, { children: "General Information" }), /* @__PURE__ */ l(m, { children: "Basic asset details and identification" })]
115
+ }), /* @__PURE__ */ u(p, {
116
116
  className: "space-y-4 px-0 pb-0",
117
117
  children: [
118
- /* @__PURE__ */ T("div", {
118
+ /* @__PURE__ */ u("div", {
119
119
  className: "grid gap-4 md:grid-cols-2",
120
- children: [/* @__PURE__ */ T("div", {
120
+ children: [/* @__PURE__ */ u("div", {
121
121
  className: "space-y-2",
122
122
  children: [
123
- /* @__PURE__ */ w(g, { children: "Asset Name *" }),
124
- /* @__PURE__ */ w(h, {
123
+ /* @__PURE__ */ l(b, { children: "Asset Name *" }),
124
+ /* @__PURE__ */ l(y, {
125
125
  placeholder: "e.g., Dell OptiPlex 7090",
126
126
  value: A.name,
127
127
  onChange: (e) => I("name", e.target.value),
128
128
  "aria-invalid": !!M.name
129
129
  }),
130
- M.name ? /* @__PURE__ */ w("p", {
130
+ M.name ? /* @__PURE__ */ l("p", {
131
131
  className: "text-xs text-status-error-text",
132
132
  children: M.name
133
133
  }) : null
134
134
  ]
135
- }), /* @__PURE__ */ T("div", {
135
+ }), /* @__PURE__ */ u("div", {
136
136
  className: "space-y-2",
137
137
  children: [
138
- /* @__PURE__ */ w(g, { children: "Asset Tag *" }),
139
- /* @__PURE__ */ w(h, {
138
+ /* @__PURE__ */ l(b, { children: "Asset Tag *" }),
139
+ /* @__PURE__ */ l(y, {
140
140
  placeholder: "e.g., IT-HW-001",
141
141
  value: A.assetNumber,
142
142
  onChange: (e) => I("assetNumber", e.target.value),
143
143
  "aria-invalid": !!M.assetNumber
144
144
  }),
145
- M.assetNumber ? /* @__PURE__ */ w("p", {
145
+ M.assetNumber ? /* @__PURE__ */ l("p", {
146
146
  className: "text-xs text-status-error-text",
147
147
  children: M.assetNumber
148
148
  }) : null
149
149
  ]
150
150
  })]
151
151
  }),
152
- /* @__PURE__ */ T("div", {
152
+ /* @__PURE__ */ u("div", {
153
153
  className: "space-y-2",
154
- children: [/* @__PURE__ */ w(g, { children: "Description" }), /* @__PURE__ */ w(C, {
154
+ children: [/* @__PURE__ */ l(b, { children: "Description" }), /* @__PURE__ */ l(D, {
155
155
  placeholder: "Brief description of the asset...",
156
156
  value: A.description,
157
157
  onChange: (e) => I("description", e.target.value),
158
158
  rows: 3
159
159
  })]
160
160
  }),
161
- /* @__PURE__ */ T("div", {
161
+ /* @__PURE__ */ u("div", {
162
162
  className: "grid gap-4 md:grid-cols-3",
163
163
  children: [
164
- /* @__PURE__ */ T("div", {
164
+ /* @__PURE__ */ u("div", {
165
165
  className: "space-y-2",
166
- children: [/* @__PURE__ */ w(g, { children: "Category *" }), /* @__PURE__ */ T(v, {
166
+ children: [/* @__PURE__ */ l(b, { children: "Category *" }), /* @__PURE__ */ u(S, {
167
167
  value: A.category,
168
168
  onValueChange: (e) => I("category", e),
169
- children: [/* @__PURE__ */ w(x, { children: /* @__PURE__ */ w(S, {}) }), /* @__PURE__ */ w(y, { children: k.map((e) => /* @__PURE__ */ w(b, {
169
+ children: [/* @__PURE__ */ l(T, { children: /* @__PURE__ */ l(E, {}) }), /* @__PURE__ */ l(C, { children: k.map((e) => /* @__PURE__ */ l(w, {
170
170
  value: e,
171
171
  className: "capitalize",
172
172
  children: e.replace(/_/g, " ")
173
173
  }, e)) })]
174
174
  })]
175
175
  }),
176
- /* @__PURE__ */ T("div", {
176
+ /* @__PURE__ */ u("div", {
177
177
  className: "space-y-2",
178
- children: [/* @__PURE__ */ w(g, { children: "Status" }), /* @__PURE__ */ T(v, {
178
+ children: [/* @__PURE__ */ l(b, { children: "Status" }), /* @__PURE__ */ u(S, {
179
179
  value: A.status,
180
180
  onValueChange: (e) => I("status", e),
181
- children: [/* @__PURE__ */ w(x, { children: /* @__PURE__ */ w(S, {}) }), /* @__PURE__ */ T(y, { children: [
182
- /* @__PURE__ */ w(b, {
181
+ children: [/* @__PURE__ */ l(T, { children: /* @__PURE__ */ l(E, {}) }), /* @__PURE__ */ u(C, { children: [
182
+ /* @__PURE__ */ l(w, {
183
183
  value: "ACTIVE",
184
184
  children: "Active"
185
185
  }),
186
- /* @__PURE__ */ w(b, {
186
+ /* @__PURE__ */ l(w, {
187
187
  value: "INACTIVE",
188
188
  children: "Inactive"
189
189
  }),
190
- /* @__PURE__ */ w(b, {
190
+ /* @__PURE__ */ l(w, {
191
191
  value: "MAINTENANCE",
192
192
  children: "Maintenance"
193
193
  }),
194
- /* @__PURE__ */ w(b, {
194
+ /* @__PURE__ */ l(w, {
195
195
  value: "RETIRED",
196
196
  children: "Retired"
197
197
  })
198
198
  ] })]
199
199
  })]
200
200
  }),
201
- /* @__PURE__ */ T("div", {
201
+ /* @__PURE__ */ u("div", {
202
202
  className: "space-y-2",
203
- children: [/* @__PURE__ */ w(g, { children: "Condition" }), /* @__PURE__ */ T(v, {
203
+ children: [/* @__PURE__ */ l(b, { children: "Condition" }), /* @__PURE__ */ u(S, {
204
204
  value: A.condition,
205
205
  onValueChange: (e) => I("condition", e),
206
- children: [/* @__PURE__ */ w(x, { children: /* @__PURE__ */ w(S, {}) }), /* @__PURE__ */ T(y, { children: [
207
- /* @__PURE__ */ w(b, {
206
+ children: [/* @__PURE__ */ l(T, { children: /* @__PURE__ */ l(E, {}) }), /* @__PURE__ */ u(C, { children: [
207
+ /* @__PURE__ */ l(w, {
208
208
  value: "EXCELLENT",
209
209
  children: "Excellent"
210
210
  }),
211
- /* @__PURE__ */ w(b, {
211
+ /* @__PURE__ */ l(w, {
212
212
  value: "GOOD",
213
213
  children: "Good"
214
214
  }),
215
- /* @__PURE__ */ w(b, {
215
+ /* @__PURE__ */ l(w, {
216
216
  value: "FAIR",
217
217
  children: "Fair"
218
218
  }),
219
- /* @__PURE__ */ w(b, {
219
+ /* @__PURE__ */ l(w, {
220
220
  value: "POOR",
221
221
  children: "Poor"
222
222
  }),
223
- /* @__PURE__ */ w(b, {
223
+ /* @__PURE__ */ l(w, {
224
224
  value: "DAMAGED",
225
225
  children: "Damaged"
226
226
  })
@@ -229,9 +229,9 @@ function A() {
229
229
  })
230
230
  ]
231
231
  }),
232
- /* @__PURE__ */ T("div", {
232
+ /* @__PURE__ */ u("div", {
233
233
  className: "space-y-2",
234
- children: [/* @__PURE__ */ w(g, { children: "Serial Number" }), /* @__PURE__ */ w(h, {
234
+ children: [/* @__PURE__ */ l(b, { children: "Serial Number" }), /* @__PURE__ */ l(y, {
235
235
  placeholder: "e.g., DELL-7090-X1A2B3",
236
236
  value: A.serialNumber,
237
237
  onChange: (e) => I("serialNumber", e.target.value)
@@ -239,44 +239,44 @@ function A() {
239
239
  })
240
240
  ]
241
241
  })] }),
242
- /* @__PURE__ */ T(c, { children: [/* @__PURE__ */ w(d, { children: /* @__PURE__ */ w(f, { children: "Assignment & Location" }) }), /* @__PURE__ */ T(l, {
242
+ /* @__PURE__ */ u(f, { children: [/* @__PURE__ */ l(h, { children: /* @__PURE__ */ l(g, { children: "Assignment & Location" }) }), /* @__PURE__ */ u(p, {
243
243
  className: "space-y-4",
244
- children: [/* @__PURE__ */ T("div", {
244
+ children: [/* @__PURE__ */ u("div", {
245
245
  className: "grid gap-4 md:grid-cols-2",
246
- children: [/* @__PURE__ */ T("div", {
246
+ children: [/* @__PURE__ */ u("div", {
247
247
  className: "space-y-2",
248
- children: [/* @__PURE__ */ w(g, { children: "Assigned To" }), /* @__PURE__ */ w(h, {
248
+ children: [/* @__PURE__ */ l(b, { children: "Assigned To" }), /* @__PURE__ */ l(y, {
249
249
  placeholder: "e.g., john.smith@company.com",
250
250
  value: A.assignedTo,
251
251
  onChange: (e) => I("assignedTo", e.target.value)
252
252
  })]
253
- }), /* @__PURE__ */ T("div", {
253
+ }), /* @__PURE__ */ u("div", {
254
254
  className: "space-y-2",
255
- children: [/* @__PURE__ */ w(g, { children: "Location" }), /* @__PURE__ */ w(h, {
255
+ children: [/* @__PURE__ */ l(b, { children: "Location" }), /* @__PURE__ */ l(y, {
256
256
  placeholder: "e.g., Building A, Floor 3, Desk 15",
257
257
  value: A.locationName,
258
258
  onChange: (e) => I("locationName", e.target.value)
259
259
  })]
260
260
  })]
261
- }), /* @__PURE__ */ T("div", {
261
+ }), /* @__PURE__ */ u("div", {
262
262
  className: "space-y-2",
263
- children: [/* @__PURE__ */ w(g, { children: "Tags (comma-separated)" }), /* @__PURE__ */ w(h, {
263
+ children: [/* @__PURE__ */ l(b, { children: "Tags (comma-separated)" }), /* @__PURE__ */ l(y, {
264
264
  placeholder: "e.g., desktop, engineering, high-performance",
265
265
  value: A.tags,
266
266
  onChange: (e) => I("tags", e.target.value)
267
267
  })]
268
268
  })]
269
269
  })] }),
270
- /* @__PURE__ */ T("div", {
270
+ /* @__PURE__ */ u("div", {
271
271
  className: "flex justify-end gap-2",
272
- children: [/* @__PURE__ */ w(s, {
272
+ children: [/* @__PURE__ */ l(d, {
273
273
  variant: "outline",
274
- onClick: () => E("/assets/asset-list"),
274
+ onClick: () => s("/assets/asset-list"),
275
275
  children: "Cancel"
276
- }), /* @__PURE__ */ T(s, {
276
+ }), /* @__PURE__ */ u(d, {
277
277
  onClick: L,
278
278
  disabled: F,
279
- children: [F ? /* @__PURE__ */ w(r, { className: "mr-2 h-4 w-4 animate-spin" }) : /* @__PURE__ */ w(i, { className: "mr-2 h-4 w-4" }), F ? "Creating..." : "Create Asset"]
279
+ children: [F ? /* @__PURE__ */ l(i, { className: "mr-2 h-4 w-4 animate-spin" }) : /* @__PURE__ */ l(a, { className: "mr-2 h-4 w-4" }), F ? "Creating..." : "Create Asset"]
280
280
  })]
281
281
  })
282
282
  ]
@@ -1 +1 @@
1
- {"version":3,"file":"AssetsAssetCreatePage.js","names":[],"sources":["../../../src/assethandler/pages/AssetsAssetCreatePage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport {\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n CardDescription,\n Input,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Textarea,\n GradientText,\n EmphasisPanel,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { ArrowLeft, Loader2, Save, X } from 'lucide-react';\nimport { useNavigate } from 'react-router-dom';\nimport { gql } from '@apollo/client';\nimport { useMutation } from '@apollo/client/react';\nimport { notify } from '../utils/toast';\n\nconst CREATE_ASSET_MUTATION = gql`\n mutation AssetHandlerCreateAsset($input: CreateAssetInput!) {\n createAsset(input: $input) {\n id\n assetNumber\n name\n }\n }\n`;\n\nconst CATEGORY_OPTIONS = [\n 'electronics',\n 'it_hardware',\n 'furniture',\n 'vehicles',\n 'equipment',\n 'software',\n 'networking',\n 'servers',\n];\n\nexport function AssetsAssetCreatePage() {\n const navigate = useNavigate();\n const [formData, setFormData] = useState({\n name: '',\n description: '',\n category: 'it_hardware',\n status: 'ACTIVE',\n condition: 'GOOD',\n serialNumber: '',\n assetNumber: '',\n locationName: '',\n assignedTo: '',\n tags: '',\n });\n const [errors, setErrors] = useState<Record<string, string>>({});\n\n const [createAsset, { loading: creating }] = useMutation<{\n createAsset: { id: string; assetNumber: string; name: string };\n }>(CREATE_ASSET_MUTATION, {\n refetchQueries: ['AssetHandlerBootstrap'],\n onCompleted: (data) => {\n notify.success('Asset created', `${data.createAsset.name} was registered in the inventory.`);\n navigate(`/assets/${data.createAsset.id}`);\n },\n onError: (error) => {\n notify.error('Could not create asset', error.message);\n },\n });\n\n const handleChange = (field: string, value: string) => {\n setFormData((prev) => ({ ...prev, [field]: value }));\n setErrors((prev) => {\n if (!prev[field]) return prev;\n const next = { ...prev };\n delete next[field];\n return next;\n });\n };\n\n const handleSubmit = () => {\n const nextErrors: Record<string, string> = {};\n if (!formData.name.trim()) nextErrors.name = 'Asset name is required';\n if (!formData.assetNumber.trim()) nextErrors.assetNumber = 'Asset tag is required';\n if (!formData.category.trim()) nextErrors.category = 'Category is required';\n setErrors(nextErrors);\n if (Object.keys(nextErrors).length > 0) {\n notify.warning('Missing required fields', 'Fill in the highlighted fields and try again.');\n return;\n }\n\n const tags = formData.tags\n .split(',')\n .map((tag) => tag.trim())\n .filter(Boolean);\n\n void createAsset({\n variables: {\n input: {\n name: formData.name.trim(),\n assetNumber: formData.assetNumber.trim(),\n category: formData.category,\n status: formData.status,\n condition: formData.condition,\n description: formData.description.trim() || null,\n serialNumber: formData.serialNumber.trim() || null,\n locationName: formData.locationName.trim() || null,\n assignedTo: formData.assignedTo.trim() || null,\n tags,\n },\n },\n });\n };\n\n return (\n <div className=\"space-y-6 p-6 max-w-4xl\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-4\">\n <Button variant=\"ghost\" size=\"icon\" onClick={() => navigate('/assets/asset-list')}>\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n <div>\n <h1 className=\"text-2xl font-bold\">\n <GradientText>Create New Asset</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">Register a new asset in the inventory</p>\n </div>\n </div>\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => navigate('/assets/asset-list')}>\n <X className=\"mr-2 h-4 w-4\" />\n Cancel\n </Button>\n <Button size=\"sm\" onClick={handleSubmit} disabled={creating}>\n {creating ? (\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n ) : (\n <Save className=\"mr-2 h-4 w-4\" />\n )}\n {creating ? 'Creating...' : 'Create Asset'}\n </Button>\n </div>\n </div>\n\n <PagePurpose>\n Register a new asset so it can be tracked, maintained and assigned from day one. Capture its\n identity (name, tag, serial), category and condition, then the location and assignment\n details — the more you fill in now, the better your reports and audits later.\n </PagePurpose>\n\n <EmphasisPanel>\n <CardHeader className=\"px-0 pt-0\">\n <CardTitle>General Information</CardTitle>\n <CardDescription>Basic asset details and identification</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4 px-0 pb-0\">\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Asset Name *</Label>\n <Input\n placeholder=\"e.g., Dell OptiPlex 7090\"\n value={formData.name}\n onChange={(e) => handleChange('name', e.target.value)}\n aria-invalid={!!errors.name}\n />\n {errors.name ? <p className=\"text-xs text-status-error-text\">{errors.name}</p> : null}\n </div>\n <div className=\"space-y-2\">\n <Label>Asset Tag *</Label>\n <Input\n placeholder=\"e.g., IT-HW-001\"\n value={formData.assetNumber}\n onChange={(e) => handleChange('assetNumber', e.target.value)}\n aria-invalid={!!errors.assetNumber}\n />\n {errors.assetNumber ? (\n <p className=\"text-xs text-status-error-text\">{errors.assetNumber}</p>\n ) : null}\n </div>\n </div>\n <div className=\"space-y-2\">\n <Label>Description</Label>\n <Textarea\n placeholder=\"Brief description of the asset...\"\n value={formData.description}\n onChange={(e) => handleChange('description', e.target.value)}\n rows={3}\n />\n </div>\n <div className=\"grid gap-4 md:grid-cols-3\">\n <div className=\"space-y-2\">\n <Label>Category *</Label>\n <Select value={formData.category} onValueChange={(v) => handleChange('category', v)}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {CATEGORY_OPTIONS.map((category) => (\n <SelectItem key={category} value={category} className=\"capitalize\">\n {category.replace(/_/g, ' ')}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-2\">\n <Label>Status</Label>\n <Select value={formData.status} onValueChange={(v) => handleChange('status', v)}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"ACTIVE\">Active</SelectItem>\n <SelectItem value=\"INACTIVE\">Inactive</SelectItem>\n <SelectItem value=\"MAINTENANCE\">Maintenance</SelectItem>\n <SelectItem value=\"RETIRED\">Retired</SelectItem>\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-2\">\n <Label>Condition</Label>\n <Select\n value={formData.condition}\n onValueChange={(v) => handleChange('condition', v)}\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"EXCELLENT\">Excellent</SelectItem>\n <SelectItem value=\"GOOD\">Good</SelectItem>\n <SelectItem value=\"FAIR\">Fair</SelectItem>\n <SelectItem value=\"POOR\">Poor</SelectItem>\n <SelectItem value=\"DAMAGED\">Damaged</SelectItem>\n </SelectContent>\n </Select>\n </div>\n </div>\n <div className=\"space-y-2\">\n <Label>Serial Number</Label>\n <Input\n placeholder=\"e.g., DELL-7090-X1A2B3\"\n value={formData.serialNumber}\n onChange={(e) => handleChange('serialNumber', e.target.value)}\n />\n </div>\n </CardContent>\n </EmphasisPanel>\n\n <Card>\n <CardHeader>\n <CardTitle>Assignment & Location</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Assigned To</Label>\n <Input\n placeholder=\"e.g., john.smith@company.com\"\n value={formData.assignedTo}\n onChange={(e) => handleChange('assignedTo', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Location</Label>\n <Input\n placeholder=\"e.g., Building A, Floor 3, Desk 15\"\n value={formData.locationName}\n onChange={(e) => handleChange('locationName', e.target.value)}\n />\n </div>\n </div>\n <div className=\"space-y-2\">\n <Label>Tags (comma-separated)</Label>\n <Input\n placeholder=\"e.g., desktop, engineering, high-performance\"\n value={formData.tags}\n onChange={(e) => handleChange('tags', e.target.value)}\n />\n </div>\n </CardContent>\n </Card>\n\n <div className=\"flex justify-end gap-2\">\n <Button variant=\"outline\" onClick={() => navigate('/assets/asset-list')}>\n Cancel\n </Button>\n <Button onClick={handleSubmit} disabled={creating}>\n {creating ? (\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n ) : (\n <Save className=\"mr-2 h-4 w-4\" />\n )}\n {creating ? 'Creating...' : 'Create Asset'}\n </Button>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"AssetsAssetCreatePage.js","names":[],"sources":["../../../src/assethandler/pages/AssetsAssetCreatePage.tsx"],"sourcesContent":["import { useAssetHandlerNavigate } from '../hooks/useAssetHandlerNavigate';\nimport { useState } from 'react';\nimport {\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n CardDescription,\n Input,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Textarea,\n GradientText,\n EmphasisPanel,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { ArrowLeft, Loader2, Save, X } from 'lucide-react';\nimport { gql } from '@apollo/client';\nimport { useMutation } from '@apollo/client/react';\nimport { notify } from '../utils/toast';\n\nconst CREATE_ASSET_MUTATION = gql`\n mutation AssetHandlerCreateAsset($input: CreateAssetInput!) {\n createAsset(input: $input) {\n id\n assetNumber\n name\n }\n }\n`;\n\nconst CATEGORY_OPTIONS = [\n 'electronics',\n 'it_hardware',\n 'furniture',\n 'vehicles',\n 'equipment',\n 'software',\n 'networking',\n 'servers',\n];\n\nexport function AssetsAssetCreatePage() {\n const navigate = useAssetHandlerNavigate();\n const [formData, setFormData] = useState({\n name: '',\n description: '',\n category: 'it_hardware',\n status: 'ACTIVE',\n condition: 'GOOD',\n serialNumber: '',\n assetNumber: '',\n locationName: '',\n assignedTo: '',\n tags: '',\n });\n const [errors, setErrors] = useState<Record<string, string>>({});\n\n const [createAsset, { loading: creating }] = useMutation<{\n createAsset: { id: string; assetNumber: string; name: string };\n }>(CREATE_ASSET_MUTATION, {\n refetchQueries: ['AssetHandlerBootstrap'],\n onCompleted: (data) => {\n notify.success('Asset created', `${data.createAsset.name} was registered in the inventory.`);\n navigate(`/assets/${data.createAsset.id}`);\n },\n onError: (error) => {\n notify.error('Could not create asset', error.message);\n },\n });\n\n const handleChange = (field: string, value: string) => {\n setFormData((prev) => ({ ...prev, [field]: value }));\n setErrors((prev) => {\n if (!prev[field]) return prev;\n const next = { ...prev };\n delete next[field];\n return next;\n });\n };\n\n const handleSubmit = () => {\n const nextErrors: Record<string, string> = {};\n if (!formData.name.trim()) nextErrors.name = 'Asset name is required';\n if (!formData.assetNumber.trim()) nextErrors.assetNumber = 'Asset tag is required';\n if (!formData.category.trim()) nextErrors.category = 'Category is required';\n setErrors(nextErrors);\n if (Object.keys(nextErrors).length > 0) {\n notify.warning('Missing required fields', 'Fill in the highlighted fields and try again.');\n return;\n }\n\n const tags = formData.tags\n .split(',')\n .map((tag) => tag.trim())\n .filter(Boolean);\n\n void createAsset({\n variables: {\n input: {\n name: formData.name.trim(),\n assetNumber: formData.assetNumber.trim(),\n category: formData.category,\n status: formData.status,\n condition: formData.condition,\n description: formData.description.trim() || null,\n serialNumber: formData.serialNumber.trim() || null,\n locationName: formData.locationName.trim() || null,\n assignedTo: formData.assignedTo.trim() || null,\n tags,\n },\n },\n });\n };\n\n return (\n <div className=\"space-y-6 p-6 max-w-4xl\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-4\">\n <Button variant=\"ghost\" size=\"icon\" onClick={() => navigate('/assets/asset-list')}>\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n <div>\n <h1 className=\"text-2xl font-bold\">\n <GradientText>Create New Asset</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">Register a new asset in the inventory</p>\n </div>\n </div>\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => navigate('/assets/asset-list')}>\n <X className=\"mr-2 h-4 w-4\" />\n Cancel\n </Button>\n <Button size=\"sm\" onClick={handleSubmit} disabled={creating}>\n {creating ? (\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n ) : (\n <Save className=\"mr-2 h-4 w-4\" />\n )}\n {creating ? 'Creating...' : 'Create Asset'}\n </Button>\n </div>\n </div>\n\n <PagePurpose>\n Register a new asset so it can be tracked, maintained and assigned from day one. Capture its\n identity (name, tag, serial), category and condition, then the location and assignment\n details — the more you fill in now, the better your reports and audits later.\n </PagePurpose>\n\n <EmphasisPanel>\n <CardHeader className=\"px-0 pt-0\">\n <CardTitle>General Information</CardTitle>\n <CardDescription>Basic asset details and identification</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4 px-0 pb-0\">\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Asset Name *</Label>\n <Input\n placeholder=\"e.g., Dell OptiPlex 7090\"\n value={formData.name}\n onChange={(e) => handleChange('name', e.target.value)}\n aria-invalid={!!errors.name}\n />\n {errors.name ? <p className=\"text-xs text-status-error-text\">{errors.name}</p> : null}\n </div>\n <div className=\"space-y-2\">\n <Label>Asset Tag *</Label>\n <Input\n placeholder=\"e.g., IT-HW-001\"\n value={formData.assetNumber}\n onChange={(e) => handleChange('assetNumber', e.target.value)}\n aria-invalid={!!errors.assetNumber}\n />\n {errors.assetNumber ? (\n <p className=\"text-xs text-status-error-text\">{errors.assetNumber}</p>\n ) : null}\n </div>\n </div>\n <div className=\"space-y-2\">\n <Label>Description</Label>\n <Textarea\n placeholder=\"Brief description of the asset...\"\n value={formData.description}\n onChange={(e) => handleChange('description', e.target.value)}\n rows={3}\n />\n </div>\n <div className=\"grid gap-4 md:grid-cols-3\">\n <div className=\"space-y-2\">\n <Label>Category *</Label>\n <Select value={formData.category} onValueChange={(v) => handleChange('category', v)}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {CATEGORY_OPTIONS.map((category) => (\n <SelectItem key={category} value={category} className=\"capitalize\">\n {category.replace(/_/g, ' ')}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-2\">\n <Label>Status</Label>\n <Select value={formData.status} onValueChange={(v) => handleChange('status', v)}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"ACTIVE\">Active</SelectItem>\n <SelectItem value=\"INACTIVE\">Inactive</SelectItem>\n <SelectItem value=\"MAINTENANCE\">Maintenance</SelectItem>\n <SelectItem value=\"RETIRED\">Retired</SelectItem>\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-2\">\n <Label>Condition</Label>\n <Select\n value={formData.condition}\n onValueChange={(v) => handleChange('condition', v)}\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"EXCELLENT\">Excellent</SelectItem>\n <SelectItem value=\"GOOD\">Good</SelectItem>\n <SelectItem value=\"FAIR\">Fair</SelectItem>\n <SelectItem value=\"POOR\">Poor</SelectItem>\n <SelectItem value=\"DAMAGED\">Damaged</SelectItem>\n </SelectContent>\n </Select>\n </div>\n </div>\n <div className=\"space-y-2\">\n <Label>Serial Number</Label>\n <Input\n placeholder=\"e.g., DELL-7090-X1A2B3\"\n value={formData.serialNumber}\n onChange={(e) => handleChange('serialNumber', e.target.value)}\n />\n </div>\n </CardContent>\n </EmphasisPanel>\n\n <Card>\n <CardHeader>\n <CardTitle>Assignment & Location</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Assigned To</Label>\n <Input\n placeholder=\"e.g., john.smith@company.com\"\n value={formData.assignedTo}\n onChange={(e) => handleChange('assignedTo', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Location</Label>\n <Input\n placeholder=\"e.g., Building A, Floor 3, Desk 15\"\n value={formData.locationName}\n onChange={(e) => handleChange('locationName', e.target.value)}\n />\n </div>\n </div>\n <div className=\"space-y-2\">\n <Label>Tags (comma-separated)</Label>\n <Input\n placeholder=\"e.g., desktop, engineering, high-performance\"\n value={formData.tags}\n onChange={(e) => handleChange('tags', e.target.value)}\n />\n </div>\n </CardContent>\n </Card>\n\n <div className=\"flex justify-end gap-2\">\n <Button variant=\"outline\" onClick={() => navigate('/assets/asset-list')}>\n Cancel\n </Button>\n <Button onClick={handleSubmit} disabled={creating}>\n {creating ? (\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n ) : (\n <Save className=\"mr-2 h-4 w-4\" />\n )}\n {creating ? 'Creating...' : 'Create Asset'}\n </Button>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}