@burdenoff/microfe-theglobalfuel 2026.716.1 → 2026.720.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 (67) hide show
  1. package/dist/theglobalfuel/TheGlobalFuelRoutes.d.ts.map +1 -1
  2. package/dist/theglobalfuel/TheGlobalFuelRoutes.js +34 -22
  3. package/dist/theglobalfuel/TheGlobalFuelRoutes.js.map +1 -1
  4. package/dist/theglobalfuel/components/DataTable.js +1 -1
  5. package/dist/theglobalfuel/components/DataTable.js.map +1 -1
  6. package/dist/theglobalfuel/components/MiniBar.d.ts.map +1 -1
  7. package/dist/theglobalfuel/components/MiniBar.js +1 -1
  8. package/dist/theglobalfuel/components/MiniBar.js.map +1 -1
  9. package/dist/theglobalfuel/components/Tabs.js +1 -1
  10. package/dist/theglobalfuel/components/Tabs.js.map +1 -1
  11. package/dist/theglobalfuel/components/index.js +2 -0
  12. package/dist/theglobalfuel/components/viz/BarChart.js +83 -4
  13. package/dist/theglobalfuel/components/viz/BarChart.js.map +1 -0
  14. package/dist/theglobalfuel/components/viz/StatCard.js +60 -3
  15. package/dist/theglobalfuel/components/viz/StatCard.js.map +1 -0
  16. package/dist/theglobalfuel/hooks/useTheGlobalFuelApi.d.ts +10 -1
  17. package/dist/theglobalfuel/hooks/useTheGlobalFuelApi.d.ts.map +1 -1
  18. package/dist/theglobalfuel/hooks/useTheGlobalFuelApi.js +1 -1
  19. package/dist/theglobalfuel/hooks/useTheGlobalFuelApi.js.map +1 -1
  20. package/dist/theglobalfuel/pages/alerts/AlertsPage.d.ts +16 -0
  21. package/dist/theglobalfuel/pages/alerts/AlertsPage.d.ts.map +1 -0
  22. package/dist/theglobalfuel/pages/alerts/AlertsPage.js +295 -0
  23. package/dist/theglobalfuel/pages/alerts/AlertsPage.js.map +1 -0
  24. package/dist/theglobalfuel/pages/analytics/AnalyticsPage.d.ts +13 -0
  25. package/dist/theglobalfuel/pages/analytics/AnalyticsPage.d.ts.map +1 -0
  26. package/dist/theglobalfuel/pages/analytics/AnalyticsPage.js +358 -0
  27. package/dist/theglobalfuel/pages/analytics/AnalyticsPage.js.map +1 -0
  28. package/dist/theglobalfuel/pages/assets/AssetDetailPage.d.ts.map +1 -1
  29. package/dist/theglobalfuel/pages/assets/AssetDetailPage.js +386 -342
  30. package/dist/theglobalfuel/pages/assets/AssetDetailPage.js.map +1 -1
  31. package/dist/theglobalfuel/pages/assets/AssetsPage.d.ts.map +1 -1
  32. package/dist/theglobalfuel/pages/assets/AssetsPage.js +277 -199
  33. package/dist/theglobalfuel/pages/assets/AssetsPage.js.map +1 -1
  34. package/dist/theglobalfuel/pages/contracts/ContractsPage.js +1 -1
  35. package/dist/theglobalfuel/pages/contracts/ContractsPage.js.map +1 -1
  36. package/dist/theglobalfuel/pages/dashboard/DashboardPage.js +6 -6
  37. package/dist/theglobalfuel/pages/dashboard/DashboardPage.js.map +1 -1
  38. package/dist/theglobalfuel/pages/emissions/EmissionsPage.js +1 -1
  39. package/dist/theglobalfuel/pages/emissions/EmissionsPage.js.map +1 -1
  40. package/dist/theglobalfuel/pages/inventory/InventoryPage.js +1 -1
  41. package/dist/theglobalfuel/pages/inventory/InventoryPage.js.map +1 -1
  42. package/dist/theglobalfuel/pages/provenance/ProvenancePage.d.ts.map +1 -1
  43. package/dist/theglobalfuel/pages/provenance/ProvenancePage.js +372 -216
  44. package/dist/theglobalfuel/pages/provenance/ProvenancePage.js.map +1 -1
  45. package/dist/theglobalfuel/pages/reports/ReportsPage.d.ts +16 -0
  46. package/dist/theglobalfuel/pages/reports/ReportsPage.d.ts.map +1 -0
  47. package/dist/theglobalfuel/pages/reports/ReportsPage.js +578 -0
  48. package/dist/theglobalfuel/pages/reports/ReportsPage.js.map +1 -0
  49. package/dist/theglobalfuel/pages/shipments/ShipmentsPage.d.ts.map +1 -1
  50. package/dist/theglobalfuel/pages/shipments/ShipmentsPage.js +43 -12
  51. package/dist/theglobalfuel/pages/shipments/ShipmentsPage.js.map +1 -1
  52. package/dist/theglobalfuel/types/index.d.ts +37 -8
  53. package/dist/theglobalfuel/types/index.d.ts.map +1 -1
  54. package/dist/theglobalfuel/utils/csv.d.ts +16 -0
  55. package/dist/theglobalfuel/utils/csv.d.ts.map +1 -0
  56. package/dist/theglobalfuel/utils/csv.js +14 -0
  57. package/dist/theglobalfuel/utils/csv.js.map +1 -0
  58. package/dist/theglobalfuel/utils/index.d.ts +2 -0
  59. package/dist/theglobalfuel/utils/index.d.ts.map +1 -1
  60. package/dist/theglobalfuel/utils/pageContext.d.ts.map +1 -1
  61. package/dist/theglobalfuel/utils/pageContext.js +32 -0
  62. package/dist/theglobalfuel/utils/pageContext.js.map +1 -1
  63. package/dist/theglobalfuel/utils/provenance.d.ts +135 -0
  64. package/dist/theglobalfuel/utils/provenance.d.ts.map +1 -0
  65. package/dist/theglobalfuel/utils/provenance.js +57 -0
  66. package/dist/theglobalfuel/utils/provenance.js.map +1 -0
  67. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"useTheGlobalFuelApi.js","names":[],"sources":["../../../src/theglobalfuel/hooks/useTheGlobalFuelApi.ts"],"sourcesContent":["/**\n * TheGlobalFuel API hooks\n * @module theglobalfuel/hooks\n *\n * React-Query hooks wired DIRECTLY to the real `wspace-theglobalfuel-svc`\n * federated GraphQL contract (the `the*` operations). Every query/mutation\n * below uses an inline gql string whose fields match the svc\n * `.hive-schema.graphql` exactly. No mock data.\n *\n * Transport: `graphqlFetch({ gateway: 'workspace', workspaceToken: true })` —\n * the host shell supplies the gateway base URL + a workspace-scoped token.\n */\n\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\nimport { graphqlFetch } from '@burdenoff/fe-libs/shared/graphql';\n\nimport { useTheGlobalFuel } from '../context';\nimport type {\n TheConnection,\n TheAsset,\n TheAssetKind,\n TheAssetStatus,\n TheCommodityType,\n TheProductionRecord,\n TheReserveEstimate,\n TheReserveCategory,\n TheOfftakeContract,\n TheContractSide,\n TheContractStatus,\n TheShipment,\n TheShipmentStatus,\n TheInventoryLot,\n TheInventoryStatus,\n TheEmissionRecord,\n TheEmissionScope,\n TheComplianceCert,\n TheComplianceCategory,\n TheComplianceStatus,\n TheCreateAssetInput,\n TheUpdateAssetInput,\n TheRecordProductionInput,\n TheCreateReserveEstimateInput,\n TheCreateOfftakeContractInput,\n TheUpdateOfftakeContractInput,\n TheCreateShipmentInput,\n TheCreateInventoryLotInput,\n TheRecordEmissionInput,\n TheCreateComplianceCertInput,\n PaginationInput,\n} from '../types';\n\n// ============================================================================\n// Transport\n// ============================================================================\n\ntype GraphqlReadCacheGlobals = {\n __graphqlFetchResponseCache?: { clear: () => void };\n __graphqlFetchPendingResponses?: { clear: () => void };\n __boffGraphQLResponseCache?: { clear: () => void };\n};\n\n/**\n * fe-libs `graphqlFetch` coalesces `query` responses in a short-lived in-memory\n * cache keyed by operationName+variables (~15s; mutations never cached). A read\n * issued right after a write would otherwise return the pre-mutation snapshot\n * until the TTL expires — making just-created rows invisible. We clear those\n * caches after every mutation so every follow-up refetch reads fresh.\n */\nconst clearGraphqlReadCaches = (): void => {\n const g = globalThis as GraphqlReadCacheGlobals;\n g.__graphqlFetchResponseCache?.clear();\n g.__graphqlFetchPendingResponses?.clear();\n g.__boffGraphQLResponseCache?.clear();\n};\n\nconst theQuery = async <TData>(\n query: string,\n variables: Record<string, unknown>,\n baseUrl?: string\n): Promise<TData> => {\n const response = await graphqlFetch<TData>({\n gateway: 'workspace',\n baseUrl,\n query,\n variables,\n workspaceToken: true,\n });\n\n if (response.errors?.length) {\n throw new Error(response.errors[0]?.message ?? 'GraphQL request failed');\n }\n if (!response.data) {\n throw new Error('GraphQL response did not include data');\n }\n if (/^\\s*mutation\\b/.test(query)) {\n clearGraphqlReadCaches();\n }\n return response.data;\n};\n\n// React-Query key roots (one namespace per domain entity).\nconst KEY = {\n assets: ['theglobalfuel', 'assets'] as const,\n asset: (id: string) => ['theglobalfuel', 'asset', id] as const,\n production: ['theglobalfuel', 'production'] as const,\n reserves: ['theglobalfuel', 'reserves'] as const,\n contracts: ['theglobalfuel', 'contracts'] as const,\n contract: (id: string) => ['theglobalfuel', 'contract', id] as const,\n shipments: ['theglobalfuel', 'shipments'] as const,\n inventory: ['theglobalfuel', 'inventory'] as const,\n emissions: ['theglobalfuel', 'emissions'] as const,\n compliance: ['theglobalfuel', 'compliance'] as const,\n complianceCert: (id: string) => ['theglobalfuel', 'compliance', id] as const,\n};\n\nconst DEFAULT_PAGE: PaginationInput = { limit: 50 };\n\n// ============================================================================\n// Reusable gql field selections (codegen-free strictness)\n// ============================================================================\n\nconst ASSET_FIELDS = `\n id workspaceId name code kind commodity status location latitude longitude\n capacityPerDay capacityUnit workingInterestPct operatorLeadId\n commissionedAt decommissionedAt tags createdAt updatedAt\n`;\n\nconst PRODUCTION_FIELDS = `\n id workspaceId assetId periodStart periodEnd volume unit grade downtimeHours\n notes createdAt updatedAt\n`;\n\nconst RESERVE_FIELDS = `\n id workspaceId assetId category asOfDate recoverable recoveryFactor unit\n methodology notes createdAt updatedAt\n`;\n\nconst CONTRACT_FIELDS = `\n id workspaceId reference counterparty commodity side status pricingBasis\n pricePerUnit priceIndex currency contractedVolume deliveredVolume unit\n deliveryLocation startDate endDate signedAt notes tags createdAt updatedAt\n`;\n\nconst SHIPMENT_FIELDS = `\n id workspaceId contractId reference mode status carrier origin destination\n volume unit scheduledAt departedAt deliveredAt document { id } notes\n createdAt updatedAt\n`;\n\nconst INVENTORY_FIELDS = `\n id workspaceId lotCode commodity assetId quantity unit grade status location\n unitValue currency producedAt notes createdAt updatedAt\n`;\n\nconst EMISSION_FIELDS = `\n id workspaceId assetId scope co2eTonnes periodStart periodEnd source\n methodology verified verifiedAt notes createdAt updatedAt\n`;\n\nconst COMPLIANCE_FIELDS = `\n id workspaceId title category status assetId authority certNumber ownerId\n issuedAt expiresAt evidence { id } notes tags createdAt updatedAt\n`;\n\n// ============================================================================\n// Registry — Assets\n// ============================================================================\n\nexport interface AssetFilters {\n commodity?: TheCommodityType;\n kind?: TheAssetKind;\n status?: TheAssetStatus;\n pagination?: PaginationInput;\n}\n\nexport const useTheAssets = (filters: AssetFilters = {}) => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n return useQuery({\n queryKey: [...KEY.assets, filters],\n queryFn: async () => {\n const data = await theQuery<{ theListAssets: TheConnection<TheAsset> }>(\n `query TheListAssets($commodity: TheCommodityType, $kind: TheAssetKind, $status: TheAssetStatus, $pagination: PaginationInput) {\n theListAssets(commodity: $commodity, kind: $kind, status: $status, pagination: $pagination) {\n items { ${ASSET_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n {\n commodity: filters.commodity,\n kind: filters.kind,\n status: filters.status,\n pagination: filters.pagination ?? DEFAULT_PAGE,\n },\n apiGatewayUrl\n );\n return data.theListAssets;\n },\n });\n};\n\nexport const useTheAsset = (id: string | undefined) => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n return useQuery({\n queryKey: KEY.asset(id ?? ''),\n enabled: Boolean(id),\n queryFn: async () => {\n const data = await theQuery<{ theAsset: TheAsset | null }>(\n `query TheAsset($id: ID!) {\n theAsset(id: $id) { ${ASSET_FIELDS} }\n }`,\n { id },\n apiGatewayUrl\n );\n return data.theAsset;\n },\n });\n};\n\nexport const useTheCreateAsset = () => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: TheCreateAssetInput) => {\n const data = await theQuery<{ theCreateAsset: TheAsset }>(\n `mutation TheCreateAsset($input: TheCreateAssetInput!) {\n theCreateAsset(input: $input) { ${ASSET_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return data.theCreateAsset;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.assets }),\n });\n};\n\nexport const useTheUpdateAsset = () => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async ({ id, input }: { id: string; input: TheUpdateAssetInput }) => {\n const data = await theQuery<{ theUpdateAsset: TheAsset }>(\n `mutation TheUpdateAsset($id: ID!, $input: TheUpdateAssetInput!) {\n theUpdateAsset(id: $id, input: $input) { ${ASSET_FIELDS} }\n }`,\n { id, input },\n apiGatewayUrl\n );\n return data.theUpdateAsset;\n },\n onSuccess: (asset) => {\n qc.invalidateQueries({ queryKey: KEY.assets });\n qc.invalidateQueries({ queryKey: KEY.asset(asset.id) });\n },\n });\n};\n\nexport const useTheTransitionAsset = () => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async ({ id, status }: { id: string; status: TheAssetStatus }) => {\n const data = await theQuery<{ theTransitionAsset: TheAsset }>(\n `mutation TheTransitionAsset($id: ID!, $status: TheAssetStatus!) {\n theTransitionAsset(id: $id, status: $status) { ${ASSET_FIELDS} }\n }`,\n { id, status },\n apiGatewayUrl\n );\n return data.theTransitionAsset;\n },\n onSuccess: (asset) => {\n qc.invalidateQueries({ queryKey: KEY.assets });\n qc.invalidateQueries({ queryKey: KEY.asset(asset.id) });\n },\n });\n};\n\nexport const useTheRetireAsset = () => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await theQuery<{ theRetireAsset: boolean }>(\n `mutation TheRetireAsset($id: ID!) { theRetireAsset(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return data.theRetireAsset;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.assets }),\n });\n};\n\n// ============================================================================\n// Registry — Production records\n// ============================================================================\n\nexport interface ProductionFilters {\n assetId?: string;\n pagination?: PaginationInput;\n}\n\nexport const useTheProductionRecords = (filters: ProductionFilters = {}) => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n return useQuery({\n queryKey: [...KEY.production, filters],\n queryFn: async () => {\n const data = await theQuery<{ theListProductionRecords: TheConnection<TheProductionRecord> }>(\n `query TheListProductionRecords($assetId: ID, $pagination: PaginationInput) {\n theListProductionRecords(assetId: $assetId, pagination: $pagination) {\n items { ${PRODUCTION_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n { assetId: filters.assetId, pagination: filters.pagination ?? DEFAULT_PAGE },\n apiGatewayUrl\n );\n return data.theListProductionRecords;\n },\n });\n};\n\nexport const useTheRecordProduction = () => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: TheRecordProductionInput) => {\n const data = await theQuery<{ theRecordProduction: TheProductionRecord }>(\n `mutation TheRecordProduction($input: TheRecordProductionInput!) {\n theRecordProduction(input: $input) { ${PRODUCTION_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return data.theRecordProduction;\n },\n onSuccess: (rec) => {\n qc.invalidateQueries({ queryKey: KEY.production });\n qc.invalidateQueries({ queryKey: KEY.asset(rec.assetId) });\n },\n });\n};\n\n// ============================================================================\n// Registry — Reserve estimates\n// ============================================================================\n\nexport const useTheReserveEstimates = (\n assetId?: string,\n category?: TheReserveCategory,\n pagination?: PaginationInput\n) => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n return useQuery({\n queryKey: [...KEY.reserves, assetId ?? null, category ?? null, pagination ?? null],\n queryFn: async () => {\n const data = await theQuery<{ theListReserveEstimates: TheConnection<TheReserveEstimate> }>(\n `query TheListReserveEstimates($assetId: ID, $category: TheReserveCategory, $pagination: PaginationInput) {\n theListReserveEstimates(assetId: $assetId, category: $category, pagination: $pagination) {\n items { ${RESERVE_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n { assetId, category, pagination: pagination ?? DEFAULT_PAGE },\n apiGatewayUrl\n );\n return data.theListReserveEstimates;\n },\n });\n};\n\nexport const useTheCreateReserveEstimate = () => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: TheCreateReserveEstimateInput) => {\n const data = await theQuery<{ theCreateReserveEstimate: TheReserveEstimate }>(\n `mutation TheCreateReserveEstimate($input: TheCreateReserveEstimateInput!) {\n theCreateReserveEstimate(input: $input) { ${RESERVE_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return data.theCreateReserveEstimate;\n },\n onSuccess: (rec) => {\n qc.invalidateQueries({ queryKey: KEY.reserves });\n qc.invalidateQueries({ queryKey: KEY.asset(rec.assetId) });\n },\n });\n};\n\n// ============================================================================\n// Commerce — Offtake contracts\n// ============================================================================\n\nexport interface ContractFilters {\n commodity?: TheCommodityType;\n side?: TheContractSide;\n status?: TheContractStatus;\n pagination?: PaginationInput;\n}\n\nexport const useTheContracts = (filters: ContractFilters = {}) => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n return useQuery({\n queryKey: [...KEY.contracts, filters],\n queryFn: async () => {\n const data = await theQuery<{ theListContracts: TheConnection<TheOfftakeContract> }>(\n `query TheListContracts($commodity: TheCommodityType, $side: TheContractSide, $status: TheContractStatus, $pagination: PaginationInput) {\n theListContracts(commodity: $commodity, side: $side, status: $status, pagination: $pagination) {\n items { ${CONTRACT_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n {\n commodity: filters.commodity,\n side: filters.side,\n status: filters.status,\n pagination: filters.pagination ?? DEFAULT_PAGE,\n },\n apiGatewayUrl\n );\n return data.theListContracts;\n },\n });\n};\n\nexport const useTheContract = (id: string | undefined) => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n return useQuery({\n queryKey: KEY.contract(id ?? ''),\n enabled: Boolean(id),\n queryFn: async () => {\n const data = await theQuery<{ theContract: TheOfftakeContract | null }>(\n `query TheContract($id: ID!) {\n theContract(id: $id) { ${CONTRACT_FIELDS} }\n }`,\n { id },\n apiGatewayUrl\n );\n return data.theContract;\n },\n });\n};\n\nexport const useTheCreateContract = () => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: TheCreateOfftakeContractInput) => {\n const data = await theQuery<{ theCreateContract: TheOfftakeContract }>(\n `mutation TheCreateContract($input: TheCreateOfftakeContractInput!) {\n theCreateContract(input: $input) { ${CONTRACT_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return data.theCreateContract;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.contracts }),\n });\n};\n\nexport const useTheUpdateContract = () => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async ({ id, input }: { id: string; input: TheUpdateOfftakeContractInput }) => {\n const data = await theQuery<{ theUpdateContract: TheOfftakeContract }>(\n `mutation TheUpdateContract($id: ID!, $input: TheUpdateOfftakeContractInput!) {\n theUpdateContract(id: $id, input: $input) { ${CONTRACT_FIELDS} }\n }`,\n { id, input },\n apiGatewayUrl\n );\n return data.theUpdateContract;\n },\n onSuccess: (c) => {\n qc.invalidateQueries({ queryKey: KEY.contracts });\n qc.invalidateQueries({ queryKey: KEY.contract(c.id) });\n },\n });\n};\n\nexport const useTheTransitionContract = () => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async ({ id, status }: { id: string; status: TheContractStatus }) => {\n const data = await theQuery<{ theTransitionContract: TheOfftakeContract }>(\n `mutation TheTransitionContract($id: ID!, $status: TheContractStatus!) {\n theTransitionContract(id: $id, status: $status) { ${CONTRACT_FIELDS} }\n }`,\n { id, status },\n apiGatewayUrl\n );\n return data.theTransitionContract;\n },\n onSuccess: (c) => {\n qc.invalidateQueries({ queryKey: KEY.contracts });\n qc.invalidateQueries({ queryKey: KEY.contract(c.id) });\n },\n });\n};\n\n// ============================================================================\n// Commerce — Shipments\n// ============================================================================\n\nexport const useTheShipments = (\n contractId?: string,\n status?: TheShipmentStatus,\n pagination?: PaginationInput\n) => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n return useQuery({\n queryKey: [...KEY.shipments, contractId ?? null, status ?? null, pagination ?? null],\n queryFn: async () => {\n const data = await theQuery<{ theListShipments: TheConnection<TheShipment> }>(\n `query TheListShipments($contractId: ID, $status: TheShipmentStatus, $pagination: PaginationInput) {\n theListShipments(contractId: $contractId, status: $status, pagination: $pagination) {\n items { ${SHIPMENT_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n { contractId, status, pagination: pagination ?? DEFAULT_PAGE },\n apiGatewayUrl\n );\n return data.theListShipments;\n },\n });\n};\n\nexport const useTheTransitionShipment = () => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async ({ id, status }: { id: string; status: TheShipmentStatus }) => {\n const data = await theQuery<{ theTransitionShipment: TheShipment }>(\n `mutation TheTransitionShipment($id: ID!, $status: TheShipmentStatus!) {\n theTransitionShipment(id: $id, status: $status) { ${SHIPMENT_FIELDS} }\n }`,\n { id, status },\n apiGatewayUrl\n );\n return data.theTransitionShipment;\n },\n onSuccess: (s) => {\n qc.invalidateQueries({ queryKey: KEY.shipments });\n qc.invalidateQueries({ queryKey: KEY.contract(s.contractId) });\n },\n });\n};\n\nexport const useTheScheduleShipment = () => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: TheCreateShipmentInput) => {\n const data = await theQuery<{ theScheduleShipment: TheShipment }>(\n `mutation TheScheduleShipment($input: TheCreateShipmentInput!) {\n theScheduleShipment(input: $input) { ${SHIPMENT_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return data.theScheduleShipment;\n },\n onSuccess: (s) => {\n qc.invalidateQueries({ queryKey: KEY.shipments });\n qc.invalidateQueries({ queryKey: KEY.contract(s.contractId) });\n },\n });\n};\n\nexport const useTheDeliverShipment = () => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await theQuery<{ theDeliverShipment: TheShipment }>(\n `mutation TheDeliverShipment($id: ID!) {\n theDeliverShipment(id: $id) { ${SHIPMENT_FIELDS} }\n }`,\n { id },\n apiGatewayUrl\n );\n return data.theDeliverShipment;\n },\n onSuccess: (s) => {\n qc.invalidateQueries({ queryKey: KEY.shipments });\n qc.invalidateQueries({ queryKey: KEY.contracts });\n qc.invalidateQueries({ queryKey: KEY.contract(s.contractId) });\n },\n });\n};\n\n// ============================================================================\n// Commerce — Inventory lots\n// ============================================================================\n\nexport interface InventoryFilters {\n commodity?: TheCommodityType;\n status?: TheInventoryStatus;\n pagination?: PaginationInput;\n}\n\nexport const useTheInventoryLots = (filters: InventoryFilters = {}) => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n return useQuery({\n queryKey: [...KEY.inventory, filters],\n queryFn: async () => {\n const data = await theQuery<{ theListInventoryLots: TheConnection<TheInventoryLot> }>(\n `query TheListInventoryLots($commodity: TheCommodityType, $status: TheInventoryStatus, $pagination: PaginationInput) {\n theListInventoryLots(commodity: $commodity, status: $status, pagination: $pagination) {\n items { ${INVENTORY_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n {\n commodity: filters.commodity,\n status: filters.status,\n pagination: filters.pagination ?? DEFAULT_PAGE,\n },\n apiGatewayUrl\n );\n return data.theListInventoryLots;\n },\n });\n};\n\nexport const useTheCreateInventoryLot = () => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: TheCreateInventoryLotInput) => {\n const data = await theQuery<{ theCreateInventoryLot: TheInventoryLot }>(\n `mutation TheCreateInventoryLot($input: TheCreateInventoryLotInput!) {\n theCreateInventoryLot(input: $input) { ${INVENTORY_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return data.theCreateInventoryLot;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.inventory }),\n });\n};\n\nexport const useTheSetInventoryLotStatus = () => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async ({ id, status }: { id: string; status: TheInventoryStatus }) => {\n const data = await theQuery<{ theSetInventoryLotStatus: TheInventoryLot }>(\n `mutation TheSetInventoryLotStatus($id: ID!, $status: TheInventoryStatus!) {\n theSetInventoryLotStatus(id: $id, status: $status) { ${INVENTORY_FIELDS} }\n }`,\n { id, status },\n apiGatewayUrl\n );\n return data.theSetInventoryLotStatus;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.inventory }),\n });\n};\n\n// ============================================================================\n// Sustainability — Emission records\n// ============================================================================\n\nexport interface EmissionFilters {\n assetId?: string;\n scope?: TheEmissionScope;\n pagination?: PaginationInput;\n}\n\nexport const useTheEmissionRecords = (filters: EmissionFilters = {}) => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n return useQuery({\n queryKey: [...KEY.emissions, filters],\n queryFn: async () => {\n const data = await theQuery<{ theListEmissionRecords: TheConnection<TheEmissionRecord> }>(\n `query TheListEmissionRecords($assetId: ID, $scope: TheEmissionScope, $pagination: PaginationInput) {\n theListEmissionRecords(assetId: $assetId, scope: $scope, pagination: $pagination) {\n items { ${EMISSION_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n {\n assetId: filters.assetId,\n scope: filters.scope,\n pagination: filters.pagination ?? DEFAULT_PAGE,\n },\n apiGatewayUrl\n );\n return data.theListEmissionRecords;\n },\n });\n};\n\nexport const useTheRecordEmission = () => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: TheRecordEmissionInput) => {\n const data = await theQuery<{ theRecordEmission: TheEmissionRecord }>(\n `mutation TheRecordEmission($input: TheRecordEmissionInput!) {\n theRecordEmission(input: $input) { ${EMISSION_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return data.theRecordEmission;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.emissions }),\n });\n};\n\nexport const useTheVerifyEmission = () => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await theQuery<{ theVerifyEmission: TheEmissionRecord }>(\n `mutation TheVerifyEmission($id: ID!) {\n theVerifyEmission(id: $id) { ${EMISSION_FIELDS} }\n }`,\n { id },\n apiGatewayUrl\n );\n return data.theVerifyEmission;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.emissions }),\n });\n};\n\n// ============================================================================\n// Sustainability — Compliance certifications\n// ============================================================================\n\nexport const useTheComplianceCerts = (\n assetId?: string,\n category?: TheComplianceCategory,\n status?: TheComplianceStatus,\n pagination?: PaginationInput\n) => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n return useQuery({\n queryKey: [\n ...KEY.compliance,\n assetId ?? null,\n category ?? null,\n status ?? null,\n pagination ?? null,\n ],\n queryFn: async () => {\n const data = await theQuery<{ theListComplianceCerts: TheConnection<TheComplianceCert> }>(\n `query TheListComplianceCerts($assetId: ID, $category: TheComplianceCategory, $status: TheComplianceStatus, $pagination: PaginationInput) {\n theListComplianceCerts(assetId: $assetId, category: $category, status: $status, pagination: $pagination) {\n items { ${COMPLIANCE_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n { assetId, category, status, pagination: pagination ?? DEFAULT_PAGE },\n apiGatewayUrl\n );\n return data.theListComplianceCerts;\n },\n });\n};\n\nexport const useTheComplianceCert = (id: string | undefined) => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n return useQuery({\n queryKey: KEY.complianceCert(id ?? ''),\n enabled: Boolean(id),\n queryFn: async () => {\n const data = await theQuery<{ theComplianceCert: TheComplianceCert | null }>(\n `query TheComplianceCert($id: ID!) {\n theComplianceCert(id: $id) { ${COMPLIANCE_FIELDS} }\n }`,\n { id },\n apiGatewayUrl\n );\n return data.theComplianceCert;\n },\n });\n};\n\nexport const useTheCreateComplianceCert = () => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: TheCreateComplianceCertInput) => {\n const data = await theQuery<{ theCreateComplianceCert: TheComplianceCert }>(\n `mutation TheCreateComplianceCert($input: TheCreateComplianceCertInput!) {\n theCreateComplianceCert(input: $input) { ${COMPLIANCE_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return data.theCreateComplianceCert;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.compliance }),\n });\n};\n\nexport const useTheTransitionComplianceCert = () => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async ({ id, status }: { id: string; status: TheComplianceStatus }) => {\n const data = await theQuery<{ theTransitionComplianceCert: TheComplianceCert }>(\n `mutation TheTransitionComplianceCert($id: ID!, $status: TheComplianceStatus!) {\n theTransitionComplianceCert(id: $id, status: $status) { ${COMPLIANCE_FIELDS} }\n }`,\n { id, status },\n apiGatewayUrl\n );\n return data.theTransitionComplianceCert;\n },\n onSuccess: (c) => {\n qc.invalidateQueries({ queryKey: KEY.compliance });\n qc.invalidateQueries({ queryKey: KEY.complianceCert(c.id) });\n },\n });\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"useTheGlobalFuelApi.js","names":[],"sources":["../../../src/theglobalfuel/hooks/useTheGlobalFuelApi.ts"],"sourcesContent":["/**\n * TheGlobalFuel API hooks\n * @module theglobalfuel/hooks\n *\n * React-Query hooks wired DIRECTLY to the real `wspace-theglobalfuel-svc`\n * federated GraphQL contract (the `the*` operations). Every query/mutation\n * below uses an inline gql string whose fields match the svc\n * `.hive-schema.graphql` exactly. No mock data.\n *\n * Transport: `graphqlFetch({ gateway: 'workspace', workspaceToken: true })` —\n * the host shell supplies the gateway base URL + a workspace-scoped token.\n */\n\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\nimport { graphqlFetch } from '@burdenoff/fe-libs/shared/graphql';\n\nimport { useTheGlobalFuel } from '../context';\nimport type {\n TheConnection,\n TheAsset,\n TheAssetKind,\n TheAssetStatus,\n TheCommodityType,\n TheProductionRecord,\n TheReserveEstimate,\n TheReserveCategory,\n TheOfftakeContract,\n TheContractSide,\n TheContractStatus,\n TheShipment,\n TheShipmentStatus,\n TheInventoryLot,\n TheInventoryStatus,\n TheEmissionRecord,\n TheEmissionScope,\n TheComplianceCert,\n TheComplianceCategory,\n TheComplianceStatus,\n TheCreateAssetInput,\n TheUpdateAssetInput,\n TheRecordProductionInput,\n TheCreateReserveEstimateInput,\n TheCreateOfftakeContractInput,\n TheUpdateOfftakeContractInput,\n TheCreateShipmentInput,\n TheUpdateShipmentInput,\n TheCreateInventoryLotInput,\n TheRecordEmissionInput,\n TheCreateComplianceCertInput,\n PaginationInput,\n} from '../types';\n\n// ============================================================================\n// Transport\n// ============================================================================\n\ntype GraphqlReadCacheGlobals = {\n __graphqlFetchResponseCache?: { clear: () => void };\n __graphqlFetchPendingResponses?: { clear: () => void };\n __boffGraphQLResponseCache?: { clear: () => void };\n};\n\n/**\n * fe-libs `graphqlFetch` coalesces `query` responses in a short-lived in-memory\n * cache keyed by operationName+variables (~15s; mutations never cached). A read\n * issued right after a write would otherwise return the pre-mutation snapshot\n * until the TTL expires — making just-created rows invisible. We clear those\n * caches after every mutation so every follow-up refetch reads fresh.\n */\nconst clearGraphqlReadCaches = (): void => {\n const g = globalThis as GraphqlReadCacheGlobals;\n g.__graphqlFetchResponseCache?.clear();\n g.__graphqlFetchPendingResponses?.clear();\n g.__boffGraphQLResponseCache?.clear();\n};\n\nconst theQuery = async <TData>(\n query: string,\n variables: Record<string, unknown>,\n baseUrl?: string\n): Promise<TData> => {\n const response = await graphqlFetch<TData>({\n gateway: 'workspace',\n baseUrl,\n query,\n variables,\n workspaceToken: true,\n });\n\n if (response.errors?.length) {\n throw new Error(response.errors[0]?.message ?? 'GraphQL request failed');\n }\n if (!response.data) {\n throw new Error('GraphQL response did not include data');\n }\n if (/^\\s*mutation\\b/.test(query)) {\n clearGraphqlReadCaches();\n }\n return response.data;\n};\n\n// React-Query key roots (one namespace per domain entity).\nconst KEY = {\n assets: ['theglobalfuel', 'assets'] as const,\n asset: (id: string) => ['theglobalfuel', 'asset', id] as const,\n production: ['theglobalfuel', 'production'] as const,\n reserves: ['theglobalfuel', 'reserves'] as const,\n contracts: ['theglobalfuel', 'contracts'] as const,\n contract: (id: string) => ['theglobalfuel', 'contract', id] as const,\n shipments: ['theglobalfuel', 'shipments'] as const,\n inventory: ['theglobalfuel', 'inventory'] as const,\n emissions: ['theglobalfuel', 'emissions'] as const,\n compliance: ['theglobalfuel', 'compliance'] as const,\n complianceCert: (id: string) => ['theglobalfuel', 'compliance', id] as const,\n};\n\nconst DEFAULT_PAGE: PaginationInput = { limit: 50 };\n\n// ============================================================================\n// Reusable gql field selections (codegen-free strictness)\n// ============================================================================\n\nconst ASSET_FIELDS = `\n id workspaceId name code kind commodity status location latitude longitude\n capacityPerDay capacityUnit workingInterestPct operatorLeadId\n commissionedAt decommissionedAt discoveryAt area reservoirType waterDepth\n createdAt updatedAt\n`;\n\nconst PRODUCTION_FIELDS = `\n id workspaceId assetId periodStart periodEnd volume unit grade downtimeHours\n source notes createdAt updatedAt\n`;\n\nconst RESERVE_FIELDS = `\n id workspaceId assetId category asOfDate recoverable recoveryFactor unit\n methodology notes createdAt updatedAt\n`;\n\nconst CONTRACT_FIELDS = `\n id workspaceId reference counterparty commodity side status pricingBasis\n pricePerUnit priceIndex currency contractedVolume deliveredVolume unit\n deliveryLocation startDate endDate signedAt notes createdAt updatedAt\n`;\n\nconst SHIPMENT_FIELDS = `\n id workspaceId contractId reference mode status carrier trackingId origin destination\n volume unit scheduledAt departedAt deliveredAt document { id } notes\n createdAt updatedAt\n`;\n\nconst INVENTORY_FIELDS = `\n id workspaceId lotCode commodity assetId quantity unit grade status location\n unitValue currency producedAt notes createdAt updatedAt\n`;\n\nconst EMISSION_FIELDS = `\n id workspaceId assetId scope co2eTonnes periodStart periodEnd source\n methodology verified verifiedAt notes createdAt updatedAt\n`;\n\nconst COMPLIANCE_FIELDS = `\n id workspaceId title category status assetId authority certNumber ownerId\n issuedAt expiresAt evidence { id } notes createdAt updatedAt\n`;\n\n// ============================================================================\n// Registry — Assets\n// ============================================================================\n\nexport interface AssetFilters {\n commodity?: TheCommodityType;\n kind?: TheAssetKind;\n status?: TheAssetStatus;\n pagination?: PaginationInput;\n}\n\nexport const useTheAssets = (filters: AssetFilters = {}) => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n return useQuery({\n queryKey: [...KEY.assets, filters],\n queryFn: async () => {\n const data = await theQuery<{ theListAssets: TheConnection<TheAsset> }>(\n `query TheListAssets($commodity: TheCommodityType, $kind: TheAssetKind, $status: TheAssetStatus, $pagination: PaginationInput) {\n theListAssets(commodity: $commodity, kind: $kind, status: $status, pagination: $pagination) {\n items { ${ASSET_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n {\n commodity: filters.commodity,\n kind: filters.kind,\n status: filters.status,\n pagination: filters.pagination ?? DEFAULT_PAGE,\n },\n apiGatewayUrl\n );\n return data.theListAssets;\n },\n });\n};\n\nexport const useTheAsset = (id: string | undefined) => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n return useQuery({\n queryKey: KEY.asset(id ?? ''),\n enabled: Boolean(id),\n queryFn: async () => {\n const data = await theQuery<{ theAsset: TheAsset | null }>(\n `query TheAsset($id: ID!) {\n theAsset(id: $id) { ${ASSET_FIELDS} }\n }`,\n { id },\n apiGatewayUrl\n );\n return data.theAsset;\n },\n });\n};\n\nexport const useTheCreateAsset = () => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: TheCreateAssetInput) => {\n const data = await theQuery<{ theCreateAsset: TheAsset }>(\n `mutation TheCreateAsset($input: TheCreateAssetInput!) {\n theCreateAsset(input: $input) { ${ASSET_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return data.theCreateAsset;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.assets }),\n });\n};\n\nexport const useTheUpdateAsset = () => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async ({ id, input }: { id: string; input: TheUpdateAssetInput }) => {\n const data = await theQuery<{ theUpdateAsset: TheAsset }>(\n `mutation TheUpdateAsset($id: ID!, $input: TheUpdateAssetInput!) {\n theUpdateAsset(id: $id, input: $input) { ${ASSET_FIELDS} }\n }`,\n { id, input },\n apiGatewayUrl\n );\n return data.theUpdateAsset;\n },\n onSuccess: (asset) => {\n qc.invalidateQueries({ queryKey: KEY.assets });\n qc.invalidateQueries({ queryKey: KEY.asset(asset.id) });\n },\n });\n};\n\nexport const useTheTransitionAsset = () => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async ({ id, status }: { id: string; status: TheAssetStatus }) => {\n const data = await theQuery<{ theTransitionAsset: TheAsset }>(\n `mutation TheTransitionAsset($id: ID!, $status: TheAssetStatus!) {\n theTransitionAsset(id: $id, status: $status) { ${ASSET_FIELDS} }\n }`,\n { id, status },\n apiGatewayUrl\n );\n return data.theTransitionAsset;\n },\n onSuccess: (asset) => {\n qc.invalidateQueries({ queryKey: KEY.assets });\n qc.invalidateQueries({ queryKey: KEY.asset(asset.id) });\n },\n });\n};\n\nexport const useTheRetireAsset = () => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await theQuery<{ theRetireAsset: boolean }>(\n `mutation TheRetireAsset($id: ID!) { theRetireAsset(id: $id) }`,\n { id },\n apiGatewayUrl\n );\n return data.theRetireAsset;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.assets }),\n });\n};\n\n// ============================================================================\n// Registry — Production records\n// ============================================================================\n\nexport interface ProductionFilters {\n assetId?: string;\n pagination?: PaginationInput;\n}\n\nexport const useTheProductionRecords = (filters: ProductionFilters = {}) => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n return useQuery({\n queryKey: [...KEY.production, filters],\n queryFn: async () => {\n const data = await theQuery<{ theListProductionRecords: TheConnection<TheProductionRecord> }>(\n `query TheListProductionRecords($assetId: ID, $pagination: PaginationInput) {\n theListProductionRecords(assetId: $assetId, pagination: $pagination) {\n items { ${PRODUCTION_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n { assetId: filters.assetId, pagination: filters.pagination ?? DEFAULT_PAGE },\n apiGatewayUrl\n );\n return data.theListProductionRecords;\n },\n });\n};\n\nexport const useTheRecordProduction = () => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: TheRecordProductionInput) => {\n const data = await theQuery<{ theRecordProduction: TheProductionRecord }>(\n `mutation TheRecordProduction($input: TheRecordProductionInput!) {\n theRecordProduction(input: $input) { ${PRODUCTION_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return data.theRecordProduction;\n },\n onSuccess: (rec) => {\n qc.invalidateQueries({ queryKey: KEY.production });\n qc.invalidateQueries({ queryKey: KEY.asset(rec.assetId) });\n },\n });\n};\n\n// ============================================================================\n// Registry — Reserve estimates\n// ============================================================================\n\nexport const useTheReserveEstimates = (\n assetId?: string,\n category?: TheReserveCategory,\n pagination?: PaginationInput\n) => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n return useQuery({\n queryKey: [...KEY.reserves, assetId ?? null, category ?? null, pagination ?? null],\n queryFn: async () => {\n const data = await theQuery<{ theListReserveEstimates: TheConnection<TheReserveEstimate> }>(\n `query TheListReserveEstimates($assetId: ID, $category: TheReserveCategory, $pagination: PaginationInput) {\n theListReserveEstimates(assetId: $assetId, category: $category, pagination: $pagination) {\n items { ${RESERVE_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n { assetId, category, pagination: pagination ?? DEFAULT_PAGE },\n apiGatewayUrl\n );\n return data.theListReserveEstimates;\n },\n });\n};\n\nexport const useTheCreateReserveEstimate = () => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: TheCreateReserveEstimateInput) => {\n const data = await theQuery<{ theCreateReserveEstimate: TheReserveEstimate }>(\n `mutation TheCreateReserveEstimate($input: TheCreateReserveEstimateInput!) {\n theCreateReserveEstimate(input: $input) { ${RESERVE_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return data.theCreateReserveEstimate;\n },\n onSuccess: (rec) => {\n qc.invalidateQueries({ queryKey: KEY.reserves });\n qc.invalidateQueries({ queryKey: KEY.asset(rec.assetId) });\n },\n });\n};\n\n// ============================================================================\n// Commerce — Offtake contracts\n// ============================================================================\n\nexport interface ContractFilters {\n commodity?: TheCommodityType;\n side?: TheContractSide;\n status?: TheContractStatus;\n pagination?: PaginationInput;\n}\n\nexport const useTheContracts = (filters: ContractFilters = {}) => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n return useQuery({\n queryKey: [...KEY.contracts, filters],\n queryFn: async () => {\n const data = await theQuery<{ theListContracts: TheConnection<TheOfftakeContract> }>(\n `query TheListContracts($commodity: TheCommodityType, $side: TheContractSide, $status: TheContractStatus, $pagination: PaginationInput) {\n theListContracts(commodity: $commodity, side: $side, status: $status, pagination: $pagination) {\n items { ${CONTRACT_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n {\n commodity: filters.commodity,\n side: filters.side,\n status: filters.status,\n pagination: filters.pagination ?? DEFAULT_PAGE,\n },\n apiGatewayUrl\n );\n return data.theListContracts;\n },\n });\n};\n\nexport const useTheContract = (id: string | undefined) => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n return useQuery({\n queryKey: KEY.contract(id ?? ''),\n enabled: Boolean(id),\n queryFn: async () => {\n const data = await theQuery<{ theContract: TheOfftakeContract | null }>(\n `query TheContract($id: ID!) {\n theContract(id: $id) { ${CONTRACT_FIELDS} }\n }`,\n { id },\n apiGatewayUrl\n );\n return data.theContract;\n },\n });\n};\n\nexport const useTheCreateContract = () => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: TheCreateOfftakeContractInput) => {\n const data = await theQuery<{ theCreateContract: TheOfftakeContract }>(\n `mutation TheCreateContract($input: TheCreateOfftakeContractInput!) {\n theCreateContract(input: $input) { ${CONTRACT_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return data.theCreateContract;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.contracts }),\n });\n};\n\nexport const useTheUpdateContract = () => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async ({ id, input }: { id: string; input: TheUpdateOfftakeContractInput }) => {\n const data = await theQuery<{ theUpdateContract: TheOfftakeContract }>(\n `mutation TheUpdateContract($id: ID!, $input: TheUpdateOfftakeContractInput!) {\n theUpdateContract(id: $id, input: $input) { ${CONTRACT_FIELDS} }\n }`,\n { id, input },\n apiGatewayUrl\n );\n return data.theUpdateContract;\n },\n onSuccess: (c) => {\n qc.invalidateQueries({ queryKey: KEY.contracts });\n qc.invalidateQueries({ queryKey: KEY.contract(c.id) });\n },\n });\n};\n\nexport const useTheTransitionContract = () => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async ({ id, status }: { id: string; status: TheContractStatus }) => {\n const data = await theQuery<{ theTransitionContract: TheOfftakeContract }>(\n `mutation TheTransitionContract($id: ID!, $status: TheContractStatus!) {\n theTransitionContract(id: $id, status: $status) { ${CONTRACT_FIELDS} }\n }`,\n { id, status },\n apiGatewayUrl\n );\n return data.theTransitionContract;\n },\n onSuccess: (c) => {\n qc.invalidateQueries({ queryKey: KEY.contracts });\n qc.invalidateQueries({ queryKey: KEY.contract(c.id) });\n },\n });\n};\n\n// ============================================================================\n// Commerce — Shipments\n// ============================================================================\n\nexport const useTheShipments = (\n contractId?: string,\n status?: TheShipmentStatus,\n pagination?: PaginationInput\n) => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n return useQuery({\n queryKey: [...KEY.shipments, contractId ?? null, status ?? null, pagination ?? null],\n queryFn: async () => {\n const data = await theQuery<{ theListShipments: TheConnection<TheShipment> }>(\n `query TheListShipments($contractId: ID, $status: TheShipmentStatus, $pagination: PaginationInput) {\n theListShipments(contractId: $contractId, status: $status, pagination: $pagination) {\n items { ${SHIPMENT_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n { contractId, status, pagination: pagination ?? DEFAULT_PAGE },\n apiGatewayUrl\n );\n return data.theListShipments;\n },\n });\n};\n\nexport const useTheTransitionShipment = () => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async ({ id, status }: { id: string; status: TheShipmentStatus }) => {\n const data = await theQuery<{ theTransitionShipment: TheShipment }>(\n `mutation TheTransitionShipment($id: ID!, $status: TheShipmentStatus!) {\n theTransitionShipment(id: $id, status: $status) { ${SHIPMENT_FIELDS} }\n }`,\n { id, status },\n apiGatewayUrl\n );\n return data.theTransitionShipment;\n },\n onSuccess: (s) => {\n qc.invalidateQueries({ queryKey: KEY.shipments });\n qc.invalidateQueries({ queryKey: KEY.contract(s.contractId) });\n },\n });\n};\n\nexport const useTheScheduleShipment = () => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: TheCreateShipmentInput) => {\n const data = await theQuery<{ theScheduleShipment: TheShipment }>(\n `mutation TheScheduleShipment($input: TheCreateShipmentInput!) {\n theScheduleShipment(input: $input) { ${SHIPMENT_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return data.theScheduleShipment;\n },\n onSuccess: (s) => {\n qc.invalidateQueries({ queryKey: KEY.shipments });\n qc.invalidateQueries({ queryKey: KEY.contract(s.contractId) });\n },\n });\n};\n\n/**\n * Update the logistics metadata of an existing shipment (carrier, tracking\n * number, route, schedule, document, notes). Status/volume are not editable\n * here — use the transition/deliver mutations for those.\n */\nexport const useTheUpdateShipment = () => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async ({ id, input }: { id: string; input: TheUpdateShipmentInput }) => {\n const data = await theQuery<{ theUpdateShipment: TheShipment }>(\n `mutation TheUpdateShipment($id: ID!, $input: TheUpdateShipmentInput!) {\n theUpdateShipment(id: $id, input: $input) { ${SHIPMENT_FIELDS} }\n }`,\n { id, input },\n apiGatewayUrl\n );\n return data.theUpdateShipment;\n },\n onSuccess: (s) => {\n qc.invalidateQueries({ queryKey: KEY.shipments });\n qc.invalidateQueries({ queryKey: KEY.contract(s.contractId) });\n },\n });\n};\n\nexport const useTheDeliverShipment = () => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await theQuery<{ theDeliverShipment: TheShipment }>(\n `mutation TheDeliverShipment($id: ID!) {\n theDeliverShipment(id: $id) { ${SHIPMENT_FIELDS} }\n }`,\n { id },\n apiGatewayUrl\n );\n return data.theDeliverShipment;\n },\n onSuccess: (s) => {\n qc.invalidateQueries({ queryKey: KEY.shipments });\n qc.invalidateQueries({ queryKey: KEY.contracts });\n qc.invalidateQueries({ queryKey: KEY.contract(s.contractId) });\n },\n });\n};\n\n// ============================================================================\n// Commerce — Inventory lots\n// ============================================================================\n\nexport interface InventoryFilters {\n commodity?: TheCommodityType;\n status?: TheInventoryStatus;\n pagination?: PaginationInput;\n}\n\nexport const useTheInventoryLots = (filters: InventoryFilters = {}) => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n return useQuery({\n queryKey: [...KEY.inventory, filters],\n queryFn: async () => {\n const data = await theQuery<{ theListInventoryLots: TheConnection<TheInventoryLot> }>(\n `query TheListInventoryLots($commodity: TheCommodityType, $status: TheInventoryStatus, $pagination: PaginationInput) {\n theListInventoryLots(commodity: $commodity, status: $status, pagination: $pagination) {\n items { ${INVENTORY_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n {\n commodity: filters.commodity,\n status: filters.status,\n pagination: filters.pagination ?? DEFAULT_PAGE,\n },\n apiGatewayUrl\n );\n return data.theListInventoryLots;\n },\n });\n};\n\nexport const useTheCreateInventoryLot = () => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: TheCreateInventoryLotInput) => {\n const data = await theQuery<{ theCreateInventoryLot: TheInventoryLot }>(\n `mutation TheCreateInventoryLot($input: TheCreateInventoryLotInput!) {\n theCreateInventoryLot(input: $input) { ${INVENTORY_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return data.theCreateInventoryLot;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.inventory }),\n });\n};\n\nexport const useTheSetInventoryLotStatus = () => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async ({ id, status }: { id: string; status: TheInventoryStatus }) => {\n const data = await theQuery<{ theSetInventoryLotStatus: TheInventoryLot }>(\n `mutation TheSetInventoryLotStatus($id: ID!, $status: TheInventoryStatus!) {\n theSetInventoryLotStatus(id: $id, status: $status) { ${INVENTORY_FIELDS} }\n }`,\n { id, status },\n apiGatewayUrl\n );\n return data.theSetInventoryLotStatus;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.inventory }),\n });\n};\n\n// ============================================================================\n// Sustainability — Emission records\n// ============================================================================\n\nexport interface EmissionFilters {\n assetId?: string;\n scope?: TheEmissionScope;\n pagination?: PaginationInput;\n}\n\nexport const useTheEmissionRecords = (filters: EmissionFilters = {}) => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n return useQuery({\n queryKey: [...KEY.emissions, filters],\n queryFn: async () => {\n const data = await theQuery<{ theListEmissionRecords: TheConnection<TheEmissionRecord> }>(\n `query TheListEmissionRecords($assetId: ID, $scope: TheEmissionScope, $pagination: PaginationInput) {\n theListEmissionRecords(assetId: $assetId, scope: $scope, pagination: $pagination) {\n items { ${EMISSION_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n {\n assetId: filters.assetId,\n scope: filters.scope,\n pagination: filters.pagination ?? DEFAULT_PAGE,\n },\n apiGatewayUrl\n );\n return data.theListEmissionRecords;\n },\n });\n};\n\nexport const useTheRecordEmission = () => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: TheRecordEmissionInput) => {\n const data = await theQuery<{ theRecordEmission: TheEmissionRecord }>(\n `mutation TheRecordEmission($input: TheRecordEmissionInput!) {\n theRecordEmission(input: $input) { ${EMISSION_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return data.theRecordEmission;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.emissions }),\n });\n};\n\nexport const useTheVerifyEmission = () => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (id: string) => {\n const data = await theQuery<{ theVerifyEmission: TheEmissionRecord }>(\n `mutation TheVerifyEmission($id: ID!) {\n theVerifyEmission(id: $id) { ${EMISSION_FIELDS} }\n }`,\n { id },\n apiGatewayUrl\n );\n return data.theVerifyEmission;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.emissions }),\n });\n};\n\n// ============================================================================\n// Sustainability — Compliance certifications\n// ============================================================================\n\nexport const useTheComplianceCerts = (\n assetId?: string,\n category?: TheComplianceCategory,\n status?: TheComplianceStatus,\n pagination?: PaginationInput\n) => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n return useQuery({\n queryKey: [\n ...KEY.compliance,\n assetId ?? null,\n category ?? null,\n status ?? null,\n pagination ?? null,\n ],\n queryFn: async () => {\n const data = await theQuery<{ theListComplianceCerts: TheConnection<TheComplianceCert> }>(\n `query TheListComplianceCerts($assetId: ID, $category: TheComplianceCategory, $status: TheComplianceStatus, $pagination: PaginationInput) {\n theListComplianceCerts(assetId: $assetId, category: $category, status: $status, pagination: $pagination) {\n items { ${COMPLIANCE_FIELDS} }\n pageInfo { cursor hasMore }\n }\n }`,\n { assetId, category, status, pagination: pagination ?? DEFAULT_PAGE },\n apiGatewayUrl\n );\n return data.theListComplianceCerts;\n },\n });\n};\n\nexport const useTheComplianceCert = (id: string | undefined) => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n return useQuery({\n queryKey: KEY.complianceCert(id ?? ''),\n enabled: Boolean(id),\n queryFn: async () => {\n const data = await theQuery<{ theComplianceCert: TheComplianceCert | null }>(\n `query TheComplianceCert($id: ID!) {\n theComplianceCert(id: $id) { ${COMPLIANCE_FIELDS} }\n }`,\n { id },\n apiGatewayUrl\n );\n return data.theComplianceCert;\n },\n });\n};\n\nexport const useTheCreateComplianceCert = () => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async (input: TheCreateComplianceCertInput) => {\n const data = await theQuery<{ theCreateComplianceCert: TheComplianceCert }>(\n `mutation TheCreateComplianceCert($input: TheCreateComplianceCertInput!) {\n theCreateComplianceCert(input: $input) { ${COMPLIANCE_FIELDS} }\n }`,\n { input },\n apiGatewayUrl\n );\n return data.theCreateComplianceCert;\n },\n onSuccess: () => qc.invalidateQueries({ queryKey: KEY.compliance }),\n });\n};\n\nexport const useTheTransitionComplianceCert = () => {\n const { apiGatewayUrl } = useTheGlobalFuel();\n const qc = useQueryClient();\n return useMutation({\n mutationFn: async ({ id, status }: { id: string; status: TheComplianceStatus }) => {\n const data = await theQuery<{ theTransitionComplianceCert: TheComplianceCert }>(\n `mutation TheTransitionComplianceCert($id: ID!, $status: TheComplianceStatus!) {\n theTransitionComplianceCert(id: $id, status: $status) { ${COMPLIANCE_FIELDS} }\n }`,\n { id, status },\n apiGatewayUrl\n );\n return data.theTransitionComplianceCert;\n },\n onSuccess: (c) => {\n qc.invalidateQueries({ queryKey: KEY.compliance });\n qc.invalidateQueries({ queryKey: KEY.complianceCert(c.id) });\n },\n });\n};\n"],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Alerts — operational, commercial and compliance exceptions.
3
+ * @module theglobalfuel/pages/alerts
4
+ *
5
+ * A deterministic rule engine over the live `the*` records. Every alert states
6
+ * the rule that produced it and links to the record that triggered it, so an
7
+ * operator can always answer "why am I seeing this" and act on it in one click.
8
+ *
9
+ * The rules run client-side over data already fetched for the rest of the
10
+ * product — no alert store, no polling job, and therefore no possibility of an
11
+ * alert disagreeing with the record it points at. Rules that would need history
12
+ * (trend breaks, anomaly detection) deliberately are NOT approximated here;
13
+ * those belong to the backend decision engine.
14
+ */
15
+ export declare function AlertsPage(): import("react").JSX.Element;
16
+ //# sourceMappingURL=AlertsPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AlertsPage.d.ts","sourceRoot":"","sources":["../../../../src/theglobalfuel/pages/alerts/AlertsPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAiFH,wBAAgB,UAAU,gCA8TzB"}
@@ -0,0 +1,295 @@
1
+ import { useTheGlobalFuel as e } from "../../context/TheGlobalFuelContext.js";
2
+ import { cn as t } from "../../utils/cn.js";
3
+ import { PageLayout as n } from "../../components/PageLayout.js";
4
+ import { formatDate as r, formatEnumLabel as i, formatNumber as a } from "../../utils/formatters.js";
5
+ import { ErrorView as o, LoadingView as s } from "../../components/StateViews.js";
6
+ import { EmptyState as c } from "../../components/EmptyState.js";
7
+ import "../../context/index.js";
8
+ import { useTheAssets as l, useTheComplianceCerts as u, useTheContracts as ee, useTheEmissionRecords as te, useTheInventoryLots as ne, useTheProductionRecords as d, useTheShipments as re } from "../../hooks/useTheGlobalFuelApi.js";
9
+ import { useThePageView as ie } from "../../hooks/useThePageView.js";
10
+ import { useTheTranslation as f } from "../../hooks/useTheTranslation.js";
11
+ import "../../hooks/index.js";
12
+ import { FilterTabs as p } from "../../components/FilterTabs.js";
13
+ import "../../components/index.js";
14
+ import { useMemo as m, useState as h } from "react";
15
+ import { BellRing as g, Boxes as _, FileSignature as v, Gauge as ae, Leaf as y, ShieldAlert as b, Ship as x } from "lucide-react";
16
+ import { jsx as S, jsxs as C } from "react/jsx-runtime";
17
+ import { GlassCard as w } from "@burdenoff/fe-libs/ui";
18
+ //#region src/theglobalfuel/pages/alerts/AlertsPage.tsx
19
+ var T = { limit: 200 }, E = 1440 * 60 * 1e3, D = 90, O = 30, k = 72, A = .75, j = 60, M = {
20
+ critical: 0,
21
+ warning: 1,
22
+ info: 2
23
+ }, N = {
24
+ critical: "border-status-error-border bg-status-error-bg-subtle text-status-error-text",
25
+ warning: "border-status-warning-border bg-status-warning-bg-subtle text-status-warning-text",
26
+ info: "border-border-seam bg-bg-sunken text-text-secondary"
27
+ }, P = {
28
+ critical: "Critical",
29
+ warning: "Warning",
30
+ info: "Info"
31
+ };
32
+ function F(e, t) {
33
+ return (new Date(e).getTime() - t) / E;
34
+ }
35
+ function oe(e, t) {
36
+ return (t - new Date(e).getTime()) / E;
37
+ }
38
+ function I() {
39
+ ie("alerts");
40
+ let E = f(), { navigateTo: I } = e(), [L] = h(() => Date.now()), R = l({ pagination: T }), z = d({ pagination: T }), B = te({ pagination: T }), V = u(void 0, void 0, void 0, T), H = ee({ pagination: T }), U = re(void 0, void 0, T), W = ne({ pagination: T }), G = [
41
+ R,
42
+ z,
43
+ B,
44
+ V,
45
+ H,
46
+ U,
47
+ W
48
+ ], K = G.some((e) => e.isLoading), se = G.every((e) => e.isError), q = m(() => {
49
+ let e = /* @__PURE__ */ new Map();
50
+ for (let t of R.data?.items ?? []) e.set(t.id, t.name);
51
+ return e;
52
+ }, [R.data]), J = m(() => {
53
+ let e = [];
54
+ for (let t of V.data?.items ?? []) {
55
+ let n = t.certNumber ? `${t.title} (${t.certNumber})` : t.title;
56
+ if (t.status === "EXPIRED" || t.status === "REVOKED") {
57
+ e.push({
58
+ id: `cert-status-${t.id}`,
59
+ severity: "critical",
60
+ category: "Compliance",
61
+ icon: /* @__PURE__ */ S(b, { className: "h-4 w-4" }),
62
+ title: `${i(t.category)} is ${i(t.status).toLowerCase()}`,
63
+ detail: n,
64
+ rule: "Certificate status is EXPIRED or REVOKED.",
65
+ route: "compliance"
66
+ });
67
+ continue;
68
+ }
69
+ if (!t.expiresAt) continue;
70
+ let o = F(t.expiresAt, L);
71
+ o < 0 ? e.push({
72
+ id: `cert-past-${t.id}`,
73
+ severity: "critical",
74
+ category: "Compliance",
75
+ icon: /* @__PURE__ */ S(b, { className: "h-4 w-4" }),
76
+ title: `${i(t.category)} expired ${a(Math.abs(Math.floor(o)))} days ago`,
77
+ detail: `${n} · expired ${r(t.expiresAt)}`,
78
+ rule: "Certificate expiry date is in the past but its status has not been updated.",
79
+ route: "compliance"
80
+ }) : o <= D && e.push({
81
+ id: `cert-soon-${t.id}`,
82
+ severity: "warning",
83
+ category: "Compliance",
84
+ icon: /* @__PURE__ */ S(b, { className: "h-4 w-4" }),
85
+ title: `${i(t.category)} expires in ${a(Math.floor(o))} days`,
86
+ detail: `${n} · expires ${r(t.expiresAt)}`,
87
+ rule: `Certificate expires within ${D} days.`,
88
+ route: "compliance"
89
+ });
90
+ }
91
+ for (let t of H.data?.items ?? []) {
92
+ if (t.contractedVolume <= 0) continue;
93
+ let n = t.deliveredVolume / t.contractedVolume;
94
+ if (n > 1 && e.push({
95
+ id: `contract-over-${t.id}`,
96
+ severity: "warning",
97
+ category: "Contracts",
98
+ icon: /* @__PURE__ */ S(v, { className: "h-4 w-4" }),
99
+ title: `${t.reference} is over-delivered`,
100
+ detail: `${a(t.deliveredVolume)} of ${a(t.contractedVolume)} ${i(t.unit)} delivered to ${t.counterparty}.`,
101
+ rule: "Delivered volume exceeds the contracted volume.",
102
+ route: `contracts/${t.id}`
103
+ }), (t.status === "ACTIVE" || t.status === "SIGNED") && t.endDate) {
104
+ let i = F(t.endDate, L);
105
+ i < 0 && n < 1 ? e.push({
106
+ id: `contract-lapsed-${t.id}`,
107
+ severity: "critical",
108
+ category: "Contracts",
109
+ icon: /* @__PURE__ */ S(v, { className: "h-4 w-4" }),
110
+ title: `${t.reference} passed its end date under-delivered`,
111
+ detail: `${Math.round(n * 100)}% delivered · ended ${r(t.endDate)}.`,
112
+ rule: "Contract end date has passed while the contract is still live and under-delivered.",
113
+ route: `contracts/${t.id}`
114
+ }) : i >= 0 && i <= j && n < A && e.push({
115
+ id: `contract-risk-${t.id}`,
116
+ severity: "warning",
117
+ category: "Contracts",
118
+ icon: /* @__PURE__ */ S(v, { className: "h-4 w-4" }),
119
+ title: `${t.reference} is behind schedule`,
120
+ detail: `${Math.round(n * 100)}% delivered with ${a(Math.floor(i))} days left.`,
121
+ rule: `Under ${Math.round(A * 100)}% delivered inside the final ${j} days.`,
122
+ route: `contracts/${t.id}`
123
+ });
124
+ }
125
+ }
126
+ for (let t of U.data?.items ?? []) {
127
+ if (t.status !== "IN_TRANSIT" && t.status !== "LOADING") continue;
128
+ let n = oe(t.departedAt ?? t.scheduledAt ?? t.createdAt, L);
129
+ n <= O || e.push({
130
+ id: `shipment-stalled-${t.id}`,
131
+ severity: "warning",
132
+ category: "Shipments",
133
+ icon: /* @__PURE__ */ S(x, { className: "h-4 w-4" }),
134
+ title: `${t.reference} has been ${i(t.status).toLowerCase()} for ${a(Math.floor(n))} days`,
135
+ detail: [
136
+ t.carrier,
137
+ t.trackingId,
138
+ [t.origin, t.destination].filter(Boolean).join(" → ")
139
+ ].filter(Boolean).join(" · "),
140
+ rule: `Shipment has been LOADING or IN_TRANSIT for more than ${O} days.`,
141
+ route: "shipments"
142
+ });
143
+ }
144
+ for (let t of z.data?.items ?? []) (t.downtimeHours ?? 0) < k || e.push({
145
+ id: `downtime-${t.id}`,
146
+ severity: "warning",
147
+ category: "Production",
148
+ icon: /* @__PURE__ */ S(ae, { className: "h-4 w-4" }),
149
+ title: `${a(t.downtimeHours)} h downtime recorded`,
150
+ detail: `${q.get(t.assetId) ?? t.assetId} · ${r(t.periodStart)} – ${r(t.periodEnd)}`,
151
+ rule: `A single production record carries at least ${k} hours of downtime.`,
152
+ route: `assets/${t.assetId}`
153
+ });
154
+ let t = (B.data?.items ?? []).filter((e) => !e.verified);
155
+ if (t.length > 0) {
156
+ let n = t.reduce((e, t) => e + (t.co2eTonnes ?? 0), 0);
157
+ e.push({
158
+ id: "emissions-unverified",
159
+ severity: "info",
160
+ category: "ESG",
161
+ icon: /* @__PURE__ */ S(y, { className: "h-4 w-4" }),
162
+ title: `${a(t.length)} emission records are not third-party verified`,
163
+ detail: `${a(n)} tCO₂e reported but unverified — these cannot be presented as assured in a disclosure.`,
164
+ rule: "Emission record has verified = false.",
165
+ route: "emissions"
166
+ });
167
+ }
168
+ let n = (W.data?.items ?? []).filter((e) => e.status === "WRITTEN_OFF");
169
+ return n.length > 0 && e.push({
170
+ id: "inventory-written-off",
171
+ severity: "info",
172
+ category: "Inventory",
173
+ icon: /* @__PURE__ */ S(_, { className: "h-4 w-4" }),
174
+ title: `${a(n.length)} inventory lots written off`,
175
+ detail: n.slice(0, 4).map((e) => e.lotCode).join(", "),
176
+ rule: "Inventory lot status is WRITTEN_OFF.",
177
+ route: "inventory"
178
+ }), e.sort((e, t) => M[e.severity] - M[t.severity] || e.title.localeCompare(t.title));
179
+ }, [
180
+ V.data,
181
+ H.data,
182
+ U.data,
183
+ z.data,
184
+ B.data,
185
+ W.data,
186
+ q,
187
+ L
188
+ ]), Y = m(() => ({
189
+ all: J.length,
190
+ critical: J.filter((e) => e.severity === "critical").length,
191
+ warning: J.filter((e) => e.severity === "warning").length,
192
+ info: J.filter((e) => e.severity === "info").length
193
+ }), [J]), [X, ce] = h("all"), le = [
194
+ {
195
+ value: "all",
196
+ label: "All",
197
+ count: Y.all
198
+ },
199
+ {
200
+ value: "critical",
201
+ label: "Critical",
202
+ count: Y.critical
203
+ },
204
+ {
205
+ value: "warning",
206
+ label: "Warning",
207
+ count: Y.warning
208
+ },
209
+ {
210
+ value: "info",
211
+ label: "Info",
212
+ count: Y.info
213
+ }
214
+ ], Z = X === "all" ? J : J.filter((e) => e.severity === X), Q = E("theglobalfuel.pages.alerts.description", "Compliance, commercial and operational exceptions detected across your records."), $ = E("theglobalfuel.pages.alerts.title", "Alerts");
215
+ return K ? /* @__PURE__ */ S(n, {
216
+ title: $,
217
+ description: Q,
218
+ dataTour: "theglobalfuel-alerts-page",
219
+ children: /* @__PURE__ */ S(s, { label: "Evaluating alert rules…" })
220
+ }) : se ? /* @__PURE__ */ S(n, {
221
+ title: $,
222
+ description: Q,
223
+ dataTour: "theglobalfuel-alerts-page",
224
+ children: /* @__PURE__ */ S(o, {
225
+ message: "Couldn't load the records alerts are evaluated over.",
226
+ onRetry: () => G.forEach((e) => void e.refetch())
227
+ })
228
+ }) : /* @__PURE__ */ S(n, {
229
+ title: $,
230
+ description: Q,
231
+ dataTour: "theglobalfuel-alerts-page",
232
+ actions: /* @__PURE__ */ S(p, {
233
+ options: le,
234
+ value: X,
235
+ onChange: ce
236
+ }),
237
+ children: J.length === 0 ? /* @__PURE__ */ S(c, {
238
+ illustration: "empty-notifications",
239
+ icon: /* @__PURE__ */ S(g, { className: "h-10 w-10" }),
240
+ title: "No open exceptions",
241
+ description: "No certificate is expiring, no contract is behind, no shipment is stalled and no production record shows significant downtime."
242
+ }) : Z.length === 0 ? /* @__PURE__ */ S(c, {
243
+ illustration: "empty-search",
244
+ icon: /* @__PURE__ */ S(g, { className: "h-10 w-10" }),
245
+ title: `No ${P[X].toLowerCase()} alerts`,
246
+ description: "Switch the filter to see the other severities."
247
+ }) : /* @__PURE__ */ S("div", {
248
+ className: "flex flex-col gap-3",
249
+ children: Z.map((e) => /* @__PURE__ */ S(w, {
250
+ treatment: "glass",
251
+ className: "p-0",
252
+ children: /* @__PURE__ */ C("button", {
253
+ type: "button",
254
+ onClick: () => I(e.route),
255
+ className: "flex w-full items-start gap-4 p-4 text-left transition-colors hover:bg-bg-sunken",
256
+ "aria-label": `Open the record for: ${e.title}`,
257
+ children: [/* @__PURE__ */ S("span", {
258
+ className: t("mt-0.5 flex size-9 shrink-0 items-center justify-center rounded-lg border", N[e.severity]),
259
+ children: e.icon
260
+ }), /* @__PURE__ */ C("div", {
261
+ className: "min-w-0 flex-1",
262
+ children: [
263
+ /* @__PURE__ */ C("div", {
264
+ className: "flex flex-wrap items-center gap-2",
265
+ children: [/* @__PURE__ */ S("span", {
266
+ className: t("rounded-full border px-2 py-0.5 text-xs font-medium", N[e.severity]),
267
+ children: P[e.severity]
268
+ }), /* @__PURE__ */ S("span", {
269
+ className: "text-xs uppercase tracking-wide text-text-tertiary",
270
+ children: e.category
271
+ })]
272
+ }),
273
+ /* @__PURE__ */ S("p", {
274
+ className: "mt-1.5 text-sm font-semibold text-text-primary",
275
+ children: e.title
276
+ }),
277
+ e.detail && /* @__PURE__ */ S("p", {
278
+ className: "mt-0.5 truncate text-sm text-text-secondary",
279
+ children: e.detail
280
+ }),
281
+ /* @__PURE__ */ C("p", {
282
+ className: "mt-1.5 text-xs text-text-tertiary",
283
+ children: ["Rule: ", e.rule]
284
+ })
285
+ ]
286
+ })]
287
+ })
288
+ }, e.id))
289
+ })
290
+ });
291
+ }
292
+ //#endregion
293
+ export { I as AlertsPage };
294
+
295
+ //# sourceMappingURL=AlertsPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AlertsPage.js","names":[],"sources":["../../../../src/theglobalfuel/pages/alerts/AlertsPage.tsx"],"sourcesContent":["/**\n * Alerts — operational, commercial and compliance exceptions.\n * @module theglobalfuel/pages/alerts\n *\n * A deterministic rule engine over the live `the*` records. Every alert states\n * the rule that produced it and links to the record that triggered it, so an\n * operator can always answer \"why am I seeing this\" and act on it in one click.\n *\n * The rules run client-side over data already fetched for the rest of the\n * product — no alert store, no polling job, and therefore no possibility of an\n * alert disagreeing with the record it points at. Rules that would need history\n * (trend breaks, anomaly detection) deliberately are NOT approximated here;\n * those belong to the backend decision engine.\n */\n\nimport { useMemo, useState } from 'react';\nimport { BellRing, ShieldAlert, Ship, FileSignature, Leaf, Gauge, Boxes } from 'lucide-react';\nimport { GlassCard } from '@burdenoff/fe-libs/ui';\nimport {\n PageLayout,\n LoadingView,\n ErrorView,\n EmptyState,\n FilterTabs,\n type FilterOption,\n} from '../../components';\nimport { useTheGlobalFuel } from '../../context';\nimport {\n useTheAssets,\n useTheProductionRecords,\n useTheEmissionRecords,\n useTheComplianceCerts,\n useTheContracts,\n useTheShipments,\n useTheInventoryLots,\n useThePageView,\n useTheTranslation,\n} from '../../hooks';\nimport { cn } from '../../utils/cn';\nimport { formatNumber, formatDate, formatEnumLabel } from '../../utils';\n\nconst PAGE: { limit: number } = { limit: 200 };\nconst DAY_MS = 24 * 60 * 60 * 1000;\n\n/** Days a certificate may have left before it is flagged. */\nconst CERT_EXPIRY_WARNING_DAYS = 90;\n/** Days a shipment may sit IN_TRANSIT before it is flagged as stalled. */\nconst SHIPMENT_STALE_DAYS = 30;\n/** Downtime hours in a single production record that count as significant. */\nconst DOWNTIME_ALERT_HOURS = 72;\n/** Fulfilment fraction a contract must reach when inside the closing window. */\nconst CONTRACT_AT_RISK_FRACTION = 0.75;\n/** Days before a contract's end date that its fulfilment starts being checked. */\nconst CONTRACT_CLOSING_DAYS = 60;\n\ntype Severity = 'critical' | 'warning' | 'info';\n\ninterface Alert {\n id: string;\n severity: Severity;\n category: string;\n icon: React.ReactNode;\n title: string;\n detail: string;\n /** The rule that produced this alert, shown verbatim to the operator. */\n rule: string;\n /** In-product route to the record that triggered the alert. */\n route: string;\n}\n\nconst SEVERITY_ORDER: Record<Severity, number> = { critical: 0, warning: 1, info: 2 };\n\nconst SEVERITY_STYLE: Record<Severity, string> = {\n critical: 'border-status-error-border bg-status-error-bg-subtle text-status-error-text',\n warning: 'border-status-warning-border bg-status-warning-bg-subtle text-status-warning-text',\n info: 'border-border-seam bg-bg-sunken text-text-secondary',\n};\n\nconst SEVERITY_LABEL: Record<Severity, string> = {\n critical: 'Critical',\n warning: 'Warning',\n info: 'Info',\n};\n\n/** Days from `now` until `iso`; negative when already past. */\nfunction daysUntil(iso: string, now: number): number {\n return (new Date(iso).getTime() - now) / DAY_MS;\n}\n\n/** Days elapsed between `iso` and `now`; negative when in the future. */\nfunction daysSince(iso: string, now: number): number {\n return (now - new Date(iso).getTime()) / DAY_MS;\n}\n\nexport function AlertsPage() {\n useThePageView('alerts');\n const t = useTheTranslation();\n const { navigateTo } = useTheGlobalFuel();\n // Every rule below is evaluated against one clock reading taken at mount, so\n // the whole alert set is internally consistent and cannot shift mid-render.\n const [evaluatedAt] = useState(() => Date.now());\n\n const assets = useTheAssets({ pagination: PAGE });\n const production = useTheProductionRecords({ pagination: PAGE });\n const emissions = useTheEmissionRecords({ pagination: PAGE });\n const compliance = useTheComplianceCerts(undefined, undefined, undefined, PAGE);\n const contracts = useTheContracts({ pagination: PAGE });\n const shipments = useTheShipments(undefined, undefined, PAGE);\n const inventory = useTheInventoryLots({ pagination: PAGE });\n\n const sources = [assets, production, emissions, compliance, contracts, shipments, inventory];\n const isLoading = sources.some((s) => s.isLoading);\n const isError = sources.every((s) => s.isError);\n\n const assetName = useMemo(() => {\n const map = new Map<string, string>();\n for (const a of assets.data?.items ?? []) map.set(a.id, a.name);\n return map;\n }, [assets.data]);\n\n const alerts = useMemo<Alert[]>(() => {\n const out: Alert[] = [];\n\n // ── Compliance: expired and expiring certificates ────────────────────────\n for (const cert of compliance.data?.items ?? []) {\n const label = cert.certNumber ? `${cert.title} (${cert.certNumber})` : cert.title;\n if (cert.status === 'EXPIRED' || cert.status === 'REVOKED') {\n out.push({\n id: `cert-status-${cert.id}`,\n severity: 'critical',\n category: 'Compliance',\n icon: <ShieldAlert className=\"h-4 w-4\" />,\n title: `${formatEnumLabel(cert.category)} is ${formatEnumLabel(cert.status).toLowerCase()}`,\n detail: label,\n rule: 'Certificate status is EXPIRED or REVOKED.',\n route: 'compliance',\n });\n continue;\n }\n if (!cert.expiresAt) continue;\n const left = daysUntil(cert.expiresAt, evaluatedAt);\n if (left < 0) {\n out.push({\n id: `cert-past-${cert.id}`,\n severity: 'critical',\n category: 'Compliance',\n icon: <ShieldAlert className=\"h-4 w-4\" />,\n title: `${formatEnumLabel(cert.category)} expired ${formatNumber(Math.abs(Math.floor(left)))} days ago`,\n detail: `${label} · expired ${formatDate(cert.expiresAt)}`,\n rule: 'Certificate expiry date is in the past but its status has not been updated.',\n route: 'compliance',\n });\n } else if (left <= CERT_EXPIRY_WARNING_DAYS) {\n out.push({\n id: `cert-soon-${cert.id}`,\n severity: 'warning',\n category: 'Compliance',\n icon: <ShieldAlert className=\"h-4 w-4\" />,\n title: `${formatEnumLabel(cert.category)} expires in ${formatNumber(Math.floor(left))} days`,\n detail: `${label} · expires ${formatDate(cert.expiresAt)}`,\n rule: `Certificate expires within ${CERT_EXPIRY_WARNING_DAYS} days.`,\n route: 'compliance',\n });\n }\n }\n\n // ── Commerce: contracts at risk and over-delivered ───────────────────────\n for (const c of contracts.data?.items ?? []) {\n if (c.contractedVolume <= 0) continue;\n const fraction = c.deliveredVolume / c.contractedVolume;\n\n if (fraction > 1) {\n out.push({\n id: `contract-over-${c.id}`,\n severity: 'warning',\n category: 'Contracts',\n icon: <FileSignature className=\"h-4 w-4\" />,\n title: `${c.reference} is over-delivered`,\n detail: `${formatNumber(c.deliveredVolume)} of ${formatNumber(c.contractedVolume)} ${formatEnumLabel(c.unit)} delivered to ${c.counterparty}.`,\n rule: 'Delivered volume exceeds the contracted volume.',\n route: `contracts/${c.id}`,\n });\n }\n\n if ((c.status === 'ACTIVE' || c.status === 'SIGNED') && c.endDate) {\n const left = daysUntil(c.endDate, evaluatedAt);\n if (left < 0 && fraction < 1) {\n out.push({\n id: `contract-lapsed-${c.id}`,\n severity: 'critical',\n category: 'Contracts',\n icon: <FileSignature className=\"h-4 w-4\" />,\n title: `${c.reference} passed its end date under-delivered`,\n detail: `${Math.round(fraction * 100)}% delivered · ended ${formatDate(c.endDate)}.`,\n rule: 'Contract end date has passed while the contract is still live and under-delivered.',\n route: `contracts/${c.id}`,\n });\n } else if (\n left >= 0 &&\n left <= CONTRACT_CLOSING_DAYS &&\n fraction < CONTRACT_AT_RISK_FRACTION\n ) {\n out.push({\n id: `contract-risk-${c.id}`,\n severity: 'warning',\n category: 'Contracts',\n icon: <FileSignature className=\"h-4 w-4\" />,\n title: `${c.reference} is behind schedule`,\n detail: `${Math.round(fraction * 100)}% delivered with ${formatNumber(Math.floor(left))} days left.`,\n rule: `Under ${Math.round(CONTRACT_AT_RISK_FRACTION * 100)}% delivered inside the final ${CONTRACT_CLOSING_DAYS} days.`,\n route: `contracts/${c.id}`,\n });\n }\n }\n }\n\n // ── Logistics: stalled movements ─────────────────────────────────────────\n for (const s of shipments.data?.items ?? []) {\n if (s.status !== 'IN_TRANSIT' && s.status !== 'LOADING') continue;\n const reference = s.departedAt ?? s.scheduledAt ?? s.createdAt;\n const elapsed = daysSince(reference, evaluatedAt);\n if (elapsed <= SHIPMENT_STALE_DAYS) continue;\n out.push({\n id: `shipment-stalled-${s.id}`,\n severity: 'warning',\n category: 'Shipments',\n icon: <Ship className=\"h-4 w-4\" />,\n title: `${s.reference} has been ${formatEnumLabel(s.status).toLowerCase()} for ${formatNumber(Math.floor(elapsed))} days`,\n detail: [s.carrier, s.trackingId, [s.origin, s.destination].filter(Boolean).join(' → ')]\n .filter(Boolean)\n .join(' · '),\n rule: `Shipment has been LOADING or IN_TRANSIT for more than ${SHIPMENT_STALE_DAYS} days.`,\n route: 'shipments',\n });\n }\n\n // ── Production: significant downtime ─────────────────────────────────────\n for (const r of production.data?.items ?? []) {\n if ((r.downtimeHours ?? 0) < DOWNTIME_ALERT_HOURS) continue;\n out.push({\n id: `downtime-${r.id}`,\n severity: 'warning',\n category: 'Production',\n icon: <Gauge className=\"h-4 w-4\" />,\n title: `${formatNumber(r.downtimeHours)} h downtime recorded`,\n detail: `${assetName.get(r.assetId) ?? r.assetId} · ${formatDate(r.periodStart)} – ${formatDate(r.periodEnd)}`,\n rule: `A single production record carries at least ${DOWNTIME_ALERT_HOURS} hours of downtime.`,\n route: `assets/${r.assetId}`,\n });\n }\n\n // ── ESG: unverified emissions ────────────────────────────────────────────\n const emissionRows = emissions.data?.items ?? [];\n const unverified = emissionRows.filter((e) => !e.verified);\n if (unverified.length > 0) {\n const tonnes = unverified.reduce((sum, e) => sum + (e.co2eTonnes ?? 0), 0);\n out.push({\n id: 'emissions-unverified',\n severity: 'info',\n category: 'ESG',\n icon: <Leaf className=\"h-4 w-4\" />,\n title: `${formatNumber(unverified.length)} emission records are not third-party verified`,\n detail: `${formatNumber(tonnes)} tCO₂e reported but unverified — these cannot be presented as assured in a disclosure.`,\n rule: 'Emission record has verified = false.',\n route: 'emissions',\n });\n }\n\n // ── Inventory: written-off lots ──────────────────────────────────────────\n const writtenOff = (inventory.data?.items ?? []).filter((l) => l.status === 'WRITTEN_OFF');\n if (writtenOff.length > 0) {\n out.push({\n id: 'inventory-written-off',\n severity: 'info',\n category: 'Inventory',\n icon: <Boxes className=\"h-4 w-4\" />,\n title: `${formatNumber(writtenOff.length)} inventory lots written off`,\n detail: writtenOff\n .slice(0, 4)\n .map((l) => l.lotCode)\n .join(', '),\n rule: 'Inventory lot status is WRITTEN_OFF.',\n route: 'inventory',\n });\n }\n\n return out.sort(\n (a, b) =>\n SEVERITY_ORDER[a.severity] - SEVERITY_ORDER[b.severity] || a.title.localeCompare(b.title)\n );\n }, [\n compliance.data,\n contracts.data,\n shipments.data,\n production.data,\n emissions.data,\n inventory.data,\n assetName,\n evaluatedAt,\n ]);\n\n const counts = useMemo(\n () => ({\n all: alerts.length,\n critical: alerts.filter((a) => a.severity === 'critical').length,\n warning: alerts.filter((a) => a.severity === 'warning').length,\n info: alerts.filter((a) => a.severity === 'info').length,\n }),\n [alerts]\n );\n\n const [filter, setFilter] = useState<Severity | 'all'>('all');\n const filterOptions: FilterOption<Severity | 'all'>[] = [\n { value: 'all', label: 'All', count: counts.all },\n { value: 'critical', label: 'Critical', count: counts.critical },\n { value: 'warning', label: 'Warning', count: counts.warning },\n { value: 'info', label: 'Info', count: counts.info },\n ];\n\n const visible = filter === 'all' ? alerts : alerts.filter((a) => a.severity === filter);\n\n const description = t(\n 'theglobalfuel.pages.alerts.description',\n 'Compliance, commercial and operational exceptions detected across your records.'\n );\n const pageTitle = t('theglobalfuel.pages.alerts.title', 'Alerts');\n\n if (isLoading) {\n return (\n <PageLayout title={pageTitle} description={description} dataTour=\"theglobalfuel-alerts-page\">\n <LoadingView label=\"Evaluating alert rules…\" />\n </PageLayout>\n );\n }\n\n if (isError) {\n return (\n <PageLayout title={pageTitle} description={description} dataTour=\"theglobalfuel-alerts-page\">\n <ErrorView\n message=\"Couldn't load the records alerts are evaluated over.\"\n onRetry={() => sources.forEach((s) => void s.refetch())}\n />\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title={pageTitle}\n description={description}\n dataTour=\"theglobalfuel-alerts-page\"\n actions={<FilterTabs options={filterOptions} value={filter} onChange={setFilter} />}\n >\n {alerts.length === 0 ? (\n <EmptyState\n illustration=\"empty-notifications\"\n icon={<BellRing className=\"h-10 w-10\" />}\n title=\"No open exceptions\"\n description=\"No certificate is expiring, no contract is behind, no shipment is stalled and no production record shows significant downtime.\"\n />\n ) : visible.length === 0 ? (\n <EmptyState\n illustration=\"empty-search\"\n icon={<BellRing className=\"h-10 w-10\" />}\n title={`No ${SEVERITY_LABEL[filter as Severity].toLowerCase()} alerts`}\n description=\"Switch the filter to see the other severities.\"\n />\n ) : (\n <div className=\"flex flex-col gap-3\">\n {visible.map((alert) => (\n <GlassCard key={alert.id} treatment=\"glass\" className=\"p-0\">\n <button\n type=\"button\"\n onClick={() => navigateTo(alert.route)}\n className=\"flex w-full items-start gap-4 p-4 text-left transition-colors hover:bg-bg-sunken\"\n aria-label={`Open the record for: ${alert.title}`}\n >\n <span\n className={cn(\n 'mt-0.5 flex size-9 shrink-0 items-center justify-center rounded-lg border',\n SEVERITY_STYLE[alert.severity]\n )}\n >\n {alert.icon}\n </span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <span\n className={cn(\n 'rounded-full border px-2 py-0.5 text-xs font-medium',\n SEVERITY_STYLE[alert.severity]\n )}\n >\n {SEVERITY_LABEL[alert.severity]}\n </span>\n <span className=\"text-xs uppercase tracking-wide text-text-tertiary\">\n {alert.category}\n </span>\n </div>\n <p className=\"mt-1.5 text-sm font-semibold text-text-primary\">{alert.title}</p>\n {alert.detail && (\n <p className=\"mt-0.5 truncate text-sm text-text-secondary\">{alert.detail}</p>\n )}\n <p className=\"mt-1.5 text-xs text-text-tertiary\">Rule: {alert.rule}</p>\n </div>\n </button>\n </GlassCard>\n ))}\n </div>\n )}\n </PageLayout>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Operational Analytics — utilization, fulfilment and movement performance.
3
+ * @module theglobalfuel/pages/analytics
4
+ *
5
+ * Where the dashboard answers "what is my portfolio", this page answers "how
6
+ * well is it running". Every figure is aggregated client-side from the same
7
+ * real `the*` list endpoints the rest of the product uses — there is no
8
+ * separate analytics store and no mock data. The window selector re-slices the
9
+ * already-fetched production/shipment rows rather than refetching, so switching
10
+ * periods is instant and costs no extra backend calls.
11
+ */
12
+ export declare function AnalyticsPage(): import("react").JSX.Element;
13
+ //# sourceMappingURL=AnalyticsPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnalyticsPage.d.ts","sourceRoot":"","sources":["../../../../src/theglobalfuel/pages/analytics/AnalyticsPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAqFH,wBAAgB,aAAa,gCA0Z5B"}