@plumile/backoffice-react 0.1.103 → 0.1.105

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 (228) hide show
  1. package/lib/esm/{AcceptInvitationScreen-B1IPafwD.js → AcceptInvitationScreen-VaWXQPHp.js} +4 -4
  2. package/lib/esm/AcceptInvitationScreen-VaWXQPHp.js.map +1 -0
  3. package/lib/esm/{BackofficeAcceptInvitationPage-BfRsORii.js → BackofficeAcceptInvitationPage-tpfBfhT9.js} +4 -4
  4. package/lib/esm/{BackofficeAcceptInvitationPage-BfRsORii.js.map → BackofficeAcceptInvitationPage-tpfBfhT9.js.map} +1 -1
  5. package/lib/esm/BackofficeDashboardPage-D5W36DY-.js +329 -0
  6. package/lib/esm/BackofficeDashboardPage-D5W36DY-.js.map +1 -0
  7. package/lib/esm/BackofficeDetailPayload-CZcsDv2w.js +98 -0
  8. package/lib/esm/BackofficeDetailPayload-CZcsDv2w.js.map +1 -0
  9. package/lib/esm/BackofficeEntityActionFormDialog-DrZxuytz.js +589 -0
  10. package/lib/esm/BackofficeEntityActionFormDialog-DrZxuytz.js.map +1 -0
  11. package/lib/esm/{BackofficeEntityDetailLayoutContext-DeuH5PCW.js → BackofficeEntityDetailLayoutContext-C5G-PH28.js} +1 -1
  12. package/lib/esm/{BackofficeEntityDetailLayoutContext-DeuH5PCW.js.map → BackofficeEntityDetailLayoutContext-C5G-PH28.js.map} +1 -1
  13. package/lib/esm/{BackofficeEntityDetailLayoutPage-Duc_DcIV.js → BackofficeEntityDetailLayoutPage-BSgGBzSL.js} +2 -2
  14. package/lib/esm/{BackofficeEntityDetailLayoutPage-Duc_DcIV.js.map → BackofficeEntityDetailLayoutPage-BSgGBzSL.js.map} +1 -1
  15. package/lib/esm/{BackofficeEntityDetailPage-ChxBrqz8.js → BackofficeEntityDetailPage-LB1uEJVM.js} +366 -358
  16. package/lib/esm/BackofficeEntityDetailPage-LB1uEJVM.js.map +1 -0
  17. package/lib/esm/{BackofficeEntityDetailUnknownPageRedirect-xupMeril.js → BackofficeEntityDetailUnknownPageRedirect-Iu4R3WvX.js} +3 -3
  18. package/lib/esm/{BackofficeEntityDetailUnknownPageRedirect-xupMeril.js.map → BackofficeEntityDetailUnknownPageRedirect-Iu4R3WvX.js.map} +1 -1
  19. package/lib/esm/BackofficeEntityListPage-D_zL-qRb.js +432 -0
  20. package/lib/esm/BackofficeEntityListPage-D_zL-qRb.js.map +1 -0
  21. package/lib/esm/BackofficeHubPage-DOePQ8Fc.js +121 -0
  22. package/lib/esm/BackofficeHubPage-DOePQ8Fc.js.map +1 -0
  23. package/lib/esm/BackofficeHubTemplate-C6K55egX.js +82 -0
  24. package/lib/esm/BackofficeHubTemplate-C6K55egX.js.map +1 -0
  25. package/lib/esm/{BackofficeLayoutPage-r6dXo9SI.js → BackofficeLayoutPage-Bq2bKkYF.js} +301 -217
  26. package/lib/esm/BackofficeLayoutPage-Bq2bKkYF.js.map +1 -0
  27. package/lib/esm/BackofficeListToolbar-loFfIPtP.js +109 -0
  28. package/lib/esm/BackofficeListToolbar-loFfIPtP.js.map +1 -0
  29. package/lib/esm/{BackofficeLoginPage-BMPhO1cr.js → BackofficeLoginPage-DIlcOueK.js} +5 -5
  30. package/lib/esm/{BackofficeLoginPage-BMPhO1cr.js.map → BackofficeLoginPage-DIlcOueK.js.map} +1 -1
  31. package/lib/esm/{BackofficePasswordResetCompletePage-OApMUiOi.js → BackofficePasswordResetCompletePage-Cit5sdDm.js} +6 -7
  32. package/lib/esm/{BackofficePasswordResetCompletePage-OApMUiOi.js.map → BackofficePasswordResetCompletePage-Cit5sdDm.js.map} +1 -1
  33. package/lib/esm/{BackofficePasswordResetRequestPage-DPDImb37.js → BackofficePasswordResetRequestPage-B_TurHev.js} +5 -6
  34. package/lib/esm/{BackofficePasswordResetRequestPage-DPDImb37.js.map → BackofficePasswordResetRequestPage-B_TurHev.js.map} +1 -1
  35. package/lib/esm/{BackofficePermissionsContext-CmWwudBU.js → BackofficePermissionsContext-C2bdxy2z.js} +1 -1
  36. package/lib/esm/{BackofficePermissionsContext-CmWwudBU.js.map → BackofficePermissionsContext-C2bdxy2z.js.map} +1 -1
  37. package/lib/esm/BackofficeRightPageLayout-CfNkrMvH.js +83 -0
  38. package/lib/esm/BackofficeRightPageLayout-CfNkrMvH.js.map +1 -0
  39. package/lib/esm/{BackofficeTopbarPortalContext-CphoSrZD.js → BackofficeTopbarPortalContext-Da5XFatM.js} +1 -1
  40. package/lib/esm/BackofficeTopbarPortalContext-Da5XFatM.js.map +1 -0
  41. package/lib/esm/{BackofficeVerifyEmailPage-DHuSOxDf.js → BackofficeVerifyEmailPage-DQbFIob1.js} +6 -7
  42. package/lib/esm/{BackofficeVerifyEmailPage-DHuSOxDf.js.map → BackofficeVerifyEmailPage-DQbFIob1.js.map} +1 -1
  43. package/lib/esm/EntityIdPickerDialog-BSn0v3bv.js +340 -0
  44. package/lib/esm/EntityIdPickerDialog-BSn0v3bv.js.map +1 -0
  45. package/lib/esm/LazyBackofficeEntityActionFormDialog-oRd_WHAK.js +670 -0
  46. package/lib/esm/LazyBackofficeEntityActionFormDialog-oRd_WHAK.js.map +1 -0
  47. package/lib/esm/backoffice-react.js +553 -315
  48. package/lib/esm/backoffice-react.js.map +1 -1
  49. package/lib/esm/{backofficeAuthPaths-2KMmkBLv.js → backofficeAuthPaths-2hHNn8D3.js} +1 -1
  50. package/lib/esm/{backofficeAuthPaths-2KMmkBLv.js.map → backofficeAuthPaths-2hHNn8D3.js.map} +1 -1
  51. package/lib/esm/backofficeEntityActionFormDialog.css-DJgEKwaA.js +6 -0
  52. package/lib/esm/backofficeEntityActionFormDialog.css-DJgEKwaA.js.map +1 -0
  53. package/lib/esm/{buildBreadcrumbs-C9cyiXb7.js → buildBreadcrumbs-C5St167Y.js} +1 -1
  54. package/lib/esm/buildBreadcrumbs-C5St167Y.js.map +1 -0
  55. package/lib/esm/{buildDataTableColumns-DGPjPK4N.js → buildDataTableColumns-DdmF-EYq.js} +1 -1
  56. package/lib/esm/{buildDataTableColumns-DGPjPK4N.js.map → buildDataTableColumns-DdmF-EYq.js.map} +1 -1
  57. package/lib/esm/{mutationResult-CcQMY13J.js → mutationResult-C2Vb_vPt.js} +1 -1
  58. package/lib/esm/{mutationResult-CcQMY13J.js.map → mutationResult-C2Vb_vPt.js.map} +1 -1
  59. package/lib/esm/{pageResolution-hAQA5C6S.js → pageResolution-CUaTq4Ql.js} +1 -1
  60. package/lib/esm/{pageResolution-hAQA5C6S.js.map → pageResolution-CUaTq4Ql.js.map} +1 -1
  61. package/lib/esm/{sidebarUtils-BZETlHea.js → sidebarUtils-BgCBLJLv.js} +20 -6
  62. package/lib/esm/sidebarUtils-BgCBLJLv.js.map +1 -0
  63. package/lib/esm/style.css +1 -1
  64. package/lib/esm/{synchronizeAuthStatusQuery-BoPKMrP1.js → synchronizeAuthStatusQuery-DNJR5MfH.js} +8 -9
  65. package/lib/esm/synchronizeAuthStatusQuery-DNJR5MfH.js.map +1 -0
  66. package/lib/esm/{toastViewAction-DJkv_4p9.js → toastViewAction-DQYlcGOL.js} +1 -1
  67. package/lib/esm/{toastViewAction-DJkv_4p9.js.map → toastViewAction-DQYlcGOL.js.map} +1 -1
  68. package/lib/esm/{useAuth-CheTnq60.js → useAuth-CWf8ZspF.js} +70 -66
  69. package/lib/esm/useAuth-CWf8ZspF.js.map +1 -0
  70. package/lib/esm/{useBackofficeAuth-DVAXNAjP.js → useBackofficeAuth-Da7FPNys.js} +2 -2
  71. package/lib/esm/{useBackofficeAuth-DVAXNAjP.js.map → useBackofficeAuth-Da7FPNys.js.map} +1 -1
  72. package/lib/esm/{useBackofficeLazyValue-CoIAK-5N.js → useBackofficeLazyValue-CW9xfRzQ.js} +1 -1
  73. package/lib/esm/{useBackofficeLazyValue-CoIAK-5N.js.map → useBackofficeLazyValue-CW9xfRzQ.js.map} +1 -1
  74. package/lib/esm/{useBackofficeListUrlState-D4fx5O7u.js → useBackofficeListUrlState-Ca6d7uIN.js} +1 -1
  75. package/lib/esm/useBackofficeListUrlState-Ca6d7uIN.js.map +1 -0
  76. package/lib/types/auth/login/LoginFlow.d.ts.map +1 -1
  77. package/lib/types/auth/login/MfaChallengeForm.d.ts.map +1 -1
  78. package/lib/types/auth/login/PasskeyLoginForm.d.ts.map +1 -1
  79. package/lib/types/auth/pages/AcceptInvitationScreen.d.ts.map +1 -1
  80. package/lib/types/components/backoffice/actions/BackofficeEntityActionFormDialog.d.ts.map +1 -1
  81. package/lib/types/components/backoffice/actions/LazyBackofficeEntityActionFormDialog.d.ts.map +1 -1
  82. package/lib/types/components/backoffice/actions/backofficeEntityActionFormDialog.css.d.ts +4 -0
  83. package/lib/types/components/backoffice/actions/backofficeEntityActionFormDialog.css.d.ts.map +1 -1
  84. package/lib/types/components/backoffice/detail/BackofficeDetailRelationLink.d.ts +3 -5
  85. package/lib/types/components/backoffice/detail/BackofficeDetailRelationLink.d.ts.map +1 -1
  86. package/lib/types/components/backoffice/detail/BackofficeDetailRelationListBlock.d.ts +3 -4
  87. package/lib/types/components/backoffice/detail/BackofficeDetailRelationListBlock.d.ts.map +1 -1
  88. package/lib/types/components/backoffice/detail/BackofficeDetailSection.d.ts.map +1 -1
  89. package/lib/types/components/backoffice/detail/backofficeDetailField.css.d.ts +1 -0
  90. package/lib/types/components/backoffice/detail/backofficeDetailField.css.d.ts.map +1 -1
  91. package/lib/types/components/backoffice/detail/backofficeDetailLayout.css.d.ts.map +1 -1
  92. package/lib/types/components/backoffice/detail/backofficeDetailRelationLink.css.d.ts +2 -0
  93. package/lib/types/components/backoffice/detail/backofficeDetailRelationLink.css.d.ts.map +1 -1
  94. package/lib/types/components/backoffice/filters/BackofficeFilterAction.d.ts +4 -4
  95. package/lib/types/components/backoffice/filters/BackofficeFilterAction.d.ts.map +1 -1
  96. package/lib/types/components/backoffice/filters/DeferredFilterSearchInput.d.ts +13 -0
  97. package/lib/types/components/backoffice/filters/DeferredFilterSearchInput.d.ts.map +1 -0
  98. package/lib/types/components/backoffice/filters/EntityIdFilterField.d.ts +4 -0
  99. package/lib/types/components/backoffice/filters/EntityIdFilterField.d.ts.map +1 -1
  100. package/lib/types/components/backoffice/filters/deferredFilterSearchInput.css.d.ts +3 -0
  101. package/lib/types/components/backoffice/filters/deferredFilterSearchInput.css.d.ts.map +1 -0
  102. package/lib/types/components/backoffice/filters/entityIdFilterField.css.d.ts +3 -0
  103. package/lib/types/components/backoffice/filters/entityIdFilterField.css.d.ts.map +1 -1
  104. package/lib/types/components/backoffice/hub/BackofficeHubTemplate.d.ts +36 -0
  105. package/lib/types/components/backoffice/hub/BackofficeHubTemplate.d.ts.map +1 -0
  106. package/lib/types/{pages/backofficeHubPage.css.d.ts → components/backoffice/hub/backofficeHubTemplate.css.d.ts} +5 -3
  107. package/lib/types/components/backoffice/hub/backofficeHubTemplate.css.d.ts.map +1 -0
  108. package/lib/types/components/backoffice/layout/breadcrumb/BackofficeTopbarBreadcrumb.d.ts.map +1 -1
  109. package/lib/types/components/backoffice/layout/breadcrumb/BackofficeTopbarPortalContext.d.ts +2 -0
  110. package/lib/types/components/backoffice/layout/breadcrumb/BackofficeTopbarPortalContext.d.ts.map +1 -1
  111. package/lib/types/components/backoffice/layout/breadcrumb/backofficeTopbarBreadcrumb.css.d.ts +3 -0
  112. package/lib/types/components/backoffice/layout/breadcrumb/backofficeTopbarBreadcrumb.css.d.ts.map +1 -1
  113. package/lib/types/components/backoffice/layout/breadcrumb/buildBreadcrumbs.d.ts +2 -2
  114. package/lib/types/components/backoffice/layout/breadcrumb/buildBreadcrumbs.d.ts.map +1 -1
  115. package/lib/types/components/backoffice/layout/buildSidebarSections.d.ts +1 -0
  116. package/lib/types/components/backoffice/layout/buildSidebarSections.d.ts.map +1 -1
  117. package/lib/types/components/backoffice/layout/sidebarUtils.d.ts +2 -1
  118. package/lib/types/components/backoffice/layout/sidebarUtils.d.ts.map +1 -1
  119. package/lib/types/components/backoffice/lists/BackofficeListToolbar.d.ts +16 -0
  120. package/lib/types/components/backoffice/lists/BackofficeListToolbar.d.ts.map +1 -0
  121. package/lib/types/components/backoffice/lists/backofficeListToolbar.css.d.ts +16 -0
  122. package/lib/types/components/backoffice/lists/backofficeListToolbar.css.d.ts.map +1 -0
  123. package/lib/types/components/backoffice/pickers/EntityIdPickerDialog.d.ts +1 -1
  124. package/lib/types/components/backoffice/pickers/EntityIdPickerDialog.d.ts.map +1 -1
  125. package/lib/types/components/backoffice/pickers/entityIdPickerDialog.css.d.ts +2 -0
  126. package/lib/types/components/backoffice/pickers/entityIdPickerDialog.css.d.ts.map +1 -1
  127. package/lib/types/components/backoffice/pickers/shared/EntityPickerList.d.ts.map +1 -1
  128. package/lib/types/components/backoffice/pickers/shared/EntityPickerShell.d.ts.map +1 -1
  129. package/lib/types/components/backoffice/pickers/types.d.ts +1 -1
  130. package/lib/types/components/backoffice/pickers/types.d.ts.map +1 -1
  131. package/lib/types/components/backoffice/refs/BackofficeEntityIdRef.d.ts +4 -4
  132. package/lib/types/components/backoffice/refs/BackofficeEntityIdRef.d.ts.map +1 -1
  133. package/lib/types/components/backoffice/refs/BackofficeRelatedCountLink.d.ts.map +1 -1
  134. package/lib/types/components/backoffice/refs/backofficeRelatedCountLink.css.d.ts +2 -0
  135. package/lib/types/components/backoffice/refs/backofficeRelatedCountLink.css.d.ts.map +1 -1
  136. package/lib/types/components/backoffice/routing/BackofficeContentError.d.ts +1 -1
  137. package/lib/types/components/backoffice/routing/BackofficeContentError.d.ts.map +1 -1
  138. package/lib/types/components/backoffice/routing/BackofficeRouteFallback.d.ts +4 -0
  139. package/lib/types/components/backoffice/routing/BackofficeRouteFallback.d.ts.map +1 -1
  140. package/lib/types/components/backoffice/scaffolds/BackofficeEntityDetailScaffold.d.ts.map +1 -1
  141. package/lib/types/components/backoffice/scaffolds/BackofficeEntityListScaffold.d.ts +10 -6
  142. package/lib/types/components/backoffice/scaffolds/BackofficeEntityListScaffold.d.ts.map +1 -1
  143. package/lib/types/components/backoffice/scaffolds/BackofficeListFilterContext.d.ts +3 -3
  144. package/lib/types/components/backoffice/scaffolds/BackofficeListFilterContext.d.ts.map +1 -1
  145. package/lib/types/components/backoffice/scaffolds/backofficeEntityListScaffold.css.d.ts.map +1 -1
  146. package/lib/types/components/backoffice/shared/BackofficeFilterableCell.d.ts +13 -0
  147. package/lib/types/components/backoffice/shared/BackofficeFilterableCell.d.ts.map +1 -0
  148. package/lib/types/components/backoffice/shared/backofficeFilterableCell.css.d.ts +12 -0
  149. package/lib/types/components/backoffice/shared/backofficeFilterableCell.css.d.ts.map +1 -0
  150. package/lib/types/components/backoffice/shared/backofficeInlineFilterRow.css.d.ts.map +1 -1
  151. package/lib/types/filters/filterHelpers.d.ts +3 -3
  152. package/lib/types/filters/filterHelpers.d.ts.map +1 -1
  153. package/lib/types/hooks/useAuth.d.ts.map +1 -1
  154. package/lib/types/hooks/useBackofficeInfiniteScrollSentinel.d.ts.map +1 -1
  155. package/lib/types/hooks/useBackofficeListRefetch.d.ts +7 -3
  156. package/lib/types/hooks/useBackofficeListRefetch.d.ts.map +1 -1
  157. package/lib/types/hooks/useBackofficeListUrlState.d.ts +2 -2
  158. package/lib/types/hooks/useBackofficeListUrlState.d.ts.map +1 -1
  159. package/lib/types/i18n/resources.d.ts +84 -7
  160. package/lib/types/i18n/resources.d.ts.map +1 -1
  161. package/lib/types/index.d.ts +3 -0
  162. package/lib/types/index.d.ts.map +1 -1
  163. package/lib/types/pages/BackofficeDashboardPage.d.ts.map +1 -1
  164. package/lib/types/pages/BackofficeEntityDetailPage.d.ts.map +1 -1
  165. package/lib/types/pages/BackofficeEntityDetailPage.view-helpers.d.ts +3 -8
  166. package/lib/types/pages/BackofficeEntityDetailPage.view-helpers.d.ts.map +1 -1
  167. package/lib/types/pages/BackofficeEntityListPage.d.ts +2 -2
  168. package/lib/types/pages/BackofficeEntityListPage.d.ts.map +1 -1
  169. package/lib/types/pages/BackofficeEntityListPage.helpers.d.ts +8 -4
  170. package/lib/types/pages/BackofficeEntityListPage.helpers.d.ts.map +1 -1
  171. package/lib/types/pages/BackofficeHubPage.d.ts.map +1 -1
  172. package/lib/types/pages/BackofficeLayoutPage.d.ts.map +1 -1
  173. package/lib/types/pages/BackofficePasswordResetCompletePage.d.ts.map +1 -1
  174. package/lib/types/pages/BackofficePasswordResetRequestPage.d.ts.map +1 -1
  175. package/lib/types/pages/BackofficeVerifyEmailPage.d.ts.map +1 -1
  176. package/lib/types/pages/backofficeDashboardPage.css.d.ts +1 -14
  177. package/lib/types/pages/backofficeDashboardPage.css.d.ts.map +1 -1
  178. package/lib/types/pages/backofficeEntityDetailPage.css.d.ts +2 -0
  179. package/lib/types/pages/backofficeEntityDetailPage.css.d.ts.map +1 -1
  180. package/lib/types/pages/dashboard/DashboardMetricGroup.d.ts +14 -0
  181. package/lib/types/pages/dashboard/DashboardMetricGroup.d.ts.map +1 -0
  182. package/lib/types/pages/dashboard/DashboardPanel.d.ts +9 -0
  183. package/lib/types/pages/dashboard/DashboardPanel.d.ts.map +1 -0
  184. package/lib/types/pages/dashboard/DashboardQuickActions.d.ts +13 -0
  185. package/lib/types/pages/dashboard/DashboardQuickActions.d.ts.map +1 -0
  186. package/lib/types/pages/dashboard/DashboardStatusList.d.ts +13 -0
  187. package/lib/types/pages/dashboard/DashboardStatusList.d.ts.map +1 -0
  188. package/lib/types/pages/dashboard/dashboardMetricGroup.css.d.ts +4 -0
  189. package/lib/types/pages/dashboard/dashboardMetricGroup.css.d.ts.map +1 -0
  190. package/lib/types/pages/dashboard/dashboardPanel.css.d.ts +2 -0
  191. package/lib/types/pages/dashboard/dashboardPanel.css.d.ts.map +1 -0
  192. package/lib/types/pages/dashboard/dashboardQuickActions.css.d.ts +5 -0
  193. package/lib/types/pages/dashboard/dashboardQuickActions.css.d.ts.map +1 -0
  194. package/lib/types/pages/dashboard/dashboardStatusList.css.d.ts +6 -0
  195. package/lib/types/pages/dashboard/dashboardStatusList.css.d.ts.map +1 -0
  196. package/lib/types/provider/BackofficeProvider.d.ts.map +1 -1
  197. package/lib/types/provider/types.d.ts +5 -1
  198. package/lib/types/provider/types.d.ts.map +1 -1
  199. package/lib/types/router/createBackofficeRoutes.d.ts.map +1 -1
  200. package/package.json +5 -5
  201. package/lib/esm/AcceptInvitationScreen-B1IPafwD.js.map +0 -1
  202. package/lib/esm/BackofficeDashboardPage-C0zP0QO7.js +0 -344
  203. package/lib/esm/BackofficeDashboardPage-C0zP0QO7.js.map +0 -1
  204. package/lib/esm/BackofficeDetailPayload-P61MDRLE.js +0 -94
  205. package/lib/esm/BackofficeDetailPayload-P61MDRLE.js.map +0 -1
  206. package/lib/esm/BackofficeEntityActionFormDialog-BgMuhyU8.js +0 -512
  207. package/lib/esm/BackofficeEntityActionFormDialog-BgMuhyU8.js.map +0 -1
  208. package/lib/esm/BackofficeEntityDetailPage-ChxBrqz8.js.map +0 -1
  209. package/lib/esm/BackofficeEntityListPage-BACvfX6c.js +0 -404
  210. package/lib/esm/BackofficeEntityListPage-BACvfX6c.js.map +0 -1
  211. package/lib/esm/BackofficeHubPage-BsUXulN0.js +0 -136
  212. package/lib/esm/BackofficeHubPage-BsUXulN0.js.map +0 -1
  213. package/lib/esm/BackofficeLayoutPage-r6dXo9SI.js.map +0 -1
  214. package/lib/esm/BackofficeRightPageLayout-BZb7LhT-.js +0 -53
  215. package/lib/esm/BackofficeRightPageLayout-BZb7LhT-.js.map +0 -1
  216. package/lib/esm/BackofficeTopbarPortalContext-CphoSrZD.js.map +0 -1
  217. package/lib/esm/EntityFilterValue-BWUdPBwp.js +0 -78
  218. package/lib/esm/EntityFilterValue-BWUdPBwp.js.map +0 -1
  219. package/lib/esm/EntityIdPickerDialog-Yhmr-WsV.js +0 -308
  220. package/lib/esm/EntityIdPickerDialog-Yhmr-WsV.js.map +0 -1
  221. package/lib/esm/LazyBackofficeEntityActionFormDialog-uyYFFJGM.js +0 -522
  222. package/lib/esm/LazyBackofficeEntityActionFormDialog-uyYFFJGM.js.map +0 -1
  223. package/lib/esm/buildBreadcrumbs-C9cyiXb7.js.map +0 -1
  224. package/lib/esm/sidebarUtils-BZETlHea.js.map +0 -1
  225. package/lib/esm/synchronizeAuthStatusQuery-BoPKMrP1.js.map +0 -1
  226. package/lib/esm/useAuth-CheTnq60.js.map +0 -1
  227. package/lib/esm/useBackofficeListUrlState-D4fx5O7u.js.map +0 -1
  228. package/lib/types/pages/backofficeHubPage.css.d.ts.map +0 -1
@@ -10,4 +10,4 @@ var e = (e) => {
10
10
  //#endregion
11
11
  export { r as n, n as t };
12
12
 
13
- //# sourceMappingURL=backofficeAuthPaths-2KMmkBLv.js.map
13
+ //# sourceMappingURL=backofficeAuthPaths-2hHNn8D3.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"backofficeAuthPaths-2KMmkBLv.js","names":[],"sources":["../../src/router/backofficeAuthPaths.ts"],"sourcesContent":["const normalizeAbsolutePath = (value: string): string => {\n if (value.trim() === '' || value === '/') {\n return '/';\n }\n let withLeadingSlash = value;\n if (!value.startsWith('/')) {\n withLeadingSlash = `/${value}`;\n }\n if (withLeadingSlash.endsWith('/')) {\n return withLeadingSlash.slice(0, -1);\n }\n return withLeadingSlash;\n};\n\nconst prefixBackofficePath = (basePath: string, value: string): string => {\n const normalizedPath = normalizeAbsolutePath(value);\n const normalizedBasePath = normalizeAbsolutePath(basePath);\n\n if (normalizedBasePath === '/') {\n return normalizedPath;\n }\n if (\n normalizedPath === normalizedBasePath ||\n normalizedPath.startsWith(`${normalizedBasePath}/`)\n ) {\n return normalizedPath;\n }\n if (normalizedPath === '/') {\n return normalizedBasePath;\n }\n return `${normalizedBasePath}${normalizedPath}`;\n};\n\nexport const getBackofficeLoginPath = (basePath: string): string => {\n return prefixBackofficePath(basePath, '/login');\n};\n\nexport const getBackofficePasswordResetPath = (basePath: string): string => {\n return prefixBackofficePath(basePath, '/login/reset');\n};\n"],"mappings":";AAAA,IAAM,KAAyB,MAA0B;CACvD,IAAI,EAAM,MAAM,KAAK,MAAM,MAAU,KACnC,OAAO;CAET,IAAI,IAAmB;CAOvB,OANK,EAAM,WAAW,IAAI,KACxB,IAAmB,IAAI,MAErB,EAAiB,SAAS,IAAI,GACzB,EAAiB,MAAM,GAAG,GAAG,GAE/B;GAGH,KAAwB,GAAkB,MAA0B;CACxE,IAAM,IAAiB,EAAsB,EAAM,EAC7C,IAAqB,EAAsB,EAAS;CAc1D,OAZI,MAAuB,OAIzB,MAAmB,KACnB,EAAe,WAAW,GAAG,EAAmB,GAAG,GAE5C,IAEL,MAAmB,MACd,IAEF,GAAG,IAAqB;GAGpB,KAA0B,MAC9B,EAAqB,GAAU,SAAS,EAGpC,KAAkC,MACtC,EAAqB,GAAU,eAAe"}
1
+ {"version":3,"file":"backofficeAuthPaths-2hHNn8D3.js","names":[],"sources":["../../src/router/backofficeAuthPaths.ts"],"sourcesContent":["const normalizeAbsolutePath = (value: string): string => {\n if (value.trim() === '' || value === '/') {\n return '/';\n }\n let withLeadingSlash = value;\n if (!value.startsWith('/')) {\n withLeadingSlash = `/${value}`;\n }\n if (withLeadingSlash.endsWith('/')) {\n return withLeadingSlash.slice(0, -1);\n }\n return withLeadingSlash;\n};\n\nconst prefixBackofficePath = (basePath: string, value: string): string => {\n const normalizedPath = normalizeAbsolutePath(value);\n const normalizedBasePath = normalizeAbsolutePath(basePath);\n\n if (normalizedBasePath === '/') {\n return normalizedPath;\n }\n if (\n normalizedPath === normalizedBasePath ||\n normalizedPath.startsWith(`${normalizedBasePath}/`)\n ) {\n return normalizedPath;\n }\n if (normalizedPath === '/') {\n return normalizedBasePath;\n }\n return `${normalizedBasePath}${normalizedPath}`;\n};\n\nexport const getBackofficeLoginPath = (basePath: string): string => {\n return prefixBackofficePath(basePath, '/login');\n};\n\nexport const getBackofficePasswordResetPath = (basePath: string): string => {\n return prefixBackofficePath(basePath, '/login/reset');\n};\n"],"mappings":";AAAA,IAAM,KAAyB,MAA0B;CACvD,IAAI,EAAM,MAAM,KAAK,MAAM,MAAU,KACnC,OAAO;CAET,IAAI,IAAmB;CAOvB,OANK,EAAM,WAAW,IAAI,KACxB,IAAmB,IAAI,MAErB,EAAiB,SAAS,IAAI,GACzB,EAAiB,MAAM,GAAG,GAAG,GAE/B;GAGH,KAAwB,GAAkB,MAA0B;CACxE,IAAM,IAAiB,EAAsB,EAAM,EAC7C,IAAqB,EAAsB,EAAS;CAc1D,OAZI,MAAuB,OAIzB,MAAmB,KACnB,EAAe,WAAW,GAAG,EAAmB,GAAG,GAE5C,IAEL,MAAmB,MACd,IAEF,GAAG,IAAqB;GAGpB,KAA0B,MAC9B,EAAqB,GAAU,SAAS,EAGpC,KAAkC,MACtC,EAAqB,GAAU,eAAe"}
@@ -0,0 +1,6 @@
1
+ //#region src/components/backoffice/actions/backofficeEntityActionFormDialog.css.ts
2
+ var e = "txvbqb9ip txvbqbai7 txvbqbaog", t = "txvbqb9ip txvbqbdp7 txvbqbajy txvbqbao7", n = "_15f5d9v0", r = "txvbqb8y txvbqbamg txvbqbv9z txvbqblag", i = "txvbqbgng txvbqbvad", a = "txvbqb9ip txvbqbai7 txvbqbao7", o = "txvbqb9ip txvbqbai7 txvbqbao7", s = "txvbqb8p txvbqbvad", c = "txvbqb8p txvbqbv9d", l = "txvbqbnw7 txvbqbojg txvbqbp6g txvbqbly7 txvbqb9jg txvbqbcp txvbqbao7 txvbqb1rg txvbqbv47 txvbqb1cp txvbqb1qg txvbqbwp txvbqbva1 txvbqb8y txvbqb8py";
3
+ //#endregion
4
+ export { n as a, r as c, s as i, i as l, a as n, e as o, c as r, l as s, t, o as u };
5
+
6
+ //# sourceMappingURL=backofficeEntityActionFormDialog.css-DJgEKwaA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backofficeEntityActionFormDialog.css-DJgEKwaA.js","names":[],"sources":["../../src/components/backoffice/actions/backofficeEntityActionFormDialog.css.ts"],"sourcesContent":["import { style } from '@vanilla-extract/css';\nimport { sprinkles } from '@plumile/ui';\n\nexport const form = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n});\n\nexport const actions = sprinkles({\n display: 'flex',\n justifyContent: 'flex-end',\n flexWrap: 'wrap',\n gap: 2,\n});\n\nexport const fieldset = style({\n border: 0,\n margin: 0,\n minWidth: 0,\n padding: 0,\n});\n\nexport const legend = sprinkles({\n fontSize: 'sm',\n fontWeight: 'medium',\n color: 'text',\n padding: 0,\n});\n\nexport const requiredMark = sprinkles({\n marginLeft: 1,\n color: 'error',\n});\n\nexport const checkboxGroup = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n});\n\nexport const resultSection = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n});\n\nexport const fieldError = sprinkles({\n fontSize: 'xs',\n color: 'error',\n});\n\nexport const fieldDescription = sprinkles({\n fontSize: 'xs',\n color: 'secondary',\n});\n\nexport const lazyFallback = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n gap: 2,\n paddingX: 3,\n paddingY: 2,\n borderRadius: 'md',\n backgroundColor: 'surfaceElevated',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'borderSubtle',\n color: 'textSecondary',\n fontSize: 'sm',\n boxShadow: 'md',\n});\n"],"mappings":""}
@@ -45,4 +45,4 @@ var e = (e, t) => e(t), t = (t) => {
45
45
  //#endregion
46
46
  export { r as i, a as n, i as r, n as t };
47
47
 
48
- //# sourceMappingURL=buildBreadcrumbs-C9cyiXb7.js.map
48
+ //# sourceMappingURL=buildBreadcrumbs-C5St167Y.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildBreadcrumbs-C5St167Y.js","names":[],"sources":["../../src/components/backoffice/layout/breadcrumb/buildBreadcrumbs.ts"],"sourcesContent":["import type { TFunction } from 'i18next';\n\nimport type {\n BackofficeResolvedDetailLayoutFacetConfig,\n BackofficeResolvedDetailPageFacetConfig,\n BackofficeRuntimeResolvedListFacetConfig,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\n\nimport type { BackofficeTopbarBreadcrumbItem } from './types.js';\n\nconst resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\nexport const resolveEntityTitleFromDetailHeader = <\n LayoutView extends object,\n>(input: {\n layoutView: LayoutView;\n detailHeader: BackofficeResolvedDetailLayoutFacetConfig['header'];\n tApp: TFunction;\n}): string => {\n const titleValue = input.detailHeader.titleValue?.(\n input.layoutView,\n input.tApp,\n );\n if (typeof titleValue === 'string' && titleValue.trim() !== '') {\n return titleValue;\n }\n\n const title = resolveLabel(input.detailHeader.title, input.tApp);\n if (title.trim() !== '') {\n return title;\n }\n\n const maybeId = (input.layoutView as { id?: unknown }).id;\n if (typeof maybeId === 'string' && maybeId.trim() !== '') {\n return maybeId;\n }\n\n return '';\n};\n\nexport const buildDashboardBreadcrumb = (\n t: TFunction,\n): readonly BackofficeTopbarBreadcrumbItem[] => {\n return [\n {\n id: 'dashboard',\n label: t('dashboard.title'),\n isCurrent: true,\n },\n ];\n};\n\nexport const buildHubBreadcrumb = (input: {\n id: string;\n title: string;\n}): readonly BackofficeTopbarBreadcrumbItem[] => {\n return [\n {\n id: `hub-${input.id}`,\n label: input.title,\n isCurrent: true,\n },\n ];\n};\n\nexport const buildEntityListBreadcrumb = (\n config: BackofficeRuntimeResolvedListFacetConfig,\n tApp: TFunction,\n): readonly BackofficeTopbarBreadcrumbItem[] => {\n return [\n {\n id: `${config.id}-list`,\n label: resolveLabel(config.label, tApp),\n isCurrent: true,\n },\n ];\n};\n\nexport const buildEntityDetailBreadcrumb = (input: {\n config:\n | BackofficeResolvedDetailLayoutFacetConfig\n | BackofficeResolvedDetailPageFacetConfig;\n tApp: TFunction;\n entityId: string;\n layoutView: unknown;\n pageLabel: string;\n}): readonly BackofficeTopbarBreadcrumbItem[] => {\n const listLabel = resolveLabel(input.config.label, input.tApp);\n const entityTitle = resolveEntityTitleFromDetailHeader({\n layoutView: input.layoutView as object,\n detailHeader: input.config.header,\n tApp: input.tApp,\n });\n\n return [\n {\n id: `${input.config.id}-list`,\n label: listLabel,\n to: input.config.routes.list,\n },\n {\n id: `${input.config.id}-entity-${input.entityId}`,\n label: entityTitle,\n to: input.config.routes.detail(input.entityId),\n },\n {\n id: `${input.config.id}-page-${input.pageLabel}`,\n label: input.pageLabel,\n isCurrent: true,\n },\n ];\n};\n\nexport const buildToolBreadcrumb = (input: {\n title: string;\n}): readonly BackofficeTopbarBreadcrumbItem[] => {\n return [\n {\n id: `tool-${input.title}`,\n label: input.title,\n isCurrent: true,\n },\n ];\n};\n"],"mappings":";AAWA,IAAM,KAAgB,GAAkB,MAC/B,EAAM,EAAK,EAGP,KAEX,MAIY;CACZ,IAAM,IAAa,EAAM,aAAa,aACpC,EAAM,YACN,EAAM,KACP;CACD,IAAI,OAAO,KAAe,YAAY,EAAW,MAAM,KAAK,IAC1D,OAAO;CAGT,IAAM,IAAQ,EAAa,EAAM,aAAa,OAAO,EAAM,KAAK;CAChE,IAAI,EAAM,MAAM,KAAK,IACnB,OAAO;CAGT,IAAM,IAAW,EAAM,WAAgC;CAKvD,OAJI,OAAO,KAAY,YAAY,EAAQ,MAAM,KAAK,KAC7C,IAGF;GAGI,KACX,MAEO,CACL;CACE,IAAI;CACJ,OAAO,EAAE,kBAAkB;CAC3B,WAAW;CACZ,CACF,EAGU,KAAsB,MAI1B,CACL;CACE,IAAI,OAAO,EAAM;CACjB,OAAO,EAAM;CACb,WAAW;CACZ,CACF,EAGU,KACX,GACA,MAEO,CACL;CACE,IAAI,GAAG,EAAO,GAAG;CACjB,OAAO,EAAa,EAAO,OAAO,EAAK;CACvC,WAAW;CACZ,CACF,EAGU,KAA+B,MAQK;CAC/C,IAAM,IAAY,EAAa,EAAM,OAAO,OAAO,EAAM,KAAK,EACxD,IAAc,EAAmC;EACrD,YAAY,EAAM;EAClB,cAAc,EAAM,OAAO;EAC3B,MAAM,EAAM;EACb,CAAC;CAEF,OAAO;EACL;GACE,IAAI,GAAG,EAAM,OAAO,GAAG;GACvB,OAAO;GACP,IAAI,EAAM,OAAO,OAAO;GACzB;EACD;GACE,IAAI,GAAG,EAAM,OAAO,GAAG,UAAU,EAAM;GACvC,OAAO;GACP,IAAI,EAAM,OAAO,OAAO,OAAO,EAAM,SAAS;GAC/C;EACD;GACE,IAAI,GAAG,EAAM,OAAO,GAAG,QAAQ,EAAM;GACrC,OAAO,EAAM;GACb,WAAW;GACZ;EACF"}
@@ -63,4 +63,4 @@ function l(l, u) {
63
63
  //#endregion
64
64
  export { l as t };
65
65
 
66
- //# sourceMappingURL=buildDataTableColumns-DGPjPK4N.js.map
66
+ //# sourceMappingURL=buildDataTableColumns-DdmF-EYq.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"buildDataTableColumns-DGPjPK4N.js","names":[],"sources":["../../src/components/backoffice/columns/buildDataTableColumns.tsx"],"sourcesContent":["import { BACKOFFICE_DATE_TIME_OPTIONS } from '@plumile/backoffice-core/constants.js';\nimport type {\n BackofficeColumnSpec,\n BackofficeFieldSize,\n BackofficeListColumnVisibility,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\nimport type { TFunction } from 'i18next';\nimport { Link } from '@plumile/router';\nimport {\n FormattedDate,\n Tag,\n type DataTableBreakpoint,\n type DataTableColumn,\n} from '@plumile/ui';\n\nconst resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\nconst resolveTextValue = (\n value: string | number | null,\n fallback: string,\n): string => {\n if (value == null) {\n return fallback;\n }\n if (typeof value === 'string' && value.trim() === '') {\n return fallback;\n }\n return String(value);\n};\n\nexport type BuildDataTableColumnsOptions = {\n tApp: TFunction;\n t: TFunction;\n resolveEntityHref?: (entityId: string, refId: string) => string | null;\n};\n\nexport type BackofficeSizedDataTableColumn<Row> = DataTableColumn<Row> & {\n size: BackofficeFieldSize;\n};\n\nconst resolveBreakpoint = (\n value: BackofficeListColumnVisibility['minVisibleAt'] | undefined,\n): DataTableBreakpoint | undefined => {\n if (value === 'sm' || value === 'md' || value === 'lg' || value === 'xl') {\n return value;\n }\n return undefined;\n};\n\n/**\n *\n */\nexport function buildDataTableColumns<Row>(\n columns: readonly BackofficeColumnSpec<Row>[],\n options: BuildDataTableColumnsOptions,\n): readonly BackofficeSizedDataTableColumn<Row>[] {\n const { tApp, t, resolveEntityHref } = options;\n const fallback = t('common.notAvailable');\n const filteredColumns = columns.filter((column) => {\n return column.key !== 'id';\n });\n\n return filteredColumns.map((column) => {\n return {\n id: column.key,\n header: resolveLabel(column.header, tApp),\n size: column.size,\n isPrimary: column.visibility?.priority === 'primary',\n priority: column.visibility?.priority,\n align: column.visibility?.align,\n mobileRole: column.visibility?.mobile,\n minVisibleAt: resolveBreakpoint(column.visibility?.minVisibleAt),\n cell: (row) => {\n const { cell } = column;\n switch (cell.type) {\n case 'text': {\n return resolveTextValue(cell.value(row), fallback);\n }\n case 'link': {\n const value = cell.value(row);\n if (\n value == null ||\n (typeof value === 'string' && value.trim() === '')\n ) {\n return fallback;\n }\n return <Link to={cell.to(row)}>{value}</Link>;\n }\n case 'badge': {\n const value = cell.value(row);\n if (value == null || value.trim() === '') {\n return fallback;\n }\n let { tone } = cell;\n if (typeof tone === 'function') {\n tone = tone(row);\n }\n return <Tag tone={tone}>{value}</Tag>;\n }\n case 'dateTime': {\n const value = cell.value(row);\n return (\n <FormattedDate\n value={value}\n fallback={fallback}\n options={BACKOFFICE_DATE_TIME_OPTIONS}\n />\n );\n }\n case 'entityRef': {\n const id = cell.value(row);\n if (id.trim() === '') {\n return fallback;\n }\n const href = resolveEntityHref?.(cell.entity, id) ?? null;\n if (href != null) {\n return <Link to={href}>{t('actions.view')}</Link>;\n }\n return fallback;\n }\n case 'custom': {\n const rendered = cell.render(row);\n if (rendered == null || rendered === '') {\n return fallback;\n }\n return <>{rendered}</>;\n }\n default: {\n return fallback;\n }\n }\n },\n };\n });\n}\n"],"mappings":";;;;;AAgBA,IAAM,KAAgB,GAAkB,MAC/B,EAAM,EAAK,EAGd,KACJ,GACA,MAEI,KAAS,QAGT,OAAO,KAAU,YAAY,EAAM,MAAM,KAAK,KACzC,IAEF,OAAO,EAAM,EAahB,KACJ,MACoC;CACpC,IAAI,MAAU,QAAQ,MAAU,QAAQ,MAAU,QAAQ,MAAU,MAClE,OAAO;;AAQX,SAAgB,EACd,GACA,GACgD;CAChD,IAAM,EAAE,SAAM,MAAG,yBAAsB,GACjC,IAAW,EAAE,sBAAsB;CAKzC,OAJwB,EAAQ,QAAQ,MAC/B,EAAO,QAAQ,KAGjB,CAAgB,KAAK,OACnB;EACL,IAAI,EAAO;EACX,QAAQ,EAAa,EAAO,QAAQ,EAAK;EACzC,MAAM,EAAO;EACb,WAAW,EAAO,YAAY,aAAa;EAC3C,UAAU,EAAO,YAAY;EAC7B,OAAO,EAAO,YAAY;EAC1B,YAAY,EAAO,YAAY;EAC/B,cAAc,EAAkB,EAAO,YAAY,aAAa;EAChE,OAAO,MAAQ;GACb,IAAM,EAAE,YAAS;GACjB,QAAQ,EAAK,MAAb;IACE,KAAK,QACH,OAAO,EAAiB,EAAK,MAAM,EAAI,EAAE,EAAS;IAEpD,KAAK,QAAQ;KACX,IAAM,IAAQ,EAAK,MAAM,EAAI;KAO7B,OALE,KAAS,QACR,OAAO,KAAU,YAAY,EAAM,MAAM,KAAK,KAExC,IAEF,kBAAC,GAAD;MAAM,IAAI,EAAK,GAAG,EAAI;gBAAG;MAAa,CAAA;;IAE/C,KAAK,SAAS;KACZ,IAAM,IAAQ,EAAK,MAAM,EAAI;KAC7B,IAAI,KAAS,QAAQ,EAAM,MAAM,KAAK,IACpC,OAAO;KAET,IAAI,EAAE,YAAS;KAIf,OAHI,OAAO,KAAS,eAClB,IAAO,EAAK,EAAI,GAEX,kBAAC,GAAD;MAAW;gBAAO;MAAY,CAAA;;IAEvC,KAAK,YAEH,OACE,kBAAC,GAAD;KACS,OAHG,EAAK,MAAM,EAGd;KACG;KACV,SAAS;KACT,CAAA;IAGN,KAAK,aAAa;KAChB,IAAM,IAAK,EAAK,MAAM,EAAI;KAC1B,IAAI,EAAG,MAAM,KAAK,IAChB,OAAO;KAET,IAAM,IAAO,IAAoB,EAAK,QAAQ,EAAG,IAAI;KAIrD,OAHI,KAAQ,OAGL,IAFE,kBAAC,GAAD;MAAM,IAAI;gBAAO,EAAE,eAAe;MAAQ,CAAA;;IAIrD,KAAK,UAAU;KACb,IAAM,IAAW,EAAK,OAAO,EAAI;KAIjC,OAHI,KAAY,QAAQ,MAAa,KAC5B,IAEF,kBAAA,GAAA,EAAA,UAAG,GAAY,CAAA;;IAExB,SACE,OAAO;;;EAId,EACD"}
1
+ {"version":3,"file":"buildDataTableColumns-DdmF-EYq.js","names":[],"sources":["../../src/components/backoffice/columns/buildDataTableColumns.tsx"],"sourcesContent":["import { BACKOFFICE_DATE_TIME_OPTIONS } from '@plumile/backoffice-core/constants.js';\nimport type {\n BackofficeColumnSpec,\n BackofficeFieldSize,\n BackofficeListColumnVisibility,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\nimport type { TFunction } from 'i18next';\nimport { Link } from '@plumile/router';\nimport {\n FormattedDate,\n Tag,\n type DataTableBreakpoint,\n type DataTableColumn,\n} from '@plumile/ui';\n\nconst resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\nconst resolveTextValue = (\n value: string | number | null,\n fallback: string,\n): string => {\n if (value == null) {\n return fallback;\n }\n if (typeof value === 'string' && value.trim() === '') {\n return fallback;\n }\n return String(value);\n};\n\nexport type BuildDataTableColumnsOptions = {\n tApp: TFunction;\n t: TFunction;\n resolveEntityHref?: (entityId: string, refId: string) => string | null;\n};\n\nexport type BackofficeSizedDataTableColumn<Row> = DataTableColumn<Row> & {\n size: BackofficeFieldSize;\n};\n\nconst resolveBreakpoint = (\n value: BackofficeListColumnVisibility['minVisibleAt'] | undefined,\n): DataTableBreakpoint | undefined => {\n if (value === 'sm' || value === 'md' || value === 'lg' || value === 'xl') {\n return value;\n }\n return undefined;\n};\n\n/**\n *\n */\nexport function buildDataTableColumns<Row>(\n columns: readonly BackofficeColumnSpec<Row>[],\n options: BuildDataTableColumnsOptions,\n): readonly BackofficeSizedDataTableColumn<Row>[] {\n const { tApp, t, resolveEntityHref } = options;\n const fallback = t('common.notAvailable');\n const filteredColumns = columns.filter((column) => {\n return column.key !== 'id';\n });\n\n return filteredColumns.map((column) => {\n return {\n id: column.key,\n header: resolveLabel(column.header, tApp),\n size: column.size,\n isPrimary: column.visibility?.priority === 'primary',\n priority: column.visibility?.priority,\n align: column.visibility?.align,\n mobileRole: column.visibility?.mobile,\n minVisibleAt: resolveBreakpoint(column.visibility?.minVisibleAt),\n cell: (row) => {\n const { cell } = column;\n switch (cell.type) {\n case 'text': {\n return resolveTextValue(cell.value(row), fallback);\n }\n case 'link': {\n const value = cell.value(row);\n if (\n value == null ||\n (typeof value === 'string' && value.trim() === '')\n ) {\n return fallback;\n }\n return <Link to={cell.to(row)}>{value}</Link>;\n }\n case 'badge': {\n const value = cell.value(row);\n if (value == null || value.trim() === '') {\n return fallback;\n }\n let { tone } = cell;\n if (typeof tone === 'function') {\n tone = tone(row);\n }\n return <Tag tone={tone}>{value}</Tag>;\n }\n case 'dateTime': {\n const value = cell.value(row);\n return (\n <FormattedDate\n value={value}\n fallback={fallback}\n options={BACKOFFICE_DATE_TIME_OPTIONS}\n />\n );\n }\n case 'entityRef': {\n const id = cell.value(row);\n if (id.trim() === '') {\n return fallback;\n }\n const href = resolveEntityHref?.(cell.entity, id) ?? null;\n if (href != null) {\n return <Link to={href}>{t('actions.view')}</Link>;\n }\n return fallback;\n }\n case 'custom': {\n const rendered = cell.render(row);\n if (rendered == null || rendered === '') {\n return fallback;\n }\n return <>{rendered}</>;\n }\n default: {\n return fallback;\n }\n }\n },\n };\n });\n}\n"],"mappings":";;;;;AAgBA,IAAM,KAAgB,GAAkB,MAC/B,EAAM,EAAK,EAGd,KACJ,GACA,MAEI,KAAS,QAGT,OAAO,KAAU,YAAY,EAAM,MAAM,KAAK,KACzC,IAEF,OAAO,EAAM,EAahB,KACJ,MACoC;CACpC,IAAI,MAAU,QAAQ,MAAU,QAAQ,MAAU,QAAQ,MAAU,MAClE,OAAO;;AAQX,SAAgB,EACd,GACA,GACgD;CAChD,IAAM,EAAE,SAAM,MAAG,yBAAsB,GACjC,IAAW,EAAE,sBAAsB;CAKzC,OAJwB,EAAQ,QAAQ,MAC/B,EAAO,QAAQ,KAGjB,CAAgB,KAAK,OACnB;EACL,IAAI,EAAO;EACX,QAAQ,EAAa,EAAO,QAAQ,EAAK;EACzC,MAAM,EAAO;EACb,WAAW,EAAO,YAAY,aAAa;EAC3C,UAAU,EAAO,YAAY;EAC7B,OAAO,EAAO,YAAY;EAC1B,YAAY,EAAO,YAAY;EAC/B,cAAc,EAAkB,EAAO,YAAY,aAAa;EAChE,OAAO,MAAQ;GACb,IAAM,EAAE,YAAS;GACjB,QAAQ,EAAK,MAAb;IACE,KAAK,QACH,OAAO,EAAiB,EAAK,MAAM,EAAI,EAAE,EAAS;IAEpD,KAAK,QAAQ;KACX,IAAM,IAAQ,EAAK,MAAM,EAAI;KAO7B,OALE,KAAS,QACR,OAAO,KAAU,YAAY,EAAM,MAAM,KAAK,KAExC,IAEF,kBAAC,GAAD;MAAM,IAAI,EAAK,GAAG,EAAI;gBAAG;MAAa,CAAA;;IAE/C,KAAK,SAAS;KACZ,IAAM,IAAQ,EAAK,MAAM,EAAI;KAC7B,IAAI,KAAS,QAAQ,EAAM,MAAM,KAAK,IACpC,OAAO;KAET,IAAI,EAAE,YAAS;KAIf,OAHI,OAAO,KAAS,eAClB,IAAO,EAAK,EAAI,GAEX,kBAAC,GAAD;MAAW;gBAAO;MAAY,CAAA;;IAEvC,KAAK,YAEH,OACE,kBAAC,GAAD;KACS,OAHG,EAAK,MAAM,EAGd;KACG;KACV,SAAS;KACT,CAAA;IAGN,KAAK,aAAa;KAChB,IAAM,IAAK,EAAK,MAAM,EAAI;KAC1B,IAAI,EAAG,MAAM,KAAK,IAChB,OAAO;KAET,IAAM,IAAO,IAAoB,EAAK,QAAQ,EAAG,IAAI;KAIrD,OAHI,KAAQ,OAGL,IAFE,kBAAC,GAAD;MAAM,IAAI;gBAAO,EAAE,eAAe;MAAQ,CAAA;;IAIrD,KAAK,UAAU;KACb,IAAM,IAAW,EAAK,OAAO,EAAI;KAIjC,OAHI,KAAY,QAAQ,MAAa,KAC5B,IAEF,kBAAA,GAAA,EAAA,UAAG,GAAY,CAAA;;IAExB,SACE,OAAO;;;EAId,EACD"}
@@ -44,4 +44,4 @@ var e = (e) => e?.status ?? e?.result ?? null, t = (t, n) => {
44
44
  //#endregion
45
45
  export { t as i, r as n, i as r, n as t };
46
46
 
47
- //# sourceMappingURL=mutationResult-CcQMY13J.js.map
47
+ //# sourceMappingURL=mutationResult-C2Vb_vPt.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mutationResult-CcQMY13J.js","names":[],"sources":["../../src/relay/mutationResult.ts"],"sourcesContent":["export type MutationResult = 'SUCCESS' | 'ERROR';\n\nexport type MutationPayloadBase<Reason extends string = string> = {\n status?: MutationResult | null;\n result?: MutationResult | null;\n errorReason?: Reason | null;\n};\n\nexport type MutationOutcome<Payload, Reason extends string = string> =\n | { ok: true; payload: Payload }\n | { ok: false; reason?: Reason | null; message: string };\n\nexport type ResolveOptions<Reason extends string> = {\n defaultErrorMessage: string;\n mapReason?: (reason: Reason) => string | null;\n missingPayloadMessage?: string;\n};\n\nexport const getStatus = (\n payload: MutationPayloadBase | null | undefined,\n): MutationResult | null => {\n return payload?.status ?? payload?.result ?? null;\n};\n\nexport const resolveMutationOutcome = <\n Payload extends MutationPayloadBase<Reason>,\n Reason extends string,\n>(\n payload: Payload | null | undefined,\n options: ResolveOptions<Reason>,\n): MutationOutcome<Payload, Reason> => {\n const { defaultErrorMessage, mapReason, missingPayloadMessage } = options;\n\n if (payload == null) {\n return {\n ok: false,\n message: missingPayloadMessage ?? defaultErrorMessage,\n };\n }\n\n const status = getStatus(payload);\n if (status !== 'SUCCESS') {\n const reason = payload.errorReason ?? null;\n let mapped: string | null = null;\n if (reason != null && mapReason != null) {\n mapped = mapReason(reason);\n }\n return {\n ok: false,\n reason,\n message: mapped ?? defaultErrorMessage,\n };\n }\n\n return { ok: true, payload };\n};\n\nexport const requireField = <T>(\n value: T | null | undefined,\n message: string,\n): { ok: true; value: T } | { ok: false; message: string } => {\n if (value == null) {\n return { ok: false, message };\n }\n\n return { ok: true, value };\n};\n\ntype RecordWithId = {\n id?: string | null;\n};\n\nexport const requireLinkedRecordId = (\n record: RecordWithId | null | undefined,\n message: string,\n): { ok: true; id: string } | { ok: false; message: string } => {\n const result = requireField(record?.id ?? null, message);\n if (!result.ok) {\n return result;\n }\n\n return { ok: true, id: result.value };\n};\n\nexport type AgentStartPayload<\n Reason extends string,\n Status extends string,\n> = MutationPayloadBase<Reason> & {\n agentStatus?: Status | null;\n};\n\nexport const resolveAgentStartOutcome = <\n Reason extends string,\n Status extends string,\n>(\n payload: AgentStartPayload<Reason, Status> | null | undefined,\n options: ResolveOptions<Reason>,\n):\n | { ok: true; agentStatus: Status }\n | { ok: false; message: string; reason?: Reason | null } => {\n const base = resolveMutationOutcome(payload, options);\n if (!base.ok) {\n return base;\n }\n\n const agentStatusResult = requireField(\n base.payload.agentStatus ?? null,\n options.defaultErrorMessage,\n );\n\n if (!agentStatusResult.ok) {\n return { ok: false, message: agentStatusResult.message };\n }\n\n return { ok: true, agentStatus: agentStatusResult.value };\n};\n"],"mappings":";AAkBA,IAAa,KACX,MAEO,GAAS,UAAU,GAAS,UAAU,MAGlC,KAIX,GACA,MACqC;CACrC,IAAM,EAAE,wBAAqB,cAAW,6BAA0B;CAElE,IAAI,KAAW,MACb,OAAO;EACL,IAAI;EACJ,SAAS,KAAyB;EACnC;CAIH,IADe,EAAU,EACrB,KAAW,WAAW;EACxB,IAAM,IAAS,EAAQ,eAAe,MAClC,IAAwB;EAI5B,OAHI,KAAU,QAAQ,KAAa,SACjC,IAAS,EAAU,EAAO,GAErB;GACL,IAAI;GACJ;GACA,SAAS,KAAU;GACpB;;CAGH,OAAO;EAAE,IAAI;EAAM;EAAS;GAGjB,KACX,GACA,MAEI,KAAS,OACJ;CAAE,IAAI;CAAO;CAAS,GAGxB;CAAE,IAAI;CAAM;CAAO,EAOf,KACX,GACA,MAC8D;CAC9D,IAAM,IAAS,EAAa,GAAQ,MAAM,MAAM,EAAQ;CAKxD,OAJK,EAAO,KAIL;EAAE,IAAI;EAAM,IAAI,EAAO;EAAO,GAH5B;GAaE,KAIX,GACA,MAG4D;CAC5D,IAAM,IAAO,EAAuB,GAAS,EAAQ;CACrD,IAAI,CAAC,EAAK,IACR,OAAO;CAGT,IAAM,IAAoB,EACxB,EAAK,QAAQ,eAAe,MAC5B,EAAQ,oBACT;CAMD,OAJK,EAAkB,KAIhB;EAAE,IAAI;EAAM,aAAa,EAAkB;EAAO,GAHhD;EAAE,IAAI;EAAO,SAAS,EAAkB;EAAS"}
1
+ {"version":3,"file":"mutationResult-C2Vb_vPt.js","names":[],"sources":["../../src/relay/mutationResult.ts"],"sourcesContent":["export type MutationResult = 'SUCCESS' | 'ERROR';\n\nexport type MutationPayloadBase<Reason extends string = string> = {\n status?: MutationResult | null;\n result?: MutationResult | null;\n errorReason?: Reason | null;\n};\n\nexport type MutationOutcome<Payload, Reason extends string = string> =\n | { ok: true; payload: Payload }\n | { ok: false; reason?: Reason | null; message: string };\n\nexport type ResolveOptions<Reason extends string> = {\n defaultErrorMessage: string;\n mapReason?: (reason: Reason) => string | null;\n missingPayloadMessage?: string;\n};\n\nexport const getStatus = (\n payload: MutationPayloadBase | null | undefined,\n): MutationResult | null => {\n return payload?.status ?? payload?.result ?? null;\n};\n\nexport const resolveMutationOutcome = <\n Payload extends MutationPayloadBase<Reason>,\n Reason extends string,\n>(\n payload: Payload | null | undefined,\n options: ResolveOptions<Reason>,\n): MutationOutcome<Payload, Reason> => {\n const { defaultErrorMessage, mapReason, missingPayloadMessage } = options;\n\n if (payload == null) {\n return {\n ok: false,\n message: missingPayloadMessage ?? defaultErrorMessage,\n };\n }\n\n const status = getStatus(payload);\n if (status !== 'SUCCESS') {\n const reason = payload.errorReason ?? null;\n let mapped: string | null = null;\n if (reason != null && mapReason != null) {\n mapped = mapReason(reason);\n }\n return {\n ok: false,\n reason,\n message: mapped ?? defaultErrorMessage,\n };\n }\n\n return { ok: true, payload };\n};\n\nexport const requireField = <T>(\n value: T | null | undefined,\n message: string,\n): { ok: true; value: T } | { ok: false; message: string } => {\n if (value == null) {\n return { ok: false, message };\n }\n\n return { ok: true, value };\n};\n\ntype RecordWithId = {\n id?: string | null;\n};\n\nexport const requireLinkedRecordId = (\n record: RecordWithId | null | undefined,\n message: string,\n): { ok: true; id: string } | { ok: false; message: string } => {\n const result = requireField(record?.id ?? null, message);\n if (!result.ok) {\n return result;\n }\n\n return { ok: true, id: result.value };\n};\n\nexport type AgentStartPayload<\n Reason extends string,\n Status extends string,\n> = MutationPayloadBase<Reason> & {\n agentStatus?: Status | null;\n};\n\nexport const resolveAgentStartOutcome = <\n Reason extends string,\n Status extends string,\n>(\n payload: AgentStartPayload<Reason, Status> | null | undefined,\n options: ResolveOptions<Reason>,\n):\n | { ok: true; agentStatus: Status }\n | { ok: false; message: string; reason?: Reason | null } => {\n const base = resolveMutationOutcome(payload, options);\n if (!base.ok) {\n return base;\n }\n\n const agentStatusResult = requireField(\n base.payload.agentStatus ?? null,\n options.defaultErrorMessage,\n );\n\n if (!agentStatusResult.ok) {\n return { ok: false, message: agentStatusResult.message };\n }\n\n return { ok: true, agentStatus: agentStatusResult.value };\n};\n"],"mappings":";AAkBA,IAAa,KACX,MAEO,GAAS,UAAU,GAAS,UAAU,MAGlC,KAIX,GACA,MACqC;CACrC,IAAM,EAAE,wBAAqB,cAAW,6BAA0B;CAElE,IAAI,KAAW,MACb,OAAO;EACL,IAAI;EACJ,SAAS,KAAyB;EACnC;CAIH,IADe,EAAU,EACrB,KAAW,WAAW;EACxB,IAAM,IAAS,EAAQ,eAAe,MAClC,IAAwB;EAI5B,OAHI,KAAU,QAAQ,KAAa,SACjC,IAAS,EAAU,EAAO,GAErB;GACL,IAAI;GACJ;GACA,SAAS,KAAU;GACpB;;CAGH,OAAO;EAAE,IAAI;EAAM;EAAS;GAGjB,KACX,GACA,MAEI,KAAS,OACJ;CAAE,IAAI;CAAO;CAAS,GAGxB;CAAE,IAAI;CAAM;CAAO,EAOf,KACX,GACA,MAC8D;CAC9D,IAAM,IAAS,EAAa,GAAQ,MAAM,MAAM,EAAQ;CAKxD,OAJK,EAAO,KAIL;EAAE,IAAI;EAAM,IAAI,EAAO;EAAO,GAH5B;GAaE,KAIX,GACA,MAG4D;CAC5D,IAAM,IAAO,EAAuB,GAAS,EAAQ;CACrD,IAAI,CAAC,EAAK,IACR,OAAO;CAGT,IAAM,IAAoB,EACxB,EAAK,QAAQ,eAAe,MAC5B,EAAQ,oBACT;CAMD,OAJK,EAAkB,KAIhB;EAAE,IAAI;EAAM,aAAa,EAAkB;EAAO,GAHhD;EAAE,IAAI;EAAO,SAAS,EAAkB;EAAS"}
@@ -25,4 +25,4 @@ var e = (e) => e.trim().replace(/^\/+|\/+$/g, ""), t = (t) => {
25
25
  //#endregion
26
26
  export { t };
27
27
 
28
- //# sourceMappingURL=pageResolution-hAQA5C6S.js.map
28
+ //# sourceMappingURL=pageResolution-CUaTq4Ql.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pageResolution-hAQA5C6S.js","names":[],"sources":["../../src/pages/detail/pageResolution.ts"],"sourcesContent":["type DetailPageBase<ShellView> = {\n id: string;\n path: string;\n isVisible?: (layout: ShellView) => boolean;\n};\n\ntype PageResolutionInput<\n ShellView,\n MainPage extends DetailPageBase<ShellView>,\n SubPage extends DetailPageBase<ShellView> = MainPage,\n> = {\n mainPage: MainPage;\n subPages?: readonly SubPage[];\n activePagePath?: string;\n node: ShellView;\n};\n\nexport type ResolvedDetailPages<Page> = {\n pages: readonly Page[];\n activePage: Page | null;\n hasVisiblePages: boolean;\n hasMultiplePages: boolean;\n};\n\nconst normalizePath = (value: string): string => {\n return value.trim().replace(/^\\/+|\\/+$/g, '');\n};\n\nexport const resolveVisibleDetailPages = <\n ShellView,\n MainPage extends DetailPageBase<ShellView>,\n SubPage extends DetailPageBase<ShellView> = MainPage,\n>(\n input: PageResolutionInput<ShellView, MainPage, SubPage>,\n): ResolvedDetailPages<MainPage | SubPage> => {\n const allPages = [input.mainPage, ...(input.subPages ?? [])] as readonly (\n | MainPage\n | SubPage\n )[];\n const visiblePages = allPages.filter((page) => {\n if (page.isVisible == null) {\n return true;\n }\n return page.isVisible(input.node);\n });\n\n if (visiblePages.length === 0) {\n return {\n pages: [],\n activePage: null,\n hasVisiblePages: false,\n hasMultiplePages: false,\n };\n }\n\n const activePath = normalizePath(input.activePagePath ?? '');\n let activeByPath: MainPage | SubPage | null = null;\n if (activePath !== '') {\n activeByPath =\n visiblePages.find((page) => {\n return normalizePath(page.path) === activePath;\n }) ?? null;\n }\n\n const defaultPage =\n visiblePages.find((page) => {\n return page.id === input.mainPage.id;\n }) ?? visiblePages[0];\n if (defaultPage == null) {\n return {\n pages: [],\n activePage: null,\n hasVisiblePages: false,\n hasMultiplePages: false,\n };\n }\n\n const activePage = activeByPath ?? defaultPage;\n\n return {\n pages: visiblePages,\n activePage,\n hasVisiblePages: true,\n hasMultiplePages: visiblePages.length > 1,\n };\n};\n"],"mappings":";AAwBA,IAAM,KAAiB,MACd,EAAM,MAAM,CAAC,QAAQ,cAAc,GAAG,EAGlC,KAKX,MAC4C;CAK5C,IAAM,IAAe,CAJH,EAAM,UAAU,GAAI,EAAM,YAAY,EAAE,CAIrC,CAAS,QAAQ,MAChC,EAAK,aAAa,OACb,KAEF,EAAK,UAAU,EAAM,KAAK,CACjC;CAEF,IAAI,EAAa,WAAW,GAC1B,OAAO;EACL,OAAO,EAAE;EACT,YAAY;EACZ,iBAAiB;EACjB,kBAAkB;EACnB;CAGH,IAAM,IAAa,EAAc,EAAM,kBAAkB,GAAG,EACxD,IAA0C;CAC9C,AAAI,MAAe,OACjB,IACE,EAAa,MAAM,MACV,EAAc,EAAK,KAAK,KAAK,EACpC,IAAI;CAGV,IAAM,IACJ,EAAa,MAAM,MACV,EAAK,OAAO,EAAM,SAAS,GAClC,IAAI,EAAa;CAYrB,OAXI,KAAe,OACV;EACL,OAAO,EAAE;EACT,YAAY;EACZ,iBAAiB;EACjB,kBAAkB;EACnB,GAKI;EACL,OAAO;EACP,YAJiB,KAAgB;EAKjC,iBAAiB;EACjB,kBAAkB,EAAa,SAAS;EACzC"}
1
+ {"version":3,"file":"pageResolution-CUaTq4Ql.js","names":[],"sources":["../../src/pages/detail/pageResolution.ts"],"sourcesContent":["type DetailPageBase<ShellView> = {\n id: string;\n path: string;\n isVisible?: (layout: ShellView) => boolean;\n};\n\ntype PageResolutionInput<\n ShellView,\n MainPage extends DetailPageBase<ShellView>,\n SubPage extends DetailPageBase<ShellView> = MainPage,\n> = {\n mainPage: MainPage;\n subPages?: readonly SubPage[];\n activePagePath?: string;\n node: ShellView;\n};\n\nexport type ResolvedDetailPages<Page> = {\n pages: readonly Page[];\n activePage: Page | null;\n hasVisiblePages: boolean;\n hasMultiplePages: boolean;\n};\n\nconst normalizePath = (value: string): string => {\n return value.trim().replace(/^\\/+|\\/+$/g, '');\n};\n\nexport const resolveVisibleDetailPages = <\n ShellView,\n MainPage extends DetailPageBase<ShellView>,\n SubPage extends DetailPageBase<ShellView> = MainPage,\n>(\n input: PageResolutionInput<ShellView, MainPage, SubPage>,\n): ResolvedDetailPages<MainPage | SubPage> => {\n const allPages = [input.mainPage, ...(input.subPages ?? [])] as readonly (\n | MainPage\n | SubPage\n )[];\n const visiblePages = allPages.filter((page) => {\n if (page.isVisible == null) {\n return true;\n }\n return page.isVisible(input.node);\n });\n\n if (visiblePages.length === 0) {\n return {\n pages: [],\n activePage: null,\n hasVisiblePages: false,\n hasMultiplePages: false,\n };\n }\n\n const activePath = normalizePath(input.activePagePath ?? '');\n let activeByPath: MainPage | SubPage | null = null;\n if (activePath !== '') {\n activeByPath =\n visiblePages.find((page) => {\n return normalizePath(page.path) === activePath;\n }) ?? null;\n }\n\n const defaultPage =\n visiblePages.find((page) => {\n return page.id === input.mainPage.id;\n }) ?? visiblePages[0];\n if (defaultPage == null) {\n return {\n pages: [],\n activePage: null,\n hasVisiblePages: false,\n hasMultiplePages: false,\n };\n }\n\n const activePage = activeByPath ?? defaultPage;\n\n return {\n pages: visiblePages,\n activePage,\n hasVisiblePages: true,\n hasMultiplePages: visiblePages.length > 1,\n };\n};\n"],"mappings":";AAwBA,IAAM,KAAiB,MACd,EAAM,MAAM,CAAC,QAAQ,cAAc,GAAG,EAGlC,KAKX,MAC4C;CAK5C,IAAM,IAAe,CAJH,EAAM,UAAU,GAAI,EAAM,YAAY,EAAE,CAIrC,CAAS,QAAQ,MAChC,EAAK,aAAa,OACb,KAEF,EAAK,UAAU,EAAM,KAAK,CACjC;CAEF,IAAI,EAAa,WAAW,GAC1B,OAAO;EACL,OAAO,EAAE;EACT,YAAY;EACZ,iBAAiB;EACjB,kBAAkB;EACnB;CAGH,IAAM,IAAa,EAAc,EAAM,kBAAkB,GAAG,EACxD,IAA0C;CAC9C,AAAI,MAAe,OACjB,IACE,EAAa,MAAM,MACV,EAAc,EAAK,KAAK,KAAK,EACpC,IAAI;CAGV,IAAM,IACJ,EAAa,MAAM,MACV,EAAK,OAAO,EAAM,SAAS,GAClC,IAAI,EAAa;CAYrB,OAXI,KAAe,OACV;EACL,OAAO,EAAE;EACT,YAAY;EACZ,iBAAiB;EACjB,kBAAkB;EACnB,GAKI;EACL,OAAO;EACP,YAJiB,KAAgB;EAKjC,iBAAiB;EACjB,kBAAkB,EAAa,SAAS;EACzC"}
@@ -36,11 +36,25 @@ var e = (e, t) => e(t), t = (e, t) => !!(e === t || t !== "/" && e.startsWith(`$
36
36
  }, c = (e, t) => i(e).flatMap((e) => e.kind === "entity" || e.kind === "tool" ? [e.id] : e.kind === "hub" ? o(a(e, t)) : []), l = (e, t) => {
37
37
  let n = /* @__PURE__ */ new Map();
38
38
  return Object.entries(e).forEach(([e, r]) => {
39
- c(r, t).forEach((t) => {
40
- n.has(t) || n.set(t, {
41
- groupId: e,
42
- icon: r.icon
43
- });
39
+ i(r).forEach((i) => {
40
+ if (i.kind !== "dashboard") {
41
+ if (i.kind === "hub") {
42
+ let s = a(i, t);
43
+ o(s).forEach((t) => {
44
+ n.has(t) || n.set(t, {
45
+ groupId: e,
46
+ groupIcon: r.icon,
47
+ itemIcon: i.icon ?? s.icon
48
+ });
49
+ });
50
+ return;
51
+ }
52
+ n.has(i.id) || n.set(i.id, {
53
+ groupId: e,
54
+ groupIcon: r.icon,
55
+ itemIcon: i.icon
56
+ });
57
+ }
44
58
  });
45
59
  }), n;
46
60
  }, u = (e, t, n, r) => {
@@ -71,4 +85,4 @@ var e = (e, t) => e(t), t = (e, t) => !!(e === t || t !== "/" && e.startsWith(`$
71
85
  //#endregion
72
86
  export { o as a, a as c, i, s as l, t as n, e as o, f as r, r as s, l as t, d as u };
73
87
 
74
- //# sourceMappingURL=sidebarUtils-BZETlHea.js.map
88
+ //# sourceMappingURL=sidebarUtils-BgCBLJLv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidebarUtils-BgCBLJLv.js","names":[],"sources":["../../src/components/backoffice/layout/sidebarUtils.ts"],"sourcesContent":["import type { TFunction } from 'i18next';\n\nimport type {\n BackofficeEntityManifestMap,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\nimport type {\n BackofficeSidebarConfig,\n BackofficeIconComponent,\n BackofficeSidebarGroupConfig,\n BackofficeSidebarItemDescriptor,\n BackofficeSidebarItemConfig,\n BackofficeSidebarHubConfig,\n BackofficeResolvedSidebarHubConfig,\n} from '../../../provider/types.js';\n\nexport const resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\nexport const isActivePath = (pathname: string, href: string): boolean => {\n if (pathname === href) {\n return true;\n }\n if (href !== '/' && pathname.startsWith(`${href}/`)) {\n return true;\n }\n return false;\n};\n\nexport const buildDefaultGroups = (\n entities: BackofficeEntityManifestMap,\n): Record<string, BackofficeSidebarGroupConfig> => {\n const entityIds = Object.keys(entities);\n\n return {\n main: {\n entities: entityIds,\n },\n };\n};\n\nexport const resolveSidebarGroups = (\n entities: BackofficeEntityManifestMap,\n sidebar: BackofficeSidebarConfig | undefined,\n): Record<string, BackofficeSidebarGroupConfig> => {\n return sidebar?.groups ?? buildDefaultGroups(entities);\n};\n\nexport type EntityGroupLookup = Map<\n string,\n {\n groupId: string;\n groupIcon?: BackofficeIconComponent;\n itemIcon?: BackofficeIconComponent;\n }\n>;\n\nexport const resolveItemDescriptor = (\n item: BackofficeSidebarItemConfig,\n): BackofficeSidebarItemDescriptor => {\n if (item.kind === 'dashboard') {\n return { kind: 'dashboard', id: item.id ?? 'dashboard' };\n }\n return { kind: item.kind, id: item.id };\n};\n\nexport const resolveGroupItems = (\n group: BackofficeSidebarGroupConfig,\n): readonly BackofficeSidebarItemConfig[] => {\n if (group.items != null) {\n return group.items;\n }\n return (\n group.entities?.map((entityId) => {\n return { kind: 'entity', id: entityId } as const;\n }) ?? []\n );\n};\n\nexport const resolveSidebarHub = (\n item: BackofficeSidebarHubConfig,\n sidebar: BackofficeSidebarConfig | undefined,\n): BackofficeResolvedSidebarHubConfig => {\n const registeredHub = sidebar?.hubs?.[item.id];\n return {\n ...registeredHub,\n ...item,\n groups: item.groups ?? registeredHub?.groups ?? [],\n };\n};\n\nexport const resolveHubEntityIds = (\n hub: BackofficeResolvedSidebarHubConfig,\n): readonly string[] => {\n const output: string[] = [];\n const seen = new Set<string>();\n hub.groups.forEach((group) => {\n group.items.forEach((item) => {\n if (seen.has(item.id)) {\n return;\n }\n seen.add(item.id);\n output.push(item.id);\n });\n });\n return output;\n};\n\nexport type ResolvedSidebarHubEntry = {\n groupId: string | null;\n hub: BackofficeResolvedSidebarHubConfig;\n icon?: BackofficeIconComponent;\n};\n\nexport const resolveSidebarHubEntries = (\n groups: Record<string, BackofficeSidebarGroupConfig>,\n sidebar: BackofficeSidebarConfig | undefined,\n): readonly ResolvedSidebarHubEntry[] => {\n const output: ResolvedSidebarHubEntry[] = [];\n const seen = new Set<string>();\n\n Object.entries(groups).forEach(([groupId, group]) => {\n resolveGroupItems(group).forEach((item) => {\n if (item.kind !== 'hub' || seen.has(item.id)) {\n return;\n }\n seen.add(item.id);\n output.push({\n groupId,\n hub: resolveSidebarHub(item, sidebar),\n icon: item.icon ?? group.icon,\n });\n });\n });\n\n Object.values(sidebar?.hubs ?? {}).forEach((hub) => {\n if (seen.has(hub.id)) {\n return;\n }\n seen.add(hub.id);\n output.push({\n groupId: null,\n hub: resolveSidebarHub(hub, sidebar),\n icon: hub.icon,\n });\n });\n\n return output;\n};\n\nexport const resolveGroupEntityIds = (\n group: BackofficeSidebarGroupConfig,\n sidebar?: BackofficeSidebarConfig,\n): readonly string[] => {\n return resolveGroupItems(group).flatMap((item) => {\n if (item.kind === 'entity' || item.kind === 'tool') {\n return [item.id];\n }\n if (item.kind === 'hub') {\n return resolveHubEntityIds(resolveSidebarHub(item, sidebar));\n }\n return [];\n });\n};\n\nexport const buildEntityGroupLookup = (\n groups: Record<string, BackofficeSidebarGroupConfig>,\n sidebar?: BackofficeSidebarConfig,\n): EntityGroupLookup => {\n const lookup: EntityGroupLookup = new Map();\n\n Object.entries(groups).forEach(([groupId, group]) => {\n resolveGroupItems(group).forEach((item) => {\n if (item.kind === 'dashboard') {\n return;\n }\n\n if (item.kind === 'hub') {\n const hub = resolveSidebarHub(item, sidebar);\n resolveHubEntityIds(hub).forEach((entityId) => {\n if (!lookup.has(entityId)) {\n lookup.set(entityId, {\n groupId,\n groupIcon: group.icon,\n itemIcon: item.icon ?? hub.icon,\n });\n }\n });\n return;\n }\n\n if (!lookup.has(item.id)) {\n lookup.set(item.id, {\n groupId,\n groupIcon: group.icon,\n itemIcon: item.icon,\n });\n }\n });\n });\n\n return lookup;\n};\n\nconst isEntityVisible = (\n entityId: string,\n entities: BackofficeEntityManifestMap,\n sidebar: BackofficeSidebarConfig | undefined,\n permissions: unknown,\n): boolean => {\n const config = entities[entityId];\n if (config == null) {\n return false;\n }\n\n let descriptor: BackofficeSidebarItemDescriptor = {\n kind: 'entity',\n id: entityId,\n };\n if (config.kind === 'tool') {\n descriptor = { kind: 'tool', id: entityId };\n }\n\n if (sidebar?.isItemVisible != null) {\n return sidebar.isItemVisible(descriptor, permissions);\n }\n\n if (config.kind === 'tool') {\n return true;\n }\n return config.hasList;\n};\n\nexport const resolveVisibleEntityIds = (\n groups: Record<string, BackofficeSidebarGroupConfig>,\n entities: BackofficeEntityManifestMap,\n sidebar: BackofficeSidebarConfig | undefined,\n permissions: unknown,\n): string[] => {\n const output: string[] = [];\n const seen = new Set<string>();\n\n Object.entries(groups).forEach(([, group]) => {\n if (group.isVisible != null && !group.isVisible(permissions)) {\n return;\n }\n resolveGroupEntityIds(group, sidebar).forEach((entityId) => {\n if (seen.has(entityId)) {\n return;\n }\n if (!isEntityVisible(entityId, entities, sidebar, permissions)) {\n return;\n }\n seen.add(entityId);\n output.push(entityId);\n });\n });\n\n return output;\n};\n\nexport const resolveActiveEntityId = (\n pathname: string,\n entities: BackofficeEntityManifestMap,\n): string | null => {\n const entries = Object.entries(entities);\n for (const [entityId, config] of entries) {\n if (config.kind === 'tool') {\n if (isActivePath(pathname, config.routes.list)) {\n return entityId;\n }\n } else if (config.hasList && isActivePath(pathname, config.routes.list)) {\n return entityId;\n }\n }\n return null;\n};\n\nexport const resolveActiveGroupId = (\n groups: Record<string, BackofficeSidebarGroupConfig>,\n activeEntityId: string | null,\n entities: BackofficeEntityManifestMap,\n sidebar: BackofficeSidebarConfig | undefined,\n permissions: unknown,\n): string | null => {\n if (activeEntityId == null) {\n return null;\n }\n\n if (!isEntityVisible(activeEntityId, entities, sidebar, permissions)) {\n return null;\n }\n\n for (const [groupId, group] of Object.entries(groups)) {\n const isVisible = group.isVisible == null || group.isVisible(permissions);\n if (\n isVisible &&\n resolveGroupEntityIds(group, sidebar).includes(activeEntityId)\n ) {\n return groupId;\n }\n }\n\n return null;\n};\n"],"mappings":"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"}
package/lib/esm/style.css CHANGED
@@ -1,2 +1,2 @@
1
- .w8yhmy0{cursor:pointer;background:0 0;border-style:none;border-width:0;padding:0;text-decoration:none}.w8yhmy0:hover{color:var(--plumile-colors-brandSecondaryOrange);text-decoration:underline}.w8yhmy1:hover:not(:disabled){background-color:color-mix(in srgb, var(--plumile-colors-brandPrimaryRed) 8%, transparent);color:var(--plumile-colors-brandSecondaryOrange);border-color:var(--plumile-colors-brandSecondaryOrange)}._1vn15b70{max-width:10ch}._1vn15b71{max-width:18ch}._1vn15b72{max-width:28ch}._1vn15b73{max-width:44ch}._1vn15b74{max-width:64ch}._1vn15b75{max-width:100%}._80s44h0{margin:0;padding:0;list-style:none}._80s44h1{text-decoration:none}._80s44h1:hover{text-decoration:underline}@keyframes _11exksg0{0%{transform:translate(-120%)}60%{transform:translate(30%)}to{transform:translate(120%)}}._11exksg1{height:3px}._11exksg2{background:linear-gradient(90deg, var(--plumile-colors-primaryLight) 0%, var(--plumile-colors-primary) 60%, var(--plumile-colors-primaryLight) 100%);animation:1.1s ease-in-out infinite _11exksg0}.hwnq700:hover{color:var(--plumile-colors-text);background-color:var(--plumile-colors-surfaceSecondary);border-color:var(--plumile-colors-borderSubtle)}.hwnq700:focus-visible{outline:2px solid var(--plumile-colors-primary);outline-offset:2px}._1xws1b00:hover{background-color:var(--plumile-colors-surfaceMuted);color:var(--plumile-colors-text)}._1xws1b00:focus-visible{outline:2px solid var(--plumile-colors-blue-500);outline-offset:2px}.wy96wu0{justify-content:center;padding:0 4px}.wy96wu1{justify-content:center;align-items:center;gap:6px;width:100%;display:inline-flex}.wy96wu2{place-items:center;width:24px;height:24px;display:grid}.c0tad0{justify-content:flex-end}.c0tad1{flex-shrink:0;justify-content:center;align-items:center;width:2rem;height:2rem;display:inline-flex}._1lzrtns0{flex:none}._1lzrtns1{flex:0 auto}.mt26ef0{grid-template-columns:repeat(12,minmax(0,1fr))}.mt26ef1{min-width:0}.mt26ef2{grid-column:span 3}.mt26ef3{grid-column:span 4}.mt26ef4{grid-column:span 6}.mt26ef5{grid-column:span 8}.mt26ef6{grid-column:1/-1}.mt26efd:last-child{border-bottom-width:0}.mt26efd:hover{color:var(--plumile-colors-primary)}@media screen and (width<=1199px){.mt26ef0{grid-template-columns:repeat(2,minmax(0,1fr))}.mt26ef2,.mt26ef3{grid-column:span 1}.mt26ef4,.mt26ef5{grid-column:span 2}}@media screen and (width<=767px){.mt26ef0{grid-template-columns:minmax(0,1fr)}.mt26ef4,.mt26ef5{grid-column:span 1}}._1myhzvp0{min-height:84px}._1myhzvp0:hover{border-color:var(--plumile-colors-border);background-color:var(--plumile-colors-surfaceMuted)}._1myhzvp0:focus-visible{outline:2px solid var(--plumile-colors-primary);outline-offset:2px}
1
+ .w8yhmy0{cursor:pointer;background:0 0;border-style:none;border-width:0;padding:0;text-decoration:none}.w8yhmy0:hover{color:var(--plumile-colors-brandSecondaryOrange);text-decoration:underline}.w8yhmy1:hover:not(:disabled){background-color:color-mix(in srgb, var(--plumile-colors-brandPrimaryRed) 8%, transparent);color:var(--plumile-colors-brandSecondaryOrange);border-color:var(--plumile-colors-brandSecondaryOrange)}._1vn15b70{max-width:10ch}._1vn15b71{max-width:18ch}._1vn15b72,._1vn15b73{max-width:28ch}._1vn15b74{max-width:44ch}._1vn15b75{max-width:64ch}._1vn15b76{max-width:100%}.oa1uye0{grid-template-columns:minmax(0,1fr) auto;min-height:2.5rem}.oa1uye0:hover:not(:disabled){background-color:var(--plumile-colors-surfaceMuted);border-color:var(--plumile-colors-borderStrong)}.oa1uye0:focus-visible{outline:2px solid var(--plumile-colors-primary);outline-offset:2px}.oa1uye0:disabled{cursor:not-allowed;opacity:.65}.oa1uye1{grid-column:1/-1}.sqlyj42{grid-template-columns:minmax(0,1fr) auto}.sqlyj41 .sqlyj42{grid-template-columns:minmax(0,1fr)}.sqlyj45{width:11.5rem}@media screen and (width<=1023px){.sqlyj42{grid-template-columns:minmax(0,1fr)}.sqlyj44,.sqlyj46{justify-content:flex-start}}@media screen and (width<=767px){.sqlyj43,.sqlyj44{align-items:stretch;width:100%}.sqlyj45{width:100%}.sqlyj46{align-items:stretch;width:100%}}.u4nszr0{margin-top:1px}.u4nszr1{min-height:92px}.u4nszr1:hover{border-color:var(--plumile-colors-border);background-color:var(--plumile-colors-surfaceMuted);transform:translateY(-1px)}.u4nszr1:focus-visible{outline:2px solid var(--plumile-colors-primary);outline-offset:2px}._80s44h0{margin:0;padding:0;list-style:none}._80s44h1{text-decoration:none}._80s44h2:hover{background-color:var(--plumile-colors-surfaceMuted);color:var(--plumile-colors-text)}._80s44h2:focus-visible{outline:2px solid var(--plumile-colors-primary);outline-offset:2px}._80s44h4{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}._80s44h5{text-decoration:none}._80s44h5:hover{text-decoration:underline}._80s44h5:focus-visible{outline:2px solid var(--plumile-colors-primary);outline-offset:2px}@keyframes _11exksg0{0%{transform:translate(-120%)}60%{transform:translate(30%)}to{transform:translate(120%)}}._11exksg1{height:3px}._11exksg2{background:linear-gradient(90deg, var(--plumile-colors-primaryLight) 0%, var(--plumile-colors-primary) 60%, var(--plumile-colors-primaryLight) 100%);animation:1.1s ease-in-out infinite _11exksg0}.hwnq700:hover{color:var(--plumile-colors-text);background-color:var(--plumile-colors-primaryLight);border-color:var(--plumile-colors-primary)}.hwnq700:focus-visible{outline:2px solid var(--plumile-colors-primary);outline-offset:2px}.kk18lv0:hover{color:var(--plumile-colors-brandPrimaryRed);background-color:var(--plumile-colors-surface);border-color:var(--plumile-colors-brandPrimaryRed);box-shadow:var(--plumile-boxShadow-sm)}.kk18lv0:focus-visible{outline:2px solid var(--plumile-colors-primary);outline-offset:2px}.kk18lv0:hover .kk18lv1{color:var(--plumile-colors-brandPrimaryRed)}._1q232kj0{grid-template-columns:auto minmax(0,1fr);display:inline-grid}._1q232kj4:hover{color:var(--plumile-colors-text);text-underline-offset:3px;text-decoration:underline}._1q232kj4:focus-visible{outline:2px solid var(--plumile-colors-primary);outline-offset:2px;border-radius:var(--plumile-borderRadius-sm)}._1q232kj5{width:14px;height:14px}._1xws1b00:hover{background-color:var(--plumile-colors-surfaceMuted);color:var(--plumile-colors-text)}._1xws1b00:focus-visible{outline:2px solid var(--plumile-colors-blue-500);outline-offset:2px}._15f5d9v0{border:0;min-width:0;margin:0;padding:0}.ds2thc1{flex-shrink:0}@media screen and (width<=767px){.ds2thc0{flex-direction:column;align-items:stretch}.ds2thc1{justify-content:flex-end}._8gc5760{width:100%}}.wy96wu0{justify-content:center;padding:0 4px}.wy96wu1{justify-content:center;align-items:center;gap:6px;width:100%;display:inline-flex}.wy96wu2{place-items:center;width:24px;height:24px;display:grid}.c0tad0{justify-content:flex-end}.c0tad1{flex-shrink:0;justify-content:center;align-items:center;width:2rem;height:2rem;display:inline-flex}._1lzrtns0{flex:none}._1lzrtns1{flex:0 auto}@media screen and (width>=768px){._1i6bm7z0{padding-left:var(--plumile-spacing-2);border-left:1px solid var(--plumile-colors-borderSubtle)}}._1v9etop0{min-height:100%;box-shadow:0 1px 0 var(--plumile-colors-borderLight)}._1v9etop0._1v9etop0{background-color:var(--plumile-colors-surface)}._9npmwz0{align-items:stretch}._9npmwz1{height:100%;transition-property:border-color,box-shadow,transform;transition-duration:var(--plumile-transitionDuration-150);transition-timing-function:var(--plumile-transitionTimingFunction-ease)}._9npmwz2{transition-property:transform;transition-duration:var(--plumile-transitionDuration-150);transition-timing-function:var(--plumile-transitionTimingFunction-ease)}._9npmwz2:hover{transform:translateY(-1px)}._9npmwz2:focus-visible{outline:2px solid var(--plumile-colors-primary);outline-offset:3px;border-radius:var(--plumile-borderRadius-lg)}._3w0i4k0{transition-property:background-color,border-color,box-shadow;transition-duration:var(--plumile-transitionDuration-150);transition-timing-function:var(--plumile-transitionTimingFunction-ease)}._3w0i4k0:hover{background-color:var(--plumile-colors-primaryLight);border-color:var(--plumile-colors-primary)}._3w0i4k0:focus-visible{outline:2px solid var(--plumile-colors-primary);outline-offset:2px}.s560xy2{transition-property:background-color,color;transition-duration:var(--plumile-transitionDuration-150);transition-timing-function:var(--plumile-transitionTimingFunction-ease)}.s560xy2:hover{background-color:var(--plumile-colors-surfaceMuted);color:var(--plumile-colors-primary)}.s560xy2:focus-visible{outline:2px solid var(--plumile-colors-primary);outline-offset:2px}
2
2
  /*$vite$:1*/
@@ -1,6 +1,6 @@
1
1
  import { t as e } from "./useBackofficeReactTranslation-Btt58EIo.js";
2
2
  import { a as t, c as n, d as r, o as i, r as a, s as o, t as s } from "./loginPage.css-B7Io_DuU.js";
3
- import { o as c } from "./useAuth-CheTnq60.js";
3
+ import { o as c } from "./useAuth-CWf8ZspF.js";
4
4
  import { t as l } from "./AuthPanel-BaIRFGbX.js";
5
5
  import { useCallback as u, useEffect as d, useMemo as f, useRef as p, useState as m } from "react";
6
6
  import { Trans as h } from "react-i18next";
@@ -30,15 +30,14 @@ var T = ({ auth: i, onSuccess: a, defaultEmail: c, isAttemptingPasskey: l = !1,
30
30
  }
31
31
  await i.loginWithPasskey({ email: h.trim() }) === "success" && a();
32
32
  } catch {
33
- let e = i.error?.message;
34
- x(e ?? p("auth.passkey.errors.failed"));
33
+ x(p("auth.passkey.errors.failed"));
35
34
  }
36
35
  }, [
37
36
  i,
38
37
  h,
39
38
  a,
40
39
  p
41
- ]), T = b ?? i.error?.message ?? null;
40
+ ]), T = b;
42
41
  return /* @__PURE__ */ w("form", {
43
42
  className: t,
44
43
  onSubmit: S,
@@ -214,8 +213,8 @@ var T = ({ auth: i, onSuccess: a, defaultEmail: c, isAttemptingPasskey: l = !1,
214
213
  try {
215
214
  let n = e.trim(), r = await t.beginAuthentication(n);
216
215
  s(n), _(r.methods), y(r.lockedUntil), r.methods.some((e) => e === "PASSKEY") ? x("passkey") : r.methods.includes("PASSWORD") ? x("password") : x("methods");
217
- } catch (e) {
218
- k(e instanceof Error ? e.message : a("auth.loginFlow.errors.tryAgain"));
216
+ } catch {
217
+ k(a("auth.loginFlow.errors.tryAgain"));
219
218
  }
220
219
  }, [t, a]);
221
220
  d(() => {
@@ -234,9 +233,9 @@ var T = ({ auth: i, onSuccess: a, defaultEmail: c, isAttemptingPasskey: l = !1,
234
233
  return;
235
234
  }
236
235
  x("methods"), k(a("auth.loginFlow.errors.passkeyUnavailable"));
237
- } catch (e) {
236
+ } catch {
238
237
  if (!j.current) return;
239
- k(e instanceof Error ? e.message : a("auth.loginFlow.errors.passkeyUnavailable")), x("methods");
238
+ k(a("auth.loginFlow.errors.passkeyUnavailable")), x("methods");
240
239
  }
241
240
  })().catch(() => {})), () => {
242
241
  j.current = !1;
@@ -321,4 +320,4 @@ async function N(e, t) {
321
320
  //#endregion
322
321
  export { j as n, N as t };
323
322
 
324
- //# sourceMappingURL=synchronizeAuthStatusQuery-BoPKMrP1.js.map
323
+ //# sourceMappingURL=synchronizeAuthStatusQuery-DNJR5MfH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"synchronizeAuthStatusQuery-DNJR5MfH.js","names":[],"sources":["../../src/auth/login/PasskeyLoginForm.tsx","../../src/auth/login/MethodChooser.tsx","../../src/auth/login/EmailCapturePanel.tsx","../../src/auth/login/OidcButtons.tsx","../../src/auth/login/PasswordLoginPanel.tsx","../../src/auth/login/LoginFlow.tsx","../../src/auth/login/synchronizeAuthStatusQuery.ts"],"sourcesContent":["/* eslint-disable no-ternary */\nimport {\n useCallback,\n useEffect,\n useState,\n type FormEvent,\n type JSX,\n} from 'react';\nimport { useBackofficeReactTranslation } from '../../i18n/useBackofficeReactTranslation.js';\n\nimport { Button, FormError, FormField } from '@plumile/ui';\n\nimport type { UseAuthReturn } from '../../hooks/useAuth.js';\n\nimport * as styles from './loginPage.css.js';\n\ntype Props = {\n auth: Pick<\n UseAuthReturn,\n | 'loginWithPasskey'\n | 'isLoading'\n | 'error'\n | 'emailHint'\n | 'nextStep'\n | 'beginAuthentication'\n | 'lockedUntil'\n | 'availableMethods'\n >;\n onSuccess: () => void;\n defaultEmail?: string;\n isAttemptingPasskey?: boolean;\n onShowMethods?: () => void;\n};\n\nexport const PasskeyLoginForm = ({\n auth,\n onSuccess,\n defaultEmail,\n isAttemptingPasskey = false,\n onShowMethods,\n}: Props): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n const [email, setEmail] = useState(auth.emailHint ?? '');\n const [localError, setLocalError] = useState<string | null>(null);\n\n useEffect(() => {\n if (auth.emailHint != null && auth.emailHint !== '') {\n setEmail(auth.emailHint);\n } else if (defaultEmail != null && defaultEmail !== '') {\n setEmail(defaultEmail);\n }\n }, [auth.emailHint, defaultEmail]);\n\n const handleSubmit = useCallback(\n async (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n setLocalError(null);\n\n if (email.trim() === '') {\n setLocalError(t('auth.passkey.errors.emailRequired'));\n return;\n }\n\n try {\n const result = await auth.beginAuthentication(email.trim());\n if (Array.isArray(result.methods) && result.methods.length === 0) {\n const lockedUntilMessage =\n result.lockedUntil != null\n ? t('auth.passkey.errors.lockedWithTime', {\n time: new Date(result.lockedUntil).toLocaleString(),\n })\n : t('auth.passkey.errors.locked');\n setLocalError(lockedUntilMessage);\n return;\n }\n if (\n Array.isArray(result.methods) &&\n !result.methods.includes('PASSKEY')\n ) {\n setLocalError(t('auth.passkey.errors.notAvailable'));\n return;\n }\n\n const status = await auth.loginWithPasskey({ email: email.trim() });\n if (status === 'success') {\n onSuccess();\n }\n } catch {\n setLocalError(t('auth.passkey.errors.failed'));\n }\n },\n [auth, email, onSuccess, t],\n );\n\n const formError = localError;\n\n return (\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n <form className={styles.formSurface} onSubmit={handleSubmit} noValidate>\n <div className={styles.stack}>\n <p className={styles.helper}>{t('auth.passkey.helper')}</p>\n {formError != null ? <FormError>{formError}</FormError> : null}\n <FormField\n label={t('auth.passkey.form.emailLabel')}\n name=\"passkey-email\"\n type=\"email\"\n value={email}\n onChange={(event) => {\n setEmail(event.target.value);\n setLocalError(null);\n }}\n placeholder={t('auth.passkey.form.emailPlaceholder')}\n autoComplete=\"email\"\n required\n />\n </div>\n <div className={styles.actionsRow}>\n <Button type=\"submit\" variant=\"primary\" isLoading={auth.isLoading}>\n {isAttemptingPasskey\n ? t('auth.passkey.actions.submitting')\n : t('auth.passkey.actions.submit')}\n </Button>\n {onShowMethods != null ? (\n <button\n type=\"button\"\n className={styles.inlineLink}\n onClick={onShowMethods}\n >\n {t('auth.passkey.actions.showMethods')}\n </button>\n ) : null}\n </div>\n </form>\n );\n};\n","/* eslint-disable no-ternary */\nimport { type JSX } from 'react';\nimport { Trans } from 'react-i18next';\nimport { Button, FormError, cx } from '@plumile/ui';\n\nimport type { AuthMethod } from '../../modules/sharedSchemaTypes.js';\nimport { useBackofficeReactTranslation } from '../../i18n/useBackofficeReactTranslation.js';\n\nimport * as styles from './loginPage.css.js';\n\ntype Props = {\n email: string;\n methods: readonly AuthMethod[];\n lockedUntil: string | null;\n onSelect: (method: AuthMethod) => void;\n onBack: () => void;\n};\n\nexport const MethodChooser = ({\n email,\n methods,\n lockedUntil,\n onSelect,\n onBack,\n}: Props): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n const isLocked = methods.length === 0;\n const lockedMessage =\n lockedUntil != null\n ? t('auth.methodChooser.lockedWithTime', {\n time: new Date(lockedUntil).toLocaleString(),\n })\n : t('auth.methodChooser.locked');\n\n const methodButtons = methods.map((method) => {\n const label =\n method === 'PASSKEY'\n ? t('auth.methodChooser.methods.passkey')\n : method === 'PASSWORD'\n ? t('auth.methodChooser.methods.password')\n : t('auth.methodChooser.methods.other', {\n method: method.toLowerCase(),\n });\n return (\n <Button\n key={method}\n type=\"button\"\n variant=\"secondary\"\n onClick={() => {\n onSelect(method);\n }}\n className={cx(styles.fullWidth, styles.brandGhostButton)}\n >\n {label}\n </Button>\n );\n });\n\n return (\n <div className={styles.formSurface}>\n <div className={styles.stack}>\n <p className={styles.helper}>\n <Trans\n i18nKey=\"auth.methodChooser.prompt\"\n values={{ email }}\n components={{ strong: <strong /> }}\n />\n </p>\n {isLocked ? <FormError>{lockedMessage}</FormError> : null}\n {!isLocked ? methodButtons : null}\n <Button\n type=\"button\"\n variant=\"text\"\n onClick={onBack}\n className={styles.inlineLink}\n >\n {t('auth.methodChooser.actions.back')}\n </Button>\n </div>\n </div>\n );\n};\n","import { type JSX } from 'react';\nimport { useBackofficeReactTranslation } from '../../i18n/useBackofficeReactTranslation.js';\n\nimport { Button, FormError, FormField } from '@plumile/ui';\n\nimport { AuthPanel } from './AuthPanel.js';\nimport * as styles from './loginPage.css.js';\n\ntype Props = {\n email: string;\n errorMessage: string | null;\n isLoading: boolean;\n onEmailChange: (value: string) => void;\n onContinue: () => void;\n onForgotPassword: () => void;\n};\n\nexport const EmailCapturePanel = ({\n email,\n errorMessage,\n isLoading,\n onEmailChange,\n onContinue,\n onForgotPassword,\n}: Props): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n return (\n <AuthPanel>\n <div className={styles.formSurface}>\n <p className={styles.helper}>{t('auth.emailCapture.description')}</p>\n {errorMessage != null && <FormError>{errorMessage}</FormError>}\n <FormField\n label={t('auth.emailCapture.emailLabel')}\n name=\"email\"\n type=\"email\"\n value={email}\n onChange={(event) => {\n onEmailChange(event.target.value);\n }}\n placeholder={t('auth.emailCapture.emailPlaceholder')}\n autoComplete=\"email\"\n required\n />\n <div className={styles.actionsRow}>\n <Button\n type=\"button\"\n variant=\"primary\"\n onClick={onContinue}\n isLoading={isLoading}\n >\n {t('auth.emailCapture.continue')}\n </Button>\n <button\n type=\"button\"\n className={styles.inlineLink}\n onClick={onForgotPassword}\n >\n {t('auth.emailCapture.forgotPassword')}\n </button>\n </div>\n </div>\n </AuthPanel>\n );\n};\n","import { type JSX } from 'react';\n\nimport { Button } from '@plumile/ui';\n\nimport type { OidcProviderKind } from '../../modules/sharedSchemaTypes.js';\nimport { useBackofficeReactTranslation } from '../../i18n/useBackofficeReactTranslation.js';\n\nimport * as styles from './loginPage.css.js';\n\nconst OIDC_START_PATH = '/auth/oidc/start';\n\ntype Props = {\n providers: readonly OidcProviderKind[];\n};\n\nexport const OidcButtons = ({ providers }: Props): JSX.Element | null => {\n const { t } = useBackofficeReactTranslation();\n\n if (providers.length === 0) {\n return null;\n }\n\n return (\n <div className={styles.stack}>\n {providers.map((provider) => {\n let label = t('auth.oidc.buttons.generic');\n if (provider === 'GOOGLE') {\n label = t('auth.oidc.buttons.google');\n } else if (provider === 'APPLE') {\n label = t('auth.oidc.buttons.apple');\n }\n const providerName = provider.toLowerCase();\n return (\n <Button\n key={provider}\n type=\"button\"\n variant=\"secondary\"\n className={styles.brandGhostButton}\n onClick={() => {\n window.location.assign(\n `${OIDC_START_PATH}?provider=${providerName}`,\n );\n }}\n >\n {label}\n </Button>\n );\n })}\n </div>\n );\n};\n","import { type JSX } from 'react';\nimport { useBackofficeReactTranslation } from '../../i18n/useBackofficeReactTranslation.js';\n\nimport { LoginForm, type LoginFormAuthAdapter } from '@plumile/ui';\n\nimport type { OidcProviderKind } from '../../modules/sharedSchemaTypes.js';\n\nimport { AuthPanel } from './AuthPanel.js';\nimport { OidcButtons } from './OidcButtons.js';\nimport * as styles from './loginPage.css.js';\n\ntype Props = {\n auth: LoginFormAuthAdapter;\n defaultEmail: string;\n onForgotPassword: () => void;\n onSuccess: () => void;\n providers: readonly OidcProviderKind[];\n};\n\nexport const PasswordLoginPanel = ({\n auth,\n defaultEmail,\n onForgotPassword,\n onSuccess,\n providers,\n}: Props): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n return (\n <AuthPanel title={t('auth.passwordLogin.title')}>\n <div className={styles.formSurface}>\n <LoginForm\n auth={auth}\n onSuccess={onSuccess}\n defaultEmail={defaultEmail}\n />\n <div className={styles.actionsRow}>\n <button\n type=\"button\"\n className={styles.inlineLink}\n onClick={onForgotPassword}\n >\n {t('auth.passwordLogin.forgotPassword')}\n </button>\n </div>\n <OidcButtons providers={providers} />\n </div>\n </AuthPanel>\n );\n};\n","/* eslint-disable no-ternary */\nimport {\n type JSX,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useBackofficeReactTranslation } from '../../i18n/useBackofficeReactTranslation.js';\n\nimport { AuthLayout } from '@plumile/ui';\n\nimport type {\n AuthMethod,\n OidcProviderKind,\n} from '../../modules/sharedSchemaTypes.js';\nimport type { UseAuthReturn } from '../../hooks/useAuth.js';\n\nimport { MfaChallengeForm } from './MfaChallengeForm.js';\nimport { PasskeyLoginForm } from './PasskeyLoginForm.js';\nimport { MethodChooser } from './MethodChooser.js';\nimport AuthPanel from './AuthPanel.js';\nimport { EmailCapturePanel } from './EmailCapturePanel.js';\nimport { PasswordLoginPanel } from './PasswordLoginPanel.js';\n\nexport type LoginFlowProps = {\n auth: UseAuthReturn;\n oidcProviders: readonly OidcProviderKind[];\n onLoginSuccess: () => void;\n onForgotPassword: () => void;\n};\n\ntype View = 'email' | 'passkey' | 'methods' | 'password' | 'mfa';\n\nexport const LoginFlow = ({\n auth,\n oidcProviders,\n onLoginSuccess,\n onForgotPassword,\n}: LoginFlowProps): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n const [email, setEmail] = useState('');\n const [methods, setMethods] = useState<readonly AuthMethod[]>([]);\n const [lockedUntil, setLockedUntil] = useState<string | null>(null);\n const [view, setView] = useState<View>('email');\n const [hasTriedPasskey, setHasTriedPasskey] = useState(false);\n const [localError, setLocalError] = useState<string | null>(null);\n const passkeyAttemptActive = useRef(true);\n\n const loginAdapter = useMemo(() => {\n return {\n ...auth,\n beginAuthentication: async (inputEmail: string) => {\n const result = await auth.beginAuthentication(inputEmail);\n setEmail(inputEmail);\n setMethods(result.methods);\n setLockedUntil(result.lockedUntil);\n return result;\n },\n };\n }, [auth]);\n\n const handleLoginSuccess = useCallback(\n ({ force } = { force: false }) => {\n if (!force && auth.nextStep === 'TOTP') {\n return;\n }\n onLoginSuccess();\n },\n [auth.nextStep, onLoginSuccess],\n );\n\n const isMfaStep = auth.nextStep === 'TOTP' || view === 'mfa';\n const title = isMfaStep\n ? t('auth.loginFlow.title.mfa')\n : t('auth.loginFlow.title.default');\n const subtitle = isMfaStep\n ? t('auth.loginFlow.subtitle.mfa')\n : t('auth.loginFlow.subtitle.default');\n\n const startFlowForEmail = useCallback(\n async (inputEmail: string) => {\n setLocalError(null);\n try {\n const trimmed = inputEmail.trim();\n const result = await auth.beginAuthentication(trimmed);\n setEmail(trimmed);\n setMethods(result.methods);\n setLockedUntil(result.lockedUntil);\n const hasPasskey = result.methods.some((method) => {\n return method === 'PASSKEY';\n });\n\n if (hasPasskey) {\n setView('passkey');\n } else if (result.methods.includes('PASSWORD')) {\n setView('password');\n } else {\n setView('methods');\n }\n } catch {\n setLocalError(t('auth.loginFlow.errors.tryAgain'));\n }\n },\n [auth, t],\n );\n\n useEffect(() => {\n passkeyAttemptActive.current = true;\n const trimmedEmail = email.trim();\n const shouldAttempt =\n view === 'passkey' && !hasTriedPasskey && trimmedEmail !== '';\n\n if (shouldAttempt) {\n setHasTriedPasskey(true);\n const runPasskeyLogin = async () => {\n try {\n const status = await loginAdapter.loginWithPasskey({\n email: trimmedEmail,\n });\n\n if (!passkeyAttemptActive.current) {\n return;\n }\n\n if (status === 'success') {\n handleLoginSuccess();\n return;\n }\n\n if (status === 'mfa-required') {\n setView('mfa');\n return;\n }\n\n setView('methods');\n setLocalError(t('auth.loginFlow.errors.passkeyUnavailable'));\n } catch {\n if (!passkeyAttemptActive.current) {\n return;\n }\n\n setLocalError(t('auth.loginFlow.errors.passkeyUnavailable'));\n setView('methods');\n }\n };\n runPasskeyLogin().catch(() => {\n // Errors are handled inside runPasskeyLogin; ignore any unexpected rethrow.\n });\n }\n\n return () => {\n passkeyAttemptActive.current = false;\n };\n }, [email, handleLoginSuccess, hasTriedPasskey, loginAdapter, t, view]);\n\n let content: JSX.Element;\n\n if (isMfaStep) {\n content = (\n <AuthPanel>\n <MfaChallengeForm\n auth={auth}\n onSuccess={() => {\n handleLoginSuccess({ force: true });\n }}\n onBack={() => {\n auth.reset();\n setView('email');\n }}\n />\n </AuthPanel>\n );\n } else if (view === 'passkey') {\n content = (\n <AuthPanel\n title={t('auth.loginFlow.passkey.title')}\n description={t('auth.loginFlow.passkey.description', { email })}\n >\n <PasskeyLoginForm\n auth={loginAdapter}\n onSuccess={handleLoginSuccess}\n onShowMethods={() => {\n setView('methods');\n }}\n defaultEmail={email}\n isAttemptingPasskey={auth.isLoading}\n />\n </AuthPanel>\n );\n } else if (view === 'methods') {\n content = (\n <AuthPanel title={t('auth.loginFlow.methods.title')}>\n <MethodChooser\n email={email}\n methods={methods}\n lockedUntil={lockedUntil}\n onSelect={(method) => {\n if (method === 'PASSKEY') {\n setView('passkey');\n return;\n }\n if (method === 'PASSWORD') {\n setView('password');\n }\n }}\n onBack={() => {\n setView('email');\n }}\n />\n </AuthPanel>\n );\n } else if (view === 'password') {\n content = (\n <PasswordLoginPanel\n auth={loginAdapter}\n defaultEmail={email}\n onForgotPassword={onForgotPassword}\n onSuccess={handleLoginSuccess}\n providers={oidcProviders}\n />\n );\n } else {\n // email capture only\n content = (\n <EmailCapturePanel\n email={email}\n errorMessage={localError}\n isLoading={auth.isLoading}\n onEmailChange={(value) => {\n setEmail(value);\n setLocalError(null);\n }}\n onContinue={() => {\n const trimmed = email.trim();\n if (trimmed === '') {\n setLocalError(t('auth.loginFlow.errors.emailRequired'));\n return;\n }\n startFlowForEmail(trimmed).catch(() => {\n // startFlowForEmail handles its own errors.\n });\n }}\n onForgotPassword={onForgotPassword}\n />\n );\n }\n\n return (\n <AuthLayout title={title} subtitle={subtitle}>\n {content}\n </AuthLayout>\n );\n};\n","import RelayRuntime, {\n type GraphQLTaggedNode,\n type IEnvironment,\n type OperationType,\n} from 'relay-runtime';\n\nconst { fetchQuery } = RelayRuntime;\n\ntype AuthStatusQueryResponse = {\n readonly isLoggedIn?: boolean | null;\n};\n\n/**\n * Forces a fresh auth-status read from network to avoid stale cache guards\n * right after login mutations complete.\n */\nexport async function synchronizeAuthStatusQuery<TQuery extends OperationType>(\n environment: IEnvironment,\n query: GraphQLTaggedNode,\n): Promise<boolean> {\n const response = await fetchQuery<TQuery>(\n environment,\n query,\n {},\n { fetchPolicy: 'network-only' },\n ).toPromise();\n\n const isLoggedIn = (response as AuthStatusQueryResponse | null | undefined)\n ?.isLoggedIn;\n return isLoggedIn === true;\n}\n"],"mappings":"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"}
@@ -24,4 +24,4 @@ var e = (e, t) => e(t), t = (t, n) => {
24
24
  //#endregion
25
25
  export { n, t };
26
26
 
27
- //# sourceMappingURL=toastViewAction-DJkv_4p9.js.map
27
+ //# sourceMappingURL=toastViewAction-DQYlcGOL.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"toastViewAction-DJkv_4p9.js","names":[],"sources":["../../src/components/backoffice/actions/toastViewAction.ts"],"sourcesContent":["import type { TFunction } from 'i18next';\n\nimport type {\n BackofficeActionToastSpec,\n BackofficeEntityManifestMap,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\nimport type { ToastAction } from '@plumile/ui';\n\nconst resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\nexport const resolveToastSpec = <Node = unknown, Response = unknown>(\n toast: BackofficeActionToastSpec<Node, Response>,\n tApp: TFunction,\n): { title: string; message?: string } => {\n const title = resolveLabel(toast.title, tApp);\n let message: string | undefined;\n if (toast.message != null) {\n message = resolveLabel(toast.message, tApp);\n }\n return { title, message };\n};\n\nexport const resolveToastViewActions = <\n Node = unknown,\n Response = unknown,\n>(input: {\n toast: BackofficeActionToastSpec<Node, Response>;\n response: Response;\n node: Node;\n tApp: TFunction;\n entities: BackofficeEntityManifestMap;\n defaultLabel: string;\n navigateTo: (to: string) => void;\n}): readonly ToastAction[] | undefined => {\n const { toast } = input;\n if (toast.view == null) {\n return undefined;\n }\n\n const targetId = toast.view.getTargetId(input.response, input.node);\n if (targetId == null || targetId.trim() === '') {\n return undefined;\n }\n\n const entity = input.entities[toast.view.entityId];\n if (entity == null) {\n return undefined;\n }\n\n const href = entity.routes.detail(targetId);\n let label = input.defaultLabel;\n if (toast.view.label != null) {\n label = resolveLabel(toast.view.label, input.tApp);\n }\n\n return [\n {\n id: `view-${toast.view.entityId}-${targetId}`,\n label,\n onClick: () => {\n input.navigateTo(href);\n },\n },\n ];\n};\n"],"mappings":";AASA,IAAM,KAAgB,GAAkB,MAC/B,EAAM,EAAK,EAGP,KACX,GACA,MACwC;CACxC,IAAM,IAAQ,EAAa,EAAM,OAAO,EAAK,EACzC;CAIJ,OAHI,EAAM,WAAW,SACnB,IAAU,EAAa,EAAM,SAAS,EAAK,GAEtC;EAAE;EAAO;EAAS;GAGd,KAGX,MAQwC;CACxC,IAAM,EAAE,aAAU;CAClB,IAAI,EAAM,QAAQ,MAChB;CAGF,IAAM,IAAW,EAAM,KAAK,YAAY,EAAM,UAAU,EAAM,KAAK;CACnE,IAAI,KAAY,QAAQ,EAAS,MAAM,KAAK,IAC1C;CAGF,IAAM,IAAS,EAAM,SAAS,EAAM,KAAK;CACzC,IAAI,KAAU,MACZ;CAGF,IAAM,IAAO,EAAO,OAAO,OAAO,EAAS,EACvC,IAAQ,EAAM;CAKlB,OAJI,EAAM,KAAK,SAAS,SACtB,IAAQ,EAAa,EAAM,KAAK,OAAO,EAAM,KAAK,GAG7C,CACL;EACE,IAAI,QAAQ,EAAM,KAAK,SAAS,GAAG;EACnC;EACA,eAAe;GACb,EAAM,WAAW,EAAK;;EAEzB,CACF"}
1
+ {"version":3,"file":"toastViewAction-DQYlcGOL.js","names":[],"sources":["../../src/components/backoffice/actions/toastViewAction.ts"],"sourcesContent":["import type { TFunction } from 'i18next';\n\nimport type {\n BackofficeActionToastSpec,\n BackofficeEntityManifestMap,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\nimport type { ToastAction } from '@plumile/ui';\n\nconst resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\nexport const resolveToastSpec = <Node = unknown, Response = unknown>(\n toast: BackofficeActionToastSpec<Node, Response>,\n tApp: TFunction,\n): { title: string; message?: string } => {\n const title = resolveLabel(toast.title, tApp);\n let message: string | undefined;\n if (toast.message != null) {\n message = resolveLabel(toast.message, tApp);\n }\n return { title, message };\n};\n\nexport const resolveToastViewActions = <\n Node = unknown,\n Response = unknown,\n>(input: {\n toast: BackofficeActionToastSpec<Node, Response>;\n response: Response;\n node: Node;\n tApp: TFunction;\n entities: BackofficeEntityManifestMap;\n defaultLabel: string;\n navigateTo: (to: string) => void;\n}): readonly ToastAction[] | undefined => {\n const { toast } = input;\n if (toast.view == null) {\n return undefined;\n }\n\n const targetId = toast.view.getTargetId(input.response, input.node);\n if (targetId == null || targetId.trim() === '') {\n return undefined;\n }\n\n const entity = input.entities[toast.view.entityId];\n if (entity == null) {\n return undefined;\n }\n\n const href = entity.routes.detail(targetId);\n let label = input.defaultLabel;\n if (toast.view.label != null) {\n label = resolveLabel(toast.view.label, input.tApp);\n }\n\n return [\n {\n id: `view-${toast.view.entityId}-${targetId}`,\n label,\n onClick: () => {\n input.navigateTo(href);\n },\n },\n ];\n};\n"],"mappings":";AASA,IAAM,KAAgB,GAAkB,MAC/B,EAAM,EAAK,EAGP,KACX,GACA,MACwC;CACxC,IAAM,IAAQ,EAAa,EAAM,OAAO,EAAK,EACzC;CAIJ,OAHI,EAAM,WAAW,SACnB,IAAU,EAAa,EAAM,SAAS,EAAK,GAEtC;EAAE;EAAO;EAAS;GAGd,KAGX,MAQwC;CACxC,IAAM,EAAE,aAAU;CAClB,IAAI,EAAM,QAAQ,MAChB;CAGF,IAAM,IAAW,EAAM,KAAK,YAAY,EAAM,UAAU,EAAM,KAAK;CACnE,IAAI,KAAY,QAAQ,EAAS,MAAM,KAAK,IAC1C;CAGF,IAAM,IAAS,EAAM,SAAS,EAAM,KAAK;CACzC,IAAI,KAAU,MACZ;CAGF,IAAM,IAAO,EAAO,OAAO,OAAO,EAAS,EACvC,IAAQ,EAAM;CAKlB,OAJI,EAAM,KAAK,SAAS,SACtB,IAAQ,EAAa,EAAM,KAAK,OAAO,EAAM,KAAK,GAG7C,CACL;EACE,IAAI,QAAQ,EAAM,KAAK,SAAS,GAAG;EACnC;EACA,eAAe;GACb,EAAM,WAAW,EAAK;;EAEzB,CACF"}