@lattice-php/lattice 0.17.2 → 0.19.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 (748) hide show
  1. package/README.md +1 -1
  2. package/dist/action/components/action-form.d.ts +2 -2
  3. package/dist/action/components/action-form.js +11 -11
  4. package/dist/action/components/action-form.js.map +1 -1
  5. package/dist/action/components/action-group.d.ts +1 -1
  6. package/dist/action/components/action-group.js +6 -4
  7. package/dist/action/components/action-group.js.map +1 -1
  8. package/dist/action/components/action-trigger-provider.d.ts +10 -0
  9. package/dist/action/components/action-trigger-provider.js +24 -0
  10. package/dist/action/components/action-trigger-provider.js.map +1 -0
  11. package/dist/action/components/action.d.ts +1 -1
  12. package/dist/action/components/action.js +4 -4
  13. package/dist/action/components/action.js.map +1 -1
  14. package/dist/action/{use-action.d.ts → hooks/use-action.d.ts} +1 -1
  15. package/dist/action/{use-action.js → hooks/use-action.js} +7 -7
  16. package/dist/action/hooks/use-action.js.map +1 -0
  17. package/dist/action/index.d.ts +10 -1
  18. package/dist/action/index.js +8 -13
  19. package/dist/action/{run-action.d.ts → lib/run-action.d.ts} +1 -1
  20. package/dist/action/{run-action.js → lib/run-action.js} +2 -2
  21. package/dist/action/lib/run-action.js.map +1 -0
  22. package/dist/action/plugin.d.ts +1 -0
  23. package/dist/action/plugin.js +15 -0
  24. package/dist/action/plugin.js.map +1 -0
  25. package/dist/appearance/index.d.ts +4 -1
  26. package/dist/appearance/index.js +11 -2
  27. package/dist/appearance/index.js.map +1 -1
  28. package/dist/chat/components/chat-box.d.ts +1 -1
  29. package/dist/chat/components/chat-box.js +2 -2
  30. package/dist/chat/components/chat-box.js.map +1 -1
  31. package/dist/chat/components/message-list.d.ts +1 -1
  32. package/dist/chat/components/message-list.js.map +1 -1
  33. package/dist/chat/components/message.d.ts +1 -1
  34. package/dist/chat/components/message.js.map +1 -1
  35. package/dist/chat/components/prompt-input.js +1 -1
  36. package/dist/chat/components/prompt-input.js.map +1 -1
  37. package/dist/chat/{use-chat.d.ts → hooks/use-chat.d.ts} +1 -1
  38. package/dist/chat/{use-chat.js → hooks/use-chat.js} +2 -2
  39. package/dist/chat/hooks/use-chat.js.map +1 -0
  40. package/dist/chat/index.d.ts +4 -1
  41. package/dist/chat/index.js +3 -17
  42. package/dist/chat/{transport.d.ts → lib/transport.d.ts} +2 -2
  43. package/dist/chat/{transport.js → lib/transport.js} +2 -2
  44. package/dist/chat/lib/transport.js.map +1 -0
  45. package/dist/chat/parts/text.d.ts +1 -1
  46. package/dist/chat/parts/tool-call.d.ts +1 -1
  47. package/dist/chat/plugin.d.ts +2 -0
  48. package/dist/chat/plugin.js +17 -0
  49. package/dist/chat/plugin.js.map +1 -0
  50. package/dist/chat/types.d.ts +2 -2
  51. package/dist/clipboard/index.d.ts +1 -2
  52. package/dist/clipboard/index.js +1 -10
  53. package/dist/clipboard/index.js.map +1 -1
  54. package/dist/core/api.d.ts +1 -1
  55. package/dist/core/api.js.map +1 -1
  56. package/dist/core/headers.js.map +1 -1
  57. package/dist/core/{column-sizing.d.ts → hooks/column-sizing.d.ts} +2 -2
  58. package/dist/core/{column-sizing.js → hooks/column-sizing.js} +1 -1
  59. package/dist/core/hooks/column-sizing.js.map +1 -0
  60. package/dist/core/{use-column-resizing.d.ts → hooks/use-column-resizing.d.ts} +2 -1
  61. package/dist/core/{use-column-resizing.js → hooks/use-column-resizing.js} +59 -31
  62. package/dist/core/hooks/use-column-resizing.js.map +1 -0
  63. package/dist/core/index.d.ts +13 -0
  64. package/dist/core/index.js +10 -0
  65. package/dist/core/materialize.d.ts +9 -0
  66. package/dist/core/materialize.js +39 -0
  67. package/dist/core/materialize.js.map +1 -0
  68. package/dist/core/nodes.d.ts +6 -1
  69. package/dist/core/nodes.js +8 -1
  70. package/dist/core/nodes.js.map +1 -1
  71. package/dist/core/registry-context.d.ts +3 -3
  72. package/dist/core/registry-context.js.map +1 -1
  73. package/dist/core/registry.d.ts +5 -3
  74. package/dist/core/registry.js.map +1 -1
  75. package/dist/core/renderer.d.ts +1 -1
  76. package/dist/core/renderer.js +4 -6
  77. package/dist/core/renderer.js.map +1 -1
  78. package/dist/core/test-id.d.ts +1 -1
  79. package/dist/core/types.d.ts +1 -1
  80. package/dist/create-app.d.ts +3 -3
  81. package/dist/effects/dispatch.d.ts +2 -2
  82. package/dist/effects/registry.d.ts +4 -3
  83. package/dist/effects/registry.js +7 -7
  84. package/dist/effects/registry.js.map +1 -1
  85. package/dist/effects/use-effect-dispatcher.d.ts +1 -1
  86. package/dist/{events/event-bridge.d.ts → event-bridge.d.ts} +2 -3
  87. package/dist/{events/event-bridge.js → event-bridge.js} +4 -11
  88. package/dist/event-bridge.js.map +1 -0
  89. package/dist/events/event-names.d.ts +0 -3
  90. package/dist/events/event-names.js +0 -3
  91. package/dist/events/event-names.js.map +1 -1
  92. package/dist/form/components/base/field.d.ts +1 -1
  93. package/dist/form/components/base/field.js +5 -5
  94. package/dist/form/components/base/field.js.map +1 -1
  95. package/dist/form/components/base/submit-button.d.ts +1 -1
  96. package/dist/form/components/base/submit-button.js +3 -3
  97. package/dist/form/components/base/submit-button.js.map +1 -1
  98. package/dist/form/components/fields/{block-add-menu.d.ts → add-row-menu.d.ts} +3 -3
  99. package/dist/form/components/fields/{block-add-menu.js → add-row-menu.js} +10 -10
  100. package/dist/form/components/fields/add-row-menu.js.map +1 -0
  101. package/dist/form/components/fields/builder.d.ts +1 -1
  102. package/dist/form/components/fields/builder.js +80 -75
  103. package/dist/form/components/fields/builder.js.map +1 -1
  104. package/dist/form/components/fields/checkbox.d.ts +1 -1
  105. package/dist/form/components/fields/checkbox.js +12 -9
  106. package/dist/form/components/fields/checkbox.js.map +1 -1
  107. package/dist/form/components/fields/choice.d.ts +1 -1
  108. package/dist/form/components/fields/choice.js +4 -4
  109. package/dist/form/components/fields/choice.js.map +1 -1
  110. package/dist/form/components/fields/date-input.d.ts +1 -1
  111. package/dist/form/components/fields/date-picker-field.js +2 -2
  112. package/dist/form/components/fields/date-picker-field.js.map +1 -1
  113. package/dist/form/components/fields/date-picker.d.ts +1 -1
  114. package/dist/form/components/fields/date-time-input.d.ts +1 -1
  115. package/dist/form/components/fields/file-upload.d.ts +1 -1
  116. package/dist/form/components/fields/file-upload.js +4 -4
  117. package/dist/form/components/fields/file-upload.js.map +1 -1
  118. package/dist/form/components/fields/hidden-input.d.ts +1 -1
  119. package/dist/form/components/fields/hidden-input.js +1 -1
  120. package/dist/form/components/fields/hidden-input.js.map +1 -1
  121. package/dist/form/components/fields/number-input.d.ts +1 -1
  122. package/dist/form/components/fields/number-input.js +2 -2
  123. package/dist/form/components/fields/number-input.js.map +1 -1
  124. package/dist/form/components/fields/otp-input.d.ts +1 -1
  125. package/dist/form/components/fields/otp-input.js +1 -1
  126. package/dist/form/components/fields/otp-input.js.map +1 -1
  127. package/dist/form/components/fields/password-input.d.ts +1 -1
  128. package/dist/form/components/fields/password-input.js +6 -6
  129. package/dist/form/components/fields/password-input.js.map +1 -1
  130. package/dist/form/components/fields/repeater-rows.d.ts +6 -1
  131. package/dist/form/components/fields/repeater-rows.js +9 -5
  132. package/dist/form/components/fields/repeater-rows.js.map +1 -1
  133. package/dist/form/components/fields/repeater.d.ts +1 -1
  134. package/dist/form/components/fields/repeater.js +57 -48
  135. package/dist/form/components/fields/repeater.js.map +1 -1
  136. package/dist/form/components/fields/rich-editor-field.d.ts +1 -1
  137. package/dist/form/components/fields/rich-editor-field.js +8 -6
  138. package/dist/form/components/fields/rich-editor-field.js.map +1 -1
  139. package/dist/form/components/fields/rich-editor.d.ts +1 -1
  140. package/dist/form/components/fields/row-action-menu.d.ts +2 -2
  141. package/dist/form/components/fields/row-actions.js +1 -1
  142. package/dist/form/components/fields/row-actions.js.map +1 -1
  143. package/dist/form/components/fields/row-item.d.ts +3 -3
  144. package/dist/form/components/fields/row-item.js +3 -2
  145. package/dist/form/components/fields/row-item.js.map +1 -1
  146. package/dist/form/components/fields/row-key-inputs.d.ts +7 -0
  147. package/dist/form/components/fields/row-key-inputs.js +16 -0
  148. package/dist/form/components/fields/row-key-inputs.js.map +1 -0
  149. package/dist/form/components/fields/row-templates.d.ts +9 -0
  150. package/dist/form/components/fields/row-templates.js +14 -0
  151. package/dist/form/components/fields/row-templates.js.map +1 -0
  152. package/dist/form/components/fields/select.d.ts +1 -1
  153. package/dist/form/components/fields/select.js +23 -13
  154. package/dist/form/components/fields/select.js.map +1 -1
  155. package/dist/form/components/fields/simple-field.d.ts +2 -2
  156. package/dist/form/components/fields/simple-field.js +2 -2
  157. package/dist/form/components/fields/simple-field.js.map +1 -1
  158. package/dist/form/components/fields/table-rows.d.ts +3 -3
  159. package/dist/form/components/fields/table-rows.js +13 -13
  160. package/dist/form/components/fields/table-rows.js.map +1 -1
  161. package/dist/form/components/fields/text-input.d.ts +1 -1
  162. package/dist/form/components/fields/text-input.js +2 -2
  163. package/dist/form/components/fields/text-input.js.map +1 -1
  164. package/dist/form/components/fields/textarea.d.ts +1 -1
  165. package/dist/form/components/fields/textarea.js +1 -1
  166. package/dist/form/components/fields/textarea.js.map +1 -1
  167. package/dist/form/components/fields/time-input.d.ts +1 -1
  168. package/dist/form/components/fields/time-input.js +3 -3
  169. package/dist/form/components/fields/time-input.js.map +1 -1
  170. package/dist/form/components/fields/time-picker.d.ts +1 -1
  171. package/dist/form/components/fields/toggle.d.ts +1 -1
  172. package/dist/form/components/fields/toggle.js +10 -9
  173. package/dist/form/components/fields/toggle.js.map +1 -1
  174. package/dist/form/components/fields/use-row-collection.d.ts +1 -1
  175. package/dist/form/components/fields/use-row-collection.js +2 -2
  176. package/dist/form/components/fields/use-row-collection.js.map +1 -1
  177. package/dist/form/components/form.d.ts +1 -1
  178. package/dist/form/components/form.js +6 -6
  179. package/dist/form/components/form.js.map +1 -1
  180. package/dist/form/components/index.d.ts +17 -17
  181. package/dist/form/embed.d.ts +17 -0
  182. package/dist/form/embed.js +10 -0
  183. package/dist/form/{components → hooks}/context.d.ts +3 -0
  184. package/dist/form/{components → hooks}/context.js +2 -1
  185. package/dist/form/hooks/context.js.map +1 -0
  186. package/dist/form/{components → hooks}/field-scope.js +3 -3
  187. package/dist/form/hooks/field-scope.js.map +1 -0
  188. package/dist/form/{components → hooks}/prefill-context.js +1 -1
  189. package/dist/form/hooks/prefill-context.js.map +1 -0
  190. package/dist/form/{components → hooks}/resolved-nodes.d.ts +1 -1
  191. package/dist/form/{components → hooks}/resolved-nodes.js +2 -2
  192. package/dist/form/hooks/resolved-nodes.js.map +1 -0
  193. package/dist/form/{components → hooks}/row-layout-context.js +1 -1
  194. package/dist/form/hooks/row-layout-context.js.map +1 -0
  195. package/dist/form/{components → hooks}/use-controlled-field.d.ts +2 -2
  196. package/dist/form/{components → hooks}/use-controlled-field.js +6 -5
  197. package/dist/form/hooks/use-controlled-field.js.map +1 -0
  198. package/dist/form/hooks/use-dependent-field.d.ts +3 -0
  199. package/dist/form/{components → hooks}/use-dependent-field.js +6 -6
  200. package/dist/form/hooks/use-dependent-field.js.map +1 -0
  201. package/dist/form/{components → hooks}/use-field-commit.d.ts +5 -0
  202. package/dist/form/{components → hooks}/use-field-commit.js +9 -2
  203. package/dist/form/hooks/use-field-commit.js.map +1 -0
  204. package/dist/form/{components → hooks}/use-form-resolver.d.ts +2 -2
  205. package/dist/form/{components → hooks}/use-form-resolver.js +5 -5
  206. package/dist/form/hooks/use-form-resolver.js.map +1 -0
  207. package/dist/form/{components → hooks}/use-seed-default.js +1 -1
  208. package/dist/form/hooks/use-seed-default.js.map +1 -0
  209. package/dist/form/{components → hooks}/values.d.ts +3 -1
  210. package/dist/form/hooks/values.js +136 -0
  211. package/dist/form/hooks/values.js.map +1 -0
  212. package/dist/form/index.d.ts +4 -1
  213. package/dist/form/index.js +3 -30
  214. package/dist/form/{components → lib}/conditions.d.ts +2 -1
  215. package/dist/form/{components → lib}/conditions.js +12 -2
  216. package/dist/form/lib/conditions.js.map +1 -0
  217. package/dist/form/lib/field-dom-name.d.ts +1 -0
  218. package/dist/form/lib/field-dom-name.js +10 -0
  219. package/dist/form/lib/field-dom-name.js.map +1 -0
  220. package/dist/form/{components → lib}/field-props.d.ts +2 -3
  221. package/dist/form/{components → lib}/field-props.js +1 -1
  222. package/dist/form/lib/field-props.js.map +1 -0
  223. package/dist/form/{components → lib}/form-path.js +1 -1
  224. package/dist/form/lib/form-path.js.map +1 -0
  225. package/dist/form/{components → lib}/form-transport.d.ts +1 -1
  226. package/dist/form/lib/form-transport.js +21 -0
  227. package/dist/form/lib/form-transport.js.map +1 -0
  228. package/dist/form/lib/override-keys.js +12 -0
  229. package/dist/form/lib/override-keys.js.map +1 -0
  230. package/dist/form/{components → lib}/prefill-targets.d.ts +2 -2
  231. package/dist/form/{components → lib}/prefill-targets.js +4 -5
  232. package/dist/form/lib/prefill-targets.js.map +1 -0
  233. package/dist/form/plugin.d.ts +1 -0
  234. package/dist/form/plugin.js +47 -0
  235. package/dist/form/plugin.js.map +1 -0
  236. package/dist/form/toolkit.d.ts +17 -0
  237. package/dist/form/toolkit.js +14 -0
  238. package/dist/form/{components/types.d.ts → types.d.ts} +3 -3
  239. package/dist/format/number.d.ts +1 -1
  240. package/dist/format/value.d.ts +1 -1
  241. package/dist/i18n/backend.d.ts +1 -1
  242. package/dist/i18n/config.d.ts +1 -1
  243. package/dist/i18n/index.d.ts +13 -13
  244. package/dist/i18n/locale-reload.js +1 -1
  245. package/dist/i18n/locale-reload.js.map +1 -1
  246. package/dist/i18n/locale.js.map +1 -1
  247. package/dist/i18n/page-props.d.ts +1 -1
  248. package/dist/i18n/timezone.js.map +1 -1
  249. package/dist/i18n/translatable.d.ts +1 -1
  250. package/dist/icons/icon-renderer.js.map +1 -1
  251. package/dist/icons/index.d.ts +4 -4
  252. package/dist/icons/sprite.js.map +1 -1
  253. package/dist/index.d.ts +37 -38
  254. package/dist/index.js +10 -9
  255. package/dist/inertia.js +1 -1
  256. package/dist/lattice.css +12 -10
  257. package/dist/layout/{breadcrumbs.d.ts → components/breadcrumbs.d.ts} +1 -1
  258. package/dist/layout/{breadcrumbs.js → components/breadcrumbs.js} +2 -2
  259. package/dist/layout/components/breadcrumbs.js.map +1 -0
  260. package/dist/layout/{callouts.d.ts → components/callouts.d.ts} +1 -1
  261. package/dist/layout/{callouts.js → components/callouts.js} +7 -7
  262. package/dist/layout/components/callouts.js.map +1 -0
  263. package/dist/layout/{dropdown.d.ts → components/dropdown.d.ts} +1 -1
  264. package/dist/layout/{dropdown.js → components/dropdown.js} +2 -2
  265. package/dist/layout/components/dropdown.js.map +1 -0
  266. package/dist/layout/{menu-item.d.ts → components/menu-item.d.ts} +1 -1
  267. package/dist/layout/{menu-item.js → components/menu-item.js} +9 -8
  268. package/dist/layout/components/menu-item.js.map +1 -0
  269. package/dist/layout/{menu.d.ts → components/menu.d.ts} +1 -1
  270. package/dist/layout/{menu.js → components/menu.js} +2 -2
  271. package/dist/layout/components/menu.js.map +1 -0
  272. package/dist/layout/{outlet.d.ts → components/outlet.d.ts} +1 -1
  273. package/dist/layout/{outlet.js → components/outlet.js} +2 -2
  274. package/dist/layout/components/outlet.js.map +1 -0
  275. package/dist/layout/{popover.js → components/popover.js} +4 -4
  276. package/dist/layout/components/popover.js.map +1 -0
  277. package/dist/layout/{schema-layout.js → components/schema-layout.js} +3 -3
  278. package/dist/layout/components/schema-layout.js.map +1 -0
  279. package/dist/layout/{sidebar.d.ts → components/sidebar.d.ts} +1 -1
  280. package/dist/layout/{sidebar.js → components/sidebar.js} +5 -5
  281. package/dist/layout/components/sidebar.js.map +1 -0
  282. package/dist/layout/{topbar.d.ts → components/topbar.d.ts} +1 -1
  283. package/dist/layout/{topbar.js → components/topbar.js} +3 -3
  284. package/dist/layout/components/topbar.js.map +1 -0
  285. package/dist/layout/{context.d.ts → hooks/context.d.ts} +1 -1
  286. package/dist/layout/{context.js → hooks/context.js} +2 -2
  287. package/dist/layout/hooks/context.js.map +1 -0
  288. package/dist/layout/index.d.ts +4 -4
  289. package/dist/layout/index.js +4 -4
  290. package/dist/layout/plugin.d.ts +2 -0
  291. package/dist/layout/{components.js → plugin.js} +10 -10
  292. package/dist/layout/plugin.js.map +1 -0
  293. package/dist/notifications/api.d.ts +1 -1
  294. package/dist/notifications/components/notification-item.d.ts +1 -1
  295. package/dist/notifications/components/notification-item.js.map +1 -1
  296. package/dist/notifications/components/notification-list.d.ts +2 -2
  297. package/dist/notifications/components/notification-list.js +1 -1
  298. package/dist/notifications/components/notification-list.js.map +1 -1
  299. package/dist/notifications/components/notifications-echo.d.ts +1 -1
  300. package/dist/notifications/components/notifications-echo.js.map +1 -1
  301. package/dist/notifications/components/notifications.d.ts +1 -1
  302. package/dist/notifications/components/notifications.js +3 -3
  303. package/dist/notifications/components/notifications.js.map +1 -1
  304. package/dist/notifications/index.d.ts +2 -1
  305. package/dist/notifications/index.js +1 -10
  306. package/dist/notifications/plugin.d.ts +2 -0
  307. package/dist/notifications/plugin.js +11 -0
  308. package/dist/notifications/plugin.js.map +1 -0
  309. package/dist/notifications/store.d.ts +1 -1
  310. package/dist/notifications/types.d.ts +1 -1
  311. package/dist/page.d.ts +1 -1
  312. package/dist/provider-base.d.ts +2 -2
  313. package/dist/provider-base.js +5 -4
  314. package/dist/provider-base.js.map +1 -1
  315. package/dist/provider.d.ts +3 -3
  316. package/dist/realtime/build-effects.d.ts +2 -2
  317. package/dist/realtime/listeners.d.ts +1 -1
  318. package/dist/realtime/subscriptions.d.ts +1 -1
  319. package/dist/registry.d.ts +1 -1
  320. package/dist/registry.js +9 -9
  321. package/dist/registry.js.map +1 -1
  322. package/dist/remote/components/data-list.d.ts +2 -2
  323. package/dist/remote/components/data-list.js +1 -34
  324. package/dist/remote/components/data-list.js.map +1 -1
  325. package/dist/remote/index.d.ts +1 -1
  326. package/dist/remote/index.js +1 -10
  327. package/dist/remote/plugin.d.ts +2 -0
  328. package/dist/remote/plugin.js +11 -0
  329. package/dist/remote/plugin.js.map +1 -0
  330. package/dist/table/components/bulk-bar.d.ts +1 -1
  331. package/dist/table/components/bulk-bar.js +4 -4
  332. package/dist/table/components/bulk-bar.js.map +1 -1
  333. package/dist/table/components/cells/badge-cell.d.ts +1 -1
  334. package/dist/table/components/cells/badge-cell.js +1 -1
  335. package/dist/table/components/cells/badge-cell.js.map +1 -1
  336. package/dist/table/components/cells/boolean-cell.d.ts +1 -1
  337. package/dist/table/components/cells/boolean-cell.js.map +1 -1
  338. package/dist/table/components/cells/icon-cell.d.ts +1 -1
  339. package/dist/table/components/cells/icon-cell.js.map +1 -1
  340. package/dist/table/components/cells/image-cell.d.ts +1 -1
  341. package/dist/table/components/cells/image-cell.js +1 -1
  342. package/dist/table/components/cells/image-cell.js.map +1 -1
  343. package/dist/table/components/cells/money-cell.d.ts +1 -1
  344. package/dist/table/components/cells/money-cell.js +1 -1
  345. package/dist/table/components/cells/money-cell.js.map +1 -1
  346. package/dist/table/components/cells/number-cell.d.ts +1 -1
  347. package/dist/table/components/cells/number-cell.js +1 -1
  348. package/dist/table/components/cells/number-cell.js.map +1 -1
  349. package/dist/table/components/cells/stack-cell.d.ts +1 -1
  350. package/dist/table/components/cells/stack-cell.js +3 -7
  351. package/dist/table/components/cells/stack-cell.js.map +1 -1
  352. package/dist/table/components/cells/text-cell.d.ts +1 -1
  353. package/dist/table/components/cells/text-cell.js +4 -4
  354. package/dist/table/components/cells/text-cell.js.map +1 -1
  355. package/dist/table/components/column-filter-control.d.ts +3 -3
  356. package/dist/table/components/column-filter-control.js +34 -19
  357. package/dist/table/components/column-filter-control.js.map +1 -1
  358. package/dist/table/components/column-header.d.ts +1 -1
  359. package/dist/table/components/column-header.js +7 -7
  360. package/dist/table/components/column-header.js.map +1 -1
  361. package/dist/table/components/column-visibility-menu.d.ts +1 -1
  362. package/dist/table/components/column-visibility-menu.js +3 -3
  363. package/dist/table/components/column-visibility-menu.js.map +1 -1
  364. package/dist/table/components/filter-bar.d.ts +9 -7
  365. package/dist/table/components/filter-bar.js +62 -52
  366. package/dist/table/components/filter-bar.js.map +1 -1
  367. package/dist/table/components/filter-controls.d.ts +5 -9
  368. package/dist/table/components/filter-controls.js +96 -224
  369. package/dist/table/components/filter-controls.js.map +1 -1
  370. package/dist/table/components/filter-value-input.d.ts +1 -1
  371. package/dist/table/components/filter-value-input.js +1 -1
  372. package/dist/table/components/filter-value-input.js.map +1 -1
  373. package/dist/table/components/pagination.d.ts +2 -2
  374. package/dist/table/components/pagination.js.map +1 -1
  375. package/dist/table/components/sort-bar.d.ts +1 -1
  376. package/dist/table/components/sort-bar.js +2 -2
  377. package/dist/table/components/sort-bar.js.map +1 -1
  378. package/dist/table/components/table-action-node.d.ts +1 -1
  379. package/dist/table/components/table-action-node.js +1 -1
  380. package/dist/table/components/table-action-node.js.map +1 -1
  381. package/dist/table/components/table-cell.d.ts +1 -1
  382. package/dist/table/components/table-cell.js +2 -2
  383. package/dist/table/components/table-cell.js.map +1 -1
  384. package/dist/table/components/table.d.ts +1 -1
  385. package/dist/table/components/table.js +23 -31
  386. package/dist/table/components/table.js.map +1 -1
  387. package/dist/{core → table/hooks}/use-column-visibility.d.ts +5 -3
  388. package/dist/{core → table/hooks}/use-column-visibility.js +4 -4
  389. package/dist/table/hooks/use-column-visibility.js.map +1 -0
  390. package/dist/table/{use-table-selection.js → hooks/use-table-selection.js} +1 -1
  391. package/dist/table/hooks/use-table-selection.js.map +1 -0
  392. package/dist/table/{use-table.d.ts → hooks/use-table.d.ts} +7 -7
  393. package/dist/table/{use-table.js → hooks/use-table.js} +12 -9
  394. package/dist/table/hooks/use-table.js.map +1 -0
  395. package/dist/table/index.d.ts +6 -1
  396. package/dist/table/index.js +5 -11
  397. package/dist/table/{align.d.ts → lib/align.d.ts} +1 -1
  398. package/dist/table/{align.js → lib/align.js} +1 -1
  399. package/dist/table/lib/align.js.map +1 -0
  400. package/dist/table/{bulk.d.ts → lib/bulk.d.ts} +3 -3
  401. package/dist/table/{bulk.js → lib/bulk.js} +1 -1
  402. package/dist/table/lib/bulk.js.map +1 -0
  403. package/dist/table/{filter-values.d.ts → lib/filter-values.d.ts} +10 -3
  404. package/dist/table/{filter-values.js → lib/filter-values.js} +14 -4
  405. package/dist/table/lib/filter-values.js.map +1 -0
  406. package/dist/table/{format.d.ts → lib/format.d.ts} +2 -2
  407. package/dist/table/{format.js → lib/format.js} +3 -3
  408. package/dist/table/lib/format.js.map +1 -0
  409. package/dist/table/{payload.d.ts → lib/payload.d.ts} +2 -3
  410. package/dist/table/{payload.js → lib/payload.js} +12 -9
  411. package/dist/table/lib/payload.js.map +1 -0
  412. package/dist/table/{query.d.ts → lib/query.d.ts} +3 -3
  413. package/dist/table/{query.js → lib/query.js} +27 -27
  414. package/dist/table/lib/query.js.map +1 -0
  415. package/dist/table/plugin.d.ts +2 -0
  416. package/dist/table/plugin.js +11 -0
  417. package/dist/table/plugin.js.map +1 -0
  418. package/dist/table/registry.d.ts +3 -1
  419. package/dist/table/registry.js.map +1 -1
  420. package/dist/table/types.d.ts +57 -7
  421. package/dist/toast/callout.d.ts +1 -1
  422. package/dist/toast/callout.js.map +1 -1
  423. package/dist/toast/index.d.ts +6 -5
  424. package/dist/toast/index.js +2 -1
  425. package/dist/toast/toast.d.ts +1 -1
  426. package/dist/toast/toaster.js.map +1 -1
  427. package/dist/toast/variant-styles.d.ts +1 -1
  428. package/dist/types/generated.d.ts +118 -64
  429. package/dist/types/index.d.ts +1 -1
  430. package/dist/{action/components → ui}/action-menu-context.js +1 -1
  431. package/dist/ui/action-menu-context.js.map +1 -0
  432. package/dist/{form/components/base → ui}/affix-group.d.ts +1 -1
  433. package/dist/{form/components/base → ui}/affix-group.js +3 -3
  434. package/dist/ui/affix-group.js.map +1 -0
  435. package/dist/{core/components → ui}/badge.d.ts +1 -1
  436. package/dist/{core/components → ui}/badge.js +2 -2
  437. package/dist/ui/badge.js.map +1 -0
  438. package/dist/{core/components → ui}/button.d.ts +2 -2
  439. package/dist/{core/components → ui}/button.js +5 -5
  440. package/dist/ui/button.js.map +1 -0
  441. package/dist/{core/components → ui}/card.d.ts +1 -1
  442. package/dist/{core/components → ui}/card.js +3 -3
  443. package/dist/ui/card.js.map +1 -0
  444. package/dist/{core/components → ui}/chart-view.d.ts +1 -1
  445. package/dist/{core/components → ui}/chart-view.js +5 -5
  446. package/dist/ui/chart-view.js.map +1 -0
  447. package/dist/{core/components → ui}/chart.d.ts +1 -1
  448. package/dist/{core/components → ui}/chart.js +1 -1
  449. package/dist/ui/chart.js.map +1 -0
  450. package/dist/{core/components → ui}/checkbox.js +3 -3
  451. package/dist/ui/checkbox.js.map +1 -0
  452. package/dist/{core/use-click-behavior.d.ts → ui/click-behavior.d.ts} +17 -19
  453. package/dist/ui/click-behavior.js +46 -0
  454. package/dist/ui/click-behavior.js.map +1 -0
  455. package/dist/{core/components → ui}/collapsible.d.ts +1 -1
  456. package/dist/{core/components → ui}/collapsible.js +6 -6
  457. package/dist/ui/collapsible.js.map +1 -0
  458. package/dist/{core/components → ui}/combobox.d.ts +1 -1
  459. package/dist/{core/components → ui}/combobox.js +4 -4
  460. package/dist/ui/combobox.js.map +1 -0
  461. package/dist/{core/components → ui}/confirm-dialog.d.ts +1 -1
  462. package/dist/{core/components → ui}/confirm-dialog.js +1 -1
  463. package/dist/ui/confirm-dialog.js.map +1 -0
  464. package/dist/{core/components → ui}/control.d.ts +1 -1
  465. package/dist/{core/components → ui}/control.js +1 -1
  466. package/dist/ui/control.js.map +1 -0
  467. package/dist/{clipboard → ui}/copyable-text.d.ts +1 -0
  468. package/dist/{clipboard → ui}/copyable-text.js +11 -3
  469. package/dist/ui/copyable-text.js.map +1 -0
  470. package/dist/{core/components → ui}/dialog.js +3 -3
  471. package/dist/ui/dialog.js.map +1 -0
  472. package/dist/{core/components → ui}/dropdown-menu.d.ts +1 -1
  473. package/dist/{core/components → ui}/dropdown-menu.js +3 -3
  474. package/dist/ui/dropdown-menu.js.map +1 -0
  475. package/dist/{core/components → ui}/floating-panel.d.ts +1 -1
  476. package/dist/{core/components → ui}/floating-panel.js +4 -4
  477. package/dist/ui/floating-panel.js.map +1 -0
  478. package/dist/{core/components → ui}/fragment.d.ts +1 -1
  479. package/dist/{core/components → ui}/fragment.js +5 -5
  480. package/dist/ui/fragment.js.map +1 -0
  481. package/dist/{core/components → ui}/grid.d.ts +1 -1
  482. package/dist/{core/components → ui}/grid.js +3 -3
  483. package/dist/ui/grid.js.map +1 -0
  484. package/dist/{core/components → ui}/heading.d.ts +1 -1
  485. package/dist/{core/components → ui}/heading.js +2 -2
  486. package/dist/ui/heading.js.map +1 -0
  487. package/dist/{core/components → ui}/icon.d.ts +1 -1
  488. package/dist/{core/components → ui}/icon.js +3 -3
  489. package/dist/ui/icon.js.map +1 -0
  490. package/dist/ui/index.d.ts +27 -0
  491. package/dist/ui/index.js +26 -0
  492. package/dist/{core/components → ui}/info-tooltip.js +3 -3
  493. package/dist/ui/info-tooltip.js.map +1 -0
  494. package/dist/{form/components/base → ui}/input-error.js +2 -2
  495. package/dist/ui/input-error.js.map +1 -0
  496. package/dist/{form/components/base → ui}/input-otp.js +2 -2
  497. package/dist/ui/input-otp.js.map +1 -0
  498. package/dist/{form/components/base → ui}/input.js +3 -3
  499. package/dist/ui/input.js.map +1 -0
  500. package/dist/{form/components/base → ui}/label.js +2 -2
  501. package/dist/ui/label.js.map +1 -0
  502. package/dist/{core/components → ui}/link.d.ts +1 -1
  503. package/dist/{core/components → ui}/link.js +8 -7
  504. package/dist/ui/link.js.map +1 -0
  505. package/dist/{core/components → ui}/modal.d.ts +1 -1
  506. package/dist/{core/components → ui}/modal.js +2 -2
  507. package/dist/ui/modal.js.map +1 -0
  508. package/dist/{form/components/base → ui}/password-input.js +3 -3
  509. package/dist/ui/password-input.js.map +1 -0
  510. package/dist/ui/plugin.d.ts +1 -0
  511. package/dist/{core/components/index.js → ui/plugin.js} +6 -6
  512. package/dist/ui/plugin.js.map +1 -0
  513. package/dist/{core/components → ui}/popover.js +2 -2
  514. package/dist/ui/popover.js.map +1 -0
  515. package/dist/{core/components → ui}/raw-block.d.ts +1 -1
  516. package/dist/{core/components → ui}/raw-block.js +1 -1
  517. package/dist/ui/raw-block.js.map +1 -0
  518. package/dist/{core/components → ui}/section.d.ts +1 -1
  519. package/dist/{core/components → ui}/section.js +6 -6
  520. package/dist/ui/section.js.map +1 -0
  521. package/dist/{core/components → ui}/segmented-control.d.ts +1 -1
  522. package/dist/{core/components → ui}/segmented-control.js +1 -1
  523. package/dist/ui/segmented-control.js.map +1 -0
  524. package/dist/{core/components → ui}/segmented-pills.d.ts +1 -1
  525. package/dist/{core/components → ui}/segmented-pills.js +2 -2
  526. package/dist/ui/segmented-pills.js.map +1 -0
  527. package/dist/{core/components → ui}/skeleton.js +2 -2
  528. package/dist/ui/skeleton.js.map +1 -0
  529. package/dist/{core/components → ui}/spinner.js +4 -4
  530. package/dist/ui/spinner.js.map +1 -0
  531. package/dist/{core/components → ui}/stack.d.ts +1 -1
  532. package/dist/{core/components → ui}/stack.js +3 -3
  533. package/dist/ui/stack.js.map +1 -0
  534. package/dist/{core/components → ui}/tabs.d.ts +1 -1
  535. package/dist/{core/components → ui}/tabs.js +3 -3
  536. package/dist/ui/tabs.js.map +1 -0
  537. package/dist/{core/components → ui}/text.d.ts +1 -1
  538. package/dist/{core/components → ui}/text.js +4 -4
  539. package/dist/ui/text.js.map +1 -0
  540. package/dist/{form/components/base → ui}/textarea.js +3 -3
  541. package/dist/ui/textarea.js.map +1 -0
  542. package/dist/{core/components → ui}/tooltip.d.ts +1 -1
  543. package/dist/{core/components → ui}/tooltip.js +3 -3
  544. package/dist/ui/tooltip.js.map +1 -0
  545. package/dist/vite.js +2 -2
  546. package/dist/vite.js.map +1 -1
  547. package/dist-standalone/chunks/chart-view-CK5fKIkR.js +36 -0
  548. package/dist-standalone/chunks/date-picker-field-BlCPFhZd.js +1 -0
  549. package/dist-standalone/chunks/dist-PaT1gYi_.js +2 -0
  550. package/dist-standalone/chunks/jsx-runtime-CJ_btYLc.js +1 -0
  551. package/dist-standalone/chunks/notifications-echo-DsfNc4Ge.js +1 -0
  552. package/dist-standalone/chunks/react-B8IZ02wI.js +1 -0
  553. package/dist-standalone/chunks/rich-editor-field-DH5dS5c1.js +154 -0
  554. package/dist-standalone/chunks/subscriptions-B3UuDBmx.js +1 -0
  555. package/dist-standalone/chunks/test-id-Dh3L6Gfh.js +1 -0
  556. package/dist-standalone/chunks/use-effect-dispatcher-k98Nzf9M.js +97 -0
  557. package/dist-standalone/chunks/with-selector-BwDoCrJJ.js +1 -0
  558. package/dist-standalone/lattice.css +3 -0
  559. package/dist-standalone/lattice.js +66 -0
  560. package/dist-standalone/manifest.json +18 -0
  561. package/dist-standalone/sprite.svg +1 -0
  562. package/package.json +33 -95
  563. package/resources/icons/align-center.svg +1 -1
  564. package/resources/icons/align-justify.svg +1 -1
  565. package/resources/icons/align-left.svg +1 -1
  566. package/resources/icons/align-right.svg +1 -1
  567. package/resources/icons/arrow-down.svg +1 -1
  568. package/resources/icons/arrow-up.svg +1 -1
  569. package/resources/icons/bell.svg +1 -1
  570. package/resources/icons/bold.svg +1 -1
  571. package/resources/icons/calendar.svg +1 -1
  572. package/resources/icons/check.svg +1 -1
  573. package/resources/icons/chevron-down.svg +1 -1
  574. package/resources/icons/chevron-left.svg +1 -1
  575. package/resources/icons/chevron-right.svg +1 -1
  576. package/resources/icons/chevrons-up-down.svg +1 -1
  577. package/resources/icons/circle-alert.svg +1 -1
  578. package/resources/icons/circle-check.svg +1 -1
  579. package/resources/icons/circle-help.svg +1 -1
  580. package/resources/icons/circle-x.svg +1 -1
  581. package/resources/icons/clock.svg +1 -1
  582. package/resources/icons/code.svg +1 -1
  583. package/resources/icons/columns-3.svg +1 -1
  584. package/resources/icons/copy.svg +1 -1
  585. package/resources/icons/external-link.svg +1 -1
  586. package/resources/icons/eye-off.svg +1 -1
  587. package/resources/icons/eye.svg +1 -1
  588. package/resources/icons/filter.svg +1 -1
  589. package/resources/icons/heading-1.svg +1 -1
  590. package/resources/icons/heading-2.svg +1 -1
  591. package/resources/icons/heading-3.svg +1 -1
  592. package/resources/icons/highlighter.svg +1 -1
  593. package/resources/icons/info.svg +1 -1
  594. package/resources/icons/italic.svg +1 -1
  595. package/resources/icons/layout-dashboard.svg +1 -1
  596. package/resources/icons/link.svg +1 -1
  597. package/resources/icons/list-ordered.svg +1 -1
  598. package/resources/icons/list.svg +1 -1
  599. package/resources/icons/loader-2.svg +1 -1
  600. package/resources/icons/minus.svg +1 -1
  601. package/resources/icons/more-horizontal.svg +1 -1
  602. package/resources/icons/panel-left.svg +1 -1
  603. package/resources/icons/pencil-line.svg +1 -1
  604. package/resources/icons/pencil.svg +1 -1
  605. package/resources/icons/plus.svg +1 -1
  606. package/resources/icons/quote.svg +1 -1
  607. package/resources/icons/rotate-ccw.svg +1 -1
  608. package/resources/icons/rows-3.svg +1 -1
  609. package/resources/icons/search.svg +1 -1
  610. package/resources/icons/send.svg +1 -1
  611. package/resources/icons/settings.svg +1 -1
  612. package/resources/icons/smile.svg +1 -1
  613. package/resources/icons/strikethrough.svg +1 -1
  614. package/resources/icons/table.svg +1 -1
  615. package/resources/icons/trash-2.svg +1 -1
  616. package/resources/icons/underline.svg +1 -1
  617. package/resources/icons/x.svg +1 -1
  618. package/dist/action/components/action-menu-context.js.map +0 -1
  619. package/dist/action/index.js.map +0 -1
  620. package/dist/action/run-action.js.map +0 -1
  621. package/dist/action/use-action.js.map +0 -1
  622. package/dist/chat/index.js.map +0 -1
  623. package/dist/chat/transport.js.map +0 -1
  624. package/dist/chat/use-chat.js.map +0 -1
  625. package/dist/clipboard/copyable-text.js.map +0 -1
  626. package/dist/core/column-sizing.js.map +0 -1
  627. package/dist/core/components/badge.js.map +0 -1
  628. package/dist/core/components/button.js.map +0 -1
  629. package/dist/core/components/card.js.map +0 -1
  630. package/dist/core/components/chart-view.js.map +0 -1
  631. package/dist/core/components/chart.js.map +0 -1
  632. package/dist/core/components/checkbox.js.map +0 -1
  633. package/dist/core/components/collapsible.js.map +0 -1
  634. package/dist/core/components/combobox.js.map +0 -1
  635. package/dist/core/components/confirm-dialog.js.map +0 -1
  636. package/dist/core/components/control.js.map +0 -1
  637. package/dist/core/components/dialog.js.map +0 -1
  638. package/dist/core/components/dropdown-menu.js.map +0 -1
  639. package/dist/core/components/floating-panel.js.map +0 -1
  640. package/dist/core/components/fragment.js.map +0 -1
  641. package/dist/core/components/grid.js.map +0 -1
  642. package/dist/core/components/heading.js.map +0 -1
  643. package/dist/core/components/icon.js.map +0 -1
  644. package/dist/core/components/index.d.ts +0 -1
  645. package/dist/core/components/index.js.map +0 -1
  646. package/dist/core/components/info-tooltip.js.map +0 -1
  647. package/dist/core/components/link.js.map +0 -1
  648. package/dist/core/components/modal.js.map +0 -1
  649. package/dist/core/components/popover.js.map +0 -1
  650. package/dist/core/components/raw-block.js.map +0 -1
  651. package/dist/core/components/section.js.map +0 -1
  652. package/dist/core/components/segmented-control.js.map +0 -1
  653. package/dist/core/components/segmented-pills.js.map +0 -1
  654. package/dist/core/components/skeleton.js.map +0 -1
  655. package/dist/core/components/spinner.js.map +0 -1
  656. package/dist/core/components/stack.js.map +0 -1
  657. package/dist/core/components/tabs.js.map +0 -1
  658. package/dist/core/components/text.js.map +0 -1
  659. package/dist/core/components/tooltip.js.map +0 -1
  660. package/dist/core/use-click-behavior.js +0 -46
  661. package/dist/core/use-click-behavior.js.map +0 -1
  662. package/dist/core/use-column-resizing.js.map +0 -1
  663. package/dist/core/use-column-visibility.js.map +0 -1
  664. package/dist/events/event-bridge.js.map +0 -1
  665. package/dist/form/components/base/affix-group.js.map +0 -1
  666. package/dist/form/components/base/input-error.js.map +0 -1
  667. package/dist/form/components/base/input-otp.js.map +0 -1
  668. package/dist/form/components/base/input.js.map +0 -1
  669. package/dist/form/components/base/label.js.map +0 -1
  670. package/dist/form/components/base/password-input.js.map +0 -1
  671. package/dist/form/components/base/textarea.js.map +0 -1
  672. package/dist/form/components/conditions.js.map +0 -1
  673. package/dist/form/components/context.js.map +0 -1
  674. package/dist/form/components/field-props.js.map +0 -1
  675. package/dist/form/components/field-scope.js.map +0 -1
  676. package/dist/form/components/fields/block-add-menu.js.map +0 -1
  677. package/dist/form/components/form-path.js.map +0 -1
  678. package/dist/form/components/form-transport.js +0 -30
  679. package/dist/form/components/form-transport.js.map +0 -1
  680. package/dist/form/components/override-keys.js +0 -12
  681. package/dist/form/components/override-keys.js.map +0 -1
  682. package/dist/form/components/prefill-context.js.map +0 -1
  683. package/dist/form/components/prefill-targets.js.map +0 -1
  684. package/dist/form/components/resolved-nodes.js.map +0 -1
  685. package/dist/form/components/row-layout-context.js.map +0 -1
  686. package/dist/form/components/use-controlled-field.js.map +0 -1
  687. package/dist/form/components/use-dependent-field.d.ts +0 -3
  688. package/dist/form/components/use-dependent-field.js.map +0 -1
  689. package/dist/form/components/use-field-commit.js.map +0 -1
  690. package/dist/form/components/use-form-resolver.js.map +0 -1
  691. package/dist/form/components/use-seed-default.js.map +0 -1
  692. package/dist/form/components/values.js +0 -52
  693. package/dist/form/components/values.js.map +0 -1
  694. package/dist/form/index.js.map +0 -1
  695. package/dist/layout/breadcrumbs.js.map +0 -1
  696. package/dist/layout/callouts.js.map +0 -1
  697. package/dist/layout/components.d.ts +0 -1
  698. package/dist/layout/components.js.map +0 -1
  699. package/dist/layout/context.js.map +0 -1
  700. package/dist/layout/dropdown.js.map +0 -1
  701. package/dist/layout/menu-item.js.map +0 -1
  702. package/dist/layout/menu.js.map +0 -1
  703. package/dist/layout/outlet.js.map +0 -1
  704. package/dist/layout/popover.js.map +0 -1
  705. package/dist/layout/schema-layout.js.map +0 -1
  706. package/dist/layout/sidebar.js.map +0 -1
  707. package/dist/layout/topbar.js.map +0 -1
  708. package/dist/notifications/index.js.map +0 -1
  709. package/dist/remote/index.js.map +0 -1
  710. package/dist/svg-sprite-client/index.d.ts +0 -1
  711. package/dist/svg-sprite-client/index.js +0 -0
  712. package/dist/table/align.js.map +0 -1
  713. package/dist/table/bulk.js.map +0 -1
  714. package/dist/table/components/filter-stack-bar.d.ts +0 -7
  715. package/dist/table/components/filter-stack-bar.js +0 -38
  716. package/dist/table/components/filter-stack-bar.js.map +0 -1
  717. package/dist/table/filter-values.js.map +0 -1
  718. package/dist/table/format.js.map +0 -1
  719. package/dist/table/index.js.map +0 -1
  720. package/dist/table/payload.js.map +0 -1
  721. package/dist/table/query.js.map +0 -1
  722. package/dist/table/use-table-selection.js.map +0 -1
  723. package/dist/table/use-table.js.map +0 -1
  724. package/dist/types/generated.js +0 -0
  725. package/dist/types/index.js +0 -0
  726. /package/dist/form/{components → hooks}/field-scope.d.ts +0 -0
  727. /package/dist/form/{components → hooks}/prefill-context.d.ts +0 -0
  728. /package/dist/form/{components → hooks}/row-layout-context.d.ts +0 -0
  729. /package/dist/form/{components → hooks}/use-seed-default.d.ts +0 -0
  730. /package/dist/form/{components → lib}/form-path.d.ts +0 -0
  731. /package/dist/form/{components → lib}/override-keys.d.ts +0 -0
  732. /package/dist/form/{components/types.js → types.js} +0 -0
  733. /package/dist/layout/{popover.d.ts → components/popover.d.ts} +0 -0
  734. /package/dist/layout/{schema-layout.d.ts → components/schema-layout.d.ts} +0 -0
  735. /package/dist/table/{use-table-selection.d.ts → hooks/use-table-selection.d.ts} +0 -0
  736. /package/dist/{action/components → ui}/action-menu-context.d.ts +0 -0
  737. /package/dist/{core/components → ui}/checkbox.d.ts +0 -0
  738. /package/dist/{core/components → ui}/dialog.d.ts +0 -0
  739. /package/dist/{core/components → ui}/info-tooltip.d.ts +0 -0
  740. /package/dist/{form/components/base → ui}/input-error.d.ts +0 -0
  741. /package/dist/{form/components/base → ui}/input-otp.d.ts +0 -0
  742. /package/dist/{form/components/base → ui}/input.d.ts +0 -0
  743. /package/dist/{form/components/base → ui}/label.d.ts +0 -0
  744. /package/dist/{form/components/base → ui}/password-input.d.ts +0 -0
  745. /package/dist/{core/components → ui}/popover.d.ts +0 -0
  746. /package/dist/{core/components → ui}/skeleton.d.ts +0 -0
  747. /package/dist/{core/components → ui}/spinner.d.ts +0 -0
  748. /package/dist/{form/components/base → ui}/textarea.d.ts +0 -0
@@ -1,47 +1,75 @@
1
1
  import { Icon } from "../../icons/sprite.js";
2
2
  import { useT } from "../../i18n/instance.js";
3
- import { Popover, PopoverContent, PopoverTrigger } from "../../core/components/popover.js";
4
- import { filterOptions, isActiveFilterValue, stringProp } from "../filter-values.js";
3
+ import { Popover, PopoverContent, PopoverTrigger } from "../../ui/popover.js";
4
+ import { isActiveFilterValue } from "../lib/filter-values.js";
5
+ import { VALUELESS_FILTER_OPERATORS, operatorLabel } from "../lib/query.js";
5
6
  import { TableFilterControl } from "./filter-controls.js";
6
- import { jsx, jsxs } from "react/jsx-runtime";
7
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
7
8
  //#region resources/js/table/components/filter-bar.tsx
8
- function FilterBar({ filters, values, processing, hasActiveFilters, onChange, onReset }) {
9
+ function FilterBar({ clauses, columnsByKey, indicators, processing, onRemoveClause, onChange, onReset }) {
9
10
  const { t } = useT("lattice");
10
- const active = filters.filter((filter) => isActiveFilterValue(values[filter.key]));
11
- if (!hasActiveFilters) return null;
11
+ if (clauses.length === 0 && indicators.length === 0) return null;
12
12
  return /* @__PURE__ */ jsx("div", {
13
13
  className: "border-b border-lt-border px-4 py-3",
14
14
  children: /* @__PURE__ */ jsxs("div", {
15
15
  className: "flex flex-wrap items-center gap-2 text-sm",
16
- children: [active.map((filter) => /* @__PURE__ */ jsxs("span", {
17
- className: "inline-flex items-center gap-1.5 rounded-lt-sm bg-lt-muted px-2 py-1",
18
- children: [/* @__PURE__ */ jsxs("span", { children: [`${filter.label}: `, /* @__PURE__ */ jsx("span", {
19
- className: "font-semibold",
20
- children: displayValue(filter, values[filter.key])
21
- })] }), /* @__PURE__ */ jsx("button", {
16
+ children: [
17
+ clauses.map((clause, index) => {
18
+ const label = columnsByKey.get(clause.field)?.props.label ?? clause.field;
19
+ const valueless = VALUELESS_FILTER_OPERATORS.has(clause.operator);
20
+ return /* @__PURE__ */ jsx(FilterChip, {
21
+ label: `${label} ${operatorLabel(clause.operator)}`,
22
+ value: valueless ? "" : clause.value,
23
+ removeTestId: `filter-chip-${clause.field}-remove`,
24
+ removeLabel: t("table.filter.remove", "Remove {{label}} filter", { label }),
25
+ processing,
26
+ onRemove: () => onRemoveClause(index)
27
+ }, `${clause.field}-${clause.operator}-${index}`);
28
+ }),
29
+ indicators.map((indicator) => /* @__PURE__ */ jsx(FilterChip, {
30
+ label: indicator.label,
31
+ value: indicator.value,
32
+ removeTestId: `table-filter-chip-${indicator.filter}-remove`,
33
+ removeLabel: t("table.filter.remove", "Remove {{label}} filter", { label: indicator.label }),
34
+ processing,
35
+ onRemove: () => onChange(indicator.filter, void 0)
36
+ }, `${indicator.filter}:${indicator.label}:${indicator.value}`)),
37
+ /* @__PURE__ */ jsx("button", {
22
38
  type: "button",
23
- "data-test": `table-filter-chip-${filter.key}-remove`,
24
- className: "inline-flex size-5 items-center justify-center rounded-lt-sm text-lt-muted-fg hover:bg-lt-border disabled:opacity-50",
39
+ "data-test": "table-filters-reset",
40
+ className: "text-lt-muted-fg underline-offset-2 hover:underline disabled:opacity-50",
25
41
  disabled: processing,
26
- "aria-label": t("table.filter.remove", "Remove {{label}} filter", { label: filter.label }),
27
- onClick: () => onChange(filter.key, void 0),
28
- children: /* @__PURE__ */ jsx(Icon, {
29
- name: "x",
30
- "aria-hidden": "true",
31
- className: "size-lt-icon-sm"
32
- })
33
- })]
34
- }, filter.key)), /* @__PURE__ */ jsx("button", {
35
- type: "button",
36
- "data-test": "table-filters-reset",
37
- className: "text-lt-muted-fg underline-offset-2 hover:underline disabled:opacity-50",
38
- disabled: processing,
39
- onClick: onReset,
40
- children: t("table.filter.resetAll", "Reset all")
41
- })]
42
+ onClick: onReset,
43
+ children: t("table.filter.resetAll", "Reset all")
44
+ })
45
+ ]
42
46
  })
43
47
  });
44
48
  }
49
+ function FilterChip({ label, value, removeTestId, removeLabel, processing, onRemove }) {
50
+ return /* @__PURE__ */ jsxs("span", {
51
+ className: "inline-flex items-center gap-1.5 rounded-lt-sm bg-lt-muted px-2 py-1",
52
+ children: [/* @__PURE__ */ jsx("span", { children: value === "" ? /* @__PURE__ */ jsx("span", {
53
+ className: "font-semibold",
54
+ children: label
55
+ }) : /* @__PURE__ */ jsxs(Fragment, { children: [`${label}: `, /* @__PURE__ */ jsx("span", {
56
+ className: "font-semibold",
57
+ children: value
58
+ })] }) }), /* @__PURE__ */ jsx("button", {
59
+ type: "button",
60
+ "data-test": removeTestId,
61
+ className: "inline-flex size-5 items-center justify-center rounded-lt-sm text-lt-muted-fg hover:bg-lt-border disabled:opacity-50",
62
+ disabled: processing,
63
+ "aria-label": removeLabel,
64
+ onClick: onRemove,
65
+ children: /* @__PURE__ */ jsx(Icon, {
66
+ name: "x",
67
+ "aria-hidden": "true",
68
+ className: "size-lt-icon-sm"
69
+ })
70
+ })]
71
+ });
72
+ }
45
73
  function FilterMenu({ filters, values, processing, onChange, onSearch }) {
46
74
  const { t } = useT("lattice");
47
75
  const active = filters.filter((filter) => isActiveFilterValue(values[filter.key]));
@@ -67,37 +95,19 @@ function FilterMenu({ filters, values, processing, onChange, onSearch }) {
67
95
  className: "w-80 p-4",
68
96
  children: /* @__PURE__ */ jsx("div", {
69
97
  className: "grid gap-3",
70
- children: filters.map((filter) => /* @__PURE__ */ jsxs("div", {
98
+ children: filters.map((filter) => /* @__PURE__ */ jsx("div", {
71
99
  className: "grid gap-1",
72
- children: [filter.type !== "toggle" && /* @__PURE__ */ jsx("span", {
73
- className: "text-xs font-medium text-lt-muted-fg",
74
- children: filter.label
75
- }), /* @__PURE__ */ jsx(TableFilterControl, {
100
+ children: /* @__PURE__ */ jsx(TableFilterControl, {
76
101
  filter,
77
102
  value: values[filter.key],
78
103
  processing,
79
104
  onChange: (value) => onChange(filter.key, value),
80
- onSearch: onSearch ? (query) => onSearch(filter.key, query) : void 0
81
- })]
105
+ onSearch: onSearch ? (field, query, signal) => onSearch(`filter:${filter.key}.${field}`, query, signal) : void 0
106
+ })
82
107
  }, filter.key))
83
108
  })
84
109
  })] });
85
110
  }
86
- function optionLabel(filter, value) {
87
- return filterOptions(filter).find((option) => option.value === value)?.label ?? value;
88
- }
89
- function displayValue(filter, value) {
90
- if (filter.type === "select") {
91
- if (Array.isArray(value)) return value.map((item) => optionLabel(filter, String(item))).join(", ");
92
- return optionLabel(filter, String(value));
93
- }
94
- if (filter.type === "ternary") return value === "true" ? stringProp(filter, "trueLabel", "True") : stringProp(filter, "falseLabel", "False");
95
- if (filter.type === "date-range" && value && typeof value === "object") {
96
- const range = value;
97
- return [range.from, range.until].filter((part) => part).join(" – ");
98
- }
99
- return String(value);
100
- }
101
111
  //#endregion
102
112
  export { FilterBar, FilterMenu };
103
113
 
@@ -1 +1 @@
1
- {"version":3,"file":"filter-bar.js","names":[],"sources":["../../../resources/js/table/components/filter-bar.tsx"],"sourcesContent":["import { Icon } from \"@lattice-php/lattice/icons\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"@lattice-php/lattice/core/components/popover\";\nimport { useT } from \"@lattice-php/lattice/i18n\";\nimport type { FilterData, Option } from \"@lattice-php/lattice/types/generated\";\nimport { filterOptions, isActiveFilterValue, stringProp } from \"../filter-values\";\nimport { TableFilterControl } from \"./filter-controls\";\n\nexport function FilterBar({\n filters,\n values,\n processing,\n hasActiveFilters,\n onChange,\n onReset,\n}: {\n filters: FilterData[];\n values: Record<string, unknown>;\n processing: boolean;\n hasActiveFilters: boolean;\n onChange: (key: string, value: unknown) => void;\n onReset: () => void;\n}) {\n const { t } = useT(\"lattice\");\n const active = filters.filter((filter) => isActiveFilterValue(values[filter.key]));\n\n if (!hasActiveFilters) {\n return null;\n }\n\n return (\n <div className=\"border-b border-lt-border px-4 py-3\">\n <div className=\"flex flex-wrap items-center gap-2 text-sm\">\n {active.map((filter) => (\n <span\n key={filter.key}\n className=\"inline-flex items-center gap-1.5 rounded-lt-sm bg-lt-muted px-2 py-1\"\n >\n <span>\n {`${filter.label}: `}\n <span className=\"font-semibold\">{displayValue(filter, values[filter.key])}</span>\n </span>\n <button\n type=\"button\"\n data-test={`table-filter-chip-${filter.key}-remove`}\n className=\"inline-flex size-5 items-center justify-center rounded-lt-sm text-lt-muted-fg hover:bg-lt-border disabled:opacity-50\"\n disabled={processing}\n aria-label={t(\"table.filter.remove\", \"Remove {{label}} filter\", {\n label: filter.label,\n })}\n onClick={() => onChange(filter.key, undefined)}\n >\n <Icon name=\"x\" aria-hidden=\"true\" className=\"size-lt-icon-sm\" />\n </button>\n </span>\n ))}\n <button\n type=\"button\"\n data-test=\"table-filters-reset\"\n className=\"text-lt-muted-fg underline-offset-2 hover:underline disabled:opacity-50\"\n disabled={processing}\n onClick={onReset}\n >\n {t(\"table.filter.resetAll\", \"Reset all\")}\n </button>\n </div>\n </div>\n );\n}\n\nexport function FilterMenu({\n filters,\n values,\n processing,\n onChange,\n onSearch,\n}: {\n filters: FilterData[];\n values: Record<string, unknown>;\n processing: boolean;\n onChange: (key: string, value: unknown) => void;\n onSearch?: (filterKey: string, query: string) => Promise<Option[]>;\n}) {\n const { t } = useT(\"lattice\");\n const active = filters.filter((filter) => isActiveFilterValue(values[filter.key]));\n const filtersLabel = t(\"table.filter.filters\", \"Filters\");\n\n return (\n <Popover>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n aria-label={filtersLabel}\n data-test=\"table-filters-menu\"\n className=\"relative inline-flex size-7 shrink-0 items-center justify-center rounded-lt-sm text-lt-muted-fg hover:bg-lt-muted hover:text-lt-fg disabled:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-lt-ring/50 data-[state=open]:bg-lt-muted data-[state=open]:text-lt-fg\"\n disabled={processing}\n >\n <Icon name=\"filter\" aria-hidden=\"true\" className=\"size-lt-icon-md\" />\n {active.length > 0 && (\n <span className=\"absolute -right-1 -top-1 inline-flex size-3.5 items-center justify-center rounded-full bg-lt-primary text-[10px] font-medium leading-none text-lt-primary-fg\">\n {active.length}\n </span>\n )}\n </button>\n </PopoverTrigger>\n <PopoverContent align=\"end\" className=\"w-80 p-4\">\n <div className=\"grid gap-3\">\n {filters.map((filter) => (\n <div key={filter.key} className=\"grid gap-1\">\n {filter.type !== \"toggle\" && (\n <span className=\"text-xs font-medium text-lt-muted-fg\">{filter.label}</span>\n )}\n <TableFilterControl\n filter={filter}\n value={values[filter.key]}\n processing={processing}\n onChange={(value) => onChange(filter.key, value)}\n onSearch={onSearch ? (query) => onSearch(filter.key, query) : undefined}\n />\n </div>\n ))}\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n\nfunction optionLabel(filter: FilterData, value: string): string {\n return filterOptions(filter).find((option) => option.value === value)?.label ?? value;\n}\n\nfunction displayValue(filter: FilterData, value: unknown): string {\n if (filter.type === \"select\") {\n if (Array.isArray(value)) {\n return value.map((item) => optionLabel(filter, String(item))).join(\", \");\n }\n\n return optionLabel(filter, String(value));\n }\n\n if (filter.type === \"ternary\") {\n return value === \"true\"\n ? stringProp(filter, \"trueLabel\", \"True\")\n : stringProp(filter, \"falseLabel\", \"False\");\n }\n\n if (filter.type === \"date-range\" && value && typeof value === \"object\") {\n const range = value as { from?: string; until?: string };\n\n return [range.from, range.until].filter((part) => part).join(\" – \");\n }\n\n return String(value);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"filter-bar.js","names":[],"sources":["../../../resources/js/table/components/filter-bar.tsx"],"sourcesContent":["import { Icon } from \"@lattice-php/lattice/icons\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"@lattice-php/lattice/ui/popover\";\nimport { useT } from \"@lattice-php/lattice/i18n\";\nimport type { Option } from \"@lattice-php/lattice/types/generated\";\nimport { isActiveFilterValue } from \"@lattice-php/lattice/table/lib/filter-values\";\nimport { operatorLabel, VALUELESS_FILTER_OPERATORS } from \"@lattice-php/lattice/table/lib/query\";\nimport type {\n FilterClause,\n FilterNode,\n TableColumn,\n TableFilterIndicator,\n} from \"@lattice-php/lattice/table/types\";\nimport { TableFilterControl } from \"./filter-controls\";\n\nexport function FilterBar({\n clauses,\n columnsByKey,\n indicators,\n processing,\n onRemoveClause,\n onChange,\n onReset,\n}: {\n clauses: FilterClause[];\n columnsByKey: Map<string, TableColumn>;\n indicators: TableFilterIndicator[];\n processing: boolean;\n onRemoveClause: (index: number) => void;\n onChange: (key: string, value: unknown) => void;\n onReset: () => void;\n}) {\n const { t } = useT(\"lattice\");\n\n if (clauses.length === 0 && indicators.length === 0) {\n return null;\n }\n\n return (\n <div className=\"border-b border-lt-border px-4 py-3\">\n <div className=\"flex flex-wrap items-center gap-2 text-sm\">\n {clauses.map((clause, index) => {\n const label = columnsByKey.get(clause.field)?.props.label ?? clause.field;\n const valueless = VALUELESS_FILTER_OPERATORS.has(clause.operator);\n\n return (\n <FilterChip\n key={`${clause.field}-${clause.operator}-${index}`}\n label={`${label} ${operatorLabel(clause.operator)}`}\n value={valueless ? \"\" : clause.value}\n removeTestId={`filter-chip-${clause.field}-remove`}\n removeLabel={t(\"table.filter.remove\", \"Remove {{label}} filter\", { label })}\n processing={processing}\n onRemove={() => onRemoveClause(index)}\n />\n );\n })}\n {indicators.map((indicator) => (\n <FilterChip\n key={`${indicator.filter}:${indicator.label}:${indicator.value}`}\n label={indicator.label}\n value={indicator.value}\n removeTestId={`table-filter-chip-${indicator.filter}-remove`}\n removeLabel={t(\"table.filter.remove\", \"Remove {{label}} filter\", {\n label: indicator.label,\n })}\n processing={processing}\n onRemove={() => onChange(indicator.filter, undefined)}\n />\n ))}\n <button\n type=\"button\"\n data-test=\"table-filters-reset\"\n className=\"text-lt-muted-fg underline-offset-2 hover:underline disabled:opacity-50\"\n disabled={processing}\n onClick={onReset}\n >\n {t(\"table.filter.resetAll\", \"Reset all\")}\n </button>\n </div>\n </div>\n );\n}\n\nfunction FilterChip({\n label,\n value,\n removeTestId,\n removeLabel,\n processing,\n onRemove,\n}: {\n label: string;\n value: string;\n removeTestId: string;\n removeLabel: string;\n processing: boolean;\n onRemove: () => void;\n}) {\n return (\n <span className=\"inline-flex items-center gap-1.5 rounded-lt-sm bg-lt-muted px-2 py-1\">\n <span>\n {value === \"\" ? (\n <span className=\"font-semibold\">{label}</span>\n ) : (\n <>\n {`${label}: `}\n <span className=\"font-semibold\">{value}</span>\n </>\n )}\n </span>\n <button\n type=\"button\"\n data-test={removeTestId}\n className=\"inline-flex size-5 items-center justify-center rounded-lt-sm text-lt-muted-fg hover:bg-lt-border disabled:opacity-50\"\n disabled={processing}\n aria-label={removeLabel}\n onClick={onRemove}\n >\n <Icon name=\"x\" aria-hidden=\"true\" className=\"size-lt-icon-sm\" />\n </button>\n </span>\n );\n}\n\nexport function FilterMenu({\n filters,\n values,\n processing,\n onChange,\n onSearch,\n}: {\n filters: FilterNode[];\n values: Record<string, unknown>;\n processing: boolean;\n onChange: (key: string, value: unknown) => void;\n onSearch?: (searchKey: string, query: string, signal?: AbortSignal) => Promise<Option[]>;\n}) {\n const { t } = useT(\"lattice\");\n const active = filters.filter((filter) => isActiveFilterValue(values[filter.key]));\n const filtersLabel = t(\"table.filter.filters\", \"Filters\");\n\n return (\n <Popover>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n aria-label={filtersLabel}\n data-test=\"table-filters-menu\"\n className=\"relative inline-flex size-7 shrink-0 items-center justify-center rounded-lt-sm text-lt-muted-fg hover:bg-lt-muted hover:text-lt-fg disabled:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-lt-ring/50 data-[state=open]:bg-lt-muted data-[state=open]:text-lt-fg\"\n disabled={processing}\n >\n <Icon name=\"filter\" aria-hidden=\"true\" className=\"size-lt-icon-md\" />\n {active.length > 0 && (\n <span className=\"absolute -right-1 -top-1 inline-flex size-3.5 items-center justify-center rounded-full bg-lt-primary text-[10px] font-medium leading-none text-lt-primary-fg\">\n {active.length}\n </span>\n )}\n </button>\n </PopoverTrigger>\n <PopoverContent align=\"end\" className=\"w-80 p-4\">\n <div className=\"grid gap-3\">\n {filters.map((filter) => (\n <div key={filter.key} className=\"grid gap-1\">\n <TableFilterControl\n filter={filter}\n value={values[filter.key]}\n processing={processing}\n onChange={(value) => onChange(filter.key, value)}\n onSearch={\n onSearch\n ? (field, query, signal) =>\n onSearch(`filter:${filter.key}.${field}`, query, signal)\n : undefined\n }\n />\n </div>\n ))}\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n"],"mappings":"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"}
@@ -1,14 +1,10 @@
1
- import { FilterData, Option } from '../../types/generated';
2
- export type FilterOptionSearch = (query: string) => Promise<Option[]>;
3
- /**
4
- * Renders the control for a single dedicated table filter, dispatching on the
5
- * filter's `type`. The current value comes from the table state; `onChange`
6
- * pushes a new value (an empty value clears the filter).
7
- */
1
+ import { Option } from '../../core/types.js';
2
+ import { FilterNode } from '../types.js';
3
+ export type FilterOptionSearch = (field: string, query: string, signal: AbortSignal) => Promise<Option[]>;
8
4
  export declare function TableFilterControl({ filter, value, processing, onChange, onSearch, }: {
9
- filter: FilterData;
5
+ filter: FilterNode;
10
6
  value: unknown;
11
7
  processing: boolean;
12
8
  onChange: (value: unknown) => void;
13
9
  onSearch?: FilterOptionSearch;
14
- }): import("react").JSX.Element | null;
10
+ }): import("react").JSX.Element;
@@ -1,255 +1,127 @@
1
1
  import { cn } from "../../lib/utils.js";
2
2
  import { Icon } from "../../icons/sprite.js";
3
- import { useT } from "../../i18n/instance.js";
4
- import { Checkbox } from "../../core/components/checkbox.js";
5
- import { Combobox } from "../../core/components/combobox.js";
6
- import { filterOptions, stringProp } from "../filter-values.js";
7
- import { fieldClass } from "./filter-value-input.js";
8
- import { useState } from "react";
9
- import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
3
+ import { Renderer } from "../../core/renderer.js";
4
+ import { FormProvider } from "../../form/hooks/context.js";
5
+ import { PrefillProvider } from "../../form/hooks/prefill-context.js";
6
+ import { getPath, setPath } from "../../form/lib/form-path.js";
7
+ import { ResolvedNodesProvider } from "../../form/hooks/resolved-nodes.js";
8
+ import { FormValuesProvider, useFormValues, useSetFormValue } from "../../form/hooks/values.js";
9
+ import { FieldCommitOverrideProvider } from "../../form/hooks/use-field-commit.js";
10
+ import { Checkbox } from "../../ui/checkbox.js";
11
+ import { filterValue, isActiveFilterValue } from "../lib/filter-values.js";
12
+ import { useCallback, useMemo, useRef } from "react";
13
+ import { jsx, jsxs } from "react/jsx-runtime";
10
14
  //#region resources/js/table/components/filter-controls.tsx
11
- /**
12
- * Renders the control for a single dedicated table filter, dispatching on the
13
- * filter's `type`. The current value comes from the table state; `onChange`
14
- * pushes a new value (an empty value clears the filter).
15
- */
16
15
  function TableFilterControl({ filter, value, processing, onChange, onSearch }) {
17
- switch (filter.type) {
18
- case "select":
19
- if (filter.props.searchable === true && onSearch) return /* @__PURE__ */ jsx(SearchableSelectControl, {
16
+ const schema = filter.schema ?? [];
17
+ if (schema.length === 0) return /* @__PURE__ */ jsx(ToggleControl, {
18
+ filter,
19
+ value,
20
+ processing,
21
+ onChange
22
+ });
23
+ return /* @__PURE__ */ jsxs("div", {
24
+ className: "flex items-end gap-2",
25
+ children: [/* @__PURE__ */ jsx("div", {
26
+ className: "min-w-0 flex-1",
27
+ children: /* @__PURE__ */ jsx(SchemaControl, {
20
28
  filter,
29
+ schema,
21
30
  value,
22
31
  processing,
23
32
  onChange,
24
33
  onSearch
25
- });
26
- return filter.props.multiple === true ? /* @__PURE__ */ jsx(MultiSelectControl, {
27
- filter,
28
- value,
29
- processing,
30
- onChange
31
- }) : /* @__PURE__ */ jsx(SelectControl, {
32
- filter,
33
- value,
34
- processing,
35
- onChange
36
- });
37
- case "ternary": return /* @__PURE__ */ jsx(TernaryControl, {
38
- filter,
39
- value,
40
- processing,
41
- onChange
42
- });
43
- case "date-range": return /* @__PURE__ */ jsx(DateRangeControl, {
44
- filter,
45
- value,
46
- processing,
47
- onChange
48
- });
49
- case "toggle": return /* @__PURE__ */ jsx(ToggleControl, {
50
- filter,
51
- value,
52
- processing,
53
- onChange
54
- });
55
- default: return null;
56
- }
57
- }
58
- function SelectControl({ filter, value, processing, onChange }) {
59
- const { t } = useT("lattice");
60
- const placeholder = stringProp(filter, "placeholder", t("table.filter.all", "All"));
61
- return /* @__PURE__ */ jsxs("select", {
62
- "aria-label": filter.label,
63
- "data-test": `table-filter-${filter.key}`,
64
- className: fieldClass,
65
- disabled: processing,
66
- value: typeof value === "string" ? value : "",
67
- onChange: (event) => onChange(event.target.value),
68
- children: [/* @__PURE__ */ jsx("option", {
69
- value: "",
70
- children: placeholder
71
- }), filterOptions(filter).map((option) => /* @__PURE__ */ jsx("option", {
72
- value: option.value,
73
- children: option.label
74
- }, option.value))]
75
- });
76
- }
77
- function MultiSelectControl({ filter, value, processing, onChange }) {
78
- const { t } = useT("lattice");
79
- const [open, setOpen] = useState(false);
80
- const selected = Array.isArray(value) ? value : [];
81
- function toggle(optionValue) {
82
- onChange(selected.includes(optionValue) ? selected.filter((item) => item !== optionValue) : [...selected, optionValue]);
83
- }
84
- const summary = selected.length === 0 ? stringProp(filter, "placeholder", t("table.filter.all", "All")) : t("table.filter.selectedCount", "{{amount}} selected", { amount: selected.length });
85
- return /* @__PURE__ */ jsxs("div", {
86
- className: "relative",
87
- children: [/* @__PURE__ */ jsxs("button", {
88
- type: "button",
89
- "aria-label": filter.label,
90
- "aria-expanded": open,
91
- "data-test": `table-filter-${filter.key}`,
92
- className: `${fieldClass} flex items-center justify-between gap-2`,
34
+ })
35
+ }), isActiveFilterValue(value) && /* @__PURE__ */ jsx("button", {
36
+ "aria-label": `Clear ${filter.props.label} filter`,
37
+ className: "inline-flex size-lt-control-md shrink-0 items-center justify-center rounded-lt-sm text-lt-muted-fg hover:bg-lt-muted hover:text-lt-fg disabled:opacity-50",
93
38
  disabled: processing,
94
- onClick: () => setOpen((current) => !current),
95
- children: [/* @__PURE__ */ jsx("span", {
96
- className: "truncate",
97
- children: summary
98
- }), /* @__PURE__ */ jsx(Icon, {
99
- name: "chevron-down",
39
+ onClick: () => onChange(void 0),
40
+ type: "button",
41
+ children: /* @__PURE__ */ jsx(Icon, {
42
+ name: "x",
100
43
  "aria-hidden": "true",
101
- className: "size-lt-icon-sm shrink-0"
102
- })]
103
- }), open && /* @__PURE__ */ jsx("div", {
104
- className: "absolute z-lt-dropdown mt-1 min-w-full rounded-lt-sm border border-lt-border bg-lt-bg p-1 shadow-lt-md",
105
- children: filterOptions(filter).map((option) => /* @__PURE__ */ jsxs("label", {
106
- className: "flex cursor-pointer items-center gap-2 rounded-lt-sm px-2 py-1.5 text-sm hover:bg-lt-muted",
107
- children: [/* @__PURE__ */ jsx(Checkbox, {
108
- "aria-label": option.label,
109
- "data-test": `table-filter-${filter.key}-${option.value}`,
110
- checked: selected.includes(option.value),
111
- disabled: processing,
112
- onCheckedChange: () => toggle(option.value)
113
- }), /* @__PURE__ */ jsx("span", {
114
- className: "truncate",
115
- children: option.label
116
- })]
117
- }, option.value))
44
+ className: "size-lt-icon-md"
45
+ })
118
46
  })]
119
47
  });
120
48
  }
121
- function SearchableSelectControl({ filter, value, processing, onChange, onSearch }) {
122
- const { t } = useT("lattice");
123
- const multiple = filter.props.multiple === true;
124
- const [open, setOpen] = useState(false);
125
- const [results, setResults] = useState(() => filterOptions(filter));
126
- const [loading, setLoading] = useState(false);
127
- const selected = multiple ? Array.isArray(value) ? value : [] : typeof value === "string" && value !== "" ? [value] : [];
128
- const labels = new Map([...filterOptions(filter), ...results].map((option) => [option.value, option.label]));
129
- const summary = selected.length === 0 ? stringProp(filter, "placeholder", t("table.filter.all", "All")) : multiple ? t("table.filter.selectedCount", "{{amount}} selected", { amount: selected.length }) : labels.get(selected[0]) ?? selected[0];
130
- function search(query) {
131
- setLoading(true);
132
- onSearch(query).then((options) => {
133
- setResults(options);
134
- setLoading(false);
135
- });
136
- }
137
- function choose(optionValue) {
138
- onChange(multiple ? selected.includes(optionValue) ? selected.filter((item) => item !== optionValue) : [...selected, optionValue] : optionValue);
139
- }
140
- return /* @__PURE__ */ jsx(Combobox, {
141
- contentClassName: "w-60",
142
- loading,
143
- multiple,
144
- onSearch: search,
145
- onSelect: choose,
146
- open,
147
- onOpenChange: setOpen,
148
- options: results,
149
- searchLabel: t("table.filter.search", "Search"),
150
- selected,
151
- testId: `table-filter-${filter.key}`,
152
- trigger: /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("span", {
153
- className: "truncate",
154
- children: summary
155
- }), /* @__PURE__ */ jsx(Icon, {
156
- name: "chevron-down",
157
- "aria-hidden": "true",
158
- className: "size-lt-icon-sm shrink-0"
159
- })] }),
160
- triggerClassName: cn(fieldClass, "flex items-center justify-between gap-2"),
161
- triggerProps: {
162
- "aria-label": filter.label,
163
- "data-test": `table-filter-${filter.key}`,
164
- disabled: processing
165
- }
166
- });
167
- }
168
- function TernaryControl({ filter, value, processing, onChange }) {
169
- const { t } = useT("lattice");
170
- const placeholder = stringProp(filter, "placeholder", t("table.filter.all", "All"));
171
- const trueLabel = stringProp(filter, "trueLabel", t("table.filter.true", "True"));
172
- const falseLabel = stringProp(filter, "falseLabel", t("table.filter.false", "False"));
173
- return /* @__PURE__ */ jsxs("select", {
174
- "aria-label": filter.label,
175
- "data-test": `table-filter-${filter.key}`,
176
- className: fieldClass,
177
- disabled: processing,
178
- value: typeof value === "string" ? value : "",
179
- onChange: (event) => onChange(event.target.value),
180
- children: [
181
- /* @__PURE__ */ jsx("option", {
182
- value: "",
183
- children: placeholder
184
- }),
185
- /* @__PURE__ */ jsx("option", {
186
- value: "true",
187
- children: trueLabel
188
- }),
189
- /* @__PURE__ */ jsx("option", {
190
- value: "false",
191
- children: falseLabel
49
+ function SchemaControl({ filter, schema, value, processing, onChange, onSearch }) {
50
+ const initial = useMemo(() => filterValue(value), [value]);
51
+ return /* @__PURE__ */ jsx(FormProvider, {
52
+ value: useMemo(() => ({
53
+ action: "#",
54
+ clearErrors: () => {},
55
+ componentId: `table-filter-${filter.key}`,
56
+ componentRef: "",
57
+ errors: {},
58
+ fieldIdPrefix: `table-filter-${filter.key}`,
59
+ fieldLabels: {},
60
+ precognitive: false,
61
+ processing,
62
+ searchOptions: (field, query, _values, signal) => onSearch ? onSearch(field, query, signal) : Promise.resolve([]),
63
+ validate: () => {}
64
+ }), [
65
+ filter.key,
66
+ onSearch,
67
+ processing
68
+ ]),
69
+ children: /* @__PURE__ */ jsx(PrefillProvider, {
70
+ value: { markUserEdit: () => {} },
71
+ children: /* @__PURE__ */ jsx(ResolvedNodesProvider, {
72
+ nodes: {},
73
+ children: /* @__PURE__ */ jsx(FormValuesProvider, {
74
+ initial,
75
+ children: /* @__PURE__ */ jsx(TableFilterCommitBridge, {
76
+ onChange,
77
+ children: /* @__PURE__ */ jsx("div", {
78
+ "aria-disabled": processing,
79
+ className: cn("grid gap-3", processing && "pointer-events-none opacity-60"),
80
+ children: /* @__PURE__ */ jsx(Renderer, { nodes: schema })
81
+ })
82
+ })
83
+ })
192
84
  })
193
- ]
85
+ })
194
86
  });
195
87
  }
196
- function DateRangeControl({ filter, value, processing, onChange }) {
197
- const { t } = useT("lattice");
198
- const range = value && typeof value === "object" ? value : {};
199
- function commit(next) {
200
- onChange({
201
- from: next.from ?? "",
202
- until: next.until ?? ""
203
- });
204
- }
205
- return /* @__PURE__ */ jsxs("div", {
206
- className: "flex items-center gap-1",
207
- children: [
208
- /* @__PURE__ */ jsx("input", {
209
- type: "date",
210
- "aria-label": t("table.filter.from", "{{label}} from", { label: filter.label }),
211
- "data-test": `table-filter-${filter.key}-from`,
212
- className: fieldClass,
213
- disabled: processing,
214
- value: range.from ?? "",
215
- onChange: (event) => commit({
216
- ...range,
217
- from: event.target.value
218
- })
219
- }),
220
- /* @__PURE__ */ jsx("span", {
221
- className: "text-lt-muted-fg",
222
- "aria-hidden": "true",
223
- children: "–"
224
- }),
225
- /* @__PURE__ */ jsx("input", {
226
- type: "date",
227
- "aria-label": t("table.filter.until", "{{label}} until", { label: filter.label }),
228
- "data-test": `table-filter-${filter.key}-until`,
229
- className: fieldClass,
230
- disabled: processing,
231
- value: range.until ?? "",
232
- onChange: (event) => commit({
233
- ...range,
234
- until: event.target.value
235
- })
236
- })
237
- ]
88
+ function TableFilterCommitBridge({ children, onChange }) {
89
+ const values = useFormValues();
90
+ const setValue = useSetFormValue();
91
+ const valuesRef = useRef(values);
92
+ valuesRef.current = values;
93
+ const write = useCallback((name, value) => {
94
+ const nextValue = typeof value === "function" ? value(getPath(valuesRef.current, name)) : value;
95
+ const next = setPath(valuesRef.current, name, nextValue);
96
+ valuesRef.current = next;
97
+ setValue(name, nextValue);
98
+ onChange(next);
99
+ }, [onChange, setValue]);
100
+ return /* @__PURE__ */ jsx(FieldCommitOverrideProvider, {
101
+ value: useMemo(() => ({
102
+ blur: () => {},
103
+ change: write,
104
+ commit: write
105
+ }), [write]),
106
+ children
238
107
  });
239
108
  }
240
109
  function ToggleControl({ filter, value, processing, onChange }) {
241
- const checked = value === "1" || value === true || value === "true";
110
+ const checked = isTruthy(filterValue(value).value);
242
111
  return /* @__PURE__ */ jsxs("label", {
243
112
  className: "flex h-lt-control-md cursor-pointer items-center gap-2 text-sm",
244
113
  children: [/* @__PURE__ */ jsx(Checkbox, {
245
- "aria-label": filter.label,
114
+ "aria-label": filter.props.label ?? void 0,
246
115
  "data-test": `table-filter-${filter.key}`,
247
116
  checked,
248
117
  disabled: processing,
249
- onCheckedChange: (next) => onChange(next === true ? "1" : "")
250
- }), /* @__PURE__ */ jsx("span", { children: filter.label })]
118
+ onCheckedChange: (next) => onChange(next === true ? { value: "1" } : void 0)
119
+ }), /* @__PURE__ */ jsx("span", { children: filter.props.label })]
251
120
  });
252
121
  }
122
+ function isTruthy(value) {
123
+ return value === true || value === "1" || value === 1 || value === "true";
124
+ }
253
125
  //#endregion
254
126
  export { TableFilterControl };
255
127
 
@@ -1 +1 @@
1
- {"version":3,"file":"filter-controls.js","names":[],"sources":["../../../resources/js/table/components/filter-controls.tsx"],"sourcesContent":["import { Icon } from \"@lattice-php/lattice/icons\";\nimport { useState } from \"react\";\nimport { Checkbox } from \"@lattice-php/lattice/core/components/checkbox\";\nimport { Combobox } from \"@lattice-php/lattice/core/components/combobox\";\nimport { useT } from \"@lattice-php/lattice/i18n\";\nimport { cn } from \"@lattice-php/lattice/lib/utils\";\nimport type { FilterData, Option } from \"@lattice-php/lattice/types/generated\";\nimport { filterOptions, stringProp } from \"../filter-values\";\nimport { fieldClass } from \"./filter-value-input\";\n\ntype DateRangeValue = { from?: string; until?: string };\n\nexport type FilterOptionSearch = (query: string) => Promise<Option[]>;\n\n/**\n * Renders the control for a single dedicated table filter, dispatching on the\n * filter's `type`. The current value comes from the table state; `onChange`\n * pushes a new value (an empty value clears the filter).\n */\nexport function TableFilterControl({\n filter,\n value,\n processing,\n onChange,\n onSearch,\n}: {\n filter: FilterData;\n value: unknown;\n processing: boolean;\n onChange: (value: unknown) => void;\n onSearch?: FilterOptionSearch;\n}) {\n switch (filter.type) {\n case \"select\":\n if (filter.props.searchable === true && onSearch) {\n return (\n <SearchableSelectControl\n filter={filter}\n value={value}\n processing={processing}\n onChange={onChange}\n onSearch={onSearch}\n />\n );\n }\n\n return filter.props.multiple === true ? (\n <MultiSelectControl\n filter={filter}\n value={value}\n processing={processing}\n onChange={onChange}\n />\n ) : (\n <SelectControl filter={filter} value={value} processing={processing} onChange={onChange} />\n );\n case \"ternary\":\n return (\n <TernaryControl filter={filter} value={value} processing={processing} onChange={onChange} />\n );\n case \"date-range\":\n return (\n <DateRangeControl\n filter={filter}\n value={value}\n processing={processing}\n onChange={onChange}\n />\n );\n case \"toggle\":\n return (\n <ToggleControl filter={filter} value={value} processing={processing} onChange={onChange} />\n );\n default:\n return null;\n }\n}\n\nfunction SelectControl({\n filter,\n value,\n processing,\n onChange,\n}: {\n filter: FilterData;\n value: unknown;\n processing: boolean;\n onChange: (value: unknown) => void;\n}) {\n const { t } = useT(\"lattice\");\n const placeholder = stringProp(filter, \"placeholder\", t(\"table.filter.all\", \"All\"));\n\n return (\n <select\n aria-label={filter.label}\n data-test={`table-filter-${filter.key}`}\n className={fieldClass}\n disabled={processing}\n value={typeof value === \"string\" ? value : \"\"}\n onChange={(event) => onChange(event.target.value)}\n >\n <option value=\"\">{placeholder}</option>\n {filterOptions(filter).map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n );\n}\n\nfunction MultiSelectControl({\n filter,\n value,\n processing,\n onChange,\n}: {\n filter: FilterData;\n value: unknown;\n processing: boolean;\n onChange: (value: unknown) => void;\n}) {\n const { t } = useT(\"lattice\");\n const [open, setOpen] = useState(false);\n const selected = Array.isArray(value) ? (value as string[]) : [];\n\n function toggle(optionValue: string): void {\n const next = selected.includes(optionValue)\n ? selected.filter((item) => item !== optionValue)\n : [...selected, optionValue];\n\n onChange(next);\n }\n\n const summary =\n selected.length === 0\n ? stringProp(filter, \"placeholder\", t(\"table.filter.all\", \"All\"))\n : t(\"table.filter.selectedCount\", \"{{amount}} selected\", { amount: selected.length });\n\n return (\n <div className=\"relative\">\n <button\n type=\"button\"\n aria-label={filter.label}\n aria-expanded={open}\n data-test={`table-filter-${filter.key}`}\n className={`${fieldClass} flex items-center justify-between gap-2`}\n disabled={processing}\n onClick={() => setOpen((current) => !current)}\n >\n <span className=\"truncate\">{summary}</span>\n <Icon name=\"chevron-down\" aria-hidden=\"true\" className=\"size-lt-icon-sm shrink-0\" />\n </button>\n {open && (\n <div className=\"absolute z-lt-dropdown mt-1 min-w-full rounded-lt-sm border border-lt-border bg-lt-bg p-1 shadow-lt-md\">\n {filterOptions(filter).map((option) => (\n <label\n key={option.value}\n className=\"flex cursor-pointer items-center gap-2 rounded-lt-sm px-2 py-1.5 text-sm hover:bg-lt-muted\"\n >\n <Checkbox\n aria-label={option.label}\n data-test={`table-filter-${filter.key}-${option.value}`}\n checked={selected.includes(option.value)}\n disabled={processing}\n onCheckedChange={() => toggle(option.value)}\n />\n <span className=\"truncate\">{option.label}</span>\n </label>\n ))}\n </div>\n )}\n </div>\n );\n}\n\nfunction SearchableSelectControl({\n filter,\n value,\n processing,\n onChange,\n onSearch,\n}: {\n filter: FilterData;\n value: unknown;\n processing: boolean;\n onChange: (value: unknown) => void;\n onSearch: FilterOptionSearch;\n}) {\n const { t } = useT(\"lattice\");\n const multiple = filter.props.multiple === true;\n const [open, setOpen] = useState(false);\n const [results, setResults] = useState<Option[]>(() => filterOptions(filter));\n const [loading, setLoading] = useState(false);\n\n const selected = multiple\n ? Array.isArray(value)\n ? (value as string[])\n : []\n : typeof value === \"string\" && value !== \"\"\n ? [value]\n : [];\n\n const labels = new Map(\n [...filterOptions(filter), ...results].map((option) => [option.value, option.label]),\n );\n const summary =\n selected.length === 0\n ? stringProp(filter, \"placeholder\", t(\"table.filter.all\", \"All\"))\n : multiple\n ? t(\"table.filter.selectedCount\", \"{{amount}} selected\", { amount: selected.length })\n : (labels.get(selected[0]) ?? selected[0]);\n\n function search(query: string): void {\n setLoading(true);\n void onSearch(query).then((options) => {\n setResults(options);\n setLoading(false);\n });\n }\n\n function choose(optionValue: string): void {\n onChange(\n multiple\n ? selected.includes(optionValue)\n ? selected.filter((item) => item !== optionValue)\n : [...selected, optionValue]\n : optionValue,\n );\n }\n\n return (\n <Combobox\n contentClassName=\"w-60\"\n loading={loading}\n multiple={multiple}\n onSearch={search}\n onSelect={choose}\n open={open}\n onOpenChange={setOpen}\n options={results}\n searchLabel={t(\"table.filter.search\", \"Search\")}\n selected={selected}\n testId={`table-filter-${filter.key}`}\n trigger={\n <>\n <span className=\"truncate\">{summary}</span>\n <Icon name=\"chevron-down\" aria-hidden=\"true\" className=\"size-lt-icon-sm shrink-0\" />\n </>\n }\n triggerClassName={cn(fieldClass, \"flex items-center justify-between gap-2\")}\n triggerProps={{\n \"aria-label\": filter.label,\n \"data-test\": `table-filter-${filter.key}`,\n disabled: processing,\n }}\n />\n );\n}\n\nfunction TernaryControl({\n filter,\n value,\n processing,\n onChange,\n}: {\n filter: FilterData;\n value: unknown;\n processing: boolean;\n onChange: (value: unknown) => void;\n}) {\n const { t } = useT(\"lattice\");\n const placeholder = stringProp(filter, \"placeholder\", t(\"table.filter.all\", \"All\"));\n const trueLabel = stringProp(filter, \"trueLabel\", t(\"table.filter.true\", \"True\"));\n const falseLabel = stringProp(filter, \"falseLabel\", t(\"table.filter.false\", \"False\"));\n\n return (\n <select\n aria-label={filter.label}\n data-test={`table-filter-${filter.key}`}\n className={fieldClass}\n disabled={processing}\n value={typeof value === \"string\" ? value : \"\"}\n onChange={(event) => onChange(event.target.value)}\n >\n <option value=\"\">{placeholder}</option>\n <option value=\"true\">{trueLabel}</option>\n <option value=\"false\">{falseLabel}</option>\n </select>\n );\n}\n\nfunction DateRangeControl({\n filter,\n value,\n processing,\n onChange,\n}: {\n filter: FilterData;\n value: unknown;\n processing: boolean;\n onChange: (value: unknown) => void;\n}) {\n const { t } = useT(\"lattice\");\n const range: DateRangeValue = value && typeof value === \"object\" ? (value as DateRangeValue) : {};\n\n function commit(next: DateRangeValue): void {\n onChange({ from: next.from ?? \"\", until: next.until ?? \"\" });\n }\n\n return (\n <div className=\"flex items-center gap-1\">\n <input\n type=\"date\"\n aria-label={t(\"table.filter.from\", \"{{label}} from\", { label: filter.label })}\n data-test={`table-filter-${filter.key}-from`}\n className={fieldClass}\n disabled={processing}\n value={range.from ?? \"\"}\n onChange={(event) => commit({ ...range, from: event.target.value })}\n />\n <span className=\"text-lt-muted-fg\" aria-hidden=\"true\">\n –\n </span>\n <input\n type=\"date\"\n aria-label={t(\"table.filter.until\", \"{{label}} until\", { label: filter.label })}\n data-test={`table-filter-${filter.key}-until`}\n className={fieldClass}\n disabled={processing}\n value={range.until ?? \"\"}\n onChange={(event) => commit({ ...range, until: event.target.value })}\n />\n </div>\n );\n}\n\nfunction ToggleControl({\n filter,\n value,\n processing,\n onChange,\n}: {\n filter: FilterData;\n value: unknown;\n processing: boolean;\n onChange: (value: unknown) => void;\n}) {\n const checked = value === \"1\" || value === true || value === \"true\";\n\n return (\n <label className=\"flex h-lt-control-md cursor-pointer items-center gap-2 text-sm\">\n <Checkbox\n aria-label={filter.label}\n data-test={`table-filter-${filter.key}`}\n checked={checked}\n disabled={processing}\n onCheckedChange={(next) => onChange(next === true ? \"1\" : \"\")}\n />\n <span>{filter.label}</span>\n </label>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"filter-controls.js","names":[],"sources":["../../../resources/js/table/components/filter-controls.tsx"],"sourcesContent":["import { useCallback, useMemo, useRef } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { Checkbox } from \"@lattice-php/lattice/ui/checkbox\";\nimport { Renderer } from \"@lattice-php/lattice/core/renderer\";\nimport type { Node, Option } from \"@lattice-php/lattice/core/types\";\nimport {\n FieldCommitOverrideProvider,\n FormProvider,\n FormValuesProvider,\n getPath,\n PrefillProvider,\n ResolvedNodesProvider,\n setPath,\n useFormValues,\n useSetFormValue,\n} from \"@lattice-php/lattice/form/embed\";\nimport { Icon } from \"@lattice-php/lattice/icons\";\nimport { cn } from \"@lattice-php/lattice/lib/utils\";\nimport { filterValue, isActiveFilterValue } from \"@lattice-php/lattice/table/lib/filter-values\";\nimport type { FilterNode } from \"@lattice-php/lattice/table/types\";\n\nexport type FilterOptionSearch = (\n field: string,\n query: string,\n signal: AbortSignal,\n) => Promise<Option[]>;\n\ntype FilterValue = Record<string, unknown>;\n\nexport function TableFilterControl({\n filter,\n value,\n processing,\n onChange,\n onSearch,\n}: {\n filter: FilterNode;\n value: unknown;\n processing: boolean;\n onChange: (value: unknown) => void;\n onSearch?: FilterOptionSearch;\n}) {\n const schema = filter.schema ?? [];\n\n if (schema.length === 0) {\n return (\n <ToggleControl filter={filter} value={value} processing={processing} onChange={onChange} />\n );\n }\n\n return (\n <div className=\"flex items-end gap-2\">\n <div className=\"min-w-0 flex-1\">\n <SchemaControl\n filter={filter}\n schema={schema}\n value={value}\n processing={processing}\n onChange={onChange}\n onSearch={onSearch}\n />\n </div>\n {isActiveFilterValue(value) && (\n <button\n aria-label={`Clear ${filter.props.label} filter`}\n className=\"inline-flex size-lt-control-md shrink-0 items-center justify-center rounded-lt-sm text-lt-muted-fg hover:bg-lt-muted hover:text-lt-fg disabled:opacity-50\"\n disabled={processing}\n onClick={() => onChange(undefined)}\n type=\"button\"\n >\n <Icon name=\"x\" aria-hidden=\"true\" className=\"size-lt-icon-md\" />\n </button>\n )}\n </div>\n );\n}\n\nfunction SchemaControl({\n filter,\n schema,\n value,\n processing,\n onChange,\n onSearch,\n}: {\n filter: FilterNode;\n schema: Node[];\n value: unknown;\n processing: boolean;\n onChange: (value: unknown) => void;\n onSearch?: FilterOptionSearch;\n}) {\n const initial = useMemo(() => filterValue(value), [value]);\n const form = useMemo(\n () => ({\n action: \"#\",\n clearErrors: () => {},\n componentId: `table-filter-${filter.key}`,\n componentRef: \"\",\n errors: {},\n fieldIdPrefix: `table-filter-${filter.key}`,\n fieldLabels: {},\n precognitive: false,\n processing,\n searchOptions: (\n field: string,\n query: string,\n _values: Record<string, unknown>,\n signal: AbortSignal,\n ) => (onSearch ? onSearch(field, query, signal) : Promise.resolve([])),\n validate: () => {},\n }),\n [filter.key, onSearch, processing],\n );\n\n return (\n <FormProvider value={form}>\n <PrefillProvider value={{ markUserEdit: () => {} }}>\n <ResolvedNodesProvider nodes={{}}>\n <FormValuesProvider initial={initial}>\n <TableFilterCommitBridge onChange={onChange}>\n <div\n aria-disabled={processing}\n className={cn(\"grid gap-3\", processing && \"pointer-events-none opacity-60\")}\n >\n <Renderer nodes={schema} />\n </div>\n </TableFilterCommitBridge>\n </FormValuesProvider>\n </ResolvedNodesProvider>\n </PrefillProvider>\n </FormProvider>\n );\n}\n\nfunction TableFilterCommitBridge({\n children,\n onChange,\n}: {\n children: ReactNode;\n onChange: (value: FilterValue) => void;\n}) {\n const values = useFormValues();\n const setValue = useSetFormValue();\n const valuesRef = useRef(values);\n valuesRef.current = values;\n\n const write = useCallback(\n (name: string, value: unknown) => {\n const nextValue =\n typeof value === \"function\"\n ? (value as (previous: unknown) => unknown)(getPath(valuesRef.current, name))\n : value;\n const next = setPath(valuesRef.current, name, nextValue);\n\n valuesRef.current = next;\n setValue(name, nextValue);\n onChange(next);\n },\n [onChange, setValue],\n );\n\n const commit = useMemo(\n () => ({\n blur: () => {},\n change: write,\n commit: write,\n }),\n [write],\n );\n\n return <FieldCommitOverrideProvider value={commit}>{children}</FieldCommitOverrideProvider>;\n}\n\nfunction ToggleControl({\n filter,\n value,\n processing,\n onChange,\n}: {\n filter: FilterNode;\n value: unknown;\n processing: boolean;\n onChange: (value: unknown) => void;\n}) {\n const checked = isTruthy(filterValue(value).value);\n\n return (\n <label className=\"flex h-lt-control-md cursor-pointer items-center gap-2 text-sm\">\n <Checkbox\n aria-label={filter.props.label ?? undefined}\n data-test={`table-filter-${filter.key}`}\n checked={checked}\n disabled={processing}\n onCheckedChange={(next) => onChange(next === true ? { value: \"1\" } : undefined)}\n />\n <span>{filter.props.label}</span>\n </label>\n );\n}\n\nfunction isTruthy(value: unknown): boolean {\n return value === true || value === \"1\" || value === 1 || value === \"true\";\n}\n"],"mappings":"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"}