@jetshop/ui 5.7.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 (687) hide show
  1. package/Accordion/Accordion.d.ts +33 -0
  2. package/Accordion/Accordion.js +59 -0
  3. package/Accordion/Accordion.js.map +1 -0
  4. package/Accordion/Accordion.test.js +73 -0
  5. package/Accordion/__doc_utils__/AccordionHeader.js +12 -0
  6. package/Auth/FormFields/CountriesInput.d.ts +14 -0
  7. package/Auth/FormFields/CountriesInput.js +28 -0
  8. package/Auth/FormFields/CountriesInput.js.map +1 -0
  9. package/Auth/LogInBehavior.d.ts +22 -0
  10. package/Auth/LogInBehavior.js +24 -0
  11. package/Auth/LogInBehavior.js.map +1 -0
  12. package/Auth/LogInFormProvider.d.ts +7 -0
  13. package/Auth/LogInFormProvider.js +71 -0
  14. package/Auth/LogInFormProvider.js.map +1 -0
  15. package/Auth/LogOut.d.ts +10 -0
  16. package/Auth/LogOut.js +24 -0
  17. package/Auth/LogOut.js.map +1 -0
  18. package/Auth/logInValidator.d.ts +8 -0
  19. package/Auth/logInValidator.js +16 -0
  20. package/Auth/logInValidator.js.map +1 -0
  21. package/Breadcrumbs/Breadcrumbs.d.ts +15 -0
  22. package/Breadcrumbs/Breadcrumbs.js +67 -0
  23. package/Breadcrumbs/Breadcrumbs.js.map +1 -0
  24. package/Breadcrumbs/getParentsOrCanonicalRoute.d.ts +3 -0
  25. package/Breadcrumbs/getParentsOrCanonicalRoute.js +13 -0
  26. package/Breadcrumbs/getParentsOrCanonicalRoute.js.map +1 -0
  27. package/Breadcrumbs/index.d.ts +1 -0
  28. package/Breadcrumbs/index.js +2 -0
  29. package/Breadcrumbs/index.js.map +1 -0
  30. package/Breakpoints.d.ts +13 -0
  31. package/Breakpoints.js +37 -0
  32. package/Breakpoints.js.map +1 -0
  33. package/Button/Button.d.ts +14 -0
  34. package/Button/Button.js +60 -0
  35. package/Button/Button.js.map +1 -0
  36. package/Button/OutlineButton.d.ts +4 -0
  37. package/Button/OutlineButton.js +10 -0
  38. package/Button/OutlineButton.js.map +1 -0
  39. package/Button/SecondaryButton.d.ts +3 -0
  40. package/Button/SecondaryButton.js +9 -0
  41. package/Button/SecondaryButton.js.map +1 -0
  42. package/Button/TrendButton.d.ts +3 -0
  43. package/Button/TrendButton.js +8 -0
  44. package/Button/TrendButton.js.map +1 -0
  45. package/Button/index.d.ts +4 -0
  46. package/Button/index.js +5 -0
  47. package/Button/index.js.map +1 -0
  48. package/CategoryLink.d.ts +9 -0
  49. package/CategoryLink.js +43 -0
  50. package/CategoryLink.js.map +1 -0
  51. package/ChannelSelector/ChannelListItem.d.ts +10 -0
  52. package/ChannelSelector/ChannelListItem.js +51 -0
  53. package/ChannelSelector/ChannelListItem.js.map +1 -0
  54. package/ChannelSelector/ChannelListItem.test.js +85 -0
  55. package/ChannelSelector/ChannelSelector.d.ts +63 -0
  56. package/ChannelSelector/ChannelSelector.js +80 -0
  57. package/ChannelSelector/ChannelSelector.js.map +1 -0
  58. package/ChannelSelector/ChannelSelector.test.js +167 -0
  59. package/ChannelSelector/ChannelSelectorButtons.d.ts +3 -0
  60. package/ChannelSelector/ChannelSelectorButtons.js +20 -0
  61. package/ChannelSelector/ChannelSelectorButtons.js.map +1 -0
  62. package/ChannelSelector/Channels.d.ts +17 -0
  63. package/ChannelSelector/Channels.js +12 -0
  64. package/ChannelSelector/Channels.js.map +1 -0
  65. package/ChannelSelector/Channels.test.js +90 -0
  66. package/ChannelSelector/LargeSelector.d.ts +3 -0
  67. package/ChannelSelector/LargeSelector.js +67 -0
  68. package/ChannelSelector/LargeSelector.js.map +1 -0
  69. package/ChannelSelector/MiniSelector.d.ts +4 -0
  70. package/ChannelSelector/MiniSelector.js +58 -0
  71. package/ChannelSelector/MiniSelector.js.map +1 -0
  72. package/ChannelSelector/Region.d.ts +28 -0
  73. package/ChannelSelector/Region.js +21 -0
  74. package/ChannelSelector/Region.js.map +1 -0
  75. package/ChannelSelector/Region.test.js +37 -0
  76. package/ChannelSelector/exampleChannels.js +577 -0
  77. package/ChannelSelector/groupBy.d.ts +7 -0
  78. package/ChannelSelector/groupBy.js +16 -0
  79. package/ChannelSelector/groupBy.js.map +1 -0
  80. package/ChannelSelector/groupBy.test.js +42 -0
  81. package/Checkbox/Checkbox.d.ts +10 -0
  82. package/Checkbox/Checkbox.js +69 -0
  83. package/Checkbox/Checkbox.js.map +1 -0
  84. package/Checkbox/CheckboxGroup.d.ts +23 -0
  85. package/Checkbox/CheckboxGroup.js +22 -0
  86. package/Checkbox/CheckboxGroup.js.map +1 -0
  87. package/Checkbox/index.d.ts +2 -0
  88. package/Checkbox/index.js +3 -0
  89. package/Checkbox/index.js.map +1 -0
  90. package/ContentPageLink.d.ts +9 -0
  91. package/ContentPageLink.js +37 -0
  92. package/ContentPageLink.js.map +1 -0
  93. package/ContentRenderer.d.ts +9 -0
  94. package/ContentRenderer.js +36 -0
  95. package/ContentRenderer.js.map +1 -0
  96. package/DropdownMenu/Button.d.ts +7 -0
  97. package/DropdownMenu/Button.js +32 -0
  98. package/DropdownMenu/Button.js.map +1 -0
  99. package/DropdownMenu/DropdownMenu.d.ts +21 -0
  100. package/DropdownMenu/DropdownMenu.js +73 -0
  101. package/DropdownMenu/DropdownMenu.js.map +1 -0
  102. package/DropdownMenu/Item.d.ts +13 -0
  103. package/DropdownMenu/Item.js +48 -0
  104. package/DropdownMenu/Item.js.map +1 -0
  105. package/DropdownMenu/Items.d.ts +16 -0
  106. package/DropdownMenu/Items.js +53 -0
  107. package/DropdownMenu/Items.js.map +1 -0
  108. package/DropdownMenu/index.d.ts +4 -0
  109. package/DropdownMenu/index.js +5 -0
  110. package/DropdownMenu/index.js.map +1 -0
  111. package/ErrorBoundary/Generic.d.ts +17 -0
  112. package/ErrorBoundary/Generic.js +72 -0
  113. package/ErrorBoundary/Generic.js.map +1 -0
  114. package/ErrorBoundary/PassThrough.d.ts +3 -0
  115. package/ErrorBoundary/PassThrough.js +7 -0
  116. package/ErrorBoundary/PassThrough.js.map +1 -0
  117. package/Gallery/Gallery.d.ts +38 -0
  118. package/Gallery/Gallery.js +122 -0
  119. package/Gallery/Gallery.js.map +1 -0
  120. package/Gallery/constructGallery.d.ts +14 -0
  121. package/Gallery/constructGallery.js +40 -0
  122. package/Gallery/constructGallery.js.map +1 -0
  123. package/Image/Fallback.d.ts +5 -0
  124. package/Image/Fallback.js +4 -0
  125. package/Image/Fallback.js.map +1 -0
  126. package/Image/Image.d.ts +49 -0
  127. package/Image/Image.js +211 -0
  128. package/Image/Image.js.map +1 -0
  129. package/Image/Image.test.js +277 -0
  130. package/Image/index.d.ts +1 -0
  131. package/Image/index.js +2 -0
  132. package/Image/index.js.map +1 -0
  133. package/Image/useConstructImage.d.ts +13 -0
  134. package/Image/useConstructImage.js +96 -0
  135. package/Image/useConstructImage.js.map +1 -0
  136. package/Image/utils/aspectRatioToFraction.d.ts +2 -0
  137. package/Image/utils/aspectRatioToFraction.js +11 -0
  138. package/Image/utils/aspectRatioToFraction.js.map +1 -0
  139. package/Image/utils/getFullUrl.d.ts +6 -0
  140. package/Image/utils/getFullUrl.js +18 -0
  141. package/Image/utils/getFullUrl.js.map +1 -0
  142. package/Image/utils/getImageWidth.d.ts +1 -0
  143. package/Image/utils/getImageWidth.js +12 -0
  144. package/Image/utils/getImageWidth.js.map +1 -0
  145. package/Image/utils/getImageWidths.d.ts +2 -0
  146. package/Image/utils/getImageWidths.js +14 -0
  147. package/Image/utils/getImageWidths.js.map +1 -0
  148. package/Image/utils/getLQIP.d.ts +8 -0
  149. package/Image/utils/getLQIP.js +20 -0
  150. package/Image/utils/getLQIP.js.map +1 -0
  151. package/Image/utils/getLargestSize.d.ts +7 -0
  152. package/Image/utils/getLargestSize.js +17 -0
  153. package/Image/utils/getLargestSize.js.map +1 -0
  154. package/Image/utils/getSizeForBreakpoint.d.ts +2 -0
  155. package/Image/utils/getSizeForBreakpoint.js +16 -0
  156. package/Image/utils/getSizeForBreakpoint.js.map +1 -0
  157. package/Image/utils/getSizesMap.d.ts +2 -0
  158. package/Image/utils/getSizesMap.js +22 -0
  159. package/Image/utils/getSizesMap.js.map +1 -0
  160. package/Image/utils/getSmallestSize.d.ts +2 -0
  161. package/Image/utils/getSmallestSize.js +12 -0
  162. package/Image/utils/getSmallestSize.js.map +1 -0
  163. package/Image/utils/getSrcSetFromWidths.d.ts +8 -0
  164. package/Image/utils/getSrcSetFromWidths.js +9 -0
  165. package/Image/utils/getSrcSetFromWidths.js.map +1 -0
  166. package/Image/utils/getSrcWithParams.d.ts +3 -0
  167. package/Image/utils/getSrcWithParams.js +26 -0
  168. package/Image/utils/getSrcWithParams.js.map +1 -0
  169. package/Image/utils/paddingForAspectRatio.d.ts +1 -0
  170. package/Image/utils/paddingForAspectRatio.js +6 -0
  171. package/Image/utils/paddingForAspectRatio.js.map +1 -0
  172. package/Image/utils/remToPx.d.ts +1 -0
  173. package/Image/utils/remToPx.js +2 -0
  174. package/Image/utils/remToPx.js.map +1 -0
  175. package/Image/utils/sizeToNumber.d.ts +2 -0
  176. package/Image/utils/sizeToNumber.js +27 -0
  177. package/Image/utils/sizeToNumber.js.map +1 -0
  178. package/Input/Input.d.ts +6 -0
  179. package/Input/Input.js +45 -0
  180. package/Input/Input.js.map +1 -0
  181. package/Input/index.d.ts +3 -0
  182. package/Input/index.js +4 -0
  183. package/Input/index.js.map +1 -0
  184. package/JetshopText.d.ts +3 -0
  185. package/JetshopText.js +12 -0
  186. package/JetshopText.js.map +1 -0
  187. package/Loading/LoadingBar.d.ts +8 -0
  188. package/Loading/LoadingBar.js +49 -0
  189. package/Loading/LoadingBar.js.map +1 -0
  190. package/Loading/LoadingLine.d.ts +31 -0
  191. package/Loading/LoadingLine.js +26 -0
  192. package/Loading/LoadingLine.js.map +1 -0
  193. package/Loading/LoadingLine.test.js +18 -0
  194. package/Loading/NetworkStatusContext.d.ts +15 -0
  195. package/Loading/NetworkStatusContext.js +4 -0
  196. package/Loading/NetworkStatusContext.js.map +1 -0
  197. package/Menu/GetMoreSubcategoriesQuery.gql +25 -0
  198. package/Menu/MenuContainer.d.ts +28 -0
  199. package/Menu/MenuContainer.js +46 -0
  200. package/Menu/MenuContainer.js.map +1 -0
  201. package/Menu/MenuContainer.test.js +245 -0
  202. package/Menu/RecursiveTree.d.ts +28 -0
  203. package/Menu/RecursiveTree.js +91 -0
  204. package/Menu/RecursiveTree.js.map +1 -0
  205. package/Menu/RecursiveTree.test.js +416 -0
  206. package/Modal/Drawer/Drawer.d.ts +11 -0
  207. package/Modal/Drawer/Drawer.js +31 -0
  208. package/Modal/Drawer/Drawer.js.map +1 -0
  209. package/Modal/Drawer/DrawerTarget.d.ts +6 -0
  210. package/Modal/Drawer/DrawerTarget.js +12 -0
  211. package/Modal/Drawer/DrawerTarget.js.map +1 -0
  212. package/Modal/Drawer/DrawerTarget.test.js +112 -0
  213. package/Modal/Drawer/DrawerTrigger.d.ts +9 -0
  214. package/Modal/Drawer/DrawerTrigger.js +12 -0
  215. package/Modal/Drawer/DrawerTrigger.js.map +1 -0
  216. package/Modal/Drawer/DrawerTrigger.test.js +51 -0
  217. package/Modal/Drawer/index.d.ts +3 -0
  218. package/Modal/Drawer/index.js +4 -0
  219. package/Modal/Drawer/index.js.map +1 -0
  220. package/Modal/Flyout/FlyoutTarget.d.ts +10 -0
  221. package/Modal/Flyout/FlyoutTarget.js +13 -0
  222. package/Modal/Flyout/FlyoutTarget.js.map +1 -0
  223. package/Modal/Flyout/FlyoutTarget.test.js +95 -0
  224. package/Modal/Flyout/FlyoutTrigger.d.ts +13 -0
  225. package/Modal/Flyout/FlyoutTrigger.js +17 -0
  226. package/Modal/Flyout/FlyoutTrigger.js.map +1 -0
  227. package/Modal/Flyout/FlyoutTrigger.test.js +72 -0
  228. package/Modal/Flyout/index.d.ts +2 -0
  229. package/Modal/Flyout/index.js +3 -0
  230. package/Modal/Flyout/index.js.map +1 -0
  231. package/Modal/ModalContext.d.ts +19 -0
  232. package/Modal/ModalContext.js +13 -0
  233. package/Modal/ModalContext.js.map +1 -0
  234. package/Modal/ModalProvider.d.ts +11 -0
  235. package/Modal/ModalProvider.js +38 -0
  236. package/Modal/ModalProvider.js.map +1 -0
  237. package/Modal/ModalProvider.test.js +29 -0
  238. package/Modal/ModalRoot.d.ts +3 -0
  239. package/Modal/ModalRoot.js +39 -0
  240. package/Modal/ModalRoot.js.map +1 -0
  241. package/Modal/ModalRoot.test.js +51 -0
  242. package/Modal/ModalTrigger.d.ts +9 -0
  243. package/Modal/ModalTrigger.js +9 -0
  244. package/Modal/ModalTrigger.js.map +1 -0
  245. package/Modal/TargetWrapper.d.ts +31 -0
  246. package/Modal/TargetWrapper.js +45 -0
  247. package/Modal/TargetWrapper.js.map +1 -0
  248. package/Modal/TargetWrapper.test.js +81 -0
  249. package/Modal/__test_utils__/getComponentWithModalContext.js +33 -0
  250. package/Pagination/Pagination.d.ts +8 -0
  251. package/Pagination/Pagination.js +38 -0
  252. package/Pagination/Pagination.js.map +1 -0
  253. package/Pagination/PaginationBehaviour.d.ts +52 -0
  254. package/Pagination/PaginationBehaviour.js +68 -0
  255. package/Pagination/PaginationBehaviour.js.map +1 -0
  256. package/Pagination/index.d.ts +2 -0
  257. package/Pagination/index.js +3 -0
  258. package/Pagination/index.js.map +1 -0
  259. package/PreOrderDateSelector/PreOrderDateSelector.d.ts +20 -0
  260. package/PreOrderDateSelector/PreOrderDateSelector.js +74 -0
  261. package/PreOrderDateSelector/PreOrderDateSelector.js.map +1 -0
  262. package/PreOrderDateSelector/index.d.ts +2 -0
  263. package/PreOrderDateSelector/index.js +3 -0
  264. package/PreOrderDateSelector/index.js.map +1 -0
  265. package/Price/Currency.d.ts +9 -0
  266. package/Price/Currency.js +11 -0
  267. package/Price/Currency.js.map +1 -0
  268. package/Price/Price.d.ts +28 -0
  269. package/Price/Price.js +35 -0
  270. package/Price/Price.js.map +1 -0
  271. package/Price/index.d.ts +1 -0
  272. package/Price/index.js +2 -0
  273. package/Price/index.js.map +1 -0
  274. package/ProductLink.d.ts +21 -0
  275. package/ProductLink.js +67 -0
  276. package/ProductLink.js.map +1 -0
  277. package/ProductList/Badges.d.ts +6 -0
  278. package/ProductList/Badges.js +56 -0
  279. package/ProductList/Badges.js.map +1 -0
  280. package/ProductList/GridProduct.d.ts +24 -0
  281. package/ProductList/GridProduct.js +59 -0
  282. package/ProductList/GridProduct.js.map +1 -0
  283. package/ProductList/ProductGrid.d.ts +15 -0
  284. package/ProductList/ProductGrid.js +29 -0
  285. package/ProductList/ProductGrid.js.map +1 -0
  286. package/ProductList/ProductImage.d.ts +12 -0
  287. package/ProductList/ProductImage.js +22 -0
  288. package/ProductList/ProductImage.js.map +1 -0
  289. package/ProductSpecifications/ProductSpecifications.d.ts +8 -0
  290. package/ProductSpecifications/ProductSpecifications.js +78 -0
  291. package/ProductSpecifications/ProductSpecifications.js.map +1 -0
  292. package/ScrollRestorationHandler/ScrollRestorationHandler.d.ts +8 -0
  293. package/ScrollRestorationHandler/ScrollRestorationHandler.js +17 -0
  294. package/ScrollRestorationHandler/ScrollRestorationHandler.js.map +1 -0
  295. package/ScrollRestorationHandler/ScrollRestorationHandler.test.js +75 -0
  296. package/ScrollRestorationHandler/index.d.ts +1 -0
  297. package/ScrollRestorationHandler/index.js +2 -0
  298. package/ScrollRestorationHandler/index.js.map +1 -0
  299. package/ScrollRestorationHandler/isInIgnoredRouteTypes.d.ts +6 -0
  300. package/ScrollRestorationHandler/isInIgnoredRouteTypes.js +8 -0
  301. package/ScrollRestorationHandler/isInIgnoredRouteTypes.js.map +1 -0
  302. package/ScrollRestorationHandler/useScrollRestore.d.ts +7 -0
  303. package/ScrollRestorationHandler/useScrollRestore.js +15 -0
  304. package/ScrollRestorationHandler/useScrollRestore.js.map +1 -0
  305. package/Search/AutocompleteQuery.gql +10 -0
  306. package/Search/SearchAutoCompleteContainer.d.ts +45 -0
  307. package/Search/SearchAutoCompleteContainer.js +175 -0
  308. package/Search/SearchAutoCompleteContainer.js.map +1 -0
  309. package/Search/SearchAutoCompleteContainer.test.js +460 -0
  310. package/Search/SearchField.d.ts +15 -0
  311. package/Search/SearchField.js +97 -0
  312. package/Search/SearchField.js.map +1 -0
  313. package/Search/SearchPage/PageOf.d.ts +5 -0
  314. package/Search/SearchPage/PageOf.js +7 -0
  315. package/Search/SearchPage/PageOf.js.map +1 -0
  316. package/Search/SearchPage/SearchMeta.d.ts +16 -0
  317. package/Search/SearchPage/SearchMeta.js +20 -0
  318. package/Search/SearchPage/SearchMeta.js.map +1 -0
  319. package/Search/SearchPage/SearchPageBehaviour.d.ts +19 -0
  320. package/Search/SearchPage/SearchPageBehaviour.js +67 -0
  321. package/Search/SearchPage/SearchPageBehaviour.js.map +1 -0
  322. package/Search/SuggestedTerm.d.ts +16 -0
  323. package/Search/SuggestedTerm.js +42 -0
  324. package/Search/SuggestedTerm.js.map +1 -0
  325. package/Search/index.d.ts +1 -0
  326. package/Search/index.js +2 -0
  327. package/Search/index.js.map +1 -0
  328. package/Select/Components.d.ts +28 -0
  329. package/Select/Components.js +91 -0
  330. package/Select/Components.js.map +1 -0
  331. package/Select/SelectComponents/Quantity.d.ts +5 -0
  332. package/Select/SelectComponents/Quantity.js +8 -0
  333. package/Select/SelectComponents/Quantity.js.map +1 -0
  334. package/Select/index.d.ts +5 -0
  335. package/Select/index.js +1 -0
  336. package/Select/index.js.map +1 -0
  337. package/SortOrder/SortOrder.d.ts +16 -0
  338. package/SortOrder/SortOrder.js +32 -0
  339. package/SortOrder/SortOrder.js.map +1 -0
  340. package/SortOrder/SortOrderDropdown.d.ts +9 -0
  341. package/SortOrder/SortOrderDropdown.js +25 -0
  342. package/SortOrder/SortOrderDropdown.js.map +1 -0
  343. package/SortOrder/SortOrderList.d.ts +7 -0
  344. package/SortOrder/SortOrderList.js +17 -0
  345. package/SortOrder/SortOrderList.js.map +1 -0
  346. package/StartPageRenderer/StartPageRenderer.d.ts +17 -0
  347. package/StartPageRenderer/StartPageRenderer.js +52 -0
  348. package/StartPageRenderer/StartPageRenderer.js.map +1 -0
  349. package/StartPageRenderer/index.d.ts +1 -0
  350. package/StartPageRenderer/index.js +2 -0
  351. package/StartPageRenderer/index.js.map +1 -0
  352. package/Stock/StockStatusContainer.d.ts +16 -0
  353. package/Stock/StockStatusContainer.js +40 -0
  354. package/Stock/StockStatusContainer.js.map +1 -0
  355. package/Stock/__tests__/StockStatusContainer.test.js +65 -0
  356. package/Text/Text.d.ts +11 -0
  357. package/Text/Text.js +22 -0
  358. package/Text/Text.js.map +1 -0
  359. package/Text/index.d.ts +3 -0
  360. package/Text/index.js +4 -0
  361. package/Text/index.js.map +1 -0
  362. package/Theme/createTheme.d.ts +16 -0
  363. package/Theme/createTheme.js +5 -0
  364. package/Theme/createTheme.js.map +1 -0
  365. package/Theme/cssReset.d.ts +1 -0
  366. package/Theme/cssReset.js +160 -0
  367. package/Theme/cssReset.js.map +1 -0
  368. package/Theme/normalizeCss.d.ts +1 -0
  369. package/Theme/normalizeCss.js +357 -0
  370. package/Theme/normalizeCss.js.map +1 -0
  371. package/Theme/sanitizeCss.d.ts +1 -0
  372. package/Theme/sanitizeCss.js +572 -0
  373. package/Theme/sanitizeCss.js.map +1 -0
  374. package/WindowGrid/WindowGrid.d.ts +11 -0
  375. package/WindowGrid/WindowGrid.js +58 -0
  376. package/WindowGrid/WindowGrid.js.map +1 -0
  377. package/WindowGrid/index.d.ts +1 -0
  378. package/WindowGrid/index.js +2 -0
  379. package/WindowGrid/index.js.map +1 -0
  380. package/WindowGrid/useResizeObserver.d.ts +8 -0
  381. package/WindowGrid/useResizeObserver.js +14 -0
  382. package/WindowGrid/useResizeObserver.js.map +1 -0
  383. package/WindowGrid/useScrollWithWindow.d.ts +12 -0
  384. package/WindowGrid/useScrollWithWindow.js +39 -0
  385. package/WindowGrid/useScrollWithWindow.js.map +1 -0
  386. package/dependencies.d.ts +99 -0
  387. package/fuzzySearch/fuzzySearch.d.ts +18 -0
  388. package/fuzzySearch/fuzzySearch.js +43 -0
  389. package/fuzzySearch/fuzzySearch.js.map +1 -0
  390. package/fuzzySearch/index.d.ts +1 -0
  391. package/fuzzySearch/index.js +2 -0
  392. package/fuzzySearch/index.js.map +1 -0
  393. package/global.d.ts +1 -0
  394. package/hooks/index.d.ts +2 -0
  395. package/hooks/index.js +3 -0
  396. package/hooks/index.js.map +1 -0
  397. package/hooks/useOnClickOutside.d.ts +6 -0
  398. package/hooks/useOnClickOutside.js +17 -0
  399. package/hooks/useOnClickOutside.js.map +1 -0
  400. package/hooks/useOnEsc.d.ts +4 -0
  401. package/hooks/useOnEsc.js +17 -0
  402. package/hooks/useOnEsc.js.map +1 -0
  403. package/package.json +67 -0
  404. package/setupTests.js +2 -0
  405. package/svg/Carrot.svg +1 -0
  406. package/svg/Check.svg +1 -0
  407. package/svg/Cross.svg +1 -0
  408. package/svg/facebook.svg +1 -0
  409. package/svg/flags/ad.svg +150 -0
  410. package/svg/flags/ae.svg +6 -0
  411. package/svg/flags/af.svg +81 -0
  412. package/svg/flags/ag.svg +14 -0
  413. package/svg/flags/ai.svg +767 -0
  414. package/svg/flags/al.svg +5 -0
  415. package/svg/flags/am.svg +5 -0
  416. package/svg/flags/ao.svg +13 -0
  417. package/svg/flags/aq.svg +6 -0
  418. package/svg/flags/ar.svg +31 -0
  419. package/svg/flags/as.svg +33 -0
  420. package/svg/flags/at.svg +6 -0
  421. package/svg/flags/au.svg +9 -0
  422. package/svg/flags/aw.svg +186 -0
  423. package/svg/flags/ax.svg +18 -0
  424. package/svg/flags/az.svg +8 -0
  425. package/svg/flags/ba.svg +12 -0
  426. package/svg/flags/bb.svg +6 -0
  427. package/svg/flags/bd.svg +4 -0
  428. package/svg/flags/be.svg +7 -0
  429. package/svg/flags/bf.svg +7 -0
  430. package/svg/flags/bg.svg +7 -0
  431. package/svg/flags/bh.svg +11 -0
  432. package/svg/flags/bi.svg +15 -0
  433. package/svg/flags/bj.svg +14 -0
  434. package/svg/flags/bl.svg +7 -0
  435. package/svg/flags/bm.svg +98 -0
  436. package/svg/flags/bn.svg +36 -0
  437. package/svg/flags/bo.svg +676 -0
  438. package/svg/flags/bq.svg +5 -0
  439. package/svg/flags/br.svg +45 -0
  440. package/svg/flags/bs.svg +13 -0
  441. package/svg/flags/bt.svg +89 -0
  442. package/svg/flags/bv.svg +13 -0
  443. package/svg/flags/bw.svg +7 -0
  444. package/svg/flags/by.svg +20 -0
  445. package/svg/flags/bz.svg +145 -0
  446. package/svg/flags/ca.svg +4 -0
  447. package/svg/flags/cc.svg +19 -0
  448. package/svg/flags/cd.svg +5 -0
  449. package/svg/flags/cf.svg +15 -0
  450. package/svg/flags/cg.svg +12 -0
  451. package/svg/flags/ch.svg +9 -0
  452. package/svg/flags/ci.svg +7 -0
  453. package/svg/flags/ck.svg +9 -0
  454. package/svg/flags/cl.svg +13 -0
  455. package/svg/flags/cm.svg +15 -0
  456. package/svg/flags/cn.svg +11 -0
  457. package/svg/flags/co.svg +7 -0
  458. package/svg/flags/cr.svg +7 -0
  459. package/svg/flags/cu.svg +13 -0
  460. package/svg/flags/cv.svg +13 -0
  461. package/svg/flags/cw.svg +14 -0
  462. package/svg/flags/cx.svg +15 -0
  463. package/svg/flags/cy.svg +6 -0
  464. package/svg/flags/cz.svg +12 -0
  465. package/svg/flags/de.svg +5 -0
  466. package/svg/flags/dj.svg +13 -0
  467. package/svg/flags/dk.svg +5 -0
  468. package/svg/flags/dm.svg +152 -0
  469. package/svg/flags/do.svg +6745 -0
  470. package/svg/flags/dz.svg +5 -0
  471. package/svg/flags/ec.svg +138 -0
  472. package/svg/flags/ee.svg +7 -0
  473. package/svg/flags/eg.svg +38 -0
  474. package/svg/flags/eh.svg +15 -0
  475. package/svg/flags/er.svg +8 -0
  476. package/svg/flags/es-ct.svg +4 -0
  477. package/svg/flags/es.svg +544 -0
  478. package/svg/flags/et.svg +14 -0
  479. package/svg/flags/eu.svg +28 -0
  480. package/svg/flags/fi.svg +5 -0
  481. package/svg/flags/fj.svg +120 -0
  482. package/svg/flags/fk.svg +89 -0
  483. package/svg/flags/fm.svg +11 -0
  484. package/svg/flags/fo.svg +12 -0
  485. package/svg/flags/fr.svg +7 -0
  486. package/svg/flags/ga.svg +7 -0
  487. package/svg/flags/gb-eng.svg +5 -0
  488. package/svg/flags/gb-nir.svg +131 -0
  489. package/svg/flags/gb-sct.svg +4 -0
  490. package/svg/flags/gb-wls.svg +9 -0
  491. package/svg/flags/gb.svg +15 -0
  492. package/svg/flags/gd.svg +27 -0
  493. package/svg/flags/ge.svg +6 -0
  494. package/svg/flags/gf.svg +5 -0
  495. package/svg/flags/gg.svg +9 -0
  496. package/svg/flags/gh.svg +6 -0
  497. package/svg/flags/gi.svg +32 -0
  498. package/svg/flags/gl.svg +4 -0
  499. package/svg/flags/gm.svg +14 -0
  500. package/svg/flags/gn.svg +7 -0
  501. package/svg/flags/gp.svg +7 -0
  502. package/svg/flags/gq.svg +23 -0
  503. package/svg/flags/gr.svg +22 -0
  504. package/svg/flags/gs.svg +201 -0
  505. package/svg/flags/gt.svg +204 -0
  506. package/svg/flags/gu.svg +39 -0
  507. package/svg/flags/gw.svg +13 -0
  508. package/svg/flags/gy.svg +9 -0
  509. package/svg/flags/hk.svg +30 -0
  510. package/svg/flags/hm.svg +9 -0
  511. package/svg/flags/hn.svg +18 -0
  512. package/svg/flags/hr.svg +58 -0
  513. package/svg/flags/ht.svg +116 -0
  514. package/svg/flags/hu.svg +7 -0
  515. package/svg/flags/id.svg +6 -0
  516. package/svg/flags/ie.svg +7 -0
  517. package/svg/flags/il.svg +14 -0
  518. package/svg/flags/im.svg +36 -0
  519. package/svg/flags/in.svg +25 -0
  520. package/svg/flags/io.svg +138 -0
  521. package/svg/flags/iq.svg +10 -0
  522. package/svg/flags/ir.svg +219 -0
  523. package/svg/flags/is.svg +12 -0
  524. package/svg/flags/it.svg +7 -0
  525. package/svg/flags/je.svg +31 -0
  526. package/svg/flags/jm.svg +8 -0
  527. package/svg/flags/jo.svg +16 -0
  528. package/svg/flags/jp.svg +11 -0
  529. package/svg/flags/ke.svg +23 -0
  530. package/svg/flags/kg.svg +15 -0
  531. package/svg/flags/kh.svg +61 -0
  532. package/svg/flags/ki.svg +36 -0
  533. package/svg/flags/km.svg +16 -0
  534. package/svg/flags/kn.svg +14 -0
  535. package/svg/flags/kp.svg +15 -0
  536. package/svg/flags/kr.svg +24 -0
  537. package/svg/flags/kw.svg +13 -0
  538. package/svg/flags/ky.svg +63 -0
  539. package/svg/flags/kz.svg +23 -0
  540. package/svg/flags/la.svg +12 -0
  541. package/svg/flags/lb.svg +15 -0
  542. package/svg/flags/lc.svg +8 -0
  543. package/svg/flags/li.svg +43 -0
  544. package/svg/flags/lk.svg +22 -0
  545. package/svg/flags/lr.svg +14 -0
  546. package/svg/flags/ls.svg +8 -0
  547. package/svg/flags/lt.svg +7 -0
  548. package/svg/flags/lu.svg +5 -0
  549. package/svg/flags/lv.svg +6 -0
  550. package/svg/flags/ly.svg +13 -0
  551. package/svg/flags/ma.svg +4 -0
  552. package/svg/flags/mc.svg +6 -0
  553. package/svg/flags/md.svg +70 -0
  554. package/svg/flags/me.svg +116 -0
  555. package/svg/flags/mf.svg +7 -0
  556. package/svg/flags/mg.svg +7 -0
  557. package/svg/flags/mh.svg +7 -0
  558. package/svg/flags/mk.svg +5 -0
  559. package/svg/flags/ml.svg +7 -0
  560. package/svg/flags/mm.svg +16 -0
  561. package/svg/flags/mn.svg +13 -0
  562. package/svg/flags/mo.svg +9 -0
  563. package/svg/flags/mp.svg +86 -0
  564. package/svg/flags/mq.svg +7 -0
  565. package/svg/flags/mr.svg +6 -0
  566. package/svg/flags/ms.svg +39 -0
  567. package/svg/flags/mt.svg +49 -0
  568. package/svg/flags/mu.svg +8 -0
  569. package/svg/flags/mv.svg +6 -0
  570. package/svg/flags/mw.svg +10 -0
  571. package/svg/flags/mx.svg +382 -0
  572. package/svg/flags/my.svg +15 -0
  573. package/svg/flags/mz.svg +21 -0
  574. package/svg/flags/na.svg +16 -0
  575. package/svg/flags/nc.svg +7 -0
  576. package/svg/flags/ne.svg +6 -0
  577. package/svg/flags/nf.svg +9 -0
  578. package/svg/flags/ng.svg +6 -0
  579. package/svg/flags/ni.svg +129 -0
  580. package/svg/flags/nl.svg +7 -0
  581. package/svg/flags/no.svg +7 -0
  582. package/svg/flags/np.svg +14 -0
  583. package/svg/flags/nr.svg +12 -0
  584. package/svg/flags/nu.svg +26 -0
  585. package/svg/flags/nz.svg +41 -0
  586. package/svg/flags/om.svg +115 -0
  587. package/svg/flags/pa.svg +14 -0
  588. package/svg/flags/pe.svg +244 -0
  589. package/svg/flags/pf.svg +19 -0
  590. package/svg/flags/pg.svg +9 -0
  591. package/svg/flags/ph.svg +13 -0
  592. package/svg/flags/pk.svg +15 -0
  593. package/svg/flags/pl.svg +6 -0
  594. package/svg/flags/pm.svg +7 -0
  595. package/svg/flags/pn.svg +62 -0
  596. package/svg/flags/pr.svg +13 -0
  597. package/svg/flags/ps.svg +15 -0
  598. package/svg/flags/pt.svg +57 -0
  599. package/svg/flags/pw.svg +11 -0
  600. package/svg/flags/py.svg +157 -0
  601. package/svg/flags/qa.svg +4 -0
  602. package/svg/flags/re.svg +7 -0
  603. package/svg/flags/ro.svg +7 -0
  604. package/svg/flags/rs.svg +292 -0
  605. package/svg/flags/ru.svg +7 -0
  606. package/svg/flags/rw.svg +13 -0
  607. package/svg/flags/sa.svg +26 -0
  608. package/svg/flags/sb.svg +13 -0
  609. package/svg/flags/sc.svg +14 -0
  610. package/svg/flags/sd.svg +13 -0
  611. package/svg/flags/se.svg +16 -0
  612. package/svg/flags/sg.svg +13 -0
  613. package/svg/flags/sh.svg +74 -0
  614. package/svg/flags/si.svg +18 -0
  615. package/svg/flags/sj.svg +7 -0
  616. package/svg/flags/sk.svg +9 -0
  617. package/svg/flags/sl.svg +7 -0
  618. package/svg/flags/sm.svg +91 -0
  619. package/svg/flags/sn.svg +8 -0
  620. package/svg/flags/so.svg +11 -0
  621. package/svg/flags/sr.svg +6 -0
  622. package/svg/flags/ss.svg +8 -0
  623. package/svg/flags/st.svg +16 -0
  624. package/svg/flags/sv.svg +606 -0
  625. package/svg/flags/sx.svg +56 -0
  626. package/svg/flags/sy.svg +6 -0
  627. package/svg/flags/sz.svg +45 -0
  628. package/svg/flags/tc.svg +67 -0
  629. package/svg/flags/td.svg +7 -0
  630. package/svg/flags/tf.svg +15 -0
  631. package/svg/flags/tg.svg +14 -0
  632. package/svg/flags/th.svg +7 -0
  633. package/svg/flags/tj.svg +22 -0
  634. package/svg/flags/tk.svg +5 -0
  635. package/svg/flags/tl.svg +13 -0
  636. package/svg/flags/tm.svg +206 -0
  637. package/svg/flags/tn.svg +13 -0
  638. package/svg/flags/to.svg +10 -0
  639. package/svg/flags/tr.svg +8 -0
  640. package/svg/flags/tt.svg +5 -0
  641. package/svg/flags/tv.svg +27 -0
  642. package/svg/flags/tw.svg +14 -0
  643. package/svg/flags/tz.svg +13 -0
  644. package/svg/flags/ua.svg +6 -0
  645. package/svg/flags/ug.svg +30 -0
  646. package/svg/flags/um.svg +15 -0
  647. package/svg/flags/un.svg +16 -0
  648. package/svg/flags/us.svg +10 -0
  649. package/svg/flags/uy.svg +28 -0
  650. package/svg/flags/uz.svg +30 -0
  651. package/svg/flags/va.svg +479 -0
  652. package/svg/flags/vc.svg +8 -0
  653. package/svg/flags/ve.svg +26 -0
  654. package/svg/flags/vg.svg +127 -0
  655. package/svg/flags/vi.svg +28 -0
  656. package/svg/flags/vn.svg +11 -0
  657. package/svg/flags/vu.svg +18 -0
  658. package/svg/flags/wf.svg +7 -0
  659. package/svg/flags/ws.svg +7 -0
  660. package/svg/flags/ye.svg +7 -0
  661. package/svg/flags/yt.svg +7 -0
  662. package/svg/flags/za.svg +17 -0
  663. package/svg/flags/zm.svg +27 -0
  664. package/svg/flags/zw.svg +21 -0
  665. package/svg/instagram.svg +1 -0
  666. package/test-utils/mock-response/product-status.js +44 -0
  667. package/utils/breakpoints.d.ts +23 -0
  668. package/utils/breakpoints.js +90 -0
  669. package/utils/breakpoints.js.map +1 -0
  670. package/utils/callAllEventHandlers.d.ts +5 -0
  671. package/utils/callAllEventHandlers.js +9 -0
  672. package/utils/callAllEventHandlers.js.map +1 -0
  673. package/utils/text.d.ts +1 -0
  674. package/utils/text.js +23 -0
  675. package/utils/text.js.map +1 -0
  676. package/utils/theme.d.ts +3 -0
  677. package/utils/theme.js +5 -0
  678. package/utils/theme.js.map +1 -0
  679. package/utils/useHoverIntent.d.ts +10 -0
  680. package/utils/useHoverIntent.js +76 -0
  681. package/utils/useHoverIntent.js.map +1 -0
  682. package/utils/usePropsOfType.d.ts +11 -0
  683. package/utils/usePropsOfType.js +18 -0
  684. package/utils/usePropsOfType.js.map +1 -0
  685. package/withFlightUI.d.ts +17 -0
  686. package/withFlightUI.js +20 -0
  687. package/withFlightUI.js.map +1 -0
@@ -0,0 +1,175 @@
1
+ var __rest = (this && this.__rest) || function (s, e) {
2
+ var t = {};
3
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
4
+ t[p] = s[p];
5
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
6
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
7
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
8
+ t[p[i]] = s[p[i]];
9
+ }
10
+ return t;
11
+ };
12
+ import { useShopConfig } from '@jetshop/core/hooks/useShopConfig';
13
+ import debounce from 'lodash.debounce';
14
+ import * as React from 'react';
15
+ import { Query } from 'react-apollo';
16
+ import { withRouter } from 'react-router-dom';
17
+ import { callAllEventHandlers } from '../utils/callAllEventHandlers';
18
+ let SearchFieldBehaviour = /** @class */ (() => {
19
+ class SearchFieldBehaviour extends React.Component {
20
+ constructor() {
21
+ super(...arguments);
22
+ this.inputRef = React.createRef();
23
+ this.flyoutRef = React.createRef();
24
+ this.cleanup = () => { };
25
+ this._isMounted = false;
26
+ this.initialState = {
27
+ isDirty: false,
28
+ term: this.props.initialValue,
29
+ debouncedTerm: this.props.initialValue,
30
+ isOpen: false
31
+ };
32
+ this.environment = typeof window === 'undefined' ? null : window;
33
+ this.state = this.initialState;
34
+ this.getInputProps = (_a = {}) => {
35
+ var { onBlur, onFocus, refKey = 'ref' } = _a, rest = __rest(_a, ["onBlur", "onFocus", "refKey"]);
36
+ const { updateSearch, handleBlur, handleFocus, handleEnterSubmit, inputRef } = this;
37
+ const { term } = this.state;
38
+ return Object.assign({ onChange: updateSearch, onBlur: callAllEventHandlers(onBlur, handleBlur), onFocus: callAllEventHandlers(onFocus, handleFocus), onKeyDown: callAllEventHandlers(handleEnterSubmit), [refKey]: inputRef, autoComplete: 'off', value: term, type: 'search' }, rest
39
+ // TODO: add an ID via props or generate one
40
+ // TODO: add ARIA labels
41
+ );
42
+ };
43
+ this.getFlyoutProps = ({ refKey = 'ref', rest } = {}) => {
44
+ const { flyoutRef } = this;
45
+ return Object.assign({ [refKey]: flyoutRef }, rest);
46
+ };
47
+ this.getCancelProps = (_a = {}) => {
48
+ var { onClick } = _a, rest = __rest(_a, ["onClick"]);
49
+ const { clearSearch } = this;
50
+ const { onCancel } = this.props;
51
+ return Object.assign({ onClick: callAllEventHandlers(onClick, onCancel, clearSearch) }, rest);
52
+ };
53
+ this.resetIfEmpty = (e) => {
54
+ if (e.currentTarget.value === this.props.initialValue) {
55
+ this.clearSearch();
56
+ }
57
+ };
58
+ this.handleBlur = (e, cb) => {
59
+ this.resetIfEmpty(e);
60
+ cb && typeof cb === 'function' && cb();
61
+ return true;
62
+ };
63
+ this.handleEnterSubmit = (e) => {
64
+ // First check that the key pressed was Enter, and then
65
+ // call the onSubmit callback. We always call triggerSearch,
66
+ // but the user has an opportunity to pass an onSubmit handler
67
+ // as a prop
68
+ const { term } = this.state;
69
+ if (e.key === 'Enter') {
70
+ this.triggerSearch(term);
71
+ }
72
+ };
73
+ this.triggerSearch = (term = this.state.term) => {
74
+ // Blur the input, close the search and navigate to the search page
75
+ this.setState({ isOpen: false });
76
+ this.debouncedUpdateTerm.cancel();
77
+ if (typeof this.props.onSubmit === 'function')
78
+ this.props.onSubmit(term);
79
+ this.props.history.push(`${this.props.routes.search.path}/?term=${term}`);
80
+ this.updateFocus('blur');
81
+ };
82
+ this.handleFocus = (_e, cb) => {
83
+ this.setState({ isOpen: true });
84
+ cb && typeof cb === 'function' && cb();
85
+ return true;
86
+ };
87
+ this.updateFocus = (focusState) => {
88
+ if (!['blur', 'focus'].includes(focusState)) {
89
+ throw new Error("updateFocus must be called with one of 'blur' | 'focus'");
90
+ }
91
+ const shouldHaveFocus = focusState === 'focus';
92
+ const DOMElementHasFocus = document.activeElement === this.inputRef.current;
93
+ // Trigger a blur or focus on the input
94
+ shouldHaveFocus && !DOMElementHasFocus && this.inputRef.current.focus();
95
+ !shouldHaveFocus && DOMElementHasFocus && this.inputRef.current.blur();
96
+ return true;
97
+ };
98
+ this.debouncedUpdateTerm = debounce((term) => this._isMounted && this.setState({ debouncedTerm: term }), 200);
99
+ this.updateSearch = (e) => {
100
+ const term = e.currentTarget.value;
101
+ const isDirty = term !== this.props.initialValue;
102
+ this.debouncedUpdateTerm(term);
103
+ this.setState({
104
+ term,
105
+ isDirty
106
+ });
107
+ };
108
+ this.clearSearch = () => {
109
+ this.setState(this.initialState);
110
+ };
111
+ }
112
+ componentDidMount() {
113
+ this._isMounted = true;
114
+ const targetIsInside = (target) => [this.flyoutRef, this.inputRef].some(node => node &&
115
+ node.current &&
116
+ (node.current === target || node.current.contains(target)));
117
+ const onMouseUp = (event) => {
118
+ if (!targetIsInside(event.target)) {
119
+ this.handleBlur(event);
120
+ this.setState({ isOpen: false });
121
+ }
122
+ };
123
+ const onTouchStart = (event) => {
124
+ if (!targetIsInside(event.target)) {
125
+ this.handleBlur(event);
126
+ this.setState({ isOpen: false });
127
+ }
128
+ };
129
+ if (this.environment) {
130
+ this.environment.addEventListener('mouseup', onMouseUp);
131
+ this.environment.addEventListener('touchstart', onTouchStart);
132
+ }
133
+ if (this.props.focusOnLoad) {
134
+ this.updateFocus('focus');
135
+ }
136
+ this.cleanup = () => {
137
+ if (this.environment) {
138
+ this.environment.removeEventListener('mouseup', onMouseUp);
139
+ this.environment.removeEventListener('touchstart', onTouchStart);
140
+ }
141
+ };
142
+ }
143
+ componentWillUnmount() {
144
+ this._isMounted = false;
145
+ this.cleanup();
146
+ }
147
+ componentDidUpdate(prevProps) {
148
+ const { pathname } = this.props.location;
149
+ const locationPath = pathname.substr(-1) !== '/'
150
+ ? pathname
151
+ : pathname.substr(0, pathname.length - 1);
152
+ if (this.props.location.pathname !== prevProps.location.pathname &&
153
+ locationPath !== this.props.routes.search.path)
154
+ this.props.onCancel();
155
+ }
156
+ render() {
157
+ return (React.createElement(Query, { context: { useNetworkStatusNotifier: false }, skip: !this.state.isDirty ||
158
+ this.state.debouncedTerm === this.props.initialValue, variables: { term: this.state.debouncedTerm }, errorPolicy: "ignore", query: this.props.autocompleteQuery }, ({ loading, data }) => {
159
+ return this.props.children(Object.assign({ getInputProps: this.getInputProps, getCancelProps: this.getCancelProps, getFlyoutProps: this.getFlyoutProps, loading: loading || this.state.term !== this.state.debouncedTerm, isOpen: this.state.isOpen, updateFocus: this.updateFocus, result: data === null || data === void 0 ? void 0 : data.searchAutoComplete, inputRef: this.inputRef, triggerSearch: this.triggerSearch }, this.state));
160
+ }));
161
+ }
162
+ }
163
+ SearchFieldBehaviour.defaultProps = {
164
+ initialValue: '',
165
+ focusOnLoad: false
166
+ };
167
+ return SearchFieldBehaviour;
168
+ })();
169
+ // If SearchFieldBehaviour is refactored to use hooks, then this can be moved inside there
170
+ const SearchFieldBehaviourWrapper = (props) => {
171
+ const { routes } = useShopConfig();
172
+ return React.createElement(SearchFieldBehaviour, Object.assign({}, props, { routes: routes }));
173
+ };
174
+ export default withRouter(SearchFieldBehaviourWrapper);
175
+ //# sourceMappingURL=SearchAutoCompleteContainer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SearchAutoCompleteContainer.js","sourceRoot":"","sources":["SearchAutoCompleteContainer.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,460 @@
1
+ import renderWithRouter from '@jetshop/core/test-utils/renderWithRouter';
2
+ import React from 'react';
3
+ import { MockedProvider } from '@apollo/react-testing';
4
+ import { Route, Switch } from 'react-router';
5
+ import {
6
+ cleanup,
7
+ fireEvent,
8
+ wait,
9
+ waitForElement
10
+ } from '@testing-library/react';
11
+ import SearchAutoCompleteContainer from './SearchAutoCompleteContainer';
12
+ import AutocompleteQuery from './AutocompleteQuery.gql';
13
+ import { ShopConfigContext } from '@jetshop/core/components/ConfigProvider';
14
+
15
+ describe('SearchFieldBehaviour', () => {
16
+ it('renders child as fn with args', () => {
17
+ const { renderArg } = setup();
18
+ expect(renderArg).toMatchSnapshot();
19
+ });
20
+
21
+ it('allows an initialValue to be set via props', async () => {
22
+ const { renderArg } = setup({ initialValue: 'howdy neighbour' });
23
+
24
+ expect(renderArg.term).toBe('howdy neighbour');
25
+ });
26
+
27
+ it('updates term param to match the input field value', () => {
28
+ const { input, renderArg } = setup();
29
+
30
+ fireEvent.change(input, { target: { value: 'boots' } });
31
+
32
+ expect(renderArg.term).toBe('boots');
33
+ });
34
+
35
+ it('updates the debouncedTerm after a delay', async () => {
36
+ // This also tests that the state isn't updated after the component unmounts
37
+ // — we'd receive a warning from React
38
+ const { input, renderArg } = setup();
39
+
40
+ fireEvent.change(input, { target: { value: 'cats' } });
41
+
42
+ await wait(() => expect(renderArg.debouncedTerm).toEqual('cats'));
43
+ });
44
+
45
+ it('executes search and returns results after debouncedTerm is set', async () => {
46
+ const { input, childrenSpy, renderArg } = setup();
47
+
48
+ fireEvent.change(input, { target: { value: 'autoc' } });
49
+
50
+ await wait(() => expect(renderArg.debouncedTerm).toEqual('autoc'));
51
+
52
+ // The child fn should have been called with loading set to true at some
53
+ // point after the query was made
54
+ await wait(() =>
55
+ expect(childrenSpy).toHaveBeenCalledWith(
56
+ expect.objectContaining({
57
+ loading: true
58
+ })
59
+ )
60
+ );
61
+
62
+ // Wait for loading to finish
63
+ await wait(() =>
64
+ expect(childrenSpy).toHaveBeenLastCalledWith(
65
+ expect.objectContaining({
66
+ loading: false
67
+ })
68
+ )
69
+ );
70
+
71
+ // and then it should be called again with the actual results
72
+ expect(childrenSpy).lastCalledWith(
73
+ expect.objectContaining({
74
+ loading: false,
75
+ result: {
76
+ products: {
77
+ result: expect.arrayContaining([
78
+ expect.objectContaining({
79
+ id: 123
80
+ }),
81
+ expect.objectContaining({
82
+ id: 321
83
+ })
84
+ ])
85
+ }
86
+ }
87
+ })
88
+ );
89
+
90
+ fireEvent.change(input, { target: { value: 'autocomplet' } });
91
+
92
+ await wait(() => expect(renderArg.debouncedTerm).toEqual('autocomplet'));
93
+
94
+ expect(childrenSpy).toHaveBeenLastCalledWith(
95
+ expect.objectContaining({
96
+ result: {
97
+ products: {
98
+ result: expect.arrayContaining([
99
+ expect.objectContaining({
100
+ id: 123
101
+ }),
102
+ expect.not.objectContaining({
103
+ id: 321
104
+ })
105
+ ])
106
+ }
107
+ }
108
+ })
109
+ );
110
+ });
111
+
112
+ it('updates the isDirty param when the input is dirty', async () => {
113
+ const { childrenSpy, input, renderArg } = setup();
114
+
115
+ expect(childrenSpy).toHaveBeenCalledTimes(1);
116
+
117
+ expect(renderArg.isDirty).toBe(false);
118
+ fireEvent.change(input, { target: { value: 'mock' } });
119
+ expect(childrenSpy).toHaveBeenCalledTimes(2);
120
+ expect(renderArg.isDirty).toBe(true);
121
+
122
+ fireEvent.change(input, { target: { value: '' } });
123
+ expect(renderArg.isDirty).toBe(false);
124
+ });
125
+
126
+ it('correctly sets isDirty if the initialValue prop is used', () => {
127
+ const { input, renderArg } = setup({ initialValue: 'howdy' });
128
+
129
+ expect(renderArg.isDirty).toBe(false);
130
+ fireEvent.change(input, { target: { value: 'boots' } });
131
+ expect(renderArg.isDirty).toBe(true);
132
+ // An empty string is 'dirty' if initialValue is not an empty string…
133
+ fireEvent.change(input, { target: { value: '' } });
134
+ expect(renderArg.isDirty).toBe(true);
135
+ fireEvent.change(input, { target: { value: 'howdy' } });
136
+ expect(renderArg.isDirty).toBe(false);
137
+ });
138
+
139
+ it('automatically focuses the input on mount if `focusOnLoad` is set', () => {
140
+ const { input } = setup();
141
+ expect(input).not.toHaveFocus();
142
+
143
+ cleanup();
144
+
145
+ const { input: focusedInput } = setup({ focusOnLoad: true });
146
+ expect(focusedInput).toHaveFocus();
147
+ });
148
+
149
+ it('accepts a custom onBlur event on getInputProps', async () => {
150
+ const mockBlurFn = jest.fn();
151
+ const { input } = setup({}, null, {
152
+ getInputPropsOptions: { onBlur: mockBlurFn }
153
+ });
154
+
155
+ fireEvent.focus(input);
156
+ await wait();
157
+ fireEvent.blur(input);
158
+
159
+ expect(mockBlurFn).toHaveBeenCalledTimes(1);
160
+ });
161
+
162
+ it('accepts a custom onFocus event on getInputProps', () => {
163
+ const mockFocusFn = jest.fn();
164
+ const { input } = setup({}, null, {
165
+ getInputPropsOptions: { onFocus: mockFocusFn }
166
+ });
167
+
168
+ fireEvent.focus(input);
169
+
170
+ expect(mockFocusFn).toHaveBeenCalledTimes(1);
171
+ });
172
+
173
+ it('provides the inputs ref via render props ', () => {
174
+ const { input, renderArg } = setup();
175
+
176
+ expect(renderArg.inputRef).toEqual(
177
+ expect.objectContaining({
178
+ current: input
179
+ })
180
+ );
181
+ });
182
+
183
+ it('allows focus to be controlled via render prop `updateFocus`', () => {
184
+ const { input, renderArg } = setup();
185
+
186
+ fireEvent.focus(input);
187
+ renderArg.updateFocus('blur');
188
+ expect(input).not.toHaveFocus();
189
+ renderArg.updateFocus('focus');
190
+ expect(input).toHaveFocus();
191
+ });
192
+
193
+ describe('`isOpen` render prop fn', () => {
194
+ test('is true when the search field has focus', () => {
195
+ const { input, renderArg } = setup();
196
+
197
+ fireEvent.focus(input);
198
+
199
+ expect(renderArg.isOpen).toBe(true);
200
+ });
201
+
202
+ test('is true when the search field has focus', () => {
203
+ const { input, renderArg } = setup();
204
+
205
+ fireEvent.focus(input);
206
+
207
+ expect(renderArg.isOpen).toBe(true);
208
+ });
209
+
210
+ test('is false when the search field does not have focus', () => {
211
+ const { input, renderArg } = setup();
212
+
213
+ expect(renderArg.isOpen).toBe(false);
214
+
215
+ fireEvent.focus(input);
216
+ fireEvent.blur(input);
217
+ expect(renderArg.isOpen).toBe(false);
218
+ });
219
+
220
+ test('is true when the search field loses focus and the `term` has changed', async () => {
221
+ const { input, renderArg } = setup();
222
+
223
+ fireEvent.focus(input);
224
+ fireEvent.change(input, { target: { value: 'bootsandcats' } });
225
+ fireEvent.blur(input);
226
+ await wait();
227
+ expect(renderArg.isOpen).toBe(true);
228
+ });
229
+ });
230
+
231
+ describe('registers cancel button behaviour on the element using `getCancelProps()`', () => {
232
+ test('that clears the input value when clicked', () => {
233
+ const { input, cancel, renderArg } = setup();
234
+
235
+ fireEvent.change(input, { target: { value: 'boots' } });
236
+ expect(renderArg.term).toBe('boots');
237
+
238
+ fireEvent.click(cancel);
239
+
240
+ expect(renderArg.term).toBe('');
241
+ });
242
+
243
+ test('that accepts onClick handlers passed in to it', () => {
244
+ const mockClickFn = jest.fn();
245
+ const { cancel } = setup({}, null, {
246
+ getCancelPropsOptions: { onClick: mockClickFn }
247
+ });
248
+
249
+ fireEvent.click(cancel);
250
+
251
+ expect(mockClickFn).toHaveBeenCalledTimes(1);
252
+ });
253
+ });
254
+
255
+ describe('triggers a full search', () => {
256
+ test('when pressing enter key', async () => {
257
+ const { input, getByText } = setup();
258
+ fireEvent.focus(input);
259
+ fireEvent.change(input, { target: { value: 'boots' } });
260
+
261
+ fireEvent.keyDown(input, { key: 'Enter' });
262
+
263
+ await waitForElement(() => getByText('you searched for ?term=boots'));
264
+ });
265
+ test('when clicking button with `triggerSearch` bound', async () => {
266
+ const { input, submit, getByText } = setup();
267
+ fireEvent.focus(input);
268
+ fireEvent.change(input, { target: { value: 'boots' } });
269
+
270
+ fireEvent.click(submit);
271
+
272
+ await waitForElement(() => getByText('you searched for ?term=boots'));
273
+ });
274
+ test('with the value passed to `triggerSearch` if one is given', async () => {
275
+ const { input, submit, getByText } = setup({}, null, {
276
+ getSubmitOpts: 'search this!'
277
+ });
278
+ fireEvent.focus(input);
279
+ fireEvent.change(input, { target: { value: 'boots' } });
280
+
281
+ fireEvent.click(submit);
282
+
283
+ await waitForElement(() => getByText(/search this!/i));
284
+ });
285
+ test('sets `isOpen` to false when triggering a full search', async () => {
286
+ const { input, renderArg } = setup();
287
+ fireEvent.change(input, { target: { value: 'boots' } });
288
+ fireEvent.focus(input);
289
+ expect(renderArg.isOpen).toBe(true);
290
+ fireEvent.keyDown(input, { key: 'Enter' });
291
+ expect(renderArg.isOpen).toBe(false);
292
+ });
293
+ });
294
+
295
+ it('calls passed onCancel cb when search is cancelled', () => {
296
+ const mockCancelCb = jest.fn();
297
+ const { input, cancel } = setup({ onCancel: mockCancelCb });
298
+
299
+ fireEvent.change(input, { target: { value: 'hello' } });
300
+ fireEvent.click(cancel);
301
+
302
+ expect(mockCancelCb).toHaveBeenCalledTimes(1);
303
+ });
304
+
305
+ it('calls passed onSubmit cb when search is submitted', () => {
306
+ const mockSubmitFn = jest.fn();
307
+ const { input, submit } = setup({ onSubmit: mockSubmitFn });
308
+
309
+ fireEvent.change(input, { target: { value: 'hello' } });
310
+ fireEvent.click(submit);
311
+
312
+ expect(mockSubmitFn).toHaveBeenCalledTimes(1);
313
+
314
+ fireEvent.change(input, { target: { value: 'wow' } });
315
+ fireEvent.focus(input);
316
+ fireEvent.keyDown(input, { key: 'Enter' });
317
+
318
+ expect(mockSubmitFn).toHaveBeenCalledTimes(2);
319
+ });
320
+ });
321
+
322
+ const mocks = [
323
+ {
324
+ request: {
325
+ query: AutocompleteQuery,
326
+ variables: {
327
+ term: 'autoc'
328
+ }
329
+ },
330
+ result: {
331
+ data: {
332
+ searchAutoComplete: {
333
+ products: {
334
+ result: [
335
+ {
336
+ name: 'autocomplete',
337
+ id: 123,
338
+ articleNumber: 123,
339
+ primaryRoute: {
340
+ id: 4353,
341
+ slug: 'autocompleted-product',
342
+ path: '/product/autocompleted-product'
343
+ }
344
+ },
345
+ {
346
+ name: 'autocomputed',
347
+ id: 321,
348
+ articleNumber: 321,
349
+ primaryRoute: {
350
+ id: 2737,
351
+ slug: 'autocomputed-product',
352
+ path: '/product/autocomputed-product'
353
+ }
354
+ }
355
+ ]
356
+ }
357
+ }
358
+ }
359
+ }
360
+ },
361
+ {
362
+ request: {
363
+ query: AutocompleteQuery,
364
+ variables: {
365
+ term: 'autocomplet'
366
+ }
367
+ },
368
+ result: {
369
+ data: {
370
+ searchAutoComplete: {
371
+ products: {
372
+ result: [
373
+ {
374
+ name: 'autocomplete',
375
+ id: 123,
376
+ articleNumber: 123,
377
+ primaryRoute: {
378
+ id: 345343,
379
+ slug: 'autocompleted-product',
380
+ path: '/product/autocompleted-product'
381
+ }
382
+ }
383
+ ]
384
+ }
385
+ }
386
+ }
387
+ }
388
+ }
389
+ ];
390
+
391
+ function setup(
392
+ containerProps = {},
393
+ renderFn,
394
+ {
395
+ getInputPropsOptions = {},
396
+ getCancelPropsOptions = {},
397
+ getSubmitOpts = undefined
398
+ } = {}
399
+ ) {
400
+ const renderArg = {};
401
+
402
+ const childrenSpy = jest.fn(controllerArg => {
403
+ Object.assign(renderArg, controllerArg);
404
+
405
+ if (typeof renderFn === 'function') return renderFn(controllerArg);
406
+
407
+ return (
408
+ <>
409
+ <input
410
+ data-testid="default-input-field"
411
+ {...controllerArg.getInputProps(getInputPropsOptions)}
412
+ />
413
+ <button
414
+ data-testid="cancel-button"
415
+ {...controllerArg.getCancelProps(getCancelPropsOptions)}
416
+ >
417
+ Cancel
418
+ </button>
419
+ <button
420
+ data-testid="submit-button"
421
+ onClick={() => renderArg.triggerSearch(getSubmitOpts)}
422
+ >
423
+ Submit
424
+ </button>
425
+ <Switch>
426
+ <Route
427
+ path="/search"
428
+ component={props => {
429
+ return <div>you searched for {props.location.search}</div>;
430
+ }}
431
+ />
432
+ </Switch>
433
+ </>
434
+ );
435
+ });
436
+
437
+ const utils = renderWithRouter(
438
+ <ShopConfigContext.Provider
439
+ value={{ routes: { search: { path: '/search' } } }}
440
+ >
441
+ <MockedProvider mocks={mocks} addTypename={false}>
442
+ <SearchAutoCompleteContainer
443
+ autocompleteQuery={AutocompleteQuery}
444
+ {...containerProps}
445
+ >
446
+ {childrenSpy}
447
+ </SearchAutoCompleteContainer>
448
+ </MockedProvider>
449
+ </ShopConfigContext.Provider>
450
+ );
451
+
452
+ return {
453
+ ...utils,
454
+ input: utils.queryByTestId('default-input-field'),
455
+ cancel: utils.queryByTestId('cancel-button'),
456
+ submit: utils.queryByTestId('submit-button'),
457
+ childrenSpy,
458
+ renderArg
459
+ };
460
+ }
@@ -0,0 +1,15 @@
1
+ import { DocumentNode } from 'graphql';
2
+ import * as React from 'react';
3
+ export interface SearchFieldProps {
4
+ initialValue: string;
5
+ className?: string;
6
+ placeholder?: string;
7
+ autocompleteQuery: DocumentNode;
8
+ }
9
+ export interface SearchFieldCompound {
10
+ Flyout?: React.ReactNode;
11
+ Wrapper?: React.ReactNode;
12
+ Cancel?: React.ReactNode;
13
+ }
14
+ declare const SearchField: React.SFC<SearchFieldProps> & SearchFieldCompound;
15
+ export default SearchField;