@plumile/backoffice-react 0.2.3 → 0.2.5

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":"BackofficeEntityListScaffold.js","names":[],"sources":["../../../../../src/components/backoffice/scaffolds/BackofficeEntityListScaffold.tsx"],"sourcesContent":["/* eslint-disable no-ternary */\nimport {\n type JSX,\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport type { TFunction } from 'i18next';\nimport { useTranslation } from 'react-i18next';\nimport { Button } from '@plumile/ui/atomic/atoms/button/Button.js';\nimport { BackofficeEmptyState } from '@plumile/ui/backoffice/molecules/backoffice_empty_state/BackofficeEmptyState.js';\nimport { BackofficeFilterField } from '@plumile/ui/backoffice/molecules/backoffice_filter_field/BackofficeFilterField.js';\nimport { Spinner } from '@plumile/ui/backoffice/atoms/spinner/Spinner.js';\nimport { Tag } from '@plumile/ui/backoffice/atoms/tag/Tag.js';\nimport { BackofficeListFooter } from '@plumile/ui/backoffice/molecules/backoffice_list_footer/BackofficeListFooter.js';\nimport { BackofficePageHeader } from '@plumile/ui/backoffice/molecules/backoffice_page_header/BackofficePageHeader.js';\nimport { BackofficeTableSkeleton } from '@plumile/ui/backoffice/molecules/backoffice_table_skeleton/BackofficeTableSkeleton.js';\nimport type { FilterChip } from '@plumile/ui/backoffice/molecules/filter_chip_row/FilterChipRow.js';\nimport { BackofficeListFilterToolbar } from '@plumile/ui/backoffice/organisms/backoffice_list_filter_toolbar/BackofficeListFilterToolbar.js';\nimport { InlineBanner } from '@plumile/ui/components/feedback/InlineBanner.js';\nimport { ListPageTemplate } from '@plumile/ui/backoffice/templates/list_page_template/ListPageTemplate.js';\nimport {\n type DataTableColumn,\n type GetRowId,\n} from '@plumile/ui/components/data-table/DataTable.js';\nimport { ResponsiveRecordList } from '@plumile/ui/components/data-table/ResponsiveRecordList.js';\nimport { VirtualizedConnectionTable } from '@plumile/ui/components/data-table/VirtualizedConnectionTable.js';\nimport { SimpleSelect } from '@plumile/ui/components/select/SimpleSelect.js';\nimport { denseTableClass } from '@plumile/ui/shared/backofficeTableDensity.css.js';\n\nimport {\n readWhereValue,\n setWhereValue,\n} from '@plumile/backoffice-core/filters/where.js';\nimport { resolveBackofficeListRuntimeConfig } from '@plumile/backoffice-core/config/listRuntime.js';\nimport type {\n BackofficeFilterSpec,\n BackofficeListState,\n BackofficePickerScope,\n BackofficeRuntimeResolvedListFacetConfig,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\n\nimport { BackofficeErrorBoundary } from '../errors/BackofficeErrorBoundary.js';\nimport {\n EntityFilterValue,\n EntityFilterValueText,\n} from '../filters/EntityFilterValue.js';\nimport { EntityIdPickerDialog } from '../pickers/EntityIdPickerDialog.js';\nimport { EntityIdFilterField } from '../filters/EntityIdFilterField.js';\nimport { DeferredFilterSearchInput } from '../filters/DeferredFilterSearchInput.js';\nimport { BackofficeListFilterProvider } from './BackofficeListFilterContext.js';\nimport { BACKOFFICE_LIST_BODY_SCROLL_MODE } from './backofficeListScrollMode.js';\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeInfiniteScrollSentinel } from '../../../hooks/useBackofficeInfiniteScrollSentinel.js';\nimport { isDevEnv } from '@plumile/relay/envHelpers.js';\n\nimport * as styles from './backofficeEntityListScaffold.css.js';\n\nconst resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\nconst getFilterValue = <Where extends Record<string, unknown>>(\n filter: BackofficeFilterSpec<Where>,\n where: Where | null,\n): unknown => {\n if (filter.fromGraphQL != null && where != null) {\n return filter.fromGraphQL(where);\n }\n\n const key = (filter.whereKey ?? filter.id) as keyof Where;\n return readWhereValue(where, key, filter.path);\n};\n\nconst normalizeStringArray = (value: unknown): readonly string[] => {\n if (!Array.isArray(value)) {\n return [];\n }\n return value\n .map((entry) => {\n if (entry == null) {\n return null;\n }\n const normalized = String(entry).trim();\n if (normalized === '') {\n return null;\n }\n return normalized;\n })\n .filter((entry): entry is string => {\n return entry != null;\n });\n};\n\nconst getFilterDisplayValue = <Where extends Record<string, unknown>>(\n filter: BackofficeFilterSpec<Where>,\n raw: unknown,\n options: {\n enumLabel: (value: string) => string;\n booleanLabel: (value: boolean) => string;\n fallbackBooleanLabels: { yes: string; no: string };\n },\n): ReactNode | null => {\n if (raw == null) {\n return null;\n }\n\n if (Array.isArray(raw)) {\n const normalized = normalizeStringArray(raw);\n\n if (normalized.length === 0) {\n return null;\n }\n\n if (filter.kind === 'entityIdList') {\n return (\n <>\n {normalized.map((id, index) => {\n return (\n <span key={id}>\n <EntityFilterValue entityId={filter.entity} id={id} />\n {index < normalized.length - 1 ? ', ' : null}\n </span>\n );\n })}\n </>\n );\n }\n\n return normalized.join(', ');\n }\n\n if (typeof raw === 'boolean') {\n if (filter.kind === 'boolean') {\n return options.booleanLabel(raw);\n }\n if (raw) {\n return options.fallbackBooleanLabels.yes;\n }\n return options.fallbackBooleanLabels.no;\n }\n\n if (typeof raw !== 'string' && typeof raw !== 'number') {\n return null;\n }\n\n const rawString = String(raw).trim();\n if (rawString === '') {\n return null;\n }\n\n if (filter.kind === 'entityId') {\n return <EntityFilterValue entityId={filter.entity} id={rawString} />;\n }\n\n if (filter.kind === 'enum') {\n return options.enumLabel(rawString);\n }\n\n return rawString;\n};\n\nconst toDatetimeInputValue = (value: string): string => {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) {\n return value;\n }\n const offsetMs = date.getTimezoneOffset() * 60_000;\n return new Date(date.getTime() - offsetMs).toISOString().slice(0, 16);\n};\n\nconst fromDatetimeInputValue = (value: string): string => {\n const normalized = value.trim();\n if (normalized === '') {\n return '';\n }\n const date = new Date(normalized);\n if (Number.isNaN(date.getTime())) {\n return normalized;\n }\n return date.toISOString();\n};\n\ntype RuntimeWhere = Record<string, unknown>;\ntype RuntimeSort = string;\n\ntype Props<RowView> = {\n config: BackofficeRuntimeResolvedListFacetConfig;\n state: BackofficeListState<RuntimeWhere, RuntimeSort>;\n pushState: (next: BackofficeListState<RuntimeWhere, RuntimeSort>) => void;\n header?: {\n title?: string;\n subtitle?: string;\n };\n headerActions?: ReactNode;\n rows: readonly RowView[];\n getRowId: GetRowId<RowView>;\n columns: readonly DataTableColumn<RowView>[];\n gridTemplateColumns?: string;\n hasNextPage: boolean;\n isLoadingMore: boolean;\n incrementalError?: Error | null;\n isRefreshing?: boolean;\n onLoadMore: () => void;\n onRetryLoadMore?: () => void;\n onRefresh?: () => void;\n totalCount?: number | null;\n loadedCountLabel?: ReactNode;\n emptyState?: JSX.Element;\n statusBanner?: ReactNode;\n isLoadingInitial?: boolean;\n virtualize?: boolean;\n variant?: 'page' | 'embedded';\n showFilters?: boolean;\n};\n\nexport const BackofficeEntityListScaffold = <RowView,>(\n props: Props<RowView>,\n): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const {\n config,\n state,\n pushState,\n rows,\n getRowId,\n columns,\n gridTemplateColumns,\n hasNextPage,\n isLoadingMore,\n incrementalError = null,\n isRefreshing = false,\n onLoadMore,\n onRetryLoadMore,\n onRefresh,\n totalCount,\n loadedCountLabel,\n emptyState,\n statusBanner,\n header,\n headerActions,\n isLoadingInitial = false,\n variant = 'page',\n showFilters = true,\n } = props;\n const listConfig = config.list;\n const { listDefaults } = config;\n\n const columnsWithPrimary = useMemo(() => {\n const hasPrimary = columns.some((col) => {\n return col.isPrimary === true;\n });\n if (hasPrimary || columns.length === 0) {\n return columns;\n }\n return columns.map((col, index) => {\n const { header } = col;\n if (index === 0) {\n return { ...col, isPrimary: true, header };\n }\n return { ...col, header };\n });\n }, [columns]);\n\n const chips = useMemo<readonly FilterChip[]>(() => {\n const out: FilterChip[] = [];\n for (const filter of listConfig.filters) {\n const raw = getFilterValue(filter, state.where);\n const displayValue = getFilterDisplayValue(filter, raw, {\n enumLabel: (value) => {\n if (filter.kind !== 'enum') {\n return value;\n }\n const match = filter.options.find((option) => {\n return option.value === value;\n });\n if (match != null) {\n return resolveLabel(match.label, tApp);\n }\n return value;\n },\n booleanLabel: (value) => {\n if (filter.kind === 'boolean') {\n if (value && filter.trueLabel != null) {\n return resolveLabel(filter.trueLabel, tApp);\n }\n if (!value && filter.falseLabel != null) {\n return resolveLabel(filter.falseLabel, tApp);\n }\n }\n if (value) {\n return t('filters.boolean.yes');\n }\n return t('filters.boolean.no');\n },\n fallbackBooleanLabels: {\n yes: t('filters.boolean.yes'),\n no: t('filters.boolean.no'),\n },\n });\n\n if (displayValue != null) {\n let idValue = String(raw);\n if (Array.isArray(raw)) {\n idValue = raw.join(',');\n }\n const label = (\n <span>\n {resolveLabel(filter.label, tApp)}: {displayValue}\n </span>\n );\n out.push({\n id: `${filter.id}:${idValue}`,\n label,\n onRemove: () => {\n const key = filter.whereKey ?? filter.id;\n const nextWhere = setWhereValue(\n state.where,\n key,\n null,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n },\n });\n }\n }\n return out;\n }, [listConfig.filters, pushState, state, t, tApp]);\n\n const handleClearAll = useCallback(() => {\n pushState({\n ...listDefaults,\n });\n }, [listDefaults, pushState]);\n\n const [pickerDialog, setPickerDialog] = useState<{\n entity: string;\n whereKey: keyof RuntimeWhere;\n label: string;\n mode: 'single' | 'list';\n currentIds?: readonly string[];\n path?: readonly string[];\n scope?: BackofficePickerScope<Record<string, unknown>>;\n } | null>(null);\n\n const renderFilterControl = useCallback(\n (filter: BackofficeFilterSpec<RuntimeWhere>): JSX.Element => {\n const key = filter.whereKey ?? filter.id;\n const candidate = getFilterValue(filter, state.where);\n let value = '';\n if (typeof candidate === 'string') {\n value = candidate;\n }\n if (typeof candidate === 'number' && Number.isFinite(candidate)) {\n value = String(candidate);\n }\n\n const filterLabelText = resolveLabel(filter.label, tApp);\n\n if (filter.kind === 'text') {\n const placeholderLabelText =\n filter.placeholderLabel != null\n ? resolveLabel(filter.placeholderLabel, tApp)\n : filterLabelText;\n let placeholder = t('filters.placeholders.search', {\n label: placeholderLabelText,\n });\n if (filter.placeholderText != null) {\n placeholder = resolveLabel(filter.placeholderText, tApp);\n }\n return (\n <DeferredFilterSearchInput\n value={value}\n onApply={(next) => {\n const nextWhere = setWhereValue(\n state.where,\n key,\n next,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n placeholder={placeholder}\n ariaLabel={placeholder}\n className={styles.filterInput}\n />\n );\n }\n\n if (filter.kind === 'datetime') {\n const placeholderLabelText =\n filter.placeholderLabel != null\n ? resolveLabel(filter.placeholderLabel, tApp)\n : filterLabelText;\n let placeholder = t('filters.placeholders.search', {\n label: placeholderLabelText,\n });\n if (filter.placeholderText != null) {\n placeholder = resolveLabel(filter.placeholderText, tApp);\n }\n return (\n <DeferredFilterSearchInput\n value={toDatetimeInputValue(value)}\n onApply={(next) => {\n const normalized = fromDatetimeInputValue(next);\n const nextWhere = setWhereValue(\n state.where,\n key,\n normalized,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n placeholder={placeholder}\n ariaLabel={placeholder}\n className={styles.filterInput}\n type=\"datetime-local\"\n />\n );\n }\n\n if (filter.kind === 'number') {\n const placeholderLabelText =\n filter.placeholderLabel != null\n ? resolveLabel(filter.placeholderLabel, tApp)\n : filterLabelText;\n let placeholder = t('filters.placeholders.search', {\n label: placeholderLabelText,\n });\n if (filter.placeholderText != null) {\n placeholder = resolveLabel(filter.placeholderText, tApp);\n }\n return (\n <DeferredFilterSearchInput\n value={value}\n onApply={(next) => {\n const normalized = next.trim();\n const parsed = normalized === '' ? null : Number(normalized);\n const nextWhere = setWhereValue(\n state.where,\n key,\n Number.isFinite(parsed) ? parsed : null,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n placeholder={placeholder}\n ariaLabel={placeholder}\n className={styles.filterInput}\n inputMode={filter.inputMode ?? 'numeric'}\n type=\"text\"\n />\n );\n }\n\n if (filter.kind === 'enum') {\n const options = [\n {\n id: 'any',\n value: '',\n label: t('filters.all', {\n label: filterLabelText,\n }),\n },\n ...filter.options.map((option) => {\n return {\n id: option.value,\n value: option.value,\n label: resolveLabel(option.label, tApp),\n };\n }),\n ];\n\n return (\n <SimpleSelect\n options={options}\n value={value}\n size=\"small\"\n ariaLabel={filterLabelText}\n onChange={(next) => {\n const nextWhere = setWhereValue(\n state.where,\n key,\n next,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n />\n );\n }\n\n if (filter.kind === 'boolean') {\n let current: boolean | null = null;\n if (typeof candidate === 'boolean') {\n current = candidate;\n }\n\n let selectValue = '';\n if (current === true) {\n selectValue = 'true';\n }\n if (current === false) {\n selectValue = 'false';\n }\n\n const trueLabel =\n filter.trueLabel != null\n ? resolveLabel(filter.trueLabel, tApp)\n : t('filters.boolean.yes');\n const falseLabel =\n filter.falseLabel != null\n ? resolveLabel(filter.falseLabel, tApp)\n : t('filters.boolean.no');\n const options = [\n {\n id: 'any',\n value: '',\n label: t('filters.all', {\n label: filterLabelText,\n }),\n },\n {\n id: 'true',\n value: 'true',\n label: trueLabel,\n },\n {\n id: 'false',\n value: 'false',\n label: falseLabel,\n },\n ];\n\n return (\n <SimpleSelect\n options={options}\n value={selectValue}\n size=\"small\"\n ariaLabel={filterLabelText}\n onChange={(next) => {\n let parsed: boolean | null = null;\n if (next === 'true') {\n parsed = true;\n }\n if (next === 'false') {\n parsed = false;\n }\n const nextWhere = setWhereValue(\n state.where,\n key,\n parsed,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n />\n );\n }\n\n const pickerScope = (() => {\n if (filter.pickerScope == null) {\n return undefined;\n }\n if (typeof filter.pickerScope === 'function') {\n return filter.pickerScope(state.where);\n }\n return filter.pickerScope;\n })();\n\n if (filter.kind === 'entityIdList') {\n const currentIds = normalizeStringArray(candidate);\n const selectedCount = currentIds.length;\n const displayValue =\n selectedCount === 0\n ? null\n : t('filters.selectedEntities', {\n count: selectedCount,\n });\n\n const removeId = (id: string): void => {\n const nextIds = currentIds.filter((currentId) => {\n return currentId !== id;\n });\n const nextWhere = setWhereValue(\n state.where,\n key,\n nextIds.length === 0 ? null : nextIds,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n };\n\n return (\n <div className={styles.entityIdListFilter}>\n <EntityIdFilterField\n label={filterLabelText}\n value={selectedCount === 0 ? null : currentIds.join(',')}\n displayValue={displayValue}\n placeholder={t('filters.placeholders.anyEntity', {\n label: filterLabelText,\n })}\n onPick={() => {\n setPickerDialog({\n entity: filter.entity,\n whereKey: key,\n label: filterLabelText,\n mode: 'list',\n currentIds,\n path: filter.path,\n scope: pickerScope,\n });\n }}\n onClear={() => {\n const nextWhere = setWhereValue(\n state.where,\n key,\n null,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n />\n {currentIds.length > 0 ? (\n <div className={styles.entityIdListTags}>\n {currentIds.map((id) => {\n return (\n <Tag\n key={id}\n removeLabel={t('filters.actions.removeFilterValue', {\n label: filterLabelText,\n })}\n onRemove={() => {\n removeId(id);\n }}\n >\n <EntityFilterValue entityId={filter.entity} id={id} />\n </Tag>\n );\n })}\n </div>\n ) : null}\n </div>\n );\n }\n\n if (filter.kind === 'stringList') {\n const placeholderLabelText =\n filter.placeholderLabel != null\n ? resolveLabel(filter.placeholderLabel, tApp)\n : filterLabelText;\n let placeholder = t('filters.placeholders.search', {\n label: placeholderLabelText,\n });\n if (filter.placeholderText != null) {\n placeholder = resolveLabel(filter.placeholderText, tApp);\n }\n return (\n <DeferredFilterSearchInput\n value={value}\n onApply={(next) => {\n const values = next\n .split(/[\\n,]+/u)\n .map((entry) => {\n return entry.trim();\n })\n .filter((entry) => {\n return entry !== '';\n });\n const nextWhere = setWhereValue(\n state.where,\n key,\n values,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n placeholder={placeholder}\n ariaLabel={placeholder}\n className={styles.filterInput}\n />\n );\n }\n\n let currentId: string | null = null;\n if (typeof candidate === 'string') {\n currentId = candidate;\n }\n\n const renderField = (\n displayValue: string | null = null,\n isResolving = false,\n ) => {\n const normalizedDisplayValue = displayValue?.trim() ?? '';\n return (\n <EntityIdFilterField\n label={filterLabelText}\n value={currentId}\n displayValue={normalizedDisplayValue}\n isResolving={isResolving}\n placeholder={t('filters.placeholders.anyEntity', {\n label: filterLabelText,\n })}\n onPick={() => {\n setPickerDialog({\n entity: filter.entity,\n whereKey: key,\n label: filterLabelText,\n mode: 'single',\n path: filter.path,\n scope: pickerScope,\n });\n }}\n onClear={() => {\n const nextWhere = setWhereValue(\n state.where,\n key,\n null,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n />\n );\n };\n\n if (currentId == null || currentId.trim() === '') {\n return renderField();\n }\n\n return (\n <EntityFilterValueText entityId={filter.entity} id={currentId}>\n {(label, valueState) => {\n const isResolving = valueState?.status === 'loading';\n return renderField(\n isResolving ? t('common.loading') : label,\n isResolving,\n );\n }}\n </EntityFilterValueText>\n );\n },\n [pushState, state, t, tApp],\n );\n\n const hasPlacementConfig = useMemo(() => {\n return listConfig.filters.some((filter) => {\n return filter.placement != null;\n });\n }, [listConfig.filters]);\n\n const quickFilters = useMemo(() => {\n if (listConfig.filters.length === 0) {\n return [];\n }\n const maxPromotedFilters = listConfig.ui?.toolbar?.maxPromotedFilters ?? 3;\n if (hasPlacementConfig) {\n return listConfig.filters.filter((filter) => {\n return filter.placement === 'quick' || filter.placement === 'both';\n });\n }\n return listConfig.filters.slice(0, maxPromotedFilters);\n }, [listConfig.filters, listConfig.ui?.toolbar, hasPlacementConfig]);\n\n const drawerFilters = useMemo(() => {\n return listConfig.filters.filter((filter) => {\n if (filter.placement == null) {\n return true;\n }\n return filter.placement === 'drawer' || filter.placement === 'both';\n });\n }, [listConfig.filters]);\n\n const searchFilter = useMemo(() => {\n return quickFilters.find((filter) => {\n return filter.kind === 'text';\n });\n }, [quickFilters]);\n\n const quickFiltersNode = useMemo(() => {\n const visibleQuickFilters = quickFilters.filter((filter) => {\n return filter !== searchFilter;\n });\n\n if (visibleQuickFilters.length === 0) {\n return null;\n }\n\n return (\n <div className={styles.controlsRow}>\n {visibleQuickFilters.map((filter) => {\n return <span key={filter.id}>{renderFilterControl(filter)}</span>;\n })}\n </div>\n );\n }, [quickFilters, renderFilterControl, searchFilter]);\n\n const searchNode = useMemo(() => {\n if (searchFilter == null) {\n return null;\n }\n return renderFilterControl(searchFilter);\n }, [renderFilterControl, searchFilter]);\n\n const sortNode = useMemo(() => {\n if (listConfig.sorts.length === 0) {\n return null;\n }\n const firstSort = listConfig.sorts[0];\n if (firstSort == null) {\n return null;\n }\n const options = listConfig.sorts.map((s) => {\n return { id: s.id, value: s.id, label: resolveLabel(s.label, tApp) };\n });\n return (\n <SimpleSelect\n options={options}\n value={state.sort ?? firstSort.id}\n size=\"small\"\n ariaLabel={t('list.sort.label')}\n onChange={(next) => {\n pushState({\n ...state,\n sort: next,\n });\n }}\n />\n );\n }, [listConfig.sorts, pushState, state, t, tApp]);\n\n const drawerSections = useMemo(() => {\n if (drawerFilters.length === 0) {\n return [];\n }\n\n const items: { id: string; searchText: string; node: JSX.Element }[] = [];\n\n for (const filter of drawerFilters) {\n const resolvedLabel = resolveLabel(filter.label, tApp);\n items.push({\n id: filter.id,\n searchText: resolvedLabel,\n node: (\n <BackofficeFilterField label={resolvedLabel}>\n {renderFilterControl(filter)}\n </BackofficeFilterField>\n ),\n });\n }\n\n if (items.length === 0) {\n return [];\n }\n\n return [\n {\n id: 'backoffice.filters.sections.default',\n title: t('filters.sections.default'),\n items,\n },\n ];\n }, [drawerFilters, renderFilterControl, t, tApp]);\n\n const resolvedEmptyState = useMemo((): JSX.Element => {\n if (emptyState != null) {\n return emptyState;\n }\n\n if (isLoadingInitial) {\n return (\n <BackofficeTableSkeleton\n variant=\"embedded\"\n ariaLabel={t('common.loading')}\n />\n );\n }\n\n if (chips.length > 0) {\n return (\n <BackofficeEmptyState\n title={t('emptyState.listEmpty.title')}\n description={t('emptyState.listEmptyFiltered.description')}\n actions={\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n onClick={handleClearAll}\n >\n {t('emptyState.listEmptyFiltered.actions.reset')}\n </Button>\n }\n />\n );\n }\n\n return (\n <BackofficeEmptyState\n title={t('emptyState.listEmpty.title')}\n description={t('emptyState.listEmpty.description')}\n />\n );\n }, [chips.length, emptyState, handleClearAll, isLoadingInitial, t]);\n\n const tableFooterMeta = useMemo((): ReactNode => {\n if (loadedCountLabel != null) {\n return loadedCountLabel;\n }\n if (typeof totalCount !== 'number') {\n if (rows.length === 0) {\n return null;\n }\n return (\n <span>\n {t('list.loaded', {\n count: rows.length,\n })}\n </span>\n );\n }\n return (\n <span>\n {t('list.showing', {\n shown: rows.length,\n total: totalCount,\n })}\n </span>\n );\n }, [loadedCountLabel, rows.length, t, totalCount]);\n\n const runtimeConfig = useMemo(() => {\n const resolvedDisplayMode =\n listConfig.ui?.displayMode ?? listConfig.responsive?.mode ?? 'auto';\n return resolveBackofficeListRuntimeConfig({\n kind: listConfig.kind,\n displayMode: resolvedDisplayMode,\n ui: listConfig.ui,\n });\n }, [listConfig.kind, listConfig.responsive?.mode, listConfig.ui]);\n\n const hasKnownRemainingRows =\n typeof totalCount === 'number' && rows.length < totalCount;\n const hasInconsistentPageInfo = hasKnownRemainingRows && !hasNextPage;\n\n useEffect(() => {\n if (\n !hasInconsistentPageInfo ||\n !runtimeConfig.infiniteScroll.showInconsistentPageInfo ||\n !isDevEnv()\n ) {\n return;\n }\n // eslint-disable-next-line no-console\n console.warn(\n 'Backoffice list received inconsistent pageInfo: loaded rows are lower than totalCount but hasNextPage is false.',\n {\n entityId: config.id,\n loadedCount: rows.length,\n totalCount,\n },\n );\n }, [\n config.id,\n hasInconsistentPageInfo,\n rows.length,\n runtimeConfig.infiniteScroll.showInconsistentPageInfo,\n totalCount,\n ]);\n\n const shouldVirtualizeTable =\n props.virtualize === true || runtimeConfig.virtualization.enabled;\n\n const { sentinelRef } = useBackofficeInfiniteScrollSentinel({\n enabled:\n !shouldVirtualizeTable &&\n runtimeConfig.infiniteScroll.enabled &&\n incrementalError == null,\n hasNextPage,\n isLoading: isLoadingMore,\n onIntersect: onLoadMore,\n rootMargin: runtimeConfig.infiniteScroll.rootMargin,\n threshold: runtimeConfig.infiniteScroll.threshold,\n });\n\n const headerTitle = header?.title ?? resolveLabel(listConfig.title, tApp);\n const headerSubtitle = header?.subtitle;\n\n const actionColumn = columnsWithPrimary.find((column) => {\n return column.mobileRole === 'action' || column.id === 'actions';\n });\n const listMode =\n listConfig.ui?.displayMode ?? listConfig.responsive?.mode ?? 'auto';\n const listDensity =\n listConfig.ui?.density ?? listConfig.responsive?.density ?? 'compact';\n\n const tableInnerNode = shouldVirtualizeTable ? (\n <VirtualizedConnectionTable\n columns={columnsWithPrimary}\n rows={rows}\n getRowId={getRowId}\n emptyState={resolvedEmptyState}\n className={denseTableClass}\n gridTemplateColumns={gridTemplateColumns}\n virtualization={runtimeConfig.virtualization}\n infiniteScroll={{\n enabled: runtimeConfig.infiniteScroll.enabled,\n thresholdPx: runtimeConfig.infiniteScroll.thresholdPx,\n autoLoad: runtimeConfig.infiniteScroll.autoLoad,\n }}\n hasNextPage={hasNextPage}\n isLoadingMore={isLoadingMore}\n onLoadMore={incrementalError == null ? onLoadMore : () => {}}\n bodyScrollMode={BACKOFFICE_LIST_BODY_SCROLL_MODE}\n />\n ) : (\n <ResponsiveRecordList\n columns={columnsWithPrimary}\n rows={rows}\n getRowId={getRowId}\n emptyState={resolvedEmptyState}\n className={denseTableClass}\n gridTemplateColumns={gridTemplateColumns}\n mode={listMode}\n density={listDensity}\n bodyScrollMode={BACKOFFICE_LIST_BODY_SCROLL_MODE}\n bodyFooterNode={\n runtimeConfig.infiniteScroll.enabled ? (\n <div ref={sentinelRef} aria-hidden=\"true\" />\n ) : null\n }\n renderAction={(row) => {\n return actionColumn?.cell(row) ?? null;\n }}\n />\n );\n\n const tableNodeWithErrorBoundary = (\n <BackofficeErrorBoundary\n fallback={(args: { error: unknown; reset: () => void }) => {\n const { reset } = args;\n\n const retry = (): void => {\n reset();\n if (onRefresh != null) {\n onRefresh();\n }\n };\n\n return (\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={retry}\n >\n {t('list.actions.retry')}\n </Button>\n }\n >\n {t('list.errors.tableFailed')}\n </InlineBanner>\n );\n }}\n >\n {tableInnerNode}\n </BackofficeErrorBoundary>\n );\n\n const filtersBarNode = showFilters ? (\n <BackofficeListFilterToolbar\n stateKey={`backoffice:entity:${config.id}`}\n sections={drawerSections}\n activeFilters={chips}\n onResetFilters={handleClearAll}\n search={searchNode}\n primaryFilters={quickFiltersNode}\n sort={sortNode}\n utilityActions={\n onRefresh == null ? null : (\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n isLoading={isRefreshing}\n loadingLabel={t('list.actions.refreshing')}\n onClick={() => {\n onRefresh();\n }}\n >\n {t('list.actions.refresh')}\n </Button>\n )\n }\n density=\"compact\"\n />\n ) : null;\n\n const tableNode = (\n <div\n className={styles.tableHost}\n aria-busy={isRefreshing ? 'true' : undefined}\n >\n {isRefreshing && !isLoadingInitial ? (\n <div className={styles.refreshingIndicator} role=\"status\">\n <Spinner size={14} ariaLabel={t('list.refreshingRows')} />\n <span>{t('list.refreshingRows')}</span>\n </div>\n ) : null}\n {tableNodeWithErrorBoundary}\n <EntityIdPickerDialog\n isOpen={pickerDialog != null}\n entity={pickerDialog?.entity ?? config.id}\n title={pickerDialog?.label ?? t('picker.title')}\n scope={pickerDialog?.scope}\n onClose={() => {\n setPickerDialog(null);\n }}\n onSelectId={(id) => {\n if (pickerDialog == null) {\n return;\n }\n if (pickerDialog.mode === 'list') {\n const currentIds = pickerDialog.currentIds ?? [];\n const nextIds = currentIds.includes(id)\n ? currentIds\n : [...currentIds, id];\n const nextWhere = setWhereValue(\n state.where,\n pickerDialog.whereKey,\n nextIds,\n pickerDialog.path,\n );\n pushState({ ...state, where: nextWhere });\n return;\n }\n const nextWhere = setWhereValue(\n state.where,\n pickerDialog.whereKey,\n id,\n pickerDialog.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n />\n </div>\n );\n\n const shouldRenderTableFooter =\n rows.length > 0 || isLoadingMore || hasNextPage;\n\n const tableFooterNode = shouldRenderTableFooter ? (\n <>\n <BackofficeListFooter\n state={\n incrementalError != null && onRetryLoadMore != null\n ? {\n kind: 'error',\n message: incrementalError.message,\n onRetry: onRetryLoadMore,\n }\n : isLoadingMore\n ? { kind: 'loading' }\n : hasNextPage\n ? { kind: 'idle' }\n : { kind: 'end' }\n }\n loadedCount={rows.length}\n totalCount={totalCount}\n labels={{\n loaded: tableFooterMeta,\n loading: t('list.loadMore.loading'),\n end: t('list.loadMore.end'),\n retry: t('list.actions.retry'),\n }}\n />\n </>\n ) : null;\n\n if (variant === 'embedded') {\n return (\n <BackofficeListFilterProvider\n config={config}\n state={state}\n pushState={pushState}\n >\n <div className={styles.embeddedContainer}>\n <div className={styles.embeddedHeader}>{headerTitle}</div>\n {filtersBarNode}\n {statusBanner}\n {tableNode}\n {tableFooterNode}\n </div>\n </BackofficeListFilterProvider>\n );\n }\n\n return (\n <BackofficeListFilterProvider\n config={config}\n state={state}\n pushState={pushState}\n >\n <ListPageTemplate\n headerNode={\n <BackofficePageHeader\n title={headerTitle}\n subtitle={headerSubtitle}\n actions={headerActions}\n />\n }\n toolbarNode={filtersBarNode}\n statusNode={statusBanner}\n tableNode={tableNode}\n tableFooterNode={tableFooterNode}\n presentation=\"flat\"\n bodyScrollMode={BACKOFFICE_LIST_BODY_SCROLL_MODE}\n />\n </BackofficeListFilterProvider>\n );\n};\n\nexport default BackofficeEntityListScaffold;\n"],"mappings":"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"}
1
+ {"version":3,"file":"BackofficeEntityListScaffold.js","names":[],"sources":["../../../../../src/components/backoffice/scaffolds/BackofficeEntityListScaffold.tsx"],"sourcesContent":["import {\n type JSX,\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport type { TFunction } from 'i18next';\nimport { useTranslation } from 'react-i18next';\nimport { Button } from '@plumile/ui/button';\nimport { BackofficeEmptyState } from '@plumile/ui/backoffice/molecules/backoffice_empty_state/BackofficeEmptyState.js';\nimport { BackofficeFilterField } from '@plumile/ui/backoffice/molecules/backoffice_filter_field/BackofficeFilterField.js';\nimport { Spinner } from '@plumile/ui/backoffice/atoms/spinner/Spinner.js';\nimport { Tag } from '@plumile/ui/backoffice/atoms/tag/Tag.js';\nimport { BackofficeListFooter } from '@plumile/ui/backoffice/molecules/backoffice_list_footer/BackofficeListFooter.js';\nimport {\n denseTableClass,\n InlineBanner,\n PageHeader,\n ResponsiveRecordList,\n VirtualizedConnectionTable,\n type GetRowId,\n type ResponsiveRecordListColumn,\n} from '@plumile/ui';\nimport { BackofficeTableSkeleton } from '@plumile/ui/backoffice/molecules/backoffice_table_skeleton/BackofficeTableSkeleton.js';\nimport type { FilterChip } from '@plumile/ui/backoffice/molecules/filter_chip_row/FilterChipRow.js';\nimport { BackofficeListFilterToolbar } from '@plumile/ui/backoffice/organisms/backoffice_list_filter_toolbar/BackofficeListFilterToolbar.js';\nimport { ListPageTemplate } from '@plumile/ui/backoffice/templates/list_page_template/ListPageTemplate.js';\nimport { Select, type SelectOption } from '@plumile/ui/select';\n\nimport {\n readWhereValue,\n setWhereValue,\n} from '@plumile/backoffice-core/filters/where.js';\nimport { resolveBackofficeListRuntimeConfig } from '@plumile/backoffice-core/config/listRuntime.js';\nimport type {\n BackofficeFilterSpec,\n BackofficeListState,\n BackofficePickerScope,\n BackofficeRuntimeResolvedListFacetConfig,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\n\nimport { BackofficeErrorBoundary } from '../errors/BackofficeErrorBoundary.js';\nimport {\n EntityFilterValue,\n EntityFilterValueText,\n} from '../filters/EntityFilterValue.js';\nimport { EntityIdPickerDialog } from '../pickers/EntityIdPickerDialog.js';\nimport { EntityIdFilterField } from '../filters/EntityIdFilterField.js';\nimport { DeferredFilterSearchInput } from '../filters/DeferredFilterSearchInput.js';\nimport { BackofficeListFilterProvider } from './BackofficeListFilterContext.js';\nimport { BACKOFFICE_LIST_BODY_SCROLL_MODE } from './backofficeListScrollMode.js';\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeInfiniteScrollSentinel } from '../../../hooks/useBackofficeInfiniteScrollSentinel.js';\nimport { isDevEnv } from '@plumile/relay/envHelpers.js';\n\nimport * as styles from './backofficeEntityListScaffold.css.js';\n\nconst resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\nconst getFilterValue = <Where extends Record<string, unknown>>(\n filter: BackofficeFilterSpec<Where>,\n where: Where | null,\n): unknown => {\n if (filter.fromGraphQL != null && where != null) {\n return filter.fromGraphQL(where);\n }\n\n const key = (filter.whereKey ?? filter.id) as keyof Where;\n return readWhereValue(where, key, filter.path);\n};\n\nconst normalizeStringArray = (value: unknown): readonly string[] => {\n if (!Array.isArray(value)) {\n return [];\n }\n return value\n .map((entry) => {\n if (entry == null) {\n return null;\n }\n const normalized = String(entry).trim();\n if (normalized === '') {\n return null;\n }\n return normalized;\n })\n .filter((entry): entry is string => {\n return entry != null;\n });\n};\n\nconst ALL_FILTER_SELECT_VALUE = 'all' as const;\nconst ENUM_FILTER_SELECT_VALUE_PREFIX = 'value:' as const;\n\ntype EnumFilterSelectValue =\n | typeof ALL_FILTER_SELECT_VALUE\n | `${typeof ENUM_FILTER_SELECT_VALUE_PREFIX}${string}`;\ntype BooleanFilterSelectValue =\n typeof ALL_FILTER_SELECT_VALUE | 'true' | 'false';\n\nconst encodeEnumFilterSelectValue = (value: string): EnumFilterSelectValue => {\n return `${ENUM_FILTER_SELECT_VALUE_PREFIX}${value}`;\n};\n\nconst decodeEnumFilterSelectValue = (\n value: EnumFilterSelectValue,\n): string | null => {\n if (value === ALL_FILTER_SELECT_VALUE) {\n return null;\n }\n return value.slice(ENUM_FILTER_SELECT_VALUE_PREFIX.length);\n};\n\nconst getFilterDisplayValue = <Where extends Record<string, unknown>>(\n filter: BackofficeFilterSpec<Where>,\n raw: unknown,\n options: {\n enumLabel: (value: string) => string;\n booleanLabel: (value: boolean) => string;\n fallbackBooleanLabels: { yes: string; no: string };\n },\n): ReactNode | null => {\n if (raw == null) {\n return null;\n }\n\n if (Array.isArray(raw)) {\n const normalized = normalizeStringArray(raw);\n\n if (normalized.length === 0) {\n return null;\n }\n\n if (filter.kind === 'entityIdList') {\n return (\n <>\n {normalized.map((id, index) => {\n return (\n <span key={id}>\n <EntityFilterValue entityId={filter.entity} id={id} />\n {index < normalized.length - 1 ? ', ' : null}\n </span>\n );\n })}\n </>\n );\n }\n\n return normalized.join(', ');\n }\n\n if (typeof raw === 'boolean') {\n if (filter.kind === 'boolean') {\n return options.booleanLabel(raw);\n }\n if (raw) {\n return options.fallbackBooleanLabels.yes;\n }\n return options.fallbackBooleanLabels.no;\n }\n\n if (typeof raw !== 'string' && typeof raw !== 'number') {\n return null;\n }\n\n const rawString = String(raw).trim();\n if (rawString === '') {\n return null;\n }\n\n if (filter.kind === 'entityId') {\n return <EntityFilterValue entityId={filter.entity} id={rawString} />;\n }\n\n if (filter.kind === 'enum') {\n return options.enumLabel(rawString);\n }\n\n return rawString;\n};\n\nconst toDatetimeInputValue = (value: string): string => {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) {\n return value;\n }\n const offsetMs = date.getTimezoneOffset() * 60_000;\n return new Date(date.getTime() - offsetMs).toISOString().slice(0, 16);\n};\n\nconst fromDatetimeInputValue = (value: string): string => {\n const normalized = value.trim();\n if (normalized === '') {\n return '';\n }\n const date = new Date(normalized);\n if (Number.isNaN(date.getTime())) {\n return normalized;\n }\n return date.toISOString();\n};\n\ntype RuntimeWhere = Record<string, unknown>;\ntype RuntimeSort = string;\n\ntype Props<RowView> = {\n config: BackofficeRuntimeResolvedListFacetConfig;\n state: BackofficeListState<RuntimeWhere, RuntimeSort>;\n pushState: (next: BackofficeListState<RuntimeWhere, RuntimeSort>) => void;\n header?: {\n title?: string;\n subtitle?: string;\n };\n headerActions?: ReactNode;\n rows: readonly RowView[];\n getRowId: GetRowId<RowView>;\n columns: readonly ResponsiveRecordListColumn<RowView>[];\n gridTemplateColumns?: string;\n hasNextPage: boolean;\n isLoadingMore: boolean;\n incrementalError?: Error | null;\n isRefreshing?: boolean;\n onLoadMore: () => void;\n onRetryLoadMore?: () => void;\n onRefresh?: () => void;\n totalCount?: number | null;\n loadedCountLabel?: ReactNode;\n emptyState?: JSX.Element;\n statusBanner?: ReactNode;\n isLoadingInitial?: boolean;\n virtualize?: boolean;\n variant?: 'page' | 'embedded';\n showFilters?: boolean;\n};\n\nexport const BackofficeEntityListScaffold = <RowView,>(\n props: Props<RowView>,\n): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const {\n config,\n state,\n pushState,\n rows,\n getRowId,\n columns,\n gridTemplateColumns,\n hasNextPage,\n isLoadingMore,\n incrementalError = null,\n isRefreshing = false,\n onLoadMore,\n onRetryLoadMore,\n onRefresh,\n totalCount,\n loadedCountLabel,\n emptyState,\n statusBanner,\n header,\n headerActions,\n isLoadingInitial = false,\n variant = 'page',\n showFilters = true,\n } = props;\n const listConfig = config.list;\n const { listDefaults } = config;\n\n const columnsWithPrimary = useMemo(() => {\n const hasPrimary = columns.some((col) => {\n return col.isPrimary === true;\n });\n if (hasPrimary || columns.length === 0) {\n return columns;\n }\n return columns.map((col, index) => {\n const { header } = col;\n if (index === 0) {\n return { ...col, isPrimary: true, header };\n }\n return { ...col, header };\n });\n }, [columns]);\n\n const chips = useMemo<readonly FilterChip[]>(() => {\n const out: FilterChip[] = [];\n for (const filter of listConfig.filters) {\n const raw = getFilterValue(filter, state.where);\n const displayValue = getFilterDisplayValue(filter, raw, {\n enumLabel: (value) => {\n if (filter.kind !== 'enum') {\n return value;\n }\n const match = filter.options.find((option) => {\n return option.value === value;\n });\n if (match != null) {\n return resolveLabel(match.label, tApp);\n }\n return value;\n },\n booleanLabel: (value) => {\n if (filter.kind === 'boolean') {\n if (value && filter.trueLabel != null) {\n return resolveLabel(filter.trueLabel, tApp);\n }\n if (!value && filter.falseLabel != null) {\n return resolveLabel(filter.falseLabel, tApp);\n }\n }\n if (value) {\n return t('filters.boolean.yes');\n }\n return t('filters.boolean.no');\n },\n fallbackBooleanLabels: {\n yes: t('filters.boolean.yes'),\n no: t('filters.boolean.no'),\n },\n });\n\n if (displayValue != null) {\n let idValue = String(raw);\n if (Array.isArray(raw)) {\n idValue = raw.join(',');\n }\n const label = (\n <span>\n {resolveLabel(filter.label, tApp)}: {displayValue}\n </span>\n );\n out.push({\n id: `${filter.id}:${idValue}`,\n label,\n onRemove: () => {\n const key = filter.whereKey ?? filter.id;\n const nextWhere = setWhereValue(\n state.where,\n key,\n null,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n },\n });\n }\n }\n return out;\n }, [listConfig.filters, pushState, state, t, tApp]);\n\n const handleClearAll = useCallback(() => {\n pushState({\n ...listDefaults,\n });\n }, [listDefaults, pushState]);\n\n const [pickerDialog, setPickerDialog] = useState<{\n entity: string;\n whereKey: keyof RuntimeWhere;\n label: string;\n mode: 'single' | 'list';\n currentIds?: readonly string[];\n path?: readonly string[];\n scope?: BackofficePickerScope<Record<string, unknown>>;\n } | null>(null);\n\n const renderFilterControl = useCallback(\n (filter: BackofficeFilterSpec<RuntimeWhere>): JSX.Element => {\n const key = filter.whereKey ?? filter.id;\n const candidate = getFilterValue(filter, state.where);\n let value = '';\n if (typeof candidate === 'string') {\n value = candidate;\n }\n if (typeof candidate === 'number' && Number.isFinite(candidate)) {\n value = String(candidate);\n }\n\n const filterLabelText = resolveLabel(filter.label, tApp);\n\n if (filter.kind === 'text') {\n const placeholderLabelText =\n filter.placeholderLabel != null\n ? resolveLabel(filter.placeholderLabel, tApp)\n : filterLabelText;\n let placeholder = t('filters.placeholders.search', {\n label: placeholderLabelText,\n });\n if (filter.placeholderText != null) {\n placeholder = resolveLabel(filter.placeholderText, tApp);\n }\n return (\n <DeferredFilterSearchInput\n value={value}\n onApply={(next) => {\n const nextWhere = setWhereValue(\n state.where,\n key,\n next,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n placeholder={placeholder}\n ariaLabel={placeholder}\n className={styles.filterInput}\n />\n );\n }\n\n if (filter.kind === 'datetime') {\n const placeholderLabelText =\n filter.placeholderLabel != null\n ? resolveLabel(filter.placeholderLabel, tApp)\n : filterLabelText;\n let placeholder = t('filters.placeholders.search', {\n label: placeholderLabelText,\n });\n if (filter.placeholderText != null) {\n placeholder = resolveLabel(filter.placeholderText, tApp);\n }\n return (\n <DeferredFilterSearchInput\n value={toDatetimeInputValue(value)}\n onApply={(next) => {\n const normalized = fromDatetimeInputValue(next);\n const nextWhere = setWhereValue(\n state.where,\n key,\n normalized,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n placeholder={placeholder}\n ariaLabel={placeholder}\n className={styles.filterInput}\n type=\"datetime-local\"\n />\n );\n }\n\n if (filter.kind === 'number') {\n const placeholderLabelText =\n filter.placeholderLabel != null\n ? resolveLabel(filter.placeholderLabel, tApp)\n : filterLabelText;\n let placeholder = t('filters.placeholders.search', {\n label: placeholderLabelText,\n });\n if (filter.placeholderText != null) {\n placeholder = resolveLabel(filter.placeholderText, tApp);\n }\n return (\n <DeferredFilterSearchInput\n value={value}\n onApply={(next) => {\n const normalized = next.trim();\n const parsed = normalized === '' ? null : Number(normalized);\n const nextWhere = setWhereValue(\n state.where,\n key,\n Number.isFinite(parsed) ? parsed : null,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n placeholder={placeholder}\n ariaLabel={placeholder}\n className={styles.filterInput}\n inputMode={filter.inputMode ?? 'numeric'}\n type=\"text\"\n />\n );\n }\n\n if (filter.kind === 'enum') {\n const options: readonly SelectOption<EnumFilterSelectValue>[] = [\n {\n value: ALL_FILTER_SELECT_VALUE,\n label: t('filters.all', {\n label: filterLabelText,\n }),\n },\n ...filter.options.map((option) => {\n return {\n value: encodeEnumFilterSelectValue(option.value),\n label: resolveLabel(option.label, tApp),\n };\n }),\n ];\n const selectValue =\n typeof candidate === 'string' && candidate.trim() !== ''\n ? encodeEnumFilterSelectValue(candidate)\n : ALL_FILTER_SELECT_VALUE;\n\n return (\n <Select\n options={options}\n value={selectValue}\n size=\"small\"\n aria-label={filterLabelText}\n onValueChange={(next) => {\n const nextWhere = setWhereValue(\n state.where,\n key,\n decodeEnumFilterSelectValue(next),\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n />\n );\n }\n\n if (filter.kind === 'boolean') {\n let current: boolean | null = null;\n if (typeof candidate === 'boolean') {\n current = candidate;\n }\n\n let selectValue: BooleanFilterSelectValue = ALL_FILTER_SELECT_VALUE;\n if (current === true) {\n selectValue = 'true';\n }\n if (current === false) {\n selectValue = 'false';\n }\n\n const trueLabel =\n filter.trueLabel != null\n ? resolveLabel(filter.trueLabel, tApp)\n : t('filters.boolean.yes');\n const falseLabel =\n filter.falseLabel != null\n ? resolveLabel(filter.falseLabel, tApp)\n : t('filters.boolean.no');\n const options: readonly SelectOption<BooleanFilterSelectValue>[] = [\n {\n value: ALL_FILTER_SELECT_VALUE,\n label: t('filters.all', {\n label: filterLabelText,\n }),\n },\n {\n value: 'true',\n label: trueLabel,\n },\n {\n value: 'false',\n label: falseLabel,\n },\n ];\n\n return (\n <Select\n options={options}\n value={selectValue}\n size=\"small\"\n aria-label={filterLabelText}\n onValueChange={(next) => {\n let parsed: boolean | null = null;\n if (next === 'true') {\n parsed = true;\n }\n if (next === 'false') {\n parsed = false;\n }\n const nextWhere = setWhereValue(\n state.where,\n key,\n parsed,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n />\n );\n }\n\n const pickerScope = (() => {\n if (filter.pickerScope == null) {\n return undefined;\n }\n if (typeof filter.pickerScope === 'function') {\n return filter.pickerScope(state.where);\n }\n return filter.pickerScope;\n })();\n\n if (filter.kind === 'entityIdList') {\n const currentIds = normalizeStringArray(candidate);\n const selectedCount = currentIds.length;\n const displayValue =\n selectedCount === 0\n ? null\n : t('filters.selectedEntities', {\n count: selectedCount,\n });\n\n const removeId = (id: string): void => {\n const nextIds = currentIds.filter((currentId) => {\n return currentId !== id;\n });\n const nextWhere = setWhereValue(\n state.where,\n key,\n nextIds.length === 0 ? null : nextIds,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n };\n\n return (\n <div className={styles.entityIdListFilter}>\n <EntityIdFilterField\n label={filterLabelText}\n value={selectedCount === 0 ? null : currentIds.join(',')}\n displayValue={displayValue}\n placeholder={t('filters.placeholders.anyEntity', {\n label: filterLabelText,\n })}\n onPick={() => {\n setPickerDialog({\n entity: filter.entity,\n whereKey: key,\n label: filterLabelText,\n mode: 'list',\n currentIds,\n path: filter.path,\n scope: pickerScope,\n });\n }}\n onClear={() => {\n const nextWhere = setWhereValue(\n state.where,\n key,\n null,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n />\n {currentIds.length > 0 ? (\n <div className={styles.entityIdListTags}>\n {currentIds.map((id) => {\n return (\n <Tag\n key={id}\n removeLabel={t('filters.actions.removeFilterValue', {\n label: filterLabelText,\n })}\n onRemove={() => {\n removeId(id);\n }}\n >\n <EntityFilterValue entityId={filter.entity} id={id} />\n </Tag>\n );\n })}\n </div>\n ) : null}\n </div>\n );\n }\n\n if (filter.kind === 'stringList') {\n const placeholderLabelText =\n filter.placeholderLabel != null\n ? resolveLabel(filter.placeholderLabel, tApp)\n : filterLabelText;\n let placeholder = t('filters.placeholders.search', {\n label: placeholderLabelText,\n });\n if (filter.placeholderText != null) {\n placeholder = resolveLabel(filter.placeholderText, tApp);\n }\n return (\n <DeferredFilterSearchInput\n value={value}\n onApply={(next) => {\n const values = next\n .split(/[\\n,]+/u)\n .map((entry) => {\n return entry.trim();\n })\n .filter((entry) => {\n return entry !== '';\n });\n const nextWhere = setWhereValue(\n state.where,\n key,\n values,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n placeholder={placeholder}\n ariaLabel={placeholder}\n className={styles.filterInput}\n />\n );\n }\n\n let currentId: string | null = null;\n if (typeof candidate === 'string') {\n currentId = candidate;\n }\n\n const renderField = (\n displayValue: string | null = null,\n isResolving = false,\n ) => {\n const normalizedDisplayValue = displayValue?.trim() ?? '';\n return (\n <EntityIdFilterField\n label={filterLabelText}\n value={currentId}\n displayValue={normalizedDisplayValue}\n isResolving={isResolving}\n placeholder={t('filters.placeholders.anyEntity', {\n label: filterLabelText,\n })}\n onPick={() => {\n setPickerDialog({\n entity: filter.entity,\n whereKey: key,\n label: filterLabelText,\n mode: 'single',\n path: filter.path,\n scope: pickerScope,\n });\n }}\n onClear={() => {\n const nextWhere = setWhereValue(\n state.where,\n key,\n null,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n />\n );\n };\n\n if (currentId == null || currentId.trim() === '') {\n return renderField();\n }\n\n return (\n <EntityFilterValueText entityId={filter.entity} id={currentId}>\n {(label, valueState) => {\n const isResolving = valueState?.status === 'loading';\n return renderField(\n isResolving ? t('common.loading') : label,\n isResolving,\n );\n }}\n </EntityFilterValueText>\n );\n },\n [pushState, state, t, tApp],\n );\n\n const hasPlacementConfig = useMemo(() => {\n return listConfig.filters.some((filter) => {\n return filter.placement != null;\n });\n }, [listConfig.filters]);\n\n const quickFilters = useMemo(() => {\n if (listConfig.filters.length === 0) {\n return [];\n }\n const maxPromotedFilters = listConfig.ui?.toolbar?.maxPromotedFilters ?? 3;\n if (hasPlacementConfig) {\n return listConfig.filters.filter((filter) => {\n return filter.placement === 'quick' || filter.placement === 'both';\n });\n }\n return listConfig.filters.slice(0, maxPromotedFilters);\n }, [listConfig.filters, listConfig.ui?.toolbar, hasPlacementConfig]);\n\n const drawerFilters = useMemo(() => {\n return listConfig.filters.filter((filter) => {\n if (filter.placement == null) {\n return true;\n }\n return filter.placement === 'drawer' || filter.placement === 'both';\n });\n }, [listConfig.filters]);\n\n const searchFilter = useMemo(() => {\n return quickFilters.find((filter) => {\n return filter.kind === 'text';\n });\n }, [quickFilters]);\n\n const quickFiltersNode = useMemo(() => {\n const visibleQuickFilters = quickFilters.filter((filter) => {\n return filter !== searchFilter;\n });\n\n if (visibleQuickFilters.length === 0) {\n return null;\n }\n\n return (\n <div className={styles.controlsRow}>\n {visibleQuickFilters.map((filter) => {\n return <span key={filter.id}>{renderFilterControl(filter)}</span>;\n })}\n </div>\n );\n }, [quickFilters, renderFilterControl, searchFilter]);\n\n const searchNode = useMemo(() => {\n if (searchFilter == null) {\n return null;\n }\n return renderFilterControl(searchFilter);\n }, [renderFilterControl, searchFilter]);\n\n const sortNode = useMemo(() => {\n if (listConfig.sorts.length === 0) {\n return null;\n }\n const firstSort = listConfig.sorts[0];\n if (firstSort == null) {\n return null;\n }\n const options = listConfig.sorts.map((s) => {\n return { value: s.id, label: resolveLabel(s.label, tApp) };\n });\n return (\n <Select\n options={options}\n value={state.sort ?? firstSort.id}\n size=\"small\"\n aria-label={t('list.sort.label')}\n onValueChange={(next) => {\n pushState({\n ...state,\n sort: next,\n });\n }}\n />\n );\n }, [listConfig.sorts, pushState, state, t, tApp]);\n\n const drawerSections = useMemo(() => {\n if (drawerFilters.length === 0) {\n return [];\n }\n\n const items: { id: string; searchText: string; node: JSX.Element }[] = [];\n\n for (const filter of drawerFilters) {\n const resolvedLabel = resolveLabel(filter.label, tApp);\n items.push({\n id: filter.id,\n searchText: resolvedLabel,\n node: (\n <BackofficeFilterField label={resolvedLabel}>\n {renderFilterControl(filter)}\n </BackofficeFilterField>\n ),\n });\n }\n\n if (items.length === 0) {\n return [];\n }\n\n return [\n {\n id: 'backoffice.filters.sections.default',\n title: t('filters.sections.default'),\n items,\n },\n ];\n }, [drawerFilters, renderFilterControl, t, tApp]);\n\n const resolvedEmptyState = useMemo((): JSX.Element => {\n if (emptyState != null) {\n return emptyState;\n }\n\n if (isLoadingInitial) {\n return (\n <BackofficeTableSkeleton\n variant=\"embedded\"\n ariaLabel={t('common.loading')}\n />\n );\n }\n\n if (chips.length > 0) {\n return (\n <BackofficeEmptyState\n title={t('emptyState.listEmpty.title')}\n description={t('emptyState.listEmptyFiltered.description')}\n actions={\n <Button\n type=\"button\"\n variant=\"soft\"\n size=\"small\"\n onClick={handleClearAll}\n tone=\"neutral\"\n >\n {t('emptyState.listEmptyFiltered.actions.reset')}\n </Button>\n }\n />\n );\n }\n\n return (\n <BackofficeEmptyState\n title={t('emptyState.listEmpty.title')}\n description={t('emptyState.listEmpty.description')}\n />\n );\n }, [chips.length, emptyState, handleClearAll, isLoadingInitial, t]);\n\n const tableFooterMeta = useMemo((): ReactNode => {\n if (loadedCountLabel != null) {\n return loadedCountLabel;\n }\n if (typeof totalCount !== 'number') {\n if (rows.length === 0) {\n return null;\n }\n return (\n <span>\n {t('list.loaded', {\n count: rows.length,\n })}\n </span>\n );\n }\n return (\n <span>\n {t('list.showing', {\n shown: rows.length,\n total: totalCount,\n })}\n </span>\n );\n }, [loadedCountLabel, rows.length, t, totalCount]);\n\n const runtimeConfig = useMemo(() => {\n const resolvedDisplayMode =\n listConfig.ui?.displayMode ?? listConfig.responsive?.mode ?? 'auto';\n return resolveBackofficeListRuntimeConfig({\n kind: listConfig.kind,\n displayMode: resolvedDisplayMode,\n ui: listConfig.ui,\n });\n }, [listConfig.kind, listConfig.responsive?.mode, listConfig.ui]);\n\n const hasKnownRemainingRows =\n typeof totalCount === 'number' && rows.length < totalCount;\n const hasInconsistentPageInfo = hasKnownRemainingRows && !hasNextPage;\n\n useEffect(() => {\n if (\n !hasInconsistentPageInfo ||\n !runtimeConfig.infiniteScroll.showInconsistentPageInfo ||\n !isDevEnv()\n ) {\n return;\n }\n // eslint-disable-next-line no-console\n console.warn(\n 'Backoffice list received inconsistent pageInfo: loaded rows are lower than totalCount but hasNextPage is false.',\n {\n entityId: config.id,\n loadedCount: rows.length,\n totalCount,\n },\n );\n }, [\n config.id,\n hasInconsistentPageInfo,\n rows.length,\n runtimeConfig.infiniteScroll.showInconsistentPageInfo,\n totalCount,\n ]);\n\n const shouldVirtualizeTable =\n props.virtualize === true || runtimeConfig.virtualization.enabled;\n\n const { sentinelRef } = useBackofficeInfiniteScrollSentinel({\n enabled:\n !shouldVirtualizeTable &&\n runtimeConfig.infiniteScroll.enabled &&\n incrementalError == null,\n hasNextPage,\n isLoading: isLoadingMore,\n onIntersect: onLoadMore,\n rootMargin: runtimeConfig.infiniteScroll.rootMargin,\n threshold: runtimeConfig.infiniteScroll.threshold,\n });\n\n const headerTitle = header?.title ?? resolveLabel(listConfig.title, tApp);\n const headerSubtitle = header?.subtitle;\n\n const listMode =\n listConfig.ui?.displayMode ?? listConfig.responsive?.mode ?? 'auto';\n const listDensity =\n listConfig.ui?.density ?? listConfig.responsive?.density ?? 'compact';\n const shouldRenderTableFooter =\n rows.length > 0 || isLoadingMore || hasNextPage;\n const tableFooterNode = shouldRenderTableFooter ? (\n <BackofficeListFooter\n state={\n incrementalError != null && onRetryLoadMore != null\n ? {\n kind: 'error',\n message: incrementalError.message,\n onRetry: onRetryLoadMore,\n }\n : isLoadingMore\n ? { kind: 'loading' }\n : hasNextPage\n ? { kind: 'idle', onLoadMore }\n : { kind: 'end' }\n }\n loadedCount={rows.length}\n totalCount={totalCount}\n labels={{\n loaded: tableFooterMeta,\n loading: t('list.loadMore.loading'),\n end: t('list.loadMore.end'),\n retry: t('list.actions.retry'),\n loadMore: t('list.loadMore.action'),\n }}\n />\n ) : null;\n\n const tableInnerNode = shouldVirtualizeTable ? (\n <VirtualizedConnectionTable\n aria-label={headerTitle}\n columns={columnsWithPrimary}\n rows={rows}\n getRowId={getRowId}\n emptyState={resolvedEmptyState}\n className={denseTableClass}\n gridTemplateColumns={gridTemplateColumns}\n virtualization={{\n enabled: true,\n rowHeightPx: runtimeConfig.virtualization.rowHeightPx,\n overscan: runtimeConfig.virtualization.overscan,\n }}\n infiniteScroll={\n runtimeConfig.infiniteScroll.enabled\n ? {\n enabled: true,\n thresholdPx: runtimeConfig.infiniteScroll.thresholdPx,\n autoLoad: runtimeConfig.infiniteScroll.autoLoad,\n }\n : { enabled: false }\n }\n hasNextPage={hasNextPage}\n totalRowCount={typeof totalCount === 'number' ? totalCount : undefined}\n isLoadingMore={isLoadingMore}\n onLoadMore={incrementalError == null ? onLoadMore : () => {}}\n bodyScrollMode={BACKOFFICE_LIST_BODY_SCROLL_MODE}\n bodyFooterNode={tableFooterNode}\n />\n ) : (\n <ResponsiveRecordList\n aria-label={headerTitle}\n columns={columnsWithPrimary}\n rows={rows}\n getRowId={getRowId}\n emptyState={resolvedEmptyState}\n className={denseTableClass}\n gridTemplateColumns={gridTemplateColumns}\n mode={listMode}\n density={listDensity}\n bodyScrollMode={BACKOFFICE_LIST_BODY_SCROLL_MODE}\n bodyFooterNode={tableFooterNode}\n infiniteScrollSentinelNode={\n runtimeConfig.infiniteScroll.enabled ? (\n <div ref={sentinelRef} aria-hidden=\"true\" />\n ) : null\n }\n />\n );\n\n const tableNodeWithErrorBoundary = (\n <BackofficeErrorBoundary\n fallback={(args: { error: unknown; reset: () => void }) => {\n const { reset } = args;\n\n const retry = (): void => {\n reset();\n if (onRefresh != null) {\n onRefresh();\n }\n };\n\n return (\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={retry}\n tone=\"neutral\"\n >\n {t('list.actions.retry')}\n </Button>\n }\n >\n {t('list.errors.tableFailed')}\n </InlineBanner>\n );\n }}\n >\n {tableInnerNode}\n </BackofficeErrorBoundary>\n );\n\n const filtersBarNode = showFilters ? (\n <BackofficeListFilterToolbar\n stateKey={`backoffice:entity:${config.id}`}\n sections={drawerSections}\n activeFilters={chips}\n onResetFilters={handleClearAll}\n search={searchNode}\n primaryFilters={quickFiltersNode}\n sort={sortNode}\n utilityActions={\n onRefresh == null ? null : (\n <Button\n type=\"button\"\n variant=\"soft\"\n size=\"small\"\n loading={isRefreshing}\n loadingText={t('list.actions.refreshing')}\n onClick={() => {\n onRefresh();\n }}\n tone=\"neutral\"\n >\n {t('list.actions.refresh')}\n </Button>\n )\n }\n density=\"compact\"\n />\n ) : null;\n\n const tableNode = (\n <div\n className={styles.tableHost}\n aria-busy={isRefreshing ? 'true' : undefined}\n >\n {isRefreshing && !isLoadingInitial ? (\n <div className={styles.refreshingIndicator} role=\"status\">\n <Spinner size={14} ariaLabel={t('list.refreshingRows')} />\n <span>{t('list.refreshingRows')}</span>\n </div>\n ) : null}\n {tableNodeWithErrorBoundary}\n <EntityIdPickerDialog\n open={pickerDialog != null}\n entity={pickerDialog?.entity ?? config.id}\n title={pickerDialog?.label ?? t('picker.title')}\n scope={pickerDialog?.scope}\n onOpenChange={(open) => {\n if (!open) setPickerDialog(null);\n }}\n onSelectId={(id) => {\n if (pickerDialog == null) {\n return;\n }\n if (pickerDialog.mode === 'list') {\n const currentIds = pickerDialog.currentIds ?? [];\n const nextIds = currentIds.includes(id)\n ? currentIds\n : [...currentIds, id];\n const nextWhere = setWhereValue(\n state.where,\n pickerDialog.whereKey,\n nextIds,\n pickerDialog.path,\n );\n pushState({ ...state, where: nextWhere });\n return;\n }\n const nextWhere = setWhereValue(\n state.where,\n pickerDialog.whereKey,\n id,\n pickerDialog.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n />\n </div>\n );\n\n if (variant === 'embedded') {\n return (\n <BackofficeListFilterProvider\n config={config}\n state={state}\n pushState={pushState}\n >\n <div className={styles.embeddedContainer}>\n <div className={styles.embeddedHeader}>{headerTitle}</div>\n {filtersBarNode}\n {statusBanner}\n {tableNode}\n </div>\n </BackofficeListFilterProvider>\n );\n }\n\n return (\n <BackofficeListFilterProvider\n config={config}\n state={state}\n pushState={pushState}\n >\n <ListPageTemplate\n headerNode={\n <PageHeader\n title={headerTitle}\n description={headerSubtitle}\n actions={headerActions}\n />\n }\n toolbarNode={filtersBarNode}\n statusNode={statusBanner}\n tableNode={tableNode}\n presentation=\"flat\"\n bodyScrollMode={BACKOFFICE_LIST_BODY_SCROLL_MODE}\n />\n </BackofficeListFilterProvider>\n );\n};\n\nexport default BackofficeEntityListScaffold;\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { tabBody as e, tabs as t } from "./backofficeTabbedDetailShell.css.js";
2
2
  import { jsx as n } from "react/jsx-runtime";
3
- import { NavigationTabs as r } from "@plumile/ui/atomic/molecules/tabs/NavigationTabs.js";
3
+ import { NavigationTabs as r } from "@plumile/ui/tabs";
4
4
  import { DetailPageTemplate as i } from "@plumile/ui/backoffice/templates/detail_page_template/DetailPageTemplate.js";
5
5
  //#region src/components/backoffice/scaffolds/BackofficeTabbedDetailShell.tsx
6
6
  var a = ({ headerNode: a, tabs: o, activeId: s, children: c }) => {
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeTabbedDetailShell.js","names":[],"sources":["../../../../../src/components/backoffice/scaffolds/BackofficeTabbedDetailShell.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\n\nimport {\n NavigationTabs,\n type NavigationTabItem,\n} from '@plumile/ui/atomic/molecules/tabs/NavigationTabs.js';\nimport { DetailPageTemplate } from '@plumile/ui/backoffice/templates/detail_page_template/DetailPageTemplate.js';\n\nimport * as styles from './backofficeTabbedDetailShell.css.js';\n\nexport type BackofficeTabbedDetailShellProps = {\n headerNode: ReactNode;\n tabs?: readonly NavigationTabItem[];\n activeId?: string;\n children: ReactNode;\n};\n\nexport const BackofficeTabbedDetailShell = ({\n headerNode,\n tabs,\n activeId,\n children,\n}: BackofficeTabbedDetailShellProps): JSX.Element => {\n let tabsNode: JSX.Element | null = null;\n if (tabs != null && tabs.length > 1 && activeId != null) {\n tabsNode = (\n <NavigationTabs\n items={tabs}\n activeId={activeId}\n className={styles.tabs}\n />\n );\n }\n\n return (\n <DetailPageTemplate headerNode={headerNode} tabsNode={tabsNode}>\n <div className={styles.tabBody}>{children}</div>\n </DetailPageTemplate>\n );\n};\n\nexport default BackofficeTabbedDetailShell;\n"],"mappings":";;;;;AAiBA,IAAa,KAA+B,EAC1C,eACA,MAAA,GACA,aACA,kBACmD;CACnD,IAAI,IAA+B;CAWnC,OAVI,KAAQ,QAAQ,EAAK,SAAS,KAAK,KAAY,SACjD,IACE,kBAAC,GAAD;EACE,OAAO;EACG;EACV,WAAW;CACZ,CAAA,IAKH,kBAAC,GAAD;EAAgC;EAAsB;EACpD,UAAA,kBAAC,OAAD;GAAK,WAAW;GAAiB;EAAc,CAAA;CAC7B,CAAA;AAExB"}
1
+ {"version":3,"file":"BackofficeTabbedDetailShell.js","names":[],"sources":["../../../../../src/components/backoffice/scaffolds/BackofficeTabbedDetailShell.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\n\nimport { NavigationTabs, type NavigationTabItem } from '@plumile/ui/tabs';\nimport { DetailPageTemplate } from '@plumile/ui/backoffice/templates/detail_page_template/DetailPageTemplate.js';\n\nimport * as styles from './backofficeTabbedDetailShell.css.js';\n\nexport type BackofficeTabbedDetailShellProps = {\n headerNode: ReactNode;\n tabs?: readonly NavigationTabItem[];\n activeId?: string;\n children: ReactNode;\n};\n\nexport const BackofficeTabbedDetailShell = ({\n headerNode,\n tabs,\n activeId,\n children,\n}: BackofficeTabbedDetailShellProps): JSX.Element => {\n let tabsNode: JSX.Element | null = null;\n if (tabs != null && tabs.length > 1 && activeId != null) {\n tabsNode = (\n <NavigationTabs\n items={tabs}\n activeId={activeId}\n className={styles.tabs}\n />\n );\n }\n\n return (\n <DetailPageTemplate headerNode={headerNode} tabsNode={tabsNode}>\n <div className={styles.tabBody}>{children}</div>\n </DetailPageTemplate>\n );\n};\n\nexport default BackofficeTabbedDetailShell;\n"],"mappings":";;;;;AAcA,IAAa,KAA+B,EAC1C,eACA,MAAA,GACA,aACA,kBACmD;CACnD,IAAI,IAA+B;CAWnC,OAVI,KAAQ,QAAQ,EAAK,SAAS,KAAK,KAAY,SACjD,IACE,kBAAC,GAAD;EACE,OAAO;EACG;EACV,WAAW;CACZ,CAAA,IAKH,kBAAC,GAAD;EAAgC;EAAsB;EACpD,UAAA,kBAAC,OAAD;GAAK,WAAW;GAAiB;EAAc,CAAA;CAC7B,CAAA;AAExB"}
@@ -1,5 +1,5 @@
1
1
  //#region src/components/backoffice/scaffolds/backofficeEntityListScaffold.css.ts
2
- var e = "txvbqb5b1 txvbqb1ch txvbqb2cx txvbqb6gz", t = "txvbqbllf txvbqblov txvbqbcwd", n = "txvbqb5b1 txvbqb6bf txvbqb6gz txvbqblor", r = "txvbqb5b1 txvbqb1ch txvbqb2cx txvbqb6gp txvbqbdqn", i = "txvbqb5b1 txvbqb6bf txvbqb6h9", a = "txvbqb5b1 txvbqb6bf txvbqb7tl txvbqbcz5", o = "txvbqb5b1 txvbqb2cx txvbqb6gz txvbqbgb txvbqbift txvbqbj5d txvbqb8fj txvbqblc txvbqbms txvbqbiu txvbqbmw txvbqba4 txvbqbe2 txvbqb6ct txvbqb1om", s = "txvbqb6d3 txvbqb1cs txvbqbe1";
2
+ var e = "txvbqb5lr txvbqb1cu txvbqb2nn txvbqb6rp", t = "txvbqbl9n txvbqbl6d txvbqbd73", n = "txvbqb5lr txvbqb6m5 txvbqb6rp txvbqbl9n", r = "txvbqb5lr txvbqb1cu txvbqb2nn txvbqb6rf txvbqbe1d", i = "txvbqb5lr txvbqb6m5 txvbqb6rz", a = "txvbqb5lr txvbqb6m5 txvbqb84b txvbqbd9v", o = "txvbqb5lr txvbqb2nn txvbqb6rp txvbqbgg txvbqbiqj txvbqbjg3 txvbqb8q9 txvbqblh txvbqbmx txvbqbiz txvbqbn1 txvbqba9 txvbqbe7 txvbqb6nj txvbqb1rl", s = "txvbqb6nt txvbqb1d5 txvbqbe6";
3
3
  //#endregion
4
4
  export { e as controlsRow, i as embeddedContainer, s as embeddedHeader, n as entityIdListFilter, r as entityIdListTags, t as filterInput, o as refreshingIndicator, a as tableHost };
5
5
 
@@ -1 +1 @@
1
- {"version":3,"file":"backofficeEntityListScaffold.css.js","names":[],"sources":["../../../../../src/components/backoffice/scaffolds/backofficeEntityListScaffold.css.ts"],"sourcesContent":["import { sprinkles } from '@plumile/ui/theme/sprinkles.css.js';\n\nexport const controlsRow = sprinkles({\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n gap: 2,\n});\n\nexport const filterInput = sprinkles({\n width: {\n base: 72,\n max767: 'full',\n },\n maxWidth: 'full',\n});\n\nexport const entityIdListFilter = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n width: 'full',\n});\n\nexport const entityIdListTags = sprinkles({\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n gap: 1,\n minWidth: 0,\n});\n\nexport const embeddedContainer = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n});\n\nexport const tableHost = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n height: 'full',\n minHeight: 0,\n});\n\nexport const refreshingIndicator = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n alignSelf: 'flex-start',\n paddingX: 2,\n paddingY: 1,\n marginBottom: 2,\n borderWidth: 'px',\n borderStyle: 'solid',\n borderColor: 'borderSubtle',\n borderRadius: 'md',\n backgroundColor: 'surface',\n color: 'textSecondary',\n fontSize: 'sm',\n lineHeight: 'tight',\n});\n\nexport const embeddedHeader = sprinkles({\n fontSize: 'base',\n fontWeight: 'semibold',\n color: 'text',\n});\n"],"mappings":""}
1
+ {"version":3,"file":"backofficeEntityListScaffold.css.js","names":[],"sources":["../../../../../src/components/backoffice/scaffolds/backofficeEntityListScaffold.css.ts"],"sourcesContent":["import { sprinkles } from '@plumile/ui/theme';\n\nexport const controlsRow = sprinkles({\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n gap: 2,\n});\n\nexport const filterInput = sprinkles({\n width: {\n base: 'full',\n md: 72,\n },\n maxWidth: 'full',\n});\n\nexport const entityIdListFilter = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n width: 'full',\n});\n\nexport const entityIdListTags = sprinkles({\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n gap: 1,\n minWidth: 0,\n});\n\nexport const embeddedContainer = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n});\n\nexport const tableHost = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n height: 'full',\n minHeight: 0,\n});\n\nexport const refreshingIndicator = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n alignSelf: 'flex-start',\n paddingX: 2,\n paddingY: 1,\n marginBottom: 2,\n borderWidth: 'px',\n borderStyle: 'solid',\n borderColor: 'borderSubtle',\n borderRadius: 'md',\n backgroundColor: 'surface',\n color: 'textSecondary',\n fontSize: 'sm',\n lineHeight: 'tight',\n});\n\nexport const embeddedHeader = sprinkles({\n fontSize: 'base',\n fontWeight: 'semibold',\n color: 'text',\n});\n"],"mappings":""}
@@ -1,5 +1,5 @@
1
1
  //#region src/components/backoffice/scaffolds/backofficeTabbedDetailShell.css.ts
2
- var e = "txvbqb5b1", t = "txvbqb5b1 txvbqb6bf txvbqb6hj";
2
+ var e = "txvbqb5lr", t = "txvbqb5lr txvbqb6m5 txvbqb6s9";
3
3
  //#endregion
4
4
  export { t as tabBody, e as tabs };
5
5
 
@@ -1 +1 @@
1
- {"version":3,"file":"backofficeTabbedDetailShell.css.js","names":[],"sources":["../../../../../src/components/backoffice/scaffolds/backofficeTabbedDetailShell.css.ts"],"sourcesContent":["import { sprinkles } from '@plumile/ui/theme/sprinkles.css.js';\n\nexport const tabs = sprinkles({\n display: 'flex',\n});\n\nexport const tabBody = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n});\n"],"mappings":""}
1
+ {"version":3,"file":"backofficeTabbedDetailShell.css.js","names":[],"sources":["../../../../../src/components/backoffice/scaffolds/backofficeTabbedDetailShell.css.ts"],"sourcesContent":["import { sprinkles } from '@plumile/ui/theme';\n\nexport const tabs = sprinkles({\n display: 'flex',\n});\n\nexport const tabBody = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n});\n"],"mappings":""}
@@ -1,8 +1,8 @@
1
1
  import { BackofficeInlineLink as e } from "../links/BackofficeInlineLink.js";
2
2
  import { actionSlot as t, container as n, contentSlot as r, detailIcon as i, detailLink as a, text as o } from "./backofficeFilterableCell.css.js";
3
- import { cx as s } from "@plumile/ui/theme/tools.js";
3
+ import { cx as s } from "@plumile/ui/theme";
4
4
  import { jsx as c, jsxs as l } from "react/jsx-runtime";
5
- import { MarkdownExternalLinkSvg as u } from "@plumile/ui/icons/markdown/MarkdownExternalLinkSvg.js";
5
+ import { MarkdownExternalLinkSvg as u } from "@plumile/ui/icons/MarkdownExternalLinkSvg";
6
6
  //#region src/components/backoffice/shared/BackofficeFilterableCell.tsx
7
7
  var d = ({ filterAction: d, children: f, target: p, title: m, openInNewTab: h = !1, wrap: g = !1, className: _, icon: v = "auto" }) => {
8
8
  let y = /* @__PURE__ */ c("span", {
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeFilterableCell.js","names":[],"sources":["../../../../../src/components/backoffice/shared/BackofficeFilterableCell.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\nimport { MarkdownExternalLinkSvg as ExternalLinkSvg } from '@plumile/ui/icons/markdown/MarkdownExternalLinkSvg.js';\nimport { cx } from '@plumile/ui/theme/tools.js';\n\nimport type { BackofficeEntityManifestMap } from '@plumile/backoffice-core/types.js';\nimport { BackofficeInlineLink } from '../links/BackofficeInlineLink.js';\nimport type { BackofficeLinkTarget } from '../links/types.js';\nimport * as styles from './backofficeFilterableCell.css.js';\n\nexport type BackofficeFilterableCellProps<\n TManifest extends BackofficeEntityManifestMap = BackofficeEntityManifestMap,\n> = {\n filterAction?: ReactNode;\n children: ReactNode;\n target?: BackofficeLinkTarget<TManifest>;\n title?: string;\n openInNewTab?: boolean;\n wrap?: boolean;\n className?: string;\n icon?: 'auto' | 'none';\n};\n\nexport const BackofficeFilterableCell = ({\n filterAction,\n children,\n target,\n title,\n openInNewTab = false,\n wrap = false,\n className,\n icon = 'auto',\n}: BackofficeFilterableCellProps): JSX.Element => {\n const textNode = <span className={styles.text({ wrap })}>{children}</span>;\n\n let contentNode: JSX.Element = (\n <span className={styles.contentSlot}>{textNode}</span>\n );\n if (target != null) {\n contentNode = (\n <BackofficeInlineLink\n target={target}\n className={styles.detailLink}\n title={title}\n openInNewTab={openInNewTab}\n icon={icon}\n endAdornment={(() => {\n if (!openInNewTab) {\n return null;\n }\n return (\n <ExternalLinkSvg className={styles.detailIcon} aria-hidden=\"true\" />\n );\n })()}\n >\n {textNode}\n </BackofficeInlineLink>\n );\n }\n\n return (\n <span className={cx(styles.container, className)}>\n <span className={styles.actionSlot}>{filterAction}</span>\n {contentNode}\n </span>\n );\n};\n\nexport default BackofficeFilterableCell;\n"],"mappings":";;;;;;AAsBA,IAAa,KAA4B,EACvC,iBACA,aACA,WACA,UACA,kBAAe,IACf,UAAO,IACP,cACA,UAAO,aACyC;CAChD,IAAM,IAAW,kBAAC,QAAD;EAAM,WAAW,EAAY,EAAE,QAAK,CAAC;EAAI;CAAe,CAAA,GAErE,IACF,kBAAC,QAAD;EAAM,WAAW;EAAqB,UAAA;CAAe,CAAA;CAwBvD,OAtBI,KAAU,SACZ,IACE,kBAAC,GAAD;EACU;EACR,WAAW;EACJ;EACO;EACR;EACN,cACO,IAIH,kBAAC,GAAD;GAAiB,WAAW;GAAmB,eAAY;EAAQ,CAAA,IAH5D;EAOV,UAAA;CACmB,CAAA,IAKxB,kBAAC,QAAD;EAAM,WAAW,EAAG,GAAkB,CAAS;EAA/C,UAAA,CACE,kBAAC,QAAD;GAAM,WAAW;GAAoB,UAAA;EAAmB,CAAA,GACvD,CACG;;AAEV"}
1
+ {"version":3,"file":"BackofficeFilterableCell.js","names":[],"sources":["../../../../../src/components/backoffice/shared/BackofficeFilterableCell.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\nimport { MarkdownExternalLinkSvg as ExternalLinkSvg } from '@plumile/ui/icons/MarkdownExternalLinkSvg';\nimport { cx } from '@plumile/ui/theme';\n\nimport type { BackofficeEntityManifestMap } from '@plumile/backoffice-core/types.js';\nimport { BackofficeInlineLink } from '../links/BackofficeInlineLink.js';\nimport type { BackofficeLinkTarget } from '../links/types.js';\nimport * as styles from './backofficeFilterableCell.css.js';\n\nexport type BackofficeFilterableCellProps<\n TManifest extends BackofficeEntityManifestMap = BackofficeEntityManifestMap,\n> = {\n filterAction?: ReactNode;\n children: ReactNode;\n target?: BackofficeLinkTarget<TManifest>;\n title?: string;\n openInNewTab?: boolean;\n wrap?: boolean;\n className?: string;\n icon?: 'auto' | 'none';\n};\n\nexport const BackofficeFilterableCell = ({\n filterAction,\n children,\n target,\n title,\n openInNewTab = false,\n wrap = false,\n className,\n icon = 'auto',\n}: BackofficeFilterableCellProps): JSX.Element => {\n const textNode = <span className={styles.text({ wrap })}>{children}</span>;\n\n let contentNode: JSX.Element = (\n <span className={styles.contentSlot}>{textNode}</span>\n );\n if (target != null) {\n contentNode = (\n <BackofficeInlineLink\n target={target}\n className={styles.detailLink}\n title={title}\n openInNewTab={openInNewTab}\n icon={icon}\n endAdornment={(() => {\n if (!openInNewTab) {\n return null;\n }\n return (\n <ExternalLinkSvg className={styles.detailIcon} aria-hidden=\"true\" />\n );\n })()}\n >\n {textNode}\n </BackofficeInlineLink>\n );\n }\n\n return (\n <span className={cx(styles.container, className)}>\n <span className={styles.actionSlot}>{filterAction}</span>\n {contentNode}\n </span>\n );\n};\n\nexport default BackofficeFilterableCell;\n"],"mappings":";;;;;;AAsBA,IAAa,KAA4B,EACvC,iBACA,aACA,WACA,UACA,kBAAe,IACf,UAAO,IACP,cACA,UAAO,aACyC;CAChD,IAAM,IAAW,kBAAC,QAAD;EAAM,WAAW,EAAY,EAAE,QAAK,CAAC;EAAI;CAAe,CAAA,GAErE,IACF,kBAAC,QAAD;EAAM,WAAW;EAAqB,UAAA;CAAe,CAAA;CAwBvD,OAtBI,KAAU,SACZ,IACE,kBAAC,GAAD;EACU;EACR,WAAW;EACJ;EACO;EACR;EACN,cACO,IAIH,kBAAC,GAAD;GAAiB,WAAW;GAAmB,eAAY;EAAQ,CAAA,IAH5D;EAOV,UAAA;CACmB,CAAA,IAKxB,kBAAC,QAAD;EAAM,WAAW,EAAG,GAAkB,CAAS;EAA/C,UAAA,CACE,kBAAC,QAAD;GAAM,WAAW;GAAoB,UAAA;EAAmB,CAAA,GACvD,CACG;;AAEV"}
@@ -1,6 +1,6 @@
1
1
  import { actionSlot as e, container as t, valueSlot as n } from "./backofficeInlineFilterRow.css.js";
2
2
  import { Children as r } from "react";
3
- import { cx as i } from "@plumile/ui/theme/tools.js";
3
+ import { cx as i } from "@plumile/ui/theme";
4
4
  import { jsx as a, jsxs as o } from "react/jsx-runtime";
5
5
  //#region src/components/backoffice/shared/BackofficeInlineFilterRow.tsx
6
6
  var s = ({ children: s, className: c }) => {
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeInlineFilterRow.js","names":[],"sources":["../../../../../src/components/backoffice/shared/BackofficeInlineFilterRow.tsx"],"sourcesContent":["import { Children, type JSX, type ReactNode } from 'react';\n\nimport { cx } from '@plumile/ui/theme/tools.js';\n\nimport * as styles from './backofficeInlineFilterRow.css.js';\n\nexport type BackofficeInlineFilterRowProps = {\n children: ReactNode;\n className?: string;\n};\n\nexport const BackofficeInlineFilterRow = ({\n children,\n className,\n}: BackofficeInlineFilterRowProps): JSX.Element => {\n const childNodes = Children.toArray(children);\n let actionNode: ReactNode = null;\n let valueNodes = childNodes;\n if (childNodes.length > 1) {\n const [firstNode, ...remainingNodes] = childNodes;\n actionNode = firstNode;\n valueNodes = remainingNodes;\n }\n let valueNode: ReactNode = null;\n if (valueNodes.length === 1) {\n const [singleValueNode] = valueNodes;\n valueNode = singleValueNode;\n } else if (valueNodes.length > 1) {\n valueNode = valueNodes;\n }\n\n return (\n <span className={cx(styles.container, className)}>\n <span className={styles.actionSlot}>{actionNode}</span>\n <span className={styles.valueSlot}>{valueNode}</span>\n </span>\n );\n};\n\nexport default BackofficeInlineFilterRow;\n"],"mappings":";;;;;AAWA,IAAa,KAA6B,EACxC,aACA,mBACiD;CACjD,IAAM,IAAa,EAAS,QAAQ,CAAQ,GACxC,IAAwB,MACxB,IAAa;CACjB,IAAI,EAAW,SAAS,GAAG;EACzB,IAAM,CAAC,GAAW,GAAG,KAAkB;EAEvC,AADA,IAAa,GACb,IAAa;CACf;CACA,IAAI,IAAuB;CAC3B,IAAI,EAAW,WAAW,GAAG;EAC3B,IAAM,CAAC,KAAmB;EAC1B,IAAY;CACd,OAAO,AAAI,EAAW,SAAS,MAC7B,IAAY;CAGd,OACE,kBAAC,QAAD;EAAM,WAAW,EAAG,GAAkB,CAAS;EAA/C,UAAA,CACE,kBAAC,QAAD;GAAM,WAAW;GAAoB,UAAA;EAAiB,CAAA,GACtD,kBAAC,QAAD;GAAM,WAAW;GAAmB,UAAA;EAAgB,CAAA,CAChD;;AAEV"}
1
+ {"version":3,"file":"BackofficeInlineFilterRow.js","names":[],"sources":["../../../../../src/components/backoffice/shared/BackofficeInlineFilterRow.tsx"],"sourcesContent":["import { Children, type JSX, type ReactNode } from 'react';\n\nimport { cx } from '@plumile/ui/theme';\n\nimport * as styles from './backofficeInlineFilterRow.css.js';\n\nexport type BackofficeInlineFilterRowProps = {\n children: ReactNode;\n className?: string;\n};\n\nexport const BackofficeInlineFilterRow = ({\n children,\n className,\n}: BackofficeInlineFilterRowProps): JSX.Element => {\n const childNodes = Children.toArray(children);\n let actionNode: ReactNode = null;\n let valueNodes = childNodes;\n if (childNodes.length > 1) {\n const [firstNode, ...remainingNodes] = childNodes;\n actionNode = firstNode;\n valueNodes = remainingNodes;\n }\n let valueNode: ReactNode = null;\n if (valueNodes.length === 1) {\n const [singleValueNode] = valueNodes;\n valueNode = singleValueNode;\n } else if (valueNodes.length > 1) {\n valueNode = valueNodes;\n }\n\n return (\n <span className={cx(styles.container, className)}>\n <span className={styles.actionSlot}>{actionNode}</span>\n <span className={styles.valueSlot}>{valueNode}</span>\n </span>\n );\n};\n\nexport default BackofficeInlineFilterRow;\n"],"mappings":";;;;;AAWA,IAAa,KAA6B,EACxC,aACA,mBACiD;CACjD,IAAM,IAAa,EAAS,QAAQ,CAAQ,GACxC,IAAwB,MACxB,IAAa;CACjB,IAAI,EAAW,SAAS,GAAG;EACzB,IAAM,CAAC,GAAW,GAAG,KAAkB;EAEvC,AADA,IAAa,GACb,IAAa;CACf;CACA,IAAI,IAAuB;CAC3B,IAAI,EAAW,WAAW,GAAG;EAC3B,IAAM,CAAC,KAAmB;EAC1B,IAAY;CACd,OAAO,AAAI,EAAW,SAAS,MAC7B,IAAY;CAGd,OACE,kBAAC,QAAD;EAAM,WAAW,EAAG,GAAkB,CAAS;EAA/C,UAAA,CACE,kBAAC,QAAD;GAAM,WAAW;GAAoB,UAAA;EAAiB,CAAA,GACtD,kBAAC,QAAD;GAAM,WAAW;GAAmB,UAAA;EAAgB,CAAA,CAChD;;AAEV"}
@@ -1,15 +1,15 @@
1
1
  /* empty css */
2
2
  import { c as e } from "../../../node_modules/@vanilla-extract/recipes/dist/createRuntimeFn-62c9670f.esm.js";
3
3
  //#region src/components/backoffice/shared/backofficeFilterableCell.css.ts
4
- var t = "_1q232kj0 txvbqb2cx txvbqb19i txvbqbcwd txvbqbdqn txvbqb7z", n = "txvbqb5bv txvbqb2cx txvbqb8db", r = "txvbqb5bv txvbqb2cx txvbqb6gp txvbqbdqn txvbqbcwd", i = e({
5
- defaultClassName: "_1q232kj1 txvbqbdqn txvbqbcwd",
4
+ var t = "_1q232kj0 txvbqb2nn txvbqb19v txvbqbd73 txvbqbe1d txvbqb84", n = "txvbqb5ml txvbqb2nn txvbqb8o1", r = "txvbqb5ml txvbqb2nn txvbqb6rf txvbqbe1d txvbqbd73", i = e({
5
+ defaultClassName: "_1q232kj1 txvbqbe1d txvbqbd73",
6
6
  variantClassNames: { wrap: {
7
- false: "_1q232kj2 txvbqbet9 txvbqb2b6 txvbqb2bp",
8
- true: "_1q232kj3 txvbqb2bq txvbqb2bb"
7
+ false: "_1q232kj2 txvbqbf3z txvbqb2lw txvbqb2mf",
8
+ true: "_1q232kj3 txvbqb2mg txvbqb2m1"
9
9
  } },
10
10
  defaultVariants: { wrap: !1 },
11
11
  compoundVariants: []
12
- }), a = "_1q232kj4 qbwcuep qbwcuen txvbqb5bv txvbqb2cx txvbqb6gp txvbqbe1 txvbqb3f txvbqb7h txvbqb75 txvbqb7t qbwcueo txvbqbqbd qbwcue0 txvbqbpec txvbqbq8k txvbqbdqn txvbqbcwd txvbqbeo txvbqb1cs txvbqbon5", o = "txvbqb1ce txvbqbe2 txvbqbm23 txvbqb86x";
12
+ }), a = "_1q232kj4 qbwcue10 qbwcuey txvbqb5ml txvbqb2nn txvbqb6rf txvbqbe6 txvbqb3f txvbqb7n txvbqb76 txvbqb7y qbwcuez txvbqbpw9 qbwcue5 qbwcue4 txvbqboz8 txvbqbptg qbwcue3 txvbqbe1d txvbqbd73 txvbqbet txvbqb1d5 txvbqbo81", o = "txvbqb1cr txvbqbe7 txvbqblmz txvbqb8hn";
13
13
  //#endregion
14
14
  export { n as actionSlot, t as container, r as contentSlot, o as detailIcon, a as detailLink, i as text };
15
15
 
@@ -1 +1 @@
1
- {"version":3,"file":"backofficeFilterableCell.css.js","names":[],"sources":["../../../../../src/components/backoffice/shared/backofficeFilterableCell.css.ts"],"sourcesContent":["import { style } from '@vanilla-extract/css';\nimport { recipe } from '@vanilla-extract/recipes';\n\nimport { sprinkles, stateSprinkles } from '@plumile/ui/theme/sprinkles.css.js';\nimport { entityReferenceLink } from '@plumile/ui/theme/styleRecipes.css.js';\n\nexport const container = style([\n sprinkles({\n alignItems: 'center',\n columnGap: 2,\n maxWidth: 'full',\n minWidth: 0,\n verticalAlign: 'middle',\n }),\n {\n display: 'inline-grid',\n gridTemplateColumns: 'auto minmax(0, 1fr)',\n },\n]);\n\nexport const actionSlot = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n});\n\nexport const contentSlot = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n gap: 1,\n minWidth: 0,\n maxWidth: 'full',\n});\n\nexport const text = recipe({\n base: sprinkles({\n minWidth: 0,\n maxWidth: 'full',\n }),\n variants: {\n wrap: {\n false: sprinkles({\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }),\n true: sprinkles({\n whiteSpace: 'normal',\n wordBreak: 'break-word',\n }),\n },\n },\n defaultVariants: {\n wrap: false,\n },\n});\n\nexport const detailLink = style([\n entityReferenceLink,\n sprinkles({\n minWidth: 0,\n maxWidth: 'full',\n color: 'tonePrimaryText',\n fontWeight: 'semibold',\n }),\n stateSprinkles({\n color: { hover: 'text' },\n }),\n]);\n\nexport const detailIcon = sprinkles({\n flexShrink: 0,\n color: 'textSecondary',\n width: 3.5,\n height: 3.5,\n});\n"],"mappings":""}
1
+ {"version":3,"file":"backofficeFilterableCell.css.js","names":[],"sources":["../../../../../src/components/backoffice/shared/backofficeFilterableCell.css.ts"],"sourcesContent":["import { style } from '@vanilla-extract/css';\nimport { recipe } from '@vanilla-extract/recipes';\n\nimport {\n sprinkles,\n stateSprinkles,\n entityReferenceLink,\n} from '@plumile/ui/theme';\n\nexport const container = style([\n sprinkles({\n alignItems: 'center',\n columnGap: 2,\n maxWidth: 'full',\n minWidth: 0,\n verticalAlign: 'middle',\n }),\n {\n display: 'inline-grid',\n gridTemplateColumns: 'auto minmax(0, 1fr)',\n },\n]);\n\nexport const actionSlot = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n});\n\nexport const contentSlot = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n gap: 1,\n minWidth: 0,\n maxWidth: 'full',\n});\n\nexport const text = recipe({\n base: sprinkles({\n minWidth: 0,\n maxWidth: 'full',\n }),\n variants: {\n wrap: {\n false: sprinkles({\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }),\n true: sprinkles({\n whiteSpace: 'normal',\n wordBreak: 'break-word',\n }),\n },\n },\n defaultVariants: {\n wrap: false,\n },\n});\n\nexport const detailLink = style([\n entityReferenceLink,\n sprinkles({\n minWidth: 0,\n maxWidth: 'full',\n color: 'tonePrimaryText',\n fontWeight: 'semibold',\n }),\n stateSprinkles({\n color: { hover: 'text' },\n }),\n]);\n\nexport const detailIcon = sprinkles({\n flexShrink: 0,\n color: 'textSecondary',\n width: 3.5,\n height: 3.5,\n});\n"],"mappings":""}
@@ -1,5 +1,5 @@
1
1
  //#region src/components/backoffice/shared/backofficeInlineFilterRow.css.ts
2
- var e = "txvbqb5bv txvbqb2cx txvbqb6gp txvbqb1cg txvbqbcwd txvbqbdqn txvbqbet9", t = "txvbqb5bv txvbqb2cx txvbqb8db txvbqb1ce", n = "txvbqbdqn txvbqbcwd txvbqbet9 txvbqb2b6 txvbqb2bp";
2
+ var e = "txvbqb5ml txvbqb2nn txvbqb6rf txvbqb1ct txvbqbd73 txvbqbe1d txvbqbf3z", t = "txvbqb5ml txvbqb2nn txvbqb8o1 txvbqb1cr", n = "txvbqbe1d txvbqbd73 txvbqbf3z txvbqb2lw txvbqb2mf";
3
3
  //#endregion
4
4
  export { t as actionSlot, e as container, n as valueSlot };
5
5
 
@@ -1 +1 @@
1
- {"version":3,"file":"backofficeInlineFilterRow.css.js","names":[],"sources":["../../../../../src/components/backoffice/shared/backofficeInlineFilterRow.css.ts"],"sourcesContent":["import { sprinkles } from '@plumile/ui/theme/sprinkles.css.js';\n\nexport const container = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n gap: 1,\n flexWrap: 'nowrap',\n maxWidth: 'full',\n minWidth: 0,\n overflow: 'hidden',\n});\n\nexport const actionSlot = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n});\n\nexport const valueSlot = sprinkles({\n minWidth: 0,\n maxWidth: 'full',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n});\n"],"mappings":""}
1
+ {"version":3,"file":"backofficeInlineFilterRow.css.js","names":[],"sources":["../../../../../src/components/backoffice/shared/backofficeInlineFilterRow.css.ts"],"sourcesContent":["import { sprinkles } from '@plumile/ui/theme';\n\nexport const container = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n gap: 1,\n flexWrap: 'nowrap',\n maxWidth: 'full',\n minWidth: 0,\n overflow: 'hidden',\n});\n\nexport const actionSlot = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n});\n\nexport const valueSlot = sprinkles({\n minWidth: 0,\n maxWidth: 'full',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n});\n"],"mappings":""}
@@ -1,15 +1,15 @@
1
1
  import { panel as e, trigger as t, triggerIcon as n, triggerIconOpen as r, triggerTitle as i } from "./backofficeToolsDocPanel.css.js";
2
2
  import { useId as a, useState as o } from "react";
3
- import { cx as s } from "@plumile/ui/theme/tools.js";
4
- import { jsx as c, jsxs as l } from "react/jsx-runtime";
5
- import { LazyMarkdownCodeBlock as u } from "@plumile/ui/atomic/molecules/markdown/components/LazyMarkdownCodeBlock.js";
6
- import { ChevronDownSvg as d } from "@plumile/ui/icons/ChevronDownSvg.js";
3
+ import { LazyMarkdownCodeBlock as s } from "@plumile/ui";
4
+ import { cx as c } from "@plumile/ui/theme";
5
+ import { jsx as l, jsxs as u } from "react/jsx-runtime";
6
+ import { ChevronDownSvg as d } from "@plumile/ui/icons/ChevronDownSvg";
7
7
  //#region src/components/backoffice/tools/BackofficeToolsDocPanel.tsx
8
8
  var f = ({ title: f, content: p, language: m, badgeLabel: h, defaultOpen: g = !1 }) => {
9
9
  let _ = p.trim(), [v, y] = o(g), b = a();
10
- return _ === "" ? null : /* @__PURE__ */ l("div", {
10
+ return _ === "" ? null : /* @__PURE__ */ u("div", {
11
11
  className: e,
12
- children: [/* @__PURE__ */ l("button", {
12
+ children: [/* @__PURE__ */ u("button", {
13
13
  type: "button",
14
14
  className: t,
15
15
  onClick: () => {
@@ -17,19 +17,19 @@ var f = ({ title: f, content: p, language: m, badgeLabel: h, defaultOpen: g = !1
17
17
  },
18
18
  "aria-expanded": v,
19
19
  "aria-controls": b,
20
- children: [/* @__PURE__ */ c("span", {
20
+ children: [/* @__PURE__ */ l("span", {
21
21
  className: i,
22
22
  children: f
23
- }), /* @__PURE__ */ c(d, {
23
+ }), /* @__PURE__ */ l(d, {
24
24
  width: 16,
25
25
  height: 16,
26
26
  "aria-hidden": "true",
27
- className: s(n, { [r]: v })
27
+ className: c(n, { [r]: v })
28
28
  })]
29
- }), v && /* @__PURE__ */ c("div", {
30
- className: "txvbqb4wb txvbqbms txvbqbpp txvbqba5 txvbqbdqn txvbqb1us txvbqbeux",
29
+ }), v && /* @__PURE__ */ l("div", {
30
+ className: "txvbqb571 txvbqbmx txvbqbps txvbqbaa txvbqbe1d txvbqb20c txvbqbf5n",
31
31
  id: b,
32
- children: /* @__PURE__ */ c(u, {
32
+ children: /* @__PURE__ */ l(s, {
33
33
  code: _,
34
34
  language: m,
35
35
  badgeLabel: h
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeToolsDocPanel.js","names":[],"sources":["../../../../../src/components/backoffice/tools/BackofficeToolsDocPanel.tsx"],"sourcesContent":["import { useId, useState, type JSX } from 'react';\n\nimport { LazyMarkdownCodeBlock } from '@plumile/ui/atomic/molecules/markdown/components/LazyMarkdownCodeBlock.js';\nimport { ChevronDownSvg } from '@plumile/ui/icons/ChevronDownSvg.js';\nimport { cx } from '@plumile/ui/theme/tools.js';\n\nimport * as styles from './backofficeToolsDocPanel.css.js';\n\nexport type BackofficeToolsDocPanelProps = {\n title: string;\n content: string;\n language?: string | null;\n badgeLabel?: string | null;\n defaultOpen?: boolean;\n};\n\nexport const BackofficeToolsDocPanel = ({\n title,\n content,\n language,\n badgeLabel,\n defaultOpen = false,\n}: BackofficeToolsDocPanelProps): JSX.Element | null => {\n const trimmedContent = content.trim();\n const [isOpen, setIsOpen] = useState(defaultOpen);\n const contentId = useId();\n\n if (trimmedContent === '') {\n return null;\n }\n\n return (\n <div className={styles.panel}>\n <button\n type=\"button\"\n className={styles.trigger}\n onClick={() => {\n setIsOpen((prev) => {\n return !prev;\n });\n }}\n aria-expanded={isOpen}\n aria-controls={contentId}\n >\n <span className={styles.triggerTitle}>{title}</span>\n <ChevronDownSvg\n width={16}\n height={16}\n aria-hidden=\"true\"\n className={cx(styles.triggerIcon, {\n [styles.triggerIconOpen]: isOpen,\n })}\n />\n </button>\n {isOpen && (\n <div className={styles.content} id={contentId}>\n <LazyMarkdownCodeBlock\n code={trimmedContent}\n language={language}\n badgeLabel={badgeLabel}\n />\n </div>\n )}\n </div>\n );\n};\n\nexport default BackofficeToolsDocPanel;\n"],"mappings":";;;;;;;AAgBA,IAAa,KAA2B,EACtC,UACA,SAAA,GACA,aACA,eACA,iBAAc,SACwC;CACtD,IAAM,IAAiB,EAAQ,KAAK,GAC9B,CAAC,GAAQ,KAAa,EAAS,CAAW,GAC1C,IAAY,EAAM;CAMxB,OAJI,MAAmB,KACd,OAIP,kBAAC,OAAD;EAAK,WAAW;EAAhB,UAAA,CACE,kBAAC,UAAD;GACE,MAAK;GACL,WAAW;GACX,eAAe;IACb,GAAW,MACF,CAAC,CACT;GACH;GACA,iBAAe;GACf,iBAAe;GATjB,UAAA,CAWE,kBAAC,QAAD;IAAM,WAAW;IAAsB,UAAA;GAAY,CAAA,GACnD,kBAAC,GAAD;IACE,OAAO;IACP,QAAQ;IACR,eAAY;IACZ,WAAW,EAAG,GAAoB,GAC/B,IAAyB,EAC5B,CAAC;GACF,CAAA,CACK;EACP,CAAA,GAAA,KACC,kBAAC,OAAD;GAAK,WAAW;GAAgB,IAAI;GAClC,UAAA,kBAAC,GAAD;IACE,MAAM;IACI;IACE;GACb,CAAA;EACE,CAAA,CAEJ;;AAET"}
1
+ {"version":3,"file":"BackofficeToolsDocPanel.js","names":[],"sources":["../../../../../src/components/backoffice/tools/BackofficeToolsDocPanel.tsx"],"sourcesContent":["import { useId, useState, type JSX } from 'react';\n\nimport { LazyMarkdownCodeBlock } from '@plumile/ui';\nimport { ChevronDownSvg } from '@plumile/ui/icons/ChevronDownSvg';\nimport { cx } from '@plumile/ui/theme';\n\nimport * as styles from './backofficeToolsDocPanel.css.js';\n\nexport type BackofficeToolsDocPanelProps = {\n title: string;\n content: string;\n language?: string | null;\n badgeLabel?: string | null;\n defaultOpen?: boolean;\n};\n\nexport const BackofficeToolsDocPanel = ({\n title,\n content,\n language,\n badgeLabel,\n defaultOpen = false,\n}: BackofficeToolsDocPanelProps): JSX.Element | null => {\n const trimmedContent = content.trim();\n const [isOpen, setIsOpen] = useState(defaultOpen);\n const contentId = useId();\n\n if (trimmedContent === '') {\n return null;\n }\n\n return (\n <div className={styles.panel}>\n <button\n type=\"button\"\n className={styles.trigger}\n onClick={() => {\n setIsOpen((prev) => {\n return !prev;\n });\n }}\n aria-expanded={isOpen}\n aria-controls={contentId}\n >\n <span className={styles.triggerTitle}>{title}</span>\n <ChevronDownSvg\n width={16}\n height={16}\n aria-hidden=\"true\"\n className={cx(styles.triggerIcon, {\n [styles.triggerIconOpen]: isOpen,\n })}\n />\n </button>\n {isOpen && (\n <div className={styles.content} id={contentId}>\n <LazyMarkdownCodeBlock\n code={trimmedContent}\n language={language}\n badgeLabel={badgeLabel}\n />\n </div>\n )}\n </div>\n );\n};\n\nexport default BackofficeToolsDocPanel;\n"],"mappings":";;;;;;;AAgBA,IAAa,KAA2B,EACtC,UACA,SAAA,GACA,aACA,eACA,iBAAc,SACwC;CACtD,IAAM,IAAiB,EAAQ,KAAK,GAC9B,CAAC,GAAQ,KAAa,EAAS,CAAW,GAC1C,IAAY,EAAM;CAMxB,OAJI,MAAmB,KACd,OAIP,kBAAC,OAAD;EAAK,WAAW;EAAhB,UAAA,CACE,kBAAC,UAAD;GACE,MAAK;GACL,WAAW;GACX,eAAe;IACb,GAAW,MACF,CAAC,CACT;GACH;GACA,iBAAe;GACf,iBAAe;GATjB,UAAA,CAWE,kBAAC,QAAD;IAAM,WAAW;IAAsB,UAAA;GAAY,CAAA,GACnD,kBAAC,GAAD;IACE,OAAO;IACP,QAAQ;IACR,eAAY;IACZ,WAAW,EAAG,GAAoB,GAC/B,IAAyB,EAC5B,CAAC;GACF,CAAA,CACK;EACP,CAAA,GAAA,KACC,kBAAC,OAAD;GAAK,WAAW;GAAgB,IAAI;GAClC,UAAA,kBAAC,GAAD;IACE,MAAM;IACI;IACE;GACb,CAAA;EACE,CAAA,CAEJ;;AAET"}
@@ -1,6 +1,6 @@
1
1
  import { Fragment as e, jsx as t, jsxs as n } from "react/jsx-runtime";
2
2
  import { useTranslation as r } from "react-i18next";
3
- import { Button as i } from "@plumile/ui/atomic/atoms/button/Button.js";
3
+ import { Button as i } from "@plumile/ui/button";
4
4
  import { BackofficeDetailSection as a } from "@plumile/ui/backoffice/molecules/backoffice_detail_section/BackofficeDetailSection.js";
5
5
  import { BackofficePayloadViewer as o } from "@plumile/ui/backoffice/molecules/backoffice_payload_viewer/BackofficePayloadViewer.js";
6
6
  //#region src/components/backoffice/tools/BackofficeToolsErrorFallback.tsx
@@ -31,9 +31,10 @@ var s = (e) => {
31
31
  }],
32
32
  children: /* @__PURE__ */ t(i, {
33
33
  type: "button",
34
- variant: "secondary",
34
+ variant: "soft",
35
35
  size: "small",
36
36
  onClick: l,
37
+ tone: "neutral",
37
38
  children: u("common.actions.retry")
38
39
  })
39
40
  }), p != null && /* @__PURE__ */ t(a, {
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeToolsErrorFallback.js","names":[],"sources":["../../../../../src/components/backoffice/tools/BackofficeToolsErrorFallback.tsx"],"sourcesContent":["import { type JSX } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { Button } from '@plumile/ui/atomic/atoms/button/Button.js';\nimport { BackofficeDetailSection } from '@plumile/ui/backoffice/molecules/backoffice_detail_section/BackofficeDetailSection.js';\nimport { BackofficePayloadViewer } from '@plumile/ui/backoffice/molecules/backoffice_payload_viewer/BackofficePayloadViewer.js';\n\nexport type BackofficeToolsErrorFallbackProps = {\n error: unknown;\n onRetry: () => void;\n};\n\nconst resolveErrorDetails = (error: unknown): string | null => {\n if (error instanceof Error) {\n if (error.stack != null && error.stack.trim() !== '') {\n return error.stack;\n }\n if (error.name !== '' && error.message !== '') {\n return `${error.name}: ${error.message}`;\n }\n if (error.message !== '') {\n return error.message;\n }\n return null;\n }\n\n if (typeof error === 'string') {\n return error;\n }\n\n try {\n return JSON.stringify(error, null, 2);\n } catch {\n return String(error);\n }\n};\n\nexport const BackofficeToolsErrorFallback = ({\n error,\n onRetry,\n}: BackofficeToolsErrorFallbackProps): JSX.Element => {\n const { t } = useTranslation('backofficeReact');\n let message = t('tools.errors.unknown');\n if (error instanceof Error) {\n message = error.message;\n }\n const details = resolveErrorDetails(error);\n let detailsContent: string | null = null;\n if (details != null) {\n const trimmed = details.trim();\n if (trimmed !== '' && trimmed !== message) {\n detailsContent = `\\`\\`\\`\\n${trimmed}\\n\\`\\`\\``;\n }\n }\n\n return (\n <>\n <BackofficeDetailSection\n title={t('tools.errors.title')}\n description={t('tools.errors.description')}\n items={[\n {\n id: 'error',\n label: t('tools.errors.label'),\n size: 'fluid',\n value: message,\n },\n ]}\n >\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n onClick={onRetry}\n >\n {t('common.actions.retry')}\n </Button>\n </BackofficeDetailSection>\n {detailsContent != null && (\n <BackofficeDetailSection title={t('tools.errors.details')}>\n <BackofficePayloadViewer content={detailsContent} format=\"markdown\" />\n </BackofficeDetailSection>\n )}\n </>\n );\n};\n\nexport default BackofficeToolsErrorFallback;\n"],"mappings":";;;;;;AAYA,IAAM,KAAuB,MAAkC;CAC7D,IAAI,aAAiB,OAUnB,OATI,EAAM,SAAS,QAAQ,EAAM,MAAM,KAAK,MAAM,KACzC,EAAM,QAEX,EAAM,SAAS,MAAM,EAAM,YAAY,KAClC,GAAG,EAAM,KAAK,IAAI,EAAM,YAE7B,EAAM,YAAY,KAGf,OAFE,EAAM;CAKjB,IAAI,OAAO,KAAU,UACnB,OAAO;CAGT,IAAI;EACF,OAAO,KAAK,UAAU,GAAO,MAAM,CAAC;CACtC,QAAQ;EACN,OAAO,OAAO,CAAK;CACrB;AACF,GAEa,KAAgC,EAC3C,UACA,iBACoD;CACpD,IAAM,EAAE,SAAM,EAAe,iBAAiB,GAC1C,IAAU,EAAE,sBAAsB;CACtC,AAAI,aAAiB,UACnB,IAAU,EAAM;CAElB,IAAM,IAAU,EAAoB,CAAK,GACrC,IAAgC;CACpC,IAAI,KAAW,MAAM;EACnB,IAAM,IAAU,EAAQ,KAAK;EAC7B,AAAI,MAAY,MAAM,MAAY,MAChC,IAAiB,WAAW,EAAQ;CAExC;CAEA,OACE,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD;EACE,OAAO,EAAE,oBAAoB;EAC7B,aAAa,EAAE,0BAA0B;EACzC,OAAO,CACL;GACE,IAAI;GACJ,OAAO,EAAE,oBAAoB;GAC7B,MAAM;GACN,OAAO;EACT,CACF;EAEA,UAAA,kBAAC,GAAD;GACE,MAAK;GACL,SAAQ;GACR,MAAK;GACL,SAAS;GAER,UAAA,EAAE,sBAAsB;EACnB,CAAA;CACe,CAAA,GACxB,KAAkB,QACjB,kBAAC,GAAD;EAAyB,OAAO,EAAE,sBAAsB;EACtD,UAAA,kBAAC,GAAD;GAAyB,SAAS;GAAgB,QAAO;EAAY,CAAA;CAC9C,CAAA,CAE3B,EAAA,CAAA;AAEN"}
1
+ {"version":3,"file":"BackofficeToolsErrorFallback.js","names":[],"sources":["../../../../../src/components/backoffice/tools/BackofficeToolsErrorFallback.tsx"],"sourcesContent":["import { type JSX } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { Button } from '@plumile/ui/button';\nimport { BackofficeDetailSection } from '@plumile/ui/backoffice/molecules/backoffice_detail_section/BackofficeDetailSection.js';\nimport { BackofficePayloadViewer } from '@plumile/ui/backoffice/molecules/backoffice_payload_viewer/BackofficePayloadViewer.js';\n\nexport type BackofficeToolsErrorFallbackProps = {\n error: unknown;\n onRetry: () => void;\n};\n\nconst resolveErrorDetails = (error: unknown): string | null => {\n if (error instanceof Error) {\n if (error.stack != null && error.stack.trim() !== '') {\n return error.stack;\n }\n if (error.name !== '' && error.message !== '') {\n return `${error.name}: ${error.message}`;\n }\n if (error.message !== '') {\n return error.message;\n }\n return null;\n }\n\n if (typeof error === 'string') {\n return error;\n }\n\n try {\n return JSON.stringify(error, null, 2);\n } catch {\n return String(error);\n }\n};\n\nexport const BackofficeToolsErrorFallback = ({\n error,\n onRetry,\n}: BackofficeToolsErrorFallbackProps): JSX.Element => {\n const { t } = useTranslation('backofficeReact');\n let message = t('tools.errors.unknown');\n if (error instanceof Error) {\n message = error.message;\n }\n const details = resolveErrorDetails(error);\n let detailsContent: string | null = null;\n if (details != null) {\n const trimmed = details.trim();\n if (trimmed !== '' && trimmed !== message) {\n detailsContent = `\\`\\`\\`\\n${trimmed}\\n\\`\\`\\``;\n }\n }\n\n return (\n <>\n <BackofficeDetailSection\n title={t('tools.errors.title')}\n description={t('tools.errors.description')}\n items={[\n {\n id: 'error',\n label: t('tools.errors.label'),\n size: 'fluid',\n value: message,\n },\n ]}\n >\n <Button\n type=\"button\"\n variant=\"soft\"\n size=\"small\"\n onClick={onRetry}\n tone=\"neutral\"\n >\n {t('common.actions.retry')}\n </Button>\n </BackofficeDetailSection>\n {detailsContent != null && (\n <BackofficeDetailSection title={t('tools.errors.details')}>\n <BackofficePayloadViewer content={detailsContent} format=\"markdown\" />\n </BackofficeDetailSection>\n )}\n </>\n );\n};\n\nexport default BackofficeToolsErrorFallback;\n"],"mappings":";;;;;;AAYA,IAAM,KAAuB,MAAkC;CAC7D,IAAI,aAAiB,OAUnB,OATI,EAAM,SAAS,QAAQ,EAAM,MAAM,KAAK,MAAM,KACzC,EAAM,QAEX,EAAM,SAAS,MAAM,EAAM,YAAY,KAClC,GAAG,EAAM,KAAK,IAAI,EAAM,YAE7B,EAAM,YAAY,KAGf,OAFE,EAAM;CAKjB,IAAI,OAAO,KAAU,UACnB,OAAO;CAGT,IAAI;EACF,OAAO,KAAK,UAAU,GAAO,MAAM,CAAC;CACtC,QAAQ;EACN,OAAO,OAAO,CAAK;CACrB;AACF,GAEa,KAAgC,EAC3C,UACA,iBACoD;CACpD,IAAM,EAAE,SAAM,EAAe,iBAAiB,GAC1C,IAAU,EAAE,sBAAsB;CACtC,AAAI,aAAiB,UACnB,IAAU,EAAM;CAElB,IAAM,IAAU,EAAoB,CAAK,GACrC,IAAgC;CACpC,IAAI,KAAW,MAAM;EACnB,IAAM,IAAU,EAAQ,KAAK;EAC7B,AAAI,MAAY,MAAM,MAAY,MAChC,IAAiB,WAAW,EAAQ;CAExC;CAEA,OACE,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD;EACE,OAAO,EAAE,oBAAoB;EAC7B,aAAa,EAAE,0BAA0B;EACzC,OAAO,CACL;GACE,IAAI;GACJ,OAAO,EAAE,oBAAoB;GAC7B,MAAM;GACN,OAAO;EACT,CACF;EAEA,UAAA,kBAAC,GAAD;GACE,MAAK;GACL,SAAQ;GACR,MAAK;GACL,SAAS;GACT,MAAK;GAEJ,UAAA,EAAE,sBAAsB;EACnB,CAAA;CACe,CAAA,GACxB,KAAkB,QACjB,kBAAC,GAAD;EAAyB,OAAO,EAAE,sBAAsB;EACtD,UAAA,kBAAC,GAAD;GAAyB,SAAS;GAAgB,QAAO;EAAY,CAAA;CAC9C,CAAA,CAE3B,EAAA,CAAA;AAEN"}