@plumile/backoffice-react 0.1.98 → 0.1.101

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 (76) hide show
  1. package/lib/esm/AcceptInvitationScreen-B1IPafwD.js.map +1 -1
  2. package/lib/esm/BackofficeAcceptInvitationPage-CEtApVwL.js.map +1 -1
  3. package/lib/esm/{BackofficeDashboardPage-YWvoQODn.js → BackofficeDashboardPage-r8vK_JA6.js} +4 -2
  4. package/lib/esm/BackofficeDashboardPage-r8vK_JA6.js.map +1 -0
  5. package/lib/esm/BackofficeDetailPayload-P61MDRLE.js.map +1 -1
  6. package/lib/esm/BackofficeEntityActionFormDialog-BgRTJ_JS.js.map +1 -1
  7. package/lib/esm/BackofficeEntityDetailLayoutContext-C_tBqkVq.js.map +1 -1
  8. package/lib/esm/BackofficeEntityDetailLayoutPage-DXjRqvcZ.js.map +1 -1
  9. package/lib/esm/{BackofficeEntityDetailPage-DPFXbJxC.js → BackofficeEntityDetailPage-CwzKp_Yw.js} +25 -17
  10. package/lib/esm/BackofficeEntityDetailPage-CwzKp_Yw.js.map +1 -0
  11. package/lib/esm/BackofficeEntityDetailUnknownPageRedirect-DRWTeox-.js.map +1 -1
  12. package/lib/esm/{BackofficeEntityListPage-C8Ucmc_E.js → BackofficeEntityListPage-DVT3rrfa.js} +5 -3
  13. package/lib/esm/BackofficeEntityListPage-DVT3rrfa.js.map +1 -0
  14. package/lib/esm/BackofficeErrorBoundary-BwRVSDHU.js.map +1 -1
  15. package/lib/esm/BackofficeLayoutPage-DQ0sVv24.js +609 -0
  16. package/lib/esm/BackofficeLayoutPage-DQ0sVv24.js.map +1 -0
  17. package/lib/esm/BackofficeLoginPage-Cc3kcOQV.js.map +1 -1
  18. package/lib/esm/BackofficePasswordResetCompletePage-CF_0t3Nq.js.map +1 -1
  19. package/lib/esm/BackofficePasswordResetRequestPage-BJOrQXcy.js.map +1 -1
  20. package/lib/esm/{BackofficeRightPageLayout-DZQvIHnj.js → BackofficeRightPageLayout-hexJmpam.js} +36 -30
  21. package/lib/esm/BackofficeRightPageLayout-hexJmpam.js.map +1 -0
  22. package/lib/esm/BackofficeTopbarPortalContext-iD7dm4_h.js.map +1 -1
  23. package/lib/esm/BackofficeVerifyEmailPage-C81LlsNM.js.map +1 -1
  24. package/lib/esm/EntityFilterValue-BWUdPBwp.js.map +1 -1
  25. package/lib/esm/EntityIdPickerDialog-Yhmr-WsV.js.map +1 -1
  26. package/lib/esm/{LazyBackofficeEntityActionFormDialog-DVPQyWlr.js → LazyBackofficeEntityActionFormDialog-L8xwaGqH.js} +110 -123
  27. package/lib/esm/LazyBackofficeEntityActionFormDialog-L8xwaGqH.js.map +1 -0
  28. package/lib/esm/PasswordResetCompleteScreen-Cgg96DPo.js.map +1 -1
  29. package/lib/esm/PasswordResetRequestScreen-I1nFvGLd.js.map +1 -1
  30. package/lib/esm/VerifyEmailScreen-Br5KyHjg.js.map +1 -1
  31. package/lib/esm/backoffice-react.js +11 -5
  32. package/lib/esm/backoffice-react.js.map +1 -1
  33. package/lib/esm/backofficeAuthPaths-BiJvoI5Q.js.map +1 -1
  34. package/lib/esm/buildBreadcrumbs-CqF9Nh6x.js.map +1 -1
  35. package/lib/esm/environment-DQfVyWHJ.js.map +1 -1
  36. package/lib/esm/mutationResult-CcQMY13J.js.map +1 -1
  37. package/lib/esm/pageResolution-hAQA5C6S.js.map +1 -1
  38. package/lib/esm/sidebarUtils-DVkLmFbS.js +52 -0
  39. package/lib/esm/sidebarUtils-DVkLmFbS.js.map +1 -0
  40. package/lib/esm/synchronizeAuthStatusQuery-BoPKMrP1.js.map +1 -1
  41. package/lib/esm/toastViewAction-BGTS7vqm.js.map +1 -1
  42. package/lib/esm/useAuth-CheTnq60.js.map +1 -1
  43. package/lib/esm/useBackofficeAuth-ers1FUGe.js.map +1 -1
  44. package/lib/esm/useBackofficeLazyValue-Bh_13h8A.js.map +1 -1
  45. package/lib/esm/useBackofficeListUrlState-D4fx5O7u.js.map +1 -1
  46. package/lib/esm/useBackofficeReactTranslation-Btt58EIo.js.map +1 -1
  47. package/lib/types/components/backoffice/columns/buildDataTableColumns.d.ts.map +1 -1
  48. package/lib/types/components/backoffice/layout/buildSidebarSections.d.ts +2 -1
  49. package/lib/types/components/backoffice/layout/buildSidebarSections.d.ts.map +1 -1
  50. package/lib/types/components/backoffice/layout/sidebarUtils.d.ts +4 -1
  51. package/lib/types/components/backoffice/layout/sidebarUtils.d.ts.map +1 -1
  52. package/lib/types/components/backoffice/scaffolds/BackofficeEntityListScaffold.d.ts.map +1 -1
  53. package/lib/types/hooks/useSidebarGroupCollapse.d.ts +1 -0
  54. package/lib/types/hooks/useSidebarGroupCollapse.d.ts.map +1 -1
  55. package/lib/types/i18n/resources.d.ts +2 -0
  56. package/lib/types/i18n/resources.d.ts.map +1 -1
  57. package/lib/types/pages/BackofficeDashboardPage.d.ts.map +1 -1
  58. package/lib/types/pages/BackofficeDashboardPage.helpers.d.ts.map +1 -1
  59. package/lib/types/pages/BackofficeEntityDetailPage.d.ts.map +1 -1
  60. package/lib/types/pages/BackofficeEntityDetailPage.view-helpers.d.ts +1 -0
  61. package/lib/types/pages/BackofficeEntityDetailPage.view-helpers.d.ts.map +1 -1
  62. package/lib/types/pages/BackofficeEntityListPage.d.ts.map +1 -1
  63. package/lib/types/pages/BackofficeEntityListPage.helpers.d.ts.map +1 -1
  64. package/lib/types/pages/BackofficeLayoutPage.d.ts.map +1 -1
  65. package/lib/types/provider/types.d.ts +64 -1
  66. package/lib/types/provider/types.d.ts.map +1 -1
  67. package/package.json +14 -14
  68. package/lib/esm/BackofficeDashboardPage-YWvoQODn.js.map +0 -1
  69. package/lib/esm/BackofficeEntityDetailPage-DPFXbJxC.js.map +0 -1
  70. package/lib/esm/BackofficeEntityListPage-C8Ucmc_E.js.map +0 -1
  71. package/lib/esm/BackofficeLayoutPage-CKXS0nDO.js +0 -485
  72. package/lib/esm/BackofficeLayoutPage-CKXS0nDO.js.map +0 -1
  73. package/lib/esm/BackofficeRightPageLayout-DZQvIHnj.js.map +0 -1
  74. package/lib/esm/LazyBackofficeEntityActionFormDialog-DVPQyWlr.js.map +0 -1
  75. package/lib/esm/sidebarUtils-CuwJ_3mD.js +0 -34
  76. package/lib/esm/sidebarUtils-CuwJ_3mD.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"EntityIdPickerDialog-Yhmr-WsV.js","names":[],"sources":["../../src/components/backoffice/filters/entityIdFilterField.css.ts","../../src/components/backoffice/filters/EntityIdFilterField.tsx","../../src/provider/useBackofficeEntityLoader.ts","../../src/components/backoffice/pickers/entityIdPickerDialog.css.ts","../../src/components/backoffice/pickers/shared/EntityPickerShell.tsx","../../src/components/backoffice/pickers/shared/EntityPickerRowBase.tsx","../../src/components/backoffice/pickers/shared/EntityPickerList.tsx","../../src/components/backoffice/pickers/EntityIdPickerDialog.tsx"],"sourcesContent":["import { sprinkles } from '@plumile/ui';\n\nexport const container = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n width: 72,\n maxWidth: 'full',\n});\n\nexport const valueBox = sprinkles({\n flex: 1,\n minWidth: 0,\n display: 'flex',\n alignItems: 'center',\n overflow: 'hidden',\n});\n\nexport const valueText = sprinkles({\n display: 'block',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n});\n\nexport const placeholder = sprinkles({\n color: 'textMuted',\n});\n\nexport const actions = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 1,\n});\n","import { type JSX } from 'react';\n\nimport { Button } from '@plumile/ui';\n\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\n\nimport * as styles from './entityIdFilterField.css.js';\n\nexport type EntityIdFilterFieldProps = {\n label: string;\n value: string | null;\n displayValue?: string | null;\n placeholder?: string;\n onPick?: () => void;\n onClear?: () => void;\n};\n\nexport const EntityIdFilterField = (\n props: EntityIdFilterFieldProps,\n): JSX.Element => {\n const { label, value, displayValue, placeholder, onPick, onClear } = props;\n const { t } = useBackofficeReactTranslation();\n const normalizedValue = value?.trim() ?? '';\n const normalizedDisplayValue = displayValue?.trim() ?? '';\n const hasValue = normalizedValue !== '';\n const hasDisplayValue = normalizedDisplayValue !== '';\n\n const resolvedPlaceholder =\n placeholder ?? t('filters.placeholders.search', { label });\n const unresolvedPlaceholder = t('filters.placeholders.unresolved');\n\n let displayNode: JSX.Element;\n if (hasDisplayValue) {\n displayNode = (\n <span className={styles.valueText}>{normalizedDisplayValue}</span>\n );\n } else if (hasValue) {\n displayNode = (\n <span className={styles.placeholder}>{unresolvedPlaceholder}</span>\n );\n } else {\n displayNode = (\n <span className={styles.placeholder}>{resolvedPlaceholder}</span>\n );\n }\n\n let pickLabel = t('common.actions.pick');\n if (hasValue) {\n pickLabel = t('common.actions.change');\n }\n\n let clearNode: JSX.Element | null = null;\n if (hasValue && onClear != null) {\n clearNode = (\n <Button\n type=\"button\"\n variant=\"text\"\n size=\"small\"\n aria-label={t('common.actions.clear')}\n onClick={onClear}\n >\n {t('common.actions.clear')}\n </Button>\n );\n }\n\n let pickerNode: JSX.Element | null = null;\n if (onPick != null) {\n pickerNode = (\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n aria-label={t('common.actions.pick')}\n onClick={onPick}\n >\n {pickLabel}\n </Button>\n );\n }\n\n return (\n <div className={styles.container}>\n <div className={styles.valueBox}>{displayNode}</div>\n <div className={styles.actions}>\n {pickerNode}\n {clearNode}\n </div>\n </div>\n );\n};\n\nexport default EntityIdFilterField;\n","import { useEffect, useMemo, useState } from 'react';\n\nimport type {\n BackofficeResolvedListFacetModule,\n BackofficeResolvedPickerFacetModule,\n BackofficeResolvedToolFacetModule,\n} from '@plumile/backoffice-core/types.js';\n\nimport { useBackofficeConfig } from './BackofficeConfigContext.js';\n\ntype LoadState<TModule> =\n | {\n status: 'loading';\n module: null;\n error: null;\n }\n | {\n status: 'loaded';\n module: TModule;\n error: null;\n }\n | {\n status: 'error';\n module: null;\n error: Error;\n };\n\ntype MultiLoadState<TModule> =\n | {\n status: 'loading';\n modules: Record<string, TModule>;\n error: null;\n }\n | {\n status: 'loaded';\n modules: Record<string, TModule>;\n error: null;\n }\n | {\n status: 'error';\n modules: Record<string, TModule>;\n error: Error;\n };\n\nconst toError = (error: unknown): Error => {\n if (error instanceof Error) {\n return error;\n }\n return new Error(String(error));\n};\n\nconst buildSortedEntityIds = (\n entityIds: readonly string[],\n): readonly string[] => {\n return [...new Set(entityIds)].sort();\n};\n\nconst createMultiLoadState = <TModule>(\n status: 'loading' | 'loaded',\n modules: Record<string, TModule>,\n): MultiLoadState<TModule> => {\n return {\n status,\n modules,\n error: null,\n };\n};\n\nconst areErrorsEqual = (left: Error | null, right: Error | null): boolean => {\n if (left === right) {\n return true;\n }\n if (left == null || right == null) {\n return false;\n }\n return left.name === right.name && left.message === right.message;\n};\n\nconst areModuleMapsEqual = <TModule>(\n left: Record<string, TModule>,\n right: Record<string, TModule>,\n): boolean => {\n const leftKeys = Object.keys(left);\n const rightKeys = Object.keys(right);\n\n if (leftKeys.length !== rightKeys.length) {\n return false;\n }\n\n for (const key of leftKeys) {\n if (!(key in right) || left[key] !== right[key]) {\n return false;\n }\n }\n\n return true;\n};\n\nconst areLoadStatesEqual = <TModule>(\n left: LoadState<TModule>,\n right: LoadState<TModule>,\n): boolean => {\n if (left.status !== right.status) {\n return false;\n }\n\n if (left.module !== right.module) {\n return false;\n }\n\n return areErrorsEqual(left.error, right.error);\n};\n\nconst areMultiLoadStatesEqual = <TModule>(\n left: MultiLoadState<TModule>,\n right: MultiLoadState<TModule>,\n): boolean => {\n if (left.status !== right.status) {\n return false;\n }\n\n if (!areModuleMapsEqual(left.modules, right.modules)) {\n return false;\n }\n\n return areErrorsEqual(left.error, right.error);\n};\n\nconst selectLoadState = <TModule>(\n currentState: LoadState<TModule>,\n nextState: LoadState<TModule>,\n): LoadState<TModule> => {\n if (areLoadStatesEqual(currentState, nextState)) {\n return currentState;\n }\n return nextState;\n};\n\nconst selectMultiLoadState = <TModule>(\n currentState: MultiLoadState<TModule>,\n nextState: MultiLoadState<TModule>,\n): MultiLoadState<TModule> => {\n if (areMultiLoadStatesEqual(currentState, nextState)) {\n return currentState;\n }\n return nextState;\n};\n\nconst useFacetLoader = <TModule>(\n entityId: string,\n getLoaded: (entityId: string) => TModule | null,\n load: (entityId: string) => Promise<TModule>,\n enabled = true,\n): LoadState<TModule> => {\n const initialModule = getLoaded(entityId);\n const [state, setState] = useState<LoadState<TModule>>(() => {\n if (initialModule != null) {\n return {\n status: 'loaded',\n module: initialModule,\n error: null,\n };\n }\n return {\n status: 'loading',\n module: null,\n error: null,\n };\n });\n\n useEffect(() => {\n if (!enabled) {\n const loadedModule = getLoaded(entityId);\n setState((currentState) => {\n let nextState: LoadState<TModule>;\n\n if (loadedModule != null) {\n nextState = {\n status: 'loaded',\n module: loadedModule,\n error: null,\n };\n } else {\n nextState = {\n status: 'loading',\n module: null,\n error: null,\n };\n }\n\n return selectLoadState(currentState, nextState);\n });\n return undefined;\n }\n\n const loadedModule = getLoaded(entityId);\n if (loadedModule != null) {\n setState((currentState) => {\n const nextState: LoadState<TModule> = {\n status: 'loaded',\n module: loadedModule,\n error: null,\n };\n return selectLoadState(currentState, nextState);\n });\n return undefined;\n }\n\n let cancelled = false;\n setState((currentState) => {\n const nextState: LoadState<TModule> = {\n status: 'loading',\n module: null,\n error: null,\n };\n return selectLoadState(currentState, nextState);\n });\n\n load(entityId)\n .then((module) => {\n if (cancelled) {\n return;\n }\n setState((currentState) => {\n const nextState: LoadState<TModule> = {\n status: 'loaded',\n module,\n error: null,\n };\n return selectLoadState(currentState, nextState);\n });\n })\n .catch((error: unknown) => {\n if (cancelled) {\n return;\n }\n const nextError = toError(error);\n setState((currentState) => {\n const nextState: LoadState<TModule> = {\n status: 'error',\n module: null,\n error: nextError,\n };\n return selectLoadState(currentState, nextState);\n });\n });\n\n return () => {\n cancelled = true;\n };\n }, [enabled, entityId, getLoaded, load]);\n\n return state;\n};\n\nexport const useBackofficeListEntityLoader = (\n entityId: string,\n options?: { enabled?: boolean },\n): LoadState<BackofficeResolvedListFacetModule> => {\n const { entityRegistry } = useBackofficeConfig();\n return useFacetLoader(\n entityId,\n entityRegistry.getLoadedListEntity,\n entityRegistry.loadListEntity,\n options?.enabled,\n );\n};\n\nexport const useBackofficePickerEntityLoader = (\n entityId: string,\n options?: { enabled?: boolean },\n): LoadState<BackofficeResolvedPickerFacetModule> => {\n const { entityRegistry } = useBackofficeConfig();\n return useFacetLoader(\n entityId,\n entityRegistry.getLoadedPickerEntity,\n entityRegistry.loadPickerEntity,\n options?.enabled,\n );\n};\n\nexport const useBackofficeToolEntityLoader = (\n entityId: string,\n options?: { enabled?: boolean },\n): LoadState<BackofficeResolvedToolFacetModule> => {\n const { entityRegistry } = useBackofficeConfig();\n return useFacetLoader(\n entityId,\n entityRegistry.getLoadedToolEntity,\n entityRegistry.loadToolEntity,\n options?.enabled,\n );\n};\n\nexport const useBackofficeListEntitiesLoader = (\n entityIds: readonly string[],\n): MultiLoadState<BackofficeResolvedListFacetModule> => {\n const { entityRegistry } = useBackofficeConfig();\n const normalizedEntityIds = useMemo(() => {\n return buildSortedEntityIds(entityIds);\n }, [entityIds]);\n const entityIdsKey = normalizedEntityIds.join('|');\n const [state, setState] = useState<\n MultiLoadState<BackofficeResolvedListFacetModule>\n >(() => {\n const modules: Record<string, BackofficeResolvedListFacetModule> = {};\n let isComplete = true;\n\n for (const entityId of normalizedEntityIds) {\n const module = entityRegistry.getLoadedListEntity(entityId);\n if (module == null) {\n isComplete = false;\n } else {\n modules[entityId] = module;\n }\n }\n\n if (isComplete) {\n return createMultiLoadState('loaded', modules);\n }\n return createMultiLoadState('loading', modules);\n });\n\n useEffect(() => {\n const modules: Record<string, BackofficeResolvedListFacetModule> = {};\n let isComplete = true;\n\n for (const entityId of normalizedEntityIds) {\n const module = entityRegistry.getLoadedListEntity(entityId);\n if (module == null) {\n isComplete = false;\n } else {\n modules[entityId] = module;\n }\n }\n\n if (isComplete) {\n const nextState = createMultiLoadState('loaded', modules);\n setState((currentState) => {\n return selectMultiLoadState(currentState, nextState);\n });\n return undefined;\n }\n\n let cancelled = false;\n setState((currentState) => {\n const nextState: MultiLoadState<BackofficeResolvedListFacetModule> = {\n status: 'loading',\n modules,\n error: null,\n };\n return selectMultiLoadState(currentState, nextState);\n });\n\n Promise.all(\n normalizedEntityIds.map(async (entityId) => {\n const module = await entityRegistry.loadListEntity(entityId);\n return [entityId, module] as const;\n }),\n )\n .then((entries) => {\n if (cancelled) {\n return;\n }\n setState((currentState) => {\n const nextState: MultiLoadState<BackofficeResolvedListFacetModule> = {\n status: 'loaded',\n modules: Object.fromEntries(entries),\n error: null,\n };\n return selectMultiLoadState(currentState, nextState);\n });\n })\n .catch((error: unknown) => {\n if (cancelled) {\n return;\n }\n const nextError = toError(error);\n setState((currentState) => {\n const nextState: MultiLoadState<BackofficeResolvedListFacetModule> = {\n status: 'error',\n modules,\n error: nextError,\n };\n return selectMultiLoadState(currentState, nextState);\n });\n });\n\n return () => {\n cancelled = true;\n };\n }, [entityIdsKey, entityRegistry, normalizedEntityIds]);\n\n return state;\n};\n\nexport const __test = {\n areErrorsEqual,\n buildSortedEntityIds,\n toError,\n};\n","import { sprinkles } from '@plumile/ui';\n\nexport const layout = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n});\n\nexport const searchRequiredMessage = sprinkles({\n color: 'textSecondary',\n fontSize: 'sm',\n textAlign: 'center',\n paddingY: 3,\n paddingX: 0,\n});\n\nexport const row = sprinkles({\n display: 'flex',\n gap: 2,\n alignItems: 'center',\n});\n\nexport const rowText = sprinkles({\n flex: 1,\n minWidth: 0,\n display: 'flex',\n flexDirection: 'column',\n textAlign: 'left',\n});\n\nexport const rowTitle = sprinkles({\n color: 'text',\n fontWeight: 'medium',\n fontSize: 'base',\n lineHeight: 1.2,\n});\n\nexport const rowSubtitle = sprinkles({\n color: 'textSecondary',\n fontSize: 'sm',\n lineHeight: 1.2,\n});\n\nexport const rowMeta = sprinkles({\n color: 'textMuted',\n fontSize: 'xs',\n lineHeight: 1.2,\n whiteSpace: 'nowrap',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { Input } from '@plumile/ui';\n\nimport { useBackofficeReactTranslation } from '../../../../i18n/useBackofficeReactTranslation.js';\n\nimport * as styles from '../entityIdPickerDialog.css.js';\n\nexport type EntityPickerShellProps = {\n search: string;\n onSearchChange: (next: string) => void;\n searchPlaceholder?: string;\n searchEnabled?: boolean;\n children: ReactNode;\n};\n\nexport const EntityPickerShell = ({\n search,\n onSearchChange,\n searchPlaceholder,\n searchEnabled = true,\n children,\n}: EntityPickerShellProps): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n const resolvedPlaceholder =\n searchPlaceholder ?? t('picker.searchPlaceholder.default');\n let searchNode: JSX.Element | null = null;\n if (searchEnabled) {\n searchNode = (\n <Input\n value={search}\n onChange={(event) => {\n onSearchChange(event.target.value);\n }}\n placeholder={resolvedPlaceholder}\n size=\"small\"\n fullWidth\n />\n );\n }\n\n return (\n <div className={styles.layout}>\n {searchNode}\n {children}\n </div>\n );\n};\n\nexport default EntityPickerShell;\n","import { type JSX, type ReactNode } from 'react';\n\nimport * as styles from '../entityIdPickerDialog.css.js';\n\nexport type EntityPickerRowBaseProps = {\n title: ReactNode;\n subtitle?: ReactNode;\n};\n\nexport const EntityPickerRowBase = ({\n title,\n subtitle,\n}: EntityPickerRowBaseProps): JSX.Element => {\n let subtitleNode: ReactNode | null = null;\n if (subtitle != null) {\n subtitleNode = <div className={styles.rowSubtitle}>{subtitle}</div>;\n }\n\n return (\n <div className={styles.row}>\n <div className={styles.rowText}>\n <div className={styles.rowTitle}>{title}</div>\n {subtitleNode}\n </div>\n </div>\n );\n};\n\nexport default EntityPickerRowBase;\n","import { type JSX } from 'react';\n\nimport { BackofficeEmptyState, Button } from '@plumile/ui';\n\nimport { EntityPickerRowBase } from './EntityPickerRowBase.js';\nimport type { EntityPickerRowViewModel } from '../types.js';\n\nexport type EntityPickerListProps = {\n items: readonly EntityPickerRowViewModel[];\n onSelectId: (id: string) => void;\n emptyState?: JSX.Element;\n};\n\nexport const EntityPickerList = ({\n items,\n onSelectId,\n emptyState,\n}: EntityPickerListProps): JSX.Element => {\n if (items.length === 0) {\n return (\n emptyState ?? (\n <BackofficeEmptyState\n title=\"No result\"\n description=\"Try another search term.\"\n />\n )\n );\n }\n\n return (\n <div>\n {items.map((item) => {\n return (\n <Button\n key={item.id}\n type=\"button\"\n variant=\"text\"\n onClick={() => {\n onSelectId(item.id);\n }}\n width=\"full\"\n >\n <EntityPickerRowBase title={item.title} subtitle={item.subtitle} />\n </Button>\n );\n })}\n </div>\n );\n};\n\nexport default EntityPickerList;\n","import {\n Suspense,\n useCallback,\n useEffect,\n useMemo,\n useState,\n type JSX,\n} from 'react';\nimport type { TFunction } from 'i18next';\nimport { useTranslation } from 'react-i18next';\nimport * as ReactRelay from 'react-relay';\n\nimport { Button, Modal, Spinner } from '@plumile/ui';\nimport type {\n BackofficeEntityPickerConfig,\n BackofficePickerScope,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\n\nimport { BackofficeErrorBoundary } from '../errors/BackofficeErrorBoundary.js';\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficePickerEntityLoader } from '../../../provider/useBackofficeEntityLoader.js';\n\nimport { EntityPickerShell } from './shared/EntityPickerShell.js';\nimport { EntityPickerList } from './shared/EntityPickerList.js';\nimport type { EntityPickerRowViewModel } from './types.js';\nimport * as styles from './entityIdPickerDialog.css.js';\n\nconst { useFragment, useLazyLoadQuery } = ReactRelay;\n\nexport type EntityIdPickerDialogProps = {\n isOpen: boolean;\n entity: string;\n title: string;\n scope?: BackofficePickerScope;\n onClose: () => void;\n onSelectId: (id: string) => void;\n};\n\nconst PICKER_FETCH_POLICY = 'store-and-network' as const;\n\nconst resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\ntype PickerBodyProps<RowRef, RowView extends EntityPickerRowViewModel> = {\n config: BackofficeEntityPickerConfig<RowRef, RowView>;\n search: string;\n scope?: BackofficePickerScope;\n fetchKey: number;\n onSelectId: (id: string) => void;\n};\n\nconst PickerBody = <RowRef, RowView extends EntityPickerRowViewModel>({\n config,\n search,\n scope,\n fetchKey,\n onSelectId,\n}: PickerBodyProps<RowRef, RowView>): JSX.Element => {\n const variables = useMemo(() => {\n const trimmed = search.trim();\n if (config.buildVariables != null) {\n return config.buildVariables({ search: trimmed, scope });\n }\n let searchValue: string | null = trimmed;\n if (trimmed === '') {\n searchValue = null;\n }\n return {\n search: searchValue,\n scope,\n };\n }, [config, scope, search]);\n\n const queryData = useLazyLoadQuery(config.query, variables, {\n fetchPolicy: PICKER_FETCH_POLICY,\n fetchKey,\n });\n\n const fragmentData = useFragment(\n config.fragment,\n queryData as never,\n ) as unknown;\n\n const connection = config.getConnection(fragmentData);\n\n const items = useMemo<readonly EntityPickerRowViewModel[]>(() => {\n return connection.edges.map((edge) => {\n const row = config.toRow(edge.node);\n const id = config.getRowId(row);\n return {\n id,\n title: row.title,\n subtitle: row.subtitle,\n };\n });\n }, [config, connection.edges]);\n\n return <EntityPickerList items={items} onSelectId={onSelectId} />;\n};\n\nconst buildFooter = (onClose: () => void, closeLabel: string): JSX.Element => {\n return (\n <>\n <Button type=\"button\" variant=\"secondary\" onClick={onClose}>\n {closeLabel}\n </Button>\n </>\n );\n};\n\nconst PickerUnavailable = ({ message }: { message: string }) => {\n return <div>{message}</div>;\n};\n\nexport const EntityIdPickerDialog = ({\n isOpen,\n entity,\n title,\n scope,\n onClose,\n onSelectId,\n}: EntityIdPickerDialogProps): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const [search, setSearch] = useState('');\n const [fetchKey, setFetchKey] = useState(0);\n const entityState = useBackofficePickerEntityLoader(entity, {\n enabled: isOpen,\n });\n\n let pickerConfig:\n | BackofficeEntityPickerConfig<unknown, EntityPickerRowViewModel>\n | undefined;\n if (entityState.status === 'loaded') {\n pickerConfig = entityState.module.config.picker as\n | BackofficeEntityPickerConfig<unknown, EntityPickerRowViewModel>\n | undefined;\n }\n\n useEffect(() => {\n if (isOpen) {\n setSearch('');\n setFetchKey((value) => {\n return value + 1;\n });\n }\n }, [isOpen]);\n\n const footer = useMemo(() => {\n return buildFooter(onClose, t('common.actions.close'));\n }, [onClose, t]);\n\n const handleSearchChange = useCallback((next: string) => {\n setSearch(next);\n setFetchKey((value) => {\n return value + 1;\n });\n }, []);\n\n const handleSelectId = useCallback(\n (id: string) => {\n onSelectId(id);\n onClose();\n },\n [onClose, onSelectId],\n );\n\n if (!isOpen) {\n return null;\n }\n\n let resolvedSearchPlaceholder: string | undefined;\n if (pickerConfig?.searchPlaceholder != null) {\n resolvedSearchPlaceholder = resolveLabel(\n pickerConfig.searchPlaceholder,\n tApp,\n );\n }\n\n const trimmedSearch = search.trim();\n const isSearchRequired = pickerConfig?.searchRequired === true;\n\n let pickerNode: JSX.Element;\n if (entityState.status === 'loading') {\n pickerNode = <Spinner />;\n } else if (pickerConfig != null) {\n if (isSearchRequired && trimmedSearch === '') {\n pickerNode = (\n <div className={styles.searchRequiredMessage}>\n {t('picker.searchRequired')}\n </div>\n );\n } else {\n pickerNode = (\n <PickerBody\n config={pickerConfig}\n search={search}\n scope={scope}\n fetchKey={fetchKey}\n onSelectId={handleSelectId}\n />\n );\n }\n } else {\n pickerNode = (\n <PickerUnavailable message={t('picker.unavailable', { entity })} />\n );\n }\n\n return (\n <Modal isOpen={isOpen} onClose={onClose} title={title} footer={footer}>\n <EntityPickerShell\n search={search}\n onSearchChange={handleSearchChange}\n searchPlaceholder={resolvedSearchPlaceholder}\n searchEnabled={pickerConfig?.searchEnabled ?? true}\n >\n <BackofficeErrorBoundary\n fallback={(args: { error: unknown; reset: () => void }) => {\n const { reset } = args;\n return (\n <div>\n <div>{t('picker.errors.loadFailed')}</div>\n <Button\n type=\"button\"\n variant=\"secondary\"\n onClick={() => {\n reset();\n setFetchKey((value) => {\n return value + 1;\n });\n }}\n >\n {t('common.actions.retry')}\n </Button>\n </div>\n );\n }}\n >\n <Suspense fallback={<Spinner />}>{pickerNode}</Suspense>\n </BackofficeErrorBoundary>\n </EntityPickerShell>\n </Modal>\n );\n};\n\nexport type { BackofficePickerScope } from '@plumile/backoffice-core/types.js';\n\nexport default EntityIdPickerDialog;\n"],"mappings":"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"}
1
+ {"version":3,"file":"EntityIdPickerDialog-Yhmr-WsV.js","names":[],"sources":["../../src/components/backoffice/filters/entityIdFilterField.css.ts","../../src/components/backoffice/filters/EntityIdFilterField.tsx","../../src/provider/useBackofficeEntityLoader.ts","../../src/components/backoffice/pickers/entityIdPickerDialog.css.ts","../../src/components/backoffice/pickers/shared/EntityPickerShell.tsx","../../src/components/backoffice/pickers/shared/EntityPickerRowBase.tsx","../../src/components/backoffice/pickers/shared/EntityPickerList.tsx","../../src/components/backoffice/pickers/EntityIdPickerDialog.tsx"],"sourcesContent":["import { sprinkles } from '@plumile/ui';\n\nexport const container = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n width: 72,\n maxWidth: 'full',\n});\n\nexport const valueBox = sprinkles({\n flex: 1,\n minWidth: 0,\n display: 'flex',\n alignItems: 'center',\n overflow: 'hidden',\n});\n\nexport const valueText = sprinkles({\n display: 'block',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n});\n\nexport const placeholder = sprinkles({\n color: 'textMuted',\n});\n\nexport const actions = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 1,\n});\n","import { type JSX } from 'react';\n\nimport { Button } from '@plumile/ui';\n\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\n\nimport * as styles from './entityIdFilterField.css.js';\n\nexport type EntityIdFilterFieldProps = {\n label: string;\n value: string | null;\n displayValue?: string | null;\n placeholder?: string;\n onPick?: () => void;\n onClear?: () => void;\n};\n\nexport const EntityIdFilterField = (\n props: EntityIdFilterFieldProps,\n): JSX.Element => {\n const { label, value, displayValue, placeholder, onPick, onClear } = props;\n const { t } = useBackofficeReactTranslation();\n const normalizedValue = value?.trim() ?? '';\n const normalizedDisplayValue = displayValue?.trim() ?? '';\n const hasValue = normalizedValue !== '';\n const hasDisplayValue = normalizedDisplayValue !== '';\n\n const resolvedPlaceholder =\n placeholder ?? t('filters.placeholders.search', { label });\n const unresolvedPlaceholder = t('filters.placeholders.unresolved');\n\n let displayNode: JSX.Element;\n if (hasDisplayValue) {\n displayNode = (\n <span className={styles.valueText}>{normalizedDisplayValue}</span>\n );\n } else if (hasValue) {\n displayNode = (\n <span className={styles.placeholder}>{unresolvedPlaceholder}</span>\n );\n } else {\n displayNode = (\n <span className={styles.placeholder}>{resolvedPlaceholder}</span>\n );\n }\n\n let pickLabel = t('common.actions.pick');\n if (hasValue) {\n pickLabel = t('common.actions.change');\n }\n\n let clearNode: JSX.Element | null = null;\n if (hasValue && onClear != null) {\n clearNode = (\n <Button\n type=\"button\"\n variant=\"text\"\n size=\"small\"\n aria-label={t('common.actions.clear')}\n onClick={onClear}\n >\n {t('common.actions.clear')}\n </Button>\n );\n }\n\n let pickerNode: JSX.Element | null = null;\n if (onPick != null) {\n pickerNode = (\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n aria-label={t('common.actions.pick')}\n onClick={onPick}\n >\n {pickLabel}\n </Button>\n );\n }\n\n return (\n <div className={styles.container}>\n <div className={styles.valueBox}>{displayNode}</div>\n <div className={styles.actions}>\n {pickerNode}\n {clearNode}\n </div>\n </div>\n );\n};\n\nexport default EntityIdFilterField;\n","import { useEffect, useMemo, useState } from 'react';\n\nimport type {\n BackofficeResolvedListFacetModule,\n BackofficeResolvedPickerFacetModule,\n BackofficeResolvedToolFacetModule,\n} from '@plumile/backoffice-core/types.js';\n\nimport { useBackofficeConfig } from './BackofficeConfigContext.js';\n\ntype LoadState<TModule> =\n | {\n status: 'loading';\n module: null;\n error: null;\n }\n | {\n status: 'loaded';\n module: TModule;\n error: null;\n }\n | {\n status: 'error';\n module: null;\n error: Error;\n };\n\ntype MultiLoadState<TModule> =\n | {\n status: 'loading';\n modules: Record<string, TModule>;\n error: null;\n }\n | {\n status: 'loaded';\n modules: Record<string, TModule>;\n error: null;\n }\n | {\n status: 'error';\n modules: Record<string, TModule>;\n error: Error;\n };\n\nconst toError = (error: unknown): Error => {\n if (error instanceof Error) {\n return error;\n }\n return new Error(String(error));\n};\n\nconst buildSortedEntityIds = (\n entityIds: readonly string[],\n): readonly string[] => {\n return [...new Set(entityIds)].sort();\n};\n\nconst createMultiLoadState = <TModule>(\n status: 'loading' | 'loaded',\n modules: Record<string, TModule>,\n): MultiLoadState<TModule> => {\n return {\n status,\n modules,\n error: null,\n };\n};\n\nconst areErrorsEqual = (left: Error | null, right: Error | null): boolean => {\n if (left === right) {\n return true;\n }\n if (left == null || right == null) {\n return false;\n }\n return left.name === right.name && left.message === right.message;\n};\n\nconst areModuleMapsEqual = <TModule>(\n left: Record<string, TModule>,\n right: Record<string, TModule>,\n): boolean => {\n const leftKeys = Object.keys(left);\n const rightKeys = Object.keys(right);\n\n if (leftKeys.length !== rightKeys.length) {\n return false;\n }\n\n for (const key of leftKeys) {\n if (!(key in right) || left[key] !== right[key]) {\n return false;\n }\n }\n\n return true;\n};\n\nconst areLoadStatesEqual = <TModule>(\n left: LoadState<TModule>,\n right: LoadState<TModule>,\n): boolean => {\n if (left.status !== right.status) {\n return false;\n }\n\n if (left.module !== right.module) {\n return false;\n }\n\n return areErrorsEqual(left.error, right.error);\n};\n\nconst areMultiLoadStatesEqual = <TModule>(\n left: MultiLoadState<TModule>,\n right: MultiLoadState<TModule>,\n): boolean => {\n if (left.status !== right.status) {\n return false;\n }\n\n if (!areModuleMapsEqual(left.modules, right.modules)) {\n return false;\n }\n\n return areErrorsEqual(left.error, right.error);\n};\n\nconst selectLoadState = <TModule>(\n currentState: LoadState<TModule>,\n nextState: LoadState<TModule>,\n): LoadState<TModule> => {\n if (areLoadStatesEqual(currentState, nextState)) {\n return currentState;\n }\n return nextState;\n};\n\nconst selectMultiLoadState = <TModule>(\n currentState: MultiLoadState<TModule>,\n nextState: MultiLoadState<TModule>,\n): MultiLoadState<TModule> => {\n if (areMultiLoadStatesEqual(currentState, nextState)) {\n return currentState;\n }\n return nextState;\n};\n\nconst useFacetLoader = <TModule>(\n entityId: string,\n getLoaded: (entityId: string) => TModule | null,\n load: (entityId: string) => Promise<TModule>,\n enabled = true,\n): LoadState<TModule> => {\n const initialModule = getLoaded(entityId);\n const [state, setState] = useState<LoadState<TModule>>(() => {\n if (initialModule != null) {\n return {\n status: 'loaded',\n module: initialModule,\n error: null,\n };\n }\n return {\n status: 'loading',\n module: null,\n error: null,\n };\n });\n\n useEffect(() => {\n if (!enabled) {\n const loadedModule = getLoaded(entityId);\n setState((currentState) => {\n let nextState: LoadState<TModule>;\n\n if (loadedModule != null) {\n nextState = {\n status: 'loaded',\n module: loadedModule,\n error: null,\n };\n } else {\n nextState = {\n status: 'loading',\n module: null,\n error: null,\n };\n }\n\n return selectLoadState(currentState, nextState);\n });\n return undefined;\n }\n\n const loadedModule = getLoaded(entityId);\n if (loadedModule != null) {\n setState((currentState) => {\n const nextState: LoadState<TModule> = {\n status: 'loaded',\n module: loadedModule,\n error: null,\n };\n return selectLoadState(currentState, nextState);\n });\n return undefined;\n }\n\n let cancelled = false;\n setState((currentState) => {\n const nextState: LoadState<TModule> = {\n status: 'loading',\n module: null,\n error: null,\n };\n return selectLoadState(currentState, nextState);\n });\n\n load(entityId)\n .then((module) => {\n if (cancelled) {\n return;\n }\n setState((currentState) => {\n const nextState: LoadState<TModule> = {\n status: 'loaded',\n module,\n error: null,\n };\n return selectLoadState(currentState, nextState);\n });\n })\n .catch((error: unknown) => {\n if (cancelled) {\n return;\n }\n const nextError = toError(error);\n setState((currentState) => {\n const nextState: LoadState<TModule> = {\n status: 'error',\n module: null,\n error: nextError,\n };\n return selectLoadState(currentState, nextState);\n });\n });\n\n return () => {\n cancelled = true;\n };\n }, [enabled, entityId, getLoaded, load]);\n\n return state;\n};\n\nexport const useBackofficeListEntityLoader = (\n entityId: string,\n options?: { enabled?: boolean },\n): LoadState<BackofficeResolvedListFacetModule> => {\n const { entityRegistry } = useBackofficeConfig();\n return useFacetLoader(\n entityId,\n entityRegistry.getLoadedListEntity,\n entityRegistry.loadListEntity,\n options?.enabled,\n );\n};\n\nexport const useBackofficePickerEntityLoader = (\n entityId: string,\n options?: { enabled?: boolean },\n): LoadState<BackofficeResolvedPickerFacetModule> => {\n const { entityRegistry } = useBackofficeConfig();\n return useFacetLoader(\n entityId,\n entityRegistry.getLoadedPickerEntity,\n entityRegistry.loadPickerEntity,\n options?.enabled,\n );\n};\n\nexport const useBackofficeToolEntityLoader = (\n entityId: string,\n options?: { enabled?: boolean },\n): LoadState<BackofficeResolvedToolFacetModule> => {\n const { entityRegistry } = useBackofficeConfig();\n return useFacetLoader(\n entityId,\n entityRegistry.getLoadedToolEntity,\n entityRegistry.loadToolEntity,\n options?.enabled,\n );\n};\n\nexport const useBackofficeListEntitiesLoader = (\n entityIds: readonly string[],\n): MultiLoadState<BackofficeResolvedListFacetModule> => {\n const { entityRegistry } = useBackofficeConfig();\n const normalizedEntityIds = useMemo(() => {\n return buildSortedEntityIds(entityIds);\n }, [entityIds]);\n const entityIdsKey = normalizedEntityIds.join('|');\n const [state, setState] = useState<\n MultiLoadState<BackofficeResolvedListFacetModule>\n >(() => {\n const modules: Record<string, BackofficeResolvedListFacetModule> = {};\n let isComplete = true;\n\n for (const entityId of normalizedEntityIds) {\n const module = entityRegistry.getLoadedListEntity(entityId);\n if (module == null) {\n isComplete = false;\n } else {\n modules[entityId] = module;\n }\n }\n\n if (isComplete) {\n return createMultiLoadState('loaded', modules);\n }\n return createMultiLoadState('loading', modules);\n });\n\n useEffect(() => {\n const modules: Record<string, BackofficeResolvedListFacetModule> = {};\n let isComplete = true;\n\n for (const entityId of normalizedEntityIds) {\n const module = entityRegistry.getLoadedListEntity(entityId);\n if (module == null) {\n isComplete = false;\n } else {\n modules[entityId] = module;\n }\n }\n\n if (isComplete) {\n const nextState = createMultiLoadState('loaded', modules);\n setState((currentState) => {\n return selectMultiLoadState(currentState, nextState);\n });\n return undefined;\n }\n\n let cancelled = false;\n setState((currentState) => {\n const nextState: MultiLoadState<BackofficeResolvedListFacetModule> = {\n status: 'loading',\n modules,\n error: null,\n };\n return selectMultiLoadState(currentState, nextState);\n });\n\n Promise.all(\n normalizedEntityIds.map(async (entityId) => {\n const module = await entityRegistry.loadListEntity(entityId);\n return [entityId, module] as const;\n }),\n )\n .then((entries) => {\n if (cancelled) {\n return;\n }\n setState((currentState) => {\n const nextState: MultiLoadState<BackofficeResolvedListFacetModule> = {\n status: 'loaded',\n modules: Object.fromEntries(entries),\n error: null,\n };\n return selectMultiLoadState(currentState, nextState);\n });\n })\n .catch((error: unknown) => {\n if (cancelled) {\n return;\n }\n const nextError = toError(error);\n setState((currentState) => {\n const nextState: MultiLoadState<BackofficeResolvedListFacetModule> = {\n status: 'error',\n modules,\n error: nextError,\n };\n return selectMultiLoadState(currentState, nextState);\n });\n });\n\n return () => {\n cancelled = true;\n };\n }, [entityIdsKey, entityRegistry, normalizedEntityIds]);\n\n return state;\n};\n\nexport const __test = {\n areErrorsEqual,\n buildSortedEntityIds,\n toError,\n};\n","import { sprinkles } from '@plumile/ui';\n\nexport const layout = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n});\n\nexport const searchRequiredMessage = sprinkles({\n color: 'textSecondary',\n fontSize: 'sm',\n textAlign: 'center',\n paddingY: 3,\n paddingX: 0,\n});\n\nexport const row = sprinkles({\n display: 'flex',\n gap: 2,\n alignItems: 'center',\n});\n\nexport const rowText = sprinkles({\n flex: 1,\n minWidth: 0,\n display: 'flex',\n flexDirection: 'column',\n textAlign: 'left',\n});\n\nexport const rowTitle = sprinkles({\n color: 'text',\n fontWeight: 'medium',\n fontSize: 'base',\n lineHeight: 1.2,\n});\n\nexport const rowSubtitle = sprinkles({\n color: 'textSecondary',\n fontSize: 'sm',\n lineHeight: 1.2,\n});\n\nexport const rowMeta = sprinkles({\n color: 'textMuted',\n fontSize: 'xs',\n lineHeight: 1.2,\n whiteSpace: 'nowrap',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { Input } from '@plumile/ui';\n\nimport { useBackofficeReactTranslation } from '../../../../i18n/useBackofficeReactTranslation.js';\n\nimport * as styles from '../entityIdPickerDialog.css.js';\n\nexport type EntityPickerShellProps = {\n search: string;\n onSearchChange: (next: string) => void;\n searchPlaceholder?: string;\n searchEnabled?: boolean;\n children: ReactNode;\n};\n\nexport const EntityPickerShell = ({\n search,\n onSearchChange,\n searchPlaceholder,\n searchEnabled = true,\n children,\n}: EntityPickerShellProps): JSX.Element => {\n const { t } = useBackofficeReactTranslation();\n const resolvedPlaceholder =\n searchPlaceholder ?? t('picker.searchPlaceholder.default');\n let searchNode: JSX.Element | null = null;\n if (searchEnabled) {\n searchNode = (\n <Input\n value={search}\n onChange={(event) => {\n onSearchChange(event.target.value);\n }}\n placeholder={resolvedPlaceholder}\n size=\"small\"\n fullWidth\n />\n );\n }\n\n return (\n <div className={styles.layout}>\n {searchNode}\n {children}\n </div>\n );\n};\n\nexport default EntityPickerShell;\n","import { type JSX, type ReactNode } from 'react';\n\nimport * as styles from '../entityIdPickerDialog.css.js';\n\nexport type EntityPickerRowBaseProps = {\n title: ReactNode;\n subtitle?: ReactNode;\n};\n\nexport const EntityPickerRowBase = ({\n title,\n subtitle,\n}: EntityPickerRowBaseProps): JSX.Element => {\n let subtitleNode: ReactNode | null = null;\n if (subtitle != null) {\n subtitleNode = <div className={styles.rowSubtitle}>{subtitle}</div>;\n }\n\n return (\n <div className={styles.row}>\n <div className={styles.rowText}>\n <div className={styles.rowTitle}>{title}</div>\n {subtitleNode}\n </div>\n </div>\n );\n};\n\nexport default EntityPickerRowBase;\n","import { type JSX } from 'react';\n\nimport { BackofficeEmptyState, Button } from '@plumile/ui';\n\nimport { EntityPickerRowBase } from './EntityPickerRowBase.js';\nimport type { EntityPickerRowViewModel } from '../types.js';\n\nexport type EntityPickerListProps = {\n items: readonly EntityPickerRowViewModel[];\n onSelectId: (id: string) => void;\n emptyState?: JSX.Element;\n};\n\nexport const EntityPickerList = ({\n items,\n onSelectId,\n emptyState,\n}: EntityPickerListProps): JSX.Element => {\n if (items.length === 0) {\n return (\n emptyState ?? (\n <BackofficeEmptyState\n title=\"No result\"\n description=\"Try another search term.\"\n />\n )\n );\n }\n\n return (\n <div>\n {items.map((item) => {\n return (\n <Button\n key={item.id}\n type=\"button\"\n variant=\"text\"\n onClick={() => {\n onSelectId(item.id);\n }}\n width=\"full\"\n >\n <EntityPickerRowBase title={item.title} subtitle={item.subtitle} />\n </Button>\n );\n })}\n </div>\n );\n};\n\nexport default EntityPickerList;\n","import {\n Suspense,\n useCallback,\n useEffect,\n useMemo,\n useState,\n type JSX,\n} from 'react';\nimport type { TFunction } from 'i18next';\nimport { useTranslation } from 'react-i18next';\nimport * as ReactRelay from 'react-relay';\n\nimport { Button, Modal, Spinner } from '@plumile/ui';\nimport type {\n BackofficeEntityPickerConfig,\n BackofficePickerScope,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\n\nimport { BackofficeErrorBoundary } from '../errors/BackofficeErrorBoundary.js';\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficePickerEntityLoader } from '../../../provider/useBackofficeEntityLoader.js';\n\nimport { EntityPickerShell } from './shared/EntityPickerShell.js';\nimport { EntityPickerList } from './shared/EntityPickerList.js';\nimport type { EntityPickerRowViewModel } from './types.js';\nimport * as styles from './entityIdPickerDialog.css.js';\n\nconst { useFragment, useLazyLoadQuery } = ReactRelay;\n\nexport type EntityIdPickerDialogProps = {\n isOpen: boolean;\n entity: string;\n title: string;\n scope?: BackofficePickerScope;\n onClose: () => void;\n onSelectId: (id: string) => void;\n};\n\nconst PICKER_FETCH_POLICY = 'store-and-network' as const;\n\nconst resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\ntype PickerBodyProps<RowRef, RowView extends EntityPickerRowViewModel> = {\n config: BackofficeEntityPickerConfig<RowRef, RowView>;\n search: string;\n scope?: BackofficePickerScope;\n fetchKey: number;\n onSelectId: (id: string) => void;\n};\n\nconst PickerBody = <RowRef, RowView extends EntityPickerRowViewModel>({\n config,\n search,\n scope,\n fetchKey,\n onSelectId,\n}: PickerBodyProps<RowRef, RowView>): JSX.Element => {\n const variables = useMemo(() => {\n const trimmed = search.trim();\n if (config.buildVariables != null) {\n return config.buildVariables({ search: trimmed, scope });\n }\n let searchValue: string | null = trimmed;\n if (trimmed === '') {\n searchValue = null;\n }\n return {\n search: searchValue,\n scope,\n };\n }, [config, scope, search]);\n\n const queryData = useLazyLoadQuery(config.query, variables, {\n fetchPolicy: PICKER_FETCH_POLICY,\n fetchKey,\n });\n\n const fragmentData = useFragment(\n config.fragment,\n queryData as never,\n ) as unknown;\n\n const connection = config.getConnection(fragmentData);\n\n const items = useMemo<readonly EntityPickerRowViewModel[]>(() => {\n return connection.edges.map((edge) => {\n const row = config.toRow(edge.node);\n const id = config.getRowId(row);\n return {\n id,\n title: row.title,\n subtitle: row.subtitle,\n };\n });\n }, [config, connection.edges]);\n\n return <EntityPickerList items={items} onSelectId={onSelectId} />;\n};\n\nconst buildFooter = (onClose: () => void, closeLabel: string): JSX.Element => {\n return (\n <>\n <Button type=\"button\" variant=\"secondary\" onClick={onClose}>\n {closeLabel}\n </Button>\n </>\n );\n};\n\nconst PickerUnavailable = ({ message }: { message: string }) => {\n return <div>{message}</div>;\n};\n\nexport const EntityIdPickerDialog = ({\n isOpen,\n entity,\n title,\n scope,\n onClose,\n onSelectId,\n}: EntityIdPickerDialogProps): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const [search, setSearch] = useState('');\n const [fetchKey, setFetchKey] = useState(0);\n const entityState = useBackofficePickerEntityLoader(entity, {\n enabled: isOpen,\n });\n\n let pickerConfig:\n | BackofficeEntityPickerConfig<unknown, EntityPickerRowViewModel>\n | undefined;\n if (entityState.status === 'loaded') {\n pickerConfig = entityState.module.config.picker as\n | BackofficeEntityPickerConfig<unknown, EntityPickerRowViewModel>\n | undefined;\n }\n\n useEffect(() => {\n if (isOpen) {\n setSearch('');\n setFetchKey((value) => {\n return value + 1;\n });\n }\n }, [isOpen]);\n\n const footer = useMemo(() => {\n return buildFooter(onClose, t('common.actions.close'));\n }, [onClose, t]);\n\n const handleSearchChange = useCallback((next: string) => {\n setSearch(next);\n setFetchKey((value) => {\n return value + 1;\n });\n }, []);\n\n const handleSelectId = useCallback(\n (id: string) => {\n onSelectId(id);\n onClose();\n },\n [onClose, onSelectId],\n );\n\n if (!isOpen) {\n return null;\n }\n\n let resolvedSearchPlaceholder: string | undefined;\n if (pickerConfig?.searchPlaceholder != null) {\n resolvedSearchPlaceholder = resolveLabel(\n pickerConfig.searchPlaceholder,\n tApp,\n );\n }\n\n const trimmedSearch = search.trim();\n const isSearchRequired = pickerConfig?.searchRequired === true;\n\n let pickerNode: JSX.Element;\n if (entityState.status === 'loading') {\n pickerNode = <Spinner />;\n } else if (pickerConfig != null) {\n if (isSearchRequired && trimmedSearch === '') {\n pickerNode = (\n <div className={styles.searchRequiredMessage}>\n {t('picker.searchRequired')}\n </div>\n );\n } else {\n pickerNode = (\n <PickerBody\n config={pickerConfig}\n search={search}\n scope={scope}\n fetchKey={fetchKey}\n onSelectId={handleSelectId}\n />\n );\n }\n } else {\n pickerNode = (\n <PickerUnavailable message={t('picker.unavailable', { entity })} />\n );\n }\n\n return (\n <Modal isOpen={isOpen} onClose={onClose} title={title} footer={footer}>\n <EntityPickerShell\n search={search}\n onSearchChange={handleSearchChange}\n searchPlaceholder={resolvedSearchPlaceholder}\n searchEnabled={pickerConfig?.searchEnabled ?? true}\n >\n <BackofficeErrorBoundary\n fallback={(args: { error: unknown; reset: () => void }) => {\n const { reset } = args;\n return (\n <div>\n <div>{t('picker.errors.loadFailed')}</div>\n <Button\n type=\"button\"\n variant=\"secondary\"\n onClick={() => {\n reset();\n setFetchKey((value) => {\n return value + 1;\n });\n }}\n >\n {t('common.actions.retry')}\n </Button>\n </div>\n );\n }}\n >\n <Suspense fallback={<Spinner />}>{pickerNode}</Suspense>\n </BackofficeErrorBoundary>\n </EntityPickerShell>\n </Modal>\n );\n};\n\nexport type { BackofficePickerScope } from '@plumile/backoffice-core/types.js';\n\nexport default EntityIdPickerDialog;\n"],"mappings":"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"}
@@ -4,7 +4,7 @@ import { n, r, t as i } from "./EntityFilterValue-BWUdPBwp.js";
4
4
  import { i as a, t as o } from "./EntityIdPickerDialog-Yhmr-WsV.js";
5
5
  import { Suspense as s, lazy as c, startTransition as l, useCallback as u, useEffect as d, useMemo as f, useRef as p, useState as m } from "react";
6
6
  import { useTranslation as ee } from "react-i18next";
7
- import { BackofficeEmptyState as h, BackofficeFilterDrawer as te, BackofficeFilterField as ne, BackofficeLoadMore as re, BackofficePageHeader as ie, BackofficeTableSkeleton as ae, BackofficeTableToolbar as oe, BackofficeVirtualizedConnectionTable as se, Button as g, FilterChipRow as ce, GlobalSearchInput as le, InlineBanner as ue, ListPageTemplate as de, SimpleSelect as _, denseTableClass as fe } from "@plumile/ui";
7
+ import { BackofficeEmptyState as h, BackofficeFilterDrawer as te, BackofficeFilterField as ne, BackofficeLoadMore as re, BackofficePageHeader as ie, BackofficeTableSkeleton as ae, BackofficeTableToolbar as oe, Button as g, FilterChipRow as se, GlobalSearchInput as ce, InlineBanner as le, ListPageTemplate as ue, ResponsiveRecordList as de, SimpleSelect as _, denseTableClass as fe } from "@plumile/ui";
8
8
  import { Fragment as v, jsx as y, jsxs as b } from "react/jsx-runtime";
9
9
  import { readWhereValue as x, setWhereValue as S } from "@plumile/backoffice-core/filters/where.js";
10
10
  import { stableListVariablesKey as C } from "@plumile/backoffice-core/state/stableKey.js";
@@ -23,7 +23,7 @@ function w({ hasNext: e, isLoadingNext: t, loadNext: n, count: r }) {
23
23
  }
24
24
  //#endregion
25
25
  //#region src/hooks/useBackofficeListRefetch.ts
26
- function pe({ refetch: e, variables: t, defaults: n, fetchPolicy: r, buildVariables: i }) {
26
+ function T({ refetch: e, variables: t, defaults: n, fetchPolicy: r, buildVariables: i }) {
27
27
  let a = p(C({
28
28
  where: n.where,
29
29
  sort: n.sort,
@@ -58,7 +58,7 @@ function pe({ refetch: e, variables: t, defaults: n, fetchPolicy: r, buildVariab
58
58
  }
59
59
  //#endregion
60
60
  //#region src/components/backoffice/scaffolds/backofficeEntityListScaffold.css.ts
61
- var me = "txvbqb9ip txvbqbajy txvbqbcp txvbqbao7", he = "txvbqbu4g txvbqbjep", ge = "txvbqb9ip txvbqbai7 txvbqbaog", _e = "txvbqb97 txvbqbamp txvbqbv9z", T = (e, t) => e(t), E = (e, t) => e.fromGraphQL != null && t != null ? e.fromGraphQL(t) : x(t, e.whereKey ?? e.id, e.path), ve = (e, t, n) => {
61
+ var pe = "txvbqb9ip txvbqbajy txvbqbcp txvbqbao7", me = "txvbqbu4g txvbqbjep", he = "txvbqb9ip txvbqbai7 txvbqbaog", ge = "txvbqb97 txvbqbamp txvbqbv9z", E = (e, t) => e(t), D = (e, t) => e.fromGraphQL != null && t != null ? e.fromGraphQL(t) : x(t, e.whereKey ?? e.id, e.path), _e = (e, t, n) => {
62
62
  if (t == null) return null;
63
63
  if (Array.isArray(t)) {
64
64
  let e = t.map((e) => {
@@ -75,11 +75,11 @@ var me = "txvbqb9ip txvbqbajy txvbqbcp txvbqbao7", he = "txvbqbu4g txvbqbjep", g
75
75
  entityId: e.entity,
76
76
  id: r
77
77
  }) : e.kind === "enum" ? n.enumLabel(r) : r;
78
- }, D = (i) => {
79
- let { t: s } = ee(), { t: c } = e(), { config: l, state: d, pushState: p, rows: x, getRowId: C, columns: w, gridTemplateColumns: pe, hasNextPage: D, isLoadingMore: O, onLoadMore: k, onRefresh: A, totalCount: j, emptyState: M, header: N, headerActions: ye, isLoadingInitial: P = !1, virtualize: F = !0, variant: be = "page", showFilters: xe = !0 } = i, I = l.list, L = l.listDefaults ?? I.defaultState ?? {
78
+ }, O = (i) => {
79
+ let { t: s } = ee(), { t: c } = e(), { config: l, state: d, pushState: p, rows: x, getRowId: C, columns: w, gridTemplateColumns: T, hasNextPage: O, isLoadingMore: k, onLoadMore: A, onRefresh: j, totalCount: M, emptyState: N, header: P, headerActions: ve, isLoadingInitial: F = !1, variant: ye = "page", showFilters: be = !0 } = i, I = l.list, L = l.listDefaults ?? I.defaultState ?? {
80
80
  where: null,
81
81
  sort: null
82
- }, Se = f(() => w.some((e) => e.isPrimary === !0) || w.length === 0 ? w : w.map((e, t) => {
82
+ }, R = f(() => w.some((e) => e.isPrimary === !0) || w.length === 0 ? w : w.map((e, t) => {
83
83
  let { header: n } = e;
84
84
  return t === 0 ? {
85
85
  ...e,
@@ -89,19 +89,19 @@ var me = "txvbqb9ip txvbqbajy txvbqbcp txvbqbao7", he = "txvbqbu4g txvbqbjep", g
89
89
  ...e,
90
90
  header: n
91
91
  };
92
- }), [w]), R = f(() => {
92
+ }), [w]), z = f(() => {
93
93
  let e = [];
94
94
  for (let t of I.filters) {
95
- let n = E(t, d.where), r = ve(t, n, {
95
+ let n = D(t, d.where), r = _e(t, n, {
96
96
  enumLabel: (e) => {
97
97
  if (t.kind !== "enum") return e;
98
98
  let n = t.options.find((t) => t.value === e);
99
- return n == null ? e : T(n.label, s);
99
+ return n == null ? e : E(n.label, s);
100
100
  },
101
101
  booleanLabel: (e) => {
102
102
  if (t.kind === "boolean") {
103
- if (e && t.trueLabel != null) return T(t.trueLabel, s);
104
- if (!e && t.falseLabel != null) return T(t.falseLabel, s);
103
+ if (e && t.trueLabel != null) return E(t.trueLabel, s);
104
+ if (!e && t.falseLabel != null) return E(t.falseLabel, s);
105
105
  }
106
106
  return c(e ? "filters.boolean.yes" : "filters.boolean.no");
107
107
  },
@@ -114,7 +114,7 @@ var me = "txvbqb9ip txvbqbajy txvbqbcp txvbqbao7", he = "txvbqbu4g txvbqbjep", g
114
114
  let i = String(n);
115
115
  Array.isArray(n) && (i = n.join(","));
116
116
  let a = /* @__PURE__ */ b("span", { children: [
117
- T(t.label, s),
117
+ E(t.label, s),
118
118
  ": ",
119
119
  r
120
120
  ] });
@@ -138,15 +138,15 @@ var me = "txvbqb9ip txvbqbajy txvbqbcp txvbqbao7", he = "txvbqbu4g txvbqbjep", g
138
138
  d,
139
139
  c,
140
140
  s
141
- ]), z = u(() => {
141
+ ]), B = u(() => {
142
142
  p({ ...L });
143
- }, [L, p]), [Ce, B] = m(!1), [V, H] = m(""), [U, W] = m(null), G = u((e) => {
144
- let t = e.whereKey ?? e.id, r = E(e, d.where), i = "";
143
+ }, [L, p]), [xe, V] = m(!1), [H, U] = m(""), [W, G] = m(null), K = u((e) => {
144
+ let t = e.whereKey ?? e.id, r = D(e, d.where), i = "";
145
145
  typeof r == "string" && (i = r);
146
- let o = T(e.label, s);
146
+ let o = E(e.label, s);
147
147
  if (e.kind === "text") {
148
- let n = c("filters.placeholders.search", { label: e.placeholderLabel == null ? o : T(e.placeholderLabel, s) });
149
- return e.placeholderText != null && (n = T(e.placeholderText, s)), /* @__PURE__ */ y(le, {
148
+ let n = c("filters.placeholders.search", { label: e.placeholderLabel == null ? o : E(e.placeholderLabel, s) });
149
+ return e.placeholderText != null && (n = E(e.placeholderText, s)), /* @__PURE__ */ y(ce, {
150
150
  value: i,
151
151
  onChange: (n) => {
152
152
  let r = S(d.where, t, n, e.path);
@@ -156,7 +156,7 @@ var me = "txvbqb9ip txvbqbajy txvbqbcp txvbqbao7", he = "txvbqbu4g txvbqbjep", g
156
156
  });
157
157
  },
158
158
  placeholder: n,
159
- className: he
159
+ className: me
160
160
  });
161
161
  }
162
162
  if (e.kind === "enum") return /* @__PURE__ */ y(_, {
@@ -167,7 +167,7 @@ var me = "txvbqb9ip txvbqbajy txvbqbcp txvbqbao7", he = "txvbqbu4g txvbqbjep", g
167
167
  }, ...e.options.map((e) => ({
168
168
  id: e.value,
169
169
  value: e.value,
170
- label: T(e.label, s)
170
+ label: E(e.label, s)
171
171
  }))],
172
172
  value: i,
173
173
  onChange: (n) => {
@@ -183,7 +183,7 @@ var me = "txvbqb9ip txvbqbajy txvbqbcp txvbqbao7", he = "txvbqbu4g txvbqbjep", g
183
183
  typeof r == "boolean" && (n = r);
184
184
  let i = "";
185
185
  n === !0 && (i = "true"), n === !1 && (i = "false");
186
- let a = e.trueLabel == null ? c("filters.boolean.yes") : T(e.trueLabel, s), l = e.falseLabel == null ? c("filters.boolean.no") : T(e.falseLabel, s);
186
+ let a = e.trueLabel == null ? c("filters.boolean.yes") : E(e.trueLabel, s), l = e.falseLabel == null ? c("filters.boolean.no") : E(e.falseLabel, s);
187
187
  return /* @__PURE__ */ y(_, {
188
188
  options: [
189
189
  {
@@ -225,7 +225,7 @@ var me = "txvbqb9ip txvbqbajy txvbqbcp txvbqbao7", he = "txvbqbu4g txvbqbjep", g
225
225
  value: u,
226
226
  displayValue: r,
227
227
  onPick: () => {
228
- W({
228
+ G({
229
229
  entity: e.entity,
230
230
  whereKey: t,
231
231
  label: o,
@@ -252,24 +252,24 @@ var me = "txvbqb9ip txvbqbajy txvbqbcp txvbqbao7", he = "txvbqbu4g txvbqbjep", g
252
252
  d,
253
253
  c,
254
254
  s
255
- ]), K = f(() => I.filters.some((e) => e.placement != null), [I.filters]), q = f(() => I.filters.length === 0 ? [] : K ? I.filters.filter((e) => e.placement === "quick" || e.placement === "both") : I.filters.slice(0, 3), [I.filters, K]), J = f(() => I.filters.filter((e) => e.placement == null ? !0 : e.placement === "drawer" || e.placement === "both"), [I.filters]), Y = f(() => q.find((e) => e.kind === "text"), [q]), we = f(() => {
256
- let e = q.filter((e) => e !== Y);
255
+ ]), q = f(() => I.filters.some((e) => e.placement != null), [I.filters]), J = f(() => I.filters.length === 0 ? [] : q ? I.filters.filter((e) => e.placement === "quick" || e.placement === "both") : I.filters.slice(0, 3), [I.filters, q]), Y = f(() => I.filters.filter((e) => e.placement == null ? !0 : e.placement === "drawer" || e.placement === "both"), [I.filters]), X = f(() => J.find((e) => e.kind === "text"), [J]), Se = f(() => {
256
+ let e = J.filter((e) => e !== X);
257
257
  return e.length === 0 ? null : /* @__PURE__ */ y("div", {
258
- className: me,
259
- children: e.map((e) => /* @__PURE__ */ y("span", { children: G(e) }, e.id))
258
+ className: pe,
259
+ children: e.map((e) => /* @__PURE__ */ y("span", { children: K(e) }, e.id))
260
260
  });
261
261
  }, [
262
- q,
263
- G,
264
- Y
265
- ]), Te = f(() => Y == null ? null : G(Y), [G, Y]), Ee = f(() => {
262
+ J,
263
+ K,
264
+ X
265
+ ]), Ce = f(() => X == null ? null : K(X), [K, X]), we = f(() => {
266
266
  if (I.sorts.length === 0) return null;
267
267
  let e = I.sorts[0];
268
268
  return e == null ? null : /* @__PURE__ */ y(_, {
269
269
  options: I.sorts.map((e) => ({
270
270
  id: e.id,
271
271
  value: e.id,
272
- label: T(e.label, s)
272
+ label: E(e.label, s)
273
273
  })),
274
274
  value: d.sort ?? e.id,
275
275
  onChange: (e) => {
@@ -284,19 +284,19 @@ var me = "txvbqb9ip txvbqbajy txvbqbcp txvbqbao7", he = "txvbqbu4g txvbqbjep", g
284
284
  p,
285
285
  d,
286
286
  s
287
- ]), De = f(() => /* @__PURE__ */ y(ce, {
288
- chips: R,
289
- onClearAll: z
290
- }), [R, z]), Oe = f(() => {
291
- if (J.length === 0) return [];
292
- let e = V.trim().toLowerCase(), t = [];
293
- for (let n of J) {
294
- let r = T(n.label, s);
287
+ ]), Te = f(() => /* @__PURE__ */ y(se, {
288
+ chips: z,
289
+ onClearAll: B
290
+ }), [z, B]), Ee = f(() => {
291
+ if (Y.length === 0) return [];
292
+ let e = H.trim().toLowerCase(), t = [];
293
+ for (let n of Y) {
294
+ let r = E(n.label, s);
295
295
  (e === "" || r.toLowerCase().includes(e)) && t.push({
296
296
  id: n.id,
297
297
  node: /* @__PURE__ */ y(ne, {
298
298
  label: r,
299
- children: G(n)
299
+ children: K(n)
300
300
  })
301
301
  });
302
302
  }
@@ -306,68 +306,68 @@ var me = "txvbqb9ip txvbqbajy txvbqbcp txvbqbao7", he = "txvbqbu4g txvbqbjep", g
306
306
  items: t
307
307
  }];
308
308
  }, [
309
- J,
310
- V,
311
- G,
309
+ Y,
310
+ H,
311
+ K,
312
312
  c,
313
313
  s
314
- ]), ke = f(() => {
315
- if (J.length === 0) return null;
316
- let e = R.length, t = c("filters.allFilters");
314
+ ]), De = f(() => {
315
+ if (Y.length === 0) return null;
316
+ let e = z.length, t = c("filters.allFilters");
317
317
  return e > 0 && (t = c("filters.allFiltersWithCount", { count: e })), /* @__PURE__ */ y(g, {
318
318
  type: "button",
319
319
  variant: "secondary",
320
320
  size: "small",
321
321
  onClick: () => {
322
- B(!0);
322
+ V(!0);
323
323
  },
324
324
  children: t
325
325
  });
326
326
  }, [
327
- R.length,
328
- J.length,
327
+ z.length,
328
+ Y.length,
329
329
  c
330
- ]), Ae = /* @__PURE__ */ y(te, {
331
- isOpen: Ce,
330
+ ]), Oe = /* @__PURE__ */ y(te, {
331
+ isOpen: xe,
332
332
  onClose: () => {
333
- B(!1), H("");
333
+ V(!1), U("");
334
334
  },
335
- sections: Oe,
336
- searchValue: V,
335
+ sections: Ee,
336
+ searchValue: H,
337
337
  onSearchChange: (e) => {
338
- H(e);
338
+ U(e);
339
339
  },
340
- onReset: z
341
- }), je = f(() => M ?? (P ? /* @__PURE__ */ y(ae, {}) : R.length > 0 ? /* @__PURE__ */ y(h, {
340
+ onReset: B
341
+ }), ke = f(() => N ?? (F ? /* @__PURE__ */ y(ae, {}) : z.length > 0 ? /* @__PURE__ */ y(h, {
342
342
  title: c("emptyState.listEmpty.title"),
343
343
  description: c("emptyState.listEmptyFiltered.description"),
344
344
  actions: /* @__PURE__ */ y(g, {
345
345
  type: "button",
346
346
  variant: "secondary",
347
347
  size: "small",
348
- onClick: z,
348
+ onClick: B,
349
349
  children: c("emptyState.listEmptyFiltered.actions.reset")
350
350
  })
351
351
  }) : /* @__PURE__ */ y(h, {
352
352
  title: c("emptyState.listEmpty.title"),
353
353
  description: c("emptyState.listEmpty.description")
354
354
  })), [
355
- R.length,
356
- M,
357
- z,
358
- P,
355
+ z.length,
356
+ N,
357
+ B,
358
+ F,
359
359
  c
360
- ]), Me = f(() => typeof j == "number" ? /* @__PURE__ */ y("span", { children: c("list.showing", {
360
+ ]), Ae = f(() => typeof M == "number" ? /* @__PURE__ */ y("span", { children: c("list.showing", {
361
361
  shown: x.length,
362
- total: j
362
+ total: M
363
363
  }) }) : null, [
364
364
  x.length,
365
365
  c,
366
- j
367
- ]), X = N?.title ?? T(I.title, s), Ne = N?.subtitle, Pe = /* @__PURE__ */ y(t, {
366
+ M
367
+ ]), Z = P?.title ?? E(I.title, s), je = P?.subtitle, Me = R.find((e) => e.mobileRole === "action" || e.id === "actions"), Ne = /* @__PURE__ */ y(t, {
368
368
  fallback: (e) => {
369
369
  let { reset: t } = e;
370
- return /* @__PURE__ */ y(ue, {
370
+ return /* @__PURE__ */ y(le, {
371
371
  tone: "danger",
372
372
  title: c("list.errors.title"),
373
373
  actions: /* @__PURE__ */ y(g, {
@@ -375,90 +375,77 @@ var me = "txvbqb9ip txvbqbajy txvbqbcp txvbqbao7", he = "txvbqbu4g txvbqbjep", g
375
375
  variant: "secondary",
376
376
  size: "small",
377
377
  onClick: () => {
378
- t(), A?.();
378
+ t(), j?.();
379
379
  },
380
380
  children: c("list.actions.retry")
381
381
  }),
382
382
  children: c("list.errors.tableFailed")
383
383
  });
384
384
  },
385
- children: /* @__PURE__ */ y(se, {
386
- columns: Se,
385
+ children: /* @__PURE__ */ y(de, {
386
+ columns: R,
387
387
  rows: x,
388
388
  getRowId: C,
389
- emptyState: je,
389
+ emptyState: ke,
390
390
  className: fe,
391
- gridTemplateColumns: pe,
392
- virtualization: f(() => F ? {
393
- enabled: !0,
394
- rowHeightPx: 52,
395
- overscan: 10
396
- } : {
397
- enabled: !1,
398
- rowHeightPx: 0,
399
- overscan: 0
400
- }, [F]),
401
- infiniteScroll: {
402
- enabled: !0,
403
- thresholdPx: 800,
404
- autoLoad: !0
405
- },
406
- hasNextPage: D,
407
- isLoadingMore: O,
408
- onLoadMore: k
391
+ gridTemplateColumns: T,
392
+ mode: I.responsive?.mode ?? "auto",
393
+ density: I.responsive?.density ?? "compact",
394
+ renderAction: (e) => Me?.cell(e) ?? null
409
395
  })
410
- }), Z = xe ? /* @__PURE__ */ b(v, { children: [/* @__PURE__ */ y(oe, {
411
- searchSlot: Te,
412
- filtersSlot: /* @__PURE__ */ b(v, { children: [we, ke] }),
413
- sortSlot: Ee,
396
+ }), Q = be ? /* @__PURE__ */ b(v, { children: [/* @__PURE__ */ y(oe, {
397
+ searchSlot: Ce,
398
+ filtersSlot: /* @__PURE__ */ b(v, { children: [Se, De] }),
399
+ sortSlot: we,
414
400
  refreshSlot: /* @__PURE__ */ y(g, {
415
401
  type: "button",
416
402
  variant: "text",
417
403
  size: "small",
418
- disabled: A == null,
404
+ disabled: j == null,
419
405
  onClick: () => {
420
- A?.();
406
+ j?.();
421
407
  },
422
408
  children: c("list.actions.refresh")
423
409
  }),
424
- chipsSlot: De
425
- }), Ae] }) : null, Q = /* @__PURE__ */ b("div", { children: [Pe, /* @__PURE__ */ y(o, {
426
- isOpen: U != null,
427
- entity: U?.entity ?? l.id,
428
- title: U?.label ?? c("picker.title"),
429
- scope: U?.scope,
410
+ chipsSlot: Te
411
+ }), Oe] }) : null, Pe = /* @__PURE__ */ b("div", { children: [Ne, /* @__PURE__ */ y(o, {
412
+ isOpen: W != null,
413
+ entity: W?.entity ?? l.id,
414
+ title: W?.label ?? c("picker.title"),
415
+ scope: W?.scope,
430
416
  onClose: () => {
431
- W(null);
417
+ G(null);
432
418
  },
433
419
  onSelectId: (e) => {
434
- if (U == null) return;
435
- let t = S(d.where, U.whereKey, e, U.path);
420
+ if (W == null) return;
421
+ let t = S(d.where, W.whereKey, e, W.path);
436
422
  p({
437
423
  ...d,
438
424
  where: t
439
425
  });
440
426
  }
441
427
  })] }), $ = /* @__PURE__ */ y(re, {
442
- hasNextPage: D,
443
- isLoading: O,
444
- meta: Me,
428
+ hasNextPage: O,
429
+ isLoading: k,
430
+ meta: Ae,
445
431
  loadMoreLabel: c("list.loadMore.more"),
446
432
  endLabel: c("list.loadMore.end"),
447
- loadingLabel: c("list.loadMore.loading")
433
+ loadingLabel: c("list.loadMore.loading"),
434
+ onLoadMore: A
448
435
  });
449
- return be === "embedded" ? /* @__PURE__ */ y(r, {
436
+ return ye === "embedded" ? /* @__PURE__ */ y(r, {
450
437
  config: l,
451
438
  state: d,
452
439
  pushState: p,
453
440
  children: /* @__PURE__ */ b("div", {
454
- className: ge,
441
+ className: he,
455
442
  children: [
456
443
  /* @__PURE__ */ y("div", {
457
- className: _e,
458
- children: X
444
+ className: ge,
445
+ children: Z
459
446
  }),
460
- Z,
461
447
  Q,
448
+ Pe,
462
449
  $
463
450
  ]
464
451
  })
@@ -466,22 +453,22 @@ var me = "txvbqb9ip txvbqbajy txvbqbcp txvbqbao7", he = "txvbqbu4g txvbqbjep", g
466
453
  config: l,
467
454
  state: d,
468
455
  pushState: p,
469
- children: /* @__PURE__ */ y(de, {
456
+ children: /* @__PURE__ */ y(ue, {
470
457
  headerNode: /* @__PURE__ */ y(ie, {
471
- title: X,
472
- subtitle: Ne,
473
- actions: ye
458
+ title: Z,
459
+ subtitle: je,
460
+ actions: ve
474
461
  }),
475
- toolbarNode: Z,
476
- tableNode: Q,
462
+ toolbarNode: Q,
463
+ tableNode: Pe,
477
464
  tableFooterNode: $
478
465
  })
479
466
  });
480
- }, O = c(async () => ({ default: (await import("./BackofficeEntityActionFormDialog-BgRTJ_JS.js")).BackofficeEntityActionFormDialog })), k = (e) => /* @__PURE__ */ y(s, {
467
+ }, k = c(async () => ({ default: (await import("./BackofficeEntityActionFormDialog-BgRTJ_JS.js")).BackofficeEntityActionFormDialog })), A = (e) => /* @__PURE__ */ y(s, {
481
468
  fallback: null,
482
- children: /* @__PURE__ */ y(O, { ...e })
469
+ children: /* @__PURE__ */ y(k, { ...e })
483
470
  });
484
471
  //#endregion
485
- export { w as i, D as n, pe as r, k as t };
472
+ export { w as i, O as n, T as r, A as t };
486
473
 
487
- //# sourceMappingURL=LazyBackofficeEntityActionFormDialog-DVPQyWlr.js.map
474
+ //# sourceMappingURL=LazyBackofficeEntityActionFormDialog-L8xwaGqH.js.map