@furystack/shades-common-components 13.5.0 → 14.0.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 (356) hide show
  1. package/CHANGELOG.md +58 -0
  2. package/README.md +3 -3
  3. package/esm/components/accordion/accordion-item.js +1 -1
  4. package/esm/components/accordion/accordion-item.js.map +1 -1
  5. package/esm/components/accordion/accordion.js +1 -1
  6. package/esm/components/accordion/accordion.js.map +1 -1
  7. package/esm/components/alert.js +1 -1
  8. package/esm/components/alert.js.map +1 -1
  9. package/esm/components/app-bar-link.js +1 -1
  10. package/esm/components/app-bar-link.js.map +1 -1
  11. package/esm/components/app-bar.js +1 -1
  12. package/esm/components/app-bar.js.map +1 -1
  13. package/esm/components/avatar.js +1 -1
  14. package/esm/components/avatar.js.map +1 -1
  15. package/esm/components/badge.js +1 -1
  16. package/esm/components/badge.js.map +1 -1
  17. package/esm/components/breadcrumb.js +1 -1
  18. package/esm/components/breadcrumb.js.map +1 -1
  19. package/esm/components/breadcrumb.spec.js +3 -3
  20. package/esm/components/breadcrumb.spec.js.map +1 -1
  21. package/esm/components/button-group.js +4 -4
  22. package/esm/components/button-group.js.map +1 -1
  23. package/esm/components/button.js +1 -1
  24. package/esm/components/button.js.map +1 -1
  25. package/esm/components/button.spec.js +1 -1
  26. package/esm/components/button.spec.js.map +1 -1
  27. package/esm/components/cache-view.js +1 -1
  28. package/esm/components/cache-view.js.map +1 -1
  29. package/esm/components/cache-view.spec.js +2 -2
  30. package/esm/components/cache-view.spec.js.map +1 -1
  31. package/esm/components/card.js +5 -5
  32. package/esm/components/card.js.map +1 -1
  33. package/esm/components/carousel.js +1 -1
  34. package/esm/components/carousel.js.map +1 -1
  35. package/esm/components/chip.js +1 -1
  36. package/esm/components/chip.js.map +1 -1
  37. package/esm/components/circular-progress.d.ts +2 -4
  38. package/esm/components/circular-progress.d.ts.map +1 -1
  39. package/esm/components/circular-progress.js +3 -6
  40. package/esm/components/circular-progress.js.map +1 -1
  41. package/esm/components/circular-progress.spec.js +19 -14
  42. package/esm/components/circular-progress.spec.js.map +1 -1
  43. package/esm/components/command-palette/command-palette-input.js +1 -1
  44. package/esm/components/command-palette/command-palette-input.js.map +1 -1
  45. package/esm/components/command-palette/command-palette-suggestion-list.js +1 -1
  46. package/esm/components/command-palette/command-palette-suggestion-list.js.map +1 -1
  47. package/esm/components/command-palette/command-palette-suggestion-list.spec.js +1 -1
  48. package/esm/components/command-palette/command-palette-suggestion-list.spec.js.map +1 -1
  49. package/esm/components/command-palette/index.js +1 -1
  50. package/esm/components/command-palette/index.js.map +1 -1
  51. package/esm/components/context-menu/context-menu-item.js +1 -1
  52. package/esm/components/context-menu/context-menu-item.js.map +1 -1
  53. package/esm/components/context-menu/context-menu.js +1 -1
  54. package/esm/components/context-menu/context-menu.js.map +1 -1
  55. package/esm/components/data-grid/body.js +1 -1
  56. package/esm/components/data-grid/body.js.map +1 -1
  57. package/esm/components/data-grid/data-grid-row.js +1 -1
  58. package/esm/components/data-grid/data-grid-row.js.map +1 -1
  59. package/esm/components/data-grid/data-grid.d.ts +5 -2
  60. package/esm/components/data-grid/data-grid.d.ts.map +1 -1
  61. package/esm/components/data-grid/data-grid.js +5 -3
  62. package/esm/components/data-grid/data-grid.js.map +1 -1
  63. package/esm/components/data-grid/data-grid.spec.js +60 -60
  64. package/esm/components/data-grid/data-grid.spec.js.map +1 -1
  65. package/esm/components/data-grid/filters/boolean-filter.d.ts +2 -2
  66. package/esm/components/data-grid/filters/boolean-filter.d.ts.map +1 -1
  67. package/esm/components/data-grid/filters/boolean-filter.js +4 -4
  68. package/esm/components/data-grid/filters/boolean-filter.js.map +1 -1
  69. package/esm/components/data-grid/filters/boolean-filter.spec.js +18 -17
  70. package/esm/components/data-grid/filters/boolean-filter.spec.js.map +1 -1
  71. package/esm/components/data-grid/filters/date-filter.d.ts +2 -2
  72. package/esm/components/data-grid/filters/date-filter.d.ts.map +1 -1
  73. package/esm/components/data-grid/filters/date-filter.js +6 -6
  74. package/esm/components/data-grid/filters/date-filter.js.map +1 -1
  75. package/esm/components/data-grid/filters/date-filter.spec.js +26 -21
  76. package/esm/components/data-grid/filters/date-filter.spec.js.map +1 -1
  77. package/esm/components/data-grid/filters/enum-filter.d.ts +2 -2
  78. package/esm/components/data-grid/filters/enum-filter.d.ts.map +1 -1
  79. package/esm/components/data-grid/filters/enum-filter.js +5 -5
  80. package/esm/components/data-grid/filters/enum-filter.js.map +1 -1
  81. package/esm/components/data-grid/filters/enum-filter.spec.js +21 -19
  82. package/esm/components/data-grid/filters/enum-filter.spec.js.map +1 -1
  83. package/esm/components/data-grid/filters/filter-dropdown.js +1 -1
  84. package/esm/components/data-grid/filters/filter-dropdown.js.map +1 -1
  85. package/esm/components/data-grid/filters/number-filter.d.ts +2 -2
  86. package/esm/components/data-grid/filters/number-filter.d.ts.map +1 -1
  87. package/esm/components/data-grid/filters/number-filter.js +5 -5
  88. package/esm/components/data-grid/filters/number-filter.js.map +1 -1
  89. package/esm/components/data-grid/filters/number-filter.spec.js +23 -21
  90. package/esm/components/data-grid/filters/number-filter.spec.js.map +1 -1
  91. package/esm/components/data-grid/filters/string-filter.d.ts +2 -2
  92. package/esm/components/data-grid/filters/string-filter.d.ts.map +1 -1
  93. package/esm/components/data-grid/filters/string-filter.js +5 -5
  94. package/esm/components/data-grid/filters/string-filter.js.map +1 -1
  95. package/esm/components/data-grid/filters/string-filter.spec.js +21 -19
  96. package/esm/components/data-grid/filters/string-filter.spec.js.map +1 -1
  97. package/esm/components/data-grid/footer.d.ts +2 -2
  98. package/esm/components/data-grid/footer.d.ts.map +1 -1
  99. package/esm/components/data-grid/footer.js +8 -13
  100. package/esm/components/data-grid/footer.js.map +1 -1
  101. package/esm/components/data-grid/footer.spec.js +38 -27
  102. package/esm/components/data-grid/footer.spec.js.map +1 -1
  103. package/esm/components/data-grid/header.d.ts +6 -6
  104. package/esm/components/data-grid/header.d.ts.map +1 -1
  105. package/esm/components/data-grid/header.js +16 -17
  106. package/esm/components/data-grid/header.js.map +1 -1
  107. package/esm/components/data-grid/header.spec.js +66 -60
  108. package/esm/components/data-grid/header.spec.js.map +1 -1
  109. package/esm/components/data-grid/selection-cell.js +1 -1
  110. package/esm/components/data-grid/selection-cell.js.map +1 -1
  111. package/esm/components/dialog.js +1 -1
  112. package/esm/components/dialog.js.map +1 -1
  113. package/esm/components/divider.js +1 -1
  114. package/esm/components/divider.js.map +1 -1
  115. package/esm/components/drawer/drawer-toggle-button.js +1 -1
  116. package/esm/components/drawer/drawer-toggle-button.js.map +1 -1
  117. package/esm/components/drawer/index.js +1 -1
  118. package/esm/components/drawer/index.js.map +1 -1
  119. package/esm/components/dropdown.js +1 -1
  120. package/esm/components/dropdown.js.map +1 -1
  121. package/esm/components/fab.js +1 -1
  122. package/esm/components/fab.js.map +1 -1
  123. package/esm/components/form.js +1 -1
  124. package/esm/components/form.js.map +1 -1
  125. package/esm/components/grid.js +1 -1
  126. package/esm/components/grid.js.map +1 -1
  127. package/esm/components/icons/icon.js +1 -1
  128. package/esm/components/icons/icon.js.map +1 -1
  129. package/esm/components/image.js +2 -2
  130. package/esm/components/image.js.map +1 -1
  131. package/esm/components/inputs/autocomplete.js +1 -1
  132. package/esm/components/inputs/autocomplete.js.map +1 -1
  133. package/esm/components/inputs/checkbox.js +1 -1
  134. package/esm/components/inputs/checkbox.js.map +1 -1
  135. package/esm/components/inputs/checkbox.spec.js +1 -1
  136. package/esm/components/inputs/checkbox.spec.js.map +1 -1
  137. package/esm/components/inputs/input-number.js +1 -1
  138. package/esm/components/inputs/input-number.js.map +1 -1
  139. package/esm/components/inputs/input-number.spec.js +1 -1
  140. package/esm/components/inputs/input-number.spec.js.map +1 -1
  141. package/esm/components/inputs/input.js +1 -1
  142. package/esm/components/inputs/input.js.map +1 -1
  143. package/esm/components/inputs/input.spec.js +1 -1
  144. package/esm/components/inputs/input.spec.js.map +1 -1
  145. package/esm/components/inputs/radio-group.js +1 -1
  146. package/esm/components/inputs/radio-group.js.map +1 -1
  147. package/esm/components/inputs/radio-group.spec.js +1 -1
  148. package/esm/components/inputs/radio-group.spec.js.map +1 -1
  149. package/esm/components/inputs/radio.js +1 -1
  150. package/esm/components/inputs/radio.js.map +1 -1
  151. package/esm/components/inputs/radio.spec.js +1 -1
  152. package/esm/components/inputs/radio.spec.js.map +1 -1
  153. package/esm/components/inputs/select.js +1 -1
  154. package/esm/components/inputs/select.js.map +1 -1
  155. package/esm/components/inputs/slider.js +1 -1
  156. package/esm/components/inputs/slider.js.map +1 -1
  157. package/esm/components/inputs/switch.js +1 -1
  158. package/esm/components/inputs/switch.js.map +1 -1
  159. package/esm/components/inputs/switch.spec.js +1 -1
  160. package/esm/components/inputs/switch.spec.js.map +1 -1
  161. package/esm/components/inputs/text-area.js +1 -1
  162. package/esm/components/inputs/text-area.js.map +1 -1
  163. package/esm/components/inputs/text-area.spec.js +1 -1
  164. package/esm/components/inputs/text-area.spec.js.map +1 -1
  165. package/esm/components/linear-progress.d.ts +2 -4
  166. package/esm/components/linear-progress.d.ts.map +1 -1
  167. package/esm/components/linear-progress.js +3 -6
  168. package/esm/components/linear-progress.js.map +1 -1
  169. package/esm/components/linear-progress.spec.js +21 -18
  170. package/esm/components/linear-progress.spec.js.map +1 -1
  171. package/esm/components/list/list-item.js +1 -1
  172. package/esm/components/list/list-item.js.map +1 -1
  173. package/esm/components/list/list.js +1 -1
  174. package/esm/components/list/list.js.map +1 -1
  175. package/esm/components/loader.js +1 -1
  176. package/esm/components/loader.js.map +1 -1
  177. package/esm/components/loader.spec.js +1 -1
  178. package/esm/components/loader.spec.js.map +1 -1
  179. package/esm/components/markdown/markdown-display.js +1 -1
  180. package/esm/components/markdown/markdown-display.js.map +1 -1
  181. package/esm/components/markdown/markdown-display.spec.js +1 -1
  182. package/esm/components/markdown/markdown-display.spec.js.map +1 -1
  183. package/esm/components/markdown/markdown-editor.js +1 -1
  184. package/esm/components/markdown/markdown-editor.js.map +1 -1
  185. package/esm/components/markdown/markdown-editor.spec.js +1 -1
  186. package/esm/components/markdown/markdown-editor.spec.js.map +1 -1
  187. package/esm/components/markdown/markdown-input.js +1 -1
  188. package/esm/components/markdown/markdown-input.js.map +1 -1
  189. package/esm/components/markdown/markdown-input.spec.js +1 -1
  190. package/esm/components/markdown/markdown-input.spec.js.map +1 -1
  191. package/esm/components/menu/menu.js +1 -1
  192. package/esm/components/menu/menu.js.map +1 -1
  193. package/esm/components/modal.js +1 -1
  194. package/esm/components/modal.js.map +1 -1
  195. package/esm/components/modal.spec.js +3 -3
  196. package/esm/components/modal.spec.js.map +1 -1
  197. package/esm/components/noty-list.js +2 -2
  198. package/esm/components/noty-list.js.map +1 -1
  199. package/esm/components/page-container/index.js +1 -1
  200. package/esm/components/page-container/index.js.map +1 -1
  201. package/esm/components/page-container/page-header.js +1 -1
  202. package/esm/components/page-container/page-header.js.map +1 -1
  203. package/esm/components/page-layout/index.js +1 -1
  204. package/esm/components/page-layout/index.js.map +1 -1
  205. package/esm/components/pagination.js +1 -1
  206. package/esm/components/pagination.js.map +1 -1
  207. package/esm/components/paper.js +1 -1
  208. package/esm/components/paper.js.map +1 -1
  209. package/esm/components/rating.js +1 -1
  210. package/esm/components/rating.js.map +1 -1
  211. package/esm/components/rating.spec.js +1 -1
  212. package/esm/components/rating.spec.js.map +1 -1
  213. package/esm/components/result.js +1 -1
  214. package/esm/components/result.js.map +1 -1
  215. package/esm/components/skeleton.js +1 -1
  216. package/esm/components/skeleton.js.map +1 -1
  217. package/esm/components/suggest/index.js +1 -1
  218. package/esm/components/suggest/index.js.map +1 -1
  219. package/esm/components/suggest/index.spec.js +1 -1
  220. package/esm/components/suggest/index.spec.js.map +1 -1
  221. package/esm/components/suggest/suggest-input.js +1 -1
  222. package/esm/components/suggest/suggest-input.js.map +1 -1
  223. package/esm/components/suggest/suggest-input.spec.js +1 -1
  224. package/esm/components/suggest/suggest-input.spec.js.map +1 -1
  225. package/esm/components/suggest/suggestion-list.js +1 -1
  226. package/esm/components/suggest/suggestion-list.js.map +1 -1
  227. package/esm/components/suggest/suggestion-list.spec.js +1 -1
  228. package/esm/components/suggest/suggestion-list.spec.js.map +1 -1
  229. package/esm/components/tabs.js +2 -2
  230. package/esm/components/tabs.js.map +1 -1
  231. package/esm/components/timeline.js +2 -2
  232. package/esm/components/timeline.js.map +1 -1
  233. package/esm/components/tooltip.js +1 -1
  234. package/esm/components/tooltip.js.map +1 -1
  235. package/esm/components/tree/tree-item.js +1 -1
  236. package/esm/components/tree/tree-item.js.map +1 -1
  237. package/esm/components/tree/tree.js +1 -1
  238. package/esm/components/tree/tree.js.map +1 -1
  239. package/esm/components/typography.js +1 -1
  240. package/esm/components/typography.js.map +1 -1
  241. package/esm/components/wizard/index.js +1 -1
  242. package/esm/components/wizard/index.js.map +1 -1
  243. package/esm/components/wizard/index.spec.js +3 -3
  244. package/esm/components/wizard/index.spec.js.map +1 -1
  245. package/package.json +3 -3
  246. package/src/components/accordion/accordion-item.tsx +1 -1
  247. package/src/components/accordion/accordion.tsx +1 -1
  248. package/src/components/alert.tsx +1 -1
  249. package/src/components/app-bar-link.tsx +1 -1
  250. package/src/components/app-bar.tsx +1 -1
  251. package/src/components/avatar.tsx +1 -1
  252. package/src/components/badge.tsx +1 -1
  253. package/src/components/breadcrumb.spec.tsx +3 -3
  254. package/src/components/breadcrumb.tsx +1 -1
  255. package/src/components/button-group.tsx +4 -4
  256. package/src/components/button.spec.tsx +1 -1
  257. package/src/components/button.tsx +1 -1
  258. package/src/components/cache-view.spec.tsx +2 -2
  259. package/src/components/cache-view.tsx +3 -3
  260. package/src/components/card.tsx +5 -5
  261. package/src/components/carousel.tsx +1 -1
  262. package/src/components/chip.tsx +1 -1
  263. package/src/components/circular-progress.spec.tsx +20 -14
  264. package/src/components/circular-progress.tsx +5 -11
  265. package/src/components/command-palette/command-palette-input.tsx +1 -1
  266. package/src/components/command-palette/command-palette-suggestion-list.spec.tsx +1 -1
  267. package/src/components/command-palette/command-palette-suggestion-list.tsx +1 -1
  268. package/src/components/command-palette/index.tsx +1 -1
  269. package/src/components/context-menu/context-menu-item.tsx +1 -1
  270. package/src/components/context-menu/context-menu.tsx +1 -1
  271. package/src/components/data-grid/body.tsx +1 -1
  272. package/src/components/data-grid/data-grid-row.tsx +1 -1
  273. package/src/components/data-grid/data-grid.spec.tsx +62 -36
  274. package/src/components/data-grid/data-grid.tsx +14 -8
  275. package/src/components/data-grid/filters/boolean-filter.spec.tsx +29 -18
  276. package/src/components/data-grid/filters/boolean-filter.tsx +6 -6
  277. package/src/components/data-grid/filters/date-filter.spec.tsx +35 -22
  278. package/src/components/data-grid/filters/date-filter.tsx +8 -8
  279. package/src/components/data-grid/filters/enum-filter.spec.tsx +35 -20
  280. package/src/components/data-grid/filters/enum-filter.tsx +7 -7
  281. package/src/components/data-grid/filters/filter-dropdown.tsx +1 -1
  282. package/src/components/data-grid/filters/number-filter.spec.tsx +32 -22
  283. package/src/components/data-grid/filters/number-filter.tsx +7 -7
  284. package/src/components/data-grid/filters/string-filter.spec.tsx +32 -20
  285. package/src/components/data-grid/filters/string-filter.tsx +7 -7
  286. package/src/components/data-grid/footer.spec.tsx +79 -31
  287. package/src/components/data-grid/footer.tsx +10 -15
  288. package/src/components/data-grid/header.spec.tsx +152 -68
  289. package/src/components/data-grid/header.tsx +64 -27
  290. package/src/components/data-grid/selection-cell.tsx +1 -1
  291. package/src/components/dialog.tsx +1 -1
  292. package/src/components/divider.tsx +1 -1
  293. package/src/components/drawer/drawer-toggle-button.tsx +1 -1
  294. package/src/components/drawer/index.tsx +1 -1
  295. package/src/components/dropdown.tsx +1 -1
  296. package/src/components/fab.tsx +1 -1
  297. package/src/components/form.tsx +1 -1
  298. package/src/components/grid.tsx +1 -1
  299. package/src/components/icons/icon.tsx +1 -1
  300. package/src/components/image.tsx +2 -2
  301. package/src/components/inputs/autocomplete.tsx +1 -1
  302. package/src/components/inputs/checkbox.spec.tsx +1 -1
  303. package/src/components/inputs/checkbox.tsx +1 -1
  304. package/src/components/inputs/input-number.spec.tsx +1 -1
  305. package/src/components/inputs/input-number.tsx +1 -1
  306. package/src/components/inputs/input.spec.tsx +1 -1
  307. package/src/components/inputs/input.tsx +1 -1
  308. package/src/components/inputs/radio-group.spec.tsx +1 -1
  309. package/src/components/inputs/radio-group.tsx +1 -1
  310. package/src/components/inputs/radio.spec.tsx +1 -1
  311. package/src/components/inputs/radio.tsx +1 -1
  312. package/src/components/inputs/select.tsx +1 -1
  313. package/src/components/inputs/slider.tsx +1 -1
  314. package/src/components/inputs/switch.spec.tsx +1 -1
  315. package/src/components/inputs/switch.tsx +1 -1
  316. package/src/components/inputs/text-area.spec.tsx +1 -1
  317. package/src/components/inputs/text-area.tsx +1 -1
  318. package/src/components/linear-progress.spec.tsx +22 -18
  319. package/src/components/linear-progress.tsx +5 -11
  320. package/src/components/list/list-item.tsx +1 -1
  321. package/src/components/list/list.tsx +1 -1
  322. package/src/components/loader.spec.tsx +1 -1
  323. package/src/components/loader.tsx +1 -1
  324. package/src/components/markdown/markdown-display.spec.tsx +1 -1
  325. package/src/components/markdown/markdown-display.tsx +1 -1
  326. package/src/components/markdown/markdown-editor.spec.tsx +1 -1
  327. package/src/components/markdown/markdown-editor.tsx +1 -1
  328. package/src/components/markdown/markdown-input.spec.tsx +1 -1
  329. package/src/components/markdown/markdown-input.tsx +1 -1
  330. package/src/components/menu/menu.tsx +1 -1
  331. package/src/components/modal.spec.tsx +3 -3
  332. package/src/components/modal.tsx +1 -1
  333. package/src/components/noty-list.tsx +2 -2
  334. package/src/components/page-container/index.tsx +1 -1
  335. package/src/components/page-container/page-header.tsx +1 -1
  336. package/src/components/page-layout/index.tsx +1 -1
  337. package/src/components/pagination.tsx +1 -1
  338. package/src/components/paper.tsx +1 -1
  339. package/src/components/rating.spec.tsx +1 -1
  340. package/src/components/rating.tsx +1 -1
  341. package/src/components/result.tsx +1 -1
  342. package/src/components/skeleton.tsx +1 -1
  343. package/src/components/suggest/index.spec.tsx +1 -1
  344. package/src/components/suggest/index.tsx +1 -1
  345. package/src/components/suggest/suggest-input.spec.tsx +1 -1
  346. package/src/components/suggest/suggest-input.tsx +1 -1
  347. package/src/components/suggest/suggestion-list.spec.tsx +1 -1
  348. package/src/components/suggest/suggestion-list.tsx +1 -1
  349. package/src/components/tabs.tsx +2 -2
  350. package/src/components/timeline.tsx +2 -2
  351. package/src/components/tooltip.tsx +1 -1
  352. package/src/components/tree/tree-item.tsx +1 -1
  353. package/src/components/tree/tree.tsx +1 -1
  354. package/src/components/typography.tsx +1 -1
  355. package/src/components/wizard/index.spec.tsx +3 -3
  356. package/src/components/wizard/index.tsx +1 -1
@@ -1,12 +1,41 @@
1
- import type { FindOptions } from '@furystack/core'
2
1
  import { Injector } from '@furystack/inject'
3
- import { createComponent, flushUpdates, initializeShadeRoot } from '@furystack/shades'
2
+ import { createComponent, flushUpdates, initializeShadeRoot, Shade } from '@furystack/shades'
4
3
  import { ObservableValue, usingAsync } from '@furystack/utils'
5
4
  import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
6
5
  import type { FilterableFindOptions } from './data-grid.js'
7
6
  import { DataGridHeader, OrderButton } from './header.js'
8
7
 
9
- type TestItem = { id: number; name: string; email: string }
8
+ const OrderButtonWrapper = Shade<{ obs: ObservableValue<FilterableFindOptions>; field: string }>({
9
+ customElementName: 'test-order-button-wrapper',
10
+ render: ({ props, useObservable }) => {
11
+ const [findOptions, setFindOptions] = useObservable('findOptions', props.obs)
12
+ return <OrderButton field={props.field} findOptions={findOptions} onFindOptionsChange={setFindOptions} />
13
+ },
14
+ })
15
+
16
+ const HeaderWrapper = Shade<{
17
+ obs: ObservableValue<FilterableFindOptions>
18
+ field: string
19
+ filterConfig?:
20
+ | { type: 'string' }
21
+ | { type: 'number' }
22
+ | { type: 'boolean' }
23
+ | { type: 'date' }
24
+ | { type: 'enum'; values: Array<{ label: string; value: string }> }
25
+ }>({
26
+ customElementName: 'test-header-wrapper',
27
+ render: ({ props, useObservable }) => {
28
+ const [findOptions, setFindOptions] = useObservable('findOptions', props.obs)
29
+ return (
30
+ <DataGridHeader
31
+ field={props.field}
32
+ findOptions={findOptions}
33
+ onFindOptionsChange={setFindOptions}
34
+ filterConfig={props.filterConfig}
35
+ />
36
+ )
37
+ },
38
+ })
10
39
 
11
40
  describe('DataGridHeader', () => {
12
41
  let originalAnimate: typeof Element.prototype.animate
@@ -41,28 +70,16 @@ describe('DataGridHeader', () => {
41
70
  Element.prototype.animate = originalAnimate
42
71
  })
43
72
 
44
- const createFindOptions = (
45
- options: Partial<FindOptions<TestItem, Array<keyof TestItem>>> = {},
46
- ): ObservableValue<FindOptions<TestItem, Array<keyof TestItem>>> => {
47
- return new ObservableValue<FindOptions<TestItem, Array<keyof TestItem>>>(options)
48
- }
49
-
50
- const createFilterableFindOptions = (
51
- options: Partial<FilterableFindOptions> = {},
52
- ): ObservableValue<FilterableFindOptions> => {
53
- return new ObservableValue<FilterableFindOptions>(options)
54
- }
55
-
56
73
  describe('rendering', () => {
57
74
  it('should render with custom element', async () => {
58
75
  await usingAsync(new Injector(), async (injector) => {
59
76
  const rootElement = document.getElementById('root') as HTMLDivElement
60
- const findOptions = createFindOptions()
77
+ const onFindOptionsChange = vi.fn()
61
78
 
62
79
  initializeShadeRoot({
63
80
  injector,
64
81
  rootElement,
65
- jsxElement: <DataGridHeader field="name" findOptions={findOptions} />,
82
+ jsxElement: <DataGridHeader field="name" findOptions={{}} onFindOptionsChange={onFindOptionsChange} />,
66
83
  })
67
84
 
68
85
  await flushUpdates()
@@ -75,12 +92,12 @@ describe('DataGridHeader', () => {
75
92
  it('should render field name', async () => {
76
93
  await usingAsync(new Injector(), async (injector) => {
77
94
  const rootElement = document.getElementById('root') as HTMLDivElement
78
- const findOptions = createFindOptions()
95
+ const onFindOptionsChange = vi.fn()
79
96
 
80
97
  initializeShadeRoot({
81
98
  injector,
82
99
  rootElement,
83
- jsxElement: <DataGridHeader field="name" findOptions={findOptions} />,
100
+ jsxElement: <DataGridHeader field="name" findOptions={{}} onFindOptionsChange={onFindOptionsChange} />,
84
101
  })
85
102
 
86
103
  await flushUpdates()
@@ -94,12 +111,12 @@ describe('DataGridHeader', () => {
94
111
  it('should render order button', async () => {
95
112
  await usingAsync(new Injector(), async (injector) => {
96
113
  const rootElement = document.getElementById('root') as HTMLDivElement
97
- const findOptions = createFindOptions()
114
+ const onFindOptionsChange = vi.fn()
98
115
 
99
116
  initializeShadeRoot({
100
117
  injector,
101
118
  rootElement,
102
- jsxElement: <DataGridHeader field="name" findOptions={findOptions} />,
119
+ jsxElement: <DataGridHeader field="name" findOptions={{}} onFindOptionsChange={onFindOptionsChange} />,
103
120
  })
104
121
 
105
122
  await flushUpdates()
@@ -112,12 +129,12 @@ describe('DataGridHeader', () => {
112
129
  it('should not render filter button when no filterConfig is provided', async () => {
113
130
  await usingAsync(new Injector(), async (injector) => {
114
131
  const rootElement = document.getElementById('root') as HTMLDivElement
115
- const findOptions = createFindOptions()
132
+ const onFindOptionsChange = vi.fn()
116
133
 
117
134
  initializeShadeRoot({
118
135
  injector,
119
136
  rootElement,
120
- jsxElement: <DataGridHeader field="name" findOptions={findOptions} />,
137
+ jsxElement: <DataGridHeader field="name" findOptions={{}} onFindOptionsChange={onFindOptionsChange} />,
121
138
  })
122
139
 
123
140
  await flushUpdates()
@@ -130,12 +147,19 @@ describe('DataGridHeader', () => {
130
147
  it('should render filter button when filterConfig is provided', async () => {
131
148
  await usingAsync(new Injector(), async (injector) => {
132
149
  const rootElement = document.getElementById('root') as HTMLDivElement
133
- const findOptions = createFindOptions()
150
+ const onFindOptionsChange = vi.fn()
134
151
 
135
152
  initializeShadeRoot({
136
153
  injector,
137
154
  rootElement,
138
- jsxElement: <DataGridHeader field="name" findOptions={findOptions} filterConfig={{ type: 'string' }} />,
155
+ jsxElement: (
156
+ <DataGridHeader
157
+ field="name"
158
+ findOptions={{}}
159
+ onFindOptionsChange={onFindOptionsChange}
160
+ filterConfig={{ type: 'string' }}
161
+ />
162
+ ),
139
163
  })
140
164
 
141
165
  await flushUpdates()
@@ -150,12 +174,12 @@ describe('DataGridHeader', () => {
150
174
  it('should show neutral icon when no order is set', async () => {
151
175
  await usingAsync(new Injector(), async (injector) => {
152
176
  const rootElement = document.getElementById('root') as HTMLDivElement
153
- const findOptions = createFilterableFindOptions()
177
+ const onFindOptionsChange = vi.fn()
154
178
 
155
179
  initializeShadeRoot({
156
180
  injector,
157
181
  rootElement,
158
- jsxElement: <OrderButton field="name" findOptions={findOptions} />,
182
+ jsxElement: <OrderButton field="name" findOptions={{}} onFindOptionsChange={onFindOptionsChange} />,
159
183
  })
160
184
 
161
185
  await flushUpdates()
@@ -165,15 +189,15 @@ describe('DataGridHeader', () => {
165
189
  })
166
190
  })
167
191
 
168
- it('should toggle order to ASC when clicking on unsorted field', async () => {
192
+ it('should call onFindOptionsChange with ASC when clicking on unsorted field', async () => {
169
193
  await usingAsync(new Injector(), async (injector) => {
170
194
  const rootElement = document.getElementById('root') as HTMLDivElement
171
- const findOptions = createFilterableFindOptions()
195
+ const onFindOptionsChange = vi.fn()
172
196
 
173
197
  initializeShadeRoot({
174
198
  injector,
175
199
  rootElement,
176
- jsxElement: <OrderButton field="name" findOptions={findOptions} />,
200
+ jsxElement: <OrderButton field="name" findOptions={{}} onFindOptionsChange={onFindOptionsChange} />,
177
201
  })
178
202
 
179
203
  await flushUpdates()
@@ -183,20 +207,25 @@ describe('DataGridHeader', () => {
183
207
 
184
208
  await flushUpdates()
185
209
 
186
- const updatedOptions = findOptions.getValue()
187
- expect(updatedOptions.order).toEqual({ name: 'ASC' })
210
+ expect(onFindOptionsChange).toHaveBeenCalledWith(expect.objectContaining({ order: { name: 'ASC' } }))
188
211
  })
189
212
  })
190
213
 
191
- it('should toggle order from ASC to DESC when clicking', async () => {
214
+ it('should call onFindOptionsChange with DESC when clicking on ASC-sorted field', async () => {
192
215
  await usingAsync(new Injector(), async (injector) => {
193
216
  const rootElement = document.getElementById('root') as HTMLDivElement
194
- const findOptions = createFilterableFindOptions({ order: { name: 'ASC' } })
217
+ const onFindOptionsChange = vi.fn()
195
218
 
196
219
  initializeShadeRoot({
197
220
  injector,
198
221
  rootElement,
199
- jsxElement: <OrderButton field="name" findOptions={findOptions} />,
222
+ jsxElement: (
223
+ <OrderButton
224
+ field="name"
225
+ findOptions={{ order: { name: 'ASC' } }}
226
+ onFindOptionsChange={onFindOptionsChange}
227
+ />
228
+ ),
200
229
  })
201
230
 
202
231
  await flushUpdates()
@@ -206,20 +235,25 @@ describe('DataGridHeader', () => {
206
235
 
207
236
  await flushUpdates()
208
237
 
209
- const updatedOptions = findOptions.getValue()
210
- expect(updatedOptions.order).toEqual({ name: 'DESC' })
238
+ expect(onFindOptionsChange).toHaveBeenCalledWith(expect.objectContaining({ order: { name: 'DESC' } }))
211
239
  })
212
240
  })
213
241
 
214
- it('should toggle order from DESC to ASC when clicking', async () => {
242
+ it('should call onFindOptionsChange with ASC when clicking on DESC-sorted field', async () => {
215
243
  await usingAsync(new Injector(), async (injector) => {
216
244
  const rootElement = document.getElementById('root') as HTMLDivElement
217
- const findOptions = createFilterableFindOptions({ order: { name: 'DESC' } })
245
+ const onFindOptionsChange = vi.fn()
218
246
 
219
247
  initializeShadeRoot({
220
248
  injector,
221
249
  rootElement,
222
- jsxElement: <OrderButton field="name" findOptions={findOptions} />,
250
+ jsxElement: (
251
+ <OrderButton
252
+ field="name"
253
+ findOptions={{ order: { name: 'DESC' } }}
254
+ onFindOptionsChange={onFindOptionsChange}
255
+ />
256
+ ),
223
257
  })
224
258
 
225
259
  await flushUpdates()
@@ -229,20 +263,19 @@ describe('DataGridHeader', () => {
229
263
 
230
264
  await flushUpdates()
231
265
 
232
- const updatedOptions = findOptions.getValue()
233
- expect(updatedOptions.order).toEqual({ name: 'ASC' })
266
+ expect(onFindOptionsChange).toHaveBeenCalledWith(expect.objectContaining({ order: { name: 'ASC' } }))
234
267
  })
235
268
  })
236
269
 
237
270
  it('should react to external findOptions changes', async () => {
238
271
  await usingAsync(new Injector(), async (injector) => {
239
272
  const rootElement = document.getElementById('root') as HTMLDivElement
240
- const findOptions = createFilterableFindOptions()
273
+ const obs = new ObservableValue<FilterableFindOptions>({})
241
274
 
242
275
  initializeShadeRoot({
243
276
  injector,
244
277
  rootElement,
245
- jsxElement: <OrderButton field="name" findOptions={findOptions} />,
278
+ jsxElement: <OrderButtonWrapper obs={obs} field="name" />,
246
279
  })
247
280
 
248
281
  await flushUpdates()
@@ -250,7 +283,7 @@ describe('DataGridHeader', () => {
250
283
  let button = document.querySelector('data-grid-order-button')
251
284
  expect(button?.querySelector('shade-icon')).not.toBeNull()
252
285
 
253
- findOptions.setValue({ order: { name: 'ASC' } })
286
+ obs.setValue({ order: { name: 'ASC' } })
254
287
  await flushUpdates()
255
288
 
256
289
  button = document.querySelector('data-grid-order-button')
@@ -263,12 +296,19 @@ describe('DataGridHeader', () => {
263
296
  it('should show inactive state when no filter is set', async () => {
264
297
  await usingAsync(new Injector(), async (injector) => {
265
298
  const rootElement = document.getElementById('root') as HTMLDivElement
266
- const findOptions = createFindOptions()
299
+ const onFindOptionsChange = vi.fn()
267
300
 
268
301
  initializeShadeRoot({
269
302
  injector,
270
303
  rootElement,
271
- jsxElement: <DataGridHeader field="name" findOptions={findOptions} filterConfig={{ type: 'string' }} />,
304
+ jsxElement: (
305
+ <DataGridHeader
306
+ field="name"
307
+ findOptions={{}}
308
+ onFindOptionsChange={onFindOptionsChange}
309
+ filterConfig={{ type: 'string' }}
310
+ />
311
+ ),
272
312
  })
273
313
 
274
314
  await flushUpdates()
@@ -281,12 +321,19 @@ describe('DataGridHeader', () => {
281
321
  it('should show active state when filter is set for field', async () => {
282
322
  await usingAsync(new Injector(), async (injector) => {
283
323
  const rootElement = document.getElementById('root') as HTMLDivElement
284
- const findOptions = createFindOptions({ filter: { name: { $regex: 'test' } } })
324
+ const onFindOptionsChange = vi.fn()
285
325
 
286
326
  initializeShadeRoot({
287
327
  injector,
288
328
  rootElement,
289
- jsxElement: <DataGridHeader field="name" findOptions={findOptions} filterConfig={{ type: 'string' }} />,
329
+ jsxElement: (
330
+ <DataGridHeader
331
+ field="name"
332
+ findOptions={{ filter: { name: { $regex: 'test' } } }}
333
+ onFindOptionsChange={onFindOptionsChange}
334
+ filterConfig={{ type: 'string' }}
335
+ />
336
+ ),
290
337
  })
291
338
 
292
339
  await flushUpdates()
@@ -299,21 +346,22 @@ describe('DataGridHeader', () => {
299
346
  it('should transition from active to inactive when filter is externally cleared', async () => {
300
347
  await usingAsync(new Injector(), async (injector) => {
301
348
  const rootElement = document.getElementById('root') as HTMLDivElement
302
- const findOptions = createFindOptions({ filter: { name: { $regex: 'test' } } })
349
+ const obs = new ObservableValue<FilterableFindOptions>({
350
+ filter: { name: { $regex: 'test' } },
351
+ })
303
352
 
304
353
  initializeShadeRoot({
305
354
  injector,
306
355
  rootElement,
307
- jsxElement: <DataGridHeader field="name" findOptions={findOptions} filterConfig={{ type: 'string' }} />,
356
+ jsxElement: <HeaderWrapper obs={obs} field="name" filterConfig={{ type: 'string' }} />,
308
357
  })
309
358
 
310
- // Parent renders, then child FilterButton renders
311
359
  await flushUpdates()
312
360
 
313
361
  const filterButton = document.querySelector('data-grid-filter-button button')
314
362
  expect(filterButton?.hasAttribute('data-selected')).toBe(true)
315
363
 
316
- findOptions.setValue({ filter: {} })
364
+ obs.setValue({ filter: {} })
317
365
  await flushUpdates()
318
366
 
319
367
  const updatedButton = document.querySelector('data-grid-filter-button button')
@@ -324,12 +372,19 @@ describe('DataGridHeader', () => {
324
372
  it('should open filter dropdown when clicked', async () => {
325
373
  await usingAsync(new Injector(), async (injector) => {
326
374
  const rootElement = document.getElementById('root') as HTMLDivElement
327
- const findOptions = createFindOptions()
375
+ const onFindOptionsChange = vi.fn()
328
376
 
329
377
  initializeShadeRoot({
330
378
  injector,
331
379
  rootElement,
332
- jsxElement: <DataGridHeader field="name" findOptions={findOptions} filterConfig={{ type: 'string' }} />,
380
+ jsxElement: (
381
+ <DataGridHeader
382
+ field="name"
383
+ findOptions={{}}
384
+ onFindOptionsChange={onFindOptionsChange}
385
+ filterConfig={{ type: 'string' }}
386
+ />
387
+ ),
333
388
  })
334
389
 
335
390
  await flushUpdates()
@@ -349,12 +404,19 @@ describe('DataGridHeader', () => {
349
404
  it('should render StringFilter for string filterConfig', async () => {
350
405
  await usingAsync(new Injector(), async (injector) => {
351
406
  const rootElement = document.getElementById('root') as HTMLDivElement
352
- const findOptions = createFindOptions()
407
+ const onFindOptionsChange = vi.fn()
353
408
 
354
409
  initializeShadeRoot({
355
410
  injector,
356
411
  rootElement,
357
- jsxElement: <DataGridHeader field="name" findOptions={findOptions} filterConfig={{ type: 'string' }} />,
412
+ jsxElement: (
413
+ <DataGridHeader
414
+ field="name"
415
+ findOptions={{}}
416
+ onFindOptionsChange={onFindOptionsChange}
417
+ filterConfig={{ type: 'string' }}
418
+ />
419
+ ),
358
420
  })
359
421
 
360
422
  await flushUpdates()
@@ -372,12 +434,19 @@ describe('DataGridHeader', () => {
372
434
  it('should render NumberFilter for number filterConfig', async () => {
373
435
  await usingAsync(new Injector(), async (injector) => {
374
436
  const rootElement = document.getElementById('root') as HTMLDivElement
375
- const findOptions = createFindOptions()
437
+ const onFindOptionsChange = vi.fn()
376
438
 
377
439
  initializeShadeRoot({
378
440
  injector,
379
441
  rootElement,
380
- jsxElement: <DataGridHeader field="id" findOptions={findOptions} filterConfig={{ type: 'number' }} />,
442
+ jsxElement: (
443
+ <DataGridHeader
444
+ field="id"
445
+ findOptions={{}}
446
+ onFindOptionsChange={onFindOptionsChange}
447
+ filterConfig={{ type: 'number' }}
448
+ />
449
+ ),
381
450
  })
382
451
 
383
452
  await flushUpdates()
@@ -395,12 +464,19 @@ describe('DataGridHeader', () => {
395
464
  it('should render BooleanFilter for boolean filterConfig', async () => {
396
465
  await usingAsync(new Injector(), async (injector) => {
397
466
  const rootElement = document.getElementById('root') as HTMLDivElement
398
- const findOptions = createFindOptions()
467
+ const onFindOptionsChange = vi.fn()
399
468
 
400
469
  initializeShadeRoot({
401
470
  injector,
402
471
  rootElement,
403
- jsxElement: <DataGridHeader field="name" findOptions={findOptions} filterConfig={{ type: 'boolean' }} />,
472
+ jsxElement: (
473
+ <DataGridHeader
474
+ field="name"
475
+ findOptions={{}}
476
+ onFindOptionsChange={onFindOptionsChange}
477
+ filterConfig={{ type: 'boolean' }}
478
+ />
479
+ ),
404
480
  })
405
481
 
406
482
  await flushUpdates()
@@ -418,7 +494,7 @@ describe('DataGridHeader', () => {
418
494
  it('should render EnumFilter for enum filterConfig', async () => {
419
495
  await usingAsync(new Injector(), async (injector) => {
420
496
  const rootElement = document.getElementById('root') as HTMLDivElement
421
- const findOptions = createFindOptions()
497
+ const onFindOptionsChange = vi.fn()
422
498
 
423
499
  initializeShadeRoot({
424
500
  injector,
@@ -426,7 +502,8 @@ describe('DataGridHeader', () => {
426
502
  jsxElement: (
427
503
  <DataGridHeader
428
504
  field="name"
429
- findOptions={findOptions}
505
+ findOptions={{}}
506
+ onFindOptionsChange={onFindOptionsChange}
430
507
  filterConfig={{ type: 'enum', values: [{ label: 'A', value: 'a' }] }}
431
508
  />
432
509
  ),
@@ -447,12 +524,19 @@ describe('DataGridHeader', () => {
447
524
  it('should render DateFilter for date filterConfig', async () => {
448
525
  await usingAsync(new Injector(), async (injector) => {
449
526
  const rootElement = document.getElementById('root') as HTMLDivElement
450
- const findOptions = createFindOptions()
527
+ const onFindOptionsChange = vi.fn()
451
528
 
452
529
  initializeShadeRoot({
453
530
  injector,
454
531
  rootElement,
455
- jsxElement: <DataGridHeader field="name" findOptions={findOptions} filterConfig={{ type: 'date' }} />,
532
+ jsxElement: (
533
+ <DataGridHeader
534
+ field="name"
535
+ findOptions={{}}
536
+ onFindOptionsChange={onFindOptionsChange}
537
+ filterConfig={{ type: 'date' }}
538
+ />
539
+ ),
456
540
  })
457
541
 
458
542
  await flushUpdates()
@@ -472,12 +556,12 @@ describe('DataGridHeader', () => {
472
556
  it('should support both sorting and filtering simultaneously', async () => {
473
557
  await usingAsync(new Injector(), async (injector) => {
474
558
  const rootElement = document.getElementById('root') as HTMLDivElement
475
- const findOptions = createFindOptions()
559
+ const obs = new ObservableValue<FilterableFindOptions>({})
476
560
 
477
561
  initializeShadeRoot({
478
562
  injector,
479
563
  rootElement,
480
- jsxElement: <DataGridHeader field="name" findOptions={findOptions} filterConfig={{ type: 'string' }} />,
564
+ jsxElement: <HeaderWrapper obs={obs} field="name" filterConfig={{ type: 'string' }} />,
481
565
  })
482
566
 
483
567
  await flushUpdates()
@@ -487,7 +571,7 @@ describe('DataGridHeader', () => {
487
571
 
488
572
  await flushUpdates()
489
573
 
490
- expect(findOptions.getValue().order).toEqual({ name: 'ASC' })
574
+ expect(obs.getValue().order).toEqual({ name: 'ASC' })
491
575
 
492
576
  const filterButton = document.querySelector('data-grid-filter-button')?.querySelector('button')
493
577
  filterButton?.click()
@@ -1,7 +1,5 @@
1
- import type { FindOptions } from '@furystack/core'
2
1
  import type { ChildrenList } from '@furystack/shades'
3
2
  import { Shade, createComponent } from '@furystack/shades'
4
- import type { ObservableValue } from '@furystack/utils'
5
3
  import { ToggleButton } from '../button-group.js'
6
4
  import { arrowDown, arrowUp, arrowUpDown, filter as filterIcon } from '../icons/icon-definitions.js'
7
5
  import { Icon } from '../icons/icon.js'
@@ -14,22 +12,24 @@ import { FilterDropdown } from './filters/filter-dropdown.js'
14
12
  import { NumberFilter } from './filters/number-filter.js'
15
13
  import { StringFilter } from './filters/string-filter.js'
16
14
 
17
- export type DataGridHeaderProps<T, Column extends string> = {
15
+ export type DataGridHeaderProps<Column extends string> = {
18
16
  field: Column
19
- findOptions: ObservableValue<FindOptions<T, Array<keyof T>>>
17
+ findOptions: FilterableFindOptions
18
+ onFindOptionsChange: (options: FilterableFindOptions) => void
20
19
  filterConfig?: ColumnFilterConfig
21
20
  }
22
21
 
23
22
  export const OrderButton = Shade<{
24
23
  field: string
25
- findOptions: ObservableValue<FilterableFindOptions>
24
+ findOptions: FilterableFindOptions
25
+ onFindOptionsChange: (options: FilterableFindOptions) => void
26
26
  }>({
27
- shadowDomName: 'data-grid-order-button',
27
+ customElementName: 'data-grid-order-button',
28
28
  css: {
29
29
  display: 'inline-block',
30
30
  },
31
- render: ({ props, useObservable }) => {
32
- const [findOptions, onFindOptionsChange] = useObservable('findOptions', props.findOptions, {})
31
+ render: ({ props }) => {
32
+ const { findOptions } = props
33
33
 
34
34
  const currentOrder = Object.keys(findOptions.order || {})[0]
35
35
  const currentOrderDirection = Object.values(findOptions.order || {})[0]
@@ -48,7 +48,7 @@ export const OrderButton = Shade<{
48
48
  newDirection = currentOrderDirection === 'ASC' ? 'DESC' : 'ASC'
49
49
  }
50
50
  newOrder[props.field] = newDirection
51
- onFindOptionsChange({
51
+ props.onFindOptionsChange({
52
52
  ...findOptions,
53
53
  order: newOrder,
54
54
  })
@@ -67,17 +67,15 @@ export const OrderButton = Shade<{
67
67
 
68
68
  const FilterButton = Shade<{
69
69
  field: string
70
- findOptions: ObservableValue<FilterableFindOptions>
70
+ findOptions: FilterableFindOptions
71
71
  onclick: () => void
72
72
  }>({
73
- shadowDomName: 'data-grid-filter-button',
73
+ customElementName: 'data-grid-filter-button',
74
74
  css: {
75
75
  display: 'inline-block',
76
76
  },
77
- render: ({ props, useObservable }) => {
78
- const [findOptions] = useObservable('currentValue', props.findOptions)
79
-
80
- const hasActiveFilter = !!findOptions.filter?.[props.field]
77
+ render: ({ props }) => {
78
+ const hasActiveFilter = !!props.findOptions.filter?.[props.field]
81
79
 
82
80
  return (
83
81
  <ToggleButton
@@ -100,20 +98,57 @@ const FilterButton = Shade<{
100
98
  const renderFilterComponent = (
101
99
  filterConfig: ColumnFilterConfig,
102
100
  field: string,
103
- findOptions: ObservableValue<FilterableFindOptions>,
101
+ findOptions: FilterableFindOptions,
102
+ onFindOptionsChange: (options: FilterableFindOptions) => void,
104
103
  onClose: () => void,
105
104
  ): JSX.Element => {
106
105
  switch (filterConfig.type) {
107
106
  case 'number':
108
- return <NumberFilter field={field} findOptions={findOptions} onClose={onClose} />
107
+ return (
108
+ <NumberFilter
109
+ field={field}
110
+ findOptions={findOptions}
111
+ onFindOptionsChange={onFindOptionsChange}
112
+ onClose={onClose}
113
+ />
114
+ )
109
115
  case 'boolean':
110
- return <BooleanFilter field={field} findOptions={findOptions} onClose={onClose} />
116
+ return (
117
+ <BooleanFilter
118
+ field={field}
119
+ findOptions={findOptions}
120
+ onFindOptionsChange={onFindOptionsChange}
121
+ onClose={onClose}
122
+ />
123
+ )
111
124
  case 'enum':
112
- return <EnumFilter field={field} values={filterConfig.values} findOptions={findOptions} onClose={onClose} />
125
+ return (
126
+ <EnumFilter
127
+ field={field}
128
+ values={filterConfig.values}
129
+ findOptions={findOptions}
130
+ onFindOptionsChange={onFindOptionsChange}
131
+ onClose={onClose}
132
+ />
133
+ )
113
134
  case 'date':
114
- return <DateFilter field={field} findOptions={findOptions} onClose={onClose} />
135
+ return (
136
+ <DateFilter
137
+ field={field}
138
+ findOptions={findOptions}
139
+ onFindOptionsChange={onFindOptionsChange}
140
+ onClose={onClose}
141
+ />
142
+ )
115
143
  case 'string':
116
- return <StringFilter field={field} findOptions={findOptions} onClose={onClose} />
144
+ return (
145
+ <StringFilter
146
+ field={field}
147
+ findOptions={findOptions}
148
+ onFindOptionsChange={onFindOptionsChange}
149
+ onClose={onClose}
150
+ />
151
+ )
117
152
  default: {
118
153
  const _exhaustive: never = filterConfig
119
154
  throw new Error(`Unknown filter type: ${(_exhaustive as ColumnFilterConfig).type}`)
@@ -121,11 +156,11 @@ const renderFilterComponent = (
121
156
  }
122
157
  }
123
158
 
124
- export const DataGridHeader: <T, Column extends string>(
125
- props: DataGridHeaderProps<T, Column>,
159
+ export const DataGridHeader: <Column extends string>(
160
+ props: DataGridHeaderProps<Column>,
126
161
  children: ChildrenList,
127
162
  ) => JSX.Element<any> = Shade({
128
- shadowDomName: 'data-grid-header',
163
+ customElementName: 'data-grid-header',
129
164
  css: {
130
165
  display: 'block',
131
166
  fontFamily: cssVariableTheme.typography.fontFamily,
@@ -164,13 +199,14 @@ export const DataGridHeader: <T, Column extends string>(
164
199
  {props.filterConfig && (
165
200
  <FilterButton
166
201
  onclick={() => setIsFilterOpen(!isFilterOpen)}
167
- findOptions={props.findOptions as ObservableValue<FilterableFindOptions>}
202
+ findOptions={props.findOptions}
168
203
  field={props.field}
169
204
  />
170
205
  )}
171
206
  <OrderButton
172
207
  field={props.field}
173
- findOptions={props.findOptions as ObservableValue<FilterableFindOptions>}
208
+ findOptions={props.findOptions}
209
+ onFindOptionsChange={props.onFindOptionsChange}
174
210
  />
175
211
  </div>
176
212
  </div>
@@ -179,7 +215,8 @@ export const DataGridHeader: <T, Column extends string>(
179
215
  {renderFilterComponent(
180
216
  props.filterConfig,
181
217
  props.field,
182
- props.findOptions as ObservableValue<FilterableFindOptions>,
218
+ props.findOptions,
219
+ props.onFindOptionsChange,
183
220
  closeFilter,
184
221
  )}
185
222
  </FilterDropdown>
@@ -3,7 +3,7 @@ import type { CollectionService } from '../../services/collection-service.js'
3
3
  import { cssVariableTheme } from '../../services/css-variable-theme.js'
4
4
 
5
5
  export const SelectionCell = Shade<{ entry: any; service: CollectionService<any> }>({
6
- shadowDomName: 'shades-data-grid-selection-cell',
6
+ customElementName: 'shades-data-grid-selection-cell',
7
7
  css: {
8
8
  display: 'inline-flex',
9
9
  fontFamily: cssVariableTheme.typography.fontFamily,