@lattice-php/lattice 0.19.0 → 0.21.0

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 (343) hide show
  1. package/dist/action/components/action-form.d.ts +6 -1
  2. package/dist/action/components/action-form.js +34 -49
  3. package/dist/action/components/action-form.js.map +1 -1
  4. package/dist/action/components/action-trigger-provider.d.ts +1 -1
  5. package/dist/action/components/action-trigger-provider.js.map +1 -1
  6. package/dist/action/hooks/use-action.d.ts +1 -1
  7. package/dist/action/hooks/use-action.js +3 -1
  8. package/dist/action/hooks/use-action.js.map +1 -1
  9. package/dist/action/index.d.ts +0 -2
  10. package/dist/action/index.js +1 -2
  11. package/dist/chat/plugin.d.ts +0 -1
  12. package/dist/chat/plugin.js.map +1 -1
  13. package/dist/clipboard/index.d.ts +0 -4
  14. package/dist/clipboard/index.js +1 -15
  15. package/dist/{events → core}/event-names.js +1 -1
  16. package/dist/core/event-names.js.map +1 -0
  17. package/dist/core/hooks/use-window-event.d.ts +8 -0
  18. package/dist/core/hooks/use-window-event.js +22 -0
  19. package/dist/core/hooks/use-window-event.js.map +1 -0
  20. package/dist/core/index.js +1 -1
  21. package/dist/core/types.d.ts +8 -61
  22. package/dist/create-app.d.ts +31 -3
  23. package/dist/create-app.js +48 -10
  24. package/dist/create-app.js.map +1 -1
  25. package/dist/effects/dispatch.js +1 -1
  26. package/dist/effects/dispatch.js.map +1 -1
  27. package/dist/effects/registry.d.ts +2 -18
  28. package/dist/effects/registry.js +5 -9
  29. package/dist/effects/registry.js.map +1 -1
  30. package/dist/event-bridge.js +10 -23
  31. package/dist/event-bridge.js.map +1 -1
  32. package/dist/form/components/base/field.d.ts +2 -2
  33. package/dist/form/components/base/field.js +2 -2
  34. package/dist/form/components/base/field.js.map +1 -1
  35. package/dist/form/components/fields/color-picker-field.d.ts +2 -0
  36. package/dist/form/components/fields/color-picker-field.js +57 -0
  37. package/dist/form/components/fields/color-picker-field.js.map +1 -0
  38. package/dist/form/components/fields/date-input.js +1 -1
  39. package/dist/form/components/fields/date-time-input.js +1 -1
  40. package/dist/form/components/fields/file-upload.js +11 -18
  41. package/dist/form/components/fields/file-upload.js.map +1 -1
  42. package/dist/form/components/fields/number-input.js +1 -1
  43. package/dist/form/components/fields/rich-editor-field.js +35 -276
  44. package/dist/form/components/fields/rich-editor-field.js.map +1 -1
  45. package/dist/form/components/fields/row-action-menu.js +2 -2
  46. package/dist/form/components/fields/row-action-menu.js.map +1 -1
  47. package/dist/form/components/fields/row-actions.js +3 -1
  48. package/dist/form/components/fields/row-actions.js.map +1 -1
  49. package/dist/form/components/fields/select.js +60 -17
  50. package/dist/form/components/fields/select.js.map +1 -1
  51. package/dist/form/components/fields/table-rows.js +5 -17
  52. package/dist/form/components/fields/table-rows.js.map +1 -1
  53. package/dist/form/components/fields/text-input.js +8 -1
  54. package/dist/form/components/fields/text-input.js.map +1 -1
  55. package/dist/form/components/fields/time-input.js +1 -1
  56. package/dist/form/components/form.js +8 -23
  57. package/dist/form/components/form.js.map +1 -1
  58. package/dist/form/components/index.d.ts +1 -0
  59. package/dist/form/components/index.js +2 -1
  60. package/dist/form/embed.d.ts +5 -0
  61. package/dist/form/embed.js +4 -1
  62. package/dist/form/hooks/use-form-resolver.js.map +1 -1
  63. package/dist/form/index.js +2 -1
  64. package/dist/form/lib/collect-fields.d.ts +7 -0
  65. package/dist/form/lib/collect-fields.js +19 -0
  66. package/dist/form/lib/collect-fields.js.map +1 -0
  67. package/dist/form/lib/conditions.d.ts +4 -10
  68. package/dist/form/lib/conditions.js.map +1 -1
  69. package/dist/form/lib/field-errors.d.ts +3 -0
  70. package/dist/form/lib/field-errors.js +11 -0
  71. package/dist/form/lib/field-errors.js.map +1 -0
  72. package/dist/form/lib/field-props.d.ts +4 -18
  73. package/dist/form/lib/field-props.js.map +1 -1
  74. package/dist/form/plugin.js +2 -0
  75. package/dist/form/plugin.js.map +1 -1
  76. package/dist/form/rich-editor/builtins.d.ts +6 -0
  77. package/dist/form/rich-editor/builtins.js +400 -0
  78. package/dist/form/rich-editor/builtins.js.map +1 -0
  79. package/dist/form/rich-editor/index.d.ts +7 -0
  80. package/dist/form/rich-editor/index.js +3 -0
  81. package/dist/form/rich-editor/registry.d.ts +67 -0
  82. package/dist/form/rich-editor/registry.js +79 -0
  83. package/dist/form/rich-editor/registry.js.map +1 -0
  84. package/dist/form/rich-editor/toolbar-button.d.ts +12 -0
  85. package/dist/form/rich-editor/toolbar-button.js +28 -0
  86. package/dist/form/rich-editor/toolbar-button.js.map +1 -0
  87. package/dist/form/types.d.ts +1 -6
  88. package/dist/format/date-time.d.ts +3 -2
  89. package/dist/format/date-time.js.map +1 -1
  90. package/dist/format/format-context.d.ts +6 -0
  91. package/dist/format/format-context.js +17 -0
  92. package/dist/format/format-context.js.map +1 -0
  93. package/dist/i18n/date-time.d.ts +3 -2
  94. package/dist/i18n/date-time.js.map +1 -1
  95. package/dist/i18n/index.js +3 -2
  96. package/dist/i18n/locale-reload.d.ts +1 -1
  97. package/dist/i18n/locale-reload.js +7 -6
  98. package/dist/i18n/locale-reload.js.map +1 -1
  99. package/dist/i18n/locale.js +1 -1
  100. package/dist/i18n/locale.js.map +1 -1
  101. package/dist/i18n/page-props.d.ts +3 -2
  102. package/dist/i18n/page-props.js +1 -15
  103. package/dist/i18n/page-props.js.map +1 -1
  104. package/dist/i18n/shared-props.d.ts +7 -0
  105. package/dist/i18n/shared-props.js +23 -0
  106. package/dist/i18n/shared-props.js.map +1 -0
  107. package/dist/i18n/timezone.js +1 -1
  108. package/dist/i18n/timezone.js.map +1 -1
  109. package/dist/index.d.ts +11 -10
  110. package/dist/index.js +5 -5
  111. package/dist/lattice.css +212 -47
  112. package/dist/layout/components/breadcrumbs.js +3 -1
  113. package/dist/layout/components/breadcrumbs.js.map +1 -1
  114. package/dist/layout/components/sidebar.js +15 -48
  115. package/dist/layout/components/sidebar.js.map +1 -1
  116. package/dist/layout/plugin.d.ts +0 -1
  117. package/dist/layout/plugin.js.map +1 -1
  118. package/dist/lib/color.d.ts +9 -0
  119. package/dist/lib/color.js +48 -0
  120. package/dist/lib/color.js.map +1 -0
  121. package/dist/lib/is-truthy.d.ts +2 -0
  122. package/dist/lib/is-truthy.js +9 -0
  123. package/dist/lib/is-truthy.js.map +1 -0
  124. package/dist/lib/use-debounced-callback.d.ts +10 -0
  125. package/dist/lib/use-debounced-callback.js +34 -0
  126. package/dist/lib/use-debounced-callback.js.map +1 -0
  127. package/dist/lib/use-media-query.d.ts +5 -0
  128. package/dist/lib/use-media-query.js +26 -0
  129. package/dist/lib/use-media-query.js.map +1 -0
  130. package/dist/lib/use-persistent-state.d.ts +13 -0
  131. package/dist/lib/use-persistent-state.js +62 -0
  132. package/dist/lib/use-persistent-state.js.map +1 -0
  133. package/dist/notifications/api.d.ts +6 -6
  134. package/dist/notifications/api.js.map +1 -1
  135. package/dist/notifications/components/notifications.js +3 -1
  136. package/dist/notifications/components/notifications.js.map +1 -1
  137. package/dist/notifications/plugin.d.ts +0 -1
  138. package/dist/notifications/plugin.js.map +1 -1
  139. package/dist/notifications/types.d.ts +2 -10
  140. package/dist/provider-base.js +1 -1
  141. package/dist/realtime/build-effects.js +5 -5
  142. package/dist/realtime/build-effects.js.map +1 -1
  143. package/dist/realtime/listeners.d.ts +2 -2
  144. package/dist/realtime/listeners.js +1 -1
  145. package/dist/realtime/listeners.js.map +1 -1
  146. package/dist/realtime/subscriptions.d.ts +2 -2
  147. package/dist/realtime/subscriptions.js.map +1 -1
  148. package/dist/registry.d.ts +5 -0
  149. package/dist/registry.js.map +1 -1
  150. package/dist/remote/components/data-list.js +1 -1
  151. package/dist/remote/plugin.d.ts +0 -1
  152. package/dist/remote/plugin.js.map +1 -1
  153. package/dist/table/components/bulk-bar.js +7 -5
  154. package/dist/table/components/bulk-bar.js.map +1 -1
  155. package/dist/table/components/cells/badge-cell.js +4 -1
  156. package/dist/table/components/cells/badge-cell.js.map +1 -1
  157. package/dist/table/components/cells/boolean-cell.js +4 -4
  158. package/dist/table/components/cells/boolean-cell.js.map +1 -1
  159. package/dist/table/components/cells/copyable-cell.d.ts +9 -0
  160. package/dist/table/components/cells/copyable-cell.js +17 -0
  161. package/dist/table/components/cells/copyable-cell.js.map +1 -0
  162. package/dist/table/components/cells/icon-cell.js +5 -2
  163. package/dist/table/components/cells/icon-cell.js.map +1 -1
  164. package/dist/table/components/cells/image-cell.js +8 -9
  165. package/dist/table/components/cells/image-cell.js.map +1 -1
  166. package/dist/table/components/cells/money-cell.js +7 -10
  167. package/dist/table/components/cells/money-cell.js.map +1 -1
  168. package/dist/table/components/cells/number-cell.js +14 -19
  169. package/dist/table/components/cells/number-cell.js.map +1 -1
  170. package/dist/table/components/cells/numeric-cell.d.ts +10 -0
  171. package/dist/table/components/cells/numeric-cell.js +25 -0
  172. package/dist/table/components/cells/numeric-cell.js.map +1 -0
  173. package/dist/table/components/cells/stack-cell.js +1 -1
  174. package/dist/table/components/cells/text-cell.js +8 -6
  175. package/dist/table/components/cells/text-cell.js.map +1 -1
  176. package/dist/table/components/column-filter-control.js +25 -32
  177. package/dist/table/components/column-filter-control.js.map +1 -1
  178. package/dist/table/components/column-header.d.ts +3 -3
  179. package/dist/table/components/column-header.js +5 -3
  180. package/dist/table/components/column-header.js.map +1 -1
  181. package/dist/table/components/column-visibility-menu.js +6 -11
  182. package/dist/table/components/column-visibility-menu.js.map +1 -1
  183. package/dist/table/components/filter-bar.d.ts +2 -2
  184. package/dist/table/components/filter-bar.js +13 -22
  185. package/dist/table/components/filter-bar.js.map +1 -1
  186. package/dist/table/components/filter-controls.d.ts +2 -1
  187. package/dist/table/components/filter-controls.js +37 -38
  188. package/dist/table/components/filter-controls.js.map +1 -1
  189. package/dist/table/components/filter-value-input.d.ts +0 -1
  190. package/dist/table/components/filter-value-input.js +21 -20
  191. package/dist/table/components/filter-value-input.js.map +1 -1
  192. package/dist/table/components/pagination.js +16 -20
  193. package/dist/table/components/pagination.js.map +1 -1
  194. package/dist/table/components/sort-bar.d.ts +3 -3
  195. package/dist/table/components/sort-bar.js +11 -12
  196. package/dist/table/components/sort-bar.js.map +1 -1
  197. package/dist/table/components/table-cell.js.map +1 -1
  198. package/dist/table/components/table-search.d.ts +9 -0
  199. package/dist/table/components/table-search.js +72 -0
  200. package/dist/table/components/table-search.js.map +1 -0
  201. package/dist/table/components/table.js +73 -21
  202. package/dist/table/components/table.js.map +1 -1
  203. package/dist/table/hooks/use-column-visibility.js +29 -58
  204. package/dist/table/hooks/use-column-visibility.js.map +1 -1
  205. package/dist/table/hooks/use-expanded-rows.d.ts +8 -0
  206. package/dist/table/hooks/use-expanded-rows.js +24 -0
  207. package/dist/table/hooks/use-expanded-rows.js.map +1 -0
  208. package/dist/table/hooks/use-table.d.ts +5 -3
  209. package/dist/table/hooks/use-table.js +59 -55
  210. package/dist/table/hooks/use-table.js.map +1 -1
  211. package/dist/table/lib/bulk.d.ts +2 -0
  212. package/dist/table/lib/bulk.js +3 -1
  213. package/dist/table/lib/bulk.js.map +1 -1
  214. package/dist/table/lib/payload.d.ts +3 -2
  215. package/dist/table/lib/payload.js +16 -10
  216. package/dist/table/lib/payload.js.map +1 -1
  217. package/dist/table/lib/query.d.ts +5 -5
  218. package/dist/table/lib/query.js +21 -19
  219. package/dist/table/lib/query.js.map +1 -1
  220. package/dist/table/plugin.d.ts +0 -1
  221. package/dist/table/plugin.js.map +1 -1
  222. package/dist/table/types.d.ts +5 -81
  223. package/dist/toast/callout.js +2 -4
  224. package/dist/toast/callout.js.map +1 -1
  225. package/dist/toast/index.d.ts +1 -1
  226. package/dist/toast/index.js +2 -2
  227. package/dist/toast/toast.d.ts +1 -7
  228. package/dist/toast/toast.js +3 -15
  229. package/dist/toast/toast.js.map +1 -1
  230. package/dist/toast/toaster.js.map +1 -1
  231. package/dist/types/generated.d.ts +444 -225
  232. package/dist/types/index.d.ts +1 -1
  233. package/dist/ui/affix-group.d.ts +2 -1
  234. package/dist/ui/affix-group.js +9 -7
  235. package/dist/ui/affix-group.js.map +1 -1
  236. package/dist/ui/avatar.d.ts +3 -0
  237. package/dist/ui/avatar.js +52 -0
  238. package/dist/ui/avatar.js.map +1 -0
  239. package/dist/ui/button.d.ts +5 -3
  240. package/dist/ui/button.js +10 -3
  241. package/dist/ui/button.js.map +1 -1
  242. package/dist/ui/chart-view.js +155 -28
  243. package/dist/ui/chart-view.js.map +1 -1
  244. package/dist/ui/click-behavior.d.ts +4 -4
  245. package/dist/ui/click-behavior.js.map +1 -1
  246. package/dist/ui/collapsible.js +3 -15
  247. package/dist/ui/collapsible.js.map +1 -1
  248. package/dist/ui/color-picker.d.ts +8 -0
  249. package/dist/ui/color-picker.js +59 -0
  250. package/dist/ui/color-picker.js.map +1 -0
  251. package/dist/ui/combobox.d.ts +11 -2
  252. package/dist/ui/combobox.js +57 -11
  253. package/dist/ui/combobox.js.map +1 -1
  254. package/dist/ui/confirm-dialog.js +1 -1
  255. package/dist/ui/confirm-dialog.js.map +1 -1
  256. package/dist/ui/control.d.ts +1 -1
  257. package/dist/ui/copyable-text.d.ts +7 -0
  258. package/dist/ui/copyable-text.js +21 -13
  259. package/dist/ui/copyable-text.js.map +1 -1
  260. package/dist/ui/dialog.d.ts +6 -2
  261. package/dist/ui/dialog.js +29 -5
  262. package/dist/ui/dialog.js.map +1 -1
  263. package/dist/ui/fragment.js +1 -1
  264. package/dist/ui/fragment.js.map +1 -1
  265. package/dist/ui/heading.js +39 -21
  266. package/dist/ui/heading.js.map +1 -1
  267. package/dist/ui/icon-button.d.ts +22 -0
  268. package/dist/ui/icon-button.js +51 -0
  269. package/dist/ui/icon-button.js.map +1 -0
  270. package/dist/ui/icon.js +10 -11
  271. package/dist/ui/icon.js.map +1 -1
  272. package/dist/ui/image-preview.d.ts +12 -0
  273. package/dist/ui/image-preview.js +65 -0
  274. package/dist/ui/image-preview.js.map +1 -0
  275. package/dist/ui/image.d.ts +3 -0
  276. package/dist/ui/image.js +21 -0
  277. package/dist/ui/image.js.map +1 -0
  278. package/dist/ui/index.d.ts +2 -1
  279. package/dist/ui/index.js +4 -3
  280. package/dist/ui/info-tooltip.js +1 -1
  281. package/dist/ui/info-tooltip.js.map +1 -1
  282. package/dist/ui/input.d.ts +3 -1
  283. package/dist/ui/input.js +2 -2
  284. package/dist/ui/input.js.map +1 -1
  285. package/dist/ui/modal.js +17 -4
  286. package/dist/ui/modal.js.map +1 -1
  287. package/dist/ui/native-select.d.ts +10 -0
  288. package/dist/ui/native-select.js +23 -0
  289. package/dist/ui/native-select.js.map +1 -0
  290. package/dist/ui/pill.d.ts +2 -0
  291. package/dist/ui/pill.js +10 -0
  292. package/dist/ui/pill.js.map +1 -0
  293. package/dist/ui/plugin.js +11 -1
  294. package/dist/ui/plugin.js.map +1 -1
  295. package/dist/ui/progress.d.ts +3 -0
  296. package/dist/ui/progress.js +114 -0
  297. package/dist/ui/progress.js.map +1 -0
  298. package/dist/ui/section.js +2 -15
  299. package/dist/ui/section.js.map +1 -1
  300. package/dist/ui/segmented-pills.js +2 -1
  301. package/dist/ui/segmented-pills.js.map +1 -1
  302. package/dist/ui/separator.d.ts +3 -0
  303. package/dist/ui/separator.js +15 -0
  304. package/dist/ui/separator.js.map +1 -0
  305. package/dist/ui/tabs.js +12 -10
  306. package/dist/ui/tabs.js.map +1 -1
  307. package/dist/ui/text.js +5 -10
  308. package/dist/ui/text.js.map +1 -1
  309. package/dist/ui/tree-context.d.ts +33 -0
  310. package/dist/ui/tree-context.js +135 -0
  311. package/dist/ui/tree-context.js.map +1 -0
  312. package/dist/ui/tree.d.ts +19 -0
  313. package/dist/ui/tree.js +187 -0
  314. package/dist/ui/tree.js.map +1 -0
  315. package/dist/ui/use-collapsible-state.d.ts +7 -0
  316. package/dist/ui/use-collapsible-state.js +21 -0
  317. package/dist/ui/use-collapsible-state.js.map +1 -0
  318. package/dist-standalone/chunks/chart-view-C6R5iPra.js +36 -0
  319. package/dist-standalone/chunks/date-picker-field-DhhEB-Mh.js +1 -0
  320. package/dist-standalone/chunks/jsx-runtime-Drll_-DD.js +1 -0
  321. package/dist-standalone/chunks/locale-CXqr7LPR.js +1 -0
  322. package/dist-standalone/chunks/page-props-DOfg30l5.js +1 -0
  323. package/dist-standalone/chunks/rich-editor-field-DORXTHPw.js +154 -0
  324. package/dist-standalone/chunks/{subscriptions-B3UuDBmx.js → subscriptions-B_ISgA7V.js} +1 -1
  325. package/dist-standalone/chunks/use-effect-dispatcher-D1wPPwHj.js +97 -0
  326. package/dist-standalone/lattice.css +1 -1
  327. package/dist-standalone/lattice.js +15 -15
  328. package/dist-standalone/manifest.json +11 -9
  329. package/dist-standalone/sprite.svg +1 -1
  330. package/package.json +6 -1
  331. package/resources/icons/code-xml.svg +17 -0
  332. package/resources/icons/heading.svg +17 -0
  333. package/dist/clipboard/index.js.map +0 -1
  334. package/dist/events/event-names.js.map +0 -1
  335. package/dist/table/components/table-action-node.d.ts +0 -4
  336. package/dist/table/components/table-action-node.js +0 -24
  337. package/dist/table/components/table-action-node.js.map +0 -1
  338. package/dist-standalone/chunks/chart-view-CK5fKIkR.js +0 -36
  339. package/dist-standalone/chunks/date-picker-field-BlCPFhZd.js +0 -1
  340. package/dist-standalone/chunks/jsx-runtime-CJ_btYLc.js +0 -1
  341. package/dist-standalone/chunks/rich-editor-field-DH5dS5c1.js +0 -154
  342. package/dist-standalone/chunks/use-effect-dispatcher-k98Nzf9M.js +0 -97
  343. /package/dist/{events → core}/event-names.d.ts +0 -0
@@ -1,6 +1,7 @@
1
- import { LATTICE_EVENT } from "../../events/event-names.js";
1
+ import { LATTICE_EVENT } from "../../core/event-names.js";
2
+ import { useWindowEvent } from "../../core/hooks/use-window-event.js";
2
3
  import { apiFetch, apiJson } from "../../core/api.js";
3
- import { getColumns, getPagination, getRows, getState } from "../lib/payload.js";
4
+ import { getColumns, getPagination, getQuery, getRows } from "../lib/payload.js";
4
5
  import { isEmptyFilterValue, isFilterValue } from "../lib/filter-values.js";
5
6
  import { buildEndpoint, nextSort } from "../lib/query.js";
6
7
  import { useCallback, useEffect, useMemo, useRef, useState } from "react";
@@ -10,27 +11,27 @@ function useTable(node) {
10
11
  const endpoint = typeof node.props?.endpoint === "string" ? node.props.endpoint : null;
11
12
  const componentRef = typeof node.props?.ref === "string" ? node.props.ref : "";
12
13
  const isLazy = node.props?.lazy === true;
13
- const initialState = useMemo(() => getState(node.props?.state), [node.props?.state]);
14
+ const initialQuery = useMemo(() => getQuery(node.props?.query), [node.props?.query]);
14
15
  const initialRows = useMemo(() => getRows(node.props?.data), [node.props?.data]);
15
16
  const initialPagination = useMemo(() => getPagination(node.props?.pagination), [node.props?.pagination]);
16
17
  const [rows, setRows] = useState(initialRows);
17
18
  const [pagination, setPagination] = useState(initialPagination);
18
- const [state, setState] = useState(initialState);
19
+ const [query, setQuery] = useState(initialQuery);
19
20
  const [processing, setProcessing] = useState(isLazy);
20
21
  const [hasLoaded, setHasLoaded] = useState(!isLazy);
21
22
  const infiniteLoaderRef = useRef(null);
22
- const currentPage = pagination.currentPage ?? state.page;
23
+ const currentPage = pagination.currentPage ?? query.page;
23
24
  const isInfinite = (pagination.mode ?? "table") === "infinite";
24
- const load = useCallback(async (nextState, append = false) => {
25
+ const load = useCallback(async (nextQuery, append = false) => {
25
26
  if (!endpoint) return;
26
27
  setProcessing(true);
27
28
  try {
28
- const result = await apiJson(buildEndpoint(endpoint, nextState), { ref: componentRef });
29
- const resultState = getState(result.state);
29
+ const result = await apiJson(buildEndpoint(endpoint, nextQuery), { ref: componentRef });
30
+ const resultQuery = getQuery(result.query);
30
31
  const resultRows = getRows(result.data);
31
32
  setRows((currentRows) => append ? [...currentRows, ...resultRows] : resultRows);
32
33
  setPagination(getPagination(result.pagination));
33
- setState(resultState);
34
+ setQuery(resultQuery);
34
35
  setHasLoaded(true);
35
36
  } finally {
36
37
  setProcessing(false);
@@ -38,68 +39,78 @@ function useTable(node) {
38
39
  }, [endpoint, componentRef]);
39
40
  function sort(column) {
40
41
  load({
41
- ...state,
42
+ ...query,
42
43
  page: 1,
43
- sorts: nextSort(state.sorts, column)
44
+ sorts: nextSort(query.sorts, column)
44
45
  });
45
46
  }
46
47
  function clearSort(sort) {
47
48
  load({
48
- ...state,
49
+ ...query,
49
50
  page: 1,
50
- sorts: state.sorts.filter((currentSort) => currentSort.key !== sort.key)
51
+ sorts: query.sorts.filter((currentSort) => currentSort.key !== sort.key)
51
52
  });
52
53
  }
53
54
  function applyFilters(next) {
54
- const nextState = {
55
- ...state,
55
+ const nextQuery = {
56
+ ...query,
56
57
  filters: next,
57
58
  page: 1
58
59
  };
59
- setState(nextState);
60
- load(nextState);
60
+ setQuery(nextQuery);
61
+ load(nextQuery);
61
62
  }
62
63
  function addFilter(clause) {
63
- applyFilters([...state.filters, clause]);
64
+ applyFilters([...query.filters, clause]);
64
65
  }
65
66
  function updateFilter(index, clause) {
66
- applyFilters(state.filters.map((current, position) => position === index ? clause : current));
67
+ applyFilters(query.filters.map((current, position) => position === index ? clause : current));
67
68
  }
68
69
  function removeFilter(index) {
69
- applyFilters(state.filters.filter((_, current) => current !== index));
70
+ applyFilters(query.filters.filter((_, current) => current !== index));
70
71
  }
71
72
  function replaceColumnFilters(field, clauses) {
72
- applyFilters([...state.filters.filter((clause) => clause.field !== field), ...clauses]);
73
+ applyFilters([...query.filters.filter((clause) => clause.field !== field), ...clauses]);
73
74
  }
74
75
  function setTableFilter(key, value) {
75
- const next = { ...state.tableFilters };
76
+ const next = { ...query.tableFilters };
76
77
  if (isEmptyFilterValue(value) || !isFilterValue(value)) delete next[key];
77
78
  else next[key] = value;
78
- const nextState = {
79
- ...state,
79
+ const nextQuery = {
80
+ ...query,
80
81
  tableFilters: next,
81
- tableFilterIndicators: state.tableFilterIndicators.filter((indicator) => indicator.filter !== key),
82
+ tableFilterIndicators: query.tableFilterIndicators.filter((indicator) => indicator.filter !== key),
82
83
  page: 1
83
84
  };
84
- setState(nextState);
85
- load(nextState);
85
+ setQuery(nextQuery);
86
+ load(nextQuery);
86
87
  }
87
88
  function resetFilters() {
88
- const nextState = {
89
- ...state,
89
+ const nextQuery = {
90
+ ...query,
90
91
  filters: [],
91
92
  tableFilters: {},
92
93
  tableFilterIndicators: [],
94
+ search: "",
93
95
  page: 1
94
96
  };
95
- setState(nextState);
96
- load(nextState);
97
+ setQuery(nextQuery);
98
+ load(nextQuery);
97
99
  }
98
- const searchFilterOptions = useCallback(async (searchKey, query, signal) => {
100
+ function setSearch(search) {
101
+ const nextQuery = {
102
+ ...query,
103
+ search,
104
+ page: 1
105
+ };
106
+ setQuery(nextQuery);
107
+ load(nextQuery);
108
+ }
109
+ const searchFilterOptions = useCallback(async (searchKey, search, signal) => {
99
110
  if (!endpoint) return [];
100
111
  const url = new URL(endpoint, window.location.origin);
101
112
  url.searchParams.set("_search", searchKey);
102
- url.searchParams.set("q", query);
113
+ url.searchParams.set("_q", search);
103
114
  const response = await apiFetch(`${url.pathname}${url.search}`, {
104
115
  ref: componentRef,
105
116
  signal,
@@ -110,14 +121,14 @@ function useTable(node) {
110
121
  }, [endpoint, componentRef]);
111
122
  function goToPage(page) {
112
123
  load({
113
- ...state,
124
+ ...query,
114
125
  page
115
126
  });
116
127
  }
117
128
  const loadMore = useCallback(() => {
118
129
  if (processing || !pagination.hasMore) return;
119
130
  load({
120
- ...state,
131
+ ...query,
121
132
  page: pagination.nextPage ?? currentPage + 1
122
133
  }, true);
123
134
  }, [
@@ -126,41 +137,32 @@ function useTable(node) {
126
137
  pagination.hasMore,
127
138
  pagination.nextPage,
128
139
  processing,
129
- state
140
+ query
130
141
  ]);
131
142
  useEffect(() => {
132
143
  setRows(initialRows);
133
144
  setPagination(initialPagination);
134
- setState(initialState);
145
+ setQuery(initialQuery);
135
146
  setProcessing(isLazy);
136
147
  setHasLoaded(!isLazy);
137
148
  }, [
138
149
  initialRows,
139
150
  initialPagination,
140
- initialState,
151
+ initialQuery,
141
152
  isLazy
142
153
  ]);
143
154
  useEffect(() => {
144
155
  if (!isLazy || hasLoaded) return;
145
- load(state);
156
+ load(query);
146
157
  }, [
147
158
  hasLoaded,
148
159
  isLazy,
149
160
  load,
150
- state
151
- ]);
152
- useEffect(() => {
153
- function reload(event) {
154
- if (event.detail?.component !== node.id) return;
155
- load(state);
156
- }
157
- window.addEventListener(LATTICE_EVENT.reloadComponent, reload);
158
- return () => window.removeEventListener(LATTICE_EVENT.reloadComponent, reload);
159
- }, [
160
- load,
161
- node.id,
162
- state
161
+ query
163
162
  ]);
163
+ useWindowEvent(LATTICE_EVENT.reloadComponent, (event) => {
164
+ if (event.detail?.component === node.id) load(query);
165
+ });
164
166
  useEffect(() => {
165
167
  if (!isInfinite || !pagination.hasMore || processing || !infiniteLoaderRef.current || typeof IntersectionObserver === "undefined") return;
166
168
  const observer = new IntersectionObserver((entries) => {
@@ -178,15 +180,17 @@ function useTable(node) {
178
180
  columns,
179
181
  rows,
180
182
  pagination,
181
- state,
182
- filters: state.filters,
183
- tableFilters: state.tableFilters,
183
+ query,
184
+ filters: query.filters,
185
+ tableFilters: query.tableFilters,
186
+ search: query.search,
184
187
  addFilter,
185
188
  updateFilter,
186
189
  removeFilter,
187
190
  replaceColumnFilters,
188
191
  setTableFilter,
189
192
  resetFilters,
193
+ setSearch,
190
194
  searchFilterOptions,
191
195
  processing,
192
196
  hasLoaded,
@@ -1 +1 @@
1
- {"version":3,"file":"use-table.js","names":[],"sources":["../../../resources/js/table/hooks/use-table.ts"],"sourcesContent":["import { apiFetch, apiJson } from \"@lattice-php/lattice/core/api\";\nimport { LATTICE_EVENT, type ReloadComponentEvent } from \"@lattice-php/lattice/events/event-names\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { Option } from \"@lattice-php/lattice/types/generated\";\nimport { isEmptyFilterValue, isFilterValue } from \"@lattice-php/lattice/table/lib/filter-values\";\nimport {\n getColumns,\n getPagination,\n getRows,\n getState,\n} from \"@lattice-php/lattice/table/lib/payload\";\nimport { buildEndpoint, nextSort } from \"@lattice-php/lattice/table/lib/query\";\nimport type {\n FilterClause,\n TableColumn,\n TableNode,\n TableResponse,\n TableSort,\n TableState,\n} from \"@lattice-php/lattice/table/types\";\n\nexport function useTable(node: TableNode) {\n const columns = useMemo(() => getColumns(node.props?.columns), [node.props?.columns]);\n const endpoint = typeof node.props?.endpoint === \"string\" ? node.props.endpoint : null;\n const componentRef = typeof node.props?.ref === \"string\" ? node.props.ref : \"\";\n const isLazy = node.props?.lazy === true;\n const initialState = useMemo(() => getState(node.props?.state), [node.props?.state]);\n const initialRows = useMemo(() => getRows(node.props?.data), [node.props?.data]);\n const initialPagination = useMemo(\n () => getPagination(node.props?.pagination),\n [node.props?.pagination],\n );\n const [rows, setRows] = useState(initialRows);\n const [pagination, setPagination] = useState(initialPagination);\n const [state, setState] = useState(initialState);\n const [processing, setProcessing] = useState(isLazy);\n const [hasLoaded, setHasLoaded] = useState(!isLazy);\n const infiniteLoaderRef = useRef<HTMLDivElement | null>(null);\n const currentPage = pagination.currentPage ?? state.page;\n const isInfinite = (pagination.mode ?? \"table\") === \"infinite\";\n\n const load = useCallback(\n async (nextState: TableState, append = false): Promise<void> => {\n if (!endpoint) {\n return;\n }\n\n setProcessing(true);\n\n try {\n const result = await apiJson<TableResponse>(buildEndpoint(endpoint, nextState), {\n ref: componentRef,\n });\n const resultState = getState(result.state);\n const resultRows = getRows(result.data);\n\n setRows((currentRows) => (append ? [...currentRows, ...resultRows] : resultRows));\n setPagination(getPagination(result.pagination));\n setState(resultState);\n setHasLoaded(true);\n } finally {\n setProcessing(false);\n }\n },\n [endpoint, componentRef],\n );\n\n function sort(column: TableColumn): void {\n void load({\n ...state,\n page: 1,\n sorts: nextSort(state.sorts, column),\n });\n }\n\n function clearSort(sort: TableSort): void {\n void load({\n ...state,\n page: 1,\n sorts: state.sorts.filter((currentSort) => currentSort.key !== sort.key),\n });\n }\n\n function applyFilters(next: FilterClause[]): void {\n const nextState = { ...state, filters: next, page: 1 };\n\n setState(nextState);\n void load(nextState);\n }\n\n function addFilter(clause: FilterClause): void {\n applyFilters([...state.filters, clause]);\n }\n\n function updateFilter(index: number, clause: FilterClause): void {\n applyFilters(state.filters.map((current, position) => (position === index ? clause : current)));\n }\n\n function removeFilter(index: number): void {\n applyFilters(state.filters.filter((_, current) => current !== index));\n }\n\n function replaceColumnFilters(field: string, clauses: FilterClause[]): void {\n applyFilters([...state.filters.filter((clause) => clause.field !== field), ...clauses]);\n }\n\n function setTableFilter(key: string, value: unknown): void {\n const next = { ...state.tableFilters };\n\n if (isEmptyFilterValue(value) || !isFilterValue(value)) {\n delete next[key];\n } else {\n next[key] = value;\n }\n\n const nextState = {\n ...state,\n tableFilters: next,\n tableFilterIndicators: state.tableFilterIndicators.filter(\n (indicator) => indicator.filter !== key,\n ),\n page: 1,\n };\n\n setState(nextState);\n void load(nextState);\n }\n\n function resetFilters(): void {\n const nextState = {\n ...state,\n filters: [],\n tableFilters: {},\n tableFilterIndicators: [],\n page: 1,\n };\n\n setState(nextState);\n void load(nextState);\n }\n\n const searchFilterOptions = useCallback(\n async (searchKey: string, query: string, signal?: AbortSignal): Promise<Option[]> => {\n if (!endpoint) {\n return [];\n }\n\n const url = new URL(endpoint, window.location.origin);\n url.searchParams.set(\"_search\", searchKey);\n url.searchParams.set(\"q\", query);\n\n const response = await apiFetch(`${url.pathname}${url.search}`, {\n ref: componentRef,\n signal,\n throwOnError: false,\n });\n\n if (!response.ok) {\n return [];\n }\n\n const result = (await response.json()) as { options?: Option[] };\n\n return result.options ?? [];\n },\n [endpoint, componentRef],\n );\n\n function goToPage(page: number): void {\n void load({\n ...state,\n page,\n });\n }\n\n const loadMore = useCallback((): void => {\n if (processing || !pagination.hasMore) {\n return;\n }\n\n void load(\n {\n ...state,\n page: pagination.nextPage ?? currentPage + 1,\n },\n true,\n );\n }, [currentPage, load, pagination.hasMore, pagination.nextPage, processing, state]);\n\n useEffect(() => {\n setRows(initialRows);\n setPagination(initialPagination);\n setState(initialState);\n setProcessing(isLazy);\n setHasLoaded(!isLazy);\n }, [initialRows, initialPagination, initialState, isLazy]);\n\n useEffect(() => {\n if (!isLazy || hasLoaded) {\n return;\n }\n\n void load(state);\n }, [hasLoaded, isLazy, load, state]);\n\n useEffect(() => {\n function reload(event: Event): void {\n const detail = (event as ReloadComponentEvent).detail;\n\n if (detail?.component !== node.id) {\n return;\n }\n\n void load(state);\n }\n\n window.addEventListener(LATTICE_EVENT.reloadComponent, reload);\n\n return () => window.removeEventListener(LATTICE_EVENT.reloadComponent, reload);\n }, [load, node.id, state]);\n\n useEffect(() => {\n if (\n !isInfinite ||\n !pagination.hasMore ||\n processing ||\n !infiniteLoaderRef.current ||\n typeof IntersectionObserver === \"undefined\"\n ) {\n return;\n }\n\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries.some((entry) => entry.isIntersecting)) {\n loadMore();\n }\n },\n {\n rootMargin: \"240px\",\n },\n );\n\n observer.observe(infiniteLoaderRef.current);\n\n return () => observer.disconnect();\n }, [isInfinite, loadMore, pagination.hasMore, processing]);\n\n return {\n columns,\n rows,\n pagination,\n state,\n filters: state.filters,\n tableFilters: state.tableFilters,\n addFilter,\n updateFilter,\n removeFilter,\n replaceColumnFilters,\n setTableFilter,\n resetFilters,\n searchFilterOptions,\n processing,\n hasLoaded,\n infiniteLoaderRef,\n sort,\n clearSort,\n goToPage,\n loadMore,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"use-table.js","names":[],"sources":["../../../resources/js/table/hooks/use-table.ts"],"sourcesContent":["import { apiFetch, apiJson } from \"@lattice-php/lattice/core/api\";\nimport { LATTICE_EVENT, type ReloadComponentEvent } from \"@lattice-php/lattice/core/event-names\";\nimport { useWindowEvent } from \"@lattice-php/lattice/core/hooks/use-window-event\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { Option } from \"@lattice-php/lattice/types/generated\";\nimport { isEmptyFilterValue, isFilterValue } from \"@lattice-php/lattice/table/lib/filter-values\";\nimport {\n getColumns,\n getPagination,\n getRows,\n getQuery,\n} from \"@lattice-php/lattice/table/lib/payload\";\nimport { buildEndpoint, nextSort } from \"@lattice-php/lattice/table/lib/query\";\nimport type {\n FilterClause,\n TableColumn,\n TableNode,\n TableResult,\n TableSort,\n TableQuery,\n} from \"@lattice-php/lattice/table/types\";\n\nexport function useTable(node: TableNode) {\n const columns = useMemo(() => getColumns(node.props?.columns), [node.props?.columns]);\n const endpoint = typeof node.props?.endpoint === \"string\" ? node.props.endpoint : null;\n const componentRef = typeof node.props?.ref === \"string\" ? node.props.ref : \"\";\n const isLazy = node.props?.lazy === true;\n const initialQuery = useMemo(() => getQuery(node.props?.query), [node.props?.query]);\n const initialRows = useMemo(() => getRows(node.props?.data), [node.props?.data]);\n const initialPagination = useMemo(\n () => getPagination(node.props?.pagination),\n [node.props?.pagination],\n );\n const [rows, setRows] = useState(initialRows);\n const [pagination, setPagination] = useState(initialPagination);\n const [query, setQuery] = useState(initialQuery);\n const [processing, setProcessing] = useState(isLazy);\n const [hasLoaded, setHasLoaded] = useState(!isLazy);\n const infiniteLoaderRef = useRef<HTMLDivElement | null>(null);\n const currentPage = pagination.currentPage ?? query.page;\n const isInfinite = (pagination.mode ?? \"table\") === \"infinite\";\n\n const load = useCallback(\n async (nextQuery: TableQuery, append = false): Promise<void> => {\n if (!endpoint) {\n return;\n }\n\n setProcessing(true);\n\n try {\n const result = await apiJson<TableResult>(buildEndpoint(endpoint, nextQuery), {\n ref: componentRef,\n });\n const resultQuery = getQuery(result.query);\n const resultRows = getRows(result.data);\n\n setRows((currentRows) => (append ? [...currentRows, ...resultRows] : resultRows));\n setPagination(getPagination(result.pagination));\n setQuery(resultQuery);\n setHasLoaded(true);\n } finally {\n setProcessing(false);\n }\n },\n [endpoint, componentRef],\n );\n\n function sort(column: TableColumn): void {\n void load({\n ...query,\n page: 1,\n sorts: nextSort(query.sorts, column),\n });\n }\n\n function clearSort(sort: TableSort): void {\n void load({\n ...query,\n page: 1,\n sorts: query.sorts.filter((currentSort) => currentSort.key !== sort.key),\n });\n }\n\n function applyFilters(next: FilterClause[]): void {\n const nextQuery = { ...query, filters: next, page: 1 };\n\n setQuery(nextQuery);\n void load(nextQuery);\n }\n\n function addFilter(clause: FilterClause): void {\n applyFilters([...query.filters, clause]);\n }\n\n function updateFilter(index: number, clause: FilterClause): void {\n applyFilters(query.filters.map((current, position) => (position === index ? clause : current)));\n }\n\n function removeFilter(index: number): void {\n applyFilters(query.filters.filter((_, current) => current !== index));\n }\n\n function replaceColumnFilters(field: string, clauses: FilterClause[]): void {\n applyFilters([...query.filters.filter((clause) => clause.field !== field), ...clauses]);\n }\n\n function setTableFilter(key: string, value: unknown): void {\n const next = { ...query.tableFilters };\n\n if (isEmptyFilterValue(value) || !isFilterValue(value)) {\n delete next[key];\n } else {\n next[key] = value;\n }\n\n const nextQuery = {\n ...query,\n tableFilters: next,\n tableFilterIndicators: query.tableFilterIndicators.filter(\n (indicator) => indicator.filter !== key,\n ),\n page: 1,\n };\n\n setQuery(nextQuery);\n void load(nextQuery);\n }\n\n function resetFilters(): void {\n const nextQuery = {\n ...query,\n filters: [],\n tableFilters: {},\n tableFilterIndicators: [],\n search: \"\",\n page: 1,\n };\n\n setQuery(nextQuery);\n void load(nextQuery);\n }\n\n function setSearch(search: string): void {\n const nextQuery = { ...query, search, page: 1 };\n\n setQuery(nextQuery);\n void load(nextQuery);\n }\n\n const searchFilterOptions = useCallback(\n async (searchKey: string, search: string, signal?: AbortSignal): Promise<Option[]> => {\n if (!endpoint) {\n return [];\n }\n\n const url = new URL(endpoint, window.location.origin);\n url.searchParams.set(\"_search\", searchKey);\n url.searchParams.set(\"_q\", search);\n\n const response = await apiFetch(`${url.pathname}${url.search}`, {\n ref: componentRef,\n signal,\n throwOnError: false,\n });\n\n if (!response.ok) {\n return [];\n }\n\n const result = (await response.json()) as { options?: Option[] };\n\n return result.options ?? [];\n },\n [endpoint, componentRef],\n );\n\n function goToPage(page: number): void {\n void load({\n ...query,\n page,\n });\n }\n\n const loadMore = useCallback((): void => {\n if (processing || !pagination.hasMore) {\n return;\n }\n\n void load(\n {\n ...query,\n page: pagination.nextPage ?? currentPage + 1,\n },\n true,\n );\n }, [currentPage, load, pagination.hasMore, pagination.nextPage, processing, query]);\n\n useEffect(() => {\n setRows(initialRows);\n setPagination(initialPagination);\n setQuery(initialQuery);\n setProcessing(isLazy);\n setHasLoaded(!isLazy);\n }, [initialRows, initialPagination, initialQuery, isLazy]);\n\n useEffect(() => {\n if (!isLazy || hasLoaded) {\n return;\n }\n\n void load(query);\n }, [hasLoaded, isLazy, load, query]);\n\n useWindowEvent(LATTICE_EVENT.reloadComponent, (event) => {\n const detail = (event as ReloadComponentEvent).detail;\n\n if (detail?.component === node.id) {\n void load(query);\n }\n });\n\n useEffect(() => {\n if (\n !isInfinite ||\n !pagination.hasMore ||\n processing ||\n !infiniteLoaderRef.current ||\n typeof IntersectionObserver === \"undefined\"\n ) {\n return;\n }\n\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries.some((entry) => entry.isIntersecting)) {\n loadMore();\n }\n },\n {\n rootMargin: \"240px\",\n },\n );\n\n observer.observe(infiniteLoaderRef.current);\n\n return () => observer.disconnect();\n }, [isInfinite, loadMore, pagination.hasMore, processing]);\n\n return {\n columns,\n rows,\n pagination,\n query,\n filters: query.filters,\n tableFilters: query.tableFilters,\n search: query.search,\n addFilter,\n updateFilter,\n removeFilter,\n replaceColumnFilters,\n setTableFilter,\n resetFilters,\n setSearch,\n searchFilterOptions,\n processing,\n hasLoaded,\n infiniteLoaderRef,\n sort,\n clearSort,\n goToPage,\n loadMore,\n };\n}\n"],"mappings":"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"}
@@ -11,5 +11,7 @@ export type BulkAction = {
11
11
  variant: ButtonVariant;
12
12
  confirmation: Action["confirmation"];
13
13
  form: Node | null;
14
+ modalSide: Action["modalSide"];
15
+ modalWidth: Action["modalWidth"];
14
16
  };
15
17
  export declare function getBulkActions(actions: ActionNode[] | undefined): BulkAction[];
@@ -12,7 +12,9 @@ function getBulkActions(actions) {
12
12
  ref: props.ref ?? "",
13
13
  variant: props.variant ?? "default",
14
14
  confirmation: props.confirmation,
15
- form: props.form
15
+ form: props.form,
16
+ modalSide: props.modalSide,
17
+ modalWidth: props.modalWidth
16
18
  }];
17
19
  });
18
20
  }
@@ -1 +1 @@
1
- {"version":3,"file":"bulk.js","names":[],"sources":["../../../resources/js/table/lib/bulk.ts"],"sourcesContent":["import type { Method } from \"@inertiajs/core\";\nimport type { Node } from \"@lattice-php/lattice/core/types\";\nimport type { Action, ButtonVariant } from \"@lattice-php/lattice/types/generated\";\nimport type { ActionNode } from \"@lattice-php/lattice/table/types\";\n\nexport type BulkAction = {\n id: string;\n label: string;\n method: Method;\n endpoint: string;\n ref: string;\n variant: ButtonVariant;\n confirmation: Action[\"confirmation\"];\n form: Node | null;\n};\n\nexport function getBulkActions(actions: ActionNode[] | undefined): BulkAction[] {\n return (actions ?? []).flatMap((node): BulkAction[] => {\n if (node.type === \"action.group\") {\n return [];\n }\n\n const props = node.props;\n\n if (!props.endpoint) {\n return [];\n }\n\n return [\n {\n id: node.id ?? \"\",\n label: props.label ?? \"Run action\",\n method: props.method ?? \"post\",\n endpoint: props.endpoint,\n ref: props.ref ?? \"\",\n variant: props.variant ?? \"default\",\n confirmation: props.confirmation,\n form: props.form,\n },\n ];\n });\n}\n"],"mappings":";AAgBA,SAAgB,eAAe,SAAiD;CAC9E,QAAQ,WAAW,CAAC,GAAG,SAAS,SAAuB;EACrD,IAAI,KAAK,SAAS,gBAChB,OAAO,CAAC;EAGV,MAAM,QAAQ,KAAK;EAEnB,IAAI,CAAC,MAAM,UACT,OAAO,CAAC;EAGV,OAAO,CACL;GACE,IAAI,KAAK,MAAM;GACf,OAAO,MAAM,SAAS;GACtB,QAAQ,MAAM,UAAU;GACxB,UAAU,MAAM;GAChB,KAAK,MAAM,OAAO;GAClB,SAAS,MAAM,WAAW;GAC1B,cAAc,MAAM;GACpB,MAAM,MAAM;EACd,CACF;CACF,CAAC;AACH"}
1
+ {"version":3,"file":"bulk.js","names":[],"sources":["../../../resources/js/table/lib/bulk.ts"],"sourcesContent":["import type { Method } from \"@inertiajs/core\";\nimport type { Node } from \"@lattice-php/lattice/core/types\";\nimport type { Action, ButtonVariant } from \"@lattice-php/lattice/types/generated\";\nimport type { ActionNode } from \"@lattice-php/lattice/table/types\";\n\nexport type BulkAction = {\n id: string;\n label: string;\n method: Method;\n endpoint: string;\n ref: string;\n variant: ButtonVariant;\n confirmation: Action[\"confirmation\"];\n form: Node | null;\n modalSide: Action[\"modalSide\"];\n modalWidth: Action[\"modalWidth\"];\n};\n\nexport function getBulkActions(actions: ActionNode[] | undefined): BulkAction[] {\n return (actions ?? []).flatMap((node): BulkAction[] => {\n if (node.type === \"action.group\") {\n return [];\n }\n\n const props = node.props;\n\n if (!props.endpoint) {\n return [];\n }\n\n return [\n {\n id: node.id ?? \"\",\n label: props.label ?? \"Run action\",\n method: props.method ?? \"post\",\n endpoint: props.endpoint,\n ref: props.ref ?? \"\",\n variant: props.variant ?? \"default\",\n confirmation: props.confirmation,\n form: props.form,\n modalSide: props.modalSide,\n modalWidth: props.modalWidth,\n },\n ];\n });\n}\n"],"mappings":";AAkBA,SAAgB,eAAe,SAAiD;CAC9E,QAAQ,WAAW,CAAC,GAAG,SAAS,SAAuB;EACrD,IAAI,KAAK,SAAS,gBAChB,OAAO,CAAC;EAGV,MAAM,QAAQ,KAAK;EAEnB,IAAI,CAAC,MAAM,UACT,OAAO,CAAC;EAGV,OAAO,CACL;GACE,IAAI,KAAK,MAAM;GACf,OAAO,MAAM,SAAS;GACtB,QAAQ,MAAM,UAAU;GACxB,UAAU,MAAM;GAChB,KAAK,MAAM,OAAO;GAClB,SAAS,MAAM,WAAW;GAC1B,cAAc,MAAM;GACpB,MAAM,MAAM;GACZ,WAAW,MAAM;GACjB,YAAY,MAAM;EACpB,CACF;CACF,CAAC;AACH"}
@@ -1,8 +1,9 @@
1
1
  import { Node } from '../../core/types.js';
2
- import { TableColumn, TablePagination, TableRow, TableState } from '../types.js';
2
+ import { TableColumn, TablePagination, TableRow, TableQuery } from '../types.js';
3
3
  export declare function getColumns(value: unknown): TableColumn[];
4
4
  export declare function getRows(value: unknown): TableRow[];
5
5
  export declare function getPagination(value: unknown): TablePagination;
6
- export declare function getState(value: unknown): TableState;
6
+ export declare function getQuery(value: unknown): TableQuery;
7
7
  export declare function getRowKey(row: TableRow, index: number): string;
8
8
  export declare function getRowActions(row: TableRow): Node[];
9
+ export declare function getRowDetail(row: TableRow): Node | null;
@@ -26,23 +26,25 @@ function getPagination(value) {
26
26
  if (typeof value !== "object" || value === null || Array.isArray(value)) return EMPTY_PAGINATION;
27
27
  return value;
28
28
  }
29
- function getState(value) {
29
+ function getQuery(value) {
30
30
  if (typeof value !== "object" || value === null || Array.isArray(value)) return {
31
31
  filters: [],
32
32
  sorts: [],
33
33
  page: 1,
34
34
  perPage: 25,
35
35
  tableFilters: {},
36
- tableFilterIndicators: []
36
+ tableFilterIndicators: [],
37
+ search: ""
37
38
  };
38
- const state = value;
39
+ const query = value;
39
40
  return {
40
- filters: getFilters(state.filters),
41
- sorts: Array.isArray(state.sorts) ? state.sorts : [],
42
- page: typeof state.page === "number" ? state.page : 1,
43
- perPage: typeof state.perPage === "number" ? state.perPage : 25,
44
- tableFilters: getTableFilters(state.tableFilters),
45
- tableFilterIndicators: getTableFilterIndicators(state.tableFilterIndicators)
41
+ filters: getFilters(query.filters),
42
+ sorts: Array.isArray(query.sorts) ? query.sorts : [],
43
+ page: typeof query.page === "number" ? query.page : 1,
44
+ perPage: typeof query.perPage === "number" ? query.perPage : 25,
45
+ tableFilters: getTableFilters(query.tableFilters),
46
+ tableFilterIndicators: getTableFilterIndicators(query.tableFilterIndicators),
47
+ search: typeof query.search === "string" ? query.search : ""
46
48
  };
47
49
  }
48
50
  /**
@@ -64,7 +66,11 @@ function getRowKey(row, index) {
64
66
  function getRowActions(row) {
65
67
  return Array.isArray(row.actions) ? row.actions : [];
66
68
  }
69
+ function getRowDetail(row) {
70
+ const detail = row.detail;
71
+ return typeof detail === "object" && detail !== null && !Array.isArray(detail) ? detail : null;
72
+ }
67
73
  //#endregion
68
- export { getColumns, getPagination, getRowActions, getRowKey, getRows, getState };
74
+ export { getColumns, getPagination, getQuery, getRowActions, getRowDetail, getRowKey, getRows };
69
75
 
70
76
  //# sourceMappingURL=payload.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"payload.js","names":[],"sources":["../../../resources/js/table/lib/payload.ts"],"sourcesContent":["import type { Node } from \"@lattice-php/lattice/core/types\";\nimport type {\n FilterClause,\n TableColumn,\n TableFilterIndicator,\n TablePagination,\n TableRow,\n TableState,\n} from \"@lattice-php/lattice/table/types\";\n\nfunction getFilters(value: unknown): FilterClause[] {\n if (!Array.isArray(value)) {\n return [];\n }\n\n return value.filter(\n (clause): clause is FilterClause =>\n typeof clause === \"object\" &&\n clause !== null &&\n typeof clause.field === \"string\" &&\n typeof clause.operator === \"string\" &&\n typeof clause.value === \"string\",\n );\n}\n\nexport function getColumns(value: unknown): TableColumn[] {\n if (!Array.isArray(value)) {\n return [];\n }\n\n return value.filter(\n (column): column is TableColumn =>\n typeof column === \"object\" &&\n column !== null &&\n \"key\" in column &&\n \"props\" in column &&\n typeof column.key === \"string\" &&\n typeof column.props === \"object\" &&\n column.props !== null &&\n typeof (column.props as Record<string, unknown>).label === \"string\",\n );\n}\n\nexport function getRows(value: unknown): TableRow[] {\n if (!Array.isArray(value)) {\n return [];\n }\n\n return value.filter(\n (row): row is TableRow => typeof row === \"object\" && row !== null && !Array.isArray(row),\n );\n}\n\nconst EMPTY_PAGINATION: TablePagination = {\n mode: \"none\",\n currentPage: null,\n lastPage: null,\n perPage: null,\n total: null,\n from: null,\n to: null,\n hasMore: false,\n nextPage: null,\n};\n\nexport function getPagination(value: unknown): TablePagination {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return EMPTY_PAGINATION;\n }\n\n return value as TablePagination;\n}\n\nexport function getState(value: unknown): TableState {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return {\n filters: [],\n sorts: [],\n page: 1,\n perPage: 25,\n tableFilters: {},\n tableFilterIndicators: [],\n };\n }\n\n const state = value as Partial<TableState>;\n\n return {\n filters: getFilters(state.filters),\n sorts: Array.isArray(state.sorts) ? state.sorts : [],\n page: typeof state.page === \"number\" ? state.page : 1,\n perPage: typeof state.perPage === \"number\" ? state.perPage : 25,\n tableFilters: getTableFilters(state.tableFilters),\n tableFilterIndicators: getTableFilterIndicators(state.tableFilterIndicators),\n };\n}\n\n/**\n * The wire serializes an empty filter map as `[]` and a populated one as an\n * object, so coerce both to a plain `key => value` record.\n */\nfunction getTableFilters(value: unknown): Record<string, Record<string, unknown>> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return {};\n }\n\n return Object.fromEntries(\n Object.entries(value).filter(\n (entry): entry is [string, Record<string, unknown>] =>\n typeof entry[1] === \"object\" && entry[1] !== null && !Array.isArray(entry[1]),\n ),\n );\n}\n\nfunction getTableFilterIndicators(value: unknown): TableFilterIndicator[] {\n if (!Array.isArray(value)) {\n return [];\n }\n\n return value.filter(\n (indicator): indicator is TableFilterIndicator =>\n typeof indicator === \"object\" &&\n indicator !== null &&\n typeof indicator.filter === \"string\" &&\n typeof indicator.label === \"string\" &&\n typeof indicator.value === \"string\",\n );\n}\n\nexport function getRowKey(row: TableRow, index: number): string {\n const key = row.id ?? row.uuid ?? row.key ?? index;\n\n return String(key);\n}\n\nexport function getRowActions(row: TableRow): Node[] {\n return Array.isArray(row.actions) ? (row.actions as Node[]) : [];\n}\n"],"mappings":";AAUA,SAAS,WAAW,OAAgC;CAClD,IAAI,CAAC,MAAM,QAAQ,KAAK,GACtB,OAAO,CAAC;CAGV,OAAO,MAAM,QACV,WACC,OAAO,WAAW,YAClB,WAAW,QACX,OAAO,OAAO,UAAU,YACxB,OAAO,OAAO,aAAa,YAC3B,OAAO,OAAO,UAAU,QAC5B;AACF;AAEA,SAAgB,WAAW,OAA+B;CACxD,IAAI,CAAC,MAAM,QAAQ,KAAK,GACtB,OAAO,CAAC;CAGV,OAAO,MAAM,QACV,WACC,OAAO,WAAW,YAClB,WAAW,QACX,SAAS,UACT,WAAW,UACX,OAAO,OAAO,QAAQ,YACtB,OAAO,OAAO,UAAU,YACxB,OAAO,UAAU,QACjB,OAAQ,OAAO,MAAkC,UAAU,QAC/D;AACF;AAEA,SAAgB,QAAQ,OAA4B;CAClD,IAAI,CAAC,MAAM,QAAQ,KAAK,GACtB,OAAO,CAAC;CAGV,OAAO,MAAM,QACV,QAAyB,OAAO,QAAQ,YAAY,QAAQ,QAAQ,CAAC,MAAM,QAAQ,GAAG,CACzF;AACF;AAEA,IAAM,mBAAoC;CACxC,MAAM;CACN,aAAa;CACb,UAAU;CACV,SAAS;CACT,OAAO;CACP,MAAM;CACN,IAAI;CACJ,SAAS;CACT,UAAU;AACZ;AAEA,SAAgB,cAAc,OAAiC;CAC7D,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,GACpE,OAAO;CAGT,OAAO;AACT;AAEA,SAAgB,SAAS,OAA4B;CACnD,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,GACpE,OAAO;EACL,SAAS,CAAC;EACV,OAAO,CAAC;EACR,MAAM;EACN,SAAS;EACT,cAAc,CAAC;EACf,uBAAuB,CAAC;CAC1B;CAGF,MAAM,QAAQ;CAEd,OAAO;EACL,SAAS,WAAW,MAAM,OAAO;EACjC,OAAO,MAAM,QAAQ,MAAM,KAAK,IAAI,MAAM,QAAQ,CAAC;EACnD,MAAM,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO;EACpD,SAAS,OAAO,MAAM,YAAY,WAAW,MAAM,UAAU;EAC7D,cAAc,gBAAgB,MAAM,YAAY;EAChD,uBAAuB,yBAAyB,MAAM,qBAAqB;CAC7E;AACF;;;;;AAMA,SAAS,gBAAgB,OAAyD;CAChF,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,GACpE,OAAO,CAAC;CAGV,OAAO,OAAO,YACZ,OAAO,QAAQ,KAAK,EAAE,QACnB,UACC,OAAO,MAAM,OAAO,YAAY,MAAM,OAAO,QAAQ,CAAC,MAAM,QAAQ,MAAM,EAAE,CAChF,CACF;AACF;AAEA,SAAS,yBAAyB,OAAwC;CACxE,IAAI,CAAC,MAAM,QAAQ,KAAK,GACtB,OAAO,CAAC;CAGV,OAAO,MAAM,QACV,cACC,OAAO,cAAc,YACrB,cAAc,QACd,OAAO,UAAU,WAAW,YAC5B,OAAO,UAAU,UAAU,YAC3B,OAAO,UAAU,UAAU,QAC/B;AACF;AAEA,SAAgB,UAAU,KAAe,OAAuB;CAC9D,MAAM,MAAM,IAAI,MAAM,IAAI,QAAQ,IAAI,OAAO;CAE7C,OAAO,OAAO,GAAG;AACnB;AAEA,SAAgB,cAAc,KAAuB;CACnD,OAAO,MAAM,QAAQ,IAAI,OAAO,IAAK,IAAI,UAAqB,CAAC;AACjE"}
1
+ {"version":3,"file":"payload.js","names":[],"sources":["../../../resources/js/table/lib/payload.ts"],"sourcesContent":["import type { Node } from \"@lattice-php/lattice/core/types\";\nimport type {\n FilterClause,\n FilterIndicator,\n TableColumn,\n TablePagination,\n TableRow,\n TableQuery,\n} from \"@lattice-php/lattice/table/types\";\n\nfunction getFilters(value: unknown): FilterClause[] {\n if (!Array.isArray(value)) {\n return [];\n }\n\n return value.filter(\n (clause): clause is FilterClause =>\n typeof clause === \"object\" &&\n clause !== null &&\n typeof clause.field === \"string\" &&\n typeof clause.operator === \"string\" &&\n typeof clause.value === \"string\",\n );\n}\n\nexport function getColumns(value: unknown): TableColumn[] {\n if (!Array.isArray(value)) {\n return [];\n }\n\n return value.filter(\n (column): column is TableColumn =>\n typeof column === \"object\" &&\n column !== null &&\n \"key\" in column &&\n \"props\" in column &&\n typeof column.key === \"string\" &&\n typeof column.props === \"object\" &&\n column.props !== null &&\n typeof (column.props as Record<string, unknown>).label === \"string\",\n );\n}\n\nexport function getRows(value: unknown): TableRow[] {\n if (!Array.isArray(value)) {\n return [];\n }\n\n return value.filter(\n (row): row is TableRow => typeof row === \"object\" && row !== null && !Array.isArray(row),\n );\n}\n\nconst EMPTY_PAGINATION: TablePagination = {\n mode: \"none\",\n currentPage: null,\n lastPage: null,\n perPage: null,\n total: null,\n from: null,\n to: null,\n hasMore: false,\n nextPage: null,\n};\n\nexport function getPagination(value: unknown): TablePagination {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return EMPTY_PAGINATION;\n }\n\n return value as TablePagination;\n}\n\nexport function getQuery(value: unknown): TableQuery {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return {\n filters: [],\n sorts: [],\n page: 1,\n perPage: 25,\n tableFilters: {},\n tableFilterIndicators: [],\n search: \"\",\n };\n }\n\n const query = value as Partial<TableQuery>;\n\n return {\n filters: getFilters(query.filters),\n sorts: Array.isArray(query.sorts) ? query.sorts : [],\n page: typeof query.page === \"number\" ? query.page : 1,\n perPage: typeof query.perPage === \"number\" ? query.perPage : 25,\n tableFilters: getTableFilters(query.tableFilters),\n tableFilterIndicators: getTableFilterIndicators(query.tableFilterIndicators),\n search: typeof query.search === \"string\" ? query.search : \"\",\n };\n}\n\n/**\n * The wire serializes an empty filter map as `[]` and a populated one as an\n * object, so coerce both to a plain `key => value` record.\n */\nfunction getTableFilters(value: unknown): Record<string, Record<string, unknown>> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return {};\n }\n\n return Object.fromEntries(\n Object.entries(value).filter(\n (entry): entry is [string, Record<string, unknown>] =>\n typeof entry[1] === \"object\" && entry[1] !== null && !Array.isArray(entry[1]),\n ),\n );\n}\n\nfunction getTableFilterIndicators(value: unknown): FilterIndicator[] {\n if (!Array.isArray(value)) {\n return [];\n }\n\n return value.filter(\n (indicator): indicator is FilterIndicator =>\n typeof indicator === \"object\" &&\n indicator !== null &&\n typeof indicator.filter === \"string\" &&\n typeof indicator.label === \"string\" &&\n typeof indicator.value === \"string\",\n );\n}\n\nexport function getRowKey(row: TableRow, index: number): string {\n const key = row.id ?? row.uuid ?? row.key ?? index;\n\n return String(key);\n}\n\nexport function getRowActions(row: TableRow): Node[] {\n return Array.isArray(row.actions) ? (row.actions as Node[]) : [];\n}\n\nexport function getRowDetail(row: TableRow): Node | null {\n const detail = row.detail;\n\n return typeof detail === \"object\" && detail !== null && !Array.isArray(detail)\n ? (detail as Node)\n : null;\n}\n"],"mappings":";AAUA,SAAS,WAAW,OAAgC;CAClD,IAAI,CAAC,MAAM,QAAQ,KAAK,GACtB,OAAO,CAAC;CAGV,OAAO,MAAM,QACV,WACC,OAAO,WAAW,YAClB,WAAW,QACX,OAAO,OAAO,UAAU,YACxB,OAAO,OAAO,aAAa,YAC3B,OAAO,OAAO,UAAU,QAC5B;AACF;AAEA,SAAgB,WAAW,OAA+B;CACxD,IAAI,CAAC,MAAM,QAAQ,KAAK,GACtB,OAAO,CAAC;CAGV,OAAO,MAAM,QACV,WACC,OAAO,WAAW,YAClB,WAAW,QACX,SAAS,UACT,WAAW,UACX,OAAO,OAAO,QAAQ,YACtB,OAAO,OAAO,UAAU,YACxB,OAAO,UAAU,QACjB,OAAQ,OAAO,MAAkC,UAAU,QAC/D;AACF;AAEA,SAAgB,QAAQ,OAA4B;CAClD,IAAI,CAAC,MAAM,QAAQ,KAAK,GACtB,OAAO,CAAC;CAGV,OAAO,MAAM,QACV,QAAyB,OAAO,QAAQ,YAAY,QAAQ,QAAQ,CAAC,MAAM,QAAQ,GAAG,CACzF;AACF;AAEA,IAAM,mBAAoC;CACxC,MAAM;CACN,aAAa;CACb,UAAU;CACV,SAAS;CACT,OAAO;CACP,MAAM;CACN,IAAI;CACJ,SAAS;CACT,UAAU;AACZ;AAEA,SAAgB,cAAc,OAAiC;CAC7D,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,GACpE,OAAO;CAGT,OAAO;AACT;AAEA,SAAgB,SAAS,OAA4B;CACnD,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,GACpE,OAAO;EACL,SAAS,CAAC;EACV,OAAO,CAAC;EACR,MAAM;EACN,SAAS;EACT,cAAc,CAAC;EACf,uBAAuB,CAAC;EACxB,QAAQ;CACV;CAGF,MAAM,QAAQ;CAEd,OAAO;EACL,SAAS,WAAW,MAAM,OAAO;EACjC,OAAO,MAAM,QAAQ,MAAM,KAAK,IAAI,MAAM,QAAQ,CAAC;EACnD,MAAM,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO;EACpD,SAAS,OAAO,MAAM,YAAY,WAAW,MAAM,UAAU;EAC7D,cAAc,gBAAgB,MAAM,YAAY;EAChD,uBAAuB,yBAAyB,MAAM,qBAAqB;EAC3E,QAAQ,OAAO,MAAM,WAAW,WAAW,MAAM,SAAS;CAC5D;AACF;;;;;AAMA,SAAS,gBAAgB,OAAyD;CAChF,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,GACpE,OAAO,CAAC;CAGV,OAAO,OAAO,YACZ,OAAO,QAAQ,KAAK,EAAE,QACnB,UACC,OAAO,MAAM,OAAO,YAAY,MAAM,OAAO,QAAQ,CAAC,MAAM,QAAQ,MAAM,EAAE,CAChF,CACF;AACF;AAEA,SAAS,yBAAyB,OAAmC;CACnE,IAAI,CAAC,MAAM,QAAQ,KAAK,GACtB,OAAO,CAAC;CAGV,OAAO,MAAM,QACV,cACC,OAAO,cAAc,YACrB,cAAc,QACd,OAAO,UAAU,WAAW,YAC5B,OAAO,UAAU,UAAU,YAC3B,OAAO,UAAU,UAAU,QAC/B;AACF;AAEA,SAAgB,UAAU,KAAe,OAAuB;CAC9D,MAAM,MAAM,IAAI,MAAM,IAAI,QAAQ,IAAI,OAAO;CAE7C,OAAO,OAAO,GAAG;AACnB;AAEA,SAAgB,cAAc,KAAuB;CACnD,OAAO,MAAM,QAAQ,IAAI,OAAO,IAAK,IAAI,UAAqB,CAAC;AACjE;AAEA,SAAgB,aAAa,KAA4B;CACvD,MAAM,SAAS,IAAI;CAEnB,OAAO,OAAO,WAAW,YAAY,WAAW,QAAQ,CAAC,MAAM,QAAQ,MAAM,IACxE,SACD;AACN"}
@@ -1,9 +1,9 @@
1
1
  import { ColumnWidth } from '../../types/generated.js';
2
- import { TableColumn, TableSort, TableState } from '../types.js';
3
- export declare function getColumnSort(state: TableState, column: TableColumn): TableSort | undefined;
2
+ import { TableColumn, TableSort, TableQuery } from '../types.js';
3
+ export declare function getColumnSort(query: TableQuery, column: TableColumn): TableSort | undefined;
4
4
  export declare function getColumnAriaSort(sort: TableSort | undefined): "ascending" | "descending" | undefined;
5
- export declare function buildEndpoint(endpoint: string, state: TableState): string;
6
- export declare function getQueryParams(state: TableState): Record<string, unknown>;
5
+ export declare function buildEndpoint(endpoint: string, query: TableQuery): string;
6
+ export declare function getQueryParams(query: TableQuery): Record<string, unknown>;
7
7
  export declare const VALUELESS_FILTER_OPERATORS: Set<string>;
8
8
  export declare function operatorLabel(operator: string): string;
9
9
  export declare function getSortDirectionLabel(direction: string): string;
@@ -14,7 +14,7 @@ export declare function getTableSizingColumns(columns: TableColumn[]): {
14
14
  label: string | null;
15
15
  width: ColumnWidth;
16
16
  }[];
17
- export declare function getTableUtilityTracks(hasActions: boolean, hasSelection: boolean): {
17
+ export declare function getTableUtilityTracks(hasActions: boolean, hasSelection: boolean, hasExpander?: boolean): {
18
18
  leadingTracks: string[];
19
19
  trailingTracks: string[];
20
20
  };
@@ -2,20 +2,21 @@ import { translate } from "../../i18n/instance.js";
2
2
  import "../../core/hooks/column-sizing.js";
3
3
  import { isEmptyMember } from "./filter-values.js";
4
4
  //#region resources/js/table/lib/query.ts
5
- function getColumnSort(state, column) {
6
- return state.sorts.find((currentSort) => currentSort.key === column.key);
5
+ function getColumnSort(query, column) {
6
+ return query.sorts.find((currentSort) => currentSort.key === column.key);
7
7
  }
8
8
  function getColumnAriaSort(sort) {
9
9
  if (sort?.direction === "asc") return "ascending";
10
10
  if (sort?.direction === "desc") return "descending";
11
11
  }
12
- function buildEndpoint(endpoint, state) {
12
+ function buildEndpoint(endpoint, query) {
13
13
  const url = new URL(endpoint, window.location.origin);
14
- if (state.filters.length > 0) url.searchParams.set("filter", serializeFilters(state));
15
- if (state.sorts.length > 0) url.searchParams.set("sort", serializeSorts(state));
16
- appendTableFilters(url, state.tableFilters);
17
- url.searchParams.set("page", String(state.page));
18
- url.searchParams.set("per_page", String(state.perPage));
14
+ if (query.filters.length > 0) url.searchParams.set("filter", serializeFilters(query));
15
+ if (query.sorts.length > 0) url.searchParams.set("sort", serializeSorts(query));
16
+ if (query.search !== "") url.searchParams.set("q", query.search);
17
+ appendTableFilters(url, query.tableFilters);
18
+ url.searchParams.set("page", String(query.page));
19
+ url.searchParams.set("per_page", String(query.perPage));
19
20
  return `${url.pathname}${url.search}`;
20
21
  }
21
22
  function appendTableFilters(url, tableFilters) {
@@ -58,19 +59,20 @@ function appendTableFilterParam(url, key, value) {
58
59
  }
59
60
  url.searchParams.append(key, String(value));
60
61
  }
61
- function getQueryParams(state) {
62
+ function getQueryParams(query) {
62
63
  const params = {};
63
- if (state.filters.length > 0) params.filter = serializeFilters(state);
64
- if (state.sorts.length > 0) params.sort = serializeSorts(state);
65
- const tableFilters = getTableFilterParams(state.tableFilters);
64
+ if (query.filters.length > 0) params.filter = serializeFilters(query);
65
+ if (query.sorts.length > 0) params.sort = serializeSorts(query);
66
+ const tableFilters = getTableFilterParams(query.tableFilters);
66
67
  if (Object.keys(tableFilters).length > 0) params.tf = tableFilters;
68
+ if (query.search !== "") params.q = query.search;
67
69
  return params;
68
70
  }
69
- function serializeFilters(state) {
70
- return state.filters.map((clause) => `${clause.field}:${clause.operator}:${encodeURIComponent(clause.value)}`).join(",");
71
+ function serializeFilters(query) {
72
+ return query.filters.map((clause) => `${clause.field}:${clause.operator}:${encodeURIComponent(clause.value)}`).join(",");
71
73
  }
72
- function serializeSorts(state) {
73
- return state.sorts.map((sort) => sort.direction === "desc" ? `-${sort.key}` : sort.key).join(",");
74
+ function serializeSorts(query) {
75
+ return query.sorts.map((sort) => sort.direction === "desc" ? `-${sort.key}` : sort.key).join(",");
74
76
  }
75
77
  var operatorLabels = {
76
78
  contains: "contains",
@@ -123,11 +125,11 @@ function getTableSizingColumns(columns) {
123
125
  }));
124
126
  }
125
127
  function columnWidthOrDefault(column) {
126
- return column.props.width ?? (column.type === "column.stack" ? "xl" : "md");
128
+ return column.props.width ?? "md";
127
129
  }
128
- function getTableUtilityTracks(hasActions, hasSelection) {
130
+ function getTableUtilityTracks(hasActions, hasSelection, hasExpander = false) {
129
131
  return {
130
- leadingTracks: hasSelection ? ["3rem"] : [],
132
+ leadingTracks: [...hasExpander ? ["2.5rem"] : [], ...hasSelection ? ["3rem"] : []],
131
133
  trailingTracks: hasActions ? ["10rem"] : []
132
134
  };
133
135
  }
@@ -1 +1 @@
1
- {"version":3,"file":"query.js","names":[],"sources":["../../../resources/js/table/lib/query.ts"],"sourcesContent":["import { translate } from \"@lattice-php/lattice/i18n\";\nimport { DEFAULT_COLUMN_WIDTH } from \"@lattice-php/lattice/core/hooks/column-sizing\";\nimport type { ColumnWidth } from \"@lattice-php/lattice/types/generated\";\nimport { isEmptyMember } from \"./filter-values\";\nimport type { TableColumn, TableSort, TableState } from \"@lattice-php/lattice/table/types\";\n\nexport function getColumnSort(state: TableState, column: TableColumn): TableSort | undefined {\n return state.sorts.find((currentSort) => currentSort.key === column.key);\n}\n\nexport function getColumnAriaSort(\n sort: TableSort | undefined,\n): \"ascending\" | \"descending\" | undefined {\n if (sort?.direction === \"asc\") {\n return \"ascending\";\n }\n\n if (sort?.direction === \"desc\") {\n return \"descending\";\n }\n\n return undefined;\n}\n\nexport function buildEndpoint(endpoint: string, state: TableState): string {\n const url = new URL(endpoint, window.location.origin);\n\n if (state.filters.length > 0) {\n url.searchParams.set(\"filter\", serializeFilters(state));\n }\n\n if (state.sorts.length > 0) {\n url.searchParams.set(\"sort\", serializeSorts(state));\n }\n\n appendTableFilters(url, state.tableFilters);\n\n url.searchParams.set(\"page\", String(state.page));\n url.searchParams.set(\"per_page\", String(state.perPage));\n\n return `${url.pathname}${url.search}`;\n}\n\nfunction appendTableFilters(url: URL, tableFilters: Record<string, unknown>): void {\n for (const [key, value] of Object.entries(getTableFilterParams(tableFilters))) {\n appendTableFilterParam(url, `tf[${key}]`, value);\n }\n}\n\nfunction getTableFilterParams(tableFilters: Record<string, unknown>): Record<string, unknown> {\n const params: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(tableFilters)) {\n const normalized = normalizeTableFilterValue(value);\n\n if (normalized !== undefined) {\n params[key] = normalized;\n }\n }\n\n return params;\n}\n\nfunction normalizeTableFilterValue(value: unknown): unknown | undefined {\n if (isEmptyMember(value) || Array.isArray(value) || typeof value !== \"object\") {\n return undefined;\n }\n\n const entries = Object.entries(value)\n .map(([subKey, subValue]) => [subKey, normalizeTableFilterMember(subValue)] as const)\n .filter((entry): entry is readonly [string, unknown] => entry[1] !== undefined);\n\n return entries.length > 0 ? Object.fromEntries(entries) : undefined;\n}\n\nfunction normalizeTableFilterMember(value: unknown): unknown | undefined {\n if (isEmptyMember(value)) {\n return undefined;\n }\n\n if (Array.isArray(value)) {\n const values = value.map(normalizeTableFilterMember).filter((item) => item !== undefined);\n\n return values.length > 0 ? values : undefined;\n }\n\n if (typeof value === \"object\") {\n if (value === null) {\n return undefined;\n }\n\n const entries = Object.entries(value)\n .map(([key, item]) => [key, normalizeTableFilterMember(item)] as const)\n .filter((entry): entry is readonly [string, unknown] => entry[1] !== undefined);\n\n return entries.length > 0 ? Object.fromEntries(entries) : undefined;\n }\n\n return String(value);\n}\n\nfunction appendTableFilterParam(url: URL, key: string, value: unknown): void {\n if (Array.isArray(value)) {\n for (const item of value) {\n appendTableFilterParam(url, `${key}[]`, item);\n }\n\n return;\n }\n\n if (typeof value === \"object\" && value !== null) {\n for (const [subKey, subValue] of Object.entries(value)) {\n appendTableFilterParam(url, `${key}[${subKey}]`, subValue);\n }\n\n return;\n }\n\n url.searchParams.append(key, String(value));\n}\n\nexport function getQueryParams(state: TableState): Record<string, unknown> {\n const params: Record<string, unknown> = {};\n\n if (state.filters.length > 0) {\n params.filter = serializeFilters(state);\n }\n\n if (state.sorts.length > 0) {\n params.sort = serializeSorts(state);\n }\n\n const tableFilters = getTableFilterParams(state.tableFilters);\n\n if (Object.keys(tableFilters).length > 0) {\n params.tf = tableFilters;\n }\n\n return params;\n}\n\nfunction serializeFilters(state: TableState): string {\n return state.filters\n .map((clause) => `${clause.field}:${clause.operator}:${encodeURIComponent(clause.value)}`)\n .join(\",\");\n}\n\nfunction serializeSorts(state: TableState): string {\n return state.sorts\n .map((sort) => (sort.direction === \"desc\" ? `-${sort.key}` : sort.key))\n .join(\",\");\n}\n\nconst operatorLabels: Record<string, string> = {\n contains: \"contains\",\n starts_with: \"starts with\",\n ends_with: \"ends with\",\n eq: \"equals\",\n neq: \"not equals\",\n gt: \">\",\n gte: \"≥\",\n lt: \"<\",\n lte: \"≤\",\n in: \"in\",\n not_in: \"not in\",\n before: \"before\",\n after: \"after\",\n empty: \"is empty\",\n filled: \"is not empty\",\n};\n\nexport const VALUELESS_FILTER_OPERATORS = new Set<string>([\"empty\", \"filled\"]);\n\nexport function operatorLabel(operator: string): string {\n return translate(\"lattice\", `table.operators.${operator}`, operatorLabels[operator] ?? operator);\n}\n\nexport function getSortDirectionLabel(direction: string): string {\n return direction === \"desc\" ? \"descending\" : \"ascending\";\n}\n\nexport function nextSort(sorts: TableSort[], column: TableColumn): TableSort[] {\n if (!column.props.sortable) {\n return sorts;\n }\n\n const currentSort = sorts.find((sort) => sort.key === column.key);\n const remainingSorts = sorts.filter((sort) => sort.key !== column.key);\n\n if (!currentSort) {\n return [...sorts, { key: column.key, direction: \"asc\" }];\n }\n\n if (currentSort.direction === \"asc\") {\n return [...remainingSorts, { key: column.key, direction: \"desc\" }];\n }\n\n return remainingSorts;\n}\n\nexport function getVisiblePages(currentPage: number, lastPage: number): number[] {\n if (lastPage <= 5) {\n return Array.from({ length: lastPage }, (_, index) => index + 1);\n }\n\n const start = Math.max(1, Math.min(currentPage - 2, lastPage - 4));\n\n return Array.from({ length: 5 }, (_, index) => start + index);\n}\n\nexport function getTableSizingColumns(columns: TableColumn[]) {\n return columns.map((column) => ({\n key: column.key,\n label: column.props.label,\n width: columnWidthOrDefault(column),\n }));\n}\n\nfunction columnWidthOrDefault(column: TableColumn): ColumnWidth {\n return (column.props.width ??\n (column.type === \"column.stack\" ? \"xl\" : DEFAULT_COLUMN_WIDTH)) as ColumnWidth;\n}\n\nexport function getTableUtilityTracks(hasActions: boolean, hasSelection: boolean) {\n // Utility tracks are fixed because the independent header/filter/body grids would drift with content-sized tracks.\n return {\n leadingTracks: hasSelection ? [\"3rem\"] : [],\n trailingTracks: hasActions ? [\"10rem\"] : [],\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"query.js","names":[],"sources":["../../../resources/js/table/lib/query.ts"],"sourcesContent":["import { translate } from \"@lattice-php/lattice/i18n\";\nimport { DEFAULT_COLUMN_WIDTH } from \"@lattice-php/lattice/core/hooks/column-sizing\";\nimport type { ColumnWidth } from \"@lattice-php/lattice/types/generated\";\nimport { isEmptyMember } from \"./filter-values\";\nimport type { TableColumn, TableSort, TableQuery } from \"@lattice-php/lattice/table/types\";\n\nexport function getColumnSort(query: TableQuery, column: TableColumn): TableSort | undefined {\n return query.sorts.find((currentSort) => currentSort.key === column.key);\n}\n\nexport function getColumnAriaSort(\n sort: TableSort | undefined,\n): \"ascending\" | \"descending\" | undefined {\n if (sort?.direction === \"asc\") {\n return \"ascending\";\n }\n\n if (sort?.direction === \"desc\") {\n return \"descending\";\n }\n\n return undefined;\n}\n\nexport function buildEndpoint(endpoint: string, query: TableQuery): string {\n const url = new URL(endpoint, window.location.origin);\n\n if (query.filters.length > 0) {\n url.searchParams.set(\"filter\", serializeFilters(query));\n }\n\n if (query.sorts.length > 0) {\n url.searchParams.set(\"sort\", serializeSorts(query));\n }\n\n if (query.search !== \"\") {\n url.searchParams.set(\"q\", query.search);\n }\n\n appendTableFilters(url, query.tableFilters);\n\n url.searchParams.set(\"page\", String(query.page));\n url.searchParams.set(\"per_page\", String(query.perPage));\n\n return `${url.pathname}${url.search}`;\n}\n\nfunction appendTableFilters(url: URL, tableFilters: Record<string, unknown>): void {\n for (const [key, value] of Object.entries(getTableFilterParams(tableFilters))) {\n appendTableFilterParam(url, `tf[${key}]`, value);\n }\n}\n\nfunction getTableFilterParams(tableFilters: Record<string, unknown>): Record<string, unknown> {\n const params: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(tableFilters)) {\n const normalized = normalizeTableFilterValue(value);\n\n if (normalized !== undefined) {\n params[key] = normalized;\n }\n }\n\n return params;\n}\n\nfunction normalizeTableFilterValue(value: unknown): unknown | undefined {\n if (isEmptyMember(value) || Array.isArray(value) || typeof value !== \"object\") {\n return undefined;\n }\n\n const entries = Object.entries(value)\n .map(([subKey, subValue]) => [subKey, normalizeTableFilterMember(subValue)] as const)\n .filter((entry): entry is readonly [string, unknown] => entry[1] !== undefined);\n\n return entries.length > 0 ? Object.fromEntries(entries) : undefined;\n}\n\nfunction normalizeTableFilterMember(value: unknown): unknown | undefined {\n if (isEmptyMember(value)) {\n return undefined;\n }\n\n if (Array.isArray(value)) {\n const values = value.map(normalizeTableFilterMember).filter((item) => item !== undefined);\n\n return values.length > 0 ? values : undefined;\n }\n\n if (typeof value === \"object\") {\n if (value === null) {\n return undefined;\n }\n\n const entries = Object.entries(value)\n .map(([key, item]) => [key, normalizeTableFilterMember(item)] as const)\n .filter((entry): entry is readonly [string, unknown] => entry[1] !== undefined);\n\n return entries.length > 0 ? Object.fromEntries(entries) : undefined;\n }\n\n return String(value);\n}\n\nfunction appendTableFilterParam(url: URL, key: string, value: unknown): void {\n if (Array.isArray(value)) {\n for (const item of value) {\n appendTableFilterParam(url, `${key}[]`, item);\n }\n\n return;\n }\n\n if (typeof value === \"object\" && value !== null) {\n for (const [subKey, subValue] of Object.entries(value)) {\n appendTableFilterParam(url, `${key}[${subKey}]`, subValue);\n }\n\n return;\n }\n\n url.searchParams.append(key, String(value));\n}\n\nexport function getQueryParams(query: TableQuery): Record<string, unknown> {\n const params: Record<string, unknown> = {};\n\n if (query.filters.length > 0) {\n params.filter = serializeFilters(query);\n }\n\n if (query.sorts.length > 0) {\n params.sort = serializeSorts(query);\n }\n\n const tableFilters = getTableFilterParams(query.tableFilters);\n\n if (Object.keys(tableFilters).length > 0) {\n params.tf = tableFilters;\n }\n\n if (query.search !== \"\") {\n params.q = query.search;\n }\n\n return params;\n}\n\nfunction serializeFilters(query: TableQuery): string {\n return query.filters\n .map((clause) => `${clause.field}:${clause.operator}:${encodeURIComponent(clause.value)}`)\n .join(\",\");\n}\n\nfunction serializeSorts(query: TableQuery): string {\n return query.sorts\n .map((sort) => (sort.direction === \"desc\" ? `-${sort.key}` : sort.key))\n .join(\",\");\n}\n\nconst operatorLabels: Record<string, string> = {\n contains: \"contains\",\n starts_with: \"starts with\",\n ends_with: \"ends with\",\n eq: \"equals\",\n neq: \"not equals\",\n gt: \">\",\n gte: \"≥\",\n lt: \"<\",\n lte: \"≤\",\n in: \"in\",\n not_in: \"not in\",\n before: \"before\",\n after: \"after\",\n empty: \"is empty\",\n filled: \"is not empty\",\n};\n\nexport const VALUELESS_FILTER_OPERATORS = new Set<string>([\"empty\", \"filled\"]);\n\nexport function operatorLabel(operator: string): string {\n return translate(\"lattice\", `table.operators.${operator}`, operatorLabels[operator] ?? operator);\n}\n\nexport function getSortDirectionLabel(direction: string): string {\n return direction === \"desc\" ? \"descending\" : \"ascending\";\n}\n\nexport function nextSort(sorts: TableSort[], column: TableColumn): TableSort[] {\n if (!column.props.sortable) {\n return sorts;\n }\n\n const currentSort = sorts.find((sort) => sort.key === column.key);\n const remainingSorts = sorts.filter((sort) => sort.key !== column.key);\n\n if (!currentSort) {\n return [...sorts, { key: column.key, direction: \"asc\" }];\n }\n\n if (currentSort.direction === \"asc\") {\n return [...remainingSorts, { key: column.key, direction: \"desc\" }];\n }\n\n return remainingSorts;\n}\n\nexport function getVisiblePages(currentPage: number, lastPage: number): number[] {\n if (lastPage <= 5) {\n return Array.from({ length: lastPage }, (_, index) => index + 1);\n }\n\n const start = Math.max(1, Math.min(currentPage - 2, lastPage - 4));\n\n return Array.from({ length: 5 }, (_, index) => start + index);\n}\n\nexport function getTableSizingColumns(columns: TableColumn[]) {\n return columns.map((column) => ({\n key: column.key,\n label: column.props.label,\n width: columnWidthOrDefault(column),\n }));\n}\n\nfunction columnWidthOrDefault(column: TableColumn): ColumnWidth {\n return (column.props.width ?? DEFAULT_COLUMN_WIDTH) as ColumnWidth;\n}\n\nexport function getTableUtilityTracks(\n hasActions: boolean,\n hasSelection: boolean,\n hasExpander = false,\n) {\n // Utility tracks are fixed because the independent header/filter/body grids would drift with content-sized tracks.\n return {\n leadingTracks: [...(hasExpander ? [\"2.5rem\"] : []), ...(hasSelection ? [\"3rem\"] : [])],\n trailingTracks: hasActions ? [\"10rem\"] : [],\n };\n}\n"],"mappings":"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"}
@@ -1,2 +1 @@
1
- export type TableComponentType = "table";
2
1
  export declare const tableComponents: import('../core/registry.js').Plugin;
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","names":[],"sources":["../../resources/js/table/plugin.ts"],"sourcesContent":["import {\n createPlugin,\n eagerComponent,\n type ComponentRegistryFor,\n} from \"@lattice-php/lattice/core/registry\";\nimport type { RendererComponent } from \"@lattice-php/lattice/core/types\";\nimport TableComponent from \"./components/table\";\n\nexport type TableComponentType = \"table\";\n\n// The table renders an enriched TableNode (rows/pagination/state the server\n// hydrates onto it); the registry erases per-component node types here.\nexport const tableComponents = createPlugin({\n components: {\n table: eagerComponent(TableComponent as unknown as RendererComponent<\"table\">),\n } satisfies ComponentRegistryFor<TableComponentType>,\n name: \"lattice/table\",\n});\n"],"mappings":";;;AAYA,IAAa,kBAAkB,aAAa;CAC1C,YAAY,EACV,OAAO,eAAe,cAAuD,EAC/E;CACA,MAAM;AACR,CAAC"}
1
+ {"version":3,"file":"plugin.js","names":[],"sources":["../../resources/js/table/plugin.ts"],"sourcesContent":["import {\n createPlugin,\n eagerComponent,\n type ComponentRegistryFor,\n} from \"@lattice-php/lattice/core/registry\";\nimport type { TableNodeType } from \"@lattice-php/lattice/types/generated\";\nimport type { RendererComponent } from \"@lattice-php/lattice/core/types\";\nimport TableComponent from \"./components/table\";\n\n// The table renders an enriched TableNode (rows/pagination/state the server\n// hydrates onto it); the registry erases per-component node types here.\nexport const tableComponents = createPlugin({\n components: {\n table: eagerComponent(TableComponent as unknown as RendererComponent<\"table\">),\n } satisfies ComponentRegistryFor<TableNodeType>,\n name: \"lattice/table\",\n});\n"],"mappings":";;;AAWA,IAAa,kBAAkB,aAAa;CAC1C,YAAY,EACV,OAAO,eAAe,cAAuD,EAC/E;CACA,MAAM;AACR,CAAC"}