@panneau/lists 5.0.0-alpha.2 → 5.0.0-alpha.21

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 (165) hide show
  1. package/README.md +17 -15
  2. package/dist/ItemDetails.css +50 -0
  3. package/dist/ItemDetails.d.ts +27 -0
  4. package/dist/ItemDetails.d.ts.map +1 -0
  5. package/dist/ItemDetails.js +134 -0
  6. package/dist/ItemDetails.js.map +1 -0
  7. package/dist/ItemDetails.module.js +20 -0
  8. package/dist/ItemDetails.module.js.map +1 -0
  9. package/dist/List.d.ts +3 -3
  10. package/dist/List.d.ts.map +1 -1
  11. package/dist/List.js +31 -10
  12. package/dist/List.js.map +1 -1
  13. package/dist/ListSkeleton.d.ts +19 -0
  14. package/dist/ListSkeleton.d.ts.map +1 -0
  15. package/dist/ListSkeleton.js +115 -0
  16. package/dist/ListSkeleton.js.map +1 -0
  17. package/dist/ListView.d.ts +73 -8
  18. package/dist/ListView.d.ts.map +1 -1
  19. package/dist/ListView.js +616 -218
  20. package/dist/ListView.js.map +1 -1
  21. package/dist/actions/ActionButton.d.ts +8 -2
  22. package/dist/actions/ActionButton.d.ts.map +1 -1
  23. package/dist/actions/ActionButton.js +98 -26
  24. package/dist/actions/ActionButton.js.map +1 -1
  25. package/dist/actions/Actions.css +16 -38
  26. package/dist/actions/Actions.module.js +6 -6
  27. package/dist/actions/Actions.module.js.map +1 -1
  28. package/dist/actions/ConfirmDialog.d.ts +20 -4
  29. package/dist/actions/ConfirmDialog.d.ts.map +1 -1
  30. package/dist/actions/ConfirmDialog.js +110 -92
  31. package/dist/actions/ConfirmDialog.js.map +1 -1
  32. package/dist/actions/RowActions.d.ts +25 -9
  33. package/dist/actions/RowActions.d.ts.map +1 -1
  34. package/dist/actions/RowActions.js +151 -80
  35. package/dist/actions/RowActions.js.map +1 -1
  36. package/dist/actions/actions.d.ts +5 -4
  37. package/dist/actions/actions.d.ts.map +1 -1
  38. package/dist/actions/actions.js +7 -14
  39. package/dist/actions/actions.js.map +1 -1
  40. package/dist/actions/fit.d.ts +25 -0
  41. package/dist/actions/fit.d.ts.map +1 -0
  42. package/dist/actions/fit.js +197 -0
  43. package/dist/actions/fit.js.map +1 -0
  44. package/dist/actions/icons.d.ts +5 -0
  45. package/dist/actions/icons.d.ts.map +1 -1
  46. package/dist/actions/icons.js +15 -1
  47. package/dist/actions/icons.js.map +1 -1
  48. package/dist/columns.d.ts +10 -0
  49. package/dist/columns.d.ts.map +1 -0
  50. package/dist/columns.js +25 -0
  51. package/dist/columns.js.map +1 -0
  52. package/dist/cx.js.map +1 -1
  53. package/dist/displays/Displays.css +48 -0
  54. package/dist/displays/Displays.module.js +18 -2
  55. package/dist/displays/Displays.module.js.map +1 -1
  56. package/dist/displays/displays.d.ts +62 -6
  57. package/dist/displays/displays.d.ts.map +1 -1
  58. package/dist/displays/displays.js +1151 -89
  59. package/dist/displays/displays.js.map +1 -1
  60. package/dist/filters/Filters.css +25 -11
  61. package/dist/filters/Filters.d.ts +1 -1
  62. package/dist/filters/Filters.js.map +1 -1
  63. package/dist/filters/Filters.module.js +5 -1
  64. package/dist/filters/Filters.module.js.map +1 -1
  65. package/dist/filters/controls.d.ts +1 -1
  66. package/dist/filters/controls.d.ts.map +1 -1
  67. package/dist/filters/controls.js +57 -35
  68. package/dist/filters/controls.js.map +1 -1
  69. package/dist/filters/format.d.ts +1 -1
  70. package/dist/filters/format.js.map +1 -1
  71. package/dist/images.d.ts +7 -0
  72. package/dist/images.d.ts.map +1 -0
  73. package/dist/images.js +39 -0
  74. package/dist/images.js.map +1 -0
  75. package/dist/index.d.ts +22 -18
  76. package/dist/index.d.ts.map +1 -1
  77. package/dist/index.js +7 -3
  78. package/dist/inline/Inline.css +58 -0
  79. package/dist/inline/Inline.module.js +20 -0
  80. package/dist/inline/Inline.module.js.map +1 -0
  81. package/dist/inline/InlineCell.d.ts +29 -0
  82. package/dist/inline/InlineCell.d.ts.map +1 -0
  83. package/dist/inline/InlineCell.js +490 -0
  84. package/dist/inline/InlineCell.js.map +1 -0
  85. package/dist/inline/editable.d.ts +12 -0
  86. package/dist/inline/editable.d.ts.map +1 -0
  87. package/dist/inline/editable.js +29 -0
  88. package/dist/inline/editable.js.map +1 -0
  89. package/dist/layouts/CalendarLayout.css +153 -0
  90. package/dist/layouts/CalendarLayout.d.ts +9 -0
  91. package/dist/layouts/CalendarLayout.d.ts.map +1 -0
  92. package/dist/layouts/CalendarLayout.js +303 -0
  93. package/dist/layouts/CalendarLayout.js.map +1 -0
  94. package/dist/layouts/CalendarLayout.module.js +28 -0
  95. package/dist/layouts/CalendarLayout.module.js.map +1 -0
  96. package/dist/layouts/CardsLayout.css +5 -0
  97. package/dist/layouts/CardsLayout.d.ts +2 -2
  98. package/dist/layouts/CardsLayout.d.ts.map +1 -1
  99. package/dist/layouts/CardsLayout.js +92 -91
  100. package/dist/layouts/CardsLayout.js.map +1 -1
  101. package/dist/layouts/CardsLayout.module.js.map +1 -1
  102. package/dist/layouts/GalleryLayout.css +87 -0
  103. package/dist/layouts/GalleryLayout.d.ts +8 -0
  104. package/dist/layouts/GalleryLayout.d.ts.map +1 -0
  105. package/dist/layouts/GalleryLayout.js +152 -0
  106. package/dist/layouts/GalleryLayout.js.map +1 -0
  107. package/dist/layouts/GalleryLayout.module.js +26 -0
  108. package/dist/layouts/GalleryLayout.module.js.map +1 -0
  109. package/dist/layouts/ItemTitle.d.ts +3 -1
  110. package/dist/layouts/ItemTitle.d.ts.map +1 -1
  111. package/dist/layouts/ItemTitle.js +12 -8
  112. package/dist/layouts/ItemTitle.js.map +1 -1
  113. package/dist/layouts/TableLayout.css +56 -0
  114. package/dist/layouts/TableLayout.d.ts +5 -4
  115. package/dist/layouts/TableLayout.d.ts.map +1 -1
  116. package/dist/layouts/TableLayout.js +171 -101
  117. package/dist/layouts/TableLayout.js.map +1 -1
  118. package/dist/layouts/TableLayout.module.js +8 -4
  119. package/dist/layouts/TableLayout.module.js.map +1 -1
  120. package/dist/layouts/builtIn.d.ts +2 -2
  121. package/dist/layouts/builtIn.d.ts.map +1 -1
  122. package/dist/layouts/builtIn.js +6 -2
  123. package/dist/layouts/builtIn.js.map +1 -1
  124. package/dist/layouts/calendarDays.d.ts +14 -0
  125. package/dist/layouts/calendarDays.d.ts.map +1 -0
  126. package/dist/layouts/calendarDays.js +44 -0
  127. package/dist/layouts/calendarDays.js.map +1 -0
  128. package/dist/plugin.d.ts +1 -1
  129. package/dist/plugin.js.map +1 -1
  130. package/dist/query.d.ts +4 -3
  131. package/dist/query.d.ts.map +1 -1
  132. package/dist/query.js +15 -4
  133. package/dist/query.js.map +1 -1
  134. package/dist/selection.d.ts +1 -1
  135. package/dist/selection.js.map +1 -1
  136. package/dist/toolbar/ColumnMenu.d.ts +17 -0
  137. package/dist/toolbar/ColumnMenu.d.ts.map +1 -0
  138. package/dist/toolbar/ColumnMenu.js +193 -0
  139. package/dist/toolbar/ColumnMenu.js.map +1 -0
  140. package/dist/toolbar/LayoutSwitch.d.ts.map +1 -1
  141. package/dist/toolbar/LayoutSwitch.js +73 -55
  142. package/dist/toolbar/LayoutSwitch.js.map +1 -1
  143. package/dist/toolbar/Pagination.d.ts +33 -0
  144. package/dist/toolbar/Pagination.d.ts.map +1 -1
  145. package/dist/toolbar/Pagination.js +282 -42
  146. package/dist/toolbar/Pagination.js.map +1 -1
  147. package/dist/toolbar/SearchField.js.map +1 -1
  148. package/dist/toolbar/SortSelect.d.ts +1 -1
  149. package/dist/toolbar/SortSelect.js.map +1 -1
  150. package/dist/toolbar/Toolbar.css +36 -0
  151. package/dist/toolbar/Toolbar.module.js +12 -2
  152. package/dist/toolbar/Toolbar.module.js.map +1 -1
  153. package/dist/types.d.ts +69 -1
  154. package/dist/types.d.ts.map +1 -1
  155. package/dist/useDraft.js.map +1 -1
  156. package/dist/useListState.js.map +1 -1
  157. package/dist/useRenderValue.d.ts +10 -0
  158. package/dist/useRenderValue.d.ts.map +1 -0
  159. package/dist/useRenderValue.js +84 -0
  160. package/dist/useRenderValue.js.map +1 -0
  161. package/dist/values.d.ts +4 -1
  162. package/dist/values.d.ts.map +1 -1
  163. package/dist/values.js +6 -2
  164. package/dist/values.js.map +1 -1
  165. package/package.json +9 -9
package/dist/types.d.ts CHANGED
@@ -6,7 +6,10 @@ import type { Abilities, Action, ActionScope, Field, Filter, FilterValue, Option
6
6
  */
7
7
  export interface ListItem {
8
8
  id: string;
9
- /** What the user can do with the item. Without abilities, every action is shown. */
9
+ /**
10
+ * What the user can do with the item. Without abilities, the built-in item actions (`show`,
11
+ * `edit`, `duplicate`, `delete`) are hidden, and the other actions are shown.
12
+ */
10
13
  abilities?: Abilities;
11
14
  [key: string]: unknown;
12
15
  }
@@ -25,6 +28,10 @@ export interface ListColumn {
25
28
  sortable?: boolean;
26
29
  width?: number | string;
27
30
  align?: 'start' | 'center' | 'end';
31
+ /** Not shown until the user shows it, from the columns of the list (decision 0042). */
32
+ hidden?: boolean;
33
+ /** `false`: always shown. The user can move it, not hide it. */
34
+ hideable?: boolean;
28
35
  /** Renders the cell, instead of a display. */
29
36
  render?: (item: ListItem) => ReactNode;
30
37
  }
@@ -52,6 +59,16 @@ export interface ListActionEvent {
52
59
  /** Selected items of the current page that don't allow the action: the backend skips them. */
53
60
  skipped: readonly ListItem[];
54
61
  }
62
+ /** What the backend told about an action on a query selection: how many items it would skip. */
63
+ export interface ListActionPreview {
64
+ skipped: number;
65
+ }
66
+ /**
67
+ * Asks the backend what an action would do on a query selection, before the list confirms it (a
68
+ * dry run, for actions with `dryRun`), or resolves with `null` when it can't tell.
69
+ * `useActionPreview()` of `@panneau/actions` is one.
70
+ */
71
+ export type ListActionPreviewer = (event: ListActionEvent) => Promise<ListActionPreview | null>;
55
72
  /**
56
73
  * Runs an action. Lists ask for confirmation first when the action has `confirm`. A returned
57
74
  * promise shows the action as pending until it settles; after a selection action succeeds, the
@@ -59,6 +76,20 @@ export interface ListActionEvent {
59
76
  * cancels its parameters). `useActionRunner()` of `@panneau/actions` is such a handler.
60
77
  */
61
78
  export type ListActionHandler = (event: ListActionEvent) => unknown;
79
+ /** A value changed in place, in a cell of the list (decision 0043). */
80
+ export interface ListInlineEditEvent {
81
+ /** The item, with the version the value was edited from. */
82
+ item: ListItem;
83
+ /** The field the cell edits. */
84
+ field: Field;
85
+ value: unknown;
86
+ }
87
+ /**
88
+ * Saves one field of an item, changed in place, and resolves with the updated item. It rejects
89
+ * with a problem, or an error with a `problem` (as the errors of `@panneau/data`): a `422` shows
90
+ * its messages on the cell, and a `412` with the `current` item offers to keep it or save over it.
91
+ */
92
+ export type ListInlineEditHandler = (event: ListInlineEditEvent) => Promise<ListItem>;
62
93
  /** Props of a filter control. */
63
94
  export interface FilterControlProps {
64
95
  filter: Filter;
@@ -77,6 +108,29 @@ export interface FilterControlProps {
77
108
  }
78
109
  /** A filter control, by filter type (`select`, `date`). */
79
110
  export type FilterEntry = ComponentType<FilterControlProps>;
111
+ /** What the `calendar` layout shows: the month of its items, and how to change it (decision 0044). */
112
+ export interface ListCalendarProps {
113
+ /**
114
+ * The `date`, `datetime` or `daterange` field each item is shown on the day of, or on each day
115
+ * of its range (decision 0053).
116
+ */
117
+ field: string;
118
+ /**
119
+ * The time zone of the field's date-times (`settings.timeZone`), whose days the calendar
120
+ * shows. Without it, the browser's.
121
+ */
122
+ timeZone?: string | null | undefined;
123
+ /** The month shown (`2026-11`). */
124
+ month: string;
125
+ onMonthChange: (month: string) => void;
126
+ /**
127
+ * When the month has more items than the list got: how many match (`null` when the backend
128
+ * doesn't count them).
129
+ */
130
+ more: {
131
+ total: number | null;
132
+ } | null;
133
+ }
80
134
  /** Props of a list layout: renders the items of the current page. */
81
135
  export interface ListLayoutProps {
82
136
  items: readonly ListItem[];
@@ -87,6 +141,8 @@ export interface ListLayoutProps {
87
141
  getItemLabel: (item: ListItem) => string;
88
142
  /** A link to the item, when the list has one. */
89
143
  getItemHref?: ((item: ListItem) => string | null) | undefined;
144
+ /** Whether the item is the one shown next to the list, such as in a panel of its details. */
145
+ isCurrent?: ((item: ListItem) => boolean) | undefined;
90
146
  /** Whether items have checkboxes. */
91
147
  selectable: boolean;
92
148
  isSelected: (item: ListItem) => boolean;
@@ -100,6 +156,18 @@ export interface ListLayoutProps {
100
156
  label: string;
101
157
  /** The checkbox that selects the page, for layouts that show it in a header. */
102
158
  pageSelection: ReactNode;
159
+ /**
160
+ * The URL of the image of an item (`itemImage` of the resource), or `null` for an item without
161
+ * one: the gallery shows it, and the table its thumbnail. `undefined` when items have no image.
162
+ */
163
+ getItemImage?: ((item: ListItem) => string | null) | undefined;
164
+ /** The month of the calendar, in the `calendar` layout. */
165
+ calendar?: ListCalendarProps | undefined;
166
+ /**
167
+ * Wraps the content of a cell (its value, or the title's link): a column that edits its
168
+ * field in place does it there (decision 0043). Without it, the content is the cell.
169
+ */
170
+ renderCell?: ((item: ListItem, column: ListColumn, content: ReactNode) => ReactNode) | undefined;
103
171
  }
104
172
  /** A list layout, by id (`table`, `cards`). */
105
173
  export type ListLayoutEntry = ComponentType<ListLayoutProps>;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -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"}
@@ -0,0 +1,10 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { DisplayEntry, ListColumn, ListItem } from './types.js';
3
+ /**
4
+ * Renders the value of a column for an item with its display: those given, over those of the
5
+ * plugins, over the built-in ones. A compound field without a display of its own (decision 0065)
6
+ * shows the summaries of its field entry. Other columns without a known display, and compound
7
+ * fields without a summary, show their value as text.
8
+ */
9
+ export declare function useRenderValue(displays?: Readonly<Record<string, DisplayEntry>>): (item: ListItem, column: ListColumn) => ReactNode;
10
+ //# sourceMappingURL=useRenderValue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRenderValue.d.ts","sourceRoot":"","sources":["../src/useRenderValue.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AASvC,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGlE;;;;;GAKG;AACH,wBAAgB,cAAc,CAC1B,QAAQ,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAM,GACtD,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,KAAK,SAAS,CA4CnD"}
@@ -0,0 +1,84 @@
1
+ import { getColumnValue } from "./values.js";
2
+ import Displays_module_default from "./displays/Displays.module.js";
3
+ import { builtInDisplays } from "./displays/displays.js";
4
+ import { usePlugins } from "@panneau/core";
5
+ import { c } from "react/compiler-runtime";
6
+ import { usePanneauIntl } from "@panneau/ui";
7
+ import { jsx } from "react/jsx-runtime";
8
+ import { summarizeCompound } from "@panneau/fields";
9
+ import { isCompoundField } from "@panneau/protocol/runtime";
10
+ //#region src/useRenderValue.tsx
11
+ /**
12
+ * Renders the value of a column for an item with its display: those given, over those of the
13
+ * plugins, over the built-in ones. A compound field without a display of its own (decision 0065)
14
+ * shows the summaries of its field entry. Other columns without a known display, and compound
15
+ * fields without a summary, show their value as text.
16
+ */
17
+ function useRenderValue(t0) {
18
+ const $ = c(11);
19
+ let t1;
20
+ if ($[0] !== t0) {
21
+ t1 = t0 === void 0 ? {} : t0;
22
+ $[0] = t0;
23
+ $[1] = t1;
24
+ } else t1 = $[1];
25
+ const displays = t1;
26
+ const intl = usePanneauIntl();
27
+ const plugins = usePlugins();
28
+ let t2;
29
+ if ($[2] !== plugins.displays) {
30
+ t2 = Object.fromEntries(plugins.displays);
31
+ $[2] = plugins.displays;
32
+ $[3] = t2;
33
+ } else t2 = $[3];
34
+ const t3 = t2;
35
+ let t4;
36
+ if ($[4] !== displays || $[5] !== t3) {
37
+ t4 = {
38
+ ...builtInDisplays,
39
+ ...t3,
40
+ ...displays
41
+ };
42
+ $[4] = displays;
43
+ $[5] = t3;
44
+ $[6] = t4;
45
+ } else t4 = $[6];
46
+ const allDisplays = t4;
47
+ let t5;
48
+ if ($[7] !== allDisplays || $[8] !== intl || $[9] !== plugins.fields) {
49
+ t5 = (item, column) => {
50
+ if (column.render !== void 0) return column.render(item);
51
+ const own = column.display !== void 0 && column.display !== null ? allDisplays[column.display] : void 0;
52
+ const field = column.field ?? null;
53
+ if (own === void 0 && field !== null && isCompoundField(field)) {
54
+ const value = getColumnValue(item, column, intl.locale);
55
+ const summary = summarizeCompound(plugins.fields.get(field.type), value, {
56
+ field,
57
+ locale: intl.locale
58
+ });
59
+ if (summary !== null) return /* @__PURE__ */ jsx("span", {
60
+ className: Displays_module_default.text,
61
+ "data-clamp": "",
62
+ children: summary
63
+ });
64
+ }
65
+ const Display = own ?? builtInDisplays.text;
66
+ if (Display === void 0) return null;
67
+ return /* @__PURE__ */ jsx(Display, {
68
+ value: getColumnValue(item, column, intl.locale),
69
+ item,
70
+ column,
71
+ field: column.field ?? null
72
+ });
73
+ };
74
+ $[7] = allDisplays;
75
+ $[8] = intl;
76
+ $[9] = plugins.fields;
77
+ $[10] = t5;
78
+ } else t5 = $[10];
79
+ return t5;
80
+ }
81
+ //#endregion
82
+ export { useRenderValue };
83
+
84
+ //# sourceMappingURL=useRenderValue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRenderValue.js","names":["ReactNode","usePlugins","summarizeCompound","isCompoundField","usePanneauIntl","styles","builtInDisplays","DisplayEntry","ListColumn","ListItem","getColumnValue","useRenderValue","t0","$","_c","t1","undefined","displays","intl","plugins","t2","Object","fromEntries","t3","Record","t4","allDisplays","t5","fields","item","column","render","own","display","field","value","locale","summary","get","type","text","Display","_c","styles"],"sources":["../src/useRenderValue.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { usePlugins } from '@panneau/core';\nimport { summarizeCompound } from '@panneau/fields';\nimport { isCompoundField } from '@panneau/protocol/runtime';\nimport { usePanneauIntl } from '@panneau/ui';\n\nimport styles from './displays/Displays.module.css';\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. A compound field without a display of its own (decision 0065)\n * shows the summaries of its field entry. Other columns without a known display, and compound\n * fields without a summary, 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 own =\n column.display !== undefined && column.display !== null\n ? allDisplays[column.display]\n : undefined;\n const field = column.field ?? null;\n if (own === undefined && field !== null && isCompoundField(field)) {\n const value = getColumnValue(item, column, intl.locale);\n const summary = summarizeCompound(plugins.fields.get(field.type), value, {\n field,\n locale: intl.locale,\n });\n if (summary !== null) {\n return (\n <span className={styles.text} data-clamp=\"\">\n {summary}\n </span>\n );\n }\n }\n const Display = own ?? 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":";;;;;;;;;;;;;;;;AAkBA,SAAOW,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,OAAad,eAAe;CAC5B,MAAAe,UAAgBlB,WAAW;CAAE,IAAAmB;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,QAAAL,EAAA,OAAAM,QAAAS,QAAA;EACKD,MAAAE,MAAAC,WAAA;GACH,IAAIA,OAAMC,WAAYf,KAAAA,GAAS,OACpBc,OAAMC,OAAQF,IAAI;GAE7B,MAAAG,MACIF,OAAMG,YAAajB,KAAAA,KAAac,OAAMG,YAAa,OAC7CP,YAAYI,OAAMG,WADxBjB,KAAAA;GAGJ,MAAAkB,QAAcJ,OAAMI,SAAN;GACd,IAAIF,QAAQhB,KAAAA,KAAakB,UAAU,QAAQ/B,gBAAgB+B,KAAK,GAAC;IAC7D,MAAAC,QAAczB,eAAemB,MAAMC,QAAQZ,KAAIkB,MAAO;IACtD,MAAAC,UAAgBnC,kBAAkBiB,QAAOS,OAAOU,IAAKJ,MAAKK,IAAK,GAAGJ,OAAO;KAAAD;KAAAE,QAE7DlB,KAAIkB;IAChB,CAAC;IACD,IAAIC,YAAY,MAAI,OAEZ,oBAAA,QAAA;KAAiB,WAAAhC,wBAAMmC;KAAkB,cAAA;KACpCH,UAAAA;IACE,CAAA;GAEd;GAEL,MAAAI,UAAgBT,OAAO1B,gBAAekC;GACtC,IAAIC,YAAYzB,KAAAA,GAAS,OACd;GACV,OAEG,oBAAC,SAAD;IACW,OAAAN,eAAemB,MAAMC,QAAQZ,KAAIkB,MAAO;IACzCP;IACEC;IACD,OAAAA,OAAMI,SAAN;GAAoB,CAAA;EAC7B;EAETrB,EAAA,KAAAa;EAAAb,EAAA,KAAAK;EAAAL,EAAA,KAAAM,QAAAS;EAAAf,EAAA,MAAAc;CAAA,OAAAA,KAAAd,EAAA;CAAA,OAnCMc;AAmCN"}
package/dist/values.d.ts CHANGED
@@ -1,5 +1,6 @@
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
+ export declare function isRecord(value: unknown): value is Record<string, unknown>;
3
4
  /**
4
5
  * The value of a localized field in a locale: the locale (`fr-CA`), its language (`fr`), then the
5
6
  * first filled locale. Other values are returned as they are.
@@ -16,6 +17,8 @@ export declare function getColumnValue(item: ListItem, column: ListColumn, local
16
17
  export declare function toText(value: unknown, locale: string): string;
17
18
  /** The options of a field, or none. */
18
19
  export declare function getFieldOptions(field: Field | null | undefined): readonly Option[];
20
+ /** The option of a value, matched as a string (values from the URL are strings). */
21
+ export declare function findOption(options: readonly Option[], value: unknown): Option | undefined;
19
22
  /** The label of an option value, matched as a string (values from the URL are strings). */
20
23
  export declare function getOptionLabel(options: readonly Option[], value: unknown): string | null;
21
24
  //# sourceMappingURL=values.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"values.d.ts","sourceRoot":"","sources":["../src/values.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEvD,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAMpD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAczE;AAED,oDAAoD;AACpD,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAEpE;AAED,0FAA0F;AAC1F,wBAAgB,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAG1F;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAuB7D;AAED,uCAAuC;AACvC,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,GAAG,SAAS,GAAG,SAAS,MAAM,EAAE,CAElF;AAED,2FAA2F;AAC3F,wBAAgB,cAAc,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAGxF"}
1
+ {"version":3,"file":"values.d.ts","sourceRoot":"","sources":["../src/values.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEvD,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEpD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAczE;AAED,oDAAoD;AACpD,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAEpE;AAED,0FAA0F;AAC1F,wBAAgB,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAG1F;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAuB7D;AAED,uCAAuC;AACvC,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,GAAG,SAAS,GAAG,SAAS,MAAM,EAAE,CAElF;AAED,oFAAoF;AACpF,wBAAgB,UAAU,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAEzF;AAED,2FAA2F;AAC3F,wBAAgB,cAAc,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAExF"}
package/dist/values.js CHANGED
@@ -42,11 +42,15 @@ function toText(value, locale) {
42
42
  function getFieldOptions(field) {
43
43
  return field?.options ?? [];
44
44
  }
45
+ /** The option of a value, matched as a string (values from the URL are strings). */
46
+ function findOption(options, value) {
47
+ return options.find((candidate) => String(candidate.value) === String(value));
48
+ }
45
49
  /** The label of an option value, matched as a string (values from the URL are strings). */
46
50
  function getOptionLabel(options, value) {
47
- return options.find((candidate) => String(candidate.value) === String(value))?.label ?? null;
51
+ return findOption(options, value)?.label ?? null;
48
52
  }
49
53
  //#endregion
50
- export { getColumnValue, getFieldOptions, getLocalizedValue, getOptionLabel, isLocalized, toText };
54
+ export { findOption, getColumnValue, getFieldOptions, getLocalizedValue, getOptionLabel, isLocalized, isRecord, toText };
51
55
 
52
56
  //# sourceMappingURL=values.js.map
@@ -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","findOption","getOptionLabel"],"sources":["../src/values.ts"],"sourcesContent":["import type { Field, Option } from '@panneau/protocol';\n\nimport type { ListColumn, ListItem } from './types';\n\nexport function 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 option of a value, matched as a string (values from the URL are strings). */\nexport function findOption(options: readonly Option[], value: unknown): Option | undefined {\n return options.find((candidate) => String(candidate.value) === String(value));\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 return findOption(options, value)?.label ?? null;\n}\n"],"mappings":";AAIA,SAAgBI,SAASC,OAAkD;CACvE,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,WAAWD,SAA4B/B,OAAoC;CACvF,OAAO+B,QAAQlB,MAAMJ,cAAcc,OAAOd,UAAUT,KAAK,MAAMuB,OAAOvB,KAAK,CAAC;AAChF;;AAGA,SAAgBiC,eAAeF,SAA4B/B,OAA+B;CACtF,OAAOgC,WAAWD,SAAS/B,KAAK,CAAC,EAAE6B,SAAS;AAChD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@panneau/lists",
3
- "version": "5.0.0-alpha.2",
3
+ "version": "5.0.0-alpha.21",
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.2",
41
- "@panneau/fields": "5.0.0-alpha.2",
42
- "@panneau/intl": "5.0.0-alpha.2",
43
- "@panneau/protocol": "5.0.0-alpha.2",
44
- "@panneau/ui": "5.0.0-alpha.2",
40
+ "@panneau/core": "5.0.0-alpha.21",
41
+ "@panneau/fields": "5.0.0-alpha.21",
42
+ "@panneau/intl": "5.0.0-alpha.21",
43
+ "@panneau/protocol": "5.0.0-alpha.21",
44
+ "@panneau/ui": "5.0.0-alpha.21",
45
45
  "lucide-react": "^1.57.0"
46
46
  },
47
47
  "devDependencies": {
48
- "@panneau/data": "5.0.0-alpha.2"
48
+ "@panneau/data": "5.0.0-alpha.21"
49
49
  }
50
50
  }