@panneau/lists 5.0.0-alpha.20 → 5.0.0-alpha.22

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 (36) hide show
  1. package/dist/ListView.d.ts +6 -1
  2. package/dist/ListView.d.ts.map +1 -1
  3. package/dist/ListView.js +281 -248
  4. package/dist/ListView.js.map +1 -1
  5. package/dist/displays/displays.js +1 -1
  6. package/dist/filters/controls.d.ts.map +1 -1
  7. package/dist/filters/controls.js +4 -2
  8. package/dist/filters/controls.js.map +1 -1
  9. package/dist/images.d.ts +1 -6
  10. package/dist/images.d.ts.map +1 -1
  11. package/dist/images.js +1 -39
  12. package/dist/index.js +1 -1
  13. package/dist/inline/InlineCell.js +1 -1
  14. package/dist/layouts/CalendarLayout.d.ts +1 -1
  15. package/dist/layouts/CalendarLayout.d.ts.map +1 -1
  16. package/dist/layouts/CalendarLayout.js +75 -71
  17. package/dist/layouts/CalendarLayout.js.map +1 -1
  18. package/dist/layouts/CardsLayout.d.ts +1 -1
  19. package/dist/layouts/CardsLayout.d.ts.map +1 -1
  20. package/dist/layouts/CardsLayout.js +6 -2
  21. package/dist/layouts/CardsLayout.js.map +1 -1
  22. package/dist/layouts/GalleryLayout.d.ts +1 -1
  23. package/dist/layouts/GalleryLayout.d.ts.map +1 -1
  24. package/dist/layouts/GalleryLayout.js +49 -43
  25. package/dist/layouts/GalleryLayout.js.map +1 -1
  26. package/dist/layouts/TableLayout.d.ts +1 -1
  27. package/dist/layouts/TableLayout.d.ts.map +1 -1
  28. package/dist/layouts/TableLayout.js +53 -47
  29. package/dist/layouts/TableLayout.js.map +1 -1
  30. package/dist/layouts/highlight.css +28 -0
  31. package/dist/layouts/highlight.module.js +12 -0
  32. package/dist/layouts/highlight.module.js.map +1 -0
  33. package/dist/types.d.ts +5 -0
  34. package/dist/types.d.ts.map +1 -1
  35. package/package.json +7 -7
  36. package/dist/images.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ListView.js","names":["ReactNode","useRef","useState","List","ResolvedCalendar","asksConfirmation","currentMonth","formatRuleFailure","selectItemActions","usePlugins","getActionLabel","Action","Field","Filter","RuleFailure","Alert","Button","Checkbox","usePanneauIntl","useToast","ListSkeleton","styles","ActionButton","ConfirmDialog","ConfirmPreview","needsConfirmation","RowActions","orderRowActions","ListActions","getActionHref","groupListActions","hasScope","isAllowedOn","ActionIcons","getShownColumns","cx","FilterChips","FilterControls","useFilterLabels","getImageUrl","InlineCell","getInlineField","builtInLayouts","getCalendarTimeZone","messages","countSelected","getPageSelection","isItemSelected","ColumnMenu","LayoutSwitch","CursorPagination","Pagination","SearchField","SortSelect","DisplayEntry","FilterEntry","ListActionEvent","ListActionHandler","ListActionPreviewer","ListColumn","ListInlineEditHandler","ListItem","ListLayoutEntry","useListState","useRenderValue","getColumnValue","toText","ListViewProps","list","items","columns","columnChoice","total","cursors","next","previous","isLoading","error","Error","onRetry","filters","fields","search","layouts","layout","onLayoutChange","perPageOptions","selectable","actions","onAction","previewAction","actionIcons","itemTitle","itemImage","calendar","Pick","primaryAction","getItemLabel","item","getItemHref","getLinkHref","action","currentItemId","displays","Readonly","Record","layoutComponents","filterControls","inlineEdit","onInlineEdit","formatError","failure","path","toolbar","emptyMessage","className","keyOf","undefined","id","ListView","t0","$","_c","allColumns","t1","t2","t3","t4","t5","t6","t7","controlledLayout","selectableProp","actionsProp","t8","primaryActionProp","getItemLabelProp","t9","t10","t11","ariaLabel","t12","filtersProp","layoutsProp","intl","toasts","plugins","query","view","selection","filterLabels","confirming","setConfirming","preview","setPreview","confirmation","pending","setPending","t13","Symbol","for","saved","setSaved","t14","base","find","candidate","current","showItem","t15","formatMessage","label","t16","item_0","pageItems","map","count","length","t17","sort","t18","listLayouts","Object","fromEntries","t19","t20","allLayouts","t21","available","filter","chosenLayout","includes","Layout","table","inCalendar","t22","t23","entries","t24","id_0","filterValues","q","keys","hasQuery","grouped","toolbarActions","menu","_temp","selectionActions","_temp2","resourceActions","_temp3","selectedCount","t25","item_1","selectedItems","pageSelection","item_2","titleColumn","column","title","locale","renderValue","renderCell","item_3","column_0","content","field","current_0","base_0","value","name","closeConfirmation","execute","event","Promise","resolve","then","outcome","scope","clearSelection","catch","caught","show","actionFailed","message","description","tone","run","event_0","action_2","selection_0","dryRun","current_1","asks","confirm","status","result","skipped","Math","max","runOnItem","action_3","item_4","runOnSelection","action_4","selected","getSelection","item_5","runOnResource","action_5","pageActions","item_6","row","firstOf","action_6","flat","entry","slots","flatMap","id_1","some","slot","renderActions","item_7","allowed","running","endsWith","split","action_7","t26","selectPage","pageCheckbox","ids","_temp4","deselect","select","sortable","_temp5","choosesColumns","showToolbar","t27","clearFilters","forEach","id_2","setFilter","setSearch","t28","bb0","t29","loadFailed","t30","retry","t31","perPage","noResults","empty","t32","state","item_9","item_10","item_11","item_12","toggle","t33","column_3","toggleSort","timeZone","_temp6","field_0","month","onMonthChange","setMonth","more","body","toolbarStart","id_3","value_0","remember","labels","toolbarEnd","tableSort","setSort","next_0","setLayout","ids_0","setColumns","resetColumns","action_8","action_9","id_4","t34","selectionCount","mode","allMatchingSelected","selectAllMatching","action_10","skipped_0","item_13","t35","t36","t37","cursor","page","previousPage","nextPage","setPerPage","setPage","perPage_0","t38","event_1","t39","t40","column_2","column_1","item_8","action_1","action_0","index","all","findIndex","candidate_0","_c","styles"],"sources":["../src/ListView.tsx"],"sourcesContent":["import { type ReactNode, useRef, useState } from 'react';\n\nimport type { List, ResolvedCalendar } from '@panneau/core';\nimport {\n asksConfirmation,\n currentMonth,\n formatRuleFailure,\n selectItemActions,\n usePlugins,\n} from '@panneau/core';\nimport { getActionLabel } from '@panneau/intl';\nimport type { Action, Field, Filter, RuleFailure } from '@panneau/protocol';\nimport { Alert, Button, Checkbox, usePanneauIntl, useToast } from '@panneau/ui';\n\nimport { ListSkeleton } from './ListSkeleton';\nimport styles from './ListView.module.css';\nimport { ActionButton } from './actions/ActionButton';\nimport { ConfirmDialog, type ConfirmPreview, needsConfirmation } from './actions/ConfirmDialog';\nimport { RowActions, orderRowActions } from './actions/RowActions';\nimport {\n type ListActions,\n getActionHref,\n groupListActions,\n hasScope,\n isAllowedOn,\n} from './actions/actions';\nimport type { ActionIcons } from './actions/icons';\nimport { getShownColumns } from './columns';\nimport { cx } from './cx';\nimport { FilterChips, FilterControls, useFilterLabels } from './filters/Filters';\nimport { getImageUrl } from './images';\nimport { InlineCell } from './inline/InlineCell';\nimport { getInlineField } from './inline/editable';\nimport { builtInLayouts } from './layouts/builtIn';\nimport { getCalendarTimeZone } from './layouts/calendarDays';\nimport { messages } from './messages';\nimport { countSelected, getPageSelection, isItemSelected } from './selection';\nimport { ColumnMenu } from './toolbar/ColumnMenu';\nimport { LayoutSwitch } from './toolbar/LayoutSwitch';\nimport { CursorPagination, Pagination } from './toolbar/Pagination';\nimport { SearchField } from './toolbar/SearchField';\nimport { SortSelect } from './toolbar/SortSelect';\nimport type {\n DisplayEntry,\n FilterEntry,\n ListActionEvent,\n ListActionHandler,\n ListActionPreviewer,\n ListColumn,\n ListInlineEditHandler,\n ListItem,\n ListLayoutEntry,\n} from './types';\nimport { useListState } from './useListState';\nimport { useRenderValue } from './useRenderValue';\nimport { getColumnValue, toText } from './values';\n\nexport interface ListViewProps {\n /** The list state of `@panneau/core` (`useList()`): query and selection. */\n list: List;\n /**\n * The items of the current page. `undefined` while they load for the first time: the list\n * draws a skeleton of its rows, from its columns and its page size.\n */\n items: readonly ListItem[] | undefined;\n /**\n * Every column of the list. Those with `hidden` are shown when the user chooses them, from\n * the \"Columns\" menu, and the view of the list state says which ones are shown (decision 0042).\n */\n columns: readonly ListColumn[];\n /** Offers the user to show, hide and order the columns. Defaults to `true`. */\n columnChoice?: boolean;\n /**\n * How many items match the query, on every page (`meta.total`). With it, the list shows\n * pagination and offers to select every matching item. Without it, `items` is the whole list.\n */\n total?: number | undefined;\n /**\n * The cursors of the page, for a list paged with cursors (`nextCursor` and `previousCursor`\n * of its `meta`): the list then has buttons to the previous and next pages, without page\n * numbers or a total, and doesn't offer to select every matching item.\n */\n cursors?: { next: string | null; previous?: string | null | undefined } | undefined;\n /** Shows that items are loading. Items already shown stay, dimmed. */\n isLoading?: boolean;\n /** An error while loading: an alert with a retry replaces the items. */\n error?: Error | null;\n onRetry?: () => void;\n /** Filter controls, with chips for the active filters. */\n filters?: readonly Filter[];\n /** Fields of the items, for the labels and options of filters that are not columns. */\n fields?: readonly Field[];\n /** Shows a search field (`q`). */\n search?: boolean;\n /** Layouts to choose from, the first one being the default. Defaults to `['table']`. */\n layouts?: readonly string[];\n /** The layout, controlled. Without it, the layout is the view of the list state. */\n layout?: string;\n onLayoutChange?: (layout: string) => void;\n /** Page sizes to choose from. */\n perPageOptions?: readonly number[];\n /** Shows checkboxes. Defaults to whether there are selection actions. */\n selectable?: boolean;\n /**\n * Actions: a list (placed by their `placement`, or by scope), or grouped by placement as\n * `resolveList()` does. Those the user can't run (`abilities.run`) are hidden.\n */\n actions?: ListActions;\n /** Runs an action, after its confirmation. */\n onAction?: ListActionHandler;\n /**\n * Asks the backend how many items of a query selection (\"Select all N items\") an action will\n * skip, before the confirmation: the list only knows the abilities of the current page. Only\n * for actions with `dryRun`. `useActionPreview()` of `@panneau/actions` is one.\n */\n previewAction?: ListActionPreviewer;\n /**\n * Icons of actions by action id (`{ archive: Archive }`), for actions written in code. They\n * win over the Lucide icon an action names (`\"icon\": \"archive\"`).\n */\n actionIcons?: ActionIcons;\n /** The field that titles items, for their label (`itemTitle` of the resource). */\n itemTitle?: string;\n /**\n * The field shown as the image of items (`itemImage` of the resource, or `media` in a media\n * library): a media reference, a media, a file or a URL. The `gallery` layout needs it\n * (decision 0044), and the table starts each title with its thumbnail (decision 0061).\n */\n itemImage?: string | undefined;\n /**\n * The calendar of the list (`calendar` of `resolveList()`), for its `calendar` layout. The list\n * state asks for its month when it is given the same calendar.\n */\n calendar?: Pick<ResolvedCalendar, 'field' | 'filter'> | null | undefined;\n /**\n * The id of the main action of rows, which keeps its label while the others show their icons\n * (decision 0060): the one the title of an item opens, `edit` for a resource that opens its\n * items in their form. Defaults to `show` when rows have it, else `edit`.\n */\n primaryAction?: string | null;\n /** The label of an item, for checkboxes and actions. Defaults to its title, then its id. */\n getItemLabel?: (item: ListItem) => string;\n /** A link to an item, on its title. */\n getItemHref?: (item: ListItem) => string | null;\n /**\n * The link of a built-in `show` or `edit` action without a `url` or a `route` (decision 0040),\n * which the caller resolves to its own routes. Without it, or when it answers `null`, the list\n * leaves those links out.\n */\n getLinkHref?: (action: Action, item: ListItem) => string | null;\n /**\n * The item shown next to the list, such as in a panel of its details: its row is marked, and\n * the link of its title is the current page.\n */\n currentItemId?: string | null;\n /** Displays by name, over the built-in ones and those of the plugins. */\n displays?: Readonly<Record<string, DisplayEntry>>;\n /** Layouts by id, over the built-in ones and those of the plugins. */\n layoutComponents?: Readonly<Record<string, ListLayoutEntry>>;\n /** Filter controls by filter type, over the built-in ones. */\n filterControls?: Readonly<Record<string, FilterEntry>>;\n /**\n * The fields that columns edit in place (`inlineEdit` of the list), on the items that can be\n * updated, in the table (decision 0043). Needs `onInlineEdit`.\n */\n inlineEdit?: readonly string[];\n /** Saves a field edited in place, and resolves with the updated item. */\n onInlineEdit?: ListInlineEditHandler;\n /**\n * The message of a portable rule that a value edited in place fails. Defaults to\n * `formatRuleFailure()` of `@panneau/core`, in English; `useFormatRuleFailure()` of\n * `@panneau/forms` translates them.\n */\n formatError?: (failure: RuleFailure, path: string) => string;\n /** Content at the end of the toolbar, such as a button to create an item. */\n toolbar?: ReactNode;\n /** Shown when the list has no items, without filters or search. */\n emptyMessage?: ReactNode;\n /** Accessible name of the list. Defaults to \"Items\". */\n 'aria-label'?: string;\n className?: string;\n}\n\nfunction keyOf(action: Action, item?: ListItem): string {\n return item !== undefined ? `${action.id}\\u0000${item.id}` : action.id;\n}\n\n/**\n * Renders the list state of `@panneau/core`: the items of the current page in a layout (table or\n * cards), with sorting, search, filters and their chips, pagination, selection and actions. It\n * fetches nothing: the caller gives the items of the list's query and their total.\n */\nexport function ListView({\n list,\n items,\n columns: allColumns,\n columnChoice = true,\n total,\n cursors,\n isLoading = false,\n error = null,\n onRetry,\n filters: filtersProp = [],\n fields = [],\n search = false,\n layouts: layoutsProp = ['table'],\n layout: controlledLayout,\n onLayoutChange,\n perPageOptions,\n selectable: selectableProp,\n actions: actionsProp,\n onAction,\n previewAction,\n actionIcons,\n itemTitle,\n itemImage,\n calendar = null,\n primaryAction: primaryActionProp,\n getItemLabel: getItemLabelProp,\n getItemHref,\n getLinkHref,\n currentItemId = null,\n displays,\n layoutComponents,\n filterControls,\n inlineEdit = [],\n onInlineEdit,\n formatError = formatRuleFailure,\n toolbar,\n emptyMessage,\n 'aria-label': ariaLabel,\n className,\n}: ListViewProps) {\n const intl = usePanneauIntl();\n const toasts = useToast();\n const plugins = usePlugins();\n const { query, view, selection } = useListState(list);\n const filterLabels = useFilterLabels();\n const [confirming, setConfirming] = useState<ListActionEvent | null>(null);\n const [preview, setPreview] = useState<ConfirmPreview | null>(null);\n // The confirmation a dry run belongs to: a later one, or a cancel, discards its answer.\n const confirmation = useRef(0);\n const [pending, setPending] = useState<string | null>(null);\n\n // Items saved in place, over the item the caller gave, until it gives another one.\n const [saved, setSaved] = useState<\n Readonly<Record<string, { base: ListItem; item: ListItem }>>\n >({});\n const showItem = (item: ListItem) => {\n const base = items?.find((candidate) => candidate.id === item.id);\n if (base !== undefined) {\n setSaved((current) => ({ ...current, [item.id]: { base, item } }));\n }\n };\n\n const label = ariaLabel ?? intl.formatMessage(messages.list);\n const pageItems = (items ?? []).map((item) =>\n saved[item.id]?.base === item ? (saved[item.id]?.item ?? item) : item,\n );\n const count = total ?? pageItems.length;\n const sort = query.sort ?? [];\n\n const allLayouts: Record<string, ListLayoutEntry> = {\n ...builtInLayouts,\n ...(Object.fromEntries(plugins.listLayouts) as Record<string, ListLayoutEntry>),\n ...layoutComponents,\n };\n // Layouts without a component (a plugin's that isn't installed) are left out, and so are the\n // gallery without images and the calendar without a calendar.\n const available = layoutsProp.filter(\n (id) =>\n allLayouts[id] !== undefined &&\n (id !== 'gallery' || itemImage !== undefined) &&\n (id !== 'calendar' || calendar !== null),\n );\n const layouts = available.length > 0 ? available : ['table'];\n const chosenLayout =\n view.layout !== undefined && layouts.includes(view.layout) ? view.layout : undefined;\n const layout = controlledLayout ?? chosenLayout ?? layouts[0] ?? 'table';\n const columns = getShownColumns(allColumns, view.columns);\n const Layout = allLayouts[layout] ?? builtInLayouts.table;\n const inCalendar = layout === 'calendar' && calendar !== null;\n // The calendar asks for its month through its filter, which it sets itself.\n const filters = inCalendar\n ? filtersProp.filter((filter) => filter.id !== calendar.filter)\n : filtersProp;\n const filterValues = Object.fromEntries(\n Object.entries(query.filter ?? {}).filter(\n ([id]) => !(inCalendar && id === calendar.filter),\n ),\n );\n const hasQuery = Object.keys(filterValues).length > 0 || (query.q ?? '') !== '';\n\n const grouped = groupListActions(actionsProp);\n // Actions placed in the menu also apply to selections, from the toolbar (once each).\n const toolbarActions = [...grouped.toolbar, ...grouped.menu].filter(\n (action, index, all) =>\n (hasScope(action, 'selection') || hasScope(action, 'resource')) &&\n all.findIndex((candidate) => candidate.id === action.id) === index,\n );\n const selectionActions = toolbarActions.filter((action) => hasScope(action, 'selection'));\n const resourceActions = toolbarActions.filter((action) => hasScope(action, 'resource'));\n const selectable = selectableProp ?? selectionActions.length > 0;\n\n const selectedCount = selectable ? countSelected(selection, count) : 0;\n const selectedItems = pageItems.filter((item) => isItemSelected(selection, item.id));\n const pageSelection = getPageSelection(selection, pageItems);\n\n const getItemLabel = (item: ListItem): string => {\n if (getItemLabelProp !== undefined) {\n return getItemLabelProp(item);\n }\n const titleColumn =\n allColumns.find((column) => column.id === itemTitle) ??\n (itemTitle === undefined ? columns[0] : undefined);\n const title =\n titleColumn !== undefined\n ? toText(getColumnValue(item, titleColumn, intl.locale), intl.locale)\n : itemTitle !== undefined\n ? toText(item[itemTitle], intl.locale)\n : '';\n return title !== '' ? title : item.id;\n };\n\n const renderValue = useRenderValue(displays);\n\n const renderCell = (item: ListItem, column: ListColumn, content: ReactNode): ReactNode => {\n const field = onInlineEdit !== undefined ? getInlineField(column, item, inlineEdit) : null;\n if (field === null || onInlineEdit === undefined) {\n return content;\n }\n return (\n <InlineCell\n key={`${item.id}\\u0000${column.id}`}\n item={item}\n field={field}\n itemLabel={getItemLabel(item)}\n getItemLabel={getItemLabel}\n renderValue={(current) => renderValue(current, column)}\n onSave={(base, value) => onInlineEdit({ item: base, field, value })}\n onItem={showItem}\n formatError={(failure) => formatError(failure, field.name)}\n >\n {content}\n </InlineCell>\n );\n };\n\n const closeConfirmation = () => {\n confirmation.current += 1;\n setConfirming(null);\n setPreview(null);\n };\n\n const execute = async (event: ListActionEvent) => {\n closeConfirmation();\n setPending(keyOf(event.action, event.item));\n // A promise chain rather than `try`, which the React Compiler only handles in part.\n await Promise.resolve()\n .then(() => onAction?.(event))\n .then((outcome) => {\n // `false`: the action didn't run (its parameters were cancelled).\n if (event.scope === 'selection' && outcome !== false) {\n list.clearSelection();\n }\n })\n .catch((caught: unknown) => {\n toasts.show({\n title: intl.formatMessage(messages.actionFailed, {\n action: getActionLabel(event.action, intl),\n }),\n ...(caught instanceof Error && caught.message !== ''\n ? { description: caught.message }\n : {}),\n tone: 'danger',\n });\n });\n setPending(null);\n };\n\n const run = (event: ListActionEvent) => {\n const { action, selection } = event;\n if (\n previewAction !== undefined &&\n action.dryRun === true &&\n selection !== undefined &&\n 'query' in selection\n ) {\n // Every item matching a query: only the backend knows how many it would skip.\n const current = ++confirmation.current;\n const asks = action.confirm !== undefined && action.confirm !== false;\n setConfirming(event);\n setPreview({ status: 'loading' });\n previewAction(event).then(\n (result) => {\n if (confirmation.current !== current) {\n return;\n }\n const skipped = result?.skipped ?? event.skipped.length;\n // An undoable action asks above the limit of the undo, counted without the\n // items it skips (decision 0063).\n if (\n skipped === 0 &&\n !asks &&\n !asksConfirmation(action, Math.max(0, event.count - skipped))\n ) {\n void execute(event);\n } else {\n setPreview(result !== null ? { status: 'done', ...result } : null);\n }\n },\n () => {\n // Without an answer, the list confirms with what it knows.\n if (confirmation.current !== current) {\n return;\n }\n if (needsConfirmation(event)) {\n setPreview(null);\n } else {\n void execute(event);\n }\n },\n );\n return;\n }\n if (needsConfirmation(event)) {\n setConfirming(event);\n } else {\n void execute(event);\n }\n };\n\n const runOnItem = (action: Action, item: ListItem) =>\n run({ action, scope: 'item', item, count: 1, skipped: [] });\n\n const runOnSelection = (action: Action) => {\n const selected = list.getSelection();\n if (selected === null) {\n return;\n }\n run({\n action,\n scope: 'selection',\n selection: selected,\n count: selectedCount,\n skipped: selectedItems.filter((item) => !isAllowedOn(action, item)),\n });\n };\n\n const runOnResource = (action: Action) =>\n run({ action, scope: 'resource', count: count, skipped: [] });\n\n // The actions of the rows of the page, in order: each row keeps the place of those it doesn't\n // have, so they line up (decision 0060).\n const pageActions = pageItems.map((item) => [\n ...selectItemActions(grouped.row, item, 'row', { getLinkHref }),\n ...selectItemActions(grouped.menu, item, 'menu', { getLinkHref }),\n ]);\n const firstOf = (action: Action) =>\n pageActions.flat().find((entry) => entry.action.id === action.id) ?? [];\n const slots = orderRowActions(grouped.row.flatMap(firstOf), grouped.menu.flatMap(firstOf));\n const primaryAction =\n primaryActionProp !== undefined\n ? primaryActionProp\n : (['show', 'edit'].find((id) => slots.some((slot) => slot.action.id === id)) ?? null);\n\n // The actions of a row and of its menu, as everywhere else an item shows its actions\n const renderActions = (item: ListItem): ReactNode => {\n const allowed = selectItemActions(grouped.row, item, 'row', { getLinkHref });\n const menu = selectItemActions(grouped.menu, item, 'menu', { getLinkHref });\n if (allowed.length === 0 && menu.length === 0) {\n return null;\n }\n const running =\n pending?.endsWith(`\\u0000${item.id}`) === true ? pending.split('\\u0000')[0] : null;\n return (\n <RowActions\n itemLabel={getItemLabel(item)}\n actions={allowed}\n menu={menu}\n pending={running ?? null}\n onRun={(action) => runOnItem(action, item)}\n icons={actionIcons}\n slots={slots}\n primary={primaryAction}\n />\n );\n };\n\n const pageCheckbox = (\n <Checkbox\n aria-label={intl.formatMessage(messages.selectPage)}\n isSelected={pageSelection === 'all'}\n isIndeterminate={pageSelection === 'some'}\n isDisabled={pageItems.length === 0}\n onChange={() => {\n const ids = pageItems.map((item) => item.id);\n if (pageSelection === 'all') {\n list.deselect(ids);\n } else {\n list.select(ids);\n }\n }}\n />\n );\n\n const sortable = allColumns.some((column) => column.sortable === true);\n const choosesColumns = columnChoice && allColumns.length > 1;\n const showToolbar =\n search ||\n filters.length > 0 ||\n sortable ||\n choosesColumns ||\n layouts.length > 1 ||\n resourceActions.length > 0 ||\n toolbar !== undefined;\n\n function clearFilters() {\n Object.keys(filterValues).forEach((id) => list.setFilter(id, undefined));\n if ((query.q ?? '') !== '') {\n list.setSearch('');\n }\n }\n\n const body = (() => {\n if (error !== null) {\n return (\n <Alert\n tone=\"danger\"\n title={intl.formatMessage(messages.loadFailed)}\n actions={\n onRetry !== undefined ? (\n <Button size=\"sm\" onPress={onRetry}>\n {intl.formatMessage(messages.retry)}\n </Button>\n ) : undefined\n }\n >\n {error.message}\n </Alert>\n );\n }\n if (items === undefined) {\n return (\n <ListSkeleton\n Layout={Layout}\n columns={columns}\n perPage={query.perPage}\n sort={sort}\n label={label}\n withImages={itemImage !== undefined}\n />\n );\n }\n // An empty month is still a calendar: it goes to the others.\n if (pageItems.length === 0 && !inCalendar) {\n return (\n <div className={styles.state}>\n <p>\n {hasQuery\n ? intl.formatMessage(messages.noResults)\n : (emptyMessage ?? intl.formatMessage(messages.empty))}\n </p>\n {hasQuery ? (\n <Button size=\"sm\" onPress={() => clearFilters()}>\n {intl.formatMessage(messages.clearFilters)}\n </Button>\n ) : null}\n </div>\n );\n }\n return (\n <Layout\n items={pageItems}\n columns={columns}\n renderValue={renderValue}\n getItemLabel={getItemLabel}\n getItemHref={getItemHref}\n getItemImage={\n itemImage !== undefined ? (item) => getImageUrl(item[itemImage]) : undefined\n }\n calendar={\n inCalendar\n ? {\n field: calendar.field,\n timeZone: getCalendarTimeZone(\n [...fields, ...allColumns.map((column) => column.field)].find(\n (field) => field?.name === calendar.field,\n ),\n ),\n month: view.month ?? currentMonth(),\n onMonthChange: (month) => list.setMonth(month),\n more:\n total !== undefined && total > pageItems.length\n ? { total }\n : cursors !== undefined && cursors.next !== null\n ? { total: null }\n : null,\n }\n : undefined\n }\n isCurrent={(item) => item.id === currentItemId}\n selectable={selectable}\n isSelected={(item) => isItemSelected(selection, item.id)}\n onToggle={(item) => list.toggle(item.id)}\n renderActions={renderActions}\n sort={sort}\n onSort={(column) => list.toggleSort(column.id)}\n label={label}\n pageSelection={pageCheckbox}\n renderCell={renderCell}\n />\n );\n })();\n\n return (\n <div className={cx(styles.list, className)}>\n {showToolbar ? (\n <div className={styles.toolbar}>\n <div className={styles.toolbarStart}>\n {search ? (\n <SearchField\n value={query.q ?? ''}\n onChange={(q) => list.setSearch(q)}\n />\n ) : null}\n {filters.length > 0 ? (\n <FilterControls\n filters={filters}\n values={filterValues}\n onChange={(id, value) => list.setFilter(id, value)}\n onLabel={filterLabels.remember}\n controls={filterControls}\n columns={allColumns}\n fields={fields}\n labels={filterLabels.labels}\n />\n ) : null}\n </div>\n <div className={styles.toolbarEnd}>\n {sortable ? (\n <div className={layout === 'table' ? styles.tableSort : undefined}>\n <SortSelect\n columns={allColumns}\n sort={sort}\n onChange={(next) => list.setSort(next)}\n />\n </div>\n ) : null}\n {layouts.length > 1 ? (\n <LayoutSwitch\n layouts={layouts}\n value={layout}\n onChange={(next) => {\n if (controlledLayout === undefined) {\n list.setLayout(next);\n }\n onLayoutChange?.(next);\n }}\n />\n ) : null}\n {choosesColumns ? (\n <ColumnMenu\n columns={allColumns}\n shown={columns}\n onChange={(ids) => list.setColumns(ids)}\n onReset={\n view.columns !== undefined ? () => list.resetColumns() : null\n }\n />\n ) : null}\n {resourceActions\n .filter(\n (action) => selectedCount === 0 || !hasScope(action, 'selection'),\n )\n .map((action) => (\n <ActionButton\n key={action.id}\n action={action}\n icons={actionIcons}\n size=\"md\"\n href={getActionHref(action)}\n isPending={pending === keyOf(action)}\n onPress={() => runOnResource(action)}\n />\n ))}\n {toolbar}\n </div>\n </div>\n ) : null}\n <FilterChips\n filters={filters}\n values={filterValues}\n q={query.q}\n onRemove={(id) => list.setFilter(id, undefined)}\n onClearSearch={() => list.setSearch('')}\n onClear={clearFilters}\n columns={allColumns}\n fields={fields}\n labels={filterLabels.labels}\n />\n {selectedCount > 0 ? (\n <div className={styles.selection}>\n <span className={styles.selectionCount} role=\"status\">\n {selection.mode === 'all'\n ? intl.formatMessage(messages.allMatchingSelected, {\n total: selectedCount,\n })\n : intl.formatMessage(messages.selectedCount, { count: selectedCount })}\n </span>\n {selection.mode === 'ids' &&\n pageSelection === 'all' &&\n count > pageItems.length ? (\n <Button size=\"sm\" variant=\"ghost\" onPress={() => list.selectAllMatching()}>\n {intl.formatMessage(messages.selectAllMatching, { total: count })}\n </Button>\n ) : null}\n <Button size=\"sm\" variant=\"ghost\" onPress={() => list.clearSelection()}>\n {intl.formatMessage(messages.clearSelection)}\n </Button>\n {selectionActions.length > 0 ? (\n <div className={styles.selectionActions}>\n {selectionActions.map((action) => {\n const skipped = selectedItems.filter(\n (item) => !isAllowedOn(action, item),\n ).length;\n return (\n <ActionButton\n key={action.id}\n action={action}\n icons={actionIcons}\n size=\"md\"\n href={null}\n isPending={pending === keyOf(action)}\n isDisabled={\n (pending !== null && pending !== keyOf(action)) ||\n skipped >= selectedCount\n }\n onPress={() => runOnSelection(action)}\n />\n );\n })}\n </div>\n ) : null}\n </div>\n ) : null}\n <div className={styles.body} aria-busy={isLoading && items !== undefined}>\n {body}\n </div>\n {inCalendar ? null : cursors !== undefined && error === null ? (\n <CursorPagination\n perPage={query.perPage ?? pageItems.length}\n hasPrevious={query.cursor !== undefined}\n hasNext={cursors.next !== null}\n onPrevious={() => list.previousPage(cursors.previous)}\n onNext={() => {\n if (cursors.next !== null) {\n list.nextPage(cursors.next);\n }\n }}\n perPageOptions={perPageOptions}\n onPerPageChange={(perPage) => list.setPerPage(perPage)}\n />\n ) : total !== undefined && error === null && total > 0 ? (\n <Pagination\n page={query.page ?? 1}\n perPage={query.perPage ?? pageItems.length}\n total={total}\n onPageChange={(page) => list.setPage(page)}\n perPageOptions={perPageOptions}\n onPerPageChange={(perPage) => list.setPerPage(perPage)}\n />\n ) : null}\n <ConfirmDialog\n event={confirming}\n preview={preview}\n onConfirm={(event) => void execute(event)}\n onCancel={closeConfirmation}\n />\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuLA,SAASoH,MAAMf,QAAgBH,MAAyB;CACpD,OAAOA,SAASmB,KAAAA,IAAY,GAAGhB,OAAOiB,GAAE,QAASpB,KAAKoB,OAAOjB,OAAOiB;AACxE;;;;;;AAOA,SAAOC,SAAAC,IAAA;CAAA,MAAAC,IAAAC,EAAA,GAAA;CAAkB,MAAA,EAAAtD,MAAAC,OAAAC,SAAAqD,YAAApD,cAAAqD,IAAApD,OAAAC,SAAAG,WAAAiD,IAAAhD,OAAAiD,IAAA/C,SAAAC,SAAA+C,IAAA9C,QAAA+C,IAAA9C,QAAA+C,IAAA9C,SAAA+C,IAAA9C,QAAA+C,kBAAA9C,gBAAAC,gBAAAC,YAAA6C,gBAAA5C,SAAA6C,aAAA5C,UAAAC,eAAAC,aAAAC,WAAAC,WAAAC,UAAAwC,IAAAtC,eAAAuC,mBAAAtC,cAAAuC,kBAAArC,aAAAC,aAAAE,eAAAmC,IAAAlC,UAAAG,kBAAAC,gBAAAC,YAAA8B,KAAA7B,cAAAC,aAAA6B,KAAA1B,SAAAC,cAAA,cAAA0B,WAAAzB,cAAAK;CAIrB,MAAAjD,eAAAqD,OAAAP,KAAAA,IAAA,OAAAO;CAGA,MAAAhD,YAAAiD,OAAAR,KAAAA,IAAA,QAAAQ;CACA,MAAAhD,QAAAiD,OAAAT,KAAAA,IAAA,OAAAS;CAAY,IAAAe;CAAA,IAAApB,EAAA,OAAAM,IAAA;EAEHc,MAAAd,OAAAV,KAAAA,IAAA,CAAA,IAAAU;EAAgBN,EAAA,KAAAM;EAAAN,EAAA,KAAAoB;CAAA,OAAAA,MAAApB,EAAA;CAAhB,MAAAqB,cAAAD;CACT,MAAA5D,SAAA+C,OAAAX,KAAAA,IAAA,CAAA,IAAAW;CACA,MAAA9C,SAAA+C,OAAAZ,KAAAA,IAAA,QAAAY;CACS,MAAAc,cAAAb,OAAAb,KAAAA,IAAA,CAAe,OAAO,IAAtBa;CAWT,MAAApC,WAAAwC,OAAAjB,KAAAA,IAAA,OAAAiB;CAKA,MAAAhC,gBAAAmC,OAAApB,KAAAA,IAAA,OAAAoB;CAIA,MAAA7B,aAAA8B,QAAArB,KAAAA,IAAA,CAAA,IAAAqB;CAEA,MAAA5B,cAAA6B,QAAAtB,KAAAA,IAAA9G,oBAAAoI;CAMA,MAAAK,OAAa9H,eAAe;CAC5B,MAAA+H,SAAe9H,SAAS;CACxB,MAAA+H,UAAgBzI,WAAW;CAC3B,MAAA,EAAA0I,OAAAC,MAAAC,cAAmCtF,aAAaK,IAAI;CACpD,MAAAkF,eAAqBhH,gBAAgB;CACrC,MAAA,CAAAiH,YAAAC,iBAAoCtJ,SAAiC,IAAI;CACzE,MAAA,CAAAuJ,SAAAC,cAA8BxJ,SAAgC,IAAI;CAElE,MAAAyJ,eAAqB1J,OAAO,CAAC;CAC7B,MAAA,CAAA2J,SAAAC,cAA8B3J,SAAwB,IAAI;CAAE,IAAA4J;CAAA,IAAArC,EAAA,OAAAsC,OAAAC,IAAA,2BAAA,GAAA;EAK1DF,MAAA,CAAC;EAACrC,EAAA,KAAAqC;CAAA,OAAAA,MAAArC,EAAA;CAFJ,MAAA,CAAAwC,OAAAC,YAA0BhK,SAExB4J,GAAE;CAAE,IAAAK;CAAA,IAAA1C,EAAA,OAAApD,OAAA;EACW8F,OAAAjE,SAAA;GACb,MAAAkE,OAAa/F,OAAKgG,MAAOC,cAAeA,UAAShD,OAAQpB,KAAIoB,EAAG;GAChE,IAAI8C,SAAS/C,KAAAA,GACT6C,UAASK,aAAc;IAAA,GAAKA;KAAUrE,KAAIoB,KAAM;KAAA8C;KAAAlE;IAAa;GAAE,EAAE;EACpE;EACJuB,EAAA,KAAApD;EAAAoD,EAAA,KAAA0C;CAAA,OAAAA,MAAA1C,EAAA;CALD,MAAA+C,WAAiBL;CAKf,IAAAM;CAAA,IAAAhD,EAAA,OAAAmB,aAAAnB,EAAA,OAAAuB,MAAA;EAEYyB,MAAA7B,aAAaI,KAAI0B,cAAe9H,SAAQwB,IAAK;EAACqD,EAAA,KAAAmB;EAAAnB,EAAA,KAAAuB;EAAAvB,EAAA,KAAAgD;CAAA,OAAAA,MAAAhD,EAAA;CAA5D,MAAAkD,QAAcF;CAA+C,IAAAG;CAAA,IAAAnD,EAAA,OAAAwC,OAAA;EACzBW,OAAAC,WAChCZ,MAAM/D,OAAIoB,GAAU,EAAA8C,SAAKlE,SAAQ+D,MAAM/D,OAAIoB,GAAU,EAAApB,QAApB2E,SAAjCA;EAAqEpD,EAAA,KAAAwC;EAAAxC,EAAA,KAAAmD;CAAA,OAAAA,MAAAnD,EAAA;CADzE,MAAAqD,aAAmBzG,SAAA,CAAA,EAAA,CAAW0G,IAAMH,GAEpC;CACA,MAAAI,QAAcxG,SAASsG,UAASG;CAAQ,IAAAC;CAAA,IAAAzD,EAAA,QAAA0B,MAAAgC,MAAA;EAC3BD,MAAA/B,MAAKgC,QAAL,CAAA;EAAgB1D,EAAA,MAAA0B,MAAAgC;EAAA1D,EAAA,MAAAyD;CAAA,OAAAA,MAAAzD,EAAA;CAA7B,MAAA0D,OAAaD;CAAiB,IAAAE;CAAA,IAAA3D,EAAA,QAAAyB,QAAAmC,aAAA;EAItBD,MAAAE,OAAMC,YAAarC,QAAOmC,WAAY;EAAC5D,EAAA,MAAAyB,QAAAmC;EAAA5D,EAAA,MAAA2D;CAAA,OAAAA,MAAA3D,EAAA;CAAvC,MAAA+D,MAAAJ;CAA0E,IAAAK;CAAA,IAAAhE,EAAA,QAAAf,oBAAAe,EAAA,QAAA+D,KAAA;EAF9BC,MAAA;GAAA,GAC7C/I;GAAc,GACb8I;GAA0E,GAC3E9E;EACP;EAACe,EAAA,MAAAf;EAAAe,EAAA,MAAA+D;EAAA/D,EAAA,MAAAgE;CAAA,OAAAA,MAAAhE,EAAA;CAJD,MAAAiE,aAAoDD;CAIlD,IAAAE;CAAA,IAAAlE,EAAA,QAAAiE,cAAAjE,EAAA,QAAA3B,YAAA2B,EAAA,QAAA5B,WAAA;EAIE8F,OAAArE,OACIoE,WAAWpE,QAAQD,KAAAA,MAClBC,OAAO,aAAazB,cAAcwB,KAAAA,OAClCC,OAAO,cAAcxB,aAAa;EAAK2B,EAAA,MAAAiE;EAAAjE,EAAA,MAAA3B;EAAA2B,EAAA,MAAA5B;EAAA4B,EAAA,MAAAkE;CAAA,OAAAA,MAAAlE,EAAA;CAJhD,MAAAmE,YAAkB7C,YAAW8C,OACzBF,GAIJ;CACA,MAAAxG,UAAgByG,UAASX,SAAU,IAAnBW,YAAA,CAAoC,OAAO;CAC3D,MAAAE,eACI1C,KAAIhE,WAAYiC,KAAAA,KAAalC,QAAO4G,SAAU3C,KAAIhE,MAAO,IAAIgE,KAAIhE,SAAjEiC,KAAAA;CACJ,MAAAjC,SAAe+C,oBAAA2D,gBAAoC3G,QAAO,MAA3C;CACf,MAAAb,UAAgBpC,gBAAgByF,YAAYyB,KAAI9E,OAAQ;CACxD,MAAA0H,SAAeN,WAAWtG,WAAW1C,eAAcuJ;CACnD,MAAAC,aAAmB9G,WAAW,cAAcU,aAAa;CAAK,IAAAqG;CAAA,IAAA1E,EAAA,QAAA3B,YAAA2B,EAAA,QAAAqB,eAAArB,EAAA,QAAAyE,YAAA;EAE9CC,MAAAD,aACVpD,YAAW+C,QAAQA,WAAYA,OAAMvE,OAAQxB,SAAQ+F,MAC3C,IAFA/C;EAECrB,EAAA,MAAA3B;EAAA2B,EAAA,MAAAqB;EAAArB,EAAA,MAAAyE;EAAAzE,EAAA,MAAA0E;CAAA,OAAAA,MAAA1E,EAAA;CAFjB,MAAAzC,UAAgBmH;CAEE,IAAAC;CAAA,IAAA3E,EAAA,QAAA3B,YAAA2B,EAAA,QAAAyE,cAAAzE,EAAA,QAAA0B,MAAA0C,QAAA;EACGO,MAAAd,OAAMC,YACvBD,OAAMe,QAASlD,MAAK0C,UAAL,CAAiB,CAAC,CAAC,CAAAA,QAC9BS,QAAA;GAAC,MAAA,CAAAC,QAAAD;GAAI,OAAK,EAAEJ,cAAc5E,SAAOxB,SAAQ+F;EAAQ,CACrD,CACJ;EAACpE,EAAA,MAAA3B;EAAA2B,EAAA,MAAAyE;EAAAzE,EAAA,MAAA0B,MAAA0C;EAAApE,EAAA,MAAA2E;CAAA,OAAAA,MAAA3E,EAAA;CAJD,MAAA+E,eAAqBJ;CAInB,IAAAE;CAAA,IAAA7E,EAAA,QAAA+E,gBAAA/E,EAAA,QAAA0B,MAAAsD,GAAA;EACeH,MAAAhB,OAAMoB,KAAMF,YAAY,CAAC,CAAAvB,SAAU,MAAM9B,MAAKsD,KAAL,QAAmB;EAAEhF,EAAA,MAAA+E;EAAA/E,EAAA,MAAA0B,MAAAsD;EAAAhF,EAAA,MAAA6E;CAAA,OAAAA,MAAA7E,EAAA;CAA/E,MAAAkF,WAAiBL;CAEjB,MAAAM,UAAgB9K,iBAAiBuG,WAAW;CAE5C,MAAAwE,iBAAuB,CAAA,GAAID,QAAO3F,SAAQ,GAAK2F,QAAOE,IAAK,CAAC,CAAAjB,OACxDkB,KAGJ;CACA,MAAAC,mBAAyBH,eAAchB,OAAQoB,MAAyC;CACxF,MAAAC,kBAAwBL,eAAchB,OAAQsB,MAAwC;CACtF,MAAA5H,aAAmB6C,kBAAkB4E,iBAAgB/B,SAAU;CAE/D,MAAAmC,gBAAsB7H,aAAa1C,cAAcwG,WAAW2B,KAAS,IAA/C;CAAiD,IAAAqC;CAAA,IAAA5F,EAAA,QAAA4B,WAAA;EAChCgE,OAAAC,WAAUvK,eAAesG,WAAWnD,OAAIoB,EAAG;EAACG,EAAA,MAAA4B;EAAA5B,EAAA,MAAA4F;CAAA,OAAAA,MAAA5F,EAAA;CAAnF,MAAA8F,gBAAsBzC,UAASe,OAAQwB,GAA4C;CACnF,MAAAG,gBAAsB1K,iBAAiBuG,WAAWyB,SAAS;CAE3D,MAAA7E,gBAAqBwH,WAAA;EACjB,IAAIjF,qBAAqBnB,KAAAA,GAAS,OACvBmB,iBAAiBtC,MAAI;EAEhC,MAAAwH,cACI/F,WAAU0C,MAAMsD,WAAYA,OAAMrG,OAAQ1B,SACO,MAAhDA,cAAcyB,KAAAA,IAAY/C,QAAO,KAAjC+C,KAAAA;EACL,MAAAuG,QACIF,gBAAgBrG,KAAAA,IACVnD,OAAOD,eAAeiC,QAAMwH,aAAa1E,KAAI6E,MAAO,GAAG7E,KAAI6E,MAGxD,IAFHjI,cAAcyB,KAAAA,IACZnD,OAAOgC,OAAKN,YAAYoD,KAAI6E,MAC3B,IAFH;EAEK,OACRD,UAAU,KAAVA,QAAuB1H,OAAIoB;CAAG;CAGzC,MAAAwG,cAAoB9J,eAAeuC,QAAQ;CAE3C,MAAAwH,cAAmBC,QAAAC,UAAAC,YAAA;EACf,MAAAC,QAActH,iBAAiBQ,KAAAA,IAAY5E,eAAekL,UAAQzH,QAAMU,UAAiB,IAA3E;EACd,IAAIuH,UAAU,QAAQtH,iBAAiBQ,KAAAA,GAAS,OACrC6G;EACV,OAEG,oBAAC,YAAD;GAEUhI,MAAAA;GACCiI;GACI,WAAAlI,aAAaC,MAAI;GACdD;GACD,cAAAmI,cAAaN,YAAYvD,WAASoD,QAAM;GAC7C,SAAAU,QAAAC,UAAiBzH,aAAa;IAAAX,MAAQkE;IAAI+D;IAAAG;GAAe,CAAC;GAC1D9D,QAAAA;GACK,cAAAzD,YAAaD,YAAYC,SAASoH,MAAKI,IAAK;GAExDL,UAAAA;EAXM,GACF,GAAGhI,OAAIoB,GAAG,QAASqG,SAAMrG,IADvB;CAYE;CAIrB,MAAAkH,0BAA0B;EACtB7E,aAAYY,UAAZZ,aAAYY,UAAY;EACxBf,cAAc,IAAI;EAClBE,WAAW,IAAI;CAAC;CAGpB,MAAA+E,UAAgB,OAAAC,UAAA;EACZF,kBAAkB;EAClB3E,WAAWzC,MAAMsH,MAAKrI,QAASqI,MAAKxI,IAAK,CAAC;EAE1C,MAAMyI,QAAOC,QAAS,CAAC,CAAAC,WACPpJ,WAAWiJ,KAAK,CAAC,CAAC,CAAAG,MACxBC,YAAA;GAEF,IAAIJ,MAAKK,UAAW,eAAeD,YAAY,OAC3C1K,KAAI4K,eAAgB;EACvB,CACJ,CAAC,CAAAC,OACKC,WAAA;GACHjG,OAAMkG,KAAM;IAAAvB,OACD5E,KAAI0B,cAAe9H,SAAQwM,cAAe,EAAA/I,QACrC3F,eAAegO,MAAKrI,QAAS2C,IAAI,EAC7C,CAAC;IAAC,GACEkG,kBAAkBpK,SAASoK,OAAMG,YAAa,KAA9C,EAAAC,aACiBJ,OAAMG,QACpB,IAFH,CAEG;IAACE,MACF;GACV,CAAC;EAAC,CACL;EACL1F,WAAW,IAAI;CAAC;CAGpB,MAAA2F,OAAYC,YAAA;EACR,MAAA,EAAApJ,QAAAqJ,UAAArG,WAAAsG,gBAA8BjB;EAC9B,IACIhJ,kBAAkB2B,KAAAA,KAClBhB,SAAMuJ,WAAY,QAClBvG,gBAAchC,KAAAA,KACd,WAAWgC,aAAS;GAGpB,MAAAwG,YAAkBlG,aAAYY,UAAZZ,aAAYY,UAAQ;GACtC,MAAAuF,OAAazJ,SAAM0J,YAAa1I,KAAAA,KAAahB,SAAM0J,YAAa;GAChEvG,cAAckF,OAAK;GACnBhF,WAAW,EAAAsG,QAAU,UAAU,CAAC;GAChCtK,cAAcgJ,OAAK,CAAC,CAAAG,MAChBoB,WAAA;IACI,IAAItG,aAAYY,YAAaA,WAAO;IAGpC,MAAA2F,UAAgBD,QAAMC,WAAaxB,QAAKwB,QAAQjF;IAGhD,IACIiF,YAAY,KAAZ,CACCJ,QADD,CAECzP,iBAAiBgG,UAAQ8J,KAAIC,IAAK,GAAG1B,QAAK1D,QAASkF,OAAO,CAAC,GAEvDzB,QAAQC,OAAK;SAElBhF,WAAWuG,WAAW,OAAX;KAAAD,QAA4B;KAAM,GAAKC;IAAc,IAArD,IAAsD;GACpE,SAEL;IAEI,IAAItG,aAAYY,YAAaA,WAAO;IAGpC,IAAI9I,kBAAkBiN,OAAK,GACvBhF,WAAW,IAAI;SAEV+E,QAAQC,OAAK;GACrB,CAET;GAAC;EAAA;EAGL,IAAIjN,kBAAkBiN,OAAK,GACvBlF,cAAckF,OAAK;OAEdD,QAAQC,OAAK;CACrB;CAGL,MAAA2B,aAAkBC,UAAAC,WACdf,IAAI;EAAAnJ,QAAEA;EAAM0I,OAAS;EAAM7I,MAAEA;EAAI8E,OAAS;EAACkF,SAAW,CAAA;CAAG,CAAC;CAE9D,MAAAM,kBAAuBC,aAAA;EACnB,MAAAC,WAAiBtM,KAAIuM,aAAc;EACnC,IAAID,aAAa,MAAI;EAGrBlB,IAAI;GAAAnJ,QACAA;GAAM0I,OACC;GAAW1F,WACPqH;GAAQ1F,OACZoC;GAAa8C,SACX3C,cAAa1B,QAAQ+E,WAAU,CAAC5O,YAAYqE,UAAQH,MAAI,CAAC;EACtE,CAAC;CAAC;CAGN,MAAA2K,iBAAsBC,aAClBtB,IAAI;EAAAnJ,QAAEA;EAAM0I,OAAS;EAAU/D;EAAAkF,SAAyB,CAAA;CAAG,CAAC;CAIhE,MAAAa,cAAoBjG,UAASC,KAAKiG,WAAU,CAAA,GACrCxQ,kBAAkBoM,QAAOqE,KAAM/K,QAAM,OAAO,EAAAE,YAAc,CAAC,GAAC,GAC5D5F,kBAAkBoM,QAAOE,MAAO5G,QAAM,QAAQ,EAAAE,YAAc,CAAC,CAAC,CACpE;CACD,MAAA8K,WAAgBC,aACZJ,YAAWK,KAAM,CAAC,CAAA/G,MAAMgH,UAAWA,MAAKhL,OAAOiB,OAAQjB,SAAMiB,EAAS,KAAtE,CAAA;CACJ,MAAAgK,QAAc3P,gBAAgBiL,QAAOqE,IAAIM,QAASL,OAAO,GAAGtE,QAAOE,KAAKyE,QAASL,OAAO,CAAC;CACzF,MAAAlL,gBACIuC,sBAAsBlB,KAAAA,IAAtBkB,oBAEO,CAAC,QAAQ,MAAM,CAAC,CAAA8B,MAAMmH,SAAQF,MAAKG,MAAMC,SAAUA,KAAIrL,OAAOiB,OAAQA,IAAE,CAAS,KAAjF;CAGX,MAAAqK,iBAAsBC,WAAA;EAClB,MAAAC,UAAgBrR,kBAAkBoM,QAAOqE,KAAM/K,QAAM,OAAO,EAAAE,YAAc,CAAC;EAC3E,MAAA0G,OAAatM,kBAAkBoM,QAAOE,MAAO5G,QAAM,QAAQ,EAAAE,YAAc,CAAC;EAC1E,IAAIyL,QAAO5G,WAAY,KAAK6B,KAAI7B,WAAY,GAAC,OAClC;EAEX,MAAA6G,UACIlI,SAAOmI,SAAW,SAAS7L,OAAIoB,IAAK,MAAM,OAAOsC,QAAOoI,MAAO,IAAQ,CAAC,CAAA,KAAxE;EAAmF,OAEnF,oBAAC,YAAD;GACe,WAAA/L,aAAaC,MAAI;GACnB2L,SAAAA;GACH/E;GACG,SAAAgF,WAAA;GACF,QAAAG,aAAY5B,UAAUhK,UAAQH,MAAI;GAClCP,OAAAA;GACA2L;GACEtL,SAAAA;EAAa,CAAA;CACxB;CAER,IAAAkM;CAAA,IAAAzK,EAAA,QAAAuB,MAAA;EAIkBkJ,MAAAlJ,KAAI0B,cAAe9H,SAAQuP,UAAW;EAAC1K,EAAA,MAAAuB;EAAAvB,EAAA,MAAAyK;CAAA,OAAAA,MAAAzK,EAAA;CAF3D,MAAA2K,eACI,oBAAC,UAAD;EACgB,cAAAF;EACA,YAAA1E,kBAAkB;EACb,iBAAAA,kBAAkB;EACvB,YAAA1C,UAASG,WAAY;EACvB,gBAAA;GACN,MAAAoH,MAAYvH,UAASC,IAAKuH,MAAiB;GAC3C,IAAI9E,kBAAkB,OAClBpJ,KAAImO,SAAUF,GAAG;QAEjBjO,KAAIoO,OAAQH,GAAG;EAClB;CACJ,CAAA;CAIT,MAAAI,WAAiB9K,WAAU8J,KAAMiB,MAAoC;CACrE,MAAAC,iBAAuBpO,gBAAgBoD,WAAUsD,SAAU;CAC3D,MAAA2H,cACI1N,UACAF,QAAOiG,SAAU,KADjBwH,YAAAE,kBAIAxN,QAAO8F,SAAU,KACjBiC,gBAAejC,SAAU,KACzBhE,YAAYI,KAAAA;CAAU,IAAAwL;CAAA,IAAApL,EAAA,QAAA+E,gBAAA/E,EAAA,QAAArD,QAAAqD,EAAA,QAAA0B,MAAAsD,GAAA;EAE1BoG,MAAA,SAAAC,eAAA;GACIxH,OAAMoB,KAAMF,YAAY,CAAC,CAAAuG,SAASC,SAAQ5O,KAAI6O,UAAW3L,MAAID,KAAAA,CAAS,CAAC;GACvE,KAAK8B,MAAKsD,KAAL,QAAmB,IACpBrI,KAAI8O,UAAW,EAAE;EACpB;EACJzL,EAAA,MAAA+E;EAAA/E,EAAA,MAAArD;EAAAqD,EAAA,MAAA0B,MAAAsD;EAAAhF,EAAA,MAAAoL;CAAA,OAAAA,MAAApL,EAAA;CALD,MAAAqL,eAAAD;CAKC,IAAAM;CAAAC,KAAA;EAGG,IAAIvO,UAAU,MAAI;GAAA,IAAAwO;GAAA,IAAA5L,EAAA,QAAAuB,MAAA;IAICqK,MAAArK,KAAI0B,cAAe9H,SAAQ0Q,UAAW;IAAC7L,EAAA,MAAAuB;IAAAvB,EAAA,MAAA4L;GAAA,OAAAA,MAAA5L,EAAA;GAAA,IAAA8L;GAAA,IAAA9L,EAAA,QAAAuB,QAAAvB,EAAA,QAAA1C,SAAA;IAE1CwO,MAAAxO,YAAYsC,KAAAA,IACR,oBAAC,QAAD;KAAa,MAAA;KAActC,SAAAA;KACtBiE,UAAAA,KAAI0B,cAAe9H,SAAQ4Q,KAAM;IAD/B,CAAA,IADXnM,KAAAA;IAIaI,EAAA,MAAAuB;IAAAvB,EAAA,MAAA1C;IAAA0C,EAAA,MAAA8L;GAAA,OAAAA,MAAA9L,EAAA;GAAA,IAAAgM;GAAA,IAAAhM,EAAA,QAAA5C,MAAAwK,WAAA5H,EAAA,QAAA4L,OAAA5L,EAAA,QAAA8L,KAAA;IARrBE,MAAA,oBAAC,OAAD;KACS,MAAA;KACE,OAAAJ;KAEH,SAAAE;KAOH1O,UAAAA,MAAKwK;IAXJ,CAAA;IAYE5H,EAAA,MAAA5C,MAAAwK;IAAA5H,EAAA,MAAA4L;IAAA5L,EAAA,MAAA8L;IAAA9L,EAAA,MAAAgM;GAAA,OAAAA,MAAAhM,EAAA;GAbZ0L,MACIM;GADJ,MAAAL;EAcE;EAEN,IAAI/O,UAAUgD,KAAAA,GAAS;GACnB8L,MACI,oBAAC,cAAD;IACYnH;IACC1H;IACA,SAAA6E,MAAKuK;IACRvI;IACCR;IACK,YAAA9E,cAAcwB,KAAAA;GAAS,CAAA;GAP3C,MAAA+L;EASE;EAGN,IAAItI,UAASG,WAAY,KAArB,CAA2BiB,YAAU;GAAA,IAAAmH;GAAA,IAAA5L,EAAA,QAAAP,gBAAAO,EAAA,QAAAkF,YAAAlF,EAAA,QAAAuB,MAAA;IAIxBqK,MAAA1G,WACK3D,KAAI0B,cAAe9H,SAAQ+Q,SACwB,IAAlDzM,gBAAgB8B,KAAI0B,cAAe9H,SAAQgR,KAAM;IAAEnM,EAAA,MAAAP;IAAAO,EAAA,MAAAkF;IAAAlF,EAAA,MAAAuB;IAAAvB,EAAA,MAAA4L;GAAA,OAAAA,MAAA5L,EAAA;GAAA,IAAA8L;GAAA,IAAA9L,EAAA,QAAA4L,KAAA;IAH9DE,MAAA,oBAAA,KAAA,EAAA,UACKF,IAGD,CAAA;IAAA5L,EAAA,MAAA4L;IAAA5L,EAAA,MAAA8L;GAAA,OAAAA,MAAA9L,EAAA;GAAA,IAAAgM;GAAA,IAAAhM,EAAA,QAAAqL,gBAAArL,EAAA,QAAAkF,YAAAlF,EAAA,QAAAuB,MAAA;IACHyK,MAAA9G,WACG,oBAAC,QAAD;KAAa,MAAA;KAAc,eAAMmG,aAAa;KACzC9J,UAAAA,KAAI0B,cAAe9H,SAAQkQ,YAAa;IADtC,CAAA,IADV;IAIOrL,EAAA,MAAAqL;IAAArL,EAAA,MAAAkF;IAAAlF,EAAA,MAAAuB;IAAAvB,EAAA,MAAAgM;GAAA,OAAAA,MAAAhM,EAAA;GAAA,IAAAoM;GAAA,IAAApM,EAAA,QAAA8L,OAAA9L,EAAA,QAAAgM,KAAA;IAVZI,MAAA,qBAAA,OAAA;KAAgB,WAAAxS,wBAAMyS;KAAtB,UAAA,CACIP,KAKCE,GAKC;;IAAAhM,EAAA,MAAA8L;IAAA9L,EAAA,MAAAgM;IAAAhM,EAAA,MAAAoM;GAAA,OAAAA,MAAApM,EAAA;GAZV0L,MACIU;GADJ,MAAAT;EAaE;EACL,IAAAC;EAAA,IAAA5L,EAAA,QAAA5B,WAAA;GASWwN,MAAAxN,cAAcwB,KAAAA,KAAd0M,WAAoCxR,YAAY2D,OAAKL,UAAU,IAA/DwB,KAAAA;GAA4EI,EAAA,MAAA5B;GAAA4B,EAAA,MAAA4L;EAAA,OAAAA,MAAA5L,EAAA;EAAA,IAAA8L;EAAA,IAAA9L,EAAA,QAAAnB,eAAA;GAsBrEiN,OAAAS,YAAU9N,QAAIoB,OAAQhB;GAAamB,EAAA,MAAAnB;GAAAmB,EAAA,MAAA8L;EAAA,OAAAA,MAAA9L,EAAA;EAAA,IAAAgM;EAAA,IAAAhM,EAAA,QAAA4B,WAAA;GAElCoK,OAAAQ,YAAUlR,eAAesG,WAAWnD,QAAIoB,EAAG;GAACG,EAAA,MAAA4B;GAAA5B,EAAA,MAAAgM;EAAA,OAAAA,MAAAhM,EAAA;EAAA,IAAAoM;EAAA,IAAApM,EAAA,QAAArD,MAAA;GAC9CyP,OAAAK,YAAU9P,KAAI+P,OAAQjO,QAAIoB,EAAG;GAACG,EAAA,MAAArD;GAAAqD,EAAA,MAAAoM;EAAA,OAAAA,MAAApM,EAAA;EAAA,IAAA2M;EAAA,IAAA3M,EAAA,QAAArD,MAAA;GAGhCgQ,OAAAC,aAAYjQ,KAAIkQ,WAAY3G,SAAMrG,EAAG;GAACG,EAAA,MAAArD;GAAAqD,EAAA,MAAA2M;EAAA,OAAAA,MAAA3M,EAAA;EApCtD0L,MACI,oBAAC,QAAD;GACWrI,OAAAA;GACExG;GACIwJ;GACC7H;GACDE;GAET,cAAAkN;GAGA,UAAAnH,aAAA;IAAAiC,OAEiBrI,SAAQqI;IAAMoG,UACX5R,oBACN,CAAA,GAAIsC,QAAM,GAAK0C,WAAUoD,IAAKyJ,MAAwB,CAAC,CAAC,CAAAnK,MACpDoK,YAAWtG,SAAKI,SAAWzI,SAAQqI,KACvC,CACJ;IAACuG,OACMtL,KAAIsL,SAAUpU,aAAa;IAACqU,gBACpBD,UAAWtQ,KAAIwQ,SAAUF,KAAK;IAACG,MAE1CrQ,UAAU6C,KAAAA,KAAa7C,QAAQsG,UAASG,SAAxC,EAAAzG,MAIW,IAFLC,YAAY4C,KAAAA,KAAa5C,QAAOC,SAAU,OAA1C,EAAAF,OACW,KACN,IAFL;GAIN,IAjBd6C,KAAAA;GAmBO,WAAAkM;GACChO;GACA,YAAAkO;GACF,UAAAI;GACKlC;GACTxG;GACE,QAAAiJ;GACDzJ;GACQyH,eAAAA;GACHrE;EAAU,CAAA;CAE5B;CAxFN,MAAA+G,OAAa3B;CAyFR,IAAAE;CAAA,IAAA5L,EAAA,QAAAN,WAAA;EAGekM,MAAAlR,GAAGd,wBAAM+C,MAAO+C,SAAS;EAACM,EAAA,MAAAN;EAAAM,EAAA,MAAA4L;CAAA,OAAAA,MAAA5L,EAAA;CACrC,MAAA8L,MAAAX,cACG,qBAAA,OAAA;EAAgB,WAAAvR,wBAAM4F;EAAtB,UAAA,CACI,qBAAA,OAAA;GAAgB,WAAA5F,wBAAM0T;GAAtB,UAAA,CACK7P,SACG,oBAAC,aAAD;IACW,OAAAiE,MAAKsD,KAAL;IACG,WAAAA,MAAOrI,KAAI8O,UAAWzG,CAAC;GAAC,CAAA,IAHzC,MAMAzH,QAAOiG,SAAU,IACd,oBAAC,gBAAD;IACajG;IACDwH,QAAAA;IACE,WAAAwI,MAAAC,YAAe7Q,KAAI6O,UAAW3L,MAAIgH,OAAK;IACxC,SAAAhF,aAAY4L;IACXvO,UAAAA;IACDgB,SAAAA;IACD1C;IACA,QAAAqE,aAAY6L;GAAO,CAAA,IATlC,IAYC;EACN,CAAA,GAAA,qBAAA,OAAA;GAAgB,WAAA9T,wBAAM+T;GAAtB,UAAA;IACK3C,WACG,oBAAA,OAAA;KAAgB,WAAArN,WAAW,UAAU/D,wBAAMgU,YAA3BhO,KAAAA;KACZ,UAAA,oBAAC,YAAD;MACaM,SAAAA;MACHwD;MACI,WAAAzG,SAAUN,KAAIkR,QAAS5Q,IAAI;KAAC,CAAA;IAExC,CAAA,IAPT;IASAS,QAAO8F,SAAU,IACd,oBAAC,cAAD;KACa9F;KACFC,OAAAA;KACG,WAAAmQ,WAAA;MACN,IAAIpN,qBAAqBd,KAAAA,GACrBjD,KAAIoR,UAAW9Q,MAAI;MAEvBW,iBAAiBX,MAAI;KAAC;IACzB,CAAA,IATR;IAYAiO,iBACG,oBAAC,YAAD;KACahL,SAAAA;KACFrD,OAAAA;KACG,WAAAmR,UAASrR,KAAIsR,WAAYrD,KAAG;KAElC,SAAAjJ,KAAI9E,YAAa+C,KAAAA,UAAkBjD,KAAIuR,aAAc,IAArD;IAA6D,CAAA,IANxE;IAUAzI,gBAAerB,QAER+J,aAAYxI,kBAAkB,KAAlB,CAAwBrL,SAASsE,UAAQ,WAAW,CACpE,CAAC,CAAA0E,KACI8K,aACD,oBAAC,cAAD;KAEYxP,QAAAA;KACDV,OAAAA;KACF,MAAA;KACC,MAAA9D,cAAcwE,QAAM;KACf,WAAAuD,YAAYxC,MAAMf,QAAM;KAC1B,eAAMwK,cAAcxK,QAAM;IAAC,GAN/BA,SAAMiB,EAMyB,CAE3C;IACJL;GACC;EACJ,CAAA,CAAA;CAvET,CAAA,IAAA;CAwEO,IAAAwM;CAAA,IAAAI;CAAA,IAAApM,EAAA,QAAArD,MAAA;EAKMqP,OAAAqC,SAAQ1R,KAAI6O,UAAW3L,MAAID,KAAAA,CAAS;EAC/BwM,YAAMzP,KAAI8O,UAAW,EAAE;EAACzL,EAAA,MAAArD;EAAAqD,EAAA,MAAAgM;EAAAhM,EAAA,MAAAoM;CAAA,OAAA;EAAAJ,MAAAhM,EAAA;EAAAoM,MAAApM,EAAA;CAAA;CAAA,IAAA2M;CAAA,IAAA3M,EAAA,QAAAE,cAAAF,EAAA,QAAAqL,gBAAArL,EAAA,QAAAxC,UAAAwC,EAAA,QAAA6B,aAAA6L,UAAA1N,EAAA,QAAA+E,gBAAA/E,EAAA,QAAAzC,WAAAyC,EAAA,QAAA0B,MAAAsD,KAAAhF,EAAA,QAAAgM,OAAAhM,EAAA,QAAAoM,KAAA;EAL3CO,MAAA,oBAAC,aAAD;GACapP;GACDwH,QAAAA;GACL,GAAArD,MAAKsD;GACE,UAAAgH;GACK,eAAAI;GACNf,SAAAA;GACAnL,SAAAA;GACD1C;GACA,QAAAqE,aAAY6L;EAAO,CAAA;EAC7B1N,EAAA,MAAAE;EAAAF,EAAA,MAAAqL;EAAArL,EAAA,MAAAxC;EAAAwC,EAAA,MAAA6B,aAAA6L;EAAA1N,EAAA,MAAA+E;EAAA/E,EAAA,MAAAzC;EAAAyC,EAAA,MAAA0B,MAAAsD;EAAAhF,EAAA,MAAAgM;EAAAhM,EAAA,MAAAoM;EAAApM,EAAA,MAAA2M;CAAA,OAAAA,MAAA3M,EAAA;CACD,MAAAsO,MAAA3I,gBAAgB,IACb,qBAAA,OAAA;EAAgB,WAAA/L,wBAAMgI;EAAtB,UAAA;GACI,oBAAA,QAAA;IAAiB,WAAAhI,wBAAM2U;IAAsB,MAAA;IACxC3M,UAAAA,UAAS4M,SAAU,QACdjN,KAAI0B,cAAe9H,SAAQsT,qBAAsB,EAAA1R,OACtC4I,cACX,CACmE,IAAnEpE,KAAI0B,cAAe9H,SAAQwK,eAAgB,EAAApC,OAASoC,cAAc,CAAC;GACtE,CAAA;GACN/D,UAAS4M,SAAU,SACpBzI,kBAAkB,SAClBxC,QAAQF,UAASG,SACb,oBAAC,QAAD;IAAa,MAAA;IAAa,SAAA;IAAiB,eAAM7G,KAAI+R,kBAAmB;IACnEnN,UAAAA,KAAI0B,cAAe9H,SAAQuT,mBAAoB,EAAA3R,OAASwG,MAAM,CAAC;GAD7D,CAAA,IAHV;GAOD,oBAAC,QAAD;IAAa,MAAA;IAAa,SAAA;IAAiB,eAAM5G,KAAI4K,eAAgB;IAChEhG,UAAAA,KAAI0B,cAAe9H,SAAQoM,cAAe;GADxC,CAAA;GAGNhC,iBAAgB/B,SAAU,IACvB,oBAAA,OAAA;IAAgB,WAAA5J,wBAAM2L;IACjBA,UAAAA,iBAAgBjC,KAAKqL,cAAA;KAClB,MAAAC,YAAgB9I,cAAa1B,QACzByK,YAAU,CAACtU,YAAYqE,WAAQH,OAAI,CACvC,CAAC,CAAA+E;KAAQ,OAEL,oBAAC,cAAD;MAEY5E,QAAAA;MACDV,OAAAA;MACF,MAAA;MACC,MAAA;MACK,WAAAiE,YAAYxC,MAAMf,SAAM;MAE/B,YAACuD,YAAY,QAAQA,YAAYxC,MAAMf,SAAM,KAC7C6J,aAAW9C;MAEN,eAAMoD,eAAenK,SAAM;KAAC,GAVhCA,UAAMiB,EAU0B;IACvC,CAET;GACC,CAAA,IAtBT;EAwBC;CA3CT,CAAA,IAAA;CA6CuC,MAAAiP,MAAA3R,aAAaP,UAAUgD,KAAAA;CAAS,IAAAmP;CAAA,IAAA/O,EAAA,QAAAqN,QAAArN,EAAA,QAAA8O,KAAA;EAAxEC,MAAA,oBAAA,OAAA;GAAgB,WAAAnV,wBAAMyT;GAAkB,aAAAyB;GACnCzB,UAAAA;EACC,CAAA;EAAArN,EAAA,MAAAqN;EAAArN,EAAA,MAAA8O;EAAA9O,EAAA,MAAA+O;CAAA,OAAAA,MAAA/O,EAAA;CAAA,IAAAgP;CAAA,IAAAhP,EAAA,QAAAhD,WAAAgD,EAAA,QAAA5C,SAAA4C,EAAA,QAAAyE,cAAAzE,EAAA,QAAArD,QAAAqD,EAAA,QAAAqD,aAAArD,EAAA,QAAAnC,kBAAAmC,EAAA,QAAA0B,MAAAuN,UAAAjP,EAAA,QAAA0B,MAAAwN,QAAAlP,EAAA,QAAA0B,MAAAuK,WAAAjM,EAAA,QAAAjD,OAAA;EACLiS,MAAAvK,aAAA,OAAoBzH,YAAY4C,KAAAA,KAAaxC,UAAU,OACpD,oBAAC,kBAAD;GACa,SAAAsE,MAAKuK,WAAY5I,UAASG;GACtB,aAAA9B,MAAKuN,WAAYrP,KAAAA;GACrB,SAAA5C,QAAOC,SAAU;GACd,kBAAMN,KAAIwS,aAAcnS,QAAOE,QAAS;GAC5C,cAAA;IACJ,IAAIF,QAAOC,SAAU,MACjBN,KAAIyS,SAAUpS,QAAOC,IAAK;GAC7B;GAEWY;GACC,kBAAAoO,YAAatP,KAAI0S,WAAYpD,OAAO;EAAC,CAAA,IAE1DlP,UAAU6C,KAAAA,KAAaxC,UAAU,QAAQL,QAAQ,IACjD,oBAAC,YAAD;GACU,MAAA2E,MAAKwN,QAAL;GACG,SAAAxN,MAAKuK,WAAY5I,UAASG;GAC5BzG;GACO,eAAAmS,SAAUvS,KAAI2S,QAASJ,IAAI;GACzBrR;GACC,kBAAA0R,cAAa5S,KAAI0S,WAAYpD,SAAO;EAAC,CAAA,IAP1D;EASIjM,EAAA,MAAAhD;EAAAgD,EAAA,MAAA5C;EAAA4C,EAAA,MAAAyE;EAAAzE,EAAA,MAAArD;EAAAqD,EAAA,MAAAqD;EAAArD,EAAA,MAAAnC;EAAAmC,EAAA,MAAA0B,MAAAuN;EAAAjP,EAAA,MAAA0B,MAAAwN;EAAAlP,EAAA,MAAA0B,MAAAuK;EAAAjM,EAAA,MAAAjD;EAAAiD,EAAA,OAAAgP;CAAA,OAAAA,MAAAhP,EAAA;CAAA,IAAAwP;CAAA,IAAAxP,EAAA,SAAAgH,SAAA;EAIOwI,OAAAC,YAAW,KAAKzI,QAAQC,OAAK;EAACjH,EAAA,OAAAgH;EAAAhH,EAAA,OAAAwP;CAAA,OAAAA,MAAAxP,EAAA;CAAA,IAAA0P;CAAA,IAAA1P,EAAA,SAAA+G,qBAAA/G,EAAA,SAAA8B,cAAA9B,EAAA,SAAAgC,WAAAhC,EAAA,SAAAwP,KAAA;EAH7CE,MAAA,oBAAC,eAAD;GACW5N,OAAAA;GACEE;GACE,WAAAwN;GACDzI,UAAAA;EAAiB,CAAA;EAC7B/G,EAAA,OAAA+G;EAAA/G,EAAA,OAAA8B;EAAA9B,EAAA,OAAAgC;EAAAhC,EAAA,OAAAwP;EAAAxP,EAAA,OAAA0P;CAAA,OAAAA,MAAA1P,EAAA;CAAA,IAAA2P;CAAA,IAAA3P,EAAA,SAAA4L,OAAA5L,EAAA,SAAA8L,OAAA9L,EAAA,SAAA2M,OAAA3M,EAAA,SAAAsO,OAAAtO,EAAA,SAAA+O,OAAA/O,EAAA,SAAAgP,OAAAhP,EAAA,SAAA0P,KAAA;EAlKNC,MAAA,qBAAA,OAAA;GAAgB,WAAA/D;GAAhB,UAAA;IACKE;IAyEDa;IAWC2B;IA6CDS;IAGCC;IAwBDU;GAME;;EAAA1P,EAAA,OAAA4L;EAAA5L,EAAA,OAAA8L;EAAA9L,EAAA,OAAA2M;EAAA3M,EAAA,OAAAsO;EAAAtO,EAAA,OAAA+O;EAAA/O,EAAA,OAAAgP;EAAAhP,EAAA,OAAA0P;EAAA1P,EAAA,OAAA2P;CAAA,OAAAA,MAAA3P,EAAA;CAAA,OAnKN2P;AAmKM;AA3kBP,SAAA5C,OAAA6C,UAAA;CAAA,OA0YqE1J,SAAMQ;AAAM;AA1YjF,SAAAuE,OAAA4E,UAAA;CAAA,OA0T0C3J,SAAM8E,aAAc;AAAI;AA1TlE,SAAAH,OAAAiF,QAAA;CAAA,OAgT6CrR,OAAIoB;AAAG;AAhTpD,SAAA6F,OAAAqK,UAAA;CAAA,OA6GuDzV,SAASsE,UAAQ,UAAU;AAAC;AA7GnF,SAAA4G,OAAAwK,UAAA;CAAA,OA4GwD1V,SAASsE,UAAQ,WAAW;AAAC;AA5GrF,SAAA0G,MAAA1G,QAAAqR,OAAAC,KAAA;CAAA,QAyGM5V,SAASsE,QAAQ,WAA2C,KAA3BtE,SAASsE,QAAQ,UAAU,MAC7DsR,IAAGC,WAAWC,gBAAevN,YAAShD,OAAQjB,OAAMiB,EAAG,MAAMoQ;AAAK"}
1
+ {"version":3,"file":"ListView.js","names":["ReactNode","useEffect","useRef","useState","List","ResolvedCalendar","asksConfirmation","currentMonth","formatRuleFailure","selectItemActions","usePlugins","getActionLabel","Action","Field","Filter","RuleFailure","Alert","Button","Checkbox","usePanneauIntl","useToast","ListSkeleton","styles","ActionButton","ConfirmDialog","ConfirmPreview","needsConfirmation","RowActions","orderRowActions","ListActions","getActionHref","groupListActions","hasScope","isAllowedOn","ActionIcons","getShownColumns","cx","FilterChips","FilterControls","useFilterLabels","getImageUrl","InlineCell","getInlineField","builtInLayouts","getCalendarTimeZone","messages","countSelected","getPageSelection","isItemSelected","ColumnMenu","LayoutSwitch","CursorPagination","Pagination","SearchField","SortSelect","DisplayEntry","FilterEntry","ListActionEvent","ListActionHandler","ListActionPreviewer","ListColumn","ListInlineEditHandler","ListItem","ListLayoutEntry","useListState","useRenderValue","getColumnValue","toText","ListViewProps","list","items","columns","columnChoice","total","cursors","next","previous","isLoading","error","Error","onRetry","filters","fields","search","layouts","layout","onLayoutChange","perPageOptions","selectable","actions","onAction","previewAction","actionIcons","itemTitle","itemImage","calendar","Pick","primaryAction","getItemLabel","item","getItemHref","getLinkHref","action","currentItemId","highlightedItemId","displays","Readonly","Record","layoutComponents","filterControls","inlineEdit","onInlineEdit","formatError","failure","path","toolbar","emptyMessage","className","keyOf","undefined","id","ListView","t0","$","_c","allColumns","t1","t2","t3","t4","t5","t6","t7","controlledLayout","selectableProp","actionsProp","t8","primaryActionProp","getItemLabelProp","t9","t10","t11","t12","ariaLabel","t13","filtersProp","layoutsProp","intl","toasts","plugins","query","view","selection","filterLabels","confirming","setConfirming","preview","setPreview","confirmation","root","pending","setPending","t14","Symbol","for","saved","setSaved","t15","base","find","candidate","current","showItem","t16","formatMessage","label","t17","item_0","pageItems","map","count","length","t18","sort","t19","listLayouts","Object","fromEntries","t20","t21","allLayouts","t22","available","filter","chosenLayout","includes","Layout","table","inCalendar","t23","t24","entries","t25","id_0","filterValues","q","keys","hasQuery","grouped","toolbarActions","menu","_temp","selectionActions","_temp2","resourceActions","_temp3","selectedCount","t26","item_1","selectedItems","pageSelection","item_2","titleColumn","column","title","locale","renderValue","renderCell","item_3","column_0","content","field","current_0","base_0","value","name","closeConfirmation","execute","event","Promise","resolve","then","outcome","scope","clearSelection","catch","caught","show","actionFailed","message","description","tone","run","event_0","action_2","selection_0","dryRun","current_1","asks","confirm","status","result","skipped","Math","max","runOnItem","action_3","item_4","runOnSelection","action_4","selected","getSelection","item_5","runOnResource","action_5","pageActions","item_6","row","firstOf","action_6","flat","entry","slots","flatMap","id_1","some","slot","renderActions","item_7","allowed","running","endsWith","split","action_7","t27","selectPage","pageCheckbox","ids","_temp4","deselect","select","sortable","_temp5","choosesColumns","showToolbar","t28","clearFilters","forEach","id_2","setFilter","setSearch","t29","bb0","t30","loadFailed","t31","retry","t32","perPage","noResults","empty","t33","state","item_9","item_10","item_11","item_12","t34","item_13","toggle","t35","column_3","toggleSort","timeZone","_temp6","field_0","month","onMonthChange","setMonth","more","body","highlightShown","item_14","element","querySelector","reduced","window","matchMedia","matches","scrollIntoView","block","behavior","toolbarStart","id_3","value_0","remember","labels","toolbarEnd","tableSort","setSort","next_0","setLayout","ids_0","setColumns","resetColumns","action_8","action_9","id_4","t36","t37","selectionCount","mode","allMatchingSelected","selectAllMatching","action_10","skipped_0","item_15","t38","t39","t40","cursor","page","previousPage","nextPage","setPerPage","setPage","perPage_0","t41","event_1","t42","t43","column_2","column_1","item_8","action_1","action_0","index","all","findIndex","candidate_0","_c","styles"],"sources":["../src/ListView.tsx"],"sourcesContent":["import { type ReactNode, useEffect, useRef, useState } from 'react';\n\nimport type { List, ResolvedCalendar } from '@panneau/core';\nimport {\n asksConfirmation,\n currentMonth,\n formatRuleFailure,\n selectItemActions,\n usePlugins,\n} from '@panneau/core';\nimport { getActionLabel } from '@panneau/intl';\nimport type { Action, Field, Filter, RuleFailure } from '@panneau/protocol';\nimport { Alert, Button, Checkbox, usePanneauIntl, useToast } from '@panneau/ui';\n\nimport { ListSkeleton } from './ListSkeleton';\nimport styles from './ListView.module.css';\nimport { ActionButton } from './actions/ActionButton';\nimport { ConfirmDialog, type ConfirmPreview, needsConfirmation } from './actions/ConfirmDialog';\nimport { RowActions, orderRowActions } from './actions/RowActions';\nimport {\n type ListActions,\n getActionHref,\n groupListActions,\n hasScope,\n isAllowedOn,\n} from './actions/actions';\nimport type { ActionIcons } from './actions/icons';\nimport { getShownColumns } from './columns';\nimport { cx } from './cx';\nimport { FilterChips, FilterControls, useFilterLabels } from './filters/Filters';\nimport { getImageUrl } from './images';\nimport { InlineCell } from './inline/InlineCell';\nimport { getInlineField } from './inline/editable';\nimport { builtInLayouts } from './layouts/builtIn';\nimport { getCalendarTimeZone } from './layouts/calendarDays';\nimport { messages } from './messages';\nimport { countSelected, getPageSelection, isItemSelected } from './selection';\nimport { ColumnMenu } from './toolbar/ColumnMenu';\nimport { LayoutSwitch } from './toolbar/LayoutSwitch';\nimport { CursorPagination, Pagination } from './toolbar/Pagination';\nimport { SearchField } from './toolbar/SearchField';\nimport { SortSelect } from './toolbar/SortSelect';\nimport type {\n DisplayEntry,\n FilterEntry,\n ListActionEvent,\n ListActionHandler,\n ListActionPreviewer,\n ListColumn,\n ListInlineEditHandler,\n ListItem,\n ListLayoutEntry,\n} from './types';\nimport { useListState } from './useListState';\nimport { useRenderValue } from './useRenderValue';\nimport { getColumnValue, toText } from './values';\n\nexport interface ListViewProps {\n /** The list state of `@panneau/core` (`useList()`): query and selection. */\n list: List;\n /**\n * The items of the current page. `undefined` while they load for the first time: the list\n * draws a skeleton of its rows, from its columns and its page size.\n */\n items: readonly ListItem[] | undefined;\n /**\n * Every column of the list. Those with `hidden` are shown when the user chooses them, from\n * the \"Columns\" menu, and the view of the list state says which ones are shown (decision 0042).\n */\n columns: readonly ListColumn[];\n /** Offers the user to show, hide and order the columns. Defaults to `true`. */\n columnChoice?: boolean;\n /**\n * How many items match the query, on every page (`meta.total`). With it, the list shows\n * pagination and offers to select every matching item. Without it, `items` is the whole list.\n */\n total?: number | undefined;\n /**\n * The cursors of the page, for a list paged with cursors (`nextCursor` and `previousCursor`\n * of its `meta`): the list then has buttons to the previous and next pages, without page\n * numbers or a total, and doesn't offer to select every matching item.\n */\n cursors?: { next: string | null; previous?: string | null | undefined } | undefined;\n /** Shows that items are loading. Items already shown stay, dimmed. */\n isLoading?: boolean;\n /** An error while loading: an alert with a retry replaces the items. */\n error?: Error | null;\n onRetry?: () => void;\n /** Filter controls, with chips for the active filters. */\n filters?: readonly Filter[];\n /** Fields of the items, for the labels and options of filters that are not columns. */\n fields?: readonly Field[];\n /** Shows a search field (`q`). */\n search?: boolean;\n /** Layouts to choose from, the first one being the default. Defaults to `['table']`. */\n layouts?: readonly string[];\n /** The layout, controlled. Without it, the layout is the view of the list state. */\n layout?: string;\n onLayoutChange?: (layout: string) => void;\n /** Page sizes to choose from. */\n perPageOptions?: readonly number[];\n /** Shows checkboxes. Defaults to whether there are selection actions. */\n selectable?: boolean;\n /**\n * Actions: a list (placed by their `placement`, or by scope), or grouped by placement as\n * `resolveList()` does. Those the user can't run (`abilities.run`) are hidden.\n */\n actions?: ListActions;\n /** Runs an action, after its confirmation. */\n onAction?: ListActionHandler;\n /**\n * Asks the backend how many items of a query selection (\"Select all N items\") an action will\n * skip, before the confirmation: the list only knows the abilities of the current page. Only\n * for actions with `dryRun`. `useActionPreview()` of `@panneau/actions` is one.\n */\n previewAction?: ListActionPreviewer;\n /**\n * Icons of actions by action id (`{ archive: Archive }`), for actions written in code. They\n * win over the Lucide icon an action names (`\"icon\": \"archive\"`).\n */\n actionIcons?: ActionIcons;\n /** The field that titles items, for their label (`itemTitle` of the resource). */\n itemTitle?: string;\n /**\n * The field shown as the image of items (`itemImage` of the resource, or `media` in a media\n * library): a media reference, a media, a file or a URL. The `gallery` layout needs it\n * (decision 0044), and the table starts each title with its thumbnail (decision 0061).\n */\n itemImage?: string | undefined;\n /**\n * The calendar of the list (`calendar` of `resolveList()`), for its `calendar` layout. The list\n * state asks for its month when it is given the same calendar.\n */\n calendar?: Pick<ResolvedCalendar, 'field' | 'filter'> | null | undefined;\n /**\n * The id of the main action of rows, which keeps its label while the others show their icons\n * (decision 0060): the one the title of an item opens, `edit` for a resource that opens its\n * items in their form. Defaults to `show` when rows have it, else `edit`.\n */\n primaryAction?: string | null;\n /** The label of an item, for checkboxes and actions. Defaults to its title, then its id. */\n getItemLabel?: (item: ListItem) => string;\n /** A link to an item, on its title. */\n getItemHref?: (item: ListItem) => string | null;\n /**\n * The link of a built-in `show` or `edit` action without a `url` or a `route` (decision 0040),\n * which the caller resolves to its own routes. Without it, or when it answers `null`, the list\n * leaves those links out.\n */\n getLinkHref?: (action: Action, item: ListItem) => string | null;\n /**\n * The item shown next to the list, such as in a panel of its details: its row is marked, and\n * the link of its title is the current page.\n */\n currentItemId?: string | null;\n /**\n * An item that just appeared, such as one just created (decision 0066): once it is among the\n * items, it is scrolled into view, and its background shows it for a moment, then fades.\n */\n highlightedItemId?: string | null;\n /** Displays by name, over the built-in ones and those of the plugins. */\n displays?: Readonly<Record<string, DisplayEntry>>;\n /** Layouts by id, over the built-in ones and those of the plugins. */\n layoutComponents?: Readonly<Record<string, ListLayoutEntry>>;\n /** Filter controls by filter type, over the built-in ones. */\n filterControls?: Readonly<Record<string, FilterEntry>>;\n /**\n * The fields that columns edit in place (`inlineEdit` of the list), on the items that can be\n * updated, in the table (decision 0043). Needs `onInlineEdit`.\n */\n inlineEdit?: readonly string[];\n /** Saves a field edited in place, and resolves with the updated item. */\n onInlineEdit?: ListInlineEditHandler;\n /**\n * The message of a portable rule that a value edited in place fails. Defaults to\n * `formatRuleFailure()` of `@panneau/core`, in English; `useFormatRuleFailure()` of\n * `@panneau/forms` translates them.\n */\n formatError?: (failure: RuleFailure, path: string) => string;\n /** Content at the end of the toolbar, such as a button to create an item. */\n toolbar?: ReactNode;\n /** Shown when the list has no items, without filters or search. */\n emptyMessage?: ReactNode;\n /** Accessible name of the list. Defaults to \"Items\". */\n 'aria-label'?: string;\n className?: string;\n}\n\nfunction keyOf(action: Action, item?: ListItem): string {\n return item !== undefined ? `${action.id}\\u0000${item.id}` : action.id;\n}\n\n/**\n * Renders the list state of `@panneau/core`: the items of the current page in a layout (table or\n * cards), with sorting, search, filters and their chips, pagination, selection and actions. It\n * fetches nothing: the caller gives the items of the list's query and their total.\n */\nexport function ListView({\n list,\n items,\n columns: allColumns,\n columnChoice = true,\n total,\n cursors,\n isLoading = false,\n error = null,\n onRetry,\n filters: filtersProp = [],\n fields = [],\n search = false,\n layouts: layoutsProp = ['table'],\n layout: controlledLayout,\n onLayoutChange,\n perPageOptions,\n selectable: selectableProp,\n actions: actionsProp,\n onAction,\n previewAction,\n actionIcons,\n itemTitle,\n itemImage,\n calendar = null,\n primaryAction: primaryActionProp,\n getItemLabel: getItemLabelProp,\n getItemHref,\n getLinkHref,\n currentItemId = null,\n highlightedItemId = null,\n displays,\n layoutComponents,\n filterControls,\n inlineEdit = [],\n onInlineEdit,\n formatError = formatRuleFailure,\n toolbar,\n emptyMessage,\n 'aria-label': ariaLabel,\n className,\n}: ListViewProps) {\n const intl = usePanneauIntl();\n const toasts = useToast();\n const plugins = usePlugins();\n const { query, view, selection } = useListState(list);\n const filterLabels = useFilterLabels();\n const [confirming, setConfirming] = useState<ListActionEvent | null>(null);\n const [preview, setPreview] = useState<ConfirmPreview | null>(null);\n // The confirmation a dry run belongs to: a later one, or a cancel, discards its answer.\n const confirmation = useRef(0);\n const root = useRef<HTMLDivElement>(null);\n const [pending, setPending] = useState<string | null>(null);\n\n // Items saved in place, over the item the caller gave, until it gives another one.\n const [saved, setSaved] = useState<\n Readonly<Record<string, { base: ListItem; item: ListItem }>>\n >({});\n const showItem = (item: ListItem) => {\n const base = items?.find((candidate) => candidate.id === item.id);\n if (base !== undefined) {\n setSaved((current) => ({ ...current, [item.id]: { base, item } }));\n }\n };\n\n const label = ariaLabel ?? intl.formatMessage(messages.list);\n const pageItems = (items ?? []).map((item) =>\n saved[item.id]?.base === item ? (saved[item.id]?.item ?? item) : item,\n );\n const count = total ?? pageItems.length;\n const sort = query.sort ?? [];\n\n const allLayouts: Record<string, ListLayoutEntry> = {\n ...builtInLayouts,\n ...(Object.fromEntries(plugins.listLayouts) as Record<string, ListLayoutEntry>),\n ...layoutComponents,\n };\n // Layouts without a component (a plugin's that isn't installed) are left out, and so are the\n // gallery without images and the calendar without a calendar.\n const available = layoutsProp.filter(\n (id) =>\n allLayouts[id] !== undefined &&\n (id !== 'gallery' || itemImage !== undefined) &&\n (id !== 'calendar' || calendar !== null),\n );\n const layouts = available.length > 0 ? available : ['table'];\n const chosenLayout =\n view.layout !== undefined && layouts.includes(view.layout) ? view.layout : undefined;\n const layout = controlledLayout ?? chosenLayout ?? layouts[0] ?? 'table';\n const columns = getShownColumns(allColumns, view.columns);\n const Layout = allLayouts[layout] ?? builtInLayouts.table;\n const inCalendar = layout === 'calendar' && calendar !== null;\n // The calendar asks for its month through its filter, which it sets itself.\n const filters = inCalendar\n ? filtersProp.filter((filter) => filter.id !== calendar.filter)\n : filtersProp;\n const filterValues = Object.fromEntries(\n Object.entries(query.filter ?? {}).filter(\n ([id]) => !(inCalendar && id === calendar.filter),\n ),\n );\n const hasQuery = Object.keys(filterValues).length > 0 || (query.q ?? '') !== '';\n\n const grouped = groupListActions(actionsProp);\n // Actions placed in the menu also apply to selections, from the toolbar (once each).\n const toolbarActions = [...grouped.toolbar, ...grouped.menu].filter(\n (action, index, all) =>\n (hasScope(action, 'selection') || hasScope(action, 'resource')) &&\n all.findIndex((candidate) => candidate.id === action.id) === index,\n );\n const selectionActions = toolbarActions.filter((action) => hasScope(action, 'selection'));\n const resourceActions = toolbarActions.filter((action) => hasScope(action, 'resource'));\n const selectable = selectableProp ?? selectionActions.length > 0;\n\n const selectedCount = selectable ? countSelected(selection, count) : 0;\n const selectedItems = pageItems.filter((item) => isItemSelected(selection, item.id));\n const pageSelection = getPageSelection(selection, pageItems);\n\n const getItemLabel = (item: ListItem): string => {\n if (getItemLabelProp !== undefined) {\n return getItemLabelProp(item);\n }\n const titleColumn =\n allColumns.find((column) => column.id === itemTitle) ??\n (itemTitle === undefined ? columns[0] : undefined);\n const title =\n titleColumn !== undefined\n ? toText(getColumnValue(item, titleColumn, intl.locale), intl.locale)\n : itemTitle !== undefined\n ? toText(item[itemTitle], intl.locale)\n : '';\n return title !== '' ? title : item.id;\n };\n\n const renderValue = useRenderValue(displays);\n\n const renderCell = (item: ListItem, column: ListColumn, content: ReactNode): ReactNode => {\n const field = onInlineEdit !== undefined ? getInlineField(column, item, inlineEdit) : null;\n if (field === null || onInlineEdit === undefined) {\n return content;\n }\n return (\n <InlineCell\n key={`${item.id}\\u0000${column.id}`}\n item={item}\n field={field}\n itemLabel={getItemLabel(item)}\n getItemLabel={getItemLabel}\n renderValue={(current) => renderValue(current, column)}\n onSave={(base, value) => onInlineEdit({ item: base, field, value })}\n onItem={showItem}\n formatError={(failure) => formatError(failure, field.name)}\n >\n {content}\n </InlineCell>\n );\n };\n\n const closeConfirmation = () => {\n confirmation.current += 1;\n setConfirming(null);\n setPreview(null);\n };\n\n const execute = async (event: ListActionEvent) => {\n closeConfirmation();\n setPending(keyOf(event.action, event.item));\n // A promise chain rather than `try`, which the React Compiler only handles in part.\n await Promise.resolve()\n .then(() => onAction?.(event))\n .then((outcome) => {\n // `false`: the action didn't run (its parameters were cancelled).\n if (event.scope === 'selection' && outcome !== false) {\n list.clearSelection();\n }\n })\n .catch((caught: unknown) => {\n toasts.show({\n title: intl.formatMessage(messages.actionFailed, {\n action: getActionLabel(event.action, intl),\n }),\n ...(caught instanceof Error && caught.message !== ''\n ? { description: caught.message }\n : {}),\n tone: 'danger',\n });\n });\n setPending(null);\n };\n\n const run = (event: ListActionEvent) => {\n const { action, selection } = event;\n if (\n previewAction !== undefined &&\n action.dryRun === true &&\n selection !== undefined &&\n 'query' in selection\n ) {\n // Every item matching a query: only the backend knows how many it would skip.\n const current = ++confirmation.current;\n const asks = action.confirm !== undefined && action.confirm !== false;\n setConfirming(event);\n setPreview({ status: 'loading' });\n previewAction(event).then(\n (result) => {\n if (confirmation.current !== current) {\n return;\n }\n const skipped = result?.skipped ?? event.skipped.length;\n // An undoable action asks above the limit of the undo, counted without the\n // items it skips (decision 0063).\n if (\n skipped === 0 &&\n !asks &&\n !asksConfirmation(action, Math.max(0, event.count - skipped))\n ) {\n void execute(event);\n } else {\n setPreview(result !== null ? { status: 'done', ...result } : null);\n }\n },\n () => {\n // Without an answer, the list confirms with what it knows.\n if (confirmation.current !== current) {\n return;\n }\n if (needsConfirmation(event)) {\n setPreview(null);\n } else {\n void execute(event);\n }\n },\n );\n return;\n }\n if (needsConfirmation(event)) {\n setConfirming(event);\n } else {\n void execute(event);\n }\n };\n\n const runOnItem = (action: Action, item: ListItem) =>\n run({ action, scope: 'item', item, count: 1, skipped: [] });\n\n const runOnSelection = (action: Action) => {\n const selected = list.getSelection();\n if (selected === null) {\n return;\n }\n run({\n action,\n scope: 'selection',\n selection: selected,\n count: selectedCount,\n skipped: selectedItems.filter((item) => !isAllowedOn(action, item)),\n });\n };\n\n const runOnResource = (action: Action) =>\n run({ action, scope: 'resource', count: count, skipped: [] });\n\n // The actions of the rows of the page, in order: each row keeps the place of those it doesn't\n // have, so they line up (decision 0060).\n const pageActions = pageItems.map((item) => [\n ...selectItemActions(grouped.row, item, 'row', { getLinkHref }),\n ...selectItemActions(grouped.menu, item, 'menu', { getLinkHref }),\n ]);\n const firstOf = (action: Action) =>\n pageActions.flat().find((entry) => entry.action.id === action.id) ?? [];\n const slots = orderRowActions(grouped.row.flatMap(firstOf), grouped.menu.flatMap(firstOf));\n const primaryAction =\n primaryActionProp !== undefined\n ? primaryActionProp\n : (['show', 'edit'].find((id) => slots.some((slot) => slot.action.id === id)) ?? null);\n\n // The actions of a row and of its menu, as everywhere else an item shows its actions\n const renderActions = (item: ListItem): ReactNode => {\n const allowed = selectItemActions(grouped.row, item, 'row', { getLinkHref });\n const menu = selectItemActions(grouped.menu, item, 'menu', { getLinkHref });\n if (allowed.length === 0 && menu.length === 0) {\n return null;\n }\n const running =\n pending?.endsWith(`\\u0000${item.id}`) === true ? pending.split('\\u0000')[0] : null;\n return (\n <RowActions\n itemLabel={getItemLabel(item)}\n actions={allowed}\n menu={menu}\n pending={running ?? null}\n onRun={(action) => runOnItem(action, item)}\n icons={actionIcons}\n slots={slots}\n primary={primaryAction}\n />\n );\n };\n\n const pageCheckbox = (\n <Checkbox\n aria-label={intl.formatMessage(messages.selectPage)}\n isSelected={pageSelection === 'all'}\n isIndeterminate={pageSelection === 'some'}\n isDisabled={pageItems.length === 0}\n onChange={() => {\n const ids = pageItems.map((item) => item.id);\n if (pageSelection === 'all') {\n list.deselect(ids);\n } else {\n list.select(ids);\n }\n }}\n />\n );\n\n const sortable = allColumns.some((column) => column.sortable === true);\n const choosesColumns = columnChoice && allColumns.length > 1;\n const showToolbar =\n search ||\n filters.length > 0 ||\n sortable ||\n choosesColumns ||\n layouts.length > 1 ||\n resourceActions.length > 0 ||\n toolbar !== undefined;\n\n function clearFilters() {\n Object.keys(filterValues).forEach((id) => list.setFilter(id, undefined));\n if ((query.q ?? '') !== '') {\n list.setSearch('');\n }\n }\n\n const body = (() => {\n if (error !== null) {\n return (\n <Alert\n tone=\"danger\"\n title={intl.formatMessage(messages.loadFailed)}\n actions={\n onRetry !== undefined ? (\n <Button size=\"sm\" onPress={onRetry}>\n {intl.formatMessage(messages.retry)}\n </Button>\n ) : undefined\n }\n >\n {error.message}\n </Alert>\n );\n }\n if (items === undefined) {\n return (\n <ListSkeleton\n Layout={Layout}\n columns={columns}\n perPage={query.perPage}\n sort={sort}\n label={label}\n withImages={itemImage !== undefined}\n />\n );\n }\n // An empty month is still a calendar: it goes to the others.\n if (pageItems.length === 0 && !inCalendar) {\n return (\n <div className={styles.state}>\n <p>\n {hasQuery\n ? intl.formatMessage(messages.noResults)\n : (emptyMessage ?? intl.formatMessage(messages.empty))}\n </p>\n {hasQuery ? (\n <Button size=\"sm\" onPress={() => clearFilters()}>\n {intl.formatMessage(messages.clearFilters)}\n </Button>\n ) : null}\n </div>\n );\n }\n return (\n <Layout\n items={pageItems}\n columns={columns}\n renderValue={renderValue}\n getItemLabel={getItemLabel}\n getItemHref={getItemHref}\n getItemImage={\n itemImage !== undefined ? (item) => getImageUrl(item[itemImage]) : undefined\n }\n calendar={\n inCalendar\n ? {\n field: calendar.field,\n timeZone: getCalendarTimeZone(\n [...fields, ...allColumns.map((column) => column.field)].find(\n (field) => field?.name === calendar.field,\n ),\n ),\n month: view.month ?? currentMonth(),\n onMonthChange: (month) => list.setMonth(month),\n more:\n total !== undefined && total > pageItems.length\n ? { total }\n : cursors !== undefined && cursors.next !== null\n ? { total: null }\n : null,\n }\n : undefined\n }\n isCurrent={(item) => item.id === currentItemId}\n isHighlighted={(item) => item.id === highlightedItemId}\n selectable={selectable}\n isSelected={(item) => isItemSelected(selection, item.id)}\n onToggle={(item) => list.toggle(item.id)}\n renderActions={renderActions}\n sort={sort}\n onSort={(column) => list.toggleSort(column.id)}\n label={label}\n pageSelection={pageCheckbox}\n renderCell={renderCell}\n />\n );\n })();\n\n // The highlighted item comes into view once the list shows it\n const highlightShown =\n highlightedItemId !== null && pageItems.some((item) => item.id === highlightedItemId);\n useEffect(() => {\n if (!highlightShown) {\n return;\n }\n const element = root.current?.querySelector<HTMLElement>('[data-highlighted]');\n const reduced = window.matchMedia?.('(prefers-reduced-motion: reduce)').matches;\n element?.scrollIntoView?.({ block: 'nearest', behavior: reduced ? 'auto' : 'smooth' });\n }, [highlightShown, highlightedItemId]);\n\n return (\n <div ref={root} className={cx(styles.list, className)}>\n {showToolbar ? (\n <div className={styles.toolbar}>\n <div className={styles.toolbarStart}>\n {search ? (\n <SearchField\n value={query.q ?? ''}\n onChange={(q) => list.setSearch(q)}\n />\n ) : null}\n {filters.length > 0 ? (\n <FilterControls\n filters={filters}\n values={filterValues}\n onChange={(id, value) => list.setFilter(id, value)}\n onLabel={filterLabels.remember}\n controls={filterControls}\n columns={allColumns}\n fields={fields}\n labels={filterLabels.labels}\n />\n ) : null}\n </div>\n <div className={styles.toolbarEnd}>\n {sortable ? (\n <div className={layout === 'table' ? styles.tableSort : undefined}>\n <SortSelect\n columns={allColumns}\n sort={sort}\n onChange={(next) => list.setSort(next)}\n />\n </div>\n ) : null}\n {layouts.length > 1 ? (\n <LayoutSwitch\n layouts={layouts}\n value={layout}\n onChange={(next) => {\n if (controlledLayout === undefined) {\n list.setLayout(next);\n }\n onLayoutChange?.(next);\n }}\n />\n ) : null}\n {choosesColumns ? (\n <ColumnMenu\n columns={allColumns}\n shown={columns}\n onChange={(ids) => list.setColumns(ids)}\n onReset={\n view.columns !== undefined ? () => list.resetColumns() : null\n }\n />\n ) : null}\n {resourceActions\n .filter(\n (action) => selectedCount === 0 || !hasScope(action, 'selection'),\n )\n .map((action) => (\n <ActionButton\n key={action.id}\n action={action}\n icons={actionIcons}\n size=\"md\"\n href={getActionHref(action)}\n isPending={pending === keyOf(action)}\n onPress={() => runOnResource(action)}\n />\n ))}\n {toolbar}\n </div>\n </div>\n ) : null}\n <FilterChips\n filters={filters}\n values={filterValues}\n q={query.q}\n onRemove={(id) => list.setFilter(id, undefined)}\n onClearSearch={() => list.setSearch('')}\n onClear={clearFilters}\n columns={allColumns}\n fields={fields}\n labels={filterLabels.labels}\n />\n {selectedCount > 0 ? (\n <div className={styles.selection}>\n <span className={styles.selectionCount} role=\"status\">\n {selection.mode === 'all'\n ? intl.formatMessage(messages.allMatchingSelected, {\n total: selectedCount,\n })\n : intl.formatMessage(messages.selectedCount, { count: selectedCount })}\n </span>\n {selection.mode === 'ids' &&\n pageSelection === 'all' &&\n count > pageItems.length ? (\n <Button size=\"sm\" variant=\"ghost\" onPress={() => list.selectAllMatching()}>\n {intl.formatMessage(messages.selectAllMatching, { total: count })}\n </Button>\n ) : null}\n <Button size=\"sm\" variant=\"ghost\" onPress={() => list.clearSelection()}>\n {intl.formatMessage(messages.clearSelection)}\n </Button>\n {selectionActions.length > 0 ? (\n <div className={styles.selectionActions}>\n {selectionActions.map((action) => {\n const skipped = selectedItems.filter(\n (item) => !isAllowedOn(action, item),\n ).length;\n return (\n <ActionButton\n key={action.id}\n action={action}\n icons={actionIcons}\n size=\"md\"\n href={null}\n isPending={pending === keyOf(action)}\n isDisabled={\n (pending !== null && pending !== keyOf(action)) ||\n skipped >= selectedCount\n }\n onPress={() => runOnSelection(action)}\n />\n );\n })}\n </div>\n ) : null}\n </div>\n ) : null}\n <div className={styles.body} aria-busy={isLoading && items !== undefined}>\n {body}\n </div>\n {inCalendar ? null : cursors !== undefined && error === null ? (\n <CursorPagination\n perPage={query.perPage ?? pageItems.length}\n hasPrevious={query.cursor !== undefined}\n hasNext={cursors.next !== null}\n onPrevious={() => list.previousPage(cursors.previous)}\n onNext={() => {\n if (cursors.next !== null) {\n list.nextPage(cursors.next);\n }\n }}\n perPageOptions={perPageOptions}\n onPerPageChange={(perPage) => list.setPerPage(perPage)}\n />\n ) : total !== undefined && error === null && total > 0 ? (\n <Pagination\n page={query.page ?? 1}\n perPage={query.perPage ?? pageItems.length}\n total={total}\n onPageChange={(page) => list.setPage(page)}\n perPageOptions={perPageOptions}\n onPerPageChange={(perPage) => list.setPerPage(perPage)}\n />\n ) : null}\n <ConfirmDialog\n event={confirming}\n preview={preview}\n onConfirm={(event) => void execute(event)}\n onCancel={closeConfirmation}\n />\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { messages } from "../messages.js";
2
- import { findOption, getFieldOptions, isRecord, toText } from "../values.js";
3
2
  import { getImageUrl } from "../images.js";
3
+ import { findOption, getFieldOptions, isRecord, toText } from "../values.js";
4
4
  import Displays_module_default from "./Displays.module.js";
5
5
  import { c } from "react/compiler-runtime";
6
6
  import { fieldsMessages } from "@panneau/intl";
@@ -1 +1 @@
1
- {"version":3,"file":"controls.d.ts","sourceRoot":"","sources":["../../src/filters/controls.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAchE,kEAAkE;AAClE,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,kBAAkB,+BAmBxE;AAED,8DAA8D;AAC9D,wBAAgB,YAAY,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,kBAAkB,+BAgC3F;AAED,iEAAiE;AACjE,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,kBAAkB,+BAU1E;AAED,4BAA4B;AAC5B,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,kBAAkB,+BASxE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,kBAAkB,+BAmC7E;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,EAC3B,MAAM,EACN,KAAK,EACL,KAAK,EACL,QAAQ,EACR,OAAO,EACP,aAAa,GAChB,EAAE,kBAAkB,+BA8CpB;AAED,oFAAoF;AACpF,eAAO,MAAM,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAOhE,CAAC"}
1
+ {"version":3,"file":"controls.d.ts","sourceRoot":"","sources":["../../src/filters/controls.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAchE,kEAAkE;AAClE,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,kBAAkB,+BAmBxE;AAED,8DAA8D;AAC9D,wBAAgB,YAAY,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,kBAAkB,+BAgC3F;AAED,iEAAiE;AACjE,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,kBAAkB,+BAU1E;AAED,4BAA4B;AAC5B,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,kBAAkB,+BASxE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,kBAAkB,+BAmC7E;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,EAC3B,MAAM,EACN,KAAK,EACL,KAAK,EACL,QAAQ,EACR,OAAO,EACP,aAAa,GAChB,EAAE,kBAAkB,+BAgDpB;AAED,oFAAoF;AACpF,eAAO,MAAM,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAOhE,CAAC"}
@@ -5,10 +5,10 @@ import { c } from "react/compiler-runtime";
5
5
  import { Fieldset, Select, Switch, TextInput, usePanneauIntl } from "@panneau/ui";
6
6
  import { jsx, jsxs } from "react/jsx-runtime";
7
7
  import { useFieldsContext } from "@panneau/fields";
8
+ import { isFilterRange } from "@panneau/protocol/runtime";
8
9
  import { useEffect } from "react";
9
10
  import { DateField } from "@panneau/fields/date";
10
11
  import { RelationField, useRelationReferences } from "@panneau/fields/relation";
11
- import { isFilterRange } from "@panneau/protocol/runtime";
12
12
  //#region src/filters/controls.tsx
13
13
  function asStrings(value) {
14
14
  if (isFilterRange(value)) return [];
@@ -394,7 +394,8 @@ function RelationFilter(t0) {
394
394
  resource,
395
395
  value: references,
396
396
  onChange: t6,
397
- className: Filters_module_default.control
397
+ className: Filters_module_default.control,
398
+ compact: true
398
399
  });
399
400
  $[14] = label;
400
401
  $[15] = references;
@@ -418,6 +419,7 @@ function RelationFilter(t0) {
418
419
  let t8;
419
420
  if ($[22] !== label || $[23] !== resource || $[24] !== t6 || $[25] !== t7) {
420
421
  t8 = /* @__PURE__ */ jsx(RelationField, {
422
+ compact: true,
421
423
  label,
422
424
  resource,
423
425
  value: t6,
@@ -1 +1 @@
1
- {"version":3,"file":"controls.js","names":["useEffect","useFieldsContext","DateField","RelationField","useRelationReferences","FilterValue","isFilterRange","Fieldset","OptionValue","Select","Switch","TextInput","usePanneauIntl","messages","FilterControlProps","FilterEntry","useDraft","styles","asStrings","value","Array","isArray","map","String","undefined","TextFilter","t0","$","_c","label","onChange","current","t1","next","draft","setDraft","flush","t2","event","key","t3","control","SelectFilter","filter","options","intl","T0","t4","t5","multiple","Symbol","for","bb0","selected","t6","values","option","includes","_temp","toOptions","t7","formatMessage","any","placeholder","t8","length","next_0","option_0","ToggleFilter","checked","toggle","DateFilter","DateRangeFilter","range","from","to","nextFrom","nextTo","set","rangeDash","t9","t10","t11","t12","rangeInputs","t13","RelationFilter","onLabel","getValueLabel","resource","id","relationSource","references","forEach","reference","remember","_temp2","reference_1","ids","_temp3","next_1","reference_2","reference_0","builtInFilters","Readonly","Record","text","select","date","relation","_c","styles"],"sources":["../../src/filters/controls.tsx"],"sourcesContent":["import { useEffect } from 'react';\n\nimport { useFieldsContext } from '@panneau/fields';\nimport { DateField } from '@panneau/fields/date';\nimport { RelationField, useRelationReferences } from '@panneau/fields/relation';\nimport type { FilterValue } from '@panneau/protocol';\nimport { isFilterRange } from '@panneau/protocol/runtime';\nimport { Fieldset, type OptionValue, Select, Switch, TextInput, usePanneauIntl } from '@panneau/ui';\n\nimport { messages } from '../messages';\nimport type { FilterControlProps, FilterEntry } from '../types';\nimport { useDraft } from '../useDraft';\nimport styles from './Filters.module.css';\n\nfunction asStrings(value: unknown): string[] {\n if (isFilterRange(value)) {\n return [];\n }\n if (Array.isArray(value)) {\n return value.map(String);\n }\n return value === undefined || value === null || value === '' ? [] : [String(value)];\n}\n\n/** A text filter: the list changes once the user stops typing. */\nexport function TextFilter({ label, value, onChange }: FilterControlProps) {\n const current = typeof value === 'string' || typeof value === 'number' ? String(value) : '';\n const { draft, setDraft, flush } = useDraft(current, (next) =>\n onChange(next !== '' ? next : undefined),\n );\n return (\n <TextInput\n label={label}\n value={draft}\n onChange={setDraft}\n onKeyDown={(event) => {\n if (event.key === 'Enter') {\n flush();\n }\n }}\n onBlur={flush}\n className={styles.control}\n />\n );\n}\n\n/** A choice among the options, or several with `multiple`. */\nexport function SelectFilter({ filter, label, options, value, onChange }: FilterControlProps) {\n const intl = usePanneauIntl();\n const selected = asStrings(value);\n // Values from the URL are strings: match them to the options' values.\n const toOptions = (values: readonly string[]): OptionValue[] =>\n options\n .filter((option) => values.includes(String(option.value)))\n .map((option) => option.value);\n const placeholder = intl.formatMessage(messages.any);\n if (filter.multiple === true) {\n return (\n <Select\n multiple\n label={label}\n options={options}\n placeholder={placeholder}\n value={toOptions(selected)}\n onChange={(next) => onChange(next.length > 0 ? next : undefined)}\n className={styles.control}\n />\n );\n }\n return (\n <Select\n label={label}\n options={options}\n placeholder={placeholder}\n value={toOptions(selected)[0] ?? null}\n onChange={(next) => onChange(next ?? undefined)}\n className={styles.control}\n />\n );\n}\n\n/** On or off: on filters with `true`, off removes the filter. */\nexport function ToggleFilter({ label, value, onChange }: FilterControlProps) {\n return (\n <Switch\n isSelected={String(value) === 'true'}\n onChange={(checked) => onChange(checked ? true : undefined)}\n className={styles.toggle}\n >\n {label}\n </Switch>\n );\n}\n\n/** A day (`2026-10-15`). */\nexport function DateFilter({ label, value, onChange }: FilterControlProps) {\n return (\n <DateField\n label={label}\n value={typeof value === 'string' && value !== '' ? value : null}\n onChange={(next) => onChange(next ?? undefined)}\n className={styles.control}\n />\n );\n}\n\n/**\n * A range of days, sent as its bounds (`filter[published_at][from]=2026-01-01&…[to]=…`). Either end\n * can be open: it is left out.\n */\nexport function DateRangeFilter({ label, value, onChange }: FilterControlProps) {\n const intl = usePanneauIntl();\n const range = isFilterRange(value) ? value : {};\n const from = range.from !== undefined ? String(range.from) : '';\n const to = range.to !== undefined ? String(range.to) : '';\n const set = (nextFrom: string, nextTo: string) =>\n onChange(\n nextFrom === '' && nextTo === ''\n ? undefined\n : {\n ...(nextFrom !== '' ? { from: nextFrom } : {}),\n ...(nextTo !== '' ? { to: nextTo } : {}),\n },\n );\n return (\n <Fieldset legend={label} className={styles.range}>\n {/* One row, like the other filters: the legend names the range, and each end is named\n for assistive technologies only. */}\n <div className={styles.rangeInputs}>\n <DateField\n aria-label={intl.formatMessage(messages.from)}\n value={from !== '' ? from : null}\n onChange={(next) => set(next ?? '', to)}\n />\n <span className={styles.rangeDash} aria-hidden=\"true\">\n –\n </span>\n <DateField\n aria-label={intl.formatMessage(messages.to)}\n value={to !== '' ? to : null}\n onChange={(next) => set(from, next ?? '')}\n />\n </div>\n </Fieldset>\n );\n}\n\n/**\n * An item of another resource (`resource`), or several with `multiple`, picked with the relation\n * source of the fields context. The filter keeps their ids; their labels are remembered for the\n * chips.\n */\nexport function RelationFilter({\n filter,\n label,\n value,\n onChange,\n onLabel,\n getValueLabel,\n}: FilterControlProps) {\n const resource = filter.resource ?? filter.id;\n // Ids from the URL have no label: the relation source resolves them, for the picker and chips.\n const references = useRelationReferences(\n useFieldsContext().relationSource,\n resource,\n asStrings(value).map((id) => ({ id, label: getValueLabel(id) ?? id })),\n );\n const remember = (next: readonly { id: string; label: string }[]) =>\n next.forEach((reference) => onLabel(reference.id, reference.label));\n useEffect(() => {\n references\n .filter((reference) => reference.label !== reference.id)\n .forEach((reference) => onLabel(reference.id, reference.label));\n }, [references, onLabel]);\n if (filter.multiple === true) {\n return (\n <RelationField\n multiple\n label={label}\n resource={resource}\n value={references}\n onChange={(next) => {\n remember(next ?? []);\n const ids: FilterValue | undefined =\n next !== null && next.length > 0\n ? next.map((reference) => reference.id)\n : undefined;\n onChange(ids);\n }}\n className={styles.control}\n />\n );\n }\n return (\n <RelationField\n label={label}\n resource={resource}\n value={references[0] ?? null}\n onChange={(next) => {\n remember(next !== null ? [next] : []);\n onChange(next?.id);\n }}\n className={styles.control}\n />\n );\n}\n\n/** The built-in filter controls, by filter type. Unknown types are text filters. */\nexport const builtInFilters: Readonly<Record<string, FilterEntry>> = {\n text: TextFilter,\n select: SelectFilter,\n toggle: ToggleFilter,\n date: DateFilter,\n 'date-range': DateRangeFilter,\n relation: RelationFilter,\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"controls.js","names":["useEffect","useFieldsContext","DateField","RelationField","useRelationReferences","FilterValue","isFilterRange","Fieldset","OptionValue","Select","Switch","TextInput","usePanneauIntl","messages","FilterControlProps","FilterEntry","useDraft","styles","asStrings","value","Array","isArray","map","String","undefined","TextFilter","t0","$","_c","label","onChange","current","t1","next","draft","setDraft","flush","t2","event","key","t3","control","SelectFilter","filter","options","intl","T0","t4","t5","multiple","Symbol","for","bb0","selected","t6","values","option","includes","_temp","toOptions","t7","formatMessage","any","placeholder","t8","length","next_0","option_0","ToggleFilter","checked","toggle","DateFilter","DateRangeFilter","range","from","to","nextFrom","nextTo","set","rangeDash","t9","t10","t11","t12","rangeInputs","t13","RelationFilter","onLabel","getValueLabel","resource","id","relationSource","references","forEach","reference","remember","_temp2","reference_1","ids","_temp3","next_1","reference_2","reference_0","builtInFilters","Readonly","Record","text","select","date","relation","_c","styles"],"sources":["../../src/filters/controls.tsx"],"sourcesContent":["import { useEffect } from 'react';\n\nimport { useFieldsContext } from '@panneau/fields';\nimport { DateField } from '@panneau/fields/date';\nimport { RelationField, useRelationReferences } from '@panneau/fields/relation';\nimport type { FilterValue } from '@panneau/protocol';\nimport { isFilterRange } from '@panneau/protocol/runtime';\nimport { Fieldset, type OptionValue, Select, Switch, TextInput, usePanneauIntl } from '@panneau/ui';\n\nimport { messages } from '../messages';\nimport type { FilterControlProps, FilterEntry } from '../types';\nimport { useDraft } from '../useDraft';\nimport styles from './Filters.module.css';\n\nfunction asStrings(value: unknown): string[] {\n if (isFilterRange(value)) {\n return [];\n }\n if (Array.isArray(value)) {\n return value.map(String);\n }\n return value === undefined || value === null || value === '' ? [] : [String(value)];\n}\n\n/** A text filter: the list changes once the user stops typing. */\nexport function TextFilter({ label, value, onChange }: FilterControlProps) {\n const current = typeof value === 'string' || typeof value === 'number' ? String(value) : '';\n const { draft, setDraft, flush } = useDraft(current, (next) =>\n onChange(next !== '' ? next : undefined),\n );\n return (\n <TextInput\n label={label}\n value={draft}\n onChange={setDraft}\n onKeyDown={(event) => {\n if (event.key === 'Enter') {\n flush();\n }\n }}\n onBlur={flush}\n className={styles.control}\n />\n );\n}\n\n/** A choice among the options, or several with `multiple`. */\nexport function SelectFilter({ filter, label, options, value, onChange }: FilterControlProps) {\n const intl = usePanneauIntl();\n const selected = asStrings(value);\n // Values from the URL are strings: match them to the options' values.\n const toOptions = (values: readonly string[]): OptionValue[] =>\n options\n .filter((option) => values.includes(String(option.value)))\n .map((option) => option.value);\n const placeholder = intl.formatMessage(messages.any);\n if (filter.multiple === true) {\n return (\n <Select\n multiple\n label={label}\n options={options}\n placeholder={placeholder}\n value={toOptions(selected)}\n onChange={(next) => onChange(next.length > 0 ? next : undefined)}\n className={styles.control}\n />\n );\n }\n return (\n <Select\n label={label}\n options={options}\n placeholder={placeholder}\n value={toOptions(selected)[0] ?? null}\n onChange={(next) => onChange(next ?? undefined)}\n className={styles.control}\n />\n );\n}\n\n/** On or off: on filters with `true`, off removes the filter. */\nexport function ToggleFilter({ label, value, onChange }: FilterControlProps) {\n return (\n <Switch\n isSelected={String(value) === 'true'}\n onChange={(checked) => onChange(checked ? true : undefined)}\n className={styles.toggle}\n >\n {label}\n </Switch>\n );\n}\n\n/** A day (`2026-10-15`). */\nexport function DateFilter({ label, value, onChange }: FilterControlProps) {\n return (\n <DateField\n label={label}\n value={typeof value === 'string' && value !== '' ? value : null}\n onChange={(next) => onChange(next ?? undefined)}\n className={styles.control}\n />\n );\n}\n\n/**\n * A range of days, sent as its bounds (`filter[published_at][from]=2026-01-01&…[to]=…`). Either end\n * can be open: it is left out.\n */\nexport function DateRangeFilter({ label, value, onChange }: FilterControlProps) {\n const intl = usePanneauIntl();\n const range = isFilterRange(value) ? value : {};\n const from = range.from !== undefined ? String(range.from) : '';\n const to = range.to !== undefined ? String(range.to) : '';\n const set = (nextFrom: string, nextTo: string) =>\n onChange(\n nextFrom === '' && nextTo === ''\n ? undefined\n : {\n ...(nextFrom !== '' ? { from: nextFrom } : {}),\n ...(nextTo !== '' ? { to: nextTo } : {}),\n },\n );\n return (\n <Fieldset legend={label} className={styles.range}>\n {/* One row, like the other filters: the legend names the range, and each end is named\n for assistive technologies only. */}\n <div className={styles.rangeInputs}>\n <DateField\n aria-label={intl.formatMessage(messages.from)}\n value={from !== '' ? from : null}\n onChange={(next) => set(next ?? '', to)}\n />\n <span className={styles.rangeDash} aria-hidden=\"true\">\n –\n </span>\n <DateField\n aria-label={intl.formatMessage(messages.to)}\n value={to !== '' ? to : null}\n onChange={(next) => set(from, next ?? '')}\n />\n </div>\n </Fieldset>\n );\n}\n\n/**\n * An item of another resource (`resource`), or several with `multiple`, picked with the relation\n * source of the fields context. The filter keeps their ids; their labels are remembered for the\n * chips.\n */\nexport function RelationFilter({\n filter,\n label,\n value,\n onChange,\n onLabel,\n getValueLabel,\n}: FilterControlProps) {\n const resource = filter.resource ?? filter.id;\n // Ids from the URL have no label: the relation source resolves them, for the picker and chips.\n const references = useRelationReferences(\n useFieldsContext().relationSource,\n resource,\n asStrings(value).map((id) => ({ id, label: getValueLabel(id) ?? id })),\n );\n const remember = (next: readonly { id: string; label: string }[]) =>\n next.forEach((reference) => onLabel(reference.id, reference.label));\n useEffect(() => {\n references\n .filter((reference) => reference.label !== reference.id)\n .forEach((reference) => onLabel(reference.id, reference.label));\n }, [references, onLabel]);\n if (filter.multiple === true) {\n return (\n <RelationField\n multiple\n label={label}\n resource={resource}\n value={references}\n onChange={(next) => {\n remember(next ?? []);\n const ids: FilterValue | undefined =\n next !== null && next.length > 0\n ? next.map((reference) => reference.id)\n : undefined;\n onChange(ids);\n }}\n className={styles.control}\n compact\n />\n );\n }\n return (\n <RelationField\n compact\n label={label}\n resource={resource}\n value={references[0] ?? null}\n onChange={(next) => {\n remember(next !== null ? [next] : []);\n onChange(next?.id);\n }}\n className={styles.control}\n />\n );\n}\n\n/** The built-in filter controls, by filter type. Unknown types are text filters. */\nexport const builtInFilters: Readonly<Record<string, FilterEntry>> = {\n text: TextFilter,\n select: SelectFilter,\n toggle: ToggleFilter,\n date: DateFilter,\n 'date-range': DateRangeFilter,\n relation: RelationFilter,\n};\n"],"mappings":"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"}
package/dist/images.d.ts CHANGED
@@ -1,7 +1,2 @@
1
- /**
2
- * The URL of an image value: a media reference or a media (its thumbnail, or the URL of an
3
- * image), a stored file (the URL of an image that browsers show), or a URL. `null` for anything
4
- * else, such as a PDF without a thumbnail.
5
- */
6
- export declare function getImageUrl(value: unknown): string | null;
1
+ export { getImageUrl } from '@panneau/protocol/runtime';
7
2
  //# sourceMappingURL=images.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"images.d.ts","sourceRoot":"","sources":["../src/images.ts"],"names":[],"mappings":"AA4BA;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAWzD"}
1
+ {"version":3,"file":"images.d.ts","sourceRoot":"","sources":["../src/images.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC"}
package/dist/images.js CHANGED
@@ -1,39 +1 @@
1
- import { isRecord } from "./values.js";
2
- //#region src/images.ts
3
- /** The types of images that browsers show. A HEIC or TIFF original needs a thumbnail. */
4
- var WEB_IMAGE_TYPES = /* @__PURE__ */ new Set([
5
- "image/apng",
6
- "image/avif",
7
- "image/bmp",
8
- "image/gif",
9
- "image/jpeg",
10
- "image/png",
11
- "image/svg+xml",
12
- "image/webp"
13
- ]);
14
- /**
15
- * Whether the URL of a media or a file is an image to show, from its `type` (a media's URL is
16
- * the file to show) or its `mime` (a file's URL is its original), when it says.
17
- */
18
- function isImage(source) {
19
- if (typeof source.type === "string") return source.type === "image";
20
- if (typeof source.mime === "string") return WEB_IMAGE_TYPES.has(source.mime.toLowerCase());
21
- return true;
22
- }
23
- /**
24
- * The URL of an image value: a media reference or a media (its thumbnail, or the URL of an
25
- * image), a stored file (the URL of an image that browsers show), or a URL. `null` for anything
26
- * else, such as a PDF without a thumbnail.
27
- */
28
- function getImageUrl(value) {
29
- const first = Array.isArray(value) ? value[0] : value;
30
- if (typeof first === "string") return first !== "" ? first : null;
31
- if (!isRecord(first)) return null;
32
- const source = isRecord(first.media) ? first.media : first;
33
- const url = source.thumbnailUrl ?? (isImage(source) ? source.url : null);
34
- return typeof url === "string" && url !== "" ? url : null;
35
- }
36
- //#endregion
37
- export { getImageUrl };
38
-
39
- //# sourceMappingURL=images.js.map
1
+ export { getImageUrl } from "@panneau/protocol/runtime";
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import { getActionHref, groupListActions, isAllowedOn } from "./actions/actions.js";
2
2
  import { ConfirmDialog } from "./actions/ConfirmDialog.js";
3
3
  import { getActionIcon } from "./actions/icons.js";
4
- import { getLocalizedValue, toText } from "./values.js";
5
4
  import { getImageUrl } from "./images.js";
5
+ import { getLocalizedValue, toText } from "./values.js";
6
6
  import { AddressDisplay, BooleanDisplay, ColorDisplay, CountryDisplay, DateDisplay, DateRangeDisplay, DateTimeDisplay, DurationDisplay, EmailDisplay, EmbedDisplay, EmptyValue, FileDisplay, JsonDisplay, LinkDisplay, LocationDisplay, MediaDisplay, MoneyDisplay, NumberDisplay, RegionDisplay, RelationDisplay, RichTextDisplay, SelectDisplay, TagsDisplay, TelDisplay, TextDisplay, TimeDisplay, UrlDisplay, builtInDisplays } from "./displays/displays.js";
7
7
  import { DateFilter, DateRangeFilter, RelationFilter, SelectFilter, TextFilter, ToggleFilter, builtInFilters } from "./filters/controls.js";
8
8
  import { CalendarLayout } from "./layouts/CalendarLayout.js";
@@ -5,9 +5,9 @@ import { c } from "react/compiler-runtime";
5
5
  import { Button, IconButton, Spinner, usePanneauIntl, useToast } from "@panneau/ui";
6
6
  import { jsx, jsxs } from "react/jsx-runtime";
7
7
  import { Pencil } from "lucide-react";
8
+ import { checkValues } from "@panneau/protocol/runtime";
8
9
  import { useEffect, useRef, useState } from "react";
9
10
  import { DateFieldEntry } from "@panneau/fields/date";
10
- import { checkValues } from "@panneau/protocol/runtime";
11
11
  import { BooleanFieldEntry } from "@panneau/fields/boolean";
12
12
  import { NumberFieldEntry } from "@panneau/fields/number";
13
13
  import { SelectFieldEntry } from "@panneau/fields/select";
@@ -5,5 +5,5 @@ import type { ListLayoutProps } from '../types.js';
5
5
  * as its link, in the order of their dates, and buttons to the previous, the next and the current
6
6
  * month. On narrow lists, the days that have items, one under the other.
7
7
  */
8
- export declare function CalendarLayout({ items, columns, renderValue, getItemLabel, getItemHref, isCurrent, label, calendar, }: ListLayoutProps): import("react").JSX.Element;
8
+ export declare function CalendarLayout({ items, columns, renderValue, getItemLabel, getItemHref, isCurrent, isHighlighted, label, calendar, }: ListLayoutProps): import("react").JSX.Element;
9
9
  //# sourceMappingURL=CalendarLayout.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"CalendarLayout.d.ts","sourceRoot":"","sources":["../../src/layouts/CalendarLayout.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAY,eAAe,EAAE,MAAM,UAAU,CAAC;AAiD1D;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,EAC3B,KAAK,EACL,OAAO,EACP,WAAW,EACX,YAAY,EACZ,WAAW,EACX,SAAS,EACT,KAAK,EACL,QAAQ,GACX,EAAE,eAAe,+BA4IjB"}
1
+ {"version":3,"file":"CalendarLayout.d.ts","sourceRoot":"","sources":["../../src/layouts/CalendarLayout.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAY,eAAe,EAAE,MAAM,UAAU,CAAC;AAkD1D;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,EAC3B,KAAK,EACL,OAAO,EACP,WAAW,EACX,YAAY,EACZ,WAAW,EACX,SAAS,EACT,aAAa,EACb,KAAK,EACL,QAAQ,GACX,EAAE,eAAe,+BAqJjB"}