@plumile/backoffice-react 0.2.3 → 0.2.6

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 (296) hide show
  1. package/README.md +14 -3
  2. package/lib/esm/auth/AuthRefreshNotice.js +21 -18
  3. package/lib/esm/auth/AuthRefreshNotice.js.map +1 -1
  4. package/lib/esm/auth/TotpQrCode.js +20 -12
  5. package/lib/esm/auth/TotpQrCode.js.map +1 -1
  6. package/lib/esm/auth/authRefreshNotice.css.js +2 -1
  7. package/lib/esm/auth/authRefreshNotice.css.js.map +1 -1
  8. package/lib/esm/auth/login/AuthPanel.js.map +1 -1
  9. package/lib/esm/auth/login/EmailCapturePanel.js +26 -28
  10. package/lib/esm/auth/login/EmailCapturePanel.js.map +1 -1
  11. package/lib/esm/auth/login/LoginFlow.js +11 -11
  12. package/lib/esm/auth/login/LoginFlow.js.map +1 -1
  13. package/lib/esm/auth/login/MethodChooser.js +18 -16
  14. package/lib/esm/auth/login/MethodChooser.js.map +1 -1
  15. package/lib/esm/auth/login/MfaChallengeForm.js +47 -52
  16. package/lib/esm/auth/login/MfaChallengeForm.js.map +1 -1
  17. package/lib/esm/auth/login/OidcButtons.js +3 -2
  18. package/lib/esm/auth/login/OidcButtons.js.map +1 -1
  19. package/lib/esm/auth/login/PasskeyLoginForm.js +13 -15
  20. package/lib/esm/auth/login/PasskeyLoginForm.js.map +1 -1
  21. package/lib/esm/auth/login/PasswordLoginPanel.js +8 -8
  22. package/lib/esm/auth/login/PasswordLoginPanel.js.map +1 -1
  23. package/lib/esm/auth/login/loginPage.css.js +1 -1
  24. package/lib/esm/auth/login/loginPage.css.js.map +1 -1
  25. package/lib/esm/auth/pages/AcceptInvitationScreen.js +80 -75
  26. package/lib/esm/auth/pages/AcceptInvitationScreen.js.map +1 -1
  27. package/lib/esm/auth/pages/PasswordResetCompleteScreen.js +31 -31
  28. package/lib/esm/auth/pages/PasswordResetCompleteScreen.js.map +1 -1
  29. package/lib/esm/auth/pages/PasswordResetRequestScreen.js +33 -29
  30. package/lib/esm/auth/pages/PasswordResetRequestScreen.js.map +1 -1
  31. package/lib/esm/auth/pages/VerifyEmailScreen.js +42 -40
  32. package/lib/esm/auth/pages/VerifyEmailScreen.js.map +1 -1
  33. package/lib/esm/components/backoffice/actions/BackofficeEntityActionFormDialog.js +202 -210
  34. package/lib/esm/components/backoffice/actions/BackofficeEntityActionFormDialog.js.map +1 -1
  35. package/lib/esm/components/backoffice/actions/backofficeEntityActionFormDialog.css.js +1 -1
  36. package/lib/esm/components/backoffice/actions/backofficeEntityActionFormDialog.css.js.map +1 -1
  37. package/lib/esm/components/backoffice/actions/toastViewAction.js.map +1 -1
  38. package/lib/esm/components/backoffice/billing/BackofficeBillingUsageChart.js +36 -30
  39. package/lib/esm/components/backoffice/billing/BackofficeBillingUsageChart.js.map +1 -1
  40. package/lib/esm/components/backoffice/billing/backofficeBillingUsageChart.css.js +1 -1
  41. package/lib/esm/components/backoffice/billing/backofficeBillingUsageChart.css.js.map +1 -1
  42. package/lib/esm/components/backoffice/columns/buildDataTableColumns.js +36 -33
  43. package/lib/esm/components/backoffice/columns/buildDataTableColumns.js.map +1 -1
  44. package/lib/esm/components/backoffice/detail/BackofficeDetailBadgeRow.js.map +1 -1
  45. package/lib/esm/components/backoffice/detail/BackofficeDetailErrorList.js +1 -1
  46. package/lib/esm/components/backoffice/detail/BackofficeDetailErrorList.js.map +1 -1
  47. package/lib/esm/components/backoffice/detail/BackofficeEntitySummaryHeader.js +24 -20
  48. package/lib/esm/components/backoffice/detail/BackofficeEntitySummaryHeader.js.map +1 -1
  49. package/lib/esm/components/backoffice/detail/BackofficeRelationsSummaryGrid.js +1 -1
  50. package/lib/esm/components/backoffice/detail/BackofficeRelationsSummaryGrid.js.map +1 -1
  51. package/lib/esm/components/backoffice/detail/BackofficeTokenUsageBreakdown.js +7 -8
  52. package/lib/esm/components/backoffice/detail/BackofficeTokenUsageBreakdown.js.map +1 -1
  53. package/lib/esm/components/backoffice/detail/BackofficeUsageCostBreakdown.js +49 -45
  54. package/lib/esm/components/backoffice/detail/BackofficeUsageCostBreakdown.js.map +1 -1
  55. package/lib/esm/components/backoffice/detail/backofficeDetailBadgeRow.css.js +1 -1
  56. package/lib/esm/components/backoffice/detail/backofficeDetailBadgeRow.css.js.map +1 -1
  57. package/lib/esm/components/backoffice/detail/backofficeDetailErrorList.css.js +1 -1
  58. package/lib/esm/components/backoffice/detail/backofficeDetailErrorList.css.js.map +1 -1
  59. package/lib/esm/components/backoffice/detail/backofficeDetailLayout.css.js +1 -1
  60. package/lib/esm/components/backoffice/detail/backofficeDetailLayout.css.js.map +1 -1
  61. package/lib/esm/components/backoffice/detail/backofficeDetailRelationList.css.js +1 -1
  62. package/lib/esm/components/backoffice/detail/backofficeDetailRelationList.css.js.map +1 -1
  63. package/lib/esm/components/backoffice/detail/backofficeEntitySummaryHeader.css.js +1 -1
  64. package/lib/esm/components/backoffice/detail/backofficeEntitySummaryHeader.css.js.map +1 -1
  65. package/lib/esm/components/backoffice/detail/backofficeRelationsSummaryGrid.css.js +1 -1
  66. package/lib/esm/components/backoffice/detail/backofficeRelationsSummaryGrid.css.js.map +1 -1
  67. package/lib/esm/components/backoffice/detail/backofficeUsageCostBreakdown.css.js +1 -1
  68. package/lib/esm/components/backoffice/detail/backofficeUsageCostBreakdown.css.js.map +1 -1
  69. package/lib/esm/components/backoffice/errors/BackofficeErrorBoundary.js +1 -1
  70. package/lib/esm/components/backoffice/errors/BackofficeErrorBoundary.js.map +1 -1
  71. package/lib/esm/components/backoffice/filters/BackofficeFilterAction.js +1 -1
  72. package/lib/esm/components/backoffice/filters/BackofficeFilterAction.js.map +1 -1
  73. package/lib/esm/components/backoffice/filters/DeferredFilterSearchInput.js +15 -15
  74. package/lib/esm/components/backoffice/filters/DeferredFilterSearchInput.js.map +1 -1
  75. package/lib/esm/components/backoffice/filters/EntityIdFilterField.js +53 -65
  76. package/lib/esm/components/backoffice/filters/EntityIdFilterField.js.map +1 -1
  77. package/lib/esm/components/backoffice/filters/backofficeFilterAction.css.js +1 -1
  78. package/lib/esm/components/backoffice/filters/backofficeFilterAction.css.js.map +1 -1
  79. package/lib/esm/components/backoffice/filters/deferredFilterSearchInput.css.js +1 -1
  80. package/lib/esm/components/backoffice/filters/deferredFilterSearchInput.css.js.map +1 -1
  81. package/lib/esm/components/backoffice/filters/entityIdFilterField.css.js +2 -2
  82. package/lib/esm/components/backoffice/filters/entityIdFilterField.css.js.map +1 -1
  83. package/lib/esm/components/backoffice/hub/BackofficeHubTemplate.js +6 -6
  84. package/lib/esm/components/backoffice/hub/BackofficeHubTemplate.js.map +1 -1
  85. package/lib/esm/components/backoffice/hub/backofficeHubTemplate.css.js +1 -1
  86. package/lib/esm/components/backoffice/hub/backofficeHubTemplate.css.js.map +1 -1
  87. package/lib/esm/components/backoffice/layout/backofficeSidebarActions.css.js +1 -1
  88. package/lib/esm/components/backoffice/layout/backofficeSidebarActions.css.js.map +1 -1
  89. package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarBreadcrumb.js +3 -3
  90. package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarBreadcrumb.js.map +1 -1
  91. package/lib/esm/components/backoffice/layout/breadcrumb/backofficeTopbarBreadcrumb.css.js +1 -1
  92. package/lib/esm/components/backoffice/layout/breadcrumb/backofficeTopbarBreadcrumb.css.js.map +1 -1
  93. package/lib/esm/components/backoffice/layout/buildSidebarSections.js +152 -172
  94. package/lib/esm/components/backoffice/layout/buildSidebarSections.js.map +1 -1
  95. package/lib/esm/components/backoffice/layout/mapViewerToSidebarProfileView.js +2 -5
  96. package/lib/esm/components/backoffice/layout/mapViewerToSidebarProfileView.js.map +1 -1
  97. package/lib/esm/components/backoffice/layout/sidebarUtils.js +1 -1
  98. package/lib/esm/components/backoffice/layout/sidebarUtils.js.map +1 -1
  99. package/lib/esm/components/backoffice/links/BackofficeLinkContent.js +1 -1
  100. package/lib/esm/components/backoffice/links/backofficeLink.css.js +1 -1
  101. package/lib/esm/components/backoffice/links/backofficeLink.css.js.map +1 -1
  102. package/lib/esm/components/backoffice/list/RowFlagsCell.css.js +1 -1
  103. package/lib/esm/components/backoffice/list/RowFlagsCell.css.js.map +1 -1
  104. package/lib/esm/components/backoffice/overview/BackofficeOverviewLayout.js +1 -1
  105. package/lib/esm/components/backoffice/overview/BackofficeOverviewLayout.js.map +1 -1
  106. package/lib/esm/components/backoffice/overview/backofficeOverviewLayout.css.js +1 -1
  107. package/lib/esm/components/backoffice/overview/backofficeOverviewLayout.css.js.map +1 -1
  108. package/lib/esm/components/backoffice/pickers/EntityIdPickerDialog.js +93 -82
  109. package/lib/esm/components/backoffice/pickers/EntityIdPickerDialog.js.map +1 -1
  110. package/lib/esm/components/backoffice/pickers/entityIdPickerDialog.css.js +1 -1
  111. package/lib/esm/components/backoffice/pickers/entityIdPickerDialog.css.js.map +1 -1
  112. package/lib/esm/components/backoffice/refs/backofficeRelatedCountLink.css.js +1 -1
  113. package/lib/esm/components/backoffice/refs/backofficeRelatedCountLink.css.js.map +1 -1
  114. package/lib/esm/components/backoffice/routing/BackofficeContentError.js +6 -3
  115. package/lib/esm/components/backoffice/routing/BackofficeContentError.js.map +1 -1
  116. package/lib/esm/components/backoffice/routing/BackofficeRouteFallback.js +7 -7
  117. package/lib/esm/components/backoffice/routing/BackofficeRouteFallback.js.map +1 -1
  118. package/lib/esm/components/backoffice/routing/backofficeContentBoundary.css.js +1 -1
  119. package/lib/esm/components/backoffice/routing/backofficeContentBoundary.css.js.map +1 -1
  120. package/lib/esm/components/backoffice/routing/backofficeContentError.css.js +1 -1
  121. package/lib/esm/components/backoffice/routing/backofficeContentError.css.js.map +1 -1
  122. package/lib/esm/components/backoffice/routing/backofficeContentFallback.css.js +1 -1
  123. package/lib/esm/components/backoffice/routing/backofficeContentFallback.css.js.map +1 -1
  124. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityDetailNotFound.js +3 -2
  125. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityDetailNotFound.js.map +1 -1
  126. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js +314 -309
  127. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js.map +1 -1
  128. package/lib/esm/components/backoffice/scaffolds/BackofficeTabbedDetailShell.js +1 -1
  129. package/lib/esm/components/backoffice/scaffolds/BackofficeTabbedDetailShell.js.map +1 -1
  130. package/lib/esm/components/backoffice/scaffolds/backofficeEntityListScaffold.css.js +1 -1
  131. package/lib/esm/components/backoffice/scaffolds/backofficeEntityListScaffold.css.js.map +1 -1
  132. package/lib/esm/components/backoffice/scaffolds/backofficeTabbedDetailShell.css.js +1 -1
  133. package/lib/esm/components/backoffice/scaffolds/backofficeTabbedDetailShell.css.js.map +1 -1
  134. package/lib/esm/components/backoffice/shared/BackofficeFilterableCell.js +2 -2
  135. package/lib/esm/components/backoffice/shared/BackofficeFilterableCell.js.map +1 -1
  136. package/lib/esm/components/backoffice/shared/BackofficeInlineFilterRow.js +1 -1
  137. package/lib/esm/components/backoffice/shared/BackofficeInlineFilterRow.js.map +1 -1
  138. package/lib/esm/components/backoffice/shared/backofficeFilterableCell.css.js +5 -5
  139. package/lib/esm/components/backoffice/shared/backofficeFilterableCell.css.js.map +1 -1
  140. package/lib/esm/components/backoffice/shared/backofficeInlineFilterRow.css.js +1 -1
  141. package/lib/esm/components/backoffice/shared/backofficeInlineFilterRow.css.js.map +1 -1
  142. package/lib/esm/components/backoffice/tools/BackofficeToolsDocPanel.js +12 -12
  143. package/lib/esm/components/backoffice/tools/BackofficeToolsDocPanel.js.map +1 -1
  144. package/lib/esm/components/backoffice/tools/BackofficeToolsErrorFallback.js +3 -2
  145. package/lib/esm/components/backoffice/tools/BackofficeToolsErrorFallback.js.map +1 -1
  146. package/lib/esm/components/backoffice/tools/BackofficeToolsJsonForm.js +15 -19
  147. package/lib/esm/components/backoffice/tools/BackofficeToolsJsonForm.js.map +1 -1
  148. package/lib/esm/components/backoffice/tools/backofficeToolsDocPanel.css.js +1 -1
  149. package/lib/esm/components/backoffice/tools/backofficeToolsDocPanel.css.js.map +1 -1
  150. package/lib/esm/components/backoffice/tools/backofficeToolsForm.css.js +1 -1
  151. package/lib/esm/components/backoffice/tools/backofficeToolsForm.css.js.map +1 -1
  152. package/lib/esm/components/backoffice/tools/backofficeToolsJsonForm.css.js +1 -1
  153. package/lib/esm/components/backoffice/tools/backofficeToolsJsonForm.css.js.map +1 -1
  154. package/lib/esm/hooks/useBackofficeInfiniteScrollSentinel.js +17 -9
  155. package/lib/esm/hooks/useBackofficeInfiniteScrollSentinel.js.map +1 -1
  156. package/lib/esm/hooks/useCopyToClipboard.js +1 -1
  157. package/lib/esm/hooks/useCopyToClipboard.js.map +1 -1
  158. package/lib/esm/i18n/locales/en/backofficeReact.js +21 -2
  159. package/lib/esm/i18n/locales/en/backofficeReact.js.map +1 -1
  160. package/lib/esm/i18n/locales/fr/backofficeReact.js +21 -2
  161. package/lib/esm/i18n/locales/fr/backofficeReact.js.map +1 -1
  162. package/lib/esm/pages/BackofficeDashboardPage.js +42 -41
  163. package/lib/esm/pages/BackofficeDashboardPage.js.map +1 -1
  164. package/lib/esm/pages/BackofficeDashboardWidgetContent.js +291 -255
  165. package/lib/esm/pages/BackofficeDashboardWidgetContent.js.map +1 -1
  166. package/lib/esm/pages/BackofficeEntityDetailLayoutPage.js +47 -49
  167. package/lib/esm/pages/BackofficeEntityDetailLayoutPage.js.map +1 -1
  168. package/lib/esm/pages/BackofficeEntityDetailPage.js +111 -105
  169. package/lib/esm/pages/BackofficeEntityDetailPage.js.map +1 -1
  170. package/lib/esm/pages/BackofficeEntityDetailPage.view-helpers.js +213 -213
  171. package/lib/esm/pages/BackofficeEntityDetailPage.view-helpers.js.map +1 -1
  172. package/lib/esm/pages/BackofficeEntityListDataPage.js +101 -83
  173. package/lib/esm/pages/BackofficeEntityListDataPage.js.map +1 -1
  174. package/lib/esm/pages/BackofficeEntityListPage.helpers.js +10 -4
  175. package/lib/esm/pages/BackofficeEntityListPage.helpers.js.map +1 -1
  176. package/lib/esm/pages/BackofficeEntityListPage.js +55 -54
  177. package/lib/esm/pages/BackofficeEntityListPage.js.map +1 -1
  178. package/lib/esm/pages/BackofficeEntityListRouteContext.js.map +1 -1
  179. package/lib/esm/pages/BackofficeHubPage.js +1 -1
  180. package/lib/esm/pages/BackofficeHubPage.js.map +1 -1
  181. package/lib/esm/pages/BackofficeLayoutPage.js +64 -56
  182. package/lib/esm/pages/BackofficeLayoutPage.js.map +1 -1
  183. package/lib/esm/pages/backofficeDashboardPage.css.js +1 -1
  184. package/lib/esm/pages/backofficeDashboardPage.css.js.map +1 -1
  185. package/lib/esm/pages/backofficeEntityDetailPage.css.js +1 -1
  186. package/lib/esm/pages/backofficeEntityDetailPage.css.js.map +1 -1
  187. package/lib/esm/pages/backofficeEntityListPage.css.js +1 -1
  188. package/lib/esm/pages/backofficeEntityListPage.css.js.map +1 -1
  189. package/lib/esm/pages/detail/BackofficeEntityDetailLayoutContext.js.map +1 -1
  190. package/lib/esm/pages/detail/BackofficeEntityDetailManifestFallback.js +11 -11
  191. package/lib/esm/pages/detail/BackofficeEntityDetailManifestFallback.js.map +1 -1
  192. package/lib/esm/pages/detail/buildTabsItems.js.map +1 -1
  193. package/lib/esm/provider/BackofficeProvider.js +41 -39
  194. package/lib/esm/provider/BackofficeProvider.js.map +1 -1
  195. package/lib/esm/router/createBackofficeRoutes.js +23 -23
  196. package/lib/esm/router/createBackofficeRoutes.js.map +1 -1
  197. package/lib/esm/storybook/backofficeDashboardPageStory.css.js +6 -0
  198. package/lib/esm/storybook/backofficeDashboardPageStory.css.js.map +1 -0
  199. package/lib/esm/storybook/relay/RelayStory.css.js +1 -1
  200. package/lib/esm/storybook/relay/RelayStory.css.js.map +1 -1
  201. package/lib/esm/style.css +1 -1
  202. package/lib/types/auth/AuthRefreshNotice.d.ts +5 -1
  203. package/lib/types/auth/AuthRefreshNotice.d.ts.map +1 -1
  204. package/lib/types/auth/TotpQrCode.d.ts +2 -1
  205. package/lib/types/auth/TotpQrCode.d.ts.map +1 -1
  206. package/lib/types/auth/authRefreshNotice.css.d.ts.map +1 -1
  207. package/lib/types/auth/login/AuthPanel.d.ts.map +1 -1
  208. package/lib/types/auth/login/EmailCapturePanel.d.ts.map +1 -1
  209. package/lib/types/auth/login/LoginFlow.d.ts.map +1 -1
  210. package/lib/types/auth/login/MethodChooser.d.ts.map +1 -1
  211. package/lib/types/auth/login/MfaChallengeForm.d.ts.map +1 -1
  212. package/lib/types/auth/login/OidcButtons.d.ts.map +1 -1
  213. package/lib/types/auth/login/PasskeyLoginForm.d.ts.map +1 -1
  214. package/lib/types/auth/login/PasswordLoginPanel.d.ts +1 -1
  215. package/lib/types/auth/login/PasswordLoginPanel.d.ts.map +1 -1
  216. package/lib/types/auth/login/loginPage.css.d.ts.map +1 -1
  217. package/lib/types/auth/pages/AcceptInvitationScreen.d.ts.map +1 -1
  218. package/lib/types/auth/pages/PasswordResetCompleteScreen.d.ts.map +1 -1
  219. package/lib/types/auth/pages/PasswordResetRequestScreen.d.ts.map +1 -1
  220. package/lib/types/auth/pages/VerifyEmailScreen.d.ts.map +1 -1
  221. package/lib/types/components/backoffice/actions/BackofficeEntityActionFormDialog.d.ts +3 -3
  222. package/lib/types/components/backoffice/actions/BackofficeEntityActionFormDialog.d.ts.map +1 -1
  223. package/lib/types/components/backoffice/actions/toastViewAction.d.ts +1 -1
  224. package/lib/types/components/backoffice/actions/toastViewAction.d.ts.map +1 -1
  225. package/lib/types/components/backoffice/billing/BackofficeBillingUsageChart.d.ts +2 -1
  226. package/lib/types/components/backoffice/billing/BackofficeBillingUsageChart.d.ts.map +1 -1
  227. package/lib/types/components/backoffice/columns/buildDataTableColumns.d.ts +2 -2
  228. package/lib/types/components/backoffice/columns/buildDataTableColumns.d.ts.map +1 -1
  229. package/lib/types/components/backoffice/detail/BackofficeDetailBadgeRow.d.ts.map +1 -1
  230. package/lib/types/components/backoffice/detail/BackofficeEntitySummaryHeader.d.ts.map +1 -1
  231. package/lib/types/components/backoffice/detail/BackofficeRelationsSummaryGrid.d.ts +1 -1
  232. package/lib/types/components/backoffice/detail/BackofficeRelationsSummaryGrid.d.ts.map +1 -1
  233. package/lib/types/components/backoffice/detail/BackofficeTokenUsageBreakdown.d.ts.map +1 -1
  234. package/lib/types/components/backoffice/detail/BackofficeUsageCostBreakdown.d.ts +1 -1
  235. package/lib/types/components/backoffice/detail/BackofficeUsageCostBreakdown.d.ts.map +1 -1
  236. package/lib/types/components/backoffice/errors/BackofficeErrorBoundary.d.ts +1 -1
  237. package/lib/types/components/backoffice/errors/BackofficeErrorBoundary.d.ts.map +1 -1
  238. package/lib/types/components/backoffice/filters/EntityIdFilterField.d.ts.map +1 -1
  239. package/lib/types/components/backoffice/filters/backofficeFilterAction.css.d.ts.map +1 -1
  240. package/lib/types/components/backoffice/filters/deferredFilterSearchInput.css.d.ts.map +1 -1
  241. package/lib/types/components/backoffice/filters/entityIdFilterField.css.d.ts +0 -1
  242. package/lib/types/components/backoffice/filters/entityIdFilterField.css.d.ts.map +1 -1
  243. package/lib/types/components/backoffice/hub/backofficeHubTemplate.css.d.ts.map +1 -1
  244. package/lib/types/components/backoffice/layout/backofficeSidebarActions.css.d.ts.map +1 -1
  245. package/lib/types/components/backoffice/layout/buildSidebarSections.d.ts +2 -2
  246. package/lib/types/components/backoffice/layout/buildSidebarSections.d.ts.map +1 -1
  247. package/lib/types/components/backoffice/layout/mapViewerToSidebarProfileView.d.ts +1 -1
  248. package/lib/types/components/backoffice/layout/mapViewerToSidebarProfileView.d.ts.map +1 -1
  249. package/lib/types/components/backoffice/list/RowFlagsCell.css.d.ts.map +1 -1
  250. package/lib/types/components/backoffice/overview/backofficeOverviewLayout.css.d.ts.map +1 -1
  251. package/lib/types/components/backoffice/pickers/EntityIdPickerDialog.d.ts +3 -3
  252. package/lib/types/components/backoffice/pickers/EntityIdPickerDialog.d.ts.map +1 -1
  253. package/lib/types/components/backoffice/refs/backofficeRelatedCountLink.css.d.ts.map +1 -1
  254. package/lib/types/components/backoffice/routing/BackofficeContentError.d.ts.map +1 -1
  255. package/lib/types/components/backoffice/scaffolds/BackofficeEntityDetailNotFound.d.ts.map +1 -1
  256. package/lib/types/components/backoffice/scaffolds/BackofficeEntityListScaffold.d.ts +2 -2
  257. package/lib/types/components/backoffice/scaffolds/BackofficeEntityListScaffold.d.ts.map +1 -1
  258. package/lib/types/components/backoffice/scaffolds/BackofficeTabbedDetailShell.d.ts +1 -1
  259. package/lib/types/components/backoffice/scaffolds/BackofficeTabbedDetailShell.d.ts.map +1 -1
  260. package/lib/types/components/backoffice/shared/backofficeFilterableCell.css.d.ts.map +1 -1
  261. package/lib/types/components/backoffice/tools/BackofficeToolsErrorFallback.d.ts.map +1 -1
  262. package/lib/types/components/backoffice/tools/BackofficeToolsJsonForm.d.ts.map +1 -1
  263. package/lib/types/components/backoffice/tools/backofficeToolsDocPanel.css.d.ts.map +1 -1
  264. package/lib/types/hooks/useBackofficeInfiniteScrollSentinel.d.ts +1 -2
  265. package/lib/types/hooks/useBackofficeInfiniteScrollSentinel.d.ts.map +1 -1
  266. package/lib/types/i18n/resources.d.ts +44 -2
  267. package/lib/types/i18n/resources.d.ts.map +1 -1
  268. package/lib/types/pages/BackofficeDashboardPage.d.ts.map +1 -1
  269. package/lib/types/pages/BackofficeDashboardWidgetContent.d.ts.map +1 -1
  270. package/lib/types/pages/BackofficeEntityDetailLayoutPage.d.ts.map +1 -1
  271. package/lib/types/pages/BackofficeEntityDetailPage.d.ts.map +1 -1
  272. package/lib/types/pages/BackofficeEntityDetailPage.view-helpers.d.ts +1 -1
  273. package/lib/types/pages/BackofficeEntityDetailPage.view-helpers.d.ts.map +1 -1
  274. package/lib/types/pages/BackofficeEntityListDataPage.d.ts.map +1 -1
  275. package/lib/types/pages/BackofficeEntityListPage.d.ts.map +1 -1
  276. package/lib/types/pages/BackofficeEntityListPage.helpers.d.ts +9 -9
  277. package/lib/types/pages/BackofficeEntityListPage.helpers.d.ts.map +1 -1
  278. package/lib/types/pages/BackofficeEntityListRouteContext.d.ts +2 -2
  279. package/lib/types/pages/BackofficeEntityListRouteContext.d.ts.map +1 -1
  280. package/lib/types/pages/BackofficeLayoutPage.d.ts.map +1 -1
  281. package/lib/types/pages/backofficeEntityListPage.css.d.ts.map +1 -1
  282. package/lib/types/pages/detail/BackofficeEntityDetailLayoutContext.d.ts +1 -1
  283. package/lib/types/pages/detail/BackofficeEntityDetailLayoutContext.d.ts.map +1 -1
  284. package/lib/types/pages/detail/buildTabsItems.d.ts +1 -1
  285. package/lib/types/pages/detail/buildTabsItems.d.ts.map +1 -1
  286. package/lib/types/provider/BackofficeProvider.d.ts.map +1 -1
  287. package/lib/types/provider/types.d.ts +2 -0
  288. package/lib/types/provider/types.d.ts.map +1 -1
  289. package/lib/types/router/createBackofficeRoutes.d.ts +0 -1
  290. package/lib/types/router/createBackofficeRoutes.d.ts.map +1 -1
  291. package/lib/types/storybook/backofficeDashboardPageStory.css.d.ts +2 -0
  292. package/lib/types/storybook/backofficeDashboardPageStory.css.d.ts.map +1 -0
  293. package/package.json +17 -17
  294. package/lib/esm/components/backoffice/technical/TechnicalIdentifierValue.js +0 -2
  295. package/lib/types/components/backoffice/technical/TechnicalIdentifierValue.d.ts +0 -2
  296. package/lib/types/components/backoffice/technical/TechnicalIdentifierValue.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeEntityDetailPage.view-helpers.js","names":[],"sources":["../../../src/pages/BackofficeEntityDetailPage.view-helpers.ts"],"sourcesContent":["/* eslint-disable no-ternary */\nimport type {\n BackofficeBadgeItem,\n BackofficeColumnSpec,\n BackofficeDetailBlockSpec,\n BackofficeDetailFieldSpec,\n BackofficeDetailHeaderConfig,\n BackofficeDetailHeaderMetaSpec,\n BackofficeDetailHeaderStatusSpec,\n BackofficeFieldSize,\n BackofficeFlagVariant,\n BackofficeInlineValueSpec,\n BackofficePayloadFormat,\n BackofficeTone,\n BackofficeValueLabel,\n} from '@plumile/backoffice-core/types.js';\nimport type { DataTableColumn } from '@plumile/ui/components/data-table/DataTable.js';\nimport type { TFunction } from 'i18next';\nimport { Fragment, createElement, type ReactNode } from 'react';\n\nimport {\n isEmptyText,\n resolveLabel,\n resolveBadgeTone,\n resolveValueLabel,\n} from './BackofficeEntityDetailPage.helpers.js';\nimport {\n normalizeTechnicalIdentifier,\n TechnicalIdentifierValue,\n type TechnicalIdentifierVariant,\n} from '../components/backoffice/technical/TechnicalIdentifierValue.js';\n\nexport type ResolvedFieldItem = {\n id: string;\n label: string;\n size: BackofficeFieldSize;\n value: ReactNode;\n copyValue?: string;\n fullWidth?: boolean;\n};\n\nexport type ResolvedHeaderItem = {\n id: string;\n label: string;\n value: ReactNode;\n};\n\nexport type FlagIconName =\n | 'shield-lock'\n | 'shield-off'\n | 'settings-check'\n | 'settings-x'\n | 'x-badge'\n | 'chat-check'\n | 'key'\n | 'key-off'\n | 'lock'\n | 'lock-open'\n | 'robot-check'\n | 'robot-x'\n | 'rocket'\n | 'rocket-off';\n\nexport type ResolvedFlagTag = {\n tone: 'neutral' | 'info' | 'success' | 'warning' | 'danger';\n label: string;\n iconName?: FlagIconName;\n};\n\nexport const resolveFlagTag = (\n variant: BackofficeFlagVariant,\n value: boolean,\n t: TFunction,\n): ResolvedFlagTag => {\n switch (variant) {\n case 'yesNo':\n return value\n ? { tone: 'success', label: t('common.boolean.yes') }\n : { tone: 'neutral', label: t('common.boolean.no') };\n case 'capability':\n return value\n ? {\n tone: 'success',\n label: t('flags.capability.allowed'),\n iconName: 'shield-lock',\n }\n : {\n tone: 'neutral',\n label: t('flags.capability.denied'),\n iconName: 'shield-off',\n };\n case 'enabled':\n return value\n ? {\n tone: 'success',\n label: t('flags.enabled.enabled'),\n iconName: 'settings-check',\n }\n : {\n tone: 'neutral',\n label: t('flags.enabled.disabled'),\n iconName: 'settings-x',\n };\n case 'failure':\n return value\n ? {\n tone: 'danger',\n label: t('flags.failure.failed'),\n iconName: 'x-badge',\n }\n : {\n tone: 'success',\n label: t('flags.failure.ok'),\n iconName: 'chat-check',\n };\n case 'encrypted':\n return value\n ? {\n tone: 'info',\n label: t('flags.encrypted.encrypted'),\n iconName: 'key',\n }\n : {\n tone: 'neutral',\n label: t('flags.encrypted.notEncrypted'),\n iconName: 'key-off',\n };\n case 'locked':\n return value\n ? {\n tone: 'warning',\n label: t('flags.locked.locked'),\n iconName: 'lock',\n }\n : {\n tone: 'success',\n label: t('flags.locked.unlocked'),\n iconName: 'lock-open',\n };\n case 'default':\n return value\n ? { tone: 'info', label: t('flags.default.default') }\n : { tone: 'neutral', label: t('flags.default.notDefault') };\n case 'agentManaged':\n return value\n ? {\n tone: 'info',\n label: t('flags.agentManaged.agentManaged'),\n iconName: 'robot-check',\n }\n : {\n tone: 'neutral',\n label: t('flags.agentManaged.userManaged'),\n iconName: 'robot-x',\n };\n case 'deployedProduction':\n return value\n ? {\n tone: 'success',\n label: t('flags.deployedProduction.deployed'),\n iconName: 'rocket',\n }\n : {\n tone: 'neutral',\n label: t('flags.deployedProduction.notDeployed'),\n iconName: 'rocket-off',\n };\n case 'forced':\n return value\n ? { tone: 'warning', label: t('flags.forced.forced') }\n : { tone: 'neutral', label: t('flags.forced.normal') };\n default:\n throw new Error(`Unsupported flag variant: ${String(variant)}`);\n }\n};\n\nexport const resolveInlineValue = (\n value: BackofficeInlineValueSpec,\n options: {\n tApp: TFunction;\n t: TFunction;\n resolveEntityHref?: (entityId: string, refId: string) => string | null;\n renderLink: (href: string, label: ReactNode) => ReactNode;\n },\n): ReactNode => {\n const { tApp, t, resolveEntityHref, renderLink } = options;\n const fallback = t('common.notAvailable');\n\n if (value.type === 'text') {\n const resolved = resolveValueLabel(value.value, tApp);\n return isEmptyText(resolved) ? fallback : resolved;\n }\n\n if (value.type === 'entityRef') {\n const { id } = value;\n if (id == null || id.trim() === '') {\n return fallback;\n }\n const resolvedLabel = resolveValueLabel(value.label, tApp);\n const label =\n resolvedLabel != null && String(resolvedLabel).trim() !== ''\n ? resolvedLabel\n : null;\n if (label == null) {\n return fallback;\n }\n const href = resolveEntityHref?.(value.entity, id) ?? null;\n return href != null ? renderLink(href, label) : label;\n }\n\n const { href } = value;\n if (href == null || href.trim() === '') {\n return fallback;\n }\n const label = resolveValueLabel(value.label, tApp);\n if (isEmptyText(label)) {\n return fallback;\n }\n return renderLink(href, label);\n};\n\nexport const resolveHeaderMeta = <Node>(\n meta: BackofficeDetailHeaderMetaSpec<Node>,\n node: Node,\n options: {\n tApp: TFunction;\n t: TFunction;\n resolveEntityHref?: (entityId: string, refId: string) => string | null;\n renderDate: (\n value: string | number | null | undefined,\n fallback: string,\n ) => ReactNode;\n renderLink: (href: string, label: ReactNode) => ReactNode;\n },\n): ReactNode => {\n const { tApp, t, resolveEntityHref, renderDate, renderLink } = options;\n const fallback = t('common.notAvailable');\n\n if (meta.type === 'dateTime') {\n return renderDate(meta.value(node), fallback);\n }\n\n if (meta.type === 'entityRef') {\n const idValue = meta.id(node);\n if (idValue == null || idValue.trim() === '') {\n return fallback;\n }\n const labelValue = resolveValueLabel(meta.value?.(node), tApp);\n const label =\n labelValue != null && String(labelValue).trim() !== ''\n ? labelValue\n : null;\n if (label == null) {\n return fallback;\n }\n const href = resolveEntityHref?.(meta.entity, idValue) ?? null;\n return href != null ? renderLink(href, label) : label;\n }\n\n if (meta.type === 'link') {\n const href = meta.href(node);\n const labelValue = resolveValueLabel(meta.value(node), tApp);\n if (href == null || href.trim() === '' || isEmptyText(labelValue)) {\n return fallback;\n }\n return renderLink(href, labelValue);\n }\n\n const value = resolveValueLabel(meta.value(node), tApp);\n return isEmptyText(value) ? fallback : value;\n};\n\nexport const resolveHeaderStatus = <Node>(\n status: BackofficeDetailHeaderStatusSpec<Node>,\n node: Node,\n tApp: TFunction,\n renderers: {\n renderBadgeRow: (items: readonly BackofficeBadgeItem[]) => ReactNode;\n renderTag: (\n tone: ReturnType<typeof resolveBadgeTone<Node>>,\n label: string,\n ) => ReactNode;\n },\n): ReactNode | undefined => {\n if (status.type === 'badgeRow') {\n const items = status.items(node).map((item) => {\n const resolvedLabel = resolveValueLabel(item.label, tApp);\n const label = resolvedLabel == null ? '' : String(resolvedLabel);\n return { ...item, label };\n });\n if (items.length === 0) {\n return undefined;\n }\n return renderers.renderBadgeRow(items);\n }\n\n const value = resolveValueLabel(status.value(node), tApp);\n const label = value == null ? '' : String(value);\n if (label.trim() === '') {\n return undefined;\n }\n const tone = resolveBadgeTone(status.tone, node);\n return renderers.renderTag(tone, label);\n};\n\nexport const buildFieldItems = <Node>(\n fields: readonly BackofficeDetailFieldSpec<Node>[],\n node: Node,\n options: {\n tApp: TFunction;\n t: TFunction;\n resolveEntityHref?: (entityId: string, refId: string) => string | null;\n formatNumber: (value: number | null | undefined) => string;\n formatCurrency: (value: number | null | undefined) => string;\n formatCurrencyTitle?: (value: number | null | undefined) => string | null;\n formatPercent: (value: number | null | undefined) => string;\n renderTag: (\n tone: ReturnType<typeof resolveBadgeTone<Node>>,\n label: string,\n ) => ReactNode;\n renderBadgeRow: (items: readonly BackofficeBadgeItem[]) => ReactNode;\n renderDate: (\n value: string | number | null | undefined,\n fallback: string,\n ) => ReactNode;\n renderFlagTag: (tag: ResolvedFlagTag) => ReactNode;\n renderLink: (href: string, label: ReactNode) => ReactNode;\n renderTaggedValue: (\n tag: {\n label: string;\n tone?: ReturnType<typeof resolveBadgeTone<Node>>;\n } | null,\n value: ReactNode,\n ) => ReactNode;\n wrapCustomNode: (id: string, node: ReactNode) => ReactNode;\n },\n): {\n items: ResolvedFieldItem[];\n customNodes: ReactNode[];\n} => {\n const {\n tApp,\n t,\n resolveEntityHref,\n formatNumber,\n formatCurrency,\n formatCurrencyTitle,\n formatPercent,\n renderTag,\n renderBadgeRow,\n renderDate,\n renderFlagTag,\n renderLink,\n renderTaggedValue,\n wrapCustomNode,\n } = options;\n const items: ResolvedFieldItem[] = [];\n const customNodes: ReactNode[] = [];\n const fallback = t('common.notAvailable');\n\n fields.forEach((field, index) => {\n const id = `${field.type}-${index}`;\n\n switch (field.type) {\n case 'text': {\n const value = resolveValueLabel(field.value(node), tApp);\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value,\n copyValue: field.copyValue?.(node) ?? undefined,\n fullWidth: field.fullWidth,\n });\n break;\n }\n case 'badge': {\n const value = resolveValueLabel(field.value(node), tApp);\n const label = value != null ? String(value) : '';\n const tone = resolveBadgeTone(field.tone, node);\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value: label.trim() !== '' ? renderTag(tone, label) : null,\n });\n break;\n }\n case 'badgeRow': {\n const badgeItems = field.items(node).map((item) => {\n const resolvedLabel = resolveValueLabel(item.label, tApp);\n const label = resolvedLabel == null ? '' : String(resolvedLabel);\n return { ...item, label };\n });\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value: badgeItems.length > 0 ? renderBadgeRow(badgeItems) : null,\n fullWidth: field.fullWidth,\n });\n break;\n }\n case 'dateTime': {\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value: renderDate(field.value(node), fallback),\n });\n break;\n }\n case 'number': {\n const value = field.value(node);\n let formatted: ReactNode | null = null;\n if (value != null) {\n if (field.format === 'currency') {\n const label = formatCurrency(value);\n formatted = createElement(\n 'span',\n { title: formatCurrencyTitle?.(value) ?? undefined },\n label,\n );\n } else if (field.format === 'percent') {\n formatted = formatPercent(value);\n } else {\n formatted = formatNumber(value);\n }\n }\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value: formatted,\n });\n break;\n }\n case 'flag': {\n const value = field.value(node);\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value:\n value != null\n ? renderFlagTag(resolveFlagTag(field.variant, value, t))\n : null,\n });\n break;\n }\n case 'entityRef': {\n const idValue = field.id(node);\n let value: ReactNode | null = null;\n if (idValue != null && idValue.trim() !== '') {\n const labelValue = field.value?.(node);\n const label =\n labelValue != null && labelValue.trim() !== '' ? labelValue : null;\n const href = resolveEntityHref?.(field.entity, idValue) ?? null;\n if (label != null) {\n value = href != null ? renderLink(href, label) : label;\n }\n }\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value: value ?? fallback,\n });\n break;\n }\n case 'technicalIdentifier': {\n const value = field.value(node);\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value:\n value == null\n ? null\n : createElement(TechnicalIdentifierValue, {\n value,\n copyValue: field.copyValue?.(node) ?? undefined,\n variant: field.variant,\n copyLabel: t('common.actions.copy'),\n }),\n copyValue: field.copyValue?.(node) ?? undefined,\n fullWidth: field.fullWidth,\n });\n break;\n }\n case 'link': {\n const href = field.href(node);\n const labelValue = field.value(node);\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value:\n href != null && href.trim() !== '' && !isEmptyText(labelValue)\n ? renderLink(href, labelValue)\n : null,\n });\n break;\n }\n case 'taggedValue': {\n const tag = field.tag(node);\n const valueNode = resolveInlineValue(field.value(node), {\n tApp,\n t,\n resolveEntityHref,\n renderLink,\n });\n const resolvedTag =\n tag == null\n ? null\n : {\n ...tag,\n label: (() => {\n const labelValue = resolveValueLabel(tag.label, tApp);\n return labelValue == null ? '' : String(labelValue);\n })(),\n };\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value:\n resolvedTag != null || valueNode != null\n ? renderTaggedValue(resolvedTag, valueNode)\n : null,\n fullWidth: field.fullWidth,\n });\n break;\n }\n case 'custom': {\n const custom = field.render(node) as ReactNode;\n if (custom == null) {\n break;\n }\n if (field.label != null) {\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value: custom,\n fullWidth: field.fullWidth,\n });\n break;\n }\n customNodes.push(wrapCustomNode(id, custom));\n break;\n }\n default:\n break;\n }\n });\n\n return { items, customNodes };\n};\n\nexport const resolveHeaderItems = <Node>(\n header: BackofficeDetailHeaderConfig<Node>,\n node: Node,\n options: {\n tApp: TFunction;\n t: TFunction;\n resolveEntityHref?: (entityId: string, refId: string) => string | null;\n renderLink: (href: string, label: ReactNode) => ReactNode;\n renderDate: (\n value: string | number | null | undefined,\n fallback: string,\n ) => ReactNode;\n renderTag: (\n tone: ReturnType<typeof resolveBadgeTone<Node>>,\n label: string,\n ) => ReactNode;\n renderBadgeRow: (items: readonly BackofficeBadgeItem[]) => ReactNode;\n },\n): {\n title: string;\n subtitle?: ReactNode;\n badges?: ReactNode;\n status?: ReactNode;\n items?: readonly ResolvedHeaderItem[];\n} => {\n const {\n tApp,\n t,\n resolveEntityHref,\n renderLink,\n renderDate,\n renderTag,\n renderBadgeRow,\n } = options;\n const resolvedTitle =\n header.titleValue?.(node, tApp) ?? resolveLabel(header.title, tApp);\n const rawNodeId =\n node != null &&\n typeof node === 'object' &&\n 'id' in node &&\n typeof node.id === 'string'\n ? node.id.trim()\n : null;\n const title =\n resolvedTitle.trim() === '' ||\n (rawNodeId != null && resolvedTitle.trim() === rawNodeId)\n ? resolveLabel(header.title, tApp)\n : resolvedTitle;\n\n let subtitleNode: ReactNode | undefined;\n if (header.subtitleItems != null && header.subtitleItems.length > 0) {\n const { subtitleItems } = header;\n const separator = header.subtitleSeparator ?? ' / ';\n const parts: ReactNode[] = [];\n subtitleItems.forEach((item, index) => {\n parts.push(\n createElement(\n 'span',\n { key: item.id },\n resolveInlineValue(item.value(node), {\n tApp,\n t,\n resolveEntityHref,\n renderLink,\n }),\n ),\n );\n if (index < subtitleItems.length - 1) {\n parts.push(createElement('span', { key: `${item.id}-sep` }, separator));\n }\n });\n subtitleNode = createElement('span', null, ...parts);\n } else {\n const subtitleValue =\n header.subtitleValue?.(node, tApp) ??\n (header.subtitle != null ? resolveLabel(header.subtitle, tApp) : null);\n subtitleNode =\n subtitleValue != null && subtitleValue.trim() !== ''\n ? subtitleValue\n : undefined;\n }\n\n const badgeNodes: ReactNode[] = [];\n header.badges?.forEach((badge, index) => {\n const label = resolveLabel(badge.label, tApp);\n const resolvedValue = resolveValueLabel(badge.value(node), tApp);\n const value = resolvedValue == null ? '' : String(resolvedValue);\n if (value.trim() === '') {\n return;\n }\n badgeNodes.push(\n renderTag(resolveBadgeTone(badge.tone, node), `${label}: ${value}`),\n );\n if (typeof badgeNodes[badgeNodes.length - 1] === 'object') {\n badgeNodes[badgeNodes.length - 1] = createElement(\n Fragment,\n { key: `${label}-${index}` },\n badgeNodes[badgeNodes.length - 1],\n );\n }\n });\n\n const status =\n header.status != null\n ? resolveHeaderStatus(header.status, node, tApp, {\n renderBadgeRow,\n renderTag,\n })\n : undefined;\n\n const items = header.meta?.map((meta, index) => {\n const label = resolveLabel(meta.label, tApp);\n return {\n id: `${label}-${index}`,\n label,\n value: resolveHeaderMeta(meta, node, {\n tApp,\n t,\n resolveEntityHref,\n renderDate,\n renderLink,\n }),\n };\n });\n\n return {\n title,\n subtitle: subtitleNode,\n badges:\n badgeNodes.length > 0\n ? createElement(Fragment, null, ...badgeNodes)\n : undefined,\n status,\n items,\n };\n};\n\nconst renderTimelinePayload = (payload: unknown): ReactNode | undefined => {\n if (payload == null) {\n return undefined;\n }\n if (\n typeof payload === 'string' ||\n typeof payload === 'number' ||\n typeof payload === 'boolean'\n ) {\n return String(payload);\n }\n\n try {\n return createElement('pre', null, JSON.stringify(payload, null, 2));\n } catch {\n const fallback =\n payload instanceof Error ? payload.message : '[unserializable payload]';\n return createElement('pre', null, fallback);\n }\n};\n\nconst resolveTechnicalVariant = (\n refKind: 'id' | 'slug' | 'path' | 'url' | 'hash' | 'external' | 'text',\n): TechnicalIdentifierVariant | null => {\n if (refKind === 'id' || refKind === 'hash' || refKind === 'external') {\n return refKind;\n }\n return null;\n};\n\nconst renderReferenceValue = (args: {\n value: BackofficeValueLabel;\n href?: string | null;\n refKind: 'id' | 'slug' | 'path' | 'url' | 'hash' | 'external' | 'text';\n copyValue?: string | null;\n tApp: TFunction;\n t: TFunction;\n renderLink: (href: string, label: ReactNode) => ReactNode;\n}): ReactNode => {\n const { value, href, refKind, copyValue, tApp, t, renderLink } = args;\n const resolvedValue = resolveValueLabel(value, tApp);\n const technicalVariant = resolveTechnicalVariant(refKind);\n if (technicalVariant != null) {\n const normalized = normalizeTechnicalIdentifier(resolvedValue);\n if (normalized == null) {\n return t('common.notAvailable');\n }\n return createElement(TechnicalIdentifierValue, {\n value: normalized,\n copyValue: copyValue ?? normalized,\n variant: technicalVariant,\n copyLabel: t('common.actions.copy'),\n });\n }\n if (href != null && href.trim() !== '' && !isEmptyText(resolvedValue)) {\n return renderLink(href, resolvedValue);\n }\n return resolvedValue ?? t('common.notAvailable');\n};\n\nexport const renderBlocks = <Node>(\n blocks: readonly BackofficeDetailBlockSpec<Node>[] | undefined,\n node: Node,\n options: {\n tApp: TFunction;\n t: TFunction;\n resolveEntityHref: (entityId: string, refId: string) => string | null;\n keyPrefix?: string;\n renderLink: (href: string, label: ReactNode) => ReactNode;\n renderDate: (\n value: string | number | Date | null | undefined,\n fallback: string,\n ) => ReactNode;\n renderTag: (tone: BackofficeTone, label: string) => ReactNode;\n renderMetricGroup: (args: {\n key: string;\n title: string;\n description?: string;\n density?: 'compact' | 'comfortable';\n items: readonly {\n id: string;\n label: string;\n value: ReactNode;\n hint?: ReactNode;\n tone?: BackofficeTone;\n copyValue?: string;\n }[];\n }) => ReactNode;\n renderTimeline: (args: {\n key: string;\n title: string;\n description?: string;\n events: readonly {\n id: string;\n label: string;\n timestamp?: ReactNode;\n description?: ReactNode;\n actor?: ReactNode;\n tone?: BackofficeTone;\n payload?: ReactNode;\n }[];\n }) => ReactNode;\n renderAuditTimeline: (args: {\n key: string;\n title: string;\n description?: string;\n events: readonly {\n id: string;\n title: ReactNode;\n time?: ReactNode;\n actor?: ReactNode;\n source?: ReactNode;\n }[];\n }) => ReactNode;\n renderRelations: (args: {\n key: string;\n title: string;\n description?: string;\n items: readonly {\n id: string;\n label: string;\n count?: ReactNode;\n href?: string;\n description?: ReactNode;\n tone?: BackofficeTone;\n }[];\n }) => ReactNode;\n renderContextStack: (args: {\n key: string;\n title: string;\n items: readonly {\n id: string;\n label: string;\n value: ReactNode | null | undefined;\n }[];\n }) => ReactNode;\n renderCustomSection: (\n key: string,\n title: string,\n child: ReactNode,\n ) => ReactNode;\n wrapCustomNode: (key: string, node: ReactNode) => ReactNode;\n resolveTableColumns: (\n columns: readonly BackofficeColumnSpec[],\n ) => readonly DataTableColumn<unknown>[];\n renderTable: (args: {\n key: string;\n title: string;\n description?: string;\n columns: readonly DataTableColumn<unknown>[];\n rows: readonly unknown[];\n }) => ReactNode;\n renderPayload: (args: {\n key: string;\n title: string;\n description?: string;\n content: unknown;\n format: BackofficePayloadFormat;\n }) => ReactNode;\n renderKeyValueListSection: (args: {\n key: string;\n title: string;\n description?: string;\n items: readonly { id: string; label: string; value: ReactNode }[];\n }) => ReactNode;\n },\n): ReactNode[] => {\n const { tApp, t, keyPrefix } = options;\n if (blocks == null || blocks.length === 0) {\n return [];\n }\n\n return blocks.map((block, index): ReactNode => {\n const key =\n keyPrefix != null\n ? `${keyPrefix}-${block.kind}-${index}`\n : `${block.kind}-${index}`;\n\n if (block.kind === 'custom') {\n const custom = block.render(node) as ReactNode;\n if (custom == null) {\n return null;\n }\n if (block.label != null) {\n return options.renderCustomSection(\n key,\n resolveLabel(block.label, tApp),\n custom,\n );\n }\n return options.wrapCustomNode(key, custom);\n }\n\n const title =\n 'title' in block\n ? resolveLabel(block.title, tApp)\n : resolveLabel(block.label, tApp);\n const description =\n block.description != null\n ? resolveLabel(block.description, tApp)\n : undefined;\n\n if (block.kind === 'summary') {\n return options.renderKeyValueListSection({\n key,\n title,\n description,\n items: block.items.map((item) => {\n const value = resolveValueLabel(item.value(node), tApp);\n const href = item.href?.(node);\n const tone = item.tone?.(node);\n let valueNode: ReactNode = value ?? t('common.notAvailable');\n if (href != null && href.trim() !== '' && !isEmptyText(value)) {\n valueNode = options.renderLink(href, value);\n } else if (tone != null && !isEmptyText(value)) {\n valueNode = options.renderTag(tone, String(value));\n }\n return {\n id: item.id,\n label: resolveLabel(item.label, tApp),\n value: valueNode,\n };\n }),\n });\n }\n\n if (block.kind === 'metrics') {\n return options.renderMetricGroup({\n key,\n title,\n description,\n density: block.density,\n items: block.items.map((item) => {\n const formattedValue = item.formattedValue?.(node);\n const value = resolveValueLabel(item.value(node), tApp);\n return {\n id: item.id,\n label: resolveLabel(item.label, tApp),\n value: formattedValue ?? value ?? t('common.notAvailable'),\n hint: resolveValueLabel(item.hint?.(node), tApp),\n tone: item.tone?.(node),\n copyValue: item.copyValue?.(node) ?? undefined,\n };\n }),\n });\n }\n\n if (block.kind === 'states') {\n return options.renderKeyValueListSection({\n key,\n title,\n description,\n items: block.states.map((state) => {\n const display = state.getDisplay(state.value(node), node);\n return {\n id: state.id,\n label: resolveLabel(state.label, tApp),\n value: options.renderTag(\n display.tone,\n String(\n resolveValueLabel(display.label, tApp) ??\n t('common.notAvailable'),\n ),\n ),\n };\n }),\n });\n }\n\n if (block.kind === 'context') {\n return options.renderContextStack({\n key,\n title,\n items: block.items.map((item) => {\n const value = resolveValueLabel(item.value(node), tApp);\n const href = item.href?.(node);\n return {\n id: item.id,\n label: resolveLabel(item.label, tApp),\n value:\n href != null && href.trim() !== '' && !isEmptyText(value)\n ? options.renderLink(href, value)\n : value,\n };\n }),\n });\n }\n\n if (block.kind === 'relationSummary') {\n return options.renderRelations({\n key,\n title,\n description,\n items: block.items.map((item) => {\n return {\n id: item.id,\n label: resolveLabel(item.label, tApp),\n count: item.count?.(node) ?? null,\n href: item.href?.(node) ?? undefined,\n description: resolveValueLabel(item.description?.(node), tApp),\n tone: item.tone?.(node),\n };\n }),\n });\n }\n\n if (block.kind === 'timeline') {\n return options.renderTimeline({\n key,\n title,\n description,\n events: block.events.map((event) => {\n const state = event.state?.(node);\n const stateLabel =\n state == null ? null : resolveValueLabel(state.label, tApp);\n const stateText = stateLabel == null ? null : String(stateLabel);\n return {\n id: event.id,\n label:\n stateText == null || stateText.trim() === ''\n ? resolveLabel(event.label, tApp)\n : `${resolveLabel(event.label, tApp)}: ${stateText}`,\n timestamp:\n event.timestamp == null\n ? undefined\n : options.renderDate(\n event.timestamp(node),\n t('common.notAvailable'),\n ),\n description: resolveValueLabel(event.description?.(node), tApp),\n actor: resolveValueLabel(event.actor?.(node), tApp),\n tone: state?.tone,\n payload: renderTimelinePayload(event.payload?.(node)),\n };\n }),\n });\n }\n\n if (block.kind === 'audit') {\n return options.renderAuditTimeline({\n key,\n title,\n description,\n events: block.items.map((item) => {\n const actor = resolveValueLabel(item.actor?.(node), tApp);\n const source = resolveValueLabel(item.source?.(node), tApp);\n return {\n id: item.id,\n title: resolveLabel(item.label, tApp),\n time: options.renderDate(\n item.timestamp?.(node),\n t('common.notAvailable'),\n ),\n actor: isEmptyText(actor) ? undefined : actor,\n source: isEmptyText(source) ? undefined : source,\n };\n }),\n });\n }\n\n if (block.kind === 'references') {\n return options.renderKeyValueListSection({\n key,\n title,\n description,\n items: block.references.map((reference) => {\n const href = reference.href?.(node);\n return {\n id: reference.id,\n label: resolveLabel(reference.label, tApp),\n value: renderReferenceValue({\n value: reference.value(node),\n href,\n refKind: reference.refKind ?? 'text',\n copyValue: reference.copyValue?.(node) ?? undefined,\n tApp,\n t,\n renderLink: options.renderLink,\n }),\n };\n }),\n });\n }\n\n if (block.kind === 'actionResult') {\n const items: { id: string; label: string; value: ReactNode }[] = [];\n const status = block.status?.(node);\n if (status != null) {\n items.push({\n id: `${block.id}-status`,\n label: t('detail.actionResult.status'),\n value: options.renderTag(\n status.tone,\n String(\n resolveValueLabel(status.label, tApp) ?? t('common.notAvailable'),\n ),\n ),\n });\n }\n const message = resolveValueLabel(block.message?.(node), tApp);\n if (!isEmptyText(message)) {\n items.push({\n id: `${block.id}-message`,\n label: t('detail.actionResult.message'),\n value: message,\n });\n }\n block.references?.forEach((reference) => {\n items.push({\n id: reference.id,\n label: resolveLabel(reference.label, tApp),\n value: renderReferenceValue({\n value: reference.value(node),\n href: reference.href?.(node),\n refKind: reference.refKind ?? 'text',\n copyValue: reference.copyValue?.(node) ?? undefined,\n tApp,\n t,\n renderLink: options.renderLink,\n }),\n });\n });\n return options.renderKeyValueListSection({\n key,\n title,\n description,\n items,\n });\n }\n\n if (block.kind === 'technicalFacts') {\n return options.renderKeyValueListSection({\n key,\n title,\n description,\n items: block.facts.map((fact) => {\n const value = resolveValueLabel(fact.value(node), tApp);\n const href = fact.href?.(node);\n const copyValue = fact.copyValue?.(node) ?? undefined;\n return {\n id: fact.id,\n label: resolveLabel(fact.label, tApp),\n value:\n copyValue != null && copyValue.trim() !== ''\n ? createElement(TechnicalIdentifierValue, {\n value: value ?? copyValue,\n copyValue,\n variant: 'external',\n copyLabel: t('common.actions.copy'),\n })\n : href != null && href.trim() !== '' && !isEmptyText(value)\n ? options.renderLink(href, value)\n : (value ?? t('common.notAvailable')),\n };\n }),\n });\n }\n\n if (block.kind === 'table') {\n return options.renderTable({\n key,\n title,\n description,\n columns: options.resolveTableColumns(block.columns),\n rows: block.rows(node) as readonly unknown[],\n });\n }\n\n return options.renderPayload({\n key,\n title,\n description,\n content: block.value(node),\n format: block.format ?? 'json',\n });\n });\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"BackofficeEntityDetailPage.view-helpers.js","names":[],"sources":["../../../src/pages/BackofficeEntityDetailPage.view-helpers.ts"],"sourcesContent":["/* eslint-disable no-ternary */\nimport type {\n BackofficeBadgeItem,\n BackofficeColumnSpec,\n BackofficeDetailBlockSpec,\n BackofficeDetailFieldSpec,\n BackofficeDetailHeaderConfig,\n BackofficeDetailHeaderMetaSpec,\n BackofficeDetailHeaderStatusSpec,\n BackofficeFieldSize,\n BackofficeFlagVariant,\n BackofficeInlineValueSpec,\n BackofficePayloadFormat,\n BackofficeTone,\n BackofficeValueLabel,\n} from '@plumile/backoffice-core/types.js';\nimport {\n normalizeTechnicalIdentifier,\n TechnicalIdentifierValue,\n type DataTableColumn,\n type TechnicalIdentifierAbbreviation,\n} from '@plumile/ui';\nimport type { TFunction } from 'i18next';\nimport { Fragment, createElement, type ReactNode } from 'react';\n\nimport {\n isEmptyText,\n resolveLabel,\n resolveBadgeTone,\n resolveValueLabel,\n} from './BackofficeEntityDetailPage.helpers.js';\n\nexport type ResolvedFieldItem = {\n id: string;\n label: string;\n size: BackofficeFieldSize;\n value: ReactNode;\n copyValue?: string;\n fullWidth?: boolean;\n};\n\nexport type ResolvedHeaderItem = {\n id: string;\n label: string;\n value: ReactNode;\n};\n\nexport type FlagIconName =\n | 'shield-lock'\n | 'shield-off'\n | 'settings-check'\n | 'settings-x'\n | 'x-badge'\n | 'chat-check'\n | 'key'\n | 'key-off'\n | 'lock'\n | 'lock-open'\n | 'robot-check'\n | 'robot-x'\n | 'rocket'\n | 'rocket-off';\n\nexport type ResolvedFlagTag = {\n tone: 'neutral' | 'info' | 'success' | 'warning' | 'danger';\n label: string;\n iconName?: FlagIconName;\n};\n\nexport const resolveFlagTag = (\n variant: BackofficeFlagVariant,\n value: boolean,\n t: TFunction,\n): ResolvedFlagTag => {\n switch (variant) {\n case 'yesNo':\n return value\n ? { tone: 'success', label: t('common.boolean.yes') }\n : { tone: 'neutral', label: t('common.boolean.no') };\n case 'capability':\n return value\n ? {\n tone: 'success',\n label: t('flags.capability.allowed'),\n iconName: 'shield-lock',\n }\n : {\n tone: 'neutral',\n label: t('flags.capability.denied'),\n iconName: 'shield-off',\n };\n case 'enabled':\n return value\n ? {\n tone: 'success',\n label: t('flags.enabled.enabled'),\n iconName: 'settings-check',\n }\n : {\n tone: 'neutral',\n label: t('flags.enabled.disabled'),\n iconName: 'settings-x',\n };\n case 'failure':\n return value\n ? {\n tone: 'danger',\n label: t('flags.failure.failed'),\n iconName: 'x-badge',\n }\n : {\n tone: 'success',\n label: t('flags.failure.ok'),\n iconName: 'chat-check',\n };\n case 'encrypted':\n return value\n ? {\n tone: 'info',\n label: t('flags.encrypted.encrypted'),\n iconName: 'key',\n }\n : {\n tone: 'neutral',\n label: t('flags.encrypted.notEncrypted'),\n iconName: 'key-off',\n };\n case 'locked':\n return value\n ? {\n tone: 'warning',\n label: t('flags.locked.locked'),\n iconName: 'lock',\n }\n : {\n tone: 'success',\n label: t('flags.locked.unlocked'),\n iconName: 'lock-open',\n };\n case 'default':\n return value\n ? { tone: 'info', label: t('flags.default.default') }\n : { tone: 'neutral', label: t('flags.default.notDefault') };\n case 'agentManaged':\n return value\n ? {\n tone: 'info',\n label: t('flags.agentManaged.agentManaged'),\n iconName: 'robot-check',\n }\n : {\n tone: 'neutral',\n label: t('flags.agentManaged.userManaged'),\n iconName: 'robot-x',\n };\n case 'deployedProduction':\n return value\n ? {\n tone: 'success',\n label: t('flags.deployedProduction.deployed'),\n iconName: 'rocket',\n }\n : {\n tone: 'neutral',\n label: t('flags.deployedProduction.notDeployed'),\n iconName: 'rocket-off',\n };\n case 'forced':\n return value\n ? { tone: 'warning', label: t('flags.forced.forced') }\n : { tone: 'neutral', label: t('flags.forced.normal') };\n default:\n throw new Error(`Unsupported flag variant: ${String(variant)}`);\n }\n};\n\nexport const resolveInlineValue = (\n value: BackofficeInlineValueSpec,\n options: {\n tApp: TFunction;\n t: TFunction;\n resolveEntityHref?: (entityId: string, refId: string) => string | null;\n renderLink: (href: string, label: ReactNode) => ReactNode;\n },\n): ReactNode => {\n const { tApp, t, resolveEntityHref, renderLink } = options;\n const fallback = t('common.notAvailable');\n\n if (value.type === 'text') {\n const resolved = resolveValueLabel(value.value, tApp);\n return isEmptyText(resolved) ? fallback : resolved;\n }\n\n if (value.type === 'entityRef') {\n const { id } = value;\n if (id == null || id.trim() === '') {\n return fallback;\n }\n const resolvedLabel = resolveValueLabel(value.label, tApp);\n const label =\n resolvedLabel != null && String(resolvedLabel).trim() !== ''\n ? resolvedLabel\n : null;\n if (label == null) {\n return fallback;\n }\n const href = resolveEntityHref?.(value.entity, id) ?? null;\n return href != null ? renderLink(href, label) : label;\n }\n\n const { href } = value;\n if (href == null || href.trim() === '') {\n return fallback;\n }\n const label = resolveValueLabel(value.label, tApp);\n if (isEmptyText(label)) {\n return fallback;\n }\n return renderLink(href, label);\n};\n\nexport const resolveHeaderMeta = <Node>(\n meta: BackofficeDetailHeaderMetaSpec<Node>,\n node: Node,\n options: {\n tApp: TFunction;\n t: TFunction;\n resolveEntityHref?: (entityId: string, refId: string) => string | null;\n renderDate: (\n value: string | number | null | undefined,\n fallback: string,\n ) => ReactNode;\n renderLink: (href: string, label: ReactNode) => ReactNode;\n },\n): ReactNode => {\n const { tApp, t, resolveEntityHref, renderDate, renderLink } = options;\n const fallback = t('common.notAvailable');\n\n if (meta.type === 'dateTime') {\n return renderDate(meta.value(node), fallback);\n }\n\n if (meta.type === 'entityRef') {\n const idValue = meta.id(node);\n if (idValue == null || idValue.trim() === '') {\n return fallback;\n }\n const labelValue = resolveValueLabel(meta.value?.(node), tApp);\n const label =\n labelValue != null && String(labelValue).trim() !== ''\n ? labelValue\n : null;\n if (label == null) {\n return fallback;\n }\n const href = resolveEntityHref?.(meta.entity, idValue) ?? null;\n return href != null ? renderLink(href, label) : label;\n }\n\n if (meta.type === 'link') {\n const href = meta.href(node);\n const labelValue = resolveValueLabel(meta.value(node), tApp);\n if (href == null || href.trim() === '' || isEmptyText(labelValue)) {\n return fallback;\n }\n return renderLink(href, labelValue);\n }\n\n const value = resolveValueLabel(meta.value(node), tApp);\n return isEmptyText(value) ? fallback : value;\n};\n\nexport const resolveHeaderStatus = <Node>(\n status: BackofficeDetailHeaderStatusSpec<Node>,\n node: Node,\n tApp: TFunction,\n renderers: {\n renderBadgeRow: (items: readonly BackofficeBadgeItem[]) => ReactNode;\n renderTag: (\n tone: ReturnType<typeof resolveBadgeTone<Node>>,\n label: string,\n ) => ReactNode;\n },\n): ReactNode | undefined => {\n if (status.type === 'badgeRow') {\n const items = status.items(node).map((item) => {\n const resolvedLabel = resolveValueLabel(item.label, tApp);\n const label = resolvedLabel == null ? '' : String(resolvedLabel);\n return { ...item, label };\n });\n if (items.length === 0) {\n return undefined;\n }\n return renderers.renderBadgeRow(items);\n }\n\n const value = resolveValueLabel(status.value(node), tApp);\n const label = value == null ? '' : String(value);\n if (label.trim() === '') {\n return undefined;\n }\n const tone = resolveBadgeTone(status.tone, node);\n return renderers.renderTag(tone, label);\n};\n\nexport const buildFieldItems = <Node>(\n fields: readonly BackofficeDetailFieldSpec<Node>[],\n node: Node,\n options: {\n tApp: TFunction;\n t: TFunction;\n resolveEntityHref?: (entityId: string, refId: string) => string | null;\n formatNumber: (value: number | null | undefined) => string;\n formatCurrency: (value: number | null | undefined) => string;\n formatCurrencyTitle?: (value: number | null | undefined) => string | null;\n formatPercent: (value: number | null | undefined) => string;\n renderTag: (\n tone: ReturnType<typeof resolveBadgeTone<Node>>,\n label: string,\n ) => ReactNode;\n renderBadgeRow: (items: readonly BackofficeBadgeItem[]) => ReactNode;\n renderDate: (\n value: string | number | null | undefined,\n fallback: string,\n ) => ReactNode;\n renderFlagTag: (tag: ResolvedFlagTag) => ReactNode;\n renderLink: (href: string, label: ReactNode) => ReactNode;\n renderTaggedValue: (\n tag: {\n label: string;\n tone?: ReturnType<typeof resolveBadgeTone<Node>>;\n } | null,\n value: ReactNode,\n ) => ReactNode;\n wrapCustomNode: (id: string, node: ReactNode) => ReactNode;\n },\n): {\n items: ResolvedFieldItem[];\n customNodes: ReactNode[];\n} => {\n const {\n tApp,\n t,\n resolveEntityHref,\n formatNumber,\n formatCurrency,\n formatCurrencyTitle,\n formatPercent,\n renderTag,\n renderBadgeRow,\n renderDate,\n renderFlagTag,\n renderLink,\n renderTaggedValue,\n wrapCustomNode,\n } = options;\n const items: ResolvedFieldItem[] = [];\n const customNodes: ReactNode[] = [];\n const fallback = t('common.notAvailable');\n\n fields.forEach((field, index) => {\n const id = `${field.type}-${index}`;\n\n switch (field.type) {\n case 'text': {\n const value = resolveValueLabel(field.value(node), tApp);\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value,\n copyValue: field.copyValue?.(node) ?? undefined,\n fullWidth: field.fullWidth,\n });\n break;\n }\n case 'badge': {\n const value = resolveValueLabel(field.value(node), tApp);\n const label = value != null ? String(value) : '';\n const tone = resolveBadgeTone(field.tone, node);\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value: label.trim() !== '' ? renderTag(tone, label) : null,\n });\n break;\n }\n case 'badgeRow': {\n const badgeItems = field.items(node).map((item) => {\n const resolvedLabel = resolveValueLabel(item.label, tApp);\n const label = resolvedLabel == null ? '' : String(resolvedLabel);\n return { ...item, label };\n });\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value: badgeItems.length > 0 ? renderBadgeRow(badgeItems) : null,\n fullWidth: field.fullWidth,\n });\n break;\n }\n case 'dateTime': {\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value: renderDate(field.value(node), fallback),\n });\n break;\n }\n case 'number': {\n const value = field.value(node);\n let formatted: ReactNode | null = null;\n if (value != null) {\n if (field.format === 'currency') {\n const label = formatCurrency(value);\n formatted = createElement(\n 'span',\n { title: formatCurrencyTitle?.(value) ?? undefined },\n label,\n );\n } else if (field.format === 'percent') {\n formatted = formatPercent(value);\n } else {\n formatted = formatNumber(value);\n }\n }\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value: formatted,\n });\n break;\n }\n case 'flag': {\n const value = field.value(node);\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value:\n value != null\n ? renderFlagTag(resolveFlagTag(field.variant, value, t))\n : null,\n });\n break;\n }\n case 'entityRef': {\n const idValue = field.id(node);\n let value: ReactNode | null = null;\n if (idValue != null && idValue.trim() !== '') {\n const labelValue = field.value?.(node);\n const label =\n labelValue != null && labelValue.trim() !== '' ? labelValue : null;\n const href = resolveEntityHref?.(field.entity, idValue) ?? null;\n if (label != null) {\n value = href != null ? renderLink(href, label) : label;\n }\n }\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value: value ?? fallback,\n });\n break;\n }\n case 'technicalIdentifier': {\n const value = field.value(node);\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value:\n value == null\n ? null\n : createElement(TechnicalIdentifierValue, {\n value,\n copyValue: field.copyValue?.(node) ?? undefined,\n abbreviation: field.abbreviation,\n copyLabel: t('common.actions.copy'),\n }),\n copyValue: field.copyValue?.(node) ?? undefined,\n fullWidth: field.fullWidth,\n });\n break;\n }\n case 'link': {\n const href = field.href(node);\n const labelValue = field.value(node);\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value:\n href != null && href.trim() !== '' && !isEmptyText(labelValue)\n ? renderLink(href, labelValue)\n : null,\n });\n break;\n }\n case 'taggedValue': {\n const tag = field.tag(node);\n const valueNode = resolveInlineValue(field.value(node), {\n tApp,\n t,\n resolveEntityHref,\n renderLink,\n });\n const resolvedTag =\n tag == null\n ? null\n : {\n ...tag,\n label: (() => {\n const labelValue = resolveValueLabel(tag.label, tApp);\n return labelValue == null ? '' : String(labelValue);\n })(),\n };\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value:\n resolvedTag != null || valueNode != null\n ? renderTaggedValue(resolvedTag, valueNode)\n : null,\n fullWidth: field.fullWidth,\n });\n break;\n }\n case 'custom': {\n const custom = field.render(node) as ReactNode;\n if (custom == null) {\n break;\n }\n if (field.label != null) {\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value: custom,\n fullWidth: field.fullWidth,\n });\n break;\n }\n customNodes.push(wrapCustomNode(id, custom));\n break;\n }\n default:\n break;\n }\n });\n\n return { items, customNodes };\n};\n\nexport const resolveHeaderItems = <Node>(\n header: BackofficeDetailHeaderConfig<Node>,\n node: Node,\n options: {\n tApp: TFunction;\n t: TFunction;\n resolveEntityHref?: (entityId: string, refId: string) => string | null;\n renderLink: (href: string, label: ReactNode) => ReactNode;\n renderDate: (\n value: string | number | null | undefined,\n fallback: string,\n ) => ReactNode;\n renderTag: (\n tone: ReturnType<typeof resolveBadgeTone<Node>>,\n label: string,\n ) => ReactNode;\n renderBadgeRow: (items: readonly BackofficeBadgeItem[]) => ReactNode;\n },\n): {\n title: string;\n subtitle?: ReactNode;\n badges?: ReactNode;\n status?: ReactNode;\n items?: readonly ResolvedHeaderItem[];\n} => {\n const {\n tApp,\n t,\n resolveEntityHref,\n renderLink,\n renderDate,\n renderTag,\n renderBadgeRow,\n } = options;\n const resolvedTitle =\n header.titleValue?.(node, tApp) ?? resolveLabel(header.title, tApp);\n const rawNodeId =\n node != null &&\n typeof node === 'object' &&\n 'id' in node &&\n typeof node.id === 'string'\n ? node.id.trim()\n : null;\n const title =\n resolvedTitle.trim() === '' ||\n (rawNodeId != null && resolvedTitle.trim() === rawNodeId)\n ? resolveLabel(header.title, tApp)\n : resolvedTitle;\n\n let subtitleNode: ReactNode | undefined;\n if (header.subtitleItems != null && header.subtitleItems.length > 0) {\n const { subtitleItems } = header;\n const separator = header.subtitleSeparator ?? ' / ';\n const parts: ReactNode[] = [];\n subtitleItems.forEach((item, index) => {\n parts.push(\n createElement(\n 'span',\n { key: item.id },\n resolveInlineValue(item.value(node), {\n tApp,\n t,\n resolveEntityHref,\n renderLink,\n }),\n ),\n );\n if (index < subtitleItems.length - 1) {\n parts.push(createElement('span', { key: `${item.id}-sep` }, separator));\n }\n });\n subtitleNode = createElement('span', null, ...parts);\n } else {\n const subtitleValue =\n header.subtitleValue?.(node, tApp) ??\n (header.subtitle != null ? resolveLabel(header.subtitle, tApp) : null);\n subtitleNode =\n subtitleValue != null && subtitleValue.trim() !== ''\n ? subtitleValue\n : undefined;\n }\n\n const badgeNodes: ReactNode[] = [];\n header.badges?.forEach((badge, index) => {\n const label = resolveLabel(badge.label, tApp);\n const resolvedValue = resolveValueLabel(badge.value(node), tApp);\n const value = resolvedValue == null ? '' : String(resolvedValue);\n if (value.trim() === '') {\n return;\n }\n badgeNodes.push(\n renderTag(resolveBadgeTone(badge.tone, node), `${label}: ${value}`),\n );\n if (typeof badgeNodes[badgeNodes.length - 1] === 'object') {\n badgeNodes[badgeNodes.length - 1] = createElement(\n Fragment,\n { key: `${label}-${index}` },\n badgeNodes[badgeNodes.length - 1],\n );\n }\n });\n\n const status =\n header.status != null\n ? resolveHeaderStatus(header.status, node, tApp, {\n renderBadgeRow,\n renderTag,\n })\n : undefined;\n\n const items = header.meta?.map((meta, index) => {\n const label = resolveLabel(meta.label, tApp);\n return {\n id: `${label}-${index}`,\n label,\n value: resolveHeaderMeta(meta, node, {\n tApp,\n t,\n resolveEntityHref,\n renderDate,\n renderLink,\n }),\n };\n });\n\n return {\n title,\n subtitle: subtitleNode,\n badges:\n badgeNodes.length > 0\n ? createElement(Fragment, null, ...badgeNodes)\n : undefined,\n status,\n items,\n };\n};\n\nconst renderTimelinePayload = (payload: unknown): ReactNode | undefined => {\n if (payload == null) {\n return undefined;\n }\n if (\n typeof payload === 'string' ||\n typeof payload === 'number' ||\n typeof payload === 'boolean'\n ) {\n return String(payload);\n }\n\n try {\n return createElement('pre', null, JSON.stringify(payload, null, 2));\n } catch {\n const fallback =\n payload instanceof Error ? payload.message : '[unserializable payload]';\n return createElement('pre', null, fallback);\n }\n};\n\nconst resolveTechnicalAbbreviation = (\n refKind: 'id' | 'slug' | 'path' | 'url' | 'hash' | 'external' | 'text',\n): TechnicalIdentifierAbbreviation | null => {\n if (refKind === 'id' || refKind === 'hash' || refKind === 'external') {\n return 'middle';\n }\n return null;\n};\n\nconst renderReferenceValue = (args: {\n value: BackofficeValueLabel;\n href?: string | null;\n refKind: 'id' | 'slug' | 'path' | 'url' | 'hash' | 'external' | 'text';\n copyValue?: string | null;\n tApp: TFunction;\n t: TFunction;\n renderLink: (href: string, label: ReactNode) => ReactNode;\n}): ReactNode => {\n const { value, href, refKind, copyValue, tApp, t, renderLink } = args;\n const resolvedValue = resolveValueLabel(value, tApp);\n const technicalAbbreviation = resolveTechnicalAbbreviation(refKind);\n if (technicalAbbreviation != null) {\n const normalized = normalizeTechnicalIdentifier(resolvedValue);\n if (normalized == null) {\n return t('common.notAvailable');\n }\n return createElement(TechnicalIdentifierValue, {\n value: normalized,\n copyValue: copyValue ?? normalized,\n abbreviation: technicalAbbreviation,\n copyLabel: t('common.actions.copy'),\n });\n }\n if (href != null && href.trim() !== '' && !isEmptyText(resolvedValue)) {\n return renderLink(href, resolvedValue);\n }\n return resolvedValue ?? t('common.notAvailable');\n};\n\nexport const renderBlocks = <Node>(\n blocks: readonly BackofficeDetailBlockSpec<Node>[] | undefined,\n node: Node,\n options: {\n tApp: TFunction;\n t: TFunction;\n resolveEntityHref: (entityId: string, refId: string) => string | null;\n keyPrefix?: string;\n renderLink: (href: string, label: ReactNode) => ReactNode;\n renderDate: (\n value: string | number | Date | null | undefined,\n fallback: string,\n ) => ReactNode;\n renderTag: (tone: BackofficeTone, label: string) => ReactNode;\n renderMetricGroup: (args: {\n key: string;\n title: string;\n description?: string;\n density?: 'compact' | 'comfortable';\n items: readonly {\n id: string;\n label: string;\n value: ReactNode;\n hint?: ReactNode;\n tone?: BackofficeTone;\n copyValue?: string;\n }[];\n }) => ReactNode;\n renderTimeline: (args: {\n key: string;\n title: string;\n description?: string;\n events: readonly {\n id: string;\n label: string;\n timestamp?: ReactNode;\n description?: ReactNode;\n actor?: ReactNode;\n tone?: BackofficeTone;\n payload?: ReactNode;\n }[];\n }) => ReactNode;\n renderAuditTimeline: (args: {\n key: string;\n title: string;\n description?: string;\n events: readonly {\n id: string;\n title: ReactNode;\n time?: ReactNode;\n actor?: ReactNode;\n source?: ReactNode;\n }[];\n }) => ReactNode;\n renderRelations: (args: {\n key: string;\n title: string;\n description?: string;\n items: readonly {\n id: string;\n label: string;\n count?: ReactNode;\n href?: string;\n description?: ReactNode;\n tone?: BackofficeTone;\n }[];\n }) => ReactNode;\n renderContextStack: (args: {\n key: string;\n title: string;\n items: readonly {\n id: string;\n label: string;\n value: ReactNode | null | undefined;\n }[];\n }) => ReactNode;\n renderCustomSection: (\n key: string,\n title: string,\n child: ReactNode,\n ) => ReactNode;\n wrapCustomNode: (key: string, node: ReactNode) => ReactNode;\n resolveTableColumns: (\n columns: readonly BackofficeColumnSpec[],\n ) => readonly DataTableColumn<unknown>[];\n renderTable: (args: {\n key: string;\n title: string;\n description?: string;\n columns: readonly DataTableColumn<unknown>[];\n rows: readonly unknown[];\n }) => ReactNode;\n renderPayload: (args: {\n key: string;\n title: string;\n description?: string;\n content: unknown;\n format: BackofficePayloadFormat;\n }) => ReactNode;\n renderKeyValueListSection: (args: {\n key: string;\n title: string;\n description?: string;\n items: readonly { id: string; label: string; value: ReactNode }[];\n }) => ReactNode;\n },\n): ReactNode[] => {\n const { tApp, t, keyPrefix } = options;\n if (blocks == null || blocks.length === 0) {\n return [];\n }\n\n return blocks.map((block, index): ReactNode => {\n const key =\n keyPrefix != null\n ? `${keyPrefix}-${block.kind}-${index}`\n : `${block.kind}-${index}`;\n\n if (block.kind === 'custom') {\n const custom = block.render(node) as ReactNode;\n if (custom == null) {\n return null;\n }\n if (block.label != null) {\n return options.renderCustomSection(\n key,\n resolveLabel(block.label, tApp),\n custom,\n );\n }\n return options.wrapCustomNode(key, custom);\n }\n\n const title =\n 'title' in block\n ? resolveLabel(block.title, tApp)\n : resolveLabel(block.label, tApp);\n const description =\n block.description != null\n ? resolveLabel(block.description, tApp)\n : undefined;\n\n if (block.kind === 'summary') {\n return options.renderKeyValueListSection({\n key,\n title,\n description,\n items: block.items.map((item) => {\n const value = resolveValueLabel(item.value(node), tApp);\n const href = item.href?.(node);\n const tone = item.tone?.(node);\n let valueNode: ReactNode = value ?? t('common.notAvailable');\n if (href != null && href.trim() !== '' && !isEmptyText(value)) {\n valueNode = options.renderLink(href, value);\n } else if (tone != null && !isEmptyText(value)) {\n valueNode = options.renderTag(tone, String(value));\n }\n return {\n id: item.id,\n label: resolveLabel(item.label, tApp),\n value: valueNode,\n };\n }),\n });\n }\n\n if (block.kind === 'metrics') {\n return options.renderMetricGroup({\n key,\n title,\n description,\n density: block.density,\n items: block.items.map((item) => {\n const formattedValue = item.formattedValue?.(node);\n const value = resolveValueLabel(item.value(node), tApp);\n return {\n id: item.id,\n label: resolveLabel(item.label, tApp),\n value: formattedValue ?? value ?? t('common.notAvailable'),\n hint: resolveValueLabel(item.hint?.(node), tApp),\n tone: item.tone?.(node),\n copyValue: item.copyValue?.(node) ?? undefined,\n };\n }),\n });\n }\n\n if (block.kind === 'states') {\n return options.renderKeyValueListSection({\n key,\n title,\n description,\n items: block.states.map((state) => {\n const display = state.getDisplay(state.value(node), node);\n return {\n id: state.id,\n label: resolveLabel(state.label, tApp),\n value: options.renderTag(\n display.tone,\n String(\n resolveValueLabel(display.label, tApp) ??\n t('common.notAvailable'),\n ),\n ),\n };\n }),\n });\n }\n\n if (block.kind === 'context') {\n return options.renderContextStack({\n key,\n title,\n items: block.items.map((item) => {\n const value = resolveValueLabel(item.value(node), tApp);\n const href = item.href?.(node);\n return {\n id: item.id,\n label: resolveLabel(item.label, tApp),\n value:\n href != null && href.trim() !== '' && !isEmptyText(value)\n ? options.renderLink(href, value)\n : value,\n };\n }),\n });\n }\n\n if (block.kind === 'relationSummary') {\n return options.renderRelations({\n key,\n title,\n description,\n items: block.items.map((item) => {\n return {\n id: item.id,\n label: resolveLabel(item.label, tApp),\n count: item.count?.(node) ?? null,\n href: item.href?.(node) ?? undefined,\n description: resolveValueLabel(item.description?.(node), tApp),\n tone: item.tone?.(node),\n };\n }),\n });\n }\n\n if (block.kind === 'timeline') {\n return options.renderTimeline({\n key,\n title,\n description,\n events: block.events.map((event) => {\n const state = event.state?.(node);\n const stateLabel =\n state == null ? null : resolveValueLabel(state.label, tApp);\n const stateText = stateLabel == null ? null : String(stateLabel);\n return {\n id: event.id,\n label:\n stateText == null || stateText.trim() === ''\n ? resolveLabel(event.label, tApp)\n : `${resolveLabel(event.label, tApp)}: ${stateText}`,\n timestamp:\n event.timestamp == null\n ? undefined\n : options.renderDate(\n event.timestamp(node),\n t('common.notAvailable'),\n ),\n description: resolveValueLabel(event.description?.(node), tApp),\n actor: resolveValueLabel(event.actor?.(node), tApp),\n tone: state?.tone,\n payload: renderTimelinePayload(event.payload?.(node)),\n };\n }),\n });\n }\n\n if (block.kind === 'audit') {\n return options.renderAuditTimeline({\n key,\n title,\n description,\n events: block.items.map((item) => {\n const actor = resolveValueLabel(item.actor?.(node), tApp);\n const source = resolveValueLabel(item.source?.(node), tApp);\n return {\n id: item.id,\n title: resolveLabel(item.label, tApp),\n time: options.renderDate(\n item.timestamp?.(node),\n t('common.notAvailable'),\n ),\n actor: isEmptyText(actor) ? undefined : actor,\n source: isEmptyText(source) ? undefined : source,\n };\n }),\n });\n }\n\n if (block.kind === 'references') {\n return options.renderKeyValueListSection({\n key,\n title,\n description,\n items: block.references.map((reference) => {\n const href = reference.href?.(node);\n return {\n id: reference.id,\n label: resolveLabel(reference.label, tApp),\n value: renderReferenceValue({\n value: reference.value(node),\n href,\n refKind: reference.refKind ?? 'text',\n copyValue: reference.copyValue?.(node) ?? undefined,\n tApp,\n t,\n renderLink: options.renderLink,\n }),\n };\n }),\n });\n }\n\n if (block.kind === 'actionResult') {\n const items: { id: string; label: string; value: ReactNode }[] = [];\n const status = block.status?.(node);\n if (status != null) {\n items.push({\n id: `${block.id}-status`,\n label: t('detail.actionResult.status'),\n value: options.renderTag(\n status.tone,\n String(\n resolveValueLabel(status.label, tApp) ?? t('common.notAvailable'),\n ),\n ),\n });\n }\n const message = resolveValueLabel(block.message?.(node), tApp);\n if (!isEmptyText(message)) {\n items.push({\n id: `${block.id}-message`,\n label: t('detail.actionResult.message'),\n value: message,\n });\n }\n block.references?.forEach((reference) => {\n items.push({\n id: reference.id,\n label: resolveLabel(reference.label, tApp),\n value: renderReferenceValue({\n value: reference.value(node),\n href: reference.href?.(node),\n refKind: reference.refKind ?? 'text',\n copyValue: reference.copyValue?.(node) ?? undefined,\n tApp,\n t,\n renderLink: options.renderLink,\n }),\n });\n });\n return options.renderKeyValueListSection({\n key,\n title,\n description,\n items,\n });\n }\n\n if (block.kind === 'technicalFacts') {\n return options.renderKeyValueListSection({\n key,\n title,\n description,\n items: block.facts.map((fact) => {\n const value = resolveValueLabel(fact.value(node), tApp);\n const href = fact.href?.(node);\n const copyValue = fact.copyValue?.(node) ?? undefined;\n return {\n id: fact.id,\n label: resolveLabel(fact.label, tApp),\n value:\n copyValue != null && copyValue.trim() !== ''\n ? createElement(TechnicalIdentifierValue, {\n value: value ?? copyValue,\n copyValue,\n abbreviation: 'middle',\n copyLabel: t('common.actions.copy'),\n })\n : href != null && href.trim() !== '' && !isEmptyText(value)\n ? options.renderLink(href, value)\n : (value ?? t('common.notAvailable')),\n };\n }),\n });\n }\n\n if (block.kind === 'table') {\n return options.renderTable({\n key,\n title,\n description,\n columns: options.resolveTableColumns(block.columns),\n rows: block.rows(node) as readonly unknown[],\n });\n }\n\n return options.renderPayload({\n key,\n title,\n description,\n content: block.value(node),\n format: block.format ?? 'json',\n });\n });\n};\n"],"mappings":"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"}
@@ -8,87 +8,102 @@ import { useRelayEnvironment as o } from "../relay/useRelayEnvironment.js";
8
8
  import { useBackofficeListRefetch as s } from "../hooks/useBackofficeListRefetch.js";
9
9
  import { useBackofficeEntityListRouteContext as c } from "./BackofficeEntityListRouteContext.js";
10
10
  import { useCallback as l, useEffect as u, useMemo as d, useRef as f, useState as p } from "react";
11
- import { InlineBanner as m } from "@plumile/ui/components/feedback/InlineBanner.js";
12
- import { jsx as h } from "react/jsx-runtime";
13
- import { Button as g } from "@plumile/ui/atomic/atoms/button/Button.js";
14
- import { loadQuery as _, usePreloadedQuery as v } from "react-relay";
15
- import { BACKOFFICE_LIST_DEFAULTS as y, BACKOFFICE_LIST_REFETCH_POLICY as b } from "@plumile/backoffice-core/constants.js";
16
- import { stableListVariablesKey as x } from "@plumile/backoffice-core/state/stableKey.js";
11
+ import { InlineBanner as m } from "@plumile/ui";
12
+ import { Fragment as h, jsx as g } from "react/jsx-runtime";
13
+ import { Button as _ } from "@plumile/ui/button";
14
+ import { loadQuery as v, usePreloadedQuery as y } from "react-relay";
15
+ import { BACKOFFICE_LIST_DEFAULTS as b, BACKOFFICE_LIST_REFETCH_POLICY as x } from "@plumile/backoffice-core/constants.js";
16
+ import { stableListVariablesKey as S } from "@plumile/backoffice-core/state/stableKey.js";
17
17
  //#region src/pages/BackofficeEntityListDataPage.tsx
18
- function S({ queryRef: t }) {
19
- let { config: o, state: p, pushState: m, headerActions: g, columns: _, gridTemplateColumns: S, getRowId: C, countFetchKey: w, bumpCountFetchKey: T, registerRefresh: E } = c(), D = o.list, { t: O } = e(), k = v(D.query, t), { data: A, loadNext: j, hasNext: M, isLoadingNext: N, refetch: P } = r(D.fragment, k), F = D.getConnection(A), I = d(() => F.edges.map((e) => D.toRow(e.node)), [F.edges, D]), { listDefaults: L } = o, R = p.sort ?? L.sort, { pageSize: z } = y, B = d(() => ({
20
- where: p.where,
21
- sort: R,
22
- count: z,
18
+ var C = ({ children: e, onResolve: t, value: n }) => (u(() => {
19
+ t(n);
20
+ }, [t, n]), /* @__PURE__ */ g(h, { children: e }));
21
+ function w({ queryRef: t }) {
22
+ let { config: o, state: m, pushState: h, headerActions: _, columns: v, gridTemplateColumns: w, getRowId: T, countFetchKey: E, bumpCountFetchKey: D, registerRefresh: O } = c(), k = o.list, { t: A } = e(), j = y(k.query, t), { data: M, loadNext: N, hasNext: P, isLoadingNext: F, refetch: I } = r(k.fragment, j), L = k.getConnection(M), R = d(() => L.edges.map((e) => k.toRow(e.node)), [L.edges, k]), { listDefaults: z } = o, B = m.sort ?? z.sort, { pageSize: V } = b, H = d(() => ({
23
+ where: m.where,
24
+ sort: B,
25
+ count: V,
23
26
  cursor: null
24
27
  }), [
25
- z,
26
- R,
27
- p.where
28
- ]), V = d(() => x(B), [B]), H = f(V), { isRefreshing: U, onRefresh: W } = s({
29
- refetch: P,
30
- variables: B,
28
+ V,
29
+ B,
30
+ m.where
31
+ ]), U = d(() => S(H), [H]), W = f(U), [G, K] = p(null), q = null;
32
+ G?.variablesKey === U && G.fetchKey === E && (q = G.value);
33
+ let J = l((e) => {
34
+ K({
35
+ fetchKey: E,
36
+ variablesKey: U,
37
+ value: e
38
+ });
39
+ }, [E, U]), { isRefreshing: Y, onRefresh: X } = s({
40
+ refetch: I,
41
+ variables: H,
31
42
  defaults: {
32
- where: L.where,
33
- sort: L.sort,
34
- count: z,
43
+ where: z.where,
44
+ sort: z.sort,
45
+ count: V,
35
46
  cursor: null
36
47
  },
37
- fetchPolicy: b,
38
- buildQueryVariables: D.buildQueryVariables
48
+ fetchPolicy: x,
49
+ buildQueryVariables: k.buildQueryVariables
39
50
  });
40
51
  u(() => {
41
- H.current !== V && (H.current = V, T());
42
- }, [T, V]);
43
- let G = l(() => {
44
- T(), W();
45
- }, [T, W]);
46
- u(() => (E(G), () => {
47
- E(null);
48
- }), [G, E]);
49
- let K = l((e) => {
50
- j(z, { onComplete: e });
51
- }, [j, z]), q = n({
52
- nodes: I,
53
- hasNext: M,
54
- isLoadingNext: N,
55
- runLoadMore: K,
52
+ W.current !== U && (W.current = U, D());
53
+ }, [D, U]);
54
+ let Z = l(() => {
55
+ D(), X();
56
+ }, [D, X]);
57
+ u(() => (O(Z), () => {
58
+ O(null);
59
+ }), [Z, O]);
60
+ let ee = l((e) => {
61
+ N(V, { onComplete: e });
62
+ }, [N, V]), Q = n({
63
+ nodes: R,
64
+ hasNext: P,
65
+ isLoadingNext: F,
66
+ runLoadMore: ee,
56
67
  surface: `backoffice.entity-list.${o.id}`,
57
- resetKey: V
58
- }), J = /* @__PURE__ */ h("span", { children: O("common.loading") });
59
- I.length > 0 && (J = /* @__PURE__ */ h("span", { children: O("list.loaded", { count: I.length }) }));
60
- let Y = /* @__PURE__ */ h(i, {
61
- count: D.count,
62
- where: p.where,
63
- fetchKey: w,
64
- loadingFallback: J,
65
- children: (e) => /* @__PURE__ */ h("span", { children: O("list.showing", {
66
- shown: I.length,
67
- total: e
68
- }) })
68
+ resetKey: U
69
+ }), $ = /* @__PURE__ */ g("span", { children: A("common.loading") });
70
+ R.length > 0 && ($ = /* @__PURE__ */ g("span", { children: A("list.loaded", { count: R.length }) }));
71
+ let te = /* @__PURE__ */ g(i, {
72
+ count: k.count,
73
+ where: m.where,
74
+ fetchKey: E,
75
+ loadingFallback: $,
76
+ children: (e) => /* @__PURE__ */ g(C, {
77
+ onResolve: J,
78
+ value: e,
79
+ children: /* @__PURE__ */ g("span", { children: A("list.showing", {
80
+ shown: R.length,
81
+ total: e
82
+ }) })
83
+ })
69
84
  });
70
- return /* @__PURE__ */ h(a, {
85
+ return /* @__PURE__ */ g(a, {
71
86
  config: o,
72
- state: p,
73
- pushState: m,
74
- headerActions: g,
75
- rows: q.nodes,
76
- columns: _,
77
- gridTemplateColumns: S,
78
- getRowId: C,
79
- hasNextPage: q.hasNext,
80
- isLoadingMore: q.isLoadingNext,
81
- incrementalError: q.incrementalError,
82
- isRefreshing: U,
83
- onLoadMore: q.loadMoreSafe,
84
- onRetryLoadMore: q.retryLoadMore,
85
- onRefresh: G,
86
- totalCount: null,
87
- loadedCountLabel: Y
87
+ state: m,
88
+ pushState: h,
89
+ headerActions: _,
90
+ rows: Q.nodes,
91
+ columns: v,
92
+ gridTemplateColumns: w,
93
+ getRowId: T,
94
+ hasNextPage: Q.hasNext,
95
+ isLoadingMore: Q.isLoadingNext,
96
+ incrementalError: Q.incrementalError,
97
+ isRefreshing: Y,
98
+ onLoadMore: Q.loadMoreSafe,
99
+ onRetryLoadMore: Q.retryLoadMore,
100
+ onRefresh: Z,
101
+ totalCount: q,
102
+ loadedCountLabel: te
88
103
  });
89
104
  }
90
- var C = ({ prepared: n }) => {
91
- let { config: r, state: i, pushState: s, headerActions: d, columns: v, gridTemplateColumns: b, getRowId: x } = c(), C = o(), { t: w } = e(), [T, E] = p(() => n.query), D = f(null), O = l(() => {
105
+ var T = ({ prepared: n }) => {
106
+ let { config: r, state: i, pushState: s, headerActions: d, columns: h, gridTemplateColumns: y, getRowId: x } = c(), S = o(), { t: C } = e(), [T, E] = p(() => n.query), D = f(null), O = l(() => {
92
107
  D.current?.dispose(), D.current = null;
93
108
  }, []);
94
109
  u(() => {
@@ -97,29 +112,29 @@ var C = ({ prepared: n }) => {
97
112
  O();
98
113
  }, [O]);
99
114
  let k = l(() => {
100
- let e = r.list, { listDefaults: t } = r, { pageSize: n } = y, a = {
115
+ let e = r.list, { listDefaults: t } = r, { pageSize: n } = b, a = {
101
116
  where: i.where,
102
117
  sort: i.sort ?? t.sort,
103
118
  count: n,
104
119
  cursor: null
105
- }, o = e.buildQueryVariables(a), s = _(C, e.query, o, { fetchPolicy: "network-only" });
120
+ }, o = e.buildQueryVariables(a), s = v(S, e.query, o, { fetchPolicy: "network-only" });
106
121
  O(), D.current = s, E(s);
107
122
  }, [
108
123
  r,
109
124
  O,
110
- C,
125
+ S,
111
126
  i.sort,
112
127
  i.where
113
128
  ]);
114
- return /* @__PURE__ */ h(t, {
115
- fallback: ({ reset: e }) => /* @__PURE__ */ h(a, {
129
+ return /* @__PURE__ */ g(t, {
130
+ fallback: ({ reset: e }) => /* @__PURE__ */ g(a, {
116
131
  config: r,
117
132
  state: i,
118
133
  pushState: s,
119
134
  headerActions: d,
120
135
  rows: [],
121
- columns: v,
122
- gridTemplateColumns: b,
136
+ columns: h,
137
+ gridTemplateColumns: y,
123
138
  getRowId: x,
124
139
  hasNextPage: !1,
125
140
  isLoadingMore: !1,
@@ -131,25 +146,28 @@ var C = ({ prepared: n }) => {
131
146
  e(), k();
132
147
  },
133
148
  totalCount: null,
134
- emptyState: /* @__PURE__ */ h(m, {
149
+ emptyState: /* @__PURE__ */ g(m, {
150
+ "aria-live": "assertive",
151
+ role: "alert",
135
152
  tone: "danger",
136
- title: w("list.errors.title"),
137
- actions: /* @__PURE__ */ h(g, {
153
+ title: C("list.errors.title"),
154
+ actions: /* @__PURE__ */ g(_, {
138
155
  type: "button",
139
- variant: "secondary",
156
+ variant: "soft",
140
157
  size: "small",
141
158
  onClick: () => {
142
159
  e(), k();
143
160
  },
144
- children: w("list.actions.retry")
161
+ tone: "neutral",
162
+ children: C("list.actions.retry")
145
163
  }),
146
- children: w("list.errors.tableFailed")
164
+ children: C("list.errors.tableFailed")
147
165
  })
148
166
  }),
149
- children: /* @__PURE__ */ h(S, { queryRef: T })
167
+ children: /* @__PURE__ */ g(w, { queryRef: T })
150
168
  });
151
169
  };
152
170
  //#endregion
153
- export { C as BackofficeEntityListDataPage, C as default };
171
+ export { T as BackofficeEntityListDataPage, T as default };
154
172
 
155
173
  //# sourceMappingURL=BackofficeEntityListDataPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeEntityListDataPage.js","names":[],"sources":["../../../src/pages/BackofficeEntityListDataPage.tsx"],"sourcesContent":["import {\n type JSX,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { loadQuery, usePreloadedQuery } from 'react-relay';\nimport type { OperationType } from 'relay-runtime';\nimport {\n BACKOFFICE_LIST_DEFAULTS,\n BACKOFFICE_LIST_REFETCH_POLICY,\n} from '@plumile/backoffice-core/constants.js';\nimport { stableListVariablesKey } from '@plumile/backoffice-core/state/stableKey.js';\nimport type { BackofficePreparedListDataRoute } from '@plumile/backoffice-core/types.js';\nimport { Button } from '@plumile/ui/atomic/atoms/button/Button.js';\nimport { InlineBanner } from '@plumile/ui/components/feedback/InlineBanner.js';\n\nimport { BackofficeErrorBoundary } from '../components/backoffice/errors/BackofficeErrorBoundary.js';\nimport { BackofficeEntityListScaffold } from '../components/backoffice/scaffolds/BackofficeEntityListScaffold.js';\nimport { BackofficeLazyEntityCountLabel } from '../components/backoffice/refs/BackofficeLazyEntityCount.js';\nimport { useInfiniteConnection } from '../hooks/useInfiniteConnection.js';\nimport { useBackofficeListRefetch } from '../hooks/useBackofficeListRefetch.js';\nimport { useBackofficeReactTranslation } from '../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeRuntimePaginationFragment } from '../relay/typedRelayHooks.js';\nimport { useRelayEnvironment } from '../relay/useRelayEnvironment.js';\nimport { useBackofficeEntityListRouteContext } from './BackofficeEntityListRouteContext.js';\n\nexport type BackofficeEntityListDataPageProps = {\n prepared: BackofficePreparedListDataRoute;\n};\n\ntype BackofficeEntityConnectionListDataProps = {\n queryRef: BackofficePreparedListDataRoute['query'];\n};\n\n/**\n * Renders the Relay-backed row data under the list layout route boundary.\n */\nfunction BackofficeEntityConnectionListData({\n queryRef,\n}: BackofficeEntityConnectionListDataProps): JSX.Element | null {\n const {\n config,\n state,\n pushState,\n headerActions,\n columns,\n gridTemplateColumns,\n getRowId,\n countFetchKey,\n bumpCountFetchKey,\n registerRefresh,\n } = useBackofficeEntityListRouteContext();\n const listConfig = config.list;\n const { t } = useBackofficeReactTranslation();\n\n const queryData = usePreloadedQuery(listConfig.query, queryRef);\n const {\n data: fragmentData,\n loadNext,\n hasNext,\n isLoadingNext,\n refetch,\n } = useBackofficeRuntimePaginationFragment<OperationType>(\n listConfig.fragment,\n queryData,\n );\n\n const connection = listConfig.getConnection(fragmentData);\n\n const rows = useMemo(() => {\n return connection.edges.map((edge) => {\n return listConfig.toRow(edge.node);\n });\n }, [connection.edges, listConfig]);\n\n const { listDefaults } = config;\n const resolvedSort = state.sort ?? listDefaults.sort;\n const { pageSize } = BACKOFFICE_LIST_DEFAULTS;\n\n const baseVariables = useMemo(() => {\n return {\n where: state.where,\n sort: resolvedSort,\n count: pageSize,\n cursor: null,\n };\n }, [pageSize, resolvedSort, state.where]);\n const countVariablesKey = useMemo(() => {\n return stableListVariablesKey(baseVariables);\n }, [baseVariables]);\n const previousCountVariablesKeyRef = useRef(countVariablesKey);\n\n const { isRefreshing, onRefresh } = useBackofficeListRefetch({\n refetch,\n variables: baseVariables,\n defaults: {\n where: listDefaults.where,\n sort: listDefaults.sort,\n count: pageSize,\n cursor: null,\n },\n fetchPolicy: BACKOFFICE_LIST_REFETCH_POLICY,\n buildQueryVariables: listConfig.buildQueryVariables,\n });\n\n useEffect(() => {\n if (previousCountVariablesKeyRef.current === countVariablesKey) {\n return;\n }\n previousCountVariablesKeyRef.current = countVariablesKey;\n bumpCountFetchKey();\n }, [bumpCountFetchKey, countVariablesKey]);\n\n const handleRefresh = useCallback(() => {\n bumpCountFetchKey();\n onRefresh();\n }, [bumpCountFetchKey, onRefresh]);\n\n useEffect(() => {\n registerRefresh(handleRefresh);\n return () => {\n registerRefresh(null);\n };\n }, [handleRefresh, registerRefresh]);\n\n const runLoadMore = useCallback(\n (onComplete: (error: Error | null) => void) => {\n loadNext(pageSize, { onComplete });\n },\n [loadNext, pageSize],\n );\n const pagination = useInfiniteConnection({\n nodes: rows,\n hasNext,\n isLoadingNext,\n runLoadMore,\n surface: `backoffice.entity-list.${config.id}`,\n resetKey: countVariablesKey,\n });\n\n let loadedCountFallback: JSX.Element = <span>{t('common.loading')}</span>;\n if (rows.length > 0) {\n loadedCountFallback = (\n <span>\n {t('list.loaded', {\n count: rows.length,\n })}\n </span>\n );\n }\n const loadedCountLabel = (\n <BackofficeLazyEntityCountLabel\n count={listConfig.count}\n where={state.where}\n fetchKey={countFetchKey}\n loadingFallback={loadedCountFallback}\n >\n {(totalCount) => {\n return (\n <span>\n {t('list.showing', {\n shown: rows.length,\n total: totalCount,\n })}\n </span>\n );\n }}\n </BackofficeLazyEntityCountLabel>\n );\n\n return (\n <BackofficeEntityListScaffold\n config={config}\n state={state}\n pushState={pushState}\n headerActions={headerActions}\n rows={pagination.nodes}\n columns={columns}\n gridTemplateColumns={gridTemplateColumns}\n getRowId={getRowId}\n hasNextPage={pagination.hasNext}\n isLoadingMore={pagination.isLoadingNext}\n incrementalError={pagination.incrementalError}\n isRefreshing={isRefreshing}\n onLoadMore={pagination.loadMoreSafe}\n onRetryLoadMore={pagination.retryLoadMore}\n onRefresh={handleRefresh}\n totalCount={null}\n loadedCountLabel={loadedCountLabel}\n />\n );\n}\n\nexport const BackofficeEntityListDataPage = ({\n prepared,\n}: BackofficeEntityListDataPageProps): JSX.Element | null => {\n const {\n config,\n state,\n pushState,\n headerActions,\n columns,\n gridTemplateColumns,\n getRowId,\n } = useBackofficeEntityListRouteContext();\n const relayEnvironment = useRelayEnvironment();\n const { t } = useBackofficeReactTranslation();\n const [queryRef, setQueryRef] = useState(() => {\n return prepared.query;\n });\n const ownedQueryRef = useRef<BackofficePreparedListDataRoute['query'] | null>(\n null,\n );\n\n const disposeOwnedQueryRef = useCallback(() => {\n ownedQueryRef.current?.dispose();\n ownedQueryRef.current = null;\n }, []);\n\n useEffect(() => {\n disposeOwnedQueryRef();\n setQueryRef(prepared.query);\n }, [disposeOwnedQueryRef, prepared.query]);\n\n useEffect(() => {\n return () => {\n disposeOwnedQueryRef();\n };\n }, [disposeOwnedQueryRef]);\n\n const reloadInitialQuery = useCallback(() => {\n const listConfig = config.list;\n const { listDefaults } = config;\n const { pageSize } = BACKOFFICE_LIST_DEFAULTS;\n const variablesBase = {\n where: state.where,\n sort: state.sort ?? listDefaults.sort,\n count: pageSize,\n cursor: null,\n };\n const variables = listConfig.buildQueryVariables(variablesBase);\n const nextQueryRef = loadQuery<OperationType>(\n relayEnvironment,\n listConfig.query,\n variables,\n {\n fetchPolicy: 'network-only',\n },\n );\n disposeOwnedQueryRef();\n ownedQueryRef.current = nextQueryRef;\n setQueryRef(nextQueryRef);\n }, [config, disposeOwnedQueryRef, relayEnvironment, state.sort, state.where]);\n\n return (\n <BackofficeErrorBoundary\n fallback={({ reset }) => {\n return (\n <BackofficeEntityListScaffold\n config={config}\n state={state}\n pushState={pushState}\n headerActions={headerActions}\n rows={[]}\n columns={columns}\n gridTemplateColumns={gridTemplateColumns}\n getRowId={getRowId}\n hasNextPage={false}\n isLoadingMore={false}\n incrementalError={null}\n isRefreshing={false}\n onLoadMore={() => {}}\n onRetryLoadMore={() => {}}\n onRefresh={() => {\n reset();\n reloadInitialQuery();\n }}\n totalCount={null}\n emptyState={\n <InlineBanner\n tone=\"danger\"\n title={t('list.errors.title')}\n actions={\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n onClick={() => {\n reset();\n reloadInitialQuery();\n }}\n >\n {t('list.actions.retry')}\n </Button>\n }\n >\n {t('list.errors.tableFailed')}\n </InlineBanner>\n }\n />\n );\n }}\n >\n <BackofficeEntityConnectionListData queryRef={queryRef} />\n </BackofficeErrorBoundary>\n );\n};\n\nexport default BackofficeEntityListDataPage;\n"],"mappings":"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"}
1
+ {"version":3,"file":"BackofficeEntityListDataPage.js","names":[],"sources":["../../../src/pages/BackofficeEntityListDataPage.tsx"],"sourcesContent":["import {\n type JSX,\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { loadQuery, usePreloadedQuery } from 'react-relay';\nimport type { OperationType } from 'relay-runtime';\nimport {\n BACKOFFICE_LIST_DEFAULTS,\n BACKOFFICE_LIST_REFETCH_POLICY,\n} from '@plumile/backoffice-core/constants.js';\nimport { stableListVariablesKey } from '@plumile/backoffice-core/state/stableKey.js';\nimport type { BackofficePreparedListDataRoute } from '@plumile/backoffice-core/types.js';\nimport { Button } from '@plumile/ui/button';\nimport { InlineBanner } from '@plumile/ui';\n\nimport { BackofficeErrorBoundary } from '../components/backoffice/errors/BackofficeErrorBoundary.js';\nimport { BackofficeEntityListScaffold } from '../components/backoffice/scaffolds/BackofficeEntityListScaffold.js';\nimport { BackofficeLazyEntityCountLabel } from '../components/backoffice/refs/BackofficeLazyEntityCount.js';\nimport { useInfiniteConnection } from '../hooks/useInfiniteConnection.js';\nimport { useBackofficeListRefetch } from '../hooks/useBackofficeListRefetch.js';\nimport { useBackofficeReactTranslation } from '../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeRuntimePaginationFragment } from '../relay/typedRelayHooks.js';\nimport { useRelayEnvironment } from '../relay/useRelayEnvironment.js';\nimport { useBackofficeEntityListRouteContext } from './BackofficeEntityListRouteContext.js';\n\nexport type BackofficeEntityListDataPageProps = {\n prepared: BackofficePreparedListDataRoute;\n};\n\ntype BackofficeEntityConnectionListDataProps = {\n queryRef: BackofficePreparedListDataRoute['query'];\n};\n\ntype ResolvedEntityCountProps = {\n children: ReactNode;\n onResolve: (value: number) => void;\n value: number;\n};\n\nconst ResolvedEntityCount = ({\n children,\n onResolve,\n value,\n}: ResolvedEntityCountProps): JSX.Element => {\n useEffect(() => {\n onResolve(value);\n }, [onResolve, value]);\n\n return <>{children}</>;\n};\n\n/**\n * Renders the Relay-backed row data under the list layout route boundary.\n */\nfunction BackofficeEntityConnectionListData({\n queryRef,\n}: BackofficeEntityConnectionListDataProps): JSX.Element | null {\n const {\n config,\n state,\n pushState,\n headerActions,\n columns,\n gridTemplateColumns,\n getRowId,\n countFetchKey,\n bumpCountFetchKey,\n registerRefresh,\n } = useBackofficeEntityListRouteContext();\n const listConfig = config.list;\n const { t } = useBackofficeReactTranslation();\n\n const queryData = usePreloadedQuery(listConfig.query, queryRef);\n const {\n data: fragmentData,\n loadNext,\n hasNext,\n isLoadingNext,\n refetch,\n } = useBackofficeRuntimePaginationFragment<OperationType>(\n listConfig.fragment,\n queryData,\n );\n\n const connection = listConfig.getConnection(fragmentData);\n\n const rows = useMemo(() => {\n return connection.edges.map((edge) => {\n return listConfig.toRow(edge.node);\n });\n }, [connection.edges, listConfig]);\n\n const { listDefaults } = config;\n const resolvedSort = state.sort ?? listDefaults.sort;\n const { pageSize } = BACKOFFICE_LIST_DEFAULTS;\n\n const baseVariables = useMemo(() => {\n return {\n where: state.where,\n sort: resolvedSort,\n count: pageSize,\n cursor: null,\n };\n }, [pageSize, resolvedSort, state.where]);\n const countVariablesKey = useMemo(() => {\n return stableListVariablesKey(baseVariables);\n }, [baseVariables]);\n const previousCountVariablesKeyRef = useRef(countVariablesKey);\n const [resolvedCount, setResolvedCount] = useState<{\n fetchKey: number;\n variablesKey: string;\n value: number;\n } | null>(null);\n let totalCount: number | null = null;\n if (\n resolvedCount?.variablesKey === countVariablesKey &&\n resolvedCount.fetchKey === countFetchKey\n ) {\n totalCount = resolvedCount.value;\n }\n const handleCountResolved = useCallback(\n (value: number): void => {\n setResolvedCount({\n fetchKey: countFetchKey,\n variablesKey: countVariablesKey,\n value,\n });\n },\n [countFetchKey, countVariablesKey],\n );\n\n const { isRefreshing, onRefresh } = useBackofficeListRefetch({\n refetch,\n variables: baseVariables,\n defaults: {\n where: listDefaults.where,\n sort: listDefaults.sort,\n count: pageSize,\n cursor: null,\n },\n fetchPolicy: BACKOFFICE_LIST_REFETCH_POLICY,\n buildQueryVariables: listConfig.buildQueryVariables,\n });\n\n useEffect(() => {\n if (previousCountVariablesKeyRef.current === countVariablesKey) {\n return;\n }\n previousCountVariablesKeyRef.current = countVariablesKey;\n bumpCountFetchKey();\n }, [bumpCountFetchKey, countVariablesKey]);\n\n const handleRefresh = useCallback(() => {\n bumpCountFetchKey();\n onRefresh();\n }, [bumpCountFetchKey, onRefresh]);\n\n useEffect(() => {\n registerRefresh(handleRefresh);\n return () => {\n registerRefresh(null);\n };\n }, [handleRefresh, registerRefresh]);\n\n const runLoadMore = useCallback(\n (onComplete: (error: Error | null) => void) => {\n loadNext(pageSize, { onComplete });\n },\n [loadNext, pageSize],\n );\n const pagination = useInfiniteConnection({\n nodes: rows,\n hasNext,\n isLoadingNext,\n runLoadMore,\n surface: `backoffice.entity-list.${config.id}`,\n resetKey: countVariablesKey,\n });\n\n let loadedCountFallback: JSX.Element = <span>{t('common.loading')}</span>;\n if (rows.length > 0) {\n loadedCountFallback = (\n <span>\n {t('list.loaded', {\n count: rows.length,\n })}\n </span>\n );\n }\n const loadedCountLabel = (\n <BackofficeLazyEntityCountLabel\n count={listConfig.count}\n where={state.where}\n fetchKey={countFetchKey}\n loadingFallback={loadedCountFallback}\n >\n {(totalCount) => {\n return (\n <ResolvedEntityCount\n onResolve={handleCountResolved}\n value={totalCount}\n >\n <span>\n {t('list.showing', {\n shown: rows.length,\n total: totalCount,\n })}\n </span>\n </ResolvedEntityCount>\n );\n }}\n </BackofficeLazyEntityCountLabel>\n );\n\n return (\n <BackofficeEntityListScaffold\n config={config}\n state={state}\n pushState={pushState}\n headerActions={headerActions}\n rows={pagination.nodes}\n columns={columns}\n gridTemplateColumns={gridTemplateColumns}\n getRowId={getRowId}\n hasNextPage={pagination.hasNext}\n isLoadingMore={pagination.isLoadingNext}\n incrementalError={pagination.incrementalError}\n isRefreshing={isRefreshing}\n onLoadMore={pagination.loadMoreSafe}\n onRetryLoadMore={pagination.retryLoadMore}\n onRefresh={handleRefresh}\n totalCount={totalCount}\n loadedCountLabel={loadedCountLabel}\n />\n );\n}\n\nexport const BackofficeEntityListDataPage = ({\n prepared,\n}: BackofficeEntityListDataPageProps): JSX.Element | null => {\n const {\n config,\n state,\n pushState,\n headerActions,\n columns,\n gridTemplateColumns,\n getRowId,\n } = useBackofficeEntityListRouteContext();\n const relayEnvironment = useRelayEnvironment();\n const { t } = useBackofficeReactTranslation();\n const [queryRef, setQueryRef] = useState(() => {\n return prepared.query;\n });\n const ownedQueryRef = useRef<BackofficePreparedListDataRoute['query'] | null>(\n null,\n );\n\n const disposeOwnedQueryRef = useCallback(() => {\n ownedQueryRef.current?.dispose();\n ownedQueryRef.current = null;\n }, []);\n\n useEffect(() => {\n disposeOwnedQueryRef();\n setQueryRef(prepared.query);\n }, [disposeOwnedQueryRef, prepared.query]);\n\n useEffect(() => {\n return () => {\n disposeOwnedQueryRef();\n };\n }, [disposeOwnedQueryRef]);\n\n const reloadInitialQuery = useCallback(() => {\n const listConfig = config.list;\n const { listDefaults } = config;\n const { pageSize } = BACKOFFICE_LIST_DEFAULTS;\n const variablesBase = {\n where: state.where,\n sort: state.sort ?? listDefaults.sort,\n count: pageSize,\n cursor: null,\n };\n const variables = listConfig.buildQueryVariables(variablesBase);\n const nextQueryRef = loadQuery<OperationType>(\n relayEnvironment,\n listConfig.query,\n variables,\n {\n fetchPolicy: 'network-only',\n },\n );\n disposeOwnedQueryRef();\n ownedQueryRef.current = nextQueryRef;\n setQueryRef(nextQueryRef);\n }, [config, disposeOwnedQueryRef, relayEnvironment, state.sort, state.where]);\n\n return (\n <BackofficeErrorBoundary\n fallback={({ reset }) => {\n return (\n <BackofficeEntityListScaffold\n config={config}\n state={state}\n pushState={pushState}\n headerActions={headerActions}\n rows={[]}\n columns={columns}\n gridTemplateColumns={gridTemplateColumns}\n getRowId={getRowId}\n hasNextPage={false}\n isLoadingMore={false}\n incrementalError={null}\n isRefreshing={false}\n onLoadMore={() => {}}\n onRetryLoadMore={() => {}}\n onRefresh={() => {\n reset();\n reloadInitialQuery();\n }}\n totalCount={null}\n emptyState={\n <InlineBanner\n aria-live=\"assertive\"\n role=\"alert\"\n tone=\"danger\"\n title={t('list.errors.title')}\n actions={\n <Button\n type=\"button\"\n variant=\"soft\"\n size=\"small\"\n onClick={() => {\n reset();\n reloadInitialQuery();\n }}\n tone=\"neutral\"\n >\n {t('list.actions.retry')}\n </Button>\n }\n >\n {t('list.errors.tableFailed')}\n </InlineBanner>\n }\n />\n );\n }}\n >\n <BackofficeEntityConnectionListData queryRef={queryRef} />\n </BackofficeErrorBoundary>\n );\n};\n\nexport default BackofficeEntityListDataPage;\n"],"mappings":"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"}
@@ -7,7 +7,13 @@ var e = {
7
7
  l: "minmax(9rem, 18rem)",
8
8
  xl: "minmax(11rem, 24rem)",
9
9
  fluid: "minmax(0, 1fr)"
10
- }, t = (e) => e <= 0 ? 0 : 8 + 24 * e + 6 * Math.max(0, e - 1), n = (e) => e <= 0 ? 0 : 28 + 32 * e + 8 * Math.max(0, e - 1), r = (t, n) => t.mobileRole === "action" ? "60px" : t.isPrimary === !0 ? "minmax(0, 1.4fr)" : "size" in t && typeof t.size == "string" ? e[t.size] : n, i = (e) => e.kind === "route", a = (e) => e.kind === "formMutation", o = (e, t) => e ?? (t === 0 ? "primary" : "secondary"), s = (e) => {
10
+ }, t = (e) => e <= 0 ? 0 : 8 + 24 * e + 6 * Math.max(0, e - 1), n = (e) => e <= 0 ? 0 : 28 + 32 * e + 8 * Math.max(0, e - 1), r = (t, n) => t.mobileRole === "action" ? "60px" : t.isPrimary === !0 ? "minmax(0, 1.4fr)" : "size" in t && typeof t.size == "string" ? e[t.size] : n, i = (e) => e.kind === "route", a = (e) => e.kind === "formMutation", o = (e, t, n) => {
11
+ let r = n === 0, i = e, a = t;
12
+ return i ?? (i = "soft", r && (i = "solid")), a ?? (a = "neutral", r && (a = "brand")), {
13
+ variant: i,
14
+ tone: a
15
+ };
16
+ }, s = (e) => {
11
17
  if (typeof e != "object" || !e || !("id" in e)) return null;
12
18
  let t = e.id;
13
19
  if (typeof t != "string") return null;
@@ -17,8 +23,8 @@ var e = {
17
23
  let { ariaLabel: t, fallback: n, resolveDetailHref: r, className: i, renderAction: a } = e;
18
24
  return {
19
25
  id: "actions",
20
- header: "",
21
- className: i,
26
+ header: t,
27
+ ...i == null ? {} : { classes: { cell: i } },
22
28
  mobileRole: "action",
23
29
  cell: (e) => {
24
30
  let i = s(e);
@@ -32,6 +38,6 @@ var e = {
32
38
  };
33
39
  };
34
40
  //#endregion
35
- export { l as buildActionsColumn, n as computeActionsColumnWidthPx, t as computeRowFlagsColumnWidthPx, a as isFormMutationAction, i as isRouteAction, o as resolveActionVariant, c as resolveLabel, s as resolveRowId, r as resolveTrackBySize };
41
+ export { l as buildActionsColumn, n as computeActionsColumnWidthPx, t as computeRowFlagsColumnWidthPx, a as isFormMutationAction, i as isRouteAction, o as resolveActionPresentation, c as resolveLabel, s as resolveRowId, r as resolveTrackBySize };
36
42
 
37
43
  //# sourceMappingURL=BackofficeEntityListPage.helpers.js.map