@plumile/backoffice-react 0.1.99 → 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.
- package/lib/esm/AcceptInvitationScreen-B1IPafwD.js.map +1 -1
- package/lib/esm/BackofficeAcceptInvitationPage-CEtApVwL.js.map +1 -1
- package/lib/esm/{BackofficeDashboardPage-YWvoQODn.js → BackofficeDashboardPage-r8vK_JA6.js} +4 -2
- package/lib/esm/BackofficeDashboardPage-r8vK_JA6.js.map +1 -0
- package/lib/esm/BackofficeDetailPayload-P61MDRLE.js.map +1 -1
- package/lib/esm/BackofficeEntityActionFormDialog-BgRTJ_JS.js.map +1 -1
- package/lib/esm/BackofficeEntityDetailLayoutContext-C_tBqkVq.js.map +1 -1
- package/lib/esm/BackofficeEntityDetailLayoutPage-DXjRqvcZ.js.map +1 -1
- package/lib/esm/{BackofficeEntityDetailPage-DPFXbJxC.js → BackofficeEntityDetailPage-CwzKp_Yw.js} +25 -17
- package/lib/esm/BackofficeEntityDetailPage-CwzKp_Yw.js.map +1 -0
- package/lib/esm/BackofficeEntityDetailUnknownPageRedirect-DRWTeox-.js.map +1 -1
- package/lib/esm/{BackofficeEntityListPage-C8Ucmc_E.js → BackofficeEntityListPage-DVT3rrfa.js} +5 -3
- package/lib/esm/BackofficeEntityListPage-DVT3rrfa.js.map +1 -0
- package/lib/esm/BackofficeErrorBoundary-BwRVSDHU.js.map +1 -1
- package/lib/esm/BackofficeLayoutPage-DQ0sVv24.js +609 -0
- package/lib/esm/BackofficeLayoutPage-DQ0sVv24.js.map +1 -0
- package/lib/esm/BackofficeLoginPage-Cc3kcOQV.js.map +1 -1
- package/lib/esm/BackofficePasswordResetCompletePage-CF_0t3Nq.js.map +1 -1
- package/lib/esm/BackofficePasswordResetRequestPage-BJOrQXcy.js.map +1 -1
- package/lib/esm/{BackofficeRightPageLayout-DZQvIHnj.js → BackofficeRightPageLayout-hexJmpam.js} +36 -30
- package/lib/esm/BackofficeRightPageLayout-hexJmpam.js.map +1 -0
- package/lib/esm/BackofficeTopbarPortalContext-iD7dm4_h.js.map +1 -1
- package/lib/esm/BackofficeVerifyEmailPage-C81LlsNM.js.map +1 -1
- package/lib/esm/EntityFilterValue-BWUdPBwp.js.map +1 -1
- package/lib/esm/EntityIdPickerDialog-Yhmr-WsV.js.map +1 -1
- package/lib/esm/{LazyBackofficeEntityActionFormDialog-DVPQyWlr.js → LazyBackofficeEntityActionFormDialog-L8xwaGqH.js} +110 -123
- package/lib/esm/LazyBackofficeEntityActionFormDialog-L8xwaGqH.js.map +1 -0
- package/lib/esm/PasswordResetCompleteScreen-Cgg96DPo.js.map +1 -1
- package/lib/esm/PasswordResetRequestScreen-I1nFvGLd.js.map +1 -1
- package/lib/esm/VerifyEmailScreen-Br5KyHjg.js.map +1 -1
- package/lib/esm/backoffice-react.js +11 -5
- package/lib/esm/backoffice-react.js.map +1 -1
- package/lib/esm/backofficeAuthPaths-BiJvoI5Q.js.map +1 -1
- package/lib/esm/buildBreadcrumbs-CqF9Nh6x.js.map +1 -1
- package/lib/esm/environment-DQfVyWHJ.js.map +1 -1
- package/lib/esm/mutationResult-CcQMY13J.js.map +1 -1
- package/lib/esm/pageResolution-hAQA5C6S.js.map +1 -1
- package/lib/esm/sidebarUtils-DVkLmFbS.js +52 -0
- package/lib/esm/sidebarUtils-DVkLmFbS.js.map +1 -0
- package/lib/esm/synchronizeAuthStatusQuery-BoPKMrP1.js.map +1 -1
- package/lib/esm/toastViewAction-BGTS7vqm.js.map +1 -1
- package/lib/esm/useAuth-CheTnq60.js.map +1 -1
- package/lib/esm/useBackofficeAuth-ers1FUGe.js.map +1 -1
- package/lib/esm/useBackofficeLazyValue-Bh_13h8A.js.map +1 -1
- package/lib/esm/useBackofficeListUrlState-D4fx5O7u.js.map +1 -1
- package/lib/esm/useBackofficeReactTranslation-Btt58EIo.js.map +1 -1
- package/lib/types/components/backoffice/columns/buildDataTableColumns.d.ts.map +1 -1
- package/lib/types/components/backoffice/layout/buildSidebarSections.d.ts +2 -1
- package/lib/types/components/backoffice/layout/buildSidebarSections.d.ts.map +1 -1
- package/lib/types/components/backoffice/layout/sidebarUtils.d.ts +4 -1
- package/lib/types/components/backoffice/layout/sidebarUtils.d.ts.map +1 -1
- package/lib/types/components/backoffice/scaffolds/BackofficeEntityListScaffold.d.ts.map +1 -1
- package/lib/types/hooks/useSidebarGroupCollapse.d.ts +1 -0
- package/lib/types/hooks/useSidebarGroupCollapse.d.ts.map +1 -1
- package/lib/types/i18n/resources.d.ts +2 -0
- package/lib/types/i18n/resources.d.ts.map +1 -1
- package/lib/types/pages/BackofficeDashboardPage.d.ts.map +1 -1
- package/lib/types/pages/BackofficeDashboardPage.helpers.d.ts.map +1 -1
- package/lib/types/pages/BackofficeEntityDetailPage.d.ts.map +1 -1
- package/lib/types/pages/BackofficeEntityDetailPage.view-helpers.d.ts +1 -0
- package/lib/types/pages/BackofficeEntityDetailPage.view-helpers.d.ts.map +1 -1
- package/lib/types/pages/BackofficeEntityListPage.d.ts.map +1 -1
- package/lib/types/pages/BackofficeEntityListPage.helpers.d.ts.map +1 -1
- package/lib/types/pages/BackofficeLayoutPage.d.ts.map +1 -1
- package/lib/types/provider/types.d.ts +64 -1
- package/lib/types/provider/types.d.ts.map +1 -1
- package/package.json +14 -14
- package/lib/esm/BackofficeDashboardPage-YWvoQODn.js.map +0 -1
- package/lib/esm/BackofficeEntityDetailPage-DPFXbJxC.js.map +0 -1
- package/lib/esm/BackofficeEntityListPage-C8Ucmc_E.js.map +0 -1
- package/lib/esm/BackofficeLayoutPage-CKXS0nDO.js +0 -485
- package/lib/esm/BackofficeLayoutPage-CKXS0nDO.js.map +0 -1
- package/lib/esm/BackofficeRightPageLayout-DZQvIHnj.js.map +0 -1
- package/lib/esm/LazyBackofficeEntityActionFormDialog-DVPQyWlr.js.map +0 -1
- package/lib/esm/sidebarUtils-CuwJ_3mD.js +0 -34
- 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,
|
|
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
|
|
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
|
|
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
|
-
},
|
|
79
|
-
let { t: s } = ee(), { t: c } = e(), { config: l, state: d, pushState: p, rows: x, getRowId: C, columns: w, gridTemplateColumns:
|
|
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
|
-
},
|
|
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]),
|
|
92
|
+
}), [w]), z = f(() => {
|
|
93
93
|
let e = [];
|
|
94
94
|
for (let t of I.filters) {
|
|
95
|
-
let 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 :
|
|
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
|
|
104
|
-
if (!e && t.falseLabel != null) return
|
|
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
|
-
|
|
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
|
-
]),
|
|
141
|
+
]), B = u(() => {
|
|
142
142
|
p({ ...L });
|
|
143
|
-
}, [L, p]), [
|
|
144
|
-
let t = e.whereKey ?? e.id, r =
|
|
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 =
|
|
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 :
|
|
149
|
-
return e.placeholderText != null && (n =
|
|
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:
|
|
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:
|
|
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") :
|
|
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
|
-
|
|
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
|
-
]),
|
|
256
|
-
let e =
|
|
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:
|
|
259
|
-
children: e.map((e) => /* @__PURE__ */ y("span", { children:
|
|
258
|
+
className: pe,
|
|
259
|
+
children: e.map((e) => /* @__PURE__ */ y("span", { children: K(e) }, e.id))
|
|
260
260
|
});
|
|
261
261
|
}, [
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
]),
|
|
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:
|
|
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
|
-
]),
|
|
288
|
-
chips:
|
|
289
|
-
onClearAll:
|
|
290
|
-
}), [
|
|
291
|
-
if (
|
|
292
|
-
let e =
|
|
293
|
-
for (let n of
|
|
294
|
-
let r =
|
|
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:
|
|
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
|
-
|
|
310
|
-
|
|
311
|
-
|
|
309
|
+
Y,
|
|
310
|
+
H,
|
|
311
|
+
K,
|
|
312
312
|
c,
|
|
313
313
|
s
|
|
314
|
-
]),
|
|
315
|
-
if (
|
|
316
|
-
let e =
|
|
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
|
-
|
|
322
|
+
V(!0);
|
|
323
323
|
},
|
|
324
324
|
children: t
|
|
325
325
|
});
|
|
326
326
|
}, [
|
|
327
|
-
|
|
328
|
-
|
|
327
|
+
z.length,
|
|
328
|
+
Y.length,
|
|
329
329
|
c
|
|
330
|
-
]),
|
|
331
|
-
isOpen:
|
|
330
|
+
]), Oe = /* @__PURE__ */ y(te, {
|
|
331
|
+
isOpen: xe,
|
|
332
332
|
onClose: () => {
|
|
333
|
-
|
|
333
|
+
V(!1), U("");
|
|
334
334
|
},
|
|
335
|
-
sections:
|
|
336
|
-
searchValue:
|
|
335
|
+
sections: Ee,
|
|
336
|
+
searchValue: H,
|
|
337
337
|
onSearchChange: (e) => {
|
|
338
|
-
|
|
338
|
+
U(e);
|
|
339
339
|
},
|
|
340
|
-
onReset:
|
|
341
|
-
}),
|
|
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:
|
|
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
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
355
|
+
z.length,
|
|
356
|
+
N,
|
|
357
|
+
B,
|
|
358
|
+
F,
|
|
359
359
|
c
|
|
360
|
-
]),
|
|
360
|
+
]), Ae = f(() => typeof M == "number" ? /* @__PURE__ */ y("span", { children: c("list.showing", {
|
|
361
361
|
shown: x.length,
|
|
362
|
-
total:
|
|
362
|
+
total: M
|
|
363
363
|
}) }) : null, [
|
|
364
364
|
x.length,
|
|
365
365
|
c,
|
|
366
|
-
|
|
367
|
-
]),
|
|
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(
|
|
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(),
|
|
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(
|
|
386
|
-
columns:
|
|
385
|
+
children: /* @__PURE__ */ y(de, {
|
|
386
|
+
columns: R,
|
|
387
387
|
rows: x,
|
|
388
388
|
getRowId: C,
|
|
389
|
-
emptyState:
|
|
389
|
+
emptyState: ke,
|
|
390
390
|
className: fe,
|
|
391
|
-
gridTemplateColumns:
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
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
|
-
}),
|
|
411
|
-
searchSlot:
|
|
412
|
-
filtersSlot: /* @__PURE__ */ b(v, { children: [
|
|
413
|
-
sortSlot:
|
|
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:
|
|
404
|
+
disabled: j == null,
|
|
419
405
|
onClick: () => {
|
|
420
|
-
|
|
406
|
+
j?.();
|
|
421
407
|
},
|
|
422
408
|
children: c("list.actions.refresh")
|
|
423
409
|
}),
|
|
424
|
-
chipsSlot:
|
|
425
|
-
}),
|
|
426
|
-
isOpen:
|
|
427
|
-
entity:
|
|
428
|
-
title:
|
|
429
|
-
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
|
-
|
|
417
|
+
G(null);
|
|
432
418
|
},
|
|
433
419
|
onSelectId: (e) => {
|
|
434
|
-
if (
|
|
435
|
-
let t = S(d.where,
|
|
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:
|
|
443
|
-
isLoading:
|
|
444
|
-
meta:
|
|
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
|
|
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:
|
|
441
|
+
className: he,
|
|
455
442
|
children: [
|
|
456
443
|
/* @__PURE__ */ y("div", {
|
|
457
|
-
className:
|
|
458
|
-
children:
|
|
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(
|
|
456
|
+
children: /* @__PURE__ */ y(ue, {
|
|
470
457
|
headerNode: /* @__PURE__ */ y(ie, {
|
|
471
|
-
title:
|
|
472
|
-
subtitle:
|
|
473
|
-
actions:
|
|
458
|
+
title: Z,
|
|
459
|
+
subtitle: je,
|
|
460
|
+
actions: ve
|
|
474
461
|
}),
|
|
475
|
-
toolbarNode:
|
|
476
|
-
tableNode:
|
|
462
|
+
toolbarNode: Q,
|
|
463
|
+
tableNode: Pe,
|
|
477
464
|
tableFooterNode: $
|
|
478
465
|
})
|
|
479
466
|
});
|
|
480
|
-
},
|
|
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(
|
|
469
|
+
children: /* @__PURE__ */ y(k, { ...e })
|
|
483
470
|
});
|
|
484
471
|
//#endregion
|
|
485
|
-
export { w as i,
|
|
472
|
+
export { w as i, O as n, T as r, A as t };
|
|
486
473
|
|
|
487
|
-
//# sourceMappingURL=LazyBackofficeEntityActionFormDialog-
|
|
474
|
+
//# sourceMappingURL=LazyBackofficeEntityActionFormDialog-L8xwaGqH.js.map
|