@plumile/backoffice-react 0.1.194 → 0.1.195

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 (117) hide show
  1. package/lib/esm/auth/AuthRefreshNotice.js.map +1 -1
  2. package/lib/esm/auth/TotpQrCode.js +8 -5
  3. package/lib/esm/auth/TotpQrCode.js.map +1 -1
  4. package/lib/esm/auth/login/AuthPanel.js.map +1 -1
  5. package/lib/esm/auth/login/EmailCapturePanel.js +4 -4
  6. package/lib/esm/auth/login/EmailCapturePanel.js.map +1 -1
  7. package/lib/esm/auth/login/LoginFlow.js.map +1 -1
  8. package/lib/esm/auth/login/MethodChooser.js.map +1 -1
  9. package/lib/esm/auth/login/MfaChallengeForm.js +4 -4
  10. package/lib/esm/auth/login/MfaChallengeForm.js.map +1 -1
  11. package/lib/esm/auth/login/OidcButtons.js.map +1 -1
  12. package/lib/esm/auth/login/PasskeyLoginForm.js +4 -4
  13. package/lib/esm/auth/login/PasskeyLoginForm.js.map +1 -1
  14. package/lib/esm/auth/login/PasswordLoginPanel.js.map +1 -1
  15. package/lib/esm/auth/pages/AcceptInvitationScreen.js.map +1 -1
  16. package/lib/esm/auth/pages/PasswordResetCompleteScreen.js.map +1 -1
  17. package/lib/esm/auth/pages/PasswordResetRequestScreen.js.map +1 -1
  18. package/lib/esm/auth/pages/VerifyEmailScreen.js.map +1 -1
  19. package/lib/esm/components/backoffice/actions/BackofficeEntityActionFormDialog.js +0 -1
  20. package/lib/esm/components/backoffice/actions/BackofficeEntityActionFormDialog.js.map +1 -1
  21. package/lib/esm/components/backoffice/actions/LazyBackofficeEntityActionFormDialog.js.map +1 -1
  22. package/lib/esm/components/backoffice/billing/BackofficeBillingUsageChart.js.map +1 -1
  23. package/lib/esm/components/backoffice/columns/buildDataTableColumns.js +16 -11
  24. package/lib/esm/components/backoffice/columns/buildDataTableColumns.js.map +1 -1
  25. package/lib/esm/components/backoffice/detail/BackofficeDetailBadgeRow.js.map +1 -1
  26. package/lib/esm/components/backoffice/detail/BackofficeDetailErrorList.js.map +1 -1
  27. package/lib/esm/components/backoffice/detail/BackofficeEntitySummaryHeader.js.map +1 -1
  28. package/lib/esm/components/backoffice/detail/BackofficeLifecycleTimelineSection.js.map +1 -1
  29. package/lib/esm/components/backoffice/detail/BackofficeRelationsSummaryGrid.js.map +1 -1
  30. package/lib/esm/components/backoffice/detail/BackofficeTokenUsageBreakdown.js.map +1 -1
  31. package/lib/esm/components/backoffice/detail/BackofficeUsageCostBreakdown.js.map +1 -1
  32. package/lib/esm/components/backoffice/filters/BackofficeFilterAction.js +2 -2
  33. package/lib/esm/components/backoffice/filters/BackofficeFilterAction.js.map +1 -1
  34. package/lib/esm/components/backoffice/filters/DeferredFilterSearchInput.js.map +1 -1
  35. package/lib/esm/components/backoffice/filters/EntityFilterValue.js.map +1 -1
  36. package/lib/esm/components/backoffice/filters/EntityIdFilterField.js.map +1 -1
  37. package/lib/esm/components/backoffice/hub/BackofficeHubTemplate.js.map +1 -1
  38. package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js +4 -1
  39. package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeRightPageLayout.js.map +1 -1
  40. package/lib/esm/components/backoffice/layout/breadcrumb/BackofficeTopbarBreadcrumb.js.map +1 -1
  41. package/lib/esm/components/backoffice/layout/buildSidebarSections.js.map +1 -1
  42. package/lib/esm/components/backoffice/layout/sidebarUtils.js.map +1 -1
  43. package/lib/esm/components/backoffice/links/BackofficeInlineLink.js.map +1 -1
  44. package/lib/esm/components/backoffice/links/BackofficeLink.js.map +1 -1
  45. package/lib/esm/components/backoffice/links/BackofficeLinkContent.js.map +1 -1
  46. package/lib/esm/components/backoffice/links/BackofficeLinkLabel.js.map +1 -1
  47. package/lib/esm/components/backoffice/list/RowFlagsCell.js.map +1 -1
  48. package/lib/esm/components/backoffice/overview/BackofficeOverviewLayout.js.map +1 -1
  49. package/lib/esm/components/backoffice/pickers/EntityIdPickerDialog.js +9 -9
  50. package/lib/esm/components/backoffice/pickers/EntityIdPickerDialog.js.map +1 -1
  51. package/lib/esm/components/backoffice/refs/BackofficeEntityIdRef.js.map +1 -1
  52. package/lib/esm/components/backoffice/refs/BackofficeEntityLink.js.map +1 -1
  53. package/lib/esm/components/backoffice/refs/BackofficeLazyEntityCount.js.map +1 -1
  54. package/lib/esm/components/backoffice/refs/BackofficeRelatedCountLink.js +4 -4
  55. package/lib/esm/components/backoffice/refs/BackofficeRelatedCountLink.js.map +1 -1
  56. package/lib/esm/components/backoffice/routing/BackofficeContentBoundary.js.map +1 -1
  57. package/lib/esm/components/backoffice/routing/BackofficeContentError.js.map +1 -1
  58. package/lib/esm/components/backoffice/routing/BackofficeContentFallback.js.map +1 -1
  59. package/lib/esm/components/backoffice/routing/BackofficeRoutePendingBar.js.map +1 -1
  60. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityDetailNotFound.js +8 -5
  61. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityDetailNotFound.js.map +1 -1
  62. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js +306 -297
  63. package/lib/esm/components/backoffice/scaffolds/BackofficeEntityListScaffold.js.map +1 -1
  64. package/lib/esm/components/backoffice/scaffolds/BackofficeTabbedDetailShell.js.map +1 -1
  65. package/lib/esm/components/backoffice/shared/BackofficeFilterableCell.js.map +1 -1
  66. package/lib/esm/components/backoffice/shared/BackofficeFormattedCurrency.js.map +1 -1
  67. package/lib/esm/components/backoffice/shared/BackofficeFormattedNumber.js.map +1 -1
  68. package/lib/esm/components/backoffice/shared/BackofficeInlineFilterRow.js.map +1 -1
  69. package/lib/esm/components/backoffice/tools/BackofficeToolsDocPanel.js.map +1 -1
  70. package/lib/esm/components/backoffice/tools/BackofficeToolsErrorFallback.js.map +1 -1
  71. package/lib/esm/components/backoffice/tools/BackofficeToolsJsonForm.js.map +1 -1
  72. package/lib/esm/components/backoffice/tools/BackofficeToolsQueryBoundary.js +11 -11
  73. package/lib/esm/components/backoffice/tools/BackofficeToolsQueryBoundary.js.map +1 -1
  74. package/lib/esm/node_modules/relay-test-utils/lib/RelayModernMockEnvironment.js +1 -1
  75. package/lib/esm/node_modules/relay-test-utils/lib/RelayModernMockEnvironment.js.map +1 -1
  76. package/lib/esm/pages/BackofficeAcceptInvitationPage.js +8 -8
  77. package/lib/esm/pages/BackofficeAcceptInvitationPage.js.map +1 -1
  78. package/lib/esm/pages/BackofficeDashboardPage.js +4 -4
  79. package/lib/esm/pages/BackofficeDashboardPage.js.map +1 -1
  80. package/lib/esm/pages/BackofficeDashboardShellPage.js.map +1 -1
  81. package/lib/esm/pages/BackofficeDashboardWidgetContent.js +62 -43
  82. package/lib/esm/pages/BackofficeDashboardWidgetContent.js.map +1 -1
  83. package/lib/esm/pages/BackofficeEntityDetailLayoutPage.js +4 -4
  84. package/lib/esm/pages/BackofficeEntityDetailLayoutPage.js.map +1 -1
  85. package/lib/esm/pages/BackofficeEntityDetailPage.js +95 -89
  86. package/lib/esm/pages/BackofficeEntityDetailPage.js.map +1 -1
  87. package/lib/esm/pages/BackofficeEntityDetailPage.view-helpers.js +2 -2
  88. package/lib/esm/pages/BackofficeEntityDetailPage.view-helpers.js.map +1 -1
  89. package/lib/esm/pages/BackofficeEntityDetailPageConfigPage.js.map +1 -1
  90. package/lib/esm/pages/BackofficeEntityListDataPage.js +13 -11
  91. package/lib/esm/pages/BackofficeEntityListDataPage.js.map +1 -1
  92. package/lib/esm/pages/BackofficeEntityListPage.js +80 -76
  93. package/lib/esm/pages/BackofficeEntityListPage.js.map +1 -1
  94. package/lib/esm/pages/BackofficeEntityListShellPage.js.map +1 -1
  95. package/lib/esm/pages/BackofficeHubPage.js.map +1 -1
  96. package/lib/esm/pages/BackofficeLayoutPage.js +56 -53
  97. package/lib/esm/pages/BackofficeLayoutPage.js.map +1 -1
  98. package/lib/esm/pages/BackofficeLoginPage.js +26 -26
  99. package/lib/esm/pages/BackofficeLoginPage.js.map +1 -1
  100. package/lib/esm/pages/BackofficePasswordResetCompletePage.js +36 -36
  101. package/lib/esm/pages/BackofficePasswordResetCompletePage.js.map +1 -1
  102. package/lib/esm/pages/BackofficePasswordResetRequestPage.js +3 -3
  103. package/lib/esm/pages/BackofficePasswordResetRequestPage.js.map +1 -1
  104. package/lib/esm/pages/BackofficeToolShellPage.js.map +1 -1
  105. package/lib/esm/pages/BackofficeVerifyEmailPage.js +36 -36
  106. package/lib/esm/pages/BackofficeVerifyEmailPage.js.map +1 -1
  107. package/lib/esm/pages/detail/BackofficeEntityDetailManifestFallback.js.map +1 -1
  108. package/lib/esm/provider/BackofficeProvider.js +3 -2
  109. package/lib/esm/provider/BackofficeProvider.js.map +1 -1
  110. package/lib/esm/relay/envHelpers.js.map +1 -1
  111. package/lib/esm/router/createBackofficeRoutes.js +2 -2
  112. package/lib/esm/router/createBackofficeRoutes.js.map +1 -1
  113. package/lib/esm/storybook/relay/RelayStory.js +4 -1
  114. package/lib/esm/storybook/relay/RelayStory.js.map +1 -1
  115. package/lib/esm/subscriptions/useCursorResumableSubscription.js +4 -4
  116. package/lib/esm/subscriptions/useCursorResumableSubscription.js.map +1 -1
  117. package/package.json +16 -16
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeEntityListScaffold.js","names":[],"sources":["../../../../../src/components/backoffice/scaffolds/BackofficeEntityListScaffold.tsx"],"sourcesContent":["/* eslint-disable no-ternary */\nimport {\n type JSX,\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport type { TFunction } from 'i18next';\nimport { useTranslation } from 'react-i18next';\nimport { Button } from '@plumile/ui/atomic/atoms/button/Button.js';\nimport { BackofficeEmptyState } from '@plumile/ui/backoffice/molecules/backoffice_empty_state/BackofficeEmptyState.js';\nimport { BackofficeFilterDrawer } from '@plumile/ui/backoffice/molecules/backoffice_filter_drawer/BackofficeFilterDrawer.js';\nimport { BackofficeFilterField } from '@plumile/ui/backoffice/molecules/backoffice_filter_field/BackofficeFilterField.js';\nimport { Spinner } from '@plumile/ui/backoffice/atoms/spinner/Spinner.js';\nimport { Tag } from '@plumile/ui/backoffice/atoms/tag/Tag.js';\nimport { BackofficeListFooter } from '@plumile/ui/backoffice/molecules/backoffice_list_footer/BackofficeListFooter.js';\nimport { BackofficePageHeader } from '@plumile/ui/backoffice/molecules/backoffice_page_header/BackofficePageHeader.js';\nimport { BackofficeToolbar } from '@plumile/ui/backoffice/molecules/backoffice_toolbar/BackofficeToolbar.js';\nimport { BackofficeTableSkeleton } from '@plumile/ui/backoffice/molecules/backoffice_table_skeleton/BackofficeTableSkeleton.js';\nimport {\n FilterChipRow,\n type FilterChip,\n} from '@plumile/ui/backoffice/molecules/filter_chip_row/FilterChipRow.js';\nimport { InlineBanner } from '@plumile/ui/components/feedback/InlineBanner.js';\nimport { ListPageTemplate } from '@plumile/ui/backoffice/templates/list_page_template/ListPageTemplate.js';\nimport {\n type DataTableColumn,\n type GetRowId,\n} from '@plumile/ui/components/data-table/DataTable.js';\nimport { ResponsiveRecordList } from '@plumile/ui/components/data-table/ResponsiveRecordList.js';\nimport { VirtualizedConnectionTable } from '@plumile/ui/components/data-table/VirtualizedConnectionTable.js';\nimport { SimpleSelect } from '@plumile/ui/components/select/SimpleSelect.js';\nimport { denseTableClass } from '@plumile/ui/shared/backofficeTableDensity.css.js';\n\nimport {\n readWhereValue,\n setWhereValue,\n} from '@plumile/backoffice-core/filters/where.js';\nimport { resolveBackofficeListRuntimeConfig } from '@plumile/backoffice-core/config/listRuntime.js';\nimport type {\n BackofficeFilterSpec,\n BackofficeListState,\n BackofficePickerScope,\n BackofficeRuntimeResolvedListFacetConfig,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\n\nimport { BackofficeErrorBoundary } from '../errors/BackofficeErrorBoundary.js';\nimport {\n EntityFilterValue,\n EntityFilterValueText,\n} from '../filters/EntityFilterValue.js';\nimport { EntityIdPickerDialog } from '../pickers/EntityIdPickerDialog.js';\nimport { EntityIdFilterField } from '../filters/EntityIdFilterField.js';\nimport { DeferredFilterSearchInput } from '../filters/DeferredFilterSearchInput.js';\nimport { BackofficeListFilterProvider } from './BackofficeListFilterContext.js';\nimport { BACKOFFICE_LIST_BODY_SCROLL_MODE } from './backofficeListScrollMode.js';\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeInfiniteScrollSentinel } from '../../../hooks/useBackofficeInfiniteScrollSentinel.js';\nimport type { BackofficeFilterDrawerState } from '../../../provider/BackofficeListUiStateContext.js';\nimport { isDevEnv } from '../../../relay/envHelpers.js';\n\nimport * as styles from './backofficeEntityListScaffold.css.js';\n\nconst resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\nconst getFilterValue = <Where extends Record<string, unknown>>(\n filter: BackofficeFilterSpec<Where>,\n where: Where | null,\n): unknown => {\n if (filter.fromGraphQL != null && where != null) {\n return filter.fromGraphQL(where);\n }\n\n const key = (filter.whereKey ?? filter.id) as keyof Where;\n return readWhereValue(where, key, filter.path);\n};\n\nconst normalizeStringArray = (value: unknown): readonly string[] => {\n if (!Array.isArray(value)) {\n return [];\n }\n return value\n .map((entry) => {\n if (entry == null) {\n return null;\n }\n const normalized = String(entry).trim();\n if (normalized === '') {\n return null;\n }\n return normalized;\n })\n .filter((entry): entry is string => {\n return entry != null;\n });\n};\n\nconst getFilterDisplayValue = <Where extends Record<string, unknown>>(\n filter: BackofficeFilterSpec<Where>,\n raw: unknown,\n options: {\n enumLabel: (value: string) => string;\n booleanLabel: (value: boolean) => string;\n fallbackBooleanLabels: { yes: string; no: string };\n },\n): ReactNode | null => {\n if (raw == null) {\n return null;\n }\n\n if (Array.isArray(raw)) {\n const normalized = normalizeStringArray(raw);\n\n if (normalized.length === 0) {\n return null;\n }\n\n if (filter.kind === 'entityIdList') {\n return (\n <>\n {normalized.map((id, index) => {\n return (\n <span key={id}>\n <EntityFilterValue entityId={filter.entity} id={id} />\n {index < normalized.length - 1 ? ', ' : null}\n </span>\n );\n })}\n </>\n );\n }\n\n return normalized.join(', ');\n }\n\n if (typeof raw === 'boolean') {\n if (filter.kind === 'boolean') {\n return options.booleanLabel(raw);\n }\n if (raw) {\n return options.fallbackBooleanLabels.yes;\n }\n return options.fallbackBooleanLabels.no;\n }\n\n if (typeof raw !== 'string' && typeof raw !== 'number') {\n return null;\n }\n\n const rawString = String(raw).trim();\n if (rawString === '') {\n return null;\n }\n\n if (filter.kind === 'entityId') {\n return <EntityFilterValue entityId={filter.entity} id={rawString} />;\n }\n\n if (filter.kind === 'enum') {\n return options.enumLabel(rawString);\n }\n\n return rawString;\n};\n\nconst toDatetimeInputValue = (value: string): string => {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) {\n return value;\n }\n const offsetMs = date.getTimezoneOffset() * 60_000;\n return new Date(date.getTime() - offsetMs).toISOString().slice(0, 16);\n};\n\nconst fromDatetimeInputValue = (value: string): string => {\n const normalized = value.trim();\n if (normalized === '') {\n return '';\n }\n const date = new Date(normalized);\n if (Number.isNaN(date.getTime())) {\n return normalized;\n }\n return date.toISOString();\n};\n\ntype RuntimeWhere = Record<string, unknown>;\ntype RuntimeSort = string;\n\ntype Props<RowView> = {\n config: BackofficeRuntimeResolvedListFacetConfig;\n state: BackofficeListState<RuntimeWhere, RuntimeSort>;\n pushState: (next: BackofficeListState<RuntimeWhere, RuntimeSort>) => void;\n header?: {\n title?: string;\n subtitle?: string;\n };\n headerActions?: ReactNode;\n rows: readonly RowView[];\n getRowId: GetRowId<RowView>;\n columns: readonly DataTableColumn<RowView>[];\n gridTemplateColumns?: string;\n hasNextPage: boolean;\n isLoadingMore: boolean;\n isRefreshing?: boolean;\n onLoadMore: () => void;\n onRefresh?: () => void;\n totalCount?: number | null;\n loadedCountLabel?: ReactNode;\n emptyState?: JSX.Element;\n statusBanner?: ReactNode;\n isLoadingInitial?: boolean;\n virtualize?: boolean;\n variant?: 'page' | 'embedded';\n showFilters?: boolean;\n filterDrawerState?: BackofficeFilterDrawerState;\n};\n\nexport const BackofficeEntityListScaffold = <RowView,>(\n props: Props<RowView>,\n): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const {\n config,\n state,\n pushState,\n rows,\n getRowId,\n columns,\n gridTemplateColumns,\n hasNextPage,\n isLoadingMore,\n isRefreshing = false,\n onLoadMore,\n onRefresh,\n totalCount,\n loadedCountLabel,\n emptyState,\n statusBanner,\n header,\n headerActions,\n isLoadingInitial = false,\n variant = 'page',\n showFilters = true,\n } = props;\n const listConfig = config.list;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const listDefaults = config.listDefaults ??\n listConfig.defaultState ?? { where: null, sort: null };\n\n const columnsWithPrimary = useMemo(() => {\n const hasPrimary = columns.some((col) => {\n return col.isPrimary === true;\n });\n if (hasPrimary || columns.length === 0) {\n return columns;\n }\n return columns.map((col, index) => {\n const { header } = col;\n if (index === 0) {\n return { ...col, isPrimary: true, header };\n }\n return { ...col, header };\n });\n }, [columns]);\n\n const chips = useMemo<readonly FilterChip[]>(() => {\n const out: FilterChip[] = [];\n for (const filter of listConfig.filters) {\n const raw = getFilterValue(filter, state.where);\n const displayValue = getFilterDisplayValue(filter, raw, {\n enumLabel: (value) => {\n if (filter.kind !== 'enum') {\n return value;\n }\n const match = filter.options.find((option) => {\n return option.value === value;\n });\n if (match != null) {\n return resolveLabel(match.label, tApp);\n }\n return value;\n },\n booleanLabel: (value) => {\n if (filter.kind === 'boolean') {\n if (value && filter.trueLabel != null) {\n return resolveLabel(filter.trueLabel, tApp);\n }\n if (!value && filter.falseLabel != null) {\n return resolveLabel(filter.falseLabel, tApp);\n }\n }\n if (value) {\n return t('filters.boolean.yes');\n }\n return t('filters.boolean.no');\n },\n fallbackBooleanLabels: {\n yes: t('filters.boolean.yes'),\n no: t('filters.boolean.no'),\n },\n });\n\n if (displayValue != null) {\n let idValue = String(raw);\n if (Array.isArray(raw)) {\n idValue = raw.join(',');\n }\n const label = (\n <span>\n {resolveLabel(filter.label, tApp)}: {displayValue}\n </span>\n );\n out.push({\n id: `${filter.id}:${idValue}`,\n label,\n onRemove: () => {\n const key = filter.whereKey ?? filter.id;\n const nextWhere = setWhereValue(\n state.where,\n key,\n null,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n },\n });\n }\n }\n return out;\n }, [listConfig.filters, pushState, state, t, tApp]);\n\n const handleClearAll = useCallback(() => {\n pushState({\n ...listDefaults,\n });\n }, [listDefaults, pushState]);\n const [localIsFilterDrawerOpen, setLocalIsFilterDrawerOpen] = useState(false);\n const [localFilterSearch, setLocalFilterSearch] = useState('');\n const drawerState = props.filterDrawerState ?? {\n isOpen: localIsFilterDrawerOpen,\n search: localFilterSearch,\n setOpen: setLocalIsFilterDrawerOpen,\n setSearch: setLocalFilterSearch,\n reset: () => {\n setLocalIsFilterDrawerOpen(false);\n setLocalFilterSearch('');\n },\n };\n const isFilterDrawerOpen = drawerState.isOpen;\n const filterSearch = drawerState.search;\n const setIsFilterDrawerOpen = drawerState.setOpen;\n const setFilterSearch = drawerState.setSearch;\n const resetFilterDrawer = drawerState.reset;\n\n const [pickerDialog, setPickerDialog] = useState<{\n entity: string;\n whereKey: keyof RuntimeWhere;\n label: string;\n mode: 'single' | 'list';\n currentIds?: readonly string[];\n path?: readonly string[];\n scope?: BackofficePickerScope<Record<string, unknown>>;\n } | null>(null);\n\n const renderFilterControl = useCallback(\n (filter: BackofficeFilterSpec<RuntimeWhere>): JSX.Element => {\n const key = filter.whereKey ?? filter.id;\n const candidate = getFilterValue(filter, state.where);\n let value = '';\n if (typeof candidate === 'string') {\n value = candidate;\n }\n if (typeof candidate === 'number' && Number.isFinite(candidate)) {\n value = String(candidate);\n }\n\n const filterLabelText = resolveLabel(filter.label, tApp);\n\n if (filter.kind === 'text') {\n const placeholderLabelText =\n filter.placeholderLabel != null\n ? resolveLabel(filter.placeholderLabel, tApp)\n : filterLabelText;\n let placeholder = t('filters.placeholders.search', {\n label: placeholderLabelText,\n });\n if (filter.placeholderText != null) {\n placeholder = resolveLabel(filter.placeholderText, tApp);\n }\n return (\n <DeferredFilterSearchInput\n value={value}\n onApply={(next) => {\n const nextWhere = setWhereValue(\n state.where,\n key,\n next,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n placeholder={placeholder}\n ariaLabel={placeholder}\n className={styles.filterInput}\n />\n );\n }\n\n if (filter.kind === 'datetime') {\n const placeholderLabelText =\n filter.placeholderLabel != null\n ? resolveLabel(filter.placeholderLabel, tApp)\n : filterLabelText;\n let placeholder = t('filters.placeholders.search', {\n label: placeholderLabelText,\n });\n if (filter.placeholderText != null) {\n placeholder = resolveLabel(filter.placeholderText, tApp);\n }\n return (\n <DeferredFilterSearchInput\n value={toDatetimeInputValue(value)}\n onApply={(next) => {\n const normalized = fromDatetimeInputValue(next);\n const nextWhere = setWhereValue(\n state.where,\n key,\n normalized,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n placeholder={placeholder}\n ariaLabel={placeholder}\n className={styles.filterInput}\n type=\"datetime-local\"\n />\n );\n }\n\n if (filter.kind === 'number') {\n const placeholderLabelText =\n filter.placeholderLabel != null\n ? resolveLabel(filter.placeholderLabel, tApp)\n : filterLabelText;\n let placeholder = t('filters.placeholders.search', {\n label: placeholderLabelText,\n });\n if (filter.placeholderText != null) {\n placeholder = resolveLabel(filter.placeholderText, tApp);\n }\n return (\n <DeferredFilterSearchInput\n value={value}\n onApply={(next) => {\n const normalized = next.trim();\n const parsed = normalized === '' ? null : Number(normalized);\n const nextWhere = setWhereValue(\n state.where,\n key,\n Number.isFinite(parsed) ? parsed : null,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n placeholder={placeholder}\n ariaLabel={placeholder}\n className={styles.filterInput}\n inputMode={filter.inputMode ?? 'numeric'}\n type=\"text\"\n />\n );\n }\n\n if (filter.kind === 'enum') {\n const options = [\n {\n id: 'any',\n value: '',\n label: t('filters.all', {\n label: filterLabelText,\n }),\n },\n ...filter.options.map((option) => {\n return {\n id: option.value,\n value: option.value,\n label: resolveLabel(option.label, tApp),\n };\n }),\n ];\n\n return (\n <SimpleSelect\n options={options}\n value={value}\n size=\"small\"\n ariaLabel={filterLabelText}\n onChange={(next) => {\n const nextWhere = setWhereValue(\n state.where,\n key,\n next,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n />\n );\n }\n\n if (filter.kind === 'boolean') {\n let current: boolean | null = null;\n if (typeof candidate === 'boolean') {\n current = candidate;\n }\n\n let selectValue = '';\n if (current === true) {\n selectValue = 'true';\n }\n if (current === false) {\n selectValue = 'false';\n }\n\n const trueLabel =\n filter.trueLabel != null\n ? resolveLabel(filter.trueLabel, tApp)\n : t('filters.boolean.yes');\n const falseLabel =\n filter.falseLabel != null\n ? resolveLabel(filter.falseLabel, tApp)\n : t('filters.boolean.no');\n const options = [\n {\n id: 'any',\n value: '',\n label: t('filters.all', {\n label: filterLabelText,\n }),\n },\n {\n id: 'true',\n value: 'true',\n label: trueLabel,\n },\n {\n id: 'false',\n value: 'false',\n label: falseLabel,\n },\n ];\n\n return (\n <SimpleSelect\n options={options}\n value={selectValue}\n size=\"small\"\n ariaLabel={filterLabelText}\n onChange={(next) => {\n let parsed: boolean | null = null;\n if (next === 'true') {\n parsed = true;\n }\n if (next === 'false') {\n parsed = false;\n }\n const nextWhere = setWhereValue(\n state.where,\n key,\n parsed,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n />\n );\n }\n\n const pickerScope = (() => {\n if (filter.pickerScope == null) {\n return undefined;\n }\n if (typeof filter.pickerScope === 'function') {\n return filter.pickerScope(state.where);\n }\n return filter.pickerScope;\n })();\n\n if (filter.kind === 'entityIdList') {\n const currentIds = normalizeStringArray(candidate);\n const selectedCount = currentIds.length;\n const displayValue =\n selectedCount === 0\n ? null\n : t('filters.selectedEntities', {\n count: selectedCount,\n });\n\n const removeId = (id: string): void => {\n const nextIds = currentIds.filter((currentId) => {\n return currentId !== id;\n });\n const nextWhere = setWhereValue(\n state.where,\n key,\n nextIds.length === 0 ? null : nextIds,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n };\n\n return (\n <div className={styles.entityIdListFilter}>\n <EntityIdFilterField\n label={filterLabelText}\n value={selectedCount === 0 ? null : currentIds.join(',')}\n displayValue={displayValue}\n placeholder={t('filters.placeholders.anyEntity', {\n label: filterLabelText,\n })}\n onPick={() => {\n setPickerDialog({\n entity: filter.entity,\n whereKey: key,\n label: filterLabelText,\n mode: 'list',\n currentIds,\n path: filter.path,\n scope: pickerScope,\n });\n }}\n onClear={() => {\n const nextWhere = setWhereValue(\n state.where,\n key,\n null,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n />\n {currentIds.length > 0 ? (\n <div className={styles.entityIdListTags}>\n {currentIds.map((id) => {\n return (\n <Tag\n key={id}\n removeLabel={t('filters.actions.removeFilterValue', {\n label: filterLabelText,\n })}\n onRemove={() => {\n removeId(id);\n }}\n >\n <EntityFilterValue entityId={filter.entity} id={id} />\n </Tag>\n );\n })}\n </div>\n ) : null}\n </div>\n );\n }\n\n if (filter.kind === 'stringList') {\n const placeholderLabelText =\n filter.placeholderLabel != null\n ? resolveLabel(filter.placeholderLabel, tApp)\n : filterLabelText;\n let placeholder = t('filters.placeholders.search', {\n label: placeholderLabelText,\n });\n if (filter.placeholderText != null) {\n placeholder = resolveLabel(filter.placeholderText, tApp);\n }\n return (\n <DeferredFilterSearchInput\n value={value}\n onApply={(next) => {\n const values = next\n .split(/[\\n,]+/u)\n .map((entry) => {\n return entry.trim();\n })\n .filter((entry) => {\n return entry !== '';\n });\n const nextWhere = setWhereValue(\n state.where,\n key,\n values,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n placeholder={placeholder}\n ariaLabel={placeholder}\n className={styles.filterInput}\n />\n );\n }\n\n let currentId: string | null = null;\n if (typeof candidate === 'string') {\n currentId = candidate;\n }\n\n const renderField = (\n displayValue: string | null = null,\n isResolving = false,\n ) => {\n const normalizedDisplayValue = displayValue?.trim() ?? '';\n return (\n <EntityIdFilterField\n label={filterLabelText}\n value={currentId}\n displayValue={normalizedDisplayValue}\n isResolving={isResolving}\n placeholder={t('filters.placeholders.anyEntity', {\n label: filterLabelText,\n })}\n onPick={() => {\n setPickerDialog({\n entity: filter.entity,\n whereKey: key,\n label: filterLabelText,\n mode: 'single',\n path: filter.path,\n scope: pickerScope,\n });\n }}\n onClear={() => {\n const nextWhere = setWhereValue(\n state.where,\n key,\n null,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n />\n );\n };\n\n if (currentId == null || currentId.trim() === '') {\n return renderField();\n }\n\n return (\n <EntityFilterValueText entityId={filter.entity} id={currentId}>\n {(label, valueState) => {\n const isResolving = valueState?.status === 'loading';\n return renderField(\n isResolving ? t('common.loading') : label,\n isResolving,\n );\n }}\n </EntityFilterValueText>\n );\n },\n [pushState, state, t, tApp],\n );\n\n const hasPlacementConfig = useMemo(() => {\n return listConfig.filters.some((filter) => {\n return filter.placement != null;\n });\n }, [listConfig.filters]);\n\n const quickFilters = useMemo(() => {\n if (listConfig.filters.length === 0) {\n return [];\n }\n const maxPromotedFilters = listConfig.ui?.toolbar?.maxPromotedFilters ?? 3;\n if (hasPlacementConfig) {\n return listConfig.filters.filter((filter) => {\n return filter.placement === 'quick' || filter.placement === 'both';\n });\n }\n return listConfig.filters.slice(0, maxPromotedFilters);\n }, [listConfig.filters, listConfig.ui?.toolbar, hasPlacementConfig]);\n\n const drawerFilters = useMemo(() => {\n return listConfig.filters.filter((filter) => {\n if (filter.placement == null) {\n return true;\n }\n return filter.placement === 'drawer' || filter.placement === 'both';\n });\n }, [listConfig.filters]);\n\n const searchFilter = useMemo(() => {\n return quickFilters.find((filter) => {\n return filter.kind === 'text';\n });\n }, [quickFilters]);\n\n const quickFiltersNode = useMemo(() => {\n const visibleQuickFilters = quickFilters.filter((filter) => {\n return filter !== searchFilter;\n });\n\n if (visibleQuickFilters.length === 0) {\n return null;\n }\n\n return (\n <div className={styles.controlsRow}>\n {visibleQuickFilters.map((filter) => {\n return <span key={filter.id}>{renderFilterControl(filter)}</span>;\n })}\n </div>\n );\n }, [quickFilters, renderFilterControl, searchFilter]);\n\n const searchNode = useMemo(() => {\n if (searchFilter == null) {\n return null;\n }\n return renderFilterControl(searchFilter);\n }, [renderFilterControl, searchFilter]);\n\n const sortNode = useMemo(() => {\n if (listConfig.sorts.length === 0) {\n return null;\n }\n const firstSort = listConfig.sorts[0];\n if (firstSort == null) {\n return null;\n }\n const options = listConfig.sorts.map((s) => {\n return { id: s.id, value: s.id, label: resolveLabel(s.label, tApp) };\n });\n return (\n <SimpleSelect\n options={options}\n value={state.sort ?? firstSort.id}\n size=\"small\"\n ariaLabel={t('list.sort.label')}\n onChange={(next) => {\n pushState({\n ...state,\n sort: next,\n });\n }}\n />\n );\n }, [listConfig.sorts, pushState, state, t, tApp]);\n\n const chipsNode = useMemo(() => {\n if (chips.length === 0) {\n return null;\n }\n return <FilterChipRow chips={chips} onClearAll={handleClearAll} />;\n }, [chips, handleClearAll]);\n\n const drawerSections = useMemo(() => {\n if (drawerFilters.length === 0) {\n return [];\n }\n\n const normalizedQuery = filterSearch.trim().toLowerCase();\n const items: { id: string; node: JSX.Element }[] = [];\n\n for (const filter of drawerFilters) {\n const resolvedLabel = resolveLabel(filter.label, tApp);\n const matchesQuery =\n normalizedQuery === '' ||\n resolvedLabel.toLowerCase().includes(normalizedQuery);\n\n if (matchesQuery) {\n items.push({\n id: filter.id,\n node: (\n <BackofficeFilterField label={resolvedLabel}>\n {renderFilterControl(filter)}\n </BackofficeFilterField>\n ),\n });\n }\n }\n\n if (items.length === 0) {\n return [];\n }\n\n return [\n {\n id: 'backoffice.filters.sections.default',\n title: t('filters.sections.default'),\n items,\n },\n ];\n }, [drawerFilters, filterSearch, renderFilterControl, t, tApp]);\n\n const allFiltersNode = useMemo(() => {\n if (drawerFilters.length === 0) {\n return null;\n }\n const activeCount = chips.length;\n let label = t('filters.trigger');\n if (activeCount > 0) {\n label = t('filters.triggerWithCount', {\n count: activeCount,\n });\n }\n return (\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n onClick={() => {\n setIsFilterDrawerOpen(true);\n }}\n >\n {label}\n </Button>\n );\n }, [chips.length, drawerFilters.length, setIsFilterDrawerOpen, t]);\n\n const filterDrawerEmptyLabel =\n filterSearch.trim() === ''\n ? undefined\n : t('filters.drawer.emptySearchResults');\n\n const filterDrawerNode = (\n <BackofficeFilterDrawer\n isOpen={isFilterDrawerOpen}\n onClose={() => {\n resetFilterDrawer();\n }}\n sections={drawerSections}\n searchValue={filterSearch}\n onSearchChange={(next) => {\n setFilterSearch(next);\n }}\n onReset={handleClearAll}\n emptyLabel={filterDrawerEmptyLabel}\n />\n );\n\n const resolvedEmptyState = useMemo((): JSX.Element => {\n if (emptyState != null) {\n return emptyState;\n }\n\n if (isLoadingInitial) {\n return (\n <BackofficeTableSkeleton\n variant=\"embedded\"\n ariaLabel={t('common.loading')}\n />\n );\n }\n\n if (chips.length > 0) {\n return (\n <BackofficeEmptyState\n title={t('emptyState.listEmpty.title')}\n description={t('emptyState.listEmptyFiltered.description')}\n actions={\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n onClick={handleClearAll}\n >\n {t('emptyState.listEmptyFiltered.actions.reset')}\n </Button>\n }\n />\n );\n }\n\n return (\n <BackofficeEmptyState\n title={t('emptyState.listEmpty.title')}\n description={t('emptyState.listEmpty.description')}\n />\n );\n }, [chips.length, emptyState, handleClearAll, isLoadingInitial, t]);\n\n const tableFooterMeta = useMemo((): ReactNode => {\n if (loadedCountLabel != null) {\n return loadedCountLabel;\n }\n if (typeof totalCount !== 'number') {\n if (rows.length === 0) {\n return null;\n }\n return (\n <span>\n {t('list.loaded', {\n count: rows.length,\n })}\n </span>\n );\n }\n return (\n <span>\n {t('list.showing', {\n shown: rows.length,\n total: totalCount,\n })}\n </span>\n );\n }, [loadedCountLabel, rows.length, t, totalCount]);\n\n const runtimeConfig = useMemo(() => {\n const resolvedDisplayMode =\n listConfig.ui?.displayMode ?? listConfig.responsive?.mode ?? 'auto';\n return resolveBackofficeListRuntimeConfig({\n kind: listConfig.kind,\n displayMode: resolvedDisplayMode,\n ui: listConfig.ui,\n });\n }, [listConfig.kind, listConfig.responsive?.mode, listConfig.ui]);\n\n const hasKnownRemainingRows =\n typeof totalCount === 'number' && rows.length < totalCount;\n const hasInconsistentPageInfo = hasKnownRemainingRows && !hasNextPage;\n\n useEffect(() => {\n if (\n !hasInconsistentPageInfo ||\n !runtimeConfig.infiniteScroll.showInconsistentPageInfo ||\n !isDevEnv()\n ) {\n return;\n }\n // eslint-disable-next-line no-console\n console.warn(\n 'Backoffice list received inconsistent pageInfo: loaded rows are lower than totalCount but hasNextPage is false.',\n {\n entityId: config.id,\n loadedCount: rows.length,\n totalCount,\n },\n );\n }, [\n config.id,\n hasInconsistentPageInfo,\n rows.length,\n runtimeConfig.infiniteScroll.showInconsistentPageInfo,\n totalCount,\n ]);\n\n const shouldVirtualizeTable =\n props.virtualize === true || runtimeConfig.virtualization.enabled;\n\n const { sentinelRef } = useBackofficeInfiniteScrollSentinel({\n enabled: !shouldVirtualizeTable && runtimeConfig.infiniteScroll.enabled,\n hasNextPage,\n isLoading: isLoadingMore,\n onIntersect: onLoadMore,\n rootMargin: runtimeConfig.infiniteScroll.rootMargin,\n threshold: runtimeConfig.infiniteScroll.threshold,\n });\n\n const headerTitle = header?.title ?? resolveLabel(listConfig.title, tApp);\n const headerSubtitle = header?.subtitle;\n\n const actionColumn = columnsWithPrimary.find((column) => {\n return column.mobileRole === 'action' || column.id === 'actions';\n });\n const listMode =\n listConfig.ui?.displayMode ?? listConfig.responsive?.mode ?? 'auto';\n const listDensity =\n listConfig.ui?.density ?? listConfig.responsive?.density ?? 'compact';\n\n const tableInnerNode = shouldVirtualizeTable ? (\n <VirtualizedConnectionTable\n columns={columnsWithPrimary}\n rows={rows}\n getRowId={getRowId}\n emptyState={resolvedEmptyState}\n className={denseTableClass}\n gridTemplateColumns={gridTemplateColumns}\n virtualization={runtimeConfig.virtualization}\n infiniteScroll={{\n enabled: runtimeConfig.infiniteScroll.enabled,\n thresholdPx: runtimeConfig.infiniteScroll.thresholdPx,\n autoLoad: runtimeConfig.infiniteScroll.autoLoad,\n }}\n hasNextPage={hasNextPage}\n isLoadingMore={isLoadingMore}\n onLoadMore={onLoadMore}\n bodyScrollMode={BACKOFFICE_LIST_BODY_SCROLL_MODE}\n />\n ) : (\n <ResponsiveRecordList\n columns={columnsWithPrimary}\n rows={rows}\n getRowId={getRowId}\n emptyState={resolvedEmptyState}\n className={denseTableClass}\n gridTemplateColumns={gridTemplateColumns}\n mode={listMode}\n density={listDensity}\n bodyScrollMode={BACKOFFICE_LIST_BODY_SCROLL_MODE}\n bodyFooterNode={\n runtimeConfig.infiniteScroll.enabled ? (\n <div ref={sentinelRef} aria-hidden=\"true\" />\n ) : null\n }\n renderAction={(row) => {\n return actionColumn?.cell(row) ?? null;\n }}\n />\n );\n\n const tableNodeWithErrorBoundary = (\n <BackofficeErrorBoundary\n fallback={(args: { error: unknown; reset: () => void }) => {\n const { reset } = args;\n\n const retry = (): void => {\n reset();\n if (onRefresh != null) {\n onRefresh();\n }\n };\n\n return (\n <InlineBanner\n tone=\"danger\"\n title={t('list.errors.title')}\n actions={\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n onClick={retry}\n >\n {t('list.actions.retry')}\n </Button>\n }\n >\n {t('list.errors.tableFailed')}\n </InlineBanner>\n );\n }}\n >\n {tableInnerNode}\n </BackofficeErrorBoundary>\n );\n\n const filtersBarNode = showFilters ? (\n <>\n <BackofficeToolbar\n search={searchNode}\n primaryFilters={quickFiltersNode}\n filterDrawerTrigger={allFiltersNode}\n sort={sortNode}\n utilityActions={\n onRefresh == null ? null : (\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n isLoading={isRefreshing}\n loadingLabel={t('list.actions.refreshing')}\n onClick={() => {\n onRefresh();\n }}\n >\n {t('list.actions.refresh')}\n </Button>\n )\n }\n chips={chipsNode}\n density=\"compact\"\n />\n {filterDrawerNode}\n </>\n ) : null;\n\n const tableNode = (\n <div\n className={styles.tableHost}\n aria-busy={isRefreshing ? 'true' : undefined}\n >\n {isRefreshing && !isLoadingInitial ? (\n <div className={styles.refreshingIndicator} role=\"status\">\n <Spinner size={14} ariaLabel={t('list.refreshingRows')} />\n <span>{t('list.refreshingRows')}</span>\n </div>\n ) : null}\n {tableNodeWithErrorBoundary}\n <EntityIdPickerDialog\n isOpen={pickerDialog != null}\n entity={pickerDialog?.entity ?? config.id}\n title={pickerDialog?.label ?? t('picker.title')}\n scope={pickerDialog?.scope}\n onClose={() => {\n setPickerDialog(null);\n }}\n onSelectId={(id) => {\n if (pickerDialog == null) {\n return;\n }\n if (pickerDialog.mode === 'list') {\n const currentIds = pickerDialog.currentIds ?? [];\n const nextIds = currentIds.includes(id)\n ? currentIds\n : [...currentIds, id];\n const nextWhere = setWhereValue(\n state.where,\n pickerDialog.whereKey,\n nextIds,\n pickerDialog.path,\n );\n setIsFilterDrawerOpen(true);\n pushState({ ...state, where: nextWhere });\n return;\n }\n const nextWhere = setWhereValue(\n state.where,\n pickerDialog.whereKey,\n id,\n pickerDialog.path,\n );\n setIsFilterDrawerOpen(true);\n pushState({ ...state, where: nextWhere });\n }}\n />\n </div>\n );\n\n const shouldRenderTableFooter =\n rows.length > 0 || isLoadingMore || hasNextPage;\n\n const tableFooterNode = shouldRenderTableFooter ? (\n <>\n <BackofficeListFooter\n mode=\"status\"\n loadedCount={rows.length}\n totalCount={totalCount}\n hasNextPage={hasNextPage}\n isLoading={isLoadingMore}\n pageInfoState={\n hasInconsistentPageInfo\n ? 'inconsistent'\n : isLoadingMore\n ? 'loading'\n : hasNextPage\n ? 'ready'\n : 'complete'\n }\n labels={{\n loaded: tableFooterMeta,\n loading: t('list.loadMore.loading'),\n end: t('list.loadMore.end'),\n }}\n />\n </>\n ) : null;\n\n if (variant === 'embedded') {\n return (\n <BackofficeListFilterProvider\n config={config}\n state={state}\n pushState={pushState}\n >\n <div className={styles.embeddedContainer}>\n <div className={styles.embeddedHeader}>{headerTitle}</div>\n {filtersBarNode}\n {statusBanner}\n {tableNode}\n {tableFooterNode}\n </div>\n </BackofficeListFilterProvider>\n );\n }\n\n return (\n <BackofficeListFilterProvider\n config={config}\n state={state}\n pushState={pushState}\n >\n <ListPageTemplate\n headerNode={\n <BackofficePageHeader\n title={headerTitle}\n subtitle={headerSubtitle}\n actions={headerActions}\n />\n }\n toolbarNode={filtersBarNode}\n statusNode={statusBanner}\n tableNode={tableNode}\n tableFooterNode={tableFooterNode}\n presentation=\"flat\"\n bodyScrollMode={BACKOFFICE_LIST_BODY_SCROLL_MODE}\n />\n </BackofficeListFilterProvider>\n );\n};\n\nexport default BackofficeEntityListScaffold;\n"],"mappings":"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"}
1
+ {"version":3,"file":"BackofficeEntityListScaffold.js","names":[],"sources":["../../../../../src/components/backoffice/scaffolds/BackofficeEntityListScaffold.tsx"],"sourcesContent":["/* eslint-disable no-ternary */\nimport {\n type JSX,\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport type { TFunction } from 'i18next';\nimport { useTranslation } from 'react-i18next';\nimport { Button } from '@plumile/ui/atomic/atoms/button/Button.js';\nimport { BackofficeEmptyState } from '@plumile/ui/backoffice/molecules/backoffice_empty_state/BackofficeEmptyState.js';\nimport { BackofficeFilterDrawer } from '@plumile/ui/backoffice/molecules/backoffice_filter_drawer/BackofficeFilterDrawer.js';\nimport { BackofficeFilterField } from '@plumile/ui/backoffice/molecules/backoffice_filter_field/BackofficeFilterField.js';\nimport { Spinner } from '@plumile/ui/backoffice/atoms/spinner/Spinner.js';\nimport { Tag } from '@plumile/ui/backoffice/atoms/tag/Tag.js';\nimport { BackofficeListFooter } from '@plumile/ui/backoffice/molecules/backoffice_list_footer/BackofficeListFooter.js';\nimport { BackofficePageHeader } from '@plumile/ui/backoffice/molecules/backoffice_page_header/BackofficePageHeader.js';\nimport { BackofficeToolbar } from '@plumile/ui/backoffice/molecules/backoffice_toolbar/BackofficeToolbar.js';\nimport { BackofficeTableSkeleton } from '@plumile/ui/backoffice/molecules/backoffice_table_skeleton/BackofficeTableSkeleton.js';\nimport {\n FilterChipRow,\n type FilterChip,\n} from '@plumile/ui/backoffice/molecules/filter_chip_row/FilterChipRow.js';\nimport { InlineBanner } from '@plumile/ui/components/feedback/InlineBanner.js';\nimport { ListPageTemplate } from '@plumile/ui/backoffice/templates/list_page_template/ListPageTemplate.js';\nimport {\n type DataTableColumn,\n type GetRowId,\n} from '@plumile/ui/components/data-table/DataTable.js';\nimport { ResponsiveRecordList } from '@plumile/ui/components/data-table/ResponsiveRecordList.js';\nimport { VirtualizedConnectionTable } from '@plumile/ui/components/data-table/VirtualizedConnectionTable.js';\nimport { SimpleSelect } from '@plumile/ui/components/select/SimpleSelect.js';\nimport { denseTableClass } from '@plumile/ui/shared/backofficeTableDensity.css.js';\n\nimport {\n readWhereValue,\n setWhereValue,\n} from '@plumile/backoffice-core/filters/where.js';\nimport { resolveBackofficeListRuntimeConfig } from '@plumile/backoffice-core/config/listRuntime.js';\nimport type {\n BackofficeFilterSpec,\n BackofficeListState,\n BackofficePickerScope,\n BackofficeRuntimeResolvedListFacetConfig,\n I18nLabel,\n} from '@plumile/backoffice-core/types.js';\n\nimport { BackofficeErrorBoundary } from '../errors/BackofficeErrorBoundary.js';\nimport {\n EntityFilterValue,\n EntityFilterValueText,\n} from '../filters/EntityFilterValue.js';\nimport { EntityIdPickerDialog } from '../pickers/EntityIdPickerDialog.js';\nimport { EntityIdFilterField } from '../filters/EntityIdFilterField.js';\nimport { DeferredFilterSearchInput } from '../filters/DeferredFilterSearchInput.js';\nimport { BackofficeListFilterProvider } from './BackofficeListFilterContext.js';\nimport { BACKOFFICE_LIST_BODY_SCROLL_MODE } from './backofficeListScrollMode.js';\nimport { useBackofficeReactTranslation } from '../../../i18n/useBackofficeReactTranslation.js';\nimport { useBackofficeInfiniteScrollSentinel } from '../../../hooks/useBackofficeInfiniteScrollSentinel.js';\nimport type { BackofficeFilterDrawerState } from '../../../provider/BackofficeListUiStateContext.js';\nimport { isDevEnv } from '../../../relay/envHelpers.js';\n\nimport * as styles from './backofficeEntityListScaffold.css.js';\n\nconst resolveLabel = (label: I18nLabel, tApp: TFunction): string => {\n return label(tApp);\n};\n\nconst getFilterValue = <Where extends Record<string, unknown>>(\n filter: BackofficeFilterSpec<Where>,\n where: Where | null,\n): unknown => {\n if (filter.fromGraphQL != null && where != null) {\n return filter.fromGraphQL(where);\n }\n\n const key = (filter.whereKey ?? filter.id) as keyof Where;\n return readWhereValue(where, key, filter.path);\n};\n\nconst normalizeStringArray = (value: unknown): readonly string[] => {\n if (!Array.isArray(value)) {\n return [];\n }\n return value\n .map((entry) => {\n if (entry == null) {\n return null;\n }\n const normalized = String(entry).trim();\n if (normalized === '') {\n return null;\n }\n return normalized;\n })\n .filter((entry): entry is string => {\n return entry != null;\n });\n};\n\nconst getFilterDisplayValue = <Where extends Record<string, unknown>>(\n filter: BackofficeFilterSpec<Where>,\n raw: unknown,\n options: {\n enumLabel: (value: string) => string;\n booleanLabel: (value: boolean) => string;\n fallbackBooleanLabels: { yes: string; no: string };\n },\n): ReactNode | null => {\n if (raw == null) {\n return null;\n }\n\n if (Array.isArray(raw)) {\n const normalized = normalizeStringArray(raw);\n\n if (normalized.length === 0) {\n return null;\n }\n\n if (filter.kind === 'entityIdList') {\n return (\n <>\n {normalized.map((id, index) => {\n return (\n <span key={id}>\n <EntityFilterValue entityId={filter.entity} id={id} />\n {index < normalized.length - 1 ? ', ' : null}\n </span>\n );\n })}\n </>\n );\n }\n\n return normalized.join(', ');\n }\n\n if (typeof raw === 'boolean') {\n if (filter.kind === 'boolean') {\n return options.booleanLabel(raw);\n }\n if (raw) {\n return options.fallbackBooleanLabels.yes;\n }\n return options.fallbackBooleanLabels.no;\n }\n\n if (typeof raw !== 'string' && typeof raw !== 'number') {\n return null;\n }\n\n const rawString = String(raw).trim();\n if (rawString === '') {\n return null;\n }\n\n if (filter.kind === 'entityId') {\n return <EntityFilterValue entityId={filter.entity} id={rawString} />;\n }\n\n if (filter.kind === 'enum') {\n return options.enumLabel(rawString);\n }\n\n return rawString;\n};\n\nconst toDatetimeInputValue = (value: string): string => {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) {\n return value;\n }\n const offsetMs = date.getTimezoneOffset() * 60_000;\n return new Date(date.getTime() - offsetMs).toISOString().slice(0, 16);\n};\n\nconst fromDatetimeInputValue = (value: string): string => {\n const normalized = value.trim();\n if (normalized === '') {\n return '';\n }\n const date = new Date(normalized);\n if (Number.isNaN(date.getTime())) {\n return normalized;\n }\n return date.toISOString();\n};\n\ntype RuntimeWhere = Record<string, unknown>;\ntype RuntimeSort = string;\n\ntype Props<RowView> = {\n config: BackofficeRuntimeResolvedListFacetConfig;\n state: BackofficeListState<RuntimeWhere, RuntimeSort>;\n pushState: (next: BackofficeListState<RuntimeWhere, RuntimeSort>) => void;\n header?: {\n title?: string;\n subtitle?: string;\n };\n headerActions?: ReactNode;\n rows: readonly RowView[];\n getRowId: GetRowId<RowView>;\n columns: readonly DataTableColumn<RowView>[];\n gridTemplateColumns?: string;\n hasNextPage: boolean;\n isLoadingMore: boolean;\n isRefreshing?: boolean;\n onLoadMore: () => void;\n onRefresh?: () => void;\n totalCount?: number | null;\n loadedCountLabel?: ReactNode;\n emptyState?: JSX.Element;\n statusBanner?: ReactNode;\n isLoadingInitial?: boolean;\n virtualize?: boolean;\n variant?: 'page' | 'embedded';\n showFilters?: boolean;\n filterDrawerState?: BackofficeFilterDrawerState;\n};\n\nexport const BackofficeEntityListScaffold = <RowView,>(\n props: Props<RowView>,\n): JSX.Element | null => {\n const { t: tApp } = useTranslation();\n const { t } = useBackofficeReactTranslation();\n const {\n config,\n state,\n pushState,\n rows,\n getRowId,\n columns,\n gridTemplateColumns,\n hasNextPage,\n isLoadingMore,\n isRefreshing = false,\n onLoadMore,\n onRefresh,\n totalCount,\n loadedCountLabel,\n emptyState,\n statusBanner,\n header,\n headerActions,\n isLoadingInitial = false,\n variant = 'page',\n showFilters = true,\n } = props;\n const listConfig = config.list;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const listDefaults = config.listDefaults ??\n listConfig.defaultState ?? { where: null, sort: null };\n\n const columnsWithPrimary = useMemo(() => {\n const hasPrimary = columns.some((col) => {\n return col.isPrimary === true;\n });\n if (hasPrimary || columns.length === 0) {\n return columns;\n }\n return columns.map((col, index) => {\n const { header } = col;\n if (index === 0) {\n return { ...col, isPrimary: true, header };\n }\n return { ...col, header };\n });\n }, [columns]);\n\n const chips = useMemo<readonly FilterChip[]>(() => {\n const out: FilterChip[] = [];\n for (const filter of listConfig.filters) {\n const raw = getFilterValue(filter, state.where);\n const displayValue = getFilterDisplayValue(filter, raw, {\n enumLabel: (value) => {\n if (filter.kind !== 'enum') {\n return value;\n }\n const match = filter.options.find((option) => {\n return option.value === value;\n });\n if (match != null) {\n return resolveLabel(match.label, tApp);\n }\n return value;\n },\n booleanLabel: (value) => {\n if (filter.kind === 'boolean') {\n if (value && filter.trueLabel != null) {\n return resolveLabel(filter.trueLabel, tApp);\n }\n if (!value && filter.falseLabel != null) {\n return resolveLabel(filter.falseLabel, tApp);\n }\n }\n if (value) {\n return t('filters.boolean.yes');\n }\n return t('filters.boolean.no');\n },\n fallbackBooleanLabels: {\n yes: t('filters.boolean.yes'),\n no: t('filters.boolean.no'),\n },\n });\n\n if (displayValue != null) {\n let idValue = String(raw);\n if (Array.isArray(raw)) {\n idValue = raw.join(',');\n }\n const label = (\n <span>\n {resolveLabel(filter.label, tApp)}: {displayValue}\n </span>\n );\n out.push({\n id: `${filter.id}:${idValue}`,\n label,\n onRemove: () => {\n const key = filter.whereKey ?? filter.id;\n const nextWhere = setWhereValue(\n state.where,\n key,\n null,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n },\n });\n }\n }\n return out;\n }, [listConfig.filters, pushState, state, t, tApp]);\n\n const handleClearAll = useCallback(() => {\n pushState({\n ...listDefaults,\n });\n }, [listDefaults, pushState]);\n const [localIsFilterDrawerOpen, setLocalIsFilterDrawerOpen] = useState(false);\n const [localFilterSearch, setLocalFilterSearch] = useState('');\n const drawerState = props.filterDrawerState ?? {\n isOpen: localIsFilterDrawerOpen,\n search: localFilterSearch,\n setOpen: setLocalIsFilterDrawerOpen,\n setSearch: setLocalFilterSearch,\n reset: () => {\n setLocalIsFilterDrawerOpen(false);\n setLocalFilterSearch('');\n },\n };\n const isFilterDrawerOpen = drawerState.isOpen;\n const filterSearch = drawerState.search;\n const setIsFilterDrawerOpen = drawerState.setOpen;\n const setFilterSearch = drawerState.setSearch;\n const resetFilterDrawer = drawerState.reset;\n\n const [pickerDialog, setPickerDialog] = useState<{\n entity: string;\n whereKey: keyof RuntimeWhere;\n label: string;\n mode: 'single' | 'list';\n currentIds?: readonly string[];\n path?: readonly string[];\n scope?: BackofficePickerScope<Record<string, unknown>>;\n } | null>(null);\n\n const renderFilterControl = useCallback(\n (filter: BackofficeFilterSpec<RuntimeWhere>): JSX.Element => {\n const key = filter.whereKey ?? filter.id;\n const candidate = getFilterValue(filter, state.where);\n let value = '';\n if (typeof candidate === 'string') {\n value = candidate;\n }\n if (typeof candidate === 'number' && Number.isFinite(candidate)) {\n value = String(candidate);\n }\n\n const filterLabelText = resolveLabel(filter.label, tApp);\n\n if (filter.kind === 'text') {\n const placeholderLabelText =\n filter.placeholderLabel != null\n ? resolveLabel(filter.placeholderLabel, tApp)\n : filterLabelText;\n let placeholder = t('filters.placeholders.search', {\n label: placeholderLabelText,\n });\n if (filter.placeholderText != null) {\n placeholder = resolveLabel(filter.placeholderText, tApp);\n }\n return (\n <DeferredFilterSearchInput\n value={value}\n onApply={(next) => {\n const nextWhere = setWhereValue(\n state.where,\n key,\n next,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n placeholder={placeholder}\n ariaLabel={placeholder}\n className={styles.filterInput}\n />\n );\n }\n\n if (filter.kind === 'datetime') {\n const placeholderLabelText =\n filter.placeholderLabel != null\n ? resolveLabel(filter.placeholderLabel, tApp)\n : filterLabelText;\n let placeholder = t('filters.placeholders.search', {\n label: placeholderLabelText,\n });\n if (filter.placeholderText != null) {\n placeholder = resolveLabel(filter.placeholderText, tApp);\n }\n return (\n <DeferredFilterSearchInput\n value={toDatetimeInputValue(value)}\n onApply={(next) => {\n const normalized = fromDatetimeInputValue(next);\n const nextWhere = setWhereValue(\n state.where,\n key,\n normalized,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n placeholder={placeholder}\n ariaLabel={placeholder}\n className={styles.filterInput}\n type=\"datetime-local\"\n />\n );\n }\n\n if (filter.kind === 'number') {\n const placeholderLabelText =\n filter.placeholderLabel != null\n ? resolveLabel(filter.placeholderLabel, tApp)\n : filterLabelText;\n let placeholder = t('filters.placeholders.search', {\n label: placeholderLabelText,\n });\n if (filter.placeholderText != null) {\n placeholder = resolveLabel(filter.placeholderText, tApp);\n }\n return (\n <DeferredFilterSearchInput\n value={value}\n onApply={(next) => {\n const normalized = next.trim();\n const parsed = normalized === '' ? null : Number(normalized);\n const nextWhere = setWhereValue(\n state.where,\n key,\n Number.isFinite(parsed) ? parsed : null,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n placeholder={placeholder}\n ariaLabel={placeholder}\n className={styles.filterInput}\n inputMode={filter.inputMode ?? 'numeric'}\n type=\"text\"\n />\n );\n }\n\n if (filter.kind === 'enum') {\n const options = [\n {\n id: 'any',\n value: '',\n label: t('filters.all', {\n label: filterLabelText,\n }),\n },\n ...filter.options.map((option) => {\n return {\n id: option.value,\n value: option.value,\n label: resolveLabel(option.label, tApp),\n };\n }),\n ];\n\n return (\n <SimpleSelect\n options={options}\n value={value}\n size=\"small\"\n ariaLabel={filterLabelText}\n onChange={(next) => {\n const nextWhere = setWhereValue(\n state.where,\n key,\n next,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n />\n );\n }\n\n if (filter.kind === 'boolean') {\n let current: boolean | null = null;\n if (typeof candidate === 'boolean') {\n current = candidate;\n }\n\n let selectValue = '';\n if (current === true) {\n selectValue = 'true';\n }\n if (current === false) {\n selectValue = 'false';\n }\n\n const trueLabel =\n filter.trueLabel != null\n ? resolveLabel(filter.trueLabel, tApp)\n : t('filters.boolean.yes');\n const falseLabel =\n filter.falseLabel != null\n ? resolveLabel(filter.falseLabel, tApp)\n : t('filters.boolean.no');\n const options = [\n {\n id: 'any',\n value: '',\n label: t('filters.all', {\n label: filterLabelText,\n }),\n },\n {\n id: 'true',\n value: 'true',\n label: trueLabel,\n },\n {\n id: 'false',\n value: 'false',\n label: falseLabel,\n },\n ];\n\n return (\n <SimpleSelect\n options={options}\n value={selectValue}\n size=\"small\"\n ariaLabel={filterLabelText}\n onChange={(next) => {\n let parsed: boolean | null = null;\n if (next === 'true') {\n parsed = true;\n }\n if (next === 'false') {\n parsed = false;\n }\n const nextWhere = setWhereValue(\n state.where,\n key,\n parsed,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n />\n );\n }\n\n const pickerScope = (() => {\n if (filter.pickerScope == null) {\n return undefined;\n }\n if (typeof filter.pickerScope === 'function') {\n return filter.pickerScope(state.where);\n }\n return filter.pickerScope;\n })();\n\n if (filter.kind === 'entityIdList') {\n const currentIds = normalizeStringArray(candidate);\n const selectedCount = currentIds.length;\n const displayValue =\n selectedCount === 0\n ? null\n : t('filters.selectedEntities', {\n count: selectedCount,\n });\n\n const removeId = (id: string): void => {\n const nextIds = currentIds.filter((currentId) => {\n return currentId !== id;\n });\n const nextWhere = setWhereValue(\n state.where,\n key,\n nextIds.length === 0 ? null : nextIds,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n };\n\n return (\n <div className={styles.entityIdListFilter}>\n <EntityIdFilterField\n label={filterLabelText}\n value={selectedCount === 0 ? null : currentIds.join(',')}\n displayValue={displayValue}\n placeholder={t('filters.placeholders.anyEntity', {\n label: filterLabelText,\n })}\n onPick={() => {\n setPickerDialog({\n entity: filter.entity,\n whereKey: key,\n label: filterLabelText,\n mode: 'list',\n currentIds,\n path: filter.path,\n scope: pickerScope,\n });\n }}\n onClear={() => {\n const nextWhere = setWhereValue(\n state.where,\n key,\n null,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n />\n {currentIds.length > 0 ? (\n <div className={styles.entityIdListTags}>\n {currentIds.map((id) => {\n return (\n <Tag\n key={id}\n removeLabel={t('filters.actions.removeFilterValue', {\n label: filterLabelText,\n })}\n onRemove={() => {\n removeId(id);\n }}\n >\n <EntityFilterValue entityId={filter.entity} id={id} />\n </Tag>\n );\n })}\n </div>\n ) : null}\n </div>\n );\n }\n\n if (filter.kind === 'stringList') {\n const placeholderLabelText =\n filter.placeholderLabel != null\n ? resolveLabel(filter.placeholderLabel, tApp)\n : filterLabelText;\n let placeholder = t('filters.placeholders.search', {\n label: placeholderLabelText,\n });\n if (filter.placeholderText != null) {\n placeholder = resolveLabel(filter.placeholderText, tApp);\n }\n return (\n <DeferredFilterSearchInput\n value={value}\n onApply={(next) => {\n const values = next\n .split(/[\\n,]+/u)\n .map((entry) => {\n return entry.trim();\n })\n .filter((entry) => {\n return entry !== '';\n });\n const nextWhere = setWhereValue(\n state.where,\n key,\n values,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n placeholder={placeholder}\n ariaLabel={placeholder}\n className={styles.filterInput}\n />\n );\n }\n\n let currentId: string | null = null;\n if (typeof candidate === 'string') {\n currentId = candidate;\n }\n\n const renderField = (\n displayValue: string | null = null,\n isResolving = false,\n ) => {\n const normalizedDisplayValue = displayValue?.trim() ?? '';\n return (\n <EntityIdFilterField\n label={filterLabelText}\n value={currentId}\n displayValue={normalizedDisplayValue}\n isResolving={isResolving}\n placeholder={t('filters.placeholders.anyEntity', {\n label: filterLabelText,\n })}\n onPick={() => {\n setPickerDialog({\n entity: filter.entity,\n whereKey: key,\n label: filterLabelText,\n mode: 'single',\n path: filter.path,\n scope: pickerScope,\n });\n }}\n onClear={() => {\n const nextWhere = setWhereValue(\n state.where,\n key,\n null,\n filter.path,\n );\n pushState({ ...state, where: nextWhere });\n }}\n />\n );\n };\n\n if (currentId == null || currentId.trim() === '') {\n return renderField();\n }\n\n return (\n <EntityFilterValueText entityId={filter.entity} id={currentId}>\n {(label, valueState) => {\n const isResolving = valueState?.status === 'loading';\n return renderField(\n isResolving ? t('common.loading') : label,\n isResolving,\n );\n }}\n </EntityFilterValueText>\n );\n },\n [pushState, state, t, tApp],\n );\n\n const hasPlacementConfig = useMemo(() => {\n return listConfig.filters.some((filter) => {\n return filter.placement != null;\n });\n }, [listConfig.filters]);\n\n const quickFilters = useMemo(() => {\n if (listConfig.filters.length === 0) {\n return [];\n }\n const maxPromotedFilters = listConfig.ui?.toolbar?.maxPromotedFilters ?? 3;\n if (hasPlacementConfig) {\n return listConfig.filters.filter((filter) => {\n return filter.placement === 'quick' || filter.placement === 'both';\n });\n }\n return listConfig.filters.slice(0, maxPromotedFilters);\n }, [listConfig.filters, listConfig.ui?.toolbar, hasPlacementConfig]);\n\n const drawerFilters = useMemo(() => {\n return listConfig.filters.filter((filter) => {\n if (filter.placement == null) {\n return true;\n }\n return filter.placement === 'drawer' || filter.placement === 'both';\n });\n }, [listConfig.filters]);\n\n const searchFilter = useMemo(() => {\n return quickFilters.find((filter) => {\n return filter.kind === 'text';\n });\n }, [quickFilters]);\n\n const quickFiltersNode = useMemo(() => {\n const visibleQuickFilters = quickFilters.filter((filter) => {\n return filter !== searchFilter;\n });\n\n if (visibleQuickFilters.length === 0) {\n return null;\n }\n\n return (\n <div className={styles.controlsRow}>\n {visibleQuickFilters.map((filter) => {\n return <span key={filter.id}>{renderFilterControl(filter)}</span>;\n })}\n </div>\n );\n }, [quickFilters, renderFilterControl, searchFilter]);\n\n const searchNode = useMemo(() => {\n if (searchFilter == null) {\n return null;\n }\n return renderFilterControl(searchFilter);\n }, [renderFilterControl, searchFilter]);\n\n const sortNode = useMemo(() => {\n if (listConfig.sorts.length === 0) {\n return null;\n }\n const firstSort = listConfig.sorts[0];\n if (firstSort == null) {\n return null;\n }\n const options = listConfig.sorts.map((s) => {\n return { id: s.id, value: s.id, label: resolveLabel(s.label, tApp) };\n });\n return (\n <SimpleSelect\n options={options}\n value={state.sort ?? firstSort.id}\n size=\"small\"\n ariaLabel={t('list.sort.label')}\n onChange={(next) => {\n pushState({\n ...state,\n sort: next,\n });\n }}\n />\n );\n }, [listConfig.sorts, pushState, state, t, tApp]);\n\n const chipsNode = useMemo(() => {\n if (chips.length === 0) {\n return null;\n }\n return <FilterChipRow chips={chips} onClearAll={handleClearAll} />;\n }, [chips, handleClearAll]);\n\n const drawerSections = useMemo(() => {\n if (drawerFilters.length === 0) {\n return [];\n }\n\n const normalizedQuery = filterSearch.trim().toLowerCase();\n const items: { id: string; node: JSX.Element }[] = [];\n\n for (const filter of drawerFilters) {\n const resolvedLabel = resolveLabel(filter.label, tApp);\n const matchesQuery =\n normalizedQuery === '' ||\n resolvedLabel.toLowerCase().includes(normalizedQuery);\n\n if (matchesQuery) {\n items.push({\n id: filter.id,\n node: (\n <BackofficeFilterField label={resolvedLabel}>\n {renderFilterControl(filter)}\n </BackofficeFilterField>\n ),\n });\n }\n }\n\n if (items.length === 0) {\n return [];\n }\n\n return [\n {\n id: 'backoffice.filters.sections.default',\n title: t('filters.sections.default'),\n items,\n },\n ];\n }, [drawerFilters, filterSearch, renderFilterControl, t, tApp]);\n\n const allFiltersNode = useMemo(() => {\n if (drawerFilters.length === 0) {\n return null;\n }\n const activeCount = chips.length;\n let label = t('filters.trigger');\n if (activeCount > 0) {\n label = t('filters.triggerWithCount', {\n count: activeCount,\n });\n }\n return (\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n onClick={() => {\n setIsFilterDrawerOpen(true);\n }}\n >\n {label}\n </Button>\n );\n }, [chips.length, drawerFilters.length, setIsFilterDrawerOpen, t]);\n\n const filterDrawerEmptyLabel =\n filterSearch.trim() === ''\n ? undefined\n : t('filters.drawer.emptySearchResults');\n\n const filterDrawerNode = (\n <BackofficeFilterDrawer\n isOpen={isFilterDrawerOpen}\n onClose={() => {\n resetFilterDrawer();\n }}\n sections={drawerSections}\n searchValue={filterSearch}\n onSearchChange={(next) => {\n setFilterSearch(next);\n }}\n onReset={handleClearAll}\n emptyLabel={filterDrawerEmptyLabel}\n />\n );\n\n const resolvedEmptyState = useMemo((): JSX.Element => {\n if (emptyState != null) {\n return emptyState;\n }\n\n if (isLoadingInitial) {\n return (\n <BackofficeTableSkeleton\n variant=\"embedded\"\n ariaLabel={t('common.loading')}\n />\n );\n }\n\n if (chips.length > 0) {\n return (\n <BackofficeEmptyState\n title={t('emptyState.listEmpty.title')}\n description={t('emptyState.listEmptyFiltered.description')}\n actions={\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n onClick={handleClearAll}\n >\n {t('emptyState.listEmptyFiltered.actions.reset')}\n </Button>\n }\n />\n );\n }\n\n return (\n <BackofficeEmptyState\n title={t('emptyState.listEmpty.title')}\n description={t('emptyState.listEmpty.description')}\n />\n );\n }, [chips.length, emptyState, handleClearAll, isLoadingInitial, t]);\n\n const tableFooterMeta = useMemo((): ReactNode => {\n if (loadedCountLabel != null) {\n return loadedCountLabel;\n }\n if (typeof totalCount !== 'number') {\n if (rows.length === 0) {\n return null;\n }\n return (\n <span>\n {t('list.loaded', {\n count: rows.length,\n })}\n </span>\n );\n }\n return (\n <span>\n {t('list.showing', {\n shown: rows.length,\n total: totalCount,\n })}\n </span>\n );\n }, [loadedCountLabel, rows.length, t, totalCount]);\n\n const runtimeConfig = useMemo(() => {\n const resolvedDisplayMode =\n listConfig.ui?.displayMode ?? listConfig.responsive?.mode ?? 'auto';\n return resolveBackofficeListRuntimeConfig({\n kind: listConfig.kind,\n displayMode: resolvedDisplayMode,\n ui: listConfig.ui,\n });\n }, [listConfig.kind, listConfig.responsive?.mode, listConfig.ui]);\n\n const hasKnownRemainingRows =\n typeof totalCount === 'number' && rows.length < totalCount;\n const hasInconsistentPageInfo = hasKnownRemainingRows && !hasNextPage;\n\n useEffect(() => {\n if (\n !hasInconsistentPageInfo ||\n !runtimeConfig.infiniteScroll.showInconsistentPageInfo ||\n !isDevEnv()\n ) {\n return;\n }\n // eslint-disable-next-line no-console\n console.warn(\n 'Backoffice list received inconsistent pageInfo: loaded rows are lower than totalCount but hasNextPage is false.',\n {\n entityId: config.id,\n loadedCount: rows.length,\n totalCount,\n },\n );\n }, [\n config.id,\n hasInconsistentPageInfo,\n rows.length,\n runtimeConfig.infiniteScroll.showInconsistentPageInfo,\n totalCount,\n ]);\n\n const shouldVirtualizeTable =\n props.virtualize === true || runtimeConfig.virtualization.enabled;\n\n const { sentinelRef } = useBackofficeInfiniteScrollSentinel({\n enabled: !shouldVirtualizeTable && runtimeConfig.infiniteScroll.enabled,\n hasNextPage,\n isLoading: isLoadingMore,\n onIntersect: onLoadMore,\n rootMargin: runtimeConfig.infiniteScroll.rootMargin,\n threshold: runtimeConfig.infiniteScroll.threshold,\n });\n\n const headerTitle = header?.title ?? resolveLabel(listConfig.title, tApp);\n const headerSubtitle = header?.subtitle;\n\n const actionColumn = columnsWithPrimary.find((column) => {\n return column.mobileRole === 'action' || column.id === 'actions';\n });\n const listMode =\n listConfig.ui?.displayMode ?? listConfig.responsive?.mode ?? 'auto';\n const listDensity =\n listConfig.ui?.density ?? listConfig.responsive?.density ?? 'compact';\n\n const tableInnerNode = shouldVirtualizeTable ? (\n <VirtualizedConnectionTable\n columns={columnsWithPrimary}\n rows={rows}\n getRowId={getRowId}\n emptyState={resolvedEmptyState}\n className={denseTableClass}\n gridTemplateColumns={gridTemplateColumns}\n virtualization={runtimeConfig.virtualization}\n infiniteScroll={{\n enabled: runtimeConfig.infiniteScroll.enabled,\n thresholdPx: runtimeConfig.infiniteScroll.thresholdPx,\n autoLoad: runtimeConfig.infiniteScroll.autoLoad,\n }}\n hasNextPage={hasNextPage}\n isLoadingMore={isLoadingMore}\n onLoadMore={onLoadMore}\n bodyScrollMode={BACKOFFICE_LIST_BODY_SCROLL_MODE}\n />\n ) : (\n <ResponsiveRecordList\n columns={columnsWithPrimary}\n rows={rows}\n getRowId={getRowId}\n emptyState={resolvedEmptyState}\n className={denseTableClass}\n gridTemplateColumns={gridTemplateColumns}\n mode={listMode}\n density={listDensity}\n bodyScrollMode={BACKOFFICE_LIST_BODY_SCROLL_MODE}\n bodyFooterNode={\n runtimeConfig.infiniteScroll.enabled ? (\n <div ref={sentinelRef} aria-hidden=\"true\" />\n ) : null\n }\n renderAction={(row) => {\n return actionColumn?.cell(row) ?? null;\n }}\n />\n );\n\n const tableNodeWithErrorBoundary = (\n <BackofficeErrorBoundary\n fallback={(args: { error: unknown; reset: () => void }) => {\n const { reset } = args;\n\n const retry = (): void => {\n reset();\n if (onRefresh != null) {\n onRefresh();\n }\n };\n\n return (\n <InlineBanner\n tone=\"danger\"\n title={t('list.errors.title')}\n actions={\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n onClick={retry}\n >\n {t('list.actions.retry')}\n </Button>\n }\n >\n {t('list.errors.tableFailed')}\n </InlineBanner>\n );\n }}\n >\n {tableInnerNode}\n </BackofficeErrorBoundary>\n );\n\n const filtersBarNode = showFilters ? (\n <>\n <BackofficeToolbar\n search={searchNode}\n primaryFilters={quickFiltersNode}\n filterDrawerTrigger={allFiltersNode}\n sort={sortNode}\n utilityActions={\n onRefresh == null ? null : (\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n isLoading={isRefreshing}\n loadingLabel={t('list.actions.refreshing')}\n onClick={() => {\n onRefresh();\n }}\n >\n {t('list.actions.refresh')}\n </Button>\n )\n }\n chips={chipsNode}\n density=\"compact\"\n />\n {filterDrawerNode}\n </>\n ) : null;\n\n const tableNode = (\n <div\n className={styles.tableHost}\n aria-busy={isRefreshing ? 'true' : undefined}\n >\n {isRefreshing && !isLoadingInitial ? (\n <div className={styles.refreshingIndicator} role=\"status\">\n <Spinner size={14} ariaLabel={t('list.refreshingRows')} />\n <span>{t('list.refreshingRows')}</span>\n </div>\n ) : null}\n {tableNodeWithErrorBoundary}\n <EntityIdPickerDialog\n isOpen={pickerDialog != null}\n entity={pickerDialog?.entity ?? config.id}\n title={pickerDialog?.label ?? t('picker.title')}\n scope={pickerDialog?.scope}\n onClose={() => {\n setPickerDialog(null);\n }}\n onSelectId={(id) => {\n if (pickerDialog == null) {\n return;\n }\n if (pickerDialog.mode === 'list') {\n const currentIds = pickerDialog.currentIds ?? [];\n const nextIds = currentIds.includes(id)\n ? currentIds\n : [...currentIds, id];\n const nextWhere = setWhereValue(\n state.where,\n pickerDialog.whereKey,\n nextIds,\n pickerDialog.path,\n );\n setIsFilterDrawerOpen(true);\n pushState({ ...state, where: nextWhere });\n return;\n }\n const nextWhere = setWhereValue(\n state.where,\n pickerDialog.whereKey,\n id,\n pickerDialog.path,\n );\n setIsFilterDrawerOpen(true);\n pushState({ ...state, where: nextWhere });\n }}\n />\n </div>\n );\n\n const shouldRenderTableFooter =\n rows.length > 0 || isLoadingMore || hasNextPage;\n\n const tableFooterNode = shouldRenderTableFooter ? (\n <>\n <BackofficeListFooter\n mode=\"status\"\n loadedCount={rows.length}\n totalCount={totalCount}\n hasNextPage={hasNextPage}\n isLoading={isLoadingMore}\n pageInfoState={\n hasInconsistentPageInfo\n ? 'inconsistent'\n : isLoadingMore\n ? 'loading'\n : hasNextPage\n ? 'ready'\n : 'complete'\n }\n labels={{\n loaded: tableFooterMeta,\n loading: t('list.loadMore.loading'),\n end: t('list.loadMore.end'),\n }}\n />\n </>\n ) : null;\n\n if (variant === 'embedded') {\n return (\n <BackofficeListFilterProvider\n config={config}\n state={state}\n pushState={pushState}\n >\n <div className={styles.embeddedContainer}>\n <div className={styles.embeddedHeader}>{headerTitle}</div>\n {filtersBarNode}\n {statusBanner}\n {tableNode}\n {tableFooterNode}\n </div>\n </BackofficeListFilterProvider>\n );\n }\n\n return (\n <BackofficeListFilterProvider\n config={config}\n state={state}\n pushState={pushState}\n >\n <ListPageTemplate\n headerNode={\n <BackofficePageHeader\n title={headerTitle}\n subtitle={headerSubtitle}\n actions={headerActions}\n />\n }\n toolbarNode={filtersBarNode}\n statusNode={statusBanner}\n tableNode={tableNode}\n tableFooterNode={tableFooterNode}\n presentation=\"flat\"\n bodyScrollMode={BACKOFFICE_LIST_BODY_SCROLL_MODE}\n />\n </BackofficeListFilterProvider>\n );\n};\n\nexport default BackofficeEntityListScaffold;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeTabbedDetailShell.js","names":[],"sources":["../../../../../src/components/backoffice/scaffolds/BackofficeTabbedDetailShell.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\n\nimport { Tabs, type TabItem } from '@plumile/ui/atomic/molecules/tabs/Tabs.js';\nimport { DetailPageTemplate } from '@plumile/ui/backoffice/templates/detail_page_template/DetailPageTemplate.js';\n\nimport * as styles from './backofficeTabbedDetailShell.css.js';\n\nexport type BackofficeTabbedDetailShellProps = {\n headerNode: ReactNode;\n tabs?: readonly TabItem[];\n activeId?: string;\n children: ReactNode;\n};\n\nexport const BackofficeTabbedDetailShell = ({\n headerNode,\n tabs,\n activeId,\n children,\n}: BackofficeTabbedDetailShellProps): JSX.Element => {\n let tabsNode: JSX.Element | null = null;\n if (tabs != null && tabs.length > 1 && activeId != null) {\n const hasRouteTabs = tabs.some((tab) => {\n return tab.to != null;\n });\n let handleChange: ((id: string) => void) | undefined;\n if (!hasRouteTabs) {\n handleChange = () => {};\n }\n tabsNode = (\n <Tabs\n items={tabs}\n activeId={activeId}\n onChange={handleChange}\n className={styles.tabs}\n />\n );\n }\n\n return (\n <DetailPageTemplate headerNode={headerNode} tabsNode={tabsNode}>\n <div className={styles.tabBody}>{children}</div>\n </DetailPageTemplate>\n );\n};\n\nexport default BackofficeTabbedDetailShell;\n"],"mappings":";;;;;AAcA,IAAa,KAA+B,EAC1C,eACA,MAAA,GACA,aACA,kBACmD;CACnD,IAAI,IAA+B;CACnC,IAAI,KAAQ,QAAQ,EAAK,SAAS,KAAK,KAAY,MAAM;EACvD,IAAM,IAAe,EAAK,MAAM,MACvB,EAAI,MAAM,IAClB,GACG;EAIJ,AAHK,MACH,UAAqB,CAAC,IAExB,IACE,kBAAC,GAAD;GACE,OAAO;GACG;GACV,UAAU;GACV,WAAW;EACZ,CAAA;CAEL;CAEA,OACE,kBAAC,GAAD;EAAgC;EAAsB;YACpD,kBAAC,OAAD;GAAK,WAAW;GAAiB;EAAc,CAAA;CAC7B,CAAA;AAExB"}
1
+ {"version":3,"file":"BackofficeTabbedDetailShell.js","names":[],"sources":["../../../../../src/components/backoffice/scaffolds/BackofficeTabbedDetailShell.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\n\nimport { Tabs, type TabItem } from '@plumile/ui/atomic/molecules/tabs/Tabs.js';\nimport { DetailPageTemplate } from '@plumile/ui/backoffice/templates/detail_page_template/DetailPageTemplate.js';\n\nimport * as styles from './backofficeTabbedDetailShell.css.js';\n\nexport type BackofficeTabbedDetailShellProps = {\n headerNode: ReactNode;\n tabs?: readonly TabItem[];\n activeId?: string;\n children: ReactNode;\n};\n\nexport const BackofficeTabbedDetailShell = ({\n headerNode,\n tabs,\n activeId,\n children,\n}: BackofficeTabbedDetailShellProps): JSX.Element => {\n let tabsNode: JSX.Element | null = null;\n if (tabs != null && tabs.length > 1 && activeId != null) {\n const hasRouteTabs = tabs.some((tab) => {\n return tab.to != null;\n });\n let handleChange: ((id: string) => void) | undefined;\n if (!hasRouteTabs) {\n handleChange = () => {};\n }\n tabsNode = (\n <Tabs\n items={tabs}\n activeId={activeId}\n onChange={handleChange}\n className={styles.tabs}\n />\n );\n }\n\n return (\n <DetailPageTemplate headerNode={headerNode} tabsNode={tabsNode}>\n <div className={styles.tabBody}>{children}</div>\n </DetailPageTemplate>\n );\n};\n\nexport default BackofficeTabbedDetailShell;\n"],"mappings":";;;;;AAcA,IAAa,KAA+B,EAC1C,eACA,MAAA,GACA,aACA,kBACmD;CACnD,IAAI,IAA+B;CACnC,IAAI,KAAQ,QAAQ,EAAK,SAAS,KAAK,KAAY,MAAM;EACvD,IAAM,IAAe,EAAK,MAAM,MACvB,EAAI,MAAM,IAClB,GACG;EAIJ,AAHK,MACH,UAAqB,CAAC,IAExB,IACE,kBAAC,GAAD;GACE,OAAO;GACG;GACV,UAAU;GACV,WAAW;EACZ,CAAA;CAEL;CAEA,OACE,kBAAC,GAAD;EAAgC;EAAsB;EACpD,UAAA,kBAAC,OAAD;GAAK,WAAW;GAAiB;EAAc,CAAA;CAC7B,CAAA;AAExB"}
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeFilterableCell.js","names":[],"sources":["../../../../../src/components/backoffice/shared/BackofficeFilterableCell.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\nimport { MarkdownExternalLinkSvg as ExternalLinkSvg } from '@plumile/ui/icons/markdown/MarkdownExternalLinkSvg.js';\nimport { cx } from '@plumile/ui/theme/tools.js';\n\nimport type { BackofficeEntityManifestMap } from '@plumile/backoffice-core/types.js';\nimport { BackofficeInlineLink } from '../links/BackofficeInlineLink.js';\nimport type { BackofficeLinkTarget } from '../links/types.js';\nimport * as styles from './backofficeFilterableCell.css.js';\n\nexport type BackofficeFilterableCellProps<\n TManifest extends BackofficeEntityManifestMap = BackofficeEntityManifestMap,\n> = {\n filterAction?: ReactNode;\n children: ReactNode;\n target?: BackofficeLinkTarget<TManifest>;\n title?: string;\n openInNewTab?: boolean;\n wrap?: boolean;\n className?: string;\n icon?: 'auto' | 'none';\n};\n\nexport const BackofficeFilterableCell = ({\n filterAction,\n children,\n target,\n title,\n openInNewTab = false,\n wrap = false,\n className,\n icon = 'auto',\n}: BackofficeFilterableCellProps): JSX.Element => {\n const textNode = <span className={styles.text({ wrap })}>{children}</span>;\n\n let contentNode: JSX.Element = (\n <span className={styles.contentSlot}>{textNode}</span>\n );\n if (target != null) {\n contentNode = (\n <BackofficeInlineLink\n target={target}\n className={styles.detailLink}\n title={title}\n openInNewTab={openInNewTab}\n icon={icon}\n endAdornment={(() => {\n if (!openInNewTab) {\n return null;\n }\n return (\n <ExternalLinkSvg className={styles.detailIcon} aria-hidden=\"true\" />\n );\n })()}\n >\n {textNode}\n </BackofficeInlineLink>\n );\n }\n\n return (\n <span className={cx(styles.container, className)}>\n <span className={styles.actionSlot}>{filterAction}</span>\n {contentNode}\n </span>\n );\n};\n\nexport default BackofficeFilterableCell;\n"],"mappings":";;;;;;AAsBA,IAAa,KAA4B,EACvC,iBACA,aACA,WACA,UACA,kBAAe,IACf,UAAO,IACP,cACA,UAAO,aACyC;CAChD,IAAM,IAAW,kBAAC,QAAD;EAAM,WAAW,EAAY,EAAE,QAAK,CAAC;EAAI;CAAe,CAAA,GAErE,IACF,kBAAC,QAAD;EAAM,WAAW;YAAqB;CAAe,CAAA;CAwBvD,OAtBI,KAAU,SACZ,IACE,kBAAC,GAAD;EACU;EACR,WAAW;EACJ;EACO;EACR;EACN,cACO,IAIH,kBAAC,GAAD;GAAiB,WAAW;GAAmB,eAAY;EAAQ,CAAA,IAH5D;YAOV;CACmB,CAAA,IAKxB,kBAAC,QAAD;EAAM,WAAW,EAAG,GAAkB,CAAS;YAA/C,CACE,kBAAC,QAAD;GAAM,WAAW;aAAoB;EAAmB,CAAA,GACvD,CACG;;AAEV"}
1
+ {"version":3,"file":"BackofficeFilterableCell.js","names":[],"sources":["../../../../../src/components/backoffice/shared/BackofficeFilterableCell.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\nimport { MarkdownExternalLinkSvg as ExternalLinkSvg } from '@plumile/ui/icons/markdown/MarkdownExternalLinkSvg.js';\nimport { cx } from '@plumile/ui/theme/tools.js';\n\nimport type { BackofficeEntityManifestMap } from '@plumile/backoffice-core/types.js';\nimport { BackofficeInlineLink } from '../links/BackofficeInlineLink.js';\nimport type { BackofficeLinkTarget } from '../links/types.js';\nimport * as styles from './backofficeFilterableCell.css.js';\n\nexport type BackofficeFilterableCellProps<\n TManifest extends BackofficeEntityManifestMap = BackofficeEntityManifestMap,\n> = {\n filterAction?: ReactNode;\n children: ReactNode;\n target?: BackofficeLinkTarget<TManifest>;\n title?: string;\n openInNewTab?: boolean;\n wrap?: boolean;\n className?: string;\n icon?: 'auto' | 'none';\n};\n\nexport const BackofficeFilterableCell = ({\n filterAction,\n children,\n target,\n title,\n openInNewTab = false,\n wrap = false,\n className,\n icon = 'auto',\n}: BackofficeFilterableCellProps): JSX.Element => {\n const textNode = <span className={styles.text({ wrap })}>{children}</span>;\n\n let contentNode: JSX.Element = (\n <span className={styles.contentSlot}>{textNode}</span>\n );\n if (target != null) {\n contentNode = (\n <BackofficeInlineLink\n target={target}\n className={styles.detailLink}\n title={title}\n openInNewTab={openInNewTab}\n icon={icon}\n endAdornment={(() => {\n if (!openInNewTab) {\n return null;\n }\n return (\n <ExternalLinkSvg className={styles.detailIcon} aria-hidden=\"true\" />\n );\n })()}\n >\n {textNode}\n </BackofficeInlineLink>\n );\n }\n\n return (\n <span className={cx(styles.container, className)}>\n <span className={styles.actionSlot}>{filterAction}</span>\n {contentNode}\n </span>\n );\n};\n\nexport default BackofficeFilterableCell;\n"],"mappings":";;;;;;AAsBA,IAAa,KAA4B,EACvC,iBACA,aACA,WACA,UACA,kBAAe,IACf,UAAO,IACP,cACA,UAAO,aACyC;CAChD,IAAM,IAAW,kBAAC,QAAD;EAAM,WAAW,EAAY,EAAE,QAAK,CAAC;EAAI;CAAe,CAAA,GAErE,IACF,kBAAC,QAAD;EAAM,WAAW;EAAqB,UAAA;CAAe,CAAA;CAwBvD,OAtBI,KAAU,SACZ,IACE,kBAAC,GAAD;EACU;EACR,WAAW;EACJ;EACO;EACR;EACN,cACO,IAIH,kBAAC,GAAD;GAAiB,WAAW;GAAmB,eAAY;EAAQ,CAAA,IAH5D;EAOV,UAAA;CACmB,CAAA,IAKxB,kBAAC,QAAD;EAAM,WAAW,EAAG,GAAkB,CAAS;EAA/C,UAAA,CACE,kBAAC,QAAD;GAAM,WAAW;GAAoB,UAAA;EAAmB,CAAA,GACvD,CACG;;AAEV"}
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeFormattedCurrency.js","names":[],"sources":["../../../../../src/components/backoffice/shared/BackofficeFormattedCurrency.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\n\nimport { useBackofficeFormats } from '../../../i18n/useBackofficeFormats.js';\n\nexport type BackofficeFormattedCurrencyProps = {\n value: number | null | undefined;\n fallback?: ReactNode;\n className?: string;\n};\n\nexport const BackofficeFormattedCurrency = ({\n value,\n fallback = '-',\n className,\n}: BackofficeFormattedCurrencyProps): JSX.Element => {\n const { formatCurrency, formatCurrencyTitle } = useBackofficeFormats();\n\n if (value == null) {\n return <span className={className}>{fallback}</span>;\n }\n\n return (\n <span className={className} title={formatCurrencyTitle(value) ?? undefined}>\n {formatCurrency(value)}\n </span>\n );\n};\n\nexport default BackofficeFormattedCurrency;\n"],"mappings":";;;AAUA,IAAa,KAA+B,EAC1C,UACA,cAAW,KACX,mBACmD;CACnD,IAAM,EAAE,mBAAgB,2BAAwB,EAAqB;CAMrE,OAJI,KAAS,OACJ,kBAAC,QAAD;EAAiB;YAAY;CAAe,CAAA,IAInD,kBAAC,QAAD;EAAiB;EAAW,OAAO,EAAoB,CAAK,KAAK,KAAA;YAC9D,EAAe,CAAK;CACjB,CAAA;AAEV"}
1
+ {"version":3,"file":"BackofficeFormattedCurrency.js","names":[],"sources":["../../../../../src/components/backoffice/shared/BackofficeFormattedCurrency.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\n\nimport { useBackofficeFormats } from '../../../i18n/useBackofficeFormats.js';\n\nexport type BackofficeFormattedCurrencyProps = {\n value: number | null | undefined;\n fallback?: ReactNode;\n className?: string;\n};\n\nexport const BackofficeFormattedCurrency = ({\n value,\n fallback = '-',\n className,\n}: BackofficeFormattedCurrencyProps): JSX.Element => {\n const { formatCurrency, formatCurrencyTitle } = useBackofficeFormats();\n\n if (value == null) {\n return <span className={className}>{fallback}</span>;\n }\n\n return (\n <span className={className} title={formatCurrencyTitle(value) ?? undefined}>\n {formatCurrency(value)}\n </span>\n );\n};\n\nexport default BackofficeFormattedCurrency;\n"],"mappings":";;;AAUA,IAAa,KAA+B,EAC1C,UACA,cAAW,KACX,mBACmD;CACnD,IAAM,EAAE,mBAAgB,2BAAwB,EAAqB;CAMrE,OAJI,KAAS,OACJ,kBAAC,QAAD;EAAiB;EAAY,UAAA;CAAe,CAAA,IAInD,kBAAC,QAAD;EAAiB;EAAW,OAAO,EAAoB,CAAK,KAAK,KAAA;EAC9D,UAAA,EAAe,CAAK;CACjB,CAAA;AAEV"}
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeFormattedNumber.js","names":[],"sources":["../../../../../src/components/backoffice/shared/BackofficeFormattedNumber.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\n\nimport { useBackofficeFormats } from '../../../i18n/useBackofficeFormats.js';\n\nexport type BackofficeFormattedNumberProps = {\n value: number | null | undefined;\n fallback?: ReactNode;\n className?: string;\n};\n\nexport const BackofficeFormattedNumber = ({\n value,\n fallback = '-',\n className,\n}: BackofficeFormattedNumberProps): JSX.Element => {\n const { formatNumber } = useBackofficeFormats();\n\n if (value == null) {\n return <span className={className}>{fallback}</span>;\n }\n\n return <span className={className}>{formatNumber(value)}</span>;\n};\n\nexport default BackofficeFormattedNumber;\n"],"mappings":";;;AAUA,IAAa,KAA6B,EACxC,UACA,cAAW,KACX,mBACiD;CACjD,IAAM,EAAE,oBAAiB,EAAqB;CAM9C,OAJI,KAAS,OACJ,kBAAC,QAAD;EAAiB;YAAY;CAAe,CAAA,IAG9C,kBAAC,QAAD;EAAiB;YAAY,EAAa,CAAK;CAAQ,CAAA;AAChE"}
1
+ {"version":3,"file":"BackofficeFormattedNumber.js","names":[],"sources":["../../../../../src/components/backoffice/shared/BackofficeFormattedNumber.tsx"],"sourcesContent":["import { type JSX, type ReactNode } from 'react';\n\nimport { useBackofficeFormats } from '../../../i18n/useBackofficeFormats.js';\n\nexport type BackofficeFormattedNumberProps = {\n value: number | null | undefined;\n fallback?: ReactNode;\n className?: string;\n};\n\nexport const BackofficeFormattedNumber = ({\n value,\n fallback = '-',\n className,\n}: BackofficeFormattedNumberProps): JSX.Element => {\n const { formatNumber } = useBackofficeFormats();\n\n if (value == null) {\n return <span className={className}>{fallback}</span>;\n }\n\n return <span className={className}>{formatNumber(value)}</span>;\n};\n\nexport default BackofficeFormattedNumber;\n"],"mappings":";;;AAUA,IAAa,KAA6B,EACxC,UACA,cAAW,KACX,mBACiD;CACjD,IAAM,EAAE,oBAAiB,EAAqB;CAM9C,OAJI,KAAS,OACJ,kBAAC,QAAD;EAAiB;EAAY,UAAA;CAAe,CAAA,IAG9C,kBAAC,QAAD;EAAiB;EAAY,UAAA,EAAa,CAAK;CAAQ,CAAA;AAChE"}
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeInlineFilterRow.js","names":[],"sources":["../../../../../src/components/backoffice/shared/BackofficeInlineFilterRow.tsx"],"sourcesContent":["import { Children, type JSX, type ReactNode } from 'react';\n\nimport { cx } from '@plumile/ui/theme/tools.js';\n\nimport * as styles from './backofficeInlineFilterRow.css.js';\n\nexport type BackofficeInlineFilterRowProps = {\n children: ReactNode;\n className?: string;\n};\n\nexport const BackofficeInlineFilterRow = ({\n children,\n className,\n}: BackofficeInlineFilterRowProps): JSX.Element => {\n const childNodes = Children.toArray(children);\n let actionNode: ReactNode = null;\n let valueNodes = childNodes;\n if (childNodes.length > 1) {\n const [firstNode, ...remainingNodes] = childNodes;\n actionNode = firstNode;\n valueNodes = remainingNodes;\n }\n let valueNode: ReactNode = null;\n if (valueNodes.length === 1) {\n const [singleValueNode] = valueNodes;\n valueNode = singleValueNode;\n } else if (valueNodes.length > 1) {\n valueNode = valueNodes;\n }\n\n return (\n <span className={cx(styles.container, className)}>\n <span className={styles.actionSlot}>{actionNode}</span>\n <span className={styles.valueSlot}>{valueNode}</span>\n </span>\n );\n};\n\nexport default BackofficeInlineFilterRow;\n"],"mappings":";;;;;AAWA,IAAa,KAA6B,EACxC,aACA,mBACiD;CACjD,IAAM,IAAa,EAAS,QAAQ,CAAQ,GACxC,IAAwB,MACxB,IAAa;CACjB,IAAI,EAAW,SAAS,GAAG;EACzB,IAAM,CAAC,GAAW,GAAG,KAAkB;EAEvC,AADA,IAAa,GACb,IAAa;CACf;CACA,IAAI,IAAuB;CAC3B,IAAI,EAAW,WAAW,GAAG;EAC3B,IAAM,CAAC,KAAmB;EAC1B,IAAY;CACd,OAAO,AAAI,EAAW,SAAS,MAC7B,IAAY;CAGd,OACE,kBAAC,QAAD;EAAM,WAAW,EAAG,GAAkB,CAAS;YAA/C,CACE,kBAAC,QAAD;GAAM,WAAW;aAAoB;EAAiB,CAAA,GACtD,kBAAC,QAAD;GAAM,WAAW;aAAmB;EAAgB,CAAA,CAChD;;AAEV"}
1
+ {"version":3,"file":"BackofficeInlineFilterRow.js","names":[],"sources":["../../../../../src/components/backoffice/shared/BackofficeInlineFilterRow.tsx"],"sourcesContent":["import { Children, type JSX, type ReactNode } from 'react';\n\nimport { cx } from '@plumile/ui/theme/tools.js';\n\nimport * as styles from './backofficeInlineFilterRow.css.js';\n\nexport type BackofficeInlineFilterRowProps = {\n children: ReactNode;\n className?: string;\n};\n\nexport const BackofficeInlineFilterRow = ({\n children,\n className,\n}: BackofficeInlineFilterRowProps): JSX.Element => {\n const childNodes = Children.toArray(children);\n let actionNode: ReactNode = null;\n let valueNodes = childNodes;\n if (childNodes.length > 1) {\n const [firstNode, ...remainingNodes] = childNodes;\n actionNode = firstNode;\n valueNodes = remainingNodes;\n }\n let valueNode: ReactNode = null;\n if (valueNodes.length === 1) {\n const [singleValueNode] = valueNodes;\n valueNode = singleValueNode;\n } else if (valueNodes.length > 1) {\n valueNode = valueNodes;\n }\n\n return (\n <span className={cx(styles.container, className)}>\n <span className={styles.actionSlot}>{actionNode}</span>\n <span className={styles.valueSlot}>{valueNode}</span>\n </span>\n );\n};\n\nexport default BackofficeInlineFilterRow;\n"],"mappings":";;;;;AAWA,IAAa,KAA6B,EACxC,aACA,mBACiD;CACjD,IAAM,IAAa,EAAS,QAAQ,CAAQ,GACxC,IAAwB,MACxB,IAAa;CACjB,IAAI,EAAW,SAAS,GAAG;EACzB,IAAM,CAAC,GAAW,GAAG,KAAkB;EAEvC,AADA,IAAa,GACb,IAAa;CACf;CACA,IAAI,IAAuB;CAC3B,IAAI,EAAW,WAAW,GAAG;EAC3B,IAAM,CAAC,KAAmB;EAC1B,IAAY;CACd,OAAO,AAAI,EAAW,SAAS,MAC7B,IAAY;CAGd,OACE,kBAAC,QAAD;EAAM,WAAW,EAAG,GAAkB,CAAS;EAA/C,UAAA,CACE,kBAAC,QAAD;GAAM,WAAW;GAAoB,UAAA;EAAiB,CAAA,GACtD,kBAAC,QAAD;GAAM,WAAW;GAAmB,UAAA;EAAgB,CAAA,CAChD;;AAEV"}
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeToolsDocPanel.js","names":[],"sources":["../../../../../src/components/backoffice/tools/BackofficeToolsDocPanel.tsx"],"sourcesContent":["import { useId, useState, type JSX } from 'react';\n\nimport { LazyMarkdownCodeBlock } from '@plumile/ui/atomic/molecules/markdown/components/LazyMarkdownCodeBlock.js';\nimport { ChevronDownSvg } from '@plumile/ui/icons/ChevronDownSvg.js';\nimport { cx } from '@plumile/ui/theme/tools.js';\n\nimport * as styles from './backofficeToolsDocPanel.css.js';\n\nexport type BackofficeToolsDocPanelProps = {\n title: string;\n content: string;\n language?: string | null;\n badgeLabel?: string | null;\n defaultOpen?: boolean;\n};\n\nexport const BackofficeToolsDocPanel = ({\n title,\n content,\n language,\n badgeLabel,\n defaultOpen = false,\n}: BackofficeToolsDocPanelProps): JSX.Element | null => {\n const trimmedContent = content.trim();\n const [isOpen, setIsOpen] = useState(defaultOpen);\n const contentId = useId();\n\n if (trimmedContent === '') {\n return null;\n }\n\n return (\n <div className={styles.panel}>\n <button\n type=\"button\"\n className={styles.trigger}\n onClick={() => {\n setIsOpen((prev) => {\n return !prev;\n });\n }}\n aria-expanded={isOpen}\n aria-controls={contentId}\n >\n <span className={styles.triggerTitle}>{title}</span>\n <ChevronDownSvg\n width={16}\n height={16}\n aria-hidden=\"true\"\n className={cx(styles.triggerIcon, {\n [styles.triggerIconOpen]: isOpen,\n })}\n />\n </button>\n {isOpen && (\n <div className={styles.content} id={contentId}>\n <LazyMarkdownCodeBlock\n code={trimmedContent}\n language={language}\n badgeLabel={badgeLabel}\n />\n </div>\n )}\n </div>\n );\n};\n\nexport default BackofficeToolsDocPanel;\n"],"mappings":";;;;;;;AAgBA,IAAa,KAA2B,EACtC,UACA,SAAA,GACA,aACA,eACA,iBAAc,SACwC;CACtD,IAAM,IAAiB,EAAQ,KAAK,GAC9B,CAAC,GAAQ,KAAa,EAAS,CAAW,GAC1C,IAAY,EAAM;CAMxB,OAJI,MAAmB,KACd,OAIP,kBAAC,OAAD;EAAK,WAAW;YAAhB,CACE,kBAAC,UAAD;GACE,MAAK;GACL,WAAW;GACX,eAAe;IACb,GAAW,MACF,CAAC,CACT;GACH;GACA,iBAAe;GACf,iBAAe;aATjB,CAWE,kBAAC,QAAD;IAAM,WAAW;cAAsB;GAAY,CAAA,GACnD,kBAAC,GAAD;IACE,OAAO;IACP,QAAQ;IACR,eAAY;IACZ,WAAW,EAAG,GAAoB,GAC/B,IAAyB,EAC5B,CAAC;GACF,CAAA,CACK;MACP,KACC,kBAAC,OAAD;GAAK,WAAW;GAAgB,IAAI;aAClC,kBAAC,GAAD;IACE,MAAM;IACI;IACE;GACb,CAAA;EACE,CAAA,CAEJ;;AAET"}
1
+ {"version":3,"file":"BackofficeToolsDocPanel.js","names":[],"sources":["../../../../../src/components/backoffice/tools/BackofficeToolsDocPanel.tsx"],"sourcesContent":["import { useId, useState, type JSX } from 'react';\n\nimport { LazyMarkdownCodeBlock } from '@plumile/ui/atomic/molecules/markdown/components/LazyMarkdownCodeBlock.js';\nimport { ChevronDownSvg } from '@plumile/ui/icons/ChevronDownSvg.js';\nimport { cx } from '@plumile/ui/theme/tools.js';\n\nimport * as styles from './backofficeToolsDocPanel.css.js';\n\nexport type BackofficeToolsDocPanelProps = {\n title: string;\n content: string;\n language?: string | null;\n badgeLabel?: string | null;\n defaultOpen?: boolean;\n};\n\nexport const BackofficeToolsDocPanel = ({\n title,\n content,\n language,\n badgeLabel,\n defaultOpen = false,\n}: BackofficeToolsDocPanelProps): JSX.Element | null => {\n const trimmedContent = content.trim();\n const [isOpen, setIsOpen] = useState(defaultOpen);\n const contentId = useId();\n\n if (trimmedContent === '') {\n return null;\n }\n\n return (\n <div className={styles.panel}>\n <button\n type=\"button\"\n className={styles.trigger}\n onClick={() => {\n setIsOpen((prev) => {\n return !prev;\n });\n }}\n aria-expanded={isOpen}\n aria-controls={contentId}\n >\n <span className={styles.triggerTitle}>{title}</span>\n <ChevronDownSvg\n width={16}\n height={16}\n aria-hidden=\"true\"\n className={cx(styles.triggerIcon, {\n [styles.triggerIconOpen]: isOpen,\n })}\n />\n </button>\n {isOpen && (\n <div className={styles.content} id={contentId}>\n <LazyMarkdownCodeBlock\n code={trimmedContent}\n language={language}\n badgeLabel={badgeLabel}\n />\n </div>\n )}\n </div>\n );\n};\n\nexport default BackofficeToolsDocPanel;\n"],"mappings":";;;;;;;AAgBA,IAAa,KAA2B,EACtC,UACA,SAAA,GACA,aACA,eACA,iBAAc,SACwC;CACtD,IAAM,IAAiB,EAAQ,KAAK,GAC9B,CAAC,GAAQ,KAAa,EAAS,CAAW,GAC1C,IAAY,EAAM;CAMxB,OAJI,MAAmB,KACd,OAIP,kBAAC,OAAD;EAAK,WAAW;EAAhB,UAAA,CACE,kBAAC,UAAD;GACE,MAAK;GACL,WAAW;GACX,eAAe;IACb,GAAW,MACF,CAAC,CACT;GACH;GACA,iBAAe;GACf,iBAAe;GATjB,UAAA,CAWE,kBAAC,QAAD;IAAM,WAAW;IAAsB,UAAA;GAAY,CAAA,GACnD,kBAAC,GAAD;IACE,OAAO;IACP,QAAQ;IACR,eAAY;IACZ,WAAW,EAAG,GAAoB,GAC/B,IAAyB,EAC5B,CAAC;GACF,CAAA,CACK;EACP,CAAA,GAAA,KACC,kBAAC,OAAD;GAAK,WAAW;GAAgB,IAAI;GAClC,UAAA,kBAAC,GAAD;IACE,MAAM;IACI;IACE;GACb,CAAA;EACE,CAAA,CAEJ;;AAET"}
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeToolsErrorFallback.js","names":[],"sources":["../../../../../src/components/backoffice/tools/BackofficeToolsErrorFallback.tsx"],"sourcesContent":["import { type JSX } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { Button } from '@plumile/ui/atomic/atoms/button/Button.js';\nimport { BackofficeDetailSection } from '@plumile/ui/backoffice/molecules/backoffice_detail_section/BackofficeDetailSection.js';\nimport { BackofficePayloadViewer } from '@plumile/ui/backoffice/molecules/backoffice_payload_viewer/BackofficePayloadViewer.js';\n\nexport type BackofficeToolsErrorFallbackProps = {\n error: unknown;\n onRetry: () => void;\n};\n\nconst resolveErrorDetails = (error: unknown): string | null => {\n if (error instanceof Error) {\n if (error.stack != null && error.stack.trim() !== '') {\n return error.stack;\n }\n if (error.name !== '' && error.message !== '') {\n return `${error.name}: ${error.message}`;\n }\n if (error.message !== '') {\n return error.message;\n }\n return null;\n }\n\n if (typeof error === 'string') {\n return error;\n }\n\n try {\n return JSON.stringify(error, null, 2);\n } catch {\n return String(error);\n }\n};\n\nexport const BackofficeToolsErrorFallback = ({\n error,\n onRetry,\n}: BackofficeToolsErrorFallbackProps): JSX.Element => {\n const { t } = useTranslation('backofficeReact');\n let message = t('tools.errors.unknown');\n if (error instanceof Error) {\n message = error.message;\n }\n const details = resolveErrorDetails(error);\n let detailsContent: string | null = null;\n if (details != null) {\n const trimmed = details.trim();\n if (trimmed !== '' && trimmed !== message) {\n detailsContent = `\\`\\`\\`\\n${trimmed}\\n\\`\\`\\``;\n }\n }\n\n return (\n <>\n <BackofficeDetailSection\n title={t('tools.errors.title')}\n description={t('tools.errors.description')}\n items={[\n {\n id: 'error',\n label: t('tools.errors.label'),\n size: 'fluid',\n value: message,\n },\n ]}\n >\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n onClick={onRetry}\n >\n {t('common.actions.retry')}\n </Button>\n </BackofficeDetailSection>\n {detailsContent != null && (\n <BackofficeDetailSection title={t('tools.errors.details')}>\n <BackofficePayloadViewer content={detailsContent} format=\"markdown\" />\n </BackofficeDetailSection>\n )}\n </>\n );\n};\n\nexport default BackofficeToolsErrorFallback;\n"],"mappings":";;;;;;AAYA,IAAM,KAAuB,MAAkC;CAC7D,IAAI,aAAiB,OAUnB,OATI,EAAM,SAAS,QAAQ,EAAM,MAAM,KAAK,MAAM,KACzC,EAAM,QAEX,EAAM,SAAS,MAAM,EAAM,YAAY,KAClC,GAAG,EAAM,KAAK,IAAI,EAAM,YAE7B,EAAM,YAAY,KAGf,OAFE,EAAM;CAKjB,IAAI,OAAO,KAAU,UACnB,OAAO;CAGT,IAAI;EACF,OAAO,KAAK,UAAU,GAAO,MAAM,CAAC;CACtC,QAAQ;EACN,OAAO,OAAO,CAAK;CACrB;AACF,GAEa,KAAgC,EAC3C,UACA,iBACoD;CACpD,IAAM,EAAE,SAAM,EAAe,iBAAiB,GAC1C,IAAU,EAAE,sBAAsB;CACtC,AAAI,aAAiB,UACnB,IAAU,EAAM;CAElB,IAAM,IAAU,EAAoB,CAAK,GACrC,IAAgC;CACpC,IAAI,KAAW,MAAM;EACnB,IAAM,IAAU,EAAQ,KAAK;EAC7B,AAAI,MAAY,MAAM,MAAY,MAChC,IAAiB,WAAW,EAAQ;CAExC;CAEA,OACE,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD;EACE,OAAO,EAAE,oBAAoB;EAC7B,aAAa,EAAE,0BAA0B;EACzC,OAAO,CACL;GACE,IAAI;GACJ,OAAO,EAAE,oBAAoB;GAC7B,MAAM;GACN,OAAO;EACT,CACF;YAEA,kBAAC,GAAD;GACE,MAAK;GACL,SAAQ;GACR,MAAK;GACL,SAAS;aAER,EAAE,sBAAsB;EACnB,CAAA;CACe,CAAA,GACxB,KAAkB,QACjB,kBAAC,GAAD;EAAyB,OAAO,EAAE,sBAAsB;YACtD,kBAAC,GAAD;GAAyB,SAAS;GAAgB,QAAO;EAAY,CAAA;CAC9C,CAAA,CAE3B,EAAA,CAAA;AAEN"}
1
+ {"version":3,"file":"BackofficeToolsErrorFallback.js","names":[],"sources":["../../../../../src/components/backoffice/tools/BackofficeToolsErrorFallback.tsx"],"sourcesContent":["import { type JSX } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { Button } from '@plumile/ui/atomic/atoms/button/Button.js';\nimport { BackofficeDetailSection } from '@plumile/ui/backoffice/molecules/backoffice_detail_section/BackofficeDetailSection.js';\nimport { BackofficePayloadViewer } from '@plumile/ui/backoffice/molecules/backoffice_payload_viewer/BackofficePayloadViewer.js';\n\nexport type BackofficeToolsErrorFallbackProps = {\n error: unknown;\n onRetry: () => void;\n};\n\nconst resolveErrorDetails = (error: unknown): string | null => {\n if (error instanceof Error) {\n if (error.stack != null && error.stack.trim() !== '') {\n return error.stack;\n }\n if (error.name !== '' && error.message !== '') {\n return `${error.name}: ${error.message}`;\n }\n if (error.message !== '') {\n return error.message;\n }\n return null;\n }\n\n if (typeof error === 'string') {\n return error;\n }\n\n try {\n return JSON.stringify(error, null, 2);\n } catch {\n return String(error);\n }\n};\n\nexport const BackofficeToolsErrorFallback = ({\n error,\n onRetry,\n}: BackofficeToolsErrorFallbackProps): JSX.Element => {\n const { t } = useTranslation('backofficeReact');\n let message = t('tools.errors.unknown');\n if (error instanceof Error) {\n message = error.message;\n }\n const details = resolveErrorDetails(error);\n let detailsContent: string | null = null;\n if (details != null) {\n const trimmed = details.trim();\n if (trimmed !== '' && trimmed !== message) {\n detailsContent = `\\`\\`\\`\\n${trimmed}\\n\\`\\`\\``;\n }\n }\n\n return (\n <>\n <BackofficeDetailSection\n title={t('tools.errors.title')}\n description={t('tools.errors.description')}\n items={[\n {\n id: 'error',\n label: t('tools.errors.label'),\n size: 'fluid',\n value: message,\n },\n ]}\n >\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n onClick={onRetry}\n >\n {t('common.actions.retry')}\n </Button>\n </BackofficeDetailSection>\n {detailsContent != null && (\n <BackofficeDetailSection title={t('tools.errors.details')}>\n <BackofficePayloadViewer content={detailsContent} format=\"markdown\" />\n </BackofficeDetailSection>\n )}\n </>\n );\n};\n\nexport default BackofficeToolsErrorFallback;\n"],"mappings":";;;;;;AAYA,IAAM,KAAuB,MAAkC;CAC7D,IAAI,aAAiB,OAUnB,OATI,EAAM,SAAS,QAAQ,EAAM,MAAM,KAAK,MAAM,KACzC,EAAM,QAEX,EAAM,SAAS,MAAM,EAAM,YAAY,KAClC,GAAG,EAAM,KAAK,IAAI,EAAM,YAE7B,EAAM,YAAY,KAGf,OAFE,EAAM;CAKjB,IAAI,OAAO,KAAU,UACnB,OAAO;CAGT,IAAI;EACF,OAAO,KAAK,UAAU,GAAO,MAAM,CAAC;CACtC,QAAQ;EACN,OAAO,OAAO,CAAK;CACrB;AACF,GAEa,KAAgC,EAC3C,UACA,iBACoD;CACpD,IAAM,EAAE,SAAM,EAAe,iBAAiB,GAC1C,IAAU,EAAE,sBAAsB;CACtC,AAAI,aAAiB,UACnB,IAAU,EAAM;CAElB,IAAM,IAAU,EAAoB,CAAK,GACrC,IAAgC;CACpC,IAAI,KAAW,MAAM;EACnB,IAAM,IAAU,EAAQ,KAAK;EAC7B,AAAI,MAAY,MAAM,MAAY,MAChC,IAAiB,WAAW,EAAQ;CAExC;CAEA,OACE,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD;EACE,OAAO,EAAE,oBAAoB;EAC7B,aAAa,EAAE,0BAA0B;EACzC,OAAO,CACL;GACE,IAAI;GACJ,OAAO,EAAE,oBAAoB;GAC7B,MAAM;GACN,OAAO;EACT,CACF;EAEA,UAAA,kBAAC,GAAD;GACE,MAAK;GACL,SAAQ;GACR,MAAK;GACL,SAAS;GAER,UAAA,EAAE,sBAAsB;EACnB,CAAA;CACe,CAAA,GACxB,KAAkB,QACjB,kBAAC,GAAD;EAAyB,OAAO,EAAE,sBAAsB;EACtD,UAAA,kBAAC,GAAD;GAAyB,SAAS;GAAgB,QAAO;EAAY,CAAA;CAC9C,CAAA,CAE3B,EAAA,CAAA;AAEN"}
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeToolsJsonForm.js","names":[],"sources":["../../../../../src/components/backoffice/tools/BackofficeToolsJsonForm.tsx"],"sourcesContent":["import { useId, type FormEvent, type JSX } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { Button } from '@plumile/ui/atomic/atoms/button/Button.js';\nimport { Label } from '@plumile/ui/atomic/atoms/label/Label.js';\nimport { Textarea } from '@plumile/ui/atomic/atoms/textarea/Textarea.js';\nimport { Form } from '@plumile/ui/atomic/molecules/form/Form.js';\nimport { FormError } from '@plumile/ui/atomic/molecules/form_error/FormError.js';\nimport { FormGroup } from '@plumile/ui/atomic/molecules/form/FormGroup.js';\n\nimport * as styles from './backofficeToolsJsonForm.css.js';\n\nexport type BackofficeToolsJsonFormProps = {\n value: string;\n onChange: (next: string) => void;\n onSubmit: () => void;\n error?: string | null;\n disabled?: boolean;\n label?: string;\n submitLabel?: string;\n exampleValue?: string;\n exampleLabel?: string;\n};\n\nexport const BackofficeToolsJsonForm = ({\n value,\n onChange,\n onSubmit,\n error,\n disabled = false,\n label,\n submitLabel,\n exampleValue,\n exampleLabel,\n}: BackofficeToolsJsonFormProps): JSX.Element => {\n const { t } = useTranslation('backofficeReact');\n const inputId = useId();\n const errorId = useId();\n\n const resolvedLabel = label ?? t('tools.forms.inputJsonLabel');\n const resolvedSubmitLabel = submitLabel ?? t('tools.forms.actions.run');\n const resolvedExampleLabel =\n exampleLabel ?? t('tools.forms.actions.insertExample');\n let resolvedExampleValue = '';\n if (typeof exampleValue === 'string') {\n resolvedExampleValue = exampleValue;\n }\n const hasExample = resolvedExampleValue.trim() !== '';\n const hasError = error != null && error.trim() !== '';\n let describedBy: string | undefined;\n if (hasError) {\n describedBy = errorId;\n }\n\n const handleSubmit = (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n if (disabled) {\n return;\n }\n onSubmit();\n };\n\n return (\n <Form onSubmit={handleSubmit} className={styles.form}>\n <FormError message={error} id={errorId} />\n <FormGroup>\n <div className={styles.inputHeader}>\n <Label htmlFor={inputId}>{resolvedLabel}</Label>\n {hasExample && (\n <Button\n type=\"button\"\n variant=\"text\"\n size=\"small\"\n disabled={disabled}\n onClick={() => {\n onChange(resolvedExampleValue);\n }}\n >\n {resolvedExampleLabel}\n </Button>\n )}\n </div>\n <Textarea\n id={inputId}\n value={value}\n onChange={(event) => {\n onChange(event.target.value);\n }}\n rows={8}\n fullWidth\n aria-invalid={hasError}\n aria-describedby={describedBy}\n />\n </FormGroup>\n <div className={styles.actions}>\n <Button\n type=\"submit\"\n variant=\"primary\"\n size=\"small\"\n disabled={disabled}\n >\n {resolvedSubmitLabel}\n </Button>\n </div>\n </Form>\n );\n};\n\nexport default BackofficeToolsJsonForm;\n"],"mappings":";;;;;;;;;;;AAwBA,IAAa,KAA2B,EACtC,UACA,aACA,aACA,UACA,cAAW,IACX,UACA,gBACA,iBACA,sBAC+C;CAC/C,IAAM,EAAE,SAAM,EAAe,iBAAiB,GACxC,IAAU,EAAM,GAChB,IAAU,EAAM,GAEhB,IAAgB,KAAS,EAAE,4BAA4B,GACvD,IAAsB,KAAe,EAAE,yBAAyB,GAChE,IACJ,KAAgB,EAAE,mCAAmC,GACnD,IAAuB;CAC3B,AAAI,OAAO,KAAiB,aAC1B,IAAuB;CAEzB,IAAM,IAAa,EAAqB,KAAK,MAAM,IAC7C,IAAW,KAAS,QAAQ,EAAM,KAAK,MAAM,IAC/C;CAaJ,OAZI,MACF,IAAc,IAYd,kBAAC,GAAD;EAAM,WATc,MAAsC;GAC1D,EAAM,eAAe,GACjB,MAGJ,EAAS;EACX;EAGgC,WAAW;YAAzC;GACE,kBAAC,GAAD;IAAW,SAAS;IAAO,IAAI;GAAU,CAAA;GACzC,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,OAAD;IAAK,WAAW;cAAhB,CACE,kBAAC,GAAD;KAAO,SAAS;eAAU;IAAqB,CAAA,GAC9C,KACC,kBAAC,GAAD;KACE,MAAK;KACL,SAAQ;KACR,MAAK;KACK;KACV,eAAe;MACb,EAAS,CAAoB;KAC/B;eAEC;IACK,CAAA,CAEP;OACL,kBAAC,GAAD;IACE,IAAI;IACG;IACP,WAAW,MAAU;KACnB,EAAS,EAAM,OAAO,KAAK;IAC7B;IACA,MAAM;IACN,WAAA;IACA,gBAAc;IACd,oBAAkB;GACnB,CAAA,CACQ,EAAA,CAAA;GACX,kBAAC,OAAD;IAAK,WAAW;cACd,kBAAC,GAAD;KACE,MAAK;KACL,SAAQ;KACR,MAAK;KACK;eAET;IACK,CAAA;GACL,CAAA;EACD;;AAEV"}
1
+ {"version":3,"file":"BackofficeToolsJsonForm.js","names":[],"sources":["../../../../../src/components/backoffice/tools/BackofficeToolsJsonForm.tsx"],"sourcesContent":["import { useId, type FormEvent, type JSX } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { Button } from '@plumile/ui/atomic/atoms/button/Button.js';\nimport { Label } from '@plumile/ui/atomic/atoms/label/Label.js';\nimport { Textarea } from '@plumile/ui/atomic/atoms/textarea/Textarea.js';\nimport { Form } from '@plumile/ui/atomic/molecules/form/Form.js';\nimport { FormError } from '@plumile/ui/atomic/molecules/form_error/FormError.js';\nimport { FormGroup } from '@plumile/ui/atomic/molecules/form/FormGroup.js';\n\nimport * as styles from './backofficeToolsJsonForm.css.js';\n\nexport type BackofficeToolsJsonFormProps = {\n value: string;\n onChange: (next: string) => void;\n onSubmit: () => void;\n error?: string | null;\n disabled?: boolean;\n label?: string;\n submitLabel?: string;\n exampleValue?: string;\n exampleLabel?: string;\n};\n\nexport const BackofficeToolsJsonForm = ({\n value,\n onChange,\n onSubmit,\n error,\n disabled = false,\n label,\n submitLabel,\n exampleValue,\n exampleLabel,\n}: BackofficeToolsJsonFormProps): JSX.Element => {\n const { t } = useTranslation('backofficeReact');\n const inputId = useId();\n const errorId = useId();\n\n const resolvedLabel = label ?? t('tools.forms.inputJsonLabel');\n const resolvedSubmitLabel = submitLabel ?? t('tools.forms.actions.run');\n const resolvedExampleLabel =\n exampleLabel ?? t('tools.forms.actions.insertExample');\n let resolvedExampleValue = '';\n if (typeof exampleValue === 'string') {\n resolvedExampleValue = exampleValue;\n }\n const hasExample = resolvedExampleValue.trim() !== '';\n const hasError = error != null && error.trim() !== '';\n let describedBy: string | undefined;\n if (hasError) {\n describedBy = errorId;\n }\n\n const handleSubmit = (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n if (disabled) {\n return;\n }\n onSubmit();\n };\n\n return (\n <Form onSubmit={handleSubmit} className={styles.form}>\n <FormError message={error} id={errorId} />\n <FormGroup>\n <div className={styles.inputHeader}>\n <Label htmlFor={inputId}>{resolvedLabel}</Label>\n {hasExample && (\n <Button\n type=\"button\"\n variant=\"text\"\n size=\"small\"\n disabled={disabled}\n onClick={() => {\n onChange(resolvedExampleValue);\n }}\n >\n {resolvedExampleLabel}\n </Button>\n )}\n </div>\n <Textarea\n id={inputId}\n value={value}\n onChange={(event) => {\n onChange(event.target.value);\n }}\n rows={8}\n fullWidth\n aria-invalid={hasError}\n aria-describedby={describedBy}\n />\n </FormGroup>\n <div className={styles.actions}>\n <Button\n type=\"submit\"\n variant=\"primary\"\n size=\"small\"\n disabled={disabled}\n >\n {resolvedSubmitLabel}\n </Button>\n </div>\n </Form>\n );\n};\n\nexport default BackofficeToolsJsonForm;\n"],"mappings":";;;;;;;;;;;AAwBA,IAAa,KAA2B,EACtC,UACA,aACA,aACA,UACA,cAAW,IACX,UACA,gBACA,iBACA,sBAC+C;CAC/C,IAAM,EAAE,SAAM,EAAe,iBAAiB,GACxC,IAAU,EAAM,GAChB,IAAU,EAAM,GAEhB,IAAgB,KAAS,EAAE,4BAA4B,GACvD,IAAsB,KAAe,EAAE,yBAAyB,GAChE,IACJ,KAAgB,EAAE,mCAAmC,GACnD,IAAuB;CAC3B,AAAI,OAAO,KAAiB,aAC1B,IAAuB;CAEzB,IAAM,IAAa,EAAqB,KAAK,MAAM,IAC7C,IAAW,KAAS,QAAQ,EAAM,KAAK,MAAM,IAC/C;CAaJ,OAZI,MACF,IAAc,IAYd,kBAAC,GAAD;EAAM,WATc,MAAsC;GAC1D,EAAM,eAAe,GACjB,MAGJ,EAAS;EACX;EAGgC,WAAW;EAAzC,UAAA;GACE,kBAAC,GAAD;IAAW,SAAS;IAAO,IAAI;GAAU,CAAA;GACzC,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,OAAD;IAAK,WAAW;IAAhB,UAAA,CACE,kBAAC,GAAD;KAAO,SAAS;KAAU,UAAA;IAAqB,CAAA,GAC9C,KACC,kBAAC,GAAD;KACE,MAAK;KACL,SAAQ;KACR,MAAK;KACK;KACV,eAAe;MACb,EAAS,CAAoB;KAC/B;KAEC,UAAA;IACK,CAAA,CAEP;GACL,CAAA,GAAA,kBAAC,GAAD;IACE,IAAI;IACG;IACP,WAAW,MAAU;KACnB,EAAS,EAAM,OAAO,KAAK;IAC7B;IACA,MAAM;IACN,WAAA;IACA,gBAAc;IACd,oBAAkB;GACnB,CAAA,CACQ,EAAA,CAAA;GACX,kBAAC,OAAD;IAAK,WAAW;IACd,UAAA,kBAAC,GAAD;KACE,MAAK;KACL,SAAQ;KACR,MAAK;KACK;KAET,UAAA;IACK,CAAA;GACL,CAAA;EACD;;AAEV"}
@@ -8,23 +8,23 @@ import { Spinner as o } from "@plumile/ui/backoffice/atoms/spinner/Spinner.js";
8
8
  import { BackofficeDetailSection as s } from "@plumile/ui/backoffice/molecules/backoffice_detail_section/BackofficeDetailSection.js";
9
9
  //#region src/components/backoffice/tools/BackofficeToolsQueryBoundary.tsx
10
10
  var c = ({ children: c }) => {
11
- let { t: l } = a("backofficeReact");
11
+ let { t: l } = a("backofficeReact"), u = /* @__PURE__ */ i(s, {
12
+ title: l("tools.output"),
13
+ description: l("tools.loading.description"),
14
+ children: /* @__PURE__ */ i("div", {
15
+ className: n,
16
+ role: "status",
17
+ "aria-live": "polite",
18
+ children: /* @__PURE__ */ i(o, {})
19
+ })
20
+ });
12
21
  return /* @__PURE__ */ i(e, {
13
22
  fallback: ({ error: e, reset: n }) => /* @__PURE__ */ i(t, {
14
23
  error: e,
15
24
  onRetry: n
16
25
  }),
17
26
  children: /* @__PURE__ */ i(r, {
18
- fallback: /* @__PURE__ */ i(s, {
19
- title: l("tools.output"),
20
- description: l("tools.loading.description"),
21
- children: /* @__PURE__ */ i("div", {
22
- className: n,
23
- role: "status",
24
- "aria-live": "polite",
25
- children: /* @__PURE__ */ i(o, {})
26
- })
27
- }),
27
+ fallback: u,
28
28
  children: c
29
29
  })
30
30
  });
@@ -1 +1 @@
1
- {"version":3,"file":"BackofficeToolsQueryBoundary.js","names":[],"sources":["../../../../../src/components/backoffice/tools/BackofficeToolsQueryBoundary.tsx"],"sourcesContent":["import { Suspense, type JSX, type ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { Spinner } from '@plumile/ui/backoffice/atoms/spinner/Spinner.js';\nimport { BackofficeDetailSection } from '@plumile/ui/backoffice/molecules/backoffice_detail_section/BackofficeDetailSection.js';\n\nimport { BackofficeErrorBoundary } from '../errors/BackofficeErrorBoundary.js';\n\nimport { BackofficeToolsErrorFallback } from './BackofficeToolsErrorFallback.js';\nimport * as styles from './backofficeToolsForm.css.js';\n\nexport type BackofficeToolsQueryBoundaryProps = {\n children: ReactNode;\n};\n\nexport const BackofficeToolsQueryBoundary = ({\n children,\n}: BackofficeToolsQueryBoundaryProps): JSX.Element => {\n const { t } = useTranslation('backofficeReact');\n\n const fallback = (\n <BackofficeDetailSection\n title={t('tools.output')}\n description={t('tools.loading.description')}\n >\n <div className={styles.loadingState} role=\"status\" aria-live=\"polite\">\n <Spinner />\n </div>\n </BackofficeDetailSection>\n );\n\n return (\n <BackofficeErrorBoundary\n fallback={({ error, reset }) => {\n return <BackofficeToolsErrorFallback error={error} onRetry={reset} />;\n }}\n >\n <Suspense fallback={fallback}>{children}</Suspense>\n </BackofficeErrorBoundary>\n );\n};\n\nexport default BackofficeToolsQueryBoundary;\n"],"mappings":";;;;;;;;;AAeA,IAAa,KAAgC,EAC3C,kBACoD;CACpD,IAAM,EAAE,SAAM,EAAe,iBAAiB;CAa9C,OACE,kBAAC,GAAD;EACE,WAAW,EAAE,UAAO,eACX,kBAAC,GAAD;GAAqC;GAAO,SAAS;EAAQ,CAAA;YAGtE,kBAAC,GAAD;GAAoB,UAhBtB,kBAAC,GAAD;IACE,OAAO,EAAE,cAAc;IACvB,aAAa,EAAE,2BAA2B;cAE1C,kBAAC,OAAD;KAAK,WAAW;KAAqB,MAAK;KAAS,aAAU;eAC3D,kBAAC,GAAD,CAAU,CAAA;IACP,CAAA;GACkB,CASH;GAAW;EAAmB,CAAA;CAC3B,CAAA;AAE7B"}
1
+ {"version":3,"file":"BackofficeToolsQueryBoundary.js","names":[],"sources":["../../../../../src/components/backoffice/tools/BackofficeToolsQueryBoundary.tsx"],"sourcesContent":["import { Suspense, type JSX, type ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { Spinner } from '@plumile/ui/backoffice/atoms/spinner/Spinner.js';\nimport { BackofficeDetailSection } from '@plumile/ui/backoffice/molecules/backoffice_detail_section/BackofficeDetailSection.js';\n\nimport { BackofficeErrorBoundary } from '../errors/BackofficeErrorBoundary.js';\n\nimport { BackofficeToolsErrorFallback } from './BackofficeToolsErrorFallback.js';\nimport * as styles from './backofficeToolsForm.css.js';\n\nexport type BackofficeToolsQueryBoundaryProps = {\n children: ReactNode;\n};\n\nexport const BackofficeToolsQueryBoundary = ({\n children,\n}: BackofficeToolsQueryBoundaryProps): JSX.Element => {\n const { t } = useTranslation('backofficeReact');\n\n const fallback = (\n <BackofficeDetailSection\n title={t('tools.output')}\n description={t('tools.loading.description')}\n >\n <div className={styles.loadingState} role=\"status\" aria-live=\"polite\">\n <Spinner />\n </div>\n </BackofficeDetailSection>\n );\n\n return (\n <BackofficeErrorBoundary\n fallback={({ error, reset }) => {\n return <BackofficeToolsErrorFallback error={error} onRetry={reset} />;\n }}\n >\n <Suspense fallback={fallback}>{children}</Suspense>\n </BackofficeErrorBoundary>\n );\n};\n\nexport default BackofficeToolsQueryBoundary;\n"],"mappings":";;;;;;;;;AAeA,IAAa,KAAgC,EAC3C,kBACoD;CACpD,IAAM,EAAE,SAAM,EAAe,iBAAiB,GAExC,IACJ,kBAAC,GAAD;EACE,OAAO,EAAE,cAAc;EACvB,aAAa,EAAE,2BAA2B;EAE1C,UAAA,kBAAC,OAAD;GAAK,WAAW;GAAqB,MAAK;GAAS,aAAU;GAC3D,UAAA,kBAAC,GAAD,CAAU,CAAA;EACP,CAAA;CACkB,CAAA;CAG3B,OACE,kBAAC,GAAD;EACE,WAAW,EAAE,UAAO,eACX,kBAAC,GAAD;GAAqC;GAAO,SAAS;EAAQ,CAAA;EAGtE,UAAA,kBAAC,GAAD;GAAoB;GAAW;EAAmB,CAAA;CAC3B,CAAA;AAE7B"}
@@ -5,7 +5,7 @@ import { require_browser as i } from "../../invariant/browser.js";
5
5
  import { require_areEqual as a } from "../../fbjs/lib/areEqual.js";
6
6
  //#region ../../node_modules/relay-test-utils/lib/RelayModernMockEnvironment.js
7
7
  var o = /* @__PURE__ */ e(((e, o) => {
8
- var s = n().default, c = s(r()), l = a(), u = i(), d = t("relay-runtime"), f = d.Environment, p = d.Network, m = d.Observable, h = d.QueryResponseCache, g = d.RecordSource, _ = d.Store, v = d.createOperationDescriptor, y = d.getRequest, b = 10, x = 300 * 1e3;
8
+ var s = n().default, c = s(r()), l = a(), u = i(), d = t("relay-runtime"), f = d.Environment, p = d.Network, m = d.Observable, h = d.QueryResponseCache, g = d.RecordSource, _ = d.Store, v = d.createOperationDescriptor, y = d.getRequest, b = 10, x = 3e5;
9
9
  function S(e, t) {
10
10
  e[t] = jest.fn(e[t].bind(e));
11
11
  }
@@ -1 +1 @@
1
- {"version":3,"file":"RelayModernMockEnvironment.js","names":["request"],"sources":["../../../../../../../node_modules/relay-test-utils/lib/RelayModernMockEnvironment.js"],"sourcesContent":["'use strict';\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\")[\"default\"];\nvar _objectSpread2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectSpread2\"));\nvar areEqual = require(\"fbjs/lib/areEqual\");\nvar invariant = require('invariant');\nvar _require = require('relay-runtime'),\n Environment = _require.Environment,\n Network = _require.Network,\n Observable = _require.Observable,\n QueryResponseCache = _require.QueryResponseCache,\n RecordSource = _require.RecordSource,\n Store = _require.Store,\n createOperationDescriptor = _require.createOperationDescriptor,\n getRequest = _require.getRequest;\nvar MAX_SIZE = 10;\nvar MAX_TTL = 5 * 60 * 1000;\nfunction mockInstanceMethod(object, key) {\n object[key] = jest.fn(object[key].bind(object));\n}\nfunction mockDisposableMethod(object, key) {\n var fn = object[key].bind(object);\n object[key] = jest.fn(function () {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n var disposable = fn.apply(void 0, args);\n var dispose = jest.fn(function () {\n return disposable.dispose();\n });\n object[key].mock.dispose = dispose;\n return {\n dispose: dispose\n };\n });\n var mockClear = object[key].mockClear.bind(object[key]);\n object[key].mockClear = function () {\n mockClear();\n object[key].mock.dispose = null;\n };\n}\nfunction mockObservableMethod(object, key) {\n var fn = object[key].bind(object);\n var subscriptions = [];\n object[key] = jest.fn(function () {\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n return fn.apply(void 0, args)[\"do\"]({\n start: function start(subscription) {\n subscriptions.push(subscription);\n }\n });\n });\n object[key].mock.subscriptions = subscriptions;\n var mockClear = object[key].mockClear.bind(object[key]);\n object[key].mockClear = function () {\n mockClear();\n object[key].mock.subscriptions = [];\n };\n}\nfunction createMockEnvironment(config) {\n var _config$store, _global, _global$process, _global$process$env;\n var store = (_config$store = config === null || config === void 0 ? void 0 : config.store) !== null && _config$store !== void 0 ? _config$store : new Store(new RecordSource());\n var cache = new QueryResponseCache({\n size: MAX_SIZE,\n ttl: MAX_TTL\n });\n var pendingRequests = [];\n var pendingOperations = [];\n var queuePendingOperation = function queuePendingOperation(query, variables) {\n var operationDescriptor = createOperationDescriptor(getRequest(query), variables);\n pendingOperations = pendingOperations.concat([operationDescriptor]);\n };\n var resolversQueue = [];\n var queueOperationResolver = function queueOperationResolver(resolver) {\n resolversQueue = resolversQueue.concat([resolver]);\n };\n var execute = function execute(request, variables, cacheConfig) {\n var id = request.id,\n text = request.text;\n var cacheID = id !== null && id !== void 0 ? id : text;\n var cachedPayload = null;\n if (((cacheConfig === null || cacheConfig === void 0 ? void 0 : cacheConfig.force) == null || (cacheConfig === null || cacheConfig === void 0 ? void 0 : cacheConfig.force) === false) && cacheID != null) {\n cachedPayload = cache.get(cacheID, variables);\n }\n if (cachedPayload !== null) {\n return Observable.from(cachedPayload);\n }\n var currentOperation = pendingOperations.find(function (op) {\n return op.request.node.params === request && areEqual(op.request.variables, variables);\n });\n if (currentOperation != null && resolversQueue.length > 0) {\n var currentResolver = resolversQueue[0];\n var result = currentResolver(currentOperation);\n if (result != null) {\n resolversQueue = resolversQueue.filter(function (res) {\n return res !== currentResolver;\n });\n pendingOperations = pendingOperations.filter(function (op) {\n return op !== currentOperation;\n });\n if (result instanceof Error) {\n return Observable.create(function (sink) {\n sink.error(result);\n });\n } else {\n return Observable.from(result);\n }\n }\n }\n return Observable.create(function (sink) {\n var nextRequest = {\n request: request,\n variables: variables,\n cacheConfig: cacheConfig,\n sink: sink\n };\n pendingRequests = pendingRequests.concat([nextRequest]);\n return function () {\n pendingRequests = pendingRequests.filter(function (pending) {\n return !areEqual(pending, nextRequest);\n });\n var currentOperation = pendingOperations.find(function (op) {\n return areEqual(op.request.node.params, request) && areEqual(op.request.variables, variables);\n });\n pendingOperations = pendingOperations.filter(function (op) {\n return op !== currentOperation;\n });\n };\n });\n };\n function getConcreteRequest(input) {\n if (input.kind === 'Request') {\n var request = input;\n return request;\n } else {\n var operationDescriptor = input;\n !pendingOperations.includes(operationDescriptor) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'RelayModernMockEnvironment: Operation \"%s\" was not found in the list of pending operations', operationDescriptor.request.node.operation.name) : invariant(false) : void 0;\n return operationDescriptor.request.node;\n }\n }\n function getRequests(input) {\n var concreteRequest;\n var operationDescriptor;\n if (input.kind === 'Request') {\n concreteRequest = input;\n } else {\n operationDescriptor = input;\n concreteRequest = operationDescriptor.request.node;\n }\n var foundRequests = pendingRequests.filter(function (pending) {\n if (!areEqual(pending.request, concreteRequest.params)) {\n return false;\n }\n if (operationDescriptor) {\n return areEqual(operationDescriptor.request.variables, pending.variables);\n } else {\n return true;\n }\n });\n !foundRequests.length ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'MockEnvironment: Cannot respond to request, it has not been requested yet.') : invariant(false) : void 0;\n foundRequests.forEach(function (foundRequest) {\n !foundRequest.sink ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'MockEnvironment: Cannot respond to `%s`, it has not been requested yet.', concreteRequest.params.name) : invariant(false) : void 0;\n });\n return foundRequests;\n }\n function ensureValidPayload(payload) {\n !(typeof payload === 'object' && payload !== null && payload.hasOwnProperty('data')) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'MockEnvironment(): Expected payload to be an object with a `data` key.') : invariant(false) : void 0;\n return payload;\n }\n var cachePayload = function cachePayload(request, variables, payload) {\n var _getConcreteRequest$p = getConcreteRequest(request).params,\n id = _getConcreteRequest$p.id,\n text = _getConcreteRequest$p.text;\n var cacheID = id !== null && id !== void 0 ? id : text;\n !(cacheID != null) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'CacheID should not be null') : invariant(false) : void 0;\n cache.set(cacheID, variables, payload);\n };\n var clearCache = function clearCache() {\n cache.clear();\n };\n var isLoading = function isLoading(request, variables, cacheConfig) {\n return pendingRequests.some(function (pending) {\n return areEqual(pending.request, getConcreteRequest(request).params) && areEqual(pending.variables, variables) && areEqual(pending.cacheConfig, cacheConfig !== null && cacheConfig !== void 0 ? cacheConfig : {});\n });\n };\n var reject = function reject(request, error) {\n var rejectError = typeof error === 'string' ? new Error(error) : error;\n getRequests(request).forEach(function (foundRequest) {\n var sink = foundRequest.sink;\n !(sink !== null) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Sink should be defined.') : invariant(false) : void 0;\n sink.error(rejectError);\n });\n };\n var nextValue = function nextValue(request, payload) {\n getRequests(request).forEach(function (foundRequest) {\n var sink = foundRequest.sink;\n !(sink !== null) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Sink should be defined.') : invariant(false) : void 0;\n sink.next(ensureValidPayload(payload));\n });\n };\n var complete = function complete(request) {\n getRequests(request).forEach(function (foundRequest) {\n var sink = foundRequest.sink;\n !(sink !== null) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Sink should be defined.') : invariant(false) : void 0;\n sink.complete();\n });\n };\n var resolve = function resolve(request, response) {\n getRequests(request).forEach(function (foundRequest) {\n var sink = foundRequest.sink;\n !(sink !== null) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Sink should be defined.') : invariant(false) : void 0;\n var payloads = Array.isArray(response) ? response : [response];\n payloads.forEach(function (payload) {\n sink.next(ensureValidPayload(payload));\n });\n sink.complete();\n });\n };\n var getMostRecentOperation = function getMostRecentOperation() {\n var mostRecentOperation = pendingOperations[pendingOperations.length - 1];\n !(mostRecentOperation != null) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'RelayModernMockEnvironment: There are no pending operations in the list') : invariant(false) : void 0;\n return mostRecentOperation;\n };\n var findOperation = function findOperation(findFn) {\n var pendingOperation = pendingOperations.find(findFn);\n !(pendingOperation != null) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'RelayModernMockEnvironment: Operation was not found in the list of pending operations') : invariant(false) : void 0;\n return pendingOperation;\n };\n var environment = new Environment((0, _objectSpread2[\"default\"])({\n configName: 'RelayModernMockEnvironment',\n network: Network.create(execute, execute),\n store: store\n }, config));\n var createExecuteProxy = function createExecuteProxy(env, fn) {\n return function () {\n for (var _len3 = arguments.length, argumentsList = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n argumentsList[_key3] = arguments[_key3];\n }\n var operation = argumentsList[0].operation;\n pendingOperations = pendingOperations.concat([operation]);\n return fn.apply(env, argumentsList);\n };\n };\n environment.execute = createExecuteProxy(environment, environment.execute);\n environment.executeSubscription = createExecuteProxy(environment, environment.executeSubscription);\n environment.executeWithSource = createExecuteProxy(environment, environment.executeWithSource);\n environment.executeMutation = createExecuteProxy(environment, environment.executeMutation);\n if (((_global = global) === null || _global === void 0 ? void 0 : (_global$process = _global.process) === null || _global$process === void 0 ? void 0 : (_global$process$env = _global$process.env) === null || _global$process$env === void 0 ? void 0 : _global$process$env.NODE_ENV) === 'test') {\n mockDisposableMethod(environment, 'applyUpdate');\n mockInstanceMethod(environment, 'commitPayload');\n mockInstanceMethod(environment, 'getStore');\n mockInstanceMethod(environment, 'lookup');\n mockInstanceMethod(environment, 'check');\n mockDisposableMethod(environment, 'subscribe');\n mockDisposableMethod(environment, 'retain');\n mockObservableMethod(environment, 'execute');\n mockObservableMethod(environment, 'executeSubscription');\n mockObservableMethod(environment, 'executeWithSource');\n mockObservableMethod(environment, 'executeMutation');\n mockInstanceMethod(store, 'getSource');\n mockInstanceMethod(store, 'lookup');\n mockInstanceMethod(store, 'notify');\n mockInstanceMethod(store, 'publish');\n mockDisposableMethod(store, 'retain');\n mockDisposableMethod(store, 'subscribe');\n }\n var mock = {\n cachePayload: cachePayload,\n clearCache: clearCache,\n isLoading: isLoading,\n reject: reject,\n resolve: resolve,\n nextValue: nextValue,\n complete: complete,\n getMostRecentOperation: getMostRecentOperation,\n resolveMostRecentOperation: function resolveMostRecentOperation(payload) {\n var operation = getMostRecentOperation();\n var data = typeof payload === 'function' ? payload(operation) : payload;\n return resolve(operation, data);\n },\n rejectMostRecentOperation: function rejectMostRecentOperation(error) {\n var operation = getMostRecentOperation();\n var rejector = typeof error === 'function' ? error(operation) : error;\n return reject(operation, rejector);\n },\n findOperation: findOperation,\n queuePendingOperation: queuePendingOperation,\n getAllOperations: function getAllOperations() {\n return pendingOperations;\n },\n queueOperationResolver: queueOperationResolver\n };\n environment.mock = mock;\n environment.mockClear = function () {\n var _store$getSource$clea, _store$getSource;\n environment.applyUpdate.mockClear();\n environment.commitPayload.mockClear();\n environment.getStore.mockClear();\n environment.lookup.mockClear();\n environment.check.mockClear();\n environment.subscribe.mockClear();\n environment.retain.mockClear();\n environment.execute.mockClear();\n environment.executeMutation.mockClear();\n environment.executeSubscription.mockClear();\n (_store$getSource$clea = (_store$getSource = store.getSource()).clear) === null || _store$getSource$clea === void 0 ? void 0 : _store$getSource$clea.call(_store$getSource);\n store.getSource.mockClear();\n store.lookup.mockClear();\n store.notify.mockClear();\n store.publish.mockClear();\n store.retain.mockClear();\n store.subscribe.mockClear();\n cache.clear();\n pendingOperations = [];\n pendingRequests = [];\n };\n return environment;\n}\nmodule.exports = {\n createMockEnvironment: createMockEnvironment\n};"],"x_google_ignoreList":[0],"mappings":"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"}
1
+ {"version":3,"file":"RelayModernMockEnvironment.js","names":["request"],"sources":["../../../../../../../node_modules/relay-test-utils/lib/RelayModernMockEnvironment.js"],"sourcesContent":["'use strict';\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\")[\"default\"];\nvar _objectSpread2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectSpread2\"));\nvar areEqual = require(\"fbjs/lib/areEqual\");\nvar invariant = require('invariant');\nvar _require = require('relay-runtime'),\n Environment = _require.Environment,\n Network = _require.Network,\n Observable = _require.Observable,\n QueryResponseCache = _require.QueryResponseCache,\n RecordSource = _require.RecordSource,\n Store = _require.Store,\n createOperationDescriptor = _require.createOperationDescriptor,\n getRequest = _require.getRequest;\nvar MAX_SIZE = 10;\nvar MAX_TTL = 5 * 60 * 1000;\nfunction mockInstanceMethod(object, key) {\n object[key] = jest.fn(object[key].bind(object));\n}\nfunction mockDisposableMethod(object, key) {\n var fn = object[key].bind(object);\n object[key] = jest.fn(function () {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n var disposable = fn.apply(void 0, args);\n var dispose = jest.fn(function () {\n return disposable.dispose();\n });\n object[key].mock.dispose = dispose;\n return {\n dispose: dispose\n };\n });\n var mockClear = object[key].mockClear.bind(object[key]);\n object[key].mockClear = function () {\n mockClear();\n object[key].mock.dispose = null;\n };\n}\nfunction mockObservableMethod(object, key) {\n var fn = object[key].bind(object);\n var subscriptions = [];\n object[key] = jest.fn(function () {\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n return fn.apply(void 0, args)[\"do\"]({\n start: function start(subscription) {\n subscriptions.push(subscription);\n }\n });\n });\n object[key].mock.subscriptions = subscriptions;\n var mockClear = object[key].mockClear.bind(object[key]);\n object[key].mockClear = function () {\n mockClear();\n object[key].mock.subscriptions = [];\n };\n}\nfunction createMockEnvironment(config) {\n var _config$store, _global, _global$process, _global$process$env;\n var store = (_config$store = config === null || config === void 0 ? void 0 : config.store) !== null && _config$store !== void 0 ? _config$store : new Store(new RecordSource());\n var cache = new QueryResponseCache({\n size: MAX_SIZE,\n ttl: MAX_TTL\n });\n var pendingRequests = [];\n var pendingOperations = [];\n var queuePendingOperation = function queuePendingOperation(query, variables) {\n var operationDescriptor = createOperationDescriptor(getRequest(query), variables);\n pendingOperations = pendingOperations.concat([operationDescriptor]);\n };\n var resolversQueue = [];\n var queueOperationResolver = function queueOperationResolver(resolver) {\n resolversQueue = resolversQueue.concat([resolver]);\n };\n var execute = function execute(request, variables, cacheConfig) {\n var id = request.id,\n text = request.text;\n var cacheID = id !== null && id !== void 0 ? id : text;\n var cachedPayload = null;\n if (((cacheConfig === null || cacheConfig === void 0 ? void 0 : cacheConfig.force) == null || (cacheConfig === null || cacheConfig === void 0 ? void 0 : cacheConfig.force) === false) && cacheID != null) {\n cachedPayload = cache.get(cacheID, variables);\n }\n if (cachedPayload !== null) {\n return Observable.from(cachedPayload);\n }\n var currentOperation = pendingOperations.find(function (op) {\n return op.request.node.params === request && areEqual(op.request.variables, variables);\n });\n if (currentOperation != null && resolversQueue.length > 0) {\n var currentResolver = resolversQueue[0];\n var result = currentResolver(currentOperation);\n if (result != null) {\n resolversQueue = resolversQueue.filter(function (res) {\n return res !== currentResolver;\n });\n pendingOperations = pendingOperations.filter(function (op) {\n return op !== currentOperation;\n });\n if (result instanceof Error) {\n return Observable.create(function (sink) {\n sink.error(result);\n });\n } else {\n return Observable.from(result);\n }\n }\n }\n return Observable.create(function (sink) {\n var nextRequest = {\n request: request,\n variables: variables,\n cacheConfig: cacheConfig,\n sink: sink\n };\n pendingRequests = pendingRequests.concat([nextRequest]);\n return function () {\n pendingRequests = pendingRequests.filter(function (pending) {\n return !areEqual(pending, nextRequest);\n });\n var currentOperation = pendingOperations.find(function (op) {\n return areEqual(op.request.node.params, request) && areEqual(op.request.variables, variables);\n });\n pendingOperations = pendingOperations.filter(function (op) {\n return op !== currentOperation;\n });\n };\n });\n };\n function getConcreteRequest(input) {\n if (input.kind === 'Request') {\n var request = input;\n return request;\n } else {\n var operationDescriptor = input;\n !pendingOperations.includes(operationDescriptor) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'RelayModernMockEnvironment: Operation \"%s\" was not found in the list of pending operations', operationDescriptor.request.node.operation.name) : invariant(false) : void 0;\n return operationDescriptor.request.node;\n }\n }\n function getRequests(input) {\n var concreteRequest;\n var operationDescriptor;\n if (input.kind === 'Request') {\n concreteRequest = input;\n } else {\n operationDescriptor = input;\n concreteRequest = operationDescriptor.request.node;\n }\n var foundRequests = pendingRequests.filter(function (pending) {\n if (!areEqual(pending.request, concreteRequest.params)) {\n return false;\n }\n if (operationDescriptor) {\n return areEqual(operationDescriptor.request.variables, pending.variables);\n } else {\n return true;\n }\n });\n !foundRequests.length ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'MockEnvironment: Cannot respond to request, it has not been requested yet.') : invariant(false) : void 0;\n foundRequests.forEach(function (foundRequest) {\n !foundRequest.sink ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'MockEnvironment: Cannot respond to `%s`, it has not been requested yet.', concreteRequest.params.name) : invariant(false) : void 0;\n });\n return foundRequests;\n }\n function ensureValidPayload(payload) {\n !(typeof payload === 'object' && payload !== null && payload.hasOwnProperty('data')) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'MockEnvironment(): Expected payload to be an object with a `data` key.') : invariant(false) : void 0;\n return payload;\n }\n var cachePayload = function cachePayload(request, variables, payload) {\n var _getConcreteRequest$p = getConcreteRequest(request).params,\n id = _getConcreteRequest$p.id,\n text = _getConcreteRequest$p.text;\n var cacheID = id !== null && id !== void 0 ? id : text;\n !(cacheID != null) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'CacheID should not be null') : invariant(false) : void 0;\n cache.set(cacheID, variables, payload);\n };\n var clearCache = function clearCache() {\n cache.clear();\n };\n var isLoading = function isLoading(request, variables, cacheConfig) {\n return pendingRequests.some(function (pending) {\n return areEqual(pending.request, getConcreteRequest(request).params) && areEqual(pending.variables, variables) && areEqual(pending.cacheConfig, cacheConfig !== null && cacheConfig !== void 0 ? cacheConfig : {});\n });\n };\n var reject = function reject(request, error) {\n var rejectError = typeof error === 'string' ? new Error(error) : error;\n getRequests(request).forEach(function (foundRequest) {\n var sink = foundRequest.sink;\n !(sink !== null) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Sink should be defined.') : invariant(false) : void 0;\n sink.error(rejectError);\n });\n };\n var nextValue = function nextValue(request, payload) {\n getRequests(request).forEach(function (foundRequest) {\n var sink = foundRequest.sink;\n !(sink !== null) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Sink should be defined.') : invariant(false) : void 0;\n sink.next(ensureValidPayload(payload));\n });\n };\n var complete = function complete(request) {\n getRequests(request).forEach(function (foundRequest) {\n var sink = foundRequest.sink;\n !(sink !== null) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Sink should be defined.') : invariant(false) : void 0;\n sink.complete();\n });\n };\n var resolve = function resolve(request, response) {\n getRequests(request).forEach(function (foundRequest) {\n var sink = foundRequest.sink;\n !(sink !== null) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Sink should be defined.') : invariant(false) : void 0;\n var payloads = Array.isArray(response) ? response : [response];\n payloads.forEach(function (payload) {\n sink.next(ensureValidPayload(payload));\n });\n sink.complete();\n });\n };\n var getMostRecentOperation = function getMostRecentOperation() {\n var mostRecentOperation = pendingOperations[pendingOperations.length - 1];\n !(mostRecentOperation != null) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'RelayModernMockEnvironment: There are no pending operations in the list') : invariant(false) : void 0;\n return mostRecentOperation;\n };\n var findOperation = function findOperation(findFn) {\n var pendingOperation = pendingOperations.find(findFn);\n !(pendingOperation != null) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'RelayModernMockEnvironment: Operation was not found in the list of pending operations') : invariant(false) : void 0;\n return pendingOperation;\n };\n var environment = new Environment((0, _objectSpread2[\"default\"])({\n configName: 'RelayModernMockEnvironment',\n network: Network.create(execute, execute),\n store: store\n }, config));\n var createExecuteProxy = function createExecuteProxy(env, fn) {\n return function () {\n for (var _len3 = arguments.length, argumentsList = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n argumentsList[_key3] = arguments[_key3];\n }\n var operation = argumentsList[0].operation;\n pendingOperations = pendingOperations.concat([operation]);\n return fn.apply(env, argumentsList);\n };\n };\n environment.execute = createExecuteProxy(environment, environment.execute);\n environment.executeSubscription = createExecuteProxy(environment, environment.executeSubscription);\n environment.executeWithSource = createExecuteProxy(environment, environment.executeWithSource);\n environment.executeMutation = createExecuteProxy(environment, environment.executeMutation);\n if (((_global = global) === null || _global === void 0 ? void 0 : (_global$process = _global.process) === null || _global$process === void 0 ? void 0 : (_global$process$env = _global$process.env) === null || _global$process$env === void 0 ? void 0 : _global$process$env.NODE_ENV) === 'test') {\n mockDisposableMethod(environment, 'applyUpdate');\n mockInstanceMethod(environment, 'commitPayload');\n mockInstanceMethod(environment, 'getStore');\n mockInstanceMethod(environment, 'lookup');\n mockInstanceMethod(environment, 'check');\n mockDisposableMethod(environment, 'subscribe');\n mockDisposableMethod(environment, 'retain');\n mockObservableMethod(environment, 'execute');\n mockObservableMethod(environment, 'executeSubscription');\n mockObservableMethod(environment, 'executeWithSource');\n mockObservableMethod(environment, 'executeMutation');\n mockInstanceMethod(store, 'getSource');\n mockInstanceMethod(store, 'lookup');\n mockInstanceMethod(store, 'notify');\n mockInstanceMethod(store, 'publish');\n mockDisposableMethod(store, 'retain');\n mockDisposableMethod(store, 'subscribe');\n }\n var mock = {\n cachePayload: cachePayload,\n clearCache: clearCache,\n isLoading: isLoading,\n reject: reject,\n resolve: resolve,\n nextValue: nextValue,\n complete: complete,\n getMostRecentOperation: getMostRecentOperation,\n resolveMostRecentOperation: function resolveMostRecentOperation(payload) {\n var operation = getMostRecentOperation();\n var data = typeof payload === 'function' ? payload(operation) : payload;\n return resolve(operation, data);\n },\n rejectMostRecentOperation: function rejectMostRecentOperation(error) {\n var operation = getMostRecentOperation();\n var rejector = typeof error === 'function' ? error(operation) : error;\n return reject(operation, rejector);\n },\n findOperation: findOperation,\n queuePendingOperation: queuePendingOperation,\n getAllOperations: function getAllOperations() {\n return pendingOperations;\n },\n queueOperationResolver: queueOperationResolver\n };\n environment.mock = mock;\n environment.mockClear = function () {\n var _store$getSource$clea, _store$getSource;\n environment.applyUpdate.mockClear();\n environment.commitPayload.mockClear();\n environment.getStore.mockClear();\n environment.lookup.mockClear();\n environment.check.mockClear();\n environment.subscribe.mockClear();\n environment.retain.mockClear();\n environment.execute.mockClear();\n environment.executeMutation.mockClear();\n environment.executeSubscription.mockClear();\n (_store$getSource$clea = (_store$getSource = store.getSource()).clear) === null || _store$getSource$clea === void 0 ? void 0 : _store$getSource$clea.call(_store$getSource);\n store.getSource.mockClear();\n store.lookup.mockClear();\n store.notify.mockClear();\n store.publish.mockClear();\n store.retain.mockClear();\n store.subscribe.mockClear();\n cache.clear();\n pendingOperations = [];\n pendingRequests = [];\n };\n return environment;\n}\nmodule.exports = {\n createMockEnvironment: createMockEnvironment\n};"],"x_google_ignoreList":[0],"mappings":"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"}