@burdenoff/microfe-assethandler 2026.826.2 → 2026.826.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (571) hide show
  1. package/dist/_virtual/_rolldown/runtime.js +1 -1
  2. package/dist/assethandler/AssetHandlerRoot.js.map +1 -1
  3. package/dist/assethandler/AssetHandlerRoutes.js.map +1 -1
  4. package/dist/assethandler/components/ActivityTimeline.js.map +1 -1
  5. package/dist/assethandler/components/AttachmentsPanel.js.map +1 -1
  6. package/dist/assethandler/components/ChartCard.js.map +1 -1
  7. package/dist/assethandler/components/CommentsPanel.js.map +1 -1
  8. package/dist/assethandler/components/NotFoundState.js.map +1 -1
  9. package/dist/assethandler/components/Pagination.js.map +1 -1
  10. package/dist/assethandler/components/SectionHeader.js.map +1 -1
  11. package/dist/assethandler/components/StatTile.js.map +1 -1
  12. package/dist/assethandler/components/charts/BarsChart.js.map +1 -1
  13. package/dist/assethandler/components/charts/ChartParts.js.map +1 -1
  14. package/dist/assethandler/components/charts/DonutChart.js.map +1 -1
  15. package/dist/assethandler/components/charts/ProgressMeter.js.map +1 -1
  16. package/dist/assethandler/components/charts/RadialGauge.js.map +1 -1
  17. package/dist/assethandler/components/charts/Sparkline.js.map +1 -1
  18. package/dist/assethandler/components/charts/TrendChart.js.map +1 -1
  19. package/dist/assethandler/components/charts/chartTheme.js.map +1 -1
  20. package/dist/assethandler/hooks/useAssetHandlerNavigate.js.map +1 -1
  21. package/dist/assethandler/hooks/useCopy.js.map +1 -1
  22. package/dist/assethandler/hooks/useMaintenancePlans.js.map +1 -1
  23. package/dist/assethandler/ops/MaintenancePlanDialog.js.map +1 -1
  24. package/dist/assethandler/ops/NewWorkOrderDialog.js.map +1 -1
  25. package/dist/assethandler/ops/ScheduleMaintenanceDialog.js.map +1 -1
  26. package/dist/assethandler/pages/AiPredictionsPage.js.map +1 -1
  27. package/dist/assethandler/pages/AnalyticsPage.js.map +1 -1
  28. package/dist/assethandler/pages/AssetsAssetCategoriesPage.js.map +1 -1
  29. package/dist/assethandler/pages/AssetsAssetCheckInOutPage.js.map +1 -1
  30. package/dist/assethandler/pages/AssetsAssetCreatePage.js.map +1 -1
  31. package/dist/assethandler/pages/AssetsAssetDetailPage.js.map +1 -1
  32. package/dist/assethandler/pages/AssetsAssetListPage.js.map +1 -1
  33. package/dist/assethandler/pages/AssetsAssetTrackingPage.js.map +1 -1
  34. package/dist/assethandler/pages/CmdbBrowserPage.js.map +1 -1
  35. package/dist/assethandler/pages/DashboardPage.js.map +1 -1
  36. package/dist/assethandler/pages/DigitalTwinPage.js.map +1 -1
  37. package/dist/assethandler/pages/DiscoveryJobsPage.js.map +1 -1
  38. package/dist/assethandler/pages/EsgDashboardPage.js.map +1 -1
  39. package/dist/assethandler/pages/FinanceBudgetDetailPage.js.map +1 -1
  40. package/dist/assethandler/pages/FinanceFinanceHubPage.js.map +1 -1
  41. package/dist/assethandler/pages/FinanceInvoiceDetailPage.js.map +1 -1
  42. package/dist/assethandler/pages/IotDevicesPage.js.map +1 -1
  43. package/dist/assethandler/pages/ItilChangeDetailPage.js.map +1 -1
  44. package/dist/assethandler/pages/ItilChangeManagementPage.js.map +1 -1
  45. package/dist/assethandler/pages/ItilDialogs.js.map +1 -1
  46. package/dist/assethandler/pages/ItilIncidentDetailPage.js.map +1 -1
  47. package/dist/assethandler/pages/ItilIncidentManagementPage.js.map +1 -1
  48. package/dist/assethandler/pages/ItilItilhubPage.js.map +1 -1
  49. package/dist/assethandler/pages/ItilProblemDetailPage.js.map +1 -1
  50. package/dist/assethandler/pages/ItilProblemManagementPage.js.map +1 -1
  51. package/dist/assethandler/pages/KnowledgeBasePage.js.map +1 -1
  52. package/dist/assethandler/pages/MaintenanceMaintenanceCalendarPage.js.map +1 -1
  53. package/dist/assethandler/pages/MaintenanceMaintenancePlansPage.d.ts.map +1 -1
  54. package/dist/assethandler/pages/MaintenanceMaintenancePlansPage.js +1 -1
  55. package/dist/assethandler/pages/MaintenanceMaintenancePlansPage.js.map +1 -1
  56. package/dist/assethandler/pages/MaintenanceMaintenanceSchedulerPage.js.map +1 -1
  57. package/dist/assethandler/pages/OperationsMaintenanceDetailPage.js.map +1 -1
  58. package/dist/assethandler/pages/OperationsOperationsHubPage.js.map +1 -1
  59. package/dist/assethandler/pages/OperationsWorkOrderDetailPage.js.map +1 -1
  60. package/dist/assethandler/pages/PortfolioPortfolioOverviewPage.js.map +1 -1
  61. package/dist/assethandler/pages/ProvenancePage.js.map +1 -1
  62. package/dist/assethandler/pages/ReportsDashboardPage.js.map +1 -1
  63. package/dist/assethandler/pages/SamLicensesPage.js.map +1 -1
  64. package/dist/assethandler/pages/SecurityComplianceDetailPage.js.map +1 -1
  65. package/dist/assethandler/pages/SecurityPolicyDetailPage.js.map +1 -1
  66. package/dist/assethandler/pages/SecuritySecurityEventDetailPage.js.map +1 -1
  67. package/dist/assethandler/pages/SecuritySecurityHubPage.js.map +1 -1
  68. package/dist/assethandler/pages/TransactionsTransactionDetailPage.js.map +1 -1
  69. package/dist/assethandler/pages/TransactionsTransactionListPage.js.map +1 -1
  70. package/dist/assethandler/providers/AssetHandlerProvider.js.map +1 -1
  71. package/dist/assethandler/store/assethandlerStore.js.map +1 -1
  72. package/dist/assethandler/utils/categoryPresentation.js.map +1 -1
  73. package/dist/assethandler/utils/cn.js.map +1 -1
  74. package/dist/assethandler/utils/csv.js.map +1 -1
  75. package/dist/assethandler/utils/i18n.js.map +1 -1
  76. package/dist/assethandler/utils/knowledgeBase.js.map +1 -1
  77. package/dist/assethandler/utils/meter.js.map +1 -1
  78. package/dist/assethandler/utils/money.js.map +1 -1
  79. package/dist/assethandler/utils/navigation.js.map +1 -1
  80. package/dist/assethandler/utils/printAssetTag.js.map +1 -1
  81. package/dist/assethandler/utils/toast.js.map +1 -1
  82. package/dist/node_modules/clsx/dist/clsx.js.map +1 -1
  83. package/dist/node_modules/d3-array/src/ascending.js.map +1 -1
  84. package/dist/node_modules/d3-array/src/bisect.js.map +1 -1
  85. package/dist/node_modules/d3-array/src/bisector.js.map +1 -1
  86. package/dist/node_modules/d3-array/src/descending.js.map +1 -1
  87. package/dist/node_modules/d3-array/src/max.js.map +1 -1
  88. package/dist/node_modules/d3-array/src/min.js.map +1 -1
  89. package/dist/node_modules/d3-array/src/number.js.map +1 -1
  90. package/dist/node_modules/d3-array/src/quantile.js.map +1 -1
  91. package/dist/node_modules/d3-array/src/quickselect.js.map +1 -1
  92. package/dist/node_modules/d3-array/src/range.js.map +1 -1
  93. package/dist/node_modules/d3-array/src/sort.js.map +1 -1
  94. package/dist/node_modules/d3-array/src/ticks.js.map +1 -1
  95. package/dist/node_modules/d3-color/src/color.js.map +1 -1
  96. package/dist/node_modules/d3-color/src/define.js.map +1 -1
  97. package/dist/node_modules/d3-format/src/defaultLocale.js.map +1 -1
  98. package/dist/node_modules/d3-format/src/exponent.js.map +1 -1
  99. package/dist/node_modules/d3-format/src/formatDecimal.js.map +1 -1
  100. package/dist/node_modules/d3-format/src/formatGroup.js.map +1 -1
  101. package/dist/node_modules/d3-format/src/formatNumerals.js.map +1 -1
  102. package/dist/node_modules/d3-format/src/formatPrefixAuto.js.map +1 -1
  103. package/dist/node_modules/d3-format/src/formatRounded.js.map +1 -1
  104. package/dist/node_modules/d3-format/src/formatSpecifier.js.map +1 -1
  105. package/dist/node_modules/d3-format/src/formatTrim.js.map +1 -1
  106. package/dist/node_modules/d3-format/src/formatTypes.js.map +1 -1
  107. package/dist/node_modules/d3-format/src/identity.js.map +1 -1
  108. package/dist/node_modules/d3-format/src/locale.js.map +1 -1
  109. package/dist/node_modules/d3-format/src/precisionFixed.js.map +1 -1
  110. package/dist/node_modules/d3-format/src/precisionPrefix.js.map +1 -1
  111. package/dist/node_modules/d3-format/src/precisionRound.js.map +1 -1
  112. package/dist/node_modules/d3-interpolate/src/array.js.map +1 -1
  113. package/dist/node_modules/d3-interpolate/src/basis.js.map +1 -1
  114. package/dist/node_modules/d3-interpolate/src/basisClosed.js.map +1 -1
  115. package/dist/node_modules/d3-interpolate/src/color.js.map +1 -1
  116. package/dist/node_modules/d3-interpolate/src/date.js.map +1 -1
  117. package/dist/node_modules/d3-interpolate/src/number.js.map +1 -1
  118. package/dist/node_modules/d3-interpolate/src/numberArray.js.map +1 -1
  119. package/dist/node_modules/d3-interpolate/src/object.js.map +1 -1
  120. package/dist/node_modules/d3-interpolate/src/piecewise.js.map +1 -1
  121. package/dist/node_modules/d3-interpolate/src/rgb.js.map +1 -1
  122. package/dist/node_modules/d3-interpolate/src/round.js.map +1 -1
  123. package/dist/node_modules/d3-interpolate/src/string.js.map +1 -1
  124. package/dist/node_modules/d3-interpolate/src/value.js.map +1 -1
  125. package/dist/node_modules/d3-path/src/path.js.map +1 -1
  126. package/dist/node_modules/d3-scale/src/band.js.map +1 -1
  127. package/dist/node_modules/d3-scale/src/constant.js.map +1 -1
  128. package/dist/node_modules/d3-scale/src/continuous.js.map +1 -1
  129. package/dist/node_modules/d3-scale/src/diverging.js.map +1 -1
  130. package/dist/node_modules/d3-scale/src/identity.js.map +1 -1
  131. package/dist/node_modules/d3-scale/src/init.js.map +1 -1
  132. package/dist/node_modules/d3-scale/src/linear.js.map +1 -1
  133. package/dist/node_modules/d3-scale/src/log.js.map +1 -1
  134. package/dist/node_modules/d3-scale/src/nice.js.map +1 -1
  135. package/dist/node_modules/d3-scale/src/number.js.map +1 -1
  136. package/dist/node_modules/d3-scale/src/ordinal.js.map +1 -1
  137. package/dist/node_modules/d3-scale/src/pow.js.map +1 -1
  138. package/dist/node_modules/d3-scale/src/quantile.js.map +1 -1
  139. package/dist/node_modules/d3-scale/src/quantize.js.map +1 -1
  140. package/dist/node_modules/d3-scale/src/radial.js.map +1 -1
  141. package/dist/node_modules/d3-scale/src/sequential.js.map +1 -1
  142. package/dist/node_modules/d3-scale/src/sequentialQuantile.js.map +1 -1
  143. package/dist/node_modules/d3-scale/src/symlog.js.map +1 -1
  144. package/dist/node_modules/d3-scale/src/threshold.js.map +1 -1
  145. package/dist/node_modules/d3-scale/src/tickFormat.js.map +1 -1
  146. package/dist/node_modules/d3-scale/src/time.js.map +1 -1
  147. package/dist/node_modules/d3-scale/src/utcTime.js.map +1 -1
  148. package/dist/node_modules/d3-shape/src/area.js.map +1 -1
  149. package/dist/node_modules/d3-shape/src/array.js.map +1 -1
  150. package/dist/node_modules/d3-shape/src/constant.js.map +1 -1
  151. package/dist/node_modules/d3-shape/src/curve/basis.js.map +1 -1
  152. package/dist/node_modules/d3-shape/src/curve/basisClosed.js.map +1 -1
  153. package/dist/node_modules/d3-shape/src/curve/basisOpen.js.map +1 -1
  154. package/dist/node_modules/d3-shape/src/curve/bump.js.map +1 -1
  155. package/dist/node_modules/d3-shape/src/curve/linear.js.map +1 -1
  156. package/dist/node_modules/d3-shape/src/curve/linearClosed.js.map +1 -1
  157. package/dist/node_modules/d3-shape/src/curve/monotone.js.map +1 -1
  158. package/dist/node_modules/d3-shape/src/curve/natural.js.map +1 -1
  159. package/dist/node_modules/d3-shape/src/curve/step.js.map +1 -1
  160. package/dist/node_modules/d3-shape/src/line.js.map +1 -1
  161. package/dist/node_modules/d3-shape/src/noop.js.map +1 -1
  162. package/dist/node_modules/d3-shape/src/offset/expand.js.map +1 -1
  163. package/dist/node_modules/d3-shape/src/offset/none.js.map +1 -1
  164. package/dist/node_modules/d3-shape/src/offset/silhouette.js.map +1 -1
  165. package/dist/node_modules/d3-shape/src/offset/wiggle.js.map +1 -1
  166. package/dist/node_modules/d3-shape/src/order/none.js.map +1 -1
  167. package/dist/node_modules/d3-shape/src/path.js.map +1 -1
  168. package/dist/node_modules/d3-shape/src/point.js.map +1 -1
  169. package/dist/node_modules/d3-shape/src/stack.js.map +1 -1
  170. package/dist/node_modules/d3-shape/src/symbol/circle.js.map +1 -1
  171. package/dist/node_modules/d3-shape/src/symbol/cross.js.map +1 -1
  172. package/dist/node_modules/d3-shape/src/symbol/diamond.js.map +1 -1
  173. package/dist/node_modules/d3-shape/src/symbol/square.js.map +1 -1
  174. package/dist/node_modules/d3-shape/src/symbol/star.js.map +1 -1
  175. package/dist/node_modules/d3-shape/src/symbol/triangle.js.map +1 -1
  176. package/dist/node_modules/d3-shape/src/symbol/wye.js.map +1 -1
  177. package/dist/node_modules/d3-shape/src/symbol.js.map +1 -1
  178. package/dist/node_modules/d3-time/src/day.js.map +1 -1
  179. package/dist/node_modules/d3-time/src/hour.js.map +1 -1
  180. package/dist/node_modules/d3-time/src/interval.js.map +1 -1
  181. package/dist/node_modules/d3-time/src/millisecond.js.map +1 -1
  182. package/dist/node_modules/d3-time/src/minute.js.map +1 -1
  183. package/dist/node_modules/d3-time/src/month.js.map +1 -1
  184. package/dist/node_modules/d3-time/src/second.js.map +1 -1
  185. package/dist/node_modules/d3-time/src/ticks.js.map +1 -1
  186. package/dist/node_modules/d3-time/src/week.js.map +1 -1
  187. package/dist/node_modules/d3-time/src/year.js.map +1 -1
  188. package/dist/node_modules/d3-time-format/src/defaultLocale.js.map +1 -1
  189. package/dist/node_modules/d3-time-format/src/locale.js.map +1 -1
  190. package/dist/node_modules/decimal.js-light/decimal.js.map +1 -1
  191. package/dist/node_modules/dijkstrajs/dijkstra.js.map +1 -1
  192. package/dist/node_modules/eventemitter3/index.js.map +1 -1
  193. package/dist/node_modules/fast-equals/dist/es/index.js.map +1 -1
  194. package/dist/node_modules/internmap/src/index.js.map +1 -1
  195. package/dist/node_modules/lodash/_DataView.js.map +1 -1
  196. package/dist/node_modules/lodash/_Hash.js.map +1 -1
  197. package/dist/node_modules/lodash/_ListCache.js.map +1 -1
  198. package/dist/node_modules/lodash/_Map.js.map +1 -1
  199. package/dist/node_modules/lodash/_MapCache.js.map +1 -1
  200. package/dist/node_modules/lodash/_Promise.js.map +1 -1
  201. package/dist/node_modules/lodash/_Set.js.map +1 -1
  202. package/dist/node_modules/lodash/_SetCache.js.map +1 -1
  203. package/dist/node_modules/lodash/_Stack.js +2 -1
  204. package/dist/node_modules/lodash/_Stack.js.map +1 -1
  205. package/dist/node_modules/lodash/_Symbol.js.map +1 -1
  206. package/dist/node_modules/lodash/_Uint8Array.js.map +1 -1
  207. package/dist/node_modules/lodash/_WeakMap.js.map +1 -1
  208. package/dist/node_modules/lodash/_apply.js.map +1 -1
  209. package/dist/node_modules/lodash/_arrayEvery.js.map +1 -1
  210. package/dist/node_modules/lodash/_arrayFilter.js.map +1 -1
  211. package/dist/node_modules/lodash/_arrayIncludes.js.map +1 -1
  212. package/dist/node_modules/lodash/_arrayIncludesWith.js.map +1 -1
  213. package/dist/node_modules/lodash/_arrayLikeKeys.js.map +1 -1
  214. package/dist/node_modules/lodash/_arrayMap.js.map +1 -1
  215. package/dist/node_modules/lodash/_arrayPush.js.map +1 -1
  216. package/dist/node_modules/lodash/_arraySome.js.map +1 -1
  217. package/dist/node_modules/lodash/_asciiToArray.js.map +1 -1
  218. package/dist/node_modules/lodash/_assocIndexOf.js.map +1 -1
  219. package/dist/node_modules/lodash/_baseAssignValue.js.map +1 -1
  220. package/dist/node_modules/lodash/_baseEach.js.map +1 -1
  221. package/dist/node_modules/lodash/_baseEvery.js.map +1 -1
  222. package/dist/node_modules/lodash/_baseExtremum.js.map +1 -1
  223. package/dist/node_modules/lodash/_baseFindIndex.js.map +1 -1
  224. package/dist/node_modules/lodash/_baseFlatten.js.map +1 -1
  225. package/dist/node_modules/lodash/_baseFor.js.map +1 -1
  226. package/dist/node_modules/lodash/_baseForOwn.js.map +1 -1
  227. package/dist/node_modules/lodash/_baseGet.js.map +1 -1
  228. package/dist/node_modules/lodash/_baseGetAllKeys.js.map +1 -1
  229. package/dist/node_modules/lodash/_baseGetTag.js.map +1 -1
  230. package/dist/node_modules/lodash/_baseGt.js.map +1 -1
  231. package/dist/node_modules/lodash/_baseHasIn.js.map +1 -1
  232. package/dist/node_modules/lodash/_baseIndexOf.js.map +1 -1
  233. package/dist/node_modules/lodash/_baseIsArguments.js.map +1 -1
  234. package/dist/node_modules/lodash/_baseIsEqual.js.map +1 -1
  235. package/dist/node_modules/lodash/_baseIsEqualDeep.js.map +1 -1
  236. package/dist/node_modules/lodash/_baseIsMatch.js.map +1 -1
  237. package/dist/node_modules/lodash/_baseIsNaN.js.map +1 -1
  238. package/dist/node_modules/lodash/_baseIsNative.js.map +1 -1
  239. package/dist/node_modules/lodash/_baseIsTypedArray.js.map +1 -1
  240. package/dist/node_modules/lodash/_baseIteratee.js.map +1 -1
  241. package/dist/node_modules/lodash/_baseKeys.js.map +1 -1
  242. package/dist/node_modules/lodash/_baseLt.js.map +1 -1
  243. package/dist/node_modules/lodash/_baseMap.js.map +1 -1
  244. package/dist/node_modules/lodash/_baseMatches.js.map +1 -1
  245. package/dist/node_modules/lodash/_baseMatchesProperty.js.map +1 -1
  246. package/dist/node_modules/lodash/_baseOrderBy.js.map +1 -1
  247. package/dist/node_modules/lodash/_baseProperty.js.map +1 -1
  248. package/dist/node_modules/lodash/_basePropertyDeep.js.map +1 -1
  249. package/dist/node_modules/lodash/_baseRange.js.map +1 -1
  250. package/dist/node_modules/lodash/_baseRest.js.map +1 -1
  251. package/dist/node_modules/lodash/_baseSetToString.js.map +1 -1
  252. package/dist/node_modules/lodash/_baseSlice.js.map +1 -1
  253. package/dist/node_modules/lodash/_baseSome.js.map +1 -1
  254. package/dist/node_modules/lodash/_baseSortBy.js.map +1 -1
  255. package/dist/node_modules/lodash/_baseTimes.js.map +1 -1
  256. package/dist/node_modules/lodash/_baseToString.js.map +1 -1
  257. package/dist/node_modules/lodash/_baseTrim.js.map +1 -1
  258. package/dist/node_modules/lodash/_baseUnary.js.map +1 -1
  259. package/dist/node_modules/lodash/_baseUniq.js.map +1 -1
  260. package/dist/node_modules/lodash/_cacheHas.js.map +1 -1
  261. package/dist/node_modules/lodash/_castPath.js.map +1 -1
  262. package/dist/node_modules/lodash/_castSlice.js.map +1 -1
  263. package/dist/node_modules/lodash/_compareAscending.js.map +1 -1
  264. package/dist/node_modules/lodash/_compareMultiple.js.map +1 -1
  265. package/dist/node_modules/lodash/_coreJsData.js.map +1 -1
  266. package/dist/node_modules/lodash/_createBaseEach.js.map +1 -1
  267. package/dist/node_modules/lodash/_createBaseFor.js.map +1 -1
  268. package/dist/node_modules/lodash/_createCaseFirst.js.map +1 -1
  269. package/dist/node_modules/lodash/_createFind.js.map +1 -1
  270. package/dist/node_modules/lodash/_createRange.js.map +1 -1
  271. package/dist/node_modules/lodash/_createSet.js.map +1 -1
  272. package/dist/node_modules/lodash/_defineProperty.js.map +1 -1
  273. package/dist/node_modules/lodash/_equalArrays.js.map +1 -1
  274. package/dist/node_modules/lodash/_equalByTag.js.map +1 -1
  275. package/dist/node_modules/lodash/_equalObjects.js.map +1 -1
  276. package/dist/node_modules/lodash/_freeGlobal.js.map +1 -1
  277. package/dist/node_modules/lodash/_getAllKeys.js.map +1 -1
  278. package/dist/node_modules/lodash/_getMapData.js.map +1 -1
  279. package/dist/node_modules/lodash/_getMatchData.js.map +1 -1
  280. package/dist/node_modules/lodash/_getNative.js.map +1 -1
  281. package/dist/node_modules/lodash/_getPrototype.js.map +1 -1
  282. package/dist/node_modules/lodash/_getRawTag.js.map +1 -1
  283. package/dist/node_modules/lodash/_getSymbols.js.map +1 -1
  284. package/dist/node_modules/lodash/_getTag.js.map +1 -1
  285. package/dist/node_modules/lodash/_getValue.js.map +1 -1
  286. package/dist/node_modules/lodash/_hasPath.js.map +1 -1
  287. package/dist/node_modules/lodash/_hasUnicode.js.map +1 -1
  288. package/dist/node_modules/lodash/_hashClear.js.map +1 -1
  289. package/dist/node_modules/lodash/_hashDelete.js.map +1 -1
  290. package/dist/node_modules/lodash/_hashGet.js.map +1 -1
  291. package/dist/node_modules/lodash/_hashHas.js.map +1 -1
  292. package/dist/node_modules/lodash/_hashSet.js.map +1 -1
  293. package/dist/node_modules/lodash/_isFlattenable.js.map +1 -1
  294. package/dist/node_modules/lodash/_isIndex.js.map +1 -1
  295. package/dist/node_modules/lodash/_isIterateeCall.js.map +1 -1
  296. package/dist/node_modules/lodash/_isKey.js.map +1 -1
  297. package/dist/node_modules/lodash/_isKeyable.js.map +1 -1
  298. package/dist/node_modules/lodash/_isMasked.js.map +1 -1
  299. package/dist/node_modules/lodash/_isPrototype.js.map +1 -1
  300. package/dist/node_modules/lodash/_isStrictComparable.js.map +1 -1
  301. package/dist/node_modules/lodash/_listCacheClear.js.map +1 -1
  302. package/dist/node_modules/lodash/_listCacheDelete.js.map +1 -1
  303. package/dist/node_modules/lodash/_listCacheGet.js.map +1 -1
  304. package/dist/node_modules/lodash/_listCacheHas.js.map +1 -1
  305. package/dist/node_modules/lodash/_listCacheSet.js.map +1 -1
  306. package/dist/node_modules/lodash/_mapCacheClear.js.map +1 -1
  307. package/dist/node_modules/lodash/_mapCacheDelete.js.map +1 -1
  308. package/dist/node_modules/lodash/_mapCacheGet.js.map +1 -1
  309. package/dist/node_modules/lodash/_mapCacheHas.js.map +1 -1
  310. package/dist/node_modules/lodash/_mapCacheSet.js.map +1 -1
  311. package/dist/node_modules/lodash/_mapToArray.js.map +1 -1
  312. package/dist/node_modules/lodash/_matchesStrictComparable.js.map +1 -1
  313. package/dist/node_modules/lodash/_memoizeCapped.js.map +1 -1
  314. package/dist/node_modules/lodash/_nativeCreate.js.map +1 -1
  315. package/dist/node_modules/lodash/_nativeKeys.js.map +1 -1
  316. package/dist/node_modules/lodash/_nodeUtil.js.map +1 -1
  317. package/dist/node_modules/lodash/_objectToString.js.map +1 -1
  318. package/dist/node_modules/lodash/_overArg.js.map +1 -1
  319. package/dist/node_modules/lodash/_overRest.js.map +1 -1
  320. package/dist/node_modules/lodash/_root.js.map +1 -1
  321. package/dist/node_modules/lodash/_setCacheAdd.js.map +1 -1
  322. package/dist/node_modules/lodash/_setCacheHas.js.map +1 -1
  323. package/dist/node_modules/lodash/_setToArray.js.map +1 -1
  324. package/dist/node_modules/lodash/_setToString.js.map +1 -1
  325. package/dist/node_modules/lodash/_shortOut.js.map +1 -1
  326. package/dist/node_modules/lodash/_stackClear.js.map +1 -1
  327. package/dist/node_modules/lodash/_stackDelete.js.map +1 -1
  328. package/dist/node_modules/lodash/_stackGet.js.map +1 -1
  329. package/dist/node_modules/lodash/_stackHas.js.map +1 -1
  330. package/dist/node_modules/lodash/_stackSet.js.map +1 -1
  331. package/dist/node_modules/lodash/_strictIndexOf.js.map +1 -1
  332. package/dist/node_modules/lodash/_stringToArray.js.map +1 -1
  333. package/dist/node_modules/lodash/_stringToPath.js.map +1 -1
  334. package/dist/node_modules/lodash/_toKey.js.map +1 -1
  335. package/dist/node_modules/lodash/_toSource.js.map +1 -1
  336. package/dist/node_modules/lodash/_trimmedEndIndex.js.map +1 -1
  337. package/dist/node_modules/lodash/_unicodeToArray.js.map +1 -1
  338. package/dist/node_modules/lodash/constant.js.map +1 -1
  339. package/dist/node_modules/lodash/debounce.js.map +1 -1
  340. package/dist/node_modules/lodash/eq.js.map +1 -1
  341. package/dist/node_modules/lodash/every.js.map +1 -1
  342. package/dist/node_modules/lodash/find.js.map +1 -1
  343. package/dist/node_modules/lodash/findIndex.js.map +1 -1
  344. package/dist/node_modules/lodash/flatMap.js.map +1 -1
  345. package/dist/node_modules/lodash/get.js.map +1 -1
  346. package/dist/node_modules/lodash/hasIn.js.map +1 -1
  347. package/dist/node_modules/lodash/identity.js.map +1 -1
  348. package/dist/node_modules/lodash/isArguments.js.map +1 -1
  349. package/dist/node_modules/lodash/isArray.js.map +1 -1
  350. package/dist/node_modules/lodash/isArrayLike.js.map +1 -1
  351. package/dist/node_modules/lodash/isBoolean.js.map +1 -1
  352. package/dist/node_modules/lodash/isBuffer.js.map +1 -1
  353. package/dist/node_modules/lodash/isEqual.js.map +1 -1
  354. package/dist/node_modules/lodash/isFunction.js.map +1 -1
  355. package/dist/node_modules/lodash/isLength.js.map +1 -1
  356. package/dist/node_modules/lodash/isNaN.js.map +1 -1
  357. package/dist/node_modules/lodash/isNil.js.map +1 -1
  358. package/dist/node_modules/lodash/isNumber.js.map +1 -1
  359. package/dist/node_modules/lodash/isObject.js.map +1 -1
  360. package/dist/node_modules/lodash/isObjectLike.js.map +1 -1
  361. package/dist/node_modules/lodash/isPlainObject.js.map +1 -1
  362. package/dist/node_modules/lodash/isString.js.map +1 -1
  363. package/dist/node_modules/lodash/isSymbol.js.map +1 -1
  364. package/dist/node_modules/lodash/isTypedArray.js.map +1 -1
  365. package/dist/node_modules/lodash/keys.js.map +1 -1
  366. package/dist/node_modules/lodash/last.js.map +1 -1
  367. package/dist/node_modules/lodash/map.js.map +1 -1
  368. package/dist/node_modules/lodash/mapValues.js.map +1 -1
  369. package/dist/node_modules/lodash/max.js.map +1 -1
  370. package/dist/node_modules/lodash/maxBy.js.map +1 -1
  371. package/dist/node_modules/lodash/memoize.js.map +1 -1
  372. package/dist/node_modules/lodash/min.js.map +1 -1
  373. package/dist/node_modules/lodash/minBy.js.map +1 -1
  374. package/dist/node_modules/lodash/noop.js.map +1 -1
  375. package/dist/node_modules/lodash/now.js.map +1 -1
  376. package/dist/node_modules/lodash/property.js.map +1 -1
  377. package/dist/node_modules/lodash/range.js.map +1 -1
  378. package/dist/node_modules/lodash/some.js.map +1 -1
  379. package/dist/node_modules/lodash/sortBy.js.map +1 -1
  380. package/dist/node_modules/lodash/stubArray.js.map +1 -1
  381. package/dist/node_modules/lodash/stubFalse.js.map +1 -1
  382. package/dist/node_modules/lodash/throttle.js.map +1 -1
  383. package/dist/node_modules/lodash/toFinite.js.map +1 -1
  384. package/dist/node_modules/lodash/toInteger.js.map +1 -1
  385. package/dist/node_modules/lodash/toNumber.js.map +1 -1
  386. package/dist/node_modules/lodash/toString.js.map +1 -1
  387. package/dist/node_modules/lodash/uniqBy.js.map +1 -1
  388. package/dist/node_modules/lodash/upperFirst.js.map +1 -1
  389. package/dist/node_modules/object-assign/index.js.map +1 -1
  390. package/dist/node_modules/prop-types/checkPropTypes.js.map +1 -1
  391. package/dist/node_modules/prop-types/factoryWithThrowingShims.js.map +1 -1
  392. package/dist/node_modules/prop-types/factoryWithTypeCheckers.js.map +1 -1
  393. package/dist/node_modules/prop-types/index.js.map +1 -1
  394. package/dist/node_modules/prop-types/lib/ReactPropTypesSecret.js.map +1 -1
  395. package/dist/node_modules/prop-types/lib/has.js.map +1 -1
  396. package/dist/node_modules/prop-types/node_modules/react-is/cjs/react-is.development.js.map +1 -1
  397. package/dist/node_modules/prop-types/node_modules/react-is/cjs/react-is.production.min.js.map +1 -1
  398. package/dist/node_modules/prop-types/node_modules/react-is/index.js.map +1 -1
  399. package/dist/node_modules/qrcode/lib/browser.js.map +1 -1
  400. package/dist/node_modules/qrcode/lib/can-promise.js.map +1 -1
  401. package/dist/node_modules/qrcode/lib/core/alignment-pattern.js.map +1 -1
  402. package/dist/node_modules/qrcode/lib/core/alphanumeric-data.js.map +1 -1
  403. package/dist/node_modules/qrcode/lib/core/bit-buffer.js.map +1 -1
  404. package/dist/node_modules/qrcode/lib/core/bit-matrix.js.map +1 -1
  405. package/dist/node_modules/qrcode/lib/core/byte-data.js.map +1 -1
  406. package/dist/node_modules/qrcode/lib/core/error-correction-code.js.map +1 -1
  407. package/dist/node_modules/qrcode/lib/core/error-correction-level.js.map +1 -1
  408. package/dist/node_modules/qrcode/lib/core/finder-pattern.js.map +1 -1
  409. package/dist/node_modules/qrcode/lib/core/format-info.js.map +1 -1
  410. package/dist/node_modules/qrcode/lib/core/galois-field.js.map +1 -1
  411. package/dist/node_modules/qrcode/lib/core/kanji-data.js.map +1 -1
  412. package/dist/node_modules/qrcode/lib/core/mask-pattern.js.map +1 -1
  413. package/dist/node_modules/qrcode/lib/core/mode.js.map +1 -1
  414. package/dist/node_modules/qrcode/lib/core/numeric-data.js.map +1 -1
  415. package/dist/node_modules/qrcode/lib/core/polynomial.js.map +1 -1
  416. package/dist/node_modules/qrcode/lib/core/qrcode.js.map +1 -1
  417. package/dist/node_modules/qrcode/lib/core/reed-solomon-encoder.js.map +1 -1
  418. package/dist/node_modules/qrcode/lib/core/regex.js +1 -1
  419. package/dist/node_modules/qrcode/lib/core/regex.js.map +1 -1
  420. package/dist/node_modules/qrcode/lib/core/segments.js.map +1 -1
  421. package/dist/node_modules/qrcode/lib/core/utils.js.map +1 -1
  422. package/dist/node_modules/qrcode/lib/core/version-check.js.map +1 -1
  423. package/dist/node_modules/qrcode/lib/core/version.js.map +1 -1
  424. package/dist/node_modules/qrcode/lib/renderer/canvas.js.map +1 -1
  425. package/dist/node_modules/qrcode/lib/renderer/svg-tag.js.map +1 -1
  426. package/dist/node_modules/qrcode/lib/renderer/utils.js.map +1 -1
  427. package/dist/node_modules/react-is/cjs/react-is.development.js.map +1 -1
  428. package/dist/node_modules/react-is/cjs/react-is.production.min.js.map +1 -1
  429. package/dist/node_modules/react-is/index.js.map +1 -1
  430. package/dist/node_modules/react-smooth/es6/Animate.js +2 -2
  431. package/dist/node_modules/react-smooth/es6/Animate.js.map +1 -1
  432. package/dist/node_modules/react-smooth/es6/AnimateManager.js.map +1 -1
  433. package/dist/node_modules/react-smooth/es6/configUpdate.js.map +1 -1
  434. package/dist/node_modules/react-smooth/es6/easing.js.map +1 -1
  435. package/dist/node_modules/react-smooth/es6/setRafTimeout.js.map +1 -1
  436. package/dist/node_modules/react-smooth/es6/util.js.map +1 -1
  437. package/dist/node_modules/recharts/es6/cartesian/Area.js +13 -13
  438. package/dist/node_modules/recharts/es6/cartesian/Area.js.map +1 -1
  439. package/dist/node_modules/recharts/es6/cartesian/Bar.js +9 -9
  440. package/dist/node_modules/recharts/es6/cartesian/Bar.js.map +1 -1
  441. package/dist/node_modules/recharts/es6/cartesian/Brush.js +12 -12
  442. package/dist/node_modules/recharts/es6/cartesian/Brush.js.map +1 -1
  443. package/dist/node_modules/recharts/es6/cartesian/CartesianAxis.js +7 -7
  444. package/dist/node_modules/recharts/es6/cartesian/CartesianAxis.js.map +1 -1
  445. package/dist/node_modules/recharts/es6/cartesian/CartesianGrid.js +13 -13
  446. package/dist/node_modules/recharts/es6/cartesian/CartesianGrid.js.map +1 -1
  447. package/dist/node_modules/recharts/es6/cartesian/ErrorBar.js +4 -4
  448. package/dist/node_modules/recharts/es6/cartesian/ErrorBar.js.map +1 -1
  449. package/dist/node_modules/recharts/es6/cartesian/Line.js +10 -10
  450. package/dist/node_modules/recharts/es6/cartesian/Line.js.map +1 -1
  451. package/dist/node_modules/recharts/es6/cartesian/ReferenceArea.js +3 -3
  452. package/dist/node_modules/recharts/es6/cartesian/ReferenceArea.js.map +1 -1
  453. package/dist/node_modules/recharts/es6/cartesian/ReferenceDot.js +3 -3
  454. package/dist/node_modules/recharts/es6/cartesian/ReferenceDot.js.map +1 -1
  455. package/dist/node_modules/recharts/es6/cartesian/ReferenceLine.js +4 -4
  456. package/dist/node_modules/recharts/es6/cartesian/ReferenceLine.js.map +1 -1
  457. package/dist/node_modules/recharts/es6/cartesian/XAxis.js +3 -3
  458. package/dist/node_modules/recharts/es6/cartesian/XAxis.js.map +1 -1
  459. package/dist/node_modules/recharts/es6/cartesian/YAxis.js +3 -3
  460. package/dist/node_modules/recharts/es6/cartesian/YAxis.js.map +1 -1
  461. package/dist/node_modules/recharts/es6/cartesian/getEquidistantTicks.js.map +1 -1
  462. package/dist/node_modules/recharts/es6/cartesian/getTicks.js.map +1 -1
  463. package/dist/node_modules/recharts/es6/chart/AccessibilityManager.js +1 -1
  464. package/dist/node_modules/recharts/es6/chart/AccessibilityManager.js.map +1 -1
  465. package/dist/node_modules/recharts/es6/chart/AreaChart.js.map +1 -1
  466. package/dist/node_modules/recharts/es6/chart/BarChart.js.map +1 -1
  467. package/dist/node_modules/recharts/es6/chart/LineChart.js.map +1 -1
  468. package/dist/node_modules/recharts/es6/chart/PieChart.js.map +1 -1
  469. package/dist/node_modules/recharts/es6/chart/RadialBarChart.js.map +1 -1
  470. package/dist/node_modules/recharts/es6/chart/generateCategoricalChart.js +22 -22
  471. package/dist/node_modules/recharts/es6/chart/generateCategoricalChart.js.map +1 -1
  472. package/dist/node_modules/recharts/es6/component/Cell.js.map +1 -1
  473. package/dist/node_modules/recharts/es6/component/Cursor.js +1 -1
  474. package/dist/node_modules/recharts/es6/component/Cursor.js.map +1 -1
  475. package/dist/node_modules/recharts/es6/component/DefaultLegendContent.js +11 -11
  476. package/dist/node_modules/recharts/es6/component/DefaultLegendContent.js.map +1 -1
  477. package/dist/node_modules/recharts/es6/component/DefaultTooltipContent.js +6 -6
  478. package/dist/node_modules/recharts/es6/component/DefaultTooltipContent.js.map +1 -1
  479. package/dist/node_modules/recharts/es6/component/Label.js +14 -14
  480. package/dist/node_modules/recharts/es6/component/Label.js.map +1 -1
  481. package/dist/node_modules/recharts/es6/component/LabelList.js +6 -6
  482. package/dist/node_modules/recharts/es6/component/LabelList.js.map +1 -1
  483. package/dist/node_modules/recharts/es6/component/Legend.js +5 -5
  484. package/dist/node_modules/recharts/es6/component/Legend.js.map +1 -1
  485. package/dist/node_modules/recharts/es6/component/ResponsiveContainer.js +3 -3
  486. package/dist/node_modules/recharts/es6/component/ResponsiveContainer.js.map +1 -1
  487. package/dist/node_modules/recharts/es6/component/Text.js +2 -2
  488. package/dist/node_modules/recharts/es6/component/Text.js.map +1 -1
  489. package/dist/node_modules/recharts/es6/component/Tooltip.js +3 -3
  490. package/dist/node_modules/recharts/es6/component/Tooltip.js.map +1 -1
  491. package/dist/node_modules/recharts/es6/component/TooltipBoundingBox.js +2 -2
  492. package/dist/node_modules/recharts/es6/component/TooltipBoundingBox.js.map +1 -1
  493. package/dist/node_modules/recharts/es6/container/Layer.js +2 -2
  494. package/dist/node_modules/recharts/es6/container/Layer.js.map +1 -1
  495. package/dist/node_modules/recharts/es6/container/Surface.js +2 -2
  496. package/dist/node_modules/recharts/es6/container/Surface.js.map +1 -1
  497. package/dist/node_modules/recharts/es6/context/chartLayoutContext.js +2 -2
  498. package/dist/node_modules/recharts/es6/context/chartLayoutContext.js.map +1 -1
  499. package/dist/node_modules/recharts/es6/polar/Pie.js +13 -13
  500. package/dist/node_modules/recharts/es6/polar/Pie.js.map +1 -1
  501. package/dist/node_modules/recharts/es6/polar/PolarAngleAxis.js +8 -8
  502. package/dist/node_modules/recharts/es6/polar/PolarAngleAxis.js.map +1 -1
  503. package/dist/node_modules/recharts/es6/polar/PolarRadiusAxis.js +6 -6
  504. package/dist/node_modules/recharts/es6/polar/PolarRadiusAxis.js.map +1 -1
  505. package/dist/node_modules/recharts/es6/polar/RadialBar.js +6 -6
  506. package/dist/node_modules/recharts/es6/polar/RadialBar.js.map +1 -1
  507. package/dist/node_modules/recharts/es6/shape/Cross.js +1 -1
  508. package/dist/node_modules/recharts/es6/shape/Cross.js.map +1 -1
  509. package/dist/node_modules/recharts/es6/shape/Curve.js +1 -1
  510. package/dist/node_modules/recharts/es6/shape/Curve.js.map +1 -1
  511. package/dist/node_modules/recharts/es6/shape/Dot.js +1 -1
  512. package/dist/node_modules/recharts/es6/shape/Dot.js.map +1 -1
  513. package/dist/node_modules/recharts/es6/shape/Polygon.js +4 -4
  514. package/dist/node_modules/recharts/es6/shape/Polygon.js.map +1 -1
  515. package/dist/node_modules/recharts/es6/shape/Rectangle.js +4 -4
  516. package/dist/node_modules/recharts/es6/shape/Rectangle.js.map +1 -1
  517. package/dist/node_modules/recharts/es6/shape/Sector.js +1 -1
  518. package/dist/node_modules/recharts/es6/shape/Sector.js.map +1 -1
  519. package/dist/node_modules/recharts/es6/shape/Symbols.js +1 -1
  520. package/dist/node_modules/recharts/es6/shape/Symbols.js.map +1 -1
  521. package/dist/node_modules/recharts/es6/shape/Trapezoid.js +4 -4
  522. package/dist/node_modules/recharts/es6/shape/Trapezoid.js.map +1 -1
  523. package/dist/node_modules/recharts/es6/util/ActiveShapeUtils.js +9 -9
  524. package/dist/node_modules/recharts/es6/util/ActiveShapeUtils.js.map +1 -1
  525. package/dist/node_modules/recharts/es6/util/BarUtils.js +1 -1
  526. package/dist/node_modules/recharts/es6/util/BarUtils.js.map +1 -1
  527. package/dist/node_modules/recharts/es6/util/CartesianUtils.js +1 -1
  528. package/dist/node_modules/recharts/es6/util/CartesianUtils.js.map +1 -1
  529. package/dist/node_modules/recharts/es6/util/ChartUtils.js.map +1 -1
  530. package/dist/node_modules/recharts/es6/util/CssPrefixUtils.js.map +1 -1
  531. package/dist/node_modules/recharts/es6/util/DOMUtils.js.map +1 -1
  532. package/dist/node_modules/recharts/es6/util/DataUtils.js.map +1 -1
  533. package/dist/node_modules/recharts/es6/util/DetectReferenceElementsDomain.js.map +1 -1
  534. package/dist/node_modules/recharts/es6/util/Events.js.map +1 -1
  535. package/dist/node_modules/recharts/es6/util/Global.js.map +1 -1
  536. package/dist/node_modules/recharts/es6/util/IfOverflowMatches.js.map +1 -1
  537. package/dist/node_modules/recharts/es6/util/LogUtils.js.map +1 -1
  538. package/dist/node_modules/recharts/es6/util/PolarUtils.js +1 -1
  539. package/dist/node_modules/recharts/es6/util/PolarUtils.js.map +1 -1
  540. package/dist/node_modules/recharts/es6/util/RadialBarUtils.js +1 -1
  541. package/dist/node_modules/recharts/es6/util/RadialBarUtils.js.map +1 -1
  542. package/dist/node_modules/recharts/es6/util/ReactUtils.js +1 -1
  543. package/dist/node_modules/recharts/es6/util/ReactUtils.js.map +1 -1
  544. package/dist/node_modules/recharts/es6/util/ReduceCSSCalc.js +1 -1
  545. package/dist/node_modules/recharts/es6/util/ReduceCSSCalc.js.map +1 -1
  546. package/dist/node_modules/recharts/es6/util/ShallowEqual.js.map +1 -1
  547. package/dist/node_modules/recharts/es6/util/TickUtils.js.map +1 -1
  548. package/dist/node_modules/recharts/es6/util/calculateViewBox.js.map +1 -1
  549. package/dist/node_modules/recharts/es6/util/cursor/getCursorPoints.js.map +1 -1
  550. package/dist/node_modules/recharts/es6/util/cursor/getCursorRectangle.js.map +1 -1
  551. package/dist/node_modules/recharts/es6/util/cursor/getRadialCursorPoints.js.map +1 -1
  552. package/dist/node_modules/recharts/es6/util/getEveryNthWithCondition.js.map +1 -1
  553. package/dist/node_modules/recharts/es6/util/getLegendProps.js.map +1 -1
  554. package/dist/node_modules/recharts/es6/util/isDomainSpecifiedByUser.js.map +1 -1
  555. package/dist/node_modules/recharts/es6/util/payload/getUniqPayload.js.map +1 -1
  556. package/dist/node_modules/recharts/es6/util/tooltip/translate.js.map +1 -1
  557. package/dist/node_modules/recharts/es6/util/types.js +1 -1
  558. package/dist/node_modules/recharts/es6/util/types.js.map +1 -1
  559. package/dist/node_modules/recharts-scale/es6/getNiceTickValues.js.map +1 -1
  560. package/dist/node_modules/recharts-scale/es6/util/arithmetic.js.map +1 -1
  561. package/dist/node_modules/recharts-scale/es6/util/utils.js.map +1 -1
  562. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js +1 -1
  563. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -1
  564. package/dist/node_modules/tiny-invariant/dist/esm/tiny-invariant.js.map +1 -1
  565. package/dist/services/createSandboxAssistantTransport.js.map +1 -1
  566. package/dist/utils/pageContext.js.map +1 -1
  567. package/package.json +4 -4
  568. package/dist/generated/global-operations.d.ts +0 -2
  569. package/dist/generated/global-operations.d.ts.map +0 -1
  570. package/dist/generated/global-types.d.ts +0 -23527
  571. package/dist/generated/global-types.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"FinanceFinanceHubPage.js","names":[],"sources":["../../../src/assethandler/pages/FinanceFinanceHubPage.tsx"],"sourcesContent":["import { useMemo, useState, type ReactNode } from 'react';\nimport { useAssetMoney } from '../providers/AssetHandlerProvider';\nimport { useAssetHandlerNavigate } from '../hooks/useAssetHandlerNavigate';\nimport {\n Button,\n GlassCard,\n Input,\n Label,\n Textarea,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n GradientText,\n CTAOverflowMenu,\n PagePurpose,\n NextSteps,\n IllustratedEmptyState,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n} from '@burdenoff/fe-libs/ui';\nimport {\n DollarSign,\n TrendingDown,\n Receipt,\n Wallet,\n Download,\n Loader2,\n Check,\n X,\n Search,\n BarChart3,\n PieChart as PieChartIcon,\n} from 'lucide-react';\nimport { gql } from '@apollo/client';\nimport { useMutation } from '@apollo/client/react';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\nimport type { Budget, FinanceTransaction, Invoice } from '../store/assethandlerStore';\nimport { notify } from '../utils/toast';\nimport { cn } from '../utils/cn';\nimport { downloadCsv } from '../utils/csv';\nimport {\n StatTile,\n ChartCard,\n BarsChart,\n DonutChart,\n ProgressMeter,\n Pagination,\n usePagination,\n type DonutSlice,\n} from '../components';\n\n// ─── Mutations ────────────────────────────────────────────────────────────────\nconst CREATE_TRANSACTION_MUTATION = gql`\n mutation AssetHandlerCreateTransaction($input: CreateTransactionInput!) {\n createTransaction(input: $input) {\n id\n description\n }\n }\n`;\n\nconst CREATE_BUDGET_MUTATION = gql`\n mutation AssetHandlerCreateBudget($input: AssetHandlerCreateBudgetInput!) {\n createBudget(input: $input) {\n id\n name\n }\n }\n`;\n\nconst CREATE_INVOICE_MUTATION = gql`\n mutation AssetHandlerCreateInvoice($input: AssetHandlerCreateInvoiceInput!) {\n createInvoice(input: $input) {\n id\n number\n }\n }\n`;\n\nconst APPROVE_TRANSACTION_MUTATION = gql`\n mutation AssetHandlerHubApproveTransaction($id: ID!) {\n approveTransaction(id: $id) {\n id\n status\n }\n }\n`;\n\nconst REJECT_TRANSACTION_MUTATION = gql`\n mutation AssetHandlerHubRejectTransaction($id: ID!, $reason: String) {\n rejectTransaction(id: $id, reason: $reason) {\n id\n status\n }\n }\n`;\n\ninterface CreateTransactionResult {\n createTransaction: { id: string; description: string };\n}\ninterface CreateBudgetResult {\n createBudget: { id: string; name: string };\n}\ninterface CreateInvoiceResult {\n createInvoice: { id: string; number: string };\n}\ninterface ApproveTransactionResult {\n approveTransaction: { id: string; status: string };\n}\ninterface RejectTransactionResult {\n rejectTransaction: { id: string; status: string };\n}\n\nconst TRANSACTION_TYPES = ['PURCHASE', 'LEASE', 'DISPOSAL', 'TRANSFER', 'MAINTENANCE'] as const;\nconst TRANSACTION_STATUSES = ['PENDING', 'APPROVED', 'COMPLETED', 'REJECTED'] as const;\nconst BUDGET_STATUSES = ['ON_TRACK', 'OVER_BUDGET', 'UNDER_BUDGET'] as const;\nconst INVOICE_STATUSES = ['DRAFT', 'SENT', 'PAID', 'OVERDUE', 'CANCELLED'] as const;\n\nconst humanize = (value: string) =>\n value\n .toLowerCase()\n .replace(/_/g, ' ')\n .replace(/^\\w/, (c) => c.toUpperCase());\n\n// ─── Presentation helpers ───────────────────────────────────────────────────\ntype Tone = 'success' | 'warning' | 'error' | 'info' | 'neutral';\n\nconst PILL_TONE: Record<Tone, string> = {\n success: 'bg-status-success-subtle text-status-success-text',\n warning: 'bg-status-warning-subtle text-status-warning-text',\n error: 'bg-status-error-subtle text-status-error-text',\n info: 'bg-status-info-subtle text-status-info-text',\n neutral: 'bg-bg-sunken text-text-secondary',\n};\n\nfunction StatusPill({ tone, children }: { tone: Tone; children: ReactNode }) {\n return (\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium capitalize',\n PILL_TONE[tone]\n )}\n >\n {children}\n </span>\n );\n}\n\nconst txnStatusTone = (status: string): Tone =>\n status === 'approved' || status === 'completed'\n ? 'success'\n : status === 'rejected'\n ? 'error'\n : status === 'pending'\n ? 'warning'\n : 'neutral';\n\nconst txnTypeTone = (type: string): Tone =>\n type === 'purchase' || type === 'lease'\n ? 'info'\n : type === 'disposal'\n ? 'error'\n : type === 'maintenance'\n ? 'warning'\n : 'neutral';\n\nconst budgetStatusTone = (status: string): Tone =>\n status === 'over_budget' ? 'error' : status === 'under_budget' ? 'success' : 'info';\n\nconst invoiceStatusTone = (status: string): Tone =>\n status === 'paid'\n ? 'success'\n : status === 'overdue'\n ? 'error'\n : status === 'sent'\n ? 'warning'\n : 'neutral';\n\nconst formatDate = (value: string): string => {\n const parsed = new Date(value);\n return Number.isNaN(parsed.getTime()) ? value : parsed.toLocaleDateString();\n};\n\n// ─── New Transaction dialog ───────────────────────────────────────────────────\nfunction NewTransactionDialog({\n open,\n onOpenChange,\n}: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}) {\n const [type, setType] = useState<(typeof TRANSACTION_TYPES)[number]>('PURCHASE');\n const [status, setStatus] = useState<(typeof TRANSACTION_STATUSES)[number]>('PENDING');\n const [amount, setAmount] = useState('');\n const { currency: moduleCurrency } = useAssetMoney();\n const [currency, setCurrency] = useState(moduleCurrency);\n const [category, setCategory] = useState('');\n const [description, setDescription] = useState('');\n const [vendor, setVendor] = useState('');\n const [department, setDepartment] = useState('');\n\n const reset = () => {\n setType('PURCHASE');\n setStatus('PENDING');\n setAmount('');\n setCurrency(moduleCurrency);\n setCategory('');\n setDescription('');\n setVendor('');\n setDepartment('');\n };\n\n const [createTransaction, { loading }] = useMutation<CreateTransactionResult>(\n CREATE_TRANSACTION_MUTATION,\n {\n refetchQueries: ['AssetHandlerBootstrap'],\n onCompleted: (data) => {\n notify.success(\n 'Transaction created',\n `${data.createTransaction.description} was recorded.`\n );\n reset();\n onOpenChange(false);\n },\n onError: (error) => notify.error('Could not create transaction', error.message),\n }\n );\n\n const handleSubmit = () => {\n const parsedAmount = Number(amount);\n if (!Number.isFinite(parsedAmount) || amount.trim() === '') {\n notify.warning('Invalid amount', 'Enter a numeric amount for the transaction.');\n return;\n }\n if (!category.trim() || !description.trim()) {\n notify.warning('Missing details', 'Category and description are required.');\n return;\n }\n void createTransaction({\n variables: {\n input: {\n amount: parsedAmount,\n category: category.trim(),\n currency: currency.trim() || moduleCurrency,\n description: description.trim(),\n type,\n status,\n vendor: vendor.trim() || null,\n department: department.trim() || null,\n },\n },\n });\n };\n\n return (\n <ResponsiveDialog open={open} onOpenChange={onOpenChange}>\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>New Transaction</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Record a financial movement against your assets.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <div className=\"space-y-4\">\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Type</Label>\n <Select value={type} onValueChange={(v) => setType(v as typeof type)}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {TRANSACTION_TYPES.map((t) => (\n <SelectItem key={t} value={t}>\n {humanize(t)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-2\">\n <Label>Status</Label>\n <Select value={status} onValueChange={(v) => setStatus(v as typeof status)}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {TRANSACTION_STATUSES.map((s) => (\n <SelectItem key={s} value={s}>\n {humanize(s)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Amount *</Label>\n <Input\n type=\"number\"\n placeholder=\"e.g., 1500\"\n value={amount}\n onChange={(e) => setAmount(e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Currency</Label>\n <Input value={currency} onChange={(e) => setCurrency(e.target.value)} />\n </div>\n </div>\n <div className=\"space-y-2\">\n <Label>Category *</Label>\n <Input\n placeholder=\"e.g., it_hardware\"\n value={category}\n onChange={(e) => setCategory(e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Description *</Label>\n <Textarea\n placeholder=\"What is this transaction for?\"\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n rows={2}\n />\n </div>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Vendor</Label>\n <Input value={vendor} onChange={(e) => setVendor(e.target.value)} />\n </div>\n <div className=\"space-y-2\">\n <Label>Department</Label>\n <Input value={department} onChange={(e) => setDepartment(e.target.value)} />\n </div>\n </div>\n </div>\n <ResponsiveDialogFooter>\n <Button variant=\"outline\" onClick={() => onOpenChange(false)} disabled={loading}>\n Cancel\n </Button>\n <Button onClick={handleSubmit} disabled={loading}>\n {loading ? <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" /> : null}\n {loading ? 'Creating…' : 'Create Transaction'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n );\n}\n\n// ─── New Budget dialog ────────────────────────────────────────────────────────\nfunction NewBudgetDialog({\n open,\n onOpenChange,\n}: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}) {\n const [name, setName] = useState('');\n const [category, setCategory] = useState('');\n const [department, setDepartment] = useState('');\n const [period, setPeriod] = useState('');\n const [allocated, setAllocated] = useState('');\n const [spent, setSpent] = useState('0');\n const [status, setStatus] = useState<(typeof BUDGET_STATUSES)[number]>('ON_TRACK');\n\n const reset = () => {\n setName('');\n setCategory('');\n setDepartment('');\n setPeriod('');\n setAllocated('');\n setSpent('0');\n setStatus('ON_TRACK');\n };\n\n const [createBudget, { loading }] = useMutation<CreateBudgetResult>(CREATE_BUDGET_MUTATION, {\n refetchQueries: ['AssetHandlerBootstrap'],\n onCompleted: (data) => {\n notify.success('Budget created', `${data.createBudget.name} is now being tracked.`);\n reset();\n onOpenChange(false);\n },\n onError: (error) => notify.error('Could not create budget', error.message),\n });\n\n const handleSubmit = () => {\n const parsedAllocated = Number(allocated);\n const parsedSpent = Number(spent);\n if (!name.trim() || !category.trim() || !department.trim() || !period.trim()) {\n notify.warning('Missing details', 'Name, category, department and period are required.');\n return;\n }\n if (!Number.isFinite(parsedAllocated) || allocated.trim() === '') {\n notify.warning('Invalid allocation', 'Enter a numeric allocated amount.');\n return;\n }\n void createBudget({\n variables: {\n input: {\n allocated: parsedAllocated,\n category: category.trim(),\n department: department.trim(),\n name: name.trim(),\n period: period.trim(),\n spent: Number.isFinite(parsedSpent) ? parsedSpent : 0,\n status,\n },\n },\n });\n };\n\n return (\n <ResponsiveDialog open={open} onOpenChange={onOpenChange}>\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>New Budget</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Set an allocation to track departmental asset spend.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Label>Name *</Label>\n <Input\n placeholder=\"e.g., IT Hardware Q1\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n />\n </div>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Category *</Label>\n <Input value={category} onChange={(e) => setCategory(e.target.value)} />\n </div>\n <div className=\"space-y-2\">\n <Label>Department *</Label>\n <Input value={department} onChange={(e) => setDepartment(e.target.value)} />\n </div>\n </div>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Period *</Label>\n <Input\n placeholder=\"e.g., Q1 2026\"\n value={period}\n onChange={(e) => setPeriod(e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Status</Label>\n <Select value={status} onValueChange={(v) => setStatus(v as typeof status)}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {BUDGET_STATUSES.map((s) => (\n <SelectItem key={s} value={s}>\n {humanize(s)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Allocated *</Label>\n <Input\n type=\"number\"\n placeholder=\"e.g., 50000\"\n value={allocated}\n onChange={(e) => setAllocated(e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Spent</Label>\n <Input type=\"number\" value={spent} onChange={(e) => setSpent(e.target.value)} />\n </div>\n </div>\n </div>\n <ResponsiveDialogFooter>\n <Button variant=\"outline\" onClick={() => onOpenChange(false)} disabled={loading}>\n Cancel\n </Button>\n <Button onClick={handleSubmit} disabled={loading}>\n {loading ? <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" /> : null}\n {loading ? 'Creating…' : 'Create Budget'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n );\n}\n\n// ─── New Invoice dialog ───────────────────────────────────────────────────────\nfunction NewInvoiceDialog({\n open,\n onOpenChange,\n}: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}) {\n const [number, setNumber] = useState('');\n const [vendor, setVendor] = useState('');\n const [amount, setAmount] = useState('');\n const { currency: moduleCurrency } = useAssetMoney();\n const [currency, setCurrency] = useState(moduleCurrency);\n const [issueDate, setIssueDate] = useState('');\n const [dueDate, setDueDate] = useState('');\n const [relatedPO, setRelatedPO] = useState('');\n const [status, setStatus] = useState<(typeof INVOICE_STATUSES)[number]>('DRAFT');\n\n const reset = () => {\n setNumber('');\n setVendor('');\n setAmount('');\n setCurrency(moduleCurrency);\n setIssueDate('');\n setDueDate('');\n setRelatedPO('');\n setStatus('DRAFT');\n };\n\n const [createInvoice, { loading }] = useMutation<CreateInvoiceResult>(CREATE_INVOICE_MUTATION, {\n refetchQueries: ['AssetHandlerBootstrap'],\n onCompleted: (data) => {\n notify.success('Invoice created', `Invoice ${data.createInvoice.number} was added.`);\n reset();\n onOpenChange(false);\n },\n onError: (error) => notify.error('Could not create invoice', error.message),\n });\n\n const handleSubmit = () => {\n const parsedAmount = Number(amount);\n if (!number.trim() || !vendor.trim()) {\n notify.warning('Missing details', 'Invoice number and vendor are required.');\n return;\n }\n if (!Number.isFinite(parsedAmount) || amount.trim() === '') {\n notify.warning('Invalid amount', 'Enter a numeric invoice amount.');\n return;\n }\n if (!issueDate || !dueDate) {\n notify.warning('Missing dates', 'Issue date and due date are required.');\n return;\n }\n void createInvoice({\n variables: {\n input: {\n amount: parsedAmount,\n currency: currency.trim() || moduleCurrency,\n dueDate: new Date(dueDate).toISOString(),\n issueDate: new Date(issueDate).toISOString(),\n number: number.trim(),\n relatedPO: relatedPO.trim() || null,\n status,\n vendor: vendor.trim(),\n },\n },\n });\n };\n\n return (\n <ResponsiveDialog open={open} onOpenChange={onOpenChange}>\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>New Invoice</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Log a vendor invoice for an asset purchase or service.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <div className=\"space-y-4\">\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Invoice Number *</Label>\n <Input\n placeholder=\"e.g., INV-2026-001\"\n value={number}\n onChange={(e) => setNumber(e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Vendor *</Label>\n <Input value={vendor} onChange={(e) => setVendor(e.target.value)} />\n </div>\n </div>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Amount *</Label>\n <Input\n type=\"number\"\n placeholder=\"e.g., 12000\"\n value={amount}\n onChange={(e) => setAmount(e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Currency</Label>\n <Input value={currency} onChange={(e) => setCurrency(e.target.value)} />\n </div>\n </div>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Issue Date *</Label>\n <Input type=\"date\" value={issueDate} onChange={(e) => setIssueDate(e.target.value)} />\n </div>\n <div className=\"space-y-2\">\n <Label>Due Date *</Label>\n <Input type=\"date\" value={dueDate} onChange={(e) => setDueDate(e.target.value)} />\n </div>\n </div>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Related PO</Label>\n <Input value={relatedPO} onChange={(e) => setRelatedPO(e.target.value)} />\n </div>\n <div className=\"space-y-2\">\n <Label>Status</Label>\n <Select value={status} onValueChange={(v) => setStatus(v as typeof status)}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {INVOICE_STATUSES.map((s) => (\n <SelectItem key={s} value={s}>\n {humanize(s)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n </div>\n <ResponsiveDialogFooter>\n <Button variant=\"outline\" onClick={() => onOpenChange(false)} disabled={loading}>\n Cancel\n </Button>\n <Button onClick={handleSubmit} disabled={loading}>\n {loading ? <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" /> : null}\n {loading ? 'Creating…' : 'Create Invoice'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n );\n}\n\n// ─── Transaction row action buttons (approve / reject pending) ────────────────\nfunction TransactionActions({\n txn,\n actingId,\n onApprove,\n onReject,\n}: {\n txn: FinanceTransaction;\n actingId: string | null;\n onApprove: (id: string) => void;\n onReject: (id: string) => void;\n}) {\n if (txn.status !== 'pending') return null;\n const busy = actingId === txn.id;\n return (\n <div className=\"flex items-center gap-1.5\">\n <Button\n size=\"sm\"\n variant=\"outline\"\n className=\"h-7 gap-1 border-status-success-subtle px-2 text-status-success-text\"\n disabled={busy}\n onClick={(e) => {\n e.stopPropagation();\n onApprove(txn.id);\n }}\n >\n {busy ? (\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n <Check className=\"h-3.5 w-3.5\" />\n )}\n Approve\n </Button>\n <Button\n size=\"sm\"\n variant=\"outline\"\n className=\"h-7 gap-1 border-status-error-subtle px-2 text-status-error-text\"\n disabled={busy}\n onClick={(e) => {\n e.stopPropagation();\n onReject(txn.id);\n }}\n >\n <X className=\"h-3.5 w-3.5\" />\n Reject\n </Button>\n </div>\n );\n}\n\nexport function FinanceFinanceHubPage() {\n const { currency: moduleCurrency, compact: compactUsd } = useAssetMoney();\n // A record's own currency wins; the module currency is the fallback for rows\n // that never carried one.\n const fmtMoney = (value: number, currency?: string | null): string => {\n try {\n return new Intl.NumberFormat(undefined, {\n style: 'currency',\n currency: currency || moduleCurrency,\n maximumFractionDigits: 2,\n }).format(value);\n } catch {\n // An unknown/invalid ISO code: show the code rather than a wrong symbol.\n return `${currency || moduleCurrency} ${value.toLocaleString()}`;\n }\n };\n\n const navigate = useAssetHandlerNavigate();\n const { transactions, budgets, invoices } = useAssetHandlerStore();\n\n const [txnDialogOpen, setTxnDialogOpen] = useState(false);\n const [budgetDialogOpen, setBudgetDialogOpen] = useState(false);\n const [invoiceDialogOpen, setInvoiceDialogOpen] = useState(false);\n\n const [activeTab, setActiveTab] = useState<'transactions' | 'budgets' | 'invoices'>(\n 'transactions'\n );\n\n const [txnStatusFilter, setTxnStatusFilter] = useState<string>('all');\n const [txnTypeFilter, setTxnTypeFilter] = useState<string>('all');\n const [txnSearch, setTxnSearch] = useState('');\n const [invStatusFilter, setInvStatusFilter] = useState<string>('all');\n const [invSearch, setInvSearch] = useState('');\n\n const [actingId, setActingId] = useState<string | null>(null);\n\n // ─── Headline finance figures (money-forward, real store data) ───\n const totalSpend = transactions.filter((t) => t.amount > 0).reduce((s, t) => s + t.amount, 0);\n const pendingTxns = transactions.filter((t) => t.status === 'pending');\n const overBudget = budgets.filter((b) => b.status === 'over_budget');\n const overdueInvoices = invoices.filter((i) => i.status === 'overdue');\n const budgetAllocated = budgets.reduce((s, b) => s + b.allocated, 0);\n const budgetSpent = budgets.reduce((s, b) => s + b.spent, 0);\n const invoicesOutstanding = invoices\n .filter((i) => i.status !== 'paid' && i.status !== 'cancelled')\n .reduce((s, i) => s + i.amount, 0);\n const outstandingCount = invoices.filter(\n (i) => i.status !== 'paid' && i.status !== 'cancelled'\n ).length;\n\n // ─── Chart aggregations (real data only) ───\n const budgetByDept = useMemo(() => {\n const map = new Map<string, { allocated: number; spent: number }>();\n for (const b of budgets) {\n const key = b.department || 'Unassigned';\n const cur = map.get(key) ?? { allocated: 0, spent: 0 };\n cur.allocated += b.allocated;\n cur.spent += b.spent;\n map.set(key, cur);\n }\n return Array.from(map, ([department, v]) => ({ department, ...v })).sort(\n (a, b) => b.allocated - a.allocated\n );\n }, [budgets]);\n\n const spendByCategory = useMemo<DonutSlice[]>(() => {\n const map = new Map<string, number>();\n for (const t of transactions) {\n if (t.amount > 0) map.set(t.category, (map.get(t.category) ?? 0) + t.amount);\n }\n return Array.from(map, ([name, value]) => ({ name: humanize(name), value })).sort(\n (a, b) => b.value - a.value\n );\n }, [transactions]);\n\n const hasCharts = budgetByDept.length > 0 || spendByCategory.length > 0;\n\n // ─── Filtered lists ───\n const filteredTxns = useMemo(() => {\n const q = txnSearch.trim().toLowerCase();\n return transactions.filter((t) => {\n if (txnStatusFilter !== 'all' && t.status !== txnStatusFilter) return false;\n if (txnTypeFilter !== 'all' && t.type !== txnTypeFilter) return false;\n if (\n q &&\n !`${t.description} ${t.department} ${t.vendor ?? ''} ${t.id}`.toLowerCase().includes(q)\n )\n return false;\n return true;\n });\n }, [transactions, txnStatusFilter, txnTypeFilter, txnSearch]);\n\n const filteredInvoices = useMemo(() => {\n const q = invSearch.trim().toLowerCase();\n return invoices.filter((i) => {\n if (invStatusFilter !== 'all' && i.status !== invStatusFilter) return false;\n if (q && !`${i.number} ${i.vendor}`.toLowerCase().includes(q)) return false;\n return true;\n });\n }, [invoices, invStatusFilter, invSearch]);\n\n const txnPage = usePagination(filteredTxns, {\n pageSize: 10,\n resetKey: `${txnStatusFilter}|${txnTypeFilter}|${txnSearch}`,\n });\n const invPage = usePagination(filteredInvoices, {\n pageSize: 10,\n resetKey: `${invStatusFilter}|${invSearch}`,\n });\n\n // ─── Approve / reject ───\n const [approveTransaction] = useMutation<ApproveTransactionResult>(APPROVE_TRANSACTION_MUTATION, {\n refetchQueries: ['AssetHandlerBootstrap'],\n onCompleted: () => {\n notify.success('Transaction approved', 'The transaction has been approved.');\n setActingId(null);\n },\n onError: (error) => {\n notify.error('Could not approve transaction', error.message);\n setActingId(null);\n },\n });\n const [rejectTransaction] = useMutation<RejectTransactionResult>(REJECT_TRANSACTION_MUTATION, {\n refetchQueries: ['AssetHandlerBootstrap'],\n onCompleted: () => {\n notify.success('Transaction rejected', 'The transaction has been rejected.');\n setActingId(null);\n },\n onError: (error) => {\n notify.error('Could not reject transaction', error.message);\n setActingId(null);\n },\n });\n\n const handleApprove = (id: string) => {\n setActingId(id);\n void approveTransaction({ variables: { id } });\n };\n const handleReject = (id: string) => {\n setActingId(id);\n void rejectTransaction({ variables: { id, reason: null } });\n };\n\n // ─── Export the active tab ───\n const handleExport = () => {\n const stamp = new Date().toISOString().slice(0, 10);\n if (activeTab === 'budgets') {\n if (budgets.length === 0) {\n notify.warning('Nothing to export', 'There are no budgets to export yet.');\n return;\n }\n downloadCsv(\n `budgets-${stamp}`,\n ['Name', 'Department', 'Category', 'Period', 'Allocated', 'Spent', 'Remaining', 'Status'],\n budgets.map((b) => [\n b.name,\n b.department,\n b.category,\n b.period,\n b.allocated,\n b.spent,\n b.remaining,\n b.status,\n ])\n );\n return;\n }\n if (activeTab === 'invoices') {\n if (invoices.length === 0) {\n notify.warning('Nothing to export', 'There are no invoices to export yet.');\n return;\n }\n downloadCsv(\n `invoices-${stamp}`,\n ['Invoice #', 'Vendor', 'Amount', 'Currency', 'Issue Date', 'Due Date', 'Status'],\n invoices.map((i) => [\n i.number,\n i.vendor,\n i.amount,\n i.currency,\n i.issueDate,\n i.dueDate,\n i.status,\n ])\n );\n return;\n }\n if (transactions.length === 0) {\n notify.warning('Nothing to export', 'There are no transactions to export yet.');\n return;\n }\n downloadCsv(\n `transactions-${stamp}`,\n ['ID', 'Type', 'Description', 'Department', 'Amount', 'Currency', 'Status', 'Date'],\n transactions.map((t) => [\n t.id,\n t.type,\n t.description,\n t.department,\n t.amount,\n t.currency,\n t.status,\n t.date,\n ])\n );\n };\n\n return (\n <div className=\"space-y-6 p-4 sm:p-6\">\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between\">\n <div>\n <h1 className=\"text-2xl font-bold sm:text-3xl\">\n <GradientText>Finance Hub</GradientText>\n </h1>\n <p className=\"mt-1 text-sm text-text-secondary\">Financial management for IT assets</p>\n </div>\n <CTAOverflowMenu\n primary={{ label: 'New Transaction', onSelect: () => setTxnDialogOpen(true) }}\n actions={[\n { label: 'New Budget', onSelect: () => setBudgetDialogOpen(true) },\n { label: 'New Invoice', onSelect: () => setInvoiceDialogOpen(true) },\n { label: 'Export', onSelect: handleExport, icon: <Download className=\"h-4 w-4\" /> },\n ]}\n />\n </div>\n\n <NewTransactionDialog open={txnDialogOpen} onOpenChange={setTxnDialogOpen} />\n <NewBudgetDialog open={budgetDialogOpen} onOpenChange={setBudgetDialogOpen} />\n <NewInvoiceDialog open={invoiceDialogOpen} onOpenChange={setInvoiceDialogOpen} />\n\n <PagePurpose>\n The money side of your asset estate: track spend, keep departmental budgets on course, and\n stay on top of vendor invoices. Use this hub to spot over-budget areas and overdue invoices\n early — so asset costs stay predictable and nothing slips past its due date.\n </PagePurpose>\n\n <NextSteps\n storageKey=\"assethandler-finance-hub\"\n steps={[\n {\n id: 'transactions',\n label: 'Review recent transactions',\n description: 'Check spend and approve anything still pending.',\n onClick: () => navigate('/transactions/transaction-list'),\n },\n {\n id: 'budgets',\n label: 'Review reporting dashboard',\n description: 'See budget health and spend trends across departments.',\n onClick: () => navigate('/reports/reports-dashboard'),\n },\n {\n id: 'reports',\n label: 'Build a finance report',\n description: 'Turn spend and budget data into a shareable report.',\n onClick: () => navigate('/reports/reports-dashboard'),\n },\n ]}\n />\n\n {/* ─── Money-forward KPI row ─── */}\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <StatTile\n label=\"Total Spend\"\n value={totalSpend}\n format={(v) => fmtMoney(v)}\n icon={DollarSign}\n hero\n delta={`${pendingTxns.length} pending`}\n deltaTone=\"neutral\"\n />\n <StatTile\n label=\"Budget Allocated\"\n value={budgetAllocated}\n format={(v) => fmtMoney(v)}\n icon={Wallet}\n />\n <StatTile\n label=\"Budget Spent\"\n value={budgetSpent}\n format={(v) => fmtMoney(v)}\n icon={TrendingDown}\n delta={overBudget.length > 0 ? `${overBudget.length} over` : undefined}\n deltaTone=\"negative\"\n deltaDirection={overBudget.length > 0 ? 'up' : 'neutral'}\n />\n <StatTile\n label=\"Invoices Outstanding\"\n value={invoicesOutstanding}\n format={(v) => fmtMoney(v)}\n icon={Receipt}\n delta={\n overdueInvoices.length > 0\n ? `${overdueInvoices.length} overdue`\n : outstandingCount > 0\n ? `${outstandingCount} open`\n : undefined\n }\n deltaTone={overdueInvoices.length > 0 ? 'negative' : 'neutral'}\n deltaDirection=\"neutral\"\n />\n </div>\n\n {/* ─── Insights charts ─── */}\n {hasCharts ? (\n <div className=\"grid gap-4 lg:grid-cols-2\">\n {budgetByDept.length > 0 ? (\n <ChartCard\n title=\"Budget vs spend\"\n subtitle=\"Allocated against actual spend by department\"\n icon={BarChart3}\n >\n <BarsChart\n data={budgetByDept}\n xKey=\"department\"\n series={[\n { key: 'allocated', label: 'Allocated' },\n { key: 'spent', label: 'Spent' },\n ]}\n height={260}\n valueFormat={compactUsd}\n ariaLabel=\"Budget allocated versus spent by department\"\n />\n </ChartCard>\n ) : null}\n {spendByCategory.length > 0 ? (\n <ChartCard\n title=\"Spend by category\"\n subtitle=\"Recorded transaction spend, grouped by category\"\n icon={PieChartIcon}\n >\n <DonutChart\n data={spendByCategory}\n centerLabel=\"Total spend\"\n centerValue={totalSpend}\n valueFormat={(v) => fmtMoney(v)}\n height={260}\n ariaLabel=\"Transaction spend by category\"\n />\n </ChartCard>\n ) : null}\n </div>\n ) : null}\n\n <Tabs\n value={activeTab}\n onValueChange={(v) => setActiveTab(v as typeof activeTab)}\n className=\"space-y-4\"\n >\n <TabsList>\n <TabsTrigger value=\"transactions\">Transactions</TabsTrigger>\n <TabsTrigger value=\"budgets\">Budgets</TabsTrigger>\n <TabsTrigger value=\"invoices\">Invoices</TabsTrigger>\n </TabsList>\n\n {/* ─── Transactions ─── */}\n <TabsContent value=\"transactions\" className=\"space-y-4\">\n {transactions.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title=\"No transactions yet\"\n description=\"Asset-related spend and reimbursements will appear here as they are recorded.\"\n />\n ) : (\n <>\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center\">\n <div className=\"relative flex-1\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-muted\" />\n <Input\n value={txnSearch}\n onChange={(e) => setTxnSearch(e.target.value)}\n placeholder=\"Search description, vendor or department\"\n className=\"pl-9\"\n />\n </div>\n <Select value={txnStatusFilter} onValueChange={setTxnStatusFilter}>\n <SelectTrigger className=\"w-full sm:w-40\">\n <SelectValue placeholder=\"Status\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">All statuses</SelectItem>\n {TRANSACTION_STATUSES.map((s) => (\n <SelectItem key={s} value={s.toLowerCase()}>\n {humanize(s)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Select value={txnTypeFilter} onValueChange={setTxnTypeFilter}>\n <SelectTrigger className=\"w-full sm:w-40\">\n <SelectValue placeholder=\"Type\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">All types</SelectItem>\n {TRANSACTION_TYPES.map((t) => (\n <SelectItem key={t} value={t.toLowerCase()}>\n {humanize(t)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {filteredTxns.length === 0 ? (\n <GlassCard treatment=\"glass\" className=\"border-border-seam\">\n <p className=\"p-8 text-center text-sm text-text-secondary\">\n No transactions match your filters.\n </p>\n </GlassCard>\n ) : (\n <GlassCard treatment=\"glass\" className=\"overflow-hidden border-border-seam\">\n {/* Desktop table */}\n <div className=\"hidden overflow-x-auto md:block\">\n <table className=\"w-full min-w-[820px] text-sm\">\n <thead>\n <tr className=\"border-b border-border-seam bg-bg-sunken/40 text-left\">\n <th className=\"p-3 font-medium\">Type</th>\n <th className=\"p-3 font-medium\">Description</th>\n <th className=\"p-3 font-medium\">Department</th>\n <th className=\"p-3 text-right font-medium\">Amount</th>\n <th className=\"p-3 font-medium\">Status</th>\n <th className=\"p-3 font-medium\">Date</th>\n <th className=\"p-3 text-right font-medium\">Actions</th>\n </tr>\n </thead>\n <tbody>\n {txnPage.pageItems.map((txn) => (\n <tr\n key={txn.id}\n className=\"cursor-pointer border-b border-border-seam/60 last:border-0 hover:bg-bg-sunken/40\"\n onClick={() => navigate('/transactions/' + txn.id)}\n >\n <td className=\"p-3\">\n <StatusPill tone={txnTypeTone(txn.type)}>{txn.type}</StatusPill>\n </td>\n <td className=\"max-w-xs truncate p-3\" title={txn.description}>\n {txn.description}\n </td>\n <td className=\"p-3 text-xs text-text-secondary\">{txn.department}</td>\n <td\n className={cn(\n 'p-3 text-right font-medium tabular-nums',\n txn.amount < 0 && 'text-status-error-text'\n )}\n >\n {fmtMoney(Math.abs(txn.amount), txn.currency)}\n </td>\n <td className=\"p-3\">\n <StatusPill tone={txnStatusTone(txn.status)}>{txn.status}</StatusPill>\n </td>\n <td className=\"p-3 text-xs text-text-secondary\">\n {formatDate(txn.date)}\n </td>\n <td className=\"p-3\">\n <div className=\"flex justify-end\">\n <TransactionActions\n txn={txn}\n actingId={actingId}\n onApprove={handleApprove}\n onReject={handleReject}\n />\n </div>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n\n {/* Mobile cards */}\n <div className=\"divide-y divide-border-seam/60 md:hidden\">\n {txnPage.pageItems.map((txn) => (\n <button\n key={txn.id}\n type=\"button\"\n className=\"block w-full p-4 text-left hover:bg-bg-sunken/40\"\n onClick={() => navigate('/transactions/' + txn.id)}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <p className=\"min-w-0 flex-1 truncate font-medium\">{txn.description}</p>\n <span\n className={cn(\n 'shrink-0 font-semibold tabular-nums',\n txn.amount < 0 && 'text-status-error-text'\n )}\n >\n {fmtMoney(Math.abs(txn.amount), txn.currency)}\n </span>\n </div>\n <div className=\"mt-2 flex flex-wrap items-center gap-2\">\n <StatusPill tone={txnTypeTone(txn.type)}>{txn.type}</StatusPill>\n <StatusPill tone={txnStatusTone(txn.status)}>{txn.status}</StatusPill>\n <span className=\"text-xs text-text-secondary\">\n {txn.department} · {formatDate(txn.date)}\n </span>\n </div>\n {txn.status === 'pending' ? (\n <div className=\"mt-3\">\n <TransactionActions\n txn={txn}\n actingId={actingId}\n onApprove={handleApprove}\n onReject={handleReject}\n />\n </div>\n ) : null}\n </button>\n ))}\n </div>\n\n <div className=\"px-3\">\n <Pagination\n page={txnPage.page}\n pageCount={txnPage.pageCount}\n rangeStart={txnPage.rangeStart}\n rangeEnd={txnPage.rangeEnd}\n totalItems={txnPage.totalItems}\n canPrev={txnPage.canPrev}\n canNext={txnPage.canNext}\n onPrev={txnPage.prevPage}\n onNext={txnPage.nextPage}\n itemLabel=\"transactions\"\n />\n </div>\n </GlassCard>\n )}\n </>\n )}\n </TabsContent>\n\n {/* ─── Budgets ─── */}\n <TabsContent value=\"budgets\" className=\"space-y-4\">\n {budgets.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-generic\"\n title=\"No budgets defined\"\n description=\"Create departmental budgets to track allocated vs. actual asset spend.\"\n />\n ) : (\n <div className=\"grid gap-4 md:grid-cols-2\">\n {budgets.map((budget: Budget) => (\n <GlassCard\n key={budget.id}\n treatment=\"glass\"\n className=\"cursor-pointer border-border-seam\"\n >\n <div\n className=\"p-5\"\n role=\"button\"\n tabIndex={0}\n onClick={() => navigate('/finance/budgets/' + budget.id)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ')\n navigate('/finance/budgets/' + budget.id);\n }}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"min-w-0\">\n <h3 className=\"truncate font-semibold text-text-primary\">{budget.name}</h3>\n <p className=\"mt-0.5 text-xs text-text-secondary\">\n {budget.department} · {budget.period}\n </p>\n </div>\n <StatusPill tone={budgetStatusTone(budget.status)}>\n {budget.status.replace(/_/g, ' ')}\n </StatusPill>\n </div>\n <div className=\"mt-4 space-y-3\">\n <div className=\"flex justify-between text-sm\">\n <span className=\"text-text-secondary\">Allocated</span>\n <span className=\"font-medium tabular-nums\">\n {fmtMoney(budget.allocated)}\n </span>\n </div>\n <div className=\"flex justify-between text-sm\">\n <span className=\"text-text-secondary\">Remaining</span>\n <span\n className={cn(\n 'font-medium tabular-nums',\n budget.remaining < 0\n ? 'text-status-error-text'\n : 'text-status-success-text'\n )}\n >\n {fmtMoney(budget.remaining)}\n </span>\n </div>\n <ProgressMeter\n value={budget.spent}\n max={budget.allocated}\n label=\"Spent\"\n format={(v) => fmtMoney(v)}\n thresholds={{ warning: 0.8, danger: 1 }}\n />\n </div>\n </div>\n </GlassCard>\n ))}\n </div>\n )}\n </TabsContent>\n\n {/* ─── Invoices ─── */}\n <TabsContent value=\"invoices\" className=\"space-y-4\">\n {invoices.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-files\"\n title=\"No invoices\"\n description=\"Vendor invoices for asset purchases and services will be listed here.\"\n />\n ) : (\n <>\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center\">\n <div className=\"relative flex-1\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-muted\" />\n <Input\n value={invSearch}\n onChange={(e) => setInvSearch(e.target.value)}\n placeholder=\"Search invoice number or vendor\"\n className=\"pl-9\"\n />\n </div>\n <Select value={invStatusFilter} onValueChange={setInvStatusFilter}>\n <SelectTrigger className=\"w-full sm:w-40\">\n <SelectValue placeholder=\"Status\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">All statuses</SelectItem>\n {INVOICE_STATUSES.map((s) => (\n <SelectItem key={s} value={s.toLowerCase()}>\n {humanize(s)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {filteredInvoices.length === 0 ? (\n <GlassCard treatment=\"glass\" className=\"border-border-seam\">\n <p className=\"p-8 text-center text-sm text-text-secondary\">\n No invoices match your filters.\n </p>\n </GlassCard>\n ) : (\n <GlassCard treatment=\"glass\" className=\"overflow-hidden border-border-seam\">\n {/* Desktop table */}\n <div className=\"hidden overflow-x-auto md:block\">\n <table className=\"w-full min-w-[720px] text-sm\">\n <thead>\n <tr className=\"border-b border-border-seam bg-bg-sunken/40 text-left\">\n <th className=\"p-3 font-medium\">Invoice #</th>\n <th className=\"p-3 font-medium\">Vendor</th>\n <th className=\"p-3 text-right font-medium\">Amount</th>\n <th className=\"p-3 font-medium\">Issue Date</th>\n <th className=\"p-3 font-medium\">Due Date</th>\n <th className=\"p-3 font-medium\">Status</th>\n </tr>\n </thead>\n <tbody>\n {invPage.pageItems.map((inv: Invoice) => (\n <tr\n key={inv.id}\n className=\"cursor-pointer border-b border-border-seam/60 last:border-0 hover:bg-bg-sunken/40\"\n onClick={() => navigate('/finance/invoices/' + inv.id)}\n >\n <td className=\"p-3 font-mono text-xs\">{inv.number}</td>\n <td className=\"p-3\">{inv.vendor}</td>\n <td className=\"p-3 text-right font-medium tabular-nums\">\n {fmtMoney(inv.amount, inv.currency)}\n </td>\n <td className=\"p-3 text-xs text-text-secondary\">\n {formatDate(inv.issueDate)}\n </td>\n <td className=\"p-3 text-xs text-text-secondary\">\n {formatDate(inv.dueDate)}\n </td>\n <td className=\"p-3\">\n <StatusPill tone={invoiceStatusTone(inv.status)}>\n {inv.status}\n </StatusPill>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n\n {/* Mobile cards */}\n <div className=\"divide-y divide-border-seam/60 md:hidden\">\n {invPage.pageItems.map((inv: Invoice) => (\n <button\n key={inv.id}\n type=\"button\"\n className=\"block w-full p-4 text-left hover:bg-bg-sunken/40\"\n onClick={() => navigate('/finance/invoices/' + inv.id)}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"min-w-0\">\n <p className=\"truncate font-mono text-xs text-text-secondary\">\n {inv.number}\n </p>\n <p className=\"truncate font-medium\">{inv.vendor}</p>\n </div>\n <span className=\"shrink-0 font-semibold tabular-nums\">\n {fmtMoney(inv.amount, inv.currency)}\n </span>\n </div>\n <div className=\"mt-2 flex flex-wrap items-center gap-2\">\n <StatusPill tone={invoiceStatusTone(inv.status)}>{inv.status}</StatusPill>\n <span className=\"text-xs text-text-secondary\">\n Due {formatDate(inv.dueDate)}\n </span>\n </div>\n </button>\n ))}\n </div>\n\n <div className=\"px-3\">\n <Pagination\n page={invPage.page}\n pageCount={invPage.pageCount}\n rangeStart={invPage.rangeStart}\n rangeEnd={invPage.rangeEnd}\n totalItems={invPage.totalItems}\n canPrev={invPage.canPrev}\n canNext={invPage.canNext}\n onPrev={invPage.prevPage}\n onNext={invPage.nextPage}\n itemLabel=\"invoices\"\n />\n </div>\n </GlassCard>\n )}\n </>\n )}\n </TabsContent>\n </Tabs>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"FinanceFinanceHubPage.js","names":[],"sources":["../../../src/assethandler/pages/FinanceFinanceHubPage.tsx"],"sourcesContent":["import { useMemo, useState, type ReactNode } from 'react';\nimport { useAssetMoney } from '../providers/AssetHandlerProvider';\nimport { useAssetHandlerNavigate } from '../hooks/useAssetHandlerNavigate';\nimport {\n Button,\n GlassCard,\n Input,\n Label,\n Textarea,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n GradientText,\n CTAOverflowMenu,\n PagePurpose,\n NextSteps,\n IllustratedEmptyState,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n} from '@burdenoff/fe-libs/ui';\nimport {\n DollarSign,\n TrendingDown,\n Receipt,\n Wallet,\n Download,\n Loader2,\n Check,\n X,\n Search,\n BarChart3,\n PieChart as PieChartIcon,\n} from 'lucide-react';\nimport { gql } from '@apollo/client';\nimport { useMutation } from '@apollo/client/react';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\nimport type { Budget, FinanceTransaction, Invoice } from '../store/assethandlerStore';\nimport { notify } from '../utils/toast';\nimport { cn } from '../utils/cn';\nimport { downloadCsv } from '../utils/csv';\nimport {\n StatTile,\n ChartCard,\n BarsChart,\n DonutChart,\n ProgressMeter,\n Pagination,\n usePagination,\n type DonutSlice,\n} from '../components';\n\n// ─── Mutations ────────────────────────────────────────────────────────────────\nconst CREATE_TRANSACTION_MUTATION = gql`\n mutation AssetHandlerCreateTransaction($input: CreateTransactionInput!) {\n createTransaction(input: $input) {\n id\n description\n }\n }\n`;\n\nconst CREATE_BUDGET_MUTATION = gql`\n mutation AssetHandlerCreateBudget($input: AssetHandlerCreateBudgetInput!) {\n createBudget(input: $input) {\n id\n name\n }\n }\n`;\n\nconst CREATE_INVOICE_MUTATION = gql`\n mutation AssetHandlerCreateInvoice($input: AssetHandlerCreateInvoiceInput!) {\n createInvoice(input: $input) {\n id\n number\n }\n }\n`;\n\nconst APPROVE_TRANSACTION_MUTATION = gql`\n mutation AssetHandlerHubApproveTransaction($id: ID!) {\n approveTransaction(id: $id) {\n id\n status\n }\n }\n`;\n\nconst REJECT_TRANSACTION_MUTATION = gql`\n mutation AssetHandlerHubRejectTransaction($id: ID!, $reason: String) {\n rejectTransaction(id: $id, reason: $reason) {\n id\n status\n }\n }\n`;\n\ninterface CreateTransactionResult {\n createTransaction: { id: string; description: string };\n}\ninterface CreateBudgetResult {\n createBudget: { id: string; name: string };\n}\ninterface CreateInvoiceResult {\n createInvoice: { id: string; number: string };\n}\ninterface ApproveTransactionResult {\n approveTransaction: { id: string; status: string };\n}\ninterface RejectTransactionResult {\n rejectTransaction: { id: string; status: string };\n}\n\nconst TRANSACTION_TYPES = ['PURCHASE', 'LEASE', 'DISPOSAL', 'TRANSFER', 'MAINTENANCE'] as const;\nconst TRANSACTION_STATUSES = ['PENDING', 'APPROVED', 'COMPLETED', 'REJECTED'] as const;\nconst BUDGET_STATUSES = ['ON_TRACK', 'OVER_BUDGET', 'UNDER_BUDGET'] as const;\nconst INVOICE_STATUSES = ['DRAFT', 'SENT', 'PAID', 'OVERDUE', 'CANCELLED'] as const;\n\nconst humanize = (value: string) =>\n value\n .toLowerCase()\n .replace(/_/g, ' ')\n .replace(/^\\w/, (c) => c.toUpperCase());\n\n// ─── Presentation helpers ───────────────────────────────────────────────────\ntype Tone = 'success' | 'warning' | 'error' | 'info' | 'neutral';\n\nconst PILL_TONE: Record<Tone, string> = {\n success: 'bg-status-success-subtle text-status-success-text',\n warning: 'bg-status-warning-subtle text-status-warning-text',\n error: 'bg-status-error-subtle text-status-error-text',\n info: 'bg-status-info-subtle text-status-info-text',\n neutral: 'bg-bg-sunken text-text-secondary',\n};\n\nfunction StatusPill({ tone, children }: { tone: Tone; children: ReactNode }) {\n return (\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium capitalize',\n PILL_TONE[tone]\n )}\n >\n {children}\n </span>\n );\n}\n\nconst txnStatusTone = (status: string): Tone =>\n status === 'approved' || status === 'completed'\n ? 'success'\n : status === 'rejected'\n ? 'error'\n : status === 'pending'\n ? 'warning'\n : 'neutral';\n\nconst txnTypeTone = (type: string): Tone =>\n type === 'purchase' || type === 'lease'\n ? 'info'\n : type === 'disposal'\n ? 'error'\n : type === 'maintenance'\n ? 'warning'\n : 'neutral';\n\nconst budgetStatusTone = (status: string): Tone =>\n status === 'over_budget' ? 'error' : status === 'under_budget' ? 'success' : 'info';\n\nconst invoiceStatusTone = (status: string): Tone =>\n status === 'paid'\n ? 'success'\n : status === 'overdue'\n ? 'error'\n : status === 'sent'\n ? 'warning'\n : 'neutral';\n\nconst formatDate = (value: string): string => {\n const parsed = new Date(value);\n return Number.isNaN(parsed.getTime()) ? value : parsed.toLocaleDateString();\n};\n\n// ─── New Transaction dialog ───────────────────────────────────────────────────\nfunction NewTransactionDialog({\n open,\n onOpenChange,\n}: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}) {\n const [type, setType] = useState<(typeof TRANSACTION_TYPES)[number]>('PURCHASE');\n const [status, setStatus] = useState<(typeof TRANSACTION_STATUSES)[number]>('PENDING');\n const [amount, setAmount] = useState('');\n const { currency: moduleCurrency } = useAssetMoney();\n const [currency, setCurrency] = useState(moduleCurrency);\n const [category, setCategory] = useState('');\n const [description, setDescription] = useState('');\n const [vendor, setVendor] = useState('');\n const [department, setDepartment] = useState('');\n\n const reset = () => {\n setType('PURCHASE');\n setStatus('PENDING');\n setAmount('');\n setCurrency(moduleCurrency);\n setCategory('');\n setDescription('');\n setVendor('');\n setDepartment('');\n };\n\n const [createTransaction, { loading }] = useMutation<CreateTransactionResult>(\n CREATE_TRANSACTION_MUTATION,\n {\n refetchQueries: ['AssetHandlerBootstrap'],\n onCompleted: (data) => {\n notify.success(\n 'Transaction created',\n `${data.createTransaction.description} was recorded.`\n );\n reset();\n onOpenChange(false);\n },\n onError: (error) => notify.error('Could not create transaction', error.message),\n }\n );\n\n const handleSubmit = () => {\n const parsedAmount = Number(amount);\n if (!Number.isFinite(parsedAmount) || amount.trim() === '') {\n notify.warning('Invalid amount', 'Enter a numeric amount for the transaction.');\n return;\n }\n if (!category.trim() || !description.trim()) {\n notify.warning('Missing details', 'Category and description are required.');\n return;\n }\n void createTransaction({\n variables: {\n input: {\n amount: parsedAmount,\n category: category.trim(),\n currency: currency.trim() || moduleCurrency,\n description: description.trim(),\n type,\n status,\n vendor: vendor.trim() || null,\n department: department.trim() || null,\n },\n },\n });\n };\n\n return (\n <ResponsiveDialog open={open} onOpenChange={onOpenChange}>\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>New Transaction</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Record a financial movement against your assets.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <div className=\"space-y-4\">\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Type</Label>\n <Select value={type} onValueChange={(v) => setType(v as typeof type)}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {TRANSACTION_TYPES.map((t) => (\n <SelectItem key={t} value={t}>\n {humanize(t)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-2\">\n <Label>Status</Label>\n <Select value={status} onValueChange={(v) => setStatus(v as typeof status)}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {TRANSACTION_STATUSES.map((s) => (\n <SelectItem key={s} value={s}>\n {humanize(s)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Amount *</Label>\n <Input\n type=\"number\"\n placeholder=\"e.g., 1500\"\n value={amount}\n onChange={(e) => setAmount(e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Currency</Label>\n <Input value={currency} onChange={(e) => setCurrency(e.target.value)} />\n </div>\n </div>\n <div className=\"space-y-2\">\n <Label>Category *</Label>\n <Input\n placeholder=\"e.g., it_hardware\"\n value={category}\n onChange={(e) => setCategory(e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Description *</Label>\n <Textarea\n placeholder=\"What is this transaction for?\"\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n rows={2}\n />\n </div>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Vendor</Label>\n <Input value={vendor} onChange={(e) => setVendor(e.target.value)} />\n </div>\n <div className=\"space-y-2\">\n <Label>Department</Label>\n <Input value={department} onChange={(e) => setDepartment(e.target.value)} />\n </div>\n </div>\n </div>\n <ResponsiveDialogFooter>\n <Button variant=\"outline\" onClick={() => onOpenChange(false)} disabled={loading}>\n Cancel\n </Button>\n <Button onClick={handleSubmit} disabled={loading}>\n {loading ? <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" /> : null}\n {loading ? 'Creating…' : 'Create Transaction'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n );\n}\n\n// ─── New Budget dialog ────────────────────────────────────────────────────────\nfunction NewBudgetDialog({\n open,\n onOpenChange,\n}: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}) {\n const [name, setName] = useState('');\n const [category, setCategory] = useState('');\n const [department, setDepartment] = useState('');\n const [period, setPeriod] = useState('');\n const [allocated, setAllocated] = useState('');\n const [spent, setSpent] = useState('0');\n const [status, setStatus] = useState<(typeof BUDGET_STATUSES)[number]>('ON_TRACK');\n\n const reset = () => {\n setName('');\n setCategory('');\n setDepartment('');\n setPeriod('');\n setAllocated('');\n setSpent('0');\n setStatus('ON_TRACK');\n };\n\n const [createBudget, { loading }] = useMutation<CreateBudgetResult>(CREATE_BUDGET_MUTATION, {\n refetchQueries: ['AssetHandlerBootstrap'],\n onCompleted: (data) => {\n notify.success('Budget created', `${data.createBudget.name} is now being tracked.`);\n reset();\n onOpenChange(false);\n },\n onError: (error) => notify.error('Could not create budget', error.message),\n });\n\n const handleSubmit = () => {\n const parsedAllocated = Number(allocated);\n const parsedSpent = Number(spent);\n if (!name.trim() || !category.trim() || !department.trim() || !period.trim()) {\n notify.warning('Missing details', 'Name, category, department and period are required.');\n return;\n }\n if (!Number.isFinite(parsedAllocated) || allocated.trim() === '') {\n notify.warning('Invalid allocation', 'Enter a numeric allocated amount.');\n return;\n }\n void createBudget({\n variables: {\n input: {\n allocated: parsedAllocated,\n category: category.trim(),\n department: department.trim(),\n name: name.trim(),\n period: period.trim(),\n spent: Number.isFinite(parsedSpent) ? parsedSpent : 0,\n status,\n },\n },\n });\n };\n\n return (\n <ResponsiveDialog open={open} onOpenChange={onOpenChange}>\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>New Budget</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Set an allocation to track departmental asset spend.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Label>Name *</Label>\n <Input\n placeholder=\"e.g., IT Hardware Q1\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n />\n </div>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Category *</Label>\n <Input value={category} onChange={(e) => setCategory(e.target.value)} />\n </div>\n <div className=\"space-y-2\">\n <Label>Department *</Label>\n <Input value={department} onChange={(e) => setDepartment(e.target.value)} />\n </div>\n </div>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Period *</Label>\n <Input\n placeholder=\"e.g., Q1 2026\"\n value={period}\n onChange={(e) => setPeriod(e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Status</Label>\n <Select value={status} onValueChange={(v) => setStatus(v as typeof status)}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {BUDGET_STATUSES.map((s) => (\n <SelectItem key={s} value={s}>\n {humanize(s)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Allocated *</Label>\n <Input\n type=\"number\"\n placeholder=\"e.g., 50000\"\n value={allocated}\n onChange={(e) => setAllocated(e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Spent</Label>\n <Input type=\"number\" value={spent} onChange={(e) => setSpent(e.target.value)} />\n </div>\n </div>\n </div>\n <ResponsiveDialogFooter>\n <Button variant=\"outline\" onClick={() => onOpenChange(false)} disabled={loading}>\n Cancel\n </Button>\n <Button onClick={handleSubmit} disabled={loading}>\n {loading ? <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" /> : null}\n {loading ? 'Creating…' : 'Create Budget'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n );\n}\n\n// ─── New Invoice dialog ───────────────────────────────────────────────────────\nfunction NewInvoiceDialog({\n open,\n onOpenChange,\n}: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}) {\n const [number, setNumber] = useState('');\n const [vendor, setVendor] = useState('');\n const [amount, setAmount] = useState('');\n const { currency: moduleCurrency } = useAssetMoney();\n const [currency, setCurrency] = useState(moduleCurrency);\n const [issueDate, setIssueDate] = useState('');\n const [dueDate, setDueDate] = useState('');\n const [relatedPO, setRelatedPO] = useState('');\n const [status, setStatus] = useState<(typeof INVOICE_STATUSES)[number]>('DRAFT');\n\n const reset = () => {\n setNumber('');\n setVendor('');\n setAmount('');\n setCurrency(moduleCurrency);\n setIssueDate('');\n setDueDate('');\n setRelatedPO('');\n setStatus('DRAFT');\n };\n\n const [createInvoice, { loading }] = useMutation<CreateInvoiceResult>(CREATE_INVOICE_MUTATION, {\n refetchQueries: ['AssetHandlerBootstrap'],\n onCompleted: (data) => {\n notify.success('Invoice created', `Invoice ${data.createInvoice.number} was added.`);\n reset();\n onOpenChange(false);\n },\n onError: (error) => notify.error('Could not create invoice', error.message),\n });\n\n const handleSubmit = () => {\n const parsedAmount = Number(amount);\n if (!number.trim() || !vendor.trim()) {\n notify.warning('Missing details', 'Invoice number and vendor are required.');\n return;\n }\n if (!Number.isFinite(parsedAmount) || amount.trim() === '') {\n notify.warning('Invalid amount', 'Enter a numeric invoice amount.');\n return;\n }\n if (!issueDate || !dueDate) {\n notify.warning('Missing dates', 'Issue date and due date are required.');\n return;\n }\n void createInvoice({\n variables: {\n input: {\n amount: parsedAmount,\n currency: currency.trim() || moduleCurrency,\n dueDate: new Date(dueDate).toISOString(),\n issueDate: new Date(issueDate).toISOString(),\n number: number.trim(),\n relatedPO: relatedPO.trim() || null,\n status,\n vendor: vendor.trim(),\n },\n },\n });\n };\n\n return (\n <ResponsiveDialog open={open} onOpenChange={onOpenChange}>\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>New Invoice</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Log a vendor invoice for an asset purchase or service.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <div className=\"space-y-4\">\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Invoice Number *</Label>\n <Input\n placeholder=\"e.g., INV-2026-001\"\n value={number}\n onChange={(e) => setNumber(e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Vendor *</Label>\n <Input value={vendor} onChange={(e) => setVendor(e.target.value)} />\n </div>\n </div>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Amount *</Label>\n <Input\n type=\"number\"\n placeholder=\"e.g., 12000\"\n value={amount}\n onChange={(e) => setAmount(e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Currency</Label>\n <Input value={currency} onChange={(e) => setCurrency(e.target.value)} />\n </div>\n </div>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Issue Date *</Label>\n <Input type=\"date\" value={issueDate} onChange={(e) => setIssueDate(e.target.value)} />\n </div>\n <div className=\"space-y-2\">\n <Label>Due Date *</Label>\n <Input type=\"date\" value={dueDate} onChange={(e) => setDueDate(e.target.value)} />\n </div>\n </div>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Related PO</Label>\n <Input value={relatedPO} onChange={(e) => setRelatedPO(e.target.value)} />\n </div>\n <div className=\"space-y-2\">\n <Label>Status</Label>\n <Select value={status} onValueChange={(v) => setStatus(v as typeof status)}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {INVOICE_STATUSES.map((s) => (\n <SelectItem key={s} value={s}>\n {humanize(s)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n </div>\n <ResponsiveDialogFooter>\n <Button variant=\"outline\" onClick={() => onOpenChange(false)} disabled={loading}>\n Cancel\n </Button>\n <Button onClick={handleSubmit} disabled={loading}>\n {loading ? <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" /> : null}\n {loading ? 'Creating…' : 'Create Invoice'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n );\n}\n\n// ─── Transaction row action buttons (approve / reject pending) ────────────────\nfunction TransactionActions({\n txn,\n actingId,\n onApprove,\n onReject,\n}: {\n txn: FinanceTransaction;\n actingId: string | null;\n onApprove: (id: string) => void;\n onReject: (id: string) => void;\n}) {\n if (txn.status !== 'pending') return null;\n const busy = actingId === txn.id;\n return (\n <div className=\"flex items-center gap-1.5\">\n <Button\n size=\"sm\"\n variant=\"outline\"\n className=\"h-7 gap-1 border-status-success-subtle px-2 text-status-success-text\"\n disabled={busy}\n onClick={(e) => {\n e.stopPropagation();\n onApprove(txn.id);\n }}\n >\n {busy ? (\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n <Check className=\"h-3.5 w-3.5\" />\n )}\n Approve\n </Button>\n <Button\n size=\"sm\"\n variant=\"outline\"\n className=\"h-7 gap-1 border-status-error-subtle px-2 text-status-error-text\"\n disabled={busy}\n onClick={(e) => {\n e.stopPropagation();\n onReject(txn.id);\n }}\n >\n <X className=\"h-3.5 w-3.5\" />\n Reject\n </Button>\n </div>\n );\n}\n\nexport function FinanceFinanceHubPage() {\n const { currency: moduleCurrency, compact: compactUsd } = useAssetMoney();\n // A record's own currency wins; the module currency is the fallback for rows\n // that never carried one.\n const fmtMoney = (value: number, currency?: string | null): string => {\n try {\n return new Intl.NumberFormat(undefined, {\n style: 'currency',\n currency: currency || moduleCurrency,\n maximumFractionDigits: 2,\n }).format(value);\n } catch {\n // An unknown/invalid ISO code: show the code rather than a wrong symbol.\n return `${currency || moduleCurrency} ${value.toLocaleString()}`;\n }\n };\n\n const navigate = useAssetHandlerNavigate();\n const { transactions, budgets, invoices } = useAssetHandlerStore();\n\n const [txnDialogOpen, setTxnDialogOpen] = useState(false);\n const [budgetDialogOpen, setBudgetDialogOpen] = useState(false);\n const [invoiceDialogOpen, setInvoiceDialogOpen] = useState(false);\n\n const [activeTab, setActiveTab] = useState<'transactions' | 'budgets' | 'invoices'>(\n 'transactions'\n );\n\n const [txnStatusFilter, setTxnStatusFilter] = useState<string>('all');\n const [txnTypeFilter, setTxnTypeFilter] = useState<string>('all');\n const [txnSearch, setTxnSearch] = useState('');\n const [invStatusFilter, setInvStatusFilter] = useState<string>('all');\n const [invSearch, setInvSearch] = useState('');\n\n const [actingId, setActingId] = useState<string | null>(null);\n\n // ─── Headline finance figures (money-forward, real store data) ───\n const totalSpend = transactions.filter((t) => t.amount > 0).reduce((s, t) => s + t.amount, 0);\n const pendingTxns = transactions.filter((t) => t.status === 'pending');\n const overBudget = budgets.filter((b) => b.status === 'over_budget');\n const overdueInvoices = invoices.filter((i) => i.status === 'overdue');\n const budgetAllocated = budgets.reduce((s, b) => s + b.allocated, 0);\n const budgetSpent = budgets.reduce((s, b) => s + b.spent, 0);\n const invoicesOutstanding = invoices\n .filter((i) => i.status !== 'paid' && i.status !== 'cancelled')\n .reduce((s, i) => s + i.amount, 0);\n const outstandingCount = invoices.filter(\n (i) => i.status !== 'paid' && i.status !== 'cancelled'\n ).length;\n\n // ─── Chart aggregations (real data only) ───\n const budgetByDept = useMemo(() => {\n const map = new Map<string, { allocated: number; spent: number }>();\n for (const b of budgets) {\n const key = b.department || 'Unassigned';\n const cur = map.get(key) ?? { allocated: 0, spent: 0 };\n cur.allocated += b.allocated;\n cur.spent += b.spent;\n map.set(key, cur);\n }\n return Array.from(map, ([department, v]) => ({ department, ...v })).sort(\n (a, b) => b.allocated - a.allocated\n );\n }, [budgets]);\n\n const spendByCategory = useMemo<DonutSlice[]>(() => {\n const map = new Map<string, number>();\n for (const t of transactions) {\n if (t.amount > 0) map.set(t.category, (map.get(t.category) ?? 0) + t.amount);\n }\n return Array.from(map, ([name, value]) => ({ name: humanize(name), value })).sort(\n (a, b) => b.value - a.value\n );\n }, [transactions]);\n\n const hasCharts = budgetByDept.length > 0 || spendByCategory.length > 0;\n\n // ─── Filtered lists ───\n const filteredTxns = useMemo(() => {\n const q = txnSearch.trim().toLowerCase();\n return transactions.filter((t) => {\n if (txnStatusFilter !== 'all' && t.status !== txnStatusFilter) return false;\n if (txnTypeFilter !== 'all' && t.type !== txnTypeFilter) return false;\n if (\n q &&\n !`${t.description} ${t.department} ${t.vendor ?? ''} ${t.id}`.toLowerCase().includes(q)\n )\n return false;\n return true;\n });\n }, [transactions, txnStatusFilter, txnTypeFilter, txnSearch]);\n\n const filteredInvoices = useMemo(() => {\n const q = invSearch.trim().toLowerCase();\n return invoices.filter((i) => {\n if (invStatusFilter !== 'all' && i.status !== invStatusFilter) return false;\n if (q && !`${i.number} ${i.vendor}`.toLowerCase().includes(q)) return false;\n return true;\n });\n }, [invoices, invStatusFilter, invSearch]);\n\n const txnPage = usePagination(filteredTxns, {\n pageSize: 10,\n resetKey: `${txnStatusFilter}|${txnTypeFilter}|${txnSearch}`,\n });\n const invPage = usePagination(filteredInvoices, {\n pageSize: 10,\n resetKey: `${invStatusFilter}|${invSearch}`,\n });\n\n // ─── Approve / reject ───\n const [approveTransaction] = useMutation<ApproveTransactionResult>(APPROVE_TRANSACTION_MUTATION, {\n refetchQueries: ['AssetHandlerBootstrap'],\n onCompleted: () => {\n notify.success('Transaction approved', 'The transaction has been approved.');\n setActingId(null);\n },\n onError: (error) => {\n notify.error('Could not approve transaction', error.message);\n setActingId(null);\n },\n });\n const [rejectTransaction] = useMutation<RejectTransactionResult>(REJECT_TRANSACTION_MUTATION, {\n refetchQueries: ['AssetHandlerBootstrap'],\n onCompleted: () => {\n notify.success('Transaction rejected', 'The transaction has been rejected.');\n setActingId(null);\n },\n onError: (error) => {\n notify.error('Could not reject transaction', error.message);\n setActingId(null);\n },\n });\n\n const handleApprove = (id: string) => {\n setActingId(id);\n void approveTransaction({ variables: { id } });\n };\n const handleReject = (id: string) => {\n setActingId(id);\n void rejectTransaction({ variables: { id, reason: null } });\n };\n\n // ─── Export the active tab ───\n const handleExport = () => {\n const stamp = new Date().toISOString().slice(0, 10);\n if (activeTab === 'budgets') {\n if (budgets.length === 0) {\n notify.warning('Nothing to export', 'There are no budgets to export yet.');\n return;\n }\n downloadCsv(\n `budgets-${stamp}`,\n ['Name', 'Department', 'Category', 'Period', 'Allocated', 'Spent', 'Remaining', 'Status'],\n budgets.map((b) => [\n b.name,\n b.department,\n b.category,\n b.period,\n b.allocated,\n b.spent,\n b.remaining,\n b.status,\n ])\n );\n return;\n }\n if (activeTab === 'invoices') {\n if (invoices.length === 0) {\n notify.warning('Nothing to export', 'There are no invoices to export yet.');\n return;\n }\n downloadCsv(\n `invoices-${stamp}`,\n ['Invoice #', 'Vendor', 'Amount', 'Currency', 'Issue Date', 'Due Date', 'Status'],\n invoices.map((i) => [\n i.number,\n i.vendor,\n i.amount,\n i.currency,\n i.issueDate,\n i.dueDate,\n i.status,\n ])\n );\n return;\n }\n if (transactions.length === 0) {\n notify.warning('Nothing to export', 'There are no transactions to export yet.');\n return;\n }\n downloadCsv(\n `transactions-${stamp}`,\n ['ID', 'Type', 'Description', 'Department', 'Amount', 'Currency', 'Status', 'Date'],\n transactions.map((t) => [\n t.id,\n t.type,\n t.description,\n t.department,\n t.amount,\n t.currency,\n t.status,\n t.date,\n ])\n );\n };\n\n return (\n <div className=\"space-y-6 p-4 sm:p-6\">\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between\">\n <div>\n <h1 className=\"text-2xl font-bold sm:text-3xl\">\n <GradientText>Finance Hub</GradientText>\n </h1>\n <p className=\"mt-1 text-sm text-text-secondary\">Financial management for IT assets</p>\n </div>\n <CTAOverflowMenu\n primary={{ label: 'New Transaction', onSelect: () => setTxnDialogOpen(true) }}\n actions={[\n { label: 'New Budget', onSelect: () => setBudgetDialogOpen(true) },\n { label: 'New Invoice', onSelect: () => setInvoiceDialogOpen(true) },\n { label: 'Export', onSelect: handleExport, icon: <Download className=\"h-4 w-4\" /> },\n ]}\n />\n </div>\n\n <NewTransactionDialog open={txnDialogOpen} onOpenChange={setTxnDialogOpen} />\n <NewBudgetDialog open={budgetDialogOpen} onOpenChange={setBudgetDialogOpen} />\n <NewInvoiceDialog open={invoiceDialogOpen} onOpenChange={setInvoiceDialogOpen} />\n\n <PagePurpose>\n The money side of your asset estate: track spend, keep departmental budgets on course, and\n stay on top of vendor invoices. Use this hub to spot over-budget areas and overdue invoices\n early — so asset costs stay predictable and nothing slips past its due date.\n </PagePurpose>\n\n <NextSteps\n storageKey=\"assethandler-finance-hub\"\n steps={[\n {\n id: 'transactions',\n label: 'Review recent transactions',\n description: 'Check spend and approve anything still pending.',\n onClick: () => navigate('/transactions/transaction-list'),\n },\n {\n id: 'budgets',\n label: 'Review reporting dashboard',\n description: 'See budget health and spend trends across departments.',\n onClick: () => navigate('/reports/reports-dashboard'),\n },\n {\n id: 'reports',\n label: 'Build a finance report',\n description: 'Turn spend and budget data into a shareable report.',\n onClick: () => navigate('/reports/reports-dashboard'),\n },\n ]}\n />\n\n {/* ─── Money-forward KPI row ─── */}\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <StatTile\n label=\"Total Spend\"\n value={totalSpend}\n format={(v) => fmtMoney(v)}\n icon={DollarSign}\n hero\n delta={`${pendingTxns.length} pending`}\n deltaTone=\"neutral\"\n />\n <StatTile\n label=\"Budget Allocated\"\n value={budgetAllocated}\n format={(v) => fmtMoney(v)}\n icon={Wallet}\n />\n <StatTile\n label=\"Budget Spent\"\n value={budgetSpent}\n format={(v) => fmtMoney(v)}\n icon={TrendingDown}\n delta={overBudget.length > 0 ? `${overBudget.length} over` : undefined}\n deltaTone=\"negative\"\n deltaDirection={overBudget.length > 0 ? 'up' : 'neutral'}\n />\n <StatTile\n label=\"Invoices Outstanding\"\n value={invoicesOutstanding}\n format={(v) => fmtMoney(v)}\n icon={Receipt}\n delta={\n overdueInvoices.length > 0\n ? `${overdueInvoices.length} overdue`\n : outstandingCount > 0\n ? `${outstandingCount} open`\n : undefined\n }\n deltaTone={overdueInvoices.length > 0 ? 'negative' : 'neutral'}\n deltaDirection=\"neutral\"\n />\n </div>\n\n {/* ─── Insights charts ─── */}\n {hasCharts ? (\n <div className=\"grid gap-4 lg:grid-cols-2\">\n {budgetByDept.length > 0 ? (\n <ChartCard\n title=\"Budget vs spend\"\n subtitle=\"Allocated against actual spend by department\"\n icon={BarChart3}\n >\n <BarsChart\n data={budgetByDept}\n xKey=\"department\"\n series={[\n { key: 'allocated', label: 'Allocated' },\n { key: 'spent', label: 'Spent' },\n ]}\n height={260}\n valueFormat={compactUsd}\n ariaLabel=\"Budget allocated versus spent by department\"\n />\n </ChartCard>\n ) : null}\n {spendByCategory.length > 0 ? (\n <ChartCard\n title=\"Spend by category\"\n subtitle=\"Recorded transaction spend, grouped by category\"\n icon={PieChartIcon}\n >\n <DonutChart\n data={spendByCategory}\n centerLabel=\"Total spend\"\n centerValue={totalSpend}\n valueFormat={(v) => fmtMoney(v)}\n height={260}\n ariaLabel=\"Transaction spend by category\"\n />\n </ChartCard>\n ) : null}\n </div>\n ) : null}\n\n <Tabs\n value={activeTab}\n onValueChange={(v) => setActiveTab(v as typeof activeTab)}\n className=\"space-y-4\"\n >\n <TabsList>\n <TabsTrigger value=\"transactions\">Transactions</TabsTrigger>\n <TabsTrigger value=\"budgets\">Budgets</TabsTrigger>\n <TabsTrigger value=\"invoices\">Invoices</TabsTrigger>\n </TabsList>\n\n {/* ─── Transactions ─── */}\n <TabsContent value=\"transactions\" className=\"space-y-4\">\n {transactions.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title=\"No transactions yet\"\n description=\"Asset-related spend and reimbursements will appear here as they are recorded.\"\n />\n ) : (\n <>\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center\">\n <div className=\"relative flex-1\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-muted\" />\n <Input\n value={txnSearch}\n onChange={(e) => setTxnSearch(e.target.value)}\n placeholder=\"Search description, vendor or department\"\n className=\"pl-9\"\n />\n </div>\n <Select value={txnStatusFilter} onValueChange={setTxnStatusFilter}>\n <SelectTrigger className=\"w-full sm:w-40\">\n <SelectValue placeholder=\"Status\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">All statuses</SelectItem>\n {TRANSACTION_STATUSES.map((s) => (\n <SelectItem key={s} value={s.toLowerCase()}>\n {humanize(s)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Select value={txnTypeFilter} onValueChange={setTxnTypeFilter}>\n <SelectTrigger className=\"w-full sm:w-40\">\n <SelectValue placeholder=\"Type\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">All types</SelectItem>\n {TRANSACTION_TYPES.map((t) => (\n <SelectItem key={t} value={t.toLowerCase()}>\n {humanize(t)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {filteredTxns.length === 0 ? (\n <GlassCard treatment=\"glass\" className=\"border-border-seam\">\n <p className=\"p-8 text-center text-sm text-text-secondary\">\n No transactions match your filters.\n </p>\n </GlassCard>\n ) : (\n <GlassCard treatment=\"glass\" className=\"overflow-hidden border-border-seam\">\n {/* Desktop table */}\n <div className=\"hidden overflow-x-auto md:block\">\n <table className=\"w-full min-w-[820px] text-sm\">\n <thead>\n <tr className=\"border-b border-border-seam bg-bg-sunken/40 text-left\">\n <th className=\"p-3 font-medium\">Type</th>\n <th className=\"p-3 font-medium\">Description</th>\n <th className=\"p-3 font-medium\">Department</th>\n <th className=\"p-3 text-right font-medium\">Amount</th>\n <th className=\"p-3 font-medium\">Status</th>\n <th className=\"p-3 font-medium\">Date</th>\n <th className=\"p-3 text-right font-medium\">Actions</th>\n </tr>\n </thead>\n <tbody>\n {txnPage.pageItems.map((txn) => (\n <tr\n key={txn.id}\n className=\"cursor-pointer border-b border-border-seam/60 last:border-0 hover:bg-bg-sunken/40\"\n onClick={() => navigate('/transactions/' + txn.id)}\n >\n <td className=\"p-3\">\n <StatusPill tone={txnTypeTone(txn.type)}>{txn.type}</StatusPill>\n </td>\n <td className=\"max-w-xs truncate p-3\" title={txn.description}>\n {txn.description}\n </td>\n <td className=\"p-3 text-xs text-text-secondary\">{txn.department}</td>\n <td\n className={cn(\n 'p-3 text-right font-medium tabular-nums',\n txn.amount < 0 && 'text-status-error-text'\n )}\n >\n {fmtMoney(Math.abs(txn.amount), txn.currency)}\n </td>\n <td className=\"p-3\">\n <StatusPill tone={txnStatusTone(txn.status)}>{txn.status}</StatusPill>\n </td>\n <td className=\"p-3 text-xs text-text-secondary\">\n {formatDate(txn.date)}\n </td>\n <td className=\"p-3\">\n <div className=\"flex justify-end\">\n <TransactionActions\n txn={txn}\n actingId={actingId}\n onApprove={handleApprove}\n onReject={handleReject}\n />\n </div>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n\n {/* Mobile cards */}\n <div className=\"divide-y divide-border-seam/60 md:hidden\">\n {txnPage.pageItems.map((txn) => (\n <button\n key={txn.id}\n type=\"button\"\n className=\"block w-full p-4 text-left hover:bg-bg-sunken/40\"\n onClick={() => navigate('/transactions/' + txn.id)}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <p className=\"min-w-0 flex-1 truncate font-medium\">{txn.description}</p>\n <span\n className={cn(\n 'shrink-0 font-semibold tabular-nums',\n txn.amount < 0 && 'text-status-error-text'\n )}\n >\n {fmtMoney(Math.abs(txn.amount), txn.currency)}\n </span>\n </div>\n <div className=\"mt-2 flex flex-wrap items-center gap-2\">\n <StatusPill tone={txnTypeTone(txn.type)}>{txn.type}</StatusPill>\n <StatusPill tone={txnStatusTone(txn.status)}>{txn.status}</StatusPill>\n <span className=\"text-xs text-text-secondary\">\n {txn.department} · {formatDate(txn.date)}\n </span>\n </div>\n {txn.status === 'pending' ? (\n <div className=\"mt-3\">\n <TransactionActions\n txn={txn}\n actingId={actingId}\n onApprove={handleApprove}\n onReject={handleReject}\n />\n </div>\n ) : null}\n </button>\n ))}\n </div>\n\n <div className=\"px-3\">\n <Pagination\n page={txnPage.page}\n pageCount={txnPage.pageCount}\n rangeStart={txnPage.rangeStart}\n rangeEnd={txnPage.rangeEnd}\n totalItems={txnPage.totalItems}\n canPrev={txnPage.canPrev}\n canNext={txnPage.canNext}\n onPrev={txnPage.prevPage}\n onNext={txnPage.nextPage}\n itemLabel=\"transactions\"\n />\n </div>\n </GlassCard>\n )}\n </>\n )}\n </TabsContent>\n\n {/* ─── Budgets ─── */}\n <TabsContent value=\"budgets\" className=\"space-y-4\">\n {budgets.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-generic\"\n title=\"No budgets defined\"\n description=\"Create departmental budgets to track allocated vs. actual asset spend.\"\n />\n ) : (\n <div className=\"grid gap-4 md:grid-cols-2\">\n {budgets.map((budget: Budget) => (\n <GlassCard\n key={budget.id}\n treatment=\"glass\"\n className=\"cursor-pointer border-border-seam\"\n >\n <div\n className=\"p-5\"\n role=\"button\"\n tabIndex={0}\n onClick={() => navigate('/finance/budgets/' + budget.id)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ')\n navigate('/finance/budgets/' + budget.id);\n }}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"min-w-0\">\n <h3 className=\"truncate font-semibold text-text-primary\">{budget.name}</h3>\n <p className=\"mt-0.5 text-xs text-text-secondary\">\n {budget.department} · {budget.period}\n </p>\n </div>\n <StatusPill tone={budgetStatusTone(budget.status)}>\n {budget.status.replace(/_/g, ' ')}\n </StatusPill>\n </div>\n <div className=\"mt-4 space-y-3\">\n <div className=\"flex justify-between text-sm\">\n <span className=\"text-text-secondary\">Allocated</span>\n <span className=\"font-medium tabular-nums\">\n {fmtMoney(budget.allocated)}\n </span>\n </div>\n <div className=\"flex justify-between text-sm\">\n <span className=\"text-text-secondary\">Remaining</span>\n <span\n className={cn(\n 'font-medium tabular-nums',\n budget.remaining < 0\n ? 'text-status-error-text'\n : 'text-status-success-text'\n )}\n >\n {fmtMoney(budget.remaining)}\n </span>\n </div>\n <ProgressMeter\n value={budget.spent}\n max={budget.allocated}\n label=\"Spent\"\n format={(v) => fmtMoney(v)}\n thresholds={{ warning: 0.8, danger: 1 }}\n />\n </div>\n </div>\n </GlassCard>\n ))}\n </div>\n )}\n </TabsContent>\n\n {/* ─── Invoices ─── */}\n <TabsContent value=\"invoices\" className=\"space-y-4\">\n {invoices.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-files\"\n title=\"No invoices\"\n description=\"Vendor invoices for asset purchases and services will be listed here.\"\n />\n ) : (\n <>\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center\">\n <div className=\"relative flex-1\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-muted\" />\n <Input\n value={invSearch}\n onChange={(e) => setInvSearch(e.target.value)}\n placeholder=\"Search invoice number or vendor\"\n className=\"pl-9\"\n />\n </div>\n <Select value={invStatusFilter} onValueChange={setInvStatusFilter}>\n <SelectTrigger className=\"w-full sm:w-40\">\n <SelectValue placeholder=\"Status\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">All statuses</SelectItem>\n {INVOICE_STATUSES.map((s) => (\n <SelectItem key={s} value={s.toLowerCase()}>\n {humanize(s)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {filteredInvoices.length === 0 ? (\n <GlassCard treatment=\"glass\" className=\"border-border-seam\">\n <p className=\"p-8 text-center text-sm text-text-secondary\">\n No invoices match your filters.\n </p>\n </GlassCard>\n ) : (\n <GlassCard treatment=\"glass\" className=\"overflow-hidden border-border-seam\">\n {/* Desktop table */}\n <div className=\"hidden overflow-x-auto md:block\">\n <table className=\"w-full min-w-[720px] text-sm\">\n <thead>\n <tr className=\"border-b border-border-seam bg-bg-sunken/40 text-left\">\n <th className=\"p-3 font-medium\">Invoice #</th>\n <th className=\"p-3 font-medium\">Vendor</th>\n <th className=\"p-3 text-right font-medium\">Amount</th>\n <th className=\"p-3 font-medium\">Issue Date</th>\n <th className=\"p-3 font-medium\">Due Date</th>\n <th className=\"p-3 font-medium\">Status</th>\n </tr>\n </thead>\n <tbody>\n {invPage.pageItems.map((inv: Invoice) => (\n <tr\n key={inv.id}\n className=\"cursor-pointer border-b border-border-seam/60 last:border-0 hover:bg-bg-sunken/40\"\n onClick={() => navigate('/finance/invoices/' + inv.id)}\n >\n <td className=\"p-3 font-mono text-xs\">{inv.number}</td>\n <td className=\"p-3\">{inv.vendor}</td>\n <td className=\"p-3 text-right font-medium tabular-nums\">\n {fmtMoney(inv.amount, inv.currency)}\n </td>\n <td className=\"p-3 text-xs text-text-secondary\">\n {formatDate(inv.issueDate)}\n </td>\n <td className=\"p-3 text-xs text-text-secondary\">\n {formatDate(inv.dueDate)}\n </td>\n <td className=\"p-3\">\n <StatusPill tone={invoiceStatusTone(inv.status)}>\n {inv.status}\n </StatusPill>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n\n {/* Mobile cards */}\n <div className=\"divide-y divide-border-seam/60 md:hidden\">\n {invPage.pageItems.map((inv: Invoice) => (\n <button\n key={inv.id}\n type=\"button\"\n className=\"block w-full p-4 text-left hover:bg-bg-sunken/40\"\n onClick={() => navigate('/finance/invoices/' + inv.id)}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"min-w-0\">\n <p className=\"truncate font-mono text-xs text-text-secondary\">\n {inv.number}\n </p>\n <p className=\"truncate font-medium\">{inv.vendor}</p>\n </div>\n <span className=\"shrink-0 font-semibold tabular-nums\">\n {fmtMoney(inv.amount, inv.currency)}\n </span>\n </div>\n <div className=\"mt-2 flex flex-wrap items-center gap-2\">\n <StatusPill tone={invoiceStatusTone(inv.status)}>{inv.status}</StatusPill>\n <span className=\"text-xs text-text-secondary\">\n Due {formatDate(inv.dueDate)}\n </span>\n </div>\n </button>\n ))}\n </div>\n\n <div className=\"px-3\">\n <Pagination\n page={invPage.page}\n pageCount={invPage.pageCount}\n rangeStart={invPage.rangeStart}\n rangeEnd={invPage.rangeEnd}\n totalItems={invPage.totalItems}\n canPrev={invPage.canPrev}\n canNext={invPage.canNext}\n onPrev={invPage.prevPage}\n onNext={invPage.nextPage}\n itemLabel=\"invoices\"\n />\n </div>\n </GlassCard>\n )}\n </>\n )}\n </TabsContent>\n </Tabs>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"FinanceInvoiceDetailPage.js","names":[],"sources":["../../../src/assethandler/pages/FinanceInvoiceDetailPage.tsx"],"sourcesContent":["import { useMemo, type ReactNode } from 'react';\nimport { useAssetMoney } from '../providers/AssetHandlerProvider';\nimport { useAssetHandlerNavigate } from '../hooks/useAssetHandlerNavigate';\nimport { Button, GlassCard, EmphasisPanel, GradientText } from '@burdenoff/fe-libs/ui';\nimport {\n ArrowLeft,\n Printer,\n Download,\n CheckCircle,\n Loader2,\n Clock,\n AlertTriangle,\n} from 'lucide-react';\nimport { useParams } from 'react-router';\nimport { gql } from '@apollo/client';\nimport { useMutation, useQuery } from '@apollo/client/react';\nimport { NotFoundState, ActivityTimeline, DonutChart, type DonutSlice } from '../components';\nimport { notify } from '../utils/toast';\nimport { cn } from '../utils/cn';\n\n// ─── Backend types ────────────────────────────────────────────────────────────\ntype InvoiceStatus = 'DRAFT' | 'SENT' | 'PAID' | 'OVERDUE' | 'CANCELLED';\n\ninterface InvoiceLineItem {\n description?: string;\n qty?: number;\n unitPrice?: number;\n total?: number;\n}\n\ninterface Invoice {\n id: string;\n number: string;\n vendor: string;\n amount: number;\n currency: string;\n dueDate: string;\n issueDate: string;\n items: InvoiceLineItem[];\n paidAt: string | null;\n relatedPO: string | null;\n status: InvoiceStatus;\n createdAt: string;\n updatedAt: string;\n}\n\nconst INVOICE_QUERY = gql`\n query AssetHandlerInvoice($id: ID!) {\n invoice(id: $id) {\n id\n number\n vendor\n amount\n currency\n dueDate\n issueDate\n items\n paidAt\n relatedPO\n status\n createdAt\n updatedAt\n }\n }\n`;\n\nconst PAY_INVOICE_MUTATION = gql`\n mutation AssetHandlerPayInvoice($id: ID!) {\n payInvoice(id: $id) {\n id\n status\n paidAt\n }\n }\n`;\n\ninterface InvoiceQueryResult {\n invoice: Invoice | null;\n}\ninterface PayInvoiceResult {\n payInvoice: { id: string; status: InvoiceStatus; paidAt: string | null };\n}\n\n// ─── Presentation helpers ─────────────────────────────────────────────────────\ntype Tone = 'success' | 'warning' | 'error' | 'info' | 'neutral';\n\nconst PILL_TONE: Record<Tone, string> = {\n success: 'bg-status-success-subtle text-status-success-text',\n warning: 'bg-status-warning-subtle text-status-warning-text',\n error: 'bg-status-error-subtle text-status-error-text',\n info: 'bg-status-info-subtle text-status-info-text',\n neutral: 'bg-bg-sunken text-text-secondary',\n};\n\nfunction StatusPill({ tone, children }: { tone: Tone; children: ReactNode }) {\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-1 rounded-full px-3 py-1 text-xs font-semibold capitalize',\n PILL_TONE[tone]\n )}\n >\n {children}\n </span>\n );\n}\n\nconst statusTone = (status: InvoiceStatus): Tone =>\n status === 'PAID'\n ? 'success'\n : status === 'OVERDUE'\n ? 'error'\n : status === 'SENT'\n ? 'warning'\n : 'neutral';\n\nconst formatDate = (value: string): string => {\n const parsed = new Date(value);\n return Number.isNaN(parsed.getTime()) ? value : parsed.toLocaleDateString();\n};\n\nconst asNumber = (value: number | undefined): number =>\n typeof value === 'number' && Number.isFinite(value) ? value : 0;\n\nexport function FinanceInvoiceDetailPage() {\n const { currency: moduleCurrency } = useAssetMoney();\n const navigate = useAssetHandlerNavigate();\n const { invoiceId } = useParams<{ invoiceId: string }>();\n\n const { data, loading, refetch } = useQuery<InvoiceQueryResult>(INVOICE_QUERY, {\n variables: { id: invoiceId ?? '' },\n skip: !invoiceId,\n fetchPolicy: 'cache-and-network',\n });\n\n const invoice = data?.invoice ?? null;\n\n const [payInvoice, { loading: paying }] = useMutation<PayInvoiceResult>(PAY_INVOICE_MUTATION, {\n refetchQueries: ['AssetHandlerBootstrap'],\n onCompleted: () => {\n notify.success('Invoice paid', 'The invoice has been marked as paid.');\n void refetch();\n },\n onError: (error) => notify.error('Could not mark invoice as paid', error.message),\n });\n\n const fmtMoney = useMemo(() => {\n const currency = invoice?.currency || moduleCurrency;\n return (value: number): string => {\n try {\n return new Intl.NumberFormat(undefined, {\n style: 'currency',\n currency,\n maximumFractionDigits: 2,\n }).format(value);\n } catch {\n // An unknown/invalid ISO code: show the code rather than a wrong symbol.\n return `${currency} ${value.toLocaleString()}`;\n }\n };\n }, [invoice?.currency, moduleCurrency]);\n\n const subtotal = useMemo(\n () => (invoice ? invoice.items.reduce((s, item) => s + asNumber(item.total), 0) : 0),\n [invoice]\n );\n\n const itemSlices = useMemo<DonutSlice[]>(\n () =>\n (invoice?.items ?? [])\n .map((item, i) => ({\n name: item.description?.trim() || `Line ${i + 1}`,\n value: asNumber(item.total),\n }))\n .filter((slice) => slice.value > 0),\n [invoice]\n );\n\n if (loading && !invoice) {\n return (\n <div className=\"flex min-h-[320px] items-center justify-center p-6\">\n <Loader2 className=\"h-8 w-8 animate-spin text-primary\" />\n </div>\n );\n }\n\n if (!invoice) {\n return (\n <NotFoundState\n entityLabel=\"Invoice\"\n onBack={() => navigate('/finance/finance-hub')}\n backLabel=\"Back to finance\"\n />\n );\n }\n\n const isPaid = invoice.status === 'PAID';\n const isClosed = isPaid || invoice.status === 'CANCELLED';\n\n // ─── Due-date urgency (real, computed) ───\n const dueParsed = new Date(invoice.dueDate);\n const dueValid = !Number.isNaN(dueParsed.getTime());\n const dayMs = 1000 * 60 * 60 * 24;\n const daysToDue = dueValid\n ? Math.ceil((dueParsed.getTime() - new Date().getTime()) / dayMs)\n : null;\n let urgency: { tone: Tone; label: string; icon: ReactNode } | null = null;\n if (!isClosed && daysToDue !== null) {\n if (invoice.status === 'OVERDUE' || daysToDue < 0) {\n urgency = {\n tone: 'error',\n label: `Overdue by ${Math.abs(daysToDue)} day${Math.abs(daysToDue) === 1 ? '' : 's'}`,\n icon: <AlertTriangle className=\"h-3.5 w-3.5\" />,\n };\n } else {\n urgency = {\n tone: daysToDue <= 14 ? 'warning' : 'neutral',\n label:\n daysToDue === 0 ? 'Due today' : `Due in ${daysToDue} day${daysToDue === 1 ? '' : 's'}`,\n icon: <Clock className=\"h-3.5 w-3.5\" />,\n };\n }\n }\n\n const adjustments = invoice.amount - subtotal;\n\n return (\n <div className=\"space-y-6 p-4 sm:p-6\">\n {/* ─── Header ─── */}\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex items-start gap-3\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"Go back\"\n className=\"mt-0.5 shrink-0\"\n onClick={() => navigate('/finance/finance-hub')}\n >\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-xs font-semibold uppercase tracking-wider text-text-muted\">\n Invoice Detail\n </p>\n <div className=\"mt-1 flex flex-wrap items-center gap-3\">\n <h1 className=\"text-2xl font-bold sm:text-3xl\">\n <GradientText>{invoice.number}</GradientText>\n </h1>\n <StatusPill tone={statusTone(invoice.status)}>\n Status {invoice.status.toLowerCase()}\n </StatusPill>\n {urgency ? (\n <StatusPill tone={urgency.tone}>\n {urgency.icon}\n {urgency.label}\n </StatusPill>\n ) : null}\n </div>\n <p className=\"mt-1 text-sm text-text-secondary\">{invoice.vendor}</p>\n </div>\n </div>\n <div className=\"flex flex-wrap gap-2\">\n {!isClosed && (\n <Button\n size=\"sm\"\n onClick={() => void payInvoice({ variables: { id: invoice.id } })}\n disabled={paying}\n >\n {paying ? (\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n ) : (\n <CheckCircle className=\"mr-2 h-4 w-4\" />\n )}\n {paying ? 'Marking…' : 'Mark as Paid'}\n </Button>\n )}\n <Button variant=\"outline\" size=\"sm\" onClick={() => window.print()}>\n <Printer className=\"mr-2 h-4 w-4\" />\n Print\n </Button>\n <Button variant=\"outline\" size=\"sm\" onClick={() => window.print()}>\n <Download className=\"mr-2 h-4 w-4\" />\n Download PDF\n </Button>\n </div>\n </div>\n\n {/* ─── Document + rail ─── */}\n <div className=\"grid gap-6 lg:grid-cols-[1fr_320px]\">\n {/* Main invoice document */}\n <EmphasisPanel className=\"overflow-hidden\">\n <div className=\"space-y-6 p-1 sm:p-2\">\n {/* Masthead */}\n <div className=\"grid gap-6 sm:grid-cols-2\">\n <div>\n <p className=\"text-xs font-semibold uppercase tracking-wide text-text-muted\">\n Vendor\n </p>\n <p className=\"mt-1 text-lg font-semibold text-text-primary\">{invoice.vendor}</p>\n </div>\n <div className=\"space-y-2 sm:text-right\">\n <div className=\"flex items-center justify-between gap-4 sm:justify-end\">\n <span className=\"text-sm text-text-secondary\">Issue Date</span>\n <span className=\"font-medium tabular-nums\">{formatDate(invoice.issueDate)}</span>\n </div>\n <div className=\"flex items-center justify-between gap-4 sm:justify-end\">\n <span className=\"text-sm text-text-secondary\">Due Date</span>\n <span className=\"font-medium tabular-nums\">{formatDate(invoice.dueDate)}</span>\n </div>\n <div className=\"flex items-center justify-between gap-4 sm:justify-end\">\n <span className=\"text-sm text-text-secondary\">Currency</span>\n <span className=\"font-medium\">{invoice.currency}</span>\n </div>\n {invoice.relatedPO ? (\n <div className=\"flex items-center justify-between gap-4 sm:justify-end\">\n <span className=\"text-sm text-text-secondary\">Related PO</span>\n <span className=\"font-mono text-sm\">{invoice.relatedPO}</span>\n </div>\n ) : null}\n </div>\n </div>\n\n {/* Line items */}\n <div className=\"overflow-x-auto rounded-lg border border-border-seam\">\n <table className=\"w-full min-w-[480px] text-sm\">\n <thead>\n <tr className=\"border-b border-border-seam bg-bg-sunken/50 text-left\">\n <th className=\"p-3 font-medium\">Description</th>\n <th className=\"p-3 text-right font-medium\">Qty</th>\n <th className=\"p-3 text-right font-medium\">Unit Price</th>\n <th className=\"p-3 text-right font-medium\">Total</th>\n </tr>\n </thead>\n <tbody>\n {invoice.items.length === 0 ? (\n <tr>\n <td colSpan={4} className=\"p-6 text-center text-sm text-text-secondary\">\n No line items were recorded for this invoice.\n </td>\n </tr>\n ) : (\n invoice.items.map((item, i) => (\n <tr key={i} className=\"border-b border-border-seam/60 last:border-0\">\n <td className=\"p-3\">{item.description ?? 'Line item'}</td>\n <td className=\"p-3 text-right tabular-nums\">{asNumber(item.qty)}</td>\n <td className=\"p-3 text-right tabular-nums\">\n {fmtMoney(asNumber(item.unitPrice))}\n </td>\n <td className=\"p-3 text-right font-medium tabular-nums\">\n {fmtMoney(asNumber(item.total))}\n </td>\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n\n {/* Totals */}\n <div className=\"ml-auto w-full max-w-xs space-y-2\">\n <div className=\"flex items-center justify-between text-sm\">\n <span className=\"text-text-secondary\">Subtotal</span>\n <span className=\"font-medium tabular-nums\">{fmtMoney(subtotal)}</span>\n </div>\n {Math.abs(adjustments) > 0.005 ? (\n <div className=\"flex items-center justify-between text-sm\">\n <span className=\"text-text-secondary\">Tax / Adjustments</span>\n <span className=\"font-medium tabular-nums\">{fmtMoney(adjustments)}</span>\n </div>\n ) : null}\n <div className=\"flex items-center justify-between border-t border-border-seam pt-2\">\n <span className=\"text-base font-bold\">Total</span>\n <span className=\"text-xl font-bold tabular-nums\">{fmtMoney(invoice.amount)}</span>\n </div>\n </div>\n </div>\n </EmphasisPanel>\n\n {/* Right rail */}\n <div className=\"space-y-4\">\n {itemSlices.length > 1 ? (\n <GlassCard treatment=\"glass\" className=\"border-border-seam\">\n <div className=\"p-5\">\n <h3 className=\"mb-3 text-base font-semibold text-text-primary\">Cost breakdown</h3>\n <DonutChart\n data={itemSlices}\n centerLabel=\"Total\"\n centerValue={invoice.amount}\n valueFormat={fmtMoney}\n height={220}\n ariaLabel=\"Invoice cost distribution by line item\"\n />\n </div>\n </GlassCard>\n ) : null}\n\n <div>\n <p className=\"mb-2 px-1 text-xs font-semibold uppercase tracking-wider text-text-muted\">\n Payment Status\n </p>\n <ActivityTimeline resourceId={invoice.id} limit={12} />\n </div>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"FinanceInvoiceDetailPage.js","names":[],"sources":["../../../src/assethandler/pages/FinanceInvoiceDetailPage.tsx"],"sourcesContent":["import { useMemo, type ReactNode } from 'react';\nimport { useAssetMoney } from '../providers/AssetHandlerProvider';\nimport { useAssetHandlerNavigate } from '../hooks/useAssetHandlerNavigate';\nimport { Button, GlassCard, EmphasisPanel, GradientText } from '@burdenoff/fe-libs/ui';\nimport {\n ArrowLeft,\n Printer,\n Download,\n CheckCircle,\n Loader2,\n Clock,\n AlertTriangle,\n} from 'lucide-react';\nimport { useParams } from 'react-router';\nimport { gql } from '@apollo/client';\nimport { useMutation, useQuery } from '@apollo/client/react';\nimport { NotFoundState, ActivityTimeline, DonutChart, type DonutSlice } from '../components';\nimport { notify } from '../utils/toast';\nimport { cn } from '../utils/cn';\n\n// ─── Backend types ────────────────────────────────────────────────────────────\ntype InvoiceStatus = 'DRAFT' | 'SENT' | 'PAID' | 'OVERDUE' | 'CANCELLED';\n\ninterface InvoiceLineItem {\n description?: string;\n qty?: number;\n unitPrice?: number;\n total?: number;\n}\n\ninterface Invoice {\n id: string;\n number: string;\n vendor: string;\n amount: number;\n currency: string;\n dueDate: string;\n issueDate: string;\n items: InvoiceLineItem[];\n paidAt: string | null;\n relatedPO: string | null;\n status: InvoiceStatus;\n createdAt: string;\n updatedAt: string;\n}\n\nconst INVOICE_QUERY = gql`\n query AssetHandlerInvoice($id: ID!) {\n invoice(id: $id) {\n id\n number\n vendor\n amount\n currency\n dueDate\n issueDate\n items\n paidAt\n relatedPO\n status\n createdAt\n updatedAt\n }\n }\n`;\n\nconst PAY_INVOICE_MUTATION = gql`\n mutation AssetHandlerPayInvoice($id: ID!) {\n payInvoice(id: $id) {\n id\n status\n paidAt\n }\n }\n`;\n\ninterface InvoiceQueryResult {\n invoice: Invoice | null;\n}\ninterface PayInvoiceResult {\n payInvoice: { id: string; status: InvoiceStatus; paidAt: string | null };\n}\n\n// ─── Presentation helpers ─────────────────────────────────────────────────────\ntype Tone = 'success' | 'warning' | 'error' | 'info' | 'neutral';\n\nconst PILL_TONE: Record<Tone, string> = {\n success: 'bg-status-success-subtle text-status-success-text',\n warning: 'bg-status-warning-subtle text-status-warning-text',\n error: 'bg-status-error-subtle text-status-error-text',\n info: 'bg-status-info-subtle text-status-info-text',\n neutral: 'bg-bg-sunken text-text-secondary',\n};\n\nfunction StatusPill({ tone, children }: { tone: Tone; children: ReactNode }) {\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-1 rounded-full px-3 py-1 text-xs font-semibold capitalize',\n PILL_TONE[tone]\n )}\n >\n {children}\n </span>\n );\n}\n\nconst statusTone = (status: InvoiceStatus): Tone =>\n status === 'PAID'\n ? 'success'\n : status === 'OVERDUE'\n ? 'error'\n : status === 'SENT'\n ? 'warning'\n : 'neutral';\n\nconst formatDate = (value: string): string => {\n const parsed = new Date(value);\n return Number.isNaN(parsed.getTime()) ? value : parsed.toLocaleDateString();\n};\n\nconst asNumber = (value: number | undefined): number =>\n typeof value === 'number' && Number.isFinite(value) ? value : 0;\n\nexport function FinanceInvoiceDetailPage() {\n const { currency: moduleCurrency } = useAssetMoney();\n const navigate = useAssetHandlerNavigate();\n const { invoiceId } = useParams<{ invoiceId: string }>();\n\n const { data, loading, refetch } = useQuery<InvoiceQueryResult>(INVOICE_QUERY, {\n variables: { id: invoiceId ?? '' },\n skip: !invoiceId,\n fetchPolicy: 'cache-and-network',\n });\n\n const invoice = data?.invoice ?? null;\n\n const [payInvoice, { loading: paying }] = useMutation<PayInvoiceResult>(PAY_INVOICE_MUTATION, {\n refetchQueries: ['AssetHandlerBootstrap'],\n onCompleted: () => {\n notify.success('Invoice paid', 'The invoice has been marked as paid.');\n void refetch();\n },\n onError: (error) => notify.error('Could not mark invoice as paid', error.message),\n });\n\n const fmtMoney = useMemo(() => {\n const currency = invoice?.currency || moduleCurrency;\n return (value: number): string => {\n try {\n return new Intl.NumberFormat(undefined, {\n style: 'currency',\n currency,\n maximumFractionDigits: 2,\n }).format(value);\n } catch {\n // An unknown/invalid ISO code: show the code rather than a wrong symbol.\n return `${currency} ${value.toLocaleString()}`;\n }\n };\n }, [invoice?.currency, moduleCurrency]);\n\n const subtotal = useMemo(\n () => (invoice ? invoice.items.reduce((s, item) => s + asNumber(item.total), 0) : 0),\n [invoice]\n );\n\n const itemSlices = useMemo<DonutSlice[]>(\n () =>\n (invoice?.items ?? [])\n .map((item, i) => ({\n name: item.description?.trim() || `Line ${i + 1}`,\n value: asNumber(item.total),\n }))\n .filter((slice) => slice.value > 0),\n [invoice]\n );\n\n if (loading && !invoice) {\n return (\n <div className=\"flex min-h-[320px] items-center justify-center p-6\">\n <Loader2 className=\"h-8 w-8 animate-spin text-primary\" />\n </div>\n );\n }\n\n if (!invoice) {\n return (\n <NotFoundState\n entityLabel=\"Invoice\"\n onBack={() => navigate('/finance/finance-hub')}\n backLabel=\"Back to finance\"\n />\n );\n }\n\n const isPaid = invoice.status === 'PAID';\n const isClosed = isPaid || invoice.status === 'CANCELLED';\n\n // ─── Due-date urgency (real, computed) ───\n const dueParsed = new Date(invoice.dueDate);\n const dueValid = !Number.isNaN(dueParsed.getTime());\n const dayMs = 1000 * 60 * 60 * 24;\n const daysToDue = dueValid\n ? Math.ceil((dueParsed.getTime() - new Date().getTime()) / dayMs)\n : null;\n let urgency: { tone: Tone; label: string; icon: ReactNode } | null = null;\n if (!isClosed && daysToDue !== null) {\n if (invoice.status === 'OVERDUE' || daysToDue < 0) {\n urgency = {\n tone: 'error',\n label: `Overdue by ${Math.abs(daysToDue)} day${Math.abs(daysToDue) === 1 ? '' : 's'}`,\n icon: <AlertTriangle className=\"h-3.5 w-3.5\" />,\n };\n } else {\n urgency = {\n tone: daysToDue <= 14 ? 'warning' : 'neutral',\n label:\n daysToDue === 0 ? 'Due today' : `Due in ${daysToDue} day${daysToDue === 1 ? '' : 's'}`,\n icon: <Clock className=\"h-3.5 w-3.5\" />,\n };\n }\n }\n\n const adjustments = invoice.amount - subtotal;\n\n return (\n <div className=\"space-y-6 p-4 sm:p-6\">\n {/* ─── Header ─── */}\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex items-start gap-3\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"Go back\"\n className=\"mt-0.5 shrink-0\"\n onClick={() => navigate('/finance/finance-hub')}\n >\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-xs font-semibold uppercase tracking-wider text-text-muted\">\n Invoice Detail\n </p>\n <div className=\"mt-1 flex flex-wrap items-center gap-3\">\n <h1 className=\"text-2xl font-bold sm:text-3xl\">\n <GradientText>{invoice.number}</GradientText>\n </h1>\n <StatusPill tone={statusTone(invoice.status)}>\n Status {invoice.status.toLowerCase()}\n </StatusPill>\n {urgency ? (\n <StatusPill tone={urgency.tone}>\n {urgency.icon}\n {urgency.label}\n </StatusPill>\n ) : null}\n </div>\n <p className=\"mt-1 text-sm text-text-secondary\">{invoice.vendor}</p>\n </div>\n </div>\n <div className=\"flex flex-wrap gap-2\">\n {!isClosed && (\n <Button\n size=\"sm\"\n onClick={() => void payInvoice({ variables: { id: invoice.id } })}\n disabled={paying}\n >\n {paying ? (\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n ) : (\n <CheckCircle className=\"mr-2 h-4 w-4\" />\n )}\n {paying ? 'Marking…' : 'Mark as Paid'}\n </Button>\n )}\n <Button variant=\"outline\" size=\"sm\" onClick={() => window.print()}>\n <Printer className=\"mr-2 h-4 w-4\" />\n Print\n </Button>\n <Button variant=\"outline\" size=\"sm\" onClick={() => window.print()}>\n <Download className=\"mr-2 h-4 w-4\" />\n Download PDF\n </Button>\n </div>\n </div>\n\n {/* ─── Document + rail ─── */}\n <div className=\"grid gap-6 lg:grid-cols-[1fr_320px]\">\n {/* Main invoice document */}\n <EmphasisPanel className=\"overflow-hidden\">\n <div className=\"space-y-6 p-1 sm:p-2\">\n {/* Masthead */}\n <div className=\"grid gap-6 sm:grid-cols-2\">\n <div>\n <p className=\"text-xs font-semibold uppercase tracking-wide text-text-muted\">\n Vendor\n </p>\n <p className=\"mt-1 text-lg font-semibold text-text-primary\">{invoice.vendor}</p>\n </div>\n <div className=\"space-y-2 sm:text-right\">\n <div className=\"flex items-center justify-between gap-4 sm:justify-end\">\n <span className=\"text-sm text-text-secondary\">Issue Date</span>\n <span className=\"font-medium tabular-nums\">{formatDate(invoice.issueDate)}</span>\n </div>\n <div className=\"flex items-center justify-between gap-4 sm:justify-end\">\n <span className=\"text-sm text-text-secondary\">Due Date</span>\n <span className=\"font-medium tabular-nums\">{formatDate(invoice.dueDate)}</span>\n </div>\n <div className=\"flex items-center justify-between gap-4 sm:justify-end\">\n <span className=\"text-sm text-text-secondary\">Currency</span>\n <span className=\"font-medium\">{invoice.currency}</span>\n </div>\n {invoice.relatedPO ? (\n <div className=\"flex items-center justify-between gap-4 sm:justify-end\">\n <span className=\"text-sm text-text-secondary\">Related PO</span>\n <span className=\"font-mono text-sm\">{invoice.relatedPO}</span>\n </div>\n ) : null}\n </div>\n </div>\n\n {/* Line items */}\n <div className=\"overflow-x-auto rounded-lg border border-border-seam\">\n <table className=\"w-full min-w-[480px] text-sm\">\n <thead>\n <tr className=\"border-b border-border-seam bg-bg-sunken/50 text-left\">\n <th className=\"p-3 font-medium\">Description</th>\n <th className=\"p-3 text-right font-medium\">Qty</th>\n <th className=\"p-3 text-right font-medium\">Unit Price</th>\n <th className=\"p-3 text-right font-medium\">Total</th>\n </tr>\n </thead>\n <tbody>\n {invoice.items.length === 0 ? (\n <tr>\n <td colSpan={4} className=\"p-6 text-center text-sm text-text-secondary\">\n No line items were recorded for this invoice.\n </td>\n </tr>\n ) : (\n invoice.items.map((item, i) => (\n <tr key={i} className=\"border-b border-border-seam/60 last:border-0\">\n <td className=\"p-3\">{item.description ?? 'Line item'}</td>\n <td className=\"p-3 text-right tabular-nums\">{asNumber(item.qty)}</td>\n <td className=\"p-3 text-right tabular-nums\">\n {fmtMoney(asNumber(item.unitPrice))}\n </td>\n <td className=\"p-3 text-right font-medium tabular-nums\">\n {fmtMoney(asNumber(item.total))}\n </td>\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n\n {/* Totals */}\n <div className=\"ml-auto w-full max-w-xs space-y-2\">\n <div className=\"flex items-center justify-between text-sm\">\n <span className=\"text-text-secondary\">Subtotal</span>\n <span className=\"font-medium tabular-nums\">{fmtMoney(subtotal)}</span>\n </div>\n {Math.abs(adjustments) > 0.005 ? (\n <div className=\"flex items-center justify-between text-sm\">\n <span className=\"text-text-secondary\">Tax / Adjustments</span>\n <span className=\"font-medium tabular-nums\">{fmtMoney(adjustments)}</span>\n </div>\n ) : null}\n <div className=\"flex items-center justify-between border-t border-border-seam pt-2\">\n <span className=\"text-base font-bold\">Total</span>\n <span className=\"text-xl font-bold tabular-nums\">{fmtMoney(invoice.amount)}</span>\n </div>\n </div>\n </div>\n </EmphasisPanel>\n\n {/* Right rail */}\n <div className=\"space-y-4\">\n {itemSlices.length > 1 ? (\n <GlassCard treatment=\"glass\" className=\"border-border-seam\">\n <div className=\"p-5\">\n <h3 className=\"mb-3 text-base font-semibold text-text-primary\">Cost breakdown</h3>\n <DonutChart\n data={itemSlices}\n centerLabel=\"Total\"\n centerValue={invoice.amount}\n valueFormat={fmtMoney}\n height={220}\n ariaLabel=\"Invoice cost distribution by line item\"\n />\n </div>\n </GlassCard>\n ) : null}\n\n <div>\n <p className=\"mb-2 px-1 text-xs font-semibold uppercase tracking-wider text-text-muted\">\n Payment Status\n </p>\n <ActivityTimeline resourceId={invoice.id} limit={12} />\n </div>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}