@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
|
@@ -0,0 +1,432 @@
|
|
|
1
|
+
import { r as e, t } from "./useBackofficeReactTranslation-Btt58EIo.js";
|
|
2
|
+
import { t as n } from "./useBackofficeListUrlState-Ca6d7uIN.js";
|
|
3
|
+
import { t as r } from "./buildDataTableColumns-DdmF-EYq.js";
|
|
4
|
+
import { t as i } from "./BackofficeRightPageLayout-CfNkrMvH.js";
|
|
5
|
+
import { r as a } from "./buildBreadcrumbs-C5St167Y.js";
|
|
6
|
+
import { i as o, n as s, r as c, t as l } from "./LazyBackofficeEntityActionFormDialog-oRd_WHAK.js";
|
|
7
|
+
import { useCallback as u, useEffect as d, useMemo as f, useRef as p, useState as m } from "react";
|
|
8
|
+
import { useTranslation as h } from "react-i18next";
|
|
9
|
+
import { Button as ee, EyeSvg as te, InlineBanner as g, LinkButton as _, TableCell as ne } from "@plumile/ui";
|
|
10
|
+
import { useFragment as v, usePaginationFragment as y, usePreloadedQuery as re, useRelayEnvironment as b } from "react-relay";
|
|
11
|
+
import { fetchQuery as ie } from "relay-runtime";
|
|
12
|
+
import { Fragment as ae, jsx as x, jsxs as oe } from "react/jsx-runtime";
|
|
13
|
+
import { BACKOFFICE_LIST_DEFAULTS as se, BACKOFFICE_LIST_REFETCH_POLICY as S } from "@plumile/backoffice-core/constants.js";
|
|
14
|
+
import { stableListVariablesKey as C } from "@plumile/backoffice-core/state/stableKey.js";
|
|
15
|
+
//#region src/components/backoffice/list/RowFlagsCell.css.ts
|
|
16
|
+
var w = "wy96wu0", T = "wy96wu1", E = "wy96wu2", D = ({ row: e, flags: t, tApp: n }) => {
|
|
17
|
+
let r = f(() => {
|
|
18
|
+
let r = [];
|
|
19
|
+
for (let i of t) {
|
|
20
|
+
let t = i.render(e);
|
|
21
|
+
t != null && t !== "" && t !== !1 && r.push({
|
|
22
|
+
id: i.id,
|
|
23
|
+
node: t,
|
|
24
|
+
label: i.label(e)(n)
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
return r;
|
|
28
|
+
}, [
|
|
29
|
+
t,
|
|
30
|
+
e,
|
|
31
|
+
n
|
|
32
|
+
]), i = r.map((e) => e.label.trim()).filter((e) => e !== "").join(", "), a;
|
|
33
|
+
return i !== "" && (a = i), /* @__PURE__ */ x("div", {
|
|
34
|
+
className: T,
|
|
35
|
+
"aria-label": a,
|
|
36
|
+
children: r.map((e) => /* @__PURE__ */ x("span", {
|
|
37
|
+
className: E,
|
|
38
|
+
title: e.label,
|
|
39
|
+
role: "img",
|
|
40
|
+
"aria-label": e.label,
|
|
41
|
+
children: e.node
|
|
42
|
+
}, e.id))
|
|
43
|
+
});
|
|
44
|
+
}, ce = "txvbqb9ip txvbqbcp txvbqbao7 txvbqbajy", le = "c0tad0", ue = "c0tad1", O = 24, k = 6, A = 4, j = 32, M = 8, N = 12, P = 4, F = {
|
|
45
|
+
xs: "minmax(72px, 92px)",
|
|
46
|
+
s: "minmax(104px, 136px)",
|
|
47
|
+
statusAction: "minmax(136px, 168px)",
|
|
48
|
+
m: "minmax(136px, 184px)",
|
|
49
|
+
l: "minmax(160px, 220px)",
|
|
50
|
+
xl: "minmax(220px, 300px)",
|
|
51
|
+
fluid: "minmax(0, 1fr)"
|
|
52
|
+
}, I = (e) => e <= 0 ? 0 : A * 2 + O * e + k * Math.max(0, e - 1), L = (e) => e <= 0 ? 0 : P + N * 2 + j * e + M * Math.max(0, e - 1), R = (e, t) => e.mobileRole === "action" ? "60px" : e.isPrimary === !0 ? "minmax(0, 1fr)" : "size" in e && typeof e.size == "string" ? F[e.size] : t, de = (e) => e.kind === "route", z = (e) => e.kind === "formMutation", fe = (e, t) => e ?? (t === 0 ? "primary" : "secondary"), B = (e) => {
|
|
53
|
+
if (typeof e != "object" || !e || !("id" in e)) return null;
|
|
54
|
+
let t = e.id;
|
|
55
|
+
if (typeof t != "string") return null;
|
|
56
|
+
let n = t.trim();
|
|
57
|
+
return n === "" ? null : n;
|
|
58
|
+
}, V = (e) => e.list.kind === "records", H = (e) => e.list.kind !== "records", U = (e, t) => e(t), pe = (e) => {
|
|
59
|
+
let { ariaLabel: t, fallback: n, resolveDetailHref: r, className: i, renderAction: a } = e;
|
|
60
|
+
return {
|
|
61
|
+
id: "actions",
|
|
62
|
+
header: "",
|
|
63
|
+
className: i,
|
|
64
|
+
mobileRole: "action",
|
|
65
|
+
cell: (e) => {
|
|
66
|
+
let i = B(e);
|
|
67
|
+
if (i == null) return n;
|
|
68
|
+
let o = r(i);
|
|
69
|
+
return o == null ? n : a({
|
|
70
|
+
href: o,
|
|
71
|
+
ariaLabel: t
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
}, me = "store-or-network", he = (e, t, n, r) => {
|
|
76
|
+
let i = t != null && t.length > 0, a = e;
|
|
77
|
+
if (i) {
|
|
78
|
+
let n = [{
|
|
79
|
+
id: "__rowFlags",
|
|
80
|
+
header: "",
|
|
81
|
+
className: w,
|
|
82
|
+
mobileRole: "badge",
|
|
83
|
+
cell: (e) => /* @__PURE__ */ x(D, {
|
|
84
|
+
row: e,
|
|
85
|
+
flags: t,
|
|
86
|
+
tApp: r
|
|
87
|
+
})
|
|
88
|
+
}, ...e], i = n.some((e) => e.isPrimary === !0);
|
|
89
|
+
a = n, i || (a = n.map((e, t) => t === 1 ? {
|
|
90
|
+
...e,
|
|
91
|
+
isPrimary: !0
|
|
92
|
+
} : e));
|
|
93
|
+
}
|
|
94
|
+
let o = 0;
|
|
95
|
+
i && (o = t.length);
|
|
96
|
+
let s = I(o), c = L(n), l = 0;
|
|
97
|
+
i && (l = 1);
|
|
98
|
+
let u = a.length - l - 1, d = a.slice(l, l + Math.max(0, u)).map((e) => R(e, "1fr")).join(" "), f = "";
|
|
99
|
+
return f = i ? `${s}px ${d} ${c}px` : `${d} ${c}px`, {
|
|
100
|
+
columns: a,
|
|
101
|
+
gridTemplateColumns: f
|
|
102
|
+
};
|
|
103
|
+
}, W = ({ config: i, prepared: a }) => {
|
|
104
|
+
let { t: c } = h(), { t: y } = t(), { entities: S } = e(), [w, T] = m(null), E = b(), D = i.list, O = i.listDefaults ?? D.defaultState ?? {
|
|
105
|
+
where: null,
|
|
106
|
+
sort: null
|
|
107
|
+
}, k = re(D.query, a.query), A = v(D.fragment, k), j = f(() => D.getRows(A).map((e) => D.toRow(e)), [A, D]), M = f(() => D.getNextCursor?.(k) ?? null, [D, k]), [N, P] = m(j), [F, I] = m(M), [L, R] = m(!1), [B, V] = m(!1), [H, W] = m(!1);
|
|
108
|
+
d(() => {
|
|
109
|
+
P(j), I(M);
|
|
110
|
+
}, [M, j]);
|
|
111
|
+
let { columns: G, gridTemplateColumns: K } = f(() => {
|
|
112
|
+
let e = r(D.columns, {
|
|
113
|
+
tApp: c,
|
|
114
|
+
t: y,
|
|
115
|
+
resolveEntityHref: (e, t) => {
|
|
116
|
+
let n = S[e];
|
|
117
|
+
return n == null ? null : n.routes.detail(t);
|
|
118
|
+
}
|
|
119
|
+
}), t = pe({
|
|
120
|
+
ariaLabel: y("actions.view"),
|
|
121
|
+
fallback: y("common.notAvailable"),
|
|
122
|
+
className: le,
|
|
123
|
+
resolveDetailHref: (e) => i.routes.detail(e),
|
|
124
|
+
renderAction: ({ href: e, ariaLabel: t }) => /* @__PURE__ */ x(ne.Actions, { children: /* @__PURE__ */ x("span", {
|
|
125
|
+
className: ue,
|
|
126
|
+
title: t,
|
|
127
|
+
children: /* @__PURE__ */ x(_, {
|
|
128
|
+
to: e,
|
|
129
|
+
variant: "icon",
|
|
130
|
+
size: "small",
|
|
131
|
+
"aria-label": t,
|
|
132
|
+
children: /* @__PURE__ */ x(te, {
|
|
133
|
+
width: 16,
|
|
134
|
+
height: 16
|
|
135
|
+
})
|
|
136
|
+
})
|
|
137
|
+
}) })
|
|
138
|
+
});
|
|
139
|
+
return he([...e, t], D.rowFlags, 1, c);
|
|
140
|
+
}, [
|
|
141
|
+
i.routes,
|
|
142
|
+
D.columns,
|
|
143
|
+
D.rowFlags,
|
|
144
|
+
S,
|
|
145
|
+
y,
|
|
146
|
+
c
|
|
147
|
+
]), q = u((e) => D.getRowId(e), [D]), { state: J, pushState: ge } = n(i), Y = J.sort ?? O.sort, { pageSize: X } = se, _e = u((e) => D.buildQueryVariables(e), [D]), Z = p(0), ve = p(C({
|
|
148
|
+
where: O.where,
|
|
149
|
+
sort: O.sort,
|
|
150
|
+
count: X
|
|
151
|
+
})), Q = u(async (e) => {
|
|
152
|
+
let t = Z.current + 1;
|
|
153
|
+
Z.current = t, e.mode === "append" ? R(!0) : V(!0), W(!1);
|
|
154
|
+
try {
|
|
155
|
+
let n = _e({
|
|
156
|
+
where: e.where,
|
|
157
|
+
sort: e.sort,
|
|
158
|
+
count: e.count,
|
|
159
|
+
cursor: e.cursor
|
|
160
|
+
}), r = await ie(E, D.query, n, { fetchPolicy: me }).toPromise();
|
|
161
|
+
if (r == null || Z.current !== t) return;
|
|
162
|
+
let i = D.getRows(r).map((e) => D.toRow(e));
|
|
163
|
+
P((t) => e.mode === "append" ? [...t, ...i] : i), I(D.getNextCursor?.(r) ?? null);
|
|
164
|
+
} catch {
|
|
165
|
+
Z.current === t && W(!0);
|
|
166
|
+
} finally {
|
|
167
|
+
e.mode === "append" ? R(!1) : V(!1);
|
|
168
|
+
}
|
|
169
|
+
}, [
|
|
170
|
+
_e,
|
|
171
|
+
E,
|
|
172
|
+
D
|
|
173
|
+
]);
|
|
174
|
+
d(() => {
|
|
175
|
+
let e = C({
|
|
176
|
+
where: J.where,
|
|
177
|
+
sort: Y,
|
|
178
|
+
count: X
|
|
179
|
+
});
|
|
180
|
+
ve.current !== e && (ve.current = e, Q({
|
|
181
|
+
where: J.where,
|
|
182
|
+
sort: Y,
|
|
183
|
+
count: X,
|
|
184
|
+
cursor: null,
|
|
185
|
+
mode: "reset"
|
|
186
|
+
}).catch(() => {
|
|
187
|
+
W(!0);
|
|
188
|
+
}));
|
|
189
|
+
}, [
|
|
190
|
+
X,
|
|
191
|
+
Y,
|
|
192
|
+
Q,
|
|
193
|
+
J.where
|
|
194
|
+
]);
|
|
195
|
+
let ye = u(() => {
|
|
196
|
+
B || Q({
|
|
197
|
+
where: J.where,
|
|
198
|
+
sort: Y,
|
|
199
|
+
count: X,
|
|
200
|
+
cursor: null,
|
|
201
|
+
mode: "reset"
|
|
202
|
+
}).catch(() => {
|
|
203
|
+
W(!0);
|
|
204
|
+
});
|
|
205
|
+
}, [
|
|
206
|
+
B,
|
|
207
|
+
X,
|
|
208
|
+
Y,
|
|
209
|
+
Q,
|
|
210
|
+
J.where
|
|
211
|
+
]), be = o({
|
|
212
|
+
hasNext: F != null,
|
|
213
|
+
isLoadingNext: L,
|
|
214
|
+
loadNext: (e) => {
|
|
215
|
+
F != null && Q({
|
|
216
|
+
where: J.where,
|
|
217
|
+
sort: Y,
|
|
218
|
+
count: e,
|
|
219
|
+
cursor: F,
|
|
220
|
+
mode: "append"
|
|
221
|
+
}).catch(() => {
|
|
222
|
+
W(!0);
|
|
223
|
+
});
|
|
224
|
+
},
|
|
225
|
+
count: X
|
|
226
|
+
}), xe = f(() => i.listActions ?? [], [i.listActions]), Se = f(() => xe.filter((e) => e.isVisible == null ? !0 : e.isVisible(null)), [xe]), Ce = f(() => {
|
|
227
|
+
if (Se.length !== 0) return /* @__PURE__ */ x("div", {
|
|
228
|
+
className: ce,
|
|
229
|
+
children: Se.map((e, t) => {
|
|
230
|
+
let { variant: n } = e, r = U(e.label, c), i = r;
|
|
231
|
+
e.ariaLabel != null && (i = U(e.ariaLabel, c));
|
|
232
|
+
let a = fe(n, t), o = e.size ?? "small", s = e.isDisabled?.(null) === !0;
|
|
233
|
+
return de(e) ? /* @__PURE__ */ x(_, {
|
|
234
|
+
to: e.to(null),
|
|
235
|
+
variant: a,
|
|
236
|
+
size: o,
|
|
237
|
+
isDisabled: s,
|
|
238
|
+
"aria-label": i,
|
|
239
|
+
children: r
|
|
240
|
+
}, e.id) : z(e) ? /* @__PURE__ */ x(ee, {
|
|
241
|
+
type: "button",
|
|
242
|
+
variant: a,
|
|
243
|
+
size: o,
|
|
244
|
+
disabled: s,
|
|
245
|
+
onClick: () => {
|
|
246
|
+
T(e.id);
|
|
247
|
+
},
|
|
248
|
+
"aria-label": i,
|
|
249
|
+
children: r
|
|
250
|
+
}, e.id) : null;
|
|
251
|
+
})
|
|
252
|
+
});
|
|
253
|
+
}, [c, Se]), $ = xe.find((e) => e.id === w), we = null;
|
|
254
|
+
return H && (we = /* @__PURE__ */ x(g, {
|
|
255
|
+
tone: "danger",
|
|
256
|
+
title: y("list.errors.title"),
|
|
257
|
+
actions: /* @__PURE__ */ x(ee, {
|
|
258
|
+
type: "button",
|
|
259
|
+
variant: "secondary",
|
|
260
|
+
size: "small",
|
|
261
|
+
onClick: ye,
|
|
262
|
+
children: y("list.actions.retry")
|
|
263
|
+
}),
|
|
264
|
+
onDismiss: () => {
|
|
265
|
+
W(!1);
|
|
266
|
+
},
|
|
267
|
+
children: y("list.errors.fetchFailed")
|
|
268
|
+
})), /* @__PURE__ */ oe(ae, { children: [/* @__PURE__ */ x(s, {
|
|
269
|
+
config: i,
|
|
270
|
+
state: J,
|
|
271
|
+
pushState: ge,
|
|
272
|
+
headerActions: Ce,
|
|
273
|
+
rows: N,
|
|
274
|
+
columns: G,
|
|
275
|
+
gridTemplateColumns: K,
|
|
276
|
+
getRowId: q,
|
|
277
|
+
hasNextPage: F != null,
|
|
278
|
+
isLoadingMore: L,
|
|
279
|
+
isRefreshing: B,
|
|
280
|
+
onLoadMore: be,
|
|
281
|
+
onRefresh: ye,
|
|
282
|
+
totalCount: null,
|
|
283
|
+
statusBanner: we
|
|
284
|
+
}), $ != null && z($) && /* @__PURE__ */ x(l, {
|
|
285
|
+
isOpen: !0,
|
|
286
|
+
action: $,
|
|
287
|
+
node: null,
|
|
288
|
+
onClose: () => {
|
|
289
|
+
T(null);
|
|
290
|
+
},
|
|
291
|
+
onSuccess: ye
|
|
292
|
+
})] });
|
|
293
|
+
}, G = ({ config: a, prepared: d, breadcrumb: p }) => {
|
|
294
|
+
let g = a.list, { t: v } = h(), { t: b } = t(), { entities: ie } = e(), [ae, C] = m(null), w = re(g.query, d.query), { data: T, loadNext: E, hasNext: D, isLoadingNext: O, refetch: k } = y(g.fragment, w), A = g.getConnection(T), j = f(() => A.edges.map((e) => g.toRow(e.node)), [A.edges, g]), { columns: M, gridTemplateColumns: N } = f(() => {
|
|
295
|
+
let e = r(g.columns, {
|
|
296
|
+
tApp: v,
|
|
297
|
+
t: b,
|
|
298
|
+
resolveEntityHref: (e, t) => {
|
|
299
|
+
let n = ie[e];
|
|
300
|
+
return n == null ? null : n.routes.detail(t);
|
|
301
|
+
}
|
|
302
|
+
}), t = pe({
|
|
303
|
+
ariaLabel: b("actions.view"),
|
|
304
|
+
fallback: b("common.notAvailable"),
|
|
305
|
+
className: le,
|
|
306
|
+
resolveDetailHref: (e) => a.routes.detail(e),
|
|
307
|
+
renderAction: ({ href: e, ariaLabel: t }) => /* @__PURE__ */ x(ne.Actions, { children: /* @__PURE__ */ x("span", {
|
|
308
|
+
className: ue,
|
|
309
|
+
title: t,
|
|
310
|
+
children: /* @__PURE__ */ x(_, {
|
|
311
|
+
to: e,
|
|
312
|
+
variant: "icon",
|
|
313
|
+
size: "small",
|
|
314
|
+
"aria-label": t,
|
|
315
|
+
children: /* @__PURE__ */ x(te, {
|
|
316
|
+
width: 16,
|
|
317
|
+
height: 16
|
|
318
|
+
})
|
|
319
|
+
})
|
|
320
|
+
}) })
|
|
321
|
+
});
|
|
322
|
+
return he([...e, t], g.rowFlags, 1, v);
|
|
323
|
+
}, [
|
|
324
|
+
a.routes,
|
|
325
|
+
g.columns,
|
|
326
|
+
g.rowFlags,
|
|
327
|
+
ie,
|
|
328
|
+
b,
|
|
329
|
+
v
|
|
330
|
+
]), P = u((e) => g.getRowId(e), [g]), { state: F, pushState: I } = n(a), L = a.listDefaults ?? g.defaultState ?? {
|
|
331
|
+
where: null,
|
|
332
|
+
sort: null
|
|
333
|
+
}, R = F.sort ?? L.sort, { pageSize: B } = se, { isRefreshing: V, onRefresh: H } = c({
|
|
334
|
+
refetch: k,
|
|
335
|
+
variables: f(() => ({
|
|
336
|
+
where: F.where,
|
|
337
|
+
sort: R,
|
|
338
|
+
count: B,
|
|
339
|
+
cursor: null
|
|
340
|
+
}), [
|
|
341
|
+
B,
|
|
342
|
+
R,
|
|
343
|
+
F.where
|
|
344
|
+
]),
|
|
345
|
+
defaults: {
|
|
346
|
+
where: L.where,
|
|
347
|
+
sort: L.sort,
|
|
348
|
+
count: B,
|
|
349
|
+
cursor: null
|
|
350
|
+
},
|
|
351
|
+
fetchPolicy: S,
|
|
352
|
+
buildQueryVariables: g.buildQueryVariables
|
|
353
|
+
}), me = o({
|
|
354
|
+
hasNext: D,
|
|
355
|
+
isLoadingNext: O,
|
|
356
|
+
loadNext: E,
|
|
357
|
+
count: B
|
|
358
|
+
}), W = f(() => a.listActions ?? [], [a.listActions]), G = f(() => W.filter((e) => e.isVisible == null ? !0 : e.isVisible(null)), [W]), K = f(() => {
|
|
359
|
+
if (G.length !== 0) return /* @__PURE__ */ x("div", {
|
|
360
|
+
className: ce,
|
|
361
|
+
children: G.map((e, t) => {
|
|
362
|
+
let { variant: n } = e, r = U(e.label, v), i = r;
|
|
363
|
+
e.ariaLabel != null && (i = U(e.ariaLabel, v));
|
|
364
|
+
let a = fe(n, t), o = e.size ?? "small", s = e.isDisabled?.(null) === !0;
|
|
365
|
+
return de(e) ? /* @__PURE__ */ x(_, {
|
|
366
|
+
to: e.to(null),
|
|
367
|
+
variant: a,
|
|
368
|
+
size: o,
|
|
369
|
+
isDisabled: s,
|
|
370
|
+
"aria-label": i,
|
|
371
|
+
children: r
|
|
372
|
+
}, e.id) : z(e) ? /* @__PURE__ */ x(ee, {
|
|
373
|
+
type: "button",
|
|
374
|
+
variant: a,
|
|
375
|
+
size: o,
|
|
376
|
+
disabled: s,
|
|
377
|
+
onClick: () => {
|
|
378
|
+
C(e.id);
|
|
379
|
+
},
|
|
380
|
+
"aria-label": i,
|
|
381
|
+
children: r
|
|
382
|
+
}, e.id) : null;
|
|
383
|
+
})
|
|
384
|
+
});
|
|
385
|
+
}, [v, G]), q = W.find((e) => e.id === ae);
|
|
386
|
+
return /* @__PURE__ */ oe(i, {
|
|
387
|
+
breadcrumb: p,
|
|
388
|
+
children: [/* @__PURE__ */ x(s, {
|
|
389
|
+
config: a,
|
|
390
|
+
state: F,
|
|
391
|
+
pushState: I,
|
|
392
|
+
headerActions: K,
|
|
393
|
+
rows: j,
|
|
394
|
+
columns: M,
|
|
395
|
+
gridTemplateColumns: N,
|
|
396
|
+
getRowId: P,
|
|
397
|
+
hasNextPage: D,
|
|
398
|
+
isLoadingMore: O,
|
|
399
|
+
isRefreshing: V,
|
|
400
|
+
onLoadMore: me,
|
|
401
|
+
onRefresh: H,
|
|
402
|
+
totalCount: A.totalCount ?? null
|
|
403
|
+
}), q != null && z(q) && /* @__PURE__ */ x(l, {
|
|
404
|
+
isOpen: !0,
|
|
405
|
+
action: q,
|
|
406
|
+
node: null,
|
|
407
|
+
onClose: () => {
|
|
408
|
+
C(null);
|
|
409
|
+
},
|
|
410
|
+
onSuccess: H
|
|
411
|
+
})]
|
|
412
|
+
});
|
|
413
|
+
}, K = ({ entityManifest: e, config: t, prepared: n }) => {
|
|
414
|
+
let { t: r } = h(), o = a(t, r);
|
|
415
|
+
return V(t) ? /* @__PURE__ */ x(i, {
|
|
416
|
+
breadcrumb: o,
|
|
417
|
+
children: /* @__PURE__ */ x(W, {
|
|
418
|
+
entityManifest: e,
|
|
419
|
+
config: t,
|
|
420
|
+
prepared: n
|
|
421
|
+
})
|
|
422
|
+
}) : H(t) ? /* @__PURE__ */ x(G, {
|
|
423
|
+
entityManifest: e,
|
|
424
|
+
config: t,
|
|
425
|
+
prepared: n,
|
|
426
|
+
breadcrumb: o
|
|
427
|
+
}) : null;
|
|
428
|
+
};
|
|
429
|
+
//#endregion
|
|
430
|
+
export { K as BackofficeEntityListPage, K as default };
|
|
431
|
+
|
|
432
|
+
//# sourceMappingURL=BackofficeEntityListPage-D_zL-qRb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BackofficeEntityListPage-D_zL-qRb.js","names":[],"sources":["../../src/components/backoffice/list/RowFlagsCell.css.ts","../../src/components/backoffice/list/RowFlagsCell.tsx","../../src/pages/backofficeEntityListPage.css.ts","../../src/pages/BackofficeEntityListPage.helpers.tsx","../../src/pages/BackofficeEntityListPage.tsx"],"sourcesContent":["import { style } from '@vanilla-extract/css';\n\nexport const rowFlagsColumnCell = style({\n justifyContent: 'center',\n padding: '0 4px',\n});\n\nexport const container = style({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 6,\n width: '100%',\n});\n\nexport const flag = style({\n display: 'grid',\n placeItems: 'center',\n width: 24,\n height: 24,\n});\n","import { useMemo, type JSX, type ReactNode } from 'react';\nimport type { TFunction } from 'i18next';\n\nimport type { BackofficeRowFlagSpec } from '@plumile/backoffice-core/types.js';\n\nimport * as styles from './RowFlagsCell.css.js';\n\nexport type RowFlagsCellProps<Row> = {\n row: Row;\n flags: readonly BackofficeRowFlagSpec<Row>[];\n tApp: TFunction;\n};\n\n/**\n * Renders row-level flags (icons) in a dedicated compact column.\n */\nexport const RowFlagsCell = <Row,>({\n row,\n flags,\n tApp,\n}: RowFlagsCellProps<Row>): JSX.Element => {\n const resolved = useMemo(() => {\n const out: { id: string; node: ReactNode; label: string }[] = [];\n for (const flag of flags) {\n const node = flag.render(row) as ReactNode;\n if (node != null && node !== '' && node !== false) {\n out.push({ id: flag.id, node, label: flag.label(row)(tApp) });\n }\n }\n return out;\n }, [flags, row, tApp]);\n\n const ariaLabel = resolved\n .map((entry) => {\n return entry.label.trim();\n })\n .filter((label) => {\n return label !== '';\n })\n .join(', ');\n\n let ariaLabelProp: string | undefined;\n if (ariaLabel !== '') {\n ariaLabelProp = ariaLabel;\n }\n\n return (\n <div className={styles.container} aria-label={ariaLabelProp}>\n {resolved.map((entry) => {\n return (\n <span\n key={entry.id}\n className={styles.flag}\n title={entry.label}\n role=\"img\"\n aria-label={entry.label}\n >\n {entry.node}\n </span>\n );\n })}\n </div>\n );\n};\n","import { style } from '@vanilla-extract/css';\nimport { sprinkles } from '@plumile/ui';\n\nexport const headerActions = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n flexWrap: 'wrap',\n});\n\nexport const actionsColumnCell = style({\n justifyContent: 'flex-end',\n});\n\nexport const actionTrigger = style({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '2rem',\n height: '2rem',\n flexShrink: 0,\n});\n","import type { ComponentProps, JSX } from 'react';\n\nimport type {\n BackofficeEntityFormMutationActionSpec,\n BackofficeEntityRouteActionSpec,\n BackofficeListActionSpec,\n BackofficeRuntimeConnectionListConfig,\n BackofficeRuntimeRecordListConfig,\n BackofficeRuntimeResolvedListFacetConfig,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\nimport type { Button, DataTableColumn } from '@plumile/ui';\nimport type { TFunction } from 'i18next';\n\nimport type { BackofficeSizedDataTableColumn } from '../components/backoffice/columns/buildDataTableColumns.js';\n\ntype ButtonVariant = ComponentProps<typeof Button>['variant'];\n\nconst ROW_FLAGS_SLOT_PX = 24;\nconst ROW_FLAGS_GAP_PX = 6;\nconst ROW_FLAGS_PADDING_X_PX = 4;\n\nconst ACTIONS_SLOT_PX = 32;\nconst ACTIONS_GAP_PX = 8;\nconst ACTIONS_PADDING_X_PX = 12;\nconst ACTIONS_SAFETY_PX = 4;\n\nconst listColumnTrackBySize: Record<\n BackofficeSizedDataTableColumn<unknown>['size'],\n string\n> = {\n xs: 'minmax(72px, 92px)',\n s: 'minmax(104px, 136px)',\n statusAction: 'minmax(136px, 168px)',\n m: 'minmax(136px, 184px)',\n l: 'minmax(160px, 220px)',\n xl: 'minmax(220px, 300px)',\n fluid: 'minmax(0, 1fr)',\n};\n\nexport const computeRowFlagsColumnWidthPx = (flagCount: number): number => {\n if (flagCount <= 0) {\n return 0;\n }\n return (\n ROW_FLAGS_PADDING_X_PX * 2 +\n ROW_FLAGS_SLOT_PX * flagCount +\n ROW_FLAGS_GAP_PX * Math.max(0, flagCount - 1)\n );\n};\n\nexport const computeActionsColumnWidthPx = (actionCount: number): number => {\n if (actionCount <= 0) {\n return 0;\n }\n return (\n ACTIONS_SAFETY_PX +\n ACTIONS_PADDING_X_PX * 2 +\n ACTIONS_SLOT_PX * actionCount +\n ACTIONS_GAP_PX * Math.max(0, actionCount - 1)\n );\n};\n\nexport const resolveTrackBySize = (\n column: DataTableColumn<unknown>,\n fallback: string,\n): string => {\n if (column.mobileRole === 'action') {\n return '60px';\n }\n if (column.isPrimary === true) {\n return 'minmax(0, 1fr)';\n }\n if ('size' in column && typeof column.size === 'string') {\n return listColumnTrackBySize[\n column.size as BackofficeSizedDataTableColumn<unknown>['size']\n ];\n }\n return fallback;\n};\n\nexport const isRouteAction = (\n action: BackofficeListActionSpec,\n): action is BackofficeEntityRouteActionSpec<null> => {\n return action.kind === 'route';\n};\n\nexport const isFormMutationAction = (\n action: BackofficeListActionSpec,\n): action is BackofficeEntityFormMutationActionSpec<null> => {\n return action.kind === 'formMutation';\n};\n\nexport const resolveActionVariant = (\n actionVariant: ButtonVariant | undefined,\n index: number,\n): Exclude<ButtonVariant, undefined> => {\n if (actionVariant != null) {\n return actionVariant;\n }\n if (index === 0) {\n return 'primary';\n }\n return 'secondary';\n};\n\nexport const resolveRowId = (row: unknown): string | null => {\n if (row == null || typeof row !== 'object') {\n return null;\n }\n if (!('id' in row)) {\n return null;\n }\n const value = (row as { id?: unknown }).id;\n if (typeof value !== 'string') {\n return null;\n }\n const trimmed = value.trim();\n if (trimmed === '') {\n return null;\n }\n return trimmed;\n};\n\nexport type RecordListConfig = BackofficeRuntimeResolvedListFacetConfig & {\n list: BackofficeRuntimeRecordListConfig;\n};\n\nexport type ConnectionListConfig = BackofficeRuntimeResolvedListFacetConfig & {\n list: BackofficeRuntimeConnectionListConfig;\n};\n\nexport const isRecordListConfig = (\n config: BackofficeRuntimeResolvedListFacetConfig,\n): config is RecordListConfig => {\n return config.list.kind === 'records';\n};\n\nexport const isConnectionListConfig = (\n config: BackofficeRuntimeResolvedListFacetConfig,\n): config is ConnectionListConfig => {\n return config.list.kind !== 'records';\n};\n\nexport const resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\nexport const buildActionsColumn = (options: {\n ariaLabel: string;\n fallback: string;\n resolveDetailHref: (id: string) => string | null;\n className?: string;\n renderAction: (input: { href: string; ariaLabel: string }) => JSX.Element;\n}): DataTableColumn<unknown> => {\n const { ariaLabel, fallback, resolveDetailHref, className, renderAction } =\n options;\n\n return {\n id: 'actions',\n header: '',\n className,\n mobileRole: 'action',\n cell: (row) => {\n const id = resolveRowId(row);\n if (id == null) {\n return fallback;\n }\n const href = resolveDetailHref(id);\n if (href == null) {\n return fallback;\n }\n return renderAction({ href, ariaLabel });\n },\n };\n};\n","import {\n type JSX,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type { TFunction } from 'i18next';\nimport { useTranslation } from 'react-i18next';\nimport {\n useFragment,\n usePaginationFragment,\n usePreloadedQuery,\n useRelayEnvironment,\n} from 'react-relay';\nimport { fetchQuery } from 'relay-runtime';\nimport {\n BACKOFFICE_LIST_DEFAULTS,\n BACKOFFICE_LIST_REFETCH_POLICY,\n} from '@plumile/backoffice-core/constants.js';\nimport { stableListVariablesKey } from '@plumile/backoffice-core/state/stableKey.js';\nimport type {\n BackofficeEntityManifestItem,\n BackofficePreparedListRoute,\n BackofficeRuntimeResolvedListFacetConfig,\n BackofficeRowFlagSpec,\n} from '@plumile/backoffice-core/types.js';\nimport {\n Button,\n EyeSvg,\n InlineBanner,\n LinkButton,\n TableCell,\n type DataTableColumn,\n type GetRowId,\n} from '@plumile/ui';\nimport { BackofficeEntityListScaffold } from '../components/backoffice/scaffolds/BackofficeEntityListScaffold.js';\nimport { LazyBackofficeEntityActionFormDialog } from '../components/backoffice/actions/LazyBackofficeEntityActionFormDialog.js';\nimport { buildDataTableColumns } from '../components/backoffice/columns/buildDataTableColumns.js';\nimport { RowFlagsCell } from '../components/backoffice/list/RowFlagsCell.js';\nimport { useBackofficeListUrlState } from '../hooks/useBackofficeListUrlState.js';\nimport { useBackofficeLoadMore } from '../hooks/useBackofficeLoadMore.js';\nimport { useBackofficeListRefetch } from '../hooks/useBackofficeListRefetch.js';\nimport { useBackofficeReactTranslation } from '../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeConfig } from '../provider/BackofficeConfigContext.js';\nimport * as pageStyles from './backofficeEntityListPage.css.js';\nimport { rowFlagsColumnCell } from '../components/backoffice/list/RowFlagsCell.css.js';\nimport { BackofficeRightPageLayout } from '../components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js';\nimport { buildEntityListBreadcrumb } from '../components/backoffice/layout/breadcrumb/buildBreadcrumbs.js';\nimport {\n buildActionsColumn,\n computeActionsColumnWidthPx,\n computeRowFlagsColumnWidthPx,\n isFormMutationAction,\n isConnectionListConfig,\n isRecordListConfig,\n isRouteAction,\n resolveLabel,\n resolveActionVariant,\n resolveTrackBySize,\n type ConnectionListConfig,\n type RecordListConfig,\n} from './BackofficeEntityListPage.helpers.js';\n\nexport type BackofficeEntityListPageProps = {\n entityManifest: BackofficeEntityManifestItem;\n config: BackofficeRuntimeResolvedListFacetConfig;\n prepared: BackofficePreparedListRoute;\n};\n\ntype RecordFetchMode = 'append' | 'reset';\ntype RecordFetchInput = {\n where: Record<string, unknown> | null;\n sort: string | null;\n count: number;\n cursor: string | null;\n mode: RecordFetchMode;\n};\n\nconst RECORD_FETCH_POLICY = 'store-or-network' as const;\n\nconst applyListEdgeColumns = <Row,>(\n inputColumns: readonly DataTableColumn<Row>[],\n rowFlags: readonly BackofficeRowFlagSpec<Row>[] | undefined,\n actionCount: number,\n tApp: TFunction,\n): {\n columns: readonly DataTableColumn<Row>[];\n gridTemplateColumns?: string;\n} => {\n const hasFlags = rowFlags != null && rowFlags.length > 0;\n\n let columns = inputColumns;\n if (hasFlags) {\n const flagsColumn: DataTableColumn<Row> = {\n id: '__rowFlags',\n header: '',\n className: rowFlagsColumnCell,\n mobileRole: 'badge',\n cell: (row) => {\n return <RowFlagsCell row={row} flags={rowFlags} tApp={tApp} />;\n },\n };\n\n // Ensure we never pick the flags column as \"primary\".\n const withFlags = [flagsColumn, ...inputColumns];\n const hasPrimary = withFlags.some((col) => {\n return col.isPrimary === true;\n });\n\n columns = withFlags;\n if (!hasPrimary) {\n columns = withFlags.map((col, index) => {\n if (index === 1) {\n return { ...col, isPrimary: true };\n }\n return col;\n });\n }\n }\n\n let flagCount = 0;\n if (hasFlags) {\n flagCount = rowFlags.length;\n }\n const flagsWidthPx = computeRowFlagsColumnWidthPx(flagCount);\n const actionsWidthPx = computeActionsColumnWidthPx(actionCount);\n\n // We always include the right-side \"actions\" column in list pages.\n let leftColumnCount = 0;\n if (hasFlags) {\n leftColumnCount = 1;\n }\n const middleCount = columns.length - leftColumnCount - 1;\n\n const middleTracks = columns\n .slice(leftColumnCount, leftColumnCount + Math.max(0, middleCount))\n .map((column) => {\n return resolveTrackBySize(column as DataTableColumn<unknown>, '1fr');\n })\n .join(' ');\n\n let gridTemplateColumns = '';\n if (hasFlags) {\n gridTemplateColumns = `${flagsWidthPx}px ${middleTracks} ${actionsWidthPx}px`;\n } else {\n gridTemplateColumns = `${middleTracks} ${actionsWidthPx}px`;\n }\n\n return { columns, gridTemplateColumns };\n};\n\nconst BackofficeEntityRecordListPage = ({\n config,\n prepared,\n}: Omit<BackofficeEntityListPageProps, 'config'> & {\n config: RecordListConfig;\n}): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const { entities } = useBackofficeConfig();\n const [activeFormActionId, setActiveFormActionId] = useState<string | null>(\n null,\n );\n const environment = useRelayEnvironment();\n\n const listConfig = config.list;\n const listDefaults = config.listDefaults ??\n listConfig.defaultState ?? { where: null, sort: null };\n const queryData = usePreloadedQuery(listConfig.query, prepared.query);\n const fragmentData = useFragment(listConfig.fragment, queryData as never);\n\n const initialRows = useMemo(() => {\n return listConfig.getRows(fragmentData).map((row) => {\n return listConfig.toRow(row);\n });\n }, [fragmentData, listConfig]);\n\n const initialCursor = useMemo(() => {\n return listConfig.getNextCursor?.(queryData) ?? null;\n }, [listConfig, queryData]);\n\n const [rows, setRows] = useState(initialRows);\n const [nextCursor, setNextCursor] = useState(initialCursor);\n const [isLoadingMore, setIsLoadingMore] = useState(false);\n const [isRefreshing, setIsRefreshing] = useState(false);\n const [fetchError, setFetchError] = useState(false);\n\n useEffect(() => {\n setRows(initialRows);\n setNextCursor(initialCursor);\n }, [initialCursor, initialRows]);\n\n const { columns, gridTemplateColumns } = useMemo((): {\n columns: readonly DataTableColumn<unknown>[];\n gridTemplateColumns?: string;\n } => {\n const baseColumns = buildDataTableColumns(listConfig.columns, {\n tApp,\n t,\n resolveEntityHref: (entityId, refId) => {\n const entityManifest = entities[entityId];\n if (entityManifest == null) {\n return null;\n }\n return entityManifest.routes.detail(refId);\n },\n });\n const actionsColumn = buildActionsColumn({\n ariaLabel: t('actions.view'),\n fallback: t('common.notAvailable'),\n className: pageStyles.actionsColumnCell,\n resolveDetailHref: (id) => {\n return config.routes.detail(id);\n },\n renderAction: ({ href, ariaLabel }) => {\n return (\n <TableCell.Actions>\n <span className={pageStyles.actionTrigger} title={ariaLabel}>\n <LinkButton\n to={href}\n variant=\"icon\"\n size=\"small\"\n aria-label={ariaLabel}\n >\n <EyeSvg width={16} height={16} />\n </LinkButton>\n </span>\n </TableCell.Actions>\n );\n },\n });\n const allColumns = [...baseColumns, actionsColumn];\n return applyListEdgeColumns(allColumns, listConfig.rowFlags, 1, tApp);\n }, [\n config.routes,\n listConfig.columns,\n listConfig.rowFlags,\n entities,\n t,\n tApp,\n ]);\n\n const getRowId = useCallback<GetRowId<unknown>>(\n (row) => {\n return listConfig.getRowId(row);\n },\n [listConfig],\n );\n\n const { state, pushState } = useBackofficeListUrlState(config);\n const resolvedSort = state.sort ?? listDefaults.sort;\n const { pageSize } = BACKOFFICE_LIST_DEFAULTS;\n\n const buildVariables = useCallback(\n (input: {\n where: Record<string, unknown> | null;\n sort: string | null;\n count: number;\n cursor: string | null;\n }) => {\n return listConfig.buildQueryVariables(input);\n },\n [listConfig],\n );\n\n const requestIdRef = useRef(0);\n const lastRefetchKeyRef = useRef(\n stableListVariablesKey({\n where: listDefaults.where,\n sort: listDefaults.sort,\n count: pageSize,\n }),\n );\n\n const runFetch = useCallback(\n async (input: RecordFetchInput) => {\n const requestId = requestIdRef.current + 1;\n requestIdRef.current = requestId;\n\n if (input.mode === 'append') {\n setIsLoadingMore(true);\n } else {\n setIsRefreshing(true);\n }\n setFetchError(false);\n\n try {\n const variables = buildVariables({\n where: input.where,\n sort: input.sort,\n count: input.count,\n cursor: input.cursor,\n });\n\n const response = await fetchQuery(\n environment,\n listConfig.query,\n variables as never,\n { fetchPolicy: RECORD_FETCH_POLICY },\n ).toPromise();\n\n if (response == null || requestIdRef.current !== requestId) {\n return;\n }\n\n const nextRows = listConfig.getRows(response as never).map((row) => {\n return listConfig.toRow(row);\n });\n setRows((prev) => {\n if (input.mode === 'append') {\n return [...prev, ...nextRows];\n }\n return nextRows;\n });\n const cursor = listConfig.getNextCursor?.(response) ?? null;\n setNextCursor(cursor);\n } catch {\n if (requestIdRef.current === requestId) {\n setFetchError(true);\n }\n } finally {\n if (input.mode === 'append') {\n setIsLoadingMore(false);\n } else {\n setIsRefreshing(false);\n }\n }\n },\n [buildVariables, environment, listConfig],\n );\n\n useEffect(() => {\n const key = stableListVariablesKey({\n where: state.where,\n sort: resolvedSort,\n count: pageSize,\n });\n if (lastRefetchKeyRef.current === key) {\n return;\n }\n lastRefetchKeyRef.current = key;\n runFetch({\n where: state.where,\n sort: resolvedSort,\n count: pageSize,\n cursor: null,\n mode: 'reset',\n }).catch(() => {\n setFetchError(true);\n });\n }, [pageSize, resolvedSort, runFetch, state.where]);\n\n const handleRefresh = useCallback(() => {\n if (isRefreshing) {\n return;\n }\n runFetch({\n where: state.where,\n sort: resolvedSort,\n count: pageSize,\n cursor: null,\n mode: 'reset',\n }).catch(() => {\n setFetchError(true);\n });\n }, [isRefreshing, pageSize, resolvedSort, runFetch, state.where]);\n\n const handleLoadMore = useBackofficeLoadMore({\n hasNext: nextCursor != null,\n isLoadingNext: isLoadingMore,\n loadNext: (count) => {\n if (nextCursor == null) {\n return;\n }\n runFetch({\n where: state.where,\n sort: resolvedSort,\n count,\n cursor: nextCursor,\n mode: 'append',\n }).catch(() => {\n setFetchError(true);\n });\n },\n count: pageSize,\n });\n\n const listActions = useMemo(() => {\n return config.listActions ?? [];\n }, [config.listActions]);\n const visibleActions = useMemo(() => {\n return listActions.filter((action) => {\n if (action.isVisible == null) {\n return true;\n }\n return action.isVisible(null);\n });\n }, [listActions]);\n\n const headerActions = useMemo(() => {\n if (visibleActions.length === 0) {\n return undefined;\n }\n return (\n <div className={pageStyles.headerActions}>\n {visibleActions.map((action, index) => {\n const { variant: actionVariant } = action;\n const label = resolveLabel(action.label, tApp);\n let ariaLabel = label;\n if (action.ariaLabel != null) {\n ariaLabel = resolveLabel(action.ariaLabel, tApp);\n }\n const variant = resolveActionVariant(actionVariant, index);\n const size = action.size ?? 'small';\n const isDisabled = action.isDisabled?.(null) === true;\n\n if (isRouteAction(action)) {\n const href = action.to(null);\n return (\n <LinkButton\n key={action.id}\n to={href}\n variant={variant}\n size={size}\n isDisabled={isDisabled}\n aria-label={ariaLabel}\n >\n {label}\n </LinkButton>\n );\n }\n\n if (isFormMutationAction(action)) {\n return (\n <Button\n key={action.id}\n type=\"button\"\n variant={variant}\n size={size}\n disabled={isDisabled}\n onClick={() => {\n setActiveFormActionId(action.id);\n }}\n aria-label={ariaLabel}\n >\n {label}\n </Button>\n );\n }\n\n return null;\n })}\n </div>\n );\n }, [tApp, visibleActions]);\n\n const activeFormAction = listActions.find((action) => {\n return action.id === activeFormActionId;\n });\n\n let statusBanner: JSX.Element | null = null;\n if (fetchError) {\n statusBanner = (\n <InlineBanner\n tone=\"danger\"\n title={t('list.errors.title')}\n actions={\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n onClick={handleRefresh}\n >\n {t('list.actions.retry')}\n </Button>\n }\n onDismiss={() => {\n setFetchError(false);\n }}\n >\n {t('list.errors.fetchFailed')}\n </InlineBanner>\n );\n }\n\n return (\n <>\n <BackofficeEntityListScaffold\n config={config}\n state={state}\n pushState={pushState}\n headerActions={headerActions}\n rows={rows}\n columns={columns}\n gridTemplateColumns={gridTemplateColumns}\n getRowId={getRowId}\n hasNextPage={nextCursor != null}\n isLoadingMore={isLoadingMore}\n isRefreshing={isRefreshing}\n onLoadMore={handleLoadMore}\n onRefresh={handleRefresh}\n totalCount={null}\n statusBanner={statusBanner}\n />\n {activeFormAction != null && isFormMutationAction(activeFormAction) && (\n <LazyBackofficeEntityActionFormDialog\n isOpen\n action={activeFormAction}\n node={null}\n onClose={() => {\n setActiveFormActionId(null);\n }}\n onSuccess={handleRefresh}\n />\n )}\n </>\n );\n};\n\nconst BackofficeEntityConnectionListPage = ({\n config,\n prepared,\n breadcrumb,\n}: Omit<BackofficeEntityListPageProps, 'config'> & {\n config: ConnectionListConfig;\n breadcrumb: ReturnType<typeof buildEntityListBreadcrumb>;\n}): JSX.Element | null => {\n const listConfig = config.list;\n\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const { entities } = useBackofficeConfig();\n const [activeFormActionId, setActiveFormActionId] = useState<string | null>(\n null,\n );\n\n const queryData = usePreloadedQuery(listConfig.query, prepared.query);\n const {\n data: fragmentData,\n loadNext,\n hasNext,\n isLoadingNext,\n refetch,\n } = usePaginationFragment(listConfig.fragment, queryData as never);\n\n const connection = listConfig.getConnection(fragmentData);\n\n const rows = useMemo(() => {\n return connection.edges.map((edge) => {\n return listConfig.toRow(edge.node);\n });\n }, [connection.edges, listConfig]);\n\n const { columns, gridTemplateColumns } = useMemo((): {\n columns: readonly DataTableColumn<unknown>[];\n gridTemplateColumns?: string;\n } => {\n const baseColumns = buildDataTableColumns(listConfig.columns, {\n tApp,\n t,\n resolveEntityHref: (entityId, refId) => {\n const entityManifest = entities[entityId];\n if (entityManifest == null) {\n return null;\n }\n return entityManifest.routes.detail(refId);\n },\n });\n const actionsColumn = buildActionsColumn({\n ariaLabel: t('actions.view'),\n fallback: t('common.notAvailable'),\n className: pageStyles.actionsColumnCell,\n resolveDetailHref: (id) => {\n return config.routes.detail(id);\n },\n renderAction: ({ href, ariaLabel }) => {\n return (\n <TableCell.Actions>\n <span className={pageStyles.actionTrigger} title={ariaLabel}>\n <LinkButton\n to={href}\n variant=\"icon\"\n size=\"small\"\n aria-label={ariaLabel}\n >\n <EyeSvg width={16} height={16} />\n </LinkButton>\n </span>\n </TableCell.Actions>\n );\n },\n });\n const allColumns = [...baseColumns, actionsColumn];\n return applyListEdgeColumns(allColumns, listConfig.rowFlags, 1, tApp);\n }, [\n config.routes,\n listConfig.columns,\n listConfig.rowFlags,\n entities,\n t,\n tApp,\n ]);\n\n const getRowId = useCallback<GetRowId<unknown>>(\n (row) => {\n return listConfig.getRowId(row);\n },\n [listConfig],\n );\n\n const { state, pushState } = useBackofficeListUrlState(config);\n const listDefaults = config.listDefaults ??\n listConfig.defaultState ?? { where: null, sort: null };\n const resolvedSort = state.sort ?? listDefaults.sort;\n const { pageSize } = BACKOFFICE_LIST_DEFAULTS;\n\n const baseVariables = useMemo(() => {\n return {\n where: state.where,\n sort: resolvedSort,\n count: pageSize,\n cursor: null,\n };\n }, [pageSize, resolvedSort, state.where]);\n\n const { isRefreshing, onRefresh } = useBackofficeListRefetch({\n refetch,\n variables: baseVariables,\n defaults: {\n where: listDefaults.where,\n sort: listDefaults.sort,\n count: pageSize,\n cursor: null,\n },\n fetchPolicy: BACKOFFICE_LIST_REFETCH_POLICY,\n buildQueryVariables: listConfig.buildQueryVariables,\n });\n\n const handleLoadMore = useBackofficeLoadMore({\n hasNext,\n isLoadingNext,\n loadNext,\n count: pageSize,\n });\n\n const listActions = useMemo(() => {\n return config.listActions ?? [];\n }, [config.listActions]);\n const visibleActions = useMemo(() => {\n return listActions.filter((action) => {\n if (action.isVisible == null) {\n return true;\n }\n return action.isVisible(null);\n });\n }, [listActions]);\n\n const headerActions = useMemo(() => {\n if (visibleActions.length === 0) {\n return undefined;\n }\n return (\n <div className={pageStyles.headerActions}>\n {visibleActions.map((action, index) => {\n const { variant: actionVariant } = action;\n const label = resolveLabel(action.label, tApp);\n let ariaLabel = label;\n if (action.ariaLabel != null) {\n ariaLabel = resolveLabel(action.ariaLabel, tApp);\n }\n const variant = resolveActionVariant(actionVariant, index);\n const size = action.size ?? 'small';\n const isDisabled = action.isDisabled?.(null) === true;\n\n if (isRouteAction(action)) {\n const href = action.to(null);\n return (\n <LinkButton\n key={action.id}\n to={href}\n variant={variant}\n size={size}\n isDisabled={isDisabled}\n aria-label={ariaLabel}\n >\n {label}\n </LinkButton>\n );\n }\n\n if (isFormMutationAction(action)) {\n return (\n <Button\n key={action.id}\n type=\"button\"\n variant={variant}\n size={size}\n disabled={isDisabled}\n onClick={() => {\n setActiveFormActionId(action.id);\n }}\n aria-label={ariaLabel}\n >\n {label}\n </Button>\n );\n }\n\n return null;\n })}\n </div>\n );\n }, [tApp, visibleActions]);\n\n const activeFormAction = listActions.find((action) => {\n return action.id === activeFormActionId;\n });\n\n return (\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <BackofficeEntityListScaffold\n config={config}\n state={state}\n pushState={pushState}\n headerActions={headerActions}\n rows={rows}\n columns={columns}\n gridTemplateColumns={gridTemplateColumns}\n getRowId={getRowId}\n hasNextPage={hasNext}\n isLoadingMore={isLoadingNext}\n isRefreshing={isRefreshing}\n onLoadMore={handleLoadMore}\n onRefresh={onRefresh}\n totalCount={connection.totalCount ?? null}\n />\n {activeFormAction != null && isFormMutationAction(activeFormAction) && (\n <LazyBackofficeEntityActionFormDialog\n isOpen\n action={activeFormAction}\n node={null}\n onClose={() => {\n setActiveFormActionId(null);\n }}\n onSuccess={onRefresh}\n />\n )}\n </BackofficeRightPageLayout>\n );\n};\n\nexport const BackofficeEntityListPage = ({\n entityManifest,\n config,\n prepared,\n}: BackofficeEntityListPageProps): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const breadcrumb = buildEntityListBreadcrumb(config, tApp);\n\n if (isRecordListConfig(config)) {\n return (\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <BackofficeEntityRecordListPage\n entityManifest={entityManifest}\n config={config}\n prepared={prepared}\n />\n </BackofficeRightPageLayout>\n );\n }\n if (!isConnectionListConfig(config)) {\n return null;\n }\n return (\n <BackofficeEntityConnectionListPage\n entityManifest={entityManifest}\n config={config}\n prepared={prepared}\n breadcrumb={breadcrumb}\n />\n );\n};\n\nexport default BackofficeEntityListPage;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { r as e, t } from "./useBackofficeReactTranslation-Btt58EIo.js";
|
|
2
|
+
import { o as n } from "./sidebarUtils-BgCBLJLv.js";
|
|
3
|
+
import { t as r } from "./BackofficeHubTemplate-C6K55egX.js";
|
|
4
|
+
import { t as i } from "./BackofficeRightPageLayout-CfNkrMvH.js";
|
|
5
|
+
import { i as a } from "./buildBreadcrumbs-C5St167Y.js";
|
|
6
|
+
import { n as o } from "./BackofficePermissionsContext-C2bdxy2z.js";
|
|
7
|
+
import { useMemo as s, useState as c } from "react";
|
|
8
|
+
import { useTranslation as l } from "react-i18next";
|
|
9
|
+
import { DetailPageTemplate as u, SidebarTasksSvg as d } from "@plumile/ui";
|
|
10
|
+
import { jsx as f } from "react/jsx-runtime";
|
|
11
|
+
//#region src/pages/BackofficeHubPage.tsx
|
|
12
|
+
var p = (e, t) => {
|
|
13
|
+
if (e != null) return /* @__PURE__ */ f(e, {
|
|
14
|
+
width: t,
|
|
15
|
+
height: t,
|
|
16
|
+
"aria-hidden": "true"
|
|
17
|
+
});
|
|
18
|
+
}, m = (e) => {
|
|
19
|
+
let { entity: t, kind: n, permissions: r, sidebar: i } = e;
|
|
20
|
+
return t == null || n === "entity" && t.kind !== "tool" && !t.hasList ? !1 : i?.isItemVisible?.({
|
|
21
|
+
kind: n,
|
|
22
|
+
id: t.id
|
|
23
|
+
}, r) !== !1;
|
|
24
|
+
}, h = ({ prepared: h }) => {
|
|
25
|
+
let { t: g } = l(), { t: _ } = t(), { entities: v, sidebar: y } = e(), b = o(), [x, S] = c(""), { hub: C } = h, w = n(C.title, g), T;
|
|
26
|
+
C.description != null && (T = n(C.description, g));
|
|
27
|
+
let E = a({
|
|
28
|
+
id: C.id,
|
|
29
|
+
title: w
|
|
30
|
+
}), D = x.trim().toLowerCase(), O = C.search?.enabled !== !1, k = _("hub.search.placeholder");
|
|
31
|
+
C.search?.placeholder != null && (k = n(C.search.placeholder, g));
|
|
32
|
+
let A = s(() => C.groups.map((e) => {
|
|
33
|
+
let t = e.items.map((e) => {
|
|
34
|
+
let t = v[e.id];
|
|
35
|
+
if (t == null || !m({
|
|
36
|
+
entity: t,
|
|
37
|
+
kind: e.kind,
|
|
38
|
+
permissions: b,
|
|
39
|
+
sidebar: y
|
|
40
|
+
})) return null;
|
|
41
|
+
let r = t, i = n(r.label, g);
|
|
42
|
+
return D !== "" && !i.toLowerCase().includes(D) ? null : {
|
|
43
|
+
id: e.id,
|
|
44
|
+
kind: e.kind,
|
|
45
|
+
label: i,
|
|
46
|
+
href: r.routes.list,
|
|
47
|
+
icon: p(e.icon, 20)
|
|
48
|
+
};
|
|
49
|
+
}).filter((e) => e != null), r = null;
|
|
50
|
+
return e.description != null && (r = n(e.description, g)), {
|
|
51
|
+
id: e.id,
|
|
52
|
+
title: n(e.title, g),
|
|
53
|
+
description: r,
|
|
54
|
+
icon: p(e.icon, 18),
|
|
55
|
+
items: t
|
|
56
|
+
};
|
|
57
|
+
}).filter((e) => e.items.length > 0), [
|
|
58
|
+
v,
|
|
59
|
+
C.groups,
|
|
60
|
+
D,
|
|
61
|
+
b,
|
|
62
|
+
y,
|
|
63
|
+
g
|
|
64
|
+
]), j = _("hub.empty.title");
|
|
65
|
+
C.emptyState?.title != null && (j = n(C.emptyState.title, g));
|
|
66
|
+
let M = _("hub.empty.description");
|
|
67
|
+
C.emptyState?.description != null && (M = n(C.emptyState.description, g));
|
|
68
|
+
let N = _("hub.subtitle");
|
|
69
|
+
T != null && (N = T);
|
|
70
|
+
let P = A.some((e) => new Set(e.items.map((e) => e.kind)).size > 1), F = s(() => A.map((e) => ({
|
|
71
|
+
id: e.id,
|
|
72
|
+
title: e.title,
|
|
73
|
+
description: e.description,
|
|
74
|
+
icon: e.icon,
|
|
75
|
+
items: e.items.map((e) => {
|
|
76
|
+
let t = null;
|
|
77
|
+
return P && (t = _("hub.itemKinds.entity"), e.kind === "tool" && (t = _("hub.itemKinds.tool"))), {
|
|
78
|
+
id: e.id,
|
|
79
|
+
kind: e.kind,
|
|
80
|
+
label: e.label,
|
|
81
|
+
href: e.href,
|
|
82
|
+
icon: e.icon,
|
|
83
|
+
metaLabel: t
|
|
84
|
+
};
|
|
85
|
+
})
|
|
86
|
+
})), [
|
|
87
|
+
A,
|
|
88
|
+
P,
|
|
89
|
+
_
|
|
90
|
+
]), I;
|
|
91
|
+
return O && (I = {
|
|
92
|
+
value: x,
|
|
93
|
+
onChange: S,
|
|
94
|
+
placeholder: k
|
|
95
|
+
}), /* @__PURE__ */ f(i, {
|
|
96
|
+
breadcrumb: E,
|
|
97
|
+
children: /* @__PURE__ */ f(u, {
|
|
98
|
+
header: {
|
|
99
|
+
title: w,
|
|
100
|
+
subtitle: N
|
|
101
|
+
},
|
|
102
|
+
children: /* @__PURE__ */ f(r, {
|
|
103
|
+
groups: F,
|
|
104
|
+
search: I,
|
|
105
|
+
emptyState: {
|
|
106
|
+
title: j,
|
|
107
|
+
description: M,
|
|
108
|
+
icon: /* @__PURE__ */ f(d, {
|
|
109
|
+
width: 28,
|
|
110
|
+
height: 28,
|
|
111
|
+
"aria-hidden": "true"
|
|
112
|
+
})
|
|
113
|
+
}
|
|
114
|
+
})
|
|
115
|
+
})
|
|
116
|
+
});
|
|
117
|
+
};
|
|
118
|
+
//#endregion
|
|
119
|
+
export { h as BackofficeHubPage, h as default };
|
|
120
|
+
|
|
121
|
+
//# sourceMappingURL=BackofficeHubPage-DOePQ8Fc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BackofficeHubPage-DOePQ8Fc.js","names":[],"sources":["../../src/pages/BackofficeHubPage.tsx"],"sourcesContent":["import { useMemo, useState, type JSX, type ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { DetailPageTemplate, SidebarTasksSvg } from '@plumile/ui';\nimport type { BackofficeEntityManifestMap } from '@plumile/backoffice-core/types.js';\n\nimport { useBackofficeReactTranslation } from '../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeConfig } from '../provider/BackofficeConfigContext.js';\nimport type { BackofficeIconComponent } from '../provider/types.js';\nimport type { BackofficePreparedHubRoute } from '../router/createBackofficeRoutes.js';\nimport {\n BackofficeHubTemplate,\n type BackofficeHubTemplateGroup,\n type BackofficeHubTemplateSearch,\n} from '../components/backoffice/hub/BackofficeHubTemplate.js';\nimport { BackofficeRightPageLayout } from '../components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js';\nimport { buildHubBreadcrumb } from '../components/backoffice/layout/breadcrumb/buildBreadcrumbs.js';\nimport { useBackofficePermissions } from '../components/backoffice/layout/BackofficePermissionsContext.js';\nimport { resolveLabel } from '../components/backoffice/layout/sidebarUtils.js';\n\nexport type BackofficeHubPageProps = {\n prepared: BackofficePreparedHubRoute;\n};\n\ntype HubPageItemView = {\n id: string;\n kind: 'entity' | 'tool';\n label: string;\n href: string;\n icon: ReactNode;\n};\n\ntype HubPageGroupView = {\n id: string;\n title: string;\n description: string | null;\n icon: ReactNode | undefined;\n items: readonly HubPageItemView[];\n};\n\nconst renderIcon = (\n Icon: BackofficeIconComponent | undefined,\n size: number,\n): ReactNode | undefined => {\n if (Icon == null) {\n return undefined;\n }\n return <Icon width={size} height={size} aria-hidden=\"true\" />;\n};\n\nconst isItemVisible = (input: {\n entity: BackofficeEntityManifestMap[string] | null | undefined;\n kind: 'entity' | 'tool';\n permissions: unknown;\n sidebar: ReturnType<typeof useBackofficeConfig>['sidebar'];\n}): boolean => {\n const { entity, kind, permissions, sidebar } = input;\n if (entity == null) {\n return false;\n }\n if (kind === 'entity' && entity.kind !== 'tool' && !entity.hasList) {\n return false;\n }\n const isVisible = sidebar?.isItemVisible?.(\n {\n kind,\n id: entity.id,\n },\n permissions,\n );\n return isVisible !== false;\n};\n\nexport const BackofficeHubPage = ({\n prepared,\n}: BackofficeHubPageProps): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const { entities, sidebar } = useBackofficeConfig();\n const permissions = useBackofficePermissions();\n const [search, setSearch] = useState('');\n const { hub } = prepared;\n const title = resolveLabel(hub.title, tApp);\n let description: string | undefined;\n if (hub.description != null) {\n description = resolveLabel(hub.description, tApp);\n }\n const breadcrumb = buildHubBreadcrumb({ id: hub.id, title });\n const normalizedSearch = search.trim().toLowerCase();\n const searchEnabled = hub.search?.enabled !== false;\n let searchPlaceholder = t('hub.search.placeholder');\n if (hub.search?.placeholder != null) {\n searchPlaceholder = resolveLabel(hub.search.placeholder, tApp);\n }\n\n const groups = useMemo<readonly HubPageGroupView[]>(() => {\n return hub.groups\n .map((group) => {\n const items = group.items\n .map((item): HubPageItemView | null => {\n const entity = entities[item.id];\n if (entity == null) {\n return null;\n }\n if (\n !isItemVisible({\n entity,\n kind: item.kind,\n permissions,\n sidebar,\n })\n ) {\n return null;\n }\n const entityConfig = entity;\n const label = resolveLabel(entityConfig.label, tApp);\n if (\n normalizedSearch !== '' &&\n !label.toLowerCase().includes(normalizedSearch)\n ) {\n return null;\n }\n return {\n id: item.id,\n kind: item.kind,\n label,\n href: entityConfig.routes.list,\n icon: renderIcon(item.icon, 20),\n };\n })\n .filter((item): item is HubPageItemView => {\n return item != null;\n });\n let groupDescription: string | null = null;\n if (group.description != null) {\n groupDescription = resolveLabel(group.description, tApp);\n }\n return {\n id: group.id,\n title: resolveLabel(group.title, tApp),\n description: groupDescription,\n icon: renderIcon(group.icon, 18),\n items,\n };\n })\n .filter((group) => {\n return group.items.length > 0;\n });\n }, [entities, hub.groups, normalizedSearch, permissions, sidebar, tApp]);\n\n let emptyTitle = t('hub.empty.title');\n if (hub.emptyState?.title != null) {\n emptyTitle = resolveLabel(hub.emptyState.title, tApp);\n }\n let emptyDescription = t('hub.empty.description');\n if (hub.emptyState?.description != null) {\n emptyDescription = resolveLabel(hub.emptyState.description, tApp);\n }\n let subtitle = t('hub.subtitle');\n if (description != null) {\n subtitle = description;\n }\n const hasMixedKinds = groups.some((group) => {\n const kinds = new Set(\n group.items.map((item) => {\n return item.kind;\n }),\n );\n return kinds.size > 1;\n });\n\n const templateGroups = useMemo<readonly BackofficeHubTemplateGroup[]>(() => {\n return groups.map((group) => {\n return {\n id: group.id,\n title: group.title,\n description: group.description,\n icon: group.icon,\n items: group.items.map((item) => {\n let metaLabel: string | null = null;\n if (hasMixedKinds) {\n metaLabel = t('hub.itemKinds.entity');\n if (item.kind === 'tool') {\n metaLabel = t('hub.itemKinds.tool');\n }\n }\n return {\n id: item.id,\n kind: item.kind,\n label: item.label,\n href: item.href,\n icon: item.icon,\n metaLabel,\n };\n }),\n };\n });\n }, [groups, hasMixedKinds, t]);\n\n let searchConfig: BackofficeHubTemplateSearch | undefined;\n if (searchEnabled) {\n searchConfig = {\n value: search,\n onChange: setSearch,\n placeholder: searchPlaceholder,\n };\n }\n\n return (\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <DetailPageTemplate\n header={{\n title,\n subtitle,\n }}\n >\n <BackofficeHubTemplate\n groups={templateGroups}\n search={searchConfig}\n emptyState={{\n title: emptyTitle,\n description: emptyDescription,\n icon: <SidebarTasksSvg width={28} height={28} aria-hidden=\"true\" />,\n }}\n />\n </DetailPageTemplate>\n </BackofficeRightPageLayout>\n );\n};\n\nexport default BackofficeHubPage;\n"],"mappings":"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"}
|