@j2-health/design-system 0.2.0 → 0.3.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 (316) hide show
  1. package/README.md +38 -9
  2. package/dist/index.cjs +102 -3614
  3. package/dist/index.cjs.map +1 -1
  4. package/dist/index.js +54 -3551
  5. package/dist/index.js.map +1 -1
  6. package/dist/src/AppConfigProvider.cjs +13 -0
  7. package/dist/src/AppConfigProvider.cjs.map +1 -0
  8. package/dist/src/AppConfigProvider.js +13 -0
  9. package/dist/src/AppConfigProvider.js.map +1 -0
  10. package/dist/src/appTheme.cjs +268 -0
  11. package/dist/src/appTheme.cjs.map +1 -0
  12. package/dist/src/appTheme.js +268 -0
  13. package/dist/src/appTheme.js.map +1 -0
  14. package/dist/src/components/alert/Alert.cjs +95 -0
  15. package/dist/src/components/alert/Alert.cjs.map +1 -0
  16. package/dist/src/components/alert/Alert.js +78 -0
  17. package/dist/src/components/alert/Alert.js.map +1 -0
  18. package/dist/src/components/alert/Alert.module.css.cjs +9 -0
  19. package/dist/src/components/alert/Alert.module.css.cjs.map +1 -0
  20. package/dist/src/components/alert/Alert.module.css.js +9 -0
  21. package/dist/src/components/alert/Alert.module.css.js.map +1 -0
  22. package/dist/src/components/barchart/BarChart.cjs +155 -0
  23. package/dist/src/components/barchart/BarChart.cjs.map +1 -0
  24. package/dist/src/components/barchart/BarChart.js +155 -0
  25. package/dist/src/components/barchart/BarChart.js.map +1 -0
  26. package/dist/src/components/barchart/chart.module.css.cjs +9 -0
  27. package/dist/src/components/barchart/chart.module.css.cjs.map +1 -0
  28. package/dist/src/components/barchart/chart.module.css.js +9 -0
  29. package/dist/src/components/barchart/chart.module.css.js.map +1 -0
  30. package/dist/src/components/breadcrumb/Breadcrumb.cjs +38 -0
  31. package/dist/src/components/breadcrumb/Breadcrumb.cjs.map +1 -0
  32. package/dist/src/components/breadcrumb/Breadcrumb.js +21 -0
  33. package/dist/src/components/breadcrumb/Breadcrumb.js.map +1 -0
  34. package/dist/src/components/bulkActionBar/BulkActionBar.cjs +81 -0
  35. package/dist/src/components/bulkActionBar/BulkActionBar.cjs.map +1 -0
  36. package/dist/src/components/bulkActionBar/BulkActionBar.js +81 -0
  37. package/dist/src/components/bulkActionBar/BulkActionBar.js.map +1 -0
  38. package/dist/src/components/button/Button.cjs +21 -0
  39. package/dist/src/components/button/Button.cjs.map +1 -0
  40. package/dist/src/components/button/Button.js +21 -0
  41. package/dist/src/components/button/Button.js.map +1 -0
  42. package/dist/src/components/card/Card.cjs +36 -0
  43. package/dist/src/components/card/Card.cjs.map +1 -0
  44. package/dist/src/components/card/Card.js +36 -0
  45. package/dist/src/components/card/Card.js.map +1 -0
  46. package/dist/src/components/checkbox/Checkbox.cjs +10 -0
  47. package/dist/src/components/checkbox/Checkbox.cjs.map +1 -0
  48. package/dist/src/components/checkbox/Checkbox.js +10 -0
  49. package/dist/src/components/checkbox/Checkbox.js.map +1 -0
  50. package/dist/src/components/checkboxTree/CheckboxTree.cjs +140 -0
  51. package/dist/src/components/checkboxTree/CheckboxTree.cjs.map +1 -0
  52. package/dist/src/components/checkboxTree/CheckboxTree.js +140 -0
  53. package/dist/src/components/checkboxTree/CheckboxTree.js.map +1 -0
  54. package/dist/src/components/checkboxTree/TreeNode.cjs +92 -0
  55. package/dist/src/components/checkboxTree/TreeNode.cjs.map +1 -0
  56. package/dist/src/components/checkboxTree/TreeNode.js +92 -0
  57. package/dist/src/components/checkboxTree/TreeNode.js.map +1 -0
  58. package/dist/src/components/checkboxTree/utils.cjs +59 -0
  59. package/dist/src/components/checkboxTree/utils.cjs.map +1 -0
  60. package/dist/src/components/checkboxTree/utils.js +59 -0
  61. package/dist/src/components/checkboxTree/utils.js.map +1 -0
  62. package/dist/src/components/collapse/Collapse.cjs +81 -0
  63. package/dist/src/components/collapse/Collapse.cjs.map +1 -0
  64. package/dist/src/components/collapse/Collapse.js +64 -0
  65. package/dist/src/components/collapse/Collapse.js.map +1 -0
  66. package/dist/src/components/collapse/Collapse.module.css.cjs +13 -0
  67. package/dist/src/components/collapse/Collapse.module.css.cjs.map +1 -0
  68. package/dist/src/components/collapse/Collapse.module.css.js +13 -0
  69. package/dist/src/components/collapse/Collapse.module.css.js.map +1 -0
  70. package/dist/src/components/drawer/Drawer.cjs +39 -0
  71. package/dist/src/components/drawer/Drawer.cjs.map +1 -0
  72. package/dist/src/components/drawer/Drawer.js +39 -0
  73. package/dist/src/components/drawer/Drawer.js.map +1 -0
  74. package/dist/src/components/dropdown/Dropdown.cjs +58 -0
  75. package/dist/src/components/dropdown/Dropdown.cjs.map +1 -0
  76. package/dist/src/components/dropdown/Dropdown.js +58 -0
  77. package/dist/src/components/dropdown/Dropdown.js.map +1 -0
  78. package/dist/src/components/filterform/FilterGroup.cjs +64 -0
  79. package/dist/src/components/filterform/FilterGroup.cjs.map +1 -0
  80. package/dist/src/components/filterform/FilterGroup.js +64 -0
  81. package/dist/src/components/filterform/FilterGroup.js.map +1 -0
  82. package/dist/src/components/filterform/FilterInput.cjs +238 -0
  83. package/dist/src/components/filterform/FilterInput.cjs.map +1 -0
  84. package/dist/src/components/filterform/FilterInput.d.ts +1 -0
  85. package/dist/src/components/filterform/FilterInput.js +221 -0
  86. package/dist/src/components/filterform/FilterInput.js.map +1 -0
  87. package/dist/src/components/filterform/FiltersForm.cjs +168 -0
  88. package/dist/src/components/filterform/FiltersForm.cjs.map +1 -0
  89. package/dist/src/components/filterform/FiltersForm.js +168 -0
  90. package/dist/src/components/filterform/FiltersForm.js.map +1 -0
  91. package/dist/src/components/filterform/FiltersForm.module.css.cjs +21 -0
  92. package/dist/src/components/filterform/FiltersForm.module.css.cjs.map +1 -0
  93. package/dist/src/components/filterform/FiltersForm.module.css.js +21 -0
  94. package/dist/src/components/filterform/FiltersForm.module.css.js.map +1 -0
  95. package/dist/src/components/filterform/filterHelpers.cjs +71 -0
  96. package/dist/src/components/filterform/filterHelpers.cjs.map +1 -0
  97. package/dist/src/components/filterform/filterHelpers.d.ts +18 -4
  98. package/dist/src/components/filterform/filterHelpers.js +71 -0
  99. package/dist/src/components/filterform/filterHelpers.js.map +1 -0
  100. package/dist/src/components/filterform/index.d.ts +3 -1
  101. package/dist/src/components/filterform/types.d.ts +4 -2
  102. package/dist/src/components/filterform/useFilterField.cjs +245 -0
  103. package/dist/src/components/filterform/useFilterField.cjs.map +1 -0
  104. package/dist/src/components/filterform/useFilterField.d.ts +17 -1
  105. package/dist/src/components/filterform/useFilterField.js +228 -0
  106. package/dist/src/components/filterform/useFilterField.js.map +1 -0
  107. package/dist/src/components/filterform/useFiltersForm.cjs +160 -0
  108. package/dist/src/components/filterform/useFiltersForm.cjs.map +1 -0
  109. package/dist/src/components/filterform/useFiltersForm.js +160 -0
  110. package/dist/src/components/filterform/useFiltersForm.js.map +1 -0
  111. package/dist/src/components/form/Form.cjs +11 -0
  112. package/dist/src/components/form/Form.cjs.map +1 -0
  113. package/dist/src/components/form/Form.js +11 -0
  114. package/dist/src/components/form/Form.js.map +1 -0
  115. package/dist/src/components/icons/index.cjs +27 -0
  116. package/dist/src/components/icons/index.cjs.map +1 -0
  117. package/dist/src/components/icons/index.js +3 -0
  118. package/dist/src/components/icons/index.js.map +1 -0
  119. package/dist/src/components/input/AntdInput.cjs +13 -0
  120. package/dist/src/components/input/AntdInput.cjs.map +1 -0
  121. package/dist/src/components/input/AntdInput.js +13 -0
  122. package/dist/src/components/input/AntdInput.js.map +1 -0
  123. package/dist/src/components/input/AntdSearchInput.cjs +13 -0
  124. package/dist/src/components/input/AntdSearchInput.cjs.map +1 -0
  125. package/dist/src/components/input/AntdSearchInput.js +13 -0
  126. package/dist/src/components/input/AntdSearchInput.js.map +1 -0
  127. package/dist/src/components/input/Input.cjs +9 -0
  128. package/dist/src/components/input/Input.cjs.map +1 -0
  129. package/dist/src/components/input/Input.js +9 -0
  130. package/dist/src/components/input/Input.js.map +1 -0
  131. package/dist/src/components/inputnumber/InputNumber.cjs +32 -0
  132. package/dist/src/components/inputnumber/InputNumber.cjs.map +1 -0
  133. package/dist/src/components/inputnumber/InputNumber.js +32 -0
  134. package/dist/src/components/inputnumber/InputNumber.js.map +1 -0
  135. package/dist/src/components/inputnumber/InputNumber.module.css.cjs +9 -0
  136. package/dist/src/components/inputnumber/InputNumber.module.css.cjs.map +1 -0
  137. package/dist/src/components/inputnumber/InputNumber.module.css.js +9 -0
  138. package/dist/src/components/inputnumber/InputNumber.module.css.js.map +1 -0
  139. package/dist/src/components/legacyNavMenu/LegacyNavMenu.cjs +52 -0
  140. package/dist/src/components/legacyNavMenu/LegacyNavMenu.cjs.map +1 -0
  141. package/dist/src/components/legacyNavMenu/LegacyNavMenu.js +52 -0
  142. package/dist/src/components/legacyNavMenu/LegacyNavMenu.js.map +1 -0
  143. package/dist/src/components/legacyNavMenu/LegacyNavMenu.module.css.cjs +48 -0
  144. package/dist/src/components/legacyNavMenu/LegacyNavMenu.module.css.cjs.map +1 -0
  145. package/dist/src/components/legacyNavMenu/LegacyNavMenu.module.css.js +48 -0
  146. package/dist/src/components/legacyNavMenu/LegacyNavMenu.module.css.js.map +1 -0
  147. package/dist/src/components/legacyNavMenu/UserProfile.cjs +78 -0
  148. package/dist/src/components/legacyNavMenu/UserProfile.cjs.map +1 -0
  149. package/dist/src/components/legacyNavMenu/UserProfile.js +78 -0
  150. package/dist/src/components/legacyNavMenu/UserProfile.js.map +1 -0
  151. package/dist/src/components/legacyNavMenu/UserProfile.module.css.cjs +42 -0
  152. package/dist/src/components/legacyNavMenu/UserProfile.module.css.cjs.map +1 -0
  153. package/dist/src/components/legacyNavMenu/UserProfile.module.css.js +42 -0
  154. package/dist/src/components/legacyNavMenu/UserProfile.module.css.js.map +1 -0
  155. package/dist/src/components/listpopover/ListPopover.cjs +125 -0
  156. package/dist/src/components/listpopover/ListPopover.cjs.map +1 -0
  157. package/dist/src/components/listpopover/ListPopover.js +125 -0
  158. package/dist/src/components/listpopover/ListPopover.js.map +1 -0
  159. package/dist/src/components/listpopover/ListPopover.module.css.cjs +9 -0
  160. package/dist/src/components/listpopover/ListPopover.module.css.cjs.map +1 -0
  161. package/dist/src/components/listpopover/ListPopover.module.css.js +9 -0
  162. package/dist/src/components/listpopover/ListPopover.module.css.js.map +1 -0
  163. package/dist/src/components/menu/Menu.cjs +18 -0
  164. package/dist/src/components/menu/Menu.cjs.map +1 -0
  165. package/dist/src/components/menu/Menu.js +18 -0
  166. package/dist/src/components/menu/Menu.js.map +1 -0
  167. package/dist/src/components/menu/Menu.module.css.cjs +12 -0
  168. package/dist/src/components/menu/Menu.module.css.cjs.map +1 -0
  169. package/dist/src/components/menu/Menu.module.css.js +12 -0
  170. package/dist/src/components/menu/Menu.module.css.js.map +1 -0
  171. package/dist/src/components/message/Message.module.css.cjs +9 -0
  172. package/dist/src/components/message/Message.module.css.cjs.map +1 -0
  173. package/dist/src/components/message/Message.module.css.js +9 -0
  174. package/dist/src/components/message/Message.module.css.js.map +1 -0
  175. package/dist/src/components/message/useMessage.cjs +55 -0
  176. package/dist/src/components/message/useMessage.cjs.map +1 -0
  177. package/dist/src/components/message/useMessage.js +55 -0
  178. package/dist/src/components/message/useMessage.js.map +1 -0
  179. package/dist/src/components/modal/Modal.cjs +32 -0
  180. package/dist/src/components/modal/Modal.cjs.map +1 -0
  181. package/dist/src/components/modal/Modal.js +32 -0
  182. package/dist/src/components/modal/Modal.js.map +1 -0
  183. package/dist/src/components/navMenu/NavMenu.cjs +132 -0
  184. package/dist/src/components/navMenu/NavMenu.cjs.map +1 -0
  185. package/dist/src/components/navMenu/NavMenu.js +115 -0
  186. package/dist/src/components/navMenu/NavMenu.js.map +1 -0
  187. package/dist/src/components/navMenu/NavMenu.module.css.cjs +18 -0
  188. package/dist/src/components/navMenu/NavMenu.module.css.cjs.map +1 -0
  189. package/dist/src/components/navMenu/NavMenu.module.css.js +18 -0
  190. package/dist/src/components/navMenu/NavMenu.module.css.js.map +1 -0
  191. package/dist/src/components/notification/Notification.module.css.cjs +9 -0
  192. package/dist/src/components/notification/Notification.module.css.cjs.map +1 -0
  193. package/dist/src/components/notification/Notification.module.css.js +9 -0
  194. package/dist/src/components/notification/Notification.module.css.js.map +1 -0
  195. package/dist/src/components/notification/useNotification.cjs +52 -0
  196. package/dist/src/components/notification/useNotification.cjs.map +1 -0
  197. package/dist/src/components/notification/useNotification.js +52 -0
  198. package/dist/src/components/notification/useNotification.js.map +1 -0
  199. package/dist/src/components/notificationModal/NotifcationModal.module.css.cjs +21 -0
  200. package/dist/src/components/notificationModal/NotifcationModal.module.css.cjs.map +1 -0
  201. package/dist/src/components/notificationModal/NotifcationModal.module.css.js +21 -0
  202. package/dist/src/components/notificationModal/NotifcationModal.module.css.js.map +1 -0
  203. package/dist/src/components/notificationModal/NotificationModal.cjs +57 -0
  204. package/dist/src/components/notificationModal/NotificationModal.cjs.map +1 -0
  205. package/dist/src/components/notificationModal/NotificationModal.js +57 -0
  206. package/dist/src/components/notificationModal/NotificationModal.js.map +1 -0
  207. package/dist/src/components/pagination/Pagination.cjs +65 -0
  208. package/dist/src/components/pagination/Pagination.cjs.map +1 -0
  209. package/dist/src/components/pagination/Pagination.js +65 -0
  210. package/dist/src/components/pagination/Pagination.js.map +1 -0
  211. package/dist/src/components/pagination/Pagination.module.css.cjs +6 -0
  212. package/dist/src/components/pagination/Pagination.module.css.cjs.map +1 -0
  213. package/dist/src/components/pagination/Pagination.module.css.js +7 -0
  214. package/dist/src/components/pagination/Pagination.module.css.js.map +1 -0
  215. package/dist/src/components/popover/Popover.cjs +41 -0
  216. package/dist/src/components/popover/Popover.cjs.map +1 -0
  217. package/dist/src/components/popover/Popover.js +41 -0
  218. package/dist/src/components/popover/Popover.js.map +1 -0
  219. package/dist/src/components/popover/Popover.module.css.cjs +33 -0
  220. package/dist/src/components/popover/Popover.module.css.cjs.map +1 -0
  221. package/dist/src/components/popover/Popover.module.css.js +33 -0
  222. package/dist/src/components/popover/Popover.module.css.js.map +1 -0
  223. package/dist/src/components/progress/Progress.cjs +9 -0
  224. package/dist/src/components/progress/Progress.cjs.map +1 -0
  225. package/dist/src/components/progress/Progress.js +9 -0
  226. package/dist/src/components/progress/Progress.js.map +1 -0
  227. package/dist/src/components/radio/Radio.cjs +24 -0
  228. package/dist/src/components/radio/Radio.cjs.map +1 -0
  229. package/dist/src/components/radio/Radio.js +24 -0
  230. package/dist/src/components/radio/Radio.js.map +1 -0
  231. package/dist/src/components/rate/Rate.cjs +22 -0
  232. package/dist/src/components/rate/Rate.cjs.map +1 -0
  233. package/dist/src/components/rate/Rate.js +22 -0
  234. package/dist/src/components/rate/Rate.js.map +1 -0
  235. package/dist/src/components/select/AntdSelect.cjs +76 -0
  236. package/dist/src/components/select/AntdSelect.cjs.map +1 -0
  237. package/dist/src/components/select/AntdSelect.js +60 -0
  238. package/dist/src/components/select/AntdSelect.js.map +1 -0
  239. package/dist/src/components/select/Select.cjs +107 -0
  240. package/dist/src/components/select/Select.cjs.map +1 -0
  241. package/dist/src/components/select/Select.js +107 -0
  242. package/dist/src/components/select/Select.js.map +1 -0
  243. package/dist/src/components/select/SummarizedSelect.cjs +455 -0
  244. package/dist/src/components/select/SummarizedSelect.cjs.map +1 -0
  245. package/dist/src/components/select/SummarizedSelect.js +455 -0
  246. package/dist/src/components/select/SummarizedSelect.js.map +1 -0
  247. package/dist/src/components/select/SummarizedSelect.module.css.cjs +30 -0
  248. package/dist/src/components/select/SummarizedSelect.module.css.cjs.map +1 -0
  249. package/dist/src/components/select/SummarizedSelect.module.css.js +30 -0
  250. package/dist/src/components/select/SummarizedSelect.module.css.js.map +1 -0
  251. package/dist/src/components/skeleton/Skeleton.cjs +14 -0
  252. package/dist/src/components/skeleton/Skeleton.cjs.map +1 -0
  253. package/dist/src/components/skeleton/Skeleton.js +14 -0
  254. package/dist/src/components/skeleton/Skeleton.js.map +1 -0
  255. package/dist/src/components/spinner/Spinner.cjs +20 -0
  256. package/dist/src/components/spinner/Spinner.cjs.map +1 -0
  257. package/dist/src/components/spinner/Spinner.js +20 -0
  258. package/dist/src/components/spinner/Spinner.js.map +1 -0
  259. package/dist/src/components/steps/Steps.cjs +50 -0
  260. package/dist/src/components/steps/Steps.cjs.map +1 -0
  261. package/dist/src/components/steps/Steps.js +50 -0
  262. package/dist/src/components/steps/Steps.js.map +1 -0
  263. package/dist/src/components/steps/useSteps.cjs +56 -0
  264. package/dist/src/components/steps/useSteps.cjs.map +1 -0
  265. package/dist/src/components/steps/useSteps.js +56 -0
  266. package/dist/src/components/steps/useSteps.js.map +1 -0
  267. package/dist/src/components/switch/Switch.cjs +28 -0
  268. package/dist/src/components/switch/Switch.cjs.map +1 -0
  269. package/dist/src/components/switch/Switch.js +28 -0
  270. package/dist/src/components/switch/Switch.js.map +1 -0
  271. package/dist/src/components/table/Table.cjs +117 -0
  272. package/dist/src/components/table/Table.cjs.map +1 -0
  273. package/dist/src/components/table/Table.js +117 -0
  274. package/dist/src/components/table/Table.js.map +1 -0
  275. package/dist/src/components/table/Table.module.css.cjs +12 -0
  276. package/dist/src/components/table/Table.module.css.cjs.map +1 -0
  277. package/dist/src/components/table/Table.module.css.js +12 -0
  278. package/dist/src/components/table/Table.module.css.js.map +1 -0
  279. package/dist/src/components/tabs/Tabs.cjs +10 -0
  280. package/dist/src/components/tabs/Tabs.cjs.map +1 -0
  281. package/dist/src/components/tabs/Tabs.js +10 -0
  282. package/dist/src/components/tabs/Tabs.js.map +1 -0
  283. package/dist/src/components/tag/Tag.cjs +74 -0
  284. package/dist/src/components/tag/Tag.cjs.map +1 -0
  285. package/dist/src/components/tag/Tag.js +57 -0
  286. package/dist/src/components/tag/Tag.js.map +1 -0
  287. package/dist/src/components/tooltip/Tooltip.cjs +14 -0
  288. package/dist/src/components/tooltip/Tooltip.cjs.map +1 -0
  289. package/dist/src/components/tooltip/Tooltip.js +14 -0
  290. package/dist/src/components/tooltip/Tooltip.js.map +1 -0
  291. package/dist/src/components/vennDiagram/VennDiagram.cjs +53 -0
  292. package/dist/src/components/vennDiagram/VennDiagram.cjs.map +1 -0
  293. package/dist/src/components/vennDiagram/VennDiagram.js +53 -0
  294. package/dist/src/components/vennDiagram/VennDiagram.js.map +1 -0
  295. package/dist/src/svgs/ProgressCircle.svg.cjs +22 -0
  296. package/dist/src/svgs/ProgressCircle.svg.cjs.map +1 -0
  297. package/dist/src/svgs/ProgressCircle.svg.js +6 -0
  298. package/dist/src/svgs/ProgressCircle.svg.js.map +1 -0
  299. package/dist/src/svgs/j2-logo-menu-collapse.svg.cjs +22 -0
  300. package/dist/src/svgs/j2-logo-menu-collapse.svg.cjs.map +1 -0
  301. package/dist/src/svgs/j2-logo-menu-collapse.svg.js +6 -0
  302. package/dist/src/svgs/j2-logo-menu-collapse.svg.js.map +1 -0
  303. package/dist/src/svgs/j2-logo-menu.svg.cjs +22 -0
  304. package/dist/src/svgs/j2-logo-menu.svg.cjs.map +1 -0
  305. package/dist/src/svgs/j2-logo-menu.svg.js +6 -0
  306. package/dist/src/svgs/j2-logo-menu.svg.js.map +1 -0
  307. package/dist/src/svgs/menu-sidebar-collapse.svg.cjs +22 -0
  308. package/dist/src/svgs/menu-sidebar-collapse.svg.cjs.map +1 -0
  309. package/dist/src/svgs/menu-sidebar-collapse.svg.js +6 -0
  310. package/dist/src/svgs/menu-sidebar-collapse.svg.js.map +1 -0
  311. package/dist/src/svgs/menu-sidebar-expand.svg.cjs +22 -0
  312. package/dist/src/svgs/menu-sidebar-expand.svg.cjs.map +1 -0
  313. package/dist/src/svgs/menu-sidebar-expand.svg.js +6 -0
  314. package/dist/src/svgs/menu-sidebar-expand.svg.js.map +1 -0
  315. package/dist/style.css +646 -646
  316. package/package.json +6 -6
@@ -0,0 +1,228 @@
1
+ import * as React from "react";
2
+ import { isMultiValueTextOperator, normalizeMultiValues, validateFormFilter } from "./filterHelpers.js";
3
+ const TypeToOperatorOptions = {
4
+ select: [
5
+ { label: "is any of", value: "equals" },
6
+ { label: "is not any of", value: "notEqual" },
7
+ { label: "has no value", value: "blank" },
8
+ { label: "has any value", value: "notBlank" }
9
+ ],
10
+ number: [
11
+ { label: "is", value: "equals" },
12
+ { label: "is not", value: "notEqual" },
13
+ { label: "is greater than", value: "greaterThan" },
14
+ { label: "is greater than or equal to", value: "greaterThanOrEqual" },
15
+ { label: "is less than", value: "lessThan" },
16
+ { label: "is less than or equal to", value: "lessThanOrEqual" },
17
+ { label: "has no value", value: "blank" },
18
+ { label: "has any value", value: "notBlank" },
19
+ { label: "is between", value: "inRange" }
20
+ ],
21
+ text: [
22
+ { label: "contains", value: "contains" },
23
+ { label: "does not contain", value: "notContains" },
24
+ { label: "starts with", value: "startsWith" },
25
+ { label: "ends with", value: "endsWith" },
26
+ { label: "has no value", value: "blank" },
27
+ { label: "has any value", value: "notBlank" }
28
+ ]
29
+ };
30
+ const MultiValueTextOperatorOptions = [
31
+ { label: "is any of", value: "isAnyOf" },
32
+ { label: "is not any of", value: "isNoneOf" }
33
+ ];
34
+ const operatorOptionsFor = (config) => {
35
+ const defaults = TypeToOperatorOptions[config.type];
36
+ if (!config.operators) return defaults;
37
+ const known = config.type === "text" ? [...defaults, ...MultiValueTextOperatorOptions] : defaults;
38
+ return config.operators.flatMap((operator) => {
39
+ const option = known.find((candidate) => candidate.value === operator);
40
+ return option ? [option] : [];
41
+ });
42
+ };
43
+ const buildValueInputConfig = (config, operator) => {
44
+ if (config.type === "select") {
45
+ if (operator === "blank" || operator === "notBlank") return;
46
+ return {
47
+ type: "select",
48
+ valueOptions: config.options || []
49
+ };
50
+ }
51
+ if (config.type === "number") {
52
+ if (operator === "blank" || operator === "notBlank") return;
53
+ return {
54
+ type: "number",
55
+ inputCount: operator === "inRange" ? 2 : 1,
56
+ numberOptions: config.options
57
+ };
58
+ }
59
+ if (config.type === "text") {
60
+ if (operator === "blank" || operator === "notBlank") return;
61
+ return {
62
+ type: "text",
63
+ multiValue: isMultiValueTextOperator(operator),
64
+ maxValues: config.maxValues
65
+ };
66
+ }
67
+ };
68
+ const filterFieldReducer = (state, action) => {
69
+ var _a, _b, _c, _d, _e;
70
+ switch (action.type) {
71
+ case "setField": {
72
+ const config = state.filterConfigs.find(
73
+ (config2) => config2.field === action.payload
74
+ );
75
+ if (!config) return state;
76
+ const operatorOptions = operatorOptionsFor(config);
77
+ const newFilter = {
78
+ ...state.filter,
79
+ type: config.type,
80
+ field: action.payload,
81
+ operator: (_a = operatorOptions[0]) == null ? void 0 : _a.value,
82
+ values: []
83
+ };
84
+ const pendingFilter = {
85
+ ...newFilter,
86
+ errors: validateFormFilter(newFilter, config)
87
+ };
88
+ return {
89
+ ...state,
90
+ filter: pendingFilter,
91
+ config,
92
+ operatorOptions,
93
+ valueInputConfig: operatorOptions.length > 0 ? buildValueInputConfig(config, operatorOptions[0].value) : void 0
94
+ };
95
+ }
96
+ case "setOperator": {
97
+ if (!state.config) return state;
98
+ if (!action.payload) return state;
99
+ const pendingFilter = {
100
+ ...state.filter,
101
+ operator: action.payload,
102
+ values: []
103
+ };
104
+ return {
105
+ ...state,
106
+ filter: {
107
+ ...pendingFilter,
108
+ errors: validateFormFilter(pendingFilter, state.config)
109
+ },
110
+ valueInputConfig: buildValueInputConfig(state.config, action.payload)
111
+ };
112
+ }
113
+ case "setValues": {
114
+ if (!state.filter) return state;
115
+ const values = state.filter.type === "number" ? action.payload.map((value) => Number(value)) : isMultiValueTextOperator(state.filter.operator) ? (
116
+ // Normalized on the way into state, not just for display —
117
+ // validation counts and `onSubmit` emit exactly these chips.
118
+ normalizeMultiValues(action.payload)
119
+ ) : action.payload.filter(
120
+ (value) => value !== null && value !== void 0
121
+ );
122
+ const pendingFilter = {
123
+ ...state.filter,
124
+ values
125
+ };
126
+ pendingFilter.errors = validateFormFilter(pendingFilter, state.config);
127
+ return {
128
+ ...state,
129
+ filter: pendingFilter
130
+ };
131
+ }
132
+ case "initialize": {
133
+ const field = ((_b = state.filter) == null ? void 0 : _b.field) || ((_c = state.filterConfigs.find((config2) => !config2.disabled)) == null ? void 0 : _c.field);
134
+ const config = state.filterConfigs.find(
135
+ (config2) => config2.field === field
136
+ );
137
+ if (!config) return state;
138
+ const operatorOptions = operatorOptionsFor(config);
139
+ const persisted = (_d = state.filter) == null ? void 0 : _d.operator;
140
+ const persistedAllowed = persisted !== void 0 && operatorOptions.some((option) => option.value === persisted);
141
+ const operator = persistedAllowed ? persisted : (_e = operatorOptions[0]) == null ? void 0 : _e.value;
142
+ let filter;
143
+ if (!state.filter) {
144
+ filter = {
145
+ field,
146
+ type: config.type,
147
+ operator,
148
+ values: []
149
+ };
150
+ } else if (!persistedAllowed) {
151
+ filter = { ...state.filter, operator, values: [] };
152
+ } else if (isMultiValueTextOperator(operator)) {
153
+ filter = {
154
+ ...state.filter,
155
+ values: normalizeMultiValues(state.filter.values)
156
+ };
157
+ } else {
158
+ filter = { ...state.filter };
159
+ }
160
+ filter.errors = validateFormFilter(filter, config);
161
+ return {
162
+ ...state,
163
+ config,
164
+ filter,
165
+ operatorOptions,
166
+ valueInputConfig: operatorOptions.length > 0 ? buildValueInputConfig(config, operator) : void 0
167
+ };
168
+ }
169
+ default:
170
+ return state;
171
+ }
172
+ };
173
+ const useFilterField = ({
174
+ filterConfigs,
175
+ filter: initialFilter
176
+ }) => {
177
+ const [{ filter, config, operatorOptions, valueInputConfig }, dispatch] = React.useReducer(
178
+ filterFieldReducer,
179
+ {
180
+ filter: initialFilter,
181
+ filterConfigs,
182
+ config: void 0,
183
+ operatorOptions: [],
184
+ valueInputConfig: void 0
185
+ },
186
+ (state) => {
187
+ return filterFieldReducer(state, {
188
+ type: "initialize",
189
+ payload: void 0
190
+ });
191
+ }
192
+ );
193
+ const handleFieldChange = (value) => {
194
+ dispatch({
195
+ type: "setField",
196
+ payload: value
197
+ });
198
+ };
199
+ const handleOperatorChange = (value) => {
200
+ dispatch({
201
+ type: "setOperator",
202
+ payload: value
203
+ });
204
+ };
205
+ const handleValuesChange = (value) => {
206
+ dispatch({
207
+ type: "setValues",
208
+ payload: value
209
+ });
210
+ };
211
+ return {
212
+ filter,
213
+ config,
214
+ operatorOptions,
215
+ valueInputConfig,
216
+ handleFieldChange,
217
+ handleOperatorChange,
218
+ handleValuesChange
219
+ };
220
+ };
221
+ export {
222
+ MultiValueTextOperatorOptions,
223
+ TypeToOperatorOptions,
224
+ isMultiValueTextOperator,
225
+ operatorOptionsFor,
226
+ useFilterField
227
+ };
228
+ //# sourceMappingURL=useFilterField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFilterField.js","sources":["../../../../src/components/filterform/useFilterField.tsx"],"sourcesContent":["import * as React from 'react'\nimport {\n FilterConfig,\n FilterType,\n FormFilter,\n NumberOptionsType,\n Operator,\n SelectOptionsType,\n} from './types'\nimport {\n isMultiValueTextOperator,\n normalizeMultiValues,\n validateFormFilter,\n} from './filterHelpers'\nexport { isMultiValueTextOperator } from './filterHelpers'\nexport type UseFilterFieldInputs = {\n filterConfigs: FilterConfig[]\n filter?: FormFilter\n}\n\ntype UseFilterFieldOutputs = {\n filter: FormFilter | undefined\n config: FilterConfig | undefined\n operatorOptions: { label: string; value: string }[]\n valueInputConfig: ValueInputConfig | undefined\n handleFieldChange: (value: string) => void\n handleOperatorChange: (value: string) => void\n handleValuesChange: (value: (string | number | undefined | null)[]) => void\n}\n\nexport const TypeToOperatorOptions: Record<\n FilterType,\n { label: string; value: Operator }[]\n> = {\n select: [\n { label: 'is any of', value: 'equals' },\n { label: 'is not any of', value: 'notEqual' },\n { label: 'has no value', value: 'blank' },\n { label: 'has any value', value: 'notBlank' },\n ],\n number: [\n { label: 'is', value: 'equals' },\n { label: 'is not', value: 'notEqual' },\n { label: 'is greater than', value: 'greaterThan' },\n { label: 'is greater than or equal to', value: 'greaterThanOrEqual' },\n { label: 'is less than', value: 'lessThan' },\n { label: 'is less than or equal to', value: 'lessThanOrEqual' },\n { label: 'has no value', value: 'blank' },\n { label: 'has any value', value: 'notBlank' },\n { label: 'is between', value: 'inRange' },\n ],\n text: [\n { label: 'contains', value: 'contains' },\n { label: 'does not contain', value: 'notContains' },\n { label: 'starts with', value: 'startsWith' },\n { label: 'ends with', value: 'endsWith' },\n { label: 'has no value', value: 'blank' },\n { label: 'has any value', value: 'notBlank' },\n ],\n}\n\n// Multi-value exact-match operators for text fields. Deliberately NOT part of\n// `TypeToOperatorOptions.text`: a field only offers them when its\n// `FilterConfig.operators` lists them, so every existing consumer keeps the\n// operator list it has today (see the `operators` doc in types.ts).\nexport const MultiValueTextOperatorOptions: {\n label: string\n value: Operator\n}[] = [\n { label: 'is any of', value: 'isAnyOf' },\n { label: 'is not any of', value: 'isNoneOf' },\n]\n\n/**\n * Operator options a field offers: its type's default list unless the config\n * names its own (`operators`), in which case that list — in the given order,\n * dropping anything the type can't express. `operators` may therefore both\n * narrow the defaults and add the opt-in multi-value text operators.\n */\nexport const operatorOptionsFor = (\n config: FilterConfig\n): { label: string; value: Operator }[] => {\n const defaults = TypeToOperatorOptions[config.type]\n if (!config.operators) return defaults\n const known =\n config.type === 'text'\n ? [...defaults, ...MultiValueTextOperatorOptions]\n : defaults\n return config.operators.flatMap((operator) => {\n const option = known.find((candidate) => candidate.value === operator)\n return option ? [option] : []\n })\n}\n\ntype SelectValueInputConfig = {\n type: 'select'\n valueOptions: { label: string; value: string }[]\n}\n\ntype NumberValueInputConfig = {\n type: 'number'\n inputCount: number\n numberOptions?: { max: number; min: number; step: number }\n}\n\ntype TextValueInputConfig = {\n type: 'text'\n // True for `isAnyOf` / `isNoneOf`: the value input is a chips list rather\n // than a single text box. `maxValues` is the config's cap, if any.\n multiValue?: boolean\n maxValues?: number\n}\n\nexport type ValueInputConfig =\n SelectValueInputConfig | NumberValueInputConfig | TextValueInputConfig\n\ntype FilterFieldState = {\n filter: FormFilter | undefined\n filterConfigs: FilterConfig[]\n config: FilterConfig | undefined\n operatorOptions: { label: string; value: string }[]\n valueInputConfig: ValueInputConfig | undefined\n}\n\ntype Action = {\n type: 'setField' | 'setOperator' | 'initialize'\n payload: string | undefined\n}\ntype SetValuesAction = {\n type: 'setValues'\n payload: (string | number | undefined | null)[]\n}\n\nconst buildValueInputConfig = (\n config: FilterConfig,\n operator: string\n): ValueInputConfig | undefined => {\n if (config.type === 'select') {\n if (operator === 'blank' || operator === 'notBlank') return\n\n return {\n type: 'select',\n valueOptions: (config.options as SelectOptionsType) || [],\n }\n }\n\n if (config.type === 'number') {\n if (operator === 'blank' || operator === 'notBlank') return\n\n return {\n type: 'number',\n inputCount: operator === 'inRange' ? 2 : 1,\n numberOptions: config.options as NumberOptionsType,\n }\n }\n\n if (config.type === 'text') {\n if (operator === 'blank' || operator === 'notBlank') return\n\n return {\n type: 'text',\n multiValue: isMultiValueTextOperator(operator),\n maxValues: config.maxValues,\n }\n }\n}\n\nconst filterFieldReducer = (\n state: FilterFieldState,\n action: Action | SetValuesAction\n) => {\n switch (action.type) {\n case 'setField': {\n const config = state.filterConfigs.find(\n (config) => config.field === action.payload\n )\n\n if (!config) return state\n\n const operatorOptions = operatorOptionsFor(config)\n\n const newFilter = {\n ...state.filter,\n type: config.type,\n field: action.payload,\n operator: operatorOptions[0]?.value,\n values: [],\n } as FormFilter\n\n const pendingFilter = {\n ...newFilter,\n errors: validateFormFilter(newFilter, config),\n }\n\n return {\n ...state,\n filter: pendingFilter,\n config,\n operatorOptions,\n valueInputConfig:\n operatorOptions.length > 0\n ? buildValueInputConfig(config, operatorOptions[0].value)\n : undefined,\n }\n }\n case 'setOperator': {\n if (!state.config) return state\n if (!action.payload) return state\n\n const pendingFilter = {\n ...state.filter,\n operator: action.payload,\n values: [],\n } as FormFilter\n\n return {\n ...state,\n filter: {\n ...pendingFilter,\n errors: validateFormFilter(pendingFilter, state.config),\n },\n valueInputConfig: buildValueInputConfig(state.config, action.payload),\n }\n }\n case 'setValues': {\n if (!state.filter) return state\n\n const values =\n state.filter.type === 'number'\n ? action.payload.map((value) => Number(value))\n : isMultiValueTextOperator(state.filter.operator)\n ? // Normalized on the way into state, not just for display —\n // validation counts and `onSubmit` emit exactly these chips.\n normalizeMultiValues(action.payload)\n : (action.payload.filter(\n (value) => value !== null && value !== undefined\n ) as string[])\n\n const pendingFilter = {\n ...state.filter,\n values: values,\n }\n\n pendingFilter.errors = validateFormFilter(pendingFilter, state.config)\n\n return {\n ...state,\n filter: pendingFilter,\n }\n }\n case 'initialize': {\n const field =\n state.filter?.field ||\n state.filterConfigs.find((config) => !config.disabled)?.field\n const config = state.filterConfigs.find(\n (config) => config.field === field\n )\n\n if (!config) return state\n\n const operatorOptions = operatorOptionsFor(config)\n\n // A persisted filter's operator must still be one this field offers.\n // Configs change between sessions (a field narrowed to `contains`, or\n // one that never opted into the multi-value operators), and the\n // backend may not understand a stale operator — so it falls back to\n // the field's first operator with its values cleared, rather than\n // re-submitting something the config no longer allows.\n const persisted = state.filter?.operator\n const persistedAllowed =\n persisted !== undefined &&\n operatorOptions.some((option) => option.value === persisted)\n const operator = persistedAllowed ? persisted : operatorOptions[0]?.value\n\n let filter: FormFilter\n if (!state.filter) {\n filter = {\n field,\n type: config.type,\n operator,\n values: [],\n } as FormFilter\n } else if (!persistedAllowed) {\n filter = { ...state.filter, operator, values: [] } as FormFilter\n } else if (isMultiValueTextOperator(operator)) {\n // Same normalization as `setValues`, so a persisted chip list that\n // predates it (or was hand-edited) can't show one chip and count two.\n filter = {\n ...state.filter,\n values: normalizeMultiValues(state.filter.values),\n }\n } else {\n // A copy: the incoming object is the caller's, and writing `errors`\n // onto it would hide the correction from `FilterInput`'s comparison\n // of what it was given against what it initialized to.\n filter = { ...state.filter }\n }\n\n filter.errors = validateFormFilter(filter, config)\n\n return {\n ...state,\n config,\n filter,\n operatorOptions,\n valueInputConfig:\n operatorOptions.length > 0\n ? buildValueInputConfig(config, operator)\n : undefined,\n }\n }\n default:\n return state\n }\n}\n\nexport const useFilterField = ({\n filterConfigs,\n filter: initialFilter,\n}: UseFilterFieldInputs): UseFilterFieldOutputs => {\n const [{ filter, config, operatorOptions, valueInputConfig }, dispatch] =\n React.useReducer(\n filterFieldReducer,\n {\n filter: initialFilter,\n filterConfigs,\n config: undefined,\n operatorOptions: [],\n valueInputConfig: undefined,\n },\n (state) => {\n return filterFieldReducer(state, {\n type: 'initialize',\n payload: undefined,\n })\n }\n )\n\n const handleFieldChange = (value: string) => {\n dispatch({\n type: 'setField',\n payload: value,\n })\n }\n\n const handleOperatorChange = (value: string) => {\n dispatch({\n type: 'setOperator',\n payload: value,\n })\n }\n\n const handleValuesChange = (\n value: (string | number | undefined | null)[]\n ) => {\n dispatch({\n type: 'setValues',\n payload: value,\n })\n }\n\n return {\n filter,\n config,\n operatorOptions,\n valueInputConfig,\n handleFieldChange,\n handleOperatorChange,\n handleValuesChange,\n }\n}\n"],"names":["config"],"mappings":"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"}
@@ -0,0 +1,160 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const React = require("react");
4
+ const cloneDeep = require("lodash/cloneDeep.js");
5
+ const filterHelpers = require("./filterHelpers.cjs");
6
+ const copyFilterGroups = (filterGroups) => {
7
+ return cloneDeep(filterGroups);
8
+ };
9
+ const addFilter = (filter, filterGroups) => {
10
+ const copy = copyFilterGroups(filterGroups);
11
+ const filterGroupIndex = copy.findIndex(
12
+ (filterGroup) => filterGroup.field === filter.field
13
+ );
14
+ if (filterGroupIndex === -1) {
15
+ copy.push({ field: filter.field, filters: [filter] });
16
+ } else {
17
+ copy[filterGroupIndex].filters.push(filter);
18
+ }
19
+ return copy;
20
+ };
21
+ const removeFilter = (groupIndex, filterIndex, filterGroups) => {
22
+ const copy = copyFilterGroups(filterGroups);
23
+ copy[groupIndex].filters.splice(filterIndex, 1);
24
+ return copy.filter((group) => group.filters.length > 0);
25
+ };
26
+ const filterFormReducer = (state, action) => {
27
+ var _a;
28
+ switch (action.type) {
29
+ case "initialize": {
30
+ const filterGroups = (_a = action.payload) == null ? void 0 : _a.filters.reduce(
31
+ (acc, filter) => {
32
+ return addFilter(filter, acc);
33
+ },
34
+ [...state.filterGroups]
35
+ );
36
+ return {
37
+ ...state,
38
+ filterGroups: filterGroups ?? [],
39
+ isNewFilterInputOpen: !(filterGroups == null ? void 0 : filterGroups.length)
40
+ };
41
+ }
42
+ case "openNewFilterInput": {
43
+ return {
44
+ ...state,
45
+ isNewFilterInputOpen: true
46
+ };
47
+ }
48
+ case "addNewFilter": {
49
+ if (action.payload.errors && action.payload.errors.length > 0) {
50
+ return state;
51
+ }
52
+ const filterGroups = addFilter(action.payload, state.filterGroups);
53
+ return {
54
+ ...state,
55
+ filterGroups,
56
+ newFilter: void 0,
57
+ isNewFilterInputOpen: false
58
+ };
59
+ }
60
+ case "changeNewFilter": {
61
+ return {
62
+ ...state,
63
+ newFilter: action.payload
64
+ };
65
+ }
66
+ case "removeNewFilter": {
67
+ const allFiltersRemoved = state.filterGroups.every(
68
+ (group) => group.filters.length === 0
69
+ );
70
+ return {
71
+ ...state,
72
+ newFilter: void 0,
73
+ isNewFilterInputOpen: allFiltersRemoved
74
+ };
75
+ }
76
+ case "updateFilter": {
77
+ const { groupIndex, filterIndex, filter } = action.payload;
78
+ let filterGroups = copyFilterGroups(state.filterGroups);
79
+ const groupField = filterGroups[groupIndex].field;
80
+ if (groupField === filter.field) {
81
+ filterGroups[groupIndex].filters[filterIndex] = filter;
82
+ } else {
83
+ filterGroups = removeFilter(groupIndex, filterIndex, filterGroups);
84
+ filterGroups = addFilter(filter, filterGroups);
85
+ }
86
+ return {
87
+ ...state,
88
+ filterGroups
89
+ };
90
+ }
91
+ case "changeFilter": {
92
+ const { groupIndex, filterIndex, filter } = action.payload;
93
+ const filterGroups = copyFilterGroups(state.filterGroups);
94
+ const group = filterGroups[groupIndex];
95
+ if (group) {
96
+ group.filters[filterIndex] = filter;
97
+ }
98
+ return {
99
+ ...state,
100
+ filterGroups
101
+ };
102
+ }
103
+ case "removeFilter": {
104
+ const { groupIndex, filterIndex } = action.payload;
105
+ const filterGroups = removeFilter(
106
+ groupIndex,
107
+ filterIndex,
108
+ state.filterGroups
109
+ );
110
+ return {
111
+ ...state,
112
+ filterGroups,
113
+ isNewFilterInputOpen: state.isNewFilterInputOpen || filterGroups.length === 0
114
+ };
115
+ }
116
+ case "clearAllFilters": {
117
+ return {
118
+ ...state,
119
+ filterGroups: [],
120
+ isNewFilterInputOpen: true
121
+ };
122
+ }
123
+ default:
124
+ return state;
125
+ }
126
+ };
127
+ const useFiltersForm = ({
128
+ initialValues
129
+ }) => {
130
+ const [{ filterGroups, newFilter, isNewFilterInputOpen }, dispatch] = React.useReducer(
131
+ filterFormReducer,
132
+ {
133
+ filterGroups: [],
134
+ newFilter: void 0,
135
+ isNewFilterInputOpen: true
136
+ },
137
+ (state) => {
138
+ return filterFormReducer(state, {
139
+ type: "initialize",
140
+ payload: initialValues
141
+ });
142
+ }
143
+ );
144
+ const isValid = (filterGroups.length === 0 || filterGroups.every(
145
+ (group) => group.filters.every(
146
+ (filter) => filter.errors && filter.errors.length === 0
147
+ )
148
+ )) && ((newFilter == null ? void 0 : newFilter.errors) ? newFilter.errors.length === 0 : true);
149
+ const isEmpty = filterGroups.length === 0 && (newFilter ? filterHelpers.isEmptyFormFilter(newFilter) : true);
150
+ return {
151
+ dispatch,
152
+ filterGroups,
153
+ newFilter,
154
+ isNewFilterInputOpen,
155
+ isValid,
156
+ isEmpty
157
+ };
158
+ };
159
+ exports.useFiltersForm = useFiltersForm;
160
+ //# sourceMappingURL=useFiltersForm.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFiltersForm.cjs","sources":["../../../../src/components/filterform/useFiltersForm.ts"],"sourcesContent":["import { useReducer } from 'react'\nimport { FilterForm, FilterGroup, FormFilter } from './types'\n// Deep import, not `import { cloneDeep } from 'lodash'`: lodash is CommonJS\n// and Node cannot statically detect its named exports, so the bundled\n// package throws \"Named export 'cloneDeep' not found\" when a consumer\n// loads it through native Node ESM (SSR, or vitest without a bundler).\nimport cloneDeep from 'lodash/cloneDeep.js'\nimport { isEmptyFormFilter } from './filterHelpers'\n\ntype UseFiltersFormInput = {\n initialValues?: FilterForm\n}\n\ntype UseFiltersFormOutput = {\n dispatch: (action: Action) => void\n filterGroups: FilterGroup[]\n newFilter: FormFilter | undefined\n isNewFilterInputOpen: boolean\n isValid: boolean\n isEmpty: boolean\n}\n\ntype FilterFormState = {\n filterGroups: FilterGroup[]\n newFilter: FormFilter | undefined\n isNewFilterInputOpen: boolean\n}\n\ntype InitializeAction = {\n type: 'initialize'\n payload: FilterForm | undefined\n}\n\ntype OpenNewFilterInputAction = {\n type: 'openNewFilterInput'\n}\n\ntype AddNewFilterAction = {\n type: 'addNewFilter'\n payload: FormFilter\n}\n\ntype ChangeNewFilterAction = {\n type: 'changeNewFilter'\n payload: FormFilter\n}\n\ntype RemoveNewFilterAction = {\n type: 'removeNewFilter'\n}\n\ntype ClearAllFiltersAction = {\n type: 'clearAllFilters'\n}\n\ntype UpdateFilterAction = {\n type: 'updateFilter'\n payload: {\n groupIndex: number\n filterIndex: number\n filter: FormFilter\n }\n}\n\ntype ChangeFilterAction = {\n type: 'changeFilter'\n payload: {\n groupIndex: number\n filterIndex: number\n filter: FormFilter\n }\n}\n\ntype RemoveFilterAction = {\n type: 'removeFilter'\n payload: {\n groupIndex: number\n filterIndex: number\n }\n}\n\ntype Action =\n | AddNewFilterAction\n | UpdateFilterAction\n | ClearAllFiltersAction\n | ChangeNewFilterAction\n | OpenNewFilterInputAction\n | ChangeFilterAction\n | RemoveFilterAction\n | InitializeAction\n | RemoveNewFilterAction\n\nconst copyFilterGroups = (filterGroups: FilterGroup[]): FilterGroup[] => {\n return cloneDeep(filterGroups)\n}\n\nconst addFilter = (\n filter: FormFilter,\n filterGroups: FilterGroup[]\n): FilterGroup[] => {\n const copy = copyFilterGroups(filterGroups)\n const filterGroupIndex = copy.findIndex(\n (filterGroup) => filterGroup.field === filter.field\n )\n\n if (filterGroupIndex === -1) {\n copy.push({ field: filter.field, filters: [filter] })\n } else {\n copy[filterGroupIndex].filters.push(filter)\n }\n\n return copy\n}\n\nconst removeFilter = (\n groupIndex: number,\n filterIndex: number,\n filterGroups: FilterGroup[]\n): FilterGroup[] => {\n const copy = copyFilterGroups(filterGroups)\n copy[groupIndex].filters.splice(filterIndex, 1)\n\n return copy.filter((group) => group.filters.length > 0)\n}\n\nconst filterFormReducer = (state: FilterFormState, action: Action) => {\n switch (action.type) {\n case 'initialize': {\n const filterGroups = action.payload?.filters.reduce(\n (acc, filter) => {\n return addFilter(filter, acc)\n },\n [...state.filterGroups]\n )\n\n return {\n ...state,\n filterGroups: filterGroups ?? [],\n isNewFilterInputOpen: !filterGroups?.length,\n }\n }\n case 'openNewFilterInput': {\n return {\n ...state,\n isNewFilterInputOpen: true,\n }\n }\n case 'addNewFilter': {\n if (action.payload.errors && action.payload.errors.length > 0) {\n return state\n }\n\n const filterGroups = addFilter(action.payload, state.filterGroups)\n\n return {\n ...state,\n filterGroups,\n newFilter: undefined,\n isNewFilterInputOpen: false,\n }\n }\n case 'changeNewFilter': {\n return {\n ...state,\n newFilter: action.payload,\n }\n }\n case 'removeNewFilter': {\n const allFiltersRemoved = state.filterGroups.every(\n (group) => group.filters.length === 0\n )\n return {\n ...state,\n newFilter: undefined,\n isNewFilterInputOpen: allFiltersRemoved,\n }\n }\n case 'updateFilter': {\n const { groupIndex, filterIndex, filter } = action.payload\n let filterGroups = copyFilterGroups(state.filterGroups)\n const groupField = filterGroups[groupIndex].field\n\n if (groupField === filter.field) {\n filterGroups[groupIndex].filters[filterIndex] = filter\n } else {\n filterGroups = removeFilter(groupIndex, filterIndex, filterGroups)\n filterGroups = addFilter(filter, filterGroups)\n }\n\n return {\n ...state,\n filterGroups,\n }\n }\n case 'changeFilter': {\n const { groupIndex, filterIndex, filter } = action.payload\n const filterGroups = copyFilterGroups(state.filterGroups)\n const group = filterGroups[groupIndex]\n if (group) {\n group.filters[filterIndex] = filter\n }\n\n return {\n ...state,\n filterGroups,\n }\n }\n case 'removeFilter': {\n const { groupIndex, filterIndex } = action.payload\n\n const filterGroups = removeFilter(\n groupIndex,\n filterIndex,\n state.filterGroups\n )\n\n return {\n ...state,\n filterGroups,\n isNewFilterInputOpen:\n state.isNewFilterInputOpen || filterGroups.length === 0,\n }\n }\n case 'clearAllFilters': {\n return {\n ...state,\n filterGroups: [],\n isNewFilterInputOpen: true,\n }\n }\n default:\n return state\n }\n}\n\nexport const useFiltersForm = ({\n initialValues,\n}: UseFiltersFormInput): UseFiltersFormOutput => {\n const [{ filterGroups, newFilter, isNewFilterInputOpen }, dispatch] =\n useReducer(\n filterFormReducer,\n {\n filterGroups: [],\n newFilter: undefined,\n isNewFilterInputOpen: true,\n },\n (state) => {\n return filterFormReducer(state, {\n type: 'initialize',\n payload: initialValues,\n })\n }\n )\n\n const isValid =\n (filterGroups.length === 0 ||\n filterGroups.every((group) =>\n group.filters.every(\n (filter) => filter.errors && filter.errors.length === 0\n )\n )) &&\n (newFilter?.errors ? newFilter.errors.length === 0 : true)\n\n const isEmpty =\n filterGroups.length === 0 &&\n (newFilter ? isEmptyFormFilter(newFilter) : true)\n\n return {\n dispatch,\n filterGroups,\n newFilter,\n isNewFilterInputOpen,\n isValid,\n isEmpty,\n }\n}\n"],"names":["useReducer","isEmptyFormFilter"],"mappings":"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"}
@@ -0,0 +1,160 @@
1
+ import { useReducer } from "react";
2
+ import cloneDeep from "lodash/cloneDeep.js";
3
+ import { isEmptyFormFilter } from "./filterHelpers.js";
4
+ const copyFilterGroups = (filterGroups) => {
5
+ return cloneDeep(filterGroups);
6
+ };
7
+ const addFilter = (filter, filterGroups) => {
8
+ const copy = copyFilterGroups(filterGroups);
9
+ const filterGroupIndex = copy.findIndex(
10
+ (filterGroup) => filterGroup.field === filter.field
11
+ );
12
+ if (filterGroupIndex === -1) {
13
+ copy.push({ field: filter.field, filters: [filter] });
14
+ } else {
15
+ copy[filterGroupIndex].filters.push(filter);
16
+ }
17
+ return copy;
18
+ };
19
+ const removeFilter = (groupIndex, filterIndex, filterGroups) => {
20
+ const copy = copyFilterGroups(filterGroups);
21
+ copy[groupIndex].filters.splice(filterIndex, 1);
22
+ return copy.filter((group) => group.filters.length > 0);
23
+ };
24
+ const filterFormReducer = (state, action) => {
25
+ var _a;
26
+ switch (action.type) {
27
+ case "initialize": {
28
+ const filterGroups = (_a = action.payload) == null ? void 0 : _a.filters.reduce(
29
+ (acc, filter) => {
30
+ return addFilter(filter, acc);
31
+ },
32
+ [...state.filterGroups]
33
+ );
34
+ return {
35
+ ...state,
36
+ filterGroups: filterGroups ?? [],
37
+ isNewFilterInputOpen: !(filterGroups == null ? void 0 : filterGroups.length)
38
+ };
39
+ }
40
+ case "openNewFilterInput": {
41
+ return {
42
+ ...state,
43
+ isNewFilterInputOpen: true
44
+ };
45
+ }
46
+ case "addNewFilter": {
47
+ if (action.payload.errors && action.payload.errors.length > 0) {
48
+ return state;
49
+ }
50
+ const filterGroups = addFilter(action.payload, state.filterGroups);
51
+ return {
52
+ ...state,
53
+ filterGroups,
54
+ newFilter: void 0,
55
+ isNewFilterInputOpen: false
56
+ };
57
+ }
58
+ case "changeNewFilter": {
59
+ return {
60
+ ...state,
61
+ newFilter: action.payload
62
+ };
63
+ }
64
+ case "removeNewFilter": {
65
+ const allFiltersRemoved = state.filterGroups.every(
66
+ (group) => group.filters.length === 0
67
+ );
68
+ return {
69
+ ...state,
70
+ newFilter: void 0,
71
+ isNewFilterInputOpen: allFiltersRemoved
72
+ };
73
+ }
74
+ case "updateFilter": {
75
+ const { groupIndex, filterIndex, filter } = action.payload;
76
+ let filterGroups = copyFilterGroups(state.filterGroups);
77
+ const groupField = filterGroups[groupIndex].field;
78
+ if (groupField === filter.field) {
79
+ filterGroups[groupIndex].filters[filterIndex] = filter;
80
+ } else {
81
+ filterGroups = removeFilter(groupIndex, filterIndex, filterGroups);
82
+ filterGroups = addFilter(filter, filterGroups);
83
+ }
84
+ return {
85
+ ...state,
86
+ filterGroups
87
+ };
88
+ }
89
+ case "changeFilter": {
90
+ const { groupIndex, filterIndex, filter } = action.payload;
91
+ const filterGroups = copyFilterGroups(state.filterGroups);
92
+ const group = filterGroups[groupIndex];
93
+ if (group) {
94
+ group.filters[filterIndex] = filter;
95
+ }
96
+ return {
97
+ ...state,
98
+ filterGroups
99
+ };
100
+ }
101
+ case "removeFilter": {
102
+ const { groupIndex, filterIndex } = action.payload;
103
+ const filterGroups = removeFilter(
104
+ groupIndex,
105
+ filterIndex,
106
+ state.filterGroups
107
+ );
108
+ return {
109
+ ...state,
110
+ filterGroups,
111
+ isNewFilterInputOpen: state.isNewFilterInputOpen || filterGroups.length === 0
112
+ };
113
+ }
114
+ case "clearAllFilters": {
115
+ return {
116
+ ...state,
117
+ filterGroups: [],
118
+ isNewFilterInputOpen: true
119
+ };
120
+ }
121
+ default:
122
+ return state;
123
+ }
124
+ };
125
+ const useFiltersForm = ({
126
+ initialValues
127
+ }) => {
128
+ const [{ filterGroups, newFilter, isNewFilterInputOpen }, dispatch] = useReducer(
129
+ filterFormReducer,
130
+ {
131
+ filterGroups: [],
132
+ newFilter: void 0,
133
+ isNewFilterInputOpen: true
134
+ },
135
+ (state) => {
136
+ return filterFormReducer(state, {
137
+ type: "initialize",
138
+ payload: initialValues
139
+ });
140
+ }
141
+ );
142
+ const isValid = (filterGroups.length === 0 || filterGroups.every(
143
+ (group) => group.filters.every(
144
+ (filter) => filter.errors && filter.errors.length === 0
145
+ )
146
+ )) && ((newFilter == null ? void 0 : newFilter.errors) ? newFilter.errors.length === 0 : true);
147
+ const isEmpty = filterGroups.length === 0 && (newFilter ? isEmptyFormFilter(newFilter) : true);
148
+ return {
149
+ dispatch,
150
+ filterGroups,
151
+ newFilter,
152
+ isNewFilterInputOpen,
153
+ isValid,
154
+ isEmpty
155
+ };
156
+ };
157
+ export {
158
+ useFiltersForm
159
+ };
160
+ //# sourceMappingURL=useFiltersForm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFiltersForm.js","sources":["../../../../src/components/filterform/useFiltersForm.ts"],"sourcesContent":["import { useReducer } from 'react'\nimport { FilterForm, FilterGroup, FormFilter } from './types'\n// Deep import, not `import { cloneDeep } from 'lodash'`: lodash is CommonJS\n// and Node cannot statically detect its named exports, so the bundled\n// package throws \"Named export 'cloneDeep' not found\" when a consumer\n// loads it through native Node ESM (SSR, or vitest without a bundler).\nimport cloneDeep from 'lodash/cloneDeep.js'\nimport { isEmptyFormFilter } from './filterHelpers'\n\ntype UseFiltersFormInput = {\n initialValues?: FilterForm\n}\n\ntype UseFiltersFormOutput = {\n dispatch: (action: Action) => void\n filterGroups: FilterGroup[]\n newFilter: FormFilter | undefined\n isNewFilterInputOpen: boolean\n isValid: boolean\n isEmpty: boolean\n}\n\ntype FilterFormState = {\n filterGroups: FilterGroup[]\n newFilter: FormFilter | undefined\n isNewFilterInputOpen: boolean\n}\n\ntype InitializeAction = {\n type: 'initialize'\n payload: FilterForm | undefined\n}\n\ntype OpenNewFilterInputAction = {\n type: 'openNewFilterInput'\n}\n\ntype AddNewFilterAction = {\n type: 'addNewFilter'\n payload: FormFilter\n}\n\ntype ChangeNewFilterAction = {\n type: 'changeNewFilter'\n payload: FormFilter\n}\n\ntype RemoveNewFilterAction = {\n type: 'removeNewFilter'\n}\n\ntype ClearAllFiltersAction = {\n type: 'clearAllFilters'\n}\n\ntype UpdateFilterAction = {\n type: 'updateFilter'\n payload: {\n groupIndex: number\n filterIndex: number\n filter: FormFilter\n }\n}\n\ntype ChangeFilterAction = {\n type: 'changeFilter'\n payload: {\n groupIndex: number\n filterIndex: number\n filter: FormFilter\n }\n}\n\ntype RemoveFilterAction = {\n type: 'removeFilter'\n payload: {\n groupIndex: number\n filterIndex: number\n }\n}\n\ntype Action =\n | AddNewFilterAction\n | UpdateFilterAction\n | ClearAllFiltersAction\n | ChangeNewFilterAction\n | OpenNewFilterInputAction\n | ChangeFilterAction\n | RemoveFilterAction\n | InitializeAction\n | RemoveNewFilterAction\n\nconst copyFilterGroups = (filterGroups: FilterGroup[]): FilterGroup[] => {\n return cloneDeep(filterGroups)\n}\n\nconst addFilter = (\n filter: FormFilter,\n filterGroups: FilterGroup[]\n): FilterGroup[] => {\n const copy = copyFilterGroups(filterGroups)\n const filterGroupIndex = copy.findIndex(\n (filterGroup) => filterGroup.field === filter.field\n )\n\n if (filterGroupIndex === -1) {\n copy.push({ field: filter.field, filters: [filter] })\n } else {\n copy[filterGroupIndex].filters.push(filter)\n }\n\n return copy\n}\n\nconst removeFilter = (\n groupIndex: number,\n filterIndex: number,\n filterGroups: FilterGroup[]\n): FilterGroup[] => {\n const copy = copyFilterGroups(filterGroups)\n copy[groupIndex].filters.splice(filterIndex, 1)\n\n return copy.filter((group) => group.filters.length > 0)\n}\n\nconst filterFormReducer = (state: FilterFormState, action: Action) => {\n switch (action.type) {\n case 'initialize': {\n const filterGroups = action.payload?.filters.reduce(\n (acc, filter) => {\n return addFilter(filter, acc)\n },\n [...state.filterGroups]\n )\n\n return {\n ...state,\n filterGroups: filterGroups ?? [],\n isNewFilterInputOpen: !filterGroups?.length,\n }\n }\n case 'openNewFilterInput': {\n return {\n ...state,\n isNewFilterInputOpen: true,\n }\n }\n case 'addNewFilter': {\n if (action.payload.errors && action.payload.errors.length > 0) {\n return state\n }\n\n const filterGroups = addFilter(action.payload, state.filterGroups)\n\n return {\n ...state,\n filterGroups,\n newFilter: undefined,\n isNewFilterInputOpen: false,\n }\n }\n case 'changeNewFilter': {\n return {\n ...state,\n newFilter: action.payload,\n }\n }\n case 'removeNewFilter': {\n const allFiltersRemoved = state.filterGroups.every(\n (group) => group.filters.length === 0\n )\n return {\n ...state,\n newFilter: undefined,\n isNewFilterInputOpen: allFiltersRemoved,\n }\n }\n case 'updateFilter': {\n const { groupIndex, filterIndex, filter } = action.payload\n let filterGroups = copyFilterGroups(state.filterGroups)\n const groupField = filterGroups[groupIndex].field\n\n if (groupField === filter.field) {\n filterGroups[groupIndex].filters[filterIndex] = filter\n } else {\n filterGroups = removeFilter(groupIndex, filterIndex, filterGroups)\n filterGroups = addFilter(filter, filterGroups)\n }\n\n return {\n ...state,\n filterGroups,\n }\n }\n case 'changeFilter': {\n const { groupIndex, filterIndex, filter } = action.payload\n const filterGroups = copyFilterGroups(state.filterGroups)\n const group = filterGroups[groupIndex]\n if (group) {\n group.filters[filterIndex] = filter\n }\n\n return {\n ...state,\n filterGroups,\n }\n }\n case 'removeFilter': {\n const { groupIndex, filterIndex } = action.payload\n\n const filterGroups = removeFilter(\n groupIndex,\n filterIndex,\n state.filterGroups\n )\n\n return {\n ...state,\n filterGroups,\n isNewFilterInputOpen:\n state.isNewFilterInputOpen || filterGroups.length === 0,\n }\n }\n case 'clearAllFilters': {\n return {\n ...state,\n filterGroups: [],\n isNewFilterInputOpen: true,\n }\n }\n default:\n return state\n }\n}\n\nexport const useFiltersForm = ({\n initialValues,\n}: UseFiltersFormInput): UseFiltersFormOutput => {\n const [{ filterGroups, newFilter, isNewFilterInputOpen }, dispatch] =\n useReducer(\n filterFormReducer,\n {\n filterGroups: [],\n newFilter: undefined,\n isNewFilterInputOpen: true,\n },\n (state) => {\n return filterFormReducer(state, {\n type: 'initialize',\n payload: initialValues,\n })\n }\n )\n\n const isValid =\n (filterGroups.length === 0 ||\n filterGroups.every((group) =>\n group.filters.every(\n (filter) => filter.errors && filter.errors.length === 0\n )\n )) &&\n (newFilter?.errors ? newFilter.errors.length === 0 : true)\n\n const isEmpty =\n filterGroups.length === 0 &&\n (newFilter ? isEmptyFormFilter(newFilter) : true)\n\n return {\n dispatch,\n filterGroups,\n newFilter,\n isNewFilterInputOpen,\n isValid,\n isEmpty,\n }\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsxRuntime = require("react/jsx-runtime");
4
+ const formikAntd = require("formik-antd");
5
+ ;/* empty css */
6
+ const Form = ({ children, ...props }) => {
7
+ return /* @__PURE__ */ jsxRuntime.jsx(formikAntd.Form, { ...props, children });
8
+ };
9
+ Form.Item = formikAntd.FormItem;
10
+ exports.Form = Form;
11
+ //# sourceMappingURL=Form.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Form.cjs","sources":["../../../../src/components/form/Form.tsx"],"sourcesContent":["import { FormProps } from 'antd'\nimport { Form as AntdForm, FormItem } from 'formik-antd'\nimport './Form.css'\n\ntype Props = Expand<FormProps>\n\nexport const Form = ({ children, ...props }: Props) => {\n return <AntdForm {...props}>{children}</AntdForm>\n}\n\nForm.Item = FormItem\n"],"names":["jsx","AntdForm","FormItem"],"mappings":";;;;;AAMO,MAAM,OAAO,CAAC,EAAE,UAAU,GAAG,YAAmB;AACrD,SAAOA,2BAAAA,IAACC,WAAAA,MAAA,EAAU,GAAG,OAAQ,SAAA,CAAS;AACxC;AAEA,KAAK,OAAOC,WAAAA;;"}
@@ -0,0 +1,11 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { Form as Form$1, FormItem } from "formik-antd";
3
+ /* empty css */
4
+ const Form = ({ children, ...props }) => {
5
+ return /* @__PURE__ */ jsx(Form$1, { ...props, children });
6
+ };
7
+ Form.Item = FormItem;
8
+ export {
9
+ Form
10
+ };
11
+ //# sourceMappingURL=Form.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Form.js","sources":["../../../../src/components/form/Form.tsx"],"sourcesContent":["import { FormProps } from 'antd'\nimport { Form as AntdForm, FormItem } from 'formik-antd'\nimport './Form.css'\n\ntype Props = Expand<FormProps>\n\nexport const Form = ({ children, ...props }: Props) => {\n return <AntdForm {...props}>{children}</AntdForm>\n}\n\nForm.Item = FormItem\n"],"names":["AntdForm"],"mappings":";;;AAMO,MAAM,OAAO,CAAC,EAAE,UAAU,GAAG,YAAmB;AACrD,SAAO,oBAACA,QAAA,EAAU,GAAG,OAAQ,SAAA,CAAS;AACxC;AAEA,KAAK,OAAO;"}