@burdenoff/microfe-theglobalfuel 2026.704.1 → 2026.705.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/dist/node_modules/{.bun/clsx@2.1.1/node_modules/clsx → clsx}/dist/clsx.js +1 -1
  2. package/dist/node_modules/clsx/dist/clsx.js.map +1 -0
  3. package/dist/node_modules/{.bun/tailwind-merge@3.5.0/node_modules/tailwind-merge → tailwind-merge}/dist/bundle-mjs.js +212 -170
  4. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -0
  5. package/dist/theglobalfuel/components/DataTable.js +37 -27
  6. package/dist/theglobalfuel/components/DataTable.js.map +1 -1
  7. package/dist/theglobalfuel/hooks/index.js +1 -0
  8. package/dist/theglobalfuel/hooks/useNotify.js +19 -0
  9. package/dist/theglobalfuel/hooks/useNotify.js.map +1 -0
  10. package/dist/theglobalfuel/hooks/useTheFiles.js +4 -1
  11. package/dist/theglobalfuel/hooks/useTheFiles.js.map +1 -1
  12. package/dist/theglobalfuel/hooks/useTheGlobalFuelApi.js +59 -31
  13. package/dist/theglobalfuel/hooks/useTheGlobalFuelApi.js.map +1 -1
  14. package/dist/theglobalfuel/pages/assets/AssetDetailPage.js +367 -321
  15. package/dist/theglobalfuel/pages/assets/AssetDetailPage.js.map +1 -1
  16. package/dist/theglobalfuel/pages/assets/AssetsPage.js +66 -54
  17. package/dist/theglobalfuel/pages/assets/AssetsPage.js.map +1 -1
  18. package/dist/theglobalfuel/pages/compliance/CompliancePage.js +346 -182
  19. package/dist/theglobalfuel/pages/compliance/CompliancePage.js.map +1 -1
  20. package/dist/theglobalfuel/pages/contracts/ContractDetailPage.js +418 -390
  21. package/dist/theglobalfuel/pages/contracts/ContractDetailPage.js.map +1 -1
  22. package/dist/theglobalfuel/pages/contracts/ContractsPage.js +238 -230
  23. package/dist/theglobalfuel/pages/contracts/ContractsPage.js.map +1 -1
  24. package/dist/theglobalfuel/pages/dashboard/DashboardPage.js +5 -3
  25. package/dist/theglobalfuel/pages/dashboard/DashboardPage.js.map +1 -1
  26. package/dist/theglobalfuel/pages/emissions/EmissionsPage.js +201 -177
  27. package/dist/theglobalfuel/pages/emissions/EmissionsPage.js.map +1 -1
  28. package/dist/theglobalfuel/pages/inventory/InventoryPage.js +271 -238
  29. package/dist/theglobalfuel/pages/inventory/InventoryPage.js.map +1 -1
  30. package/dist/theglobalfuel/pages/production/ProductionPage.js +185 -177
  31. package/dist/theglobalfuel/pages/production/ProductionPage.js.map +1 -1
  32. package/dist/theglobalfuel/pages/reserves/ReservesPage.js +160 -138
  33. package/dist/theglobalfuel/pages/reserves/ReservesPage.js.map +1 -1
  34. package/dist/theglobalfuel/pages/shipments/ShipmentsPage.js +250 -198
  35. package/dist/theglobalfuel/pages/shipments/ShipmentsPage.js.map +1 -1
  36. package/dist/theglobalfuel/utils/cn.js +2 -2
  37. package/dist/theglobalfuel/utils/formatters.js +6 -1
  38. package/dist/theglobalfuel/utils/formatters.js.map +1 -1
  39. package/dist/theglobalfuel/utils/transitions.js +70 -0
  40. package/dist/theglobalfuel/utils/transitions.js.map +1 -0
  41. package/package.json +1 -1
  42. package/dist/dev/main.d.ts +0 -2
  43. package/dist/dev/main.d.ts.map +0 -1
  44. package/dist/index.d.ts +0 -2
  45. package/dist/index.d.ts.map +0 -1
  46. package/dist/node_modules/.bun/clsx@2.1.1/node_modules/clsx/dist/clsx.js.map +0 -1
  47. package/dist/node_modules/.bun/tailwind-merge@3.5.0/node_modules/tailwind-merge/dist/bundle-mjs.js.map +0 -1
  48. package/dist/theglobalfuel/TheGlobalFuelRoot.d.ts +0 -5
  49. package/dist/theglobalfuel/TheGlobalFuelRoot.d.ts.map +0 -1
  50. package/dist/theglobalfuel/TheGlobalFuelRoutes.d.ts +0 -4
  51. package/dist/theglobalfuel/TheGlobalFuelRoutes.d.ts.map +0 -1
  52. package/dist/theglobalfuel/components/DataTable.d.ts +0 -28
  53. package/dist/theglobalfuel/components/DataTable.d.ts.map +0 -1
  54. package/dist/theglobalfuel/components/EmptyState.d.ts +0 -18
  55. package/dist/theglobalfuel/components/EmptyState.d.ts.map +0 -1
  56. package/dist/theglobalfuel/components/EvidenceUpload.d.ts +0 -14
  57. package/dist/theglobalfuel/components/EvidenceUpload.d.ts.map +0 -1
  58. package/dist/theglobalfuel/components/FileLink.d.ts +0 -15
  59. package/dist/theglobalfuel/components/FileLink.d.ts.map +0 -1
  60. package/dist/theglobalfuel/components/FilterTabs.d.ts +0 -18
  61. package/dist/theglobalfuel/components/FilterTabs.d.ts.map +0 -1
  62. package/dist/theglobalfuel/components/MetricsCard.d.ts +0 -23
  63. package/dist/theglobalfuel/components/MetricsCard.d.ts.map +0 -1
  64. package/dist/theglobalfuel/components/MiniBar.d.ts +0 -16
  65. package/dist/theglobalfuel/components/MiniBar.d.ts.map +0 -1
  66. package/dist/theglobalfuel/components/PageLayout.d.ts +0 -16
  67. package/dist/theglobalfuel/components/PageLayout.d.ts.map +0 -1
  68. package/dist/theglobalfuel/components/Pagination.d.ts +0 -22
  69. package/dist/theglobalfuel/components/Pagination.d.ts.map +0 -1
  70. package/dist/theglobalfuel/components/StateViews.d.ts +0 -24
  71. package/dist/theglobalfuel/components/StateViews.d.ts.map +0 -1
  72. package/dist/theglobalfuel/components/StatusBadge.d.ts +0 -9
  73. package/dist/theglobalfuel/components/StatusBadge.d.ts.map +0 -1
  74. package/dist/theglobalfuel/components/Tabs.d.ts +0 -17
  75. package/dist/theglobalfuel/components/Tabs.d.ts.map +0 -1
  76. package/dist/theglobalfuel/components/TheDiscussion.d.ts +0 -18
  77. package/dist/theglobalfuel/components/TheDiscussion.d.ts.map +0 -1
  78. package/dist/theglobalfuel/components/TheTags.d.ts +0 -17
  79. package/dist/theglobalfuel/components/TheTags.d.ts.map +0 -1
  80. package/dist/theglobalfuel/components/index.d.ts +0 -19
  81. package/dist/theglobalfuel/components/index.d.ts.map +0 -1
  82. package/dist/theglobalfuel/context/TheGlobalFuelContext.d.ts +0 -16
  83. package/dist/theglobalfuel/context/TheGlobalFuelContext.d.ts.map +0 -1
  84. package/dist/theglobalfuel/context/index.d.ts +0 -6
  85. package/dist/theglobalfuel/context/index.d.ts.map +0 -1
  86. package/dist/theglobalfuel/hooks/index.d.ts +0 -10
  87. package/dist/theglobalfuel/hooks/index.d.ts.map +0 -1
  88. package/dist/theglobalfuel/hooks/useCursorPager.d.ts +0 -33
  89. package/dist/theglobalfuel/hooks/useCursorPager.d.ts.map +0 -1
  90. package/dist/theglobalfuel/hooks/useTheComments.d.ts +0 -36
  91. package/dist/theglobalfuel/hooks/useTheComments.d.ts.map +0 -1
  92. package/dist/theglobalfuel/hooks/useTheFiles.d.ts +0 -47
  93. package/dist/theglobalfuel/hooks/useTheFiles.d.ts.map +0 -1
  94. package/dist/theglobalfuel/hooks/useTheGlobalFuelApi.d.ts +0 -75
  95. package/dist/theglobalfuel/hooks/useTheGlobalFuelApi.d.ts.map +0 -1
  96. package/dist/theglobalfuel/hooks/useTheTags.d.ts +0 -44
  97. package/dist/theglobalfuel/hooks/useTheTags.d.ts.map +0 -1
  98. package/dist/theglobalfuel/index.d.ts +0 -9
  99. package/dist/theglobalfuel/index.d.ts.map +0 -1
  100. package/dist/theglobalfuel/pages/assets/AssetDetailPage.d.ts +0 -13
  101. package/dist/theglobalfuel/pages/assets/AssetDetailPage.d.ts.map +0 -1
  102. package/dist/theglobalfuel/pages/assets/AssetsPage.d.ts +0 -10
  103. package/dist/theglobalfuel/pages/assets/AssetsPage.d.ts.map +0 -1
  104. package/dist/theglobalfuel/pages/compliance/CompliancePage.d.ts +0 -11
  105. package/dist/theglobalfuel/pages/compliance/CompliancePage.d.ts.map +0 -1
  106. package/dist/theglobalfuel/pages/contracts/ContractDetailPage.d.ts +0 -9
  107. package/dist/theglobalfuel/pages/contracts/ContractDetailPage.d.ts.map +0 -1
  108. package/dist/theglobalfuel/pages/contracts/ContractsPage.d.ts +0 -8
  109. package/dist/theglobalfuel/pages/contracts/ContractsPage.d.ts.map +0 -1
  110. package/dist/theglobalfuel/pages/dashboard/DashboardPage.d.ts +0 -13
  111. package/dist/theglobalfuel/pages/dashboard/DashboardPage.d.ts.map +0 -1
  112. package/dist/theglobalfuel/pages/emissions/EmissionsPage.d.ts +0 -12
  113. package/dist/theglobalfuel/pages/emissions/EmissionsPage.d.ts.map +0 -1
  114. package/dist/theglobalfuel/pages/inventory/InventoryPage.d.ts +0 -11
  115. package/dist/theglobalfuel/pages/inventory/InventoryPage.d.ts.map +0 -1
  116. package/dist/theglobalfuel/pages/production/ProductionPage.d.ts +0 -11
  117. package/dist/theglobalfuel/pages/production/ProductionPage.d.ts.map +0 -1
  118. package/dist/theglobalfuel/pages/reserves/ReservesPage.d.ts +0 -10
  119. package/dist/theglobalfuel/pages/reserves/ReservesPage.d.ts.map +0 -1
  120. package/dist/theglobalfuel/pages/shipments/ShipmentsPage.d.ts +0 -10
  121. package/dist/theglobalfuel/pages/shipments/ShipmentsPage.d.ts.map +0 -1
  122. package/dist/theglobalfuel/types/index.d.ts +0 -376
  123. package/dist/theglobalfuel/types/index.d.ts.map +0 -1
  124. package/dist/theglobalfuel/utils/cn.d.ts +0 -4
  125. package/dist/theglobalfuel/utils/cn.d.ts.map +0 -1
  126. package/dist/theglobalfuel/utils/formatters.d.ts +0 -36
  127. package/dist/theglobalfuel/utils/formatters.d.ts.map +0 -1
  128. package/dist/theglobalfuel/utils/i18n.d.ts +0 -6
  129. package/dist/theglobalfuel/utils/i18n.d.ts.map +0 -1
  130. package/dist/theglobalfuel/utils/index.d.ts +0 -9
  131. package/dist/theglobalfuel/utils/index.d.ts.map +0 -1
  132. package/dist/theglobalfuel/utils/navigation.d.ts +0 -14
  133. package/dist/theglobalfuel/utils/navigation.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"AssetDetailPage.js","names":[],"sources":["../../../../src/theglobalfuel/pages/assets/AssetDetailPage.tsx"],"sourcesContent":["/**\n * Asset detail — lifecycle, production capture, reserve estimates, emissions,\n * tags & discussion for a single resource asset.\n * @module theglobalfuel/pages/assets\n *\n * Reads `theAsset` (+ nested productionRecords / reserveEstimates) and\n * `theListEmissionRecords`; writes `theRecordProduction`,\n * `theCreateReserveEstimate`, `theTransitionAsset` and `theRetireAsset`. Child\n * creates invalidate the asset query in the hooks, so we just close the dialog\n * and let it refetch. No mock data.\n */\n\nimport { useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport {\n ArrowLeft,\n Plus,\n Archive,\n Gauge,\n Percent,\n Fuel,\n CalendarClock,\n MapPin,\n Activity,\n Layers,\n Factory,\n Tag,\n MessageSquare,\n} from 'lucide-react';\nimport {\n Button,\n Input,\n Label,\n Textarea,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n GlassCard,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n} from '@burdenoff/fe-libs/ui';\nimport {\n PageLayout,\n StatusBadge,\n DataTable,\n type Column,\n Tabs,\n type TabItem,\n Section,\n LoadingView,\n ErrorView,\n EmptyState,\n MetricsCard,\n TheTags,\n TheDiscussion,\n} from '../../components';\nimport { useTheGlobalFuel } from '../../context';\nimport {\n useTheAsset,\n useTheEmissionRecords,\n useTheRecordProduction,\n useTheCreateReserveEstimate,\n useTheTransitionAsset,\n useTheRetireAsset,\n} from '../../hooks';\nimport {\n formatDate,\n formatVolume,\n formatPercent,\n formatEnumLabel,\n formatCoords,\n formatNumber,\n formatTonnesCo2e,\n formatRelativeTime,\n} from '../../utils';\nimport type {\n TheAssetStatus,\n TheUnit,\n TheReserveCategory,\n TheProductionRecord,\n TheReserveEstimate,\n TheEmissionRecord,\n} from '../../types';\n\ntype AssetTab = 'production' | 'reserves' | 'emissions' | 'tags' | 'discussion';\n\n// Lifecycle transitions offered in the header Select — RETIRED is a terminal\n// state driven by the dedicated Retire action, not this control.\nconst TRANSITION_STATUSES: TheAssetStatus[] = [\n 'EXPLORATION',\n 'APPRAISAL',\n 'DEVELOPMENT',\n 'PRODUCING',\n 'SUSPENDED',\n 'DECOMMISSIONING',\n];\n\nconst UNITS: TheUnit[] = ['BARRELS', 'CUBIC_METERS', 'TONNES', 'KILOGRAMS', 'MWH', 'GJ', 'MCF'];\n\nconst RESERVE_CATEGORIES: TheReserveCategory[] = [\n 'PROVED',\n 'PROBABLE',\n 'POSSIBLE',\n 'CONTINGENT',\n 'PROSPECTIVE',\n];\n\nconst today = (): string => new Date().toISOString().slice(0, 10);\n\ninterface ProductionFormState {\n periodStart: string;\n periodEnd: string;\n volume: string;\n unit: TheUnit;\n grade: string;\n downtimeHours: string;\n notes: string;\n}\n\ninterface ReserveFormState {\n category: TheReserveCategory;\n asOfDate: string;\n recoverable: string;\n recoveryFactor: string;\n unit: TheUnit;\n methodology: string;\n notes: string;\n}\n\nexport function AssetDetailPage() {\n const { id } = useParams<{ id: string }>();\n const { navigateTo } = useTheGlobalFuel();\n\n const { data: asset, isLoading, isError, refetch } = useTheAsset(id);\n const emissions = useTheEmissionRecords({ assetId: id });\n\n const transitionAsset = useTheTransitionAsset();\n const retireAsset = useTheRetireAsset();\n const recordProduction = useTheRecordProduction();\n const createReserve = useTheCreateReserveEstimate();\n\n const [activeTab, setActiveTab] = useState<AssetTab>('production');\n const [error, setError] = useState<string | null>(null);\n\n const [productionOpen, setProductionOpen] = useState(false);\n const [productionForm, setProductionForm] = useState<ProductionFormState>({\n periodStart: '',\n periodEnd: '',\n volume: '',\n unit: 'BARRELS',\n grade: '',\n downtimeHours: '',\n notes: '',\n });\n\n const [reserveOpen, setReserveOpen] = useState(false);\n const [reserveForm, setReserveForm] = useState<ReserveFormState>({\n category: 'PROVED',\n asOfDate: '',\n recoverable: '',\n recoveryFactor: '',\n unit: 'BARRELS',\n methodology: '',\n notes: '',\n });\n\n if (isLoading) {\n return (\n <PageLayout title=\"Asset\">\n <LoadingView label=\"Loading asset…\" />\n </PageLayout>\n );\n }\n if (isError || !asset) {\n return (\n <PageLayout\n title=\"Asset\"\n actions={\n <Button variant=\"ghost\" onClick={() => navigateTo('assets')}>\n <ArrowLeft className=\"mr-1.5 h-4 w-4\" /> Back\n </Button>\n }\n >\n {isError ? (\n <ErrorView message=\"This asset could not be loaded.\" onRetry={() => refetch()} />\n ) : (\n <EmptyState\n illustration=\"empty-search\"\n icon={<Fuel className=\"h-10 w-10\" />}\n title=\"Asset not found\"\n description=\"This asset may have been retired or you may not have access to it.\"\n action={<Button onClick={() => navigateTo('assets')}>Back to assets</Button>}\n />\n )}\n </PageLayout>\n );\n }\n\n const productionRows = asset.productionRecords ?? [];\n const reserveRows = asset.reserveEstimates ?? [];\n const emissionRows = emissions.data?.items ?? [];\n const isRetired = asset.status === 'RETIRED';\n\n const openProduction = () => {\n setError(null);\n setProductionForm({\n periodStart: today(),\n periodEnd: today(),\n volume: '',\n unit: asset.capacityUnit,\n grade: '',\n downtimeHours: '',\n notes: '',\n });\n setProductionOpen(true);\n };\n\n const openReserve = () => {\n setError(null);\n setReserveForm({\n category: 'PROVED',\n asOfDate: today(),\n recoverable: '',\n recoveryFactor: '',\n unit: asset.capacityUnit,\n methodology: '',\n notes: '',\n });\n setReserveOpen(true);\n };\n\n const handleTransition = async (next: TheAssetStatus) => {\n if (!id || next === asset.status) return;\n setError(null);\n try {\n await transitionAsset.mutateAsync({ id, status: next });\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to change asset status.');\n }\n };\n\n const handleRetire = async () => {\n if (!id) return;\n if (!window.confirm(`Retire ${asset.name}? This marks the asset as decommissioned.`)) return;\n setError(null);\n try {\n await retireAsset.mutateAsync(id);\n navigateTo('assets');\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to retire asset.');\n }\n };\n\n const handleRecordProduction = async () => {\n if (!id || !productionForm.periodStart || !productionForm.periodEnd || !productionForm.volume) {\n setError('Period start, period end and volume are required.');\n return;\n }\n setError(null);\n try {\n await recordProduction.mutateAsync({\n assetId: id,\n periodStart: new Date(productionForm.periodStart).toISOString(),\n periodEnd: new Date(productionForm.periodEnd).toISOString(),\n volume: Number(productionForm.volume),\n unit: productionForm.unit,\n grade: productionForm.grade ? Number(productionForm.grade) : null,\n downtimeHours: productionForm.downtimeHours ? Number(productionForm.downtimeHours) : null,\n notes: productionForm.notes.trim() || null,\n });\n setProductionOpen(false);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to record production.');\n }\n };\n\n const handleCreateReserve = async () => {\n if (!id || !reserveForm.asOfDate || !reserveForm.recoverable) {\n setError('As-of date and recoverable volume are required.');\n return;\n }\n setError(null);\n try {\n await createReserve.mutateAsync({\n assetId: id,\n category: reserveForm.category,\n asOfDate: new Date(reserveForm.asOfDate).toISOString(),\n recoverable: Number(reserveForm.recoverable),\n recoveryFactor: reserveForm.recoveryFactor ? Number(reserveForm.recoveryFactor) : null,\n unit: reserveForm.unit,\n methodology: reserveForm.methodology.trim() || null,\n notes: reserveForm.notes.trim() || null,\n });\n setReserveOpen(false);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to add reserve estimate.');\n }\n };\n\n // ── Columns ─────────────────────────────────────────────────────────────────\n const productionColumns: Column<TheProductionRecord>[] = [\n {\n key: 'period',\n header: 'Period',\n render: (r) => (\n <span className=\"font-medium text-text-primary\">\n {formatDate(r.periodStart)} – {formatDate(r.periodEnd)}\n </span>\n ),\n },\n {\n key: 'volume',\n header: 'Volume',\n align: 'right',\n sortValue: (r) => r.volume,\n render: (r) => (\n <span className=\"tabular-nums font-medium text-text-primary\">\n {formatVolume(r.volume, r.unit)}\n </span>\n ),\n },\n {\n key: 'grade',\n header: 'Grade',\n align: 'right',\n hideOnMobile: true,\n render: (r) =>\n r.grade != null ? (\n <span className=\"tabular-nums text-text-secondary\">{formatNumber(r.grade)}</span>\n ) : (\n <span className=\"text-text-tertiary\">—</span>\n ),\n },\n {\n key: 'downtime',\n header: 'Downtime',\n align: 'right',\n hideOnMobile: true,\n sortValue: (r) => r.downtimeHours,\n render: (r) => (\n <span className=\"tabular-nums text-text-secondary\">{formatNumber(r.downtimeHours)} h</span>\n ),\n },\n {\n key: 'notes',\n header: 'Notes',\n hideOnMobile: true,\n render: (r) =>\n r.notes ? (\n <span className=\"block max-w-[16rem] truncate text-text-secondary\">{r.notes}</span>\n ) : (\n <span className=\"text-text-tertiary\">—</span>\n ),\n },\n {\n key: 'recorded',\n header: 'Recorded',\n align: 'right',\n hideOnMobile: true,\n render: (r) => <span className=\"text-text-tertiary\">{formatRelativeTime(r.createdAt)}</span>,\n },\n ];\n\n const reserveColumns: Column<TheReserveEstimate>[] = [\n { key: 'category', header: 'Category', render: (r) => <StatusBadge status={r.category} /> },\n {\n key: 'asOf',\n header: 'As of',\n render: (r) => <span className=\"text-text-secondary\">{formatDate(r.asOfDate)}</span>,\n },\n {\n key: 'recoverable',\n header: 'Recoverable',\n align: 'right',\n sortValue: (r) => r.recoverable,\n render: (r) => (\n <span className=\"tabular-nums font-medium text-text-primary\">\n {formatVolume(r.recoverable, r.unit)}\n </span>\n ),\n },\n {\n key: 'recoveryFactor',\n header: 'Recovery factor',\n align: 'right',\n hideOnMobile: true,\n render: (r) =>\n r.recoveryFactor != null ? (\n <span className=\"tabular-nums text-text-secondary\">\n {formatPercent(r.recoveryFactor)}\n </span>\n ) : (\n <span className=\"text-text-tertiary\">—</span>\n ),\n },\n {\n key: 'methodology',\n header: 'Methodology',\n hideOnMobile: true,\n render: (r) =>\n r.methodology ? (\n <span className=\"block max-w-[14rem] truncate text-text-secondary\">{r.methodology}</span>\n ) : (\n <span className=\"text-text-tertiary\">—</span>\n ),\n },\n {\n key: 'added',\n header: 'Added',\n align: 'right',\n hideOnMobile: true,\n render: (r) => <span className=\"text-text-tertiary\">{formatRelativeTime(r.createdAt)}</span>,\n },\n ];\n\n const emissionColumns: Column<TheEmissionRecord>[] = [\n { key: 'scope', header: 'Scope', render: (e) => <StatusBadge status={e.scope} /> },\n {\n key: 'co2e',\n header: 'CO₂e',\n align: 'right',\n sortValue: (e) => e.co2eTonnes,\n render: (e) => (\n <span className=\"tabular-nums font-medium text-text-primary\">\n {formatTonnesCo2e(e.co2eTonnes)}\n </span>\n ),\n },\n {\n key: 'period',\n header: 'Period',\n hideOnMobile: true,\n render: (e) => (\n <span className=\"text-text-secondary\">\n {formatDate(e.periodStart)} – {formatDate(e.periodEnd)}\n </span>\n ),\n },\n {\n key: 'source',\n header: 'Source',\n hideOnMobile: true,\n render: (e) => <span className=\"text-text-secondary\">{e.source ?? '—'}</span>,\n },\n {\n key: 'verified',\n header: 'Verified',\n render: (e) =>\n e.verified ? (\n <span className=\"text-sm font-medium text-status-success-text\">Verified</span>\n ) : (\n <span className=\"text-sm text-text-tertiary\">Unverified</span>\n ),\n },\n {\n key: 'recorded',\n header: 'Recorded',\n align: 'right',\n hideOnMobile: true,\n render: (e) => <span className=\"text-text-tertiary\">{formatRelativeTime(e.createdAt)}</span>,\n },\n ];\n\n const tabs: TabItem<AssetTab>[] = [\n {\n value: 'production',\n label: 'Production',\n icon: <Activity className=\"h-4 w-4\" />,\n count: productionRows.length,\n },\n {\n value: 'reserves',\n label: 'Reserves',\n icon: <Layers className=\"h-4 w-4\" />,\n count: reserveRows.length,\n },\n {\n value: 'emissions',\n label: 'Emissions',\n icon: <Factory className=\"h-4 w-4\" />,\n count: emissionRows.length,\n },\n { value: 'tags', label: 'Tags', icon: <Tag className=\"h-4 w-4\" /> },\n { value: 'discussion', label: 'Discussion', icon: <MessageSquare className=\"h-4 w-4\" /> },\n ];\n\n return (\n <PageLayout\n title={asset.name}\n description={[asset.code, formatEnumLabel(asset.kind)].filter(Boolean).join(' · ')}\n actions={\n <>\n <StatusBadge status={asset.status} />\n {!isRetired && (\n <Select\n value={asset.status}\n onValueChange={(v) => handleTransition(v as TheAssetStatus)}\n >\n <SelectTrigger className=\"h-9 w-44\" aria-label=\"Change asset status\">\n <SelectValue placeholder=\"Change status\" />\n </SelectTrigger>\n <SelectContent>\n {TRANSITION_STATUSES.map((s) => (\n <SelectItem key={s} value={s}>\n {formatEnumLabel(s)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n {!isRetired && (\n <Button\n variant=\"ghost\"\n onClick={handleRetire}\n disabled={retireAsset.isPending}\n className=\"text-status-error-text hover:text-status-error-text\"\n >\n <Archive className=\"mr-1.5 h-4 w-4\" /> Retire\n </Button>\n )}\n <Button variant=\"ghost\" onClick={() => navigateTo('assets')}>\n <ArrowLeft className=\"mr-1.5 h-4 w-4\" /> Back\n </Button>\n </>\n }\n >\n {/* Metric strip */}\n <div className=\"grid grid-cols-2 gap-4 sm:grid-cols-3 lg:grid-cols-5\">\n <MetricsCard\n icon={<Gauge className=\"h-5 w-5\" />}\n value={\n asset.capacityPerDay > 0\n ? `${formatVolume(asset.capacityPerDay, asset.capacityUnit)}/day`\n : '—'\n }\n label=\"Capacity\"\n />\n <MetricsCard\n icon={<Percent className=\"h-5 w-5\" />}\n value={formatPercent(asset.workingInterestPct)}\n label=\"Working interest\"\n />\n <MetricsCard\n icon={<Fuel className=\"h-5 w-5\" />}\n value={formatEnumLabel(asset.commodity)}\n label=\"Commodity\"\n />\n <MetricsCard\n icon={<CalendarClock className=\"h-5 w-5\" />}\n value={formatDate(asset.commissionedAt)}\n label=\"Commissioned\"\n />\n <MetricsCard\n icon={<MapPin className=\"h-5 w-5\" />}\n value={formatCoords(asset.latitude, asset.longitude)}\n label=\"Location\"\n footer={\n asset.location ? (\n <p className=\"truncate text-xs text-text-tertiary\">{asset.location}</p>\n ) : undefined\n }\n />\n </div>\n\n {error && <p className=\"mt-4 text-sm text-status-error-text\">{error}</p>}\n\n <div className=\"mt-6\">\n <Tabs items={tabs} value={activeTab} onChange={setActiveTab} />\n </div>\n\n {/* ── Production ──────────────────────────────────────────────────────── */}\n {activeTab === 'production' && (\n <Section\n title=\"Production\"\n description=\"Volumes produced per reporting period, with grade & downtime.\"\n action={\n <Button size=\"sm\" onClick={openProduction}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> Record production\n </Button>\n }\n >\n {productionRows.length === 0 ? (\n <EmptyState\n illustration=\"empty-data\"\n icon={<Activity className=\"h-10 w-10\" />}\n title=\"No production recorded\"\n description=\"Record a production period to start tracking volumes for this asset.\"\n action={\n <Button onClick={openProduction}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> Record production\n </Button>\n }\n />\n ) : (\n <DataTable\n columns={productionColumns}\n rows={productionRows}\n rowKey={(r) => r.id}\n defaultSort={{ key: 'period', dir: 'desc' }}\n />\n )}\n </Section>\n )}\n\n {/* ── Reserves ────────────────────────────────────────────────────────── */}\n {activeTab === 'reserves' && (\n <Section\n title=\"Reserve estimates\"\n description=\"Recoverable volumes by SPE-PRMS reserve category & as-of date.\"\n action={\n <Button size=\"sm\" onClick={openReserve}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> Add reserve estimate\n </Button>\n }\n >\n {reserveRows.length === 0 ? (\n <EmptyState\n illustration=\"empty-data\"\n icon={<Layers className=\"h-10 w-10\" />}\n title=\"No reserve estimates\"\n description=\"Add a reserve estimate to record recoverable volumes for this asset.\"\n action={\n <Button onClick={openReserve}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> Add reserve estimate\n </Button>\n }\n />\n ) : (\n <DataTable columns={reserveColumns} rows={reserveRows} rowKey={(r) => r.id} />\n )}\n </Section>\n )}\n\n {/* ── Emissions ───────────────────────────────────────────────────────── */}\n {activeTab === 'emissions' && (\n <Section\n title=\"Emissions\"\n description=\"GHG emission records attributed to this asset (Scope 1 / 2 / 3).\"\n >\n {emissions.isLoading ? (\n <LoadingView label=\"Loading emissions…\" />\n ) : emissions.isError ? (\n <ErrorView\n message=\"Couldn't load emission records.\"\n onRetry={() => emissions.refetch()}\n />\n ) : emissionRows.length === 0 ? (\n <EmptyState\n illustration=\"empty-data\"\n icon={<Factory className=\"h-10 w-10\" />}\n title=\"No emissions recorded\"\n description=\"Emission records attributed to this asset will appear here.\"\n />\n ) : (\n <DataTable columns={emissionColumns} rows={emissionRows} rowKey={(e) => e.id} />\n )}\n </Section>\n )}\n\n {/* ── Tags ────────────────────────────────────────────────────────────── */}\n {activeTab === 'tags' && (\n <Section title=\"Tags\" description=\"Label this asset for search, grouping & reporting.\">\n <GlassCard treatment=\"glass\" className=\"p-6\">\n <TheTags entityType=\"theglobalfuel-asset\" entityId={asset.id} />\n </GlassCard>\n </Section>\n )}\n\n {/* ── Discussion ──────────────────────────────────────────────────────── */}\n {activeTab === 'discussion' && (\n <div className=\"mt-8\">\n <TheDiscussion\n entityType=\"theglobalfuel-asset\"\n entityId={asset.id}\n title=\"Discussion\"\n description=\"Notes & coordination for this asset.\"\n />\n </div>\n )}\n\n {/* Record production dialog */}\n <ResponsiveDialog open={productionOpen} onOpenChange={setProductionOpen}>\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Record production</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Log a production period for {asset.name}.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n\n <div className=\"grid gap-4 py-2\">\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"prodStart\">Period start *</Label>\n <Input\n id=\"prodStart\"\n type=\"date\"\n value={productionForm.periodStart}\n onChange={(e) =>\n setProductionForm({ ...productionForm, periodStart: e.target.value })\n }\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"prodEnd\">Period end *</Label>\n <Input\n id=\"prodEnd\"\n type=\"date\"\n value={productionForm.periodEnd}\n onChange={(e) =>\n setProductionForm({ ...productionForm, periodEnd: e.target.value })\n }\n />\n </div>\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"prodVolume\">Volume *</Label>\n <Input\n id=\"prodVolume\"\n type=\"number\"\n min=\"0\"\n step=\"any\"\n value={productionForm.volume}\n onChange={(e) => setProductionForm({ ...productionForm, volume: e.target.value })}\n placeholder=\"118500\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"prodUnit\">Unit</Label>\n <Select\n value={productionForm.unit}\n onValueChange={(v) =>\n setProductionForm({ ...productionForm, unit: v as TheUnit })\n }\n >\n <SelectTrigger id=\"prodUnit\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {UNITS.map((u) => (\n <SelectItem key={u} value={u}>\n {formatEnumLabel(u)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"prodGrade\">Grade</Label>\n <Input\n id=\"prodGrade\"\n type=\"number\"\n step=\"any\"\n value={productionForm.grade}\n onChange={(e) => setProductionForm({ ...productionForm, grade: e.target.value })}\n placeholder=\"Optional (e.g. API / assay)\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"prodDowntime\">Downtime (hours)</Label>\n <Input\n id=\"prodDowntime\"\n type=\"number\"\n min=\"0\"\n step=\"any\"\n value={productionForm.downtimeHours}\n onChange={(e) =>\n setProductionForm({ ...productionForm, downtimeHours: e.target.value })\n }\n placeholder=\"0\"\n />\n </div>\n </div>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"prodNotes\">Notes</Label>\n <Textarea\n id=\"prodNotes\"\n rows={2}\n value={productionForm.notes}\n onChange={(e) => setProductionForm({ ...productionForm, notes: e.target.value })}\n placeholder=\"Optional context about this period.\"\n />\n </div>\n\n {error && productionOpen && <p className=\"text-sm text-status-error-text\">{error}</p>}\n </div>\n\n <ResponsiveDialogFooter>\n <Button variant=\"outline\" onClick={() => setProductionOpen(false)}>\n Cancel\n </Button>\n <Button onClick={handleRecordProduction} disabled={recordProduction.isPending}>\n {recordProduction.isPending ? 'Recording…' : 'Record production'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n\n {/* Add reserve estimate dialog */}\n <ResponsiveDialog open={reserveOpen} onOpenChange={setReserveOpen}>\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Add reserve estimate</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Record a recoverable-volume estimate for {asset.name}.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n\n <div className=\"grid gap-4 py-2\">\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"resCategory\">Category</Label>\n <Select\n value={reserveForm.category}\n onValueChange={(v) =>\n setReserveForm({ ...reserveForm, category: v as TheReserveCategory })\n }\n >\n <SelectTrigger id=\"resCategory\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {RESERVE_CATEGORIES.map((c) => (\n <SelectItem key={c} value={c}>\n {formatEnumLabel(c)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"resAsOf\">As-of date *</Label>\n <Input\n id=\"resAsOf\"\n type=\"date\"\n value={reserveForm.asOfDate}\n onChange={(e) => setReserveForm({ ...reserveForm, asOfDate: e.target.value })}\n />\n </div>\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-3\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"resRecoverable\">Recoverable *</Label>\n <Input\n id=\"resRecoverable\"\n type=\"number\"\n min=\"0\"\n step=\"any\"\n value={reserveForm.recoverable}\n onChange={(e) => setReserveForm({ ...reserveForm, recoverable: e.target.value })}\n placeholder=\"2400000\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"resUnit\">Unit</Label>\n <Select\n value={reserveForm.unit}\n onValueChange={(v) => setReserveForm({ ...reserveForm, unit: v as TheUnit })}\n >\n <SelectTrigger id=\"resUnit\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {UNITS.map((u) => (\n <SelectItem key={u} value={u}>\n {formatEnumLabel(u)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"resFactor\">Recovery factor (%)</Label>\n <Input\n id=\"resFactor\"\n type=\"number\"\n min=\"0\"\n max=\"100\"\n step=\"any\"\n value={reserveForm.recoveryFactor}\n onChange={(e) =>\n setReserveForm({ ...reserveForm, recoveryFactor: e.target.value })\n }\n placeholder=\"35\"\n />\n </div>\n </div>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"resMethodology\">Methodology</Label>\n <Input\n id=\"resMethodology\"\n value={reserveForm.methodology}\n onChange={(e) => setReserveForm({ ...reserveForm, methodology: e.target.value })}\n placeholder=\"Volumetric / material balance / decline curve\"\n />\n </div>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"resNotes\">Notes</Label>\n <Textarea\n id=\"resNotes\"\n rows={2}\n value={reserveForm.notes}\n onChange={(e) => setReserveForm({ ...reserveForm, notes: e.target.value })}\n placeholder=\"Optional context about this estimate.\"\n />\n </div>\n\n {error && reserveOpen && <p className=\"text-sm text-status-error-text\">{error}</p>}\n </div>\n\n <ResponsiveDialogFooter>\n <Button variant=\"outline\" onClick={() => setReserveOpen(false)}>\n Cancel\n </Button>\n <Button onClick={handleCreateReserve} disabled={createReserve.isPending}>\n {createReserve.isPending ? 'Adding…' : 'Add estimate'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"AssetDetailPage.js","names":[],"sources":["../../../../src/theglobalfuel/pages/assets/AssetDetailPage.tsx"],"sourcesContent":["/**\n * Asset detail — lifecycle, production capture, reserve estimates, emissions,\n * tags & discussion for a single resource asset.\n * @module theglobalfuel/pages/assets\n *\n * Reads `theAsset` (+ nested productionRecords / reserveEstimates) and\n * `theListEmissionRecords`; writes `theRecordProduction`,\n * `theCreateReserveEstimate`, `theTransitionAsset` and `theRetireAsset`. Child\n * creates invalidate the asset query in the hooks, so we just close the dialog\n * and let it refetch. No mock data.\n */\n\nimport { useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport {\n ArrowLeft,\n Plus,\n Archive,\n Gauge,\n Percent,\n Fuel,\n CalendarClock,\n MapPin,\n Activity,\n Layers,\n Factory,\n Tag,\n MessageSquare,\n} from 'lucide-react';\nimport {\n Button,\n Input,\n Label,\n Textarea,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n GlassCard,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n} from '@burdenoff/fe-libs/ui';\nimport {\n PageLayout,\n StatusBadge,\n DataTable,\n type Column,\n Tabs,\n type TabItem,\n Section,\n LoadingView,\n ErrorView,\n EmptyState,\n MetricsCard,\n TheTags,\n TheDiscussion,\n} from '../../components';\nimport { useTheGlobalFuel } from '../../context';\nimport {\n useTheAsset,\n useTheEmissionRecords,\n useTheRecordProduction,\n useTheCreateReserveEstimate,\n useTheTransitionAsset,\n useTheRetireAsset,\n useNotify,\n} from '../../hooks';\nimport {\n formatDate,\n formatVolume,\n formatPercent,\n formatEnumLabel,\n formatCoords,\n formatNumber,\n formatTonnesCo2e,\n formatRelativeTime,\n toBackendDate,\n ASSET_TRANSITIONS,\n nextStatuses,\n} from '../../utils';\nimport type {\n TheAssetStatus,\n TheUnit,\n TheReserveCategory,\n TheProductionRecord,\n TheReserveEstimate,\n TheEmissionRecord,\n} from '../../types';\n\ntype AssetTab = 'production' | 'reserves' | 'emissions' | 'tags' | 'discussion';\n\nconst UNITS: TheUnit[] = ['BARRELS', 'CUBIC_METERS', 'TONNES', 'KILOGRAMS', 'MWH', 'GJ', 'MCF'];\n\nconst RESERVE_CATEGORIES: TheReserveCategory[] = [\n 'PROVED',\n 'PROBABLE',\n 'POSSIBLE',\n 'CONTINGENT',\n 'PROSPECTIVE',\n];\n\nconst today = (): string => new Date().toISOString().slice(0, 10);\n\ninterface ProductionFormState {\n periodStart: string;\n periodEnd: string;\n volume: string;\n unit: TheUnit;\n grade: string;\n downtimeHours: string;\n notes: string;\n}\n\ninterface ReserveFormState {\n category: TheReserveCategory;\n asOfDate: string;\n recoverable: string;\n recoveryFactor: string;\n unit: TheUnit;\n methodology: string;\n notes: string;\n}\n\nexport function AssetDetailPage() {\n const { id } = useParams<{ id: string }>();\n const { navigateTo } = useTheGlobalFuel();\n const notify = useNotify();\n\n const { data: asset, isLoading, isError, refetch } = useTheAsset(id);\n const emissions = useTheEmissionRecords({ assetId: id });\n\n const transitionAsset = useTheTransitionAsset();\n const retireAsset = useTheRetireAsset();\n const recordProduction = useTheRecordProduction();\n const createReserve = useTheCreateReserveEstimate();\n\n const [activeTab, setActiveTab] = useState<AssetTab>('production');\n const [error, setError] = useState<string | null>(null);\n\n const [productionOpen, setProductionOpen] = useState(false);\n const [productionForm, setProductionForm] = useState<ProductionFormState>({\n periodStart: '',\n periodEnd: '',\n volume: '',\n unit: 'BARRELS',\n grade: '',\n downtimeHours: '',\n notes: '',\n });\n\n const [reserveOpen, setReserveOpen] = useState(false);\n const [reserveForm, setReserveForm] = useState<ReserveFormState>({\n category: 'PROVED',\n asOfDate: '',\n recoverable: '',\n recoveryFactor: '',\n unit: 'BARRELS',\n methodology: '',\n notes: '',\n });\n\n if (isLoading) {\n return (\n <PageLayout title=\"Asset\">\n <LoadingView label=\"Loading asset…\" />\n </PageLayout>\n );\n }\n if (isError || !asset) {\n return (\n <PageLayout\n title=\"Asset\"\n actions={\n <Button variant=\"ghost\" onClick={() => navigateTo('assets')}>\n <ArrowLeft className=\"mr-1.5 h-4 w-4\" /> Back\n </Button>\n }\n >\n {isError ? (\n <ErrorView message=\"This asset could not be loaded.\" onRetry={() => refetch()} />\n ) : (\n <EmptyState\n illustration=\"empty-search\"\n icon={<Fuel className=\"h-10 w-10\" />}\n title=\"Asset not found\"\n description=\"This asset may have been retired or you may not have access to it.\"\n action={<Button onClick={() => navigateTo('assets')}>Back to assets</Button>}\n />\n )}\n </PageLayout>\n );\n }\n\n const productionRows = asset.productionRecords ?? [];\n const reserveRows = asset.reserveEstimates ?? [];\n const emissionRows = emissions.data?.items ?? [];\n const isRetired = asset.status === 'RETIRED';\n // Only the legal next states from the svc state machine — never all statuses.\n const transitionOptions = nextStatuses(ASSET_TRANSITIONS, asset.status);\n\n const openProduction = () => {\n setError(null);\n setProductionForm({\n periodStart: today(),\n periodEnd: today(),\n volume: '',\n unit: asset.capacityUnit,\n grade: '',\n downtimeHours: '',\n notes: '',\n });\n setProductionOpen(true);\n };\n\n const openReserve = () => {\n setError(null);\n setReserveForm({\n category: 'PROVED',\n asOfDate: today(),\n recoverable: '',\n recoveryFactor: '',\n unit: asset.capacityUnit,\n methodology: '',\n notes: '',\n });\n setReserveOpen(true);\n };\n\n const closeProduction = () => {\n setProductionOpen(false);\n setError(null);\n setProductionForm({\n periodStart: '',\n periodEnd: '',\n volume: '',\n unit: 'BARRELS',\n grade: '',\n downtimeHours: '',\n notes: '',\n });\n };\n\n const closeReserve = () => {\n setReserveOpen(false);\n setError(null);\n setReserveForm({\n category: 'PROVED',\n asOfDate: '',\n recoverable: '',\n recoveryFactor: '',\n unit: 'BARRELS',\n methodology: '',\n notes: '',\n });\n };\n\n const handleTransition = async (next: TheAssetStatus) => {\n if (!id || next === asset.status) return;\n setError(null);\n try {\n await transitionAsset.mutateAsync({ id, status: next });\n notify.success(`Status changed to ${formatEnumLabel(next)}`);\n } catch (err) {\n notify.fromError(err);\n setError(err instanceof Error ? err.message : 'Failed to change asset status.');\n }\n };\n\n const handleRetire = async () => {\n if (!id) return;\n if (!window.confirm(`Retire ${asset.name}? This marks the asset as decommissioned.`)) return;\n setError(null);\n try {\n await retireAsset.mutateAsync(id);\n notify.success('Asset retired');\n navigateTo('assets');\n } catch (err) {\n notify.fromError(err);\n setError(err instanceof Error ? err.message : 'Failed to retire asset.');\n }\n };\n\n const handleRecordProduction = async () => {\n const periodStart = toBackendDate(productionForm.periodStart);\n const periodEnd = toBackendDate(productionForm.periodEnd);\n if (!id || !periodStart || !periodEnd) {\n setError('Period start and period end are required.');\n return;\n }\n const volume = Number(productionForm.volume);\n if (!productionForm.volume || !Number.isFinite(volume) || volume <= 0) {\n const msg = 'Volume must be greater than zero.';\n setError(msg);\n notify.error(msg);\n return;\n }\n setError(null);\n try {\n await recordProduction.mutateAsync({\n assetId: id,\n periodStart,\n periodEnd,\n volume,\n unit: productionForm.unit,\n grade: productionForm.grade ? Number(productionForm.grade) : null,\n downtimeHours: productionForm.downtimeHours ? Number(productionForm.downtimeHours) : null,\n notes: productionForm.notes.trim() || null,\n });\n notify.success('Production recorded');\n closeProduction();\n } catch (err) {\n notify.fromError(err);\n setError(err instanceof Error ? err.message : 'Failed to record production.');\n }\n };\n\n const handleCreateReserve = async () => {\n const asOfDate = toBackendDate(reserveForm.asOfDate);\n if (!id || !asOfDate) {\n setError('As-of date is required.');\n return;\n }\n const recoverable = Number(reserveForm.recoverable);\n if (!reserveForm.recoverable || !Number.isFinite(recoverable) || recoverable <= 0) {\n const msg = 'Recoverable volume must be greater than zero.';\n setError(msg);\n notify.error(msg);\n return;\n }\n setError(null);\n try {\n await createReserve.mutateAsync({\n assetId: id,\n category: reserveForm.category,\n asOfDate,\n recoverable,\n recoveryFactor: reserveForm.recoveryFactor ? Number(reserveForm.recoveryFactor) : null,\n unit: reserveForm.unit,\n methodology: reserveForm.methodology.trim() || null,\n notes: reserveForm.notes.trim() || null,\n });\n notify.success('Reserve estimate added');\n closeReserve();\n } catch (err) {\n notify.fromError(err);\n setError(err instanceof Error ? err.message : 'Failed to add reserve estimate.');\n }\n };\n\n // ── Columns ─────────────────────────────────────────────────────────────────\n const productionColumns: Column<TheProductionRecord>[] = [\n {\n key: 'period',\n header: 'Period',\n sortValue: (r) => new Date(r.periodEnd || r.createdAt).getTime(),\n render: (r) => (\n <span className=\"font-medium text-text-primary\">\n {formatDate(r.periodStart)} – {formatDate(r.periodEnd)}\n </span>\n ),\n },\n {\n key: 'volume',\n header: 'Volume',\n align: 'right',\n sortValue: (r) => r.volume,\n render: (r) => (\n <span className=\"tabular-nums font-medium text-text-primary\">\n {formatVolume(r.volume, r.unit)}\n </span>\n ),\n },\n {\n key: 'grade',\n header: 'Grade',\n align: 'right',\n hideOnMobile: true,\n render: (r) =>\n r.grade != null ? (\n <span className=\"tabular-nums text-text-secondary\">{formatNumber(r.grade)}</span>\n ) : (\n <span className=\"text-text-tertiary\">—</span>\n ),\n },\n {\n key: 'downtime',\n header: 'Downtime',\n align: 'right',\n hideOnMobile: true,\n sortValue: (r) => r.downtimeHours,\n render: (r) => (\n <span className=\"tabular-nums text-text-secondary\">{formatNumber(r.downtimeHours)} h</span>\n ),\n },\n {\n key: 'notes',\n header: 'Notes',\n hideOnMobile: true,\n render: (r) =>\n r.notes ? (\n <span className=\"block max-w-[16rem] truncate text-text-secondary\">{r.notes}</span>\n ) : (\n <span className=\"text-text-tertiary\">—</span>\n ),\n },\n {\n key: 'recorded',\n header: 'Recorded',\n align: 'right',\n hideOnMobile: true,\n render: (r) => <span className=\"text-text-tertiary\">{formatRelativeTime(r.createdAt)}</span>,\n },\n ];\n\n const reserveColumns: Column<TheReserveEstimate>[] = [\n { key: 'category', header: 'Category', render: (r) => <StatusBadge status={r.category} /> },\n {\n key: 'asOf',\n header: 'As of',\n render: (r) => <span className=\"text-text-secondary\">{formatDate(r.asOfDate)}</span>,\n },\n {\n key: 'recoverable',\n header: 'Recoverable',\n align: 'right',\n sortValue: (r) => r.recoverable,\n render: (r) => (\n <span className=\"tabular-nums font-medium text-text-primary\">\n {formatVolume(r.recoverable, r.unit)}\n </span>\n ),\n },\n {\n key: 'recoveryFactor',\n header: 'Recovery factor',\n align: 'right',\n hideOnMobile: true,\n render: (r) =>\n r.recoveryFactor != null ? (\n <span className=\"tabular-nums text-text-secondary\">\n {formatPercent(r.recoveryFactor)}\n </span>\n ) : (\n <span className=\"text-text-tertiary\">—</span>\n ),\n },\n {\n key: 'methodology',\n header: 'Methodology',\n hideOnMobile: true,\n render: (r) =>\n r.methodology ? (\n <span className=\"block max-w-[14rem] truncate text-text-secondary\">{r.methodology}</span>\n ) : (\n <span className=\"text-text-tertiary\">—</span>\n ),\n },\n {\n key: 'added',\n header: 'Added',\n align: 'right',\n hideOnMobile: true,\n render: (r) => <span className=\"text-text-tertiary\">{formatRelativeTime(r.createdAt)}</span>,\n },\n ];\n\n const emissionColumns: Column<TheEmissionRecord>[] = [\n { key: 'scope', header: 'Scope', render: (e) => <StatusBadge status={e.scope} /> },\n {\n key: 'co2e',\n header: 'CO₂e',\n align: 'right',\n sortValue: (e) => e.co2eTonnes,\n render: (e) => (\n <span className=\"tabular-nums font-medium text-text-primary\">\n {formatTonnesCo2e(e.co2eTonnes)}\n </span>\n ),\n },\n {\n key: 'period',\n header: 'Period',\n hideOnMobile: true,\n render: (e) => (\n <span className=\"text-text-secondary\">\n {formatDate(e.periodStart)} – {formatDate(e.periodEnd)}\n </span>\n ),\n },\n {\n key: 'source',\n header: 'Source',\n hideOnMobile: true,\n render: (e) => <span className=\"text-text-secondary\">{e.source ?? '—'}</span>,\n },\n {\n key: 'verified',\n header: 'Verified',\n render: (e) =>\n e.verified ? (\n <span className=\"text-sm font-medium text-status-success-text\">Verified</span>\n ) : (\n <span className=\"text-sm text-text-tertiary\">Unverified</span>\n ),\n },\n {\n key: 'recorded',\n header: 'Recorded',\n align: 'right',\n hideOnMobile: true,\n render: (e) => <span className=\"text-text-tertiary\">{formatRelativeTime(e.createdAt)}</span>,\n },\n ];\n\n const tabs: TabItem<AssetTab>[] = [\n {\n value: 'production',\n label: 'Production',\n icon: <Activity className=\"h-4 w-4\" />,\n count: productionRows.length,\n },\n {\n value: 'reserves',\n label: 'Reserves',\n icon: <Layers className=\"h-4 w-4\" />,\n count: reserveRows.length,\n },\n {\n value: 'emissions',\n label: 'Emissions',\n icon: <Factory className=\"h-4 w-4\" />,\n count: emissionRows.length,\n },\n { value: 'tags', label: 'Tags', icon: <Tag className=\"h-4 w-4\" /> },\n { value: 'discussion', label: 'Discussion', icon: <MessageSquare className=\"h-4 w-4\" /> },\n ];\n\n return (\n <PageLayout\n title={asset.name}\n description={[asset.code, formatEnumLabel(asset.kind)].filter(Boolean).join(' · ')}\n actions={\n <>\n <StatusBadge status={asset.status} />\n {!isRetired && transitionOptions.length > 0 && (\n <Select\n value={asset.status}\n onValueChange={(v) => handleTransition(v as TheAssetStatus)}\n >\n <SelectTrigger className=\"h-9 w-44\" aria-label=\"Change asset status\">\n <SelectValue placeholder=\"Change status\" />\n </SelectTrigger>\n <SelectContent>\n {/* Current state — shown in the trigger, not itself a transition. */}\n <SelectItem value={asset.status} disabled>\n {formatEnumLabel(asset.status)}\n </SelectItem>\n {transitionOptions.map((s) => (\n <SelectItem key={s} value={s}>\n {formatEnumLabel(s)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n {!isRetired && (\n <Button\n variant=\"ghost\"\n onClick={handleRetire}\n disabled={retireAsset.isPending}\n className=\"text-status-error-text hover:text-status-error-text\"\n >\n <Archive className=\"mr-1.5 h-4 w-4\" /> Retire\n </Button>\n )}\n <Button variant=\"ghost\" onClick={() => navigateTo('assets')}>\n <ArrowLeft className=\"mr-1.5 h-4 w-4\" /> Back\n </Button>\n </>\n }\n >\n {/* Metric strip */}\n <div className=\"grid grid-cols-2 gap-4 sm:grid-cols-3 lg:grid-cols-5\">\n <MetricsCard\n icon={<Gauge className=\"h-5 w-5\" />}\n value={\n asset.capacityPerDay > 0\n ? `${formatVolume(asset.capacityPerDay, asset.capacityUnit)}/day`\n : '—'\n }\n label=\"Capacity\"\n />\n <MetricsCard\n icon={<Percent className=\"h-5 w-5\" />}\n value={formatPercent(asset.workingInterestPct)}\n label=\"Working interest\"\n />\n <MetricsCard\n icon={<Fuel className=\"h-5 w-5\" />}\n value={formatEnumLabel(asset.commodity)}\n label=\"Commodity\"\n />\n <MetricsCard\n icon={<CalendarClock className=\"h-5 w-5\" />}\n value={formatDate(asset.commissionedAt)}\n label=\"Commissioned\"\n />\n <MetricsCard\n icon={<MapPin className=\"h-5 w-5\" />}\n value={formatCoords(asset.latitude, asset.longitude)}\n label=\"Location\"\n footer={\n asset.location ? (\n <p className=\"truncate text-xs text-text-tertiary\">{asset.location}</p>\n ) : undefined\n }\n />\n </div>\n\n {error && <p className=\"mt-4 text-sm text-status-error-text\">{error}</p>}\n\n <div className=\"mt-6\">\n <Tabs items={tabs} value={activeTab} onChange={setActiveTab} />\n </div>\n\n {/* ── Production ──────────────────────────────────────────────────────── */}\n {activeTab === 'production' && (\n <Section\n title=\"Production\"\n description=\"Volumes produced per reporting period, with grade & downtime.\"\n action={\n <Button size=\"sm\" onClick={openProduction}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> Record production\n </Button>\n }\n >\n {productionRows.length === 0 ? (\n <EmptyState\n illustration=\"empty-data\"\n icon={<Activity className=\"h-10 w-10\" />}\n title=\"No production recorded\"\n description=\"Record a production period to start tracking volumes for this asset.\"\n action={\n <Button onClick={openProduction}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> Record production\n </Button>\n }\n />\n ) : (\n <DataTable\n columns={productionColumns}\n rows={productionRows}\n rowKey={(r) => r.id}\n defaultSort={{ key: 'period', dir: 'desc' }}\n />\n )}\n </Section>\n )}\n\n {/* ── Reserves ────────────────────────────────────────────────────────── */}\n {activeTab === 'reserves' && (\n <Section\n title=\"Reserve estimates\"\n description=\"Recoverable volumes by SPE-PRMS reserve category & as-of date.\"\n action={\n <Button size=\"sm\" onClick={openReserve}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> Add reserve estimate\n </Button>\n }\n >\n {reserveRows.length === 0 ? (\n <EmptyState\n illustration=\"empty-data\"\n icon={<Layers className=\"h-10 w-10\" />}\n title=\"No reserve estimates\"\n description=\"Add a reserve estimate to record recoverable volumes for this asset.\"\n action={\n <Button onClick={openReserve}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> Add reserve estimate\n </Button>\n }\n />\n ) : (\n <DataTable columns={reserveColumns} rows={reserveRows} rowKey={(r) => r.id} />\n )}\n </Section>\n )}\n\n {/* ── Emissions ───────────────────────────────────────────────────────── */}\n {activeTab === 'emissions' && (\n <Section\n title=\"Emissions\"\n description=\"GHG emission records attributed to this asset (Scope 1 / 2 / 3).\"\n >\n {emissions.isLoading ? (\n <LoadingView label=\"Loading emissions…\" />\n ) : emissions.isError ? (\n <ErrorView\n message=\"Couldn't load emission records.\"\n onRetry={() => emissions.refetch()}\n />\n ) : emissionRows.length === 0 ? (\n <EmptyState\n illustration=\"empty-data\"\n icon={<Factory className=\"h-10 w-10\" />}\n title=\"No emissions recorded\"\n description=\"Emission records attributed to this asset will appear here.\"\n />\n ) : (\n <DataTable columns={emissionColumns} rows={emissionRows} rowKey={(e) => e.id} />\n )}\n </Section>\n )}\n\n {/* ── Tags ────────────────────────────────────────────────────────────── */}\n {activeTab === 'tags' && (\n <Section title=\"Tags\" description=\"Label this asset for search, grouping & reporting.\">\n <GlassCard treatment=\"glass\" className=\"p-6\">\n <TheTags entityType=\"theglobalfuel-asset\" entityId={asset.id} />\n </GlassCard>\n </Section>\n )}\n\n {/* ── Discussion ──────────────────────────────────────────────────────── */}\n {activeTab === 'discussion' && (\n <div className=\"mt-8\">\n <TheDiscussion\n entityType=\"theglobalfuel-asset\"\n entityId={asset.id}\n title=\"Discussion\"\n description=\"Notes & coordination for this asset.\"\n />\n </div>\n )}\n\n {/* Record production dialog */}\n <ResponsiveDialog\n open={productionOpen}\n onOpenChange={(open) => (open ? setProductionOpen(true) : closeProduction())}\n >\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Record production</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Log a production period for {asset.name}.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n\n <form\n id=\"recordProductionForm\"\n onSubmit={(e) => {\n e.preventDefault();\n handleRecordProduction();\n }}\n className=\"grid gap-4 py-2\"\n >\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"prodStart\">Period start *</Label>\n <Input\n id=\"prodStart\"\n type=\"date\"\n value={productionForm.periodStart}\n onChange={(e) =>\n setProductionForm({ ...productionForm, periodStart: e.target.value })\n }\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"prodEnd\">Period end *</Label>\n <Input\n id=\"prodEnd\"\n type=\"date\"\n value={productionForm.periodEnd}\n onChange={(e) =>\n setProductionForm({ ...productionForm, periodEnd: e.target.value })\n }\n />\n </div>\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"prodVolume\">Volume *</Label>\n <Input\n id=\"prodVolume\"\n type=\"number\"\n min=\"0\"\n step=\"any\"\n value={productionForm.volume}\n onChange={(e) => setProductionForm({ ...productionForm, volume: e.target.value })}\n placeholder=\"118500\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"prodUnit\">Unit</Label>\n <Select\n value={productionForm.unit}\n onValueChange={(v) =>\n setProductionForm({ ...productionForm, unit: v as TheUnit })\n }\n >\n <SelectTrigger id=\"prodUnit\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {UNITS.map((u) => (\n <SelectItem key={u} value={u}>\n {formatEnumLabel(u)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"prodGrade\">Grade</Label>\n <Input\n id=\"prodGrade\"\n type=\"number\"\n step=\"any\"\n value={productionForm.grade}\n onChange={(e) => setProductionForm({ ...productionForm, grade: e.target.value })}\n placeholder=\"Optional (e.g. API / assay)\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"prodDowntime\">Downtime (hours)</Label>\n <Input\n id=\"prodDowntime\"\n type=\"number\"\n min=\"0\"\n step=\"any\"\n value={productionForm.downtimeHours}\n onChange={(e) =>\n setProductionForm({ ...productionForm, downtimeHours: e.target.value })\n }\n placeholder=\"0\"\n />\n </div>\n </div>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"prodNotes\">Notes</Label>\n <Textarea\n id=\"prodNotes\"\n rows={2}\n value={productionForm.notes}\n onChange={(e) => setProductionForm({ ...productionForm, notes: e.target.value })}\n placeholder=\"Optional context about this period.\"\n />\n </div>\n\n {error && productionOpen && <p className=\"text-sm text-status-error-text\">{error}</p>}\n </form>\n\n <ResponsiveDialogFooter>\n <Button variant=\"outline\" type=\"button\" onClick={closeProduction}>\n Cancel\n </Button>\n <Button type=\"submit\" form=\"recordProductionForm\" disabled={recordProduction.isPending}>\n {recordProduction.isPending ? 'Recording…' : 'Record production'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n\n {/* Add reserve estimate dialog */}\n <ResponsiveDialog\n open={reserveOpen}\n onOpenChange={(open) => (open ? setReserveOpen(true) : closeReserve())}\n >\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Add reserve estimate</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Record a recoverable-volume estimate for {asset.name}.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n\n <form\n id=\"reserveEstimateForm\"\n onSubmit={(e) => {\n e.preventDefault();\n handleCreateReserve();\n }}\n className=\"grid gap-4 py-2\"\n >\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"resCategory\">Category</Label>\n <Select\n value={reserveForm.category}\n onValueChange={(v) =>\n setReserveForm({ ...reserveForm, category: v as TheReserveCategory })\n }\n >\n <SelectTrigger id=\"resCategory\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {RESERVE_CATEGORIES.map((c) => (\n <SelectItem key={c} value={c}>\n {formatEnumLabel(c)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"resAsOf\">As-of date *</Label>\n <Input\n id=\"resAsOf\"\n type=\"date\"\n value={reserveForm.asOfDate}\n onChange={(e) => setReserveForm({ ...reserveForm, asOfDate: e.target.value })}\n />\n </div>\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-3\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"resRecoverable\">Recoverable *</Label>\n <Input\n id=\"resRecoverable\"\n type=\"number\"\n min=\"0\"\n step=\"any\"\n value={reserveForm.recoverable}\n onChange={(e) => setReserveForm({ ...reserveForm, recoverable: e.target.value })}\n placeholder=\"2400000\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"resUnit\">Unit</Label>\n <Select\n value={reserveForm.unit}\n onValueChange={(v) => setReserveForm({ ...reserveForm, unit: v as TheUnit })}\n >\n <SelectTrigger id=\"resUnit\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {UNITS.map((u) => (\n <SelectItem key={u} value={u}>\n {formatEnumLabel(u)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"resFactor\">Recovery factor (%)</Label>\n <Input\n id=\"resFactor\"\n type=\"number\"\n min=\"0\"\n max=\"100\"\n step=\"any\"\n value={reserveForm.recoveryFactor}\n onChange={(e) =>\n setReserveForm({ ...reserveForm, recoveryFactor: e.target.value })\n }\n placeholder=\"35\"\n />\n </div>\n </div>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"resMethodology\">Methodology</Label>\n <Input\n id=\"resMethodology\"\n value={reserveForm.methodology}\n onChange={(e) => setReserveForm({ ...reserveForm, methodology: e.target.value })}\n placeholder=\"Volumetric / material balance / decline curve\"\n />\n </div>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"resNotes\">Notes</Label>\n <Textarea\n id=\"resNotes\"\n rows={2}\n value={reserveForm.notes}\n onChange={(e) => setReserveForm({ ...reserveForm, notes: e.target.value })}\n placeholder=\"Optional context about this estimate.\"\n />\n </div>\n\n {error && reserveOpen && <p className=\"text-sm text-status-error-text\">{error}</p>}\n </form>\n\n <ResponsiveDialogFooter>\n <Button variant=\"outline\" type=\"button\" onClick={closeReserve}>\n Cancel\n </Button>\n <Button type=\"submit\" form=\"reserveEstimateForm\" disabled={createReserve.isPending}>\n {createReserve.isPending ? 'Adding…' : 'Add estimate'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
@@ -8,13 +8,14 @@ import { EmptyState as ae } from "../../components/EmptyState.js";
8
8
  import "../../context/index.js";
9
9
  import { useTheAssets as oe, useTheCreateAsset as a } from "../../hooks/useTheGlobalFuelApi.js";
10
10
  import { useCursorPager as o } from "../../hooks/useCursorPager.js";
11
+ import { useNotify as s } from "../../hooks/useNotify.js";
11
12
  import "../../hooks/index.js";
12
- import { FilterTabs as s } from "../../components/FilterTabs.js";
13
- import { Pagination as c } from "../../components/Pagination.js";
13
+ import { FilterTabs as c } from "../../components/FilterTabs.js";
14
+ import { Pagination as l } from "../../components/Pagination.js";
14
15
  import "../../components/index.js";
15
- import { useMemo as l, useState as u } from "react";
16
- import { Fuel as d, MapPin as f, Plus as p } from "lucide-react";
17
- import { Fragment as se, jsx as m, jsxs as h } from "react/jsx-runtime";
16
+ import { useMemo as u, useState as d } from "react";
17
+ import { Fuel as f, MapPin as se, Plus as p } from "lucide-react";
18
+ import { Fragment as ce, jsx as m, jsxs as h } from "react/jsx-runtime";
18
19
  import { Button as g, Input as _, Label as v, ResponsiveDialog as y, ResponsiveDialogContent as b, ResponsiveDialogDescription as x, ResponsiveDialogFooter as S, ResponsiveDialogHeader as C, ResponsiveDialogTitle as w, Select as T, SelectContent as E, SelectItem as D, SelectTrigger as O, SelectValue as k } from "@burdenoff/fe-libs/ui";
19
20
  //#region src/theglobalfuel/pages/assets/AssetsPage.tsx
20
21
  var A = [
@@ -99,15 +100,15 @@ var A = [
99
100
  workingInterestPct: ""
100
101
  };
101
102
  function I() {
102
- let { navigateTo: I } = e(), [L, R] = u("ALL"), [z, B] = u("ALL"), [V, H] = u("ALL"), U = o(), [W, G] = u(!1), [K, q] = u(F), [J, Y] = u(null), { data: X, isLoading: ce, isError: le, refetch: ue } = oe({
103
- status: L === "ALL" ? void 0 : L,
104
- commodity: z === "ALL" ? void 0 : z,
105
- kind: V === "ALL" ? void 0 : V,
103
+ let { navigateTo: I } = e(), L = s(), [R, z] = d("ALL"), [B, V] = d("ALL"), [H, le] = d("ALL"), U = o(), [W, G] = d(!1), [K, q] = d(F), [J, Y] = d(null), { data: X, isLoading: ue, isError: de, refetch: fe } = oe({
104
+ status: R === "ALL" ? void 0 : R,
105
+ commodity: B === "ALL" ? void 0 : B,
106
+ kind: H === "ALL" ? void 0 : H,
106
107
  pagination: {
107
108
  limit: P,
108
109
  cursor: U.cursor
109
110
  }
110
- }), Z = a(), Q = l(() => X?.items ?? [], [X]), de = L !== "ALL" || z !== "ALL" || V !== "ALL", fe = [
111
+ }), Z = a(), Q = u(() => X?.items ?? [], [X]), pe = R !== "ALL" || B !== "ALL" || H !== "ALL", me = [
111
112
  {
112
113
  key: "name",
113
114
  header: "Asset",
@@ -115,7 +116,7 @@ function I() {
115
116
  className: "flex items-center gap-3",
116
117
  children: [/* @__PURE__ */ m("span", {
117
118
  className: "grid size-9 shrink-0 place-items-center rounded-lg bg-bg-sunken text-text-secondary",
118
- children: /* @__PURE__ */ m(d, { className: "h-4 w-4" })
119
+ children: /* @__PURE__ */ m(f, { className: "h-4 w-4" })
119
120
  }), /* @__PURE__ */ h("div", {
120
121
  className: "min-w-0",
121
122
  children: [/* @__PURE__ */ m("p", {
@@ -182,7 +183,7 @@ function I() {
182
183
  hideOnMobile: !0,
183
184
  render: (e) => e.location ? /* @__PURE__ */ h("span", {
184
185
  className: "inline-flex items-center gap-1.5 text-text-secondary",
185
- children: [/* @__PURE__ */ m(f, { className: "h-3.5 w-3.5 shrink-0 text-text-tertiary" }), e.location]
186
+ children: [/* @__PURE__ */ m(se, { className: "h-3.5 w-3.5 shrink-0 text-text-tertiary" }), e.location]
186
187
  }) : /* @__PURE__ */ m("span", {
187
188
  className: "text-text-tertiary",
188
189
  children: "—"
@@ -200,6 +201,30 @@ function I() {
200
201
  }
201
202
  ], $ = () => {
202
203
  q(F), Y(null);
204
+ }, he = async () => {
205
+ if (!K.name.trim()) {
206
+ Y("Asset name is required.");
207
+ return;
208
+ }
209
+ Y(null);
210
+ try {
211
+ let e = await Z.mutateAsync({
212
+ name: K.name.trim(),
213
+ code: K.code.trim() || null,
214
+ commodity: K.commodity,
215
+ kind: K.kind,
216
+ status: K.status,
217
+ location: K.location.trim() || null,
218
+ latitude: K.latitude ? Number(K.latitude) : null,
219
+ longitude: K.longitude ? Number(K.longitude) : null,
220
+ capacityPerDay: K.capacityPerDay ? Number(K.capacityPerDay) : null,
221
+ capacityUnit: K.capacityUnit,
222
+ workingInterestPct: K.workingInterestPct ? Number(K.workingInterestPct) : null
223
+ });
224
+ L.success("Asset created"), G(!1), $(), I(`assets/${e.id}`);
225
+ } catch (e) {
226
+ L.fromError(e), Y(e instanceof Error ? e.message : "Failed to create asset.");
227
+ }
203
228
  };
204
229
  return /* @__PURE__ */ h(t, {
205
230
  title: "Assets",
@@ -212,20 +237,21 @@ function I() {
212
237
  /* @__PURE__ */ h("div", {
213
238
  className: "mb-5 flex flex-wrap items-center gap-3",
214
239
  children: [
215
- /* @__PURE__ */ m(s, {
240
+ /* @__PURE__ */ m(c, {
216
241
  options: A,
217
- value: L,
242
+ value: R,
218
243
  onChange: (e) => {
219
- R(e), U.reset();
244
+ z(e), U.reset();
220
245
  }
221
246
  }),
222
247
  /* @__PURE__ */ h(T, {
223
- value: z,
248
+ value: B,
224
249
  onValueChange: (e) => {
225
- B(e), U.reset();
250
+ V(e), U.reset();
226
251
  },
227
252
  children: [/* @__PURE__ */ m(O, {
228
253
  className: "w-48",
254
+ "aria-label": "Filter by commodity",
229
255
  children: /* @__PURE__ */ m(k, { placeholder: "All commodities" })
230
256
  }), /* @__PURE__ */ h(E, { children: [/* @__PURE__ */ m(D, {
231
257
  value: "ALL",
@@ -236,12 +262,13 @@ function I() {
236
262
  }, e))] })]
237
263
  }),
238
264
  /* @__PURE__ */ h(T, {
239
- value: V,
265
+ value: H,
240
266
  onValueChange: (e) => {
241
- H(e), U.reset();
267
+ le(e), U.reset();
242
268
  },
243
269
  children: [/* @__PURE__ */ m(O, {
244
270
  className: "w-48",
271
+ "aria-label": "Filter by kind",
245
272
  children: /* @__PURE__ */ m(k, { placeholder: "All kinds" })
246
273
  }), /* @__PURE__ */ h(E, { children: [/* @__PURE__ */ m(D, {
247
274
  value: "ALL",
@@ -253,24 +280,25 @@ function I() {
253
280
  })
254
281
  ]
255
282
  }),
256
- ce ? /* @__PURE__ */ m(i, { label: "Loading assets…" }) : le ? /* @__PURE__ */ m(ie, {
283
+ ue ? /* @__PURE__ */ m(i, { label: "Loading assets…" }) : de ? /* @__PURE__ */ m(ie, {
257
284
  message: "Couldn't load assets.",
258
- onRetry: () => ue()
285
+ onRetry: () => fe()
259
286
  }) : Q.length === 0 ? /* @__PURE__ */ m(ae, {
260
287
  illustration: "empty-data",
261
- icon: /* @__PURE__ */ m(d, { className: "h-10 w-10" }),
288
+ icon: /* @__PURE__ */ m(f, { className: "h-10 w-10" }),
262
289
  title: "No assets yet",
263
- description: de ? "No assets match these filters." : "Register your first resource asset to start tracking production, reserves & emissions.",
290
+ description: pe ? "No assets match these filters." : "Register your first resource asset to start tracking production, reserves & emissions.",
264
291
  action: /* @__PURE__ */ h(g, {
265
292
  onClick: () => G(!0),
266
293
  children: [/* @__PURE__ */ m(p, { className: "mr-1.5 h-4 w-4" }), " New asset"]
267
294
  })
268
- }) : /* @__PURE__ */ h(se, { children: [/* @__PURE__ */ m(re, {
269
- columns: fe,
295
+ }) : /* @__PURE__ */ h(ce, { children: [/* @__PURE__ */ m(re, {
296
+ columns: me,
270
297
  rows: Q,
271
298
  rowKey: (e) => e.id,
272
- onRowClick: (e) => I(`assets/${e.id}`)
273
- }), /* @__PURE__ */ m(c, {
299
+ onRowClick: (e) => I(`assets/${e.id}`),
300
+ rowLabel: (e) => `Open ${e.name}`
301
+ }), /* @__PURE__ */ m(l, {
274
302
  page: U.page,
275
303
  pageSize: P,
276
304
  itemCount: Q.length,
@@ -284,7 +312,11 @@ function I() {
284
312
  },
285
313
  children: /* @__PURE__ */ h(b, { children: [
286
314
  /* @__PURE__ */ h(C, { children: [/* @__PURE__ */ m(w, { children: "New asset" }), /* @__PURE__ */ m(x, { children: "Register a resource asset — a field, well, mine, plant, terminal or pipeline." })] }),
287
- /* @__PURE__ */ h("div", {
315
+ /* @__PURE__ */ h("form", {
316
+ id: "createAssetForm",
317
+ onSubmit: (e) => {
318
+ e.preventDefault(), he();
319
+ },
288
320
  className: "grid gap-4 py-2",
289
321
  children: [
290
322
  /* @__PURE__ */ h("div", {
@@ -505,34 +537,14 @@ function I() {
505
537
  }),
506
538
  /* @__PURE__ */ h(S, { children: [/* @__PURE__ */ m(g, {
507
539
  variant: "outline",
508
- onClick: () => G(!1),
540
+ type: "button",
541
+ onClick: () => {
542
+ G(!1), $();
543
+ },
509
544
  children: "Cancel"
510
545
  }), /* @__PURE__ */ m(g, {
511
- onClick: async () => {
512
- if (!K.name.trim()) {
513
- Y("Asset name is required.");
514
- return;
515
- }
516
- Y(null);
517
- try {
518
- let e = await Z.mutateAsync({
519
- name: K.name.trim(),
520
- code: K.code.trim() || null,
521
- commodity: K.commodity,
522
- kind: K.kind,
523
- status: K.status,
524
- location: K.location.trim() || null,
525
- latitude: K.latitude ? Number(K.latitude) : null,
526
- longitude: K.longitude ? Number(K.longitude) : null,
527
- capacityPerDay: K.capacityPerDay ? Number(K.capacityPerDay) : null,
528
- capacityUnit: K.capacityUnit,
529
- workingInterestPct: K.workingInterestPct ? Number(K.workingInterestPct) : null
530
- });
531
- G(!1), $(), I(`assets/${e.id}`);
532
- } catch (e) {
533
- Y(e instanceof Error ? e.message : "Failed to create asset.");
534
- }
535
- },
546
+ type: "submit",
547
+ form: "createAssetForm",
536
548
  disabled: Z.isPending,
537
549
  children: Z.isPending ? "Creating…" : "Create asset"
538
550
  })] })
@@ -1 +1 @@
1
- {"version":3,"file":"AssetsPage.js","names":[],"sources":["../../../../src/theglobalfuel/pages/assets/AssetsPage.tsx"],"sourcesContent":["/**\n * Assets — the resource registry: list, filter & register energy/mineral assets.\n * @module theglobalfuel/pages/assets\n *\n * Reads `theListAssets` (cursor-paginated) with status / commodity / kind\n * filters; writes `theCreateAsset`. Rows drill into `assets/:id`. No mock data —\n * every field comes from the `wspace-theglobalfuel-svc` GraphQL contract.\n */\n\nimport { useMemo, useState } from 'react';\nimport { Plus, Fuel, MapPin } from 'lucide-react';\nimport {\n Button,\n Input,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n} from '@burdenoff/fe-libs/ui';\nimport {\n PageLayout,\n StatusBadge,\n DataTable,\n type Column,\n FilterTabs,\n type FilterOption,\n LoadingView,\n ErrorView,\n EmptyState,\n Pagination,\n} from '../../components';\nimport { useTheGlobalFuel } from '../../context';\nimport { useTheAssets, useTheCreateAsset, useCursorPager } from '../../hooks';\nimport { formatEnumLabel, formatVolume, formatPercent, formatRelativeTime } from '../../utils';\nimport type {\n TheAsset,\n TheAssetKind,\n TheAssetStatus,\n TheCommodityType,\n TheUnit,\n} from '../../types';\n\nconst STATUS_FILTERS: FilterOption<TheAssetStatus | 'ALL'>[] = [\n { value: 'ALL', label: 'All' },\n { value: 'EXPLORATION', label: 'Exploration' },\n { value: 'APPRAISAL', label: 'Appraisal' },\n { value: 'DEVELOPMENT', label: 'Development' },\n { value: 'PRODUCING', label: 'Producing' },\n { value: 'SUSPENDED', label: 'Suspended' },\n { value: 'DECOMMISSIONING', label: 'Decommissioning' },\n { value: 'RETIRED', label: 'Retired' },\n];\n\nconst ASSET_KINDS: TheAssetKind[] = [\n 'OIL_FIELD',\n 'GAS_FIELD',\n 'WELL',\n 'MINE',\n 'QUARRY',\n 'REFINERY',\n 'PROCESSING_PLANT',\n 'POWER_PLANT',\n 'SOLAR_FARM',\n 'WIND_FARM',\n 'STORAGE_TERMINAL',\n 'PIPELINE',\n];\n\nconst COMMODITIES: TheCommodityType[] = [\n 'CRUDE_OIL',\n 'NATURAL_GAS',\n 'LNG',\n 'COAL',\n 'ELECTRICITY',\n 'HYDROGEN',\n 'BIOFUEL',\n 'IRON_ORE',\n 'COPPER',\n 'BAUXITE',\n 'GOLD',\n 'LITHIUM',\n 'RARE_EARTH',\n];\n\nconst UNITS: TheUnit[] = ['BARRELS', 'CUBIC_METERS', 'TONNES', 'KILOGRAMS', 'MWH', 'GJ', 'MCF'];\n\nconst PAGE_SIZE = 25;\n\ninterface CreateFormState {\n name: string;\n code: string;\n commodity: TheCommodityType;\n kind: TheAssetKind;\n status: TheAssetStatus;\n location: string;\n latitude: string;\n longitude: string;\n capacityPerDay: string;\n capacityUnit: TheUnit;\n workingInterestPct: string;\n}\n\nconst EMPTY_FORM: CreateFormState = {\n name: '',\n code: '',\n commodity: 'CRUDE_OIL',\n kind: 'OIL_FIELD',\n status: 'EXPLORATION',\n location: '',\n latitude: '',\n longitude: '',\n capacityPerDay: '',\n capacityUnit: 'BARRELS',\n workingInterestPct: '',\n};\n\nexport function AssetsPage() {\n const { navigateTo } = useTheGlobalFuel();\n const [status, setStatus] = useState<TheAssetStatus | 'ALL'>('ALL');\n const [commodity, setCommodity] = useState<TheCommodityType | 'ALL'>('ALL');\n const [kind, setKind] = useState<TheAssetKind | 'ALL'>('ALL');\n const pager = useCursorPager();\n const [dialogOpen, setDialogOpen] = useState(false);\n const [form, setForm] = useState<CreateFormState>(EMPTY_FORM);\n const [formError, setFormError] = useState<string | null>(null);\n\n const { data, isLoading, isError, refetch } = useTheAssets({\n status: status === 'ALL' ? undefined : status,\n commodity: commodity === 'ALL' ? undefined : commodity,\n kind: kind === 'ALL' ? undefined : kind,\n pagination: { limit: PAGE_SIZE, cursor: pager.cursor },\n });\n const createAsset = useTheCreateAsset();\n\n const rows = useMemo(() => data?.items ?? [], [data]);\n const filtersActive = status !== 'ALL' || commodity !== 'ALL' || kind !== 'ALL';\n\n const columns: Column<TheAsset>[] = [\n {\n key: 'name',\n header: 'Asset',\n render: (a) => (\n <div className=\"flex items-center gap-3\">\n <span className=\"grid size-9 shrink-0 place-items-center rounded-lg bg-bg-sunken text-text-secondary\">\n <Fuel className=\"h-4 w-4\" />\n </span>\n <div className=\"min-w-0\">\n <p className=\"truncate font-semibold text-text-primary\">{a.name}</p>\n {a.code && <p className=\"truncate text-xs text-text-tertiary\">{a.code}</p>}\n </div>\n </div>\n ),\n },\n {\n key: 'kind',\n header: 'Kind',\n hideOnMobile: true,\n render: (a) => <span className=\"text-text-secondary\">{formatEnumLabel(a.kind)}</span>,\n },\n {\n key: 'commodity',\n header: 'Commodity',\n hideOnMobile: true,\n render: (a) => <span className=\"text-text-secondary\">{formatEnumLabel(a.commodity)}</span>,\n },\n { key: 'status', header: 'Status', render: (a) => <StatusBadge status={a.status} /> },\n {\n key: 'capacity',\n header: 'Capacity',\n align: 'right',\n hideOnMobile: true,\n sortValue: (a) => a.capacityPerDay,\n render: (a) =>\n a.capacityPerDay > 0 ? (\n <span className=\"tabular-nums text-text-secondary\">\n {formatVolume(a.capacityPerDay, a.capacityUnit)}/day\n </span>\n ) : (\n <span className=\"text-text-tertiary\">—</span>\n ),\n },\n {\n key: 'workingInterest',\n header: 'Working interest',\n align: 'right',\n hideOnMobile: true,\n sortValue: (a) => a.workingInterestPct,\n render: (a) => (\n <span className=\"tabular-nums text-text-secondary\">\n {formatPercent(a.workingInterestPct)}\n </span>\n ),\n },\n {\n key: 'location',\n header: 'Location',\n hideOnMobile: true,\n render: (a) =>\n a.location ? (\n <span className=\"inline-flex items-center gap-1.5 text-text-secondary\">\n <MapPin className=\"h-3.5 w-3.5 shrink-0 text-text-tertiary\" />\n {a.location}\n </span>\n ) : (\n <span className=\"text-text-tertiary\">—</span>\n ),\n },\n {\n key: 'updated',\n header: 'Updated',\n align: 'right',\n hideOnMobile: true,\n render: (a) => <span className=\"text-text-tertiary\">{formatRelativeTime(a.updatedAt)}</span>,\n },\n ];\n\n const resetForm = () => {\n setForm(EMPTY_FORM);\n setFormError(null);\n };\n\n const handleCreate = async () => {\n if (!form.name.trim()) {\n setFormError('Asset name is required.');\n return;\n }\n setFormError(null);\n try {\n const created = await createAsset.mutateAsync({\n name: form.name.trim(),\n code: form.code.trim() || null,\n commodity: form.commodity,\n kind: form.kind,\n status: form.status,\n location: form.location.trim() || null,\n latitude: form.latitude ? Number(form.latitude) : null,\n longitude: form.longitude ? Number(form.longitude) : null,\n capacityPerDay: form.capacityPerDay ? Number(form.capacityPerDay) : null,\n capacityUnit: form.capacityUnit,\n workingInterestPct: form.workingInterestPct ? Number(form.workingInterestPct) : null,\n });\n setDialogOpen(false);\n resetForm();\n navigateTo(`assets/${created.id}`);\n } catch (err) {\n setFormError(err instanceof Error ? err.message : 'Failed to create asset.');\n }\n };\n\n return (\n <PageLayout\n title=\"Assets\"\n description=\"Resource registry — fields, wells, mines, plants, terminals & pipelines across every commodity.\"\n actions={\n <Button onClick={() => setDialogOpen(true)}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> New asset\n </Button>\n }\n >\n <div className=\"mb-5 flex flex-wrap items-center gap-3\">\n <FilterTabs\n options={STATUS_FILTERS}\n value={status}\n onChange={(v) => {\n setStatus(v);\n pager.reset();\n }}\n />\n <Select\n value={commodity}\n onValueChange={(v) => {\n setCommodity(v as TheCommodityType | 'ALL');\n pager.reset();\n }}\n >\n <SelectTrigger className=\"w-48\">\n <SelectValue placeholder=\"All commodities\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"ALL\">All commodities</SelectItem>\n {COMMODITIES.map((c) => (\n <SelectItem key={c} value={c}>\n {formatEnumLabel(c)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Select\n value={kind}\n onValueChange={(v) => {\n setKind(v as TheAssetKind | 'ALL');\n pager.reset();\n }}\n >\n <SelectTrigger className=\"w-48\">\n <SelectValue placeholder=\"All kinds\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"ALL\">All kinds</SelectItem>\n {ASSET_KINDS.map((k) => (\n <SelectItem key={k} value={k}>\n {formatEnumLabel(k)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {isLoading ? (\n <LoadingView label=\"Loading assets…\" />\n ) : isError ? (\n <ErrorView message=\"Couldn't load assets.\" onRetry={() => refetch()} />\n ) : rows.length === 0 ? (\n <EmptyState\n illustration=\"empty-data\"\n icon={<Fuel className=\"h-10 w-10\" />}\n title=\"No assets yet\"\n description={\n filtersActive\n ? 'No assets match these filters.'\n : 'Register your first resource asset to start tracking production, reserves & emissions.'\n }\n action={\n <Button onClick={() => setDialogOpen(true)}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> New asset\n </Button>\n }\n />\n ) : (\n <>\n <DataTable\n columns={columns}\n rows={rows}\n rowKey={(a) => a.id}\n onRowClick={(a) => navigateTo(`assets/${a.id}`)}\n />\n <Pagination\n page={pager.page}\n pageSize={PAGE_SIZE}\n itemCount={rows.length}\n hasMore={data?.pageInfo?.hasMore ?? false}\n onPageChange={(target) => pager.onPageChange(target, data?.pageInfo?.cursor)}\n />\n </>\n )}\n\n {/* New asset dialog */}\n <ResponsiveDialog\n open={dialogOpen}\n onOpenChange={(open) => {\n setDialogOpen(open);\n if (!open) resetForm();\n }}\n >\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>New asset</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Register a resource asset — a field, well, mine, plant, terminal or pipeline.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n\n <div className=\"grid gap-4 py-2\">\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"assetName\">Name *</Label>\n <Input\n id=\"assetName\"\n value={form.name}\n onChange={(e) => setForm({ ...form, name: e.target.value })}\n placeholder=\"Rumaila North Field\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"assetCode\">Code</Label>\n <Input\n id=\"assetCode\"\n value={form.code}\n onChange={(e) => setForm({ ...form, code: e.target.value })}\n placeholder=\"AST-RMB-N\"\n />\n </div>\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-3\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"assetCommodity\">Commodity *</Label>\n <Select\n value={form.commodity}\n onValueChange={(v) => setForm({ ...form, commodity: v as TheCommodityType })}\n >\n <SelectTrigger id=\"assetCommodity\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {COMMODITIES.map((c) => (\n <SelectItem key={c} value={c}>\n {formatEnumLabel(c)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"assetKind\">Kind</Label>\n <Select\n value={form.kind}\n onValueChange={(v) => setForm({ ...form, kind: v as TheAssetKind })}\n >\n <SelectTrigger id=\"assetKind\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {ASSET_KINDS.map((k) => (\n <SelectItem key={k} value={k}>\n {formatEnumLabel(k)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"assetStatus\">Status</Label>\n <Select\n value={form.status}\n onValueChange={(v) => setForm({ ...form, status: v as TheAssetStatus })}\n >\n <SelectTrigger id=\"assetStatus\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {STATUS_FILTERS.filter((o) => o.value !== 'ALL').map((o) => (\n <SelectItem key={o.value} value={o.value}>\n {o.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"assetLocation\">Location</Label>\n <Input\n id=\"assetLocation\"\n value={form.location}\n onChange={(e) => setForm({ ...form, location: e.target.value })}\n placeholder=\"Basra, Iraq\"\n />\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"assetLat\">Latitude</Label>\n <Input\n id=\"assetLat\"\n type=\"number\"\n step=\"any\"\n value={form.latitude}\n onChange={(e) => setForm({ ...form, latitude: e.target.value })}\n placeholder=\"30.5085\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"assetLng\">Longitude</Label>\n <Input\n id=\"assetLng\"\n type=\"number\"\n step=\"any\"\n value={form.longitude}\n onChange={(e) => setForm({ ...form, longitude: e.target.value })}\n placeholder=\"47.7804\"\n />\n </div>\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-3\">\n <div className=\"grid gap-1.5 sm:col-span-1\">\n <Label htmlFor=\"assetCapacity\">Capacity / day</Label>\n <Input\n id=\"assetCapacity\"\n type=\"number\"\n min=\"0\"\n step=\"any\"\n value={form.capacityPerDay}\n onChange={(e) => setForm({ ...form, capacityPerDay: e.target.value })}\n placeholder=\"120000\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"assetUnit\">Capacity unit</Label>\n <Select\n value={form.capacityUnit}\n onValueChange={(v) => setForm({ ...form, capacityUnit: v as TheUnit })}\n >\n <SelectTrigger id=\"assetUnit\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {UNITS.map((u) => (\n <SelectItem key={u} value={u}>\n {formatEnumLabel(u)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"assetWi\">Working interest (%)</Label>\n <Input\n id=\"assetWi\"\n type=\"number\"\n min=\"0\"\n max=\"100\"\n step=\"any\"\n value={form.workingInterestPct}\n onChange={(e) => setForm({ ...form, workingInterestPct: e.target.value })}\n placeholder=\"47.5\"\n />\n </div>\n </div>\n\n {formError && <p className=\"text-sm text-status-error-text\">{formError}</p>}\n </div>\n\n <ResponsiveDialogFooter>\n <Button variant=\"outline\" onClick={() => setDialogOpen(false)}>\n Cancel\n </Button>\n <Button onClick={handleCreate} disabled={createAsset.isPending}>\n {createAsset.isPending ? 'Creating…' : 'Create asset'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"AssetsPage.js","names":[],"sources":["../../../../src/theglobalfuel/pages/assets/AssetsPage.tsx"],"sourcesContent":["/**\n * Assets — the resource registry: list, filter & register energy/mineral assets.\n * @module theglobalfuel/pages/assets\n *\n * Reads `theListAssets` (cursor-paginated) with status / commodity / kind\n * filters; writes `theCreateAsset`. Rows drill into `assets/:id`. No mock data —\n * every field comes from the `wspace-theglobalfuel-svc` GraphQL contract.\n */\n\nimport { useMemo, useState } from 'react';\nimport { Plus, Fuel, MapPin } from 'lucide-react';\nimport {\n Button,\n Input,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n} from '@burdenoff/fe-libs/ui';\nimport {\n PageLayout,\n StatusBadge,\n DataTable,\n type Column,\n FilterTabs,\n type FilterOption,\n LoadingView,\n ErrorView,\n EmptyState,\n Pagination,\n} from '../../components';\nimport { useTheGlobalFuel } from '../../context';\nimport { useTheAssets, useTheCreateAsset, useCursorPager, useNotify } from '../../hooks';\nimport { formatEnumLabel, formatVolume, formatPercent, formatRelativeTime } from '../../utils';\nimport type {\n TheAsset,\n TheAssetKind,\n TheAssetStatus,\n TheCommodityType,\n TheUnit,\n} from '../../types';\n\nconst STATUS_FILTERS: FilterOption<TheAssetStatus | 'ALL'>[] = [\n { value: 'ALL', label: 'All' },\n { value: 'EXPLORATION', label: 'Exploration' },\n { value: 'APPRAISAL', label: 'Appraisal' },\n { value: 'DEVELOPMENT', label: 'Development' },\n { value: 'PRODUCING', label: 'Producing' },\n { value: 'SUSPENDED', label: 'Suspended' },\n { value: 'DECOMMISSIONING', label: 'Decommissioning' },\n { value: 'RETIRED', label: 'Retired' },\n];\n\nconst ASSET_KINDS: TheAssetKind[] = [\n 'OIL_FIELD',\n 'GAS_FIELD',\n 'WELL',\n 'MINE',\n 'QUARRY',\n 'REFINERY',\n 'PROCESSING_PLANT',\n 'POWER_PLANT',\n 'SOLAR_FARM',\n 'WIND_FARM',\n 'STORAGE_TERMINAL',\n 'PIPELINE',\n];\n\nconst COMMODITIES: TheCommodityType[] = [\n 'CRUDE_OIL',\n 'NATURAL_GAS',\n 'LNG',\n 'COAL',\n 'ELECTRICITY',\n 'HYDROGEN',\n 'BIOFUEL',\n 'IRON_ORE',\n 'COPPER',\n 'BAUXITE',\n 'GOLD',\n 'LITHIUM',\n 'RARE_EARTH',\n];\n\nconst UNITS: TheUnit[] = ['BARRELS', 'CUBIC_METERS', 'TONNES', 'KILOGRAMS', 'MWH', 'GJ', 'MCF'];\n\nconst PAGE_SIZE = 25;\n\ninterface CreateFormState {\n name: string;\n code: string;\n commodity: TheCommodityType;\n kind: TheAssetKind;\n status: TheAssetStatus;\n location: string;\n latitude: string;\n longitude: string;\n capacityPerDay: string;\n capacityUnit: TheUnit;\n workingInterestPct: string;\n}\n\nconst EMPTY_FORM: CreateFormState = {\n name: '',\n code: '',\n commodity: 'CRUDE_OIL',\n kind: 'OIL_FIELD',\n status: 'EXPLORATION',\n location: '',\n latitude: '',\n longitude: '',\n capacityPerDay: '',\n capacityUnit: 'BARRELS',\n workingInterestPct: '',\n};\n\nexport function AssetsPage() {\n const { navigateTo } = useTheGlobalFuel();\n const notify = useNotify();\n const [status, setStatus] = useState<TheAssetStatus | 'ALL'>('ALL');\n const [commodity, setCommodity] = useState<TheCommodityType | 'ALL'>('ALL');\n const [kind, setKind] = useState<TheAssetKind | 'ALL'>('ALL');\n const pager = useCursorPager();\n const [dialogOpen, setDialogOpen] = useState(false);\n const [form, setForm] = useState<CreateFormState>(EMPTY_FORM);\n const [formError, setFormError] = useState<string | null>(null);\n\n const { data, isLoading, isError, refetch } = useTheAssets({\n status: status === 'ALL' ? undefined : status,\n commodity: commodity === 'ALL' ? undefined : commodity,\n kind: kind === 'ALL' ? undefined : kind,\n pagination: { limit: PAGE_SIZE, cursor: pager.cursor },\n });\n const createAsset = useTheCreateAsset();\n\n const rows = useMemo(() => data?.items ?? [], [data]);\n const filtersActive = status !== 'ALL' || commodity !== 'ALL' || kind !== 'ALL';\n\n const columns: Column<TheAsset>[] = [\n {\n key: 'name',\n header: 'Asset',\n render: (a) => (\n <div className=\"flex items-center gap-3\">\n <span className=\"grid size-9 shrink-0 place-items-center rounded-lg bg-bg-sunken text-text-secondary\">\n <Fuel className=\"h-4 w-4\" />\n </span>\n <div className=\"min-w-0\">\n <p className=\"truncate font-semibold text-text-primary\">{a.name}</p>\n {a.code && <p className=\"truncate text-xs text-text-tertiary\">{a.code}</p>}\n </div>\n </div>\n ),\n },\n {\n key: 'kind',\n header: 'Kind',\n hideOnMobile: true,\n render: (a) => <span className=\"text-text-secondary\">{formatEnumLabel(a.kind)}</span>,\n },\n {\n key: 'commodity',\n header: 'Commodity',\n hideOnMobile: true,\n render: (a) => <span className=\"text-text-secondary\">{formatEnumLabel(a.commodity)}</span>,\n },\n { key: 'status', header: 'Status', render: (a) => <StatusBadge status={a.status} /> },\n {\n key: 'capacity',\n header: 'Capacity',\n align: 'right',\n hideOnMobile: true,\n sortValue: (a) => a.capacityPerDay,\n render: (a) =>\n a.capacityPerDay > 0 ? (\n <span className=\"tabular-nums text-text-secondary\">\n {formatVolume(a.capacityPerDay, a.capacityUnit)}/day\n </span>\n ) : (\n <span className=\"text-text-tertiary\">—</span>\n ),\n },\n {\n key: 'workingInterest',\n header: 'Working interest',\n align: 'right',\n hideOnMobile: true,\n sortValue: (a) => a.workingInterestPct,\n render: (a) => (\n <span className=\"tabular-nums text-text-secondary\">\n {formatPercent(a.workingInterestPct)}\n </span>\n ),\n },\n {\n key: 'location',\n header: 'Location',\n hideOnMobile: true,\n render: (a) =>\n a.location ? (\n <span className=\"inline-flex items-center gap-1.5 text-text-secondary\">\n <MapPin className=\"h-3.5 w-3.5 shrink-0 text-text-tertiary\" />\n {a.location}\n </span>\n ) : (\n <span className=\"text-text-tertiary\">—</span>\n ),\n },\n {\n key: 'updated',\n header: 'Updated',\n align: 'right',\n hideOnMobile: true,\n render: (a) => <span className=\"text-text-tertiary\">{formatRelativeTime(a.updatedAt)}</span>,\n },\n ];\n\n const resetForm = () => {\n setForm(EMPTY_FORM);\n setFormError(null);\n };\n\n const handleCreate = async () => {\n if (!form.name.trim()) {\n setFormError('Asset name is required.');\n return;\n }\n setFormError(null);\n try {\n const created = await createAsset.mutateAsync({\n name: form.name.trim(),\n code: form.code.trim() || null,\n commodity: form.commodity,\n kind: form.kind,\n status: form.status,\n location: form.location.trim() || null,\n latitude: form.latitude ? Number(form.latitude) : null,\n longitude: form.longitude ? Number(form.longitude) : null,\n capacityPerDay: form.capacityPerDay ? Number(form.capacityPerDay) : null,\n capacityUnit: form.capacityUnit,\n workingInterestPct: form.workingInterestPct ? Number(form.workingInterestPct) : null,\n });\n notify.success('Asset created');\n setDialogOpen(false);\n resetForm();\n navigateTo(`assets/${created.id}`);\n } catch (err) {\n notify.fromError(err);\n setFormError(err instanceof Error ? err.message : 'Failed to create asset.');\n }\n };\n\n return (\n <PageLayout\n title=\"Assets\"\n description=\"Resource registry — fields, wells, mines, plants, terminals & pipelines across every commodity.\"\n actions={\n <Button onClick={() => setDialogOpen(true)}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> New asset\n </Button>\n }\n >\n <div className=\"mb-5 flex flex-wrap items-center gap-3\">\n <FilterTabs\n options={STATUS_FILTERS}\n value={status}\n onChange={(v) => {\n setStatus(v);\n pager.reset();\n }}\n />\n <Select\n value={commodity}\n onValueChange={(v) => {\n setCommodity(v as TheCommodityType | 'ALL');\n pager.reset();\n }}\n >\n <SelectTrigger className=\"w-48\" aria-label=\"Filter by commodity\">\n <SelectValue placeholder=\"All commodities\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"ALL\">All commodities</SelectItem>\n {COMMODITIES.map((c) => (\n <SelectItem key={c} value={c}>\n {formatEnumLabel(c)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Select\n value={kind}\n onValueChange={(v) => {\n setKind(v as TheAssetKind | 'ALL');\n pager.reset();\n }}\n >\n <SelectTrigger className=\"w-48\" aria-label=\"Filter by kind\">\n <SelectValue placeholder=\"All kinds\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"ALL\">All kinds</SelectItem>\n {ASSET_KINDS.map((k) => (\n <SelectItem key={k} value={k}>\n {formatEnumLabel(k)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {isLoading ? (\n <LoadingView label=\"Loading assets…\" />\n ) : isError ? (\n <ErrorView message=\"Couldn't load assets.\" onRetry={() => refetch()} />\n ) : rows.length === 0 ? (\n <EmptyState\n illustration=\"empty-data\"\n icon={<Fuel className=\"h-10 w-10\" />}\n title=\"No assets yet\"\n description={\n filtersActive\n ? 'No assets match these filters.'\n : 'Register your first resource asset to start tracking production, reserves & emissions.'\n }\n action={\n <Button onClick={() => setDialogOpen(true)}>\n <Plus className=\"mr-1.5 h-4 w-4\" /> New asset\n </Button>\n }\n />\n ) : (\n <>\n <DataTable\n columns={columns}\n rows={rows}\n rowKey={(a) => a.id}\n onRowClick={(a) => navigateTo(`assets/${a.id}`)}\n rowLabel={(a) => `Open ${a.name}`}\n />\n <Pagination\n page={pager.page}\n pageSize={PAGE_SIZE}\n itemCount={rows.length}\n hasMore={data?.pageInfo?.hasMore ?? false}\n onPageChange={(target) => pager.onPageChange(target, data?.pageInfo?.cursor)}\n />\n </>\n )}\n\n {/* New asset dialog */}\n <ResponsiveDialog\n open={dialogOpen}\n onOpenChange={(open) => {\n setDialogOpen(open);\n if (!open) resetForm();\n }}\n >\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>New asset</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Register a resource asset — a field, well, mine, plant, terminal or pipeline.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n\n <form\n id=\"createAssetForm\"\n onSubmit={(e) => {\n e.preventDefault();\n handleCreate();\n }}\n className=\"grid gap-4 py-2\"\n >\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"assetName\">Name *</Label>\n <Input\n id=\"assetName\"\n value={form.name}\n onChange={(e) => setForm({ ...form, name: e.target.value })}\n placeholder=\"Rumaila North Field\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"assetCode\">Code</Label>\n <Input\n id=\"assetCode\"\n value={form.code}\n onChange={(e) => setForm({ ...form, code: e.target.value })}\n placeholder=\"AST-RMB-N\"\n />\n </div>\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-3\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"assetCommodity\">Commodity *</Label>\n <Select\n value={form.commodity}\n onValueChange={(v) => setForm({ ...form, commodity: v as TheCommodityType })}\n >\n <SelectTrigger id=\"assetCommodity\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {COMMODITIES.map((c) => (\n <SelectItem key={c} value={c}>\n {formatEnumLabel(c)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"assetKind\">Kind</Label>\n <Select\n value={form.kind}\n onValueChange={(v) => setForm({ ...form, kind: v as TheAssetKind })}\n >\n <SelectTrigger id=\"assetKind\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {ASSET_KINDS.map((k) => (\n <SelectItem key={k} value={k}>\n {formatEnumLabel(k)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"assetStatus\">Status</Label>\n <Select\n value={form.status}\n onValueChange={(v) => setForm({ ...form, status: v as TheAssetStatus })}\n >\n <SelectTrigger id=\"assetStatus\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {STATUS_FILTERS.filter((o) => o.value !== 'ALL').map((o) => (\n <SelectItem key={o.value} value={o.value}>\n {o.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"assetLocation\">Location</Label>\n <Input\n id=\"assetLocation\"\n value={form.location}\n onChange={(e) => setForm({ ...form, location: e.target.value })}\n placeholder=\"Basra, Iraq\"\n />\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"assetLat\">Latitude</Label>\n <Input\n id=\"assetLat\"\n type=\"number\"\n step=\"any\"\n value={form.latitude}\n onChange={(e) => setForm({ ...form, latitude: e.target.value })}\n placeholder=\"30.5085\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"assetLng\">Longitude</Label>\n <Input\n id=\"assetLng\"\n type=\"number\"\n step=\"any\"\n value={form.longitude}\n onChange={(e) => setForm({ ...form, longitude: e.target.value })}\n placeholder=\"47.7804\"\n />\n </div>\n </div>\n\n <div className=\"grid gap-2 sm:grid-cols-3\">\n <div className=\"grid gap-1.5 sm:col-span-1\">\n <Label htmlFor=\"assetCapacity\">Capacity / day</Label>\n <Input\n id=\"assetCapacity\"\n type=\"number\"\n min=\"0\"\n step=\"any\"\n value={form.capacityPerDay}\n onChange={(e) => setForm({ ...form, capacityPerDay: e.target.value })}\n placeholder=\"120000\"\n />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"assetUnit\">Capacity unit</Label>\n <Select\n value={form.capacityUnit}\n onValueChange={(v) => setForm({ ...form, capacityUnit: v as TheUnit })}\n >\n <SelectTrigger id=\"assetUnit\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {UNITS.map((u) => (\n <SelectItem key={u} value={u}>\n {formatEnumLabel(u)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor=\"assetWi\">Working interest (%)</Label>\n <Input\n id=\"assetWi\"\n type=\"number\"\n min=\"0\"\n max=\"100\"\n step=\"any\"\n value={form.workingInterestPct}\n onChange={(e) => setForm({ ...form, workingInterestPct: e.target.value })}\n placeholder=\"47.5\"\n />\n </div>\n </div>\n\n {formError && <p className=\"text-sm text-status-error-text\">{formError}</p>}\n </form>\n\n <ResponsiveDialogFooter>\n <Button\n variant=\"outline\"\n type=\"button\"\n onClick={() => {\n setDialogOpen(false);\n resetForm();\n }}\n >\n Cancel\n </Button>\n <Button type=\"submit\" form=\"createAssetForm\" disabled={createAsset.isPending}>\n {createAsset.isPending ? 'Creating…' : 'Create asset'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n </PageLayout>\n );\n}\n"],"mappings":"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"}