@panneau/lists 5.0.0-alpha.12 → 5.0.0-alpha.13

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 (78) hide show
  1. package/README.md +13 -11
  2. package/dist/List.d.ts +1 -1
  3. package/dist/List.d.ts.map +1 -1
  4. package/dist/List.js +29 -50
  5. package/dist/List.js.map +1 -1
  6. package/dist/ListView.d.ts +34 -5
  7. package/dist/ListView.d.ts.map +1 -1
  8. package/dist/ListView.js +416 -359
  9. package/dist/ListView.js.map +1 -1
  10. package/dist/columns.d.ts +10 -0
  11. package/dist/columns.d.ts.map +1 -0
  12. package/dist/columns.js +25 -0
  13. package/dist/columns.js.map +1 -0
  14. package/dist/displays/Displays.css +12 -0
  15. package/dist/displays/Displays.module.js +6 -2
  16. package/dist/displays/Displays.module.js.map +1 -1
  17. package/dist/displays/displays.d.ts +11 -1
  18. package/dist/displays/displays.d.ts.map +1 -1
  19. package/dist/displays/displays.js +185 -22
  20. package/dist/displays/displays.js.map +1 -1
  21. package/dist/images.d.ts +6 -0
  22. package/dist/images.d.ts.map +1 -0
  23. package/dist/images.js +18 -0
  24. package/dist/images.js.map +1 -0
  25. package/dist/index.d.ts +5 -2
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +5 -2
  28. package/dist/inline/Inline.css +58 -0
  29. package/dist/inline/Inline.module.js +20 -0
  30. package/dist/inline/Inline.module.js.map +1 -0
  31. package/dist/inline/InlineCell.d.ts +27 -0
  32. package/dist/inline/InlineCell.d.ts.map +1 -0
  33. package/dist/inline/InlineCell.js +471 -0
  34. package/dist/inline/InlineCell.js.map +1 -0
  35. package/dist/inline/editable.d.ts +12 -0
  36. package/dist/inline/editable.d.ts.map +1 -0
  37. package/dist/inline/editable.js +29 -0
  38. package/dist/inline/editable.js.map +1 -0
  39. package/dist/layouts/CalendarLayout.css +153 -0
  40. package/dist/layouts/CalendarLayout.d.ts +9 -0
  41. package/dist/layouts/CalendarLayout.d.ts.map +1 -0
  42. package/dist/layouts/CalendarLayout.js +298 -0
  43. package/dist/layouts/CalendarLayout.js.map +1 -0
  44. package/dist/layouts/CalendarLayout.module.js +28 -0
  45. package/dist/layouts/CalendarLayout.module.js.map +1 -0
  46. package/dist/layouts/CardsLayout.js +1 -1
  47. package/dist/layouts/GalleryLayout.css +80 -0
  48. package/dist/layouts/GalleryLayout.d.ts +8 -0
  49. package/dist/layouts/GalleryLayout.d.ts.map +1 -0
  50. package/dist/layouts/GalleryLayout.js +129 -0
  51. package/dist/layouts/GalleryLayout.js.map +1 -0
  52. package/dist/layouts/GalleryLayout.module.js +26 -0
  53. package/dist/layouts/GalleryLayout.module.js.map +1 -0
  54. package/dist/layouts/TableLayout.d.ts +1 -1
  55. package/dist/layouts/TableLayout.d.ts.map +1 -1
  56. package/dist/layouts/TableLayout.js +44 -39
  57. package/dist/layouts/TableLayout.js.map +1 -1
  58. package/dist/layouts/builtIn.d.ts +1 -1
  59. package/dist/layouts/builtIn.d.ts.map +1 -1
  60. package/dist/layouts/builtIn.js +6 -2
  61. package/dist/layouts/builtIn.js.map +1 -1
  62. package/dist/toolbar/ColumnMenu.d.ts +17 -0
  63. package/dist/toolbar/ColumnMenu.d.ts.map +1 -0
  64. package/dist/toolbar/ColumnMenu.js +193 -0
  65. package/dist/toolbar/ColumnMenu.js.map +1 -0
  66. package/dist/toolbar/LayoutSwitch.d.ts.map +1 -1
  67. package/dist/toolbar/LayoutSwitch.js +73 -55
  68. package/dist/toolbar/LayoutSwitch.js.map +1 -1
  69. package/dist/toolbar/Toolbar.css +36 -0
  70. package/dist/toolbar/Toolbar.module.js +12 -2
  71. package/dist/toolbar/Toolbar.module.js.map +1 -1
  72. package/dist/types.d.ts +42 -0
  73. package/dist/types.d.ts.map +1 -1
  74. package/dist/values.d.ts +1 -0
  75. package/dist/values.d.ts.map +1 -1
  76. package/dist/values.js +1 -1
  77. package/dist/values.js.map +1 -1
  78. package/package.json +7 -7
@@ -1 +1 @@
1
- {"version":3,"file":"ListView.js","names":["ReactNode","useRef","useState","List","selectItemActions","usePlugins","getActionLabel","Action","Field","Filter","Alert","Button","Checkbox","usePanneauIntl","useToast","ListSkeleton","styles","ActionButton","ConfirmDialog","ConfirmPreview","needsConfirmation","RowActions","ListActions","getActionHref","groupListActions","hasScope","isAllowedOn","ActionIcons","cx","FilterChips","FilterControls","useFilterLabels","builtInLayouts","messages","countSelected","getPageSelection","isItemSelected","LayoutSwitch","CursorPagination","Pagination","SearchField","SortSelect","DisplayEntry","FilterEntry","ListActionEvent","ListActionHandler","ListActionPreviewer","ListColumn","ListItem","ListLayoutEntry","useListState","useRenderValue","getColumnValue","toText","ListViewProps","list","items","columns","total","cursors","next","previous","isLoading","error","Error","onRetry","filters","fields","search","layouts","layout","onLayoutChange","perPageOptions","selectable","actions","onAction","previewAction","actionIcons","itemTitle","getItemLabel","item","getItemHref","getLinkHref","action","currentItemId","displays","Readonly","Record","layoutComponents","filterControls","toolbar","emptyMessage","className","keyOf","undefined","id","ListView","t0","$","_c","t1","t2","t3","t4","t5","t6","controlledLayout","selectableProp","actionsProp","getItemLabelProp","t7","ariaLabel","t8","t9","t10","layoutsProp","intl","toasts","plugins","query","selection","filterLabels","uncontrolledLayout","setLayout","confirming","setConfirming","preview","setPreview","confirmation","pending","setPending","t11","formatMessage","label","pageItems","count","length","t12","sort","t13","filter","filterValues","t14","q","Object","keys","hasQuery","t15","listLayouts","fromEntries","t16","t17","allLayouts","t18","t19","available","Layout","table","grouped","toolbarActions","menu","_temp","selectionActions","_temp2","resourceActions","_temp3","selectedCount","t20","selectedItems","pageSelection","t21","locale","item_0","titleColumn","find","column","title","renderValue","closeConfirmation","current","execute","event","Promise","resolve","then","outcome","scope","clearSelection","catch","caught","show","actionFailed","message","description","tone","run","event_0","action_2","selection_0","dryRun","asks","confirm","status","result","skipped","runOnItem","action_3","item_1","runOnSelection","action_4","selected","getSelection","item_2","runOnResource","action_5","renderActions","item_3","allowed","row","running","endsWith","split","action_6","t22","selectPage","pageCheckbox","ids","map","_temp4","deselect","select","sortable","some","_temp5","showToolbar","t23","clearFilters","forEach","id_0","setFilter","setSearch","t24","bb0","t25","loadFailed","t26","retry","t27","perPage","noResults","empty","t28","state","item_5","item_6","item_7","toggle","column_1","toggleSort","body","toolbarStart","id_1","value","remember","labels","toolbarEnd","tableSort","setSort","next_0","action_7","action_8","id_2","t29","t30","selectionCount","mode","allMatchingSelected","selectAllMatching","action_9","skipped_0","item_8","t31","t32","t33","cursor","page","previousPage","nextPage","setPerPage","setPage","perPage_0","t34","event_1","t35","t36","column_0","item_4","action_1","action_0","index","all","findIndex","candidate","_c","styles"],"sources":["../src/ListView.tsx"],"sourcesContent":["import { type ReactNode, useRef, useState } from 'react';\n\nimport type { List } from '@panneau/core';\nimport { selectItemActions, usePlugins } from '@panneau/core';\nimport { getActionLabel } from '@panneau/intl';\nimport type { Action, Field, Filter } 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 } 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 { cx } from './cx';\nimport { FilterChips, FilterControls, useFilterLabels } from './filters/Filters';\nimport { builtInLayouts } from './layouts/builtIn';\nimport { messages } from './messages';\nimport { countSelected, getPageSelection, isItemSelected } from './selection';\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 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 columns: readonly ListColumn[];\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. */\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 /** 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 /** 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,\n total,\n cursors,\n isLoading = false,\n error = null,\n onRetry,\n filters = [],\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 getItemLabel: getItemLabelProp,\n getItemHref,\n getLinkHref,\n currentItemId = null,\n displays,\n layoutComponents,\n filterControls,\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, selection } = useListState(list);\n const filterLabels = useFilterLabels();\n const [uncontrolledLayout, setLayout] = useState<string | null>(null);\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 const label = ariaLabel ?? intl.formatMessage(messages.list);\n const pageItems = items ?? [];\n const count = total ?? pageItems.length;\n const sort = query.sort ?? [];\n const filterValues = query.filter ?? {};\n const hasQuery = Object.keys(filterValues).length > 0 || (query.q ?? '') !== '';\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.\n const available = layoutsProp.filter((id) => allLayouts[id] !== undefined);\n const layouts = available.length > 0 ? available : ['table'];\n const layout = controlledLayout ?? uncontrolledLayout ?? layouts[0] ?? 'table';\n const Layout = allLayouts[layout] ?? builtInLayouts.table;\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 columns.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 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 if (skipped === 0 && !asks) {\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 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 />\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 = columns.some((column) => column.sortable === true);\n const showToolbar =\n search ||\n filters.length > 0 ||\n sortable ||\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 />\n );\n }\n if (pageItems.length === 0) {\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 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 />\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={columns}\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={columns}\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 setLayout(next);\n onLayoutChange?.(next);\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={columns}\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 {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
+ {"version":3,"file":"ListView.js","names":["ReactNode","useRef","useState","List","ResolvedCalendar","currentMonth","formatRuleFailure","selectItemActions","usePlugins","getActionLabel","Action","Field","Filter","RuleFailure","Alert","Button","Checkbox","usePanneauIntl","useToast","ListSkeleton","styles","ActionButton","ConfirmDialog","ConfirmPreview","needsConfirmation","RowActions","ListActions","getActionHref","groupListActions","hasScope","isAllowedOn","ActionIcons","getShownColumns","cx","FilterChips","FilterControls","useFilterLabels","getImageUrl","InlineCell","getInlineField","builtInLayouts","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","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","getItemLabelProp","t9","t10","t11","ariaLabel","t12","filtersProp","t13","layoutsProp","intl","toasts","plugins","query","view","selection","filterLabels","confirming","setConfirming","preview","setPreview","confirmation","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","runOnItem","action_3","item_4","runOnSelection","action_4","selected","getSelection","item_5","runOnResource","action_5","renderActions","item_6","allowed","row","running","endsWith","split","action_6","t27","selectPage","pageCheckbox","ids","_temp4","deselect","select","sortable","some","_temp5","choosesColumns","showToolbar","t28","clearFilters","forEach","id_1","setFilter","setSearch","t29","bb0","t30","loadFailed","t31","retry","t32","perPage","noResults","empty","t33","state","item_8","item_9","item_10","item_11","toggle","t34","column_2","toggleSort","month","onMonthChange","setMonth","more","body","toolbarStart","id_2","value_0","remember","labels","toolbarEnd","tableSort","setSort","next_0","setLayout","ids_0","setColumns","resetColumns","action_7","action_8","id_3","t35","selectionCount","mode","allMatchingSelected","selectAllMatching","action_9","skipped_0","item_12","t36","t37","t38","cursor","page","previousPage","nextPage","setPerPage","setPage","perPage_0","t39","event_1","t40","t41","column_1","item_7","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 { currentMonth, formatRuleFailure, selectItemActions, usePlugins } 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 } 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 { 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): a media reference, a\n * file or a URL. The `gallery` layout needs it (decision 0044).\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 /** 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 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 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 if (skipped === 0 && !asks) {\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 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 />\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 />\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 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":"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"}
@@ -0,0 +1,10 @@
1
+ import type { ListColumn } from './types.js';
2
+ /** The columns shown by default: those that aren't hidden (decision 0042). */
3
+ export declare function getDefaultColumns<T extends ListColumn>(columns: readonly T[]): T[];
4
+ /**
5
+ * The columns shown, in their order: those of `ids` (the view of the list), or the defaults
6
+ * without it. Ids of columns that don't exist are ignored, and columns that can't be hidden are
7
+ * added where the definition has them.
8
+ */
9
+ export declare function getShownColumns<T extends ListColumn>(columns: readonly T[], ids: readonly string[] | undefined): T[];
10
+ //# sourceMappingURL=columns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"columns.d.ts","sourceRoot":"","sources":["../src/columns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAM1C,8EAA8E;AAC9E,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,UAAU,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,EAAE,CAElF;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,UAAU,EAChD,OAAO,EAAE,SAAS,CAAC,EAAE,EACrB,GAAG,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,GACnC,CAAC,EAAE,CAcL"}
@@ -0,0 +1,25 @@
1
+ //#region src/columns.ts
2
+ function isHideable(column) {
3
+ return column.hideable !== false;
4
+ }
5
+ /** The columns shown by default: those that aren't hidden (decision 0042). */
6
+ function getDefaultColumns(columns) {
7
+ return columns.filter((column) => column.hidden !== true || !isHideable(column));
8
+ }
9
+ /**
10
+ * The columns shown, in their order: those of `ids` (the view of the list), or the defaults
11
+ * without it. Ids of columns that don't exist are ignored, and columns that can't be hidden are
12
+ * added where the definition has them.
13
+ */
14
+ function getShownColumns(columns, ids) {
15
+ if (ids === void 0) return getDefaultColumns(columns);
16
+ const shown = ids.filter((id, index) => ids.indexOf(id) === index).map((id) => columns.find((column) => column.id === id)).filter((column) => column !== void 0);
17
+ columns.forEach((column, index) => {
18
+ if (!isHideable(column) && !shown.includes(column)) shown.splice(Math.min(index, shown.length), 0, column);
19
+ });
20
+ return shown.length > 0 ? shown : getDefaultColumns(columns);
21
+ }
22
+ //#endregion
23
+ export { getDefaultColumns, getShownColumns };
24
+
25
+ //# sourceMappingURL=columns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"columns.js","names":["ListColumn","isHideable","column","hideable","getDefaultColumns","columns","T","filter","hidden","getShownColumns","ids","undefined","shown","id","index","indexOf","map","find","forEach","includes","splice","Math","min","length"],"sources":["../src/columns.ts"],"sourcesContent":["import type { ListColumn } from './types';\n\nfunction isHideable(column: ListColumn): boolean {\n return column.hideable !== false;\n}\n\n/** The columns shown by default: those that aren't hidden (decision 0042). */\nexport function getDefaultColumns<T extends ListColumn>(columns: readonly T[]): T[] {\n return columns.filter((column) => column.hidden !== true || !isHideable(column));\n}\n\n/**\n * The columns shown, in their order: those of `ids` (the view of the list), or the defaults\n * without it. Ids of columns that don't exist are ignored, and columns that can't be hidden are\n * added where the definition has them.\n */\nexport function getShownColumns<T extends ListColumn>(\n columns: readonly T[],\n ids: readonly string[] | undefined,\n): T[] {\n if (ids === undefined) {\n return getDefaultColumns(columns);\n }\n const shown = ids\n .filter((id, index) => ids.indexOf(id) === index)\n .map((id) => columns.find((column) => column.id === id))\n .filter((column): column is T => column !== undefined);\n columns.forEach((column, index) => {\n if (!isHideable(column) && !shown.includes(column)) {\n shown.splice(Math.min(index, shown.length), 0, column);\n }\n });\n return shown.length > 0 ? shown : getDefaultColumns(columns);\n}\n"],"mappings":";AAEA,SAASC,WAAWC,QAA6B;CAC7C,OAAOA,OAAOC,aAAa;AAC/B;;AAGA,SAAgBC,kBAAwCC,SAA4B;CAChF,OAAOA,QAAQE,QAAQL,WAAWA,OAAOM,WAAW,QAAQ,CAACP,WAAWC,MAAM,CAAC;AACnF;;;;;;AAOA,SAAgBO,gBACZJ,SACAK,KACG;CACH,IAAIA,QAAQC,KAAAA,GACR,OAAOP,kBAAkBC,OAAO;CAEpC,MAAMO,QAAQF,IACTH,QAAQM,IAAIC,UAAUJ,IAAIK,QAAQF,EAAE,MAAMC,KAAK,CAAC,CAChDE,KAAKH,OAAOR,QAAQY,MAAMf,WAAWA,OAAOW,OAAOA,EAAE,CAAC,CAAC,CACvDN,QAAQL,WAAwBA,WAAWS,KAAAA,CAAS;CACzDN,QAAQa,SAAShB,QAAQY,UAAU;EAC/B,IAAI,CAACb,WAAWC,MAAM,KAAK,CAACU,MAAMO,SAASjB,MAAM,GAC7CU,MAAMQ,OAAOC,KAAKC,IAAIR,OAAOF,MAAMW,MAAM,GAAG,GAAGrB,MAAM;CAE7D,CAAC;CACD,OAAOU,MAAMW,SAAS,IAAIX,QAAQR,kBAAkBC,OAAO;AAC/D"}
@@ -81,3 +81,15 @@
81
81
  flex-wrap: wrap;
82
82
  gap: var(--panneau-space-1);
83
83
  }
84
+
85
+ /* A value after a flag: a country, a phone number. */
86
+ .panneau-displays-flagged {
87
+ display: inline-flex;
88
+ align-items: baseline;
89
+ gap: var(--panneau-space-2);
90
+ min-width: 0;
91
+ }
92
+
93
+ .panneau-displays-flag {
94
+ flex: 0 0 auto;
95
+ }
@@ -12,6 +12,8 @@ var media = "panneau-displays-media";
12
12
  var thumbnail = "panneau-displays-thumbnail";
13
13
  var code = "panneau-displays-code";
14
14
  var tags = "panneau-displays-tags";
15
+ var flagged = "panneau-displays-flagged";
16
+ var flag = "panneau-displays-flag";
15
17
  var Displays_module_default = {
16
18
  empty,
17
19
  text,
@@ -26,9 +28,11 @@ var Displays_module_default = {
26
28
  media,
27
29
  thumbnail,
28
30
  code,
29
- tags
31
+ tags,
32
+ flagged,
33
+ flag
30
34
  };
31
35
  //#endregion
32
- export { badges, boolean, code, color, Displays_module_default as default, empty, link, media, number, swatch, tags, text, thumbnail };
36
+ export { badges, boolean, code, color, Displays_module_default as default, empty, flag, flagged, link, media, number, swatch, tags, text, thumbnail };
33
37
 
34
38
  //# sourceMappingURL=Displays.module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Displays.module.js","names":[],"sources":["../../src/displays/Displays.module.css"],"sourcesContent":[".empty {\n color: var(--panneau-color-text-muted);\n}\n\n.text {\n display: -webkit-box;\n overflow: hidden;\n -webkit-line-clamp: 2;\n line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow-wrap: anywhere;\n}\n\n.badges {\n display: inline-flex;\n flex-wrap: wrap;\n gap: var(--panneau-space-1);\n}\n\n.boolean {\n display: inline-flex;\n align-items: center;\n}\n\n.true {\n color: var(--panneau-color-success);\n}\n\n.false {\n color: var(--panneau-color-text-muted);\n}\n\n.number {\n font-variant-numeric: var(--panneau-font-numeric);\n}\n\n.link {\n color: var(--panneau-color-link);\n overflow-wrap: anywhere;\n}\n\n.color {\n display: inline-flex;\n align-items: center;\n gap: var(--panneau-space-2);\n font-family: var(--panneau-font-family-mono);\n font-size: var(--panneau-font-size-sm);\n}\n\n.swatch {\n flex: none;\n width: 1rem;\n height: 1rem;\n border: var(--panneau-border-width) solid var(--panneau-color-border-control);\n border-radius: var(--panneau-radius-sm);\n}\n\n.media {\n display: inline-flex;\n align-items: center;\n gap: var(--panneau-space-2);\n}\n\n.thumbnail {\n flex: none;\n width: 2.5rem;\n height: 2.5rem;\n object-fit: cover;\n background-color: var(--panneau-color-surface-sunken);\n border-radius: var(--panneau-radius-sm);\n}\n\n.code {\n font-family: var(--panneau-font-family-mono);\n font-size: var(--panneau-font-size-sm);\n white-space: nowrap;\n}\n\n.tags {\n display: inline-flex;\n flex-wrap: wrap;\n gap: var(--panneau-space-1);\n}\n"],"mappings":""}
1
+ {"version":3,"file":"Displays.module.js","names":[],"sources":["../../src/displays/Displays.module.css"],"sourcesContent":[".empty {\n color: var(--panneau-color-text-muted);\n}\n\n.text {\n display: -webkit-box;\n overflow: hidden;\n -webkit-line-clamp: 2;\n line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow-wrap: anywhere;\n}\n\n.badges {\n display: inline-flex;\n flex-wrap: wrap;\n gap: var(--panneau-space-1);\n}\n\n.boolean {\n display: inline-flex;\n align-items: center;\n}\n\n.true {\n color: var(--panneau-color-success);\n}\n\n.false {\n color: var(--panneau-color-text-muted);\n}\n\n.number {\n font-variant-numeric: var(--panneau-font-numeric);\n}\n\n.link {\n color: var(--panneau-color-link);\n overflow-wrap: anywhere;\n}\n\n.color {\n display: inline-flex;\n align-items: center;\n gap: var(--panneau-space-2);\n font-family: var(--panneau-font-family-mono);\n font-size: var(--panneau-font-size-sm);\n}\n\n.swatch {\n flex: none;\n width: 1rem;\n height: 1rem;\n border: var(--panneau-border-width) solid var(--panneau-color-border-control);\n border-radius: var(--panneau-radius-sm);\n}\n\n.media {\n display: inline-flex;\n align-items: center;\n gap: var(--panneau-space-2);\n}\n\n.thumbnail {\n flex: none;\n width: 2.5rem;\n height: 2.5rem;\n object-fit: cover;\n background-color: var(--panneau-color-surface-sunken);\n border-radius: var(--panneau-radius-sm);\n}\n\n.code {\n font-family: var(--panneau-font-family-mono);\n font-size: var(--panneau-font-size-sm);\n white-space: nowrap;\n}\n\n.tags {\n display: inline-flex;\n flex-wrap: wrap;\n gap: var(--panneau-space-1);\n}\n\n/* A value after a flag: a country, a phone number. */\n.flagged {\n display: inline-flex;\n align-items: baseline;\n gap: var(--panneau-space-2);\n min-width: 0;\n}\n\n.flag {\n flex: 0 0 auto;\n}\n"],"mappings":""}
@@ -26,8 +26,18 @@ export declare function RelationDisplay({ value }: DisplayProps): import("react"
26
26
  export declare function UrlDisplay({ value }: DisplayProps): import("react").JSX.Element;
27
27
  /** A link that writes an email. */
28
28
  export declare function EmailDisplay({ value }: DisplayProps): import("react").JSX.Element;
29
- /** A link that calls the phone number. */
29
+ /**
30
+ * A link that calls the phone number: the flag of its country and the number in its international
31
+ * format (`+1 514 555 0199`). A value that isn't E.164 shows as it is.
32
+ */
30
33
  export declare function TelDisplay({ value }: DisplayProps): import("react").JSX.Element;
34
+ /** A country: its flag and its name in the user's locale. */
35
+ export declare function CountryDisplay({ value }: DisplayProps): import("react").JSX.Element;
36
+ /**
37
+ * A region: its name in the user's locale, from its country in the item (the field's `from`) or
38
+ * the field's settings. A region that Panneau doesn't know shows as it is.
39
+ */
40
+ export declare function RegionDisplay({ value, field, item }: DisplayProps): import("react").JSX.Element;
31
41
  /** A duration in seconds, with its units: `1 h 5 min`, to the precision of its field. */
32
42
  export declare function DurationDisplay({ value, field }: DisplayProps): import("react").JSX.Element;
33
43
  /** JSON on one line, shortened. */
@@ -1 +1 @@
1
- {"version":3,"file":"displays.d.ts","sourceRoot":"","sources":["../../src/displays/displays.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAI3D,kGAAkG;AAClG,wBAAgB,UAAU,gCAMzB;AAWD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,YAAY,+BAczD;AAED,0BAA0B;AAC1B,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,+BAStD;AAED,6CAA6C;AAC7C,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,+BAQpD;AAED,4CAA4C;AAC5C,wBAAgB,cAAc,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,+BAcrD;AAkBD,2CAA2C;AAC3C,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,+BAOlD;AAED,sEAAsE;AACtE,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,+BAWtD;AAED,4DAA4D;AAC5D,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,+BAQlD;AAED,qDAAqD;AACrD,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,YAAY,+BAkB3D;AAED,mCAAmC;AACnC,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,+BAUtD;AAED,iCAAiC;AACjC,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,+BASjD;AAED,mCAAmC;AACnC,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,+BASnD;AAED,0CAA0C;AAC1C,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,+BASjD;AAED,yFAAyF;AACzF,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,YAAY,+BAM7D;AAED,mCAAmC;AACnC,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,+BAUlD;AAED,yDAAyD;AACzD,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,YAAY,+BAezD;AAED,gEAAgE;AAChE,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,+BAuBnD;AAED,gDAAgD;AAChD,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,+BAkBtD;AAED,uCAAuC;AACvC,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,+BAUnD;AAED,sEAAsE;AACtE,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,+BAenD;AAED;;;;GAIG;AACH,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAuBlE,CAAC"}
1
+ {"version":3,"file":"displays.d.ts","sourceRoot":"","sources":["../../src/displays/displays.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAI3D,kGAAkG;AAClG,wBAAgB,UAAU,gCAMzB;AAWD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,YAAY,+BAczD;AAED,0BAA0B;AAC1B,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,+BAStD;AAED,6CAA6C;AAC7C,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,+BAQpD;AAED,4CAA4C;AAC5C,wBAAgB,cAAc,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,+BAcrD;AAkBD,2CAA2C;AAC3C,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,+BAOlD;AAED,sEAAsE;AACtE,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,+BAWtD;AAED,4DAA4D;AAC5D,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,+BAQlD;AAED,qDAAqD;AACrD,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,YAAY,+BAkB3D;AAED,mCAAmC;AACnC,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,+BAUtD;AAED,iCAAiC;AACjC,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,+BASjD;AAED,mCAAmC;AACnC,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,+BASnD;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,+BAsBjD;AAED,6DAA6D;AAC7D,wBAAgB,cAAc,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,+BAgBrD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,YAAY,+BASjE;AAED,yFAAyF;AACzF,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,YAAY,+BAM7D;AAED,mCAAmC;AACnC,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,+BAUlD;AAED,yDAAyD;AACzD,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,YAAY,+BAezD;AAED,gEAAgE;AAChE,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,+BAuBnD;AAED,gDAAgD;AAChD,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,+BAkBtD;AAED,uCAAuC;AACvC,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,+BAUnD;AAED,sEAAsE;AACtE,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,+BAenD;AAED;;;;GAIG;AACH,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAyBlE,CAAC"}
@@ -6,7 +6,10 @@ import { Badge, Icon, usePanneauIntl } from "@panneau/ui";
6
6
  import { jsx, jsxs } from "react/jsx-runtime";
7
7
  import { Check, Minus } from "lucide-react";
8
8
  import { toReferences } from "@panneau/fields";
9
+ import { getCountryFlag, getCountryName, isCountryCode } from "@panneau/fields/country";
9
10
  import { formatDuration } from "@panneau/fields/duration";
11
+ import { getRegionCountry, getRegionName } from "@panneau/fields/region";
12
+ import { parsePhone } from "@panneau/fields/tel";
10
13
  //#region src/displays/displays.tsx
11
14
  /** What a cell shows without a value. Hidden from assistive technologies, which skip the cell. */
12
15
  function EmptyValue() {
@@ -498,9 +501,12 @@ function EmailDisplay(t0) {
498
501
  } else t2 = $[3];
499
502
  return t2;
500
503
  }
501
- /** A link that calls the phone number. */
504
+ /**
505
+ * A link that calls the phone number: the flag of its country and the number in its international
506
+ * format (`+1 514 555 0199`). A value that isn't E.164 shows as it is.
507
+ */
502
508
  function TelDisplay(t0) {
503
- const $ = c(7);
509
+ const $ = c(16);
504
510
  const { value } = t0;
505
511
  if (typeof value !== "string" || value.trim() === "") {
506
512
  let t1;
@@ -510,29 +516,184 @@ function TelDisplay(t0) {
510
516
  } else t1 = $[0];
511
517
  return t1;
512
518
  }
519
+ let number;
513
520
  let t1;
521
+ let t2;
522
+ let t3;
523
+ let t4;
514
524
  if ($[1] !== value) {
515
- let t2;
516
- if ($[3] === Symbol.for("react.memo_cache_sentinel")) {
517
- t2 = /[^\d+]/g;
518
- $[3] = t2;
519
- } else t2 = $[3];
520
- t1 = value.replace(t2, "");
525
+ t4 = Symbol.for("react.early_return_sentinel");
526
+ bb0: {
527
+ number = parsePhone(value);
528
+ if (number === null) {
529
+ let t5;
530
+ if ($[7] === Symbol.for("react.memo_cache_sentinel")) {
531
+ t5 = /[^\d+]/g;
532
+ $[7] = t5;
533
+ } else t5 = $[7];
534
+ const t6 = `tel:${value.replace(t5, "")}`;
535
+ let t7;
536
+ if ($[8] !== t6 || $[9] !== value) {
537
+ t7 = /* @__PURE__ */ jsx("a", {
538
+ className: Displays_module_default.link,
539
+ href: t6,
540
+ children: value
541
+ });
542
+ $[8] = t6;
543
+ $[9] = value;
544
+ $[10] = t7;
545
+ } else t7 = $[10];
546
+ t4 = t7;
547
+ break bb0;
548
+ }
549
+ t1 = `${Displays_module_default.link} ${Displays_module_default.flagged}`;
550
+ t2 = `tel:${number.number}`;
551
+ t3 = number.country !== null ? /* @__PURE__ */ jsx("span", {
552
+ className: Displays_module_default.flag,
553
+ "aria-hidden": "true",
554
+ children: getCountryFlag(number.country)
555
+ }) : null;
556
+ }
521
557
  $[1] = value;
522
- $[2] = t1;
523
- } else t1 = $[2];
524
- const t2 = `tel:${t1}`;
525
- let t3;
526
- if ($[4] !== t2 || $[5] !== value) {
527
- t3 = /* @__PURE__ */ jsx("a", {
528
- className: Displays_module_default.link,
558
+ $[2] = number;
559
+ $[3] = t1;
560
+ $[4] = t2;
561
+ $[5] = t3;
562
+ $[6] = t4;
563
+ } else {
564
+ number = $[2];
565
+ t1 = $[3];
566
+ t2 = $[4];
567
+ t3 = $[5];
568
+ t4 = $[6];
569
+ }
570
+ if (t4 !== Symbol.for("react.early_return_sentinel")) return t4;
571
+ let t5;
572
+ if ($[11] !== number.international || $[12] !== t1 || $[13] !== t2 || $[14] !== t3) {
573
+ t5 = /* @__PURE__ */ jsxs("a", {
574
+ className: t1,
529
575
  href: t2,
530
- children: value
576
+ children: [t3, number.international]
531
577
  });
532
- $[4] = t2;
533
- $[5] = value;
534
- $[6] = t3;
535
- } else t3 = $[6];
578
+ $[11] = number.international;
579
+ $[12] = t1;
580
+ $[13] = t2;
581
+ $[14] = t3;
582
+ $[15] = t5;
583
+ } else t5 = $[15];
584
+ return t5;
585
+ }
586
+ /** A country: its flag and its name in the user's locale. */
587
+ function CountryDisplay(t0) {
588
+ const $ = c(15);
589
+ const { value } = t0;
590
+ const intl = usePanneauIntl();
591
+ if (typeof value !== "string" || value === "") {
592
+ let t1;
593
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
594
+ t1 = /* @__PURE__ */ jsx(EmptyValue, {});
595
+ $[0] = t1;
596
+ } else t1 = $[0];
597
+ return t1;
598
+ }
599
+ if (!isCountryCode(value)) {
600
+ let t1;
601
+ if ($[1] !== value) {
602
+ t1 = /* @__PURE__ */ jsx("span", {
603
+ className: Displays_module_default.text,
604
+ children: value
605
+ });
606
+ $[1] = value;
607
+ $[2] = t1;
608
+ } else t1 = $[2];
609
+ return t1;
610
+ }
611
+ let t1;
612
+ if ($[3] !== value) {
613
+ t1 = getCountryFlag(value);
614
+ $[3] = value;
615
+ $[4] = t1;
616
+ } else t1 = $[4];
617
+ let t2;
618
+ if ($[5] !== t1) {
619
+ t2 = /* @__PURE__ */ jsx("span", {
620
+ className: Displays_module_default.flag,
621
+ "aria-hidden": "true",
622
+ children: t1
623
+ });
624
+ $[5] = t1;
625
+ $[6] = t2;
626
+ } else t2 = $[6];
627
+ let t3;
628
+ if ($[7] !== intl.locale || $[8] !== value) {
629
+ t3 = getCountryName(value, intl.locale);
630
+ $[7] = intl.locale;
631
+ $[8] = value;
632
+ $[9] = t3;
633
+ } else t3 = $[9];
634
+ let t4;
635
+ if ($[10] !== t3) {
636
+ t4 = /* @__PURE__ */ jsx("span", {
637
+ className: Displays_module_default.text,
638
+ children: t3
639
+ });
640
+ $[10] = t3;
641
+ $[11] = t4;
642
+ } else t4 = $[11];
643
+ let t5;
644
+ if ($[12] !== t2 || $[13] !== t4) {
645
+ t5 = /* @__PURE__ */ jsxs("span", {
646
+ className: Displays_module_default.flagged,
647
+ children: [t2, t4]
648
+ });
649
+ $[12] = t2;
650
+ $[13] = t4;
651
+ $[14] = t5;
652
+ } else t5 = $[14];
653
+ return t5;
654
+ }
655
+ /**
656
+ * A region: its name in the user's locale, from its country in the item (the field's `from`) or
657
+ * the field's settings. A region that Panneau doesn't know shows as it is.
658
+ */
659
+ function RegionDisplay(t0) {
660
+ const $ = c(10);
661
+ const { value, field, item } = t0;
662
+ const intl = usePanneauIntl();
663
+ if (typeof value !== "string" || value === "") {
664
+ let t1;
665
+ if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
666
+ t1 = /* @__PURE__ */ jsx(EmptyValue, {});
667
+ $[0] = t1;
668
+ } else t1 = $[0];
669
+ return t1;
670
+ }
671
+ let t1;
672
+ let t2;
673
+ if ($[1] !== field || $[2] !== intl.locale || $[3] !== item || $[4] !== value) {
674
+ const country = field !== null ? getRegionCountry(field, item) : null;
675
+ t1 = Displays_module_default.text;
676
+ t2 = getRegionName(country, value, intl.locale) ?? value;
677
+ $[1] = field;
678
+ $[2] = intl.locale;
679
+ $[3] = item;
680
+ $[4] = value;
681
+ $[5] = t1;
682
+ $[6] = t2;
683
+ } else {
684
+ t1 = $[5];
685
+ t2 = $[6];
686
+ }
687
+ let t3;
688
+ if ($[7] !== t1 || $[8] !== t2) {
689
+ t3 = /* @__PURE__ */ jsx("span", {
690
+ className: t1,
691
+ children: t2
692
+ });
693
+ $[7] = t1;
694
+ $[8] = t2;
695
+ $[9] = t3;
696
+ } else t3 = $[9];
536
697
  return t3;
537
698
  }
538
699
  /** A duration in seconds, with its units: `1 h 5 min`, to the precision of its field. */
@@ -905,9 +1066,11 @@ var builtInDisplays = {
905
1066
  json: JsonDisplay,
906
1067
  tags: TagsDisplay,
907
1068
  embed: EmbedDisplay,
908
- location: LocationDisplay
1069
+ location: LocationDisplay,
1070
+ country: CountryDisplay,
1071
+ region: RegionDisplay
909
1072
  };
910
1073
  //#endregion
911
- export { BooleanDisplay, ColorDisplay, DateDisplay, DateTimeDisplay, DurationDisplay, EmailDisplay, EmbedDisplay, EmptyValue, JsonDisplay, LocationDisplay, MediaDisplay, NumberDisplay, RelationDisplay, RichTextDisplay, SelectDisplay, TagsDisplay, TelDisplay, TextDisplay, TimeDisplay, UrlDisplay, builtInDisplays };
1074
+ export { BooleanDisplay, ColorDisplay, CountryDisplay, DateDisplay, DateTimeDisplay, DurationDisplay, EmailDisplay, EmbedDisplay, EmptyValue, JsonDisplay, LocationDisplay, MediaDisplay, NumberDisplay, RegionDisplay, RelationDisplay, RichTextDisplay, SelectDisplay, TagsDisplay, TelDisplay, TextDisplay, TimeDisplay, UrlDisplay, builtInDisplays };
912
1075
 
913
1076
  //# sourceMappingURL=displays.js.map