@plumile/backoffice-react 0.1.60 → 0.1.62

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.
Files changed (105) hide show
  1. package/lib/esm/components/backoffice/actions/BackofficeEntityActionFormDialog.js +67 -68
  2. package/lib/esm/components/backoffice/actions/BackofficeEntityActionFormDialog.js.map +1 -1
  3. package/lib/esm/components/backoffice/columns/buildDataTableColumns.js +1 -1
  4. package/lib/esm/components/backoffice/columns/buildDataTableColumns.js.map +1 -1
  5. package/lib/esm/components/backoffice/detail/BackofficeDetailBadgeRow.js +1 -1
  6. package/lib/esm/components/backoffice/detail/BackofficeDetailBadgeRow.js.map +1 -1
  7. package/lib/esm/components/backoffice/detail/BackofficeDetailField.js +1 -1
  8. package/lib/esm/components/backoffice/detail/BackofficeDetailField.js.map +1 -1
  9. package/lib/esm/components/backoffice/detail/BackofficeDetailFlagTag.js +1 -1
  10. package/lib/esm/components/backoffice/detail/BackofficeDetailFlagTag.js.map +1 -1
  11. package/lib/esm/components/backoffice/detail/BackofficeDetailRelationListBlock.js +21 -21
  12. package/lib/esm/components/backoffice/detail/BackofficeDetailRelationListBlock.js.map +1 -1
  13. package/lib/esm/components/backoffice/detail/BackofficeDetailTaggedValue.js +1 -1
  14. package/lib/esm/components/backoffice/detail/BackofficeDetailTaggedValue.js.map +1 -1
  15. package/lib/esm/components/backoffice/filters/EntityFilterValue.js +12 -12
  16. package/lib/esm/components/backoffice/filters/EntityFilterValue.js.map +1 -1
  17. package/lib/esm/components/backoffice/layout/buildSidebarSections.js.map +1 -1
  18. package/lib/esm/components/backoffice/layout/mapViewerToSidebarProfileView.js.map +1 -1
  19. package/lib/esm/components/backoffice/pickers/EntityIdPickerDialog.js +19 -19
  20. package/lib/esm/components/backoffice/pickers/EntityIdPickerDialog.js.map +1 -1
  21. package/lib/esm/components/backoffice/pickers/shared/EntityPickerList.js +1 -1
  22. package/lib/esm/components/backoffice/pickers/shared/EntityPickerList.js.map +1 -1
  23. package/lib/esm/components/backoffice/routing/BackofficeContentError.js +1 -1
  24. package/lib/esm/components/backoffice/routing/BackofficeContentError.js.map +1 -1
  25. package/lib/esm/components/backoffice/routing/BackofficeContentFallback.js +1 -1
  26. package/lib/esm/components/backoffice/routing/BackofficeContentFallback.js.map +1 -1
  27. package/lib/esm/components/backoffice/routing/BackofficeRouteFallback.js +1 -1
  28. package/lib/esm/components/backoffice/routing/BackofficeRouteFallback.js.map +1 -1
  29. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js +30 -31
  30. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js.map +1 -1
  31. package/lib/esm/components/backoffice/scaffolds/BackofficeTabbedDetailShell.js +2 -2
  32. package/lib/esm/components/backoffice/scaffolds/BackofficeTabbedDetailShell.js.map +1 -1
  33. package/lib/esm/components/backoffice/tools/BackofficeToolsQueryBoundary.js +1 -1
  34. package/lib/esm/components/backoffice/tools/BackofficeToolsQueryBoundary.js.map +1 -1
  35. package/lib/esm/hooks/useBackofficeAuth.js +13 -13
  36. package/lib/esm/hooks/useBackofficeAuth.js.map +1 -1
  37. package/lib/esm/hooks/useBackofficeSessionAuth.js +8 -8
  38. package/lib/esm/hooks/useBackofficeSessionAuth.js.map +1 -1
  39. package/lib/esm/index.js +18 -2
  40. package/lib/esm/pages/BackofficeDashboardPage.js +24 -24
  41. package/lib/esm/pages/BackofficeDashboardPage.js.map +1 -1
  42. package/lib/esm/pages/BackofficeEntityDetailLayoutPage.js +8 -8
  43. package/lib/esm/pages/BackofficeEntityDetailLayoutPage.js.map +1 -1
  44. package/lib/esm/pages/BackofficeEntityDetailPage.js +86 -87
  45. package/lib/esm/pages/BackofficeEntityDetailPage.js.map +1 -1
  46. package/lib/esm/pages/BackofficeEntityDetailUnknownPageRedirect.js +3 -3
  47. package/lib/esm/pages/BackofficeLayoutPage.js +4 -4
  48. package/lib/esm/pages/BackofficeLayoutPage.js.map +1 -1
  49. package/lib/esm/pages/BackofficeLoginPage.js +4 -4
  50. package/lib/esm/pages/BackofficeLoginPage.js.map +1 -1
  51. package/lib/esm/pages/BackofficePasswordResetCompletePage.js +6 -6
  52. package/lib/esm/pages/BackofficePasswordResetCompletePage.js.map +1 -1
  53. package/lib/esm/pages/BackofficePasswordResetRequestPage.js +4 -4
  54. package/lib/esm/pages/BackofficePasswordResetRequestPage.js.map +1 -1
  55. package/lib/esm/pages/BackofficeToolsOperationPage.js +53 -53
  56. package/lib/esm/pages/BackofficeToolsOperationPage.js.map +1 -1
  57. package/lib/esm/pages/BackofficeVerifyEmailPage.js +6 -6
  58. package/lib/esm/pages/BackofficeVerifyEmailPage.js.map +1 -1
  59. package/lib/esm/pages/detail/buildTabsItems.js.map +1 -1
  60. package/lib/esm/provider/BackofficeProvider.js +0 -2
  61. package/lib/esm/provider/BackofficeProvider.js.map +1 -1
  62. package/lib/esm/relay/RelayProvider.js +4 -4
  63. package/lib/esm/relay/RelayProvider.js.map +1 -1
  64. package/lib/esm/relay/createInlineReader.js +3 -3
  65. package/lib/esm/relay/createInlineReader.js.map +1 -1
  66. package/lib/esm/relay/useRelayEnvironment.js +7 -2
  67. package/lib/esm/relay/useRelayEnvironment.js.map +1 -0
  68. package/lib/esm/router/createBackofficeRoutes.js +81 -81
  69. package/lib/esm/router/createBackofficeRoutes.js.map +1 -1
  70. package/lib/types/components/backoffice/actions/BackofficeEntityActionFormDialog.d.ts.map +1 -1
  71. package/lib/types/components/backoffice/detail/BackofficeDetailFlagTag.d.ts +1 -1
  72. package/lib/types/components/backoffice/detail/BackofficeDetailFlagTag.d.ts.map +1 -1
  73. package/lib/types/components/backoffice/detail/BackofficeDetailRelationListBlock.d.ts.map +1 -1
  74. package/lib/types/components/backoffice/filters/EntityFilterValue.d.ts.map +1 -1
  75. package/lib/types/components/backoffice/layout/buildSidebarSections.d.ts +1 -1
  76. package/lib/types/components/backoffice/layout/buildSidebarSections.d.ts.map +1 -1
  77. package/lib/types/components/backoffice/layout/mapViewerToSidebarProfileView.d.ts +1 -1
  78. package/lib/types/components/backoffice/layout/mapViewerToSidebarProfileView.d.ts.map +1 -1
  79. package/lib/types/components/backoffice/pickers/EntityIdPickerDialog.d.ts.map +1 -1
  80. package/lib/types/components/backoffice/scaffolds/BackofficeEntityListScaffold.d.ts.map +1 -1
  81. package/lib/types/components/backoffice/scaffolds/BackofficeTabbedDetailShell.d.ts +1 -1
  82. package/lib/types/components/backoffice/scaffolds/BackofficeTabbedDetailShell.d.ts.map +1 -1
  83. package/lib/types/hooks/useBackofficeAuth.d.ts.map +1 -1
  84. package/lib/types/hooks/useBackofficeSessionAuth.d.ts.map +1 -1
  85. package/lib/types/index.d.ts +18 -0
  86. package/lib/types/index.d.ts.map +1 -1
  87. package/lib/types/pages/BackofficeDashboardPage.d.ts.map +1 -1
  88. package/lib/types/pages/BackofficeEntityDetailLayoutPage.d.ts.map +1 -1
  89. package/lib/types/pages/BackofficeEntityDetailPage.d.ts.map +1 -1
  90. package/lib/types/pages/BackofficeLoginPage.d.ts +1 -1
  91. package/lib/types/pages/BackofficeLoginPage.d.ts.map +1 -1
  92. package/lib/types/pages/BackofficePasswordResetCompletePage.d.ts.map +1 -1
  93. package/lib/types/pages/BackofficePasswordResetRequestPage.d.ts.map +1 -1
  94. package/lib/types/pages/BackofficeToolsOperationPage.d.ts.map +1 -1
  95. package/lib/types/pages/BackofficeVerifyEmailPage.d.ts.map +1 -1
  96. package/lib/types/pages/detail/buildTabsItems.d.ts +1 -1
  97. package/lib/types/pages/detail/buildTabsItems.d.ts.map +1 -1
  98. package/lib/types/provider/BackofficeProvider.d.ts +0 -2
  99. package/lib/types/provider/BackofficeProvider.d.ts.map +1 -1
  100. package/lib/types/relay/RelayProvider.d.ts.map +1 -1
  101. package/lib/types/relay/createInlineReader.d.ts.map +1 -1
  102. package/lib/types/relay/useRelayEnvironment.d.ts +2 -1
  103. package/lib/types/relay/useRelayEnvironment.d.ts.map +1 -1
  104. package/lib/types/router/createBackofficeRoutes.d.ts.map +1 -1
  105. package/package.json +6 -6
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeProvider.js","names":[],"sources":["../../../src/provider/BackofficeProvider.tsx"],"sourcesContent":["import { StrictMode, useEffect, useMemo, type JSX } from 'react';\nimport {\n createInstance,\n type Resource,\n type ResourceKey,\n type ResourceLanguage,\n} from 'i18next';\nimport { I18nextProvider } from 'react-i18next';\nimport { createRouter, RouterRenderer, RoutingContext } from '@plumile/router';\nimport { ThemeProvider } from '@plumile/ui/theme/ThemeProvider';\n\nimport { type BackofficeEntityManifestMap } from '@plumile/backoffice-core/types.js';\n\nimport { createI18nInstance } from '../i18n/createI18nInstance.js';\nimport { mergeResourceLanguages } from '../i18n/mergeResourceLanguages.js';\nimport { backofficeReactI18nResources } from '../i18n/resources.js';\nimport { RelayProvider } from '../relay/RelayProvider.js';\nimport { useRelayEnvironment } from '../relay/useRelayEnvironment.js';\nimport { configureRelayEnvironment } from '../relay/environment.js';\nimport { BackofficeConfigProvider } from './BackofficeConfigContext.js';\nimport { createBackofficeRoutes } from '../router/createBackofficeRoutes.js';\nimport type { BackofficeProviderProps } from './types.js';\nimport { BackofficeRouteFallback } from '../components/backoffice/routing/BackofficeRouteFallback.js';\nimport { BackofficeRoutePendingBar } from '../components/backoffice/routing/BackofficeRoutePendingBar.js';\nimport { createBackofficeEntityRegistry } from './entityRegistry.js';\n\nimport '@plumile/ui/style.css';\nimport '@plumile/ui-backoffice/style.css';\n\nconst normalizeAbsolutePath = (value: string): string => {\n if (value.trim() === '' || value === '/') {\n return '/';\n }\n if (!value.startsWith('/')) {\n return `/${value}`;\n }\n if (value.endsWith('/')) {\n return value.slice(0, -1);\n }\n return value;\n};\n\nconst prefixRoutePath = (basePath: string, value: string): string => {\n const normalizedPath = normalizeAbsolutePath(value);\n const normalizedBasePath = normalizeAbsolutePath(basePath);\n if (normalizedBasePath === '/') {\n return normalizedPath;\n }\n if (\n normalizedPath === normalizedBasePath ||\n normalizedPath.startsWith(`${normalizedBasePath}/`)\n ) {\n return normalizedPath;\n }\n if (normalizedPath === '/') {\n return normalizedBasePath;\n }\n return `${normalizedBasePath}${normalizedPath}`;\n};\n\nconst resolveEntityManifest = (\n manifest: BackofficeEntityManifestMap,\n basePath: string,\n): BackofficeEntityManifestMap => {\n return Object.fromEntries(\n Object.entries(manifest).map(([entityId, item]) => {\n return [\n entityId,\n {\n ...item,\n routes: {\n list: prefixRoutePath(basePath, item.routes.list),\n detail: (id: string) => {\n return prefixRoutePath(basePath, item.routes.detail(id));\n },\n detailPage: (id: string, pageId: string) => {\n return prefixRoutePath(\n basePath,\n item.routes.detailPage(id, pageId),\n );\n },\n },\n } satisfies BackofficeEntityManifestMap[string],\n ] as const;\n }),\n );\n};\n\nconst asResourceLanguage = (\n value: ResourceKey | undefined,\n): ResourceLanguage => {\n if (typeof value === 'object' && !Array.isArray(value)) {\n return value as ResourceLanguage;\n }\n return {};\n};\n\ntype RouterShellProps = {\n routes: ReturnType<typeof createBackofficeRoutes>;\n};\n\nconst RouterShell = ({ routes }: RouterShellProps): JSX.Element => {\n const relayEnvironment = useRelayEnvironment();\n\n const routerContext = useMemo(() => {\n return { relayEnvironment };\n }, [relayEnvironment]);\n\n const router = useMemo(() => {\n return createRouter(routes, {\n context: routerContext,\n });\n }, [routes, routerContext]);\n\n useEffect(() => {\n return () => {\n router.cleanup();\n };\n }, [router]);\n\n return (\n <RoutingContext.Provider value={router.context}>\n <RouterRenderer\n enableTransition\n fallback={<BackofficeRouteFallback />}\n pending={<BackofficeRoutePendingBar />}\n />\n </RoutingContext.Provider>\n );\n};\n\nexport const BackofficeProvider = (\n props: BackofficeProviderProps,\n): JSX.Element => {\n const basePath = normalizeAbsolutePath(props.basePath ?? '/');\n\n const entityManifest = useMemo(() => {\n return resolveEntityManifest(props.entityManifest, basePath);\n }, [basePath, props.entityManifest]);\n const entityRegistry = useMemo(() => {\n return createBackofficeEntityRegistry(entityManifest, { basePath });\n }, [basePath, entityManifest]);\n\n const graphQLConfig = props.graphql;\n\n useEffect(() => {\n const httpUrl = graphQLConfig.httpUrl ?? graphQLConfig.endpoint;\n const wsUrl = graphQLConfig.wsUrl ?? graphQLConfig.wsEndpoint;\n configureRelayEnvironment({\n httpUrl,\n wsUrl,\n logEvents: graphQLConfig.logEvents,\n getAuthHeaders: graphQLConfig.getAuthHeaders,\n });\n }, [\n graphQLConfig.endpoint,\n graphQLConfig.getAuthHeaders,\n graphQLConfig.httpUrl,\n graphQLConfig.logEvents,\n graphQLConfig.wsEndpoint,\n graphQLConfig.wsUrl,\n ]);\n\n const mergedResources = useMemo(() => {\n const appResources: Resource = props.i18n?.resources ?? {};\n const backofficeReactResources = backofficeReactI18nResources as Resource;\n const locales = new Set([\n ...Object.keys(backofficeReactResources),\n ...Object.keys(appResources),\n ]);\n\n const output: Resource = {};\n\n locales.forEach((locale) => {\n const packageLocale = asResourceLanguage(\n backofficeReactResources[locale],\n );\n const appLocale = asResourceLanguage(appResources[locale]);\n output[locale] = {\n ...packageLocale,\n ...appLocale,\n backofficeReact: mergeResourceLanguages(\n asResourceLanguage(packageLocale.backofficeReact),\n asResourceLanguage(appLocale.backofficeReact),\n ),\n shared: mergeResourceLanguages(\n asResourceLanguage(packageLocale.shared),\n asResourceLanguage(appLocale.shared),\n ),\n };\n });\n\n return output;\n }, [props.i18n?.resources]);\n\n const i18nInstance = useMemo(() => {\n return props.i18n?.instance ?? createInstance();\n }, [props.i18n?.instance]);\n\n useEffect(() => {\n const initOptions = props.i18n?.initOptions ?? {};\n const defaultNs = initOptions.defaultNS ?? 'translations';\n const ns = initOptions.ns ?? [\n 'backofficeReact',\n 'translations',\n 'shared',\n 'ui',\n ];\n createI18nInstance({\n resources: mergedResources,\n lng: props.i18n?.lng,\n fallbackLng: props.i18n?.fallbackLng,\n initOptions: {\n ...initOptions,\n defaultNS: defaultNs,\n ns,\n },\n instance: i18nInstance,\n useLanguageDetector: props.i18n?.useLanguageDetector,\n detection: props.i18n?.detection,\n // eslint-disable-next-line no-console\n }).catch(console.error);\n }, [\n i18nInstance,\n mergedResources,\n props.i18n?.initOptions,\n props.i18n?.detection,\n props.i18n?.fallbackLng,\n props.i18n?.lng,\n props.i18n?.useLanguageDetector,\n ]);\n\n const configValue = useMemo(() => {\n return {\n basePath,\n entities: entityManifest,\n entityManifest,\n entityRegistry,\n sidebar: props.sidebar,\n dashboard: props.dashboard,\n auth: props.auth,\n graphql: props.graphql,\n };\n }, [\n basePath,\n props.auth,\n props.dashboard,\n entityManifest,\n entityRegistry,\n props.graphql,\n props.sidebar,\n ]);\n\n const routes = useMemo(() => {\n return createBackofficeRoutes({\n basePath,\n entityManifest,\n entityRegistry,\n sidebar: props.sidebar,\n auth: props.auth,\n dashboard: props.dashboard,\n });\n }, [\n basePath,\n entityManifest,\n entityRegistry,\n props.auth,\n props.dashboard,\n props.sidebar,\n ]);\n\n return (\n <StrictMode>\n <I18nextProvider i18n={i18nInstance}>\n <ThemeProvider>\n <RelayProvider>\n <BackofficeConfigProvider value={configValue}>\n <RouterShell routes={routes} />\n </BackofficeConfigProvider>\n </RelayProvider>\n </ThemeProvider>\n </I18nextProvider>\n </StrictMode>\n );\n};\n\nexport default BackofficeProvider;\n"],"mappings":"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"}
1
+ {"version":3,"file":"BackofficeProvider.js","names":[],"sources":["../../../src/provider/BackofficeProvider.tsx"],"sourcesContent":["import { StrictMode, useEffect, useMemo, type JSX } from 'react';\nimport {\n createInstance,\n type Resource,\n type ResourceKey,\n type ResourceLanguage,\n} from 'i18next';\nimport { I18nextProvider } from 'react-i18next';\nimport { createRouter, RouterRenderer, RoutingContext } from '@plumile/router';\nimport { ThemeProvider } from '@plumile/ui/theme/ThemeProvider';\n\nimport { type BackofficeEntityManifestMap } from '@plumile/backoffice-core/types.js';\n\nimport { createI18nInstance } from '../i18n/createI18nInstance.js';\nimport { mergeResourceLanguages } from '../i18n/mergeResourceLanguages.js';\nimport { backofficeReactI18nResources } from '../i18n/resources.js';\nimport { RelayProvider } from '../relay/RelayProvider.js';\nimport { useRelayEnvironment } from '../relay/useRelayEnvironment.js';\nimport { configureRelayEnvironment } from '../relay/environment.js';\nimport { BackofficeConfigProvider } from './BackofficeConfigContext.js';\nimport { createBackofficeRoutes } from '../router/createBackofficeRoutes.js';\nimport type { BackofficeProviderProps } from './types.js';\nimport { BackofficeRouteFallback } from '../components/backoffice/routing/BackofficeRouteFallback.js';\nimport { BackofficeRoutePendingBar } from '../components/backoffice/routing/BackofficeRoutePendingBar.js';\nimport { createBackofficeEntityRegistry } from './entityRegistry.js';\n\nconst normalizeAbsolutePath = (value: string): string => {\n if (value.trim() === '' || value === '/') {\n return '/';\n }\n if (!value.startsWith('/')) {\n return `/${value}`;\n }\n if (value.endsWith('/')) {\n return value.slice(0, -1);\n }\n return value;\n};\n\nconst prefixRoutePath = (basePath: string, value: string): string => {\n const normalizedPath = normalizeAbsolutePath(value);\n const normalizedBasePath = normalizeAbsolutePath(basePath);\n if (normalizedBasePath === '/') {\n return normalizedPath;\n }\n if (\n normalizedPath === normalizedBasePath ||\n normalizedPath.startsWith(`${normalizedBasePath}/`)\n ) {\n return normalizedPath;\n }\n if (normalizedPath === '/') {\n return normalizedBasePath;\n }\n return `${normalizedBasePath}${normalizedPath}`;\n};\n\nconst resolveEntityManifest = (\n manifest: BackofficeEntityManifestMap,\n basePath: string,\n): BackofficeEntityManifestMap => {\n return Object.fromEntries(\n Object.entries(manifest).map(([entityId, item]) => {\n return [\n entityId,\n {\n ...item,\n routes: {\n list: prefixRoutePath(basePath, item.routes.list),\n detail: (id: string) => {\n return prefixRoutePath(basePath, item.routes.detail(id));\n },\n detailPage: (id: string, pageId: string) => {\n return prefixRoutePath(\n basePath,\n item.routes.detailPage(id, pageId),\n );\n },\n },\n } satisfies BackofficeEntityManifestMap[string],\n ] as const;\n }),\n );\n};\n\nconst asResourceLanguage = (\n value: ResourceKey | undefined,\n): ResourceLanguage => {\n if (typeof value === 'object' && !Array.isArray(value)) {\n return value as ResourceLanguage;\n }\n return {};\n};\n\ntype RouterShellProps = {\n routes: ReturnType<typeof createBackofficeRoutes>;\n};\n\nconst RouterShell = ({ routes }: RouterShellProps): JSX.Element => {\n const relayEnvironment = useRelayEnvironment();\n\n const routerContext = useMemo(() => {\n return { relayEnvironment };\n }, [relayEnvironment]);\n\n const router = useMemo(() => {\n return createRouter(routes, {\n context: routerContext,\n });\n }, [routes, routerContext]);\n\n useEffect(() => {\n return () => {\n router.cleanup();\n };\n }, [router]);\n\n return (\n <RoutingContext.Provider value={router.context}>\n <RouterRenderer\n enableTransition\n fallback={<BackofficeRouteFallback />}\n pending={<BackofficeRoutePendingBar />}\n />\n </RoutingContext.Provider>\n );\n};\n\nexport const BackofficeProvider = (\n props: BackofficeProviderProps,\n): JSX.Element => {\n const basePath = normalizeAbsolutePath(props.basePath ?? '/');\n\n const entityManifest = useMemo(() => {\n return resolveEntityManifest(props.entityManifest, basePath);\n }, [basePath, props.entityManifest]);\n const entityRegistry = useMemo(() => {\n return createBackofficeEntityRegistry(entityManifest, { basePath });\n }, [basePath, entityManifest]);\n\n const graphQLConfig = props.graphql;\n\n useEffect(() => {\n const httpUrl = graphQLConfig.httpUrl ?? graphQLConfig.endpoint;\n const wsUrl = graphQLConfig.wsUrl ?? graphQLConfig.wsEndpoint;\n configureRelayEnvironment({\n httpUrl,\n wsUrl,\n logEvents: graphQLConfig.logEvents,\n getAuthHeaders: graphQLConfig.getAuthHeaders,\n });\n }, [\n graphQLConfig.endpoint,\n graphQLConfig.getAuthHeaders,\n graphQLConfig.httpUrl,\n graphQLConfig.logEvents,\n graphQLConfig.wsEndpoint,\n graphQLConfig.wsUrl,\n ]);\n\n const mergedResources = useMemo(() => {\n const appResources: Resource = props.i18n?.resources ?? {};\n const backofficeReactResources = backofficeReactI18nResources as Resource;\n const locales = new Set([\n ...Object.keys(backofficeReactResources),\n ...Object.keys(appResources),\n ]);\n\n const output: Resource = {};\n\n locales.forEach((locale) => {\n const packageLocale = asResourceLanguage(\n backofficeReactResources[locale],\n );\n const appLocale = asResourceLanguage(appResources[locale]);\n output[locale] = {\n ...packageLocale,\n ...appLocale,\n backofficeReact: mergeResourceLanguages(\n asResourceLanguage(packageLocale.backofficeReact),\n asResourceLanguage(appLocale.backofficeReact),\n ),\n shared: mergeResourceLanguages(\n asResourceLanguage(packageLocale.shared),\n asResourceLanguage(appLocale.shared),\n ),\n };\n });\n\n return output;\n }, [props.i18n?.resources]);\n\n const i18nInstance = useMemo(() => {\n return props.i18n?.instance ?? createInstance();\n }, [props.i18n?.instance]);\n\n useEffect(() => {\n const initOptions = props.i18n?.initOptions ?? {};\n const defaultNs = initOptions.defaultNS ?? 'translations';\n const ns = initOptions.ns ?? [\n 'backofficeReact',\n 'translations',\n 'shared',\n 'ui',\n ];\n createI18nInstance({\n resources: mergedResources,\n lng: props.i18n?.lng,\n fallbackLng: props.i18n?.fallbackLng,\n initOptions: {\n ...initOptions,\n defaultNS: defaultNs,\n ns,\n },\n instance: i18nInstance,\n useLanguageDetector: props.i18n?.useLanguageDetector,\n detection: props.i18n?.detection,\n // eslint-disable-next-line no-console\n }).catch(console.error);\n }, [\n i18nInstance,\n mergedResources,\n props.i18n?.initOptions,\n props.i18n?.detection,\n props.i18n?.fallbackLng,\n props.i18n?.lng,\n props.i18n?.useLanguageDetector,\n ]);\n\n const configValue = useMemo(() => {\n return {\n basePath,\n entities: entityManifest,\n entityManifest,\n entityRegistry,\n sidebar: props.sidebar,\n dashboard: props.dashboard,\n auth: props.auth,\n graphql: props.graphql,\n };\n }, [\n basePath,\n props.auth,\n props.dashboard,\n entityManifest,\n entityRegistry,\n props.graphql,\n props.sidebar,\n ]);\n\n const routes = useMemo(() => {\n return createBackofficeRoutes({\n basePath,\n entityManifest,\n entityRegistry,\n sidebar: props.sidebar,\n auth: props.auth,\n dashboard: props.dashboard,\n });\n }, [\n basePath,\n entityManifest,\n entityRegistry,\n props.auth,\n props.dashboard,\n props.sidebar,\n ]);\n\n return (\n <StrictMode>\n <I18nextProvider i18n={i18nInstance}>\n <ThemeProvider>\n <RelayProvider>\n <BackofficeConfigProvider value={configValue}>\n <RouterShell routes={routes} />\n </BackofficeConfigProvider>\n </RelayProvider>\n </ThemeProvider>\n </I18nextProvider>\n </StrictMode>\n );\n};\n\nexport default BackofficeProvider;\n"],"mappings":"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"}
@@ -1,12 +1,12 @@
1
1
  import { getEnvironment as e } from "./environment.js";
2
2
  import { jsx as t } from "react/jsx-runtime";
3
- import { RelayEnvironmentProvider as n } from "react-relay";
3
+ import * as n from "react-relay";
4
4
  //#region src/relay/RelayProvider.tsx
5
- var r = ({ children: r }) => /* @__PURE__ */ t(n, {
5
+ var { RelayEnvironmentProvider: r } = n, i = ({ children: n }) => /* @__PURE__ */ t(r, {
6
6
  environment: e(),
7
- children: r
7
+ children: n
8
8
  });
9
9
  //#endregion
10
- export { r as RelayProvider, r as default };
10
+ export { i as RelayProvider, i as default };
11
11
 
12
12
  //# sourceMappingURL=RelayProvider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RelayProvider.js","names":[],"sources":["../../../src/relay/RelayProvider.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\nimport { RelayEnvironmentProvider } from 'react-relay';\n\nimport { getEnvironment } from './environment.js';\n\ntype Props = {\n children: ReactNode;\n};\n\nexport const RelayProvider = ({ children }: Props): JSX.Element => {\n const environment = getEnvironment();\n\n return (\n <RelayEnvironmentProvider environment={environment}>\n {children}\n </RelayEnvironmentProvider>\n );\n};\n\nexport default RelayProvider;\n"],"mappings":";;;;AASA,IAAa,KAAiB,EAAE,kBAI5B,kBAAC,GAAD;CAAuC,aAHrB,GAAgB;CAI/B;CACwB,CAAA"}
1
+ {"version":3,"file":"RelayProvider.js","names":[],"sources":["../../../src/relay/RelayProvider.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\nimport * as ReactRelay from 'react-relay';\n\nimport { getEnvironment } from './environment.js';\n\nconst { RelayEnvironmentProvider } = ReactRelay;\n\ntype Props = {\n children: ReactNode;\n};\n\nexport const RelayProvider = ({ children }: Props): JSX.Element => {\n const environment = getEnvironment();\n\n return (\n <RelayEnvironmentProvider environment={environment}>\n {children}\n </RelayEnvironmentProvider>\n );\n};\n\nexport default RelayProvider;\n"],"mappings":";;;;AAKA,IAAM,EAAE,gCAA6B,GAMxB,KAAiB,EAAE,kBAI5B,kBAAC,GAAD;CAAuC,aAHrB,GAAgB;CAI/B;CACwB,CAAA"}
@@ -1,7 +1,7 @@
1
- import { readInlineData as e } from "react-relay";
1
+ import * as e from "react-relay";
2
2
  //#region src/relay/createInlineReader.ts
3
- var t = (t) => (n) => e(t, n), n = t;
3
+ var { readInlineData: t } = e, n = (e) => (n) => t(e, n), r = n;
4
4
  //#endregion
5
- export { t as createInlineDataReader, n as createInlineReader };
5
+ export { n as createInlineDataReader, r as createInlineReader };
6
6
 
7
7
  //# sourceMappingURL=createInlineReader.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"createInlineReader.js","names":[],"sources":["../../../src/relay/createInlineReader.ts"],"sourcesContent":["import { readInlineData } from 'react-relay';\nimport type { GraphQLTaggedNode } from 'relay-runtime';\n\n// Reserved for non-React helpers that explicitly read `@inline` fragments.\nexport const createInlineDataReader = <TRef, TData>(\n fragment: GraphQLTaggedNode,\n): ((ref: TRef) => TData) => {\n return (ref: TRef) => {\n return readInlineData(fragment, ref as never) as TData;\n };\n};\n\n// Legacy alias kept for incremental migration of existing callsites.\nexport const createInlineReader = createInlineDataReader;\n"],"mappings":";;AAIA,IAAa,KACX,OAEQ,MACC,EAAe,GAAU,EAAa,EAKpC,IAAqB"}
1
+ {"version":3,"file":"createInlineReader.js","names":[],"sources":["../../../src/relay/createInlineReader.ts"],"sourcesContent":["import * as ReactRelay from 'react-relay';\nimport type { GraphQLTaggedNode } from 'relay-runtime';\n\nconst { readInlineData } = ReactRelay;\n\n// Reserved for non-React helpers that explicitly read `@inline` fragments.\nexport const createInlineDataReader = <TRef, TData>(\n fragment: GraphQLTaggedNode,\n): ((ref: TRef) => TData) => {\n return (ref: TRef) => {\n return readInlineData(fragment, ref as never) as TData;\n };\n};\n\n// Legacy alias kept for incremental migration of existing callsites.\nexport const createInlineReader = createInlineDataReader;\n"],"mappings":";;AAGA,IAAM,EAAE,sBAAmB,GAGd,KACX,OAEQ,MACC,EAAe,GAAU,EAAa,EAKpC,IAAqB"}
@@ -1,2 +1,7 @@
1
- import { useRelayEnvironment as e } from "react-relay";
2
- export { e as useRelayEnvironment };
1
+ import * as e from "react-relay";
2
+ //#region src/relay/useRelayEnvironment.ts
3
+ var { useRelayEnvironment: t } = e;
4
+ //#endregion
5
+ export { t as useRelayEnvironment };
6
+
7
+ //# sourceMappingURL=useRelayEnvironment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRelayEnvironment.js","names":[],"sources":["../../../src/relay/useRelayEnvironment.ts"],"sourcesContent":["import * as ReactRelay from 'react-relay';\n\nexport const { useRelayEnvironment } = ReactRelay;\n"],"mappings":";;AAEA,IAAa,EAAE,2BAAwB"}
@@ -1,22 +1,22 @@
1
1
  import { buildEntityGroupLookup as e, resolveSidebarGroups as t } from "../components/backoffice/layout/sidebarUtils.js";
2
2
  import { jsx as n } from "react/jsx-runtime";
3
- import { loadQuery as r, usePreloadedQuery as i } from "react-relay";
4
- import { HttpRedirect as a, getResourcePage as o, r as s } from "@plumile/router";
5
- import { BACKOFFICE_LIST_DEFAULTS as c } from "@plumile/backoffice-core/constants.js";
3
+ import * as r from "react-relay";
4
+ import { HttpRedirect as i, getResourcePage as a, r as o } from "@plumile/router";
5
+ import { BACKOFFICE_LIST_DEFAULTS as s } from "@plumile/backoffice-core/constants.js";
6
6
  //#region src/router/createBackofficeRoutes.tsx
7
- var l = o("WrapperPage", async () => import("@plumile/ui/pages/WrapperPage.js")), u = o("BackofficeLayoutPage", async () => import("../pages/BackofficeLayoutPage.js")), d = o("BackofficeEntityListPage", async () => import("../pages/BackofficeEntityListPage.js")), f = o("BackofficeEntityDetailPage", async () => import("../pages/BackofficeEntityDetailPage.js")), p = o("BackofficeEntityDetailLayoutPage", async () => import("../pages/BackofficeEntityDetailLayoutPage.js")), m = o("BackofficeEntityDetailUnknownPageRedirect", async () => import("../pages/BackofficeEntityDetailUnknownPageRedirect.js")), h = o("BackofficeDashboardPage", async () => import("../pages/BackofficeDashboardPage.js")), g = o("BackofficeToolsOperationPage", async () => import("../pages/BackofficeToolsOperationPage.js")), _ = o("BackofficeLoginPage", async () => import("../pages/BackofficeLoginPage.js")), v = o("BackofficePasswordResetRequestPage", async () => import("../pages/BackofficePasswordResetRequestPage.js")), y = o("BackofficePasswordResetCompletePage", async () => import("../pages/BackofficePasswordResetCompletePage.js")), b = o("BackofficeVerifyEmailPage", async () => import("../pages/BackofficeVerifyEmailPage.js")), x = o("BackofficeAcceptInvitationPage", async () => import("../pages/BackofficeAcceptInvitationPage.js")), S = (e) => {
7
+ var { loadQuery: c, usePreloadedQuery: l } = r, u = a("WrapperPage", async () => import("@plumile/ui/pages/WrapperPage.js")), d = a("BackofficeLayoutPage", async () => import("../pages/BackofficeLayoutPage.js")), f = a("BackofficeEntityListPage", async () => import("../pages/BackofficeEntityListPage.js")), p = a("BackofficeEntityDetailPage", async () => import("../pages/BackofficeEntityDetailPage.js")), m = a("BackofficeEntityDetailLayoutPage", async () => import("../pages/BackofficeEntityDetailLayoutPage.js")), h = a("BackofficeEntityDetailUnknownPageRedirect", async () => import("../pages/BackofficeEntityDetailUnknownPageRedirect.js")), g = a("BackofficeDashboardPage", async () => import("../pages/BackofficeDashboardPage.js")), _ = a("BackofficeToolsOperationPage", async () => import("../pages/BackofficeToolsOperationPage.js")), v = a("BackofficeLoginPage", async () => import("../pages/BackofficeLoginPage.js")), y = a("BackofficePasswordResetRequestPage", async () => import("../pages/BackofficePasswordResetRequestPage.js")), b = a("BackofficePasswordResetCompletePage", async () => import("../pages/BackofficePasswordResetCompletePage.js")), x = a("BackofficeVerifyEmailPage", async () => import("../pages/BackofficeVerifyEmailPage.js")), S = a("BackofficeAcceptInvitationPage", async () => import("../pages/BackofficeAcceptInvitationPage.js")), C = (e) => {
8
8
  let t = e.trim();
9
9
  return t === "" || t === "/" ? "" : t.replace(/^\/+|\/+$/g, "");
10
- }, C = (e) => {
10
+ }, w = (e) => {
11
11
  let t = e.trim();
12
12
  return t === "" ? "/" : `/${t}`.replace(/\/+/g, "/");
13
- }, w = (e, t) => {
13
+ }, T = (e, t) => {
14
14
  let n = t.replace(/^\/+|\/+$/g, "");
15
15
  return e === "" ? n : n === "" ? e : `${e}/${n}`;
16
- }, T = (e, t) => C(w(e, t)), E = (e, t) => {
17
- let n = C(e), r = t === "" ? "" : `/${t}`;
16
+ }, E = (e, t) => w(T(e, t)), D = (e, t) => {
17
+ let n = w(e), r = t === "" ? "" : `/${t}`;
18
18
  return r !== "" && n.startsWith(r) ? n.slice(r.length).replace(/^\/+/, "") : n.replace(/^\/+/, "");
19
- }, D = (e, t) => {
19
+ }, O = (e, t) => {
20
20
  if (e?.routes == null) return null;
21
21
  for (let n = e.routes.length - 1; n >= 0; --n) {
22
22
  let r = e.routes[n];
@@ -26,7 +26,7 @@ var l = o("WrapperPage", async () => import("@plumile/ui/pages/WrapperPage.js"))
26
26
  }
27
27
  }
28
28
  return null;
29
- }, O = (e) => {
29
+ }, k = (e) => {
30
30
  let t = new URLSearchParams();
31
31
  return Object.entries(e).forEach(([e, n]) => {
32
32
  if (n != null) {
@@ -39,42 +39,42 @@ var l = o("WrapperPage", async () => import("@plumile/ui/pages/WrapperPage.js"))
39
39
  t.set(e, String(n));
40
40
  }
41
41
  }), t;
42
- }, k = s;
43
- function A(o) {
44
- let { basePath: s, entityManifest: C, entityRegistry: A, sidebar: j, auth: M, dashboard: N } = o, P = S(s), F = w(P, "login"), I = w(P, "login/reset"), L = w(P, "login/reset/complete"), R = w(P, "verify-email"), z = w(P, "accept-invitation"), B = T(P, "login"), V = e(t(C, j)), H = /* @__PURE__ */ new Map();
42
+ }, A = o;
43
+ function j(r) {
44
+ let { basePath: a, entityManifest: o, entityRegistry: w, sidebar: j, auth: M, dashboard: N } = r, P = C(a), F = T(P, "login"), I = T(P, "login/reset"), L = T(P, "login/reset/complete"), R = T(P, "verify-email"), z = T(P, "accept-invitation"), B = E(P, "login"), V = e(t(o, j)), H = /* @__PURE__ */ new Map();
45
45
  V.forEach((e, t) => {
46
46
  H.set(t, e.groupId);
47
47
  });
48
48
  let U = /* @__PURE__ */ new WeakMap(), W = j?.permissionsQuery, G = async ({ context: e }) => {
49
49
  let t = await M.session.load();
50
50
  return {
51
- permissionsQuery: W == null ? null : r(e.relayEnvironment, W, {}),
52
- authStatusQuery: t.authStatusQuery == null ? null : r(e.relayEnvironment, t.authStatusQuery, {}, { fetchPolicy: "network-only" })
51
+ permissionsQuery: W == null ? null : c(e.relayEnvironment, W, {}),
52
+ authStatusQuery: t.authStatusQuery == null ? null : c(e.relayEnvironment, t.authStatusQuery, {}, { fetchPolicy: "network-only" })
53
53
  };
54
- }, K = k({
54
+ }, K = A({
55
55
  path: "",
56
- resourcePage: h,
56
+ resourcePage: g,
57
57
  prepare: async () => (N == null || await N.load(), null),
58
58
  render: ({ Component: e }) => e == null ? null : /* @__PURE__ */ n(e, {})
59
- }), q = Object.values(C).filter((e) => e.kind === "list-detail").map((e) => {
60
- let t = e.routes.list, i = E(t, P), o = [];
59
+ }), q = Object.values(o).filter((e) => e.kind === "list-detail").map((e) => {
60
+ let t = e.routes.list, r = D(t, P), a = [];
61
61
  if (e.hasList) {
62
- let t = k({
62
+ let t = A({
63
63
  path: "",
64
- resourcePage: d,
64
+ resourcePage: f,
65
65
  prepare: async ({ context: t, query: n }) => {
66
- let { config: i } = await A.loadListEntity(e.id), { list: a, listUrlCodec: o, listDefaults: s } = i;
67
- if (o == null || s == null) throw Error(`Backoffice entity ${e.id} does not expose a list configuration.`);
68
- let l = O(n), u = o.parse(l), { pageSize: d } = c, f = {
66
+ let { config: r } = await w.loadListEntity(e.id), { list: i, listUrlCodec: a, listDefaults: o } = r;
67
+ if (a == null || o == null) throw Error(`Backoffice entity ${e.id} does not expose a list configuration.`);
68
+ let l = k(n), u = a.parse(l), { pageSize: d } = s, f = {
69
69
  where: u.where,
70
- sort: u.sort ?? s.sort,
70
+ sort: u.sort ?? o.sort,
71
71
  count: d,
72
72
  cursor: null
73
- }, p = a.buildVariables == null ? f : a.buildVariables(f), m = r(t.relayEnvironment, a.query, p);
73
+ }, p = i.buildVariables == null ? f : i.buildVariables(f), m = c(t.relayEnvironment, i.query, p);
74
74
  return {
75
75
  entityId: e.id,
76
76
  entityManifest: e,
77
- entityConfig: i,
77
+ entityConfig: r,
78
78
  query: m
79
79
  };
80
80
  },
@@ -88,19 +88,19 @@ function A(o) {
88
88
  });
89
89
  }
90
90
  });
91
- U.set(t, e.id), o.push(t);
91
+ U.set(t, e.id), a.push(t);
92
92
  }
93
- let s = k({
93
+ let o = A({
94
94
  path: ":id",
95
- resourcePage: p,
95
+ resourcePage: m,
96
96
  prepare: async ({ context: t, variables: n }) => {
97
- let { config: i } = await A.loadDetailLayoutEntity(e.id), a = String(n.id ?? ""), o = i.layoutPage.buildVariables == null ? { variables: { id: a } } : i.layoutPage.buildVariables({ id: a }), s = r(t.relayEnvironment, i.layoutPage.query, o.variables);
97
+ let { config: r } = await w.loadDetailLayoutEntity(e.id), i = String(n.id ?? ""), a = r.layoutPage.buildVariables == null ? { variables: { id: i } } : r.layoutPage.buildVariables({ id: i }), o = c(t.relayEnvironment, r.layoutPage.query, a.variables);
98
98
  return {
99
99
  entityId: e.id,
100
100
  entityManifest: e,
101
- entityConfig: i,
102
- layoutQuery: s,
103
- id: a
101
+ entityConfig: r,
102
+ layoutQuery: o,
103
+ id: i
104
104
  };
105
105
  },
106
106
  render: ({ children: e, prepared: t, Component: r }) => {
@@ -114,9 +114,9 @@ function A(o) {
114
114
  });
115
115
  },
116
116
  children: [
117
- k({
117
+ A({
118
118
  path: "",
119
- resourcePage: l,
119
+ resourcePage: u,
120
120
  prepare: ({ variables: t }) => {
121
121
  let n = String(t.id ?? "").trim();
122
122
  return { redirectTo: n === "" ? null : e.routes.detailPage(n, e.defaultDetailPageId ?? "overview") };
@@ -124,22 +124,22 @@ function A(o) {
124
124
  render: ({ prepared: e }) => {
125
125
  let t = e.redirectTo ?? null;
126
126
  if (t == null) return null;
127
- throw new a(t);
127
+ throw new i(t);
128
128
  }
129
129
  }),
130
- ...(e.detailPages ?? []).map((t) => k({
130
+ ...(e.detailPages ?? []).map((t) => A({
131
131
  path: t.pathSegment,
132
- resourcePage: f,
133
- prepare: async ({ context: n, variables: i }) => {
134
- let a = String(i.id ?? ""), o = await A.loadDetailPageEntity(e.id, t.id), s = o.config.page.buildVariables == null ? { variables: { id: a } } : o.config.page.buildVariables({ id: a }), c = r(n.relayEnvironment, o.config.page.query, s.variables);
132
+ resourcePage: p,
133
+ prepare: async ({ context: n, variables: r }) => {
134
+ let i = String(r.id ?? ""), a = await w.loadDetailPageEntity(e.id, t.id), o = a.config.page.buildVariables == null ? { variables: { id: i } } : a.config.page.buildVariables({ id: i }), s = c(n.relayEnvironment, a.config.page.query, o.variables);
135
135
  return {
136
136
  entityId: e.id,
137
137
  entityManifest: e,
138
- entityConfig: o.config,
139
- detailId: s.detailId,
140
- id: a,
141
- pageConfig: o.config,
142
- pageQuery: c,
138
+ entityConfig: a.config,
139
+ detailId: o.detailId,
140
+ id: i,
141
+ pageConfig: a.config,
142
+ pageQuery: s,
143
143
  pageId: t.id,
144
144
  pagePath: t.pathSegment
145
145
  };
@@ -154,11 +154,11 @@ function A(o) {
154
154
  });
155
155
  }
156
156
  })),
157
- k({
157
+ A({
158
158
  path: ":pagePath",
159
- resourcePage: m,
159
+ resourcePage: h,
160
160
  prepare: async ({ variables: t }) => {
161
- let n = await A.loadDetailLayoutEntity(e.id), r = String(t.id ?? ""), i = String(t.pagePath ?? "");
161
+ let n = await w.loadDetailLayoutEntity(e.id), r = String(t.id ?? ""), i = String(t.pagePath ?? "");
162
162
  return {
163
163
  entityManifest: e,
164
164
  entityConfig: n.config,
@@ -178,17 +178,17 @@ function A(o) {
178
178
  })
179
179
  ]
180
180
  });
181
- return U.set(s, e.id), o.push(s), k({
182
- path: i,
183
- children: o,
184
- resourcePage: l
181
+ return U.set(o, e.id), a.push(o), A({
182
+ path: r,
183
+ children: a,
184
+ resourcePage: u
185
185
  });
186
- }), J = Object.values(C).filter((e) => e.kind === "tool").map((e) => {
187
- let t = k({
188
- path: E(e.routes.list, P),
189
- resourcePage: g,
186
+ }), J = Object.values(o).filter((e) => e.kind === "tool").map((e) => {
187
+ let t = A({
188
+ path: D(e.routes.list, P),
189
+ resourcePage: _,
190
190
  prepare: async () => {
191
- let t = await A.loadToolEntity(e.id);
191
+ let t = await w.loadToolEntity(e.id);
192
192
  return {
193
193
  entityId: e.id,
194
194
  entityManifest: e,
@@ -206,23 +206,23 @@ function A(o) {
206
206
  }
207
207
  });
208
208
  return U.set(t, e.id), t;
209
- }), Y = k({
209
+ }), Y = A({
210
210
  path: P,
211
- resourcePage: u,
211
+ resourcePage: d,
212
212
  prepare: G,
213
- render: ({ children: e, prepared: t, route: r, Component: o }) => {
214
- if (o == null) return null;
215
- let s = t, c = D(r, U), l = c == null ? null : H.get(c) ?? null, u = null, d = M.session.get()?.authStatusQuery ?? null;
216
- if (d != null && s?.authStatusQuery != null) {
217
- u = i(d, s.authStatusQuery);
213
+ render: ({ children: e, prepared: t, route: r, Component: a }) => {
214
+ if (a == null) return null;
215
+ let o = t, s = O(r, U), c = s == null ? null : H.get(s) ?? null, u = null, d = M.session.get()?.authStatusQuery ?? null;
216
+ if (d != null && o?.authStatusQuery != null) {
217
+ u = l(d, o.authStatusQuery);
218
218
  let { isLoggedIn: e } = u;
219
- if (!e) throw new a(B);
219
+ if (!e) throw new i(B);
220
220
  }
221
- return /* @__PURE__ */ n(o, {
221
+ return /* @__PURE__ */ n(a, {
222
222
  permissionsQuery: j?.permissionsQuery,
223
- prepared: s?.permissionsQuery ?? null,
223
+ prepared: o?.permissionsQuery ?? null,
224
224
  authStatus: u,
225
- activeGroupId: l,
225
+ activeGroupId: c,
226
226
  children: e
227
227
  });
228
228
  },
@@ -232,42 +232,42 @@ function A(o) {
232
232
  ...J
233
233
  ]
234
234
  }), X = [
235
- k({
235
+ A({
236
236
  path: F,
237
- resourcePage: _,
237
+ resourcePage: v,
238
238
  prepare: async ({ context: e }) => {
239
239
  let t = await M.login.load();
240
- return { query: r(e.relayEnvironment, t.loginQuery, {}) };
240
+ return { query: c(e.relayEnvironment, t.loginQuery, {}) };
241
241
  },
242
242
  render: ({ prepared: e, Component: t }) => t == null ? null : /* @__PURE__ */ n(t, { prepared: e })
243
243
  }),
244
- k({
244
+ A({
245
245
  path: I,
246
- resourcePage: v,
246
+ resourcePage: y,
247
247
  prepare: async () => (await M.passwordResetRequest.load(), null),
248
248
  render: ({ Component: e }) => e == null ? null : /* @__PURE__ */ n(e, {})
249
249
  }),
250
- k({
250
+ A({
251
251
  path: L,
252
- resourcePage: y,
252
+ resourcePage: b,
253
253
  prepare: async () => (await M.passwordResetComplete.load(), null),
254
254
  render: ({ Component: e }) => e == null ? null : /* @__PURE__ */ n(e, {})
255
255
  }),
256
- k({
256
+ A({
257
257
  path: R,
258
- resourcePage: b,
258
+ resourcePage: x,
259
259
  prepare: async () => (await M.verifyEmail.load(), null),
260
260
  render: ({ Component: e }) => e == null ? null : /* @__PURE__ */ n(e, {})
261
261
  })
262
262
  ];
263
- return (M.hasAcceptInvitation === !0 || M.acceptInvitation != null) && X.push(k({
263
+ return (M.hasAcceptInvitation === !0 || M.acceptInvitation != null) && X.push(A({
264
264
  path: z,
265
- resourcePage: x,
265
+ resourcePage: S,
266
266
  prepare: async () => (await M.acceptInvitation?.load(), null),
267
267
  render: ({ Component: e }) => e == null ? null : /* @__PURE__ */ n(e, {})
268
268
  })), X.push(Y), X;
269
269
  }
270
270
  //#endregion
271
- export { x as BackofficeAcceptInvitationPageResource, h as BackofficeDashboardPageResource, p as BackofficeEntityDetailLayoutPageResource, f as BackofficeEntityDetailPageResource, m as BackofficeEntityDetailUnknownPageRedirectResource, d as BackofficeEntityListPageResource, u as BackofficeLayoutPageResource, _ as BackofficeLoginPageResource, y as BackofficePasswordResetCompletePageResource, v as BackofficePasswordResetRequestPageResource, g as BackofficeToolsOperationPageResource, b as BackofficeVerifyEmailPageResource, l as WrapperPageResource, A as createBackofficeRoutes, A as default };
271
+ export { S as BackofficeAcceptInvitationPageResource, g as BackofficeDashboardPageResource, m as BackofficeEntityDetailLayoutPageResource, p as BackofficeEntityDetailPageResource, h as BackofficeEntityDetailUnknownPageRedirectResource, f as BackofficeEntityListPageResource, d as BackofficeLayoutPageResource, v as BackofficeLoginPageResource, b as BackofficePasswordResetCompletePageResource, y as BackofficePasswordResetRequestPageResource, _ as BackofficeToolsOperationPageResource, x as BackofficeVerifyEmailPageResource, u as WrapperPageResource, j as createBackofficeRoutes, j as default };
272
272
 
273
273
  //# sourceMappingURL=createBackofficeRoutes.js.map
@@ -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 { loadQuery, usePreloadedQuery, 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\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};\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 +1 @@
1
- {"version":3,"file":"BackofficeEntityActionFormDialog.d.ts","sourceRoot":"","sources":["../../../../../src/components/backoffice/actions/BackofficeEntityActionFormDialog.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,GAAG,EAMT,MAAM,OAAO,CAAC;AAkBf,OAAO,KAAK,EAEV,sCAAsC,EAEvC,MAAM,mCAAmC,CAAC;AAe3C,MAAM,MAAM,qCAAqC,CAAC,IAAI,IAAI;IACxD,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,sCAAsC,CAAC,IAAI,CAAC,CAAC;IACrD,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB,CAAC;AAiGF,eAAO,MAAM,gCAAgC,GAAI,IAAI,EAAG,+CAMrD,qCAAqC,CAAC,IAAI,CAAC,KAAG,GAAG,CAAC,OAAO,GAAG,IA4wB9D,CAAC;AAEF,eAAe,gCAAgC,CAAC"}
1
+ {"version":3,"file":"BackofficeEntityActionFormDialog.d.ts","sourceRoot":"","sources":["../../../../../src/components/backoffice/actions/BackofficeEntityActionFormDialog.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,GAAG,EAMT,MAAM,OAAO,CAAC;AAuBf,OAAO,KAAK,EAEV,sCAAsC,EAEvC,MAAM,mCAAmC,CAAC;AAgB3C,MAAM,MAAM,qCAAqC,CAAC,IAAI,IAAI;IACxD,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,sCAAsC,CAAC,IAAI,CAAC,CAAC;IACrD,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB,CAAC;AAiGF,eAAO,MAAM,gCAAgC,GAAI,IAAI,EAAG,+CAMrD,qCAAqC,CAAC,IAAI,CAAC,KAAG,GAAG,CAAC,OAAO,GAAG,IA4wB9D,CAAC;AAEF,eAAe,gCAAgC,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { type JSX, type ReactNode } from 'react';
2
- import { type TagTone } from '@plumile/ui-backoffice/backoffice/atoms/tag/Tag.js';
2
+ import { type TagTone } from '@plumile/ui/backoffice/atoms/tag/Tag.js';
3
3
  export type BackofficeDetailFlagTagProps = {
4
4
  tone: TagTone;
5
5
  icon?: ReactNode;
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeDetailFlagTag.d.ts","sourceRoot":"","sources":["../../../../../src/components/backoffice/detail/BackofficeDetailFlagTag.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,GAAG,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAEjD,OAAO,EAEL,KAAK,OAAO,EACb,MAAM,oDAAoD,CAAC;AAI5D,MAAM,MAAM,4BAA4B,GAAG;IACzC,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAI,wBAIrC,4BAA4B,KAAG,GAAG,CAAC,OAerC,CAAC;AAEF,eAAe,uBAAuB,CAAC"}
1
+ {"version":3,"file":"BackofficeDetailFlagTag.d.ts","sourceRoot":"","sources":["../../../../../src/components/backoffice/detail/BackofficeDetailFlagTag.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,GAAG,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAEjD,OAAO,EAAO,KAAK,OAAO,EAAE,MAAM,yCAAyC,CAAC;AAI5E,MAAM,MAAM,4BAA4B,GAAG;IACzC,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAI,wBAIrC,4BAA4B,KAAG,GAAG,CAAC,OAerC,CAAC;AAEF,eAAe,uBAAuB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeDetailRelationListBlock.d.ts","sourceRoot":"","sources":["../../../../../src/components/backoffice/detail/BackofficeDetailRelationListBlock.tsx"],"names":[],"mappings":"AACA,OAAO,EAA4C,KAAK,GAAG,EAAE,MAAM,OAAO,CAAC;AAyB3E,MAAM,MAAM,sCAAsC,GAAG;IACnD,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1B,CAAC;AAsMF,eAAO,MAAM,iCAAiC,GAAI,2CAM/C,sCAAsC,KAAG,GAAG,CAAC,OAkB/C,CAAC;AAEF,eAAe,iCAAiC,CAAC"}
1
+ {"version":3,"file":"BackofficeDetailRelationListBlock.d.ts","sourceRoot":"","sources":["../../../../../src/components/backoffice/detail/BackofficeDetailRelationListBlock.tsx"],"names":[],"mappings":"AACA,OAAO,EAA4C,KAAK,GAAG,EAAE,MAAM,OAAO,CAAC;AA2B3E,MAAM,MAAM,sCAAsC,GAAG;IACnD,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1B,CAAC;AAsMF,eAAO,MAAM,iCAAiC,GAAI,2CAM/C,sCAAsC,KAAG,GAAG,CAAC,OAkB/C,CAAC;AAEF,eAAe,iCAAiC,CAAC"}