@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.
- package/lib/esm/{AcceptInvitationScreen-B1IPafwD.js → AcceptInvitationScreen-VaWXQPHp.js} +4 -4
- package/lib/esm/AcceptInvitationScreen-VaWXQPHp.js.map +1 -0
- package/lib/esm/{BackofficeAcceptInvitationPage-BfRsORii.js → BackofficeAcceptInvitationPage-tpfBfhT9.js} +4 -4
- package/lib/esm/{BackofficeAcceptInvitationPage-BfRsORii.js.map → BackofficeAcceptInvitationPage-tpfBfhT9.js.map} +1 -1
- package/lib/esm/BackofficeDashboardPage-D5W36DY-.js +329 -0
- package/lib/esm/BackofficeDashboardPage-D5W36DY-.js.map +1 -0
- package/lib/esm/BackofficeDetailPayload-CZcsDv2w.js +98 -0
- package/lib/esm/BackofficeDetailPayload-CZcsDv2w.js.map +1 -0
- package/lib/esm/BackofficeEntityActionFormDialog-DrZxuytz.js +589 -0
- package/lib/esm/BackofficeEntityActionFormDialog-DrZxuytz.js.map +1 -0
- package/lib/esm/{BackofficeEntityDetailLayoutContext-DeuH5PCW.js → BackofficeEntityDetailLayoutContext-C5G-PH28.js} +1 -1
- package/lib/esm/{BackofficeEntityDetailLayoutContext-DeuH5PCW.js.map → BackofficeEntityDetailLayoutContext-C5G-PH28.js.map} +1 -1
- package/lib/esm/{BackofficeEntityDetailLayoutPage-Duc_DcIV.js → BackofficeEntityDetailLayoutPage-BSgGBzSL.js} +2 -2
- package/lib/esm/{BackofficeEntityDetailLayoutPage-Duc_DcIV.js.map → BackofficeEntityDetailLayoutPage-BSgGBzSL.js.map} +1 -1
- package/lib/esm/{BackofficeEntityDetailPage-ChxBrqz8.js → BackofficeEntityDetailPage-LB1uEJVM.js} +366 -358
- package/lib/esm/BackofficeEntityDetailPage-LB1uEJVM.js.map +1 -0
- package/lib/esm/{BackofficeEntityDetailUnknownPageRedirect-xupMeril.js → BackofficeEntityDetailUnknownPageRedirect-Iu4R3WvX.js} +3 -3
- package/lib/esm/{BackofficeEntityDetailUnknownPageRedirect-xupMeril.js.map → BackofficeEntityDetailUnknownPageRedirect-Iu4R3WvX.js.map} +1 -1
- package/lib/esm/BackofficeEntityListPage-D_zL-qRb.js +432 -0
- package/lib/esm/BackofficeEntityListPage-D_zL-qRb.js.map +1 -0
- package/lib/esm/BackofficeHubPage-DOePQ8Fc.js +121 -0
- package/lib/esm/BackofficeHubPage-DOePQ8Fc.js.map +1 -0
- package/lib/esm/BackofficeHubTemplate-C6K55egX.js +82 -0
- package/lib/esm/BackofficeHubTemplate-C6K55egX.js.map +1 -0
- package/lib/esm/{BackofficeLayoutPage-r6dXo9SI.js → BackofficeLayoutPage-Bq2bKkYF.js} +301 -217
- package/lib/esm/BackofficeLayoutPage-Bq2bKkYF.js.map +1 -0
- package/lib/esm/BackofficeListToolbar-loFfIPtP.js +109 -0
- package/lib/esm/BackofficeListToolbar-loFfIPtP.js.map +1 -0
- package/lib/esm/{BackofficeLoginPage-BMPhO1cr.js → BackofficeLoginPage-DIlcOueK.js} +5 -5
- package/lib/esm/{BackofficeLoginPage-BMPhO1cr.js.map → BackofficeLoginPage-DIlcOueK.js.map} +1 -1
- package/lib/esm/{BackofficePasswordResetCompletePage-OApMUiOi.js → BackofficePasswordResetCompletePage-Cit5sdDm.js} +6 -7
- package/lib/esm/{BackofficePasswordResetCompletePage-OApMUiOi.js.map → BackofficePasswordResetCompletePage-Cit5sdDm.js.map} +1 -1
- package/lib/esm/{BackofficePasswordResetRequestPage-DPDImb37.js → BackofficePasswordResetRequestPage-B_TurHev.js} +5 -6
- package/lib/esm/{BackofficePasswordResetRequestPage-DPDImb37.js.map → BackofficePasswordResetRequestPage-B_TurHev.js.map} +1 -1
- package/lib/esm/{BackofficePermissionsContext-CmWwudBU.js → BackofficePermissionsContext-C2bdxy2z.js} +1 -1
- package/lib/esm/{BackofficePermissionsContext-CmWwudBU.js.map → BackofficePermissionsContext-C2bdxy2z.js.map} +1 -1
- package/lib/esm/BackofficeRightPageLayout-CfNkrMvH.js +83 -0
- package/lib/esm/BackofficeRightPageLayout-CfNkrMvH.js.map +1 -0
- package/lib/esm/{BackofficeTopbarPortalContext-CphoSrZD.js → BackofficeTopbarPortalContext-Da5XFatM.js} +1 -1
- package/lib/esm/BackofficeTopbarPortalContext-Da5XFatM.js.map +1 -0
- package/lib/esm/{BackofficeVerifyEmailPage-DHuSOxDf.js → BackofficeVerifyEmailPage-DQbFIob1.js} +6 -7
- package/lib/esm/{BackofficeVerifyEmailPage-DHuSOxDf.js.map → BackofficeVerifyEmailPage-DQbFIob1.js.map} +1 -1
- package/lib/esm/EntityIdPickerDialog-BSn0v3bv.js +340 -0
- package/lib/esm/EntityIdPickerDialog-BSn0v3bv.js.map +1 -0
- package/lib/esm/LazyBackofficeEntityActionFormDialog-oRd_WHAK.js +670 -0
- package/lib/esm/LazyBackofficeEntityActionFormDialog-oRd_WHAK.js.map +1 -0
- package/lib/esm/backoffice-react.js +553 -315
- package/lib/esm/backoffice-react.js.map +1 -1
- package/lib/esm/{backofficeAuthPaths-2KMmkBLv.js → backofficeAuthPaths-2hHNn8D3.js} +1 -1
- package/lib/esm/{backofficeAuthPaths-2KMmkBLv.js.map → backofficeAuthPaths-2hHNn8D3.js.map} +1 -1
- package/lib/esm/backofficeEntityActionFormDialog.css-DJgEKwaA.js +6 -0
- package/lib/esm/backofficeEntityActionFormDialog.css-DJgEKwaA.js.map +1 -0
- package/lib/esm/{buildBreadcrumbs-C9cyiXb7.js → buildBreadcrumbs-C5St167Y.js} +1 -1
- package/lib/esm/buildBreadcrumbs-C5St167Y.js.map +1 -0
- package/lib/esm/{buildDataTableColumns-DGPjPK4N.js → buildDataTableColumns-DdmF-EYq.js} +1 -1
- package/lib/esm/{buildDataTableColumns-DGPjPK4N.js.map → buildDataTableColumns-DdmF-EYq.js.map} +1 -1
- package/lib/esm/{mutationResult-CcQMY13J.js → mutationResult-C2Vb_vPt.js} +1 -1
- package/lib/esm/{mutationResult-CcQMY13J.js.map → mutationResult-C2Vb_vPt.js.map} +1 -1
- package/lib/esm/{pageResolution-hAQA5C6S.js → pageResolution-CUaTq4Ql.js} +1 -1
- package/lib/esm/{pageResolution-hAQA5C6S.js.map → pageResolution-CUaTq4Ql.js.map} +1 -1
- package/lib/esm/{sidebarUtils-BZETlHea.js → sidebarUtils-BgCBLJLv.js} +20 -6
- package/lib/esm/sidebarUtils-BgCBLJLv.js.map +1 -0
- package/lib/esm/style.css +1 -1
- package/lib/esm/{synchronizeAuthStatusQuery-BoPKMrP1.js → synchronizeAuthStatusQuery-DNJR5MfH.js} +8 -9
- package/lib/esm/synchronizeAuthStatusQuery-DNJR5MfH.js.map +1 -0
- package/lib/esm/{toastViewAction-DJkv_4p9.js → toastViewAction-DQYlcGOL.js} +1 -1
- package/lib/esm/{toastViewAction-DJkv_4p9.js.map → toastViewAction-DQYlcGOL.js.map} +1 -1
- package/lib/esm/{useAuth-CheTnq60.js → useAuth-CWf8ZspF.js} +70 -66
- package/lib/esm/useAuth-CWf8ZspF.js.map +1 -0
- package/lib/esm/{useBackofficeAuth-DVAXNAjP.js → useBackofficeAuth-Da7FPNys.js} +2 -2
- package/lib/esm/{useBackofficeAuth-DVAXNAjP.js.map → useBackofficeAuth-Da7FPNys.js.map} +1 -1
- package/lib/esm/{useBackofficeLazyValue-CoIAK-5N.js → useBackofficeLazyValue-CW9xfRzQ.js} +1 -1
- package/lib/esm/{useBackofficeLazyValue-CoIAK-5N.js.map → useBackofficeLazyValue-CW9xfRzQ.js.map} +1 -1
- package/lib/esm/{useBackofficeListUrlState-D4fx5O7u.js → useBackofficeListUrlState-Ca6d7uIN.js} +1 -1
- package/lib/esm/useBackofficeListUrlState-Ca6d7uIN.js.map +1 -0
- package/lib/types/auth/login/LoginFlow.d.ts.map +1 -1
- package/lib/types/auth/login/MfaChallengeForm.d.ts.map +1 -1
- package/lib/types/auth/login/PasskeyLoginForm.d.ts.map +1 -1
- package/lib/types/auth/pages/AcceptInvitationScreen.d.ts.map +1 -1
- package/lib/types/components/backoffice/actions/BackofficeEntityActionFormDialog.d.ts.map +1 -1
- package/lib/types/components/backoffice/actions/LazyBackofficeEntityActionFormDialog.d.ts.map +1 -1
- package/lib/types/components/backoffice/actions/backofficeEntityActionFormDialog.css.d.ts +4 -0
- package/lib/types/components/backoffice/actions/backofficeEntityActionFormDialog.css.d.ts.map +1 -1
- package/lib/types/components/backoffice/detail/BackofficeDetailRelationLink.d.ts +3 -5
- package/lib/types/components/backoffice/detail/BackofficeDetailRelationLink.d.ts.map +1 -1
- package/lib/types/components/backoffice/detail/BackofficeDetailRelationListBlock.d.ts +3 -4
- package/lib/types/components/backoffice/detail/BackofficeDetailRelationListBlock.d.ts.map +1 -1
- package/lib/types/components/backoffice/detail/BackofficeDetailSection.d.ts.map +1 -1
- package/lib/types/components/backoffice/detail/backofficeDetailField.css.d.ts +1 -0
- package/lib/types/components/backoffice/detail/backofficeDetailField.css.d.ts.map +1 -1
- package/lib/types/components/backoffice/detail/backofficeDetailLayout.css.d.ts.map +1 -1
- package/lib/types/components/backoffice/detail/backofficeDetailRelationLink.css.d.ts +2 -0
- package/lib/types/components/backoffice/detail/backofficeDetailRelationLink.css.d.ts.map +1 -1
- package/lib/types/components/backoffice/filters/BackofficeFilterAction.d.ts +4 -4
- package/lib/types/components/backoffice/filters/BackofficeFilterAction.d.ts.map +1 -1
- package/lib/types/components/backoffice/filters/DeferredFilterSearchInput.d.ts +13 -0
- package/lib/types/components/backoffice/filters/DeferredFilterSearchInput.d.ts.map +1 -0
- package/lib/types/components/backoffice/filters/EntityIdFilterField.d.ts +4 -0
- package/lib/types/components/backoffice/filters/EntityIdFilterField.d.ts.map +1 -1
- package/lib/types/components/backoffice/filters/deferredFilterSearchInput.css.d.ts +3 -0
- package/lib/types/components/backoffice/filters/deferredFilterSearchInput.css.d.ts.map +1 -0
- package/lib/types/components/backoffice/filters/entityIdFilterField.css.d.ts +3 -0
- package/lib/types/components/backoffice/filters/entityIdFilterField.css.d.ts.map +1 -1
- package/lib/types/components/backoffice/hub/BackofficeHubTemplate.d.ts +36 -0
- package/lib/types/components/backoffice/hub/BackofficeHubTemplate.d.ts.map +1 -0
- package/lib/types/{pages/backofficeHubPage.css.d.ts → components/backoffice/hub/backofficeHubTemplate.css.d.ts} +5 -3
- package/lib/types/components/backoffice/hub/backofficeHubTemplate.css.d.ts.map +1 -0
- package/lib/types/components/backoffice/layout/breadcrumb/BackofficeTopbarBreadcrumb.d.ts.map +1 -1
- package/lib/types/components/backoffice/layout/breadcrumb/BackofficeTopbarPortalContext.d.ts +2 -0
- package/lib/types/components/backoffice/layout/breadcrumb/BackofficeTopbarPortalContext.d.ts.map +1 -1
- package/lib/types/components/backoffice/layout/breadcrumb/backofficeTopbarBreadcrumb.css.d.ts +3 -0
- package/lib/types/components/backoffice/layout/breadcrumb/backofficeTopbarBreadcrumb.css.d.ts.map +1 -1
- package/lib/types/components/backoffice/layout/breadcrumb/buildBreadcrumbs.d.ts +2 -2
- package/lib/types/components/backoffice/layout/breadcrumb/buildBreadcrumbs.d.ts.map +1 -1
- package/lib/types/components/backoffice/layout/buildSidebarSections.d.ts +1 -0
- package/lib/types/components/backoffice/layout/buildSidebarSections.d.ts.map +1 -1
- package/lib/types/components/backoffice/layout/sidebarUtils.d.ts +2 -1
- package/lib/types/components/backoffice/layout/sidebarUtils.d.ts.map +1 -1
- package/lib/types/components/backoffice/lists/BackofficeListToolbar.d.ts +16 -0
- package/lib/types/components/backoffice/lists/BackofficeListToolbar.d.ts.map +1 -0
- package/lib/types/components/backoffice/lists/backofficeListToolbar.css.d.ts +16 -0
- package/lib/types/components/backoffice/lists/backofficeListToolbar.css.d.ts.map +1 -0
- package/lib/types/components/backoffice/pickers/EntityIdPickerDialog.d.ts +1 -1
- package/lib/types/components/backoffice/pickers/EntityIdPickerDialog.d.ts.map +1 -1
- package/lib/types/components/backoffice/pickers/entityIdPickerDialog.css.d.ts +2 -0
- package/lib/types/components/backoffice/pickers/entityIdPickerDialog.css.d.ts.map +1 -1
- package/lib/types/components/backoffice/pickers/shared/EntityPickerList.d.ts.map +1 -1
- package/lib/types/components/backoffice/pickers/shared/EntityPickerShell.d.ts.map +1 -1
- package/lib/types/components/backoffice/pickers/types.d.ts +1 -1
- package/lib/types/components/backoffice/pickers/types.d.ts.map +1 -1
- package/lib/types/components/backoffice/refs/BackofficeEntityIdRef.d.ts +4 -4
- package/lib/types/components/backoffice/refs/BackofficeEntityIdRef.d.ts.map +1 -1
- package/lib/types/components/backoffice/refs/BackofficeRelatedCountLink.d.ts.map +1 -1
- package/lib/types/components/backoffice/refs/backofficeRelatedCountLink.css.d.ts +2 -0
- package/lib/types/components/backoffice/refs/backofficeRelatedCountLink.css.d.ts.map +1 -1
- package/lib/types/components/backoffice/routing/BackofficeContentError.d.ts +1 -1
- package/lib/types/components/backoffice/routing/BackofficeContentError.d.ts.map +1 -1
- package/lib/types/components/backoffice/routing/BackofficeRouteFallback.d.ts +4 -0
- package/lib/types/components/backoffice/routing/BackofficeRouteFallback.d.ts.map +1 -1
- package/lib/types/components/backoffice/scaffolds/BackofficeEntityDetailScaffold.d.ts.map +1 -1
- package/lib/types/components/backoffice/scaffolds/BackofficeEntityListScaffold.d.ts +10 -6
- package/lib/types/components/backoffice/scaffolds/BackofficeEntityListScaffold.d.ts.map +1 -1
- package/lib/types/components/backoffice/scaffolds/BackofficeListFilterContext.d.ts +3 -3
- package/lib/types/components/backoffice/scaffolds/BackofficeListFilterContext.d.ts.map +1 -1
- package/lib/types/components/backoffice/scaffolds/backofficeEntityListScaffold.css.d.ts.map +1 -1
- package/lib/types/components/backoffice/shared/BackofficeFilterableCell.d.ts +13 -0
- package/lib/types/components/backoffice/shared/BackofficeFilterableCell.d.ts.map +1 -0
- package/lib/types/components/backoffice/shared/backofficeFilterableCell.css.d.ts +12 -0
- package/lib/types/components/backoffice/shared/backofficeFilterableCell.css.d.ts.map +1 -0
- package/lib/types/components/backoffice/shared/backofficeInlineFilterRow.css.d.ts.map +1 -1
- package/lib/types/filters/filterHelpers.d.ts +3 -3
- package/lib/types/filters/filterHelpers.d.ts.map +1 -1
- package/lib/types/hooks/useAuth.d.ts.map +1 -1
- package/lib/types/hooks/useBackofficeInfiniteScrollSentinel.d.ts.map +1 -1
- package/lib/types/hooks/useBackofficeListRefetch.d.ts +7 -3
- package/lib/types/hooks/useBackofficeListRefetch.d.ts.map +1 -1
- package/lib/types/hooks/useBackofficeListUrlState.d.ts +2 -2
- package/lib/types/hooks/useBackofficeListUrlState.d.ts.map +1 -1
- package/lib/types/i18n/resources.d.ts +84 -7
- package/lib/types/i18n/resources.d.ts.map +1 -1
- package/lib/types/index.d.ts +3 -0
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/pages/BackofficeDashboardPage.d.ts.map +1 -1
- package/lib/types/pages/BackofficeEntityDetailPage.d.ts.map +1 -1
- package/lib/types/pages/BackofficeEntityDetailPage.view-helpers.d.ts +3 -8
- package/lib/types/pages/BackofficeEntityDetailPage.view-helpers.d.ts.map +1 -1
- package/lib/types/pages/BackofficeEntityListPage.d.ts +2 -2
- package/lib/types/pages/BackofficeEntityListPage.d.ts.map +1 -1
- package/lib/types/pages/BackofficeEntityListPage.helpers.d.ts +8 -4
- package/lib/types/pages/BackofficeEntityListPage.helpers.d.ts.map +1 -1
- package/lib/types/pages/BackofficeHubPage.d.ts.map +1 -1
- package/lib/types/pages/BackofficeLayoutPage.d.ts.map +1 -1
- package/lib/types/pages/BackofficePasswordResetCompletePage.d.ts.map +1 -1
- package/lib/types/pages/BackofficePasswordResetRequestPage.d.ts.map +1 -1
- package/lib/types/pages/BackofficeVerifyEmailPage.d.ts.map +1 -1
- package/lib/types/pages/backofficeDashboardPage.css.d.ts +1 -14
- package/lib/types/pages/backofficeDashboardPage.css.d.ts.map +1 -1
- package/lib/types/pages/backofficeEntityDetailPage.css.d.ts +2 -0
- package/lib/types/pages/backofficeEntityDetailPage.css.d.ts.map +1 -1
- package/lib/types/pages/dashboard/DashboardMetricGroup.d.ts +14 -0
- package/lib/types/pages/dashboard/DashboardMetricGroup.d.ts.map +1 -0
- package/lib/types/pages/dashboard/DashboardPanel.d.ts +9 -0
- package/lib/types/pages/dashboard/DashboardPanel.d.ts.map +1 -0
- package/lib/types/pages/dashboard/DashboardQuickActions.d.ts +13 -0
- package/lib/types/pages/dashboard/DashboardQuickActions.d.ts.map +1 -0
- package/lib/types/pages/dashboard/DashboardStatusList.d.ts +13 -0
- package/lib/types/pages/dashboard/DashboardStatusList.d.ts.map +1 -0
- package/lib/types/pages/dashboard/dashboardMetricGroup.css.d.ts +4 -0
- package/lib/types/pages/dashboard/dashboardMetricGroup.css.d.ts.map +1 -0
- package/lib/types/pages/dashboard/dashboardPanel.css.d.ts +2 -0
- package/lib/types/pages/dashboard/dashboardPanel.css.d.ts.map +1 -0
- package/lib/types/pages/dashboard/dashboardQuickActions.css.d.ts +5 -0
- package/lib/types/pages/dashboard/dashboardQuickActions.css.d.ts.map +1 -0
- package/lib/types/pages/dashboard/dashboardStatusList.css.d.ts +6 -0
- package/lib/types/pages/dashboard/dashboardStatusList.css.d.ts.map +1 -0
- package/lib/types/provider/BackofficeProvider.d.ts.map +1 -1
- package/lib/types/provider/types.d.ts +5 -1
- package/lib/types/provider/types.d.ts.map +1 -1
- package/lib/types/router/createBackofficeRoutes.d.ts.map +1 -1
- package/package.json +5 -5
- package/lib/esm/AcceptInvitationScreen-B1IPafwD.js.map +0 -1
- package/lib/esm/BackofficeDashboardPage-C0zP0QO7.js +0 -344
- package/lib/esm/BackofficeDashboardPage-C0zP0QO7.js.map +0 -1
- package/lib/esm/BackofficeDetailPayload-P61MDRLE.js +0 -94
- package/lib/esm/BackofficeDetailPayload-P61MDRLE.js.map +0 -1
- package/lib/esm/BackofficeEntityActionFormDialog-BgMuhyU8.js +0 -512
- package/lib/esm/BackofficeEntityActionFormDialog-BgMuhyU8.js.map +0 -1
- package/lib/esm/BackofficeEntityDetailPage-ChxBrqz8.js.map +0 -1
- package/lib/esm/BackofficeEntityListPage-BACvfX6c.js +0 -404
- package/lib/esm/BackofficeEntityListPage-BACvfX6c.js.map +0 -1
- package/lib/esm/BackofficeHubPage-BsUXulN0.js +0 -136
- package/lib/esm/BackofficeHubPage-BsUXulN0.js.map +0 -1
- package/lib/esm/BackofficeLayoutPage-r6dXo9SI.js.map +0 -1
- package/lib/esm/BackofficeRightPageLayout-BZb7LhT-.js +0 -53
- package/lib/esm/BackofficeRightPageLayout-BZb7LhT-.js.map +0 -1
- package/lib/esm/BackofficeTopbarPortalContext-CphoSrZD.js.map +0 -1
- package/lib/esm/EntityFilterValue-BWUdPBwp.js +0 -78
- package/lib/esm/EntityFilterValue-BWUdPBwp.js.map +0 -1
- package/lib/esm/EntityIdPickerDialog-Yhmr-WsV.js +0 -308
- package/lib/esm/EntityIdPickerDialog-Yhmr-WsV.js.map +0 -1
- package/lib/esm/LazyBackofficeEntityActionFormDialog-uyYFFJGM.js +0 -522
- package/lib/esm/LazyBackofficeEntityActionFormDialog-uyYFFJGM.js.map +0 -1
- package/lib/esm/buildBreadcrumbs-C9cyiXb7.js.map +0 -1
- package/lib/esm/sidebarUtils-BZETlHea.js.map +0 -1
- package/lib/esm/synchronizeAuthStatusQuery-BoPKMrP1.js.map +0 -1
- package/lib/esm/useAuth-CheTnq60.js.map +0 -1
- package/lib/esm/useBackofficeListUrlState-D4fx5O7u.js.map +0 -1
- package/lib/types/pages/backofficeHubPage.css.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backofficeAuthPaths-
|
|
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":""}
|
|
@@ -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"}
|
package/lib/esm/{buildDataTableColumns-DGPjPK4N.js.map → buildDataTableColumns-DdmF-EYq.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildDataTableColumns-
|
|
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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mutationResult-
|
|
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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pageResolution-
|
|
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
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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-
|
|
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}.
|
|
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*/
|
package/lib/esm/{synchronizeAuthStatusQuery-BoPKMrP1.js → synchronizeAuthStatusQuery-DNJR5MfH.js}
RENAMED
|
@@ -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-
|
|
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
|
-
|
|
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
|
|
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
|
|
218
|
-
k(
|
|
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
|
|
236
|
+
} catch {
|
|
238
237
|
if (!j.current) return;
|
|
239
|
-
k(
|
|
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-
|
|
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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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toastViewAction-
|
|
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"}
|