@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,6 +1,6 @@
1
1
  import { Injector } from '@furystack/inject'
2
2
  import { createComponent, flushUpdates, initializeShadeRoot } from '@furystack/shades'
3
- import { ObservableValue, usingAsync } from '@furystack/utils'
3
+ import { usingAsync } from '@furystack/utils'
4
4
  import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
5
5
  import type { FilterableFindOptions } from '../data-grid.js'
6
6
  import { NumberFilter } from './number-filter.js'
@@ -14,24 +14,32 @@ describe('NumberFilter', () => {
14
14
  document.body.innerHTML = ''
15
15
  })
16
16
 
17
- const createFindOptions = (options: Partial<FilterableFindOptions> = {}): ObservableValue<FilterableFindOptions> => {
18
- return new ObservableValue<FilterableFindOptions>(options)
17
+ const createFindOptions = (options: Partial<FilterableFindOptions> = {}): FilterableFindOptions => {
18
+ return options as FilterableFindOptions
19
19
  }
20
20
 
21
21
  const renderNumberFilter = async (
22
- findOptions: ObservableValue<FilterableFindOptions>,
22
+ findOptions: FilterableFindOptions,
23
23
  field = 'level',
24
24
  onClose = vi.fn(),
25
+ onFindOptionsChange = vi.fn(),
25
26
  ) => {
26
27
  const injector = new Injector()
27
28
  const rootElement = document.getElementById('root')!
28
29
  initializeShadeRoot({
29
30
  injector,
30
31
  rootElement,
31
- jsxElement: <NumberFilter field={field} findOptions={findOptions} onClose={onClose} />,
32
+ jsxElement: (
33
+ <NumberFilter
34
+ field={field}
35
+ findOptions={findOptions}
36
+ onFindOptionsChange={onFindOptionsChange}
37
+ onClose={onClose}
38
+ />
39
+ ),
32
40
  })
33
41
  await flushUpdates()
34
- return { injector, onClose }
42
+ return { injector, onClose, onFindOptionsChange }
35
43
  }
36
44
 
37
45
  it('should render operator segmented control and input', async () => {
@@ -47,7 +55,7 @@ describe('NumberFilter', () => {
47
55
 
48
56
  it('should apply $eq filter on submit', async () => {
49
57
  const findOptions = createFindOptions()
50
- const { injector, onClose } = await renderNumberFilter(findOptions)
58
+ const { injector, onClose, onFindOptionsChange } = await renderNumberFilter(findOptions)
51
59
  await usingAsync(injector, async () => {
52
60
  const input = document.querySelector('[data-testid="number-filter-value"]') as HTMLInputElement
53
61
  input.value = '42'
@@ -57,14 +65,14 @@ describe('NumberFilter', () => {
57
65
  form.dispatchEvent(new Event('submit', { bubbles: true }))
58
66
  await flushUpdates()
59
67
 
60
- expect(findOptions.getValue().filter).toEqual({ level: { $eq: 42 } })
68
+ expect(onFindOptionsChange).toHaveBeenCalledWith(expect.objectContaining({ filter: { level: { $eq: 42 } } }))
61
69
  expect(onClose).toHaveBeenCalled()
62
70
  })
63
71
  })
64
72
 
65
73
  it('should apply $gt operator when selected', async () => {
66
74
  const findOptions = createFindOptions()
67
- const { injector, onClose } = await renderNumberFilter(findOptions)
75
+ const { injector, onClose, onFindOptionsChange } = await renderNumberFilter(findOptions)
68
76
  await usingAsync(injector, async () => {
69
77
  const gtButton = document.querySelector('shade-segmented-control button[data-value="$gt"]') as HTMLButtonElement
70
78
  gtButton?.click()
@@ -78,14 +86,14 @@ describe('NumberFilter', () => {
78
86
  form.dispatchEvent(new Event('submit', { bubbles: true }))
79
87
  await flushUpdates()
80
88
 
81
- expect(findOptions.getValue().filter).toEqual({ level: { $gt: 10 } })
89
+ expect(onFindOptionsChange).toHaveBeenCalledWith(expect.objectContaining({ filter: { level: { $gt: 10 } } }))
82
90
  expect(onClose).toHaveBeenCalled()
83
91
  })
84
92
  })
85
93
 
86
94
  it('should apply $lte operator when selected', async () => {
87
95
  const findOptions = createFindOptions()
88
- const { injector, onClose } = await renderNumberFilter(findOptions)
96
+ const { injector, onClose, onFindOptionsChange } = await renderNumberFilter(findOptions)
89
97
  await usingAsync(injector, async () => {
90
98
  const lteButton = document.querySelector('shade-segmented-control button[data-value="$lte"]') as HTMLButtonElement
91
99
  lteButton?.click()
@@ -99,27 +107,28 @@ describe('NumberFilter', () => {
99
107
  form.dispatchEvent(new Event('submit', { bubbles: true }))
100
108
  await flushUpdates()
101
109
 
102
- expect(findOptions.getValue().filter).toEqual({ level: { $lte: 99.5 } })
110
+ expect(onFindOptionsChange).toHaveBeenCalledWith(expect.objectContaining({ filter: { level: { $lte: 99.5 } } }))
103
111
  expect(onClose).toHaveBeenCalled()
104
112
  })
105
113
  })
106
114
 
107
115
  it('should clear filter when Clear button is clicked', async () => {
108
116
  const findOptions = createFindOptions({ filter: { level: { $eq: 5 } } })
109
- const { injector, onClose } = await renderNumberFilter(findOptions)
117
+ const { injector, onClose, onFindOptionsChange } = await renderNumberFilter(findOptions)
110
118
  await usingAsync(injector, async () => {
111
119
  const clearButton = Array.from(document.querySelectorAll('button')).find((b) => b.textContent?.trim() === 'Clear')
112
120
  clearButton?.click()
113
121
  await flushUpdates()
114
122
 
115
- expect(findOptions.getValue().filter?.level).toBeUndefined()
123
+ const updatedOptions = onFindOptionsChange.mock.lastCall?.[0] as FilterableFindOptions
124
+ expect(updatedOptions.filter?.level).toBeUndefined()
116
125
  expect(onClose).toHaveBeenCalled()
117
126
  })
118
127
  })
119
128
 
120
129
  it('should remove filter when submitting NaN value', async () => {
121
130
  const findOptions = createFindOptions({ filter: { level: { $eq: 5 } } })
122
- const { injector, onClose } = await renderNumberFilter(findOptions)
131
+ const { injector, onClose, onFindOptionsChange } = await renderNumberFilter(findOptions)
123
132
  await usingAsync(injector, async () => {
124
133
  const input = document.querySelector('[data-testid="number-filter-value"]') as HTMLInputElement
125
134
  input.value = ''
@@ -129,28 +138,29 @@ describe('NumberFilter', () => {
129
138
  form.dispatchEvent(new Event('submit', { bubbles: true }))
130
139
  await flushUpdates()
131
140
 
132
- expect(findOptions.getValue().filter?.level).toBeUndefined()
141
+ const updatedOptions = onFindOptionsChange.mock.lastCall?.[0] as FilterableFindOptions
142
+ expect(updatedOptions.filter?.level).toBeUndefined()
133
143
  expect(onClose).toHaveBeenCalled()
134
144
  })
135
145
  })
136
146
 
137
147
  it('should preserve filters on other fields', async () => {
138
148
  const findOptions = createFindOptions({ filter: { level: { $gt: 10 }, name: { $regex: 'keep' } } })
139
- const { injector } = await renderNumberFilter(findOptions)
149
+ const { injector, onFindOptionsChange } = await renderNumberFilter(findOptions)
140
150
  await usingAsync(injector, async () => {
141
151
  const clearButton = Array.from(document.querySelectorAll('button')).find((b) => b.textContent?.trim() === 'Clear')
142
152
  clearButton?.click()
143
153
  await flushUpdates()
144
154
 
145
- const updatedFilter = findOptions.getValue().filter
146
- expect(updatedFilter?.level).toBeUndefined()
147
- expect(updatedFilter?.name).toEqual({ $regex: 'keep' })
155
+ const updatedOptions = onFindOptionsChange.mock.lastCall?.[0] as FilterableFindOptions
156
+ expect(updatedOptions.filter?.level).toBeUndefined()
157
+ expect(updatedOptions.filter?.name).toEqual({ $regex: 'keep' })
148
158
  })
149
159
  })
150
160
 
151
161
  it('should reset skip to 0 when applying filter', async () => {
152
162
  const findOptions = createFindOptions({ skip: 20 })
153
- const { injector } = await renderNumberFilter(findOptions)
163
+ const { injector, onFindOptionsChange } = await renderNumberFilter(findOptions)
154
164
  await usingAsync(injector, async () => {
155
165
  const input = document.querySelector('[data-testid="number-filter-value"]') as HTMLInputElement
156
166
  input.value = '5'
@@ -160,7 +170,7 @@ describe('NumberFilter', () => {
160
170
  form.dispatchEvent(new Event('submit', { bubbles: true }))
161
171
  await flushUpdates()
162
172
 
163
- expect(findOptions.getValue().skip).toBe(0)
173
+ expect(onFindOptionsChange).toHaveBeenCalledWith(expect.objectContaining({ skip: 0 }))
164
174
  })
165
175
  })
166
176
 
@@ -1,5 +1,4 @@
1
1
  import { createComponent, Shade } from '@furystack/shades'
2
- import type { ObservableValue } from '@furystack/utils'
3
2
  import { Button } from '../../button.js'
4
3
  import { SegmentedControl } from '../../button-group.js'
5
4
  import { Icon } from '../../icons/icon.js'
@@ -20,17 +19,18 @@ const operatorLabels: Record<NumberOperator, string> = {
20
19
 
21
20
  export const NumberFilter = Shade<{
22
21
  field: string
23
- findOptions: ObservableValue<FilterableFindOptions>
22
+ findOptions: FilterableFindOptions
23
+ onFindOptionsChange: (options: FilterableFindOptions) => void
24
24
  onClose: () => void
25
25
  }>({
26
- shadowDomName: 'data-grid-number-filter',
26
+ customElementName: 'data-grid-number-filter',
27
27
  css: {
28
28
  ...filterBaseCss,
29
29
  fontFamily: cssVariableTheme.typography.fontFamily,
30
30
  '& input': filterInputCss,
31
31
  },
32
- render: ({ props, useObservable, useState }) => {
33
- const [findOptions, setFindOptions] = useObservable('findOptions', props.findOptions)
32
+ render: ({ props, useState }) => {
33
+ const { findOptions } = props
34
34
 
35
35
  const currentFilter = findOptions.filter?.[props.field] as Record<string, number> | undefined
36
36
  const currentOperator: NumberOperator = currentFilter
@@ -46,14 +46,14 @@ export const NumberFilter = Shade<{
46
46
  } else {
47
47
  filter[props.field] = { [operator]: num }
48
48
  }
49
- setFindOptions({ ...findOptions, filter, skip: 0 })
49
+ props.onFindOptionsChange({ ...findOptions, filter, skip: 0 })
50
50
  props.onClose()
51
51
  }
52
52
 
53
53
  const clearFilter = () => {
54
54
  const filter = { ...findOptions.filter }
55
55
  delete filter[props.field]
56
- setFindOptions({ ...findOptions, filter, skip: 0 })
56
+ props.onFindOptionsChange({ ...findOptions, filter, skip: 0 })
57
57
  props.onClose()
58
58
  }
59
59
 
@@ -1,6 +1,6 @@
1
1
  import { Injector } from '@furystack/inject'
2
2
  import { createComponent, flushUpdates, initializeShadeRoot } from '@furystack/shades'
3
- import { ObservableValue, usingAsync } from '@furystack/utils'
3
+ import { usingAsync } from '@furystack/utils'
4
4
  import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
5
5
  import type { FilterableFindOptions } from '../data-grid.js'
6
6
  import { StringFilter } from './string-filter.js'
@@ -14,24 +14,32 @@ describe('StringFilter', () => {
14
14
  document.body.innerHTML = ''
15
15
  })
16
16
 
17
- const createFindOptions = (options: Partial<FilterableFindOptions> = {}): ObservableValue<FilterableFindOptions> => {
18
- return new ObservableValue<FilterableFindOptions>(options)
17
+ const createFindOptions = (options: Partial<FilterableFindOptions> = {}): FilterableFindOptions => {
18
+ return options as FilterableFindOptions
19
19
  }
20
20
 
21
21
  const renderStringFilter = async (
22
- findOptions: ObservableValue<FilterableFindOptions>,
22
+ findOptions: FilterableFindOptions,
23
23
  field = 'name',
24
24
  onClose = vi.fn(),
25
+ onFindOptionsChange = vi.fn(),
25
26
  ) => {
26
27
  const injector = new Injector()
27
28
  const rootElement = document.getElementById('root')!
28
29
  initializeShadeRoot({
29
30
  injector,
30
31
  rootElement,
31
- jsxElement: <StringFilter field={field} findOptions={findOptions} onClose={onClose} />,
32
+ jsxElement: (
33
+ <StringFilter
34
+ field={field}
35
+ findOptions={findOptions}
36
+ onFindOptionsChange={onFindOptionsChange}
37
+ onClose={onClose}
38
+ />
39
+ ),
32
40
  })
33
41
  await flushUpdates()
34
- return { injector, onClose }
42
+ return { injector, onClose, onFindOptionsChange }
35
43
  }
36
44
 
37
45
  it('should render operator segmented control and input', async () => {
@@ -47,7 +55,7 @@ describe('StringFilter', () => {
47
55
 
48
56
  it('should apply $regex filter on submit', async () => {
49
57
  const findOptions = createFindOptions()
50
- const { injector, onClose } = await renderStringFilter(findOptions)
58
+ const { injector, onClose, onFindOptionsChange } = await renderStringFilter(findOptions)
51
59
  await usingAsync(injector, async () => {
52
60
  const input = document.querySelector('[data-testid="string-filter-value"]') as HTMLInputElement
53
61
  input.value = 'test-value'
@@ -57,27 +65,30 @@ describe('StringFilter', () => {
57
65
  form.dispatchEvent(new Event('submit', { bubbles: true }))
58
66
  await flushUpdates()
59
67
 
60
- expect(findOptions.getValue().filter).toEqual({ name: { $regex: 'test-value' } })
68
+ expect(onFindOptionsChange).toHaveBeenCalledWith(
69
+ expect.objectContaining({ filter: { name: { $regex: 'test-value' } } }),
70
+ )
61
71
  expect(onClose).toHaveBeenCalled()
62
72
  })
63
73
  })
64
74
 
65
75
  it('should clear filter when Clear button is clicked', async () => {
66
76
  const findOptions = createFindOptions({ filter: { name: { $regex: 'existing' } } })
67
- const { injector, onClose } = await renderStringFilter(findOptions)
77
+ const { injector, onClose, onFindOptionsChange } = await renderStringFilter(findOptions)
68
78
  await usingAsync(injector, async () => {
69
79
  const clearButton = Array.from(document.querySelectorAll('button')).find((b) => b.textContent?.trim() === 'Clear')
70
80
  clearButton?.click()
71
81
  await flushUpdates()
72
82
 
73
- expect(findOptions.getValue().filter?.name).toBeUndefined()
83
+ const updatedOptions = onFindOptionsChange.mock.lastCall?.[0] as FilterableFindOptions
84
+ expect(updatedOptions.filter?.name).toBeUndefined()
74
85
  expect(onClose).toHaveBeenCalled()
75
86
  })
76
87
  })
77
88
 
78
89
  it('should remove filter when submitting empty value', async () => {
79
90
  const findOptions = createFindOptions({ filter: { name: { $regex: 'existing' } } })
80
- const { injector, onClose } = await renderStringFilter(findOptions)
91
+ const { injector, onClose, onFindOptionsChange } = await renderStringFilter(findOptions)
81
92
  await usingAsync(injector, async () => {
82
93
  const input = document.querySelector('[data-testid="string-filter-value"]') as HTMLInputElement
83
94
  input.value = ''
@@ -87,14 +98,15 @@ describe('StringFilter', () => {
87
98
  form.dispatchEvent(new Event('submit', { bubbles: true }))
88
99
  await flushUpdates()
89
100
 
90
- expect(findOptions.getValue().filter?.name).toBeUndefined()
101
+ const updatedOptions = onFindOptionsChange.mock.lastCall?.[0] as FilterableFindOptions
102
+ expect(updatedOptions.filter?.name).toBeUndefined()
91
103
  expect(onClose).toHaveBeenCalled()
92
104
  })
93
105
  })
94
106
 
95
107
  it('should preserve filters on other fields', async () => {
96
108
  const findOptions = createFindOptions({ filter: { name: { $regex: 'old' }, email: { $regex: 'keep' } } })
97
- const { injector } = await renderStringFilter(findOptions)
109
+ const { injector, onFindOptionsChange } = await renderStringFilter(findOptions)
98
110
  await usingAsync(injector, async () => {
99
111
  const input = document.querySelector('[data-testid="string-filter-value"]') as HTMLInputElement
100
112
  input.value = 'new-value'
@@ -104,15 +116,15 @@ describe('StringFilter', () => {
104
116
  form.dispatchEvent(new Event('submit', { bubbles: true }))
105
117
  await flushUpdates()
106
118
 
107
- const updatedFilter = findOptions.getValue().filter
108
- expect(updatedFilter?.name).toEqual({ $regex: 'new-value' })
109
- expect(updatedFilter?.email).toEqual({ $regex: 'keep' })
119
+ const updatedOptions = onFindOptionsChange.mock.lastCall?.[0] as FilterableFindOptions
120
+ expect(updatedOptions.filter?.name).toEqual({ $regex: 'new-value' })
121
+ expect(updatedOptions.filter?.email).toEqual({ $regex: 'keep' })
110
122
  })
111
123
  })
112
124
 
113
125
  it('should apply selected operator', async () => {
114
126
  const findOptions = createFindOptions()
115
- const { injector, onClose } = await renderStringFilter(findOptions)
127
+ const { injector, onClose, onFindOptionsChange } = await renderStringFilter(findOptions)
116
128
  await usingAsync(injector, async () => {
117
129
  const eqButton = document.querySelector('shade-segmented-control button[data-value="$eq"]') as HTMLButtonElement
118
130
  eqButton?.click()
@@ -126,14 +138,14 @@ describe('StringFilter', () => {
126
138
  form.dispatchEvent(new Event('submit', { bubbles: true }))
127
139
  await flushUpdates()
128
140
 
129
- expect(findOptions.getValue().filter).toEqual({ name: { $eq: 'exact' } })
141
+ expect(onFindOptionsChange).toHaveBeenCalledWith(expect.objectContaining({ filter: { name: { $eq: 'exact' } } }))
130
142
  expect(onClose).toHaveBeenCalled()
131
143
  })
132
144
  })
133
145
 
134
146
  it('should reset skip to 0 when applying filter', async () => {
135
147
  const findOptions = createFindOptions({ skip: 20 })
136
- const { injector } = await renderStringFilter(findOptions)
148
+ const { injector, onFindOptionsChange } = await renderStringFilter(findOptions)
137
149
  await usingAsync(injector, async () => {
138
150
  const input = document.querySelector('[data-testid="string-filter-value"]') as HTMLInputElement
139
151
  input.value = 'test'
@@ -143,7 +155,7 @@ describe('StringFilter', () => {
143
155
  form.dispatchEvent(new Event('submit', { bubbles: true }))
144
156
  await flushUpdates()
145
157
 
146
- expect(findOptions.getValue().skip).toBe(0)
158
+ expect(onFindOptionsChange).toHaveBeenCalledWith(expect.objectContaining({ skip: 0 }))
147
159
  })
148
160
  })
149
161
 
@@ -1,5 +1,4 @@
1
1
  import { createComponent, Shade } from '@furystack/shades'
2
- import type { ObservableValue } from '@furystack/utils'
3
2
  import { Button } from '../../button.js'
4
3
  import { SegmentedControl } from '../../button-group.js'
5
4
  import { Icon } from '../../icons/icon.js'
@@ -19,17 +18,18 @@ const operatorLabels: Record<StringOperator, string> = {
19
18
 
20
19
  export const StringFilter = Shade<{
21
20
  field: string
22
- findOptions: ObservableValue<FilterableFindOptions>
21
+ findOptions: FilterableFindOptions
22
+ onFindOptionsChange: (options: FilterableFindOptions) => void
23
23
  onClose: () => void
24
24
  }>({
25
- shadowDomName: 'data-grid-string-filter',
25
+ customElementName: 'data-grid-string-filter',
26
26
  css: {
27
27
  ...filterBaseCss,
28
28
  fontFamily: cssVariableTheme.typography.fontFamily,
29
29
  '& input': filterInputCss,
30
30
  },
31
- render: ({ props, useObservable, useState }) => {
32
- const [findOptions, setFindOptions] = useObservable('findOptions', props.findOptions)
31
+ render: ({ props, useState }) => {
32
+ const { findOptions } = props
33
33
 
34
34
  const currentFilter = findOptions.filter?.[props.field] as Record<string, string> | undefined
35
35
  const currentOperator: StringOperator = currentFilter
@@ -44,14 +44,14 @@ export const StringFilter = Shade<{
44
44
  } else {
45
45
  filter[props.field] = { [operator]: value }
46
46
  }
47
- setFindOptions({ ...findOptions, filter, skip: 0 })
47
+ props.onFindOptionsChange({ ...findOptions, filter, skip: 0 })
48
48
  props.onClose()
49
49
  }
50
50
 
51
51
  const clearFilter = () => {
52
52
  const filter = { ...findOptions.filter }
53
53
  delete filter[props.field]
54
- setFindOptions({ ...findOptions, filter, skip: 0 })
54
+ props.onFindOptionsChange({ ...findOptions, filter, skip: 0 })
55
55
  props.onClose()
56
56
  }
57
57