@burdenoff/microfe-assethandler 2026.820.3 → 2026.820.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assethandler/components/AssetTag.d.ts +20 -0
- package/dist/assethandler/components/AssetTag.d.ts.map +1 -0
- package/dist/assethandler/components/AssetTag.js +8 -0
- package/dist/assethandler/components/AssetTag.js.map +1 -0
- package/dist/assethandler/components/index.d.ts +2 -0
- package/dist/assethandler/components/index.d.ts.map +1 -1
- package/dist/assethandler/components/index.js +1 -0
- package/dist/assethandler/pages/AssetsAssetCheckInOutPage.d.ts.map +1 -1
- package/dist/assethandler/pages/AssetsAssetCheckInOutPage.js +344 -181
- package/dist/assethandler/pages/AssetsAssetCheckInOutPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetDetailPage.d.ts.map +1 -1
- package/dist/assethandler/pages/AssetsAssetDetailPage.js +338 -325
- package/dist/assethandler/pages/AssetsAssetDetailPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetListPage.d.ts.map +1 -1
- package/dist/assethandler/pages/AssetsAssetListPage.js +177 -163
- package/dist/assethandler/pages/AssetsAssetListPage.js.map +1 -1
- package/dist/assethandler/providers/AssetHandlerProvider.d.ts.map +1 -1
- package/dist/assethandler/providers/AssetHandlerProvider.js +1 -0
- package/dist/assethandler/providers/AssetHandlerProvider.js.map +1 -1
- package/dist/assethandler/store/assethandlerStore.d.ts +2 -0
- package/dist/assethandler/store/assethandlerStore.d.ts.map +1 -1
- package/dist/assethandler/store/assethandlerStore.js +1 -0
- package/dist/assethandler/store/assethandlerStore.js.map +1 -1
- package/dist/assethandler/utils/printAssetTag.d.ts +24 -0
- package/dist/assethandler/utils/printAssetTag.d.ts.map +1 -0
- package/dist/assethandler/utils/printAssetTag.js +124 -0
- package/dist/assethandler/utils/printAssetTag.js.map +1 -0
- package/dist/node_modules/dijkstrajs/dijkstra.js +61 -0
- package/dist/node_modules/dijkstrajs/dijkstra.js.map +1 -0
- package/dist/node_modules/qrcode/lib/browser.js +40 -0
- package/dist/node_modules/qrcode/lib/browser.js.map +1 -0
- package/dist/node_modules/qrcode/lib/can-promise.js +12 -0
- package/dist/node_modules/qrcode/lib/can-promise.js.map +1 -0
- package/dist/node_modules/qrcode/lib/core/alignment-pattern.js +21 -0
- package/dist/node_modules/qrcode/lib/core/alignment-pattern.js.map +1 -0
- package/dist/node_modules/qrcode/lib/core/alphanumeric-data.js +28 -0
- package/dist/node_modules/qrcode/lib/core/alphanumeric-data.js.map +1 -0
- package/dist/node_modules/qrcode/lib/core/bit-buffer.js +28 -0
- package/dist/node_modules/qrcode/lib/core/bit-buffer.js.map +1 -0
- package/dist/node_modules/qrcode/lib/core/bit-matrix.js +23 -0
- package/dist/node_modules/qrcode/lib/core/bit-matrix.js.map +1 -0
- package/dist/node_modules/qrcode/lib/core/byte-data.js +23 -0
- package/dist/node_modules/qrcode/lib/core/byte-data.js.map +1 -0
- package/dist/node_modules/qrcode/lib/core/error-correction-code.js +350 -0
- package/dist/node_modules/qrcode/lib/core/error-correction-code.js.map +1 -0
- package/dist/node_modules/qrcode/lib/core/error-correction-level.js +34 -0
- package/dist/node_modules/qrcode/lib/core/error-correction-level.js.map +1 -0
- package/dist/node_modules/qrcode/lib/core/finder-pattern.js +19 -0
- package/dist/node_modules/qrcode/lib/core/finder-pattern.js.map +1 -0
- package/dist/node_modules/qrcode/lib/core/format-info.js +16 -0
- package/dist/node_modules/qrcode/lib/core/format-info.js.map +1 -0
- package/dist/node_modules/qrcode/lib/core/galois-field.js +22 -0
- package/dist/node_modules/qrcode/lib/core/galois-field.js.map +1 -0
- package/dist/node_modules/qrcode/lib/core/kanji-data.js +31 -0
- package/dist/node_modules/qrcode/lib/core/kanji-data.js.map +1 -0
- package/dist/node_modules/qrcode/lib/core/mask-pattern.js +84 -0
- package/dist/node_modules/qrcode/lib/core/mask-pattern.js.map +1 -0
- package/dist/node_modules/qrcode/lib/core/mode.js +74 -0
- package/dist/node_modules/qrcode/lib/core/mode.js.map +1 -0
- package/dist/node_modules/qrcode/lib/core/numeric-data.js +26 -0
- package/dist/node_modules/qrcode/lib/core/numeric-data.js.map +1 -0
- package/dist/node_modules/qrcode/lib/core/polynomial.js +30 -0
- package/dist/node_modules/qrcode/lib/core/polynomial.js.map +1 -0
- package/dist/node_modules/qrcode/lib/core/qrcode.js +117 -0
- package/dist/node_modules/qrcode/lib/core/qrcode.js.map +1 -0
- package/dist/node_modules/qrcode/lib/core/reed-solomon-encoder.js +27 -0
- package/dist/node_modules/qrcode/lib/core/reed-solomon-encoder.js.map +1 -0
- package/dist/node_modules/qrcode/lib/core/regex.js +21 -0
- package/dist/node_modules/qrcode/lib/core/regex.js.map +1 -0
- package/dist/node_modules/qrcode/lib/core/segments.js +144 -0
- package/dist/node_modules/qrcode/lib/core/segments.js.map +1 -0
- package/dist/node_modules/qrcode/lib/core/utils.js +70 -0
- package/dist/node_modules/qrcode/lib/core/utils.js.map +1 -0
- package/dist/node_modules/qrcode/lib/core/version-check.js +12 -0
- package/dist/node_modules/qrcode/lib/core/version-check.js.map +1 -0
- package/dist/node_modules/qrcode/lib/core/version.js +60 -0
- package/dist/node_modules/qrcode/lib/core/version.js.map +1 -0
- package/dist/node_modules/qrcode/lib/renderer/canvas.js +32 -0
- package/dist/node_modules/qrcode/lib/renderer/canvas.js.map +1 -0
- package/dist/node_modules/qrcode/lib/renderer/svg-tag.js +31 -0
- package/dist/node_modules/qrcode/lib/renderer/svg-tag.js.map +1 -0
- package/dist/node_modules/qrcode/lib/renderer/utils.js +55 -0
- package/dist/node_modules/qrcode/lib/renderer/utils.js.map +1 -0
- package/package.json +3 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssetsAssetCheckInOutPage.js","names":[],"sources":["../../../src/assethandler/pages/AssetsAssetCheckInOutPage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport {\n Button,\n Input,\n Textarea,\n Label,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n GlassCard,\n PagePurpose,\n IllustratedEmptyState,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@burdenoff/fe-libs/ui';\nimport {\n ArrowDownToLine,\n ArrowUpFromLine,\n Clock,\n Search,\n AlertTriangle,\n PackageCheck,\n} 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';\nimport { cn } from '../utils/cn';\nimport { SectionHeader, StatTile, ChartCard, DonutChart, TrendChart } from '../components';\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\n// Branded soft status pills — amber = checked out, green = returned, red = overdue.\nconst STATUS_PILL: Record<AssignmentStatus, string> = {\n CHECKED_OUT: 'bg-status-warning-subtle text-status-warning-text',\n RETURNED: 'bg-status-success-subtle text-status-success-text',\n OVERDUE: 'bg-status-error-subtle text-status-error-text',\n};\n\nconst STATUS_LABEL: Record<AssignmentStatus, string> = {\n CHECKED_OUT: 'Checked out',\n RETURNED: 'Returned',\n OVERDUE: 'Overdue',\n};\n\nconst STATUS_DONUT_COLOR: Record<AssignmentStatus, string> = {\n CHECKED_OUT: 'var(--color-status-warning-bg)',\n OVERDUE: 'var(--color-status-error-bg)',\n RETURNED: 'var(--color-status-success-bg)',\n};\n\nfunction StatusPill({ status }: { status: AssignmentStatus }) {\n return (\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium',\n STATUS_PILL[status]\n )}\n >\n {STATUS_LABEL[status]}\n </span>\n );\n}\n\nfunction initials(value: string): string {\n const trimmed = value.trim();\n if (!trimmed) return '?';\n const parts = trimmed.split(/[\\s@._-]+/).filter(Boolean);\n const first = parts[0]?.[0] ?? trimmed[0];\n const second = parts.length > 1 ? parts[1][0] : '';\n return (first + second).toUpperCase();\n}\n\nfunction PersonChip({ name, by }: { name: string; by: string }) {\n return (\n <div className=\"flex items-center gap-2.5\">\n <span\n aria-hidden=\"true\"\n className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-action-primary-bg/10 text-xs font-semibold text-action-primary-text\"\n >\n {initials(name)}\n </span>\n <div className=\"min-w-0\">\n <p className=\"truncate text-sm text-text-primary\">{name || '—'}</p>\n <p className=\"truncate text-xs text-text-secondary\">by {by}</p>\n </div>\n </div>\n );\n}\n\nfunction daysUntil(dueAt: string): number | null {\n const due = new Date(dueAt);\n if (Number.isNaN(due.getTime())) return null;\n const today = new Date();\n const start = new Date(today.getFullYear(), today.getMonth(), today.getDate());\n const target = new Date(due.getFullYear(), due.getMonth(), due.getDate());\n return Math.round((target.getTime() - start.getTime()) / 86_400_000);\n}\n\nfunction DueChip({ dueAt, status }: { dueAt: string | null; status: AssignmentStatus }) {\n if (status === 'RETURNED' || !dueAt) return null;\n const days = daysUntil(dueAt);\n if (days === null) return null;\n let label: string;\n let tone: string;\n if (days < 0) {\n label = `${-days}d overdue`;\n tone = 'bg-status-error-subtle text-status-error-text';\n } else if (days === 0) {\n label = 'Due today';\n tone = 'bg-status-warning-subtle text-status-warning-text';\n } else if (days <= 3) {\n label = `Due in ${days}d`;\n tone = 'bg-status-warning-subtle text-status-warning-text';\n } else {\n label = `Due in ${days}d`;\n tone = 'bg-bg-sunken text-text-secondary';\n }\n return (\n <span className={cn('inline-flex rounded-full px-2 py-0.5 text-[11px] font-medium', tone)}>\n {label}\n </span>\n );\n}\n\nconst fmtDate = (iso: string | null): string =>\n iso\n ? new Date(iso).toLocaleDateString(undefined, {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n })\n : '—';\n\nexport function AssetsAssetCheckInOutPage() {\n const { assets } = useAssetHandlerStore();\n const [searchQuery, setSearchQuery] = useState('');\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 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 // Status mix (real snapshot counts) — zero slices are dropped by DonutChart.\n const statusMix = [\n { name: 'Checked out', value: activeCheckouts.length, color: STATUS_DONUT_COLOR.CHECKED_OUT },\n { name: 'Overdue', value: overdueCheckouts.length, color: STATUS_DONUT_COLOR.OVERDUE },\n { name: 'Returned', value: returnedRecords.length, color: STATUS_DONUT_COLOR.RETURNED },\n ];\n\n // Checkouts over the last 6 months, bucketed from real checkedOutAt timestamps.\n const checkoutTrend = useMemo(() => {\n const base = new Date();\n const buckets = Array.from({ length: 6 }, (_, i) => {\n const d = new Date(base.getFullYear(), base.getMonth() - (5 - i), 1);\n return {\n key: `${d.getFullYear()}-${d.getMonth()}`,\n label: d.toLocaleDateString(undefined, { month: 'short' }),\n checkouts: 0,\n };\n });\n const index = new Map(buckets.map((b, i) => [b.key, i]));\n for (const a of assignments) {\n const d = new Date(a.checkedOutAt);\n if (Number.isNaN(d.getTime())) continue;\n const i = index.get(`${d.getFullYear()}-${d.getMonth()}`);\n if (i !== undefined) buckets[i].checkouts += 1;\n }\n return buckets;\n }, [assignments]);\n\n const hasTrend = checkoutTrend.some((b) => b.checkouts > 0);\n const hasData = assignments.length > 0;\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 const checkInButton = (rec: AssetAssignment) =>\n rec.status !== 'RETURNED' ? (\n <Button\n size=\"sm\"\n variant=\"outline\"\n disabled={checkingIn}\n onClick={() => void checkInAsset({ variables: { input: { assignmentId: rec.id } } })}\n >\n <ArrowDownToLine className=\"mr-1.5 h-3.5 w-3.5\" />\n Check In\n </Button>\n ) : null;\n\n const renderRecords = (records: AssetAssignment[]) => (\n <GlassCard treatment=\"glass\" className=\"overflow-hidden border-border-seam\">\n {/* Desktop table */}\n <div className=\"hidden overflow-x-auto md:block\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b border-border-seam bg-bg-sunken/40\">\n <th className=\"p-3 text-left font-medium text-text-secondary\">Asset</th>\n <th className=\"p-3 text-left font-medium text-text-secondary\">Assigned to</th>\n <th className=\"p-3 text-left font-medium text-text-secondary\">Checked out</th>\n <th className=\"p-3 text-left font-medium text-text-secondary\">Due</th>\n <th className=\"p-3 text-left font-medium text-text-secondary\">Returned</th>\n <th className=\"p-3 text-left font-medium text-text-secondary\">Status</th>\n <th className=\"p-3 text-right font-medium text-text-secondary\">Action</th>\n </tr>\n </thead>\n <tbody>\n {records.map((rec) => {\n const overdue = rec.status === 'OVERDUE';\n return (\n <tr\n key={rec.id}\n className={cn(\n 'border-b border-border-seam/70 transition-colors',\n overdue\n ? 'border-l-2 border-l-status-error-text bg-status-error-subtle/50 hover:bg-status-error-subtle'\n : 'hover:bg-bg-sunken/50'\n )}\n >\n <td className=\"p-3\">\n <p className=\"font-medium text-text-primary\">{rec.assetName}</p>\n <p className=\"font-mono text-xs text-text-secondary\">{rec.assetId}</p>\n </td>\n <td className=\"p-3\">\n <PersonChip name={rec.assignedTo} by={rec.assignedBy} />\n </td>\n <td className=\"p-3 text-xs text-text-secondary\">{fmtDate(rec.checkedOutAt)}</td>\n <td className=\"p-3\">\n <div className=\"flex flex-col items-start gap-1\">\n <span className=\"text-xs text-text-secondary\">{fmtDate(rec.dueAt)}</span>\n <DueChip dueAt={rec.dueAt} status={rec.status} />\n </div>\n </td>\n <td className=\"p-3 text-xs text-text-secondary\">{fmtDate(rec.checkedInAt)}</td>\n <td className=\"p-3\">\n <StatusPill status={rec.status} />\n </td>\n <td className=\"p-3 text-right\">{checkInButton(rec)}</td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n\n {/* Mobile stacked cards */}\n <div className=\"divide-y divide-border-seam md:hidden\">\n {records.map((rec) => {\n const overdue = rec.status === 'OVERDUE';\n const action = checkInButton(rec);\n return (\n <div\n key={rec.id}\n className={cn(\n 'space-y-3 p-4',\n overdue && 'border-l-2 border-l-status-error-text bg-status-error-subtle/40'\n )}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <p className=\"truncate font-medium text-text-primary\">{rec.assetName}</p>\n <p className=\"font-mono text-xs text-text-secondary\">{rec.assetId}</p>\n </div>\n <StatusPill status={rec.status} />\n </div>\n <PersonChip name={rec.assignedTo} by={rec.assignedBy} />\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-1 text-xs text-text-secondary\">\n <span>Out {fmtDate(rec.checkedOutAt)}</span>\n <span>Due {fmtDate(rec.dueAt)}</span>\n <DueChip dueAt={rec.dueAt} status={rec.status} />\n </div>\n {action ? <div>{action}</div> : null}\n </div>\n );\n })}\n </div>\n\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 key={i} className=\"h-10 rounded-md bg-bg-sunken motion-safe:animate-vc-shimmer\" />\n ))}\n </div>\n ) : null}\n </GlassCard>\n );\n\n return (\n <div className=\"space-y-6 p-4 sm:p-6\">\n <SectionHeader\n hero\n icon={PackageCheck}\n title=\"Asset Check-In / Check-Out\"\n description=\"Manage asset assignments and returns\"\n />\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 {/* Uniform KPI band */}\n <div className=\"grid gap-4 sm:grid-cols-2 xl:grid-cols-4\">\n <StatTile\n label=\"Active checkouts\"\n value={activeCheckouts.length}\n icon={ArrowUpFromLine}\n hero\n />\n <StatTile\n label=\"Overdue\"\n value={overdueCheckouts.length}\n icon={AlertTriangle}\n delta={overdueCheckouts.length > 0 ? 'chase now' : undefined}\n deltaTone=\"negative\"\n deltaDirection=\"up\"\n />\n <StatTile label=\"Returned\" value={returnedRecords.length} icon={ArrowDownToLine} />\n <StatTile label=\"Total records\" value={assignments.length} icon={Clock} />\n </div>\n\n <div className=\"grid gap-6 xl:grid-cols-[minmax(0,1fr)_340px]\">\n {/* Main column */}\n <div className=\"min-w-0 space-y-6\">\n {hasData && (\n <div className=\"grid gap-4 lg:grid-cols-2\">\n <ChartCard\n title=\"Custody mix\"\n subtitle=\"Where every record stands right now\"\n icon={PackageCheck}\n >\n <DonutChart\n data={statusMix}\n centerLabel=\"Records\"\n centerValue={assignments.length}\n ariaLabel=\"Custody status mix\"\n />\n </ChartCard>\n <ChartCard\n title=\"Checkouts over time\"\n subtitle=\"Custody activity, last 6 months\"\n icon={ArrowUpFromLine}\n >\n {hasTrend ? (\n <TrendChart\n data={checkoutTrend}\n xKey=\"label\"\n series={[{ key: 'checkouts', label: 'Checkouts' }]}\n height={220}\n ariaLabel=\"Checkouts per month\"\n />\n ) : (\n <div className=\"flex h-[220px] items-center justify-center text-sm text-text-secondary\">\n Not enough dated history yet.\n </div>\n )}\n </ChartCard>\n </div>\n )}\n\n <div className=\"relative max-w-md\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 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 className=\"max-w-full justify-start overflow-x-auto\">\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\n ? filteredRecords\n : filteredRecords.filter((r) => r.status === status);\n return (\n <TabsContent key={tab} value={tab} className=\"mt-4\">\n {renderRecords(records)}\n </TabsContent>\n );\n })}\n </Tabs>\n </div>\n\n {/* Persistent check-out rail */}\n <aside className=\"xl:sticky xl:top-4 xl:h-fit\">\n <GlassCard treatment=\"glass\" className=\"border-border-seam\">\n <form className=\"space-y-4 p-5\" onSubmit={submitCheckout}>\n <div className=\"flex items-center gap-2\">\n <ArrowUpFromLine className=\"h-4 w-4 text-action-primary-text\" />\n <h2 className=\"text-base font-semibold text-text-primary\">Check out an asset</h2>\n </div>\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"checkout-asset\">Asset</Label>\n <Select value={assetId} onValueChange={setAssetId}>\n <SelectTrigger id=\"checkout-asset\" className=\"w-full\">\n <SelectValue placeholder=\"Select an asset…\" />\n </SelectTrigger>\n <SelectContent>\n {assets.map((asset) => (\n <SelectItem key={asset.id} value={asset.id}>\n {asset.name} ({asset.assetTag})\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"checkout-assignee\">Assign to</Label>\n <Input\n id=\"checkout-assignee\"\n placeholder=\"Name or email\"\n value={assignedTo}\n onChange={(event) => setAssignedTo(event.target.value)}\n />\n </div>\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"checkout-due\">Due date</Label>\n <Input\n id=\"checkout-due\"\n type=\"date\"\n value={dueAt}\n onChange={(event) => setDueAt(event.target.value)}\n />\n </div>\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"checkout-notes\">Notes</Label>\n <Textarea\n id=\"checkout-notes\"\n placeholder=\"Optional context for this checkout…\"\n rows={3}\n value={notes}\n onChange={(event) => setNotes(event.target.value)}\n />\n </div>\n\n <Button type=\"submit\" className=\"w-full\" disabled={checkingOut}>\n <ArrowUpFromLine className=\"mr-2 h-4 w-4\" />\n {checkingOut ? 'Checking out…' : 'Check Out Asset'}\n </Button>\n </form>\n </GlassCard>\n </aside>\n </div>\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 { useEffect, useMemo, useRef, useState } from 'react';\nimport {\n Button,\n Input,\n Textarea,\n Label,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n GlassCard,\n PagePurpose,\n IllustratedEmptyState,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@burdenoff/fe-libs/ui';\nimport {\n ArrowDownToLine,\n ArrowUpFromLine,\n Clock,\n Search,\n AlertTriangle,\n PackageCheck,\n ScanLine,\n} 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';\nimport { cn } from '../utils/cn';\nimport { SectionHeader, StatTile, ChartCard, DonutChart, TrendChart } from '../components';\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 CHECK_OUT_ASSET_BY_TAG_MUTATION = gql`\n mutation AssetHandlerCheckOutAssetByTag($input: CheckOutAssetByTagInput!) {\n checkOutAssetByTag(input: $input) {\n id\n status\n }\n }\n`;\n\nconst CHECK_IN_ASSET_BY_TAG_MUTATION = gql`\n mutation AssetHandlerCheckInAssetByTag($input: CheckInAssetByTagInput!) {\n checkInAssetByTag(input: $input) {\n id\n status\n }\n }\n`;\n\n// Branded soft status pills — amber = checked out, green = returned, red = overdue.\nconst STATUS_PILL: Record<AssignmentStatus, string> = {\n CHECKED_OUT: 'bg-status-warning-subtle text-status-warning-text',\n RETURNED: 'bg-status-success-subtle text-status-success-text',\n OVERDUE: 'bg-status-error-subtle text-status-error-text',\n};\n\nconst STATUS_LABEL: Record<AssignmentStatus, string> = {\n CHECKED_OUT: 'Checked out',\n RETURNED: 'Returned',\n OVERDUE: 'Overdue',\n};\n\nconst STATUS_DONUT_COLOR: Record<AssignmentStatus, string> = {\n CHECKED_OUT: 'var(--color-status-warning-bg)',\n OVERDUE: 'var(--color-status-error-bg)',\n RETURNED: 'var(--color-status-success-bg)',\n};\n\nfunction StatusPill({ status }: { status: AssignmentStatus }) {\n return (\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium',\n STATUS_PILL[status]\n )}\n >\n {STATUS_LABEL[status]}\n </span>\n );\n}\n\nfunction initials(value: string): string {\n const trimmed = value.trim();\n if (!trimmed) return '?';\n const parts = trimmed.split(/[\\s@._-]+/).filter(Boolean);\n const first = parts[0]?.[0] ?? trimmed[0];\n const second = parts.length > 1 ? parts[1][0] : '';\n return (first + second).toUpperCase();\n}\n\nfunction PersonChip({ name, by }: { name: string; by: string }) {\n return (\n <div className=\"flex items-center gap-2.5\">\n <span\n aria-hidden=\"true\"\n className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-action-primary-bg/10 text-xs font-semibold text-action-primary-text\"\n >\n {initials(name)}\n </span>\n <div className=\"min-w-0\">\n <p className=\"truncate text-sm text-text-primary\">{name || '—'}</p>\n <p className=\"truncate text-xs text-text-secondary\">by {by}</p>\n </div>\n </div>\n );\n}\n\nfunction daysUntil(dueAt: string): number | null {\n const due = new Date(dueAt);\n if (Number.isNaN(due.getTime())) return null;\n const today = new Date();\n const start = new Date(today.getFullYear(), today.getMonth(), today.getDate());\n const target = new Date(due.getFullYear(), due.getMonth(), due.getDate());\n return Math.round((target.getTime() - start.getTime()) / 86_400_000);\n}\n\nfunction DueChip({ dueAt, status }: { dueAt: string | null; status: AssignmentStatus }) {\n if (status === 'RETURNED' || !dueAt) return null;\n const days = daysUntil(dueAt);\n if (days === null) return null;\n let label: string;\n let tone: string;\n if (days < 0) {\n label = `${-days}d overdue`;\n tone = 'bg-status-error-subtle text-status-error-text';\n } else if (days === 0) {\n label = 'Due today';\n tone = 'bg-status-warning-subtle text-status-warning-text';\n } else if (days <= 3) {\n label = `Due in ${days}d`;\n tone = 'bg-status-warning-subtle text-status-warning-text';\n } else {\n label = `Due in ${days}d`;\n tone = 'bg-bg-sunken text-text-secondary';\n }\n return (\n <span className={cn('inline-flex rounded-full px-2 py-0.5 text-[11px] font-medium', tone)}>\n {label}\n </span>\n );\n}\n\nconst fmtDate = (iso: string | null): string =>\n iso\n ? new Date(iso).toLocaleDateString(undefined, {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n })\n : '—';\n\nexport function AssetsAssetCheckInOutPage() {\n const { assets } = useAssetHandlerStore();\n const [searchQuery, setSearchQuery] = useState('');\n const [assetId, setAssetId] = useState('');\n const [assignedTo, setAssignedTo] = useState('');\n const [dueAt, setDueAt] = useState('');\n const [notes, setNotes] = useState('');\n\n // Scan-based check-in/out state (BOFF-3950).\n const scanInputRef = useRef<HTMLInputElement>(null);\n const [scanTagId, setScanTagId] = useState('');\n const [scanCheckoutMode, setScanCheckoutMode] = useState(false);\n const [scanAssignee, setScanAssignee] = useState('');\n const [scanDueAt, setScanDueAt] = useState('');\n const [scanNotes, setScanNotes] = 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 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 [checkOutAssetByTag, { loading: checkingOutByTag }] = useMutation(\n CHECK_OUT_ASSET_BY_TAG_MUTATION,\n {\n onCompleted: () => {\n notify.success('Asset checked out', 'The assignment has been recorded.');\n resetScanForm();\n void refetch();\n },\n onError: (error) => notify.error('Scan check-out failed', error.message),\n }\n );\n\n const [checkInAssetByTag, { loading: checkingInByTag }] = useMutation(\n CHECK_IN_ASSET_BY_TAG_MUTATION,\n {\n onCompleted: () => {\n notify.success('Asset checked in', 'The asset has been returned.');\n resetScanForm();\n void refetch();\n },\n onError: (error) => notify.error('Scan check-in failed', error.message),\n }\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 // Status mix (real snapshot counts) — zero slices are dropped by DonutChart.\n const statusMix = [\n { name: 'Checked out', value: activeCheckouts.length, color: STATUS_DONUT_COLOR.CHECKED_OUT },\n { name: 'Overdue', value: overdueCheckouts.length, color: STATUS_DONUT_COLOR.OVERDUE },\n { name: 'Returned', value: returnedRecords.length, color: STATUS_DONUT_COLOR.RETURNED },\n ];\n\n // Checkouts over the last 6 months, bucketed from real checkedOutAt timestamps.\n const checkoutTrend = useMemo(() => {\n const base = new Date();\n const buckets = Array.from({ length: 6 }, (_, i) => {\n const d = new Date(base.getFullYear(), base.getMonth() - (5 - i), 1);\n return {\n key: `${d.getFullYear()}-${d.getMonth()}`,\n label: d.toLocaleDateString(undefined, { month: 'short' }),\n checkouts: 0,\n };\n });\n const index = new Map(buckets.map((b, i) => [b.key, i]));\n for (const a of assignments) {\n const d = new Date(a.checkedOutAt);\n if (Number.isNaN(d.getTime())) continue;\n const i = index.get(`${d.getFullYear()}-${d.getMonth()}`);\n if (i !== undefined) buckets[i].checkouts += 1;\n }\n return buckets;\n }, [assignments]);\n\n const hasTrend = checkoutTrend.some((b) => b.checkouts > 0);\n const hasData = assignments.length > 0;\n\n const activeCheckoutForTag = (tagId: string): AssetAssignment | undefined => {\n const asset = assets.find((a) => a.tagId === tagId || a.assetTag === tagId || a.id === tagId);\n if (!asset) return undefined;\n return assignments.find((a) => a.assetId === asset.id && a.status !== 'RETURNED');\n };\n\n const resetScanForm = () => {\n setScanTagId('');\n setScanCheckoutMode(false);\n setScanAssignee('');\n setScanDueAt('');\n setScanNotes('');\n scanInputRef.current?.focus();\n };\n\n const submitScan = (event: React.FormEvent) => {\n event.preventDefault();\n const tagId = scanTagId.trim();\n if (!tagId) {\n notify.warning('Enter a tag', 'Scan or type the asset tag to continue.');\n return;\n }\n\n const asset = assets.find((a) => a.tagId === tagId || a.assetTag === tagId || a.id === tagId);\n if (!asset) {\n notify.error('Unknown tag', `No asset matched \"${tagId}\".`);\n return;\n }\n\n const activeCheckout = activeCheckoutForTag(tagId);\n\n if (scanCheckoutMode) {\n // Already in checkout mode — perform the checkout.\n if (!scanAssignee.trim()) {\n notify.warning('Assignee required', 'Enter who is receiving the asset.');\n return;\n }\n void checkOutAssetByTag({\n variables: {\n input: {\n tagId: asset.tagId,\n assignedTo: scanAssignee.trim(),\n dueAt: scanDueAt ? new Date(scanDueAt).toISOString() : null,\n notes: scanNotes.trim() || null,\n },\n },\n });\n return;\n }\n\n if (activeCheckout) {\n // Asset is currently checked out — check it in.\n void checkInAssetByTag({\n variables: {\n input: {\n tagId: asset.tagId,\n notes: scanNotes.trim() || null,\n },\n },\n });\n return;\n }\n\n // Asset is available — switch to checkout mode.\n setScanCheckoutMode(true);\n notify.info(\n 'Ready to check out',\n `${asset.name} is available. Add assignee details and scan again.`\n );\n };\n\n // `/` focuses the scan input from anywhere on the page.\n useEffect(() => {\n const handler = (event: KeyboardEvent) => {\n if (\n event.key === '/' &&\n !['INPUT', 'TEXTAREA'].includes((event.target as HTMLElement)?.tagName)\n ) {\n event.preventDefault();\n scanInputRef.current?.focus();\n }\n };\n window.addEventListener('keydown', handler);\n return () => window.removeEventListener('keydown', handler);\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 const checkInButton = (rec: AssetAssignment) =>\n rec.status !== 'RETURNED' ? (\n <Button\n size=\"sm\"\n variant=\"outline\"\n disabled={checkingIn}\n onClick={() => void checkInAsset({ variables: { input: { assignmentId: rec.id } } })}\n >\n <ArrowDownToLine className=\"mr-1.5 h-3.5 w-3.5\" />\n Check In\n </Button>\n ) : null;\n\n const renderRecords = (records: AssetAssignment[]) => (\n <GlassCard treatment=\"glass\" className=\"overflow-hidden border-border-seam\">\n {/* Desktop table */}\n <div className=\"hidden overflow-x-auto md:block\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b border-border-seam bg-bg-sunken/40\">\n <th className=\"p-3 text-left font-medium text-text-secondary\">Asset</th>\n <th className=\"p-3 text-left font-medium text-text-secondary\">Assigned to</th>\n <th className=\"p-3 text-left font-medium text-text-secondary\">Checked out</th>\n <th className=\"p-3 text-left font-medium text-text-secondary\">Due</th>\n <th className=\"p-3 text-left font-medium text-text-secondary\">Returned</th>\n <th className=\"p-3 text-left font-medium text-text-secondary\">Status</th>\n <th className=\"p-3 text-right font-medium text-text-secondary\">Action</th>\n </tr>\n </thead>\n <tbody>\n {records.map((rec) => {\n const overdue = rec.status === 'OVERDUE';\n return (\n <tr\n key={rec.id}\n className={cn(\n 'border-b border-border-seam/70 transition-colors',\n overdue\n ? 'border-l-2 border-l-status-error-text bg-status-error-subtle/50 hover:bg-status-error-subtle'\n : 'hover:bg-bg-sunken/50'\n )}\n >\n <td className=\"p-3\">\n <p className=\"font-medium text-text-primary\">{rec.assetName}</p>\n <p className=\"font-mono text-xs text-text-secondary\">{rec.assetId}</p>\n </td>\n <td className=\"p-3\">\n <PersonChip name={rec.assignedTo} by={rec.assignedBy} />\n </td>\n <td className=\"p-3 text-xs text-text-secondary\">{fmtDate(rec.checkedOutAt)}</td>\n <td className=\"p-3\">\n <div className=\"flex flex-col items-start gap-1\">\n <span className=\"text-xs text-text-secondary\">{fmtDate(rec.dueAt)}</span>\n <DueChip dueAt={rec.dueAt} status={rec.status} />\n </div>\n </td>\n <td className=\"p-3 text-xs text-text-secondary\">{fmtDate(rec.checkedInAt)}</td>\n <td className=\"p-3\">\n <StatusPill status={rec.status} />\n </td>\n <td className=\"p-3 text-right\">{checkInButton(rec)}</td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n\n {/* Mobile stacked cards */}\n <div className=\"divide-y divide-border-seam md:hidden\">\n {records.map((rec) => {\n const overdue = rec.status === 'OVERDUE';\n const action = checkInButton(rec);\n return (\n <div\n key={rec.id}\n className={cn(\n 'space-y-3 p-4',\n overdue && 'border-l-2 border-l-status-error-text bg-status-error-subtle/40'\n )}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <p className=\"truncate font-medium text-text-primary\">{rec.assetName}</p>\n <p className=\"font-mono text-xs text-text-secondary\">{rec.assetId}</p>\n </div>\n <StatusPill status={rec.status} />\n </div>\n <PersonChip name={rec.assignedTo} by={rec.assignedBy} />\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-1 text-xs text-text-secondary\">\n <span>Out {fmtDate(rec.checkedOutAt)}</span>\n <span>Due {fmtDate(rec.dueAt)}</span>\n <DueChip dueAt={rec.dueAt} status={rec.status} />\n </div>\n {action ? <div>{action}</div> : null}\n </div>\n );\n })}\n </div>\n\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 key={i} className=\"h-10 rounded-md bg-bg-sunken motion-safe:animate-vc-shimmer\" />\n ))}\n </div>\n ) : null}\n </GlassCard>\n );\n\n return (\n <div className=\"space-y-6 p-4 sm:p-6\">\n <SectionHeader\n hero\n icon={PackageCheck}\n title=\"Asset Check-In / Check-Out\"\n description=\"Manage asset assignments and returns\"\n />\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 {/* Uniform KPI band */}\n <div className=\"grid gap-4 sm:grid-cols-2 xl:grid-cols-4\">\n <StatTile\n label=\"Active checkouts\"\n value={activeCheckouts.length}\n icon={ArrowUpFromLine}\n hero\n />\n <StatTile\n label=\"Overdue\"\n value={overdueCheckouts.length}\n icon={AlertTriangle}\n delta={overdueCheckouts.length > 0 ? 'chase now' : undefined}\n deltaTone=\"negative\"\n deltaDirection=\"up\"\n />\n <StatTile label=\"Returned\" value={returnedRecords.length} icon={ArrowDownToLine} />\n <StatTile label=\"Total records\" value={assignments.length} icon={Clock} />\n </div>\n\n <div className=\"grid gap-6 xl:grid-cols-[minmax(0,1fr)_340px]\">\n {/* Main column */}\n <div className=\"min-w-0 space-y-6\">\n {hasData && (\n <div className=\"grid gap-4 lg:grid-cols-2\">\n <ChartCard\n title=\"Custody mix\"\n subtitle=\"Where every record stands right now\"\n icon={PackageCheck}\n >\n <DonutChart\n data={statusMix}\n centerLabel=\"Records\"\n centerValue={assignments.length}\n ariaLabel=\"Custody status mix\"\n />\n </ChartCard>\n <ChartCard\n title=\"Checkouts over time\"\n subtitle=\"Custody activity, last 6 months\"\n icon={ArrowUpFromLine}\n >\n {hasTrend ? (\n <TrendChart\n data={checkoutTrend}\n xKey=\"label\"\n series={[{ key: 'checkouts', label: 'Checkouts' }]}\n height={220}\n ariaLabel=\"Checkouts per month\"\n />\n ) : (\n <div className=\"flex h-[220px] items-center justify-center text-sm text-text-secondary\">\n Not enough dated history yet.\n </div>\n )}\n </ChartCard>\n </div>\n )}\n\n <GlassCard treatment=\"glass\" className=\"border-border-seam\">\n <form className=\"space-y-4 p-5\" onSubmit={submitScan}>\n <div className=\"flex items-center gap-2\">\n <ScanLine className=\"h-4 w-4 text-action-primary-text\" />\n <h2 className=\"text-base font-semibold text-text-primary\">Scan asset tag</h2>\n <span className=\"ml-auto text-xs text-text-secondary\">Press / to focus</span>\n </div>\n\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-end\">\n <div className=\"relative min-w-0 flex-1\">\n <ScanLine className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-secondary\" />\n <Input\n ref={scanInputRef}\n placeholder=\"Scan or type asset tag…\"\n value={scanTagId}\n onChange={(e) => setScanTagId(e.target.value)}\n className=\"pl-9\"\n autoFocus\n />\n </div>\n <Button\n type=\"submit\"\n disabled={checkingOutByTag || checkingInByTag}\n className=\"w-full sm:w-auto\"\n >\n <ScanLine className=\"mr-2 h-4 w-4\" />\n {checkingOutByTag || checkingInByTag\n ? 'Processing…'\n : scanCheckoutMode\n ? 'Check Out'\n : 'Scan'}\n </Button>\n </div>\n\n {scanCheckoutMode && (\n <div className=\"grid gap-4 sm:grid-cols-3\">\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"scan-assignee\">Assign to</Label>\n <Input\n id=\"scan-assignee\"\n placeholder=\"Name or email\"\n value={scanAssignee}\n onChange={(e) => setScanAssignee(e.target.value)}\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"scan-due\">Due date</Label>\n <Input\n id=\"scan-due\"\n type=\"date\"\n value={scanDueAt}\n onChange={(e) => setScanDueAt(e.target.value)}\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"scan-notes\">Notes</Label>\n <Input\n id=\"scan-notes\"\n placeholder=\"Optional notes\"\n value={scanNotes}\n onChange={(e) => setScanNotes(e.target.value)}\n />\n </div>\n </div>\n )}\n\n {scanCheckoutMode && (\n <div className=\"flex items-center gap-2 text-xs text-text-secondary\">\n <button\n type=\"button\"\n className=\"text-action-primary-text hover:underline\"\n onClick={resetScanForm}\n >\n Cancel\n </button>\n <span>to start over.</span>\n </div>\n )}\n </form>\n </GlassCard>\n\n <div className=\"relative max-w-md\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 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 className=\"max-w-full justify-start overflow-x-auto\">\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\n ? filteredRecords\n : filteredRecords.filter((r) => r.status === status);\n return (\n <TabsContent key={tab} value={tab} className=\"mt-4\">\n {renderRecords(records)}\n </TabsContent>\n );\n })}\n </Tabs>\n </div>\n\n {/* Persistent check-out rail */}\n <aside className=\"xl:sticky xl:top-4 xl:h-fit\">\n <GlassCard treatment=\"glass\" className=\"border-border-seam\">\n <form className=\"space-y-4 p-5\" onSubmit={submitCheckout}>\n <div className=\"flex items-center gap-2\">\n <ArrowUpFromLine className=\"h-4 w-4 text-action-primary-text\" />\n <h2 className=\"text-base font-semibold text-text-primary\">Check out an asset</h2>\n </div>\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"checkout-asset\">Asset</Label>\n <Select value={assetId} onValueChange={setAssetId}>\n <SelectTrigger id=\"checkout-asset\" className=\"w-full\">\n <SelectValue placeholder=\"Select an asset…\" />\n </SelectTrigger>\n <SelectContent>\n {assets.map((asset) => (\n <SelectItem key={asset.id} value={asset.id}>\n {asset.name} ({asset.assetTag})\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"checkout-assignee\">Assign to</Label>\n <Input\n id=\"checkout-assignee\"\n placeholder=\"Name or email\"\n value={assignedTo}\n onChange={(event) => setAssignedTo(event.target.value)}\n />\n </div>\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"checkout-due\">Due date</Label>\n <Input\n id=\"checkout-due\"\n type=\"date\"\n value={dueAt}\n onChange={(event) => setDueAt(event.target.value)}\n />\n </div>\n\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"checkout-notes\">Notes</Label>\n <Textarea\n id=\"checkout-notes\"\n placeholder=\"Optional context for this checkout…\"\n rows={3}\n value={notes}\n onChange={(event) => setNotes(event.target.value)}\n />\n </div>\n\n <Button type=\"submit\" className=\"w-full\" disabled={checkingOut}>\n <ArrowUpFromLine className=\"mr-2 h-4 w-4\" />\n {checkingOut ? 'Checking out…' : 'Check Out Asset'}\n </Button>\n </form>\n </GlassCard>\n </aside>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssetsAssetDetailPage.d.ts","sourceRoot":"","sources":["../../../src/assethandler/pages/AssetsAssetDetailPage.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"AssetsAssetDetailPage.d.ts","sourceRoot":"","sources":["../../../src/assethandler/pages/AssetsAssetDetailPage.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAwS/B,wBAAgB,qBAAqB,sBA22BpC"}
|