@plumile/backoffice-react 0.1.107 → 0.1.108
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/auth/TotpQrCode.js +1 -1
- package/lib/esm/auth/TotpQrCode.js.map +1 -1
- package/lib/esm/auth/login/EmailCapturePanel.js +27 -23
- package/lib/esm/auth/login/EmailCapturePanel.js.map +1 -1
- package/lib/esm/auth/login/MfaChallengeForm.js +38 -36
- package/lib/esm/auth/login/MfaChallengeForm.js.map +1 -1
- package/lib/esm/auth/login/PasskeyLoginForm.js +40 -37
- package/lib/esm/auth/login/PasskeyLoginForm.js.map +1 -1
- package/lib/esm/auth/pages/AcceptInvitationScreen.js +63 -62
- package/lib/esm/auth/pages/AcceptInvitationScreen.js.map +1 -1
- package/lib/esm/auth/pages/PasswordResetCompleteScreen.js +56 -55
- package/lib/esm/auth/pages/PasswordResetCompleteScreen.js.map +1 -1
- package/lib/esm/auth/pages/PasswordResetRequestScreen.js +45 -45
- package/lib/esm/auth/pages/PasswordResetRequestScreen.js.map +1 -1
- package/lib/esm/components/backoffice/actions/BackofficeEntityActionFormDialog.js +1 -0
- package/lib/esm/components/backoffice/actions/BackofficeEntityActionFormDialog.js.map +1 -1
- package/lib/esm/components/backoffice/columns/buildDataTableColumns.js +44 -39
- package/lib/esm/components/backoffice/columns/buildDataTableColumns.js.map +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeCopyButton.js +15 -0
- package/lib/esm/components/backoffice/detail/BackofficeCopyButton.js.map +1 -0
- package/lib/esm/components/backoffice/detail/BackofficeDetailActionBar.js +11 -0
- package/lib/esm/components/backoffice/detail/BackofficeDetailActionBar.js.map +1 -0
- package/lib/esm/components/backoffice/detail/BackofficeDetailBlock.js +7 -0
- package/lib/esm/components/backoffice/detail/BackofficeDetailBlock.js.map +1 -0
- package/lib/esm/components/backoffice/detail/BackofficeDetailHeader.js +15 -0
- package/lib/esm/components/backoffice/detail/BackofficeDetailHeader.js.map +1 -0
- package/lib/esm/components/backoffice/detail/BackofficeDetailPage.js +19 -0
- package/lib/esm/components/backoffice/detail/BackofficeDetailPage.js.map +1 -0
- package/lib/esm/components/backoffice/detail/BackofficeDetailRelationLink.js +47 -40
- package/lib/esm/components/backoffice/detail/BackofficeDetailRelationLink.js.map +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeDetailRelationListBlock.js +83 -90
- package/lib/esm/components/backoffice/detail/BackofficeDetailRelationListBlock.js.map +1 -1
- package/lib/esm/components/backoffice/detail/BackofficeDetailTable.js +8 -0
- package/lib/esm/components/backoffice/detail/BackofficeDetailTable.js.map +1 -0
- package/lib/esm/components/backoffice/detail/BackofficeEmptyValue.js +7 -0
- package/lib/esm/components/backoffice/detail/BackofficeEmptyValue.js.map +1 -0
- package/lib/esm/components/backoffice/detail/BackofficeStatusGroup.js +8 -0
- package/lib/esm/components/backoffice/detail/BackofficeStatusGroup.js.map +1 -0
- package/lib/esm/components/backoffice/detail/BackofficeTechnicalFacts.js +2 -0
- package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarBreadcrumb.js +53 -48
- package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarBreadcrumb.js.map +1 -1
- package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarPortalContext.js +2 -2
- package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarPortalContext.js.map +1 -1
- package/lib/esm/components/backoffice/layout/breadcrumb/assertValidBreadcrumb.js +15 -11
- package/lib/esm/components/backoffice/layout/breadcrumb/assertValidBreadcrumb.js.map +1 -1
- package/lib/esm/components/backoffice/layout/breadcrumb/buildBreadcrumbs.js +50 -23
- package/lib/esm/components/backoffice/layout/breadcrumb/buildBreadcrumbs.js.map +1 -1
- package/lib/esm/components/backoffice/layout/buildSidebarSections.js +69 -69
- package/lib/esm/components/backoffice/layout/sidebarUtils.js +16 -16
- package/lib/esm/components/backoffice/layout/sidebarUtils.js.map +1 -1
- package/lib/esm/components/backoffice/links/BackofficeInlineLink.js +29 -0
- package/lib/esm/components/backoffice/links/BackofficeInlineLink.js.map +1 -0
- package/lib/esm/components/backoffice/links/BackofficeLink.js +21 -0
- package/lib/esm/components/backoffice/links/BackofficeLink.js.map +1 -0
- package/lib/esm/components/backoffice/links/BackofficeLinkContent.js +26 -0
- package/lib/esm/components/backoffice/links/BackofficeLinkContent.js.map +1 -0
- package/lib/esm/components/backoffice/links/BackofficeLinkLabel.js +19 -0
- package/lib/esm/components/backoffice/links/BackofficeLinkLabel.js.map +1 -0
- package/lib/esm/components/backoffice/links/backofficeLink.css.js +7 -0
- package/lib/esm/components/backoffice/links/backofficeLink.css.js.map +1 -0
- package/lib/esm/components/backoffice/links/resolveBackofficeLink.js +81 -0
- package/lib/esm/components/backoffice/links/resolveBackofficeLink.js.map +1 -0
- package/lib/esm/components/backoffice/links/resolveBackofficeTargetIcon.js +50 -0
- package/lib/esm/components/backoffice/links/resolveBackofficeTargetIcon.js.map +1 -0
- package/lib/esm/components/backoffice/links/types.js +0 -0
- package/lib/esm/components/backoffice/links/useBackofficeLink.js +21 -0
- package/lib/esm/components/backoffice/links/useBackofficeLink.js.map +1 -0
- package/lib/esm/components/backoffice/pickers/EntityIdPickerDialog.js +1 -0
- package/lib/esm/components/backoffice/pickers/EntityIdPickerDialog.js.map +1 -1
- package/lib/esm/components/backoffice/refs/BackofficeEntityIdRef.js +27 -27
- package/lib/esm/components/backoffice/refs/BackofficeEntityIdRef.js.map +1 -1
- package/lib/esm/components/backoffice/refs/BackofficeEntityLink.js +24 -21
- package/lib/esm/components/backoffice/refs/BackofficeEntityLink.js.map +1 -1
- package/lib/esm/components/backoffice/refs/BackofficeRelatedCountLink.js +45 -44
- package/lib/esm/components/backoffice/refs/BackofficeRelatedCountLink.js.map +1 -1
- package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js +269 -223
- package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js.map +1 -1
- package/lib/esm/components/backoffice/shared/BackofficeFilterableCell.js +25 -30
- package/lib/esm/components/backoffice/shared/BackofficeFilterableCell.js.map +1 -1
- package/lib/esm/i18n/locales/en/backofficeReact.js +8 -0
- package/lib/esm/i18n/locales/en/backofficeReact.js.map +1 -1
- package/lib/esm/i18n/locales/fr/backofficeReact.js +8 -0
- package/lib/esm/i18n/locales/fr/backofficeReact.js.map +1 -1
- package/lib/esm/index.js +88 -73
- package/lib/esm/pages/BackofficeDashboardPage.js +1 -5
- package/lib/esm/pages/BackofficeDashboardPage.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityDetailPage.js +231 -222
- package/lib/esm/pages/BackofficeEntityDetailPage.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityDetailPage.view-helpers.js +170 -54
- package/lib/esm/pages/BackofficeEntityDetailPage.view-helpers.js.map +1 -1
- package/lib/esm/pages/BackofficeEntityListPage.js +196 -207
- package/lib/esm/pages/BackofficeEntityListPage.js.map +1 -1
- package/lib/esm/pages/BackofficeHubPage.js +21 -21
- package/lib/esm/pages/BackofficeLayoutPage.js +7 -7
- package/lib/esm/pages/BackofficeLayoutPage.js.map +1 -1
- package/lib/esm/router/createBackofficeRoutes.js +132 -126
- package/lib/esm/router/createBackofficeRoutes.js.map +1 -1
- package/lib/esm/style.css +1 -1
- package/lib/types/auth/login/EmailCapturePanel.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/auth/pages/PasswordResetCompleteScreen.d.ts.map +1 -1
- package/lib/types/auth/pages/PasswordResetRequestScreen.d.ts.map +1 -1
- package/lib/types/components/backoffice/actions/BackofficeEntityActionFormDialog.d.ts.map +1 -1
- package/lib/types/components/backoffice/columns/buildDataTableColumns.d.ts +0 -1
- package/lib/types/components/backoffice/columns/buildDataTableColumns.d.ts.map +1 -1
- package/lib/types/components/backoffice/detail/BackofficeCopyButton.d.ts +8 -0
- package/lib/types/components/backoffice/detail/BackofficeCopyButton.d.ts.map +1 -0
- package/lib/types/components/backoffice/detail/BackofficeDetailActionBar.d.ts +9 -0
- package/lib/types/components/backoffice/detail/BackofficeDetailActionBar.d.ts.map +1 -0
- package/lib/types/components/backoffice/detail/BackofficeDetailBlock.d.ts +7 -0
- package/lib/types/components/backoffice/detail/BackofficeDetailBlock.d.ts.map +1 -0
- package/lib/types/components/backoffice/detail/BackofficeDetailHeader.d.ts +12 -0
- package/lib/types/components/backoffice/detail/BackofficeDetailHeader.d.ts.map +1 -0
- package/lib/types/components/backoffice/detail/BackofficeDetailPage.d.ts +16 -0
- package/lib/types/components/backoffice/detail/BackofficeDetailPage.d.ts.map +1 -0
- package/lib/types/components/backoffice/detail/BackofficeDetailPage.stories.d.ts +11 -0
- package/lib/types/components/backoffice/detail/BackofficeDetailPage.stories.d.ts.map +1 -0
- package/lib/types/components/backoffice/detail/BackofficeDetailRelationLink.d.ts.map +1 -1
- package/lib/types/components/backoffice/detail/BackofficeDetailRelationListBlock.d.ts.map +1 -1
- package/lib/types/components/backoffice/detail/BackofficeDetailTable.d.ts +6 -0
- package/lib/types/components/backoffice/detail/BackofficeDetailTable.d.ts.map +1 -0
- package/lib/types/components/backoffice/detail/BackofficeEmptyValue.d.ts +7 -0
- package/lib/types/components/backoffice/detail/BackofficeEmptyValue.d.ts.map +1 -0
- package/lib/types/components/backoffice/detail/BackofficeStatusGroup.d.ts +8 -0
- package/lib/types/components/backoffice/detail/BackofficeStatusGroup.d.ts.map +1 -0
- package/lib/types/components/backoffice/detail/BackofficeTechnicalFacts.d.ts +2 -0
- package/lib/types/components/backoffice/detail/BackofficeTechnicalFacts.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 +1 -0
- package/lib/types/components/backoffice/layout/breadcrumb/BackofficeTopbarPortalContext.d.ts.map +1 -1
- package/lib/types/components/backoffice/layout/breadcrumb/assertValidBreadcrumb.d.ts.map +1 -1
- package/lib/types/components/backoffice/layout/breadcrumb/buildBreadcrumbs.d.ts +10 -8
- package/lib/types/components/backoffice/layout/breadcrumb/buildBreadcrumbs.d.ts.map +1 -1
- package/lib/types/components/backoffice/layout/breadcrumb/types.d.ts +10 -5
- package/lib/types/components/backoffice/layout/breadcrumb/types.d.ts.map +1 -1
- package/lib/types/components/backoffice/layout/sidebarUtils.d.ts +6 -2
- package/lib/types/components/backoffice/layout/sidebarUtils.d.ts.map +1 -1
- package/lib/types/components/backoffice/links/BackofficeInlineLink.d.ts +18 -0
- package/lib/types/components/backoffice/links/BackofficeInlineLink.d.ts.map +1 -0
- package/lib/types/components/backoffice/links/BackofficeLink.d.ts +13 -0
- package/lib/types/components/backoffice/links/BackofficeLink.d.ts.map +1 -0
- package/lib/types/components/backoffice/links/BackofficeLinkContent.d.ts +10 -0
- package/lib/types/components/backoffice/links/BackofficeLinkContent.d.ts.map +1 -0
- package/lib/types/components/backoffice/links/BackofficeLinkLabel.d.ts +12 -0
- package/lib/types/components/backoffice/links/BackofficeLinkLabel.d.ts.map +1 -0
- package/lib/types/components/backoffice/links/backofficeLink.css.d.ts +4 -0
- package/lib/types/components/backoffice/links/backofficeLink.css.d.ts.map +1 -0
- package/lib/types/components/backoffice/links/resolveBackofficeLink.d.ts +15 -0
- package/lib/types/components/backoffice/links/resolveBackofficeLink.d.ts.map +1 -0
- package/lib/types/components/backoffice/links/resolveBackofficeTargetIcon.d.ts +8 -0
- package/lib/types/components/backoffice/links/resolveBackofficeTargetIcon.d.ts.map +1 -0
- package/lib/types/components/backoffice/links/types.d.ts +45 -0
- package/lib/types/components/backoffice/links/types.d.ts.map +1 -0
- package/lib/types/components/backoffice/links/useBackofficeLink.d.ts +7 -0
- package/lib/types/components/backoffice/links/useBackofficeLink.d.ts.map +1 -0
- package/lib/types/components/backoffice/pickers/EntityIdPickerDialog.d.ts.map +1 -1
- package/lib/types/components/backoffice/refs/BackofficeEntityLink.d.ts.map +1 -1
- package/lib/types/components/backoffice/refs/BackofficeRelatedCountLink.d.ts.map +1 -1
- package/lib/types/components/backoffice/scaffolds/BackofficeEntityListScaffold.d.ts.map +1 -1
- package/lib/types/components/backoffice/shared/BackofficeFilterableCell.d.ts +6 -3
- package/lib/types/components/backoffice/shared/BackofficeFilterableCell.d.ts.map +1 -1
- package/lib/types/i18n/resources.d.ts +16 -0
- package/lib/types/i18n/resources.d.ts.map +1 -1
- package/lib/types/index.d.ts +24 -1
- 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 +49 -22
- package/lib/types/pages/BackofficeEntityDetailPage.view-helpers.d.ts.map +1 -1
- package/lib/types/pages/BackofficeEntityListPage.d.ts.map +1 -1
- package/lib/types/provider/types.d.ts +26 -22
- package/lib/types/provider/types.d.ts.map +1 -1
- package/lib/types/router/createBackofficeRoutes.d.ts +36 -1
- package/lib/types/router/createBackofficeRoutes.d.ts.map +1 -1
- package/package.json +7 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackofficeDetailRelationLink.js","names":[],"sources":["../../../../../src/components/backoffice/detail/BackofficeDetailRelationLink.tsx"],"sourcesContent":["import { useContext, type JSX, type MouseEvent } from 'react';\nimport {
|
|
1
|
+
{"version":3,"file":"BackofficeDetailRelationLink.js","names":[],"sources":["../../../../../src/components/backoffice/detail/BackofficeDetailRelationLink.tsx"],"sourcesContent":["import { useContext, type JSX, type MouseEvent } from 'react';\nimport { RoutingContext } from '@plumile/router';\n\nimport { buildBackofficeListLink } from '@plumile/backoffice-core/state/buildListHref.js';\nimport { setWhereValue } from '@plumile/backoffice-core/filters/where.js';\nimport type { BackofficeRuntimeRelationFilterSpec } from '@plumile/backoffice-core/types.js';\n\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeConfig } from '../../../provider/BackofficeConfigContext.js';\nimport { BackofficeInlineLink } from '../links/BackofficeInlineLink.js';\nimport type { BackofficeLinkTarget } from '../links/types.js';\n\nimport * as styles from './backofficeDetailRelationLink.css.js';\n\nexport type BackofficeDetailRelationLinkProps = {\n label: string;\n relation: BackofficeRuntimeRelationFilterSpec;\n value: string;\n count?: number;\n};\n\nexport const BackofficeDetailRelationLink = ({\n label,\n relation,\n value,\n count,\n}: BackofficeDetailRelationLinkProps): JSX.Element | null => {\n const { t } = useBackofficeReactTranslation();\n const { entities, entityRegistry } = useBackofficeConfig();\n const routing = useContext(RoutingContext);\n const { target, filterId, whereKey, path } = relation;\n const targetManifest = entities[target];\n if (targetManifest == null) {\n return null;\n }\n\n const where = setWhereValue<Record<string, unknown>>(\n null,\n whereKey,\n value,\n path,\n );\n\n const loadedEntity = entityRegistry.getLoadedListEntity(target);\n let filterKey = whereKey;\n if (path != null) {\n filterKey = `${whereKey}.${path.join('.')}`;\n }\n const resolvedFilterId = filterId ?? filterKey;\n\n const linkTarget = {\n kind: 'entity-list',\n entityId: target,\n state: {\n where,\n filters: [\n {\n id: resolvedFilterId,\n value,\n },\n ],\n },\n } as BackofficeLinkTarget;\n\n const navigateToLazyList = async (\n history: NonNullable<typeof routing>['history'],\n ): Promise<void> => {\n const listEntity = await entityRegistry.loadListEntity(target);\n const next = buildBackofficeListLink(listEntity.config, { where });\n\n let search = '';\n if (next.search !== '') {\n search = `?${next.search}`;\n }\n\n history.push({\n pathname: next.pathname,\n search,\n hash: '',\n });\n };\n\n const handleClick = (event: MouseEvent<HTMLAnchorElement>) => {\n if (\n loadedEntity != null ||\n routing == null ||\n event.defaultPrevented ||\n event.button !== 0 ||\n event.metaKey ||\n event.altKey ||\n event.ctrlKey ||\n event.shiftKey\n ) {\n return;\n }\n\n event.preventDefault();\n navigateToLazyList(routing.history).catch(() => {\n /* noop */\n });\n };\n\n let labelText = label;\n if (count != null) {\n labelText = t('relations.labelWithCount', {\n label,\n count,\n });\n }\n\n return (\n <BackofficeInlineLink\n target={linkTarget}\n className={styles.link}\n onClick={handleClick}\n endAdornment={\n <span className={styles.action}>\n <span className={styles.meta}>{t('relations.viewList')}</span>\n <span className={styles.chevron} aria-hidden=\"true\">\n >\n </span>\n </span>\n }\n >\n <span className={styles.label}>{labelText}</span>\n </BackofficeInlineLink>\n );\n};\n\nexport default BackofficeDetailRelationLink;\n"],"mappings":";;;;;;;;;;AAqBA,IAAa,KAAgC,EAC3C,OAAA,GACA,aACA,UACA,eAC2D;CAC3D,IAAM,EAAE,SAAM,GAA+B,EACvC,EAAE,aAAU,sBAAmB,GAAqB,EACpD,IAAU,EAAW,EAAe,EACpC,EAAE,WAAQ,aAAU,aAAU,YAAS;CAE7C,IADuB,EAAS,MACV,MACpB,OAAO;CAGT,IAAM,IAAQ,EACZ,MACA,GACA,GACA,EACD,EAEK,IAAe,EAAe,oBAAoB,EAAO,EAC3D,IAAY;CAChB,AAAI,KAAQ,SACV,IAAY,GAAG,EAAS,GAAG,EAAK,KAAK,IAAI;CAI3C,IAAM,IAAa;EACjB,MAAM;EACN,UAAU;EACV,OAAO;GACL;GACA,SAAS,CACP;IACE,IATiB,KAAY;IAU7B;IACD,CACF;GACF;EACF,EAEK,IAAqB,OACzB,MACkB;EAElB,IAAM,IAAO,GAAwB,MADZ,EAAe,eAAe,EAAO,EACd,QAAQ,EAAE,UAAO,CAAC,EAE9D,IAAS;EAKb,AAJI,EAAK,WAAW,OAClB,IAAS,IAAI,EAAK,WAGpB,EAAQ,KAAK;GACX,UAAU,EAAK;GACf;GACA,MAAM;GACP,CAAC;IAGE,KAAe,MAAyC;EAE1D,KAAgB,QAChB,KAAW,QACX,EAAM,oBACN,EAAM,WAAW,KACjB,EAAM,WACN,EAAM,UACN,EAAM,WACN,EAAM,aAKR,EAAM,gBAAgB,EACtB,EAAmB,EAAQ,QAAQ,CAAC,YAAY,GAE9C;IAGA,IAAY;CAQhB,OAPI,KAAS,SACX,IAAY,EAAE,4BAA4B;EACxC,OAAA;EACA;EACD,CAAC,GAIF,kBAAC,GAAD;EACE,QAAQ;EACR,WAAW;EACX,SAAS;EACT,cACE,kBAAC,QAAD;GAAM,WAAW;aAAjB,CACE,kBAAC,QAAD;IAAM,WAAW;cAAc,EAAE,qBAAqB;IAAQ,CAAA,EAC9D,kBAAC,QAAD;IAAM,WAAW;IAAgB,eAAY;cAAO;IAE7C,CAAA,CACF;;YAGT,kBAAC,QAAD;GAAM,WAAW;aAAe;GAAiB,CAAA;EAC5B,CAAA"}
|
|
@@ -1,123 +1,116 @@
|
|
|
1
1
|
import { useBackofficeReactTranslation as e } from "../../../i18n/useBackofficeReactTranslation.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import
|
|
13
|
-
import
|
|
14
|
-
import {
|
|
15
|
-
import { setWhereValue as y } from "@plumile/backoffice-core/filters/where.js";
|
|
2
|
+
import { BackofficeErrorBoundary as t } from "../errors/BackofficeErrorBoundary.js";
|
|
3
|
+
import { useBackofficeListEntitiesLoader as n } from "../../../provider/useBackofficeEntityLoader.js";
|
|
4
|
+
import { buildDataTableColumns as r } from "../columns/buildDataTableColumns.js";
|
|
5
|
+
import { useBackofficeLoadMore as i } from "../../../hooks/useBackofficeLoadMore.js";
|
|
6
|
+
import { useBackofficeListRefetch as a } from "../../../hooks/useBackofficeListRefetch.js";
|
|
7
|
+
import { BackofficeEntityListScaffold as o } from "../scaffolds/BackofficeEntityListScaffold.js";
|
|
8
|
+
import { Suspense as s, useCallback as c, useMemo as l, useState as u } from "react";
|
|
9
|
+
import { BackofficeTableSkeleton as d, InlineBanner as f } from "@plumile/ui";
|
|
10
|
+
import { jsx as p } from "react/jsx-runtime";
|
|
11
|
+
import { useTranslation as m } from "react-i18next";
|
|
12
|
+
import * as h from "react-relay";
|
|
13
|
+
import { BACKOFFICE_LIST_REFETCH_POLICY as g, BACKOFFICE_RELATED_TAB_PAGE_SIZE as _ } from "@plumile/backoffice-core/constants.js";
|
|
14
|
+
import { setWhereValue as v } from "@plumile/backoffice-core/filters/where.js";
|
|
16
15
|
//#region src/components/backoffice/detail/BackofficeDetailRelationListBlock.tsx
|
|
17
|
-
var { useLazyLoadQuery:
|
|
16
|
+
var { useLazyLoadQuery: y, usePaginationFragment: b } = h, x = () => {
|
|
18
17
|
let { t } = e();
|
|
19
|
-
return /* @__PURE__ */
|
|
18
|
+
return /* @__PURE__ */ p(d, {
|
|
20
19
|
rows: 6,
|
|
21
20
|
ariaLabel: t("common.loading")
|
|
22
21
|
});
|
|
23
|
-
},
|
|
24
|
-
let { t:
|
|
22
|
+
}, S = ({ title: t, config: n, relation: s, value: d }) => {
|
|
23
|
+
let { t: f } = m(), { t: h } = e(), x = n.list, S = n.listDefaults ?? x.defaultState ?? {
|
|
25
24
|
where: null,
|
|
26
25
|
sort: null
|
|
27
|
-
}, [
|
|
28
|
-
where:
|
|
29
|
-
sort:
|
|
30
|
-
}),
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
]),
|
|
36
|
-
where:
|
|
37
|
-
sort:
|
|
38
|
-
count:
|
|
26
|
+
}, [C, w] = u({
|
|
27
|
+
where: S.where,
|
|
28
|
+
sort: S.sort ?? null
|
|
29
|
+
}), T = l(() => d == null || d.trim() === "" ? null : v(C.where, s.whereKey, d, s.path), [
|
|
30
|
+
s.path,
|
|
31
|
+
s.whereKey,
|
|
32
|
+
C.where,
|
|
33
|
+
d
|
|
34
|
+
]), E = T ?? C.where, D = C.sort ?? S.sort, O = l(() => ({
|
|
35
|
+
where: E,
|
|
36
|
+
sort: D,
|
|
37
|
+
count: _,
|
|
39
38
|
cursor: null
|
|
40
|
-
}), [
|
|
41
|
-
tApp:
|
|
42
|
-
t:
|
|
43
|
-
resolveEntityHref: (e, t) => {
|
|
44
|
-
let n = r[e];
|
|
45
|
-
return n == null ? null : n.routes.detail(t);
|
|
46
|
-
}
|
|
39
|
+
}), [E, D]), k = l(() => x.buildQueryVariables(O), [x, O]), A = y(x.query, k, { fetchPolicy: "store-or-network" }), { data: j, loadNext: M, hasNext: N, isLoadingNext: P, refetch: F } = b(x.fragment, A), I = x.getConnection(j), L = l(() => I.edges.map((e) => x.toRow(e.node)), [I.edges, x]), R = l(() => r(x.columns, {
|
|
40
|
+
tApp: f,
|
|
41
|
+
t: h
|
|
47
42
|
}), [
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
count: v,
|
|
43
|
+
x.columns,
|
|
44
|
+
h,
|
|
45
|
+
f
|
|
46
|
+
]), z = c((e) => x.getRowId(e), [x]), { onRefresh: B } = a({
|
|
47
|
+
refetch: F,
|
|
48
|
+
variables: O,
|
|
49
|
+
defaults: l(() => ({
|
|
50
|
+
where: T ?? S.where,
|
|
51
|
+
sort: S.sort,
|
|
52
|
+
count: _,
|
|
59
53
|
cursor: null
|
|
60
54
|
}), [
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
55
|
+
S.sort,
|
|
56
|
+
S.where,
|
|
57
|
+
T
|
|
64
58
|
]),
|
|
65
|
-
fetchPolicy:
|
|
66
|
-
buildQueryVariables:
|
|
67
|
-
}),
|
|
68
|
-
hasNext:
|
|
69
|
-
isLoadingNext:
|
|
70
|
-
loadNext:
|
|
71
|
-
count:
|
|
59
|
+
fetchPolicy: g,
|
|
60
|
+
buildQueryVariables: x.buildQueryVariables
|
|
61
|
+
}), V = i({
|
|
62
|
+
hasNext: N,
|
|
63
|
+
isLoadingNext: P,
|
|
64
|
+
loadNext: M,
|
|
65
|
+
count: _
|
|
72
66
|
});
|
|
73
|
-
return /* @__PURE__ */
|
|
67
|
+
return /* @__PURE__ */ p(o, {
|
|
74
68
|
config: n,
|
|
75
|
-
state:
|
|
69
|
+
state: C,
|
|
76
70
|
pushState: (e) => {
|
|
77
|
-
|
|
71
|
+
w(e);
|
|
78
72
|
},
|
|
79
73
|
header: { title: t },
|
|
80
|
-
rows:
|
|
81
|
-
columns:
|
|
82
|
-
getRowId:
|
|
83
|
-
hasNextPage:
|
|
84
|
-
isLoadingMore:
|
|
85
|
-
onLoadMore:
|
|
86
|
-
onRefresh:
|
|
87
|
-
totalCount:
|
|
74
|
+
rows: L,
|
|
75
|
+
columns: R,
|
|
76
|
+
getRowId: z,
|
|
77
|
+
hasNextPage: N,
|
|
78
|
+
isLoadingMore: P,
|
|
79
|
+
onLoadMore: V,
|
|
80
|
+
onRefresh: B,
|
|
81
|
+
totalCount: I.totalCount ?? null,
|
|
88
82
|
variant: "embedded"
|
|
89
83
|
});
|
|
90
|
-
},
|
|
91
|
-
let { t:
|
|
92
|
-
if (
|
|
84
|
+
}, C = ({ title: t, relation: r, value: i }) => {
|
|
85
|
+
let { t: a } = e(), o = n(l(() => [r.target], [r.target]));
|
|
86
|
+
if (o.status === "loading") return /* @__PURE__ */ p(d, {
|
|
93
87
|
rows: 6,
|
|
94
|
-
ariaLabel:
|
|
88
|
+
ariaLabel: a("common.loading")
|
|
95
89
|
});
|
|
96
|
-
if (
|
|
90
|
+
if (o.status === "error") return /* @__PURE__ */ p(f, {
|
|
97
91
|
tone: "warning",
|
|
98
|
-
title:
|
|
99
|
-
children:
|
|
92
|
+
title: a("relations.unavailable.title"),
|
|
93
|
+
children: a("relations.unavailable.description")
|
|
100
94
|
});
|
|
101
|
-
let
|
|
102
|
-
return
|
|
103
|
-
title:
|
|
104
|
-
config:
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
value: a
|
|
95
|
+
let s = o.modules[r.target]?.config;
|
|
96
|
+
return s == null || s.list.kind === "records" ? null : /* @__PURE__ */ p(S, {
|
|
97
|
+
title: t,
|
|
98
|
+
config: s,
|
|
99
|
+
relation: r,
|
|
100
|
+
value: i
|
|
108
101
|
});
|
|
109
|
-
},
|
|
110
|
-
fallback: () => /* @__PURE__ */
|
|
111
|
-
children: /* @__PURE__ */
|
|
112
|
-
fallback: /* @__PURE__ */
|
|
113
|
-
children: /* @__PURE__ */
|
|
102
|
+
}, w = ({ title: e, relation: n, value: r }) => /* @__PURE__ */ p(t, {
|
|
103
|
+
fallback: () => /* @__PURE__ */ p(x, {}),
|
|
104
|
+
children: /* @__PURE__ */ p(s, {
|
|
105
|
+
fallback: /* @__PURE__ */ p(x, {}),
|
|
106
|
+
children: /* @__PURE__ */ p(C, {
|
|
114
107
|
title: e,
|
|
115
|
-
relation:
|
|
108
|
+
relation: n,
|
|
116
109
|
value: r
|
|
117
110
|
})
|
|
118
111
|
})
|
|
119
112
|
});
|
|
120
113
|
//#endregion
|
|
121
|
-
export {
|
|
114
|
+
export { w as BackofficeDetailRelationListBlock, w as default };
|
|
122
115
|
|
|
123
116
|
//# sourceMappingURL=BackofficeDetailRelationListBlock.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackofficeDetailRelationListBlock.js","names":[],"sources":["../../../../../src/components/backoffice/detail/BackofficeDetailRelationListBlock.tsx"],"sourcesContent":["import { Suspense, useCallback, useMemo, useState, type JSX } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport * as ReactRelay from 'react-relay';\nimport type { OperationType } from 'relay-runtime';\n\nimport {\n BACKOFFICE_LIST_REFETCH_POLICY,\n BACKOFFICE_RELATED_TAB_PAGE_SIZE,\n} from '@plumile/backoffice-core/constants.js';\nimport { setWhereValue } from '@plumile/backoffice-core/filters/where.js';\nimport type {\n BackofficeListState,\n BackofficeRuntimeRelationFilterSpec,\n BackofficeRuntimeResolvedListFacetConfig,\n} from '@plumile/backoffice-core/types.js';\nimport { BackofficeTableSkeleton, InlineBanner } from '@plumile/ui';\n\nimport { buildDataTableColumns } from '../columns/buildDataTableColumns.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 { useBackofficeListEntitiesLoader } from '../../../provider/useBackofficeEntityLoader.js';\nimport { BackofficeEntityListScaffold } from '../scaffolds/BackofficeEntityListScaffold.js';\nimport { BackofficeErrorBoundary } from '../errors/BackofficeErrorBoundary.js';\n\nconst { useLazyLoadQuery, usePaginationFragment } = ReactRelay;\n\nexport type BackofficeDetailRelationListBlockProps = {\n title: string;\n relation: BackofficeRuntimeRelationFilterSpec;\n value: string | null;\n};\n\ntype RelationListContentProps = {\n title: string;\n config: BackofficeRuntimeResolvedListFacetConfig & {\n list: Exclude<\n BackofficeRuntimeResolvedListFacetConfig['list'],\n { kind: 'records' }\n >;\n };\n entities: ReturnType<typeof useBackofficeConfig>['entities'];\n relation: BackofficeRuntimeRelationFilterSpec;\n value: string | null;\n};\n\ntype RelationListBlockBodyProps = {\n title: string;\n relation: BackofficeRuntimeRelationFilterSpec;\n value: string | null;\n};\n\nconst RelationListSkeleton = (): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n\n return <BackofficeTableSkeleton rows={6} ariaLabel={t('common.loading')} />;\n};\n\nconst RelationListContent = ({\n title,\n config,\n entities,\n relation,\n value,\n}: RelationListContentProps): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const listConfig = config.list;\n const listDefaults = config.listDefaults ??\n listConfig.defaultState ?? { where: null, sort: null };\n\n const [state, setState] = useState<BackofficeListState<unknown, string>>({\n where: listDefaults.where as never,\n sort: listDefaults.sort ?? null,\n });\n\n const relationWhere = useMemo(() => {\n if (value == null || value.trim() === '') {\n return null;\n }\n return setWhereValue(\n state.where as Record<string, unknown> | null,\n relation.whereKey as never,\n value,\n relation.path,\n );\n }, [relation.path, relation.whereKey, state.where, value]);\n\n const effectiveWhere = relationWhere ?? (state.where as never);\n const resolvedSort = state.sort ?? listDefaults.sort;\n const variablesBase = useMemo(() => {\n return {\n where: effectiveWhere as never,\n sort: resolvedSort as never,\n count: BACKOFFICE_RELATED_TAB_PAGE_SIZE,\n cursor: null,\n };\n }, [effectiveWhere, resolvedSort]);\n\n const variables = useMemo(() => {\n return listConfig.buildQueryVariables(variablesBase);\n }, [listConfig, variablesBase]);\n\n const queryData = useLazyLoadQuery<OperationType>(\n listConfig.query,\n variables,\n { fetchPolicy: 'store-or-network' },\n );\n\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 const rows = useMemo(() => {\n return connection.edges.map((edge) => {\n return listConfig.toRow(edge.node);\n });\n }, [connection.edges, listConfig]);\n\n const columns = useMemo(() => {\n return 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 }, [entities, listConfig.columns, t, tApp]);\n\n const getRowId = useCallback(\n (row: unknown) => {\n return listConfig.getRowId(row);\n },\n [listConfig],\n );\n\n const defaults = useMemo(() => {\n const baseWhere = relationWhere ?? listDefaults.where;\n return {\n where: baseWhere,\n sort: listDefaults.sort,\n count: BACKOFFICE_RELATED_TAB_PAGE_SIZE,\n cursor: null,\n };\n }, [listDefaults.sort, listDefaults.where, relationWhere]);\n\n const { onRefresh } = useBackofficeListRefetch({\n refetch,\n variables: variablesBase,\n defaults,\n fetchPolicy: BACKOFFICE_LIST_REFETCH_POLICY,\n buildQueryVariables: listConfig.buildQueryVariables,\n });\n\n const handleLoadMore = useBackofficeLoadMore({\n hasNext,\n isLoadingNext,\n loadNext,\n count: BACKOFFICE_RELATED_TAB_PAGE_SIZE,\n });\n\n return (\n <BackofficeEntityListScaffold\n config={config as never}\n state={state as never}\n pushState={(next) => {\n setState(next);\n }}\n header={{ title }}\n rows={rows}\n columns={columns as never}\n getRowId={getRowId}\n hasNextPage={hasNext}\n isLoadingMore={isLoadingNext}\n onLoadMore={handleLoadMore}\n onRefresh={onRefresh}\n totalCount={connection.totalCount ?? null}\n variant=\"embedded\"\n />\n );\n};\n\nconst RelationListBlockBody = ({\n title,\n relation,\n value,\n}: RelationListBlockBodyProps): JSX.Element | null => {\n const { t } = useBackofficeReactTranslation();\n const { entities } = useBackofficeConfig();\n const relatedEntityIds = useMemo(() => {\n return [relation.target];\n }, [relation.target]);\n const relatedEntitiesState =\n useBackofficeListEntitiesLoader(relatedEntityIds);\n\n if (relatedEntitiesState.status === 'loading') {\n return <BackofficeTableSkeleton rows={6} ariaLabel={t('common.loading')} />;\n }\n\n if (relatedEntitiesState.status === 'error') {\n return (\n <InlineBanner tone=\"warning\" title={t('relations.unavailable.title')}>\n {t('relations.unavailable.description')}\n </InlineBanner>\n );\n }\n\n const config = relatedEntitiesState.modules[relation.target]?.config;\n if (config == null) {\n return null;\n }\n if (config.list.kind === 'records') {\n return null;\n }\n const connectionConfig = config as RelationListContentProps['config'];\n\n return (\n <RelationListContent\n title={title}\n config={connectionConfig}\n entities={entities}\n relation={relation}\n value={value}\n />\n );\n};\n\nexport const BackofficeDetailRelationListBlock = ({\n title,\n relation,\n value,\n}: BackofficeDetailRelationListBlockProps): JSX.Element => {\n return (\n <BackofficeErrorBoundary\n fallback={() => {\n return <RelationListSkeleton />;\n }}\n >\n <Suspense fallback={<RelationListSkeleton />}>\n <RelationListBlockBody\n title={title}\n relation={relation}\n value={value}\n />\n </Suspense>\n </BackofficeErrorBoundary>\n );\n};\n\nexport default BackofficeDetailRelationListBlock;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BackofficeDetailRelationListBlock.js","names":[],"sources":["../../../../../src/components/backoffice/detail/BackofficeDetailRelationListBlock.tsx"],"sourcesContent":["import { Suspense, useCallback, useMemo, useState, type JSX } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport * as ReactRelay from 'react-relay';\nimport type { OperationType } from 'relay-runtime';\n\nimport {\n BACKOFFICE_LIST_REFETCH_POLICY,\n BACKOFFICE_RELATED_TAB_PAGE_SIZE,\n} from '@plumile/backoffice-core/constants.js';\nimport { setWhereValue } from '@plumile/backoffice-core/filters/where.js';\nimport type {\n BackofficeListState,\n BackofficeRuntimeRelationFilterSpec,\n BackofficeRuntimeResolvedListFacetConfig,\n} from '@plumile/backoffice-core/types.js';\nimport { BackofficeTableSkeleton, InlineBanner } from '@plumile/ui';\n\nimport { buildDataTableColumns } from '../columns/buildDataTableColumns.js';\nimport { useBackofficeLoadMore } from '../../../hooks/useBackofficeLoadMore.js';\nimport { useBackofficeListRefetch } from '../../../hooks/useBackofficeListRefetch.js';\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeListEntitiesLoader } from '../../../provider/useBackofficeEntityLoader.js';\nimport { BackofficeEntityListScaffold } from '../scaffolds/BackofficeEntityListScaffold.js';\nimport { BackofficeErrorBoundary } from '../errors/BackofficeErrorBoundary.js';\n\nconst { useLazyLoadQuery, usePaginationFragment } = ReactRelay;\n\nexport type BackofficeDetailRelationListBlockProps = {\n title: string;\n relation: BackofficeRuntimeRelationFilterSpec;\n value: string | null;\n};\n\ntype RelationListContentProps = {\n title: string;\n config: BackofficeRuntimeResolvedListFacetConfig & {\n list: Exclude<\n BackofficeRuntimeResolvedListFacetConfig['list'],\n { kind: 'records' }\n >;\n };\n relation: BackofficeRuntimeRelationFilterSpec;\n value: string | null;\n};\n\ntype RelationListBlockBodyProps = {\n title: string;\n relation: BackofficeRuntimeRelationFilterSpec;\n value: string | null;\n};\n\nconst RelationListSkeleton = (): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n\n return <BackofficeTableSkeleton rows={6} ariaLabel={t('common.loading')} />;\n};\n\nconst RelationListContent = ({\n title,\n config,\n relation,\n value,\n}: RelationListContentProps): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const listConfig = config.list;\n const listDefaults = config.listDefaults ??\n listConfig.defaultState ?? { where: null, sort: null };\n\n const [state, setState] = useState<BackofficeListState<unknown, string>>({\n where: listDefaults.where as never,\n sort: listDefaults.sort ?? null,\n });\n\n const relationWhere = useMemo(() => {\n if (value == null || value.trim() === '') {\n return null;\n }\n return setWhereValue(\n state.where as Record<string, unknown> | null,\n relation.whereKey as never,\n value,\n relation.path,\n );\n }, [relation.path, relation.whereKey, state.where, value]);\n\n const effectiveWhere = relationWhere ?? (state.where as never);\n const resolvedSort = state.sort ?? listDefaults.sort;\n const variablesBase = useMemo(() => {\n return {\n where: effectiveWhere as never,\n sort: resolvedSort as never,\n count: BACKOFFICE_RELATED_TAB_PAGE_SIZE,\n cursor: null,\n };\n }, [effectiveWhere, resolvedSort]);\n\n const variables = useMemo(() => {\n return listConfig.buildQueryVariables(variablesBase);\n }, [listConfig, variablesBase]);\n\n const queryData = useLazyLoadQuery<OperationType>(\n listConfig.query,\n variables,\n { fetchPolicy: 'store-or-network' },\n );\n\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 const rows = useMemo(() => {\n return connection.edges.map((edge) => {\n return listConfig.toRow(edge.node);\n });\n }, [connection.edges, listConfig]);\n\n const columns = useMemo(() => {\n return buildDataTableColumns(listConfig.columns, {\n tApp,\n t,\n });\n }, [listConfig.columns, t, tApp]);\n\n const getRowId = useCallback(\n (row: unknown) => {\n return listConfig.getRowId(row);\n },\n [listConfig],\n );\n\n const defaults = useMemo(() => {\n const baseWhere = relationWhere ?? listDefaults.where;\n return {\n where: baseWhere,\n sort: listDefaults.sort,\n count: BACKOFFICE_RELATED_TAB_PAGE_SIZE,\n cursor: null,\n };\n }, [listDefaults.sort, listDefaults.where, relationWhere]);\n\n const { onRefresh } = useBackofficeListRefetch({\n refetch,\n variables: variablesBase,\n defaults,\n fetchPolicy: BACKOFFICE_LIST_REFETCH_POLICY,\n buildQueryVariables: listConfig.buildQueryVariables,\n });\n\n const handleLoadMore = useBackofficeLoadMore({\n hasNext,\n isLoadingNext,\n loadNext,\n count: BACKOFFICE_RELATED_TAB_PAGE_SIZE,\n });\n\n return (\n <BackofficeEntityListScaffold\n config={config as never}\n state={state as never}\n pushState={(next) => {\n setState(next);\n }}\n header={{ title }}\n rows={rows}\n columns={columns as never}\n getRowId={getRowId}\n hasNextPage={hasNext}\n isLoadingMore={isLoadingNext}\n onLoadMore={handleLoadMore}\n onRefresh={onRefresh}\n totalCount={connection.totalCount ?? null}\n variant=\"embedded\"\n />\n );\n};\n\nconst RelationListBlockBody = ({\n title,\n relation,\n value,\n}: RelationListBlockBodyProps): JSX.Element | null => {\n const { t } = useBackofficeReactTranslation();\n const relatedEntityIds = useMemo(() => {\n return [relation.target];\n }, [relation.target]);\n const relatedEntitiesState =\n useBackofficeListEntitiesLoader(relatedEntityIds);\n\n if (relatedEntitiesState.status === 'loading') {\n return <BackofficeTableSkeleton rows={6} ariaLabel={t('common.loading')} />;\n }\n\n if (relatedEntitiesState.status === 'error') {\n return (\n <InlineBanner tone=\"warning\" title={t('relations.unavailable.title')}>\n {t('relations.unavailable.description')}\n </InlineBanner>\n );\n }\n\n const config = relatedEntitiesState.modules[relation.target]?.config;\n if (config == null) {\n return null;\n }\n if (config.list.kind === 'records') {\n return null;\n }\n const connectionConfig = config as RelationListContentProps['config'];\n\n return (\n <RelationListContent\n title={title}\n config={connectionConfig}\n relation={relation}\n value={value}\n />\n );\n};\n\nexport const BackofficeDetailRelationListBlock = ({\n title,\n relation,\n value,\n}: BackofficeDetailRelationListBlockProps): JSX.Element => {\n return (\n <BackofficeErrorBoundary\n fallback={() => {\n return <RelationListSkeleton />;\n }}\n >\n <Suspense fallback={<RelationListSkeleton />}>\n <RelationListBlockBody\n title={title}\n relation={relation}\n value={value}\n />\n </Suspense>\n </BackofficeErrorBoundary>\n );\n};\n\nexport default BackofficeDetailRelationListBlock;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { DataTable as e } from "@plumile/ui";
|
|
2
|
+
import { jsx as t } from "react/jsx-runtime";
|
|
3
|
+
//#region src/components/backoffice/detail/BackofficeDetailTable.tsx
|
|
4
|
+
var n = (n) => /* @__PURE__ */ t(e, { ...n });
|
|
5
|
+
//#endregion
|
|
6
|
+
export { n as BackofficeDetailTable, n as default };
|
|
7
|
+
|
|
8
|
+
//# sourceMappingURL=BackofficeDetailTable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BackofficeDetailTable.js","names":[],"sources":["../../../../../src/components/backoffice/detail/BackofficeDetailTable.tsx"],"sourcesContent":["import { type JSX } from 'react';\nimport { DataTable, type DataTableProps } from '@plumile/ui';\n\nexport type BackofficeDetailTableProps<Row> = DataTableProps<Row>;\n\nexport const BackofficeDetailTable = <Row,>(\n props: BackofficeDetailTableProps<Row>,\n): JSX.Element => {\n return <DataTable {...props} />;\n};\n\nexport default BackofficeDetailTable;\n"],"mappings":";;;AAKA,IAAa,KACX,MAEO,kBAAC,GAAD,EAAW,GAAI,GAAS,CAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { jsx as e } from "react/jsx-runtime";
|
|
2
|
+
//#region src/components/backoffice/detail/BackofficeEmptyValue.tsx
|
|
3
|
+
var t = ({ label: t }) => /* @__PURE__ */ e("span", { children: t });
|
|
4
|
+
//#endregion
|
|
5
|
+
export { t as BackofficeEmptyValue, t as default };
|
|
6
|
+
|
|
7
|
+
//# sourceMappingURL=BackofficeEmptyValue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BackofficeEmptyValue.js","names":[],"sources":["../../../../../src/components/backoffice/detail/BackofficeEmptyValue.tsx"],"sourcesContent":["import { type JSX } from 'react';\n\nexport type BackofficeEmptyValueProps = {\n readonly label: string;\n};\n\nexport const BackofficeEmptyValue = ({\n label,\n}: BackofficeEmptyValueProps): JSX.Element => {\n return <span>{label}</span>;\n};\n\nexport default BackofficeEmptyValue;\n"],"mappings":";;AAMA,IAAa,KAAwB,EACnC,eAEO,kBAAC,QAAD,EAAA,UAAO,GAAa,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { BackofficeStatusMetaBadge as e } from "./BackofficeStatusMetaBadge.js";
|
|
2
|
+
import { Fragment as t, jsx as n } from "react/jsx-runtime";
|
|
3
|
+
//#region src/components/backoffice/detail/BackofficeStatusGroup.tsx
|
|
4
|
+
var r = ({ statuses: r }) => /* @__PURE__ */ n(t, { children: r.map((t) => /* @__PURE__ */ n(e, { status: t }, t.label)) });
|
|
5
|
+
//#endregion
|
|
6
|
+
export { r as BackofficeStatusGroup, r as default };
|
|
7
|
+
|
|
8
|
+
//# sourceMappingURL=BackofficeStatusGroup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BackofficeStatusGroup.js","names":[],"sources":["../../../../../src/components/backoffice/detail/BackofficeStatusGroup.tsx"],"sourcesContent":["import { type JSX } from 'react';\n\nimport {\n BackofficeStatusMetaBadge,\n type BackofficeStatusMeta,\n} from './BackofficeStatusMetaBadge.js';\n\nexport type BackofficeStatusGroupProps = {\n readonly statuses: readonly BackofficeStatusMeta[];\n};\n\nexport const BackofficeStatusGroup = ({\n statuses,\n}: BackofficeStatusGroupProps): JSX.Element => {\n return (\n <>\n {statuses.map((status) => {\n return <BackofficeStatusMetaBadge key={status.label} status={status} />;\n })}\n </>\n );\n};\n\nexport default BackofficeStatusGroup;\n"],"mappings":";;;AAWA,IAAa,KAAyB,EACpC,kBAGE,kBAAA,GAAA,EAAA,UACG,EAAS,KAAK,MACN,kBAAC,GAAD,EAAsD,WAAU,EAAhC,EAAO,MAAyB,CACvE,EACD,CAAA"}
|
|
@@ -1,69 +1,74 @@
|
|
|
1
1
|
import { useBackofficeReactTranslation as e } from "../../../../i18n/useBackofficeReactTranslation.js";
|
|
2
2
|
import { useBackofficeTopbarPortalContext as t } from "./BackofficeTopbarPortalContext.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
3
|
+
import { BackofficeLink as n } from "../../links/BackofficeLink.js";
|
|
4
|
+
import { BackofficeLinkLabel as r } from "../../links/BackofficeLinkLabel.js";
|
|
5
|
+
import { current as i, homeLabel as a, item as o, link as s, list as c, nav as l, separator as u } from "./backofficeTopbarBreadcrumb.css.js";
|
|
6
|
+
import { SidebarHomeSvg as d } from "@plumile/ui";
|
|
7
|
+
import { Fragment as f, jsx as p, jsxs as m } from "react/jsx-runtime";
|
|
8
|
+
import { Link as h } from "@plumile/router";
|
|
7
9
|
//#region src/components/backoffice/layout/breadcrumb/BackofficeTopbarBreadcrumb.tsx
|
|
8
|
-
var
|
|
9
|
-
let {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
v
|
|
13
|
-
|
|
10
|
+
var g = (e) => {
|
|
11
|
+
let { target: t } = e;
|
|
12
|
+
return t.kind === "dashboard" ? `${e.kind}-dashboard` : t.kind === "entity-list" ? `${e.kind}-entity-list-${t.entityId}` : t.kind === "entity-detail" ? `${e.kind}-entity-detail-${t.entityId}-${t.id}` : t.kind === "entity-detail-page" ? `${e.kind}-entity-detail-page-${t.entityId}-${t.id}-${t.pageId}` : t.kind === "tool" ? `${e.kind}-tool-${t.toolId}` : t.kind === "hub" ? `${e.kind}-hub-${t.hubId}` : `${e.kind}-href-${t.href}`;
|
|
13
|
+
}, _ = ({ items: _ }) => {
|
|
14
|
+
let { t: v } = e(), { dashboardHref: y, dashboardLabel: b } = t(), x = !1, [S] = _;
|
|
15
|
+
_.length === 1 && S != null && (x = S.target.kind === "dashboard" && S.kind === "current");
|
|
16
|
+
let C = _;
|
|
17
|
+
x && (C = []);
|
|
18
|
+
let w = /* @__PURE__ */ m(f, { children: [/* @__PURE__ */ p(d, {
|
|
14
19
|
width: 16,
|
|
15
20
|
height: 16,
|
|
16
21
|
"aria-hidden": "true"
|
|
17
|
-
}), /* @__PURE__ */
|
|
18
|
-
className:
|
|
19
|
-
children:
|
|
22
|
+
}), /* @__PURE__ */ p("span", {
|
|
23
|
+
className: a,
|
|
24
|
+
children: b
|
|
20
25
|
})] });
|
|
21
|
-
return /* @__PURE__ */
|
|
22
|
-
className:
|
|
23
|
-
"aria-label":
|
|
24
|
-
children: /* @__PURE__ */
|
|
25
|
-
className:
|
|
26
|
-
children: [/* @__PURE__ */
|
|
27
|
-
className:
|
|
28
|
-
children: [
|
|
26
|
+
return /* @__PURE__ */ p("nav", {
|
|
27
|
+
className: l,
|
|
28
|
+
"aria-label": v("common.breadcrumb"),
|
|
29
|
+
children: /* @__PURE__ */ m("ol", {
|
|
30
|
+
className: c,
|
|
31
|
+
children: [/* @__PURE__ */ m("li", {
|
|
32
|
+
className: o,
|
|
33
|
+
children: [x && /* @__PURE__ */ p("span", {
|
|
29
34
|
className: "_80s44h3 _80s44h1 txvbqb9jg txvbqbcp txvbqbdoy txvbqbty7 txvbqbc77 txvbqb1rg txvbqbva1 txvbqb77 txvbqb6x txvbqb7k txvbqbv45 txvbqbv9z",
|
|
30
35
|
"aria-current": "page",
|
|
31
|
-
title:
|
|
32
|
-
children:
|
|
33
|
-
}), !
|
|
34
|
-
to:
|
|
36
|
+
title: b,
|
|
37
|
+
children: w
|
|
38
|
+
}), !x && /* @__PURE__ */ p(h, {
|
|
39
|
+
to: y,
|
|
35
40
|
className: "_80s44h2 _80s44h1 txvbqb9jg txvbqbcp txvbqbdoy txvbqbty7 txvbqbc77 txvbqb1rg txvbqbva1 txvbqb77 txvbqb6x txvbqb7k",
|
|
36
|
-
"aria-label":
|
|
37
|
-
title:
|
|
38
|
-
children:
|
|
41
|
+
"aria-label": b,
|
|
42
|
+
title: b,
|
|
43
|
+
children: w
|
|
39
44
|
})]
|
|
40
|
-
}),
|
|
41
|
-
let
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
else {
|
|
48
|
-
let r = a;
|
|
49
|
-
t && (r = n), s = /* @__PURE__ */ d("span", {
|
|
50
|
-
className: r,
|
|
51
|
-
children: e.label
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
return /* @__PURE__ */ f("li", {
|
|
45
|
+
}), C.map((e, t) => {
|
|
46
|
+
let a = e.kind === "current", c = g(e), l = "none";
|
|
47
|
+
t === 0 && (l = "auto");
|
|
48
|
+
let d;
|
|
49
|
+
return d = a ? /* @__PURE__ */ p(r, {
|
|
50
|
+
target: e.target,
|
|
51
|
+
label: e.label,
|
|
55
52
|
className: i,
|
|
56
|
-
|
|
57
|
-
|
|
53
|
+
icon: l
|
|
54
|
+
}) : /* @__PURE__ */ p(n, {
|
|
55
|
+
target: e.target,
|
|
56
|
+
label: e.label,
|
|
57
|
+
className: s,
|
|
58
|
+
icon: l
|
|
59
|
+
}), /* @__PURE__ */ m("li", {
|
|
60
|
+
className: o,
|
|
61
|
+
children: [/* @__PURE__ */ p("span", {
|
|
62
|
+
className: u,
|
|
58
63
|
"aria-hidden": "true",
|
|
59
64
|
children: "/"
|
|
60
|
-
}),
|
|
61
|
-
},
|
|
65
|
+
}), d]
|
|
66
|
+
}, c);
|
|
62
67
|
})]
|
|
63
68
|
})
|
|
64
69
|
});
|
|
65
70
|
};
|
|
66
71
|
//#endregion
|
|
67
|
-
export {
|
|
72
|
+
export { _ as BackofficeTopbarBreadcrumb, _ as default };
|
|
68
73
|
|
|
69
74
|
//# sourceMappingURL=BackofficeTopbarBreadcrumb.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackofficeTopbarBreadcrumb.js","names":[],"sources":["../../../../../../src/components/backoffice/layout/breadcrumb/BackofficeTopbarBreadcrumb.tsx"],"sourcesContent":["import { type JSX } from 'react';\nimport { Link } from '@plumile/router';\nimport { SidebarHomeSvg } from '@plumile/ui';\n\nimport { useBackofficeReactTranslation } from '../../../../i18n/useBackofficeReactTranslation.js';\nimport type { BackofficeTopbarBreadcrumbItem } from './types.js';\nimport { useBackofficeTopbarPortalContext } from './BackofficeTopbarPortalContext.js';\nimport * as styles from './backofficeTopbarBreadcrumb.css.js';\n\nexport type BackofficeTopbarBreadcrumbProps = {\n items: readonly BackofficeTopbarBreadcrumbItem[];\n};\n\nexport const BackofficeTopbarBreadcrumb = ({\n items,\n}: BackofficeTopbarBreadcrumbProps): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n const { dashboardHref, dashboardLabel } = useBackofficeTopbarPortalContext();\n let isDashboardCurrent = false;\n const firstItem = items
|
|
1
|
+
{"version":3,"file":"BackofficeTopbarBreadcrumb.js","names":[],"sources":["../../../../../../src/components/backoffice/layout/breadcrumb/BackofficeTopbarBreadcrumb.tsx"],"sourcesContent":["import { type JSX } from 'react';\nimport { Link } from '@plumile/router';\nimport { SidebarHomeSvg } from '@plumile/ui';\n\nimport { BackofficeLink } from '../../links/BackofficeLink.js';\nimport { BackofficeLinkLabel } from '../../links/BackofficeLinkLabel.js';\nimport { useBackofficeReactTranslation } from '../../../../i18n/useBackofficeReactTranslation.js';\nimport type { BackofficeTopbarBreadcrumbItem } from './types.js';\nimport { useBackofficeTopbarPortalContext } from './BackofficeTopbarPortalContext.js';\nimport * as styles from './backofficeTopbarBreadcrumb.css.js';\n\nexport type BackofficeTopbarBreadcrumbProps = {\n items: readonly BackofficeTopbarBreadcrumbItem[];\n};\n\nconst getBreadcrumbItemKey = (item: BackofficeTopbarBreadcrumbItem): string => {\n const { target } = item;\n if (target.kind === 'dashboard') {\n return `${item.kind}-dashboard`;\n }\n if (target.kind === 'entity-list') {\n return `${item.kind}-entity-list-${target.entityId}`;\n }\n if (target.kind === 'entity-detail') {\n return `${item.kind}-entity-detail-${target.entityId}-${target.id}`;\n }\n if (target.kind === 'entity-detail-page') {\n return `${item.kind}-entity-detail-page-${target.entityId}-${target.id}-${target.pageId}`;\n }\n if (target.kind === 'tool') {\n return `${item.kind}-tool-${target.toolId}`;\n }\n if (target.kind === 'hub') {\n return `${item.kind}-hub-${target.hubId}`;\n }\n return `${item.kind}-href-${target.href}`;\n};\n\nexport const BackofficeTopbarBreadcrumb = ({\n items,\n}: BackofficeTopbarBreadcrumbProps): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n const { dashboardHref, dashboardLabel } = useBackofficeTopbarPortalContext();\n let isDashboardCurrent = false;\n const [firstItem] = items;\n if (items.length === 1 && firstItem != null) {\n isDashboardCurrent =\n firstItem.target.kind === 'dashboard' && firstItem.kind === 'current';\n }\n let visibleItems: readonly BackofficeTopbarBreadcrumbItem[] = items;\n if (isDashboardCurrent) {\n visibleItems = [];\n }\n\n const homeContent = (\n <>\n <SidebarHomeSvg width={16} height={16} aria-hidden=\"true\" />\n <span className={styles.homeLabel}>{dashboardLabel}</span>\n </>\n );\n\n return (\n <nav className={styles.nav} aria-label={t('common.breadcrumb')}>\n <ol className={styles.list}>\n <li className={styles.item}>\n {isDashboardCurrent && (\n <span\n className={styles.homeCurrent}\n aria-current=\"page\"\n title={dashboardLabel}\n >\n {homeContent}\n </span>\n )}\n {!isDashboardCurrent && (\n <Link\n to={dashboardHref}\n className={styles.homeLink}\n aria-label={dashboardLabel}\n title={dashboardLabel}\n >\n {homeContent}\n </Link>\n )}\n </li>\n {visibleItems.map((item, index) => {\n const isCurrent = item.kind === 'current';\n const key = getBreadcrumbItemKey(item);\n let icon: 'auto' | 'none' = 'none';\n if (index === 0) {\n icon = 'auto';\n }\n let content: JSX.Element;\n\n if (!isCurrent) {\n content = (\n <BackofficeLink\n target={item.target}\n label={item.label}\n className={styles.link}\n icon={icon}\n />\n );\n } else {\n content = (\n <BackofficeLinkLabel\n target={item.target}\n label={item.label}\n className={styles.current}\n icon={icon}\n />\n );\n }\n\n return (\n <li key={key} className={styles.item}>\n <span className={styles.separator} aria-hidden=\"true\">\n /\n </span>\n {content}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n};\n\nexport default BackofficeTopbarBreadcrumb;\n"],"mappings":";;;;;;;;;AAeA,IAAM,KAAwB,MAAiD;CAC7E,IAAM,EAAE,cAAW;CAmBnB,OAlBI,EAAO,SAAS,cACX,GAAG,EAAK,KAAK,cAElB,EAAO,SAAS,gBACX,GAAG,EAAK,KAAK,eAAe,EAAO,aAExC,EAAO,SAAS,kBACX,GAAG,EAAK,KAAK,iBAAiB,EAAO,SAAS,GAAG,EAAO,OAE7D,EAAO,SAAS,uBACX,GAAG,EAAK,KAAK,sBAAsB,EAAO,SAAS,GAAG,EAAO,GAAG,GAAG,EAAO,WAE/E,EAAO,SAAS,SACX,GAAG,EAAK,KAAK,QAAQ,EAAO,WAEjC,EAAO,SAAS,QACX,GAAG,EAAK,KAAK,OAAO,EAAO,UAE7B,GAAG,EAAK,KAAK,QAAQ,EAAO;GAGxB,KAA8B,EACzC,eACkD;CAClD,IAAM,EAAE,SAAM,GAA+B,EACvC,EAAE,kBAAe,sBAAmB,GAAkC,EACxE,IAAqB,IACnB,CAAC,KAAa;CACpB,AAAI,EAAM,WAAW,KAAK,KAAa,SACrC,IACE,EAAU,OAAO,SAAS,eAAe,EAAU,SAAS;CAEhE,IAAI,IAA0D;CAC9D,AAAI,MACF,IAAe,EAAE;CAGnB,IAAM,IACJ,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD;EAAgB,OAAO;EAAI,QAAQ;EAAI,eAAY;EAAS,CAAA,EAC5D,kBAAC,QAAD;EAAM,WAAW;YAAmB;EAAsB,CAAA,CACzD,EAAA,CAAA;CAGL,OACE,kBAAC,OAAD;EAAK,WAAW;EAAY,cAAY,EAAE,oBAAoB;YAC5D,kBAAC,MAAD;GAAI,WAAW;aAAf,CACE,kBAAC,MAAD;IAAI,WAAW;cAAf,CACG,KACC,kBAAC,QAAD;KACE,WAAW;KACX,gBAAa;KACb,OAAO;eAEN;KACI,CAAA,EAER,CAAC,KACA,kBAAC,GAAD;KACE,IAAI;KACJ,WAAW;KACX,cAAY;KACZ,OAAO;eAEN;KACI,CAAA,CAEN;OACJ,EAAa,KAAK,GAAM,MAAU;IACjC,IAAM,IAAY,EAAK,SAAS,WAC1B,IAAM,EAAqB,EAAK,EAClC,IAAwB;IAC5B,AAAI,MAAU,MACZ,IAAO;IAET,IAAI;IAsBJ,OApBA,AACE,IADG,IAWD,kBAAC,GAAD;KACE,QAAQ,EAAK;KACb,OAAO,EAAK;KACZ,WAAW;KACL;KACN,CAAA,GAdF,kBAAC,GAAD;KACE,QAAQ,EAAK;KACb,OAAO,EAAK;KACZ,WAAW;KACL;KACN,CAAA,EAcJ,kBAAC,MAAD;KAAc,WAAW;eAAzB,CACE,kBAAC,QAAD;MAAM,WAAW;MAAkB,eAAY;gBAAO;MAE/C,CAAA,EACN,EACE;OALI,EAKJ;KAEP,CACC;;EACD,CAAA"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { createContext as e, useContext as t } from "react";
|
|
2
2
|
//#region src/components/backoffice/layout/breadcrumb/BackofficeTopbarPortalContext.tsx
|
|
3
|
-
var n = e(null), r = n.Provider, i = () => {
|
|
3
|
+
var n = e(null), r = n.Provider, i = () => t(n), a = () => {
|
|
4
4
|
let e = t(n);
|
|
5
5
|
if (e == null) throw Error("BackofficeTopbarPortalContext is missing. Ensure pages are rendered under BackofficeLayoutPage.");
|
|
6
6
|
return e;
|
|
7
7
|
};
|
|
8
8
|
//#endregion
|
|
9
|
-
export { r as BackofficeTopbarPortalContextProvider,
|
|
9
|
+
export { r as BackofficeTopbarPortalContextProvider, a as useBackofficeTopbarPortalContext, i as useOptionalBackofficeTopbarPortalContext };
|
|
10
10
|
|
|
11
11
|
//# sourceMappingURL=BackofficeTopbarPortalContext.js.map
|
package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarPortalContext.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackofficeTopbarPortalContext.js","names":[],"sources":["../../../../../../src/components/backoffice/layout/breadcrumb/BackofficeTopbarPortalContext.tsx"],"sourcesContent":["import { createContext, useContext } from 'react';\n\nexport type BackofficeTopbarPortalContextValue = {\n target: HTMLDivElement | null;\n dashboardHref: string;\n dashboardLabel: string;\n};\n\nconst BackofficeTopbarPortalContext =\n createContext<BackofficeTopbarPortalContextValue | null>(null);\n\nexport const BackofficeTopbarPortalContextProvider =\n BackofficeTopbarPortalContext.Provider;\n\nexport const useBackofficeTopbarPortalContext =\n (): BackofficeTopbarPortalContextValue => {\n const context = useContext(BackofficeTopbarPortalContext);\n if (context == null) {\n throw new Error(\n 'BackofficeTopbarPortalContext is missing. Ensure pages are rendered under BackofficeLayoutPage.',\n );\n }\n return context;\n };\n"],"mappings":";;AAQA,IAAM,IACJ,EAAyD,KAAK,EAEnD,IACX,EAA8B,UAEnB,UAC+B;CACxC,IAAM,IAAU,EAAW,EAA8B;CACzD,IAAI,KAAW,MACb,MAAU,MACR,kGACD;CAEH,OAAO"}
|
|
1
|
+
{"version":3,"file":"BackofficeTopbarPortalContext.js","names":[],"sources":["../../../../../../src/components/backoffice/layout/breadcrumb/BackofficeTopbarPortalContext.tsx"],"sourcesContent":["import { createContext, useContext } from 'react';\n\nexport type BackofficeTopbarPortalContextValue = {\n target: HTMLDivElement | null;\n dashboardHref: string;\n dashboardLabel: string;\n};\n\nconst BackofficeTopbarPortalContext =\n createContext<BackofficeTopbarPortalContextValue | null>(null);\n\nexport const BackofficeTopbarPortalContextProvider =\n BackofficeTopbarPortalContext.Provider;\n\nexport const useOptionalBackofficeTopbarPortalContext =\n (): BackofficeTopbarPortalContextValue | null => {\n return useContext(BackofficeTopbarPortalContext);\n };\n\nexport const useBackofficeTopbarPortalContext =\n (): BackofficeTopbarPortalContextValue => {\n const context = useContext(BackofficeTopbarPortalContext);\n if (context == null) {\n throw new Error(\n 'BackofficeTopbarPortalContext is missing. Ensure pages are rendered under BackofficeLayoutPage.',\n );\n }\n return context;\n };\n"],"mappings":";;AAQA,IAAM,IACJ,EAAyD,KAAK,EAEnD,IACX,EAA8B,UAEnB,UAEF,EAAW,EAA8B,EAGvC,UAC+B;CACxC,IAAM,IAAU,EAAW,EAA8B;CACzD,IAAI,KAAW,MACb,MAAU,MACR,kGACD;CAEH,OAAO"}
|
|
@@ -1,16 +1,20 @@
|
|
|
1
1
|
//#region src/components/backoffice/layout/breadcrumb/assertValidBreadcrumb.ts
|
|
2
|
-
var e = (e, t) => Error(t == null ? `Invalid breadcrumb contract: ${e}` : `Invalid breadcrumb contract: ${e} (${t})`), t = (
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
if (
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
2
|
+
var e = (e, t) => Error(t == null ? `Invalid breadcrumb contract: ${e}` : `Invalid breadcrumb contract: ${e} (${t})`), t = (e) => {
|
|
3
|
+
let { target: t } = e;
|
|
4
|
+
return t == null ? "" : t.kind === "dashboard" ? "dashboard" : t.kind === "entity-list" ? `${t.entityId}-list` : t.kind === "entity-detail" ? `${t.entityId}-entity-${t.id}` : t.kind === "entity-detail-page" ? `${t.entityId}-page-${t.id}-${t.pageId}` : t.kind === "tool" ? `tool-${t.toolId}` : t.kind === "hub" ? `hub-${t.hubId}` : `href-${t.href}`;
|
|
5
|
+
}, n = (n) => {
|
|
6
|
+
if (n == null) throw e("MISSING_BREADCRUMB");
|
|
7
|
+
if (n.length === 0) throw e("EMPTY_BREADCRUMB");
|
|
8
|
+
let r = /* @__PURE__ */ new Set();
|
|
9
|
+
if (n.forEach((n, i) => {
|
|
10
|
+
let a = t(n);
|
|
11
|
+
if (a.trim() === "") throw e("INVALID_SEGMENT_ID", `index=${i}`);
|
|
12
|
+
if (r.has(a)) throw e("INVALID_SEGMENT_ID", `duplicate id="${a}"`);
|
|
13
|
+
r.add(a);
|
|
14
|
+
}), n[n.length - 1]?.kind !== "current") throw e("MISSING_CURRENT_SEGMENT");
|
|
15
|
+
return n;
|
|
12
16
|
};
|
|
13
17
|
//#endregion
|
|
14
|
-
export {
|
|
18
|
+
export { n as assertValidBreadcrumb };
|
|
15
19
|
|
|
16
20
|
//# sourceMappingURL=assertValidBreadcrumb.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assertValidBreadcrumb.js","names":[],"sources":["../../../../../../src/components/backoffice/layout/breadcrumb/assertValidBreadcrumb.ts"],"sourcesContent":["import type {\n BackofficeTopbarBreadcrumbItem,\n BreadcrumbContractErrorCode,\n} from './types.js';\n\nconst formatContractError = (\n code: BreadcrumbContractErrorCode,\n details?: string,\n): Error => {\n if (details == null) {\n return new Error(`Invalid breadcrumb contract: ${code}`);\n }\n return new Error(`Invalid breadcrumb contract: ${code} (${details})`);\n};\n\nexport const assertValidBreadcrumb = (\n items: readonly BackofficeTopbarBreadcrumbItem[] | null | undefined,\n): readonly BackofficeTopbarBreadcrumbItem[] => {\n if (items == null) {\n throw formatContractError('MISSING_BREADCRUMB');\n }\n if (items.length === 0) {\n throw formatContractError('EMPTY_BREADCRUMB');\n }\n\n const seen = new Set<string>();\n items.forEach((item, index) => {\n
|
|
1
|
+
{"version":3,"file":"assertValidBreadcrumb.js","names":[],"sources":["../../../../../../src/components/backoffice/layout/breadcrumb/assertValidBreadcrumb.ts"],"sourcesContent":["import type {\n BackofficeTopbarBreadcrumbItem,\n BreadcrumbContractErrorCode,\n} from './types.js';\n\nconst formatContractError = (\n code: BreadcrumbContractErrorCode,\n details?: string,\n): Error => {\n if (details == null) {\n return new Error(`Invalid breadcrumb contract: ${code}`);\n }\n return new Error(`Invalid breadcrumb contract: ${code} (${details})`);\n};\n\nconst getBreadcrumbItemId = (item: BackofficeTopbarBreadcrumbItem): string => {\n const { target } = item as {\n readonly target?: BackofficeTopbarBreadcrumbItem['target'];\n };\n if (target == null) {\n return '';\n }\n if (target.kind === 'dashboard') {\n return 'dashboard';\n }\n if (target.kind === 'entity-list') {\n return `${target.entityId}-list`;\n }\n if (target.kind === 'entity-detail') {\n return `${target.entityId}-entity-${target.id}`;\n }\n if (target.kind === 'entity-detail-page') {\n return `${target.entityId}-page-${target.id}-${target.pageId}`;\n }\n if (target.kind === 'tool') {\n return `tool-${target.toolId}`;\n }\n if (target.kind === 'hub') {\n return `hub-${target.hubId}`;\n }\n return `href-${target.href}`;\n};\n\nexport const assertValidBreadcrumb = (\n items: readonly BackofficeTopbarBreadcrumbItem[] | null | undefined,\n): readonly BackofficeTopbarBreadcrumbItem[] => {\n if (items == null) {\n throw formatContractError('MISSING_BREADCRUMB');\n }\n if (items.length === 0) {\n throw formatContractError('EMPTY_BREADCRUMB');\n }\n\n const seen = new Set<string>();\n items.forEach((item, index) => {\n const id = getBreadcrumbItemId(item);\n if (id.trim() === '') {\n throw formatContractError('INVALID_SEGMENT_ID', `index=${index}`);\n }\n\n if (seen.has(id)) {\n throw formatContractError('INVALID_SEGMENT_ID', `duplicate id=\"${id}\"`);\n }\n seen.add(id);\n });\n\n const last = items[items.length - 1];\n if (last?.kind !== 'current') {\n throw formatContractError('MISSING_CURRENT_SEGMENT');\n }\n\n return items;\n};\n"],"mappings":";AAKA,IAAM,KACJ,GACA,MAGa,MADT,KAAW,OACI,gCAAgC,MAElC,gCAAgC,EAAK,IAAI,EAAQ,GAFR,EAKtD,KAAuB,MAAiD;CAC5E,IAAM,EAAE,cAAW;CAwBnB,OArBI,KAAU,OACL,KAEL,EAAO,SAAS,cACX,cAEL,EAAO,SAAS,gBACX,GAAG,EAAO,SAAS,SAExB,EAAO,SAAS,kBACX,GAAG,EAAO,SAAS,UAAU,EAAO,OAEzC,EAAO,SAAS,uBACX,GAAG,EAAO,SAAS,QAAQ,EAAO,GAAG,GAAG,EAAO,WAEpD,EAAO,SAAS,SACX,QAAQ,EAAO,WAEpB,EAAO,SAAS,QACX,OAAO,EAAO,UAEhB,QAAQ,EAAO;GAGX,KACX,MAC8C;CAC9C,IAAI,KAAS,MACX,MAAM,EAAoB,qBAAqB;CAEjD,IAAI,EAAM,WAAW,GACnB,MAAM,EAAoB,mBAAmB;CAG/C,IAAM,oBAAO,IAAI,KAAa;CAc9B,IAbA,EAAM,SAAS,GAAM,MAAU;EAC7B,IAAM,IAAK,EAAoB,EAAK;EACpC,IAAI,EAAG,MAAM,KAAK,IAChB,MAAM,EAAoB,sBAAsB,SAAS,IAAQ;EAGnE,IAAI,EAAK,IAAI,EAAG,EACd,MAAM,EAAoB,sBAAsB,iBAAiB,EAAG,GAAG;EAEzE,EAAK,IAAI,EAAG;GACZ,EAEW,EAAM,EAAM,SAAS,IACxB,SAAS,WACjB,MAAM,EAAoB,0BAA0B;CAGtD,OAAO"}
|