@plumile/backoffice-react 0.1.70 → 0.1.72
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/i18n/locales/en/shared.js +0 -6
- package/lib/esm/i18n/locales/en/shared.js.map +1 -1
- package/lib/esm/i18n/locales/fr/shared.js +0 -6
- package/lib/esm/i18n/locales/fr/shared.js.map +1 -1
- package/lib/esm/index.js +9 -15
- package/lib/esm/provider/BackofficeProvider.js +3 -1
- package/lib/esm/provider/BackofficeProvider.js.map +1 -1
- package/lib/esm/router/createBackofficeRoutes.js +67 -67
- package/lib/esm/router/createBackofficeRoutes.js.map +1 -1
- package/lib/esm/style.css +1 -1
- package/lib/types/i18n/resources.d.ts +0 -12
- package/lib/types/i18n/resources.d.ts.map +1 -1
- package/lib/types/index.d.ts +0 -6
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/provider/BackofficeProvider.d.ts.map +1 -1
- package/lib/types/provider/types.d.ts +2 -1
- package/lib/types/provider/types.d.ts.map +1 -1
- package/lib/types/router/createBackofficeRoutes.d.ts +1 -1
- package/lib/types/router/createBackofficeRoutes.d.ts.map +1 -1
- package/package.json +5 -5
- package/lib/esm/components/backoffice/tools/BackofficeToolsDocPanel.js +0 -40
- package/lib/esm/components/backoffice/tools/BackofficeToolsDocPanel.js.map +0 -1
- package/lib/esm/components/backoffice/tools/BackofficeToolsErrorFallback.js +0 -48
- package/lib/esm/components/backoffice/tools/BackofficeToolsErrorFallback.js.map +0 -1
- package/lib/esm/components/backoffice/tools/BackofficeToolsJsonForm.js +0 -58
- package/lib/esm/components/backoffice/tools/BackofficeToolsJsonForm.js.map +0 -1
- package/lib/esm/components/backoffice/tools/BackofficeToolsPageLayout.js +0 -81
- package/lib/esm/components/backoffice/tools/BackofficeToolsPageLayout.js.map +0 -1
- package/lib/esm/components/backoffice/tools/BackofficeToolsParamsContext.js +0 -16
- package/lib/esm/components/backoffice/tools/BackofficeToolsParamsContext.js.map +0 -1
- package/lib/esm/components/backoffice/tools/BackofficeToolsProjectPicker.js +0 -56
- package/lib/esm/components/backoffice/tools/BackofficeToolsProjectPicker.js.map +0 -1
- package/lib/esm/components/backoffice/tools/BackofficeToolsQueryBoundary.js +0 -20
- package/lib/esm/components/backoffice/tools/BackofficeToolsQueryBoundary.js.map +0 -1
- package/lib/esm/components/backoffice/tools/BackofficeToolsScopePicker.js +0 -56
- package/lib/esm/components/backoffice/tools/BackofficeToolsScopePicker.js.map +0 -1
- package/lib/esm/components/backoffice/tools/backofficeToolsDocPanel.css.js +0 -8
- package/lib/esm/components/backoffice/tools/backofficeToolsDocPanel.css.js.map +0 -1
- package/lib/esm/components/backoffice/tools/backofficeToolsForm.css.js +0 -8
- package/lib/esm/components/backoffice/tools/backofficeToolsForm.css.js.map +0 -1
- package/lib/esm/components/backoffice/tools/backofficeToolsJsonForm.css.js +0 -8
- package/lib/esm/components/backoffice/tools/backofficeToolsJsonForm.css.js.map +0 -1
- package/lib/esm/components/backoffice/tools/backofficeToolsPageLayout.css.js +0 -8
- package/lib/esm/components/backoffice/tools/backofficeToolsPageLayout.css.js.map +0 -1
- package/lib/esm/components/backoffice/tools/backofficeToolsProjectPicker.css.js +0 -8
- package/lib/esm/components/backoffice/tools/backofficeToolsProjectPicker.css.js.map +0 -1
- package/lib/esm/components/backoffice/tools/backofficeToolsScopePicker.css.js +0 -8
- package/lib/esm/components/backoffice/tools/backofficeToolsScopePicker.css.js.map +0 -1
- package/lib/esm/hooks/useBackofficeToolsUrlParams.js +0 -15
- package/lib/esm/hooks/useBackofficeToolsUrlParams.js.map +0 -1
- package/lib/esm/i18n/useSharedEnumLabels.js +0 -22
- package/lib/esm/i18n/useSharedEnumLabels.js.map +0 -1
- package/lib/esm/modules/access/viewerPermissionsPolicy.js +0 -17
- package/lib/esm/modules/access/viewerPermissionsPolicy.js.map +0 -1
- package/lib/esm/modules/billing/usageChartMappers.js +0 -49
- package/lib/esm/modules/billing/usageChartMappers.js.map +0 -1
- package/lib/esm/modules/merge/taskMergeRun.js +0 -67
- package/lib/esm/modules/merge/taskMergeRun.js.map +0 -1
- package/lib/esm/modules/projectIngestionStatus.js +0 -25
- package/lib/esm/modules/projectIngestionStatus.js.map +0 -1
- package/lib/esm/pages/BackofficeToolsOperationPage.js +0 -464
- package/lib/esm/pages/BackofficeToolsOperationPage.js.map +0 -1
- package/lib/esm/subscriptions/conversationStream.js +0 -38
- package/lib/esm/subscriptions/conversationStream.js.map +0 -1
- package/lib/types/components/backoffice/tools/BackofficeToolsDocPanel.d.ts +0 -11
- package/lib/types/components/backoffice/tools/BackofficeToolsDocPanel.d.ts.map +0 -1
- package/lib/types/components/backoffice/tools/BackofficeToolsErrorFallback.d.ts +0 -8
- package/lib/types/components/backoffice/tools/BackofficeToolsErrorFallback.d.ts.map +0 -1
- package/lib/types/components/backoffice/tools/BackofficeToolsJsonForm.d.ts +0 -15
- package/lib/types/components/backoffice/tools/BackofficeToolsJsonForm.d.ts.map +0 -1
- package/lib/types/components/backoffice/tools/BackofficeToolsPageLayout.d.ts +0 -13
- package/lib/types/components/backoffice/tools/BackofficeToolsPageLayout.d.ts.map +0 -1
- package/lib/types/components/backoffice/tools/BackofficeToolsParamsContext.d.ts +0 -14
- package/lib/types/components/backoffice/tools/BackofficeToolsParamsContext.d.ts.map +0 -1
- package/lib/types/components/backoffice/tools/BackofficeToolsProjectPicker.d.ts +0 -8
- package/lib/types/components/backoffice/tools/BackofficeToolsProjectPicker.d.ts.map +0 -1
- package/lib/types/components/backoffice/tools/BackofficeToolsQueryBoundary.d.ts +0 -7
- package/lib/types/components/backoffice/tools/BackofficeToolsQueryBoundary.d.ts.map +0 -1
- package/lib/types/components/backoffice/tools/BackofficeToolsScopePicker.d.ts +0 -8
- package/lib/types/components/backoffice/tools/BackofficeToolsScopePicker.d.ts.map +0 -1
- package/lib/types/components/backoffice/tools/backofficeToolsDocPanel.css.d.ts +0 -8
- package/lib/types/components/backoffice/tools/backofficeToolsDocPanel.css.d.ts.map +0 -1
- package/lib/types/components/backoffice/tools/backofficeToolsForm.css.d.ts +0 -6
- package/lib/types/components/backoffice/tools/backofficeToolsForm.css.d.ts.map +0 -1
- package/lib/types/components/backoffice/tools/backofficeToolsJsonForm.css.d.ts +0 -4
- package/lib/types/components/backoffice/tools/backofficeToolsJsonForm.css.d.ts.map +0 -1
- package/lib/types/components/backoffice/tools/backofficeToolsPageLayout.css.d.ts +0 -13
- package/lib/types/components/backoffice/tools/backofficeToolsPageLayout.css.d.ts.map +0 -1
- package/lib/types/components/backoffice/tools/backofficeToolsProjectPicker.css.d.ts +0 -4
- package/lib/types/components/backoffice/tools/backofficeToolsProjectPicker.css.d.ts.map +0 -1
- package/lib/types/components/backoffice/tools/backofficeToolsScopePicker.css.d.ts +0 -4
- package/lib/types/components/backoffice/tools/backofficeToolsScopePicker.css.d.ts.map +0 -1
- package/lib/types/hooks/useBackofficeToolsUrlParams.d.ts +0 -8
- package/lib/types/hooks/useBackofficeToolsUrlParams.d.ts.map +0 -1
- package/lib/types/i18n/useSharedEnumLabels.d.ts +0 -6
- package/lib/types/i18n/useSharedEnumLabels.d.ts.map +0 -1
- package/lib/types/modules/access/viewerPermissionsPolicy.d.ts +0 -38
- package/lib/types/modules/access/viewerPermissionsPolicy.d.ts.map +0 -1
- package/lib/types/modules/billing/usageChartMappers.d.ts +0 -26
- package/lib/types/modules/billing/usageChartMappers.d.ts.map +0 -1
- package/lib/types/modules/merge/taskMergeRun.d.ts +0 -48
- package/lib/types/modules/merge/taskMergeRun.d.ts.map +0 -1
- package/lib/types/modules/projectIngestionStatus.d.ts +0 -9
- package/lib/types/modules/projectIngestionStatus.d.ts.map +0 -1
- package/lib/types/pages/BackofficeToolsOperationPage.d.ts +0 -9
- package/lib/types/pages/BackofficeToolsOperationPage.d.ts.map +0 -1
- package/lib/types/subscriptions/conversationStream.d.ts +0 -12
- package/lib/types/subscriptions/conversationStream.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createBackofficeRoutes.js","names":[],"sources":["../../../src/router/createBackofficeRoutes.tsx"],"sourcesContent":["/* eslint-disable no-ternary */\nimport {\n getResourcePage,\n HttpRedirect,\n r,\n type AnyRoute,\n type ResourcePage,\n type Route,\n} from '@plumile/router';\nimport * as ReactRelay from 'react-relay';\nimport type { PreloadedQuery } from 'react-relay';\nimport type { Environment, OperationType } from 'relay-runtime';\n\nimport { BACKOFFICE_LIST_DEFAULTS } from '@plumile/backoffice-core/constants.js';\nimport type {\n BackofficeEntityManifestMap,\n BackofficePreparedDetailLayoutRoute,\n BackofficePreparedDetailPageRoute,\n BackofficePreparedListRoute,\n BackofficePreparedToolRoute,\n BackofficeResolvedDetailLayoutFacetConfigBase,\n} from '@plumile/backoffice-core/types.js';\n\nimport type {\n BackofficeAuthConfig,\n BackofficeDashboardModule,\n BackofficeSidebarConfig,\n} from '../provider/types.js';\nimport {\n buildEntityGroupLookup,\n resolveSidebarGroups,\n} from '../components/backoffice/layout/sidebarUtils.js';\nimport type { BackofficeEntityRegistry } from '../provider/entityRegistry.js';\n\nconst { loadQuery, usePreloadedQuery } = ReactRelay;\n\nexport type CreateBackofficeRoutesInput = {\n basePath: string;\n entityManifest: BackofficeEntityManifestMap;\n entityRegistry: BackofficeEntityRegistry;\n sidebar?: BackofficeSidebarConfig;\n auth: BackofficeAuthConfig;\n dashboard?: BackofficeDashboardModule;\n};\n\nexport type BackofficeRouterContext = {\n relayEnvironment: Environment;\n};\n\nexport const WrapperPageResource: ResourcePage | null = getResourcePage(\n 'WrapperPage',\n // eslint-disable-next-line arrow-body-style\n async () => import('@plumile/ui/pages/WrapperPage.js'),\n);\n\nexport const BackofficeLayoutPageResource: ResourcePage | null =\n getResourcePage(\n 'BackofficeLayoutPage',\n // eslint-disable-next-line arrow-body-style\n async () => import('../pages/BackofficeLayoutPage.js'),\n );\n\nexport const BackofficeEntityListPageResource: ResourcePage | null =\n getResourcePage(\n 'BackofficeEntityListPage',\n // eslint-disable-next-line arrow-body-style\n async () => import('../pages/BackofficeEntityListPage.js'),\n );\n\nexport const BackofficeEntityDetailPageResource: ResourcePage | null =\n getResourcePage(\n 'BackofficeEntityDetailPage',\n // eslint-disable-next-line arrow-body-style\n async () => import('../pages/BackofficeEntityDetailPage.js'),\n );\n\nexport const BackofficeEntityDetailLayoutPageResource: ResourcePage | null =\n getResourcePage(\n 'BackofficeEntityDetailLayoutPage',\n // eslint-disable-next-line arrow-body-style\n async () => import('../pages/BackofficeEntityDetailLayoutPage.js'),\n );\n\nexport const BackofficeEntityDetailUnknownPageRedirectResource: ResourcePage | null =\n getResourcePage(\n 'BackofficeEntityDetailUnknownPageRedirect',\n // eslint-disable-next-line arrow-body-style\n async () => import('../pages/BackofficeEntityDetailUnknownPageRedirect.js'),\n );\n\nexport const BackofficeDashboardPageResource: ResourcePage | null =\n getResourcePage(\n 'BackofficeDashboardPage',\n // eslint-disable-next-line arrow-body-style\n async () => import('../pages/BackofficeDashboardPage.js'),\n );\n\nexport const BackofficeToolsOperationPageResource: ResourcePage | null =\n getResourcePage(\n 'BackofficeToolsOperationPage',\n // eslint-disable-next-line arrow-body-style\n async () => import('../pages/BackofficeToolsOperationPage.js'),\n );\n\nexport const BackofficeLoginPageResource: ResourcePage | null = getResourcePage(\n 'BackofficeLoginPage',\n // eslint-disable-next-line arrow-body-style\n async () => import('../pages/BackofficeLoginPage.js'),\n);\n\nexport const BackofficePasswordResetRequestPageResource: ResourcePage | null =\n getResourcePage(\n 'BackofficePasswordResetRequestPage',\n // eslint-disable-next-line arrow-body-style\n async () => import('../pages/BackofficePasswordResetRequestPage.js'),\n );\n\nexport const BackofficePasswordResetCompletePageResource: ResourcePage | null =\n getResourcePage(\n 'BackofficePasswordResetCompletePage',\n // eslint-disable-next-line arrow-body-style\n async () => import('../pages/BackofficePasswordResetCompletePage.js'),\n );\n\nexport const BackofficeVerifyEmailPageResource: ResourcePage | null =\n getResourcePage(\n 'BackofficeVerifyEmailPage',\n // eslint-disable-next-line arrow-body-style\n async () => import('../pages/BackofficeVerifyEmailPage.js'),\n );\n\nexport const BackofficeAcceptInvitationPageResource: ResourcePage | null =\n getResourcePage(\n 'BackofficeAcceptInvitationPage',\n // eslint-disable-next-line arrow-body-style\n async () => import('../pages/BackofficeAcceptInvitationPage.js'),\n );\n\ntype PreparedDetailUnknownPage = {\n id: string;\n pagePath: string;\n entityManifest: BackofficeEntityManifestMap[string];\n entityConfig: BackofficeResolvedDetailLayoutFacetConfigBase;\n};\n\ntype PreparedLayout = {\n permissionsQuery: PreloadedQuery<OperationType> | null;\n authStatusQuery: PreloadedQuery<OperationType> | null;\n};\n\nconst normalizeBaseSegment = (value: string): string => {\n const trimmed = value.trim();\n if (trimmed === '' || trimmed === '/') {\n return '';\n }\n return trimmed.replace(/^\\/+|\\/+$/g, '');\n};\n\nconst normalizePath = (value: string): string => {\n const trimmed = value.trim();\n if (trimmed === '') {\n return '/';\n }\n return `/${trimmed}`.replace(/\\/+/g, '/');\n};\n\nconst buildScopedPath = (baseSegment: string, path: string): string => {\n const normalizedPath = path.replace(/^\\/+|\\/+$/g, '');\n if (baseSegment === '') {\n return normalizedPath;\n }\n if (normalizedPath === '') {\n return baseSegment;\n }\n return `${baseSegment}/${normalizedPath}`;\n};\n\nconst buildScopedAbsolutePath = (baseSegment: string, path: string): string => {\n return normalizePath(buildScopedPath(baseSegment, path));\n};\n\nconst buildRelativePath = (\n absolutePath: string,\n baseSegment: string,\n): string => {\n const normalized = normalizePath(absolutePath);\n const basePrefix = baseSegment === '' ? '' : `/${baseSegment}`;\n if (basePrefix !== '' && normalized.startsWith(basePrefix)) {\n return normalized.slice(basePrefix.length).replace(/^\\/+/, '');\n }\n return normalized.replace(/^\\/+/, '');\n};\n\nconst resolveActiveEntityIdFromRoute = (\n route: { routes: AnyRoute[] } | null,\n routeEntityIdMap: WeakMap<AnyRoute, string>,\n): string | null => {\n if (route?.routes == null) {\n return null;\n }\n for (let index = route.routes.length - 1; index >= 0; index -= 1) {\n const routeEntry = route.routes[index];\n if (routeEntry != null) {\n const entityId = routeEntityIdMap.get(routeEntry);\n if (entityId != null) {\n return entityId;\n }\n }\n }\n return null;\n};\n\nconst toSearchParams = (query: Record<string, unknown>): URLSearchParams => {\n const params = new URLSearchParams();\n Object.entries(query).forEach(([key, value]) => {\n if (value == null) {\n return;\n }\n if (Array.isArray(value)) {\n value.forEach((entry) => {\n if (entry == null) {\n return;\n }\n params.append(key, String(entry));\n });\n return;\n }\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n params.set(key, String(value));\n });\n return params;\n};\n\nconst rBackoffice = r<BackofficeRouterContext>;\n\n/**\n * Creates backoffice routes based on the provided configuration\n */\nexport function createBackofficeRoutes(\n input: CreateBackofficeRoutesInput,\n): Route<BackofficeRouterContext, any>[] {\n const { basePath, entityManifest, entityRegistry, sidebar, auth, dashboard } =\n input;\n const baseSegment = normalizeBaseSegment(basePath);\n const loginPath = buildScopedPath(baseSegment, 'login');\n const passwordResetRequestPath = buildScopedPath(baseSegment, 'login/reset');\n const passwordResetCompletePath = buildScopedPath(\n baseSegment,\n 'login/reset/complete',\n );\n const verifyEmailPath = buildScopedPath(baseSegment, 'verify-email');\n const acceptInvitationPath = buildScopedPath(\n baseSegment,\n 'accept-invitation',\n );\n const loginRedirectPath = buildScopedAbsolutePath(baseSegment, 'login');\n const entities = entityManifest;\n const groups = resolveSidebarGroups(entities, sidebar);\n const entityGroupLookup = buildEntityGroupLookup(groups);\n const entityIdToGroupId = new Map<string, string>();\n entityGroupLookup.forEach((value, entityId) => {\n entityIdToGroupId.set(entityId, value.groupId);\n });\n const routeEntityIdMap = new WeakMap<AnyRoute, string>();\n\n const permissionsQuery = sidebar?.permissionsQuery;\n const layoutPrepare = async ({\n context,\n }: {\n context: BackofficeRouterContext;\n }) => {\n const sessionAuth = await auth.session.load();\n const permissionsQueryRef =\n permissionsQuery != null\n ? loadQuery<OperationType>(\n context.relayEnvironment,\n permissionsQuery,\n {},\n )\n : null;\n const authStatusQueryRef =\n sessionAuth.authStatusQuery != null\n ? loadQuery<OperationType>(\n context.relayEnvironment,\n sessionAuth.authStatusQuery,\n {},\n { fetchPolicy: 'network-only' },\n )\n : null;\n return {\n permissionsQuery: permissionsQueryRef,\n authStatusQuery: authStatusQueryRef,\n };\n };\n\n const dashboardRoute = rBackoffice({\n path: '',\n resourcePage: BackofficeDashboardPageResource,\n prepare: async () => {\n if (dashboard == null) {\n return null;\n }\n await dashboard.load();\n return null;\n },\n render: ({ Component }) => {\n if (Component == null) {\n return null;\n }\n return <Component />;\n },\n });\n\n const listEntityEntries = Object.values(entityManifest).filter((entity) => {\n return entity.kind === 'list-detail';\n });\n\n const entityRoutes = listEntityEntries.map((entityManifestItem) => {\n const listPath = entityManifestItem.routes.list;\n const listRelative = buildRelativePath(listPath, baseSegment);\n const children: Route<any, any>[] = [];\n\n if (entityManifestItem.hasList) {\n const listRoute = rBackoffice({\n path: '',\n resourcePage: BackofficeEntityListPageResource,\n prepare: async ({ context, query }) => {\n const entityModule = await entityRegistry.loadListEntity(\n entityManifestItem.id,\n );\n const { config } = entityModule;\n const { list, listUrlCodec, listDefaults } = config;\n if (listUrlCodec == null || listDefaults == null) {\n throw new Error(\n `Backoffice entity ${entityManifestItem.id} does not expose a list configuration.`,\n );\n }\n const params = toSearchParams(query);\n const state = listUrlCodec.parse(params);\n const { pageSize } = BACKOFFICE_LIST_DEFAULTS;\n const variablesBase = {\n where: state.where,\n sort: state.sort ?? listDefaults.sort,\n count: pageSize,\n cursor: null,\n };\n const variables =\n list.buildVariables != null\n ? list.buildVariables(variablesBase)\n : variablesBase;\n const queryRef = loadQuery<OperationType>(\n context.relayEnvironment,\n list.query,\n variables,\n );\n const prepared: BackofficePreparedListRoute = {\n entityId: entityManifestItem.id,\n entityManifest: entityManifestItem,\n entityConfig: config,\n query: queryRef,\n };\n return prepared;\n },\n render: ({ prepared, Component }) => {\n if (Component == null) {\n return null;\n }\n const preparedRoute = prepared as BackofficePreparedListRoute;\n return (\n <Component\n entityManifest={preparedRoute.entityManifest}\n config={preparedRoute.entityConfig}\n prepared={preparedRoute}\n />\n );\n },\n });\n routeEntityIdMap.set(listRoute, entityManifestItem.id);\n children.push(listRoute);\n }\n\n const detailLayoutRoute = rBackoffice({\n path: ':id',\n resourcePage: BackofficeEntityDetailLayoutPageResource,\n prepare: async ({ context, variables }) => {\n const entityModule = await entityRegistry.loadDetailLayoutEntity(\n entityManifestItem.id,\n );\n const { config } = entityModule;\n const rawId = String(variables.id ?? '');\n const layoutBuildResult =\n config.layoutPage.buildVariables != null\n ? config.layoutPage.buildVariables({\n id: rawId,\n })\n : { variables: { id: rawId } };\n const layoutQueryRef = loadQuery<OperationType>(\n context.relayEnvironment,\n config.layoutPage.query,\n layoutBuildResult.variables as never,\n );\n return {\n entityId: entityManifestItem.id,\n entityManifest: entityManifestItem,\n entityConfig: config,\n layoutQuery: layoutQueryRef,\n id: rawId,\n } satisfies BackofficePreparedDetailLayoutRoute;\n },\n render: ({ children: detailChildren, prepared, Component }) => {\n if (Component == null) {\n return null;\n }\n const preparedRoute = prepared as BackofficePreparedDetailLayoutRoute;\n return (\n <Component\n entityManifest={preparedRoute.entityManifest}\n config={preparedRoute.entityConfig}\n prepared={preparedRoute}\n >\n {detailChildren}\n </Component>\n );\n },\n children: [\n rBackoffice({\n path: '',\n resourcePage: WrapperPageResource,\n prepare: ({ variables }) => {\n const rawId = String(variables.id ?? '').trim();\n return {\n redirectTo:\n rawId === ''\n ? null\n : entityManifestItem.routes.detailPage(\n rawId,\n entityManifestItem.defaultDetailPageId ?? 'overview',\n ),\n };\n },\n render: ({ prepared }) => {\n const redirectTo =\n (prepared as { redirectTo?: string | null }).redirectTo ?? null;\n if (redirectTo == null) {\n return null;\n }\n throw new HttpRedirect(redirectTo);\n },\n }),\n ...(entityManifestItem.detailPages ?? []).map((pageManifest) => {\n return rBackoffice({\n path: pageManifest.pathSegment,\n resourcePage: BackofficeEntityDetailPageResource,\n prepare: async ({ context, variables }) => {\n const rawId = String(variables.id ?? '');\n const pageModule = await entityRegistry.loadDetailPageEntity(\n entityManifestItem.id,\n pageManifest.id,\n );\n const pageBuildResult =\n pageModule.config.page.buildVariables != null\n ? pageModule.config.page.buildVariables({\n id: rawId,\n })\n : { variables: { id: rawId } };\n const pageQueryRef = loadQuery<OperationType>(\n context.relayEnvironment,\n pageModule.config.page.query,\n pageBuildResult.variables as never,\n );\n return {\n entityId: entityManifestItem.id,\n entityManifest: entityManifestItem,\n entityConfig:\n pageModule.config as unknown as BackofficeResolvedDetailLayoutFacetConfigBase,\n detailId: pageBuildResult.detailId,\n id: rawId,\n pageConfig: pageModule.config,\n pageQuery: pageQueryRef,\n pageId: pageManifest.id,\n pagePath: pageManifest.pathSegment,\n } satisfies BackofficePreparedDetailPageRoute;\n },\n render: ({ prepared, Component }) => {\n if (Component == null) {\n return null;\n }\n const preparedRoute =\n prepared as BackofficePreparedDetailPageRoute;\n return (\n <Component\n entityManifest={preparedRoute.entityManifest}\n config={preparedRoute.entityConfig}\n prepared={preparedRoute}\n />\n );\n },\n });\n }),\n rBackoffice({\n path: ':pagePath',\n resourcePage: BackofficeEntityDetailUnknownPageRedirectResource,\n prepare: async ({ variables }) => {\n const entityModule = await entityRegistry.loadDetailLayoutEntity(\n entityManifestItem.id,\n );\n const rawId = String(variables.id ?? '');\n const rawPagePath = String(variables.pagePath ?? '');\n return {\n entityManifest: entityManifestItem,\n entityConfig: entityModule.config,\n id: rawId,\n pagePath: rawPagePath,\n };\n },\n render: ({ prepared, Component }) => {\n if (Component == null) {\n return null;\n }\n const preparedDetail = prepared as PreparedDetailUnknownPage;\n return (\n <Component\n entityManifest={preparedDetail.entityManifest}\n config={preparedDetail.entityConfig}\n prepared={preparedDetail}\n />\n );\n },\n }),\n ],\n });\n routeEntityIdMap.set(detailLayoutRoute, entityManifestItem.id);\n children.push(detailLayoutRoute);\n\n return rBackoffice({\n path: listRelative,\n children,\n resourcePage: WrapperPageResource,\n });\n });\n\n const toolsRoutes = Object.values(entityManifest)\n .filter((entity) => {\n return entity.kind === 'tool';\n })\n .map((toolManifest) => {\n const toolRelative = buildRelativePath(\n toolManifest.routes.list,\n baseSegment,\n );\n const toolRoute = rBackoffice({\n path: toolRelative,\n resourcePage: BackofficeToolsOperationPageResource,\n prepare: async () => {\n const toolModule = await entityRegistry.loadToolEntity(\n toolManifest.id,\n );\n return {\n entityId: toolManifest.id,\n entityManifest: toolManifest,\n entityConfig: toolModule.config,\n } satisfies BackofficePreparedToolRoute;\n },\n render: ({ prepared, Component }) => {\n if (Component == null) {\n return null;\n }\n const preparedTool = prepared as BackofficePreparedToolRoute;\n return (\n <Component\n entityManifest={preparedTool.entityManifest}\n operation={preparedTool.entityConfig.tool.operation}\n toolId={preparedTool.entityConfig.id}\n />\n );\n },\n });\n routeEntityIdMap.set(toolRoute, toolManifest.id);\n return toolRoute;\n });\n\n const layoutRoute = rBackoffice({\n path: baseSegment,\n resourcePage: BackofficeLayoutPageResource,\n prepare: layoutPrepare,\n render: ({ children, prepared, route, Component }) => {\n if (Component == null) {\n return null;\n }\n const preparedLayout = prepared as PreparedLayout | undefined;\n const activeEntityId = resolveActiveEntityIdFromRoute(\n route,\n routeEntityIdMap,\n );\n const activeGroupId =\n activeEntityId != null\n ? (entityIdToGroupId.get(activeEntityId) ?? null)\n : null;\n let authStatus: {\n isLoggedIn?: boolean | null;\n me?: {\n id: string;\n firstName: string;\n lastName: string;\n email: string;\n initials: string;\n } | null;\n } | null = null;\n const authStatusQuery = auth.session.get()?.authStatusQuery ?? null;\n if (authStatusQuery != null && preparedLayout?.authStatusQuery != null) {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const data = usePreloadedQuery(\n authStatusQuery,\n preparedLayout.authStatusQuery,\n );\n authStatus = data as {\n isLoggedIn?: boolean | null;\n me?: {\n id: string;\n firstName: string;\n lastName: string;\n email: string;\n initials: string;\n } | null;\n };\n const { isLoggedIn } = authStatus;\n if (!isLoggedIn) {\n throw new HttpRedirect(loginRedirectPath);\n }\n }\n const layoutNode = (\n <Component\n permissionsQuery={sidebar?.permissionsQuery}\n prepared={preparedLayout?.permissionsQuery ?? null}\n authStatus={authStatus}\n activeGroupId={activeGroupId}\n >\n {children}\n </Component>\n );\n return layoutNode;\n },\n children: [dashboardRoute, ...entityRoutes, ...toolsRoutes],\n });\n\n const routes: Route<BackofficeRouterContext, any>[] = [\n rBackoffice({\n path: loginPath,\n resourcePage: BackofficeLoginPageResource,\n prepare: async ({ context }) => {\n const loginAuth = await auth.login.load();\n const queryRef = loadQuery<OperationType>(\n context.relayEnvironment,\n loginAuth.loginQuery,\n {},\n );\n return { query: queryRef };\n },\n render: ({ prepared, Component }) => {\n if (Component == null) {\n return null;\n }\n return (\n <Component\n prepared={prepared as { query: PreloadedQuery<OperationType> }}\n />\n );\n },\n }),\n rBackoffice({\n path: passwordResetRequestPath,\n resourcePage: BackofficePasswordResetRequestPageResource,\n prepare: async () => {\n await auth.passwordResetRequest.load();\n return null;\n },\n render: ({ Component }) => {\n if (Component == null) {\n return null;\n }\n return <Component />;\n },\n }),\n rBackoffice({\n path: passwordResetCompletePath,\n resourcePage: BackofficePasswordResetCompletePageResource,\n prepare: async () => {\n await auth.passwordResetComplete.load();\n return null;\n },\n render: ({ Component }) => {\n if (Component == null) {\n return null;\n }\n return <Component />;\n },\n }),\n rBackoffice({\n path: verifyEmailPath,\n resourcePage: BackofficeVerifyEmailPageResource,\n prepare: async () => {\n await auth.verifyEmail.load();\n return null;\n },\n render: ({ Component }) => {\n if (Component == null) {\n return null;\n }\n return <Component />;\n },\n }),\n ];\n\n if (auth.hasAcceptInvitation === true || auth.acceptInvitation != null) {\n routes.push(\n rBackoffice({\n path: acceptInvitationPath,\n resourcePage: BackofficeAcceptInvitationPageResource,\n prepare: async () => {\n await auth.acceptInvitation?.load();\n return null;\n },\n render: ({ Component }) => {\n if (Component == null) {\n return null;\n }\n return <Component />;\n },\n }),\n );\n }\n\n routes.push(layoutRoute);\n\n return routes;\n}\n\nexport default createBackofficeRoutes;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"createBackofficeRoutes.js","names":[],"sources":["../../../src/router/createBackofficeRoutes.tsx"],"sourcesContent":["/* eslint-disable no-ternary */\nimport {\n getResourcePage,\n HttpRedirect,\n r,\n type AnyRoute,\n type ResourcePage,\n type Route,\n} from '@plumile/router';\nimport * as ReactRelay from 'react-relay';\nimport type { PreloadedQuery } from 'react-relay';\nimport type { Environment, OperationType } from 'relay-runtime';\n\nimport { BACKOFFICE_LIST_DEFAULTS } from '@plumile/backoffice-core/constants.js';\nimport type {\n BackofficeEntityManifestMap,\n BackofficePreparedDetailLayoutRoute,\n BackofficePreparedDetailPageRoute,\n BackofficePreparedListRoute,\n BackofficePreparedToolRoute,\n BackofficeResolvedDetailLayoutFacetConfigBase,\n} from '@plumile/backoffice-core/types.js';\n\nimport type {\n BackofficeAuthConfig,\n BackofficeDashboardModule,\n BackofficeSidebarConfig,\n} from '../provider/types.js';\nimport {\n buildEntityGroupLookup,\n resolveSidebarGroups,\n} from '../components/backoffice/layout/sidebarUtils.js';\nimport type { BackofficeEntityRegistry } from '../provider/entityRegistry.js';\n\nconst { loadQuery, usePreloadedQuery } = ReactRelay;\n\nexport type CreateBackofficeRoutesInput = {\n basePath: string;\n entityManifest: BackofficeEntityManifestMap;\n entityRegistry: BackofficeEntityRegistry;\n sidebar?: BackofficeSidebarConfig;\n auth: BackofficeAuthConfig;\n dashboard?: BackofficeDashboardModule;\n toolsOperationPage?: ResourcePage | null;\n};\n\nexport type BackofficeRouterContext = {\n relayEnvironment: Environment;\n};\n\nexport const WrapperPageResource: ResourcePage | null = getResourcePage(\n 'WrapperPage',\n // eslint-disable-next-line arrow-body-style\n async () => import('@plumile/ui/pages/WrapperPage.js'),\n);\n\nexport const BackofficeLayoutPageResource: ResourcePage | null =\n getResourcePage(\n 'BackofficeLayoutPage',\n // eslint-disable-next-line arrow-body-style\n async () => import('../pages/BackofficeLayoutPage.js'),\n );\n\nexport const BackofficeEntityListPageResource: ResourcePage | null =\n getResourcePage(\n 'BackofficeEntityListPage',\n // eslint-disable-next-line arrow-body-style\n async () => import('../pages/BackofficeEntityListPage.js'),\n );\n\nexport const BackofficeEntityDetailPageResource: ResourcePage | null =\n getResourcePage(\n 'BackofficeEntityDetailPage',\n // eslint-disable-next-line arrow-body-style\n async () => import('../pages/BackofficeEntityDetailPage.js'),\n );\n\nexport const BackofficeEntityDetailLayoutPageResource: ResourcePage | null =\n getResourcePage(\n 'BackofficeEntityDetailLayoutPage',\n // eslint-disable-next-line arrow-body-style\n async () => import('../pages/BackofficeEntityDetailLayoutPage.js'),\n );\n\nexport const BackofficeEntityDetailUnknownPageRedirectResource: ResourcePage | null =\n getResourcePage(\n 'BackofficeEntityDetailUnknownPageRedirect',\n // eslint-disable-next-line arrow-body-style\n async () => import('../pages/BackofficeEntityDetailUnknownPageRedirect.js'),\n );\n\nexport const BackofficeDashboardPageResource: ResourcePage | null =\n getResourcePage(\n 'BackofficeDashboardPage',\n // eslint-disable-next-line arrow-body-style\n async () => import('../pages/BackofficeDashboardPage.js'),\n );\n\nexport const BackofficeLoginPageResource: ResourcePage | null = getResourcePage(\n 'BackofficeLoginPage',\n // eslint-disable-next-line arrow-body-style\n async () => import('../pages/BackofficeLoginPage.js'),\n);\n\nexport const BackofficePasswordResetRequestPageResource: ResourcePage | null =\n getResourcePage(\n 'BackofficePasswordResetRequestPage',\n // eslint-disable-next-line arrow-body-style\n async () => import('../pages/BackofficePasswordResetRequestPage.js'),\n );\n\nexport const BackofficePasswordResetCompletePageResource: ResourcePage | null =\n getResourcePage(\n 'BackofficePasswordResetCompletePage',\n // eslint-disable-next-line arrow-body-style\n async () => import('../pages/BackofficePasswordResetCompletePage.js'),\n );\n\nexport const BackofficeVerifyEmailPageResource: ResourcePage | null =\n getResourcePage(\n 'BackofficeVerifyEmailPage',\n // eslint-disable-next-line arrow-body-style\n async () => import('../pages/BackofficeVerifyEmailPage.js'),\n );\n\nexport const BackofficeAcceptInvitationPageResource: ResourcePage | null =\n getResourcePage(\n 'BackofficeAcceptInvitationPage',\n // eslint-disable-next-line arrow-body-style\n async () => import('../pages/BackofficeAcceptInvitationPage.js'),\n );\n\ntype PreparedDetailUnknownPage = {\n id: string;\n pagePath: string;\n entityManifest: BackofficeEntityManifestMap[string];\n entityConfig: BackofficeResolvedDetailLayoutFacetConfigBase;\n};\n\ntype PreparedLayout = {\n permissionsQuery: PreloadedQuery<OperationType> | null;\n authStatusQuery: PreloadedQuery<OperationType> | null;\n};\n\nconst normalizeBaseSegment = (value: string): string => {\n const trimmed = value.trim();\n if (trimmed === '' || trimmed === '/') {\n return '';\n }\n return trimmed.replace(/^\\/+|\\/+$/g, '');\n};\n\nconst normalizePath = (value: string): string => {\n const trimmed = value.trim();\n if (trimmed === '') {\n return '/';\n }\n return `/${trimmed}`.replace(/\\/+/g, '/');\n};\n\nconst buildScopedPath = (baseSegment: string, path: string): string => {\n const normalizedPath = path.replace(/^\\/+|\\/+$/g, '');\n if (baseSegment === '') {\n return normalizedPath;\n }\n if (normalizedPath === '') {\n return baseSegment;\n }\n return `${baseSegment}/${normalizedPath}`;\n};\n\nconst buildScopedAbsolutePath = (baseSegment: string, path: string): string => {\n return normalizePath(buildScopedPath(baseSegment, path));\n};\n\nconst buildRelativePath = (\n absolutePath: string,\n baseSegment: string,\n): string => {\n const normalized = normalizePath(absolutePath);\n const basePrefix = baseSegment === '' ? '' : `/${baseSegment}`;\n if (basePrefix !== '' && normalized.startsWith(basePrefix)) {\n return normalized.slice(basePrefix.length).replace(/^\\/+/, '');\n }\n return normalized.replace(/^\\/+/, '');\n};\n\nconst resolveActiveEntityIdFromRoute = (\n route: { routes: AnyRoute[] } | null,\n routeEntityIdMap: WeakMap<AnyRoute, string>,\n): string | null => {\n if (route?.routes == null) {\n return null;\n }\n for (let index = route.routes.length - 1; index >= 0; index -= 1) {\n const routeEntry = route.routes[index];\n if (routeEntry != null) {\n const entityId = routeEntityIdMap.get(routeEntry);\n if (entityId != null) {\n return entityId;\n }\n }\n }\n return null;\n};\n\nconst toSearchParams = (query: Record<string, unknown>): URLSearchParams => {\n const params = new URLSearchParams();\n Object.entries(query).forEach(([key, value]) => {\n if (value == null) {\n return;\n }\n if (Array.isArray(value)) {\n value.forEach((entry) => {\n if (entry == null) {\n return;\n }\n params.append(key, String(entry));\n });\n return;\n }\n // eslint-disable-next-line @typescript-eslint/no-base-to-string\n params.set(key, String(value));\n });\n return params;\n};\n\nconst rBackoffice = r<BackofficeRouterContext>;\n\n/**\n * Creates backoffice routes based on the provided configuration\n */\nexport function createBackofficeRoutes(\n input: CreateBackofficeRoutesInput,\n): Route<BackofficeRouterContext, any>[] {\n const { basePath, entityManifest, entityRegistry, sidebar, auth, dashboard } =\n input;\n const baseSegment = normalizeBaseSegment(basePath);\n const loginPath = buildScopedPath(baseSegment, 'login');\n const passwordResetRequestPath = buildScopedPath(baseSegment, 'login/reset');\n const passwordResetCompletePath = buildScopedPath(\n baseSegment,\n 'login/reset/complete',\n );\n const verifyEmailPath = buildScopedPath(baseSegment, 'verify-email');\n const acceptInvitationPath = buildScopedPath(\n baseSegment,\n 'accept-invitation',\n );\n const loginRedirectPath = buildScopedAbsolutePath(baseSegment, 'login');\n const entities = entityManifest;\n const groups = resolveSidebarGroups(entities, sidebar);\n const entityGroupLookup = buildEntityGroupLookup(groups);\n const entityIdToGroupId = new Map<string, string>();\n entityGroupLookup.forEach((value, entityId) => {\n entityIdToGroupId.set(entityId, value.groupId);\n });\n const routeEntityIdMap = new WeakMap<AnyRoute, string>();\n\n const permissionsQuery = sidebar?.permissionsQuery;\n const layoutPrepare = async ({\n context,\n }: {\n context: BackofficeRouterContext;\n }) => {\n const sessionAuth = await auth.session.load();\n const permissionsQueryRef =\n permissionsQuery != null\n ? loadQuery<OperationType>(\n context.relayEnvironment,\n permissionsQuery,\n {},\n )\n : null;\n const authStatusQueryRef =\n sessionAuth.authStatusQuery != null\n ? loadQuery<OperationType>(\n context.relayEnvironment,\n sessionAuth.authStatusQuery,\n {},\n { fetchPolicy: 'network-only' },\n )\n : null;\n return {\n permissionsQuery: permissionsQueryRef,\n authStatusQuery: authStatusQueryRef,\n };\n };\n\n const dashboardRoute = rBackoffice({\n path: '',\n resourcePage: BackofficeDashboardPageResource,\n prepare: async () => {\n if (dashboard == null) {\n return null;\n }\n await dashboard.load();\n return null;\n },\n render: ({ Component }) => {\n if (Component == null) {\n return null;\n }\n return <Component />;\n },\n });\n\n const listEntityEntries = Object.values(entityManifest).filter((entity) => {\n return entity.kind === 'list-detail';\n });\n\n const entityRoutes = listEntityEntries.map((entityManifestItem) => {\n const listPath = entityManifestItem.routes.list;\n const listRelative = buildRelativePath(listPath, baseSegment);\n const children: Route<any, any>[] = [];\n\n if (entityManifestItem.hasList) {\n const listRoute = rBackoffice({\n path: '',\n resourcePage: BackofficeEntityListPageResource,\n prepare: async ({ context, query }) => {\n const entityModule = await entityRegistry.loadListEntity(\n entityManifestItem.id,\n );\n const { config } = entityModule;\n const { list, listUrlCodec, listDefaults } = config;\n if (listUrlCodec == null || listDefaults == null) {\n throw new Error(\n `Backoffice entity ${entityManifestItem.id} does not expose a list configuration.`,\n );\n }\n const params = toSearchParams(query);\n const state = listUrlCodec.parse(params);\n const { pageSize } = BACKOFFICE_LIST_DEFAULTS;\n const variablesBase = {\n where: state.where,\n sort: state.sort ?? listDefaults.sort,\n count: pageSize,\n cursor: null,\n };\n const variables =\n list.buildVariables != null\n ? list.buildVariables(variablesBase)\n : variablesBase;\n const queryRef = loadQuery<OperationType>(\n context.relayEnvironment,\n list.query,\n variables,\n );\n const prepared: BackofficePreparedListRoute = {\n entityId: entityManifestItem.id,\n entityManifest: entityManifestItem,\n entityConfig: config,\n query: queryRef,\n };\n return prepared;\n },\n render: ({ prepared, Component }) => {\n if (Component == null) {\n return null;\n }\n const preparedRoute = prepared as BackofficePreparedListRoute;\n return (\n <Component\n entityManifest={preparedRoute.entityManifest}\n config={preparedRoute.entityConfig}\n prepared={preparedRoute}\n />\n );\n },\n });\n routeEntityIdMap.set(listRoute, entityManifestItem.id);\n children.push(listRoute);\n }\n\n const detailLayoutRoute = rBackoffice({\n path: ':id',\n resourcePage: BackofficeEntityDetailLayoutPageResource,\n prepare: async ({ context, variables }) => {\n const entityModule = await entityRegistry.loadDetailLayoutEntity(\n entityManifestItem.id,\n );\n const { config } = entityModule;\n const rawId = String(variables.id ?? '');\n const layoutBuildResult =\n config.layoutPage.buildVariables != null\n ? config.layoutPage.buildVariables({\n id: rawId,\n })\n : { variables: { id: rawId } };\n const layoutQueryRef = loadQuery<OperationType>(\n context.relayEnvironment,\n config.layoutPage.query,\n layoutBuildResult.variables as never,\n );\n return {\n entityId: entityManifestItem.id,\n entityManifest: entityManifestItem,\n entityConfig: config,\n layoutQuery: layoutQueryRef,\n id: rawId,\n } satisfies BackofficePreparedDetailLayoutRoute;\n },\n render: ({ children: detailChildren, prepared, Component }) => {\n if (Component == null) {\n return null;\n }\n const preparedRoute = prepared as BackofficePreparedDetailLayoutRoute;\n return (\n <Component\n entityManifest={preparedRoute.entityManifest}\n config={preparedRoute.entityConfig}\n prepared={preparedRoute}\n >\n {detailChildren}\n </Component>\n );\n },\n children: [\n rBackoffice({\n path: '',\n resourcePage: WrapperPageResource,\n prepare: ({ variables }) => {\n const rawId = String(variables.id ?? '').trim();\n return {\n redirectTo:\n rawId === ''\n ? null\n : entityManifestItem.routes.detailPage(\n rawId,\n entityManifestItem.defaultDetailPageId ?? 'overview',\n ),\n };\n },\n render: ({ prepared }) => {\n const redirectTo =\n (prepared as { redirectTo?: string | null }).redirectTo ?? null;\n if (redirectTo == null) {\n return null;\n }\n throw new HttpRedirect(redirectTo);\n },\n }),\n ...(entityManifestItem.detailPages ?? []).map((pageManifest) => {\n return rBackoffice({\n path: pageManifest.pathSegment,\n resourcePage: BackofficeEntityDetailPageResource,\n prepare: async ({ context, variables }) => {\n const rawId = String(variables.id ?? '');\n const pageModule = await entityRegistry.loadDetailPageEntity(\n entityManifestItem.id,\n pageManifest.id,\n );\n const pageBuildResult =\n pageModule.config.page.buildVariables != null\n ? pageModule.config.page.buildVariables({\n id: rawId,\n })\n : { variables: { id: rawId } };\n const pageQueryRef = loadQuery<OperationType>(\n context.relayEnvironment,\n pageModule.config.page.query,\n pageBuildResult.variables as never,\n );\n return {\n entityId: entityManifestItem.id,\n entityManifest: entityManifestItem,\n entityConfig:\n pageModule.config as unknown as BackofficeResolvedDetailLayoutFacetConfigBase,\n detailId: pageBuildResult.detailId,\n id: rawId,\n pageConfig: pageModule.config,\n pageQuery: pageQueryRef,\n pageId: pageManifest.id,\n pagePath: pageManifest.pathSegment,\n } satisfies BackofficePreparedDetailPageRoute;\n },\n render: ({ prepared, Component }) => {\n if (Component == null) {\n return null;\n }\n const preparedRoute =\n prepared as BackofficePreparedDetailPageRoute;\n return (\n <Component\n entityManifest={preparedRoute.entityManifest}\n config={preparedRoute.entityConfig}\n prepared={preparedRoute}\n />\n );\n },\n });\n }),\n rBackoffice({\n path: ':pagePath',\n resourcePage: BackofficeEntityDetailUnknownPageRedirectResource,\n prepare: async ({ variables }) => {\n const entityModule = await entityRegistry.loadDetailLayoutEntity(\n entityManifestItem.id,\n );\n const rawId = String(variables.id ?? '');\n const rawPagePath = String(variables.pagePath ?? '');\n return {\n entityManifest: entityManifestItem,\n entityConfig: entityModule.config,\n id: rawId,\n pagePath: rawPagePath,\n };\n },\n render: ({ prepared, Component }) => {\n if (Component == null) {\n return null;\n }\n const preparedDetail = prepared as PreparedDetailUnknownPage;\n return (\n <Component\n entityManifest={preparedDetail.entityManifest}\n config={preparedDetail.entityConfig}\n prepared={preparedDetail}\n />\n );\n },\n }),\n ],\n });\n routeEntityIdMap.set(detailLayoutRoute, entityManifestItem.id);\n children.push(detailLayoutRoute);\n\n return rBackoffice({\n path: listRelative,\n children,\n resourcePage: WrapperPageResource,\n });\n });\n\n const toolsRoutes = Object.values(entityManifest)\n .filter((entity) => {\n return entity.kind === 'tool';\n })\n .map((toolManifest) => {\n const toolRelative = buildRelativePath(\n toolManifest.routes.list,\n baseSegment,\n );\n const toolRoute = rBackoffice({\n path: toolRelative,\n resourcePage: input.toolsOperationPage ?? null,\n prepare: async () => {\n const toolModule = await entityRegistry.loadToolEntity(\n toolManifest.id,\n );\n return {\n entityId: toolManifest.id,\n entityManifest: toolManifest,\n entityConfig: toolModule.config,\n } satisfies BackofficePreparedToolRoute;\n },\n render: ({ prepared, Component }) => {\n if (Component == null) {\n return null;\n }\n const preparedTool = prepared as BackofficePreparedToolRoute;\n return (\n <Component\n entityManifest={preparedTool.entityManifest}\n operation={preparedTool.entityConfig.tool.operation}\n toolId={preparedTool.entityConfig.id}\n />\n );\n },\n });\n routeEntityIdMap.set(toolRoute, toolManifest.id);\n return toolRoute;\n });\n\n const layoutRoute = rBackoffice({\n path: baseSegment,\n resourcePage: BackofficeLayoutPageResource,\n prepare: layoutPrepare,\n render: ({ children, prepared, route, Component }) => {\n if (Component == null) {\n return null;\n }\n const preparedLayout = prepared as PreparedLayout | undefined;\n const activeEntityId = resolveActiveEntityIdFromRoute(\n route,\n routeEntityIdMap,\n );\n const activeGroupId =\n activeEntityId != null\n ? (entityIdToGroupId.get(activeEntityId) ?? null)\n : null;\n let authStatus: {\n isLoggedIn?: boolean | null;\n me?: {\n id: string;\n firstName: string;\n lastName: string;\n email: string;\n initials: string;\n } | null;\n } | null = null;\n const authStatusQuery = auth.session.get()?.authStatusQuery ?? null;\n if (authStatusQuery != null && preparedLayout?.authStatusQuery != null) {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const data = usePreloadedQuery(\n authStatusQuery,\n preparedLayout.authStatusQuery,\n );\n authStatus = data as {\n isLoggedIn?: boolean | null;\n me?: {\n id: string;\n firstName: string;\n lastName: string;\n email: string;\n initials: string;\n } | null;\n };\n const { isLoggedIn } = authStatus;\n if (!isLoggedIn) {\n throw new HttpRedirect(loginRedirectPath);\n }\n }\n const layoutNode = (\n <Component\n permissionsQuery={sidebar?.permissionsQuery}\n prepared={preparedLayout?.permissionsQuery ?? null}\n authStatus={authStatus}\n activeGroupId={activeGroupId}\n >\n {children}\n </Component>\n );\n return layoutNode;\n },\n children: [dashboardRoute, ...entityRoutes, ...toolsRoutes],\n });\n\n const routes: Route<BackofficeRouterContext, any>[] = [\n rBackoffice({\n path: loginPath,\n resourcePage: BackofficeLoginPageResource,\n prepare: async ({ context }) => {\n const loginAuth = await auth.login.load();\n const queryRef = loadQuery<OperationType>(\n context.relayEnvironment,\n loginAuth.loginQuery,\n {},\n );\n return { query: queryRef };\n },\n render: ({ prepared, Component }) => {\n if (Component == null) {\n return null;\n }\n return (\n <Component\n prepared={prepared as { query: PreloadedQuery<OperationType> }}\n />\n );\n },\n }),\n rBackoffice({\n path: passwordResetRequestPath,\n resourcePage: BackofficePasswordResetRequestPageResource,\n prepare: async () => {\n await auth.passwordResetRequest.load();\n return null;\n },\n render: ({ Component }) => {\n if (Component == null) {\n return null;\n }\n return <Component />;\n },\n }),\n rBackoffice({\n path: passwordResetCompletePath,\n resourcePage: BackofficePasswordResetCompletePageResource,\n prepare: async () => {\n await auth.passwordResetComplete.load();\n return null;\n },\n render: ({ Component }) => {\n if (Component == null) {\n return null;\n }\n return <Component />;\n },\n }),\n rBackoffice({\n path: verifyEmailPath,\n resourcePage: BackofficeVerifyEmailPageResource,\n prepare: async () => {\n await auth.verifyEmail.load();\n return null;\n },\n render: ({ Component }) => {\n if (Component == null) {\n return null;\n }\n return <Component />;\n },\n }),\n ];\n\n if (auth.hasAcceptInvitation === true || auth.acceptInvitation != null) {\n routes.push(\n rBackoffice({\n path: acceptInvitationPath,\n resourcePage: BackofficeAcceptInvitationPageResource,\n prepare: async () => {\n await auth.acceptInvitation?.load();\n return null;\n },\n render: ({ Component }) => {\n if (Component == null) {\n return null;\n }\n return <Component />;\n },\n }),\n );\n }\n\n routes.push(layoutRoute);\n\n return routes;\n}\n\nexport default createBackofficeRoutes;\n"],"mappings":"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"}
|