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

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 (74) hide show
  1. package/README.md +1 -1
  2. package/dist/ItemDetails.d.ts +5 -3
  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.d.ts +2 -2
  7. package/dist/List.js +54 -12
  8. package/dist/List.js.map +1 -1
  9. package/dist/ListSkeleton.d.ts +17 -0
  10. package/dist/ListSkeleton.d.ts.map +1 -0
  11. package/dist/ListSkeleton.js +111 -0
  12. package/dist/ListSkeleton.js.map +1 -0
  13. package/dist/ListView.d.ts +7 -4
  14. package/dist/ListView.d.ts.map +1 -1
  15. package/dist/ListView.js +494 -179
  16. package/dist/ListView.js.map +1 -1
  17. package/dist/actions/ActionButton.d.ts +1 -1
  18. package/dist/actions/ActionButton.js +79 -21
  19. package/dist/actions/ActionButton.js.map +1 -1
  20. package/dist/actions/ConfirmDialog.d.ts +1 -1
  21. package/dist/actions/ConfirmDialog.js +121 -24
  22. package/dist/actions/ConfirmDialog.js.map +1 -1
  23. package/dist/actions/RowActions.d.ts +2 -2
  24. package/dist/actions/RowActions.js +1 -1
  25. package/dist/actions/RowActions.js.map +1 -1
  26. package/dist/actions/actions.d.ts +1 -1
  27. package/dist/actions/actions.js.map +1 -1
  28. package/dist/actions/icons.js.map +1 -1
  29. package/dist/cx.js.map +1 -1
  30. package/dist/displays/displays.d.ts +1 -1
  31. package/dist/displays/displays.js +1 -1
  32. package/dist/displays/displays.js.map +1 -1
  33. package/dist/filters/Filters.d.ts +1 -1
  34. package/dist/filters/Filters.js +1 -1
  35. package/dist/filters/Filters.js.map +1 -1
  36. package/dist/filters/controls.d.ts +1 -1
  37. package/dist/filters/controls.js +1 -1
  38. package/dist/filters/controls.js.map +1 -1
  39. package/dist/filters/format.d.ts +1 -1
  40. package/dist/filters/format.js.map +1 -1
  41. package/dist/index.d.ts +19 -19
  42. package/dist/layouts/CardsLayout.d.ts +1 -1
  43. package/dist/layouts/CardsLayout.js +1 -1
  44. package/dist/layouts/CardsLayout.js.map +1 -1
  45. package/dist/layouts/ItemTitle.js +20 -7
  46. package/dist/layouts/ItemTitle.js.map +1 -1
  47. package/dist/layouts/TableLayout.d.ts +1 -1
  48. package/dist/layouts/TableLayout.js +1 -1
  49. package/dist/layouts/TableLayout.js.map +1 -1
  50. package/dist/layouts/builtIn.d.ts +1 -1
  51. package/dist/layouts/builtIn.js.map +1 -1
  52. package/dist/plugin.d.ts +1 -1
  53. package/dist/plugin.js.map +1 -1
  54. package/dist/query.d.ts +1 -1
  55. package/dist/query.js.map +1 -1
  56. package/dist/selection.d.ts +1 -1
  57. package/dist/selection.js.map +1 -1
  58. package/dist/toolbar/LayoutSwitch.js +1 -1
  59. package/dist/toolbar/LayoutSwitch.js.map +1 -1
  60. package/dist/toolbar/Pagination.js +152 -41
  61. package/dist/toolbar/Pagination.js.map +1 -1
  62. package/dist/toolbar/SearchField.js +1 -1
  63. package/dist/toolbar/SearchField.js.map +1 -1
  64. package/dist/toolbar/SortSelect.d.ts +1 -1
  65. package/dist/toolbar/SortSelect.js +1 -1
  66. package/dist/toolbar/SortSelect.js.map +1 -1
  67. package/dist/useDraft.js.map +1 -1
  68. package/dist/useListState.js.map +1 -1
  69. package/dist/useRenderValue.d.ts +1 -1
  70. package/dist/useRenderValue.js +1 -1
  71. package/dist/useRenderValue.js.map +1 -1
  72. package/dist/values.d.ts +1 -1
  73. package/dist/values.js.map +1 -1
  74. package/package.json +9 -9
@@ -1 +1 @@
1
- {"version":3,"file":"SearchField.js","names":["Search","draft","setDraft","_c","styles"],"sources":["../../src/toolbar/SearchField.tsx"],"sourcesContent":["import { Search } from 'lucide-react';\n\nimport { Icon, TextInput, usePanneauIntl } from '@panneau/ui';\n\nimport { messages } from '../messages';\nimport { useDraft } from '../useDraft';\nimport styles from './Toolbar.module.css';\n\nexport interface SearchFieldProps {\n /** The search of the query. */\n value: string;\n /** Called once the user stops typing, or presses Enter. */\n onChange: (q: string) => void;\n}\n\n/** The search of a list (`q`). */\nexport function SearchField({ value, onChange }: SearchFieldProps) {\n const intl = usePanneauIntl();\n const { draft, setDraft, flush } = useDraft(value, onChange);\n return (\n <TextInput\n type=\"search\"\n aria-label={intl.formatMessage(messages.search)}\n placeholder={intl.formatMessage(messages.searchPlaceholder)}\n prefix={<Icon icon={Search} />}\n value={draft}\n onChange={setDraft}\n onKeyDown={(event) => {\n if (event.key === 'Enter') {\n flush();\n }\n }}\n className={styles.search}\n />\n );\n}\n"],"mappings":";;;;;;;;;AAgBA,SAAO,YAAA,IAAA;CAAA,MAAA,IAAAG,EAAA,EAAA;CAAqB,MAAA,EAAA,OAAA,aAAA;CACxB,MAAA,OAAa,eAAe;CAC5B,MAAA,EAAA,OAAA,UAAA,UAAmC,SAAS,OAAO,QAAQ;CAAE,IAAA;CAAA,IAAA,EAAA,OAAA,MAAA;EAIzC,KAAA,KAAI,cAAe,SAAQ,MAAO;EAAC,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,MAAA;EAClC,KAAA,KAAI,cAAe,SAAQ,iBAAkB;EAAC,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,OAAA,IAAA,2BAAA,GAAA;EACnD,KAAA,oBAAC,MAAD,EAAYH,MAAA,OAAM,CAAA;EAAI,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,OAAA;EAGnB,MAAA,UAAA;GACP,IAAI,MAAK,QAAS,SACd,MAAM;EACT;EACJ,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,SAAA,EAAA,OAAA,YAAA,EAAA,OAAA,MAAA,EAAA,QAAA,MAAA,EAAA,QAAA,IAAA;EAXL,KAAA,oBAAC,WAAD;GACS,MAAA;GACO,cAAA;GACC,aAAA;GACL,QAAA;GACDC,OAAA;GACGC,UAAA;GACC,WAAA;GAKA,WAAAE,uBAAM;EAAO,CAAA;EAC1B,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;CAAA,OAAA,KAAA,EAAA;CAAA,OAbF;AAaE"}
1
+ {"version":3,"file":"SearchField.js","names":["Search","Icon","TextInput","usePanneauIntl","messages","useDraft","styles","SearchFieldProps","value","onChange","q","SearchField","t0","$","_c","intl","draft","setDraft","flush","t1","formatMessage","search","t2","searchPlaceholder","t3","Symbol","for","t4","event","key","t5","_c","styles"],"sources":["../../src/toolbar/SearchField.tsx"],"sourcesContent":["import { Search } from 'lucide-react';\n\nimport { Icon, TextInput, usePanneauIntl } from '@panneau/ui';\n\nimport { messages } from '../messages';\nimport { useDraft } from '../useDraft';\nimport styles from './Toolbar.module.css';\n\nexport interface SearchFieldProps {\n /** The search of the query. */\n value: string;\n /** Called once the user stops typing, or presses Enter. */\n onChange: (q: string) => void;\n}\n\n/** The search of a list (`q`). */\nexport function SearchField({ value, onChange }: SearchFieldProps) {\n const intl = usePanneauIntl();\n const { draft, setDraft, flush } = useDraft(value, onChange);\n return (\n <TextInput\n type=\"search\"\n aria-label={intl.formatMessage(messages.search)}\n placeholder={intl.formatMessage(messages.searchPlaceholder)}\n prefix={<Icon icon={Search} />}\n value={draft}\n onChange={setDraft}\n onKeyDown={(event) => {\n if (event.key === 'Enter') {\n flush();\n }\n }}\n className={styles.search}\n />\n );\n}\n"],"mappings":";;;;;;;;;AAgBA,SAAOW,YAAAC,IAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAAqB,MAAA,EAAAN,OAAAC,aAAAG;CACxB,MAAAG,OAAaZ,eAAe;CAC5B,MAAA,EAAAa,OAAAC,UAAAC,UAAmCb,SAASG,OAAOC,QAAQ;CAAE,IAAAU;CAAA,IAAAN,EAAA,OAAAE,MAAA;EAIzCI,KAAAJ,KAAIK,cAAehB,SAAQiB,MAAO;EAACR,EAAA,KAAAE;EAAAF,EAAA,KAAAM;CAAA,OAAAA,KAAAN,EAAA;CAAA,IAAAS;CAAA,IAAAT,EAAA,OAAAE,MAAA;EAClCO,KAAAP,KAAIK,cAAehB,SAAQmB,iBAAkB;EAACV,EAAA,KAAAE;EAAAF,EAAA,KAAAS;CAAA,OAAAA,KAAAT,EAAA;CAAA,IAAAW;CAAA,IAAAX,EAAA,OAAAY,OAAAC,IAAA,2BAAA,GAAA;EACnDF,KAAA,oBAAC,MAAD,EAAYxB,MAAAA,OAAM,CAAA;EAAIa,EAAA,KAAAW;CAAA,OAAAA,KAAAX,EAAA;CAAA,IAAAc;CAAA,IAAAd,EAAA,OAAAK,OAAA;EAGnBS,MAAAC,UAAA;GACP,IAAIA,MAAKC,QAAS,SACdX,MAAM;EACT;EACJL,EAAA,KAAAK;EAAAL,EAAA,KAAAc;CAAA,OAAAA,KAAAd,EAAA;CAAA,IAAAiB;CAAA,IAAAjB,EAAA,OAAAG,SAAAH,EAAA,OAAAI,YAAAJ,EAAA,OAAAM,MAAAN,EAAA,QAAAS,MAAAT,EAAA,QAAAc,IAAA;EAXLG,KAAA,oBAAC,WAAD;GACS,MAAA;GACO,cAAAX;GACC,aAAAG;GACL,QAAAE;GACDR,OAAAA;GACGC,UAAAA;GACC,WAAAU;GAKA,WAAArB,uBAAMe;EAAO,CAAA;EAC1BR,EAAA,KAAAG;EAAAH,EAAA,KAAAI;EAAAJ,EAAA,KAAAM;EAAAN,EAAA,MAAAS;EAAAT,EAAA,MAAAc;EAAAd,EAAA,MAAAiB;CAAA,OAAAA,KAAAjB,EAAA;CAAA,OAbFiB;AAaE"}
@@ -1,4 +1,4 @@
1
- import type { ListColumn } from '../types';
1
+ import type { ListColumn } from '../types.js';
2
2
  export interface SortSelectProps {
3
3
  columns: readonly ListColumn[];
4
4
  sort: readonly string[];
@@ -1,8 +1,8 @@
1
1
  import { messages } from "../messages.js";
2
2
  import Toolbar_module_default from "./Toolbar.module.js";
3
+ import { c } from "react/compiler-runtime";
3
4
  import { Select, usePanneauIntl } from "@panneau/ui";
4
5
  import { jsx } from "react/jsx-runtime";
5
- import { c } from "react/compiler-runtime";
6
6
  //#region src/toolbar/SortSelect.tsx
7
7
  var DEFAULT = "";
8
8
  /** The sort of a list without column headers (cards), by sortable column and direction. */
@@ -1 +1 @@
1
- {"version":3,"file":"SortSelect.js","names":["column","options","_c","styles"],"sources":["../../src/toolbar/SortSelect.tsx"],"sourcesContent":["import { Select, usePanneauIntl } from '@panneau/ui';\n\nimport { messages } from '../messages';\nimport type { ListColumn } from '../types';\nimport styles from './Toolbar.module.css';\n\nexport interface SortSelectProps {\n columns: readonly ListColumn[];\n sort: readonly string[];\n onChange: (sort: string[]) => void;\n}\n\nconst DEFAULT = '';\n\n/** The sort of a list without column headers (cards), by sortable column and direction. */\nexport function SortSelect({ columns, sort, onChange }: SortSelectProps) {\n const intl = usePanneauIntl();\n const sortable = columns.filter((column) => column.sortable === true);\n const label = (column: ListColumn) =>\n typeof column.label === 'string' ? column.label : column.id;\n const options = [\n { value: DEFAULT, label: intl.formatMessage(messages.defaultSort) },\n ...sortable.flatMap((column) => [\n {\n value: column.id,\n label: intl.formatMessage(messages.sortAscending, { column: label(column) }),\n },\n {\n value: `-${column.id}`,\n label: intl.formatMessage(messages.sortDescending, { column: label(column) }),\n },\n ]),\n ];\n const current = sort[0] ?? DEFAULT;\n return (\n <Select\n label={intl.formatMessage(messages.sortBy)}\n options={options}\n value={options.some((option) => option.value === current) ? current : DEFAULT}\n onChange={(value) =>\n onChange(value === null || value === DEFAULT ? [] : [String(value)])\n }\n className={styles.sort}\n />\n );\n}\n"],"mappings":";;;;;;AAYA,IAAM,UAAU;;AAGhB,SAAO,WAAA,IAAA;CAAA,MAAA,IAAAE,EAAA,EAAA;CAAoB,MAAA,EAAA,SAAA,MAAA,aAAA;CACvB,MAAA,OAAa,eAAe;CAAE,IAAA;CAAA,IAAA,EAAA,OAAA,WAAA,EAAA,OAAA,MAAA;EAC9B,MAAA,WAAiB,QAAO,OAAQ,KAAoC;EACpE,MAAA,QAAc;EACkD,IAAA;EAAA,IAAA,EAAA,OAAA,MAAA;GAEnC,KAAA,KAAI,cAAe,SAAQ,WAAY;GAAC,EAAA,KAAA;GAAA,EAAA,KAAA;EAAA,OAAA,KAAA,EAAA;EAAA,IAAA;EAAA,IAAA,EAAA,OAAA,IAAA;GAAjE,KAAA;IAAA,OAAS;IAAO,OAAS;GAAyC;GAAC,EAAA,KAAA;GAAA,EAAA,KAAA;EAAA,OAAA,KAAA,EAAA;EAAA,IAAA;EAAA,IAAA,EAAA,OAAA,MAAA;GAC/C,MAAA,aAAY,CAC5B;IAAA,OACWF,SAAM;IAAG,OACT,KAAI,cAAe,SAAQ,eAAgB,EAAA,QAAU,MAAMA,QAAM,EAAE,CAAC;GAC/E,GACA;IAAA,OACW,IAAIA,SAAM;IAAK,OACf,KAAI,cAAe,SAAQ,gBAAiB,EAAA,QAAU,MAAMA,QAAM,EAAE,CAAC;GAChF,CAAC;GACJ,EAAA,KAAA;GAAA,EAAA,KAAA;EAAA,OAAA,KAAA,EAAA;EAXW,KAAA,CACZ,IAAmE,GAChE,SAAQ,QAAS,EASnB,CAAC;EACL,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAZD,MAAA,UAAgB;CAahB,MAAA,UAAgB,KAAI,MAAJ;CAAmB,IAAA;CAAA,IAAA,EAAA,OAAA,MAAA;EAGpB,KAAA,KAAI,cAAe,SAAQ,MAAO;EAAC,EAAA,KAAA;EAAA,EAAA,MAAA;CAAA,OAAA,KAAA,EAAA;CAEnC,MAAA,KAAA,QAAO,MAAM,WAAY,OAAM,UAAW,OAA2B,IAArE,UAAA;CAAsE,IAAA;CAAA,IAAA,EAAA,QAAA,UAAA;EACnE,MAAA,UACN,SAAS,UAAU,QAAQ,UAAU,UAA5B,CAAA,IAAA,CAA4C,OAAO,KAAK,CAAC,CAAC;EAAC,EAAA,MAAA;EAAA,EAAA,MAAA;CAAA,OAAA,KAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,QAAA,WAAA,EAAA,QAAA,MAAA,EAAA,QAAA,MAAA,EAAA,QAAA,IAAA;EAL5E,KAAA,oBAAC,QAAD;GACW,OAAA;GACE;GACF,OAAA;GACG,UAAA;GAGC,WAAAG,uBAAM;EAAK,CAAA;EACxB,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;CAAA,OAAA,KAAA,EAAA;CAAA,OARF;AAQE;AA5BH,SAAA,OAAA,UAAA;CAAA,OAIC,OAAOH,SAAM,UAAW,WAAWA,SAAM,QAASA,SAAM;AAAG;AAJ5D,SAAA,MAAA,QAAA;CAAA,OAEyC,OAAM,aAAc;AAAI"}
1
+ {"version":3,"file":"SortSelect.js","names":["Select","usePanneauIntl","messages","ListColumn","styles","SortSelectProps","columns","sort","onChange","DEFAULT","SortSelect","t0","$","_c","intl","t1","sortable","filter","_temp","label","_temp2","t2","formatMessage","defaultSort","t3","value","t4","column_1","column","id","sortAscending","sortDescending","flatMap","options","current","sortBy","some","option","String","t5","column_0","_c","styles"],"sources":["../../src/toolbar/SortSelect.tsx"],"sourcesContent":["import { Select, usePanneauIntl } from '@panneau/ui';\n\nimport { messages } from '../messages';\nimport type { ListColumn } from '../types';\nimport styles from './Toolbar.module.css';\n\nexport interface SortSelectProps {\n columns: readonly ListColumn[];\n sort: readonly string[];\n onChange: (sort: string[]) => void;\n}\n\nconst DEFAULT = '';\n\n/** The sort of a list without column headers (cards), by sortable column and direction. */\nexport function SortSelect({ columns, sort, onChange }: SortSelectProps) {\n const intl = usePanneauIntl();\n const sortable = columns.filter((column) => column.sortable === true);\n const label = (column: ListColumn) =>\n typeof column.label === 'string' ? column.label : column.id;\n const options = [\n { value: DEFAULT, label: intl.formatMessage(messages.defaultSort) },\n ...sortable.flatMap((column) => [\n {\n value: column.id,\n label: intl.formatMessage(messages.sortAscending, { column: label(column) }),\n },\n {\n value: `-${column.id}`,\n label: intl.formatMessage(messages.sortDescending, { column: label(column) }),\n },\n ]),\n ];\n const current = sort[0] ?? DEFAULT;\n return (\n <Select\n label={intl.formatMessage(messages.sortBy)}\n options={options}\n value={options.some((option) => option.value === current) ? current : DEFAULT}\n onChange={(value) =>\n onChange(value === null || value === DEFAULT ? [] : [String(value)])\n }\n className={styles.sort}\n />\n );\n}\n"],"mappings":";;;;;;AAYA,IAAMS,UAAU;;AAGhB,SAAOC,WAAAC,IAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAAoB,MAAA,EAAAP,SAAAC,MAAAC,aAAAG;CACvB,MAAAG,OAAab,eAAe;CAAE,IAAAc;CAAA,IAAAH,EAAA,OAAAN,WAAAM,EAAA,OAAAE,MAAA;EAC9B,MAAAE,WAAiBV,QAAOW,OAAQC,KAAoC;EACpE,MAAAC,QAAcC;EACkD,IAAAC;EAAA,IAAAT,EAAA,OAAAE,MAAA;GAEnCO,KAAAP,KAAIQ,cAAepB,SAAQqB,WAAY;GAACX,EAAA,KAAAE;GAAAF,EAAA,KAAAS;EAAA,OAAAA,KAAAT,EAAA;EAAA,IAAAY;EAAA,IAAAZ,EAAA,OAAAS,IAAA;GAAjEG,KAAA;IAAAC,OAAShB;IAAOU,OAASE;GAAyC;GAACT,EAAA,KAAAS;GAAAT,EAAA,KAAAY;EAAA,OAAAA,KAAAZ,EAAA;EAAA,IAAAc;EAAA,IAAAd,EAAA,OAAAE,MAAA;GAC/CY,MAAAC,aAAY,CAC5B;IAAAF,OACWG,SAAMC;IAAGV,OACTL,KAAIQ,cAAepB,SAAQ4B,eAAgB,EAAAF,QAAUT,MAAMS,QAAM,EAAE,CAAC;GAC/E,GACA;IAAAH,OACW,IAAIG,SAAMC;IAAKV,OACfL,KAAIQ,cAAepB,SAAQ6B,gBAAiB,EAAAH,QAAUT,MAAMS,QAAM,EAAE,CAAC;GAChF,CAAC;GACJhB,EAAA,KAAAE;GAAAF,EAAA,KAAAc;EAAA,OAAAA,KAAAd,EAAA;EAXWG,KAAA,CACZS,IAAmE,GAChER,SAAQgB,QAASN,EASnB,CAAC;EACLd,EAAA,KAAAN;EAAAM,EAAA,KAAAE;EAAAF,EAAA,KAAAG;CAAA,OAAAA,KAAAH,EAAA;CAZD,MAAAqB,UAAgBlB;CAahB,MAAAmB,UAAgB3B,KAAI,MAAJE;CAAmB,IAAAY;CAAA,IAAAT,EAAA,OAAAE,MAAA;EAGpBO,KAAAP,KAAIQ,cAAepB,SAAQiC,MAAO;EAACvB,EAAA,KAAAE;EAAAF,EAAA,MAAAS;CAAA,OAAAA,KAAAT,EAAA;CAEnC,MAAAY,KAAAS,QAAOG,MAAMC,WAAYA,OAAMZ,UAAWS,OAA2B,IAArEA,UAAAzB;CAAsE,IAAAiB;CAAA,IAAAd,EAAA,QAAAJ,UAAA;EACnEkB,MAAAD,UACNjB,SAASiB,UAAU,QAAQA,UAAUhB,UAA5B,CAAA,IAAA,CAA4C6B,OAAOb,KAAK,CAAC,CAAC;EAACb,EAAA,MAAAJ;EAAAI,EAAA,MAAAc;CAAA,OAAAA,KAAAd,EAAA;CAAA,IAAA2B;CAAA,IAAA3B,EAAA,QAAAqB,WAAArB,EAAA,QAAAS,MAAAT,EAAA,QAAAY,MAAAZ,EAAA,QAAAc,IAAA;EAL5Ea,KAAA,oBAAC,QAAD;GACW,OAAAlB;GACEY;GACF,OAAAT;GACG,UAAAE;GAGC,WAAAtB,uBAAMG;EAAK,CAAA;EACxBK,EAAA,MAAAqB;EAAArB,EAAA,MAAAS;EAAAT,EAAA,MAAAY;EAAAZ,EAAA,MAAAc;EAAAd,EAAA,MAAA2B;CAAA,OAAAA,KAAA3B,EAAA;CAAA,OARF2B;AAQE;AA5BH,SAAAnB,OAAAoB,UAAA;CAAA,OAIC,OAAOZ,SAAMT,UAAW,WAAWS,SAAMT,QAASS,SAAMC;AAAG;AAJ5D,SAAAX,MAAAU,QAAA;CAAA,OAEyCA,OAAMZ,aAAc;AAAI"}
@@ -1 +1 @@
1
- {"version":3,"file":"useDraft.js","names":["_c"],"sources":["../src/useDraft.ts"],"sourcesContent":["import { useEffect, useEffectEvent, useState } from 'react';\n\n/**\n * A text that is typed locally and committed after a pause: the list query changes once the user\n * stops typing, not on every key. A change of `value` from outside (a chip removed, the query\n * reset) replaces the draft.\n */\nexport function useDraft(\n value: string,\n commit: (value: string) => void,\n delay = 300,\n): { draft: string; setDraft: (draft: string) => void; flush: () => void } {\n const [draft, setDraft] = useState(value);\n const [synced, setSynced] = useState(value);\n if (value !== synced) {\n setSynced(value);\n setDraft(value);\n }\n const onCommit = useEffectEvent((next: string) => commit(next));\n useEffect(() => {\n if (draft === synced) {\n return undefined;\n }\n const timer = setTimeout(() => onCommit(draft), delay);\n return () => clearTimeout(timer);\n }, [draft, synced, delay]);\n return {\n draft,\n setDraft,\n flush: () => {\n if (draft !== synced) {\n commit(draft);\n }\n },\n };\n}\n"],"mappings":";;;;;;;;AAOA,SAAO,SAAA,OAAA,QAAA,IAAA;CAAA,MAAA,IAAAA,EAAA,EAAA;CAGH,MAAA,QAAA,OAAA,KAAA,IAAA,MAAA;CAEA,MAAA,CAAA,OAAA,YAA0B,SAAS,KAAK;CACxC,MAAA,CAAA,QAAA,aAA4B,SAAS,KAAK;CAC1C,IAAI,UAAU,QAAM;EAChB,UAAU,KAAK;EACf,SAAS,KAAK;CAAC;CAClB,IAAA;CAAA,IAAA,EAAA,OAAA,QAAA;EAC+B,MAAA,SAAkB,OAAO,IAAI;EAAC,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAA9D,MAAA,WAAiB,eAAe,EAA8B;CAAE,IAAA;CAAA,IAAA,EAAA,OAAA,SAAA,EAAA,OAAA,SAAA,EAAA,OAAA,YAAA,EAAA,OAAA,QAAA;EACtD,WAAA;GACN,IAAI,UAAU,QAAM;GAGpB,MAAA,QAAc,iBAAiB,SAAS,KAAK,GAAG,KAAK;GAAE,aAC1C,aAAa,KAAK;EAAC;EACnC,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,SAAA,EAAA,OAAA,SAAA,EAAA,OAAA,QAAA;EAAE,KAAA;GAAC;GAAO;GAAQ;EAAK;EAAC,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,MAAA;CAAA,OAAA,KAAA,EAAA;CANzB,UAAU,IAMP,EAAsB;CAAC,IAAA;CAAA,IAAA,EAAA,QAAA,UAAA,EAAA,QAAA,SAAA,EAAA,QAAA,QAAA;EAIf,WAAA;GACH,IAAI,UAAU,QACV,OAAO,KAAK;EACf;EACJ,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;CAAA,OAAA,KAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,QAAA,SAAA,EAAA,QAAA,IAAA;EAPE,KAAA;GAAA;GAAA;GAAA,OAGI;EAKX;EAAC,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;CAAA,OAAA,KAAA,EAAA;CAAA,OARM;AAQN"}
1
+ {"version":3,"file":"useDraft.js","names":["useEffect","useEffectEvent","useState","useDraft","value","commit","t0","$","_c","delay","undefined","draft","setDraft","synced","setSynced","t1","next","onCommit","t2","timer","setTimeout","clearTimeout","t3","t4","t5","flush","_c"],"sources":["../src/useDraft.ts"],"sourcesContent":["import { useEffect, useEffectEvent, useState } from 'react';\n\n/**\n * A text that is typed locally and committed after a pause: the list query changes once the user\n * stops typing, not on every key. A change of `value` from outside (a chip removed, the query\n * reset) replaces the draft.\n */\nexport function useDraft(\n value: string,\n commit: (value: string) => void,\n delay = 300,\n): { draft: string; setDraft: (draft: string) => void; flush: () => void } {\n const [draft, setDraft] = useState(value);\n const [synced, setSynced] = useState(value);\n if (value !== synced) {\n setSynced(value);\n setDraft(value);\n }\n const onCommit = useEffectEvent((next: string) => commit(next));\n useEffect(() => {\n if (draft === synced) {\n return undefined;\n }\n const timer = setTimeout(() => onCommit(draft), delay);\n return () => clearTimeout(timer);\n }, [draft, synced, delay]);\n return {\n draft,\n setDraft,\n flush: () => {\n if (draft !== synced) {\n commit(draft);\n }\n },\n };\n}\n"],"mappings":";;;;;;;;AAOA,SAAOG,SAAAC,OAAAC,QAAAC,IAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAGH,MAAAC,QAAAH,OAAAI,KAAAA,IAAA,MAAAJ;CAEA,MAAA,CAAAK,OAAAC,YAA0BV,SAASE,KAAK;CACxC,MAAA,CAAAS,QAAAC,aAA4BZ,SAASE,KAAK;CAC1C,IAAIA,UAAUS,QAAM;EAChBC,UAAUV,KAAK;EACfQ,SAASR,KAAK;CAAC;CAClB,IAAAW;CAAA,IAAAR,EAAA,OAAAF,QAAA;EAC+BU,MAAAC,SAAkBX,OAAOW,IAAI;EAACT,EAAA,KAAAF;EAAAE,EAAA,KAAAQ;CAAA,OAAAA,KAAAR,EAAA;CAA9D,MAAAU,WAAiBhB,eAAec,EAA8B;CAAE,IAAAG;CAAA,IAAAX,EAAA,OAAAE,SAAAF,EAAA,OAAAI,SAAAJ,EAAA,OAAAU,YAAAV,EAAA,OAAAM,QAAA;EACtDK,WAAA;GACN,IAAIP,UAAUE,QAAM;GAGpB,MAAAM,QAAcC,iBAAiBH,SAASN,KAAK,GAAGF,KAAK;GAAE,aAC1CY,aAAaF,KAAK;EAAC;EACnCZ,EAAA,KAAAE;EAAAF,EAAA,KAAAI;EAAAJ,EAAA,KAAAU;EAAAV,EAAA,KAAAM;EAAAN,EAAA,KAAAW;CAAA,OAAAA,KAAAX,EAAA;CAAA,IAAAe;CAAA,IAAAf,EAAA,OAAAE,SAAAF,EAAA,OAAAI,SAAAJ,EAAA,OAAAM,QAAA;EAAES,KAAA;GAACX;GAAOE;GAAQJ;EAAK;EAACF,EAAA,KAAAE;EAAAF,EAAA,KAAAI;EAAAJ,EAAA,KAAAM;EAAAN,EAAA,MAAAe;CAAA,OAAAA,KAAAf,EAAA;CANzBP,UAAUkB,IAMPI,EAAsB;CAAC,IAAAC;CAAA,IAAAhB,EAAA,QAAAF,UAAAE,EAAA,QAAAI,SAAAJ,EAAA,QAAAM,QAAA;EAIfU,WAAA;GACH,IAAIZ,UAAUE,QACVR,OAAOM,KAAK;EACf;EACJJ,EAAA,MAAAF;EAAAE,EAAA,MAAAI;EAAAJ,EAAA,MAAAM;EAAAN,EAAA,MAAAgB;CAAA,OAAAA,KAAAhB,EAAA;CAAA,IAAAiB;CAAA,IAAAjB,EAAA,QAAAI,SAAAJ,EAAA,QAAAgB,IAAA;EAPEC,KAAA;GAAAb;GAAAC;GAAAa,OAGIF;EAKX;EAAChB,EAAA,MAAAI;EAAAJ,EAAA,MAAAgB;EAAAhB,EAAA,MAAAiB;CAAA,OAAAA,KAAAjB,EAAA;CAAA,OARMiB;AAQN"}
@@ -1 +1 @@
1
- {"version":3,"file":"useListState.js","names":[],"sources":["../src/useListState.ts"],"sourcesContent":["import { useSyncExternalStore } from 'react';\n\nimport type { List, ListState } from '@panneau/core';\n\n/** The state of a list created elsewhere (`createList()`, `useList()`), kept up to date. */\nexport function useListState(list: List): ListState {\n return useSyncExternalStore(list.subscribe, list.getState, list.getState);\n}\n"],"mappings":";;;AAKA,SAAO,aAAA,MAAA;CAAA,OACI,qBAAqB,KAAI,WAAY,KAAI,UAAW,KAAI,QAAS;AAAC"}
1
+ {"version":3,"file":"useListState.js","names":["useSyncExternalStore","List","ListState","useListState","list","subscribe","getState"],"sources":["../src/useListState.ts"],"sourcesContent":["import { useSyncExternalStore } from 'react';\n\nimport type { List, ListState } from '@panneau/core';\n\n/** The state of a list created elsewhere (`createList()`, `useList()`), kept up to date. */\nexport function useListState(list: List): ListState {\n return useSyncExternalStore(list.subscribe, list.getState, list.getState);\n}\n"],"mappings":";;;AAKA,SAAOG,aAAAC,MAAA;CAAA,OACIJ,qBAAqBI,KAAIC,WAAYD,KAAIE,UAAWF,KAAIE,QAAS;AAAC"}
@@ -1,5 +1,5 @@
1
1
  import type { ReactNode } from 'react';
2
- import type { DisplayEntry, ListColumn, ListItem } from './types';
2
+ import type { DisplayEntry, ListColumn, ListItem } from './types.js';
3
3
  /**
4
4
  * Renders the value of a column for an item with its display: those given, over those of the
5
5
  * plugins, over the built-in ones. Columns without a known display show their value as text.
@@ -1,9 +1,9 @@
1
1
  import { getColumnValue } from "./values.js";
2
2
  import { builtInDisplays } from "./displays/displays.js";
3
3
  import { usePlugins } from "@panneau/core";
4
+ import { c } from "react/compiler-runtime";
4
5
  import { usePanneauIntl } from "@panneau/ui";
5
6
  import { jsx } from "react/jsx-runtime";
6
- import { c } from "react/compiler-runtime";
7
7
  //#region src/useRenderValue.tsx
8
8
  /**
9
9
  * Renders the value of a column for an item with its display: those given, over those of the
@@ -1 +1 @@
1
- {"version":3,"file":"useRenderValue.js","names":["item","column","_c"],"sources":["../src/useRenderValue.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { usePlugins } from '@panneau/core';\nimport { usePanneauIntl } from '@panneau/ui';\n\nimport { builtInDisplays } from './displays/displays';\nimport type { DisplayEntry, ListColumn, ListItem } from './types';\nimport { getColumnValue } from './values';\n\n/**\n * Renders the value of a column for an item with its display: those given, over those of the\n * plugins, over the built-in ones. Columns without a known display show their value as text.\n */\nexport function useRenderValue(\n displays: Readonly<Record<string, DisplayEntry>> = {},\n): (item: ListItem, column: ListColumn) => ReactNode {\n const intl = usePanneauIntl();\n const plugins = usePlugins();\n const allDisplays: Record<string, DisplayEntry> = {\n ...builtInDisplays,\n ...(Object.fromEntries(plugins.displays) as Record<string, DisplayEntry>),\n ...displays,\n };\n return (item, column) => {\n if (column.render !== undefined) {\n return column.render(item);\n }\n const Display =\n (column.display !== undefined && column.display !== null\n ? allDisplays[column.display]\n : undefined) ?? builtInDisplays.text;\n if (Display === undefined) {\n return null;\n }\n return (\n <Display\n value={getColumnValue(item, column, intl.locale)}\n item={item}\n column={column}\n field={column.field ?? null}\n />\n );\n };\n}\n"],"mappings":";;;;;;;;;;;AAaA,SAAO,eAAA,IAAA;CAAA,MAAA,IAAAE,EAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,IAAA;EACH,KAAA,OAAA,KAAA,IAAA,CAAoD,IAApD;EAAqD,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAArD,MAAA,WAAA;CAEA,MAAA,OAAa,eAAe;CAC5B,MAAA,UAAgB,WAAW;CAAE,IAAA;CAAA,IAAA,EAAA,OAAA,QAAA,UAAA;EAGrB,KAAA,OAAM,YAAa,QAAO,QAAS;EAAC,EAAA,KAAA,QAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAApC,MAAA,KAAA;CAAoE,IAAA;CAAA,IAAA,EAAA,OAAA,YAAA,EAAA,OAAA,IAAA;EAF1B,KAAA;GAAA,GAC3C;GAAe,GACd;GAAoE,GACrE;EACP;EAAC,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAJD,MAAA,cAAkD;CAIhD,IAAA;CAAA,IAAA,EAAA,OAAA,eAAA,EAAA,OAAA,MAAA;EACK,MAAA,MAAA,WAAA;GACH,IAAI,OAAM,WAAY,KAAA,GAAS,OACpB,OAAM,OAAQ,IAAI;GAE7B,MAAA,WACK,OAAM,YAAa,KAAA,KAAa,OAAM,YAAa,OAC9C,YAAY,OAAM,WADvB,KAAA,MAEmB,gBAAe;GACvC,IAAI,YAAY,KAAA,GAAS,OACd;GACV,OAEG,oBAAC,SAAD;IACW,OAAA,eAAe,MAAM,QAAQ,KAAI,MAAO;IACzC;IACE;IACD,OAAA,OAAM,SAAN;GAAoB,CAAA;EAC7B;EAET,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAAA,OAnBM;AAmBN"}
1
+ {"version":3,"file":"useRenderValue.js","names":["ReactNode","usePlugins","usePanneauIntl","builtInDisplays","DisplayEntry","ListColumn","ListItem","getColumnValue","useRenderValue","t0","$","_c","t1","undefined","displays","intl","plugins","t2","Object","fromEntries","t3","Record","t4","allDisplays","t5","item","column","render","Display","display","text","locale","field","_c"],"sources":["../src/useRenderValue.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { usePlugins } from '@panneau/core';\nimport { usePanneauIntl } from '@panneau/ui';\n\nimport { builtInDisplays } from './displays/displays';\nimport type { DisplayEntry, ListColumn, ListItem } from './types';\nimport { getColumnValue } from './values';\n\n/**\n * Renders the value of a column for an item with its display: those given, over those of the\n * plugins, over the built-in ones. Columns without a known display show their value as text.\n */\nexport function useRenderValue(\n displays: Readonly<Record<string, DisplayEntry>> = {},\n): (item: ListItem, column: ListColumn) => ReactNode {\n const intl = usePanneauIntl();\n const plugins = usePlugins();\n const allDisplays: Record<string, DisplayEntry> = {\n ...builtInDisplays,\n ...(Object.fromEntries(plugins.displays) as Record<string, DisplayEntry>),\n ...displays,\n };\n return (item, column) => {\n if (column.render !== undefined) {\n return column.render(item);\n }\n const Display =\n (column.display !== undefined && column.display !== null\n ? allDisplays[column.display]\n : undefined) ?? builtInDisplays.text;\n if (Display === undefined) {\n return null;\n }\n return (\n <Display\n value={getColumnValue(item, column, intl.locale)}\n item={item}\n column={column}\n field={column.field ?? null}\n />\n );\n };\n}\n"],"mappings":";;;;;;;;;;;AAaA,SAAOQ,eAAAC,IAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAAA,IAAAC;CAAA,IAAAF,EAAA,OAAAD,IAAA;EACHG,KAAAH,OAAAI,KAAAA,IAAA,CAAoD,IAApDJ;EAAqDC,EAAA,KAAAD;EAAAC,EAAA,KAAAE;CAAA,OAAAA,KAAAF,EAAA;CAArD,MAAAI,WAAAF;CAEA,MAAAG,OAAab,eAAe;CAC5B,MAAAc,UAAgBf,WAAW;CAAE,IAAAgB;CAAA,IAAAP,EAAA,OAAAM,QAAAF,UAAA;EAGrBG,KAAAC,OAAMC,YAAaH,QAAOF,QAAS;EAACJ,EAAA,KAAAM,QAAAF;EAAAJ,EAAA,KAAAO;CAAA,OAAAA,KAAAP,EAAA;CAApC,MAAAU,KAAAH;CAAoE,IAAAK;CAAA,IAAAZ,EAAA,OAAAI,YAAAJ,EAAA,OAAAU,IAAA;EAF1BE,KAAA;GAAA,GAC3CnB;GAAe,GACdiB;GAAoE,GACrEN;EACP;EAACJ,EAAA,KAAAI;EAAAJ,EAAA,KAAAU;EAAAV,EAAA,KAAAY;CAAA,OAAAA,KAAAZ,EAAA;CAJD,MAAAa,cAAkDD;CAIhD,IAAAE;CAAA,IAAAd,EAAA,OAAAa,eAAAb,EAAA,OAAAK,MAAA;EACKS,MAAAC,MAAAC,WAAA;GACH,IAAIA,OAAMC,WAAYd,KAAAA,GAAS,OACpBa,OAAMC,OAAQF,IAAI;GAE7B,MAAAG,WACKF,OAAMG,YAAahB,KAAAA,KAAaa,OAAMG,YAAa,OAC9CN,YAAYG,OAAMG,WADvBhB,KAAAA,MAEmBV,gBAAe2B;GACvC,IAAIF,YAAYf,KAAAA,GAAS,OACd;GACV,OAEG,oBAAC,SAAD;IACW,OAAAN,eAAekB,MAAMC,QAAQX,KAAIgB,MAAO;IACzCN;IACEC;IACD,OAAAA,OAAMM,SAAN;GAAoB,CAAA;EAC7B;EAETtB,EAAA,KAAAa;EAAAb,EAAA,KAAAK;EAAAL,EAAA,KAAAc;CAAA,OAAAA,KAAAd,EAAA;CAAA,OAnBMc;AAmBN"}
package/dist/values.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import type { Field, Option } from '@panneau/protocol';
2
- import type { ListColumn, ListItem } from './types';
2
+ import type { ListColumn, ListItem } from './types.js';
3
3
  /**
4
4
  * The value of a localized field in a locale: the locale (`fr-CA`), its language (`fr`), then the
5
5
  * first filled locale. Other values are returned as they are.
@@ -1 +1 @@
1
- {"version":3,"file":"values.js","names":[],"sources":["../src/values.ts"],"sourcesContent":["import type { Field, Option } from '@panneau/protocol';\n\nimport type { ListColumn, ListItem } from './types';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\n/**\n * The value of a localized field in a locale: the locale (`fr-CA`), its language (`fr`), then the\n * first filled locale. Other values are returned as they are.\n */\nexport function getLocalizedValue(value: unknown, locale: string): unknown {\n if (!isRecord(value)) {\n return value;\n }\n const language = locale.split('-')[0] ?? locale;\n const filled = (candidate: unknown) =>\n candidate !== undefined && candidate !== null && candidate !== '';\n if (filled(value[locale])) {\n return value[locale];\n }\n if (filled(value[language])) {\n return value[language];\n }\n return Object.values(value).find(filled) ?? null;\n}\n\n/** Whether a field's values are keyed by locale. */\nexport function isLocalized(field: Field | null | undefined): boolean {\n return field?.localized === true;\n}\n\n/** The value of a column for an item: `item[id]`, in the locale for a localized field. */\nexport function getColumnValue(item: ListItem, column: ListColumn, locale: string): unknown {\n const value = item[column.field?.name ?? column.id];\n return isLocalized(column.field) ? getLocalizedValue(value, locale) : value;\n}\n\n/**\n * A value as plain text: strings and numbers as they are, references by their label, localized\n * values in the locale, lists joined with commas. For labels of items and for search.\n */\nexport function toText(value: unknown, locale: string): string {\n if (value === null || value === undefined) {\n return '';\n }\n if (typeof value === 'string') {\n return value;\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value);\n }\n if (Array.isArray(value)) {\n return value\n .map((entry) => toText(entry, locale))\n .filter((text) => text !== '')\n .join(', ');\n }\n if (isRecord(value)) {\n if (typeof value.label === 'string') {\n return value.label;\n }\n return toText(getLocalizedValue(value, locale), locale);\n }\n return '';\n}\n\n/** The options of a field, or none. */\nexport function getFieldOptions(field: Field | null | undefined): readonly Option[] {\n return field?.options ?? [];\n}\n\n/** The label of an option value, matched as a string (values from the URL are strings). */\nexport function getOptionLabel(options: readonly Option[], value: unknown): string | null {\n const option = options.find((candidate) => String(candidate.value) === String(value));\n return option?.label ?? null;\n}\n"],"mappings":";AAIA,SAAS,SAAS,OAAkD;CAChE,OAAO,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAC9E;;;;;AAMA,SAAgB,kBAAkB,OAAgB,QAAyB;CACvE,IAAI,CAAC,SAAS,KAAK,GACf,OAAO;CAEX,MAAM,WAAW,OAAO,MAAM,GAAG,CAAC,CAAC,MAAM;CACzC,MAAM,UAAU,cACZ,cAAc,KAAA,KAAa,cAAc,QAAQ,cAAc;CACnE,IAAI,OAAO,MAAM,OAAO,GACpB,OAAO,MAAM;CAEjB,IAAI,OAAO,MAAM,SAAS,GACtB,OAAO,MAAM;CAEjB,OAAO,OAAO,OAAO,KAAK,CAAC,CAAC,KAAK,MAAM,KAAK;AAChD;;AAGA,SAAgB,YAAY,OAA0C;CAClE,OAAO,OAAO,cAAc;AAChC;;AAGA,SAAgB,eAAe,MAAgB,QAAoB,QAAyB;CACxF,MAAM,QAAQ,KAAK,OAAO,OAAO,QAAQ,OAAO;CAChD,OAAO,YAAY,OAAO,KAAK,IAAI,kBAAkB,OAAO,MAAM,IAAI;AAC1E;;;;;AAMA,SAAgB,OAAO,OAAgB,QAAwB;CAC3D,IAAI,UAAU,QAAQ,UAAU,KAAA,GAC5B,OAAO;CAEX,IAAI,OAAO,UAAU,UACjB,OAAO;CAEX,IAAI,OAAO,UAAU,YAAY,OAAO,UAAU,WAC9C,OAAO,OAAO,KAAK;CAEvB,IAAI,MAAM,QAAQ,KAAK,GACnB,OAAO,MACF,KAAK,UAAU,OAAO,OAAO,MAAM,CAAC,CAAC,CACrC,QAAQ,SAAS,SAAS,EAAE,CAAC,CAC7B,KAAK,IAAI;CAElB,IAAI,SAAS,KAAK,GAAG;EACjB,IAAI,OAAO,MAAM,UAAU,UACvB,OAAO,MAAM;EAEjB,OAAO,OAAO,kBAAkB,OAAO,MAAM,GAAG,MAAM;CAC1D;CACA,OAAO;AACX;;AAGA,SAAgB,gBAAgB,OAAoD;CAChF,OAAO,OAAO,WAAW,CAAA;AAC7B;;AAGA,SAAgB,eAAe,SAA4B,OAA+B;CAEtF,OADe,QAAQ,MAAM,cAAc,OAAO,UAAU,KAAK,MAAM,OAAO,KAAK,CAC5E,CAAA,EAAQ,SAAS;AAC5B"}
1
+ {"version":3,"file":"values.js","names":["Field","Option","ListColumn","ListItem","isRecord","value","Record","Array","isArray","getLocalizedValue","locale","language","split","filled","candidate","undefined","Object","values","find","isLocalized","field","localized","getColumnValue","item","column","name","id","toText","String","map","entry","filter","text","join","label","getFieldOptions","options","getOptionLabel","option"],"sources":["../src/values.ts"],"sourcesContent":["import type { Field, Option } from '@panneau/protocol';\n\nimport type { ListColumn, ListItem } from './types';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\n/**\n * The value of a localized field in a locale: the locale (`fr-CA`), its language (`fr`), then the\n * first filled locale. Other values are returned as they are.\n */\nexport function getLocalizedValue(value: unknown, locale: string): unknown {\n if (!isRecord(value)) {\n return value;\n }\n const language = locale.split('-')[0] ?? locale;\n const filled = (candidate: unknown) =>\n candidate !== undefined && candidate !== null && candidate !== '';\n if (filled(value[locale])) {\n return value[locale];\n }\n if (filled(value[language])) {\n return value[language];\n }\n return Object.values(value).find(filled) ?? null;\n}\n\n/** Whether a field's values are keyed by locale. */\nexport function isLocalized(field: Field | null | undefined): boolean {\n return field?.localized === true;\n}\n\n/** The value of a column for an item: `item[id]`, in the locale for a localized field. */\nexport function getColumnValue(item: ListItem, column: ListColumn, locale: string): unknown {\n const value = item[column.field?.name ?? column.id];\n return isLocalized(column.field) ? getLocalizedValue(value, locale) : value;\n}\n\n/**\n * A value as plain text: strings and numbers as they are, references by their label, localized\n * values in the locale, lists joined with commas. For labels of items and for search.\n */\nexport function toText(value: unknown, locale: string): string {\n if (value === null || value === undefined) {\n return '';\n }\n if (typeof value === 'string') {\n return value;\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value);\n }\n if (Array.isArray(value)) {\n return value\n .map((entry) => toText(entry, locale))\n .filter((text) => text !== '')\n .join(', ');\n }\n if (isRecord(value)) {\n if (typeof value.label === 'string') {\n return value.label;\n }\n return toText(getLocalizedValue(value, locale), locale);\n }\n return '';\n}\n\n/** The options of a field, or none. */\nexport function getFieldOptions(field: Field | null | undefined): readonly Option[] {\n return field?.options ?? [];\n}\n\n/** The label of an option value, matched as a string (values from the URL are strings). */\nexport function getOptionLabel(options: readonly Option[], value: unknown): string | null {\n const option = options.find((candidate) => String(candidate.value) === String(value));\n return option?.label ?? null;\n}\n"],"mappings":";AAIA,SAASI,SAASC,OAAkD;CAChE,OAAOA,UAAU,QAAQ,OAAOA,UAAU,YAAY,CAACE,MAAMC,QAAQH,KAAK;AAC9E;;;;;AAMA,SAAgBI,kBAAkBJ,OAAgBK,QAAyB;CACvE,IAAI,CAACN,SAASC,KAAK,GACf,OAAOA;CAEX,MAAMM,WAAWD,OAAOE,MAAM,GAAG,CAAC,CAAC,MAAMF;CACzC,MAAMG,UAAUC,cACZA,cAAcC,KAAAA,KAAaD,cAAc,QAAQA,cAAc;CACnE,IAAID,OAAOR,MAAMK,OAAO,GACpB,OAAOL,MAAMK;CAEjB,IAAIG,OAAOR,MAAMM,SAAS,GACtB,OAAON,MAAMM;CAEjB,OAAOK,OAAOC,OAAOZ,KAAK,CAAC,CAACa,KAAKL,MAAM,KAAK;AAChD;;AAGA,SAAgBM,YAAYC,OAA0C;CAClE,OAAOA,OAAOC,cAAc;AAChC;;AAGA,SAAgBC,eAAeC,MAAgBC,QAAoBd,QAAyB;CACxF,MAAML,QAAQkB,KAAKC,OAAOJ,OAAOK,QAAQD,OAAOE;CAChD,OAAOP,YAAYK,OAAOJ,KAAK,IAAIX,kBAAkBJ,OAAOK,MAAM,IAAIL;AAC1E;;;;;AAMA,SAAgBsB,OAAOtB,OAAgBK,QAAwB;CAC3D,IAAIL,UAAU,QAAQA,UAAUU,KAAAA,GAC5B,OAAO;CAEX,IAAI,OAAOV,UAAU,UACjB,OAAOA;CAEX,IAAI,OAAOA,UAAU,YAAY,OAAOA,UAAU,WAC9C,OAAOuB,OAAOvB,KAAK;CAEvB,IAAIE,MAAMC,QAAQH,KAAK,GACnB,OAAOA,MACFwB,KAAKC,UAAUH,OAAOG,OAAOpB,MAAM,CAAC,CAAC,CACrCqB,QAAQC,SAASA,SAAS,EAAE,CAAC,CAC7BC,KAAK,IAAI;CAElB,IAAI7B,SAASC,KAAK,GAAG;EACjB,IAAI,OAAOA,MAAM6B,UAAU,UACvB,OAAO7B,MAAM6B;EAEjB,OAAOP,OAAOlB,kBAAkBJ,OAAOK,MAAM,GAAGA,MAAM;CAC1D;CACA,OAAO;AACX;;AAGA,SAAgByB,gBAAgBf,OAAoD;CAChF,OAAOA,OAAOgB,WAAW,CAAA;AAC7B;;AAGA,SAAgBC,eAAeD,SAA4B/B,OAA+B;CAEtF,OADe+B,QAAQlB,MAAMJ,cAAcc,OAAOd,UAAUT,KAAK,MAAMuB,OAAOvB,KAAK,CAC5EiC,CAAAA,EAAQJ,SAAS;AAC5B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@panneau/lists",
3
- "version": "5.0.0-alpha.6",
3
+ "version": "5.0.0-alpha.8",
4
4
  "description": "Lists of Panneau: columns with displays, table and cards layouts, sorting, filters, search, pagination, selection and actions, driven by the list state of @panneau/core.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -24,9 +24,9 @@
24
24
  "dist"
25
25
  ],
26
26
  "scripts": {
27
- "build": "vite build && tsc -p tsconfig.build.json",
27
+ "build": "vite build && node ../../scripts/declarations.js",
28
28
  "typecheck": "tsc --noEmit",
29
- "api": "tsc -p tsconfig.build.json && node ../../scripts/api-report.js"
29
+ "api": "node ../../scripts/declarations.js && node ../../scripts/api-report.js"
30
30
  },
31
31
  "publishConfig": {
32
32
  "access": "public"
@@ -37,14 +37,14 @@
37
37
  "react-intl": "^12.0.0"
38
38
  },
39
39
  "dependencies": {
40
- "@panneau/core": "5.0.0-alpha.6",
41
- "@panneau/fields": "5.0.0-alpha.6",
42
- "@panneau/intl": "5.0.0-alpha.6",
43
- "@panneau/protocol": "5.0.0-alpha.6",
44
- "@panneau/ui": "5.0.0-alpha.6",
40
+ "@panneau/core": "5.0.0-alpha.8",
41
+ "@panneau/fields": "5.0.0-alpha.8",
42
+ "@panneau/intl": "5.0.0-alpha.8",
43
+ "@panneau/protocol": "5.0.0-alpha.8",
44
+ "@panneau/ui": "5.0.0-alpha.8",
45
45
  "lucide-react": "^1.57.0"
46
46
  },
47
47
  "devDependencies": {
48
- "@panneau/data": "5.0.0-alpha.6"
48
+ "@panneau/data": "5.0.0-alpha.8"
49
49
  }
50
50
  }