@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,522 +0,0 @@
|
|
|
1
|
-
import { t as e } from "./useBackofficeReactTranslation-Btt58EIo.js";
|
|
2
|
-
import { t } from "./BackofficeErrorBoundary-BwRVSDHU.js";
|
|
3
|
-
import { n, r, t as i } from "./EntityFilterValue-BWUdPBwp.js";
|
|
4
|
-
import { i as a, t as o } from "./EntityIdPickerDialog-Yhmr-WsV.js";
|
|
5
|
-
import { Suspense as s, lazy as c, startTransition as l, useCallback as u, useEffect as d, useMemo as f, useRef as p, useState as m } from "react";
|
|
6
|
-
import { useTranslation as ee } from "react-i18next";
|
|
7
|
-
import { BackofficeEmptyState as h, BackofficeFilterDrawer as te, BackofficeFilterField as ne, BackofficeInfiniteListStatus as re, BackofficePageHeader as ie, BackofficeTableSkeleton as ae, BackofficeTableToolbar as oe, Button as g, FilterChipRow as se, GlobalSearchInput as ce, InlineBanner as le, ListPageTemplate as ue, ResponsiveRecordList as de, SimpleSelect as _, denseTableClass as fe } from "@plumile/ui";
|
|
8
|
-
import { Fragment as v, jsx as y, jsxs as b } from "react/jsx-runtime";
|
|
9
|
-
import { readWhereValue as x, setWhereValue as S } from "@plumile/backoffice-core/filters/where.js";
|
|
10
|
-
import { stableListVariablesKey as C } from "@plumile/backoffice-core/state/stableKey.js";
|
|
11
|
-
//#region src/hooks/useBackofficeLoadMore.ts
|
|
12
|
-
function w({ hasNext: e, isLoadingNext: t, loadNext: n, count: r }) {
|
|
13
|
-
return u(() => {
|
|
14
|
-
!e || t || l(() => {
|
|
15
|
-
n(r);
|
|
16
|
-
});
|
|
17
|
-
}, [
|
|
18
|
-
r,
|
|
19
|
-
e,
|
|
20
|
-
t,
|
|
21
|
-
n
|
|
22
|
-
]);
|
|
23
|
-
}
|
|
24
|
-
//#endregion
|
|
25
|
-
//#region src/hooks/useBackofficeListRefetch.ts
|
|
26
|
-
function T({ refetch: e, variables: t, defaults: n, fetchPolicy: r, buildVariables: i }) {
|
|
27
|
-
let a = p(C({
|
|
28
|
-
where: n.where,
|
|
29
|
-
sort: n.sort,
|
|
30
|
-
count: n.count
|
|
31
|
-
})), o = u((e) => i == null ? e : i(e), [i]);
|
|
32
|
-
return d(() => {
|
|
33
|
-
let n = C({
|
|
34
|
-
where: t.where,
|
|
35
|
-
sort: t.sort,
|
|
36
|
-
count: t.count
|
|
37
|
-
});
|
|
38
|
-
a.current !== n && (a.current = n, e(o({
|
|
39
|
-
...t,
|
|
40
|
-
cursor: null
|
|
41
|
-
}), { fetchPolicy: r }));
|
|
42
|
-
}, [
|
|
43
|
-
r,
|
|
44
|
-
e,
|
|
45
|
-
o,
|
|
46
|
-
t
|
|
47
|
-
]), { onRefresh: u(() => {
|
|
48
|
-
e(o({
|
|
49
|
-
...t,
|
|
50
|
-
cursor: null
|
|
51
|
-
}), { fetchPolicy: r });
|
|
52
|
-
}, [
|
|
53
|
-
r,
|
|
54
|
-
e,
|
|
55
|
-
o,
|
|
56
|
-
t
|
|
57
|
-
]) };
|
|
58
|
-
}
|
|
59
|
-
//#endregion
|
|
60
|
-
//#region src/hooks/useBackofficeInfiniteScrollSentinel.ts
|
|
61
|
-
function pe({ enabled: e, hasNextPage: t, isLoading: n, onIntersect: r, root: i = null, rootMargin: a = "360px 0px", threshold: o = 0 }) {
|
|
62
|
-
let [s, c] = m(null), l = p(r);
|
|
63
|
-
return d(() => {
|
|
64
|
-
l.current = r;
|
|
65
|
-
}, [r]), d(() => {
|
|
66
|
-
if (!e || !t || n || s == null) return () => {};
|
|
67
|
-
if (typeof IntersectionObserver > "u") return l.current(), () => {};
|
|
68
|
-
let r = new IntersectionObserver((e) => {
|
|
69
|
-
e[0]?.isIntersecting === !0 && l.current();
|
|
70
|
-
}, {
|
|
71
|
-
root: i,
|
|
72
|
-
rootMargin: a,
|
|
73
|
-
threshold: o
|
|
74
|
-
});
|
|
75
|
-
return r.observe(s), () => {
|
|
76
|
-
r.disconnect();
|
|
77
|
-
};
|
|
78
|
-
}, [
|
|
79
|
-
e,
|
|
80
|
-
t,
|
|
81
|
-
n,
|
|
82
|
-
s,
|
|
83
|
-
i,
|
|
84
|
-
a,
|
|
85
|
-
o
|
|
86
|
-
]), { sentinelRef: u((e) => {
|
|
87
|
-
c(e);
|
|
88
|
-
}, []) };
|
|
89
|
-
}
|
|
90
|
-
//#endregion
|
|
91
|
-
//#region src/components/backoffice/scaffolds/backofficeEntityListScaffold.css.ts
|
|
92
|
-
var me = "txvbqb9ip txvbqbajy txvbqbcp txvbqbao7", he = "txvbqbu4g txvbqbjep", ge = "txvbqb9ip txvbqbai7 txvbqbaog", _e = "txvbqb97 txvbqbamp txvbqbv9z", E = (e, t) => e(t), D = (e, t) => e.fromGraphQL != null && t != null ? e.fromGraphQL(t) : x(t, e.whereKey ?? e.id, e.path), ve = (e, t, n) => {
|
|
93
|
-
if (t == null) return null;
|
|
94
|
-
if (Array.isArray(t)) {
|
|
95
|
-
let e = t.map((e) => {
|
|
96
|
-
if (e == null || typeof e != "string" && typeof e != "number" && typeof e != "boolean") return null;
|
|
97
|
-
let t = String(e).trim();
|
|
98
|
-
return t === "" ? null : t;
|
|
99
|
-
}).filter((e) => e != null);
|
|
100
|
-
return e.length === 0 ? null : e.join(", ");
|
|
101
|
-
}
|
|
102
|
-
if (typeof t == "boolean") return e.kind === "boolean" ? n.booleanLabel(t) : t ? n.fallbackBooleanLabels.yes : n.fallbackBooleanLabels.no;
|
|
103
|
-
if (typeof t != "string" && typeof t != "number") return null;
|
|
104
|
-
let r = String(t).trim();
|
|
105
|
-
return r === "" ? null : e.kind === "entityId" ? /* @__PURE__ */ y(i, {
|
|
106
|
-
entityId: e.entity,
|
|
107
|
-
id: r
|
|
108
|
-
}) : e.kind === "enum" ? n.enumLabel(r) : r;
|
|
109
|
-
}, O = (i) => {
|
|
110
|
-
let { t: s } = ee(), { t: c } = e(), { config: l, state: d, pushState: p, rows: x, getRowId: C, columns: w, gridTemplateColumns: T, hasNextPage: O, isLoadingMore: k, onLoadMore: A, onRefresh: j, totalCount: M, emptyState: N, header: P, headerActions: ye, isLoadingInitial: F = !1, variant: be = "page", showFilters: xe = !0 } = i, I = l.list, L = l.listDefaults ?? I.defaultState ?? {
|
|
111
|
-
where: null,
|
|
112
|
-
sort: null
|
|
113
|
-
}, R = f(() => w.some((e) => e.isPrimary === !0) || w.length === 0 ? w : w.map((e, t) => {
|
|
114
|
-
let { header: n } = e;
|
|
115
|
-
return t === 0 ? {
|
|
116
|
-
...e,
|
|
117
|
-
isPrimary: !0,
|
|
118
|
-
header: n
|
|
119
|
-
} : {
|
|
120
|
-
...e,
|
|
121
|
-
header: n
|
|
122
|
-
};
|
|
123
|
-
}), [w]), z = f(() => {
|
|
124
|
-
let e = [];
|
|
125
|
-
for (let t of I.filters) {
|
|
126
|
-
let n = D(t, d.where), r = ve(t, n, {
|
|
127
|
-
enumLabel: (e) => {
|
|
128
|
-
if (t.kind !== "enum") return e;
|
|
129
|
-
let n = t.options.find((t) => t.value === e);
|
|
130
|
-
return n == null ? e : E(n.label, s);
|
|
131
|
-
},
|
|
132
|
-
booleanLabel: (e) => {
|
|
133
|
-
if (t.kind === "boolean") {
|
|
134
|
-
if (e && t.trueLabel != null) return E(t.trueLabel, s);
|
|
135
|
-
if (!e && t.falseLabel != null) return E(t.falseLabel, s);
|
|
136
|
-
}
|
|
137
|
-
return c(e ? "filters.boolean.yes" : "filters.boolean.no");
|
|
138
|
-
},
|
|
139
|
-
fallbackBooleanLabels: {
|
|
140
|
-
yes: c("filters.boolean.yes"),
|
|
141
|
-
no: c("filters.boolean.no")
|
|
142
|
-
}
|
|
143
|
-
});
|
|
144
|
-
if (r != null) {
|
|
145
|
-
let i = String(n);
|
|
146
|
-
Array.isArray(n) && (i = n.join(","));
|
|
147
|
-
let a = /* @__PURE__ */ b("span", { children: [
|
|
148
|
-
E(t.label, s),
|
|
149
|
-
": ",
|
|
150
|
-
r
|
|
151
|
-
] });
|
|
152
|
-
e.push({
|
|
153
|
-
id: `${t.id}:${i}`,
|
|
154
|
-
label: a,
|
|
155
|
-
onRemove: () => {
|
|
156
|
-
let e = t.whereKey ?? t.id, n = S(d.where, e, null, t.path);
|
|
157
|
-
p({
|
|
158
|
-
...d,
|
|
159
|
-
where: n
|
|
160
|
-
});
|
|
161
|
-
}
|
|
162
|
-
});
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
return e;
|
|
166
|
-
}, [
|
|
167
|
-
I.filters,
|
|
168
|
-
p,
|
|
169
|
-
d,
|
|
170
|
-
c,
|
|
171
|
-
s
|
|
172
|
-
]), B = u(() => {
|
|
173
|
-
p({ ...L });
|
|
174
|
-
}, [L, p]), [Se, V] = m(!1), [H, U] = m(""), [W, G] = m(null), K = u((e) => {
|
|
175
|
-
let t = e.whereKey ?? e.id, r = D(e, d.where), i = "";
|
|
176
|
-
typeof r == "string" && (i = r);
|
|
177
|
-
let o = E(e.label, s);
|
|
178
|
-
if (e.kind === "text") {
|
|
179
|
-
let n = c("filters.placeholders.search", { label: e.placeholderLabel == null ? o : E(e.placeholderLabel, s) });
|
|
180
|
-
return e.placeholderText != null && (n = E(e.placeholderText, s)), /* @__PURE__ */ y(ce, {
|
|
181
|
-
value: i,
|
|
182
|
-
onChange: (n) => {
|
|
183
|
-
let r = S(d.where, t, n, e.path);
|
|
184
|
-
p({
|
|
185
|
-
...d,
|
|
186
|
-
where: r
|
|
187
|
-
});
|
|
188
|
-
},
|
|
189
|
-
placeholder: n,
|
|
190
|
-
className: he
|
|
191
|
-
});
|
|
192
|
-
}
|
|
193
|
-
if (e.kind === "enum") return /* @__PURE__ */ y(_, {
|
|
194
|
-
options: [{
|
|
195
|
-
id: "any",
|
|
196
|
-
value: "",
|
|
197
|
-
label: c("filters.all", { label: o })
|
|
198
|
-
}, ...e.options.map((e) => ({
|
|
199
|
-
id: e.value,
|
|
200
|
-
value: e.value,
|
|
201
|
-
label: E(e.label, s)
|
|
202
|
-
}))],
|
|
203
|
-
value: i,
|
|
204
|
-
onChange: (n) => {
|
|
205
|
-
let r = S(d.where, t, n, e.path);
|
|
206
|
-
p({
|
|
207
|
-
...d,
|
|
208
|
-
where: r
|
|
209
|
-
});
|
|
210
|
-
}
|
|
211
|
-
});
|
|
212
|
-
if (e.kind === "boolean") {
|
|
213
|
-
let n = null;
|
|
214
|
-
typeof r == "boolean" && (n = r);
|
|
215
|
-
let i = "";
|
|
216
|
-
n === !0 && (i = "true"), n === !1 && (i = "false");
|
|
217
|
-
let a = e.trueLabel == null ? c("filters.boolean.yes") : E(e.trueLabel, s), l = e.falseLabel == null ? c("filters.boolean.no") : E(e.falseLabel, s);
|
|
218
|
-
return /* @__PURE__ */ y(_, {
|
|
219
|
-
options: [
|
|
220
|
-
{
|
|
221
|
-
id: "any",
|
|
222
|
-
value: "",
|
|
223
|
-
label: c("filters.all", { label: o })
|
|
224
|
-
},
|
|
225
|
-
{
|
|
226
|
-
id: "true",
|
|
227
|
-
value: "true",
|
|
228
|
-
label: a
|
|
229
|
-
},
|
|
230
|
-
{
|
|
231
|
-
id: "false",
|
|
232
|
-
value: "false",
|
|
233
|
-
label: l
|
|
234
|
-
}
|
|
235
|
-
],
|
|
236
|
-
value: i,
|
|
237
|
-
onChange: (n) => {
|
|
238
|
-
let r = null;
|
|
239
|
-
n === "true" && (r = !0), n === "false" && (r = !1);
|
|
240
|
-
let i = S(d.where, t, r, e.path);
|
|
241
|
-
p({
|
|
242
|
-
...d,
|
|
243
|
-
where: i
|
|
244
|
-
});
|
|
245
|
-
}
|
|
246
|
-
});
|
|
247
|
-
}
|
|
248
|
-
let l = (() => {
|
|
249
|
-
if (e.pickerScope != null) return typeof e.pickerScope == "function" ? e.pickerScope(d.where) : e.pickerScope;
|
|
250
|
-
})(), u = null;
|
|
251
|
-
typeof r == "string" && (u = r);
|
|
252
|
-
let f = (n = null) => {
|
|
253
|
-
let r = n?.trim() ?? "";
|
|
254
|
-
return /* @__PURE__ */ y(a, {
|
|
255
|
-
label: o,
|
|
256
|
-
value: u,
|
|
257
|
-
displayValue: r,
|
|
258
|
-
onPick: () => {
|
|
259
|
-
G({
|
|
260
|
-
entity: e.entity,
|
|
261
|
-
whereKey: t,
|
|
262
|
-
label: o,
|
|
263
|
-
path: e.path,
|
|
264
|
-
scope: l
|
|
265
|
-
});
|
|
266
|
-
},
|
|
267
|
-
onClear: () => {
|
|
268
|
-
let n = S(d.where, t, null, e.path);
|
|
269
|
-
p({
|
|
270
|
-
...d,
|
|
271
|
-
where: n
|
|
272
|
-
});
|
|
273
|
-
}
|
|
274
|
-
});
|
|
275
|
-
};
|
|
276
|
-
return u == null || u.trim() === "" ? f() : /* @__PURE__ */ y(n, {
|
|
277
|
-
entityId: e.entity,
|
|
278
|
-
id: u,
|
|
279
|
-
children: (e) => f(e)
|
|
280
|
-
});
|
|
281
|
-
}, [
|
|
282
|
-
p,
|
|
283
|
-
d,
|
|
284
|
-
c,
|
|
285
|
-
s
|
|
286
|
-
]), q = f(() => I.filters.some((e) => e.placement != null), [I.filters]), J = f(() => {
|
|
287
|
-
if (I.filters.length === 0) return [];
|
|
288
|
-
let e = I.ui?.toolbar?.maxPromotedFilters ?? 3;
|
|
289
|
-
return q ? I.filters.filter((e) => e.placement === "quick" || e.placement === "both") : I.filters.slice(0, e);
|
|
290
|
-
}, [
|
|
291
|
-
I.filters,
|
|
292
|
-
I.ui?.toolbar,
|
|
293
|
-
q
|
|
294
|
-
]), Y = f(() => I.filters.filter((e) => e.placement == null ? !0 : e.placement === "drawer" || e.placement === "both"), [I.filters]), X = f(() => J.find((e) => e.kind === "text"), [J]), Ce = f(() => {
|
|
295
|
-
let e = J.filter((e) => e !== X);
|
|
296
|
-
return e.length === 0 ? null : /* @__PURE__ */ y("div", {
|
|
297
|
-
className: me,
|
|
298
|
-
children: e.map((e) => /* @__PURE__ */ y("span", { children: K(e) }, e.id))
|
|
299
|
-
});
|
|
300
|
-
}, [
|
|
301
|
-
J,
|
|
302
|
-
K,
|
|
303
|
-
X
|
|
304
|
-
]), we = f(() => X == null ? null : K(X), [K, X]), Te = f(() => {
|
|
305
|
-
if (I.sorts.length === 0) return null;
|
|
306
|
-
let e = I.sorts[0];
|
|
307
|
-
return e == null ? null : /* @__PURE__ */ y(_, {
|
|
308
|
-
options: I.sorts.map((e) => ({
|
|
309
|
-
id: e.id,
|
|
310
|
-
value: e.id,
|
|
311
|
-
label: E(e.label, s)
|
|
312
|
-
})),
|
|
313
|
-
value: d.sort ?? e.id,
|
|
314
|
-
onChange: (e) => {
|
|
315
|
-
p({
|
|
316
|
-
...d,
|
|
317
|
-
sort: e
|
|
318
|
-
});
|
|
319
|
-
}
|
|
320
|
-
});
|
|
321
|
-
}, [
|
|
322
|
-
I.sorts,
|
|
323
|
-
p,
|
|
324
|
-
d,
|
|
325
|
-
s
|
|
326
|
-
]), Ee = f(() => /* @__PURE__ */ y(se, {
|
|
327
|
-
chips: z,
|
|
328
|
-
onClearAll: B
|
|
329
|
-
}), [z, B]), De = f(() => {
|
|
330
|
-
if (Y.length === 0) return [];
|
|
331
|
-
let e = H.trim().toLowerCase(), t = [];
|
|
332
|
-
for (let n of Y) {
|
|
333
|
-
let r = E(n.label, s);
|
|
334
|
-
(e === "" || r.toLowerCase().includes(e)) && t.push({
|
|
335
|
-
id: n.id,
|
|
336
|
-
node: /* @__PURE__ */ y(ne, {
|
|
337
|
-
label: r,
|
|
338
|
-
children: K(n)
|
|
339
|
-
})
|
|
340
|
-
});
|
|
341
|
-
}
|
|
342
|
-
return t.length === 0 ? [] : [{
|
|
343
|
-
id: "backoffice.filters.sections.default",
|
|
344
|
-
title: c("filters.sections.default"),
|
|
345
|
-
items: t
|
|
346
|
-
}];
|
|
347
|
-
}, [
|
|
348
|
-
Y,
|
|
349
|
-
H,
|
|
350
|
-
K,
|
|
351
|
-
c,
|
|
352
|
-
s
|
|
353
|
-
]), Oe = f(() => {
|
|
354
|
-
if (Y.length === 0) return null;
|
|
355
|
-
let e = z.length, t = c("filters.allFilters");
|
|
356
|
-
return e > 0 && (t = c("filters.allFiltersWithCount", { count: e })), /* @__PURE__ */ y(g, {
|
|
357
|
-
type: "button",
|
|
358
|
-
variant: "secondary",
|
|
359
|
-
size: "small",
|
|
360
|
-
onClick: () => {
|
|
361
|
-
V(!0);
|
|
362
|
-
},
|
|
363
|
-
children: t
|
|
364
|
-
});
|
|
365
|
-
}, [
|
|
366
|
-
z.length,
|
|
367
|
-
Y.length,
|
|
368
|
-
c
|
|
369
|
-
]), ke = /* @__PURE__ */ y(te, {
|
|
370
|
-
isOpen: Se,
|
|
371
|
-
onClose: () => {
|
|
372
|
-
V(!1), U("");
|
|
373
|
-
},
|
|
374
|
-
sections: De,
|
|
375
|
-
searchValue: H,
|
|
376
|
-
onSearchChange: (e) => {
|
|
377
|
-
U(e);
|
|
378
|
-
},
|
|
379
|
-
onReset: B
|
|
380
|
-
}), Ae = f(() => N ?? (F ? /* @__PURE__ */ y(ae, {}) : z.length > 0 ? /* @__PURE__ */ y(h, {
|
|
381
|
-
title: c("emptyState.listEmpty.title"),
|
|
382
|
-
description: c("emptyState.listEmptyFiltered.description"),
|
|
383
|
-
actions: /* @__PURE__ */ y(g, {
|
|
384
|
-
type: "button",
|
|
385
|
-
variant: "secondary",
|
|
386
|
-
size: "small",
|
|
387
|
-
onClick: B,
|
|
388
|
-
children: c("emptyState.listEmptyFiltered.actions.reset")
|
|
389
|
-
})
|
|
390
|
-
}) : /* @__PURE__ */ y(h, {
|
|
391
|
-
title: c("emptyState.listEmpty.title"),
|
|
392
|
-
description: c("emptyState.listEmpty.description")
|
|
393
|
-
})), [
|
|
394
|
-
z.length,
|
|
395
|
-
N,
|
|
396
|
-
B,
|
|
397
|
-
F,
|
|
398
|
-
c
|
|
399
|
-
]), je = f(() => typeof M == "number" ? /* @__PURE__ */ y("span", { children: c("list.showing", {
|
|
400
|
-
shown: x.length,
|
|
401
|
-
total: M
|
|
402
|
-
}) }) : null, [
|
|
403
|
-
x.length,
|
|
404
|
-
c,
|
|
405
|
-
M
|
|
406
|
-
]), { sentinelRef: Me } = pe({
|
|
407
|
-
enabled: !0,
|
|
408
|
-
hasNextPage: O,
|
|
409
|
-
isLoading: k,
|
|
410
|
-
onIntersect: A
|
|
411
|
-
}), Z = P?.title ?? E(I.title, s), Ne = P?.subtitle, Pe = R.find((e) => e.mobileRole === "action" || e.id === "actions"), Fe = /* @__PURE__ */ y(t, {
|
|
412
|
-
fallback: (e) => {
|
|
413
|
-
let { reset: t } = e;
|
|
414
|
-
return /* @__PURE__ */ y(le, {
|
|
415
|
-
tone: "danger",
|
|
416
|
-
title: c("list.errors.title"),
|
|
417
|
-
actions: /* @__PURE__ */ y(g, {
|
|
418
|
-
type: "button",
|
|
419
|
-
variant: "secondary",
|
|
420
|
-
size: "small",
|
|
421
|
-
onClick: () => {
|
|
422
|
-
t(), j?.();
|
|
423
|
-
},
|
|
424
|
-
children: c("list.actions.retry")
|
|
425
|
-
}),
|
|
426
|
-
children: c("list.errors.tableFailed")
|
|
427
|
-
});
|
|
428
|
-
},
|
|
429
|
-
children: /* @__PURE__ */ y(de, {
|
|
430
|
-
columns: R,
|
|
431
|
-
rows: x,
|
|
432
|
-
getRowId: C,
|
|
433
|
-
emptyState: Ae,
|
|
434
|
-
className: fe,
|
|
435
|
-
gridTemplateColumns: T,
|
|
436
|
-
mode: I.ui?.displayMode ?? I.responsive?.mode ?? "auto",
|
|
437
|
-
density: I.ui?.density ?? I.responsive?.density ?? "compact",
|
|
438
|
-
renderAction: (e) => Pe?.cell(e) ?? null
|
|
439
|
-
})
|
|
440
|
-
}), Q = xe ? /* @__PURE__ */ b(v, { children: [/* @__PURE__ */ y(oe, {
|
|
441
|
-
searchSlot: we,
|
|
442
|
-
promotedFiltersSlot: Ce,
|
|
443
|
-
allFiltersSlot: Oe,
|
|
444
|
-
sortSlot: Te,
|
|
445
|
-
refreshSlot: /* @__PURE__ */ y(g, {
|
|
446
|
-
type: "button",
|
|
447
|
-
variant: "text",
|
|
448
|
-
size: "small",
|
|
449
|
-
disabled: j == null,
|
|
450
|
-
onClick: () => {
|
|
451
|
-
j?.();
|
|
452
|
-
},
|
|
453
|
-
children: c("list.actions.refresh")
|
|
454
|
-
}),
|
|
455
|
-
chipsSlot: Ee
|
|
456
|
-
}), ke] }) : null, $ = /* @__PURE__ */ b("div", { children: [Fe, /* @__PURE__ */ y(o, {
|
|
457
|
-
isOpen: W != null,
|
|
458
|
-
entity: W?.entity ?? l.id,
|
|
459
|
-
title: W?.label ?? c("picker.title"),
|
|
460
|
-
scope: W?.scope,
|
|
461
|
-
onClose: () => {
|
|
462
|
-
G(null);
|
|
463
|
-
},
|
|
464
|
-
onSelectId: (e) => {
|
|
465
|
-
if (W == null) return;
|
|
466
|
-
let t = S(d.where, W.whereKey, e, W.path);
|
|
467
|
-
p({
|
|
468
|
-
...d,
|
|
469
|
-
where: t
|
|
470
|
-
});
|
|
471
|
-
}
|
|
472
|
-
})] }), Ie = /* @__PURE__ */ b(v, { children: [/* @__PURE__ */ y("div", {
|
|
473
|
-
ref: Me,
|
|
474
|
-
"aria-hidden": "true"
|
|
475
|
-
}), /* @__PURE__ */ y(re, {
|
|
476
|
-
loadedCount: x.length,
|
|
477
|
-
totalCount: M,
|
|
478
|
-
hasNextPage: O,
|
|
479
|
-
isLoading: k,
|
|
480
|
-
loadedLabel: je,
|
|
481
|
-
loadingLabel: c("list.loadMore.loading"),
|
|
482
|
-
endLabel: c("list.loadMore.end")
|
|
483
|
-
})] });
|
|
484
|
-
return be === "embedded" ? /* @__PURE__ */ y(r, {
|
|
485
|
-
config: l,
|
|
486
|
-
state: d,
|
|
487
|
-
pushState: p,
|
|
488
|
-
children: /* @__PURE__ */ b("div", {
|
|
489
|
-
className: ge,
|
|
490
|
-
children: [
|
|
491
|
-
/* @__PURE__ */ y("div", {
|
|
492
|
-
className: _e,
|
|
493
|
-
children: Z
|
|
494
|
-
}),
|
|
495
|
-
Q,
|
|
496
|
-
$,
|
|
497
|
-
Ie
|
|
498
|
-
]
|
|
499
|
-
})
|
|
500
|
-
}) : /* @__PURE__ */ y(r, {
|
|
501
|
-
config: l,
|
|
502
|
-
state: d,
|
|
503
|
-
pushState: p,
|
|
504
|
-
children: /* @__PURE__ */ y(ue, {
|
|
505
|
-
headerNode: /* @__PURE__ */ y(ie, {
|
|
506
|
-
title: Z,
|
|
507
|
-
subtitle: Ne,
|
|
508
|
-
actions: ye
|
|
509
|
-
}),
|
|
510
|
-
toolbarNode: Q,
|
|
511
|
-
tableNode: $,
|
|
512
|
-
tableFooterNode: Ie
|
|
513
|
-
})
|
|
514
|
-
});
|
|
515
|
-
}, k = c(async () => ({ default: (await import("./BackofficeEntityActionFormDialog-BgMuhyU8.js")).BackofficeEntityActionFormDialog })), A = (e) => /* @__PURE__ */ y(s, {
|
|
516
|
-
fallback: null,
|
|
517
|
-
children: /* @__PURE__ */ y(k, { ...e })
|
|
518
|
-
});
|
|
519
|
-
//#endregion
|
|
520
|
-
export { w as i, O as n, T as r, A as t };
|
|
521
|
-
|
|
522
|
-
//# sourceMappingURL=LazyBackofficeEntityActionFormDialog-uyYFFJGM.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"LazyBackofficeEntityActionFormDialog-uyYFFJGM.js","names":[],"sources":["../../src/hooks/useBackofficeLoadMore.ts","../../src/hooks/useBackofficeListRefetch.ts","../../src/hooks/useBackofficeInfiniteScrollSentinel.ts","../../src/components/backoffice/scaffolds/backofficeEntityListScaffold.css.ts","../../src/components/backoffice/scaffolds/BackofficeEntityListScaffold.tsx","../../src/components/backoffice/actions/LazyBackofficeEntityActionFormDialog.tsx"],"sourcesContent":["import { startTransition, useCallback } from 'react';\n\ntype Params = {\n hasNext: boolean;\n isLoadingNext: boolean;\n loadNext: (count: number) => void;\n count: number;\n};\n\n/**\n * Wraps Relay `loadNext()` with consistent guards and `startTransition()`.\n */\nexport function useBackofficeLoadMore({\n hasNext,\n isLoadingNext,\n loadNext,\n count,\n}: Params): () => void {\n return useCallback(() => {\n if (!hasNext || isLoadingNext) {\n return;\n }\n\n startTransition(() => {\n loadNext(count);\n });\n }, [count, hasNext, isLoadingNext, loadNext]);\n}\n","import { useCallback, useEffect, useRef } from 'react';\nimport type { FetchPolicy } from 'relay-runtime';\n\nimport { stableListVariablesKey } from '@plumile/backoffice-core/state/stableKey.js';\nimport type { BackofficeListVariables } from '@plumile/backoffice-core/types.js';\n\ntype RefetchFn<TVariables> = (\n vars: TVariables,\n opts: { fetchPolicy: FetchPolicy },\n) => void;\n\ntype Params<Where, Sort extends string, Variables> = {\n refetch: RefetchFn<Variables>;\n variables: BackofficeListVariables<Where, Sort>;\n defaults: BackofficeListVariables<Where, Sort>;\n fetchPolicy: FetchPolicy;\n buildVariables?: (input: BackofficeListVariables<Where, Sort>) => Variables;\n};\n\n/**\n * Standardizes refetch behavior for backoffice list components:\n * - Refetches when list URL state changes (where/sort/count), gated by a stable key.\n * - Exposes a manual refresh callback using the same variables.\n *\n * This hook must not call Relay hooks (`useFragment`, `usePaginationFragment`, ...).\n */\nexport function useBackofficeListRefetch<\n Where,\n Sort extends string,\n Variables extends Record<string, unknown>,\n>({\n refetch,\n variables,\n defaults,\n fetchPolicy,\n buildVariables,\n}: Params<Where, Sort, Variables>): { onRefresh: () => void } {\n const lastRefetchKeyRef = useRef<string | null>(\n stableListVariablesKey({\n where: defaults.where,\n sort: defaults.sort,\n count: defaults.count,\n }),\n );\n\n const resolveVariables = useCallback(\n (input: BackofficeListVariables<Where, Sort>) => {\n if (buildVariables != null) {\n return buildVariables(input);\n }\n return input as unknown as Variables;\n },\n [buildVariables],\n );\n\n useEffect(() => {\n const key = stableListVariablesKey({\n where: variables.where,\n sort: variables.sort,\n count: variables.count,\n });\n if (lastRefetchKeyRef.current === key) {\n return;\n }\n lastRefetchKeyRef.current = key;\n\n const nextVariables = resolveVariables({ ...variables, cursor: null });\n refetch(nextVariables, { fetchPolicy });\n }, [fetchPolicy, refetch, resolveVariables, variables]);\n\n const onRefresh = useCallback(() => {\n const nextVariables = resolveVariables({ ...variables, cursor: null });\n refetch(nextVariables, { fetchPolicy });\n }, [fetchPolicy, refetch, resolveVariables, variables]);\n\n return { onRefresh };\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\nexport type UseBackofficeInfiniteScrollSentinelOptions = {\n enabled: boolean;\n hasNextPage: boolean;\n isLoading: boolean;\n root?: Element | null;\n rootMargin?: string;\n threshold?: number;\n onIntersect: () => void;\n};\n\nexport type UseBackofficeInfiniteScrollSentinelResult = {\n sentinelRef: (node: HTMLElement | null) => void;\n};\n\n/**\n * Observes a sentinel element and triggers pagination when it enters the viewport.\n */\nexport function useBackofficeInfiniteScrollSentinel({\n enabled,\n hasNextPage,\n isLoading,\n onIntersect,\n root = null,\n rootMargin = '360px 0px',\n threshold = 0,\n}: UseBackofficeInfiniteScrollSentinelOptions): UseBackofficeInfiniteScrollSentinelResult {\n const [node, setNode] = useState<HTMLElement | null>(null);\n const onIntersectRef = useRef(onIntersect);\n\n useEffect(() => {\n onIntersectRef.current = onIntersect;\n }, [onIntersect]);\n\n useEffect(() => {\n if (!enabled || !hasNextPage || isLoading || node == null) {\n return () => {};\n }\n\n if (typeof IntersectionObserver === 'undefined') {\n onIntersectRef.current();\n return () => {};\n }\n\n const observer = new IntersectionObserver(\n (entries) => {\n const entry = entries[0];\n if (entry?.isIntersecting === true) {\n onIntersectRef.current();\n }\n },\n {\n root,\n rootMargin,\n threshold,\n },\n );\n\n observer.observe(node);\n\n return () => {\n observer.disconnect();\n };\n }, [enabled, hasNextPage, isLoading, node, root, rootMargin, threshold]);\n\n const sentinelRef = useCallback((next: HTMLElement | null) => {\n setNode(next);\n }, []);\n\n return { sentinelRef };\n}\n","import { sprinkles } from '@plumile/ui';\n\nexport const controlsRow = sprinkles({\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n gap: 2,\n});\n\nexport const filterInput = sprinkles({\n width: 72,\n maxWidth: 'full',\n});\n\nexport const embeddedContainer = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n});\n\nexport const embeddedHeader = sprinkles({\n fontSize: 'base',\n fontWeight: 'semibold',\n color: 'text',\n});\n","/* eslint-disable no-ternary */\nimport {\n type JSX,\n type ReactNode,\n useCallback,\n useMemo,\n useState,\n} from 'react';\nimport type { TFunction } from 'i18next';\nimport { useTranslation } from 'react-i18next';\nimport {\n BackofficeEmptyState,\n BackofficeFilterDrawer,\n BackofficeFilterField,\n BackofficeInfiniteListStatus,\n BackofficePageHeader,\n BackofficeTableSkeleton,\n BackofficeTableToolbar,\n Button,\n FilterChipRow,\n GlobalSearchInput,\n InlineBanner,\n ListPageTemplate,\n ResponsiveRecordList,\n SimpleSelect,\n type FilterChip,\n type DataTableColumn,\n type GetRowId,\n denseTableClass,\n} from '@plumile/ui';\n\nimport {\n readWhereValue,\n setWhereValue,\n} from '@plumile/backoffice-core/filters/where.js';\nimport type {\n BackofficeFilterSpec,\n BackofficeListState,\n BackofficePickerScope,\n BackofficeResolvedListFacetConfig,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\n\nimport { BackofficeErrorBoundary } from '../errors/BackofficeErrorBoundary.js';\nimport {\n EntityFilterValue,\n EntityFilterValueText,\n} from '../filters/EntityFilterValue.js';\nimport { EntityIdPickerDialog } from '../pickers/EntityIdPickerDialog.js';\nimport { EntityIdFilterField } from '../filters/EntityIdFilterField.js';\nimport { BackofficeListFilterProvider } from './BackofficeListFilterContext.js';\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeInfiniteScrollSentinel } from '../../../hooks/useBackofficeInfiniteScrollSentinel.js';\n\nimport * as styles from './backofficeEntityListScaffold.css.js';\n\nconst resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\nconst getFilterValue = <Where extends Record<string, unknown>>(\n filter: BackofficeFilterSpec<Where>,\n where: Where | null,\n): unknown => {\n if (filter.fromGraphQL != null && where != null) {\n return filter.fromGraphQL(where);\n }\n\n const key = (filter.whereKey ?? filter.id) as keyof Where;\n return readWhereValue(where, key, filter.path);\n};\n\nconst getFilterDisplayValue = <Where extends Record<string, unknown>>(\n filter: BackofficeFilterSpec<Where>,\n raw: unknown,\n options: {\n enumLabel: (value: string) => string;\n booleanLabel: (value: boolean) => string;\n fallbackBooleanLabels: { yes: string; no: string };\n },\n): ReactNode | null => {\n if (raw == null) {\n return null;\n }\n\n if (Array.isArray(raw)) {\n const normalized = raw\n .map((entry) => {\n if (entry == null) {\n return null;\n }\n if (\n typeof entry !== 'string' &&\n typeof entry !== 'number' &&\n typeof entry !== 'boolean'\n ) {\n return null;\n }\n const value = String(entry).trim();\n if (value === '') {\n return null;\n }\n return value;\n })\n .filter((entry): entry is string => {\n return entry != null;\n });\n\n if (normalized.length === 0) {\n return null;\n }\n return normalized.join(', ');\n }\n\n if (typeof raw === 'boolean') {\n if (filter.kind === 'boolean') {\n return options.booleanLabel(raw);\n }\n if (raw) {\n return options.fallbackBooleanLabels.yes;\n }\n return options.fallbackBooleanLabels.no;\n }\n\n if (typeof raw !== 'string' && typeof raw !== 'number') {\n return null;\n }\n\n const rawString = String(raw).trim();\n if (rawString === '') {\n return null;\n }\n\n if (filter.kind === 'entityId') {\n return <EntityFilterValue entityId={filter.entity} id={rawString} />;\n }\n\n if (filter.kind === 'enum') {\n return options.enumLabel(rawString);\n }\n\n return rawString;\n};\n\ntype Props<\n RowView,\n Where extends Record<string, unknown>,\n Sort extends string,\n> = {\n config: BackofficeResolvedListFacetConfig<Where, Sort>;\n state: BackofficeListState<Where, Sort>;\n pushState: (next: BackofficeListState<Where, Sort>) => void;\n header?: {\n title?: string;\n subtitle?: string;\n };\n headerActions?: ReactNode;\n rows: readonly RowView[];\n getRowId: GetRowId<RowView>;\n columns: readonly DataTableColumn<RowView>[];\n gridTemplateColumns?: string;\n hasNextPage: boolean;\n isLoadingMore: boolean;\n onLoadMore: () => void;\n onRefresh?: () => void;\n totalCount?: number | null;\n emptyState?: JSX.Element;\n isLoadingInitial?: boolean;\n virtualize?: boolean;\n variant?: 'page' | 'embedded';\n showFilters?: boolean;\n};\n\nexport const BackofficeEntityListScaffold = <\n RowView,\n Where extends Record<string, unknown>,\n Sort extends string,\n>(\n props: Props<RowView, Where, Sort>,\n): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const {\n config,\n state,\n pushState,\n rows,\n getRowId,\n columns,\n gridTemplateColumns,\n hasNextPage,\n isLoadingMore,\n onLoadMore,\n onRefresh,\n totalCount,\n emptyState,\n header,\n headerActions,\n isLoadingInitial = false,\n variant = 'page',\n showFilters = true,\n } = props;\n const listConfig = config.list;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const listDefaults = config.listDefaults ??\n listConfig.defaultState ?? { where: null, sort: null };\n\n const columnsWithPrimary = useMemo(() => {\n const hasPrimary = columns.some((col) => {\n return col.isPrimary === true;\n });\n if (hasPrimary || columns.length === 0) {\n return columns;\n }\n return columns.map((col, index) => {\n const { header } = col;\n if (index === 0) {\n return { ...col, isPrimary: true, header };\n }\n return { ...col, header };\n });\n }, [columns]);\n\n const chips = useMemo<readonly FilterChip[]>(() => {\n const out: FilterChip[] = [];\n for (const filter of listConfig.filters) {\n const raw = getFilterValue(filter, state.where);\n const displayValue = getFilterDisplayValue(filter, raw, {\n enumLabel: (value) => {\n if (filter.kind !== 'enum') {\n return value;\n }\n const match = filter.options.find((option) => {\n return option.value === value;\n });\n if (match != null) {\n return resolveLabel(match.label, tApp);\n }\n return value;\n },\n booleanLabel: (value) => {\n if (filter.kind === 'boolean') {\n if (value && filter.trueLabel != null) {\n return resolveLabel(filter.trueLabel, tApp);\n }\n if (!value && filter.falseLabel != null) {\n return resolveLabel(filter.falseLabel, tApp);\n }\n }\n if (value) {\n return t('filters.boolean.yes');\n }\n return t('filters.boolean.no');\n },\n fallbackBooleanLabels: {\n yes: t('filters.boolean.yes'),\n no: t('filters.boolean.no'),\n },\n });\n\n if (displayValue != null) {\n let idValue = String(raw);\n if (Array.isArray(raw)) {\n idValue = raw.join(',');\n }\n const label = (\n <span>\n {resolveLabel(filter.label, tApp)}: {displayValue}\n </span>\n );\n out.push({\n id: `${filter.id}:${idValue}`,\n label,\n onRemove: () => {\n const key = (filter.whereKey ?? filter.id) as keyof Where;\n const nextWhere = setWhereValue(\n state.where,\n key,\n null,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n },\n });\n }\n }\n return out;\n }, [listConfig.filters, pushState, state, t, tApp]);\n\n const handleClearAll = useCallback(() => {\n pushState({\n ...listDefaults,\n });\n }, [listDefaults, pushState]);\n const [isFilterDrawerOpen, setIsFilterDrawerOpen] = useState(false);\n const [filterSearch, setFilterSearch] = useState('');\n\n const [pickerDialog, setPickerDialog] = useState<{\n entity: string;\n whereKey: keyof Where;\n label: string;\n path?: readonly string[];\n scope?: BackofficePickerScope;\n } | null>(null);\n\n const renderFilterControl = useCallback(\n (filter: BackofficeFilterSpec<Where>): JSX.Element => {\n const key = (filter.whereKey ?? filter.id) as keyof Where;\n const candidate = getFilterValue(filter, state.where);\n let value = '';\n if (typeof candidate === 'string') {\n value = candidate;\n }\n\n const filterLabelText = resolveLabel(filter.label, tApp);\n\n if (filter.kind === 'text') {\n const placeholderLabelText =\n filter.placeholderLabel != null\n ? resolveLabel(filter.placeholderLabel, tApp)\n : filterLabelText;\n let placeholder = t('filters.placeholders.search', {\n label: placeholderLabelText,\n });\n if (filter.placeholderText != null) {\n placeholder = resolveLabel(filter.placeholderText, tApp);\n }\n return (\n <GlobalSearchInput\n value={value}\n onChange={(next) => {\n const nextWhere = setWhereValue(\n state.where,\n key,\n next,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n placeholder={placeholder}\n className={styles.filterInput}\n />\n );\n }\n\n if (filter.kind === 'enum') {\n const options = [\n {\n id: 'any',\n value: '',\n label: t('filters.all', {\n label: filterLabelText,\n }),\n },\n ...filter.options.map((option) => {\n return {\n id: option.value,\n value: option.value,\n label: resolveLabel(option.label, tApp),\n };\n }),\n ];\n\n return (\n <SimpleSelect\n options={options}\n value={value}\n onChange={(next) => {\n const nextWhere = setWhereValue(\n state.where,\n key,\n next,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n />\n );\n }\n\n if (filter.kind === 'boolean') {\n let current: boolean | null = null;\n if (typeof candidate === 'boolean') {\n current = candidate;\n }\n\n let selectValue = '';\n if (current === true) {\n selectValue = 'true';\n }\n if (current === false) {\n selectValue = 'false';\n }\n\n const trueLabel =\n filter.trueLabel != null\n ? resolveLabel(filter.trueLabel, tApp)\n : t('filters.boolean.yes');\n const falseLabel =\n filter.falseLabel != null\n ? resolveLabel(filter.falseLabel, tApp)\n : t('filters.boolean.no');\n const options = [\n {\n id: 'any',\n value: '',\n label: t('filters.all', {\n label: filterLabelText,\n }),\n },\n {\n id: 'true',\n value: 'true',\n label: trueLabel,\n },\n {\n id: 'false',\n value: 'false',\n label: falseLabel,\n },\n ];\n\n return (\n <SimpleSelect\n options={options}\n value={selectValue}\n onChange={(next) => {\n let parsed: boolean | null = null;\n if (next === 'true') {\n parsed = true;\n }\n if (next === 'false') {\n parsed = false;\n }\n const nextWhere = setWhereValue(\n state.where,\n key,\n parsed,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n />\n );\n }\n\n const pickerScope = (() => {\n if (filter.pickerScope == null) {\n return undefined;\n }\n if (typeof filter.pickerScope === 'function') {\n return filter.pickerScope(state.where);\n }\n return filter.pickerScope;\n })();\n let currentId: string | null = null;\n if (typeof candidate === 'string') {\n currentId = candidate;\n }\n\n const renderField = (displayValue: string | null = null) => {\n const normalizedDisplayValue = displayValue?.trim() ?? '';\n return (\n <EntityIdFilterField\n label={filterLabelText}\n value={currentId}\n displayValue={normalizedDisplayValue}\n onPick={() => {\n setPickerDialog({\n entity: filter.entity,\n whereKey: key,\n label: filterLabelText,\n path: filter.path,\n scope: pickerScope,\n });\n }}\n onClear={() => {\n const nextWhere = setWhereValue(\n state.where,\n key,\n null,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n />\n );\n };\n\n if (currentId == null || currentId.trim() === '') {\n return renderField();\n }\n\n return (\n <EntityFilterValueText entityId={filter.entity} id={currentId}>\n {(label) => {\n return renderField(label);\n }}\n </EntityFilterValueText>\n );\n },\n [pushState, state, t, tApp],\n );\n\n const hasPlacementConfig = useMemo(() => {\n return listConfig.filters.some((filter) => {\n return filter.placement != null;\n });\n }, [listConfig.filters]);\n\n const quickFilters = useMemo(() => {\n if (listConfig.filters.length === 0) {\n return [];\n }\n const maxPromotedFilters = listConfig.ui?.toolbar?.maxPromotedFilters ?? 3;\n if (hasPlacementConfig) {\n return listConfig.filters.filter((filter) => {\n return filter.placement === 'quick' || filter.placement === 'both';\n });\n }\n return listConfig.filters.slice(0, maxPromotedFilters);\n }, [listConfig.filters, listConfig.ui?.toolbar, hasPlacementConfig]);\n\n const drawerFilters = useMemo(() => {\n return listConfig.filters.filter((filter) => {\n if (filter.placement == null) {\n return true;\n }\n return filter.placement === 'drawer' || filter.placement === 'both';\n });\n }, [listConfig.filters]);\n\n const searchFilter = useMemo(() => {\n return quickFilters.find((filter) => {\n return filter.kind === 'text';\n });\n }, [quickFilters]);\n\n const quickFiltersNode = useMemo(() => {\n const visibleQuickFilters = quickFilters.filter((filter) => {\n return filter !== searchFilter;\n });\n\n if (visibleQuickFilters.length === 0) {\n return null;\n }\n\n return (\n <div className={styles.controlsRow}>\n {visibleQuickFilters.map((filter) => {\n return <span key={filter.id}>{renderFilterControl(filter)}</span>;\n })}\n </div>\n );\n }, [quickFilters, renderFilterControl, searchFilter]);\n\n const searchNode = useMemo(() => {\n if (searchFilter == null) {\n return null;\n }\n return renderFilterControl(searchFilter);\n }, [renderFilterControl, searchFilter]);\n\n const sortNode = useMemo(() => {\n if (listConfig.sorts.length === 0) {\n return null;\n }\n const firstSort = listConfig.sorts[0];\n if (firstSort == null) {\n return null;\n }\n const options = listConfig.sorts.map((s) => {\n return { id: s.id, value: s.id, label: resolveLabel(s.label, tApp) };\n });\n return (\n <SimpleSelect\n options={options}\n value={state.sort ?? firstSort.id}\n onChange={(next) => {\n pushState({\n ...state,\n sort: next as Sort,\n });\n }}\n />\n );\n }, [listConfig.sorts, pushState, state, tApp]);\n\n const chipsNode = useMemo(() => {\n return <FilterChipRow chips={chips} onClearAll={handleClearAll} />;\n }, [chips, handleClearAll]);\n\n const drawerSections = useMemo(() => {\n if (drawerFilters.length === 0) {\n return [];\n }\n\n const normalizedQuery = filterSearch.trim().toLowerCase();\n const items: { id: string; node: JSX.Element }[] = [];\n\n for (const filter of drawerFilters) {\n const resolvedLabel = resolveLabel(filter.label, tApp);\n const matchesQuery =\n normalizedQuery === '' ||\n resolvedLabel.toLowerCase().includes(normalizedQuery);\n\n if (matchesQuery) {\n items.push({\n id: filter.id,\n node: (\n <BackofficeFilterField label={resolvedLabel}>\n {renderFilterControl(filter)}\n </BackofficeFilterField>\n ),\n });\n }\n }\n\n if (items.length === 0) {\n return [];\n }\n\n return [\n {\n id: 'backoffice.filters.sections.default',\n title: t('filters.sections.default'),\n items,\n },\n ];\n }, [drawerFilters, filterSearch, renderFilterControl, t, tApp]);\n\n const allFiltersNode = useMemo(() => {\n if (drawerFilters.length === 0) {\n return null;\n }\n const activeCount = chips.length;\n let label = t('filters.allFilters');\n if (activeCount > 0) {\n label = t('filters.allFiltersWithCount', {\n count: activeCount,\n });\n }\n return (\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n onClick={() => {\n setIsFilterDrawerOpen(true);\n }}\n >\n {label}\n </Button>\n );\n }, [chips.length, drawerFilters.length, t]);\n\n const filterDrawerNode = (\n <BackofficeFilterDrawer\n isOpen={isFilterDrawerOpen}\n onClose={() => {\n setIsFilterDrawerOpen(false);\n setFilterSearch('');\n }}\n sections={drawerSections}\n searchValue={filterSearch}\n onSearchChange={(next) => {\n setFilterSearch(next);\n }}\n onReset={handleClearAll}\n />\n );\n\n const resolvedEmptyState = useMemo((): JSX.Element => {\n if (emptyState != null) {\n return emptyState;\n }\n\n if (isLoadingInitial) {\n return <BackofficeTableSkeleton />;\n }\n\n if (chips.length > 0) {\n return (\n <BackofficeEmptyState\n title={t('emptyState.listEmpty.title')}\n description={t('emptyState.listEmptyFiltered.description')}\n actions={\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n onClick={handleClearAll}\n >\n {t('emptyState.listEmptyFiltered.actions.reset')}\n </Button>\n }\n />\n );\n }\n\n return (\n <BackofficeEmptyState\n title={t('emptyState.listEmpty.title')}\n description={t('emptyState.listEmpty.description')}\n />\n );\n }, [chips.length, emptyState, handleClearAll, isLoadingInitial, t]);\n\n const tableFooterMeta = useMemo(() => {\n if (typeof totalCount !== 'number') {\n return null;\n }\n return (\n <span>\n {t('list.showing', {\n shown: rows.length,\n total: totalCount,\n })}\n </span>\n );\n }, [rows.length, t, totalCount]);\n\n const { sentinelRef } = useBackofficeInfiniteScrollSentinel({\n enabled: true,\n hasNextPage,\n isLoading: isLoadingMore,\n onIntersect: onLoadMore,\n });\n\n const headerTitle = header?.title ?? resolveLabel(listConfig.title, tApp);\n const headerSubtitle = header?.subtitle;\n\n const actionColumn = columnsWithPrimary.find((column) => {\n return column.mobileRole === 'action' || column.id === 'actions';\n });\n const listMode =\n listConfig.ui?.displayMode ?? listConfig.responsive?.mode ?? 'auto';\n const listDensity =\n listConfig.ui?.density ?? listConfig.responsive?.density ?? 'compact';\n\n const tableInnerNode = (\n <ResponsiveRecordList\n columns={columnsWithPrimary}\n rows={rows}\n getRowId={getRowId}\n emptyState={resolvedEmptyState}\n className={denseTableClass}\n gridTemplateColumns={gridTemplateColumns}\n mode={listMode}\n density={listDensity}\n renderAction={(row) => {\n return actionColumn?.cell(row) ?? null;\n }}\n />\n );\n\n const tableNodeWithErrorBoundary = (\n <BackofficeErrorBoundary\n fallback={(args: { error: unknown; reset: () => void }) => {\n const { reset } = args;\n\n const retry = (): void => {\n reset();\n if (onRefresh != null) {\n onRefresh();\n }\n };\n\n return (\n <InlineBanner\n tone=\"danger\"\n title={t('list.errors.title')}\n actions={\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n onClick={retry}\n >\n {t('list.actions.retry')}\n </Button>\n }\n >\n {t('list.errors.tableFailed')}\n </InlineBanner>\n );\n }}\n >\n {tableInnerNode}\n </BackofficeErrorBoundary>\n );\n\n const filtersBarNode = showFilters ? (\n <>\n <BackofficeTableToolbar\n searchSlot={searchNode}\n promotedFiltersSlot={quickFiltersNode}\n allFiltersSlot={allFiltersNode}\n sortSlot={sortNode}\n refreshSlot={\n <Button\n type=\"button\"\n variant=\"text\"\n size=\"small\"\n disabled={onRefresh == null}\n onClick={() => {\n if (onRefresh != null) {\n onRefresh();\n }\n }}\n >\n {t('list.actions.refresh')}\n </Button>\n }\n chipsSlot={chipsNode}\n />\n {filterDrawerNode}\n </>\n ) : null;\n\n const tableNode = (\n <div>\n {tableNodeWithErrorBoundary}\n <EntityIdPickerDialog\n isOpen={pickerDialog != null}\n entity={pickerDialog?.entity ?? config.id}\n title={pickerDialog?.label ?? t('picker.title')}\n scope={pickerDialog?.scope}\n onClose={() => {\n setPickerDialog(null);\n }}\n onSelectId={(id) => {\n if (pickerDialog == null) {\n return;\n }\n const nextWhere = setWhereValue(\n state.where,\n pickerDialog.whereKey,\n id,\n pickerDialog.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n />\n </div>\n );\n\n const tableFooterNode = (\n <>\n <div ref={sentinelRef} aria-hidden=\"true\" />\n <BackofficeInfiniteListStatus\n loadedCount={rows.length}\n totalCount={totalCount}\n hasNextPage={hasNextPage}\n isLoading={isLoadingMore}\n loadedLabel={tableFooterMeta}\n loadingLabel={t('list.loadMore.loading')}\n endLabel={t('list.loadMore.end')}\n />\n </>\n );\n\n if (variant === 'embedded') {\n return (\n <BackofficeListFilterProvider\n config={config}\n state={state}\n pushState={pushState}\n >\n <div className={styles.embeddedContainer}>\n <div className={styles.embeddedHeader}>{headerTitle}</div>\n {filtersBarNode}\n {tableNode}\n {tableFooterNode}\n </div>\n </BackofficeListFilterProvider>\n );\n }\n\n return (\n <BackofficeListFilterProvider\n config={config}\n state={state}\n pushState={pushState}\n >\n <ListPageTemplate\n headerNode={\n <BackofficePageHeader\n title={headerTitle}\n subtitle={headerSubtitle}\n actions={headerActions}\n />\n }\n toolbarNode={filtersBarNode}\n tableNode={tableNode}\n tableFooterNode={tableFooterNode}\n />\n </BackofficeListFilterProvider>\n );\n};\n\nexport default BackofficeEntityListScaffold;\n","import { Suspense, lazy, type JSX } from 'react';\n\nimport type { BackofficeEntityActionFormDialogProps } from './BackofficeEntityActionFormDialog.js';\n\nconst BackofficeEntityActionFormDialog = lazy(async () => {\n const module = await import('./BackofficeEntityActionFormDialog.js');\n return { default: module.BackofficeEntityActionFormDialog };\n});\n\nexport const LazyBackofficeEntityActionFormDialog = <Node,>(\n props: BackofficeEntityActionFormDialogProps<Node>,\n): JSX.Element => {\n const Dialog = BackofficeEntityActionFormDialog as <TNode>(\n dialogProps: BackofficeEntityActionFormDialogProps<TNode>,\n ) => JSX.Element;\n\n return (\n <Suspense fallback={null}>\n <Dialog {...props} />\n </Suspense>\n );\n};\n\nexport default LazyBackofficeEntityActionFormDialog;\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"buildBreadcrumbs-C9cyiXb7.js","names":[],"sources":["../../src/components/backoffice/layout/breadcrumb/buildBreadcrumbs.ts"],"sourcesContent":["import type { TFunction } from 'i18next';\n\nimport type {\n BackofficeResolvedDetailLayoutFacetConfig,\n BackofficeResolvedDetailPageFacetConfig,\n BackofficeResolvedListFacetConfig,\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: BackofficeResolvedListFacetConfig,\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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sidebarUtils-BZETlHea.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 { groupId: string; icon?: BackofficeIconComponent }\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 const entityIds = resolveGroupEntityIds(group, sidebar);\n entityIds.forEach((entityId) => {\n if (!lookup.has(entityId)) {\n lookup.set(entityId, { groupId, icon: group.icon });\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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"}
|