@toptal/picasso-query-builder 1.5.1 → 2.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 (459) hide show
  1. package/{AddGroupButton → dist-package/src/AddGroupButton}/AddGroupButton.d.ts +1 -0
  2. package/dist-package/src/AddGroupButton/AddGroupButton.d.ts.map +1 -0
  3. package/dist-package/src/AddGroupButton/AddGroupButton.js.map +1 -0
  4. package/dist-package/src/AddGroupButton/index.d.ts +2 -0
  5. package/dist-package/src/AddGroupButton/index.d.ts.map +1 -0
  6. package/dist-package/src/AddGroupButton/index.js.map +1 -0
  7. package/{AddRuleButton → dist-package/src/AddRuleButton}/AddRuleButton.d.ts +1 -0
  8. package/dist-package/src/AddRuleButton/AddRuleButton.d.ts.map +1 -0
  9. package/dist-package/src/AddRuleButton/AddRuleButton.js.map +1 -0
  10. package/dist-package/src/AddRuleButton/index.d.ts +2 -0
  11. package/dist-package/src/AddRuleButton/index.d.ts.map +1 -0
  12. package/dist-package/src/AddRuleButton/index.js.map +1 -0
  13. package/{AutoComplete → dist-package/src/AutoComplete}/AutoComplete.d.ts +1 -0
  14. package/dist-package/src/AutoComplete/AutoComplete.d.ts.map +1 -0
  15. package/dist-package/src/AutoComplete/AutoComplete.js.map +1 -0
  16. package/dist-package/src/AutoComplete/index.d.ts +2 -0
  17. package/dist-package/src/AutoComplete/index.d.ts.map +1 -0
  18. package/dist-package/src/AutoComplete/index.js.map +1 -0
  19. package/{AutoComplete → dist-package/src/AutoComplete}/styles.d.ts +1 -0
  20. package/dist-package/src/AutoComplete/styles.d.ts.map +1 -0
  21. package/dist-package/src/AutoComplete/styles.js.map +1 -0
  22. package/{BooleanInput → dist-package/src/BooleanInput}/BooleanInput.d.ts +1 -0
  23. package/dist-package/src/BooleanInput/BooleanInput.d.ts.map +1 -0
  24. package/dist-package/src/BooleanInput/BooleanInput.js.map +1 -0
  25. package/dist-package/src/BooleanInput/index.d.ts +2 -0
  26. package/dist-package/src/BooleanInput/index.d.ts.map +1 -0
  27. package/dist-package/src/BooleanInput/index.js.map +1 -0
  28. package/{ClearQueryButton → dist-package/src/ClearQueryButton}/ClearQueryButton.d.ts +1 -0
  29. package/dist-package/src/ClearQueryButton/ClearQueryButton.d.ts.map +1 -0
  30. package/dist-package/src/ClearQueryButton/ClearQueryButton.js.map +1 -0
  31. package/{ClearQueryButton → dist-package/src/ClearQueryButton}/index.d.ts +1 -0
  32. package/dist-package/src/ClearQueryButton/index.d.ts.map +1 -0
  33. package/dist-package/src/ClearQueryButton/index.js.map +1 -0
  34. package/{CloneGroupButton → dist-package/src/CloneGroupButton}/CloneGroupButton.d.ts +1 -0
  35. package/dist-package/src/CloneGroupButton/CloneGroupButton.d.ts.map +1 -0
  36. package/dist-package/src/CloneGroupButton/CloneGroupButton.js.map +1 -0
  37. package/{CloneGroupButton → dist-package/src/CloneGroupButton}/index.d.ts +1 -0
  38. package/dist-package/src/CloneGroupButton/index.d.ts.map +1 -0
  39. package/dist-package/src/CloneGroupButton/index.js.map +1 -0
  40. package/{CloneRuleButton → dist-package/src/CloneRuleButton}/CloneRuleButton.d.ts +1 -0
  41. package/dist-package/src/CloneRuleButton/CloneRuleButton.d.ts.map +1 -0
  42. package/dist-package/src/CloneRuleButton/CloneRuleButton.js.map +1 -0
  43. package/{CloneRuleButton → dist-package/src/CloneRuleButton}/index.d.ts +1 -0
  44. package/dist-package/src/CloneRuleButton/index.d.ts.map +1 -0
  45. package/dist-package/src/CloneRuleButton/index.js.map +1 -0
  46. package/{CombinatorSelector → dist-package/src/CombinatorSelector}/CombinatorSelector.d.ts +1 -0
  47. package/dist-package/src/CombinatorSelector/CombinatorSelector.d.ts.map +1 -0
  48. package/dist-package/src/CombinatorSelector/CombinatorSelector.js.map +1 -0
  49. package/{CombinatorSelector → dist-package/src/CombinatorSelector}/RadioOptions.d.ts +1 -0
  50. package/dist-package/src/CombinatorSelector/RadioOptions.d.ts.map +1 -0
  51. package/dist-package/src/CombinatorSelector/RadioOptions.js.map +1 -0
  52. package/{CombinatorSelector → dist-package/src/CombinatorSelector}/index.d.ts +1 -0
  53. package/dist-package/src/CombinatorSelector/index.d.ts.map +1 -0
  54. package/dist-package/src/CombinatorSelector/index.js.map +1 -0
  55. package/{RunQueryButton → dist-package/src/CombinatorSelector}/styles.d.ts +1 -0
  56. package/dist-package/src/CombinatorSelector/styles.d.ts.map +1 -0
  57. package/dist-package/src/CombinatorSelector/styles.js.map +1 -0
  58. package/{ControlElementsContext → dist-package/src/ControlElementsContext}/ControlElementsContext.d.ts +1 -0
  59. package/dist-package/src/ControlElementsContext/ControlElementsContext.d.ts.map +1 -0
  60. package/dist-package/src/ControlElementsContext/ControlElementsContext.js.map +1 -0
  61. package/dist-package/src/ControlElementsContext/index.d.ts +2 -0
  62. package/dist-package/src/ControlElementsContext/index.d.ts.map +1 -0
  63. package/dist-package/src/ControlElementsContext/index.js.map +1 -0
  64. package/{FieldSelector → dist-package/src/FieldSelector}/FieldSelector.d.ts +1 -0
  65. package/dist-package/src/FieldSelector/FieldSelector.d.ts.map +1 -0
  66. package/dist-package/src/FieldSelector/FieldSelector.js.map +1 -0
  67. package/dist-package/src/FieldSelector/index.d.ts +2 -0
  68. package/dist-package/src/FieldSelector/index.d.ts.map +1 -0
  69. package/dist-package/src/FieldSelector/index.js.map +1 -0
  70. package/{MultiSelect → dist-package/src/MultiSelect}/MultiSelect.d.ts +1 -0
  71. package/dist-package/src/MultiSelect/MultiSelect.d.ts.map +1 -0
  72. package/dist-package/src/MultiSelect/MultiSelect.js.map +1 -0
  73. package/dist-package/src/MultiSelect/index.d.ts +2 -0
  74. package/dist-package/src/MultiSelect/index.d.ts.map +1 -0
  75. package/dist-package/src/MultiSelect/index.js.map +1 -0
  76. package/{CombinatorSelector → dist-package/src/MultiSelect}/styles.d.ts +1 -0
  77. package/dist-package/src/MultiSelect/styles.d.ts.map +1 -0
  78. package/{RunQueryButton → dist-package/src/MultiSelect}/styles.js.map +1 -1
  79. package/{OperatorSelector → dist-package/src/OperatorSelector}/OperatorSelector.d.ts +1 -0
  80. package/dist-package/src/OperatorSelector/OperatorSelector.d.ts.map +1 -0
  81. package/dist-package/src/OperatorSelector/OperatorSelector.js.map +1 -0
  82. package/{OperatorSelector → dist-package/src/OperatorSelector}/index.d.ts +1 -0
  83. package/dist-package/src/OperatorSelector/index.d.ts.map +1 -0
  84. package/dist-package/src/OperatorSelector/index.js.map +1 -0
  85. package/{MultiSelect → dist-package/src/OperatorSelector}/styles.d.ts +1 -0
  86. package/dist-package/src/OperatorSelector/styles.d.ts.map +1 -0
  87. package/dist-package/src/OperatorSelector/styles.js.map +1 -0
  88. package/{QueryBuilder → dist-package/src/QueryBuilder}/QueryBuilder.d.ts +1 -0
  89. package/dist-package/src/QueryBuilder/QueryBuilder.d.ts.map +1 -0
  90. package/{QueryBuilder → dist-package/src/QueryBuilder}/QueryBuilder.js +1 -1
  91. package/dist-package/src/QueryBuilder/QueryBuilder.js.map +1 -0
  92. package/{QueryBuilder → dist-package/src/QueryBuilder}/hooks/useOnQueryChange.d.ts +1 -0
  93. package/dist-package/src/QueryBuilder/hooks/useOnQueryChange.d.ts.map +1 -0
  94. package/{QueryBuilder → dist-package/src/QueryBuilder}/hooks/useOnQueryChange.js +1 -1
  95. package/dist-package/src/QueryBuilder/hooks/useOnQueryChange.js.map +1 -0
  96. package/{QueryBuilder → dist-package/src/QueryBuilder}/index.d.ts +1 -0
  97. package/dist-package/src/QueryBuilder/index.d.ts.map +1 -0
  98. package/dist-package/src/QueryBuilder/index.js.map +1 -0
  99. package/{QueryBuilder → dist-package/src/QueryBuilder}/query-builder-global-styles.d.ts +9 -8
  100. package/dist-package/src/QueryBuilder/query-builder-global-styles.d.ts.map +1 -0
  101. package/{QueryBuilder → dist-package/src/QueryBuilder}/query-builder-global-styles.js +1 -1
  102. package/dist-package/src/QueryBuilder/query-builder-global-styles.js.map +1 -0
  103. package/{QueryBuilder → dist-package/src/QueryBuilder}/styles.d.ts +1 -0
  104. package/dist-package/src/QueryBuilder/styles.d.ts.map +1 -0
  105. package/dist-package/src/QueryBuilder/styles.js.map +1 -0
  106. package/{RangeInput → dist-package/src/RangeInput}/RangeInput.d.ts +1 -0
  107. package/dist-package/src/RangeInput/RangeInput.d.ts.map +1 -0
  108. package/dist-package/src/RangeInput/RangeInput.js.map +1 -0
  109. package/dist-package/src/RangeInput/index.d.ts +2 -0
  110. package/dist-package/src/RangeInput/index.d.ts.map +1 -0
  111. package/dist-package/src/RangeInput/index.js.map +1 -0
  112. package/{RangeInput → dist-package/src/RangeInput}/styles.d.ts +1 -0
  113. package/dist-package/src/RangeInput/styles.d.ts.map +1 -0
  114. package/dist-package/src/RangeInput/styles.js.map +1 -0
  115. package/{RemoveGroupButton → dist-package/src/RemoveGroupButton}/RemoveGroupButton.d.ts +1 -0
  116. package/dist-package/src/RemoveGroupButton/RemoveGroupButton.d.ts.map +1 -0
  117. package/{RemoveGroupButton → dist-package/src/RemoveGroupButton}/RemoveGroupButton.js +1 -1
  118. package/dist-package/src/RemoveGroupButton/RemoveGroupButton.js.map +1 -0
  119. package/{RemoveGroupButton → dist-package/src/RemoveGroupButton}/index.d.ts +1 -0
  120. package/dist-package/src/RemoveGroupButton/index.d.ts.map +1 -0
  121. package/dist-package/src/RemoveGroupButton/index.js.map +1 -0
  122. package/{RemoveRuleButton → dist-package/src/RemoveRuleButton}/RemoveRuleButton.d.ts +1 -0
  123. package/dist-package/src/RemoveRuleButton/RemoveRuleButton.d.ts.map +1 -0
  124. package/dist-package/src/RemoveRuleButton/RemoveRuleButton.js.map +1 -0
  125. package/{RemoveRuleButton → dist-package/src/RemoveRuleButton}/index.d.ts +1 -0
  126. package/dist-package/src/RemoveRuleButton/index.d.ts.map +1 -0
  127. package/dist-package/src/RemoveRuleButton/index.js.map +1 -0
  128. package/{RunQueryButton → dist-package/src/RunQueryButton}/RunQueryButton.d.ts +1 -0
  129. package/dist-package/src/RunQueryButton/RunQueryButton.d.ts.map +1 -0
  130. package/dist-package/src/RunQueryButton/RunQueryButton.js.map +1 -0
  131. package/dist-package/src/RunQueryButton/index.d.ts +2 -0
  132. package/dist-package/src/RunQueryButton/index.d.ts.map +1 -0
  133. package/dist-package/src/RunQueryButton/index.js.map +1 -0
  134. package/{OperatorSelector → dist-package/src/RunQueryButton}/styles.d.ts +1 -0
  135. package/dist-package/src/RunQueryButton/styles.d.ts.map +1 -0
  136. package/dist-package/src/RunQueryButton/styles.js.map +1 -0
  137. package/{Select → dist-package/src/Select}/Select.d.ts +1 -0
  138. package/dist-package/src/Select/Select.d.ts.map +1 -0
  139. package/dist-package/src/Select/Select.js.map +1 -0
  140. package/dist-package/src/Select/index.d.ts +2 -0
  141. package/dist-package/src/Select/index.d.ts.map +1 -0
  142. package/dist-package/src/Select/index.js.map +1 -0
  143. package/dist-package/src/Select/styles.d.ts +3 -0
  144. package/dist-package/src/Select/styles.d.ts.map +1 -0
  145. package/dist-package/src/Select/styles.js.map +1 -0
  146. package/{TextInput → dist-package/src/TextInput}/TextInput.d.ts +1 -0
  147. package/dist-package/src/TextInput/TextInput.d.ts.map +1 -0
  148. package/dist-package/src/TextInput/TextInput.js.map +1 -0
  149. package/dist-package/src/TextInput/index.d.ts +2 -0
  150. package/dist-package/src/TextInput/index.d.ts.map +1 -0
  151. package/dist-package/src/TextInput/index.js.map +1 -0
  152. package/{ValidationErrors → dist-package/src/ValidationErrors}/ValidationErrors.d.ts +1 -0
  153. package/dist-package/src/ValidationErrors/ValidationErrors.d.ts.map +1 -0
  154. package/dist-package/src/ValidationErrors/ValidationErrors.js.map +1 -0
  155. package/dist-package/src/ValidationErrors/index.d.ts +2 -0
  156. package/dist-package/src/ValidationErrors/index.d.ts.map +1 -0
  157. package/dist-package/src/ValidationErrors/index.js.map +1 -0
  158. package/{ValueEditor → dist-package/src/ValueEditor}/ValueEditor.d.ts +1 -0
  159. package/dist-package/src/ValueEditor/ValueEditor.d.ts.map +1 -0
  160. package/dist-package/src/ValueEditor/ValueEditor.js.map +1 -0
  161. package/dist-package/src/ValueEditor/index.d.ts +2 -0
  162. package/dist-package/src/ValueEditor/index.d.ts.map +1 -0
  163. package/dist-package/src/ValueEditor/index.js.map +1 -0
  164. package/dist-package/src/ValueEditor/styles.d.ts +3 -0
  165. package/dist-package/src/ValueEditor/styles.d.ts.map +1 -0
  166. package/dist-package/src/ValueEditor/styles.js.map +1 -0
  167. package/{index.d.ts → dist-package/src/index.d.ts} +1 -0
  168. package/dist-package/src/index.d.ts.map +1 -0
  169. package/dist-package/src/index.js.map +1 -0
  170. package/{types → dist-package/src/types}/condition.d.ts +1 -0
  171. package/dist-package/src/types/condition.d.ts.map +1 -0
  172. package/dist-package/src/types/condition.js.map +1 -0
  173. package/{types → dist-package/src/types}/query-builder.d.ts +1 -0
  174. package/dist-package/src/types/query-builder.d.ts.map +1 -0
  175. package/dist-package/src/types/query-builder.js.map +1 -0
  176. package/{utils → dist-package/src/utils}/config.d.ts +1 -0
  177. package/dist-package/src/utils/config.d.ts.map +1 -0
  178. package/dist-package/src/utils/config.js.map +1 -0
  179. package/{utils → dist-package/src/utils}/constants.d.ts +1 -0
  180. package/dist-package/src/utils/constants.d.ts.map +1 -0
  181. package/dist-package/src/utils/constants.js.map +1 -0
  182. package/{utils → dist-package/src/utils}/generate-select-options.d.ts +3 -2
  183. package/dist-package/src/utils/generate-select-options.d.ts.map +1 -0
  184. package/dist-package/src/utils/generate-select-options.js.map +1 -0
  185. package/{utils → dist-package/src/utils}/get-query-depth.d.ts +1 -0
  186. package/dist-package/src/utils/get-query-depth.d.ts.map +1 -0
  187. package/dist-package/src/utils/get-query-depth.js.map +1 -0
  188. package/{utils → dist-package/src/utils}/index.d.ts +1 -0
  189. package/dist-package/src/utils/index.d.ts.map +1 -0
  190. package/dist-package/src/utils/index.js.map +1 -0
  191. package/{utils → dist-package/src/utils}/use-handle-touched.d.ts +1 -0
  192. package/dist-package/src/utils/use-handle-touched.d.ts.map +1 -0
  193. package/dist-package/src/utils/use-handle-touched.js.map +1 -0
  194. package/{utils → dist-package/src/utils}/use-query-builder-validator.d.ts +1 -0
  195. package/dist-package/src/utils/use-query-builder-validator.d.ts.map +1 -0
  196. package/dist-package/src/utils/use-query-builder-validator.js.map +1 -0
  197. package/{utils → dist-package/src/utils}/validate-value-editor.d.ts +1 -0
  198. package/dist-package/src/utils/validate-value-editor.d.ts.map +1 -0
  199. package/dist-package/src/utils/validate-value-editor.js.map +1 -0
  200. package/package.json +20 -9
  201. package/src/AddGroupButton/AddGroupButton.test.tsx +91 -0
  202. package/src/AddGroupButton/AddGroupButton.tsx +36 -0
  203. package/src/AddGroupButton/index.ts +1 -0
  204. package/src/AddRuleButton/AddRuleButton.tsx +26 -0
  205. package/src/AddRuleButton/index.ts +1 -0
  206. package/src/AutoComplete/AutoComplete.tsx +104 -0
  207. package/src/AutoComplete/index.ts +1 -0
  208. package/src/AutoComplete/styles.ts +12 -0
  209. package/src/BooleanInput/BooleanInput.tsx +46 -0
  210. package/src/BooleanInput/index.ts +1 -0
  211. package/src/ClearQueryButton/ClearQueryButton.tsx +14 -0
  212. package/src/ClearQueryButton/index.ts +1 -0
  213. package/src/CloneGroupButton/CloneGroupButton.tsx +21 -0
  214. package/src/CloneGroupButton/index.ts +1 -0
  215. package/src/CloneRuleButton/CloneRuleButton.tsx +19 -0
  216. package/src/CloneRuleButton/index.ts +1 -0
  217. package/src/CombinatorSelector/CombinatorSelector.test.tsx +74 -0
  218. package/src/CombinatorSelector/CombinatorSelector.tsx +40 -0
  219. package/src/CombinatorSelector/RadioOptions.test.tsx +89 -0
  220. package/src/CombinatorSelector/RadioOptions.tsx +39 -0
  221. package/src/CombinatorSelector/index.ts +1 -0
  222. package/src/CombinatorSelector/styles.tsx +8 -0
  223. package/src/ControlElementsContext/ControlElementsContext.tsx +33 -0
  224. package/{ControlElementsContext/index.d.ts → src/ControlElementsContext/index.ts} +1 -1
  225. package/src/FieldSelector/FieldSelector.tsx +28 -0
  226. package/src/FieldSelector/index.ts +1 -0
  227. package/src/MultiSelect/MultiSelect.tsx +65 -0
  228. package/src/MultiSelect/index.ts +1 -0
  229. package/src/MultiSelect/styles.ts +8 -0
  230. package/src/OperatorSelector/OperatorSelector.tsx +25 -0
  231. package/src/OperatorSelector/index.ts +1 -0
  232. package/src/OperatorSelector/styles.ts +8 -0
  233. package/src/QueryBuilder/QueryBuilder.tsx +246 -0
  234. package/src/QueryBuilder/hooks/useOnQueryChange.tsx +32 -0
  235. package/src/QueryBuilder/index.ts +1 -0
  236. package/src/QueryBuilder/query-builder-global-styles.ts +202 -0
  237. package/src/QueryBuilder/story/Callback.example.tsx +89 -0
  238. package/src/QueryBuilder/story/CustomOperators.example.tsx +86 -0
  239. package/src/QueryBuilder/story/CustomValueEditor.example.tsx +75 -0
  240. package/src/QueryBuilder/story/Default.example.tsx +279 -0
  241. package/src/QueryBuilder/story/DragDrop.example.tsx +289 -0
  242. package/src/QueryBuilder/story/DynamicMultiselect.example.tsx +72 -0
  243. package/src/QueryBuilder/story/Header.example.tsx +62 -0
  244. package/src/QueryBuilder/story/HideControls.example.tsx +55 -0
  245. package/src/QueryBuilder/story/InitialValues.example.tsx +310 -0
  246. package/src/QueryBuilder/story/Loading.example.tsx +55 -0
  247. package/src/QueryBuilder/story/MaxDepth.example.tsx +61 -0
  248. package/src/QueryBuilder/story/RuleValidation.example.tsx +85 -0
  249. package/src/QueryBuilder/story/TotalCount.example.tsx +55 -0
  250. package/src/QueryBuilder/story/index.jsx +84 -0
  251. package/src/QueryBuilder/styles.ts +105 -0
  252. package/src/RangeInput/RangeInput.test.tsx +145 -0
  253. package/src/RangeInput/RangeInput.tsx +117 -0
  254. package/src/RangeInput/index.ts +1 -0
  255. package/src/RangeInput/styles.ts +11 -0
  256. package/src/RemoveGroupButton/RemoveGroupButton.tsx +36 -0
  257. package/src/RemoveGroupButton/index.ts +1 -0
  258. package/src/RemoveRuleButton/RemoveRuleButton.tsx +19 -0
  259. package/src/RemoveRuleButton/index.ts +1 -0
  260. package/src/RunQueryButton/RunQueryButton.tsx +50 -0
  261. package/src/RunQueryButton/index.ts +1 -0
  262. package/src/RunQueryButton/styles.ts +8 -0
  263. package/src/Select/Select.tsx +55 -0
  264. package/src/Select/index.ts +1 -0
  265. package/src/Select/styles.ts +8 -0
  266. package/src/TextInput/TextInput.tsx +55 -0
  267. package/src/TextInput/index.ts +1 -0
  268. package/src/ValidationErrors/ValidationErrors.test.tsx +102 -0
  269. package/src/ValidationErrors/ValidationErrors.tsx +60 -0
  270. package/{ValidationErrors/index.d.ts → src/ValidationErrors/index.ts} +1 -1
  271. package/src/ValueEditor/ValueEditor.tsx +148 -0
  272. package/src/ValueEditor/index.ts +1 -0
  273. package/src/ValueEditor/styles.ts +8 -0
  274. package/src/index.ts +31 -0
  275. package/src/story/index.jsx +10 -0
  276. package/src/types/condition.ts +4 -0
  277. package/src/types/query-builder.ts +96 -0
  278. package/src/utils/config.ts +13 -0
  279. package/src/utils/constants.ts +4 -0
  280. package/src/utils/generate-select-options.test.ts +67 -0
  281. package/src/utils/generate-select-options.ts +26 -0
  282. package/src/utils/get-query-depth.test.ts +83 -0
  283. package/src/utils/get-query-depth.ts +13 -0
  284. package/src/utils/index.ts +6 -0
  285. package/src/utils/use-handle-touched.test.ts +57 -0
  286. package/src/utils/use-handle-touched.ts +26 -0
  287. package/src/utils/use-query-builder-validator.test.ts +209 -0
  288. package/src/utils/use-query-builder-validator.ts +111 -0
  289. package/src/utils/validate-value-editor.test.ts +98 -0
  290. package/src/utils/validate-value-editor.ts +20 -0
  291. package/AddGroupButton/AddGroupButton.js.map +0 -1
  292. package/AddGroupButton/AddGroupButton.test.d.ts +0 -1
  293. package/AddGroupButton/AddGroupButton.test.js +0 -73
  294. package/AddGroupButton/AddGroupButton.test.js.map +0 -1
  295. package/AddGroupButton/index.d.ts +0 -1
  296. package/AddGroupButton/index.js.map +0 -1
  297. package/AddRuleButton/AddRuleButton.js.map +0 -1
  298. package/AddRuleButton/index.d.ts +0 -1
  299. package/AddRuleButton/index.js.map +0 -1
  300. package/AutoComplete/AutoComplete.js.map +0 -1
  301. package/AutoComplete/index.d.ts +0 -1
  302. package/AutoComplete/index.js.map +0 -1
  303. package/AutoComplete/styles.js.map +0 -1
  304. package/BooleanInput/BooleanInput.js.map +0 -1
  305. package/BooleanInput/index.d.ts +0 -1
  306. package/BooleanInput/index.js.map +0 -1
  307. package/ClearQueryButton/ClearQueryButton.js.map +0 -1
  308. package/ClearQueryButton/index.js.map +0 -1
  309. package/CloneGroupButton/CloneGroupButton.js.map +0 -1
  310. package/CloneGroupButton/index.js.map +0 -1
  311. package/CloneRuleButton/CloneRuleButton.js.map +0 -1
  312. package/CloneRuleButton/index.js.map +0 -1
  313. package/CombinatorSelector/CombinatorSelector.js.map +0 -1
  314. package/CombinatorSelector/CombinatorSelector.test.d.ts +0 -1
  315. package/CombinatorSelector/CombinatorSelector.test.js +0 -54
  316. package/CombinatorSelector/CombinatorSelector.test.js.map +0 -1
  317. package/CombinatorSelector/RadioOptions.js.map +0 -1
  318. package/CombinatorSelector/RadioOptions.test.d.ts +0 -1
  319. package/CombinatorSelector/RadioOptions.test.js +0 -58
  320. package/CombinatorSelector/RadioOptions.test.js.map +0 -1
  321. package/CombinatorSelector/index.js.map +0 -1
  322. package/CombinatorSelector/styles.js.map +0 -1
  323. package/ControlElementsContext/ControlElementsContext.js.map +0 -1
  324. package/ControlElementsContext/index.js.map +0 -1
  325. package/FieldSelector/FieldSelector.js.map +0 -1
  326. package/FieldSelector/index.d.ts +0 -1
  327. package/FieldSelector/index.js.map +0 -1
  328. package/LICENSE +0 -20
  329. package/MultiSelect/MultiSelect.js.map +0 -1
  330. package/MultiSelect/index.d.ts +0 -1
  331. package/MultiSelect/index.js.map +0 -1
  332. package/MultiSelect/styles.js.map +0 -1
  333. package/OperatorSelector/OperatorSelector.js.map +0 -1
  334. package/OperatorSelector/index.js.map +0 -1
  335. package/OperatorSelector/styles.js.map +0 -1
  336. package/QueryBuilder/QueryBuilder.js.map +0 -1
  337. package/QueryBuilder/hooks/useOnQueryChange.js.map +0 -1
  338. package/QueryBuilder/index.js.map +0 -1
  339. package/QueryBuilder/query-builder-global-styles.js.map +0 -1
  340. package/QueryBuilder/styles.js.map +0 -1
  341. package/RangeInput/RangeInput.js.map +0 -1
  342. package/RangeInput/RangeInput.test.d.ts +0 -1
  343. package/RangeInput/RangeInput.test.js +0 -102
  344. package/RangeInput/RangeInput.test.js.map +0 -1
  345. package/RangeInput/index.d.ts +0 -1
  346. package/RangeInput/index.js.map +0 -1
  347. package/RangeInput/styles.js.map +0 -1
  348. package/RemoveGroupButton/RemoveGroupButton.js.map +0 -1
  349. package/RemoveGroupButton/index.js.map +0 -1
  350. package/RemoveRuleButton/RemoveRuleButton.js.map +0 -1
  351. package/RemoveRuleButton/index.js.map +0 -1
  352. package/RunQueryButton/RunQueryButton.js.map +0 -1
  353. package/RunQueryButton/index.d.ts +0 -1
  354. package/RunQueryButton/index.js.map +0 -1
  355. package/Select/Select.js.map +0 -1
  356. package/Select/index.d.ts +0 -1
  357. package/Select/index.js.map +0 -1
  358. package/Select/styles.d.ts +0 -2
  359. package/Select/styles.js.map +0 -1
  360. package/TextInput/TextInput.js.map +0 -1
  361. package/TextInput/index.d.ts +0 -1
  362. package/TextInput/index.js.map +0 -1
  363. package/ValidationErrors/ValidationErrors.js.map +0 -1
  364. package/ValidationErrors/ValidationErrors.test.d.ts +0 -1
  365. package/ValidationErrors/ValidationErrors.test.js +0 -73
  366. package/ValidationErrors/ValidationErrors.test.js.map +0 -1
  367. package/ValidationErrors/index.js.map +0 -1
  368. package/ValueEditor/ValueEditor.js.map +0 -1
  369. package/ValueEditor/index.d.ts +0 -1
  370. package/ValueEditor/index.js.map +0 -1
  371. package/ValueEditor/styles.d.ts +0 -2
  372. package/ValueEditor/styles.js.map +0 -1
  373. package/index.js.map +0 -1
  374. package/types/condition.js.map +0 -1
  375. package/types/query-builder.js.map +0 -1
  376. package/utils/config.js.map +0 -1
  377. package/utils/constants.js.map +0 -1
  378. package/utils/generate-select-options.js.map +0 -1
  379. package/utils/generate-select-options.test.d.ts +0 -1
  380. package/utils/generate-select-options.test.js +0 -58
  381. package/utils/generate-select-options.test.js.map +0 -1
  382. package/utils/get-query-depth.js.map +0 -1
  383. package/utils/get-query-depth.test.d.ts +0 -1
  384. package/utils/get-query-depth.test.js +0 -80
  385. package/utils/get-query-depth.test.js.map +0 -1
  386. package/utils/index.js.map +0 -1
  387. package/utils/use-handle-touched.js.map +0 -1
  388. package/utils/use-handle-touched.test.d.ts +0 -1
  389. package/utils/use-handle-touched.test.js +0 -39
  390. package/utils/use-handle-touched.test.js.map +0 -1
  391. package/utils/use-query-builder-validator.js.map +0 -1
  392. package/utils/use-query-builder-validator.test.d.ts +0 -1
  393. package/utils/use-query-builder-validator.test.js +0 -176
  394. package/utils/use-query-builder-validator.test.js.map +0 -1
  395. package/utils/validate-value-editor.js.map +0 -1
  396. package/utils/validate-value-editor.test.d.ts +0 -1
  397. package/utils/validate-value-editor.test.js +0 -69
  398. package/utils/validate-value-editor.test.js.map +0 -1
  399. /package/{AddGroupButton → dist-package/src/AddGroupButton}/AddGroupButton.js +0 -0
  400. /package/{AddGroupButton → dist-package/src/AddGroupButton}/index.js +0 -0
  401. /package/{AddRuleButton → dist-package/src/AddRuleButton}/AddRuleButton.js +0 -0
  402. /package/{AddRuleButton → dist-package/src/AddRuleButton}/index.js +0 -0
  403. /package/{AutoComplete → dist-package/src/AutoComplete}/AutoComplete.js +0 -0
  404. /package/{AutoComplete → dist-package/src/AutoComplete}/index.js +0 -0
  405. /package/{AutoComplete → dist-package/src/AutoComplete}/styles.js +0 -0
  406. /package/{BooleanInput → dist-package/src/BooleanInput}/BooleanInput.js +0 -0
  407. /package/{BooleanInput → dist-package/src/BooleanInput}/index.js +0 -0
  408. /package/{ClearQueryButton → dist-package/src/ClearQueryButton}/ClearQueryButton.js +0 -0
  409. /package/{ClearQueryButton → dist-package/src/ClearQueryButton}/index.js +0 -0
  410. /package/{CloneGroupButton → dist-package/src/CloneGroupButton}/CloneGroupButton.js +0 -0
  411. /package/{CloneGroupButton → dist-package/src/CloneGroupButton}/index.js +0 -0
  412. /package/{CloneRuleButton → dist-package/src/CloneRuleButton}/CloneRuleButton.js +0 -0
  413. /package/{CloneRuleButton → dist-package/src/CloneRuleButton}/index.js +0 -0
  414. /package/{CombinatorSelector → dist-package/src/CombinatorSelector}/CombinatorSelector.js +0 -0
  415. /package/{CombinatorSelector → dist-package/src/CombinatorSelector}/RadioOptions.js +0 -0
  416. /package/{CombinatorSelector → dist-package/src/CombinatorSelector}/index.js +0 -0
  417. /package/{CombinatorSelector → dist-package/src/CombinatorSelector}/styles.js +0 -0
  418. /package/{ControlElementsContext → dist-package/src/ControlElementsContext}/ControlElementsContext.js +0 -0
  419. /package/{ControlElementsContext → dist-package/src/ControlElementsContext}/index.js +0 -0
  420. /package/{FieldSelector → dist-package/src/FieldSelector}/FieldSelector.js +0 -0
  421. /package/{FieldSelector → dist-package/src/FieldSelector}/index.js +0 -0
  422. /package/{MultiSelect → dist-package/src/MultiSelect}/MultiSelect.js +0 -0
  423. /package/{MultiSelect → dist-package/src/MultiSelect}/index.js +0 -0
  424. /package/{MultiSelect → dist-package/src/MultiSelect}/styles.js +0 -0
  425. /package/{OperatorSelector → dist-package/src/OperatorSelector}/OperatorSelector.js +0 -0
  426. /package/{OperatorSelector → dist-package/src/OperatorSelector}/index.js +0 -0
  427. /package/{OperatorSelector → dist-package/src/OperatorSelector}/styles.js +0 -0
  428. /package/{QueryBuilder → dist-package/src/QueryBuilder}/index.js +0 -0
  429. /package/{QueryBuilder → dist-package/src/QueryBuilder}/styles.js +0 -0
  430. /package/{RangeInput → dist-package/src/RangeInput}/RangeInput.js +0 -0
  431. /package/{RangeInput → dist-package/src/RangeInput}/index.js +0 -0
  432. /package/{RangeInput → dist-package/src/RangeInput}/styles.js +0 -0
  433. /package/{RemoveGroupButton → dist-package/src/RemoveGroupButton}/index.js +0 -0
  434. /package/{RemoveRuleButton → dist-package/src/RemoveRuleButton}/RemoveRuleButton.js +0 -0
  435. /package/{RemoveRuleButton → dist-package/src/RemoveRuleButton}/index.js +0 -0
  436. /package/{RunQueryButton → dist-package/src/RunQueryButton}/RunQueryButton.js +0 -0
  437. /package/{RunQueryButton → dist-package/src/RunQueryButton}/index.js +0 -0
  438. /package/{RunQueryButton → dist-package/src/RunQueryButton}/styles.js +0 -0
  439. /package/{Select → dist-package/src/Select}/Select.js +0 -0
  440. /package/{Select → dist-package/src/Select}/index.js +0 -0
  441. /package/{Select → dist-package/src/Select}/styles.js +0 -0
  442. /package/{TextInput → dist-package/src/TextInput}/TextInput.js +0 -0
  443. /package/{TextInput → dist-package/src/TextInput}/index.js +0 -0
  444. /package/{ValidationErrors → dist-package/src/ValidationErrors}/ValidationErrors.js +0 -0
  445. /package/{ValidationErrors → dist-package/src/ValidationErrors}/index.js +0 -0
  446. /package/{ValueEditor → dist-package/src/ValueEditor}/ValueEditor.js +0 -0
  447. /package/{ValueEditor → dist-package/src/ValueEditor}/index.js +0 -0
  448. /package/{ValueEditor → dist-package/src/ValueEditor}/styles.js +0 -0
  449. /package/{index.js → dist-package/src/index.js} +0 -0
  450. /package/{types → dist-package/src/types}/condition.js +0 -0
  451. /package/{types → dist-package/src/types}/query-builder.js +0 -0
  452. /package/{utils → dist-package/src/utils}/config.js +0 -0
  453. /package/{utils → dist-package/src/utils}/constants.js +0 -0
  454. /package/{utils → dist-package/src/utils}/generate-select-options.js +0 -0
  455. /package/{utils → dist-package/src/utils}/get-query-depth.js +0 -0
  456. /package/{utils → dist-package/src/utils}/index.js +0 -0
  457. /package/{utils → dist-package/src/utils}/use-handle-touched.js +0 -0
  458. /package/{utils → dist-package/src/utils}/use-query-builder-validator.js +0 -0
  459. /package/{utils → dist-package/src/utils}/validate-value-editor.js +0 -0
@@ -0,0 +1,28 @@
1
+ import React from 'react'
2
+ import type { ComponentProps } from 'react'
3
+
4
+ import { Select } from '../Select'
5
+
6
+ export const FieldSelector = ({
7
+ context: { resetSubmitButtonClicked, getDisabledFields, testIds },
8
+ disabled,
9
+ ...props
10
+ }: ComponentProps<typeof Select>) => {
11
+ // TODO: https://toptal-core.atlassian.net/browse/CPT-947
12
+ const disabledFields = getDisabledFields()
13
+
14
+ return (
15
+ <Select
16
+ {...props}
17
+ handleOnChange={value => {
18
+ if (disabledFields.includes(value)) {
19
+ return
20
+ }
21
+ resetSubmitButtonClicked()
22
+ props.handleOnChange(value)
23
+ }}
24
+ disabled={disabled || disabledFields.includes(props.value)}
25
+ valueEditorTestId={testIds?.fieldSelector}
26
+ />
27
+ )
28
+ }
@@ -0,0 +1 @@
1
+ export * from './FieldSelector'
@@ -0,0 +1,65 @@
1
+ import React, { useMemo } from 'react'
2
+ import { Container, Select } from '@toptal/picasso'
3
+ import { makeStyles } from '@material-ui/core/styles'
4
+
5
+ import { generateSelectOptions, validateValueEditor } from '../utils'
6
+ import type {
7
+ BaseVersatileSelectorProps,
8
+ ValueEditorValidationProps,
9
+ } from '../types/query-builder'
10
+ import styles from './styles'
11
+
12
+ type Props = BaseVersatileSelectorProps &
13
+ ValueEditorValidationProps & {
14
+ valueEditorTestId?: string
15
+ }
16
+
17
+ const useStyles = makeStyles(styles)
18
+
19
+ export const MultiSelect = ({
20
+ options,
21
+ handleOnChange,
22
+ handleTouched,
23
+ validation,
24
+ touched,
25
+ value = '',
26
+ disabled,
27
+ className,
28
+ fieldData,
29
+ valueEditorTestId,
30
+ }: Props) => {
31
+ const classes = useStyles()
32
+
33
+ const hasError = validateValueEditor({
34
+ validation,
35
+ touched,
36
+ })
37
+
38
+ const formattedOptions = useMemo(
39
+ () => generateSelectOptions(options),
40
+ [options]
41
+ )
42
+ const values = useMemo(() => {
43
+ return value?.split(',').filter(Boolean)
44
+ }, [value])
45
+
46
+ return (
47
+ <Container className={classes.root}>
48
+ <Select
49
+ disabled={disabled}
50
+ className={className}
51
+ onChange={event => handleOnChange(event.target.value.join(','))}
52
+ onClick={fieldData?.onClick}
53
+ loading={fieldData?.loading}
54
+ onBlur={() => handleTouched?.(true)}
55
+ options={formattedOptions}
56
+ multiple
57
+ value={values}
58
+ status={hasError ? 'error' : undefined}
59
+ data-testid={valueEditorTestId}
60
+ enableReset={fieldData?.enableReset}
61
+ enableResetSearch={fieldData?.enableResetSearch}
62
+ />
63
+ </Container>
64
+ )
65
+ }
@@ -0,0 +1 @@
1
+ export * from './MultiSelect'
@@ -0,0 +1,8 @@
1
+ import { createStyles } from '@material-ui/core/styles'
2
+
3
+ export default () =>
4
+ createStyles({
5
+ root: {
6
+ flex: '1 0 12.5rem',
7
+ },
8
+ })
@@ -0,0 +1,25 @@
1
+ import React from 'react'
2
+ import { makeStyles } from '@material-ui/core/styles'
3
+ import type { OperatorSelectorProps } from 'react-querybuilder'
4
+
5
+ import { Select } from '../Select'
6
+ import type { Field } from '../types/query-builder'
7
+ import styles from './styles'
8
+
9
+ const useStyles = makeStyles(styles)
10
+
11
+ export const OperatorSelector = ({
12
+ fieldData,
13
+ ...rest
14
+ }: OperatorSelectorProps) => {
15
+ const classes = useStyles()
16
+
17
+ if (
18
+ fieldData.hideOperator ||
19
+ (fieldData as Field).valueEditorType === 'range'
20
+ ) {
21
+ return null
22
+ }
23
+
24
+ return <Select {...rest} className={classes.root} />
25
+ }
@@ -0,0 +1 @@
1
+ export * from './OperatorSelector'
@@ -0,0 +1,8 @@
1
+ import { createStyles } from '@material-ui/core/styles'
2
+
3
+ export default () =>
4
+ createStyles({
5
+ root: {
6
+ flexBasis: '6.25rem',
7
+ },
8
+ })
@@ -0,0 +1,246 @@
1
+ import React, { useCallback, useEffect, useState } from 'react'
2
+ import type { ComponentType } from 'react'
3
+ import { Container } from '@toptal/picasso'
4
+ import { useNotifications } from '@toptal/picasso-notification'
5
+ import type {
6
+ ValueEditorProps as DefaultValueEditorProps,
7
+ Field as QueryBuilderField,
8
+ RuleGroupTypeAny,
9
+ Operator,
10
+ } from 'react-querybuilder'
11
+ import {
12
+ QueryBuilder as ReactQueryBuilder,
13
+ defaultOperators,
14
+ remove,
15
+ } from 'react-querybuilder'
16
+ import { QueryBuilderDnD } from '@react-querybuilder/dnd'
17
+ import * as ReactDnD from 'react-dnd'
18
+ import * as ReactDndHtml5Backend from 'react-dnd-html5-backend'
19
+ import { makeStyles } from '@material-ui/core/styles'
20
+ import cx from 'classnames'
21
+
22
+ import type { QueryBuilderContext, Field, TestId } from '../types/query-builder'
23
+ import { RunQueryButton } from '../RunQueryButton'
24
+ import { ClearQueryButton } from '../ClearQueryButton'
25
+ import { ControlElementsContext } from '../ControlElementsContext'
26
+ import { emptyQueryBuilderQuery } from '../utils/constants'
27
+ import type { QueryBuilderValueEditorProps as ValEditorProps } from '../ValueEditor'
28
+ import { ValueEditor as DefaultValEditor } from '../ValueEditor'
29
+ import { controlClassnames, useQueryBuilderValidator } from '../utils'
30
+ import styles from './styles'
31
+ import { useOnQueryChange } from './hooks/useOnQueryChange'
32
+ import { ValidationErrors } from '../ValidationErrors'
33
+ import type { ValidatorResult } from '../utils/use-query-builder-validator'
34
+
35
+ type ValueEditorComponentProps = ComponentType<DefaultValueEditorProps>
36
+
37
+ type Props = {
38
+ /** Defines array of fields to build a query. Each filed is an object with a list of properties. */
39
+ fields: Field[]
40
+ /** Defines a set of rules which will be used to fetch data, a combinator and a query id. */
41
+ query: RuleGroupTypeAny
42
+ /** Defines a function that is called when the user makes a change to the query in the UI. This function receives an updated query as an argument. */
43
+ onQueryChange: (newQuery: RuleGroupTypeAny) => void
44
+ /** Defines a function that is called when validation status changes. Receives a boolean argument `isValid` */
45
+ onValidationChange?: (isValid: boolean) => void
46
+ /** Defines a function that is called when QB resets to its default state */
47
+ onQueryReset?: () => void
48
+ /** Defines a limit for depth of nested rule groups in QB. By default is set to 3. */
49
+ maxGroupDepth?: number
50
+ /** Defines a function that returns an array of operator objects that could be used to construct queries. */
51
+ getOperators?: (fields: Field[], fieldName: string) => Operator[]
52
+ /** Defines a function that is called when the user submits a query constructed in the QB. This function takes a single argument - constructed query. */
53
+ onSubmit?: (query: RuleGroupTypeAny) => void
54
+ /** Defines a component that allows possibility to customize value editor that is used in QB. By default, QB provides default set of editors (text inputs, dropdowns, etc.). */
55
+ customValueEditor?: ValueEditorComponentProps
56
+ /** Defines the loading state. */
57
+ loading?: boolean
58
+ /** Defines the possibility to display, or not, any of the controls. For example "Add rule" or "Add group" control. */
59
+ hideControls?: boolean
60
+ /** Defines the possibility to enable, or not, drag-and-drop functionality. This possibility applies to rules and groups to rearrange it within QB. */
61
+ enableDragAndDrop?: boolean
62
+ /** Adds a customized header at the top of the query builder. */
63
+ header?: React.ReactNode
64
+ /** Defines the possibility to reset, or not, operator and value fields when the user changes the field selection for a rule. */
65
+ resetOnFieldChange?: boolean
66
+ /** Defines the total number of results, usually used by other components that may need to know the total number of results. */
67
+ totalCount?: number
68
+ /** Defines the possibility to display a loading indicator or message to the user while the total count is being fetched. */
69
+ totalCountLoading?: boolean
70
+ testIds?: TestId
71
+ }
72
+
73
+ const useStyles = makeStyles(styles)
74
+
75
+ const ValueEditor = (props: ValEditorProps) => <DefaultValEditor {...props} />
76
+
77
+ const QueryBuilder = ({
78
+ fields,
79
+ query,
80
+ onQueryChange,
81
+ onValidationChange,
82
+ getOperators: customOperators,
83
+ maxGroupDepth = 3,
84
+ loading = false,
85
+ onSubmit,
86
+ customValueEditor = ValueEditor,
87
+ hideControls,
88
+ header,
89
+ enableDragAndDrop = false,
90
+ resetOnFieldChange = true,
91
+ totalCount,
92
+ totalCountLoading,
93
+ onQueryReset,
94
+ testIds,
95
+ }: Props) => {
96
+ const classes = useStyles()
97
+
98
+ const [submitButtonClicked, setSubmitButtonClicked] = useState(false)
99
+ const [queryBuilderValid, setIsQueryBuilderValid] = useState<
100
+ boolean | undefined
101
+ >()
102
+ const [validationErrors, setValidationErrors] = useState<ValidatorResult>({})
103
+
104
+ const { showError } = useNotifications()
105
+
106
+ const { handleQueryChange } = useOnQueryChange({
107
+ maxGroupDepth,
108
+ callback: onQueryChange,
109
+ })
110
+
111
+ const { validator } = useQueryBuilderValidator({
112
+ fields,
113
+ onValidChange: setIsQueryBuilderValid,
114
+ onValidationResultChange: setValidationErrors,
115
+ })
116
+
117
+ const resetQuery = useCallback(() => {
118
+ if (onQueryReset) {
119
+ onQueryReset()
120
+ }
121
+
122
+ onQueryChange(emptyQueryBuilderQuery)
123
+ }, [onQueryChange, onQueryReset])
124
+
125
+ const handleRemoveGroup = useCallback(
126
+ (path: number[]) => {
127
+ if (query) {
128
+ onQueryChange(remove(query, path))
129
+ }
130
+ },
131
+ [query, onQueryChange]
132
+ )
133
+
134
+ const handleSubmit = useCallback(() => {
135
+ setSubmitButtonClicked(true)
136
+
137
+ if (!queryBuilderValid) {
138
+ showError(
139
+ <ValidationErrors
140
+ validationErrorsTestId={testIds?.validationErrors}
141
+ validationResult={validationErrors}
142
+ />
143
+ )
144
+
145
+ return
146
+ }
147
+
148
+ if (onSubmit && query) {
149
+ onSubmit(query)
150
+ }
151
+ }, [queryBuilderValid, onSubmit, query, showError, validationErrors])
152
+
153
+ const resetSubmitButtonClicked = useCallback(() => {
154
+ setSubmitButtonClicked(false)
155
+ }, [])
156
+
157
+ const getDisabledFields = () => {
158
+ return fields
159
+ .filter(field => {
160
+ if (field?.disabled === true) {
161
+ return field.name
162
+ }
163
+ })
164
+ .map(disabledField => disabledField.name)
165
+ }
166
+
167
+ const getOperators = useCallback(
168
+ (fieldName: string) => {
169
+ if (customOperators) {
170
+ return customOperators(fields, fieldName)
171
+ }
172
+
173
+ return defaultOperators
174
+ },
175
+ [customOperators, fields]
176
+ )
177
+
178
+ useEffect(() => {
179
+ if (queryBuilderValid !== undefined) {
180
+ onValidationChange?.(queryBuilderValid)
181
+ }
182
+ // eslint-disable-next-line react-hooks/exhaustive-deps
183
+ }, [queryBuilderValid])
184
+
185
+ return (
186
+ <ControlElementsContext>
187
+ <Container
188
+ className={cx(classes.global, classes.root)}
189
+ flex
190
+ padded={hideControls ? undefined : 'medium'}
191
+ direction='column'
192
+ gap='small'
193
+ >
194
+ {header && (
195
+ <Container data-testid={testIds?.header}>{header}</Container>
196
+ )}
197
+ <QueryBuilderDnD dnd={{ ...ReactDnD, ...ReactDndHtml5Backend }}>
198
+ <ReactQueryBuilder
199
+ resetOnFieldChange={resetOnFieldChange}
200
+ fields={fields as QueryBuilderField[]}
201
+ addRuleToNewGroups
202
+ controlClassnames={controlClassnames}
203
+ query={query}
204
+ validator={validator}
205
+ onQueryChange={handleQueryChange}
206
+ showCloneButtons
207
+ getOperators={getOperators}
208
+ context={
209
+ {
210
+ removeGroup: handleRemoveGroup,
211
+ maxDepth: maxGroupDepth,
212
+ queryBuilderValid: queryBuilderValid,
213
+ submitButtonClicked,
214
+ resetSubmitButtonClicked,
215
+ getDisabledFields,
216
+ testIds,
217
+ } as QueryBuilderContext
218
+ }
219
+ controlElements={{
220
+ valueEditor: customValueEditor,
221
+ }}
222
+ enableDragAndDrop={enableDragAndDrop}
223
+ />
224
+ </QueryBuilderDnD>
225
+ {!hideControls && (
226
+ <Container
227
+ flex
228
+ justifyContent='flex-end'
229
+ data-testid={testIds?.controls}
230
+ >
231
+ <ClearQueryButton onClick={resetQuery} />
232
+ <RunQueryButton
233
+ onClick={handleSubmit}
234
+ loading={loading}
235
+ totalCount={totalCount}
236
+ totalCountLoading={totalCountLoading}
237
+ runQueryTestId={testIds?.runQueryButton}
238
+ />
239
+ </Container>
240
+ )}
241
+ </Container>
242
+ </ControlElementsContext>
243
+ )
244
+ }
245
+
246
+ export default QueryBuilder
@@ -0,0 +1,32 @@
1
+ import type { RuleGroupTypeAny } from 'react-querybuilder'
2
+ import { useNotifications } from '@toptal/picasso-notification'
3
+ import { useCallback } from 'react'
4
+
5
+ import { getQueryDepth } from '../../utils'
6
+
7
+ type Props = {
8
+ maxGroupDepth: number
9
+ callback: (query: RuleGroupTypeAny) => void
10
+ }
11
+
12
+ export const useOnQueryChange = ({ maxGroupDepth, callback }: Props) => {
13
+ const { showError } = useNotifications()
14
+
15
+ const handleQueryChange = useCallback(
16
+ (changedQuery: RuleGroupTypeAny) => {
17
+ // subtract one because we do not count top level query as depth level 1
18
+ // object depth level is not exactly the query depth level
19
+ const level = getQueryDepth(changedQuery) - 1
20
+
21
+ if (level > maxGroupDepth) {
22
+ return showError(
23
+ `Can not exceed maximum group depth (${maxGroupDepth})`
24
+ )
25
+ }
26
+ callback(changedQuery)
27
+ },
28
+ [maxGroupDepth, callback, showError]
29
+ )
30
+
31
+ return { handleQueryChange }
32
+ }
@@ -0,0 +1 @@
1
+ export { default as QueryBuilder } from './QueryBuilder'
@@ -0,0 +1,202 @@
1
+ /* eslint-disable */
2
+
3
+ /**
4
+ * we moved the styles from react query builder library css file to styled components to fix problem
5
+ * related to cdn caching issue causing an error in production.
6
+ * Issue URL: https://toptal-core.atlassian.net/browse/ER-28394
7
+ */
8
+ import { SPACING_2, SPACING_4, SPACING_6, palette } from '@toptal/picasso-provider'
9
+
10
+ // Basic
11
+ const rqbSpacing = `${SPACING_6}rem`
12
+ const rqbSmallSpacing = `${SPACING_4}rem`
13
+ const rqbWhiteBackgroundColor = palette.common.white
14
+ const rqbBorderColor = palette.grey.light2
15
+ const rqbBorderStyle = 'solid'
16
+ const rqbBorderRadius = '0.5rem'
17
+ const rqbBorderWidth = '0.0625rem'
18
+
19
+ // Drag-and-drop
20
+ const rqbDndSpacing = `${SPACING_2}rem`
21
+ const rqbDndHoverBorderBottomColor = palette.purple.main
22
+ const rqbDndHoverCopyBorderBottomColor = palette.green.lighter
23
+ const rqbDndHoverBorderBottomStyle = 'dashed'
24
+ const rqbDndHoverBorderBottomWidth = '0.125rem'
25
+
26
+ // Branches
27
+ const rqbBranchIndent = '0.75rem'
28
+ const rqbBranchRadius = '0'
29
+ const rqbBranchColorLight = palette.blue.light
30
+ const rqbBranchWidth = rqbBorderWidth
31
+ const rqbBranchStyle = rqbBorderStyle
32
+
33
+ export const queryBuilderGlobalStyles = () => ({
34
+ '& .ruleGroup': {
35
+ display: 'flex',
36
+ flexDirection: 'column',
37
+ gap: rqbSmallSpacing,
38
+ padding: rqbSpacing,
39
+ borderColor: rqbBorderColor,
40
+ borderStyle: rqbBorderStyle,
41
+ borderRadius: rqbBorderRadius,
42
+ borderWidth: rqbBorderWidth,
43
+ backgroundColor: rqbWhiteBackgroundColor,
44
+ margin: '-1px',
45
+
46
+ '& .ruleGroup-body': {
47
+ display: 'flex',
48
+ flexDirection: 'column',
49
+ gap: rqbSmallSpacing,
50
+
51
+ '&:empty': {
52
+ display: 'none',
53
+ },
54
+ },
55
+
56
+ '& .ruleGroup-header, .rule': {
57
+ display: 'flex',
58
+ gap: rqbSmallSpacing,
59
+ alignItems: 'center',
60
+ },
61
+
62
+ '& .rule': {
63
+ flexWrap: 'wrap',
64
+ '& .rule-value': {
65
+ '& .rule-value-list-item:not(:first-of-type)': {
66
+ margineft: rqbSmallSpacing,
67
+ },
68
+ },
69
+ },
70
+ },
71
+
72
+ /* Drag-and-drop */
73
+
74
+ /* Hover styles */
75
+ '& [data-inlinecombinators="disabled"]': {
76
+ '& .dndOver': {
77
+ '&.rule, &.ruleGroup-header': {
78
+ borderBottomWidth: rqbDndHoverBorderBottomWidth,
79
+ borderBottomStyle: rqbDndHoverBorderBottomStyle,
80
+ borderBottomColor: rqbDndHoverBorderBottomColor,
81
+ paddingBottom: rqbDndSpacing,
82
+
83
+ '&.dndCopy': {
84
+ borderBottomColor: rqbDndHoverCopyBorderBottomColor,
85
+ },
86
+ },
87
+ },
88
+ },
89
+
90
+ '& [data-inlinecombinators="enabled"]': {
91
+ '& .dndOver': {
92
+ '&.rule:last-child, &.ruleGroup-header, &.rule + .betweenRules, &.betweenRules':
93
+ {
94
+ borderBottomWidth: rqbDndHoverBorderBottomWidth,
95
+ borderBottomStyle: rqbDndHoverBorderBottomStyle,
96
+ borderBottomColor: rqbDndHoverCopyBorderBottomColor,
97
+ paddingBottom: rqbDndSpacing,
98
+
99
+ '&.dndCopy': {
100
+ borderBottomColor: rqbDndHoverCopyBorderBottomColor,
101
+ },
102
+ },
103
+ },
104
+ },
105
+
106
+ /* Drag styles */
107
+ '& .ruleGroup, .rule': {
108
+ '&.dndDragging': {
109
+ opacity: 0.5,
110
+ },
111
+
112
+ '& .queryBuilder-dragHandle': {
113
+ cursor: 'move',
114
+ },
115
+ },
116
+
117
+ '& [data-dnd="disabled"] .queryBuilder-dragHandle': {
118
+ display: 'none',
119
+ },
120
+
121
+ /* Branches */
122
+ '& .queryBuilder-branches': {
123
+ '& .ruleGroup-body': {
124
+ marginLeft: `calc(2 * ${rqbBranchIndent})`,
125
+ },
126
+
127
+ '& .rule, .ruleGroup .ruleGroup': {
128
+ position: 'relative',
129
+
130
+ '&::before, &::after': {
131
+ content: '""',
132
+ width: rqbBranchIndent,
133
+ left: `-${rqbSmallSpacing}`,
134
+ borderColor: rqbBranchColorLight,
135
+ borderStyle: rqbBranchStyle,
136
+ borderRadius: rqbBranchRadius,
137
+ position: 'absolute',
138
+ },
139
+
140
+ '&::before': {
141
+ content: '""',
142
+ top: `-${rqbSmallSpacing}`,
143
+ height: `calc(50% + ${rqbSmallSpacing})`,
144
+ borderWidth: `0 0 ${rqbBranchWidth} ${rqbBranchWidth}`,
145
+ },
146
+
147
+ '&:last-child::before': {
148
+ content: '""',
149
+ borderBottomLeftRadius: 0,
150
+ },
151
+
152
+ '&::after': {
153
+ content: '""',
154
+ top: '50%',
155
+ height: '50%',
156
+ borderWidth: `0 0 0 ${rqbBranchWidth}`,
157
+ },
158
+
159
+ '&:last-child::after': {
160
+ content: '""',
161
+ display: 'none',
162
+ },
163
+ },
164
+
165
+ '& .ruleGroup .ruleGroup': {
166
+ padding: rqbSmallSpacing,
167
+
168
+ '&::before, &::after': {
169
+ content: '""',
170
+ left: `calc(-${rqbSmallSpacing} - ${rqbBranchWidth})`,
171
+ },
172
+
173
+ '&::before': {
174
+ content: '""',
175
+ top: `calc(-${rqbSmallSpacing} - ${rqbBorderWidth})`,
176
+ height: `calc(50% + ${rqbSmallSpacing} + ${rqbBorderWidth})`,
177
+ },
178
+
179
+ '&::after': {
180
+ content: '""',
181
+ height: `calc(50% + ${rqbBorderWidth})`,
182
+ },
183
+ },
184
+
185
+ '& .betweenRules': {
186
+ position: 'relative',
187
+
188
+ '&::before': {
189
+ content: '""',
190
+ width: rqbBranchIndent,
191
+ left: `calc(-${rqbBranchIndent} - ${rqbBranchWidth})`,
192
+ borderColor: rqbBorderColor,
193
+ borderStyle: rqbBranchStyle,
194
+ borderRadius: rqbBranchRadius,
195
+ position: 'absolute',
196
+ top: rqbSmallSpacing,
197
+ height: `calc(100% + ${rqbSmallSpacing})`,
198
+ borderWidth: `0 0 0 ${rqbBranchWidth}`,
199
+ },
200
+ },
201
+ },
202
+ })