@plumile/backoffice-react 0.1.82 → 0.1.83
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-DJkNNx49.js → AcceptInvitationScreen-5-0EtE15.js} +4 -4
- package/lib/esm/{AcceptInvitationScreen-DJkNNx49.js.map → AcceptInvitationScreen-5-0EtE15.js.map} +1 -1
- package/lib/esm/{AuthPanel-Co626p7A.js → AuthPanel-DiHejPoq.js} +2 -2
- package/lib/esm/{AuthPanel-Co626p7A.js.map → AuthPanel-DiHejPoq.js.map} +1 -1
- package/lib/esm/{BackofficeAcceptInvitationPage-BQfDMSux.js → BackofficeAcceptInvitationPage-FPbn31YK.js} +6 -6
- package/lib/esm/{BackofficeAcceptInvitationPage-BQfDMSux.js.map → BackofficeAcceptInvitationPage-FPbn31YK.js.map} +1 -1
- package/lib/esm/{BackofficeDashboardPage-B5_YC1ZL.js → BackofficeDashboardPage-C7lIVeA1.js} +3 -3
- package/lib/esm/{BackofficeDashboardPage-B5_YC1ZL.js.map → BackofficeDashboardPage-C7lIVeA1.js.map} +1 -1
- package/lib/esm/{BackofficeDetailPayload-CbsZKnw6.js → BackofficeDetailPayload-iVx66o_6.js} +4 -4
- package/lib/esm/{BackofficeDetailPayload-CbsZKnw6.js.map → BackofficeDetailPayload-iVx66o_6.js.map} +1 -1
- package/lib/esm/{BackofficeEntityActionFormDialog-BzKi1eyv.js → BackofficeEntityActionFormDialog-V4QXnvpy.js} +18 -18
- package/lib/esm/{BackofficeEntityActionFormDialog-BzKi1eyv.js.map → BackofficeEntityActionFormDialog-V4QXnvpy.js.map} +1 -1
- package/lib/esm/{BackofficeEntityDetailPage-CE4tl5ZJ.js → BackofficeEntityDetailPage-BljQmWsw.js} +10 -10
- package/lib/esm/{BackofficeEntityDetailPage-CE4tl5ZJ.js.map → BackofficeEntityDetailPage-BljQmWsw.js.map} +1 -1
- package/lib/esm/{BackofficeEntityListPage-CtLI15-L.js → BackofficeEntityListPage-BneDsGo-.js} +6 -6
- package/lib/esm/{BackofficeEntityListPage-CtLI15-L.js.map → BackofficeEntityListPage-BneDsGo-.js.map} +1 -1
- package/lib/esm/{BackofficeLayoutPage-DpvTzwtK.js → BackofficeLayoutPage-Da4y2B0i.js} +5 -5
- package/lib/esm/{BackofficeLayoutPage-DpvTzwtK.js.map → BackofficeLayoutPage-Da4y2B0i.js.map} +1 -1
- package/lib/esm/{BackofficeLoginPage-GKVdZndS.js → BackofficeLoginPage-Dc61SyMV.js} +6 -6
- package/lib/esm/{BackofficeLoginPage-GKVdZndS.js.map → BackofficeLoginPage-Dc61SyMV.js.map} +1 -1
- package/lib/esm/{BackofficePasswordResetCompletePage-CCQJYK9S.js → BackofficePasswordResetCompletePage-CvoHqhBS.js} +4 -4
- package/lib/esm/{BackofficePasswordResetCompletePage-CCQJYK9S.js.map → BackofficePasswordResetCompletePage-CvoHqhBS.js.map} +1 -1
- package/lib/esm/{BackofficePasswordResetRequestPage-Df8mcLkC.js → BackofficePasswordResetRequestPage-DDNcCf3_.js} +4 -4
- package/lib/esm/{BackofficePasswordResetRequestPage-Df8mcLkC.js.map → BackofficePasswordResetRequestPage-DDNcCf3_.js.map} +1 -1
- package/lib/esm/{BackofficeRightPageLayout-D7QRE8KZ.js → BackofficeRightPageLayout-F8ipegrl.js} +3 -3
- package/lib/esm/{BackofficeRightPageLayout-D7QRE8KZ.js.map → BackofficeRightPageLayout-F8ipegrl.js.map} +1 -1
- package/lib/esm/{BackofficeVerifyEmailPage-CtqLzXAD.js → BackofficeVerifyEmailPage-BSTtLXdx.js} +3 -3
- package/lib/esm/{BackofficeVerifyEmailPage-CtqLzXAD.js.map → BackofficeVerifyEmailPage-BSTtLXdx.js.map} +1 -1
- package/lib/esm/{EntityFilterValue-Bn9VGr2M.js → EntityFilterValue-B5ZGHO_u.js} +2 -2
- package/lib/esm/{EntityFilterValue-Bn9VGr2M.js.map → EntityFilterValue-B5ZGHO_u.js.map} +1 -1
- package/lib/esm/{EntityIdPickerDialog-D_qAlrU6.js → EntityIdPickerDialog-DbTnDU4v.js} +3 -3
- package/lib/esm/{EntityIdPickerDialog-D_qAlrU6.js.map → EntityIdPickerDialog-DbTnDU4v.js.map} +1 -1
- package/lib/esm/{LazyBackofficeEntityActionFormDialog-DndjG4kV.js → LazyBackofficeEntityActionFormDialog-BE3wVfU6.js} +5 -5
- package/lib/esm/{LazyBackofficeEntityActionFormDialog-DndjG4kV.js.map → LazyBackofficeEntityActionFormDialog-BE3wVfU6.js.map} +1 -1
- package/lib/esm/{PasswordResetCompleteScreen-DdJsdKMI.js → PasswordResetCompleteScreen-B0P_tZg2.js} +3 -3
- package/lib/esm/{PasswordResetCompleteScreen-DdJsdKMI.js.map → PasswordResetCompleteScreen-B0P_tZg2.js.map} +1 -1
- package/lib/esm/{PasswordResetRequestScreen-DBIHOmsl.js → PasswordResetRequestScreen-p9s0dblR.js} +3 -3
- package/lib/esm/{PasswordResetRequestScreen-DBIHOmsl.js.map → PasswordResetRequestScreen-p9s0dblR.js.map} +1 -1
- package/lib/esm/{VerifyEmailScreen-C9rfi3q8.js → VerifyEmailScreen--9lxOGlW.js} +2 -2
- package/lib/esm/{VerifyEmailScreen-C9rfi3q8.js.map → VerifyEmailScreen--9lxOGlW.js.map} +1 -1
- package/lib/esm/backoffice-react.js +20 -20
- package/lib/esm/loginPage.css-CBJ1Ozm5.js +12 -0
- package/lib/esm/{loginPage.css-4M4PrzUn.js.map → loginPage.css-CBJ1Ozm5.js.map} +1 -1
- package/lib/esm/{synchronizeAuthStatusQuery-Bb5wh5rF.js → synchronizeAuthStatusQuery-Dr6AEFhi.js} +4 -4
- package/lib/esm/{synchronizeAuthStatusQuery-Bb5wh5rF.js.map → synchronizeAuthStatusQuery-Dr6AEFhi.js.map} +1 -1
- package/lib/esm/{useAuth-tQWc1NnB.js → useAuth-CjdysxLB.js} +2 -2
- package/lib/esm/{useAuth-tQWc1NnB.js.map → useAuth-CjdysxLB.js.map} +1 -1
- package/lib/esm/{useBackofficeAuth-BUrTeBOK.js → useBackofficeAuth-BshabGXc.js} +2 -2
- package/lib/esm/{useBackofficeAuth-BUrTeBOK.js.map → useBackofficeAuth-BshabGXc.js.map} +1 -1
- package/package.json +5 -5
- package/lib/esm/loginPage.css-4M4PrzUn.js +0 -12
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackofficeEntityDetailPage-CE4tl5ZJ.js","names":[],"sources":["../../src/components/backoffice/scaffolds/BackofficeEntityDetailScaffold.tsx","../../src/components/backoffice/detail/BackofficeDetailFlagTag.css.ts","../../src/components/backoffice/detail/BackofficeDetailFlagTag.tsx","../../src/components/backoffice/detail/backofficeDetailTaggedValue.css.ts","../../src/components/backoffice/detail/BackofficeDetailTaggedValue.tsx","../../src/components/backoffice/detail/backofficeDetailErrorList.css.ts","../../src/components/backoffice/detail/BackofficeDetailErrorList.tsx","../../src/components/backoffice/detail/BackofficeDetailRelationListBlock.tsx","../../src/pages/backofficeEntityDetailPage.css.ts","../../src/i18n/useBackofficeFormats.ts","../../src/pages/detail/buildTabsItems.ts","../../src/pages/BackofficeEntityDetailPage.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\n\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\n\nexport type BackofficeEntityDetailScaffoldProps<\n NodeUnion extends { __typename: string },\n> = {\n node: NodeUnion | null | undefined;\n render: (node: NodeUnion) => JSX.Element | null;\n notFound?: ReactNode;\n};\n\nexport const BackofficeEntityDetailScaffold = <\n NodeUnion extends { __typename: string },\n>({\n node,\n render,\n notFound,\n}: BackofficeEntityDetailScaffoldProps<NodeUnion>): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n const resolvedNotFound = notFound ?? t('detail.notFound');\n if (node == null) {\n return <>{resolvedNotFound}</>;\n }\n\n const content = render(node);\n if (content == null) {\n return <>{resolvedNotFound}</>;\n }\n\n return content;\n};\n\nexport default BackofficeEntityDetailScaffold;\n","import { style } from '@vanilla-extract/css';\n\nimport { sprinkles } from '@plumile/ui';\n\nexport const content = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n});\n\nexport const icon = style([\n sprinkles({\n display: 'flex',\n alignItems: 'center',\n }),\n {\n flex: '0 0 auto',\n },\n]);\n\nexport const label = style({\n flex: '0 1 auto',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { Tag, type TagTone } from '@plumile/ui';\n\nimport * as styles from './BackofficeDetailFlagTag.css.js';\n\nexport type BackofficeDetailFlagTagProps = {\n tone: TagTone;\n icon?: ReactNode;\n label: string;\n};\n\nexport const BackofficeDetailFlagTag = ({\n tone,\n icon,\n label,\n}: BackofficeDetailFlagTagProps): JSX.Element => {\n const hasIcon = icon != null;\n let iconNode: ReactNode | null = null;\n if (hasIcon) {\n iconNode = <span className={styles.icon}>{icon}</span>;\n }\n\n return (\n <Tag tone={tone}>\n <span className={styles.content}>\n {iconNode}\n <span className={styles.label}>{label}</span>\n </span>\n </Tag>\n );\n};\n\nexport default BackofficeDetailFlagTag;\n","import { sprinkles } from '@plumile/ui';\n\nexport const container = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n gap: 2,\n flexWrap: 'wrap',\n});\n\nexport const value = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n gap: 1,\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport type { BackofficeBadgeTone } from '@plumile/backoffice-core/types.js';\nimport { Tag } from '@plumile/ui';\n\nimport * as styles from './backofficeDetailTaggedValue.css.js';\n\nexport type BackofficeDetailTaggedValueProps = {\n tag: { label: string; tone?: BackofficeBadgeTone } | null;\n value: ReactNode;\n};\n\nexport const BackofficeDetailTaggedValue = ({\n tag,\n value,\n}: BackofficeDetailTaggedValueProps): JSX.Element => {\n return (\n <span className={styles.container}>\n {tag != null && <Tag tone={tag.tone}>{tag.label}</Tag>}\n <span className={styles.value}>{value}</span>\n </span>\n );\n};\n\nexport default BackofficeDetailTaggedValue;\n","import { sprinkles } from '@plumile/ui';\n\nexport const list = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n});\n\nexport const item = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n padding: 3,\n borderRadius: 'xl',\n});\n\nexport const itemSurface = sprinkles({\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'borderSubtle',\n backgroundColor: 'surfaceMuted',\n});\n\nexport const header = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n});\n\nexport const code = sprinkles({\n fontFamily: 'mono',\n fontSize: 'sm',\n color: 'textMuted',\n});\n\nexport const message = sprinkles({\n fontWeight: 'semibold',\n});\n\nexport const details = sprinkles({\n fontSize: 'sm',\n});\n","import { type JSX } from 'react';\n\nimport { LazyMarkdownRenderer, cx } from '@plumile/ui';\n\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport { BackofficeDetailSection } from './BackofficeDetailSection.js';\nimport { formatJsonPayload } from './detailPayloadUtils.js';\n\nimport * as styles from './backofficeDetailErrorList.css.js';\n\nexport type BackofficeDetailErrorItem = {\n code: string;\n message: string;\n details?: unknown;\n};\n\nexport type BackofficeDetailErrorListProps = {\n title: string;\n description?: string;\n items: readonly BackofficeDetailErrorItem[];\n};\n\nexport const BackofficeDetailErrorList = ({\n title,\n description,\n items,\n}: BackofficeDetailErrorListProps): JSX.Element | null => {\n const { t } = useBackofficeReactTranslation();\n\n if (items.length === 0) {\n return null;\n }\n\n return (\n <BackofficeDetailSection title={title} description={description}>\n <div className={styles.list}>\n {items.map((error, index) => {\n let details = t('common.notAvailable');\n if (error.details != null) {\n details = formatJsonPayload(error.details);\n }\n return (\n <div\n key={`${error.code}-${index}`}\n className={cx(styles.item, styles.itemSurface)}\n >\n <div className={styles.header}>\n <span className={styles.code}>{error.code}</span>\n <span className={styles.message}>{error.message}</span>\n </div>\n <div className={styles.details}>\n <LazyMarkdownRenderer content={details} />\n </div>\n </div>\n );\n })}\n </div>\n </BackofficeDetailSection>\n );\n};\n\nexport default BackofficeDetailErrorList;\n","/* eslint-disable react-hooks/rules-of-hooks */\nimport { 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 BackofficeResolvedListFacetConfig,\n} from '@plumile/backoffice-core/types.js';\nimport { BackofficeTableSkeleton } 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 target: string;\n whereKey: string;\n value: string | null;\n path?: readonly string[];\n};\n\ntype RelationListContentProps = {\n title: string;\n config: BackofficeResolvedListFacetConfig;\n entities: ReturnType<typeof useBackofficeConfig>['entities'];\n whereKey: string;\n value: string | null;\n path?: readonly string[];\n};\n\ntype RelationListBlockBodyProps = {\n title: string;\n targetId: string;\n whereKey: string;\n value: string | null;\n path?: readonly string[];\n};\n\nconst RelationListContent = ({\n title,\n config,\n entities,\n whereKey,\n value,\n path,\n}: RelationListContentProps): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n if (config.list.kind === 'records') {\n return null;\n }\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 whereKey as never,\n value,\n path,\n );\n }, [path, state.where, value, whereKey]);\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 if (listConfig.buildVariables != null) {\n return listConfig.buildVariables(variablesBase as never);\n }\n return variablesBase;\n }, [listConfig, variablesBase]);\n\n const queryData = useLazyLoadQuery<OperationType>(\n listConfig.query,\n variables as never,\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 as never);\n },\n [listConfig],\n );\n\n const defaults = useMemo(() => {\n const baseWhere = relationWhere ?? (listDefaults.where as never);\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: refetch as never,\n variables: variablesBase as never,\n defaults: defaults as never,\n fetchPolicy: BACKOFFICE_LIST_REFETCH_POLICY,\n buildVariables: listConfig.buildVariables as never,\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 as never);\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 targetId,\n whereKey,\n value,\n path,\n}: RelationListBlockBodyProps): JSX.Element | null => {\n const { entities } = useBackofficeConfig();\n const relatedEntityIds = useMemo(() => {\n return [targetId];\n }, [targetId]);\n const relatedEntitiesState =\n useBackofficeListEntitiesLoader(relatedEntityIds);\n\n if (relatedEntitiesState.status === 'loading') {\n return <BackofficeTableSkeleton rows={6} />;\n }\n\n if (relatedEntitiesState.status === 'error') {\n return null;\n }\n\n const config = relatedEntitiesState.modules[targetId]?.config;\n if (config == null) {\n return null;\n }\n\n return (\n <RelationListContent\n title={title}\n config={config}\n entities={entities}\n whereKey={whereKey}\n value={value}\n path={path}\n />\n );\n};\n\nexport const BackofficeDetailRelationListBlock = ({\n title,\n target,\n whereKey,\n value,\n path,\n}: BackofficeDetailRelationListBlockProps): JSX.Element => {\n return (\n <BackofficeErrorBoundary\n fallback={() => {\n return <BackofficeTableSkeleton rows={6} />;\n }}\n >\n <Suspense fallback={<BackofficeTableSkeleton rows={6} />}>\n <RelationListBlockBody\n title={title}\n targetId={target}\n whereKey={whereKey}\n value={value}\n path={path}\n />\n </Suspense>\n </BackofficeErrorBoundary>\n );\n};\n\nexport default BackofficeDetailRelationListBlock;\n","import { sprinkles } from '@plumile/ui';\n\nexport const headerActions = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n flexWrap: 'wrap',\n});\n\nexport const headerBlock = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n});\n\nexport const headerMeta = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n flexWrap: 'wrap',\n});\n\nexport const headerMetaList = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n});\n","import { useBackofficeReactTranslation } from './useBackofficeReactTranslation.js';\n\nexport type BackofficeFormats = {\n formatNumber: (value: number | null | undefined) => string;\n formatCurrency: (value: number | null | undefined) => string;\n formatPercent: (value: number | null | undefined) => string;\n};\n\n/**\n *\n */\nexport function useBackofficeFormats(): BackofficeFormats {\n const { t } = useBackofficeReactTranslation();\n\n /**\n *\n */\n function formatNumber(value: number | null | undefined): string {\n return t('format.number', { value });\n }\n\n /**\n *\n */\n function formatCurrency(value: number | null | undefined): string {\n return t('format.currency', { value });\n }\n\n /**\n *\n */\n function formatPercent(value: number | null | undefined): string {\n return t('format.percent', { value });\n }\n\n return { formatNumber, formatCurrency, formatPercent };\n}\n","import type { BackofficeDetailPageRouteSpec } from '@plumile/backoffice-core/types.js';\nimport type { BackofficeTabItem } from '@plumile/ui';\nimport type { TFunction } from 'i18next';\n\ntype DetailPage<Node> = BackofficeDetailPageRouteSpec<Node>;\n\nexport const buildTabsItems = <Node>(input: {\n pages: readonly DetailPage<Node>[];\n id: string;\n tApp: TFunction;\n detailPageHref: (id: string, pageId: string) => string;\n}): readonly BackofficeTabItem[] => {\n return input.pages.map((page) => {\n return {\n id: page.id,\n label: page.label(input.tApp),\n to: input.detailPageHref(input.id, page.id),\n };\n });\n};\n","/* eslint-disable no-ternary */\nimport { type JSX, type ReactNode, useContext, useMemo, useState } from 'react';\nimport type { TFunction } from 'i18next';\nimport { useTranslation } from 'react-i18next';\nimport {\n commitMutation,\n type PreloadedQuery,\n useFragment,\n usePreloadedQuery,\n} from 'react-relay';\nimport type { OperationType } from 'relay-runtime';\nimport {\n type MutationPayloadBase,\n resolveMutationOutcome,\n} from '../relay/mutationResult.js';\nimport { setWhereValue } from '@plumile/backoffice-core/filters/where.js';\nimport {\n buildBackofficeFallbackListHref,\n buildBackofficeListHref,\n buildBackofficeListLink,\n} from '@plumile/backoffice-core/state/buildListHref.js';\n\nimport { BACKOFFICE_DATE_TIME_OPTIONS } from '@plumile/backoffice-core/constants.js';\nimport type {\n BackofficeBadgeTone,\n BackofficeDetailBlockSpec,\n BackofficeDetailFieldSpec,\n BackofficeDetailHeaderConfig,\n BackofficeDetailHeaderMetaSpec,\n BackofficeDetailHeaderStatusSpec,\n BackofficeFlagVariant,\n BackofficeEntityActionSpec,\n BackofficeEntityFormMutationActionSpec,\n BackofficeEntityMutationActionSpec,\n BackofficeEntityRouteActionSpec,\n BackofficeInlineValueSpec,\n BackofficeResolvedDetailLayoutFacetConfigBase,\n BackofficeResolvedDetailPageFacetConfig,\n BackofficeResolvedDetailPageFacetConfigBase,\n BackofficeValueLabel,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\nimport {\n BackofficeKeyValueList,\n BackofficePageHeader,\n BackofficeRelationsMenu,\n BackofficeTabs,\n type BackofficeRelationsMenuItem,\n type BackofficeTabItem,\n Button,\n ChatCheckSvg,\n DataTable,\n DetailPageTemplate,\n type EntityHeaderItem,\n FormattedDate,\n HighlightCode,\n KeyOffSvg,\n KeySvg,\n LazyBackofficeJsonViewer,\n LinkButton,\n LockOpenSvg,\n LockSvg,\n RobotCheckSvg,\n RobotXSvg,\n RocketOffSvg,\n RocketSvg,\n SettingsCheckSvg,\n SettingsXSvg,\n ShieldLockSvg,\n ShieldOffSvg,\n Tag,\n useToast,\n XBadgeSvg,\n} from '@plumile/ui';\nimport { HttpRedirect, Link, RoutingContext } from '@plumile/router';\n\nimport { buildDataTableColumns } from '../components/backoffice/columns/buildDataTableColumns.js';\nimport { BackofficeEntityDetailScaffold } from '../components/backoffice/scaffolds/BackofficeEntityDetailScaffold.js';\nimport { BackofficeDetailBadgeRow } from '../components/backoffice/detail/BackofficeDetailBadgeRow.js';\nimport { BackofficeDetailFlagTag } from '../components/backoffice/detail/BackofficeDetailFlagTag.js';\nimport { BackofficeDetailTaggedValue } from '../components/backoffice/detail/BackofficeDetailTaggedValue.js';\nimport { BackofficeDetailPayload } from '../components/backoffice/detail/BackofficeDetailPayload.js';\nimport { BackofficeDetailErrorList } from '../components/backoffice/detail/BackofficeDetailErrorList.js';\nimport { BackofficeDetailRelationListBlock } from '../components/backoffice/detail/BackofficeDetailRelationListBlock.js';\nimport { BackofficeDetailSection } from '../components/backoffice/detail/BackofficeDetailSection.js';\nimport { LazyBackofficeEntityActionFormDialog } from '../components/backoffice/actions/LazyBackofficeEntityActionFormDialog.js';\nimport {\n resolveToastSpec,\n resolveToastViewActions,\n} from '../components/backoffice/actions/toastViewAction.js';\nimport * as pageStyles from './backofficeEntityDetailPage.css.js';\nimport type { BackofficeDetailFieldProps } from '../components/backoffice/detail/BackofficeDetailField.js';\nimport { useBackofficeFormats } from '../i18n/useBackofficeFormats.js';\nimport { useBackofficeReactTranslation } from '../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeConfig } from '../provider/BackofficeConfigContext.js';\nimport { useRelayEnvironment } from '../relay/useRelayEnvironment.js';\nimport { useBackofficeEntityDetailLayoutContext } from './detail/BackofficeEntityDetailLayoutContext.js';\nimport { buildTabsItems } from './detail/buildTabsItems.js';\nimport { resolveVisibleDetailPages } from './detail/pageResolution.js';\nimport { BackofficeRightPageLayout } from '../components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js';\nimport { buildEntityDetailBreadcrumb } from '../components/backoffice/layout/breadcrumb/buildBreadcrumbs.js';\n\nexport type BackofficeEntityDetailPageProps = {\n config: BackofficeResolvedDetailLayoutFacetConfigBase;\n prepared: {\n id: string;\n detailId?: string;\n pageConfig: BackofficeResolvedDetailPageFacetConfigBase;\n pageQuery: PreloadedQuery<OperationType>;\n pageId: string;\n pagePath: string;\n };\n};\n\nconst resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => {\n return typeof value === 'object' && value != null && !Array.isArray(value);\n};\n\nconst assertNever = (value: never): never => {\n throw new Error(`Unexpected value: ${String(value)}`);\n};\n\ntype FlagTagSpec = {\n tone: 'neutral' | 'info' | 'success' | 'warning' | 'danger';\n label: string;\n icon?: JSX.Element;\n};\n\nconst resolveFlagTag = (\n variant: BackofficeFlagVariant,\n value: boolean,\n t: TFunction,\n): FlagTagSpec => {\n const iconSize = 14;\n\n switch (variant) {\n case 'yesNo': {\n if (value) {\n return {\n tone: 'success',\n label: t('common.boolean.yes'),\n };\n }\n return {\n tone: 'neutral',\n label: t('common.boolean.no'),\n };\n }\n case 'capability': {\n if (value) {\n return {\n tone: 'success',\n label: t('flags.capability.allowed'),\n icon: (\n <ShieldLockSvg\n width={iconSize}\n height={iconSize}\n aria-hidden=\"true\"\n />\n ),\n };\n }\n return {\n tone: 'neutral',\n label: t('flags.capability.denied'),\n icon: (\n <ShieldOffSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n ),\n };\n }\n case 'enabled': {\n if (value) {\n return {\n tone: 'success',\n label: t('flags.enabled.enabled'),\n icon: (\n <SettingsCheckSvg\n width={iconSize}\n height={iconSize}\n aria-hidden=\"true\"\n />\n ),\n };\n }\n return {\n tone: 'neutral',\n label: t('flags.enabled.disabled'),\n icon: (\n <SettingsXSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n ),\n };\n }\n case 'failure': {\n if (value) {\n return {\n tone: 'danger',\n label: t('flags.failure.failed'),\n icon: (\n <XBadgeSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n ),\n };\n }\n return {\n tone: 'success',\n label: t('flags.failure.ok'),\n icon: (\n <ChatCheckSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n ),\n };\n }\n case 'encrypted': {\n if (value) {\n return {\n tone: 'info',\n label: t('flags.encrypted.encrypted'),\n icon: (\n <KeySvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n ),\n };\n }\n return {\n tone: 'neutral',\n label: t('flags.encrypted.notEncrypted'),\n icon: (\n <KeyOffSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n ),\n };\n }\n case 'locked': {\n if (value) {\n return {\n tone: 'warning',\n label: t('flags.locked.locked'),\n icon: (\n <LockSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n ),\n };\n }\n return {\n tone: 'success',\n label: t('flags.locked.unlocked'),\n icon: (\n <LockOpenSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n ),\n };\n }\n case 'default': {\n if (value) {\n return {\n tone: 'info',\n label: t('flags.default.default'),\n };\n }\n return {\n tone: 'neutral',\n label: t('flags.default.notDefault'),\n };\n }\n case 'agentManaged': {\n if (value) {\n return {\n tone: 'info',\n label: t('flags.agentManaged.agentManaged'),\n icon: (\n <RobotCheckSvg\n width={iconSize}\n height={iconSize}\n aria-hidden=\"true\"\n />\n ),\n };\n }\n return {\n tone: 'neutral',\n label: t('flags.agentManaged.userManaged'),\n icon: (\n <RobotXSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n ),\n };\n }\n case 'deployedProduction': {\n if (value) {\n return {\n tone: 'success',\n label: t('flags.deployedProduction.deployed'),\n icon: (\n <RocketSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n ),\n };\n }\n return {\n tone: 'neutral',\n label: t('flags.deployedProduction.notDeployed'),\n icon: (\n <RocketOffSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n ),\n };\n }\n case 'forced': {\n if (value) {\n return {\n tone: 'warning',\n label: t('flags.forced.forced'),\n };\n }\n return {\n tone: 'neutral',\n label: t('flags.forced.normal'),\n };\n }\n default:\n return assertNever(variant);\n }\n};\n\nconst extractMutationPayload = (\n response: unknown,\n): MutationPayloadBase | null => {\n if (!isPlainObject(response)) {\n return null;\n }\n\n for (const value of Object.values(response)) {\n if (isPlainObject(value) && ('status' in value || 'result' in value)) {\n return value as MutationPayloadBase;\n }\n }\n\n return null;\n};\n\nconst isRouteAction = <Node,>(\n action: BackofficeEntityActionSpec<Node>,\n): action is BackofficeEntityRouteActionSpec<Node> => {\n return action.kind === 'route';\n};\n\nconst isMutationAction = <Node,>(\n action: BackofficeEntityActionSpec<Node>,\n): action is BackofficeEntityMutationActionSpec<Node> => {\n return action.kind === 'mutation';\n};\n\nconst isFormMutationAction = <Node,>(\n action: BackofficeEntityActionSpec<Node>,\n): action is BackofficeEntityFormMutationActionSpec<Node> => {\n return action.kind === 'formMutation';\n};\n\nconst resolveValueLabel = (\n value: BackofficeValueLabel | null | undefined,\n tApp: TFunction,\n): string | number | null => {\n if (typeof value === 'function') {\n return value(tApp);\n }\n if (value == null) {\n return null;\n }\n return value;\n};\n\nconst resolveRelationValue = (value: string | null): string | null => {\n if (value == null) {\n return null;\n }\n const trimmed = value.trim();\n if (trimmed === '') {\n return null;\n }\n return trimmed;\n};\n\nconst isEmptyText = (value: string | number | null | undefined): boolean => {\n if (value == null) {\n return true;\n }\n if (typeof value === 'string') {\n return value.trim() === '';\n }\n return false;\n};\n\nconst resolveBadgeTone = <Node,>(\n tone: BackofficeBadgeTone | ((node: Node) => BackofficeBadgeTone) | undefined,\n node: Node,\n): BackofficeBadgeTone | undefined => {\n if (typeof tone === 'function') {\n return tone(node);\n }\n return tone;\n};\n\nconst resolveInlineValue = (\n value: BackofficeInlineValueSpec,\n options: {\n tApp: TFunction;\n t: TFunction;\n resolveEntityHref?: (entityId: string, refId: string) => string | null;\n },\n): ReactNode => {\n const { tApp, t, resolveEntityHref } = options;\n const fallback = t('common.notAvailable');\n\n if (value.type === 'text') {\n const resolved = resolveValueLabel(value.value, tApp);\n return isEmptyText(resolved) ? fallback : resolved;\n }\n\n if (value.type === 'entityRef') {\n const { id } = value;\n if (id == null || id.trim() === '') {\n return fallback;\n }\n const resolvedLabel = resolveValueLabel(value.label, tApp);\n const label =\n resolvedLabel != null && String(resolvedLabel).trim() !== ''\n ? resolvedLabel\n : null;\n if (label == null) {\n return fallback;\n }\n const href = resolveEntityHref?.(value.entity, id) ?? null;\n if (href != null) {\n return <Link to={href}>{label}</Link>;\n }\n return label;\n }\n\n const { href } = value;\n if (href == null || href.trim() === '') {\n return fallback;\n }\n const label = resolveValueLabel(value.label, tApp);\n if (isEmptyText(label)) {\n return fallback;\n }\n return <Link to={href}>{label}</Link>;\n};\n\nconst buildFieldItems = <Node,>(\n fields: readonly BackofficeDetailFieldSpec<Node>[],\n node: Node,\n options: {\n tApp: TFunction;\n t: TFunction;\n resolveEntityHref?: (entityId: string, refId: string) => string | null;\n formatNumber: (value: number | null | undefined) => string;\n formatCurrency: (value: number | null | undefined) => string;\n formatPercent: (value: number | null | undefined) => string;\n relationEntityListRoutes: Record<string, string>;\n resolveRelationItem: (args: {\n id: string;\n label: string;\n count: number | null;\n entityId: string;\n filterId?: string;\n listRoute: string;\n path?: readonly string[];\n value: string;\n where: Record<string, unknown>;\n whereKey: string;\n }) => BackofficeRelationsMenuItem;\n },\n): {\n items: BackofficeDetailFieldProps[];\n relationItems: BackofficeRelationsMenuItem[];\n customNodes: ReactNode[];\n} => {\n const {\n tApp,\n t,\n resolveEntityHref,\n formatNumber,\n formatCurrency,\n formatPercent,\n relationEntityListRoutes,\n resolveRelationItem,\n } = options;\n const items: BackofficeDetailFieldProps[] = [];\n const relationItems: BackofficeRelationsMenuItem[] = [];\n const customNodes: ReactNode[] = [];\n const fallback = t('common.notAvailable');\n\n fields.forEach((field, index) => {\n const id = `${field.type}-${index}`;\n\n switch (field.type) {\n case 'text': {\n const value = resolveValueLabel(field.value(node), tApp);\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value,\n copyValue: field.copyValue?.(node) ?? undefined,\n fullWidth: field.fullWidth,\n });\n break;\n }\n case 'badge': {\n const value = resolveValueLabel(field.value(node), tApp);\n const label = value != null ? String(value) : '';\n const tone = resolveBadgeTone(field.tone, node);\n const badgeNode =\n label.trim() !== '' ? <Tag tone={tone}>{label}</Tag> : null;\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value: badgeNode,\n });\n break;\n }\n case 'badgeRow': {\n const badgeItems = field.items(node).map((item) => {\n const resolvedLabel = resolveValueLabel(item.label, tApp);\n const label = resolvedLabel == null ? '' : String(resolvedLabel);\n return { ...item, label };\n });\n const value =\n badgeItems.length > 0 ? (\n <BackofficeDetailBadgeRow items={badgeItems} />\n ) : null;\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value,\n fullWidth: field.fullWidth,\n });\n break;\n }\n case 'dateTime': {\n const value = field.value(node);\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value: (\n <FormattedDate\n value={value}\n options={BACKOFFICE_DATE_TIME_OPTIONS}\n fallback={t('common.notAvailable')}\n />\n ),\n });\n break;\n }\n case 'number': {\n const value = field.value(node);\n let formatted: string | null = null;\n if (value != null) {\n if (field.format === 'currency') {\n formatted = formatCurrency(value);\n } else if (field.format === 'percent') {\n formatted = formatPercent(value);\n } else {\n formatted = formatNumber(value);\n }\n }\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value: formatted,\n });\n break;\n }\n case 'flag': {\n const value = field.value(node);\n let resolved: ReactNode | null = null;\n if (value != null) {\n const tag = resolveFlagTag(field.variant, value, t);\n resolved = (\n <BackofficeDetailFlagTag\n tone={tag.tone}\n icon={tag.icon}\n label={tag.label}\n />\n );\n }\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value: resolved,\n });\n break;\n }\n case 'entityRef': {\n const idValue = field.id(node);\n let value: ReactNode | null = null;\n if (idValue != null && idValue.trim() !== '') {\n const labelValue = field.value?.(node);\n const label =\n labelValue != null && labelValue.trim() !== '' ? labelValue : null;\n const href = resolveEntityHref?.(field.entity, idValue) ?? null;\n if (label != null) {\n if (href != null) {\n value = <Link to={href}>{label}</Link>;\n } else {\n value = label;\n }\n }\n }\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value: value ?? fallback,\n });\n break;\n }\n case 'link': {\n const href = field.href(node);\n const labelValue = field.value(node);\n const value =\n href != null && href.trim() !== '' && !isEmptyText(labelValue) ? (\n <Link to={href}>{labelValue}</Link>\n ) : null;\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value,\n });\n break;\n }\n case 'taggedValue': {\n const tag = field.tag(node);\n const inlineValue = field.value(node);\n const valueNode = resolveInlineValue(inlineValue, {\n tApp,\n t,\n resolveEntityHref,\n });\n const resolvedTag =\n tag == null\n ? null\n : {\n ...tag,\n label: (() => {\n const labelValue = resolveValueLabel(tag.label, tApp);\n return labelValue == null ? '' : String(labelValue);\n })(),\n };\n const value =\n resolvedTag != null || valueNode != null ? (\n <BackofficeDetailTaggedValue tag={resolvedTag} value={valueNode} />\n ) : null;\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value,\n fullWidth: field.fullWidth,\n });\n break;\n }\n case 'relation': {\n const value = resolveRelationValue(field.value(node));\n if (value == null) {\n break;\n }\n const listRoute = relationEntityListRoutes[field.entity];\n if (listRoute == null) {\n break;\n }\n const labelBase = resolveLabel(field.label, tApp);\n const count = field.count?.(node) ?? null;\n const where = setWhereValue<Record<string, unknown>>(\n null,\n field.whereKey as never,\n value,\n field.path,\n );\n if (where == null) {\n break;\n }\n relationItems.push(\n resolveRelationItem({\n id,\n label: labelBase,\n count,\n entityId: field.entity,\n filterId: field.filterId,\n listRoute,\n path: field.path,\n value,\n where,\n whereKey: field.whereKey,\n }),\n );\n break;\n }\n case 'custom': {\n const custom = field.render(node) as ReactNode;\n if (custom == null) {\n break;\n }\n if (field.label != null) {\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value: custom,\n fullWidth: field.fullWidth,\n });\n break;\n }\n customNodes.push(<div key={id}>{custom}</div>);\n break;\n }\n default:\n break;\n }\n });\n\n return { items, relationItems, customNodes };\n};\n\nconst resolveHeaderMeta = <Node,>(\n meta: BackofficeDetailHeaderMetaSpec<Node>,\n node: Node,\n options: {\n tApp: TFunction;\n t: TFunction;\n resolveEntityHref?: (entityId: string, refId: string) => string | null;\n },\n): ReactNode => {\n const { tApp, t, resolveEntityHref } = options;\n const fallback = t('common.notAvailable');\n\n if (meta.type === 'dateTime') {\n const value = meta.value(node);\n return (\n <FormattedDate\n value={value}\n options={BACKOFFICE_DATE_TIME_OPTIONS}\n fallback={fallback}\n />\n );\n }\n\n if (meta.type === 'entityRef') {\n const idValue = meta.id(node);\n if (idValue == null || idValue.trim() === '') {\n return fallback;\n }\n const labelValue = resolveValueLabel(meta.value?.(node), tApp);\n const label =\n labelValue != null && String(labelValue).trim() !== ''\n ? labelValue\n : null;\n if (label == null) {\n return fallback;\n }\n const href = resolveEntityHref?.(meta.entity, idValue) ?? null;\n if (href != null) {\n return <Link to={href}>{label}</Link>;\n }\n return label;\n }\n\n if (meta.type === 'link') {\n const href = meta.href(node);\n const labelValue = resolveValueLabel(meta.value(node), tApp);\n if (href == null || href.trim() === '' || isEmptyText(labelValue)) {\n return fallback;\n }\n return <Link to={href}>{labelValue}</Link>;\n }\n\n const value = resolveValueLabel(meta.value(node), tApp);\n return isEmptyText(value) ? fallback : value;\n};\n\nconst resolveHeaderStatus = <Node,>(\n status: BackofficeDetailHeaderStatusSpec<Node>,\n node: Node,\n tApp: TFunction,\n): ReactNode | undefined => {\n if (status.type === 'badgeRow') {\n const items = status.items(node).map((item) => {\n const resolvedLabel = resolveValueLabel(item.label, tApp);\n const label = resolvedLabel == null ? '' : String(resolvedLabel);\n return { ...item, label };\n });\n if (items.length === 0) {\n return undefined;\n }\n return <BackofficeDetailBadgeRow items={items} />;\n }\n\n const value = resolveValueLabel(status.value(node), tApp);\n const label = value == null ? '' : String(value);\n if (label.trim() === '') {\n return undefined;\n }\n const tone = resolveBadgeTone(status.tone, node);\n return <Tag tone={tone}>{label}</Tag>;\n};\n\nconst resolveHeaderItems = <Node,>(\n header: BackofficeDetailHeaderConfig<Node>,\n node: Node,\n options: {\n tApp: TFunction;\n t: TFunction;\n resolveEntityHref?: (entityId: string, refId: string) => string | null;\n },\n): {\n title: string;\n subtitle?: ReactNode;\n badges?: ReactNode;\n status?: ReactNode;\n items?: readonly EntityHeaderItem[];\n} => {\n const { tApp, t, resolveEntityHref } = options;\n const resolvedTitle =\n header.titleValue?.(node, tApp) ?? resolveLabel(header.title, tApp);\n const title =\n resolvedTitle.trim() === ''\n ? resolveLabel(header.title, tApp)\n : resolvedTitle;\n\n let subtitleNode: ReactNode | undefined;\n if (header.subtitleItems != null && header.subtitleItems.length > 0) {\n const separator = header.subtitleSeparator ?? ' / ';\n const parts: ReactNode[] = [];\n const { subtitleItems } = header;\n subtitleItems.forEach((item, index) => {\n const valueSpec = item.value(node);\n parts.push(\n <span key={item.id}>\n {resolveInlineValue(valueSpec, {\n tApp,\n t,\n resolveEntityHref,\n })}\n </span>,\n );\n if (index < subtitleItems.length - 1) {\n parts.push(<span key={`${item.id}-sep`}>{separator}</span>);\n }\n });\n subtitleNode = <span>{parts}</span>;\n } else {\n const subtitleValue =\n header.subtitleValue?.(node, tApp) ??\n (header.subtitle != null ? resolveLabel(header.subtitle, tApp) : null);\n subtitleNode =\n subtitleValue != null && subtitleValue.trim() !== ''\n ? subtitleValue\n : undefined;\n }\n\n const badgeNodes: ReactNode[] = [];\n if (header.badges != null) {\n header.badges.forEach((badge, index) => {\n const label = resolveLabel(badge.label, tApp);\n const resolvedValue = resolveValueLabel(badge.value(node), tApp);\n const value = resolvedValue == null ? '' : String(resolvedValue);\n if (value.trim() === '') {\n return;\n }\n const tone = resolveBadgeTone(badge.tone, node);\n badgeNodes.push(\n <Tag key={`${label}-${index}`} tone={tone}>\n {`${label}: ${value}`}\n </Tag>,\n );\n });\n }\n\n let statusNode: ReactNode | undefined;\n if (header.status != null) {\n statusNode = resolveHeaderStatus(header.status, node, tApp);\n }\n\n const items: EntityHeaderItem[] | undefined = header.meta?.map(\n (meta, index) => {\n const label = resolveLabel(meta.label, tApp);\n const valueNode = resolveHeaderMeta(meta, node, {\n tApp,\n t,\n resolveEntityHref,\n });\n return {\n id: `${label}-${index}`,\n label,\n value: valueNode,\n };\n },\n );\n\n return {\n title,\n subtitle: subtitleNode,\n badges: badgeNodes.length > 0 ? <>{badgeNodes}</> : undefined,\n status: statusNode,\n items,\n };\n};\n\nconst renderBlocks = <Node,>(\n blocks: readonly BackofficeDetailBlockSpec<Node>[] | undefined,\n node: Node,\n options: {\n tApp: TFunction;\n t: TFunction;\n resolveEntityHref: (entityId: string, refId: string) => string | null;\n keyPrefix?: string;\n },\n): ReactNode[] => {\n const { tApp, t, resolveEntityHref } = options;\n if (blocks == null || blocks.length === 0) {\n return [];\n }\n\n return blocks.map((block, index) => {\n const key =\n options.keyPrefix != null\n ? `${options.keyPrefix}-${block.kind}-${index}`\n : `${block.kind}-${index}`;\n\n if (block.kind === 'custom') {\n const custom = block.render(node) as ReactNode;\n if (custom == null) {\n return null;\n }\n if (block.label != null) {\n const customTitle = resolveLabel(block.label, tApp);\n return (\n <BackofficeDetailSection key={key} title={customTitle}>\n {custom}\n </BackofficeDetailSection>\n );\n }\n return <div key={key}>{custom}</div>;\n }\n\n const title = resolveLabel(block.label, tApp);\n const description =\n block.description != null\n ? resolveLabel(block.description, tApp)\n : undefined;\n\n if (block.kind === 'relationList') {\n const value = block.value(node);\n return (\n <BackofficeDetailRelationListBlock\n key={key}\n title={title}\n target={block.target}\n whereKey={block.whereKey}\n value={value}\n path={block.path}\n />\n );\n }\n\n if (block.kind === 'table') {\n const rows = block.rows(node);\n const columns = buildDataTableColumns(block.columns, {\n tApp,\n t,\n resolveEntityHref,\n });\n return (\n <BackofficeDetailSection\n key={key}\n title={title}\n description={description}\n >\n <DataTable\n columns={columns}\n rows={rows}\n getRowId={(row, rowIndex) => {\n if (row != null && typeof row === 'object') {\n const record = row as Record<string, unknown>;\n const maybeId = record.id;\n if (typeof maybeId === 'string' && maybeId.trim() !== '') {\n return maybeId;\n }\n }\n return String(rowIndex);\n }}\n />\n </BackofficeDetailSection>\n );\n }\n\n if (block.kind === 'json') {\n const value = block.value(node);\n return (\n <BackofficeDetailSection\n key={key}\n title={title}\n description={description}\n >\n <LazyBackofficeJsonViewer value={value} title={title} />\n </BackofficeDetailSection>\n );\n }\n\n if (block.kind === 'code') {\n const value = block.value(node);\n return (\n <BackofficeDetailSection\n key={key}\n title={title}\n description={description}\n >\n <HighlightCode\n badgeLabel={t('tools.output')}\n copyCode={value}\n fallbackCodeText={value}\n />\n </BackofficeDetailSection>\n );\n }\n\n if (block.kind === 'payload') {\n const value = block.value(node);\n return (\n <BackofficeDetailPayload\n key={key}\n title={title}\n description={description}\n content={value}\n format={block.format}\n />\n );\n }\n\n if (block.kind === 'errorList') {\n const items = block.errors(node);\n return (\n <BackofficeDetailErrorList\n key={key}\n title={title}\n description={description}\n items={items}\n />\n );\n }\n\n const items = block.items.map((item, itemIndex) => {\n const label = resolveLabel(item.label, tApp);\n const resolvedValue = resolveValueLabel(item.value(node), tApp);\n return {\n id: `${label}-${itemIndex}`,\n label,\n value: resolvedValue ?? t('common.notAvailable'),\n };\n });\n\n return (\n <BackofficeDetailSection\n key={key}\n title={title}\n description={description}\n >\n <BackofficeKeyValueList items={items} />\n </BackofficeDetailSection>\n );\n });\n};\n\nconst BackofficeEntityDetailPageContent = ({\n config,\n prepared,\n}: {\n config: BackofficeResolvedDetailPageFacetConfig;\n prepared: {\n pageQuery: PreloadedQuery<OperationType>;\n id: string;\n detailId?: string;\n pageId: string;\n pagePath: string;\n };\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const { formatNumber, formatCurrency, formatPercent } =\n useBackofficeFormats();\n const { entities, entityRegistry } = useBackofficeConfig();\n const { layoutView } = useBackofficeEntityDetailLayoutContext();\n const routing = useContext(RoutingContext);\n const environment = useRelayEnvironment();\n const toast = useToast();\n const [actionState, setActionState] = useState<Record<string, boolean>>({});\n const [activeFormActionId, setActiveFormActionId] = useState<string | null>(\n null,\n );\n const resolvedPages = resolveVisibleDetailPages({\n mainPage: config.pages.mainPage,\n subPages: config.pages.subPages,\n activePagePath: prepared.pagePath,\n node: layoutView as never,\n });\n const activePage = resolvedPages.activePage ?? config.pages.mainPage;\n const pages =\n resolvedPages.pages.length > 0\n ? resolvedPages.pages\n : [config.pages.mainPage];\n\n const setActionLoading = (actionId: string, isLoading: boolean) => {\n setActionState((prev) => {\n if (prev[actionId] === isLoading) {\n return prev;\n }\n return { ...prev, [actionId]: isLoading };\n });\n };\n\n const { page } = config;\n\n const pageQueryData = usePreloadedQuery(page.query, prepared.pageQuery);\n const pageNodeRef = page.resolveNode(pageQueryData as never, {\n id: prepared.id,\n detailId: prepared.detailId,\n });\n if (pageNodeRef == null) {\n throw new HttpRedirect(config.routes.list);\n }\n const resolvedNode = useFragment(page.fragment, pageNodeRef as never);\n const relationEntityListRoutes = useMemo(() => {\n return Object.fromEntries(\n page.content\n .flatMap((block) => {\n if (block.kind !== 'section') {\n return [];\n }\n\n return block.fields.flatMap((field) => {\n if (field.type !== 'relation') {\n return [];\n }\n return [field.entity];\n });\n })\n .flatMap((entityId) => {\n const entityManifest = entities[entityId];\n if (entityManifest?.hasList !== true) {\n return [];\n }\n return [[entityId, entityManifest.routes.list]];\n }),\n ) as Record<string, string>;\n }, [entities, page.content]);\n\n return (\n <BackofficeEntityDetailScaffold\n node={resolvedNode as { __typename: string } | null | undefined}\n render={(node) => {\n const view = page.toView(node);\n const tabsItems = buildTabsItems({\n pages,\n id: prepared.id,\n tApp,\n detailPageHref: config.routes.detailPage,\n });\n const resolveEntityHref = (entityId: string, refId: string) => {\n const entityConfig = entities[entityId];\n if (entityConfig == null) {\n return null;\n }\n return entityConfig.routes.detail(refId);\n };\n const resolveRelationItem = ({\n id,\n label,\n count,\n entityId,\n filterId,\n listRoute,\n path,\n value,\n where,\n whereKey,\n }: {\n id: string;\n label: string;\n count: number | null;\n entityId: string;\n filterId?: string;\n listRoute: string;\n path?: readonly string[];\n value: string;\n where: Record<string, unknown>;\n whereKey: string;\n }): BackofficeRelationsMenuItem => {\n const loadedEntity = entityRegistry.getLoadedListEntity(entityId);\n return {\n id,\n label,\n count,\n href:\n loadedEntity == null\n ? buildBackofficeFallbackListHref(listRoute, where, [\n {\n id:\n filterId ??\n (path == null\n ? whereKey\n : `${whereKey}.${path.join('.')}`),\n value,\n },\n ])\n : buildBackofficeListHref(loadedEntity.config, { where }),\n onClick: async (event) => {\n if (\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\n const listEntity = await entityRegistry.loadListEntity(entityId);\n const next = buildBackofficeListLink(listEntity.config, {\n where,\n });\n\n routing.history.push({\n pathname: next.pathname,\n search: next.search === '' ? '' : `?${next.search}`,\n hash: '',\n });\n },\n };\n };\n\n const header = resolveHeaderItems(config.header, layoutView, {\n tApp,\n t,\n resolveEntityHref,\n });\n const breadcrumb = buildEntityDetailBreadcrumb({\n config,\n tApp,\n entityId: prepared.id,\n layoutView,\n pageLabel: activePage.label(tApp),\n });\n\n const actions = page.actions ?? [];\n let headerActionButtons: ReactNode[] = [];\n if (actions.length > 0) {\n const visibleActions = actions.filter((action) => {\n if (action.isVisible == null) {\n return true;\n }\n return action.isVisible(view);\n });\n\n if (visibleActions.length > 0) {\n headerActionButtons = visibleActions.map((action) => {\n const label = resolveLabel(action.label, tApp);\n const ariaLabel =\n action.ariaLabel != null\n ? resolveLabel(action.ariaLabel, tApp)\n : label;\n const variant = action.variant ?? 'secondary';\n const size = action.size ?? 'small';\n const isLoading = actionState[action.id] ?? false;\n const isDisabled =\n isLoading || action.isDisabled?.(view) === true;\n\n if (isRouteAction(action)) {\n const href = action.to(view);\n return (\n <LinkButton\n key={action.id}\n to={href}\n variant={variant}\n size={size}\n isDisabled={isDisabled}\n aria-label={ariaLabel}\n >\n {label}\n </LinkButton>\n );\n }\n\n if (isFormMutationAction(action)) {\n return (\n <Button\n key={action.id}\n type=\"button\"\n variant={variant}\n size={size}\n isLoading={false}\n disabled={isDisabled}\n onClick={() => {\n setActiveFormActionId(action.id);\n }}\n aria-label={ariaLabel}\n >\n {label}\n </Button>\n );\n }\n\n if (isMutationAction(action)) {\n const handleClick = () => {\n if (isLoading) {\n return;\n }\n const variables = action.getVariables(view);\n setActionLoading(action.id, true);\n commitMutation(environment, {\n mutation: action.mutation,\n variables,\n updater: (store) => {\n action.updater?.(store, view);\n },\n onCompleted: (response) => {\n setActionLoading(action.id, false);\n const mutationPayload = extractMutationPayload(response);\n if (mutationPayload != null) {\n let defaultErrorMessage = t(\n 'actions.form.errors.invalidPayload',\n );\n if (action.toasts?.error?.message != null) {\n defaultErrorMessage = resolveLabel(\n action.toasts.error.message,\n tApp,\n );\n } else if (action.toasts?.error?.title != null) {\n defaultErrorMessage = resolveLabel(\n action.toasts.error.title,\n tApp,\n );\n }\n\n const outcome = resolveMutationOutcome(\n mutationPayload,\n {\n defaultErrorMessage,\n mapReason: (reason) => {\n const mapped = action.mapErrorReason?.(\n reason,\n view,\n );\n if (mapped == null) {\n return null;\n }\n if (typeof mapped === 'function') {\n return resolveLabel(mapped, tApp);\n }\n return String(mapped);\n },\n },\n );\n if (!outcome.ok) {\n const error = new Error(outcome.message);\n action.onError?.(error, view);\n if (action.toasts?.error != null) {\n const toastSpec = resolveToastSpec(\n action.toasts.error,\n tApp,\n );\n toast.error(toastSpec.title, toastSpec.message);\n }\n return;\n }\n }\n\n action.onCompleted?.(response, view);\n if (action.toasts?.success != null) {\n const toastSpec = resolveToastSpec(\n action.toasts.success,\n tApp,\n );\n const toastActions = resolveToastViewActions({\n toast: action.toasts.success,\n response,\n node: view,\n tApp,\n entities,\n defaultLabel: t('actions.view'),\n navigateTo: (to) => {\n routing?.history.push({ pathname: to });\n },\n });\n toast.push({\n kind: 'info',\n title: toastSpec.title,\n message: toastSpec.message,\n actions: toastActions,\n });\n }\n },\n onError: (error) => {\n setActionLoading(action.id, false);\n action.onError?.(error, view);\n if (action.toasts?.error != null) {\n const toastSpec = resolveToastSpec(\n action.toasts.error,\n tApp,\n );\n toast.error(toastSpec.title, toastSpec.message);\n }\n },\n });\n };\n\n return (\n <Button\n key={action.id}\n type=\"button\"\n variant={variant}\n size={size}\n isLoading={isLoading}\n disabled={isDisabled}\n onClick={handleClick}\n aria-label={ariaLabel}\n >\n {label}\n </Button>\n );\n }\n\n return null;\n });\n }\n }\n\n const activeFormAction = actions.find((action) => {\n return action.id === activeFormActionId;\n });\n\n const { content } = page;\n\n const primaryNodes: ReactNode[] = [];\n const secondaryNodes: ReactNode[] = [];\n const relationMenuItems: BackofficeRelationsMenuItem[] = [];\n\n content.forEach((item, index) => {\n const placement = item.placement ?? 'primary';\n const targetNodes =\n placement === 'secondary' ? secondaryNodes : primaryNodes;\n\n if (item.kind === 'section') {\n const sectionLabel = resolveLabel(item.title, tApp);\n const description =\n item.description != null\n ? resolveLabel(item.description, tApp)\n : undefined;\n const { items, relationItems, customNodes } = buildFieldItems(\n item.fields,\n view,\n {\n tApp,\n t,\n resolveEntityHref,\n formatNumber,\n formatCurrency,\n formatPercent,\n relationEntityListRoutes,\n resolveRelationItem,\n },\n );\n relationItems.forEach((relation) => {\n if (\n !relationMenuItems.some((entry) => {\n return entry.id === relation.id;\n })\n ) {\n relationMenuItems.push(relation);\n }\n });\n\n const hasContent = items.length > 0 || customNodes.length > 0;\n\n if (!hasContent) {\n return;\n }\n\n targetNodes.push(\n <BackofficeDetailSection\n key={`${sectionLabel}-${index}`}\n title={sectionLabel}\n description={description}\n items={items.length > 0 ? items : undefined}\n >\n {customNodes}\n </BackofficeDetailSection>,\n );\n return;\n }\n\n const rendered = renderBlocks([item], view, {\n tApp,\n t,\n resolveEntityHref,\n keyPrefix: String(index),\n });\n const blockNode = rendered[0];\n if (blockNode != null) {\n targetNodes.push(blockNode);\n }\n });\n\n const relationsMenuNode =\n relationMenuItems.length > 0 ? (\n <BackofficeRelationsMenu\n label={t('relations.menu.label')}\n items={relationMenuItems}\n />\n ) : null;\n\n const headerActions =\n headerActionButtons.length > 0 || relationsMenuNode != null ? (\n <div className={pageStyles.headerActions}>\n {headerActionButtons}\n {relationsMenuNode}\n </div>\n ) : undefined;\n\n const headerMetaNode =\n header.status != null || header.badges != null ? (\n <div className={pageStyles.headerMeta}>\n {header.status}\n {header.badges}\n </div>\n ) : undefined;\n\n const headerItemsNode =\n header.items != null && header.items.length > 0 ? (\n <div className={pageStyles.headerMetaList}>\n <BackofficeKeyValueList items={header.items} />\n </div>\n ) : null;\n\n const hasAside = secondaryNodes.length > 0;\n let tabsNode: JSX.Element | null = null;\n if (pages.length > 1) {\n tabsNode = (\n <BackofficeTabs\n items={tabsItems as BackofficeTabItem[]}\n activeId={activePage.id}\n onChange={() => {}}\n />\n );\n }\n const headerNode = (\n <div className={pageStyles.headerBlock}>\n <BackofficePageHeader\n title={header.title}\n subtitle={header.subtitle}\n actions={headerActions}\n meta={headerMetaNode}\n />\n {headerItemsNode}\n </div>\n );\n\n return (\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <DetailPageTemplate\n headerNode={headerNode}\n tabsNode={tabsNode}\n sidePanel={hasAside ? <>{secondaryNodes}</> : undefined}\n sidePanelVariant=\"plain\"\n >\n <>{primaryNodes}</>\n </DetailPageTemplate>\n {activeFormAction != null &&\n isFormMutationAction(activeFormAction) && (\n <LazyBackofficeEntityActionFormDialog\n isOpen\n action={activeFormAction}\n node={view}\n onClose={() => {\n setActiveFormActionId(null);\n }}\n />\n )}\n </BackofficeRightPageLayout>\n );\n }}\n />\n );\n};\n\nexport const BackofficeEntityDetailPage = ({\n config,\n prepared,\n}: BackofficeEntityDetailPageProps): JSX.Element => {\n const { layoutView } = useBackofficeEntityDetailLayoutContext();\n\n const resolvedPages = resolveVisibleDetailPages({\n mainPage: config.pages.mainPage,\n subPages: config.pages.subPages,\n activePagePath: prepared.pagePath,\n node: layoutView as never,\n });\n\n if (!resolvedPages.hasVisiblePages || resolvedPages.activePage == null) {\n throw new HttpRedirect(config.routes.list);\n }\n\n if (resolvedPages.activePage.id !== prepared.pageId) {\n throw new HttpRedirect(\n config.routes.detailPage(prepared.id, resolvedPages.activePage.id),\n );\n }\n\n return (\n <BackofficeEntityDetailPageContent\n config={prepared.pageConfig}\n prepared={prepared}\n />\n );\n};\n\nexport default BackofficeEntityDetailPage;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BackofficeEntityDetailPage-BljQmWsw.js","names":[],"sources":["../../src/components/backoffice/scaffolds/BackofficeEntityDetailScaffold.tsx","../../src/components/backoffice/detail/BackofficeDetailFlagTag.css.ts","../../src/components/backoffice/detail/BackofficeDetailFlagTag.tsx","../../src/components/backoffice/detail/backofficeDetailTaggedValue.css.ts","../../src/components/backoffice/detail/BackofficeDetailTaggedValue.tsx","../../src/components/backoffice/detail/backofficeDetailErrorList.css.ts","../../src/components/backoffice/detail/BackofficeDetailErrorList.tsx","../../src/components/backoffice/detail/BackofficeDetailRelationListBlock.tsx","../../src/pages/backofficeEntityDetailPage.css.ts","../../src/i18n/useBackofficeFormats.ts","../../src/pages/detail/buildTabsItems.ts","../../src/pages/BackofficeEntityDetailPage.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\n\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\n\nexport type BackofficeEntityDetailScaffoldProps<\n NodeUnion extends { __typename: string },\n> = {\n node: NodeUnion | null | undefined;\n render: (node: NodeUnion) => JSX.Element | null;\n notFound?: ReactNode;\n};\n\nexport const BackofficeEntityDetailScaffold = <\n NodeUnion extends { __typename: string },\n>({\n node,\n render,\n notFound,\n}: BackofficeEntityDetailScaffoldProps<NodeUnion>): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n const resolvedNotFound = notFound ?? t('detail.notFound');\n if (node == null) {\n return <>{resolvedNotFound}</>;\n }\n\n const content = render(node);\n if (content == null) {\n return <>{resolvedNotFound}</>;\n }\n\n return content;\n};\n\nexport default BackofficeEntityDetailScaffold;\n","import { style } from '@vanilla-extract/css';\n\nimport { sprinkles } from '@plumile/ui';\n\nexport const content = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n});\n\nexport const icon = style([\n sprinkles({\n display: 'flex',\n alignItems: 'center',\n }),\n {\n flex: '0 0 auto',\n },\n]);\n\nexport const label = style({\n flex: '0 1 auto',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { Tag, type TagTone } from '@plumile/ui';\n\nimport * as styles from './BackofficeDetailFlagTag.css.js';\n\nexport type BackofficeDetailFlagTagProps = {\n tone: TagTone;\n icon?: ReactNode;\n label: string;\n};\n\nexport const BackofficeDetailFlagTag = ({\n tone,\n icon,\n label,\n}: BackofficeDetailFlagTagProps): JSX.Element => {\n const hasIcon = icon != null;\n let iconNode: ReactNode | null = null;\n if (hasIcon) {\n iconNode = <span className={styles.icon}>{icon}</span>;\n }\n\n return (\n <Tag tone={tone}>\n <span className={styles.content}>\n {iconNode}\n <span className={styles.label}>{label}</span>\n </span>\n </Tag>\n );\n};\n\nexport default BackofficeDetailFlagTag;\n","import { sprinkles } from '@plumile/ui';\n\nexport const container = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n gap: 2,\n flexWrap: 'wrap',\n});\n\nexport const value = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n gap: 1,\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport type { BackofficeBadgeTone } from '@plumile/backoffice-core/types.js';\nimport { Tag } from '@plumile/ui';\n\nimport * as styles from './backofficeDetailTaggedValue.css.js';\n\nexport type BackofficeDetailTaggedValueProps = {\n tag: { label: string; tone?: BackofficeBadgeTone } | null;\n value: ReactNode;\n};\n\nexport const BackofficeDetailTaggedValue = ({\n tag,\n value,\n}: BackofficeDetailTaggedValueProps): JSX.Element => {\n return (\n <span className={styles.container}>\n {tag != null && <Tag tone={tag.tone}>{tag.label}</Tag>}\n <span className={styles.value}>{value}</span>\n </span>\n );\n};\n\nexport default BackofficeDetailTaggedValue;\n","import { sprinkles } from '@plumile/ui';\n\nexport const list = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n});\n\nexport const item = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n padding: 3,\n borderRadius: 'xl',\n});\n\nexport const itemSurface = sprinkles({\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'borderSubtle',\n backgroundColor: 'surfaceMuted',\n});\n\nexport const header = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n});\n\nexport const code = sprinkles({\n fontFamily: 'mono',\n fontSize: 'sm',\n color: 'textMuted',\n});\n\nexport const message = sprinkles({\n fontWeight: 'semibold',\n});\n\nexport const details = sprinkles({\n fontSize: 'sm',\n});\n","import { type JSX } from 'react';\n\nimport { LazyMarkdownRenderer, cx } from '@plumile/ui';\n\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport { BackofficeDetailSection } from './BackofficeDetailSection.js';\nimport { formatJsonPayload } from './detailPayloadUtils.js';\n\nimport * as styles from './backofficeDetailErrorList.css.js';\n\nexport type BackofficeDetailErrorItem = {\n code: string;\n message: string;\n details?: unknown;\n};\n\nexport type BackofficeDetailErrorListProps = {\n title: string;\n description?: string;\n items: readonly BackofficeDetailErrorItem[];\n};\n\nexport const BackofficeDetailErrorList = ({\n title,\n description,\n items,\n}: BackofficeDetailErrorListProps): JSX.Element | null => {\n const { t } = useBackofficeReactTranslation();\n\n if (items.length === 0) {\n return null;\n }\n\n return (\n <BackofficeDetailSection title={title} description={description}>\n <div className={styles.list}>\n {items.map((error, index) => {\n let details = t('common.notAvailable');\n if (error.details != null) {\n details = formatJsonPayload(error.details);\n }\n return (\n <div\n key={`${error.code}-${index}`}\n className={cx(styles.item, styles.itemSurface)}\n >\n <div className={styles.header}>\n <span className={styles.code}>{error.code}</span>\n <span className={styles.message}>{error.message}</span>\n </div>\n <div className={styles.details}>\n <LazyMarkdownRenderer content={details} />\n </div>\n </div>\n );\n })}\n </div>\n </BackofficeDetailSection>\n );\n};\n\nexport default BackofficeDetailErrorList;\n","/* eslint-disable react-hooks/rules-of-hooks */\nimport { 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 BackofficeResolvedListFacetConfig,\n} from '@plumile/backoffice-core/types.js';\nimport { BackofficeTableSkeleton } 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 target: string;\n whereKey: string;\n value: string | null;\n path?: readonly string[];\n};\n\ntype RelationListContentProps = {\n title: string;\n config: BackofficeResolvedListFacetConfig;\n entities: ReturnType<typeof useBackofficeConfig>['entities'];\n whereKey: string;\n value: string | null;\n path?: readonly string[];\n};\n\ntype RelationListBlockBodyProps = {\n title: string;\n targetId: string;\n whereKey: string;\n value: string | null;\n path?: readonly string[];\n};\n\nconst RelationListContent = ({\n title,\n config,\n entities,\n whereKey,\n value,\n path,\n}: RelationListContentProps): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n if (config.list.kind === 'records') {\n return null;\n }\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 whereKey as never,\n value,\n path,\n );\n }, [path, state.where, value, whereKey]);\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 if (listConfig.buildVariables != null) {\n return listConfig.buildVariables(variablesBase as never);\n }\n return variablesBase;\n }, [listConfig, variablesBase]);\n\n const queryData = useLazyLoadQuery<OperationType>(\n listConfig.query,\n variables as never,\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 as never);\n },\n [listConfig],\n );\n\n const defaults = useMemo(() => {\n const baseWhere = relationWhere ?? (listDefaults.where as never);\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: refetch as never,\n variables: variablesBase as never,\n defaults: defaults as never,\n fetchPolicy: BACKOFFICE_LIST_REFETCH_POLICY,\n buildVariables: listConfig.buildVariables as never,\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 as never);\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 targetId,\n whereKey,\n value,\n path,\n}: RelationListBlockBodyProps): JSX.Element | null => {\n const { entities } = useBackofficeConfig();\n const relatedEntityIds = useMemo(() => {\n return [targetId];\n }, [targetId]);\n const relatedEntitiesState =\n useBackofficeListEntitiesLoader(relatedEntityIds);\n\n if (relatedEntitiesState.status === 'loading') {\n return <BackofficeTableSkeleton rows={6} />;\n }\n\n if (relatedEntitiesState.status === 'error') {\n return null;\n }\n\n const config = relatedEntitiesState.modules[targetId]?.config;\n if (config == null) {\n return null;\n }\n\n return (\n <RelationListContent\n title={title}\n config={config}\n entities={entities}\n whereKey={whereKey}\n value={value}\n path={path}\n />\n );\n};\n\nexport const BackofficeDetailRelationListBlock = ({\n title,\n target,\n whereKey,\n value,\n path,\n}: BackofficeDetailRelationListBlockProps): JSX.Element => {\n return (\n <BackofficeErrorBoundary\n fallback={() => {\n return <BackofficeTableSkeleton rows={6} />;\n }}\n >\n <Suspense fallback={<BackofficeTableSkeleton rows={6} />}>\n <RelationListBlockBody\n title={title}\n targetId={target}\n whereKey={whereKey}\n value={value}\n path={path}\n />\n </Suspense>\n </BackofficeErrorBoundary>\n );\n};\n\nexport default BackofficeDetailRelationListBlock;\n","import { sprinkles } from '@plumile/ui';\n\nexport const headerActions = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n flexWrap: 'wrap',\n});\n\nexport const headerBlock = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n});\n\nexport const headerMeta = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n flexWrap: 'wrap',\n});\n\nexport const headerMetaList = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n});\n","import { useBackofficeReactTranslation } from './useBackofficeReactTranslation.js';\n\nexport type BackofficeFormats = {\n formatNumber: (value: number | null | undefined) => string;\n formatCurrency: (value: number | null | undefined) => string;\n formatPercent: (value: number | null | undefined) => string;\n};\n\n/**\n *\n */\nexport function useBackofficeFormats(): BackofficeFormats {\n const { t } = useBackofficeReactTranslation();\n\n /**\n *\n */\n function formatNumber(value: number | null | undefined): string {\n return t('format.number', { value });\n }\n\n /**\n *\n */\n function formatCurrency(value: number | null | undefined): string {\n return t('format.currency', { value });\n }\n\n /**\n *\n */\n function formatPercent(value: number | null | undefined): string {\n return t('format.percent', { value });\n }\n\n return { formatNumber, formatCurrency, formatPercent };\n}\n","import type { BackofficeDetailPageRouteSpec } from '@plumile/backoffice-core/types.js';\nimport type { BackofficeTabItem } from '@plumile/ui';\nimport type { TFunction } from 'i18next';\n\ntype DetailPage<Node> = BackofficeDetailPageRouteSpec<Node>;\n\nexport const buildTabsItems = <Node>(input: {\n pages: readonly DetailPage<Node>[];\n id: string;\n tApp: TFunction;\n detailPageHref: (id: string, pageId: string) => string;\n}): readonly BackofficeTabItem[] => {\n return input.pages.map((page) => {\n return {\n id: page.id,\n label: page.label(input.tApp),\n to: input.detailPageHref(input.id, page.id),\n };\n });\n};\n","/* eslint-disable no-ternary */\nimport { type JSX, type ReactNode, useContext, useMemo, useState } from 'react';\nimport type { TFunction } from 'i18next';\nimport { useTranslation } from 'react-i18next';\nimport {\n commitMutation,\n type PreloadedQuery,\n useFragment,\n usePreloadedQuery,\n} from 'react-relay';\nimport type { OperationType } from 'relay-runtime';\nimport {\n type MutationPayloadBase,\n resolveMutationOutcome,\n} from '../relay/mutationResult.js';\nimport { setWhereValue } from '@plumile/backoffice-core/filters/where.js';\nimport {\n buildBackofficeFallbackListHref,\n buildBackofficeListHref,\n buildBackofficeListLink,\n} from '@plumile/backoffice-core/state/buildListHref.js';\n\nimport { BACKOFFICE_DATE_TIME_OPTIONS } from '@plumile/backoffice-core/constants.js';\nimport type {\n BackofficeBadgeTone,\n BackofficeDetailBlockSpec,\n BackofficeDetailFieldSpec,\n BackofficeDetailHeaderConfig,\n BackofficeDetailHeaderMetaSpec,\n BackofficeDetailHeaderStatusSpec,\n BackofficeFlagVariant,\n BackofficeEntityActionSpec,\n BackofficeEntityFormMutationActionSpec,\n BackofficeEntityMutationActionSpec,\n BackofficeEntityRouteActionSpec,\n BackofficeInlineValueSpec,\n BackofficeResolvedDetailLayoutFacetConfigBase,\n BackofficeResolvedDetailPageFacetConfig,\n BackofficeResolvedDetailPageFacetConfigBase,\n BackofficeValueLabel,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\nimport {\n BackofficeKeyValueList,\n BackofficePageHeader,\n BackofficeRelationsMenu,\n BackofficeTabs,\n type BackofficeRelationsMenuItem,\n type BackofficeTabItem,\n Button,\n ChatCheckSvg,\n DataTable,\n DetailPageTemplate,\n type EntityHeaderItem,\n FormattedDate,\n HighlightCode,\n KeyOffSvg,\n KeySvg,\n LazyBackofficeJsonViewer,\n LinkButton,\n LockOpenSvg,\n LockSvg,\n RobotCheckSvg,\n RobotXSvg,\n RocketOffSvg,\n RocketSvg,\n SettingsCheckSvg,\n SettingsXSvg,\n ShieldLockSvg,\n ShieldOffSvg,\n Tag,\n useToast,\n XBadgeSvg,\n} from '@plumile/ui';\nimport { HttpRedirect, Link, RoutingContext } from '@plumile/router';\n\nimport { buildDataTableColumns } from '../components/backoffice/columns/buildDataTableColumns.js';\nimport { BackofficeEntityDetailScaffold } from '../components/backoffice/scaffolds/BackofficeEntityDetailScaffold.js';\nimport { BackofficeDetailBadgeRow } from '../components/backoffice/detail/BackofficeDetailBadgeRow.js';\nimport { BackofficeDetailFlagTag } from '../components/backoffice/detail/BackofficeDetailFlagTag.js';\nimport { BackofficeDetailTaggedValue } from '../components/backoffice/detail/BackofficeDetailTaggedValue.js';\nimport { BackofficeDetailPayload } from '../components/backoffice/detail/BackofficeDetailPayload.js';\nimport { BackofficeDetailErrorList } from '../components/backoffice/detail/BackofficeDetailErrorList.js';\nimport { BackofficeDetailRelationListBlock } from '../components/backoffice/detail/BackofficeDetailRelationListBlock.js';\nimport { BackofficeDetailSection } from '../components/backoffice/detail/BackofficeDetailSection.js';\nimport { LazyBackofficeEntityActionFormDialog } from '../components/backoffice/actions/LazyBackofficeEntityActionFormDialog.js';\nimport {\n resolveToastSpec,\n resolveToastViewActions,\n} from '../components/backoffice/actions/toastViewAction.js';\nimport * as pageStyles from './backofficeEntityDetailPage.css.js';\nimport type { BackofficeDetailFieldProps } from '../components/backoffice/detail/BackofficeDetailField.js';\nimport { useBackofficeFormats } from '../i18n/useBackofficeFormats.js';\nimport { useBackofficeReactTranslation } from '../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeConfig } from '../provider/BackofficeConfigContext.js';\nimport { useRelayEnvironment } from '../relay/useRelayEnvironment.js';\nimport { useBackofficeEntityDetailLayoutContext } from './detail/BackofficeEntityDetailLayoutContext.js';\nimport { buildTabsItems } from './detail/buildTabsItems.js';\nimport { resolveVisibleDetailPages } from './detail/pageResolution.js';\nimport { BackofficeRightPageLayout } from '../components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js';\nimport { buildEntityDetailBreadcrumb } from '../components/backoffice/layout/breadcrumb/buildBreadcrumbs.js';\n\nexport type BackofficeEntityDetailPageProps = {\n config: BackofficeResolvedDetailLayoutFacetConfigBase;\n prepared: {\n id: string;\n detailId?: string;\n pageConfig: BackofficeResolvedDetailPageFacetConfigBase;\n pageQuery: PreloadedQuery<OperationType>;\n pageId: string;\n pagePath: string;\n };\n};\n\nconst resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => {\n return typeof value === 'object' && value != null && !Array.isArray(value);\n};\n\nconst assertNever = (value: never): never => {\n throw new Error(`Unexpected value: ${String(value)}`);\n};\n\ntype FlagTagSpec = {\n tone: 'neutral' | 'info' | 'success' | 'warning' | 'danger';\n label: string;\n icon?: JSX.Element;\n};\n\nconst resolveFlagTag = (\n variant: BackofficeFlagVariant,\n value: boolean,\n t: TFunction,\n): FlagTagSpec => {\n const iconSize = 14;\n\n switch (variant) {\n case 'yesNo': {\n if (value) {\n return {\n tone: 'success',\n label: t('common.boolean.yes'),\n };\n }\n return {\n tone: 'neutral',\n label: t('common.boolean.no'),\n };\n }\n case 'capability': {\n if (value) {\n return {\n tone: 'success',\n label: t('flags.capability.allowed'),\n icon: (\n <ShieldLockSvg\n width={iconSize}\n height={iconSize}\n aria-hidden=\"true\"\n />\n ),\n };\n }\n return {\n tone: 'neutral',\n label: t('flags.capability.denied'),\n icon: (\n <ShieldOffSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n ),\n };\n }\n case 'enabled': {\n if (value) {\n return {\n tone: 'success',\n label: t('flags.enabled.enabled'),\n icon: (\n <SettingsCheckSvg\n width={iconSize}\n height={iconSize}\n aria-hidden=\"true\"\n />\n ),\n };\n }\n return {\n tone: 'neutral',\n label: t('flags.enabled.disabled'),\n icon: (\n <SettingsXSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n ),\n };\n }\n case 'failure': {\n if (value) {\n return {\n tone: 'danger',\n label: t('flags.failure.failed'),\n icon: (\n <XBadgeSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n ),\n };\n }\n return {\n tone: 'success',\n label: t('flags.failure.ok'),\n icon: (\n <ChatCheckSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n ),\n };\n }\n case 'encrypted': {\n if (value) {\n return {\n tone: 'info',\n label: t('flags.encrypted.encrypted'),\n icon: (\n <KeySvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n ),\n };\n }\n return {\n tone: 'neutral',\n label: t('flags.encrypted.notEncrypted'),\n icon: (\n <KeyOffSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n ),\n };\n }\n case 'locked': {\n if (value) {\n return {\n tone: 'warning',\n label: t('flags.locked.locked'),\n icon: (\n <LockSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n ),\n };\n }\n return {\n tone: 'success',\n label: t('flags.locked.unlocked'),\n icon: (\n <LockOpenSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n ),\n };\n }\n case 'default': {\n if (value) {\n return {\n tone: 'info',\n label: t('flags.default.default'),\n };\n }\n return {\n tone: 'neutral',\n label: t('flags.default.notDefault'),\n };\n }\n case 'agentManaged': {\n if (value) {\n return {\n tone: 'info',\n label: t('flags.agentManaged.agentManaged'),\n icon: (\n <RobotCheckSvg\n width={iconSize}\n height={iconSize}\n aria-hidden=\"true\"\n />\n ),\n };\n }\n return {\n tone: 'neutral',\n label: t('flags.agentManaged.userManaged'),\n icon: (\n <RobotXSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n ),\n };\n }\n case 'deployedProduction': {\n if (value) {\n return {\n tone: 'success',\n label: t('flags.deployedProduction.deployed'),\n icon: (\n <RocketSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n ),\n };\n }\n return {\n tone: 'neutral',\n label: t('flags.deployedProduction.notDeployed'),\n icon: (\n <RocketOffSvg width={iconSize} height={iconSize} aria-hidden=\"true\" />\n ),\n };\n }\n case 'forced': {\n if (value) {\n return {\n tone: 'warning',\n label: t('flags.forced.forced'),\n };\n }\n return {\n tone: 'neutral',\n label: t('flags.forced.normal'),\n };\n }\n default:\n return assertNever(variant);\n }\n};\n\nconst extractMutationPayload = (\n response: unknown,\n): MutationPayloadBase | null => {\n if (!isPlainObject(response)) {\n return null;\n }\n\n for (const value of Object.values(response)) {\n if (isPlainObject(value) && ('status' in value || 'result' in value)) {\n return value as MutationPayloadBase;\n }\n }\n\n return null;\n};\n\nconst isRouteAction = <Node,>(\n action: BackofficeEntityActionSpec<Node>,\n): action is BackofficeEntityRouteActionSpec<Node> => {\n return action.kind === 'route';\n};\n\nconst isMutationAction = <Node,>(\n action: BackofficeEntityActionSpec<Node>,\n): action is BackofficeEntityMutationActionSpec<Node> => {\n return action.kind === 'mutation';\n};\n\nconst isFormMutationAction = <Node,>(\n action: BackofficeEntityActionSpec<Node>,\n): action is BackofficeEntityFormMutationActionSpec<Node> => {\n return action.kind === 'formMutation';\n};\n\nconst resolveValueLabel = (\n value: BackofficeValueLabel | null | undefined,\n tApp: TFunction,\n): string | number | null => {\n if (typeof value === 'function') {\n return value(tApp);\n }\n if (value == null) {\n return null;\n }\n return value;\n};\n\nconst resolveRelationValue = (value: string | null): string | null => {\n if (value == null) {\n return null;\n }\n const trimmed = value.trim();\n if (trimmed === '') {\n return null;\n }\n return trimmed;\n};\n\nconst isEmptyText = (value: string | number | null | undefined): boolean => {\n if (value == null) {\n return true;\n }\n if (typeof value === 'string') {\n return value.trim() === '';\n }\n return false;\n};\n\nconst resolveBadgeTone = <Node,>(\n tone: BackofficeBadgeTone | ((node: Node) => BackofficeBadgeTone) | undefined,\n node: Node,\n): BackofficeBadgeTone | undefined => {\n if (typeof tone === 'function') {\n return tone(node);\n }\n return tone;\n};\n\nconst resolveInlineValue = (\n value: BackofficeInlineValueSpec,\n options: {\n tApp: TFunction;\n t: TFunction;\n resolveEntityHref?: (entityId: string, refId: string) => string | null;\n },\n): ReactNode => {\n const { tApp, t, resolveEntityHref } = options;\n const fallback = t('common.notAvailable');\n\n if (value.type === 'text') {\n const resolved = resolveValueLabel(value.value, tApp);\n return isEmptyText(resolved) ? fallback : resolved;\n }\n\n if (value.type === 'entityRef') {\n const { id } = value;\n if (id == null || id.trim() === '') {\n return fallback;\n }\n const resolvedLabel = resolveValueLabel(value.label, tApp);\n const label =\n resolvedLabel != null && String(resolvedLabel).trim() !== ''\n ? resolvedLabel\n : null;\n if (label == null) {\n return fallback;\n }\n const href = resolveEntityHref?.(value.entity, id) ?? null;\n if (href != null) {\n return <Link to={href}>{label}</Link>;\n }\n return label;\n }\n\n const { href } = value;\n if (href == null || href.trim() === '') {\n return fallback;\n }\n const label = resolveValueLabel(value.label, tApp);\n if (isEmptyText(label)) {\n return fallback;\n }\n return <Link to={href}>{label}</Link>;\n};\n\nconst buildFieldItems = <Node,>(\n fields: readonly BackofficeDetailFieldSpec<Node>[],\n node: Node,\n options: {\n tApp: TFunction;\n t: TFunction;\n resolveEntityHref?: (entityId: string, refId: string) => string | null;\n formatNumber: (value: number | null | undefined) => string;\n formatCurrency: (value: number | null | undefined) => string;\n formatPercent: (value: number | null | undefined) => string;\n relationEntityListRoutes: Record<string, string>;\n resolveRelationItem: (args: {\n id: string;\n label: string;\n count: number | null;\n entityId: string;\n filterId?: string;\n listRoute: string;\n path?: readonly string[];\n value: string;\n where: Record<string, unknown>;\n whereKey: string;\n }) => BackofficeRelationsMenuItem;\n },\n): {\n items: BackofficeDetailFieldProps[];\n relationItems: BackofficeRelationsMenuItem[];\n customNodes: ReactNode[];\n} => {\n const {\n tApp,\n t,\n resolveEntityHref,\n formatNumber,\n formatCurrency,\n formatPercent,\n relationEntityListRoutes,\n resolveRelationItem,\n } = options;\n const items: BackofficeDetailFieldProps[] = [];\n const relationItems: BackofficeRelationsMenuItem[] = [];\n const customNodes: ReactNode[] = [];\n const fallback = t('common.notAvailable');\n\n fields.forEach((field, index) => {\n const id = `${field.type}-${index}`;\n\n switch (field.type) {\n case 'text': {\n const value = resolveValueLabel(field.value(node), tApp);\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value,\n copyValue: field.copyValue?.(node) ?? undefined,\n fullWidth: field.fullWidth,\n });\n break;\n }\n case 'badge': {\n const value = resolveValueLabel(field.value(node), tApp);\n const label = value != null ? String(value) : '';\n const tone = resolveBadgeTone(field.tone, node);\n const badgeNode =\n label.trim() !== '' ? <Tag tone={tone}>{label}</Tag> : null;\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value: badgeNode,\n });\n break;\n }\n case 'badgeRow': {\n const badgeItems = field.items(node).map((item) => {\n const resolvedLabel = resolveValueLabel(item.label, tApp);\n const label = resolvedLabel == null ? '' : String(resolvedLabel);\n return { ...item, label };\n });\n const value =\n badgeItems.length > 0 ? (\n <BackofficeDetailBadgeRow items={badgeItems} />\n ) : null;\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value,\n fullWidth: field.fullWidth,\n });\n break;\n }\n case 'dateTime': {\n const value = field.value(node);\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value: (\n <FormattedDate\n value={value}\n options={BACKOFFICE_DATE_TIME_OPTIONS}\n fallback={t('common.notAvailable')}\n />\n ),\n });\n break;\n }\n case 'number': {\n const value = field.value(node);\n let formatted: string | null = null;\n if (value != null) {\n if (field.format === 'currency') {\n formatted = formatCurrency(value);\n } else if (field.format === 'percent') {\n formatted = formatPercent(value);\n } else {\n formatted = formatNumber(value);\n }\n }\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value: formatted,\n });\n break;\n }\n case 'flag': {\n const value = field.value(node);\n let resolved: ReactNode | null = null;\n if (value != null) {\n const tag = resolveFlagTag(field.variant, value, t);\n resolved = (\n <BackofficeDetailFlagTag\n tone={tag.tone}\n icon={tag.icon}\n label={tag.label}\n />\n );\n }\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value: resolved,\n });\n break;\n }\n case 'entityRef': {\n const idValue = field.id(node);\n let value: ReactNode | null = null;\n if (idValue != null && idValue.trim() !== '') {\n const labelValue = field.value?.(node);\n const label =\n labelValue != null && labelValue.trim() !== '' ? labelValue : null;\n const href = resolveEntityHref?.(field.entity, idValue) ?? null;\n if (label != null) {\n if (href != null) {\n value = <Link to={href}>{label}</Link>;\n } else {\n value = label;\n }\n }\n }\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value: value ?? fallback,\n });\n break;\n }\n case 'link': {\n const href = field.href(node);\n const labelValue = field.value(node);\n const value =\n href != null && href.trim() !== '' && !isEmptyText(labelValue) ? (\n <Link to={href}>{labelValue}</Link>\n ) : null;\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value,\n });\n break;\n }\n case 'taggedValue': {\n const tag = field.tag(node);\n const inlineValue = field.value(node);\n const valueNode = resolveInlineValue(inlineValue, {\n tApp,\n t,\n resolveEntityHref,\n });\n const resolvedTag =\n tag == null\n ? null\n : {\n ...tag,\n label: (() => {\n const labelValue = resolveValueLabel(tag.label, tApp);\n return labelValue == null ? '' : String(labelValue);\n })(),\n };\n const value =\n resolvedTag != null || valueNode != null ? (\n <BackofficeDetailTaggedValue tag={resolvedTag} value={valueNode} />\n ) : null;\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value,\n fullWidth: field.fullWidth,\n });\n break;\n }\n case 'relation': {\n const value = resolveRelationValue(field.value(node));\n if (value == null) {\n break;\n }\n const listRoute = relationEntityListRoutes[field.entity];\n if (listRoute == null) {\n break;\n }\n const labelBase = resolveLabel(field.label, tApp);\n const count = field.count?.(node) ?? null;\n const where = setWhereValue<Record<string, unknown>>(\n null,\n field.whereKey as never,\n value,\n field.path,\n );\n if (where == null) {\n break;\n }\n relationItems.push(\n resolveRelationItem({\n id,\n label: labelBase,\n count,\n entityId: field.entity,\n filterId: field.filterId,\n listRoute,\n path: field.path,\n value,\n where,\n whereKey: field.whereKey,\n }),\n );\n break;\n }\n case 'custom': {\n const custom = field.render(node) as ReactNode;\n if (custom == null) {\n break;\n }\n if (field.label != null) {\n items.push({\n id,\n label: resolveLabel(field.label, tApp),\n size: field.size,\n value: custom,\n fullWidth: field.fullWidth,\n });\n break;\n }\n customNodes.push(<div key={id}>{custom}</div>);\n break;\n }\n default:\n break;\n }\n });\n\n return { items, relationItems, customNodes };\n};\n\nconst resolveHeaderMeta = <Node,>(\n meta: BackofficeDetailHeaderMetaSpec<Node>,\n node: Node,\n options: {\n tApp: TFunction;\n t: TFunction;\n resolveEntityHref?: (entityId: string, refId: string) => string | null;\n },\n): ReactNode => {\n const { tApp, t, resolveEntityHref } = options;\n const fallback = t('common.notAvailable');\n\n if (meta.type === 'dateTime') {\n const value = meta.value(node);\n return (\n <FormattedDate\n value={value}\n options={BACKOFFICE_DATE_TIME_OPTIONS}\n fallback={fallback}\n />\n );\n }\n\n if (meta.type === 'entityRef') {\n const idValue = meta.id(node);\n if (idValue == null || idValue.trim() === '') {\n return fallback;\n }\n const labelValue = resolveValueLabel(meta.value?.(node), tApp);\n const label =\n labelValue != null && String(labelValue).trim() !== ''\n ? labelValue\n : null;\n if (label == null) {\n return fallback;\n }\n const href = resolveEntityHref?.(meta.entity, idValue) ?? null;\n if (href != null) {\n return <Link to={href}>{label}</Link>;\n }\n return label;\n }\n\n if (meta.type === 'link') {\n const href = meta.href(node);\n const labelValue = resolveValueLabel(meta.value(node), tApp);\n if (href == null || href.trim() === '' || isEmptyText(labelValue)) {\n return fallback;\n }\n return <Link to={href}>{labelValue}</Link>;\n }\n\n const value = resolveValueLabel(meta.value(node), tApp);\n return isEmptyText(value) ? fallback : value;\n};\n\nconst resolveHeaderStatus = <Node,>(\n status: BackofficeDetailHeaderStatusSpec<Node>,\n node: Node,\n tApp: TFunction,\n): ReactNode | undefined => {\n if (status.type === 'badgeRow') {\n const items = status.items(node).map((item) => {\n const resolvedLabel = resolveValueLabel(item.label, tApp);\n const label = resolvedLabel == null ? '' : String(resolvedLabel);\n return { ...item, label };\n });\n if (items.length === 0) {\n return undefined;\n }\n return <BackofficeDetailBadgeRow items={items} />;\n }\n\n const value = resolveValueLabel(status.value(node), tApp);\n const label = value == null ? '' : String(value);\n if (label.trim() === '') {\n return undefined;\n }\n const tone = resolveBadgeTone(status.tone, node);\n return <Tag tone={tone}>{label}</Tag>;\n};\n\nconst resolveHeaderItems = <Node,>(\n header: BackofficeDetailHeaderConfig<Node>,\n node: Node,\n options: {\n tApp: TFunction;\n t: TFunction;\n resolveEntityHref?: (entityId: string, refId: string) => string | null;\n },\n): {\n title: string;\n subtitle?: ReactNode;\n badges?: ReactNode;\n status?: ReactNode;\n items?: readonly EntityHeaderItem[];\n} => {\n const { tApp, t, resolveEntityHref } = options;\n const resolvedTitle =\n header.titleValue?.(node, tApp) ?? resolveLabel(header.title, tApp);\n const title =\n resolvedTitle.trim() === ''\n ? resolveLabel(header.title, tApp)\n : resolvedTitle;\n\n let subtitleNode: ReactNode | undefined;\n if (header.subtitleItems != null && header.subtitleItems.length > 0) {\n const separator = header.subtitleSeparator ?? ' / ';\n const parts: ReactNode[] = [];\n const { subtitleItems } = header;\n subtitleItems.forEach((item, index) => {\n const valueSpec = item.value(node);\n parts.push(\n <span key={item.id}>\n {resolveInlineValue(valueSpec, {\n tApp,\n t,\n resolveEntityHref,\n })}\n </span>,\n );\n if (index < subtitleItems.length - 1) {\n parts.push(<span key={`${item.id}-sep`}>{separator}</span>);\n }\n });\n subtitleNode = <span>{parts}</span>;\n } else {\n const subtitleValue =\n header.subtitleValue?.(node, tApp) ??\n (header.subtitle != null ? resolveLabel(header.subtitle, tApp) : null);\n subtitleNode =\n subtitleValue != null && subtitleValue.trim() !== ''\n ? subtitleValue\n : undefined;\n }\n\n const badgeNodes: ReactNode[] = [];\n if (header.badges != null) {\n header.badges.forEach((badge, index) => {\n const label = resolveLabel(badge.label, tApp);\n const resolvedValue = resolveValueLabel(badge.value(node), tApp);\n const value = resolvedValue == null ? '' : String(resolvedValue);\n if (value.trim() === '') {\n return;\n }\n const tone = resolveBadgeTone(badge.tone, node);\n badgeNodes.push(\n <Tag key={`${label}-${index}`} tone={tone}>\n {`${label}: ${value}`}\n </Tag>,\n );\n });\n }\n\n let statusNode: ReactNode | undefined;\n if (header.status != null) {\n statusNode = resolveHeaderStatus(header.status, node, tApp);\n }\n\n const items: EntityHeaderItem[] | undefined = header.meta?.map(\n (meta, index) => {\n const label = resolveLabel(meta.label, tApp);\n const valueNode = resolveHeaderMeta(meta, node, {\n tApp,\n t,\n resolveEntityHref,\n });\n return {\n id: `${label}-${index}`,\n label,\n value: valueNode,\n };\n },\n );\n\n return {\n title,\n subtitle: subtitleNode,\n badges: badgeNodes.length > 0 ? <>{badgeNodes}</> : undefined,\n status: statusNode,\n items,\n };\n};\n\nconst renderBlocks = <Node,>(\n blocks: readonly BackofficeDetailBlockSpec<Node>[] | undefined,\n node: Node,\n options: {\n tApp: TFunction;\n t: TFunction;\n resolveEntityHref: (entityId: string, refId: string) => string | null;\n keyPrefix?: string;\n },\n): ReactNode[] => {\n const { tApp, t, resolveEntityHref } = options;\n if (blocks == null || blocks.length === 0) {\n return [];\n }\n\n return blocks.map((block, index) => {\n const key =\n options.keyPrefix != null\n ? `${options.keyPrefix}-${block.kind}-${index}`\n : `${block.kind}-${index}`;\n\n if (block.kind === 'custom') {\n const custom = block.render(node) as ReactNode;\n if (custom == null) {\n return null;\n }\n if (block.label != null) {\n const customTitle = resolveLabel(block.label, tApp);\n return (\n <BackofficeDetailSection key={key} title={customTitle}>\n {custom}\n </BackofficeDetailSection>\n );\n }\n return <div key={key}>{custom}</div>;\n }\n\n const title = resolveLabel(block.label, tApp);\n const description =\n block.description != null\n ? resolveLabel(block.description, tApp)\n : undefined;\n\n if (block.kind === 'relationList') {\n const value = block.value(node);\n return (\n <BackofficeDetailRelationListBlock\n key={key}\n title={title}\n target={block.target}\n whereKey={block.whereKey}\n value={value}\n path={block.path}\n />\n );\n }\n\n if (block.kind === 'table') {\n const rows = block.rows(node);\n const columns = buildDataTableColumns(block.columns, {\n tApp,\n t,\n resolveEntityHref,\n });\n return (\n <BackofficeDetailSection\n key={key}\n title={title}\n description={description}\n >\n <DataTable\n columns={columns}\n rows={rows}\n getRowId={(row, rowIndex) => {\n if (row != null && typeof row === 'object') {\n const record = row as Record<string, unknown>;\n const maybeId = record.id;\n if (typeof maybeId === 'string' && maybeId.trim() !== '') {\n return maybeId;\n }\n }\n return String(rowIndex);\n }}\n />\n </BackofficeDetailSection>\n );\n }\n\n if (block.kind === 'json') {\n const value = block.value(node);\n return (\n <BackofficeDetailSection\n key={key}\n title={title}\n description={description}\n >\n <LazyBackofficeJsonViewer value={value} title={title} />\n </BackofficeDetailSection>\n );\n }\n\n if (block.kind === 'code') {\n const value = block.value(node);\n return (\n <BackofficeDetailSection\n key={key}\n title={title}\n description={description}\n >\n <HighlightCode\n badgeLabel={t('tools.output')}\n copyCode={value}\n fallbackCodeText={value}\n />\n </BackofficeDetailSection>\n );\n }\n\n if (block.kind === 'payload') {\n const value = block.value(node);\n return (\n <BackofficeDetailPayload\n key={key}\n title={title}\n description={description}\n content={value}\n format={block.format}\n />\n );\n }\n\n if (block.kind === 'errorList') {\n const items = block.errors(node);\n return (\n <BackofficeDetailErrorList\n key={key}\n title={title}\n description={description}\n items={items}\n />\n );\n }\n\n const items = block.items.map((item, itemIndex) => {\n const label = resolveLabel(item.label, tApp);\n const resolvedValue = resolveValueLabel(item.value(node), tApp);\n return {\n id: `${label}-${itemIndex}`,\n label,\n value: resolvedValue ?? t('common.notAvailable'),\n };\n });\n\n return (\n <BackofficeDetailSection\n key={key}\n title={title}\n description={description}\n >\n <BackofficeKeyValueList items={items} />\n </BackofficeDetailSection>\n );\n });\n};\n\nconst BackofficeEntityDetailPageContent = ({\n config,\n prepared,\n}: {\n config: BackofficeResolvedDetailPageFacetConfig;\n prepared: {\n pageQuery: PreloadedQuery<OperationType>;\n id: string;\n detailId?: string;\n pageId: string;\n pagePath: string;\n };\n}): JSX.Element => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const { formatNumber, formatCurrency, formatPercent } =\n useBackofficeFormats();\n const { entities, entityRegistry } = useBackofficeConfig();\n const { layoutView } = useBackofficeEntityDetailLayoutContext();\n const routing = useContext(RoutingContext);\n const environment = useRelayEnvironment();\n const toast = useToast();\n const [actionState, setActionState] = useState<Record<string, boolean>>({});\n const [activeFormActionId, setActiveFormActionId] = useState<string | null>(\n null,\n );\n const resolvedPages = resolveVisibleDetailPages({\n mainPage: config.pages.mainPage,\n subPages: config.pages.subPages,\n activePagePath: prepared.pagePath,\n node: layoutView as never,\n });\n const activePage = resolvedPages.activePage ?? config.pages.mainPage;\n const pages =\n resolvedPages.pages.length > 0\n ? resolvedPages.pages\n : [config.pages.mainPage];\n\n const setActionLoading = (actionId: string, isLoading: boolean) => {\n setActionState((prev) => {\n if (prev[actionId] === isLoading) {\n return prev;\n }\n return { ...prev, [actionId]: isLoading };\n });\n };\n\n const { page } = config;\n\n const pageQueryData = usePreloadedQuery(page.query, prepared.pageQuery);\n const pageNodeRef = page.resolveNode(pageQueryData as never, {\n id: prepared.id,\n detailId: prepared.detailId,\n });\n if (pageNodeRef == null) {\n throw new HttpRedirect(config.routes.list);\n }\n const resolvedNode = useFragment(page.fragment, pageNodeRef as never);\n const relationEntityListRoutes = useMemo(() => {\n return Object.fromEntries(\n page.content\n .flatMap((block) => {\n if (block.kind !== 'section') {\n return [];\n }\n\n return block.fields.flatMap((field) => {\n if (field.type !== 'relation') {\n return [];\n }\n return [field.entity];\n });\n })\n .flatMap((entityId) => {\n const entityManifest = entities[entityId];\n if (entityManifest?.hasList !== true) {\n return [];\n }\n return [[entityId, entityManifest.routes.list]];\n }),\n ) as Record<string, string>;\n }, [entities, page.content]);\n\n return (\n <BackofficeEntityDetailScaffold\n node={resolvedNode as { __typename: string } | null | undefined}\n render={(node) => {\n const view = page.toView(node);\n const tabsItems = buildTabsItems({\n pages,\n id: prepared.id,\n tApp,\n detailPageHref: config.routes.detailPage,\n });\n const resolveEntityHref = (entityId: string, refId: string) => {\n const entityConfig = entities[entityId];\n if (entityConfig == null) {\n return null;\n }\n return entityConfig.routes.detail(refId);\n };\n const resolveRelationItem = ({\n id,\n label,\n count,\n entityId,\n filterId,\n listRoute,\n path,\n value,\n where,\n whereKey,\n }: {\n id: string;\n label: string;\n count: number | null;\n entityId: string;\n filterId?: string;\n listRoute: string;\n path?: readonly string[];\n value: string;\n where: Record<string, unknown>;\n whereKey: string;\n }): BackofficeRelationsMenuItem => {\n const loadedEntity = entityRegistry.getLoadedListEntity(entityId);\n return {\n id,\n label,\n count,\n href:\n loadedEntity == null\n ? buildBackofficeFallbackListHref(listRoute, where, [\n {\n id:\n filterId ??\n (path == null\n ? whereKey\n : `${whereKey}.${path.join('.')}`),\n value,\n },\n ])\n : buildBackofficeListHref(loadedEntity.config, { where }),\n onClick: async (event) => {\n if (\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\n const listEntity = await entityRegistry.loadListEntity(entityId);\n const next = buildBackofficeListLink(listEntity.config, {\n where,\n });\n\n routing.history.push({\n pathname: next.pathname,\n search: next.search === '' ? '' : `?${next.search}`,\n hash: '',\n });\n },\n };\n };\n\n const header = resolveHeaderItems(config.header, layoutView, {\n tApp,\n t,\n resolveEntityHref,\n });\n const breadcrumb = buildEntityDetailBreadcrumb({\n config,\n tApp,\n entityId: prepared.id,\n layoutView,\n pageLabel: activePage.label(tApp),\n });\n\n const actions = page.actions ?? [];\n let headerActionButtons: ReactNode[] = [];\n if (actions.length > 0) {\n const visibleActions = actions.filter((action) => {\n if (action.isVisible == null) {\n return true;\n }\n return action.isVisible(view);\n });\n\n if (visibleActions.length > 0) {\n headerActionButtons = visibleActions.map((action) => {\n const label = resolveLabel(action.label, tApp);\n const ariaLabel =\n action.ariaLabel != null\n ? resolveLabel(action.ariaLabel, tApp)\n : label;\n const variant = action.variant ?? 'secondary';\n const size = action.size ?? 'small';\n const isLoading = actionState[action.id] ?? false;\n const isDisabled =\n isLoading || action.isDisabled?.(view) === true;\n\n if (isRouteAction(action)) {\n const href = action.to(view);\n return (\n <LinkButton\n key={action.id}\n to={href}\n variant={variant}\n size={size}\n isDisabled={isDisabled}\n aria-label={ariaLabel}\n >\n {label}\n </LinkButton>\n );\n }\n\n if (isFormMutationAction(action)) {\n return (\n <Button\n key={action.id}\n type=\"button\"\n variant={variant}\n size={size}\n isLoading={false}\n disabled={isDisabled}\n onClick={() => {\n setActiveFormActionId(action.id);\n }}\n aria-label={ariaLabel}\n >\n {label}\n </Button>\n );\n }\n\n if (isMutationAction(action)) {\n const handleClick = () => {\n if (isLoading) {\n return;\n }\n const variables = action.getVariables(view);\n setActionLoading(action.id, true);\n commitMutation(environment, {\n mutation: action.mutation,\n variables,\n updater: (store) => {\n action.updater?.(store, view);\n },\n onCompleted: (response) => {\n setActionLoading(action.id, false);\n const mutationPayload = extractMutationPayload(response);\n if (mutationPayload != null) {\n let defaultErrorMessage = t(\n 'actions.form.errors.invalidPayload',\n );\n if (action.toasts?.error?.message != null) {\n defaultErrorMessage = resolveLabel(\n action.toasts.error.message,\n tApp,\n );\n } else if (action.toasts?.error?.title != null) {\n defaultErrorMessage = resolveLabel(\n action.toasts.error.title,\n tApp,\n );\n }\n\n const outcome = resolveMutationOutcome(\n mutationPayload,\n {\n defaultErrorMessage,\n mapReason: (reason) => {\n const mapped = action.mapErrorReason?.(\n reason,\n view,\n );\n if (mapped == null) {\n return null;\n }\n if (typeof mapped === 'function') {\n return resolveLabel(mapped, tApp);\n }\n return String(mapped);\n },\n },\n );\n if (!outcome.ok) {\n const error = new Error(outcome.message);\n action.onError?.(error, view);\n if (action.toasts?.error != null) {\n const toastSpec = resolveToastSpec(\n action.toasts.error,\n tApp,\n );\n toast.error(toastSpec.title, toastSpec.message);\n }\n return;\n }\n }\n\n action.onCompleted?.(response, view);\n if (action.toasts?.success != null) {\n const toastSpec = resolveToastSpec(\n action.toasts.success,\n tApp,\n );\n const toastActions = resolveToastViewActions({\n toast: action.toasts.success,\n response,\n node: view,\n tApp,\n entities,\n defaultLabel: t('actions.view'),\n navigateTo: (to) => {\n routing?.history.push({ pathname: to });\n },\n });\n toast.push({\n kind: 'info',\n title: toastSpec.title,\n message: toastSpec.message,\n actions: toastActions,\n });\n }\n },\n onError: (error) => {\n setActionLoading(action.id, false);\n action.onError?.(error, view);\n if (action.toasts?.error != null) {\n const toastSpec = resolveToastSpec(\n action.toasts.error,\n tApp,\n );\n toast.error(toastSpec.title, toastSpec.message);\n }\n },\n });\n };\n\n return (\n <Button\n key={action.id}\n type=\"button\"\n variant={variant}\n size={size}\n isLoading={isLoading}\n disabled={isDisabled}\n onClick={handleClick}\n aria-label={ariaLabel}\n >\n {label}\n </Button>\n );\n }\n\n return null;\n });\n }\n }\n\n const activeFormAction = actions.find((action) => {\n return action.id === activeFormActionId;\n });\n\n const { content } = page;\n\n const primaryNodes: ReactNode[] = [];\n const secondaryNodes: ReactNode[] = [];\n const relationMenuItems: BackofficeRelationsMenuItem[] = [];\n\n content.forEach((item, index) => {\n const placement = item.placement ?? 'primary';\n const targetNodes =\n placement === 'secondary' ? secondaryNodes : primaryNodes;\n\n if (item.kind === 'section') {\n const sectionLabel = resolveLabel(item.title, tApp);\n const description =\n item.description != null\n ? resolveLabel(item.description, tApp)\n : undefined;\n const { items, relationItems, customNodes } = buildFieldItems(\n item.fields,\n view,\n {\n tApp,\n t,\n resolveEntityHref,\n formatNumber,\n formatCurrency,\n formatPercent,\n relationEntityListRoutes,\n resolveRelationItem,\n },\n );\n relationItems.forEach((relation) => {\n if (\n !relationMenuItems.some((entry) => {\n return entry.id === relation.id;\n })\n ) {\n relationMenuItems.push(relation);\n }\n });\n\n const hasContent = items.length > 0 || customNodes.length > 0;\n\n if (!hasContent) {\n return;\n }\n\n targetNodes.push(\n <BackofficeDetailSection\n key={`${sectionLabel}-${index}`}\n title={sectionLabel}\n description={description}\n items={items.length > 0 ? items : undefined}\n >\n {customNodes}\n </BackofficeDetailSection>,\n );\n return;\n }\n\n const rendered = renderBlocks([item], view, {\n tApp,\n t,\n resolveEntityHref,\n keyPrefix: String(index),\n });\n const blockNode = rendered[0];\n if (blockNode != null) {\n targetNodes.push(blockNode);\n }\n });\n\n const relationsMenuNode =\n relationMenuItems.length > 0 ? (\n <BackofficeRelationsMenu\n label={t('relations.menu.label')}\n items={relationMenuItems}\n />\n ) : null;\n\n const headerActions =\n headerActionButtons.length > 0 || relationsMenuNode != null ? (\n <div className={pageStyles.headerActions}>\n {headerActionButtons}\n {relationsMenuNode}\n </div>\n ) : undefined;\n\n const headerMetaNode =\n header.status != null || header.badges != null ? (\n <div className={pageStyles.headerMeta}>\n {header.status}\n {header.badges}\n </div>\n ) : undefined;\n\n const headerItemsNode =\n header.items != null && header.items.length > 0 ? (\n <div className={pageStyles.headerMetaList}>\n <BackofficeKeyValueList items={header.items} />\n </div>\n ) : null;\n\n const hasAside = secondaryNodes.length > 0;\n let tabsNode: JSX.Element | null = null;\n if (pages.length > 1) {\n tabsNode = (\n <BackofficeTabs\n items={tabsItems as BackofficeTabItem[]}\n activeId={activePage.id}\n onChange={() => {}}\n />\n );\n }\n const headerNode = (\n <div className={pageStyles.headerBlock}>\n <BackofficePageHeader\n title={header.title}\n subtitle={header.subtitle}\n actions={headerActions}\n meta={headerMetaNode}\n />\n {headerItemsNode}\n </div>\n );\n\n return (\n <BackofficeRightPageLayout breadcrumb={breadcrumb}>\n <DetailPageTemplate\n headerNode={headerNode}\n tabsNode={tabsNode}\n sidePanel={hasAside ? <>{secondaryNodes}</> : undefined}\n sidePanelVariant=\"plain\"\n >\n <>{primaryNodes}</>\n </DetailPageTemplate>\n {activeFormAction != null &&\n isFormMutationAction(activeFormAction) && (\n <LazyBackofficeEntityActionFormDialog\n isOpen\n action={activeFormAction}\n node={view}\n onClose={() => {\n setActiveFormActionId(null);\n }}\n />\n )}\n </BackofficeRightPageLayout>\n );\n }}\n />\n );\n};\n\nexport const BackofficeEntityDetailPage = ({\n config,\n prepared,\n}: BackofficeEntityDetailPageProps): JSX.Element => {\n const { layoutView } = useBackofficeEntityDetailLayoutContext();\n\n const resolvedPages = resolveVisibleDetailPages({\n mainPage: config.pages.mainPage,\n subPages: config.pages.subPages,\n activePagePath: prepared.pagePath,\n node: layoutView as never,\n });\n\n if (!resolvedPages.hasVisiblePages || resolvedPages.activePage == null) {\n throw new HttpRedirect(config.routes.list);\n }\n\n if (resolvedPages.activePage.id !== prepared.pageId) {\n throw new HttpRedirect(\n config.routes.detailPage(prepared.id, resolvedPages.activePage.id),\n );\n }\n\n return (\n <BackofficeEntityDetailPageContent\n config={prepared.pageConfig}\n prepared={prepared}\n />\n );\n};\n\nexport default BackofficeEntityDetailPage;\n"],"mappings":"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"}
|
package/lib/esm/{BackofficeEntityListPage-CtLI15-L.js → BackofficeEntityListPage-BneDsGo-.js}
RENAMED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { n as e } from "./BackofficeConfigContext-R0t1owTI.js";
|
|
2
2
|
import { t } from "./useBackofficeReactTranslation-WfXU8kCf.js";
|
|
3
|
-
import "./EntityFilterValue-
|
|
4
|
-
import "./EntityIdPickerDialog-
|
|
3
|
+
import "./EntityFilterValue-B5ZGHO_u.js";
|
|
4
|
+
import "./EntityIdPickerDialog-DbTnDU4v.js";
|
|
5
5
|
import { t as n } from "./useBackofficeListUrlState-D4fx5O7u.js";
|
|
6
|
-
import { n as r, t as i } from "./BackofficeRightPageLayout-
|
|
6
|
+
import { n as r, t as i } from "./BackofficeRightPageLayout-F8ipegrl.js";
|
|
7
7
|
import "./BackofficeTopbarPortalContext-iD7dm4_h.js";
|
|
8
8
|
import { r as a } from "./buildBreadcrumbs-CqF9Nh6x.js";
|
|
9
|
-
import { i as o, n as s, r as c, t as l } from "./LazyBackofficeEntityActionFormDialog-
|
|
9
|
+
import { i as o, n as s, r as c, t as l } from "./LazyBackofficeEntityActionFormDialog-BE3wVfU6.js";
|
|
10
10
|
import { useCallback as u, useEffect as d, useMemo as f, useRef as p, useState as m } from "react";
|
|
11
11
|
import { useTranslation as ee } from "react-i18next";
|
|
12
12
|
import { Button as te, EyeSvg as h, LinkButton as g, TableCell as _ } from "@plumile/ui";
|
|
@@ -44,7 +44,7 @@ var T = "wy96wu0", E = "wy96wu1", D = "wy96wu2", O = ({ row: e, flags: t, tApp:
|
|
|
44
44
|
children: e.node
|
|
45
45
|
}, e.id))
|
|
46
46
|
});
|
|
47
|
-
}, oe = "
|
|
47
|
+
}, oe = "txvbqb9ip txvbqbcp txvbqbao7 txvbqbajy", k = "c0tad0", A = "c0tad1", se = (e) => e.list.kind === "records", ce = "store-or-network", j = (e, t) => e(t), M = 24, N = 6, P = 4, F = 32, I = 8, L = 12, R = 4, z = (e) => e <= 0 ? 0 : P * 2 + M * e + N * Math.max(0, e - 1), B = (e) => e <= 0 ? 0 : R + L * 2 + F * e + I * Math.max(0, e - 1), V = {
|
|
48
48
|
xs: "minmax(56px, 76px)",
|
|
49
49
|
s: "minmax(88px, 120px)",
|
|
50
50
|
m: "minmax(120px, 168px)",
|
|
@@ -382,4 +382,4 @@ var T = "wy96wu0", E = "wy96wu1", D = "wy96wu2", O = ({ row: e, flags: t, tApp:
|
|
|
382
382
|
//#endregion
|
|
383
383
|
export { K as BackofficeEntityListPage, K as default };
|
|
384
384
|
|
|
385
|
-
//# sourceMappingURL=BackofficeEntityListPage-
|
|
385
|
+
//# sourceMappingURL=BackofficeEntityListPage-BneDsGo-.js.map
|