@burdenoff/microfe-assethandler 2026.703.7 → 2026.703.9

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 (51) hide show
  1. package/dist/assethandler/pages/AnalyticsPage.js +21 -18
  2. package/dist/assethandler/pages/AnalyticsPage.js.map +1 -1
  3. package/dist/assethandler/pages/AssetsAssetCheckInOutPage.js +37 -34
  4. package/dist/assethandler/pages/AssetsAssetCheckInOutPage.js.map +1 -1
  5. package/dist/assethandler/pages/AssetsAssetCreatePage.js +1 -0
  6. package/dist/assethandler/pages/AssetsAssetCreatePage.js.map +1 -1
  7. package/dist/assethandler/pages/AssetsAssetDetailPage.js +22 -18
  8. package/dist/assethandler/pages/AssetsAssetDetailPage.js.map +1 -1
  9. package/dist/assethandler/pages/AssetsAssetListPage.js +6 -0
  10. package/dist/assethandler/pages/AssetsAssetListPage.js.map +1 -1
  11. package/dist/assethandler/pages/CmdbBrowserPage.js +3 -3
  12. package/dist/assethandler/pages/CmdbBrowserPage.js.map +1 -1
  13. package/dist/assethandler/pages/DigitalTwinPage.js.map +1 -1
  14. package/dist/assethandler/pages/DiscoveryJobsPage.js +3 -3
  15. package/dist/assethandler/pages/DiscoveryJobsPage.js.map +1 -1
  16. package/dist/assethandler/pages/FinanceBudgetDetailPage.js +2 -1
  17. package/dist/assethandler/pages/FinanceBudgetDetailPage.js.map +1 -1
  18. package/dist/assethandler/pages/FinanceFinanceHubPage.js +2 -2
  19. package/dist/assethandler/pages/FinanceFinanceHubPage.js.map +1 -1
  20. package/dist/assethandler/pages/FinanceInvoiceDetailPage.js +1 -0
  21. package/dist/assethandler/pages/FinanceInvoiceDetailPage.js.map +1 -1
  22. package/dist/assethandler/pages/IotDevicesPage.js +3 -3
  23. package/dist/assethandler/pages/IotDevicesPage.js.map +1 -1
  24. package/dist/assethandler/pages/ItilChangeDetailPage.js +1 -0
  25. package/dist/assethandler/pages/ItilChangeDetailPage.js.map +1 -1
  26. package/dist/assethandler/pages/ItilDialogs.js.map +1 -1
  27. package/dist/assethandler/pages/ItilIncidentDetailPage.js +1 -0
  28. package/dist/assethandler/pages/ItilIncidentDetailPage.js.map +1 -1
  29. package/dist/assethandler/pages/ItilProblemDetailPage.js +1 -0
  30. package/dist/assethandler/pages/ItilProblemDetailPage.js.map +1 -1
  31. package/dist/assethandler/pages/KnowledgeBasePage.js.map +1 -1
  32. package/dist/assethandler/pages/MaintenanceMaintenanceCalendarPage.js +36 -33
  33. package/dist/assethandler/pages/MaintenanceMaintenanceCalendarPage.js.map +1 -1
  34. package/dist/assethandler/pages/OperationsMaintenanceDetailPage.js +1 -0
  35. package/dist/assethandler/pages/OperationsMaintenanceDetailPage.js.map +1 -1
  36. package/dist/assethandler/pages/OperationsWorkOrderDetailPage.js +1 -0
  37. package/dist/assethandler/pages/OperationsWorkOrderDetailPage.js.map +1 -1
  38. package/dist/assethandler/pages/ProvenancePage.js +3 -3
  39. package/dist/assethandler/pages/ProvenancePage.js.map +1 -1
  40. package/dist/assethandler/pages/ReportsDashboardPage.js +21 -18
  41. package/dist/assethandler/pages/ReportsDashboardPage.js.map +1 -1
  42. package/dist/assethandler/pages/SamLicensesPage.js +3 -3
  43. package/dist/assethandler/pages/SamLicensesPage.js.map +1 -1
  44. package/dist/assethandler/pages/SecurityComplianceDetailPage.js +1 -0
  45. package/dist/assethandler/pages/SecurityComplianceDetailPage.js.map +1 -1
  46. package/dist/assethandler/pages/SecurityPolicyDetailPage.js +1 -0
  47. package/dist/assethandler/pages/SecurityPolicyDetailPage.js.map +1 -1
  48. package/dist/assethandler/pages/SecuritySecurityEventDetailPage.js +1 -0
  49. package/dist/assethandler/pages/SecuritySecurityEventDetailPage.js.map +1 -1
  50. package/dist/assethandler/pages/SecuritySecurityHubPage.js.map +1 -1
  51. package/package.json +1 -1
@@ -1 +1 @@
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 // Financial details\n purchaseValue: '',\n purchaseDate: '',\n usefulLifeMonths: '',\n salvageValue: '',\n depreciationMethod: 'STRAIGHT_LINE',\n warrantyExpiry: '',\n supplier: '',\n department: '',\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\n const numericField = (value: string, label: string, key: string) => {\n if (value.trim() === '') return;\n const parsed = Number(value);\n if (Number.isNaN(parsed) || parsed < 0)\n nextErrors[key] = `${label} must be a positive number`;\n };\n numericField(formData.purchaseValue, 'Purchase value', 'purchaseValue');\n numericField(formData.salvageValue, 'Salvage value', 'salvageValue');\n numericField(formData.usefulLifeMonths, 'Useful life', 'usefulLifeMonths');\n\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 const optionalNumber = (value: string): number | null => {\n const trimmed = value.trim();\n if (trimmed === '') return null;\n const parsed = Number(trimmed);\n return Number.isNaN(parsed) ? null : parsed;\n };\n const optionalDate = (value: string): string | null =>\n value.trim() === '' ? null : new Date(value).toISOString();\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 // Financial details\n purchaseValue: optionalNumber(formData.purchaseValue),\n purchaseDate: optionalDate(formData.purchaseDate),\n usefulLifeMonths: optionalNumber(formData.usefulLifeMonths),\n salvageValue: optionalNumber(formData.salvageValue),\n depreciationMethod: formData.depreciationMethod,\n warrantyExpiry: optionalDate(formData.warrantyExpiry),\n supplier: formData.supplier.trim() || null,\n department: formData.department.trim() || null,\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 <Card>\n <CardHeader>\n <CardTitle>Financial Details</CardTitle>\n <CardDescription>\n Purchase and depreciation data powers book value, TCO and finance reports\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"grid gap-4 md:grid-cols-3\">\n <div className=\"space-y-2\">\n <Label>Purchase Value</Label>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"0.01\"\n placeholder=\"e.g., 1200\"\n value={formData.purchaseValue}\n onChange={(e) => handleChange('purchaseValue', e.target.value)}\n aria-invalid={!!errors.purchaseValue}\n />\n {errors.purchaseValue ? (\n <p className=\"text-xs text-status-error-text\">{errors.purchaseValue}</p>\n ) : null}\n </div>\n <div className=\"space-y-2\">\n <Label>Purchase Date</Label>\n <Input\n type=\"date\"\n value={formData.purchaseDate}\n onChange={(e) => handleChange('purchaseDate', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Supplier</Label>\n <Input\n placeholder=\"e.g., Dell Technologies\"\n value={formData.supplier}\n onChange={(e) => handleChange('supplier', e.target.value)}\n />\n </div>\n </div>\n <div className=\"grid gap-4 md:grid-cols-3\">\n <div className=\"space-y-2\">\n <Label>Useful Life (months)</Label>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"1\"\n placeholder=\"e.g., 60\"\n value={formData.usefulLifeMonths}\n onChange={(e) => handleChange('usefulLifeMonths', e.target.value)}\n aria-invalid={!!errors.usefulLifeMonths}\n />\n {errors.usefulLifeMonths ? (\n <p className=\"text-xs text-status-error-text\">{errors.usefulLifeMonths}</p>\n ) : null}\n </div>\n <div className=\"space-y-2\">\n <Label>Salvage Value</Label>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"0.01\"\n placeholder=\"e.g., 100\"\n value={formData.salvageValue}\n onChange={(e) => handleChange('salvageValue', e.target.value)}\n aria-invalid={!!errors.salvageValue}\n />\n {errors.salvageValue ? (\n <p className=\"text-xs text-status-error-text\">{errors.salvageValue}</p>\n ) : null}\n </div>\n <div className=\"space-y-2\">\n <Label>Depreciation Method</Label>\n <Select\n value={formData.depreciationMethod}\n onValueChange={(v) => handleChange('depreciationMethod', v)}\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"STRAIGHT_LINE\">Straight line</SelectItem>\n <SelectItem value=\"REDUCING_BALANCE\">Reducing balance</SelectItem>\n <SelectItem value=\"NONE\">None</SelectItem>\n </SelectContent>\n </Select>\n </div>\n </div>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Warranty Expiry</Label>\n <Input\n type=\"date\"\n value={formData.warrantyExpiry}\n onChange={(e) => handleChange('warrantyExpiry', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Department</Label>\n <Input\n placeholder=\"e.g., Engineering\"\n value={formData.department}\n onChange={(e) => handleChange('department', e.target.value)}\n />\n </div>\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 // Financial details\n purchaseValue: '',\n purchaseDate: '',\n usefulLifeMonths: '',\n salvageValue: '',\n depreciationMethod: 'STRAIGHT_LINE',\n warrantyExpiry: '',\n supplier: '',\n department: '',\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\n const numericField = (value: string, label: string, key: string) => {\n if (value.trim() === '') return;\n const parsed = Number(value);\n if (Number.isNaN(parsed) || parsed < 0)\n nextErrors[key] = `${label} must be a positive number`;\n };\n numericField(formData.purchaseValue, 'Purchase value', 'purchaseValue');\n numericField(formData.salvageValue, 'Salvage value', 'salvageValue');\n numericField(formData.usefulLifeMonths, 'Useful life', 'usefulLifeMonths');\n\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 const optionalNumber = (value: string): number | null => {\n const trimmed = value.trim();\n if (trimmed === '') return null;\n const parsed = Number(trimmed);\n return Number.isNaN(parsed) ? null : parsed;\n };\n const optionalDate = (value: string): string | null =>\n value.trim() === '' ? null : new Date(value).toISOString();\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 // Financial details\n purchaseValue: optionalNumber(formData.purchaseValue),\n purchaseDate: optionalDate(formData.purchaseDate),\n usefulLifeMonths: optionalNumber(formData.usefulLifeMonths),\n salvageValue: optionalNumber(formData.salvageValue),\n depreciationMethod: formData.depreciationMethod,\n warrantyExpiry: optionalDate(formData.warrantyExpiry),\n supplier: formData.supplier.trim() || null,\n department: formData.department.trim() || null,\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\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"Go back\"\n onClick={() => navigate('/assets/asset-list')}\n >\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 <Card>\n <CardHeader>\n <CardTitle>Financial Details</CardTitle>\n <CardDescription>\n Purchase and depreciation data powers book value, TCO and finance reports\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"grid gap-4 md:grid-cols-3\">\n <div className=\"space-y-2\">\n <Label>Purchase Value</Label>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"0.01\"\n placeholder=\"e.g., 1200\"\n value={formData.purchaseValue}\n onChange={(e) => handleChange('purchaseValue', e.target.value)}\n aria-invalid={!!errors.purchaseValue}\n />\n {errors.purchaseValue ? (\n <p className=\"text-xs text-status-error-text\">{errors.purchaseValue}</p>\n ) : null}\n </div>\n <div className=\"space-y-2\">\n <Label>Purchase Date</Label>\n <Input\n type=\"date\"\n value={formData.purchaseDate}\n onChange={(e) => handleChange('purchaseDate', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Supplier</Label>\n <Input\n placeholder=\"e.g., Dell Technologies\"\n value={formData.supplier}\n onChange={(e) => handleChange('supplier', e.target.value)}\n />\n </div>\n </div>\n <div className=\"grid gap-4 md:grid-cols-3\">\n <div className=\"space-y-2\">\n <Label>Useful Life (months)</Label>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"1\"\n placeholder=\"e.g., 60\"\n value={formData.usefulLifeMonths}\n onChange={(e) => handleChange('usefulLifeMonths', e.target.value)}\n aria-invalid={!!errors.usefulLifeMonths}\n />\n {errors.usefulLifeMonths ? (\n <p className=\"text-xs text-status-error-text\">{errors.usefulLifeMonths}</p>\n ) : null}\n </div>\n <div className=\"space-y-2\">\n <Label>Salvage Value</Label>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"0.01\"\n placeholder=\"e.g., 100\"\n value={formData.salvageValue}\n onChange={(e) => handleChange('salvageValue', e.target.value)}\n aria-invalid={!!errors.salvageValue}\n />\n {errors.salvageValue ? (\n <p className=\"text-xs text-status-error-text\">{errors.salvageValue}</p>\n ) : null}\n </div>\n <div className=\"space-y-2\">\n <Label>Depreciation Method</Label>\n <Select\n value={formData.depreciationMethod}\n onValueChange={(v) => handleChange('depreciationMethod', v)}\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"STRAIGHT_LINE\">Straight line</SelectItem>\n <SelectItem value=\"REDUCING_BALANCE\">Reducing balance</SelectItem>\n <SelectItem value=\"NONE\">None</SelectItem>\n </SelectContent>\n </Select>\n </div>\n </div>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Warranty Expiry</Label>\n <Input\n type=\"date\"\n value={formData.warrantyExpiry}\n onChange={(e) => handleChange('warrantyExpiry', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Department</Label>\n <Input\n placeholder=\"e.g., Engineering\"\n value={formData.department}\n onChange={(e) => handleChange('department', e.target.value)}\n />\n </div>\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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"}
@@ -198,6 +198,7 @@ function F() {
198
198
  children: [/* @__PURE__ */ l(f, {
199
199
  variant: "ghost",
200
200
  size: "icon",
201
+ "aria-label": "Go back",
201
202
  onClick: () => s("/assets/asset-list"),
202
203
  children: /* @__PURE__ */ l(ie, { className: "h-4 w-4" })
203
204
  }), /* @__PURE__ */ u("div", { children: [/* @__PURE__ */ u("div", {
@@ -323,24 +324,27 @@ function F() {
323
324
  /* @__PURE__ */ u(ve, {
324
325
  defaultValue: "details",
325
326
  children: [
326
- /* @__PURE__ */ u(ye, { children: [
327
- /* @__PURE__ */ l(M, {
328
- value: "details",
329
- children: "Details"
330
- }),
331
- /* @__PURE__ */ l(M, {
332
- value: "financial",
333
- children: "Financial"
334
- }),
335
- /* @__PURE__ */ l(M, {
336
- value: "maintenance",
337
- children: "Maintenance"
338
- }),
339
- /* @__PURE__ */ l(M, {
340
- value: "discussion",
341
- children: "Discussion"
342
- })
343
- ] }),
327
+ /* @__PURE__ */ u(ye, {
328
+ className: "max-w-full justify-start overflow-x-auto",
329
+ children: [
330
+ /* @__PURE__ */ l(M, {
331
+ value: "details",
332
+ children: "Details"
333
+ }),
334
+ /* @__PURE__ */ l(M, {
335
+ value: "financial",
336
+ children: "Financial"
337
+ }),
338
+ /* @__PURE__ */ l(M, {
339
+ value: "maintenance",
340
+ children: "Maintenance"
341
+ }),
342
+ /* @__PURE__ */ l(M, {
343
+ value: "discussion",
344
+ children: "Discussion"
345
+ })
346
+ ]
347
+ }),
344
348
  /* @__PURE__ */ u(j, {
345
349
  value: "details",
346
350
  className: "space-y-6 mt-4",
@@ -1 +1 @@
1
- {"version":3,"file":"AssetsAssetDetailPage.js","names":[],"sources":["../../../src/assethandler/pages/AssetsAssetDetailPage.tsx"],"sourcesContent":["import { useAssetHandlerNavigate } from '../hooks/useAssetHandlerNavigate';\nimport type React from 'react';\nimport { useState } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n Separator,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n GradientText,\n EmphasisPanel,\n PagePurpose,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n Input,\n Label,\n Textarea,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@burdenoff/fe-libs/ui';\nimport {\n ArrowLeft,\n MapPin,\n Calendar,\n Tag,\n User,\n Wrench,\n Pencil,\n Trash2,\n Archive,\n DollarSign,\n} from 'lucide-react';\nimport { useParams } from 'react-router-dom';\nimport { gql } from '@apollo/client';\nimport { useMutation, useQuery } from '@apollo/client/react';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\nimport { notify } from '../utils/toast';\nimport { AttachmentsPanel, CommentsPanel, ActivityTimeline, NotFoundState } from '../components';\n\nconst ASSET_QUERY = gql`\n query AssetHandlerAsset($id: ID!) {\n asset(id: $id) {\n id\n assetNumber\n name\n description\n category\n status\n condition\n serialNumber\n locationName\n assignedTo\n tags\n createdAt\n updatedAt\n purchaseValue\n purchaseDate\n usefulLifeMonths\n salvageValue\n depreciationMethod\n department\n warrantyExpiry\n supplier\n disposalDate\n disposalMethod\n disposalNotes\n currentValue\n accumulatedDepreciation\n totalCostOfOwnership\n }\n }\n`;\n\ninterface AssetRecord {\n id: string;\n assetNumber: string;\n name: string;\n description?: string | null;\n category: string;\n status: string;\n condition: string;\n serialNumber?: string | null;\n locationName?: string | null;\n assignedTo?: string | null;\n tags: string[];\n createdAt: string;\n updatedAt: string;\n purchaseValue?: number | null;\n purchaseDate?: string | null;\n usefulLifeMonths?: number | null;\n salvageValue?: number | null;\n depreciationMethod?: string | null;\n department?: string | null;\n warrantyExpiry?: string | null;\n supplier?: string | null;\n disposalDate?: string | null;\n disposalMethod?: string | null;\n disposalNotes?: string | null;\n currentValue?: number | null;\n accumulatedDepreciation?: number | null;\n totalCostOfOwnership?: number | null;\n}\n\ninterface AssetQueryResult {\n asset: AssetRecord | null;\n}\n\nconst UPDATE_ASSET_MUTATION = gql`\n mutation AssetHandlerUpdateAsset($id: ID!, $input: UpdateAssetInput!) {\n updateAsset(id: $id, input: $input) {\n id\n }\n }\n`;\n\nconst DISPOSE_ASSET_MUTATION = gql`\n mutation AssetHandlerDisposeAsset($id: ID!, $input: DisposeAssetInput!) {\n disposeAsset(id: $id, input: $input) {\n id\n status\n }\n }\n`;\n\nconst DELETE_ASSET_MUTATION = gql`\n mutation AssetHandlerDeleteAsset($id: ID!) {\n deleteAsset(id: $id)\n }\n`;\n\nconst statusColors: Record<string, 'default' | 'secondary' | 'destructive' | 'outline'> = {\n active: 'default',\n inactive: 'outline',\n maintenance: 'secondary',\n retired: 'outline',\n disposed: 'destructive',\n};\nconst conditionColors: Record<string, string> = {\n excellent: 'text-status-success-text bg-status-success-bg-subtle',\n good: 'text-status-info-text bg-status-info-bg-subtle',\n fair: 'text-status-warning-text bg-status-warning-bg-subtle',\n poor: 'text-status-warning-text bg-status-warning-bg-subtle',\n damaged: 'text-status-error-text bg-status-error-bg-subtle',\n};\n\nconst money = (value: number | null | undefined): string =>\n value == null ? '—' : `$${Number(value).toLocaleString(undefined, { maximumFractionDigits: 2 })}`;\n\nconst depreciationLabels: Record<string, string> = {\n STRAIGHT_LINE: 'Straight line',\n REDUCING_BALANCE: 'Reducing balance',\n NONE: 'None',\n};\n\ninterface EditForm {\n name: string;\n description: string;\n category: string;\n status: string;\n condition: string;\n serialNumber: string;\n locationName: string;\n assignedTo: string;\n department: string;\n supplier: string;\n purchaseValue: string;\n salvageValue: string;\n usefulLifeMonths: string;\n depreciationMethod: string;\n}\n\nfunction toEditForm(asset: AssetRecord): EditForm {\n return {\n name: asset.name,\n description: asset.description ?? '',\n category: asset.category,\n status: asset.status.toUpperCase(),\n condition: asset.condition.toUpperCase(),\n serialNumber: asset.serialNumber ?? '',\n locationName: asset.locationName ?? '',\n assignedTo: asset.assignedTo ?? '',\n department: asset.department ?? '',\n supplier: asset.supplier ?? '',\n purchaseValue: asset.purchaseValue != null ? String(asset.purchaseValue) : '',\n salvageValue: asset.salvageValue != null ? String(asset.salvageValue) : '',\n usefulLifeMonths: asset.usefulLifeMonths != null ? String(asset.usefulLifeMonths) : '',\n depreciationMethod: (asset.depreciationMethod ?? 'STRAIGHT_LINE').toUpperCase(),\n };\n}\n\nexport function AssetsAssetDetailPage() {\n const navigate = useAssetHandlerNavigate();\n const { assetId } = useParams<{ assetId: string }>();\n const { maintenanceRecords } = useAssetHandlerStore();\n\n const { data, loading, refetch } = useQuery<AssetQueryResult>(ASSET_QUERY, {\n variables: { id: assetId ?? '' },\n skip: !assetId,\n fetchPolicy: 'cache-and-network',\n });\n\n const [showEdit, setShowEdit] = useState(false);\n const [showDispose, setShowDispose] = useState(false);\n const [showDelete, setShowDelete] = useState(false);\n const [editForm, setEditForm] = useState<EditForm | null>(null);\n const [disposeForm, setDisposeForm] = useState({ disposalDate: '', method: '', notes: '' });\n\n const [updateAsset, { loading: updating }] = useMutation(UPDATE_ASSET_MUTATION, {\n refetchQueries: ['AssetHandlerBootstrap'],\n onCompleted: () => {\n notify.success('Asset updated', 'Your changes have been saved.');\n setShowEdit(false);\n void refetch();\n },\n onError: (error) => notify.error('Could not update asset', error.message),\n });\n\n const [disposeAsset, { loading: disposing }] = useMutation(DISPOSE_ASSET_MUTATION, {\n refetchQueries: ['AssetHandlerBootstrap'],\n onCompleted: () => {\n notify.success('Asset disposed', 'The asset has been marked as disposed.');\n setShowDispose(false);\n void refetch();\n },\n onError: (error) => notify.error('Could not dispose asset', error.message),\n });\n\n const [deleteAsset, { loading: deleting }] = useMutation(DELETE_ASSET_MUTATION, {\n refetchQueries: ['AssetHandlerBootstrap'],\n onCompleted: () => {\n notify.success('Asset deleted', 'The asset has been removed from the inventory.');\n navigate('/assets/asset-list');\n },\n onError: (error) => notify.error('Could not delete asset', error.message),\n });\n\n if (loading && !data) {\n return (\n <div className=\"space-y-3 p-6\">\n {Array.from({ length: 6 }).map((_, i) => (\n <div key={i} className=\"h-10 rounded-md bg-bg-sunken motion-safe:animate-vc-shimmer\" />\n ))}\n </div>\n );\n }\n\n const raw = data?.asset;\n if (!raw) {\n return (\n <NotFoundState\n entityLabel=\"Asset\"\n description=\"This asset may have been disposed or removed. Return to the inventory to find it.\"\n backLabel=\"Back to inventory\"\n onBack={() => navigate('/assets/asset-list')}\n />\n );\n }\n\n const asset = {\n ...raw,\n status: raw.status.toLowerCase(),\n condition: raw.condition.toLowerCase(),\n category: raw.category.toLowerCase(),\n };\n const assetMaintenance = maintenanceRecords.filter((m) => m.assetId === asset.id);\n const openMaintenance = assetMaintenance.filter(\n (m) => m.status !== 'completed' && m.status !== 'cancelled'\n );\n const isDisposed = asset.status === 'disposed';\n\n const openEdit = () => {\n setEditForm(toEditForm(raw));\n setShowEdit(true);\n };\n\n const submitEdit = (event: React.FormEvent) => {\n event.preventDefault();\n if (!editForm) return;\n if (!editForm.name.trim()) {\n notify.warning('Name required', 'An asset must have a name.');\n return;\n }\n const optionalNumber = (value: string): number | null => {\n const trimmed = value.trim();\n if (trimmed === '') return null;\n const parsed = Number(trimmed);\n return Number.isNaN(parsed) ? null : parsed;\n };\n void updateAsset({\n variables: {\n id: asset.id,\n input: {\n name: editForm.name.trim(),\n description: editForm.description.trim() || null,\n category: editForm.category.trim(),\n status: editForm.status,\n condition: editForm.condition,\n serialNumber: editForm.serialNumber.trim() || null,\n locationName: editForm.locationName.trim() || null,\n assignedTo: editForm.assignedTo.trim() || null,\n department: editForm.department.trim() || null,\n supplier: editForm.supplier.trim() || null,\n purchaseValue: optionalNumber(editForm.purchaseValue),\n salvageValue: optionalNumber(editForm.salvageValue),\n usefulLifeMonths: optionalNumber(editForm.usefulLifeMonths),\n depreciationMethod: editForm.depreciationMethod,\n },\n },\n });\n };\n\n const submitDispose = (event: React.FormEvent) => {\n event.preventDefault();\n void disposeAsset({\n variables: {\n id: asset.id,\n input: {\n disposalDate: disposeForm.disposalDate\n ? new Date(disposeForm.disposalDate).toISOString()\n : new Date().toISOString(),\n method: disposeForm.method.trim() || null,\n notes: disposeForm.notes.trim() || null,\n },\n },\n });\n };\n\n const setEdit = (field: keyof EditForm, value: string) =>\n setEditForm((prev) => (prev ? { ...prev, [field]: value } : prev));\n\n return (\n <div className=\"space-y-6 p-6\">\n {/* Header */}\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\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 <div className=\"flex items-center gap-3\">\n <h1 className=\"text-2xl font-bold\">\n <GradientText>{asset.name}</GradientText>\n </h1>\n <Badge variant={statusColors[asset.status] ?? 'outline'}>\n {asset.status.replace(/_/g, ' ')}\n </Badge>\n <span\n className={`rounded-md px-2 py-0.5 text-xs font-medium ${conditionColors[asset.condition] ?? ''}`}\n >\n {asset.condition}\n </span>\n </div>\n <p className=\"text-sm text-text-secondary mt-1\">\n {asset.assetNumber}\n {asset.serialNumber ? <> &middot; SN: {asset.serialNumber}</> : null}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <Button size=\"sm\" variant=\"outline\" onClick={openEdit}>\n <Pencil className=\"mr-2 h-4 w-4\" />\n Edit\n </Button>\n {!isDisposed ? (\n <Button size=\"sm\" variant=\"outline\" onClick={() => setShowDispose(true)}>\n <Archive className=\"mr-2 h-4 w-4\" />\n Dispose\n </Button>\n ) : null}\n <Button\n size=\"sm\"\n variant=\"outline\"\n className=\"text-status-error-text\"\n onClick={() => setShowDelete(true)}\n >\n <Trash2 className=\"mr-2 h-4 w-4\" />\n Delete\n </Button>\n </div>\n </div>\n\n <PagePurpose>\n The complete profile of a single asset — its identity, condition, location, assignment,\n financials and maintenance history. Use this page as the asset&apos;s home base: edit its\n details, track its book value, and dispose of it when it reaches end of life.\n </PagePurpose>\n\n {isDisposed ? (\n <EmphasisPanel>\n <div className=\"flex items-center gap-2 text-sm font-medium\">\n <Archive className=\"h-4 w-4\" />\n This asset was disposed\n {asset.disposalDate ? ` on ${new Date(asset.disposalDate).toLocaleDateString()}` : ''}\n </div>\n {asset.disposalMethod ? (\n <p className=\"mt-1 text-sm text-text-secondary\">Method: {asset.disposalMethod}</p>\n ) : null}\n {asset.disposalNotes ? (\n <p className=\"mt-1 text-sm text-text-secondary\">{asset.disposalNotes}</p>\n ) : null}\n </EmphasisPanel>\n ) : null}\n\n {/* Quick Stats */}\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 <DollarSign className=\"h-4 w-4\" />\n Current Value\n </div>\n <p className=\"text-2xl font-bold mt-1 tabular-nums\">{money(asset.currentValue)}</p>\n <p className=\"text-xs text-text-secondary\">Purchase {money(asset.purchaseValue)}</p>\n </EmphasisPanel>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <Wrench className=\"h-4 w-4\" />\n Maintenance Records\n </div>\n <p className=\"text-2xl font-bold mt-1 tabular-nums\">{assetMaintenance.length}</p>\n <p className=\"text-xs text-text-secondary\">{openMaintenance.length} open</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 <Calendar className=\"h-4 w-4\" />\n Registered\n </div>\n <p className=\"text-lg font-bold mt-1\">\n {asset.createdAt ? new Date(asset.createdAt).toLocaleDateString() : '—'}\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 <MapPin className=\"h-4 w-4\" />\n Location\n </div>\n <p className=\"text-lg font-bold mt-1 truncate\">{asset.locationName || '—'}</p>\n </CardContent>\n </Card>\n </div>\n\n <Tabs defaultValue=\"details\">\n <TabsList>\n <TabsTrigger value=\"details\">Details</TabsTrigger>\n <TabsTrigger value=\"financial\">Financial</TabsTrigger>\n <TabsTrigger value=\"maintenance\">Maintenance</TabsTrigger>\n <TabsTrigger value=\"discussion\">Discussion</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"details\" className=\"space-y-6 mt-4\">\n <div className=\"grid gap-6 lg:grid-cols-2\">\n <Card>\n <CardHeader>\n <CardTitle>General Information</CardTitle>\n </CardHeader>\n <CardContent>\n <dl className=\"space-y-3 text-sm\">\n <DetailRow label=\"Description\" value={asset.description || '—'} />\n <DetailRow label=\"Category\" value={asset.category.replace(/_/g, ' ')} />\n <DetailRow label=\"Serial Number\" value={asset.serialNumber || '—'} />\n <DetailRow label=\"Asset Tag\" value={asset.assetNumber} />\n <DetailRow label=\"Department\" value={asset.department || '—'} />\n </dl>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Assignment &amp; Location</CardTitle>\n </CardHeader>\n <CardContent>\n <dl className=\"space-y-3 text-sm\">\n <DetailRow\n label=\"Assigned To\"\n value={asset.assignedTo || '—'}\n icon={<User className=\"h-3.5 w-3.5\" />}\n />\n <DetailRow\n label=\"Location\"\n value={asset.locationName || '—'}\n icon={<MapPin className=\"h-3.5 w-3.5\" />}\n />\n </dl>\n <Separator className=\"my-4\" />\n <div>\n <h4 className=\"text-sm font-medium mb-2 flex items-center gap-2\">\n <Tag className=\"h-3.5 w-3.5\" />\n Tags\n </h4>\n {asset.tags.length === 0 ? (\n <p className=\"text-xs text-text-secondary\">No tags yet</p>\n ) : (\n <div className=\"flex flex-wrap gap-1.5\">\n {asset.tags.map((tag) => (\n <Badge key={tag} variant=\"secondary\" className=\"text-xs\">\n {tag}\n </Badge>\n ))}\n </div>\n )}\n </div>\n </CardContent>\n </Card>\n </div>\n <AttachmentsPanel entityType=\"assethandler-asset\" entityId={asset.id} />\n </TabsContent>\n\n <TabsContent value=\"financial\" className=\"mt-4 space-y-6\">\n <div className=\"grid gap-4 md:grid-cols-4\">\n <EmphasisPanel>\n <p className=\"text-sm text-text-secondary\">Purchase Value</p>\n <p className=\"mt-1 text-xl font-bold tabular-nums\">{money(asset.purchaseValue)}</p>\n </EmphasisPanel>\n <EmphasisPanel>\n <p className=\"text-sm text-text-secondary\">Current Book Value</p>\n <p className=\"mt-1 text-xl font-bold tabular-nums\">{money(asset.currentValue)}</p>\n </EmphasisPanel>\n <EmphasisPanel>\n <p className=\"text-sm text-text-secondary\">Accumulated Depreciation</p>\n <p className=\"mt-1 text-xl font-bold tabular-nums\">\n {money(asset.accumulatedDepreciation)}\n </p>\n </EmphasisPanel>\n <EmphasisPanel>\n <p className=\"text-sm text-text-secondary\">Total Cost of Ownership</p>\n <p className=\"mt-1 text-xl font-bold tabular-nums\">\n {money(asset.totalCostOfOwnership)}\n </p>\n </EmphasisPanel>\n </div>\n <Card>\n <CardHeader>\n <CardTitle>Depreciation &amp; Purchase</CardTitle>\n <CardDescription>How this asset&apos;s value is tracked over time</CardDescription>\n </CardHeader>\n <CardContent>\n <dl className=\"grid gap-3 text-sm sm:grid-cols-2\">\n <DetailRow\n label=\"Depreciation Method\"\n value={\n asset.depreciationMethod\n ? (depreciationLabels[asset.depreciationMethod.toUpperCase()] ??\n asset.depreciationMethod)\n : '—'\n }\n />\n <DetailRow label=\"Salvage Value\" value={money(asset.salvageValue)} />\n <DetailRow\n label=\"Useful Life\"\n value={asset.usefulLifeMonths ? `${asset.usefulLifeMonths} months` : '—'}\n />\n <DetailRow\n label=\"Purchase Date\"\n value={\n asset.purchaseDate ? new Date(asset.purchaseDate).toLocaleDateString() : '—'\n }\n />\n <DetailRow label=\"Supplier\" value={asset.supplier || '—'} />\n <DetailRow\n label=\"Warranty Expiry\"\n value={\n asset.warrantyExpiry ? new Date(asset.warrantyExpiry).toLocaleDateString() : '—'\n }\n />\n </dl>\n </CardContent>\n </Card>\n </TabsContent>\n\n <TabsContent value=\"maintenance\" className=\"mt-4\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Wrench className=\"h-4 w-4\" />\n Maintenance History\n </CardTitle>\n <CardDescription>{assetMaintenance.length} records found</CardDescription>\n </CardHeader>\n <CardContent>\n {assetMaintenance.length === 0 ? (\n <p className=\"text-center text-text-secondary py-8\">\n No maintenance records for this asset.\n </p>\n ) : (\n <div className=\"space-y-3\">\n {assetMaintenance.map((m) => (\n <div key={m.id} className=\"flex items-start gap-4 rounded-lg border p-4\">\n <div className=\"flex-1\">\n <div className=\"flex items-center gap-2\">\n <Badge variant=\"outline\" className=\"capitalize\">\n {m.type}\n </Badge>\n <Badge\n variant={m.status === 'completed' ? 'default' : 'secondary'}\n className=\"capitalize\"\n >\n {m.status.replace(/_/g, ' ')}\n </Badge>\n </div>\n <p className=\"font-medium mt-1\">{m.title}</p>\n <p className=\"text-sm text-text-secondary\">{m.description}</p>\n <div className=\"flex gap-4 mt-2 text-xs text-text-secondary\">\n <span>\n Scheduled:{' '}\n {m.scheduledDate ? new Date(m.scheduledDate).toLocaleDateString() : '—'}\n </span>\n {m.actualCost != null || m.estimatedCost != null ? (\n <span>Cost: {money(m.actualCost ?? m.estimatedCost)}</span>\n ) : null}\n </div>\n </div>\n </div>\n ))}\n </div>\n )}\n </CardContent>\n </Card>\n </TabsContent>\n\n <TabsContent value=\"discussion\" className=\"mt-4 space-y-6\">\n <div className=\"grid gap-6 lg:grid-cols-2\">\n <CommentsPanel entityType=\"assethandler-asset\" entityId={asset.id} />\n <ActivityTimeline resourceId={asset.id} />\n </div>\n </TabsContent>\n </Tabs>\n\n {/* Edit dialog */}\n <ResponsiveDialog open={showEdit} onOpenChange={setShowEdit}>\n <ResponsiveDialogContent className=\"max-h-[85vh] overflow-y-auto sm:max-w-2xl\">\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Edit asset</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Update this asset&apos;s details and financials.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n {editForm ? (\n <form className=\"space-y-4\" onSubmit={submitEdit}>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Name</Label>\n <Input value={editForm.name} onChange={(e) => setEdit('name', e.target.value)} />\n </div>\n <div className=\"space-y-2\">\n <Label>Category</Label>\n <Input\n value={editForm.category}\n onChange={(e) => setEdit('category', e.target.value)}\n />\n </div>\n </div>\n <div className=\"space-y-2\">\n <Label>Description</Label>\n <Textarea\n value={editForm.description}\n onChange={(e) => setEdit('description', e.target.value)}\n rows={2}\n />\n </div>\n <div className=\"grid gap-4 md:grid-cols-3\">\n <div className=\"space-y-2\">\n <Label>Status</Label>\n <Select value={editForm.status} onValueChange={(v) => setEdit('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 value={editForm.condition} onValueChange={(v) => setEdit('condition', v)}>\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 className=\"space-y-2\">\n <Label>Department</Label>\n <Input\n value={editForm.department}\n onChange={(e) => setEdit('department', e.target.value)}\n />\n </div>\n </div>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Serial Number</Label>\n <Input\n value={editForm.serialNumber}\n onChange={(e) => setEdit('serialNumber', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Assigned To</Label>\n <Input\n value={editForm.assignedTo}\n onChange={(e) => setEdit('assignedTo', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Location</Label>\n <Input\n value={editForm.locationName}\n onChange={(e) => setEdit('locationName', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Supplier</Label>\n <Input\n value={editForm.supplier}\n onChange={(e) => setEdit('supplier', e.target.value)}\n />\n </div>\n </div>\n <div className=\"grid gap-4 md:grid-cols-4\">\n <div className=\"space-y-2\">\n <Label>Purchase Value</Label>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"0.01\"\n value={editForm.purchaseValue}\n onChange={(e) => setEdit('purchaseValue', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Salvage Value</Label>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"0.01\"\n value={editForm.salvageValue}\n onChange={(e) => setEdit('salvageValue', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Useful Life (mo)</Label>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"1\"\n value={editForm.usefulLifeMonths}\n onChange={(e) => setEdit('usefulLifeMonths', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Depreciation</Label>\n <Select\n value={editForm.depreciationMethod}\n onValueChange={(v) => setEdit('depreciationMethod', v)}\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"STRAIGHT_LINE\">Straight line</SelectItem>\n <SelectItem value=\"REDUCING_BALANCE\">Reducing balance</SelectItem>\n <SelectItem value=\"NONE\">None</SelectItem>\n </SelectContent>\n </Select>\n </div>\n </div>\n <ResponsiveDialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setShowEdit(false)}\n disabled={updating}\n >\n Cancel\n </Button>\n <Button type=\"submit\" disabled={updating}>\n {updating ? 'Saving…' : 'Save changes'}\n </Button>\n </ResponsiveDialogFooter>\n </form>\n ) : null}\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n\n {/* Dispose dialog */}\n <ResponsiveDialog open={showDispose} onOpenChange={setShowDispose}>\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Dispose asset</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Record the disposal of this asset. It will be marked as disposed and removed from\n active inventory.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <form className=\"space-y-4\" onSubmit={submitDispose}>\n <div className=\"space-y-2\">\n <Label>Disposal Date</Label>\n <Input\n type=\"date\"\n value={disposeForm.disposalDate}\n onChange={(e) =>\n setDisposeForm((prev) => ({ ...prev, disposalDate: e.target.value }))\n }\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Method</Label>\n <Input\n placeholder=\"e.g., Sold, Recycled, Scrapped\"\n value={disposeForm.method}\n onChange={(e) => setDisposeForm((prev) => ({ ...prev, method: e.target.value }))}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Notes</Label>\n <Textarea\n placeholder=\"Optional details about the disposal\"\n value={disposeForm.notes}\n onChange={(e) => setDisposeForm((prev) => ({ ...prev, notes: e.target.value }))}\n rows={2}\n />\n </div>\n <ResponsiveDialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setShowDispose(false)}\n disabled={disposing}\n >\n Cancel\n </Button>\n <Button type=\"submit\" disabled={disposing}>\n {disposing ? 'Disposing…' : 'Confirm disposal'}\n </Button>\n </ResponsiveDialogFooter>\n </form>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n\n {/* Delete dialog */}\n <ResponsiveDialog open={showDelete} onOpenChange={setShowDelete}>\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Delete asset</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n This removes <span className=\"font-medium\">{asset.name}</span> from the inventory.\n This action cannot be undone.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <ResponsiveDialogFooter>\n <Button variant=\"outline\" onClick={() => setShowDelete(false)} disabled={deleting}>\n Cancel\n </Button>\n <Button\n variant=\"destructive\"\n onClick={() => void deleteAsset({ variables: { id: asset.id } })}\n disabled={deleting}\n >\n {deleting ? 'Deleting…' : 'Delete asset'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n </div>\n );\n}\n\nfunction DetailRow({\n label,\n value,\n icon,\n}: {\n label: string;\n value: string;\n icon?: React.ReactNode;\n}) {\n return (\n <div className=\"flex items-start justify-between gap-4\">\n <dt className=\"text-text-secondary flex items-center gap-1.5 shrink-0\">\n {icon}\n {label}\n </dt>\n <dd className=\"font-medium text-right capitalize\">{value}</dd>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"AssetsAssetDetailPage.js","names":[],"sources":["../../../src/assethandler/pages/AssetsAssetDetailPage.tsx"],"sourcesContent":["import { useAssetHandlerNavigate } from '../hooks/useAssetHandlerNavigate';\nimport type React from 'react';\nimport { useState } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n Separator,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n GradientText,\n EmphasisPanel,\n PagePurpose,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n Input,\n Label,\n Textarea,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@burdenoff/fe-libs/ui';\nimport {\n ArrowLeft,\n MapPin,\n Calendar,\n Tag,\n User,\n Wrench,\n Pencil,\n Trash2,\n Archive,\n DollarSign,\n} from 'lucide-react';\nimport { useParams } from 'react-router-dom';\nimport { gql } from '@apollo/client';\nimport { useMutation, useQuery } from '@apollo/client/react';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\nimport { notify } from '../utils/toast';\nimport { AttachmentsPanel, CommentsPanel, ActivityTimeline, NotFoundState } from '../components';\n\nconst ASSET_QUERY = gql`\n query AssetHandlerAsset($id: ID!) {\n asset(id: $id) {\n id\n assetNumber\n name\n description\n category\n status\n condition\n serialNumber\n locationName\n assignedTo\n tags\n createdAt\n updatedAt\n purchaseValue\n purchaseDate\n usefulLifeMonths\n salvageValue\n depreciationMethod\n department\n warrantyExpiry\n supplier\n disposalDate\n disposalMethod\n disposalNotes\n currentValue\n accumulatedDepreciation\n totalCostOfOwnership\n }\n }\n`;\n\ninterface AssetRecord {\n id: string;\n assetNumber: string;\n name: string;\n description?: string | null;\n category: string;\n status: string;\n condition: string;\n serialNumber?: string | null;\n locationName?: string | null;\n assignedTo?: string | null;\n tags: string[];\n createdAt: string;\n updatedAt: string;\n purchaseValue?: number | null;\n purchaseDate?: string | null;\n usefulLifeMonths?: number | null;\n salvageValue?: number | null;\n depreciationMethod?: string | null;\n department?: string | null;\n warrantyExpiry?: string | null;\n supplier?: string | null;\n disposalDate?: string | null;\n disposalMethod?: string | null;\n disposalNotes?: string | null;\n currentValue?: number | null;\n accumulatedDepreciation?: number | null;\n totalCostOfOwnership?: number | null;\n}\n\ninterface AssetQueryResult {\n asset: AssetRecord | null;\n}\n\nconst UPDATE_ASSET_MUTATION = gql`\n mutation AssetHandlerUpdateAsset($id: ID!, $input: UpdateAssetInput!) {\n updateAsset(id: $id, input: $input) {\n id\n }\n }\n`;\n\nconst DISPOSE_ASSET_MUTATION = gql`\n mutation AssetHandlerDisposeAsset($id: ID!, $input: DisposeAssetInput!) {\n disposeAsset(id: $id, input: $input) {\n id\n status\n }\n }\n`;\n\nconst DELETE_ASSET_MUTATION = gql`\n mutation AssetHandlerDeleteAsset($id: ID!) {\n deleteAsset(id: $id)\n }\n`;\n\nconst statusColors: Record<string, 'default' | 'secondary' | 'destructive' | 'outline'> = {\n active: 'default',\n inactive: 'outline',\n maintenance: 'secondary',\n retired: 'outline',\n disposed: 'destructive',\n};\nconst conditionColors: Record<string, string> = {\n excellent: 'text-status-success-text bg-status-success-bg-subtle',\n good: 'text-status-info-text bg-status-info-bg-subtle',\n fair: 'text-status-warning-text bg-status-warning-bg-subtle',\n poor: 'text-status-warning-text bg-status-warning-bg-subtle',\n damaged: 'text-status-error-text bg-status-error-bg-subtle',\n};\n\nconst money = (value: number | null | undefined): string =>\n value == null ? '—' : `$${Number(value).toLocaleString(undefined, { maximumFractionDigits: 2 })}`;\n\nconst depreciationLabels: Record<string, string> = {\n STRAIGHT_LINE: 'Straight line',\n REDUCING_BALANCE: 'Reducing balance',\n NONE: 'None',\n};\n\ninterface EditForm {\n name: string;\n description: string;\n category: string;\n status: string;\n condition: string;\n serialNumber: string;\n locationName: string;\n assignedTo: string;\n department: string;\n supplier: string;\n purchaseValue: string;\n salvageValue: string;\n usefulLifeMonths: string;\n depreciationMethod: string;\n}\n\nfunction toEditForm(asset: AssetRecord): EditForm {\n return {\n name: asset.name,\n description: asset.description ?? '',\n category: asset.category,\n status: asset.status.toUpperCase(),\n condition: asset.condition.toUpperCase(),\n serialNumber: asset.serialNumber ?? '',\n locationName: asset.locationName ?? '',\n assignedTo: asset.assignedTo ?? '',\n department: asset.department ?? '',\n supplier: asset.supplier ?? '',\n purchaseValue: asset.purchaseValue != null ? String(asset.purchaseValue) : '',\n salvageValue: asset.salvageValue != null ? String(asset.salvageValue) : '',\n usefulLifeMonths: asset.usefulLifeMonths != null ? String(asset.usefulLifeMonths) : '',\n depreciationMethod: (asset.depreciationMethod ?? 'STRAIGHT_LINE').toUpperCase(),\n };\n}\n\nexport function AssetsAssetDetailPage() {\n const navigate = useAssetHandlerNavigate();\n const { assetId } = useParams<{ assetId: string }>();\n const { maintenanceRecords } = useAssetHandlerStore();\n\n const { data, loading, refetch } = useQuery<AssetQueryResult>(ASSET_QUERY, {\n variables: { id: assetId ?? '' },\n skip: !assetId,\n fetchPolicy: 'cache-and-network',\n });\n\n const [showEdit, setShowEdit] = useState(false);\n const [showDispose, setShowDispose] = useState(false);\n const [showDelete, setShowDelete] = useState(false);\n const [editForm, setEditForm] = useState<EditForm | null>(null);\n const [disposeForm, setDisposeForm] = useState({ disposalDate: '', method: '', notes: '' });\n\n const [updateAsset, { loading: updating }] = useMutation(UPDATE_ASSET_MUTATION, {\n refetchQueries: ['AssetHandlerBootstrap'],\n onCompleted: () => {\n notify.success('Asset updated', 'Your changes have been saved.');\n setShowEdit(false);\n void refetch();\n },\n onError: (error) => notify.error('Could not update asset', error.message),\n });\n\n const [disposeAsset, { loading: disposing }] = useMutation(DISPOSE_ASSET_MUTATION, {\n refetchQueries: ['AssetHandlerBootstrap'],\n onCompleted: () => {\n notify.success('Asset disposed', 'The asset has been marked as disposed.');\n setShowDispose(false);\n void refetch();\n },\n onError: (error) => notify.error('Could not dispose asset', error.message),\n });\n\n const [deleteAsset, { loading: deleting }] = useMutation(DELETE_ASSET_MUTATION, {\n refetchQueries: ['AssetHandlerBootstrap'],\n onCompleted: () => {\n notify.success('Asset deleted', 'The asset has been removed from the inventory.');\n navigate('/assets/asset-list');\n },\n onError: (error) => notify.error('Could not delete asset', error.message),\n });\n\n if (loading && !data) {\n return (\n <div className=\"space-y-3 p-6\">\n {Array.from({ length: 6 }).map((_, i) => (\n <div key={i} className=\"h-10 rounded-md bg-bg-sunken motion-safe:animate-vc-shimmer\" />\n ))}\n </div>\n );\n }\n\n const raw = data?.asset;\n if (!raw) {\n return (\n <NotFoundState\n entityLabel=\"Asset\"\n description=\"This asset may have been disposed or removed. Return to the inventory to find it.\"\n backLabel=\"Back to inventory\"\n onBack={() => navigate('/assets/asset-list')}\n />\n );\n }\n\n const asset = {\n ...raw,\n status: raw.status.toLowerCase(),\n condition: raw.condition.toLowerCase(),\n category: raw.category.toLowerCase(),\n };\n const assetMaintenance = maintenanceRecords.filter((m) => m.assetId === asset.id);\n const openMaintenance = assetMaintenance.filter(\n (m) => m.status !== 'completed' && m.status !== 'cancelled'\n );\n const isDisposed = asset.status === 'disposed';\n\n const openEdit = () => {\n setEditForm(toEditForm(raw));\n setShowEdit(true);\n };\n\n const submitEdit = (event: React.FormEvent) => {\n event.preventDefault();\n if (!editForm) return;\n if (!editForm.name.trim()) {\n notify.warning('Name required', 'An asset must have a name.');\n return;\n }\n const optionalNumber = (value: string): number | null => {\n const trimmed = value.trim();\n if (trimmed === '') return null;\n const parsed = Number(trimmed);\n return Number.isNaN(parsed) ? null : parsed;\n };\n void updateAsset({\n variables: {\n id: asset.id,\n input: {\n name: editForm.name.trim(),\n description: editForm.description.trim() || null,\n category: editForm.category.trim(),\n status: editForm.status,\n condition: editForm.condition,\n serialNumber: editForm.serialNumber.trim() || null,\n locationName: editForm.locationName.trim() || null,\n assignedTo: editForm.assignedTo.trim() || null,\n department: editForm.department.trim() || null,\n supplier: editForm.supplier.trim() || null,\n purchaseValue: optionalNumber(editForm.purchaseValue),\n salvageValue: optionalNumber(editForm.salvageValue),\n usefulLifeMonths: optionalNumber(editForm.usefulLifeMonths),\n depreciationMethod: editForm.depreciationMethod,\n },\n },\n });\n };\n\n const submitDispose = (event: React.FormEvent) => {\n event.preventDefault();\n void disposeAsset({\n variables: {\n id: asset.id,\n input: {\n disposalDate: disposeForm.disposalDate\n ? new Date(disposeForm.disposalDate).toISOString()\n : new Date().toISOString(),\n method: disposeForm.method.trim() || null,\n notes: disposeForm.notes.trim() || null,\n },\n },\n });\n };\n\n const setEdit = (field: keyof EditForm, value: string) =>\n setEditForm((prev) => (prev ? { ...prev, [field]: value } : prev));\n\n return (\n <div className=\"space-y-6 p-6\">\n {/* Header */}\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <div className=\"flex items-center gap-4\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"Go back\"\n onClick={() => navigate('/assets/asset-list')}\n >\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n <div>\n <div className=\"flex items-center gap-3\">\n <h1 className=\"text-2xl font-bold\">\n <GradientText>{asset.name}</GradientText>\n </h1>\n <Badge variant={statusColors[asset.status] ?? 'outline'}>\n {asset.status.replace(/_/g, ' ')}\n </Badge>\n <span\n className={`rounded-md px-2 py-0.5 text-xs font-medium ${conditionColors[asset.condition] ?? ''}`}\n >\n {asset.condition}\n </span>\n </div>\n <p className=\"text-sm text-text-secondary mt-1\">\n {asset.assetNumber}\n {asset.serialNumber ? <> &middot; SN: {asset.serialNumber}</> : null}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <Button size=\"sm\" variant=\"outline\" onClick={openEdit}>\n <Pencil className=\"mr-2 h-4 w-4\" />\n Edit\n </Button>\n {!isDisposed ? (\n <Button size=\"sm\" variant=\"outline\" onClick={() => setShowDispose(true)}>\n <Archive className=\"mr-2 h-4 w-4\" />\n Dispose\n </Button>\n ) : null}\n <Button\n size=\"sm\"\n variant=\"outline\"\n className=\"text-status-error-text\"\n onClick={() => setShowDelete(true)}\n >\n <Trash2 className=\"mr-2 h-4 w-4\" />\n Delete\n </Button>\n </div>\n </div>\n\n <PagePurpose>\n The complete profile of a single asset — its identity, condition, location, assignment,\n financials and maintenance history. Use this page as the asset&apos;s home base: edit its\n details, track its book value, and dispose of it when it reaches end of life.\n </PagePurpose>\n\n {isDisposed ? (\n <EmphasisPanel>\n <div className=\"flex items-center gap-2 text-sm font-medium\">\n <Archive className=\"h-4 w-4\" />\n This asset was disposed\n {asset.disposalDate ? ` on ${new Date(asset.disposalDate).toLocaleDateString()}` : ''}\n </div>\n {asset.disposalMethod ? (\n <p className=\"mt-1 text-sm text-text-secondary\">Method: {asset.disposalMethod}</p>\n ) : null}\n {asset.disposalNotes ? (\n <p className=\"mt-1 text-sm text-text-secondary\">{asset.disposalNotes}</p>\n ) : null}\n </EmphasisPanel>\n ) : null}\n\n {/* Quick Stats */}\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 <DollarSign className=\"h-4 w-4\" />\n Current Value\n </div>\n <p className=\"text-2xl font-bold mt-1 tabular-nums\">{money(asset.currentValue)}</p>\n <p className=\"text-xs text-text-secondary\">Purchase {money(asset.purchaseValue)}</p>\n </EmphasisPanel>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <Wrench className=\"h-4 w-4\" />\n Maintenance Records\n </div>\n <p className=\"text-2xl font-bold mt-1 tabular-nums\">{assetMaintenance.length}</p>\n <p className=\"text-xs text-text-secondary\">{openMaintenance.length} open</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 <Calendar className=\"h-4 w-4\" />\n Registered\n </div>\n <p className=\"text-lg font-bold mt-1\">\n {asset.createdAt ? new Date(asset.createdAt).toLocaleDateString() : '—'}\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 <MapPin className=\"h-4 w-4\" />\n Location\n </div>\n <p className=\"text-lg font-bold mt-1 truncate\">{asset.locationName || '—'}</p>\n </CardContent>\n </Card>\n </div>\n\n <Tabs defaultValue=\"details\">\n <TabsList className=\"max-w-full justify-start overflow-x-auto\">\n <TabsTrigger value=\"details\">Details</TabsTrigger>\n <TabsTrigger value=\"financial\">Financial</TabsTrigger>\n <TabsTrigger value=\"maintenance\">Maintenance</TabsTrigger>\n <TabsTrigger value=\"discussion\">Discussion</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"details\" className=\"space-y-6 mt-4\">\n <div className=\"grid gap-6 lg:grid-cols-2\">\n <Card>\n <CardHeader>\n <CardTitle>General Information</CardTitle>\n </CardHeader>\n <CardContent>\n <dl className=\"space-y-3 text-sm\">\n <DetailRow label=\"Description\" value={asset.description || '—'} />\n <DetailRow label=\"Category\" value={asset.category.replace(/_/g, ' ')} />\n <DetailRow label=\"Serial Number\" value={asset.serialNumber || '—'} />\n <DetailRow label=\"Asset Tag\" value={asset.assetNumber} />\n <DetailRow label=\"Department\" value={asset.department || '—'} />\n </dl>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Assignment &amp; Location</CardTitle>\n </CardHeader>\n <CardContent>\n <dl className=\"space-y-3 text-sm\">\n <DetailRow\n label=\"Assigned To\"\n value={asset.assignedTo || '—'}\n icon={<User className=\"h-3.5 w-3.5\" />}\n />\n <DetailRow\n label=\"Location\"\n value={asset.locationName || '—'}\n icon={<MapPin className=\"h-3.5 w-3.5\" />}\n />\n </dl>\n <Separator className=\"my-4\" />\n <div>\n <h4 className=\"text-sm font-medium mb-2 flex items-center gap-2\">\n <Tag className=\"h-3.5 w-3.5\" />\n Tags\n </h4>\n {asset.tags.length === 0 ? (\n <p className=\"text-xs text-text-secondary\">No tags yet</p>\n ) : (\n <div className=\"flex flex-wrap gap-1.5\">\n {asset.tags.map((tag) => (\n <Badge key={tag} variant=\"secondary\" className=\"text-xs\">\n {tag}\n </Badge>\n ))}\n </div>\n )}\n </div>\n </CardContent>\n </Card>\n </div>\n <AttachmentsPanel entityType=\"assethandler-asset\" entityId={asset.id} />\n </TabsContent>\n\n <TabsContent value=\"financial\" className=\"mt-4 space-y-6\">\n <div className=\"grid gap-4 md:grid-cols-4\">\n <EmphasisPanel>\n <p className=\"text-sm text-text-secondary\">Purchase Value</p>\n <p className=\"mt-1 text-xl font-bold tabular-nums\">{money(asset.purchaseValue)}</p>\n </EmphasisPanel>\n <EmphasisPanel>\n <p className=\"text-sm text-text-secondary\">Current Book Value</p>\n <p className=\"mt-1 text-xl font-bold tabular-nums\">{money(asset.currentValue)}</p>\n </EmphasisPanel>\n <EmphasisPanel>\n <p className=\"text-sm text-text-secondary\">Accumulated Depreciation</p>\n <p className=\"mt-1 text-xl font-bold tabular-nums\">\n {money(asset.accumulatedDepreciation)}\n </p>\n </EmphasisPanel>\n <EmphasisPanel>\n <p className=\"text-sm text-text-secondary\">Total Cost of Ownership</p>\n <p className=\"mt-1 text-xl font-bold tabular-nums\">\n {money(asset.totalCostOfOwnership)}\n </p>\n </EmphasisPanel>\n </div>\n <Card>\n <CardHeader>\n <CardTitle>Depreciation &amp; Purchase</CardTitle>\n <CardDescription>How this asset&apos;s value is tracked over time</CardDescription>\n </CardHeader>\n <CardContent>\n <dl className=\"grid gap-3 text-sm sm:grid-cols-2\">\n <DetailRow\n label=\"Depreciation Method\"\n value={\n asset.depreciationMethod\n ? (depreciationLabels[asset.depreciationMethod.toUpperCase()] ??\n asset.depreciationMethod)\n : '—'\n }\n />\n <DetailRow label=\"Salvage Value\" value={money(asset.salvageValue)} />\n <DetailRow\n label=\"Useful Life\"\n value={asset.usefulLifeMonths ? `${asset.usefulLifeMonths} months` : '—'}\n />\n <DetailRow\n label=\"Purchase Date\"\n value={\n asset.purchaseDate ? new Date(asset.purchaseDate).toLocaleDateString() : '—'\n }\n />\n <DetailRow label=\"Supplier\" value={asset.supplier || '—'} />\n <DetailRow\n label=\"Warranty Expiry\"\n value={\n asset.warrantyExpiry ? new Date(asset.warrantyExpiry).toLocaleDateString() : '—'\n }\n />\n </dl>\n </CardContent>\n </Card>\n </TabsContent>\n\n <TabsContent value=\"maintenance\" className=\"mt-4\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Wrench className=\"h-4 w-4\" />\n Maintenance History\n </CardTitle>\n <CardDescription>{assetMaintenance.length} records found</CardDescription>\n </CardHeader>\n <CardContent>\n {assetMaintenance.length === 0 ? (\n <p className=\"text-center text-text-secondary py-8\">\n No maintenance records for this asset.\n </p>\n ) : (\n <div className=\"space-y-3\">\n {assetMaintenance.map((m) => (\n <div key={m.id} className=\"flex items-start gap-4 rounded-lg border p-4\">\n <div className=\"flex-1\">\n <div className=\"flex items-center gap-2\">\n <Badge variant=\"outline\" className=\"capitalize\">\n {m.type}\n </Badge>\n <Badge\n variant={m.status === 'completed' ? 'default' : 'secondary'}\n className=\"capitalize\"\n >\n {m.status.replace(/_/g, ' ')}\n </Badge>\n </div>\n <p className=\"font-medium mt-1\">{m.title}</p>\n <p className=\"text-sm text-text-secondary\">{m.description}</p>\n <div className=\"flex gap-4 mt-2 text-xs text-text-secondary\">\n <span>\n Scheduled:{' '}\n {m.scheduledDate ? new Date(m.scheduledDate).toLocaleDateString() : '—'}\n </span>\n {m.actualCost != null || m.estimatedCost != null ? (\n <span>Cost: {money(m.actualCost ?? m.estimatedCost)}</span>\n ) : null}\n </div>\n </div>\n </div>\n ))}\n </div>\n )}\n </CardContent>\n </Card>\n </TabsContent>\n\n <TabsContent value=\"discussion\" className=\"mt-4 space-y-6\">\n <div className=\"grid gap-6 lg:grid-cols-2\">\n <CommentsPanel entityType=\"assethandler-asset\" entityId={asset.id} />\n <ActivityTimeline resourceId={asset.id} />\n </div>\n </TabsContent>\n </Tabs>\n\n {/* Edit dialog */}\n <ResponsiveDialog open={showEdit} onOpenChange={setShowEdit}>\n <ResponsiveDialogContent className=\"max-h-[85vh] overflow-y-auto sm:max-w-2xl\">\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Edit asset</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Update this asset&apos;s details and financials.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n {editForm ? (\n <form className=\"space-y-4\" onSubmit={submitEdit}>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Name</Label>\n <Input value={editForm.name} onChange={(e) => setEdit('name', e.target.value)} />\n </div>\n <div className=\"space-y-2\">\n <Label>Category</Label>\n <Input\n value={editForm.category}\n onChange={(e) => setEdit('category', e.target.value)}\n />\n </div>\n </div>\n <div className=\"space-y-2\">\n <Label>Description</Label>\n <Textarea\n value={editForm.description}\n onChange={(e) => setEdit('description', e.target.value)}\n rows={2}\n />\n </div>\n <div className=\"grid gap-4 md:grid-cols-3\">\n <div className=\"space-y-2\">\n <Label>Status</Label>\n <Select value={editForm.status} onValueChange={(v) => setEdit('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 value={editForm.condition} onValueChange={(v) => setEdit('condition', v)}>\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 className=\"space-y-2\">\n <Label>Department</Label>\n <Input\n value={editForm.department}\n onChange={(e) => setEdit('department', e.target.value)}\n />\n </div>\n </div>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Serial Number</Label>\n <Input\n value={editForm.serialNumber}\n onChange={(e) => setEdit('serialNumber', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Assigned To</Label>\n <Input\n value={editForm.assignedTo}\n onChange={(e) => setEdit('assignedTo', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Location</Label>\n <Input\n value={editForm.locationName}\n onChange={(e) => setEdit('locationName', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Supplier</Label>\n <Input\n value={editForm.supplier}\n onChange={(e) => setEdit('supplier', e.target.value)}\n />\n </div>\n </div>\n <div className=\"grid gap-4 md:grid-cols-4\">\n <div className=\"space-y-2\">\n <Label>Purchase Value</Label>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"0.01\"\n value={editForm.purchaseValue}\n onChange={(e) => setEdit('purchaseValue', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Salvage Value</Label>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"0.01\"\n value={editForm.salvageValue}\n onChange={(e) => setEdit('salvageValue', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Useful Life (mo)</Label>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"1\"\n value={editForm.usefulLifeMonths}\n onChange={(e) => setEdit('usefulLifeMonths', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Depreciation</Label>\n <Select\n value={editForm.depreciationMethod}\n onValueChange={(v) => setEdit('depreciationMethod', v)}\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"STRAIGHT_LINE\">Straight line</SelectItem>\n <SelectItem value=\"REDUCING_BALANCE\">Reducing balance</SelectItem>\n <SelectItem value=\"NONE\">None</SelectItem>\n </SelectContent>\n </Select>\n </div>\n </div>\n <ResponsiveDialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setShowEdit(false)}\n disabled={updating}\n >\n Cancel\n </Button>\n <Button type=\"submit\" disabled={updating}>\n {updating ? 'Saving…' : 'Save changes'}\n </Button>\n </ResponsiveDialogFooter>\n </form>\n ) : null}\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n\n {/* Dispose dialog */}\n <ResponsiveDialog open={showDispose} onOpenChange={setShowDispose}>\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Dispose asset</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Record the disposal of this asset. It will be marked as disposed and removed from\n active inventory.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <form className=\"space-y-4\" onSubmit={submitDispose}>\n <div className=\"space-y-2\">\n <Label>Disposal Date</Label>\n <Input\n type=\"date\"\n value={disposeForm.disposalDate}\n onChange={(e) =>\n setDisposeForm((prev) => ({ ...prev, disposalDate: e.target.value }))\n }\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Method</Label>\n <Input\n placeholder=\"e.g., Sold, Recycled, Scrapped\"\n value={disposeForm.method}\n onChange={(e) => setDisposeForm((prev) => ({ ...prev, method: e.target.value }))}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Notes</Label>\n <Textarea\n placeholder=\"Optional details about the disposal\"\n value={disposeForm.notes}\n onChange={(e) => setDisposeForm((prev) => ({ ...prev, notes: e.target.value }))}\n rows={2}\n />\n </div>\n <ResponsiveDialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setShowDispose(false)}\n disabled={disposing}\n >\n Cancel\n </Button>\n <Button type=\"submit\" disabled={disposing}>\n {disposing ? 'Disposing…' : 'Confirm disposal'}\n </Button>\n </ResponsiveDialogFooter>\n </form>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n\n {/* Delete dialog */}\n <ResponsiveDialog open={showDelete} onOpenChange={setShowDelete}>\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Delete asset</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n This removes <span className=\"font-medium\">{asset.name}</span> from the inventory.\n This action cannot be undone.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <ResponsiveDialogFooter>\n <Button variant=\"outline\" onClick={() => setShowDelete(false)} disabled={deleting}>\n Cancel\n </Button>\n <Button\n variant=\"destructive\"\n onClick={() => void deleteAsset({ variables: { id: asset.id } })}\n disabled={deleting}\n >\n {deleting ? 'Deleting…' : 'Delete asset'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n </div>\n );\n}\n\nfunction DetailRow({\n label,\n value,\n icon,\n}: {\n label: string;\n value: string;\n icon?: React.ReactNode;\n}) {\n return (\n <div className=\"flex items-start justify-between gap-4\">\n <dt className=\"text-text-secondary flex items-center gap-1.5 shrink-0\">\n {icon}\n {label}\n </dt>\n <dd className=\"font-medium text-right capitalize\">{value}</dd>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -150,6 +150,8 @@ function N() {
150
150
  variant: U === "table" ? "default" : "ghost",
151
151
  size: "icon",
152
152
  className: "h-8 w-8",
153
+ "aria-label": "Table view",
154
+ "aria-pressed": U === "table",
153
155
  onClick: () => W("table"),
154
156
  children: /* @__PURE__ */ f(d, { className: "h-4 w-4" })
155
157
  }),
@@ -157,6 +159,8 @@ function N() {
157
159
  variant: U === "grid" ? "default" : "ghost",
158
160
  size: "icon",
159
161
  className: "h-8 w-8",
162
+ "aria-label": "Grid view",
163
+ "aria-pressed": U === "grid",
160
164
  onClick: () => W("grid"),
161
165
  children: /* @__PURE__ */ f(s, { className: "h-4 w-4" })
162
166
  }),
@@ -164,6 +168,8 @@ function N() {
164
168
  variant: U === "list" ? "default" : "ghost",
165
169
  size: "icon",
166
170
  className: "h-8 w-8",
171
+ "aria-label": "List view",
172
+ "aria-pressed": U === "list",
167
173
  onClick: () => W("list"),
168
174
  children: /* @__PURE__ */ f(c, { className: "h-4 w-4" })
169
175
  })