@panneau/lists 5.0.0-alpha.6 → 5.0.0-alpha.7

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 (55) hide show
  1. package/README.md +1 -1
  2. package/dist/ItemDetails.d.ts +4 -2
  3. package/dist/ItemDetails.d.ts.map +1 -1
  4. package/dist/ItemDetails.js +48 -6
  5. package/dist/ItemDetails.js.map +1 -1
  6. package/dist/List.js +54 -12
  7. package/dist/List.js.map +1 -1
  8. package/dist/ListSkeleton.d.ts +17 -0
  9. package/dist/ListSkeleton.d.ts.map +1 -0
  10. package/dist/ListSkeleton.js +111 -0
  11. package/dist/ListSkeleton.js.map +1 -0
  12. package/dist/ListView.d.ts +4 -1
  13. package/dist/ListView.d.ts.map +1 -1
  14. package/dist/ListView.js +494 -179
  15. package/dist/ListView.js.map +1 -1
  16. package/dist/actions/ActionButton.js +79 -21
  17. package/dist/actions/ActionButton.js.map +1 -1
  18. package/dist/actions/ConfirmDialog.js +121 -24
  19. package/dist/actions/ConfirmDialog.js.map +1 -1
  20. package/dist/actions/RowActions.js +1 -1
  21. package/dist/actions/RowActions.js.map +1 -1
  22. package/dist/actions/actions.js.map +1 -1
  23. package/dist/actions/icons.js.map +1 -1
  24. package/dist/cx.js.map +1 -1
  25. package/dist/displays/displays.js +1 -1
  26. package/dist/displays/displays.js.map +1 -1
  27. package/dist/filters/Filters.js +1 -1
  28. package/dist/filters/Filters.js.map +1 -1
  29. package/dist/filters/controls.js +1 -1
  30. package/dist/filters/controls.js.map +1 -1
  31. package/dist/filters/format.js.map +1 -1
  32. package/dist/layouts/CardsLayout.js +1 -1
  33. package/dist/layouts/CardsLayout.js.map +1 -1
  34. package/dist/layouts/ItemTitle.js +20 -7
  35. package/dist/layouts/ItemTitle.js.map +1 -1
  36. package/dist/layouts/TableLayout.js +1 -1
  37. package/dist/layouts/TableLayout.js.map +1 -1
  38. package/dist/layouts/builtIn.js.map +1 -1
  39. package/dist/plugin.js.map +1 -1
  40. package/dist/query.js.map +1 -1
  41. package/dist/selection.js.map +1 -1
  42. package/dist/toolbar/LayoutSwitch.js +1 -1
  43. package/dist/toolbar/LayoutSwitch.js.map +1 -1
  44. package/dist/toolbar/Pagination.js +152 -41
  45. package/dist/toolbar/Pagination.js.map +1 -1
  46. package/dist/toolbar/SearchField.js +1 -1
  47. package/dist/toolbar/SearchField.js.map +1 -1
  48. package/dist/toolbar/SortSelect.js +1 -1
  49. package/dist/toolbar/SortSelect.js.map +1 -1
  50. package/dist/useDraft.js.map +1 -1
  51. package/dist/useListState.js.map +1 -1
  52. package/dist/useRenderValue.js +1 -1
  53. package/dist/useRenderValue.js.map +1 -1
  54. package/dist/values.js.map +1 -1
  55. package/package.json +7 -7
@@ -1 +1 @@
1
- {"version":3,"file":"actions.js","names":[],"sources":["../../src/actions/actions.ts"],"sourcesContent":["import { canRunAction, groupActions } from '@panneau/core';\nimport type { Action, ActionPlacement } from '@panneau/protocol';\n\nimport type { ListItem } from '../types';\n\n/** Actions of a list: a list (grouped by their placements), or already grouped by placement. */\nexport type ListActions = readonly Action[] | Partial<Record<ActionPlacement, readonly Action[]>>;\n\n/**\n * Groups actions by placement, without those the user can't run on the resource\n * (`abilities.run`). Actions already grouped (as `resolveList()` does) are filtered the same way.\n */\nexport function groupListActions(\n actions: ListActions | undefined,\n): Record<ActionPlacement, Action[]> {\n if (actions === undefined) {\n return { row: [], toolbar: [], form: [], menu: [] };\n }\n if (isActionList(actions)) {\n return groupActions(actions);\n }\n const pick = (placement: ActionPlacement) => (actions[placement] ?? []).filter(canRunAction);\n return { row: pick('row'), toolbar: pick('toolbar'), form: pick('form'), menu: pick('menu') };\n}\n\nfunction isActionList(actions: ListActions): actions is readonly Action[] {\n return Array.isArray(actions);\n}\n\n/**\n * Whether an action is available on an item (decision 0011). Without abilities, the item allows\n * everything and the backend decides. With abilities, a link is allowed unless the item says\n * otherwise, and other actions only when the item lists their id.\n */\nexport function isAllowedOn(action: Action, item: ListItem): boolean {\n if (!canRunAction(action)) {\n return false;\n }\n if (item.abilities === undefined) {\n return true;\n }\n if (action.kind === 'link') {\n return item.abilities[action.id] !== false;\n }\n return item.abilities[action.id] === true;\n}\n\n/**\n * The link of a `link` action for an item: its `url` template with `{id}` (and other `{field}`\n * values of the item) filled in, or `null` for an action with a `route` or without an item.\n */\nexport function getActionHref(action: Action, item?: ListItem): string | null {\n if (action.kind !== 'link' || action.url === undefined) {\n return null;\n }\n const { url } = action;\n return url.replace(/\\{([^}]+)\\}/g, (match, name: string) => {\n const value = item?.[name];\n return typeof value === 'string' || typeof value === 'number'\n ? encodeURIComponent(String(value))\n : match;\n });\n}\n\n/** Whether an action's scope includes another one. */\nexport function hasScope(action: Action, scope: Action['scope'][number]): boolean {\n return action.scope.includes(scope);\n}\n"],"mappings":";;;;;;AAYA,SAAgB,iBACZ,SACiC;CACjC,IAAI,YAAY,KAAA,GACZ,OAAO;EAAE,KAAK,CAAA;EAAI,SAAS,CAAA;EAAI,MAAM,CAAA;EAAI,MAAM,CAAA;CAAG;CAEtD,IAAI,aAAa,OAAO,GACpB,OAAO,aAAa,OAAO;CAE/B,MAAM,QAAQ,eAAgC,QAAQ,cAAc,CAAA,EAAA,CAAI,OAAO,YAAY;CAC3F,OAAO;EAAE,KAAK,KAAK,KAAK;EAAG,SAAS,KAAK,SAAS;EAAG,MAAM,KAAK,MAAM;EAAG,MAAM,KAAK,MAAM;CAAE;AAChG;AAEA,SAAS,aAAa,SAAoD;CACtE,OAAO,MAAM,QAAQ,OAAO;AAChC;;;;;;AAOA,SAAgB,YAAY,QAAgB,MAAyB;CACjE,IAAI,CAAC,aAAa,MAAM,GACpB,OAAO;CAEX,IAAI,KAAK,cAAc,KAAA,GACnB,OAAO;CAEX,IAAI,OAAO,SAAS,QAChB,OAAO,KAAK,UAAU,OAAO,QAAQ;CAEzC,OAAO,KAAK,UAAU,OAAO,QAAQ;AACzC;;;;;AAMA,SAAgB,cAAc,QAAgB,MAAgC;CAC1E,IAAI,OAAO,SAAS,UAAU,OAAO,QAAQ,KAAA,GACzC,OAAO;CAEX,MAAM,EAAE,QAAQ;CAChB,OAAO,IAAI,QAAQ,iBAAiB,OAAO,SAAiB;EACxD,MAAM,QAAQ,OAAO;EACrB,OAAO,OAAO,UAAU,YAAY,OAAO,UAAU,WAC/C,mBAAmB,OAAO,KAAK,CAAC,IAChC;CACV,CAAC;AACL;;AAGA,SAAgB,SAAS,QAAgB,OAAyC;CAC9E,OAAO,OAAO,MAAM,SAAS,KAAK;AACtC"}
1
+ {"version":3,"file":"actions.js","names":["canRunAction","groupActions","Action","ActionPlacement","ListItem","ListActions","Partial","Record","groupListActions","actions","undefined","row","toolbar","form","menu","isActionList","pick","placement","filter","Array","isArray","isAllowedOn","action","item","abilities","kind","id","getActionHref","url","replace","match","name","value","encodeURIComponent","String","hasScope","scope","includes"],"sources":["../../src/actions/actions.ts"],"sourcesContent":["import { canRunAction, groupActions } from '@panneau/core';\nimport type { Action, ActionPlacement } from '@panneau/protocol';\n\nimport type { ListItem } from '../types';\n\n/** Actions of a list: a list (grouped by their placements), or already grouped by placement. */\nexport type ListActions = readonly Action[] | Partial<Record<ActionPlacement, readonly Action[]>>;\n\n/**\n * Groups actions by placement, without those the user can't run on the resource\n * (`abilities.run`). Actions already grouped (as `resolveList()` does) are filtered the same way.\n */\nexport function groupListActions(\n actions: ListActions | undefined,\n): Record<ActionPlacement, Action[]> {\n if (actions === undefined) {\n return { row: [], toolbar: [], form: [], menu: [] };\n }\n if (isActionList(actions)) {\n return groupActions(actions);\n }\n const pick = (placement: ActionPlacement) => (actions[placement] ?? []).filter(canRunAction);\n return { row: pick('row'), toolbar: pick('toolbar'), form: pick('form'), menu: pick('menu') };\n}\n\nfunction isActionList(actions: ListActions): actions is readonly Action[] {\n return Array.isArray(actions);\n}\n\n/**\n * Whether an action is available on an item (decision 0011). Without abilities, the item allows\n * everything and the backend decides. With abilities, a link is allowed unless the item says\n * otherwise, and other actions only when the item lists their id.\n */\nexport function isAllowedOn(action: Action, item: ListItem): boolean {\n if (!canRunAction(action)) {\n return false;\n }\n if (item.abilities === undefined) {\n return true;\n }\n if (action.kind === 'link') {\n return item.abilities[action.id] !== false;\n }\n return item.abilities[action.id] === true;\n}\n\n/**\n * The link of a `link` action for an item: its `url` template with `{id}` (and other `{field}`\n * values of the item) filled in, or `null` for an action with a `route` or without an item.\n */\nexport function getActionHref(action: Action, item?: ListItem): string | null {\n if (action.kind !== 'link' || action.url === undefined) {\n return null;\n }\n const { url } = action;\n return url.replace(/\\{([^}]+)\\}/g, (match, name: string) => {\n const value = item?.[name];\n return typeof value === 'string' || typeof value === 'number'\n ? encodeURIComponent(String(value))\n : match;\n });\n}\n\n/** Whether an action's scope includes another one. */\nexport function hasScope(action: Action, scope: Action['scope'][number]): boolean {\n return action.scope.includes(scope);\n}\n"],"mappings":";;;;;;AAYA,SAAgBQ,iBACZC,SACiC;CACjC,IAAIA,YAAYC,KAAAA,GACZ,OAAO;EAAEC,KAAK,CAAA;EAAIC,SAAS,CAAA;EAAIC,MAAM,CAAA;EAAIC,MAAM,CAAA;CAAG;CAEtD,IAAIC,aAAaN,OAAO,GACpB,OAAOR,aAAaQ,OAAO;CAE/B,MAAMO,QAAQC,eAAgCR,QAAQQ,cAAc,CAAA,EAAA,CAAIC,OAAOlB,YAAY;CAC3F,OAAO;EAAEW,KAAKK,KAAK,KAAK;EAAGJ,SAASI,KAAK,SAAS;EAAGH,MAAMG,KAAK,MAAM;EAAGF,MAAME,KAAK,MAAM;CAAE;AAChG;AAEA,SAASD,aAAaN,SAAoD;CACtE,OAAOU,MAAMC,QAAQX,OAAO;AAChC;;;;;;AAOA,SAAgBY,YAAYC,QAAgBC,MAAyB;CACjE,IAAI,CAACvB,aAAasB,MAAM,GACpB,OAAO;CAEX,IAAIC,KAAKC,cAAcd,KAAAA,GACnB,OAAO;CAEX,IAAIY,OAAOG,SAAS,QAChB,OAAOF,KAAKC,UAAUF,OAAOI,QAAQ;CAEzC,OAAOH,KAAKC,UAAUF,OAAOI,QAAQ;AACzC;;;;;AAMA,SAAgBC,cAAcL,QAAgBC,MAAgC;CAC1E,IAAID,OAAOG,SAAS,UAAUH,OAAOM,QAAQlB,KAAAA,GACzC,OAAO;CAEX,MAAM,EAAEkB,QAAQN;CAChB,OAAOM,IAAIC,QAAQ,iBAAiBC,OAAOC,SAAiB;EACxD,MAAMC,QAAQT,OAAOQ;EACrB,OAAO,OAAOC,UAAU,YAAY,OAAOA,UAAU,WAC/CC,mBAAmBC,OAAOF,KAAK,CAAC,IAChCF;CACV,CAAC;AACL;;AAGA,SAAgBK,SAASb,QAAgBc,OAAyC;CAC9E,OAAOd,OAAOc,MAAMC,SAASD,KAAK;AACtC"}
@@ -1 +1 @@
1
- {"version":3,"file":"icons.js","names":[],"sources":["../../src/actions/icons.ts"],"sourcesContent":["import {\n Copy,\n Download,\n Eye,\n type LucideIcon,\n Pencil,\n RotateCcw,\n Trash2,\n Upload,\n} from 'lucide-react';\n\nimport type { Action } from '@panneau/protocol';\nimport { type IconComponent, getNamedIcon } from '@panneau/ui';\n\n/** Icons of actions by action id, for actions written in code (`{ archive: Archive }`). */\nexport type ActionIcons = Readonly<Record<string, IconComponent>>;\n\n/** Icons of the built-in actions, when they don't name one. */\nconst BUILT_IN_ICONS: Record<string, LucideIcon> = {\n show: Eye,\n edit: Pencil,\n duplicate: Copy,\n delete: Trash2,\n restore: RotateCcw,\n export: Download,\n import: Upload,\n};\n\n/**\n * The icon of an action: the one given for its id in `icons`, then the Lucide icon its `icon`\n * names (`\"send\"`, loaded when it first renders), then the icon of a built-in action.\n */\nexport function getActionIcon(action: Action, icons?: ActionIcons): IconComponent | undefined {\n const given =\n icons !== undefined && Object.hasOwn(icons, action.id) ? icons[action.id] : undefined;\n if (given !== undefined) {\n return given;\n }\n if (action.icon !== undefined && action.icon !== '') {\n return getNamedIcon(action.icon);\n }\n return Object.hasOwn(BUILT_IN_ICONS, action.id) ? BUILT_IN_ICONS[action.id] : undefined;\n}\n"],"mappings":";;;;AAkBA,IAAM,iBAA6C;CAC/C,MAAM;CACN,MAAM;CACN,WAAW;CACX,QAAQ;CACR,SAAS;CACT,QAAQ;CACR,QAAQ;AACZ;;;;;AAMA,SAAgB,cAAc,QAAgB,OAAgD;CAC1F,MAAM,QACF,UAAU,KAAA,KAAa,OAAO,OAAO,OAAO,OAAO,EAAE,IAAI,MAAM,OAAO,MAAM,KAAA;CAChF,IAAI,UAAU,KAAA,GACV,OAAO;CAEX,IAAI,OAAO,SAAS,KAAA,KAAa,OAAO,SAAS,IAC7C,OAAO,aAAa,OAAO,IAAI;CAEnC,OAAO,OAAO,OAAO,gBAAgB,OAAO,EAAE,IAAI,eAAe,OAAO,MAAM,KAAA;AAClF"}
1
+ {"version":3,"file":"icons.js","names":["Copy","Download","Eye","LucideIcon","Pencil","RotateCcw","Trash2","Upload","Action","IconComponent","getNamedIcon","ActionIcons","Readonly","Record","BUILT_IN_ICONS","show","edit","duplicate","delete","restore","export","import","getActionIcon","action","icons","given","undefined","Object","hasOwn","id","icon"],"sources":["../../src/actions/icons.ts"],"sourcesContent":["import {\n Copy,\n Download,\n Eye,\n type LucideIcon,\n Pencil,\n RotateCcw,\n Trash2,\n Upload,\n} from 'lucide-react';\n\nimport type { Action } from '@panneau/protocol';\nimport { type IconComponent, getNamedIcon } from '@panneau/ui';\n\n/** Icons of actions by action id, for actions written in code (`{ archive: Archive }`). */\nexport type ActionIcons = Readonly<Record<string, IconComponent>>;\n\n/** Icons of the built-in actions, when they don't name one. */\nconst BUILT_IN_ICONS: Record<string, LucideIcon> = {\n show: Eye,\n edit: Pencil,\n duplicate: Copy,\n delete: Trash2,\n restore: RotateCcw,\n export: Download,\n import: Upload,\n};\n\n/**\n * The icon of an action: the one given for its id in `icons`, then the Lucide icon its `icon`\n * names (`\"send\"`, loaded when it first renders), then the icon of a built-in action.\n */\nexport function getActionIcon(action: Action, icons?: ActionIcons): IconComponent | undefined {\n const given =\n icons !== undefined && Object.hasOwn(icons, action.id) ? icons[action.id] : undefined;\n if (given !== undefined) {\n return given;\n }\n if (action.icon !== undefined && action.icon !== '') {\n return getNamedIcon(action.icon);\n }\n return Object.hasOwn(BUILT_IN_ICONS, action.id) ? BUILT_IN_ICONS[action.id] : undefined;\n}\n"],"mappings":";;;;AAkBA,IAAMc,iBAA6C;CAC/CC,MAAMb;CACNc,MAAMZ;CACNa,WAAWjB;CACXkB,QAAQZ;CACRa,SAASd;CACTe,QAAQnB;CACRoB,QAAQd;AACZ;;;;;AAMA,SAAgBe,cAAcC,QAAgBC,OAAgD;CAC1F,MAAMC,QACFD,UAAUE,KAAAA,KAAaC,OAAOC,OAAOJ,OAAOD,OAAOM,EAAE,IAAIL,MAAMD,OAAOM,MAAMH,KAAAA;CAChF,IAAID,UAAUC,KAAAA,GACV,OAAOD;CAEX,IAAIF,OAAOO,SAASJ,KAAAA,KAAaH,OAAOO,SAAS,IAC7C,OAAOpB,aAAaa,OAAOO,IAAI;CAEnC,OAAOH,OAAOC,OAAOd,gBAAgBS,OAAOM,EAAE,IAAIf,eAAeS,OAAOM,MAAMH,KAAAA;AAClF"}
package/dist/cx.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cx.js","names":[],"sources":["../src/cx.ts"],"sourcesContent":["/** Joins class names, skipping empty ones. */\nexport function cx(...classNames: (string | false | null | undefined)[]): string {\n return classNames.filter(Boolean).join(' ');\n}\n"],"mappings":";;AACA,SAAgB,GAAG,GAAG,YAA2D;CAC7E,OAAO,WAAW,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;AAC9C"}
1
+ {"version":3,"file":"cx.js","names":["cx","classNames","filter","Boolean","join"],"sources":["../src/cx.ts"],"sourcesContent":["/** Joins class names, skipping empty ones. */\nexport function cx(...classNames: (string | false | null | undefined)[]): string {\n return classNames.filter(Boolean).join(' ');\n}\n"],"mappings":";;AACA,SAAgBA,GAAG,GAAGC,YAA2D;CAC7E,OAAOA,WAAWC,OAAOC,OAAO,CAAC,CAACC,KAAK,GAAG;AAC9C"}
@@ -1,10 +1,10 @@
1
1
  import { messages } from "../messages.js";
2
2
  import { getFieldOptions, getOptionLabel, toText } from "../values.js";
3
3
  import Displays_module_default from "./Displays.module.js";
4
+ import { c } from "react/compiler-runtime";
4
5
  import { Badge, Icon, usePanneauIntl } from "@panneau/ui";
5
6
  import { jsx, jsxs } from "react/jsx-runtime";
6
7
  import { Check, Minus } from "lucide-react";
7
- import { c } from "react/compiler-runtime";
8
8
  import { toReferences } from "@panneau/fields";
9
9
  import { formatDuration } from "@panneau/fields/duration";
10
10
  //#region src/displays/displays.tsx
@@ -1 +1 @@
1
- {"version":3,"file":"displays.js","names":["text","value","tag","thumbnailUrl","url","address","source","label","_c","styles"],"sources":["../../src/displays/displays.tsx"],"sourcesContent":["import { Check, Minus } from 'lucide-react';\n\nimport { toReferences } from '@panneau/fields';\nimport { formatDuration } from '@panneau/fields/duration';\nimport { Badge, Icon, usePanneauIntl } from '@panneau/ui';\n\nimport { messages } from '../messages';\nimport type { DisplayEntry, DisplayProps } from '../types';\nimport { getFieldOptions, getOptionLabel, toText } from '../values';\nimport styles from './Displays.module.css';\n\n/** What a cell shows without a value. Hidden from assistive technologies, which skip the cell. */\nexport function EmptyValue() {\n return (\n <span className={styles.empty} aria-hidden=\"true\">\n —\n </span>\n );\n}\n\nfunction isEmpty(value: unknown): boolean {\n return (\n value === null ||\n value === undefined ||\n value === '' ||\n (Array.isArray(value) && value.length === 0)\n );\n}\n\n/** Text, on two lines at most. The default display. */\nexport function TextDisplay({ value }: DisplayProps) {\n const intl = usePanneauIntl();\n const text = toText(value, intl.locale);\n return text === '' ? <EmptyValue /> : <span className={styles.text}>{text}</span>;\n}\n\n/** HTML as plain text. */\nexport function RichTextDisplay({ value }: DisplayProps) {\n const text =\n typeof value === 'string'\n ? value\n .replace(/<[^>]*>/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim()\n : '';\n return text === '' ? <EmptyValue /> : <span className={styles.text}>{text}</span>;\n}\n\n/** A number, in the format of the locale. */\nexport function NumberDisplay({ value }: DisplayProps) {\n const intl = usePanneauIntl();\n const number =\n typeof value === 'number' ? value : typeof value === 'string' ? Number(value) : NaN;\n if (Number.isNaN(number) || isEmpty(value)) {\n return <EmptyValue />;\n }\n return <span className={styles.number}>{intl.formatNumber(number)}</span>;\n}\n\n/** Yes or no, as an icon with its label. */\nexport function BooleanDisplay({ value }: DisplayProps) {\n const intl = usePanneauIntl();\n if (value === null || value === undefined) {\n return <EmptyValue />;\n }\n const checked = value === true || value === 1 || value === 'true' || value === '1';\n return (\n <span className={`${styles.boolean} ${checked ? styles.true : styles.false}`}>\n <Icon\n icon={checked ? Check : Minus}\n label={intl.formatMessage(checked ? messages.yes : messages.no)}\n />\n </span>\n );\n}\n\nconst DATE_ONLY = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\nconst TIME_ONLY = /^(\\d{2}):(\\d{2})(?::(\\d{2}))?$/;\n\n/** A date (`2026-10-15`) as a local date, so that it doesn't move with the time zone. */\nfunction parseDate(value: unknown): Date | null {\n if (typeof value !== 'string' || value === '') {\n return null;\n }\n const day = DATE_ONLY.exec(value);\n const date =\n day !== null\n ? new Date(Number(day[1]), Number(day[2]) - 1, Number(day[3]))\n : new Date(value);\n return Number.isNaN(date.getTime()) ? null : date;\n}\n\n/** A date, in the format of the locale. */\nexport function DateDisplay({ value }: DisplayProps) {\n const intl = usePanneauIntl();\n const date = parseDate(value);\n if (date === null) {\n return <EmptyValue />;\n }\n return <time dateTime={String(value)}>{intl.formatDate(date, { dateStyle: 'medium' })}</time>;\n}\n\n/** A date and a time, in the format and the time zone of the user. */\nexport function DateTimeDisplay({ value }: DisplayProps) {\n const intl = usePanneauIntl();\n const date = parseDate(value);\n if (date === null) {\n return <EmptyValue />;\n }\n return (\n <time dateTime={String(value)}>\n {intl.formatDate(date, { dateStyle: 'medium', timeStyle: 'short' })}\n </time>\n );\n}\n\n/** A time of day (`14:30`), in the format of the locale. */\nexport function TimeDisplay({ value }: DisplayProps) {\n const intl = usePanneauIntl();\n const match = typeof value === 'string' ? TIME_ONLY.exec(value) : null;\n if (match === null) {\n return <EmptyValue />;\n }\n const date = new Date(2000, 0, 1, Number(match[1]), Number(match[2]), Number(match[3] ?? 0));\n return <time dateTime={String(value)}>{intl.formatTime(date, { timeStyle: 'short' })}</time>;\n}\n\n/** The labels of the selected options, as badges. */\nexport function SelectDisplay({ value, field }: DisplayProps) {\n const options = getFieldOptions(field);\n const values: unknown[] = Array.isArray(value) ? value : isEmpty(value) ? [] : [value];\n if (values.length === 0) {\n return <EmptyValue />;\n }\n return (\n <span className={styles.badges}>\n {values.map((entry) => (\n <Badge key={String(entry)}>{getOptionLabel(options, entry) ?? String(entry)}</Badge>\n ))}\n </span>\n );\n}\n\n/** The labels of related items. */\nexport function RelationDisplay({ value }: DisplayProps) {\n const references = toReferences(value);\n if (references.length === 0) {\n return <EmptyValue />;\n }\n return (\n <span className={styles.text}>\n {references.map((reference) => reference.label).join(', ')}\n </span>\n );\n}\n\n/** A link that opens the URL. */\nexport function UrlDisplay({ value }: DisplayProps) {\n if (typeof value !== 'string' || value === '') {\n return <EmptyValue />;\n }\n return (\n <a className={styles.link} href={value} target=\"_blank\" rel=\"noreferrer\">\n {value.replace(/^https?:\\/\\//, '')}\n </a>\n );\n}\n\n/** A link that writes an email. */\nexport function EmailDisplay({ value }: DisplayProps) {\n if (typeof value !== 'string' || value === '') {\n return <EmptyValue />;\n }\n return (\n <a className={styles.link} href={`mailto:${value}`}>\n {value}\n </a>\n );\n}\n\n/** A link that calls the phone number. */\nexport function TelDisplay({ value }: DisplayProps) {\n if (typeof value !== 'string' || value.trim() === '') {\n return <EmptyValue />;\n }\n return (\n <a className={styles.link} href={`tel:${value.replace(/[^\\d+]/g, '')}`}>\n {value}\n </a>\n );\n}\n\n/** A duration in seconds, with its units: `1 h 5 min`, to the precision of its field. */\nexport function DurationDisplay({ value, field }: DisplayProps) {\n if (typeof value !== 'number' || Number.isNaN(value)) {\n return <EmptyValue />;\n }\n const precision = field?.settings?.precision === 'minutes' ? 'minutes' : 'seconds';\n return <span className={styles.number}>{formatDuration(value, { precision })}</span>;\n}\n\n/** JSON on one line, shortened. */\nexport function JsonDisplay({ value }: DisplayProps) {\n if (value === null || value === undefined || typeof value !== 'object') {\n return <EmptyValue />;\n }\n const json = JSON.stringify(value);\n return (\n <code className={styles.code} title={json.length > 80 ? json : undefined}>\n {json.length > 80 ? `${json.slice(0, 79)}…` : json}\n </code>\n );\n}\n\n/** Tags, as badges, with the labels of their options. */\nexport function TagsDisplay({ value, field }: DisplayProps) {\n const tags = Array.isArray(value) ? value.filter((tag) => typeof tag === 'string') : [];\n if (tags.length === 0) {\n return <EmptyValue />;\n }\n const options = field?.options ?? [];\n return (\n <span className={styles.tags}>\n {tags.map((tag) => (\n <Badge key={tag}>\n {options.find((option) => String(option.value) === tag)?.label ?? tag}\n </Badge>\n ))}\n </span>\n );\n}\n\n/** What a URL embeds: its thumbnail and title, linked to it. */\nexport function EmbedDisplay({ value }: DisplayProps) {\n if (\n value === null ||\n typeof value !== 'object' ||\n typeof (value as { url?: unknown }).url !== 'string'\n ) {\n return <EmptyValue />;\n }\n const { url, title, thumbnailUrl } = value as {\n url: string;\n title?: unknown;\n thumbnailUrl?: unknown;\n };\n return (\n <a className={`${styles.link} ${styles.media}`} href={url} target=\"_blank\" rel=\"noreferrer\">\n {typeof thumbnailUrl === 'string' ? (\n <img className={styles.thumbnail} src={thumbnailUrl} alt=\"\" />\n ) : null}\n <span className={styles.text}>\n {typeof title === 'string' ? title : url.replace(/^https?:\\/\\//, '')}\n </span>\n </a>\n );\n}\n\n/** A place: its address, or its coordinates. */\nexport function LocationDisplay({ value }: DisplayProps) {\n const intl = usePanneauIntl();\n if (value === null || typeof value !== 'object') {\n return <EmptyValue />;\n }\n const { lat, lng, address } = value as { lat?: unknown; lng?: unknown; address?: unknown };\n if (typeof address === 'string' && address !== '') {\n return <span className={styles.text}>{address}</span>;\n }\n if (typeof lat !== 'number' || typeof lng !== 'number') {\n return <EmptyValue />;\n }\n const format = (number: number) => intl.formatNumber(number, { maximumFractionDigits: 5 });\n return (\n <span className={styles.number}>\n {format(lat)}, {format(lng)}\n </span>\n );\n}\n\n/** A swatch, with the color's code. */\nexport function ColorDisplay({ value }: DisplayProps) {\n if (typeof value !== 'string' || value === '') {\n return <EmptyValue />;\n }\n return (\n <span className={styles.color}>\n <span className={styles.swatch} style={{ backgroundColor: value }} aria-hidden=\"true\" />\n {value}\n </span>\n );\n}\n\n/** A thumbnail and the name of a media item (or of the first one). */\nexport function MediaDisplay({ value }: DisplayProps) {\n const media: unknown = Array.isArray(value) ? value[0] : value;\n if (media === null || typeof media !== 'object') {\n return <EmptyValue />;\n }\n const { thumbnailUrl, url, name, filename } = media as Record<string, unknown>;\n const source =\n typeof thumbnailUrl === 'string' ? thumbnailUrl : typeof url === 'string' ? url : null;\n const label = typeof name === 'string' ? name : typeof filename === 'string' ? filename : '';\n return (\n <span className={styles.media}>\n {source !== null ? <img className={styles.thumbnail} src={source} alt=\"\" /> : null}\n {label !== '' ? <span className={styles.text}>{label}</span> : null}\n </span>\n );\n}\n\n/**\n * The built-in displays, by name. A column's display is its `display`, its field's `display`, or\n * its field's type: field types are display names. Values without a known display are shown as\n * text.\n */\nexport const builtInDisplays: Readonly<Record<string, DisplayEntry>> = {\n text: TextDisplay,\n textarea: TextDisplay,\n slug: TextDisplay,\n richtext: RichTextDisplay,\n number: NumberDisplay,\n boolean: BooleanDisplay,\n date: DateDisplay,\n datetime: DateTimeDisplay,\n time: TimeDisplay,\n select: SelectDisplay,\n relation: RelationDisplay,\n url: UrlDisplay,\n email: EmailDisplay,\n color: ColorDisplay,\n media: MediaDisplay,\n tel: TelDisplay,\n range: NumberDisplay,\n duration: DurationDisplay,\n json: JsonDisplay,\n tags: TagsDisplay,\n embed: EmbedDisplay,\n location: LocationDisplay,\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"displays.js","names":["Check","Minus","toReferences","formatDuration","Badge","Icon","usePanneauIntl","messages","DisplayEntry","DisplayProps","getFieldOptions","getOptionLabel","toText","styles","EmptyValue","$","_c","t0","Symbol","for","empty","isEmpty","value","undefined","Array","isArray","length","TextDisplay","intl","t1","locale","text","t2","RichTextDisplay","replace","trim","NumberDisplay","number","Number","NaN","isNaN","formatNumber","BooleanDisplay","checked","boolean","true","false","t3","formatMessage","yes","no","t4","t5","DATE_ONLY","TIME_ONLY","parseDate","Date","day","exec","date","getTime","DateDisplay","bb0","String","formatDate","dateStyle","DateTimeDisplay","timeStyle","TimeDisplay","match","formatTime","SelectDisplay","field","options","values","badges","map","entry","RelationDisplay","references","_temp","join","reference","label","UrlDisplay","link","EmailDisplay","TelDisplay","DurationDisplay","precision","settings","JsonDisplay","json","JSON","stringify","code","slice","TagsDisplay","tags","filter","_temp2","tag_0","tag","find","option","EmbedDisplay","url","title","thumbnailUrl","thumbnail","media","LocationDisplay","lat","lng","address","maximumFractionDigits","format","ColorDisplay","swatch","backgroundColor","color","MediaDisplay","name","filename","Record","source","builtInDisplays","Readonly","textarea","slug","richtext","datetime","time","select","relation","email","tel","range","duration","embed","location","_c","styles"],"sources":["../../src/displays/displays.tsx"],"sourcesContent":["import { Check, Minus } from 'lucide-react';\n\nimport { toReferences } from '@panneau/fields';\nimport { formatDuration } from '@panneau/fields/duration';\nimport { Badge, Icon, usePanneauIntl } from '@panneau/ui';\n\nimport { messages } from '../messages';\nimport type { DisplayEntry, DisplayProps } from '../types';\nimport { getFieldOptions, getOptionLabel, toText } from '../values';\nimport styles from './Displays.module.css';\n\n/** What a cell shows without a value. Hidden from assistive technologies, which skip the cell. */\nexport function EmptyValue() {\n return (\n <span className={styles.empty} aria-hidden=\"true\">\n —\n </span>\n );\n}\n\nfunction isEmpty(value: unknown): boolean {\n return (\n value === null ||\n value === undefined ||\n value === '' ||\n (Array.isArray(value) && value.length === 0)\n );\n}\n\n/** Text, on two lines at most. The default display. */\nexport function TextDisplay({ value }: DisplayProps) {\n const intl = usePanneauIntl();\n const text = toText(value, intl.locale);\n return text === '' ? <EmptyValue /> : <span className={styles.text}>{text}</span>;\n}\n\n/** HTML as plain text. */\nexport function RichTextDisplay({ value }: DisplayProps) {\n const text =\n typeof value === 'string'\n ? value\n .replace(/<[^>]*>/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim()\n : '';\n return text === '' ? <EmptyValue /> : <span className={styles.text}>{text}</span>;\n}\n\n/** A number, in the format of the locale. */\nexport function NumberDisplay({ value }: DisplayProps) {\n const intl = usePanneauIntl();\n const number =\n typeof value === 'number' ? value : typeof value === 'string' ? Number(value) : NaN;\n if (Number.isNaN(number) || isEmpty(value)) {\n return <EmptyValue />;\n }\n return <span className={styles.number}>{intl.formatNumber(number)}</span>;\n}\n\n/** Yes or no, as an icon with its label. */\nexport function BooleanDisplay({ value }: DisplayProps) {\n const intl = usePanneauIntl();\n if (value === null || value === undefined) {\n return <EmptyValue />;\n }\n const checked = value === true || value === 1 || value === 'true' || value === '1';\n return (\n <span className={`${styles.boolean} ${checked ? styles.true : styles.false}`}>\n <Icon\n icon={checked ? Check : Minus}\n label={intl.formatMessage(checked ? messages.yes : messages.no)}\n />\n </span>\n );\n}\n\nconst DATE_ONLY = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\nconst TIME_ONLY = /^(\\d{2}):(\\d{2})(?::(\\d{2}))?$/;\n\n/** A date (`2026-10-15`) as a local date, so that it doesn't move with the time zone. */\nfunction parseDate(value: unknown): Date | null {\n if (typeof value !== 'string' || value === '') {\n return null;\n }\n const day = DATE_ONLY.exec(value);\n const date =\n day !== null\n ? new Date(Number(day[1]), Number(day[2]) - 1, Number(day[3]))\n : new Date(value);\n return Number.isNaN(date.getTime()) ? null : date;\n}\n\n/** A date, in the format of the locale. */\nexport function DateDisplay({ value }: DisplayProps) {\n const intl = usePanneauIntl();\n const date = parseDate(value);\n if (date === null) {\n return <EmptyValue />;\n }\n return <time dateTime={String(value)}>{intl.formatDate(date, { dateStyle: 'medium' })}</time>;\n}\n\n/** A date and a time, in the format and the time zone of the user. */\nexport function DateTimeDisplay({ value }: DisplayProps) {\n const intl = usePanneauIntl();\n const date = parseDate(value);\n if (date === null) {\n return <EmptyValue />;\n }\n return (\n <time dateTime={String(value)}>\n {intl.formatDate(date, { dateStyle: 'medium', timeStyle: 'short' })}\n </time>\n );\n}\n\n/** A time of day (`14:30`), in the format of the locale. */\nexport function TimeDisplay({ value }: DisplayProps) {\n const intl = usePanneauIntl();\n const match = typeof value === 'string' ? TIME_ONLY.exec(value) : null;\n if (match === null) {\n return <EmptyValue />;\n }\n const date = new Date(2000, 0, 1, Number(match[1]), Number(match[2]), Number(match[3] ?? 0));\n return <time dateTime={String(value)}>{intl.formatTime(date, { timeStyle: 'short' })}</time>;\n}\n\n/** The labels of the selected options, as badges. */\nexport function SelectDisplay({ value, field }: DisplayProps) {\n const options = getFieldOptions(field);\n const values: unknown[] = Array.isArray(value) ? value : isEmpty(value) ? [] : [value];\n if (values.length === 0) {\n return <EmptyValue />;\n }\n return (\n <span className={styles.badges}>\n {values.map((entry) => (\n <Badge key={String(entry)}>{getOptionLabel(options, entry) ?? String(entry)}</Badge>\n ))}\n </span>\n );\n}\n\n/** The labels of related items. */\nexport function RelationDisplay({ value }: DisplayProps) {\n const references = toReferences(value);\n if (references.length === 0) {\n return <EmptyValue />;\n }\n return (\n <span className={styles.text}>\n {references.map((reference) => reference.label).join(', ')}\n </span>\n );\n}\n\n/** A link that opens the URL. */\nexport function UrlDisplay({ value }: DisplayProps) {\n if (typeof value !== 'string' || value === '') {\n return <EmptyValue />;\n }\n return (\n <a className={styles.link} href={value} target=\"_blank\" rel=\"noreferrer\">\n {value.replace(/^https?:\\/\\//, '')}\n </a>\n );\n}\n\n/** A link that writes an email. */\nexport function EmailDisplay({ value }: DisplayProps) {\n if (typeof value !== 'string' || value === '') {\n return <EmptyValue />;\n }\n return (\n <a className={styles.link} href={`mailto:${value}`}>\n {value}\n </a>\n );\n}\n\n/** A link that calls the phone number. */\nexport function TelDisplay({ value }: DisplayProps) {\n if (typeof value !== 'string' || value.trim() === '') {\n return <EmptyValue />;\n }\n return (\n <a className={styles.link} href={`tel:${value.replace(/[^\\d+]/g, '')}`}>\n {value}\n </a>\n );\n}\n\n/** A duration in seconds, with its units: `1 h 5 min`, to the precision of its field. */\nexport function DurationDisplay({ value, field }: DisplayProps) {\n if (typeof value !== 'number' || Number.isNaN(value)) {\n return <EmptyValue />;\n }\n const precision = field?.settings?.precision === 'minutes' ? 'minutes' : 'seconds';\n return <span className={styles.number}>{formatDuration(value, { precision })}</span>;\n}\n\n/** JSON on one line, shortened. */\nexport function JsonDisplay({ value }: DisplayProps) {\n if (value === null || value === undefined || typeof value !== 'object') {\n return <EmptyValue />;\n }\n const json = JSON.stringify(value);\n return (\n <code className={styles.code} title={json.length > 80 ? json : undefined}>\n {json.length > 80 ? `${json.slice(0, 79)}…` : json}\n </code>\n );\n}\n\n/** Tags, as badges, with the labels of their options. */\nexport function TagsDisplay({ value, field }: DisplayProps) {\n const tags = Array.isArray(value) ? value.filter((tag) => typeof tag === 'string') : [];\n if (tags.length === 0) {\n return <EmptyValue />;\n }\n const options = field?.options ?? [];\n return (\n <span className={styles.tags}>\n {tags.map((tag) => (\n <Badge key={tag}>\n {options.find((option) => String(option.value) === tag)?.label ?? tag}\n </Badge>\n ))}\n </span>\n );\n}\n\n/** What a URL embeds: its thumbnail and title, linked to it. */\nexport function EmbedDisplay({ value }: DisplayProps) {\n if (\n value === null ||\n typeof value !== 'object' ||\n typeof (value as { url?: unknown }).url !== 'string'\n ) {\n return <EmptyValue />;\n }\n const { url, title, thumbnailUrl } = value as {\n url: string;\n title?: unknown;\n thumbnailUrl?: unknown;\n };\n return (\n <a className={`${styles.link} ${styles.media}`} href={url} target=\"_blank\" rel=\"noreferrer\">\n {typeof thumbnailUrl === 'string' ? (\n <img className={styles.thumbnail} src={thumbnailUrl} alt=\"\" />\n ) : null}\n <span className={styles.text}>\n {typeof title === 'string' ? title : url.replace(/^https?:\\/\\//, '')}\n </span>\n </a>\n );\n}\n\n/** A place: its address, or its coordinates. */\nexport function LocationDisplay({ value }: DisplayProps) {\n const intl = usePanneauIntl();\n if (value === null || typeof value !== 'object') {\n return <EmptyValue />;\n }\n const { lat, lng, address } = value as { lat?: unknown; lng?: unknown; address?: unknown };\n if (typeof address === 'string' && address !== '') {\n return <span className={styles.text}>{address}</span>;\n }\n if (typeof lat !== 'number' || typeof lng !== 'number') {\n return <EmptyValue />;\n }\n const format = (number: number) => intl.formatNumber(number, { maximumFractionDigits: 5 });\n return (\n <span className={styles.number}>\n {format(lat)}, {format(lng)}\n </span>\n );\n}\n\n/** A swatch, with the color's code. */\nexport function ColorDisplay({ value }: DisplayProps) {\n if (typeof value !== 'string' || value === '') {\n return <EmptyValue />;\n }\n return (\n <span className={styles.color}>\n <span className={styles.swatch} style={{ backgroundColor: value }} aria-hidden=\"true\" />\n {value}\n </span>\n );\n}\n\n/** A thumbnail and the name of a media item (or of the first one). */\nexport function MediaDisplay({ value }: DisplayProps) {\n const media: unknown = Array.isArray(value) ? value[0] : value;\n if (media === null || typeof media !== 'object') {\n return <EmptyValue />;\n }\n const { thumbnailUrl, url, name, filename } = media as Record<string, unknown>;\n const source =\n typeof thumbnailUrl === 'string' ? thumbnailUrl : typeof url === 'string' ? url : null;\n const label = typeof name === 'string' ? name : typeof filename === 'string' ? filename : '';\n return (\n <span className={styles.media}>\n {source !== null ? <img className={styles.thumbnail} src={source} alt=\"\" /> : null}\n {label !== '' ? <span className={styles.text}>{label}</span> : null}\n </span>\n );\n}\n\n/**\n * The built-in displays, by name. A column's display is its `display`, its field's `display`, or\n * its field's type: field types are display names. Values without a known display are shown as\n * text.\n */\nexport const builtInDisplays: Readonly<Record<string, DisplayEntry>> = {\n text: TextDisplay,\n textarea: TextDisplay,\n slug: TextDisplay,\n richtext: RichTextDisplay,\n number: NumberDisplay,\n boolean: BooleanDisplay,\n date: DateDisplay,\n datetime: DateTimeDisplay,\n time: TimeDisplay,\n select: SelectDisplay,\n relation: RelationDisplay,\n url: UrlDisplay,\n email: EmailDisplay,\n color: ColorDisplay,\n media: MediaDisplay,\n tel: TelDisplay,\n range: NumberDisplay,\n duration: DurationDisplay,\n json: JsonDisplay,\n tags: TagsDisplay,\n embed: EmbedDisplay,\n location: LocationDisplay,\n};\n"],"mappings":"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"}
@@ -2,10 +2,10 @@ import { messages } from "../messages.js";
2
2
  import Filters_module_default from "./Filters.module.js";
3
3
  import { builtInFilters } from "./controls.js";
4
4
  import { formatFilterValue, getFilterLabel, getFilterOptions } from "./format.js";
5
+ import { c } from "react/compiler-runtime";
5
6
  import { Button, IconButton, usePanneauIntl } from "@panneau/ui";
6
7
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
7
8
  import { X } from "lucide-react";
8
- import { c } from "react/compiler-runtime";
9
9
  import { useState } from "react";
10
10
  //#region src/filters/Filters.tsx
11
11
  /** Remembers the labels of filter values, for the chips of active filters. */
@@ -1 +1 @@
1
- {"version":3,"file":"Filters.js","names":["filter","value","X","onClearSearch","text","label","id","onClear","_c","styles","_Fragment"],"sources":["../../src/filters/Filters.tsx"],"sourcesContent":["import { X } from 'lucide-react';\nimport { useState } from 'react';\n\nimport type { Field, Filter, FilterValue } from '@panneau/protocol';\nimport { Button, IconButton, usePanneauIntl } from '@panneau/ui';\n\nimport { messages } from '../messages';\nimport type { FilterEntry, ListColumn } from '../types';\nimport styles from './Filters.module.css';\nimport { builtInFilters } from './controls';\nimport { formatFilterValue, getFilterLabel, getFilterOptions } from './format';\n\n/** Labels of filter values (relation ids), by filter id, for the chips. */\nexport type FilterLabels = Readonly<Record<string, Readonly<Record<string, string>>>>;\n\n/** Remembers the labels of filter values, for the chips of active filters. */\nexport function useFilterLabels(): {\n labels: FilterLabels;\n remember: (filter: string, value: string, label: string) => void;\n} {\n const [labels, setLabels] = useState<FilterLabels>({});\n return {\n labels,\n remember: (filter, value, label) =>\n setLabels((current) =>\n current[filter]?.[value] === label\n ? current\n : { ...current, [filter]: { ...current[filter], [value]: label } },\n ),\n };\n}\n\ninterface FilterContext {\n columns: readonly ListColumn[];\n fields: readonly Field[];\n labels: FilterLabels;\n}\n\nexport interface FilterControlsProps extends FilterContext {\n filters: readonly Filter[];\n /** The current filter values, by filter id. */\n values: Readonly<Record<string, FilterValue>>;\n onChange: (id: string, value: FilterValue | undefined) => void;\n onLabel: (filter: string, value: string, label: string) => void;\n /** Controls by filter type, over the built-in ones. */\n controls?: Readonly<Record<string, FilterEntry>> | undefined;\n}\n\n/** A control for each filter of the list. */\nexport function FilterControls({\n filters,\n values,\n onChange,\n onLabel,\n controls,\n columns,\n fields,\n labels,\n}: FilterControlsProps) {\n const intl = usePanneauIntl();\n return (\n <div\n role=\"group\"\n aria-label={intl.formatMessage(messages.filters)}\n className={styles.filters}\n >\n {filters.map((filter) => {\n const Control =\n controls?.[filter.type] ?? builtInFilters[filter.type] ?? builtInFilters.text;\n if (Control === undefined) {\n return null;\n }\n return (\n <Control\n key={filter.id}\n filter={filter}\n label={getFilterLabel(filter, columns, fields)}\n options={getFilterOptions(filter, columns, fields)}\n value={values[filter.id]}\n onChange={(value) => onChange(filter.id, value)}\n onLabel={(value, label) => onLabel(filter.id, value, label)}\n getValueLabel={(value) => labels[filter.id]?.[value] ?? null}\n />\n );\n })}\n </div>\n );\n}\n\nexport interface FilterChipsProps extends FilterContext {\n filters: readonly Filter[];\n values: Readonly<Record<string, FilterValue>>;\n /** The search, shown as a chip too. */\n q?: string | undefined;\n onRemove: (id: string) => void;\n onClearSearch: () => void;\n onClear: () => void;\n}\n\n/** The active filters and the search, as chips that remove them, and a button to clear them all. */\nexport function FilterChips({\n filters,\n values,\n q,\n onRemove,\n onClearSearch,\n onClear,\n columns,\n fields,\n labels,\n}: FilterChipsProps) {\n const intl = usePanneauIntl();\n const chips = Object.entries(values).map(([id, value]) => {\n const filter = filters.find((candidate) => candidate.id === id) ?? { id, type: 'text' };\n const label = getFilterLabel(filter, columns, fields);\n const text =\n filter.type === 'toggle'\n ? null\n : formatFilterValue(filter, value, {\n intl,\n options: getFilterOptions(filter, columns, fields),\n getValueLabel: (entry) => labels[id]?.[entry] ?? null,\n });\n return { id, label, text };\n });\n const search = q !== undefined && q !== '' ? q : null;\n if (chips.length === 0 && search === null) {\n return null;\n }\n return (\n <div className={styles.chips}>\n <ul aria-label={intl.formatMessage(messages.activeFilters)} className={styles.chips}>\n {search !== null ? (\n <li className={styles.chip}>\n <span className={styles.chipText}>\n {intl.formatMessage(messages.searchChip, { q: search })}\n </span>\n <IconButton\n icon={X}\n size=\"sm\"\n showTooltip={false}\n label={intl.formatMessage(messages.removeFilter, {\n filter: intl.formatMessage(messages.searchChip, { q: search }),\n })}\n onPress={onClearSearch}\n />\n </li>\n ) : null}\n {chips.map(({ id, label, text }) => {\n const name = text !== null ? `${label}: ${text}` : label;\n return (\n <li key={id} className={styles.chip}>\n <span className={styles.chipText}>\n {text !== null ? (\n <>\n <span className={styles.chipLabel}>{label}:</span> {text}\n </>\n ) : (\n label\n )}\n </span>\n <IconButton\n icon={X}\n size=\"sm\"\n showTooltip={false}\n label={intl.formatMessage(messages.removeFilter, { filter: name })}\n onPress={() => onRemove(id)}\n />\n </li>\n );\n })}\n </ul>\n <Button variant=\"ghost\" size=\"sm\" onPress={onClear}>\n {intl.formatMessage(messages.clearFilters)}\n </Button>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"Filters.js","names":["X","useState","Field","Filter","FilterValue","Button","IconButton","usePanneauIntl","messages","FilterEntry","ListColumn","styles","builtInFilters","formatFilterValue","getFilterLabel","getFilterOptions","FilterLabels","Readonly","Record","useFilterLabels","$","_c","t0","Symbol","for","labels","setLabels","t1","filter","value","label","current","t2","remember","FilterContext","columns","fields","FilterControlsProps","filters","values","onChange","id","onLabel","controls","FilterControls","intl","formatMessage","t3","Control","type","text","undefined","value_0","value_1","map","FilterChipsProps","q","onRemove","onClearSearch","onClear","FilterChips","Object","entries","find","candidate","options","getValueLabel","entry","chips","search","length","activeFilters","chip","chipText","searchChip","removeFilter","t4","t5","id_0","label_0","text_0","name","chipLabel","t6","clearFilters","t7","t8","_c","styles","_Fragment"],"sources":["../../src/filters/Filters.tsx"],"sourcesContent":["import { X } from 'lucide-react';\nimport { useState } from 'react';\n\nimport type { Field, Filter, FilterValue } from '@panneau/protocol';\nimport { Button, IconButton, usePanneauIntl } from '@panneau/ui';\n\nimport { messages } from '../messages';\nimport type { FilterEntry, ListColumn } from '../types';\nimport styles from './Filters.module.css';\nimport { builtInFilters } from './controls';\nimport { formatFilterValue, getFilterLabel, getFilterOptions } from './format';\n\n/** Labels of filter values (relation ids), by filter id, for the chips. */\nexport type FilterLabels = Readonly<Record<string, Readonly<Record<string, string>>>>;\n\n/** Remembers the labels of filter values, for the chips of active filters. */\nexport function useFilterLabels(): {\n labels: FilterLabels;\n remember: (filter: string, value: string, label: string) => void;\n} {\n const [labels, setLabels] = useState<FilterLabels>({});\n return {\n labels,\n remember: (filter, value, label) =>\n setLabels((current) =>\n current[filter]?.[value] === label\n ? current\n : { ...current, [filter]: { ...current[filter], [value]: label } },\n ),\n };\n}\n\ninterface FilterContext {\n columns: readonly ListColumn[];\n fields: readonly Field[];\n labels: FilterLabels;\n}\n\nexport interface FilterControlsProps extends FilterContext {\n filters: readonly Filter[];\n /** The current filter values, by filter id. */\n values: Readonly<Record<string, FilterValue>>;\n onChange: (id: string, value: FilterValue | undefined) => void;\n onLabel: (filter: string, value: string, label: string) => void;\n /** Controls by filter type, over the built-in ones. */\n controls?: Readonly<Record<string, FilterEntry>> | undefined;\n}\n\n/** A control for each filter of the list. */\nexport function FilterControls({\n filters,\n values,\n onChange,\n onLabel,\n controls,\n columns,\n fields,\n labels,\n}: FilterControlsProps) {\n const intl = usePanneauIntl();\n return (\n <div\n role=\"group\"\n aria-label={intl.formatMessage(messages.filters)}\n className={styles.filters}\n >\n {filters.map((filter) => {\n const Control =\n controls?.[filter.type] ?? builtInFilters[filter.type] ?? builtInFilters.text;\n if (Control === undefined) {\n return null;\n }\n return (\n <Control\n key={filter.id}\n filter={filter}\n label={getFilterLabel(filter, columns, fields)}\n options={getFilterOptions(filter, columns, fields)}\n value={values[filter.id]}\n onChange={(value) => onChange(filter.id, value)}\n onLabel={(value, label) => onLabel(filter.id, value, label)}\n getValueLabel={(value) => labels[filter.id]?.[value] ?? null}\n />\n );\n })}\n </div>\n );\n}\n\nexport interface FilterChipsProps extends FilterContext {\n filters: readonly Filter[];\n values: Readonly<Record<string, FilterValue>>;\n /** The search, shown as a chip too. */\n q?: string | undefined;\n onRemove: (id: string) => void;\n onClearSearch: () => void;\n onClear: () => void;\n}\n\n/** The active filters and the search, as chips that remove them, and a button to clear them all. */\nexport function FilterChips({\n filters,\n values,\n q,\n onRemove,\n onClearSearch,\n onClear,\n columns,\n fields,\n labels,\n}: FilterChipsProps) {\n const intl = usePanneauIntl();\n const chips = Object.entries(values).map(([id, value]) => {\n const filter = filters.find((candidate) => candidate.id === id) ?? { id, type: 'text' };\n const label = getFilterLabel(filter, columns, fields);\n const text =\n filter.type === 'toggle'\n ? null\n : formatFilterValue(filter, value, {\n intl,\n options: getFilterOptions(filter, columns, fields),\n getValueLabel: (entry) => labels[id]?.[entry] ?? null,\n });\n return { id, label, text };\n });\n const search = q !== undefined && q !== '' ? q : null;\n if (chips.length === 0 && search === null) {\n return null;\n }\n return (\n <div className={styles.chips}>\n <ul aria-label={intl.formatMessage(messages.activeFilters)} className={styles.chips}>\n {search !== null ? (\n <li className={styles.chip}>\n <span className={styles.chipText}>\n {intl.formatMessage(messages.searchChip, { q: search })}\n </span>\n <IconButton\n icon={X}\n size=\"sm\"\n showTooltip={false}\n label={intl.formatMessage(messages.removeFilter, {\n filter: intl.formatMessage(messages.searchChip, { q: search }),\n })}\n onPress={onClearSearch}\n />\n </li>\n ) : null}\n {chips.map(({ id, label, text }) => {\n const name = text !== null ? `${label}: ${text}` : label;\n return (\n <li key={id} className={styles.chip}>\n <span className={styles.chipText}>\n {text !== null ? (\n <>\n <span className={styles.chipLabel}>{label}:</span> {text}\n </>\n ) : (\n label\n )}\n </span>\n <IconButton\n icon={X}\n size=\"sm\"\n showTooltip={false}\n label={intl.formatMessage(messages.removeFilter, { filter: name })}\n onPress={() => onRemove(id)}\n />\n </li>\n );\n })}\n </ul>\n <Button variant=\"ghost\" size=\"sm\" onPress={onClear}>\n {intl.formatMessage(messages.clearFilters)}\n </Button>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,9 +1,9 @@
1
1
  import { messages } from "../messages.js";
2
2
  import { useDraft } from "../useDraft.js";
3
3
  import Filters_module_default from "./Filters.module.js";
4
+ import { c } from "react/compiler-runtime";
4
5
  import { Fieldset, Select, Switch, TextInput, usePanneauIntl } from "@panneau/ui";
5
6
  import { jsx, jsxs } from "react/jsx-runtime";
6
- import { c } from "react/compiler-runtime";
7
7
  import { useFieldsContext } from "@panneau/fields";
8
8
  import { useEffect } from "react";
9
9
  import { DateField } from "@panneau/fields/date";
@@ -1 +1 @@
1
- {"version":3,"file":"controls.js","names":["label","draft","setDraft","flush","options","placeholder","option","reference","next","resource","references","_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 />\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 +1 @@
1
- {"version":3,"file":"format.js","names":[],"sources":["../../src/filters/format.ts"],"sourcesContent":["import type { IntlShape } from 'react-intl';\n\nimport type { Field, Filter, Option } from '@panneau/protocol';\nimport { isFilterRange } from '@panneau/protocol/runtime';\n\nimport { messages } from '../messages';\nimport type { ListColumn } from '../types';\nimport { getFieldOptions, getOptionLabel } from '../values';\n\n/** The label of a filter: its `label`, the label of its field, or its id. */\nexport function getFilterLabel(\n filter: Filter,\n columns: readonly ListColumn[],\n fields: readonly Field[],\n): string {\n if (filter.label !== undefined) {\n return filter.label;\n }\n const field = findFilterField(filter, columns, fields);\n return field?.label ?? filter.id;\n}\n\n/** The field a filter filters, when a column or the list's fields have one with its id. */\nexport function findFilterField(\n filter: Filter,\n columns: readonly ListColumn[],\n fields: readonly Field[],\n): Field | null {\n return (\n fields.find((field) => field.name === filter.id) ??\n columns.find((column) => column.field?.name === filter.id)?.field ??\n null\n );\n}\n\n/** The options of a filter: its own, or those of the field it filters. */\nexport function getFilterOptions(\n filter: Filter,\n columns: readonly ListColumn[],\n fields: readonly Field[],\n): readonly Option[] {\n return filter.options ?? getFieldOptions(findFilterField(filter, columns, fields));\n}\n\nconst DATE_ONLY = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\n\nfunction formatDay(value: string, intl: IntlShape): string {\n const match = DATE_ONLY.exec(value);\n if (match === null) {\n return value;\n }\n return intl.formatDate(new Date(Number(match[1]), Number(match[2]) - 1, Number(match[3])), {\n dateStyle: 'medium',\n });\n}\n\n/** The value of an active filter, as the text of its chip. */\nexport function formatFilterValue(\n filter: Filter,\n value: unknown,\n {\n intl,\n options,\n getValueLabel,\n }: {\n intl: IntlShape;\n options: readonly Option[];\n getValueLabel: (value: string) => string | null;\n },\n): string {\n const values: unknown[] = Array.isArray(value) ? value : [value];\n switch (filter.type) {\n case 'toggle':\n return intl.formatMessage(String(value) === 'true' ? messages.yes : messages.no);\n case 'date':\n return formatDay(String(value), intl);\n case 'date-range': {\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 return intl.formatMessage(messages.dateRange, {\n from: from !== '' ? formatDay(from, intl) : '…',\n to: to !== '' ? formatDay(to, intl) : '…',\n });\n }\n case 'relation':\n return values.map((entry) => getValueLabel(String(entry)) ?? String(entry)).join(', ');\n default:\n return values\n .map((entry) => getOptionLabel(options, entry) ?? String(entry))\n .join(', ');\n }\n}\n"],"mappings":";;;;;AAUA,SAAgB,eACZ,QACA,SACA,QACM;CACN,IAAI,OAAO,UAAU,KAAA,GACjB,OAAO,OAAO;CAGlB,OADc,gBAAgB,QAAQ,SAAS,MACxC,CAAA,EAAO,SAAS,OAAO;AAClC;;AAGA,SAAgB,gBACZ,QACA,SACA,QACY;CACZ,OACI,OAAO,MAAM,UAAU,MAAM,SAAS,OAAO,EAAE,KAC/C,QAAQ,MAAM,WAAW,OAAO,OAAO,SAAS,OAAO,EAAE,CAAC,EAAE,SAC5D;AAER;;AAGA,SAAgB,iBACZ,QACA,SACA,QACiB;CACjB,OAAO,OAAO,WAAW,gBAAgB,gBAAgB,QAAQ,SAAS,MAAM,CAAC;AACrF;AAEA,IAAM,YAAY;AAElB,SAAS,UAAU,OAAe,MAAyB;CACvD,MAAM,QAAQ,UAAU,KAAK,KAAK;CAClC,IAAI,UAAU,MACV,OAAO;CAEX,OAAO,KAAK,WAAW,IAAI,KAAK,OAAO,MAAM,EAAE,GAAG,OAAO,MAAM,EAAE,IAAI,GAAG,OAAO,MAAM,EAAE,CAAC,GAAG,EACvF,WAAW,SACf,CAAC;AACL;;AAGA,SAAgB,kBACZ,QACA,OACA,EACI,MACA,SACA,iBAME;CACN,MAAM,SAAoB,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;CAC/D,QAAQ,OAAO,MAAf;EACI,KAAK,UACD,OAAO,KAAK,cAAc,OAAO,KAAK,MAAM,SAAS,SAAS,MAAM,SAAS,EAAE;EACnF,KAAK,QACD,OAAO,UAAU,OAAO,KAAK,GAAG,IAAI;EACxC,KAAK,cAAc;GACf,MAAM,QAAQ,cAAc,KAAK,IAAI,QAAQ,CAAC;GAC9C,MAAM,OAAO,MAAM,SAAS,KAAA,IAAY,OAAO,MAAM,IAAI,IAAI;GAC7D,MAAM,KAAK,MAAM,OAAO,KAAA,IAAY,OAAO,MAAM,EAAE,IAAI;GACvD,OAAO,KAAK,cAAc,SAAS,WAAW;IAC1C,MAAM,SAAS,KAAK,UAAU,MAAM,IAAI,IAAI;IAC5C,IAAI,OAAO,KAAK,UAAU,IAAI,IAAI,IAAI;GAC1C,CAAC;EACL;EACA,KAAK,YACD,OAAO,OAAO,KAAK,UAAU,cAAc,OAAO,KAAK,CAAC,KAAK,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI;EACzF,SACI,OAAO,OACF,KAAK,UAAU,eAAe,SAAS,KAAK,KAAK,OAAO,KAAK,CAAC,CAAC,CAC/D,KAAK,IAAI;CACtB;AACJ"}
1
+ {"version":3,"file":"format.js","names":["IntlShape","Field","Filter","Option","isFilterRange","messages","ListColumn","getFieldOptions","getOptionLabel","getFilterLabel","filter","columns","fields","label","undefined","field","findFilterField","id","find","name","column","getFilterOptions","options","DATE_ONLY","formatDay","value","intl","match","exec","formatDate","Date","Number","dateStyle","formatFilterValue","getValueLabel","values","Array","isArray","type","formatMessage","String","yes","no","range","from","to","dateRange","map","entry","join"],"sources":["../../src/filters/format.ts"],"sourcesContent":["import type { IntlShape } from 'react-intl';\n\nimport type { Field, Filter, Option } from '@panneau/protocol';\nimport { isFilterRange } from '@panneau/protocol/runtime';\n\nimport { messages } from '../messages';\nimport type { ListColumn } from '../types';\nimport { getFieldOptions, getOptionLabel } from '../values';\n\n/** The label of a filter: its `label`, the label of its field, or its id. */\nexport function getFilterLabel(\n filter: Filter,\n columns: readonly ListColumn[],\n fields: readonly Field[],\n): string {\n if (filter.label !== undefined) {\n return filter.label;\n }\n const field = findFilterField(filter, columns, fields);\n return field?.label ?? filter.id;\n}\n\n/** The field a filter filters, when a column or the list's fields have one with its id. */\nexport function findFilterField(\n filter: Filter,\n columns: readonly ListColumn[],\n fields: readonly Field[],\n): Field | null {\n return (\n fields.find((field) => field.name === filter.id) ??\n columns.find((column) => column.field?.name === filter.id)?.field ??\n null\n );\n}\n\n/** The options of a filter: its own, or those of the field it filters. */\nexport function getFilterOptions(\n filter: Filter,\n columns: readonly ListColumn[],\n fields: readonly Field[],\n): readonly Option[] {\n return filter.options ?? getFieldOptions(findFilterField(filter, columns, fields));\n}\n\nconst DATE_ONLY = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\n\nfunction formatDay(value: string, intl: IntlShape): string {\n const match = DATE_ONLY.exec(value);\n if (match === null) {\n return value;\n }\n return intl.formatDate(new Date(Number(match[1]), Number(match[2]) - 1, Number(match[3])), {\n dateStyle: 'medium',\n });\n}\n\n/** The value of an active filter, as the text of its chip. */\nexport function formatFilterValue(\n filter: Filter,\n value: unknown,\n {\n intl,\n options,\n getValueLabel,\n }: {\n intl: IntlShape;\n options: readonly Option[];\n getValueLabel: (value: string) => string | null;\n },\n): string {\n const values: unknown[] = Array.isArray(value) ? value : [value];\n switch (filter.type) {\n case 'toggle':\n return intl.formatMessage(String(value) === 'true' ? messages.yes : messages.no);\n case 'date':\n return formatDay(String(value), intl);\n case 'date-range': {\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 return intl.formatMessage(messages.dateRange, {\n from: from !== '' ? formatDay(from, intl) : '…',\n to: to !== '' ? formatDay(to, intl) : '…',\n });\n }\n case 'relation':\n return values.map((entry) => getValueLabel(String(entry)) ?? String(entry)).join(', ');\n default:\n return values\n .map((entry) => getOptionLabel(options, entry) ?? String(entry))\n .join(', ');\n }\n}\n"],"mappings":";;;;;AAUA,SAAgBS,eACZC,QACAC,SACAC,QACM;CACN,IAAIF,OAAOG,UAAUC,KAAAA,GACjB,OAAOJ,OAAOG;CAGlB,OADcG,gBAAgBN,QAAQC,SAASC,MACxCG,CAAAA,EAAOF,SAASH,OAAOO;AAClC;;AAGA,SAAgBD,gBACZN,QACAC,SACAC,QACY;CACZ,OACIA,OAAOM,MAAMH,UAAUA,MAAMI,SAAST,OAAOO,EAAE,KAC/CN,QAAQO,MAAME,WAAWA,OAAOL,OAAOI,SAAST,OAAOO,EAAE,CAAC,EAAEF,SAC5D;AAER;;AAGA,SAAgBM,iBACZX,QACAC,SACAC,QACiB;CACjB,OAAOF,OAAOY,WAAWf,gBAAgBS,gBAAgBN,QAAQC,SAASC,MAAM,CAAC;AACrF;AAEA,IAAMW,YAAY;AAElB,SAASC,UAAUC,OAAeC,MAAyB;CACvD,MAAMC,QAAQJ,UAAUK,KAAKH,KAAK;CAClC,IAAIE,UAAU,MACV,OAAOF;CAEX,OAAOC,KAAKG,WAAW,IAAIC,KAAKC,OAAOJ,MAAM,EAAE,GAAGI,OAAOJ,MAAM,EAAE,IAAI,GAAGI,OAAOJ,MAAM,EAAE,CAAC,GAAG,EACvFK,WAAW,SACf,CAAC;AACL;;AAGA,SAAgBC,kBACZvB,QACAe,OACA,EACIC,MACAJ,SACAY,iBAME;CACN,MAAMC,SAAoBC,MAAMC,QAAQZ,KAAK,IAAIA,QAAQ,CAACA,KAAK;CAC/D,QAAQf,OAAO4B,MAAf;EACI,KAAK,UACD,OAAOZ,KAAKa,cAAcC,OAAOf,KAAK,MAAM,SAASpB,SAASoC,MAAMpC,SAASqC,EAAE;EACnF,KAAK,QACD,OAAOlB,UAAUgB,OAAOf,KAAK,GAAGC,IAAI;EACxC,KAAK,cAAc;GACf,MAAMiB,QAAQvC,cAAcqB,KAAK,IAAIA,QAAQ,CAAC;GAC9C,MAAMmB,OAAOD,MAAMC,SAAS9B,KAAAA,IAAY0B,OAAOG,MAAMC,IAAI,IAAI;GAC7D,MAAMC,KAAKF,MAAME,OAAO/B,KAAAA,IAAY0B,OAAOG,MAAME,EAAE,IAAI;GACvD,OAAOnB,KAAKa,cAAclC,SAASyC,WAAW;IAC1CF,MAAMA,SAAS,KAAKpB,UAAUoB,MAAMlB,IAAI,IAAI;IAC5CmB,IAAIA,OAAO,KAAKrB,UAAUqB,IAAInB,IAAI,IAAI;GAC1C,CAAC;EACL;EACA,KAAK,YACD,OAAOS,OAAOY,KAAKC,UAAUd,cAAcM,OAAOQ,KAAK,CAAC,KAAKR,OAAOQ,KAAK,CAAC,CAAC,CAACC,KAAK,IAAI;EACzF,SACI,OAAOd,OACFY,KAAKC,UAAUxC,eAAec,SAAS0B,KAAK,KAAKR,OAAOQ,KAAK,CAAC,CAAC,CAC/DC,KAAK,IAAI;CACtB;AACJ"}
@@ -1,9 +1,9 @@
1
1
  import { messages } from "../messages.js";
2
2
  import CardsLayout_module_default from "./CardsLayout.module.js";
3
3
  import { ItemTitle } from "./ItemTitle.js";
4
+ import { c } from "react/compiler-runtime";
4
5
  import { Checkbox, usePanneauIntl } from "@panneau/ui";
5
6
  import { jsx, jsxs } from "react/jsx-runtime";
6
- import { c } from "react/compiler-runtime";
7
7
  //#region src/layouts/CardsLayout.tsx
8
8
  /** Items as cards: the first column is the title, the others are listed under it. */
9
9
  function CardsLayout(t0) {
@@ -1 +1 @@
1
- {"version":3,"file":"CardsLayout.js","names":["pageSelection","label","current","selected","actions","_c","styles"],"sources":["../../src/layouts/CardsLayout.tsx"],"sourcesContent":["import { Checkbox, usePanneauIntl } from '@panneau/ui';\n\nimport { messages } from '../messages';\nimport type { ListLayoutProps } from '../types';\nimport styles from './CardsLayout.module.css';\nimport { ItemTitle } from './ItemTitle';\n\n/** Items as cards: the first column is the title, the others are listed under it. */\nexport function CardsLayout({\n items,\n columns,\n renderValue,\n getItemLabel,\n getItemHref,\n isCurrent,\n selectable,\n isSelected,\n onToggle,\n renderActions,\n label,\n pageSelection,\n}: ListLayoutProps) {\n const intl = usePanneauIntl();\n const [title, ...others] = columns;\n return (\n <div>\n {selectable ? <div className={styles.pageSelection}>{pageSelection}</div> : null}\n <ul className={styles.cards} aria-label={label}>\n {items.map((item) => {\n const selected = selectable && isSelected(item);\n const actions = renderActions(item);\n const current = isCurrent?.(item) ?? false;\n return (\n <li\n key={item.id}\n className={styles.card}\n data-selected={selected || undefined}\n data-current={current || undefined}\n >\n <div className={styles.header}>\n <div className={styles.title}>\n <ItemTitle href={getItemHref?.(item) ?? null} current={current}>\n {title !== undefined\n ? renderValue(item, title)\n : getItemLabel(item)}\n </ItemTitle>\n </div>\n {selectable ? (\n <Checkbox\n aria-label={intl.formatMessage(messages.selectItem, {\n item: getItemLabel(item),\n })}\n isSelected={selected}\n onChange={() => onToggle(item)}\n />\n ) : null}\n </div>\n {others.length > 0 ? (\n <dl className={styles.values}>\n {others.map((column) => (\n <div key={column.id} className={styles.value}>\n <dt>{column.label ?? column.id}</dt>\n <dd>{renderValue(item, column)}</dd>\n </div>\n ))}\n </dl>\n ) : null}\n {actions !== null ? (\n <div className={styles.actions}>{actions}</div>\n ) : null}\n </li>\n );\n })}\n </ul>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"CardsLayout.js","names":["Checkbox","usePanneauIntl","messages","ListLayoutProps","styles","ItemTitle","CardsLayout","t0","$","_c","items","columns","renderValue","getItemLabel","getItemHref","isCurrent","selectable","isSelected","onToggle","renderActions","label","pageSelection","intl","t1","t2","t3","t4","title","others","cards","map","item","selected","actions","current","id","card","undefined","header","formatMessage","selectItem","length","values","column","value","t5","t6","_c","styles"],"sources":["../../src/layouts/CardsLayout.tsx"],"sourcesContent":["import { Checkbox, usePanneauIntl } from '@panneau/ui';\n\nimport { messages } from '../messages';\nimport type { ListLayoutProps } from '../types';\nimport styles from './CardsLayout.module.css';\nimport { ItemTitle } from './ItemTitle';\n\n/** Items as cards: the first column is the title, the others are listed under it. */\nexport function CardsLayout({\n items,\n columns,\n renderValue,\n getItemLabel,\n getItemHref,\n isCurrent,\n selectable,\n isSelected,\n onToggle,\n renderActions,\n label,\n pageSelection,\n}: ListLayoutProps) {\n const intl = usePanneauIntl();\n const [title, ...others] = columns;\n return (\n <div>\n {selectable ? <div className={styles.pageSelection}>{pageSelection}</div> : null}\n <ul className={styles.cards} aria-label={label}>\n {items.map((item) => {\n const selected = selectable && isSelected(item);\n const actions = renderActions(item);\n const current = isCurrent?.(item) ?? false;\n return (\n <li\n key={item.id}\n className={styles.card}\n data-selected={selected || undefined}\n data-current={current || undefined}\n >\n <div className={styles.header}>\n <div className={styles.title}>\n <ItemTitle href={getItemHref?.(item) ?? null} current={current}>\n {title !== undefined\n ? renderValue(item, title)\n : getItemLabel(item)}\n </ItemTitle>\n </div>\n {selectable ? (\n <Checkbox\n aria-label={intl.formatMessage(messages.selectItem, {\n item: getItemLabel(item),\n })}\n isSelected={selected}\n onChange={() => onToggle(item)}\n />\n ) : null}\n </div>\n {others.length > 0 ? (\n <dl className={styles.values}>\n {others.map((column) => (\n <div key={column.id} className={styles.value}>\n <dt>{column.label ?? column.id}</dt>\n <dd>{renderValue(item, column)}</dd>\n </div>\n ))}\n </dl>\n ) : null}\n {actions !== null ? (\n <div className={styles.actions}>{actions}</div>\n ) : null}\n </li>\n );\n })}\n </ul>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import link_module_default from "./link.module.js";
2
+ import { c } from "react/compiler-runtime";
2
3
  import { jsx } from "react/jsx-runtime";
3
4
  import { Link } from "react-aria-components";
4
5
  //#region src/layouts/ItemTitle.tsx
@@ -6,14 +7,26 @@ import { Link } from "react-aria-components";
6
7
  * The title of an item, as a link to it when the list has one. Links go through React Aria, so an
7
8
  * app's `RouterProvider` handles them with its router.
8
9
  */
9
- function ItemTitle({ href, current = false, children }) {
10
+ function ItemTitle(t0) {
11
+ const $ = c(4);
12
+ const { href, current: t1, children } = t0;
13
+ const current = t1 === void 0 ? false : t1;
10
14
  if (href === null) return children;
11
- return /* @__PURE__ */ jsx(Link, {
12
- className: link_module_default.link,
13
- href,
14
- "aria-current": current ? "page" : void 0,
15
- children
16
- });
15
+ const t2 = current ? "page" : void 0;
16
+ let t3;
17
+ if ($[0] !== children || $[1] !== href || $[2] !== t2) {
18
+ t3 = /* @__PURE__ */ jsx(Link, {
19
+ className: link_module_default.link,
20
+ href,
21
+ "aria-current": t2,
22
+ children
23
+ });
24
+ $[0] = children;
25
+ $[1] = href;
26
+ $[2] = t2;
27
+ $[3] = t3;
28
+ } else t3 = $[3];
29
+ return t3;
17
30
  }
18
31
  //#endregion
19
32
  export { ItemTitle };
@@ -1 +1 @@
1
- {"version":3,"file":"ItemTitle.js","names":["styles"],"sources":["../../src/layouts/ItemTitle.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { Link } from 'react-aria-components';\n\nimport styles from './link.module.css';\n\n/**\n * The title of an item, as a link to it when the list has one. Links go through React Aria, so an\n * app's `RouterProvider` handles them with its router.\n */\nexport function ItemTitle({\n href,\n current = false,\n children,\n}: {\n href: string | null;\n /** The item is the one shown next to the list: its link is the current page. */\n current?: boolean;\n children: ReactNode;\n}) {\n if (href === null) {\n return children;\n }\n return (\n <Link className={styles.link} href={href} aria-current={current ? 'page' : undefined}>\n {children}\n </Link>\n );\n}\n"],"mappings":";;;;;;;;AASA,SAAgB,UAAU,EACtB,MACA,UAAU,OACV,YAMD;CACC,IAAI,SAAS,MACT,OAAO;CAEX,OACI,oBAAC,MAAD;EAAM,WAAWA,oBAAO;EAAY;EAAM,gBAAc,UAAU,SAAS,KAAA;EACtE;CACC,CAAA;AAEd"}
1
+ {"version":3,"file":"ItemTitle.js","names":["ReactNode","Link","styles","ItemTitle","t0","$","_c","href","current","t1","children","undefined","t2","t3","link","_c","styles"],"sources":["../../src/layouts/ItemTitle.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { Link } from 'react-aria-components';\n\nimport styles from './link.module.css';\n\n/**\n * The title of an item, as a link to it when the list has one. Links go through React Aria, so an\n * app's `RouterProvider` handles them with its router.\n */\nexport function ItemTitle({\n href,\n current = false,\n children,\n}: {\n href: string | null;\n /** The item is the one shown next to the list: its link is the current page. */\n current?: boolean;\n children: ReactNode;\n}) {\n if (href === null) {\n return children;\n }\n return (\n <Link className={styles.link} href={href} aria-current={current ? 'page' : undefined}>\n {children}\n </Link>\n );\n}\n"],"mappings":";;;;;;;;;AASA,SAAOG,UAAAC,IAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAAmB,MAAA,EAAAC,MAAAC,SAAAC,IAAAC,aAAAN;CAEtB,MAAAI,UAAAC,OAAAE,KAAAA,IAAA,QAAAF;CAQA,IAAIF,SAAS,MAAI,OACNG;CAGiD,MAAAE,KAAAJ,UAAA,SAAAG,KAAAA;CAA4B,IAAAE;CAAA,IAAAR,EAAA,OAAAK,YAAAL,EAAA,OAAAE,QAAAF,EAAA,OAAAO,IAAA;EAApFC,KAAA,oBAAC,MAAD;GAAiB,WAAAX,oBAAMY;GAAaP;GAAoB,gBAAAK;GACnDF;EADA,CAAA;EAEEL,EAAA,KAAAK;EAAAL,EAAA,KAAAE;EAAAF,EAAA,KAAAO;EAAAP,EAAA,KAAAQ;CAAA,OAAAA,KAAAR,EAAA;CAAA,OAFPQ;AAEO"}
@@ -2,10 +2,10 @@ import { messages } from "../messages.js";
2
2
  import { ItemTitle } from "./ItemTitle.js";
3
3
  import { cx } from "../cx.js";
4
4
  import TableLayout_module_default from "./TableLayout.module.js";
5
+ import { c } from "react/compiler-runtime";
5
6
  import { Checkbox, Icon, usePanneauIntl } from "@panneau/ui";
6
7
  import { jsx, jsxs } from "react/jsx-runtime";
7
8
  import { ArrowDown, ArrowUp, ArrowUpDown } from "lucide-react";
8
- import { c } from "react/compiler-runtime";
9
9
  //#region src/layouts/TableLayout.tsx
10
10
  /** The sort direction of a column, from the first `sort` value. */
11
11
  function getSortDirection(sort, column) {