@blaze-cms/react-page-builder 0.146.0-alpha.0 → 0.146.0-alpha.10

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 (277) hide show
  1. package/CHANGELOG.md +74 -0
  2. package/lib/components/BackToTop/BackToTop.js +8 -13
  3. package/lib/components/BackToTop/BackToTop.js.map +1 -1
  4. package/lib/components/Card/Card.js +19 -12
  5. package/lib/components/Card/Card.js.map +1 -1
  6. package/lib/components/Card/CardsContainer.js +8 -4
  7. package/lib/components/Card/CardsContainer.js.map +1 -1
  8. package/lib/components/Card/CardsFactory.js +37 -7
  9. package/lib/components/Card/CardsFactory.js.map +1 -1
  10. package/lib/components/Card/CardsRender.js +8 -4
  11. package/lib/components/Card/CardsRender.js.map +1 -1
  12. package/lib/components/Card/helpers/index.js +6 -6
  13. package/lib/components/Card/helpers/index.js.map +1 -1
  14. package/lib/components/Carousel/CarouselImage/CarouselImage.js +3 -1
  15. package/lib/components/Carousel/CarouselImage/CarouselImage.js.map +1 -1
  16. package/lib/components/Carousel/CarouselImage/constants.js +9 -0
  17. package/lib/components/Carousel/CarouselImage/constants.js.map +1 -0
  18. package/lib/components/CarouselWrapper/DefaultCarousel.js +2 -0
  19. package/lib/components/CarouselWrapper/DefaultCarousel.js.map +1 -1
  20. package/lib/components/ContentGroup/ContentGroupTabs.js +1 -2
  21. package/lib/components/ContentGroup/ContentGroupTabs.js.map +1 -1
  22. package/lib/components/Image/GlobalLightbox/GlobalLightbox.js +3 -3
  23. package/lib/components/Image/GlobalLightbox/GlobalLightbox.js.map +1 -1
  24. package/lib/components/Image/GlobalLightbox/NavButton.js +6 -3
  25. package/lib/components/Image/GlobalLightbox/NavButton.js.map +1 -1
  26. package/lib/components/Image/Image.js +1 -0
  27. package/lib/components/Image/Image.js.map +1 -1
  28. package/lib/components/Image/Lightbox/Lightbox.js +2 -2
  29. package/lib/components/Image/Lightbox/Lightbox.js.map +1 -1
  30. package/lib/components/ItemList/ItemListNew/ItemListNew.js +1 -2
  31. package/lib/components/ItemList/ItemListNew/ItemListNew.js.map +1 -1
  32. package/lib/components/List/ListRender.js.map +1 -1
  33. package/lib/components/List/components/Cards/CardsRender.js.map +1 -1
  34. package/lib/components/List/components/Full/FullRender.js +2 -2
  35. package/lib/components/List/components/Full/FullRender.js.map +1 -1
  36. package/lib/components/Menu/Menu.js +1 -1
  37. package/lib/components/Menu/Menu.js.map +1 -1
  38. package/lib/components/MenuItem/MenuEntitiesItem.js +203 -0
  39. package/lib/components/MenuItem/MenuEntitiesItem.js.map +1 -0
  40. package/lib/components/MenuItem/MenuItem.js +25 -71
  41. package/lib/components/MenuItem/MenuItem.js.map +1 -1
  42. package/lib/components/MenuItem/MenuItemRender.js +104 -0
  43. package/lib/components/MenuItem/MenuItemRender.js.map +1 -0
  44. package/lib/components/MenuItem/helpers/index.js +15 -0
  45. package/lib/components/MenuItem/helpers/index.js.map +1 -0
  46. package/lib/components/MenuItem/helpers/inject-helper-into-template.js +17 -0
  47. package/lib/components/MenuItem/helpers/inject-helper-into-template.js.map +1 -0
  48. package/lib/components/Modal/Modal.js +2 -2
  49. package/lib/components/Modal/Modal.js.map +1 -1
  50. package/lib/components/ModalAdapter/ModalAdapter.js +21 -0
  51. package/lib/components/ModalAdapter/ModalAdapter.js.map +1 -0
  52. package/lib/components/ModalAdapter/index.js +11 -0
  53. package/lib/components/ModalAdapter/index.js.map +1 -0
  54. package/lib/components/SearchFilter/SearchFilter/FiltersList.js.map +1 -1
  55. package/lib/components/SearchFilter/SearchFilter/MobileFormToolbar.js +1 -1
  56. package/lib/components/SearchFilter/SearchFilter/MobileFormToolbar.js.map +1 -1
  57. package/lib/components/SearchFilter/SearchFilter/ResetDesktopForm.js +3 -3
  58. package/lib/components/SearchFilter/SearchFilter/ResetDesktopForm.js.map +1 -1
  59. package/lib/components/SearchFilter/SearchFilter/SearchFilter.js +10 -6
  60. package/lib/components/SearchFilter/SearchFilter/SearchFilter.js.map +1 -1
  61. package/lib/components/SearchFilter/SearchFilterContainer.js +23 -28
  62. package/lib/components/SearchFilter/SearchFilterContainer.js.map +1 -1
  63. package/lib/components/SearchFilter/components/Checkbox.js +1 -1
  64. package/lib/components/SearchFilter/components/Checkbox.js.map +1 -1
  65. package/lib/components/SearchFilter/components/TextSearch.js +1 -0
  66. package/lib/components/SearchFilter/components/TextSearch.js.map +1 -1
  67. package/lib/components/SearchFilter/helpers/build-list-name-query.js +31 -0
  68. package/lib/components/SearchFilter/helpers/build-list-name-query.js.map +1 -0
  69. package/lib/components/SearchFilter/helpers/decode-encode.js.map +1 -1
  70. package/lib/components/SearchFilter/helpers/index.js +7 -0
  71. package/lib/components/SearchFilter/helpers/index.js.map +1 -1
  72. package/lib/components/Video/VideoModal.js +2 -2
  73. package/lib/components/Video/VideoModal.js.map +1 -1
  74. package/lib/components/Video/providers/Vimeo/VimeoProvider.js +0 -1
  75. package/lib/components/Video/providers/Vimeo/VimeoProvider.js.map +1 -1
  76. package/lib/helpers/build-filters-query.js.map +1 -1
  77. package/lib/{components/Card/helpers → helpers}/filter-query-setup.js +10 -7
  78. package/lib/helpers/filter-query-setup.js.map +1 -0
  79. package/lib/{components/Card/helpers → helpers}/filters-setup.js +8 -5
  80. package/lib/helpers/filters-setup.js.map +1 -0
  81. package/lib/helpers/get-updated-items-to-display.js.map +1 -0
  82. package/lib/helpers/get-updated-sort-properties.js.map +1 -0
  83. package/lib/helpers/index.js +42 -0
  84. package/lib/helpers/index.js.map +1 -1
  85. package/lib/helpers/should-return.js.map +1 -0
  86. package/lib/{components/Card/helpers → helpers}/should-skip-single-query.js +1 -1
  87. package/lib/helpers/should-skip-single-query.js.map +1 -0
  88. package/lib/hooks/index.js +7 -0
  89. package/lib/hooks/index.js.map +1 -1
  90. package/lib/hooks/use-portal.js +30 -0
  91. package/lib/hooks/use-portal.js.map +1 -0
  92. package/lib-es/components/BackToTop/BackToTop.js +11 -17
  93. package/lib-es/components/BackToTop/BackToTop.js.map +1 -1
  94. package/lib-es/components/Card/Card.js +19 -12
  95. package/lib-es/components/Card/Card.js.map +1 -1
  96. package/lib-es/components/Card/CardsContainer.js +9 -5
  97. package/lib-es/components/Card/CardsContainer.js.map +1 -1
  98. package/lib-es/components/Card/CardsFactory.js +40 -9
  99. package/lib-es/components/Card/CardsFactory.js.map +1 -1
  100. package/lib-es/components/Card/CardsRender.js +9 -5
  101. package/lib-es/components/Card/CardsRender.js.map +1 -1
  102. package/lib-es/components/Card/helpers/index.js +6 -6
  103. package/lib-es/components/Card/helpers/index.js.map +1 -1
  104. package/lib-es/components/Carousel/CarouselImage/CarouselImage.js +3 -1
  105. package/lib-es/components/Carousel/CarouselImage/CarouselImage.js.map +1 -1
  106. package/lib-es/components/Carousel/CarouselImage/constants.js +2 -0
  107. package/lib-es/components/Carousel/CarouselImage/constants.js.map +1 -0
  108. package/lib-es/components/CarouselWrapper/DefaultCarousel.js +2 -0
  109. package/lib-es/components/CarouselWrapper/DefaultCarousel.js.map +1 -1
  110. package/lib-es/components/ContentGroup/ContentGroupTabs.js +1 -2
  111. package/lib-es/components/ContentGroup/ContentGroupTabs.js.map +1 -1
  112. package/lib-es/components/Image/GlobalLightbox/GlobalLightbox.js +3 -3
  113. package/lib-es/components/Image/GlobalLightbox/GlobalLightbox.js.map +1 -1
  114. package/lib-es/components/Image/GlobalLightbox/NavButton.js +6 -3
  115. package/lib-es/components/Image/GlobalLightbox/NavButton.js.map +1 -1
  116. package/lib-es/components/Image/Image.js +1 -0
  117. package/lib-es/components/Image/Image.js.map +1 -1
  118. package/lib-es/components/Image/Lightbox/Lightbox.js +1 -1
  119. package/lib-es/components/Image/Lightbox/Lightbox.js.map +1 -1
  120. package/lib-es/components/ItemList/ItemListNew/ItemListNew.js +1 -2
  121. package/lib-es/components/ItemList/ItemListNew/ItemListNew.js.map +1 -1
  122. package/lib-es/components/List/ListRender.js.map +1 -1
  123. package/lib-es/components/List/components/Cards/CardsRender.js.map +1 -1
  124. package/lib-es/components/List/components/Full/FullRender.js +2 -2
  125. package/lib-es/components/List/components/Full/FullRender.js.map +1 -1
  126. package/lib-es/components/Menu/Menu.js +1 -1
  127. package/lib-es/components/Menu/Menu.js.map +1 -1
  128. package/lib-es/components/MenuItem/MenuEntitiesItem.js +177 -0
  129. package/lib-es/components/MenuItem/MenuEntitiesItem.js.map +1 -0
  130. package/lib-es/components/MenuItem/MenuItem.js +28 -60
  131. package/lib-es/components/MenuItem/MenuItem.js.map +1 -1
  132. package/lib-es/components/MenuItem/MenuItemRender.js +84 -0
  133. package/lib-es/components/MenuItem/MenuItemRender.js.map +1 -0
  134. package/lib-es/components/MenuItem/helpers/index.js +3 -0
  135. package/lib-es/components/MenuItem/helpers/index.js.map +1 -0
  136. package/lib-es/components/MenuItem/helpers/inject-helper-into-template.js +8 -0
  137. package/lib-es/components/MenuItem/helpers/inject-helper-into-template.js.map +1 -0
  138. package/lib-es/components/Modal/Modal.js +1 -1
  139. package/lib-es/components/Modal/Modal.js.map +1 -1
  140. package/lib-es/components/ModalAdapter/ModalAdapter.js +13 -0
  141. package/lib-es/components/ModalAdapter/ModalAdapter.js.map +1 -0
  142. package/lib-es/components/ModalAdapter/index.js +3 -0
  143. package/lib-es/components/ModalAdapter/index.js.map +1 -0
  144. package/lib-es/components/SearchFilter/SearchFilter/FiltersList.js.map +1 -1
  145. package/lib-es/components/SearchFilter/SearchFilter/MobileFormToolbar.js +1 -1
  146. package/lib-es/components/SearchFilter/SearchFilter/MobileFormToolbar.js.map +1 -1
  147. package/lib-es/components/SearchFilter/SearchFilter/ResetDesktopForm.js +3 -3
  148. package/lib-es/components/SearchFilter/SearchFilter/ResetDesktopForm.js.map +1 -1
  149. package/lib-es/components/SearchFilter/SearchFilter/SearchFilter.js +10 -6
  150. package/lib-es/components/SearchFilter/SearchFilter/SearchFilter.js.map +1 -1
  151. package/lib-es/components/SearchFilter/SearchFilterContainer.js +23 -20
  152. package/lib-es/components/SearchFilter/SearchFilterContainer.js.map +1 -1
  153. package/lib-es/components/SearchFilter/components/Checkbox.js +1 -1
  154. package/lib-es/components/SearchFilter/components/Checkbox.js.map +1 -1
  155. package/lib-es/components/SearchFilter/components/TextSearch.js +1 -0
  156. package/lib-es/components/SearchFilter/components/TextSearch.js.map +1 -1
  157. package/lib-es/components/SearchFilter/helpers/build-list-name-query.js +15 -0
  158. package/lib-es/components/SearchFilter/helpers/build-list-name-query.js.map +1 -0
  159. package/lib-es/components/SearchFilter/helpers/decode-encode.js.map +1 -1
  160. package/lib-es/components/SearchFilter/helpers/index.js +2 -1
  161. package/lib-es/components/SearchFilter/helpers/index.js.map +1 -1
  162. package/lib-es/components/Video/VideoModal.js +1 -1
  163. package/lib-es/components/Video/VideoModal.js.map +1 -1
  164. package/lib-es/components/Video/providers/Vimeo/VimeoProvider.js +0 -1
  165. package/lib-es/components/Video/providers/Vimeo/VimeoProvider.js.map +1 -1
  166. package/lib-es/helpers/build-filters-query.js.map +1 -1
  167. package/lib-es/{components/Card/helpers → helpers}/filter-query-setup.js +5 -3
  168. package/lib-es/helpers/filter-query-setup.js.map +1 -0
  169. package/lib-es/{components/Card/helpers → helpers}/filters-setup.js +4 -2
  170. package/lib-es/helpers/filters-setup.js.map +1 -0
  171. package/lib-es/helpers/get-updated-items-to-display.js.map +1 -0
  172. package/lib-es/helpers/get-updated-sort-properties.js.map +1 -0
  173. package/lib-es/helpers/index.js +6 -0
  174. package/lib-es/helpers/index.js.map +1 -1
  175. package/lib-es/helpers/should-return.js.map +1 -0
  176. package/lib-es/{components/Card/helpers → helpers}/should-skip-single-query.js +1 -1
  177. package/lib-es/helpers/should-skip-single-query.js.map +1 -0
  178. package/lib-es/hooks/index.js +1 -0
  179. package/lib-es/hooks/index.js.map +1 -1
  180. package/lib-es/hooks/use-portal.js +14 -0
  181. package/lib-es/hooks/use-portal.js.map +1 -0
  182. package/package.json +5 -5
  183. package/src/components/BackToTop/BackToTop.js +6 -11
  184. package/src/components/Card/Card.js +29 -19
  185. package/src/components/Card/CardsContainer.js +7 -3
  186. package/src/components/Card/CardsFactory.js +34 -6
  187. package/src/components/Card/CardsRender.js +6 -2
  188. package/src/components/Card/helpers/index.js +6 -6
  189. package/src/components/Carousel/CarouselImage/CarouselImage.js +3 -1
  190. package/src/components/Carousel/CarouselImage/constants.js +1 -0
  191. package/src/components/CarouselWrapper/DefaultCarousel.js +2 -0
  192. package/src/components/ContentGroup/ContentGroupTabs.js +1 -3
  193. package/src/components/Image/GlobalLightbox/GlobalLightbox.js +3 -3
  194. package/src/components/Image/GlobalLightbox/NavButton.js +5 -3
  195. package/src/components/Image/Image.js +1 -0
  196. package/src/components/Image/Lightbox/Lightbox.js +1 -1
  197. package/src/components/ItemList/ItemListNew/ItemListNew.js +1 -4
  198. package/src/components/List/ListRender.js +0 -1
  199. package/src/components/List/components/Cards/CardsRender.js +2 -0
  200. package/src/components/List/components/Full/FullRender.js +2 -1
  201. package/src/components/Menu/Menu.js +1 -1
  202. package/src/components/MenuItem/MenuEntitiesItem.js +202 -0
  203. package/src/components/MenuItem/MenuItem.js +15 -65
  204. package/src/components/MenuItem/MenuItemRender.js +92 -0
  205. package/src/components/MenuItem/helpers/index.js +3 -0
  206. package/src/components/MenuItem/helpers/inject-helper-into-template.js +11 -0
  207. package/src/components/Modal/Modal.js +1 -1
  208. package/src/components/ModalAdapter/ModalAdapter.js +12 -0
  209. package/src/components/ModalAdapter/index.js +3 -0
  210. package/src/components/SearchFilter/SearchFilter/FiltersList.js +3 -0
  211. package/src/components/SearchFilter/SearchFilter/MobileFormToolbar.js +1 -1
  212. package/src/components/SearchFilter/SearchFilter/ResetDesktopForm.js +3 -2
  213. package/src/components/SearchFilter/SearchFilter/SearchFilter.js +16 -9
  214. package/src/components/SearchFilter/SearchFilterContainer.js +16 -22
  215. package/src/components/SearchFilter/components/Checkbox.js +3 -1
  216. package/src/components/SearchFilter/components/TextSearch.js +1 -0
  217. package/src/components/SearchFilter/helpers/build-list-name-query.js +18 -0
  218. package/src/components/SearchFilter/helpers/decode-encode.js +0 -1
  219. package/src/components/SearchFilter/helpers/index.js +2 -0
  220. package/src/components/Video/VideoModal.js +1 -1
  221. package/src/components/Video/providers/Vimeo/VimeoProvider.js +0 -1
  222. package/src/helpers/build-filters-query.js +0 -1
  223. package/src/{components/Card/helpers → helpers}/filter-query-setup.js +5 -3
  224. package/src/{components/Card/helpers → helpers}/filters-setup.js +5 -2
  225. package/src/helpers/index.js +6 -0
  226. package/src/{components/Card/helpers → helpers}/should-skip-single-query.js +1 -1
  227. package/src/hooks/index.js +1 -0
  228. package/src/hooks/use-portal.js +18 -0
  229. package/tests/unit/src/components/BackToTop/BackToTop.test.js +9 -5
  230. package/tests/unit/src/components/BackToTop/__snapshots__/BackToTop.test.js.snap +1 -1
  231. package/tests/unit/src/components/Card/Card.test.js +16 -1
  232. package/tests/unit/src/components/Card/__snapshots__/Card.test.js.snap +83 -0
  233. package/tests/unit/src/components/Card/helpers/get-updated-items-to-display.test.js +1 -1
  234. package/tests/unit/src/components/Carousel/CarouselImage/__snapshots__/CarouselImage.test.js.snap +1 -1
  235. package/tests/unit/src/components/Carousel/__snapshots__/Carousel.test.js.snap +1 -1
  236. package/tests/unit/src/components/ContentGroup/__snapshots__/ContentGroupTabs.test.js.snap +4 -4
  237. package/tests/unit/src/components/Image/Lightbox/Lightbox.test.js +4 -0
  238. package/tests/unit/src/components/Image/Lightbox/__snapshots__/Lightbox.test.js.snap +3 -38
  239. package/tests/unit/src/components/ItemList/__snapshots__/ItemListNew.test.js.snap +0 -2
  240. package/tests/unit/src/components/MenuItem/MenuEntitiesItem.test.js +23 -0
  241. package/tests/unit/src/components/MenuItem/MenuItem.test.js +30 -11
  242. package/tests/unit/src/components/MenuItem/MenuItemRender.test.js +55 -0
  243. package/tests/unit/src/components/MenuItem/__snapshots__/MenuEntitiesItem.test.js.snap +3 -0
  244. package/tests/unit/src/components/MenuItem/__snapshots__/MenuItem.test.js.snap +5 -56
  245. package/tests/unit/src/components/MenuItem/helpers/inject-helper-into-template.test.js +44 -0
  246. package/tests/unit/src/components/MenuItem/mocks.js +71 -0
  247. package/tests/unit/src/components/Modal/Modal.test.js +4 -0
  248. package/tests/unit/src/components/Modal/__snapshots__/Modal.test.js.snap +7 -42
  249. package/tests/unit/src/components/SearchFilter/SearchFilter/__snapshots__/MobileFormToolbar.test.js.snap +1 -1
  250. package/tests/unit/src/components/SearchFilter/SearchFilter/__snapshots__/ResetDesktopForm.test.js.snap +1 -1
  251. package/tests/unit/src/components/SearchFilter/SearchFilter/__snapshots__/SearchFilter.test.js.snap +19 -17
  252. package/tests/unit/src/components/SearchFilter/__snapshots__/SearchFilterContainer.test.js.snap +7 -1
  253. package/tests/unit/src/components/SearchFilter/components/__snapshots__/Select.test.js.snap +1 -0
  254. package/tests/unit/src/components/SearchFilter/components/__snapshots__/TextSearch.test.js.snap +1 -0
  255. package/tests/unit/src/components/SearchFilterSort/__snapshots__/SearchFilterSort.test.js.snap +1 -0
  256. package/tests/unit/src/components/Video/providers/Vimeo/__snapshots__/Vimeo.test.js.snap +0 -1
  257. package/lib/components/Card/helpers/filter-query-setup.js.map +0 -1
  258. package/lib/components/Card/helpers/filters-setup.js.map +0 -1
  259. package/lib/components/Card/helpers/get-updated-items-to-display.js.map +0 -1
  260. package/lib/components/Card/helpers/get-updated-sort-properties.js.map +0 -1
  261. package/lib/components/Card/helpers/should-return.js.map +0 -1
  262. package/lib/components/Card/helpers/should-skip-single-query.js.map +0 -1
  263. package/lib-es/components/Card/helpers/filter-query-setup.js.map +0 -1
  264. package/lib-es/components/Card/helpers/filters-setup.js.map +0 -1
  265. package/lib-es/components/Card/helpers/get-updated-items-to-display.js.map +0 -1
  266. package/lib-es/components/Card/helpers/get-updated-sort-properties.js.map +0 -1
  267. package/lib-es/components/Card/helpers/should-return.js.map +0 -1
  268. package/lib-es/components/Card/helpers/should-skip-single-query.js.map +0 -1
  269. /package/lib/{components/Card/helpers → helpers}/get-updated-items-to-display.js +0 -0
  270. /package/lib/{components/Card/helpers → helpers}/get-updated-sort-properties.js +0 -0
  271. /package/lib/{components/Card/helpers → helpers}/should-return.js +0 -0
  272. /package/lib-es/{components/Card/helpers → helpers}/get-updated-items-to-display.js +0 -0
  273. /package/lib-es/{components/Card/helpers → helpers}/get-updated-sort-properties.js +0 -0
  274. /package/lib-es/{components/Card/helpers → helpers}/should-return.js +0 -0
  275. /package/src/{components/Card/helpers → helpers}/get-updated-items-to-display.js +0 -0
  276. /package/src/{components/Card/helpers → helpers}/get-updated-sort-properties.js +0 -0
  277. /package/src/{components/Card/helpers → helpers}/should-return.js +0 -0
@@ -0,0 +1,92 @@
1
+ import React, { useState, useContext, useEffect } from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { FaChevronDown, FaChevronUp } from 'react-icons/fa';
4
+ import { useStringTemplate } from '@blaze-cms/utils-handlebars';
5
+ import { HOVER, MOUSE_ENTER, MOUSE_LEAVE, HIDDEN } from '../../constants';
6
+ import { hasChildren } from '../../helpers';
7
+ import BlazeLink from '../BlazeLink';
8
+ import MenuContext from '../Menu/MenuContext';
9
+ import { injectHelperIntoTemplate } from './helpers';
10
+
11
+ const MenuItemRender = ({ children, eventType, text, modifier, url, parent }) => {
12
+ const [displayChildren, setDisplayChildren] = useState(false);
13
+ const { showMobileMenu } = useContext(MenuContext);
14
+ const {
15
+ loading: loadingText,
16
+ data: [textToUse]
17
+ } = useStringTemplate(parent, [text]);
18
+
19
+ const {
20
+ loading: loadingUrl,
21
+ data: [urlToUse]
22
+ } = useStringTemplate(parent, [injectHelperIntoTemplate(url, 'url_encode')]);
23
+
24
+ useEffect(
25
+ () => {
26
+ if (!showMobileMenu) setDisplayChildren(false);
27
+ },
28
+ [showMobileMenu]
29
+ );
30
+
31
+ if (loadingUrl || loadingText) return '';
32
+
33
+ const isHoverEvent = eventType === HOVER;
34
+ const childrenDisplayClass = displayChildren ? '' : HIDDEN;
35
+
36
+ const handleItemEvent = ({ type }) => {
37
+ if (isHoverEvent) {
38
+ if (type === MOUSE_ENTER) {
39
+ setDisplayChildren(true);
40
+ }
41
+ if (type === MOUSE_LEAVE) {
42
+ setDisplayChildren(false);
43
+ }
44
+ }
45
+ };
46
+ const hasValidChildren = hasChildren(children);
47
+
48
+ return (
49
+ <li className={modifier} onMouseEnter={handleItemEvent} onMouseLeave={handleItemEvent}>
50
+ <div className="menu--item--link">
51
+ {urlToUse ? (
52
+ <BlazeLink href={urlToUse}>{textToUse}</BlazeLink>
53
+ ) : (
54
+ <span role="button" onClick={handleItemEvent}>
55
+ {textToUse}
56
+ </span>
57
+ )}
58
+ {hasValidChildren && (
59
+ <i
60
+ role="button"
61
+ className="menu--item--link--icon"
62
+ onClick={() => setDisplayChildren(!displayChildren)}>
63
+ {displayChildren ? <FaChevronUp /> : <FaChevronDown />}
64
+ </i>
65
+ )}
66
+ </div>
67
+
68
+ {hasValidChildren && (
69
+ <div className={`menu--item-children ${childrenDisplayClass}`}>{children}</div>
70
+ )}
71
+ </li>
72
+ );
73
+ };
74
+
75
+ MenuItemRender.propTypes = {
76
+ modifier: PropTypes.string,
77
+ text: PropTypes.string,
78
+ url: PropTypes.string,
79
+ eventType: PropTypes.string.isRequired,
80
+ parent: PropTypes.object,
81
+ children: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node])
82
+ };
83
+
84
+ MenuItemRender.defaultProps = {
85
+ url: '',
86
+ modifier: '',
87
+ text: '',
88
+ children: null,
89
+ parent: {}
90
+ };
91
+
92
+ export default MenuItemRender;
@@ -0,0 +1,3 @@
1
+ import injectHelperIntoTemplate from './inject-helper-into-template';
2
+
3
+ export { injectHelperIntoTemplate };
@@ -0,0 +1,11 @@
1
+ const injectHelperIntoTemplate = (template, helper) => {
2
+ if (!helper || !template) return template;
3
+
4
+ let result = template.replace(/{{{([^{}]+)}}}/g, `{{{${helper} $1}}}`);
5
+
6
+ result = result.replace(/{{([^{}]+)}}(?!})/g, `{{${helper} $1}}`);
7
+
8
+ return result;
9
+ };
10
+
11
+ export default injectHelperIntoTemplate;
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  import PropTypes from 'prop-types';
3
- import BlazeModal from '@blaze-react/modal';
3
+ import BlazeModal from '../ModalAdapter';
4
4
  import { renderChildren, updateChildrensParent, hasChildren } from '../../helpers';
5
5
 
6
6
  const Modal = ({ children, elementTitle, onClose, ...otherProps }) => {
@@ -0,0 +1,12 @@
1
+ import React from 'react';
2
+ import Modal from '@blaze-react/modal';
3
+ import ReactDOM from 'react-dom';
4
+ import { usePortal } from '../../hooks';
5
+
6
+ const ModalAdapter = ({ ...props }) => {
7
+ const target = usePortal();
8
+
9
+ return ReactDOM.createPortal(<Modal {...props} />, target);
10
+ };
11
+
12
+ export default ModalAdapter;
@@ -0,0 +1,3 @@
1
+ import ModalAdapter from './ModalAdapter';
2
+
3
+ export default ModalAdapter;
@@ -38,6 +38,7 @@ const FiltersList = ({
38
38
  />
39
39
  </div>
40
40
  );
41
+
41
42
  case CHECKBOX:
42
43
  return (
43
44
  <div
@@ -56,6 +57,7 @@ const FiltersList = ({
56
57
  />
57
58
  </div>
58
59
  );
60
+
59
61
  case SELECT:
60
62
  return (
61
63
  <div
@@ -74,6 +76,7 @@ const FiltersList = ({
74
76
  />
75
77
  </div>
76
78
  );
79
+
77
80
  case RANGE:
78
81
  return (
79
82
  !!areAggregationsAvailable && (
@@ -9,7 +9,7 @@ const MobileFormToolbar = ({ formId, handleReset }) => (
9
9
  data-testid="reset-button"
10
10
  role="button"
11
11
  onClick={handleReset}
12
- aria-label="Reset Filters">
12
+ aria-label="Reset search filters">
13
13
  {RESET}
14
14
  </div>
15
15
 
@@ -10,13 +10,14 @@ const ResetDesktopForm = ({ handleReset }) => (
10
10
  className="icon-button icon-button--reset"
11
11
  title="reset--button"
12
12
  data-testid="reset-icon"
13
- onClick={handleReset}>
13
+ onClick={handleReset}
14
+ aria-label="Reset search filters">
14
15
  <i>
15
16
  <FaRedoAlt />
16
17
  </i>
17
18
  </button>
18
19
 
19
- <div role="button" onClick={handleReset} data-testid="reset-button" aria-label="Reset Filters">
20
+ <div role="button" onClick={handleReset} data-testid="reset-button">
20
21
  {RESET}
21
22
  </div>
22
23
  </div>
@@ -3,11 +3,10 @@ import PropTypes from 'prop-types';
3
3
  import classnames from 'classnames';
4
4
  import debounce from 'lodash.debounce';
5
5
  import FiltersList from './FiltersList';
6
- import { isDeviceDesktop, getResponsiveFilterClassnames, buildUrlQuery } from '../helpers';
7
-
8
6
  import CloseMobileForm from './CloseMobileForm';
9
7
  import ResetDesktopForm from './ResetDesktopForm';
10
8
  import MobileFormToolbar from './MobileFormToolbar';
9
+ import { isDeviceDesktop, getResponsiveFilterClassnames, buildUrlQuery } from '../helpers';
11
10
  import { SEARCH, REFINE, MORE_FILTERS_CLASSES } from '../constants';
12
11
 
13
12
  const SearchFilter = ({
@@ -26,6 +25,7 @@ const SearchFilter = ({
26
25
  groupAfterMobile,
27
26
  filterValues,
28
27
  setAppliedFilters,
28
+ mobileRefineButtonText,
29
29
  query
30
30
  }) => {
31
31
  const [moreFiltersMobileCollapsed, setMoreFiltersMobileCollapsed] = useState(true);
@@ -152,6 +152,11 @@ const SearchFilter = ({
152
152
  data-testId="search-filter-desktop-toggler"
153
153
  className={moreFiltersDesktopTogglerClass}
154
154
  type="button"
155
+ aria-label={
156
+ moreFiltersDesktopCollapsed
157
+ ? 'Show more search filters'
158
+ : 'Show less search filters'
159
+ }
155
160
  onClick={() =>
156
161
  setMoreFiltersDesktopCollapsed(!moreFiltersDesktopCollapsed)
157
162
  }>
@@ -206,12 +211,12 @@ const SearchFilter = ({
206
211
 
207
212
  {isCollapsedOnResponsive &&
208
213
  !displaySearchFilter && (
209
- <div className="filter__refine filter__refine--mobile-close" data-testid="refine-mobile">
210
- <div
211
- role="button"
212
- onClick={() => setDisplaySearchFilter(true)}
213
- aria-label="Toggle Search Filter">
214
- {REFINE}
214
+ <div
215
+ className="filter__refine filter__refine--mobile-close"
216
+ data-testid="refine-mobile"
217
+ aria-label="Toggle Search Filter">
218
+ <div role="button" onClick={() => setDisplaySearchFilter(true)}>
219
+ {mobileRefineButtonText || REFINE}
215
220
  </div>
216
221
  </div>
217
222
  )}
@@ -235,10 +240,12 @@ SearchFilter.propTypes = {
235
240
  filterValues: PropTypes.object.isRequired,
236
241
  setAppliedFilters: PropTypes.func.isRequired,
237
242
  listComponentName: PropTypes.string,
238
- query: PropTypes.object
243
+ query: PropTypes.object,
244
+ mobileRefineButtonText: PropTypes.string
239
245
  };
240
246
 
241
247
  SearchFilter.defaultProps = {
248
+ mobileRefineButtonText: '',
242
249
  listComponentName: '',
243
250
  query: {}
244
251
  };
@@ -11,7 +11,8 @@ import {
11
11
  buildNewUrl,
12
12
  getFilterValues,
13
13
  getFilterRangesAndCheckboxesValues,
14
- getUpdatedFilterBy
14
+ getUpdatedFilterBy,
15
+ buildListNameQuery
15
16
  } from './helpers';
16
17
  import {
17
18
  getEntityData,
@@ -25,23 +26,6 @@ import { SCROLL_OFFSET } from '../../constants';
25
26
  import searchFilterReducer from './searchFilterReducer';
26
27
  import { useGetEntitySchemasAsObj } from '../../hooks';
27
28
 
28
- const getFiltersUrlQuery = (query, listName) => {
29
- if (!listName) return query;
30
- const updatedQuery = {};
31
- const listKey = `pb[${listName}]`;
32
- Object.keys(query).forEach(queryKey => {
33
- const isListKey = queryKey.indexOf(`${listName}`) !== -1;
34
- if (!isListKey) return;
35
- const decodedQueryValue = Array.isArray(query[queryKey])
36
- ? query[queryKey].map(value => decodeURIComponent(value))
37
- : decodeURIComponent(query[queryKey]);
38
- const strippedKey = queryKey.substring(listKey.length + 1, queryKey.length - 1);
39
- if (isListKey) updatedQuery[strippedKey] = decodedQueryValue;
40
- });
41
-
42
- return updatedQuery;
43
- };
44
-
45
29
  const SearchFilterContainer = ({
46
30
  entity,
47
31
  url,
@@ -54,7 +38,8 @@ const SearchFilterContainer = ({
54
38
  filterByProperty,
55
39
  shouldAddFilters,
56
40
  listComponentName,
57
- parent
41
+ parent,
42
+ mobileRefineButtonText
58
43
  }) => {
59
44
  const { isPreview } = useContext(MainContext);
60
45
  const router = useRouter();
@@ -65,15 +50,21 @@ const SearchFilterContainer = ({
65
50
  const [urlPath, setUrlPath] = useState(asPath); // used as asPath can take too long to update
66
51
  const [filterValues, dispatch] = useReducer(searchFilterReducer, null);
67
52
  const { url: currentUrl, query } = parseUrl(urlPath);
68
- const updatedQuery = getFiltersUrlQuery(query, listComponentName);
53
+ const updatedQuery = buildListNameQuery(query, listComponentName);
69
54
  const { itemId: parentId, itemEntity: parentEntity } = parent;
70
55
 
71
56
  useEffect(
72
57
  () => {
73
- if (asPath) setUrlPath(asPath);
58
+ const { query: newQuery } = parseUrl(asPath);
59
+ const updatedNewQuery = buildListNameQuery(newQuery, listComponentName);
60
+ const newValues = getFilterValues({}, filters, updatedNewQuery);
61
+ if (newValues) dispatch({ newValues, shouldSearch: false, type: 'update' });
62
+ setUrlPath(asPath);
74
63
  },
64
+ // eslint-disable-next-line react-hooks/exhaustive-deps
75
65
  [asPath]
76
66
  );
67
+
77
68
  const { data: mainSchemas = {}, loading: schemasLoading } = useGetEntitySchemasAsObj([
78
69
  parentEntity,
79
70
  entity
@@ -186,11 +177,13 @@ const SearchFilterContainer = ({
186
177
  setDisplaySearchFilter={setDisplaySearchFilter}
187
178
  groupAfterMobile={groupAfterMobile}
188
179
  groupAfterDesktop={groupAfterDesktop}
180
+ mobileRefineButtonText={mobileRefineButtonText}
189
181
  />
190
182
  );
191
183
  };
192
184
 
193
185
  SearchFilterContainer.propTypes = {
186
+ mobileRefineButtonText: PropTypes.string,
194
187
  entity: PropTypes.string,
195
188
  url: PropTypes.string,
196
189
  filters: PropTypes.array,
@@ -216,7 +209,8 @@ SearchFilterContainer.defaultProps = {
216
209
  filterByProperty: [],
217
210
  shouldAddFilters: false,
218
211
  listComponentName: '',
219
- parent: {}
212
+ parent: {},
213
+ mobileRefineButtonText: ''
220
214
  };
221
215
 
222
216
  export default withTitle(SearchFilterContainer);
@@ -84,7 +84,9 @@ const Checkbox = ({
84
84
  role="button"
85
85
  className="see-more"
86
86
  onClick={handleCheckboxOptions}
87
- aria-label={shouldDisplayMore ? `See ${MORE} options` : `See ${LESS} options`}>
87
+ aria-label={
88
+ shouldDisplayMore ? `See ${MORE} ${label} options` : `See ${LESS} ${label} options`
89
+ }>
88
90
  {shouldDisplayMore ? (
89
91
  <>
90
92
  <i>
@@ -22,6 +22,7 @@ const TextSearch = ({ label, searchValue, updateFilterValues, elementTitle }) =>
22
22
  <button
23
23
  type="button"
24
24
  className="icon-button icon-button--search"
25
+ aria-label="Search"
25
26
  onClick={e => {
26
27
  e.preventDefault();
27
28
  updateFilterValues({ [SEARCH_TERM]: searchValue }, true);
@@ -0,0 +1,18 @@
1
+ const buildListNameQuery = (query, listName) => {
2
+ if (!listName) return query;
3
+ const updatedQuery = {};
4
+ const listKey = `pb[${listName}]`;
5
+ Object.keys(query).forEach(queryKey => {
6
+ const isListKey = queryKey.indexOf(`${listName}`) !== -1;
7
+ if (!isListKey) return;
8
+ const decodedQueryValue = Array.isArray(query[queryKey])
9
+ ? query[queryKey].map(value => decodeURIComponent(value))
10
+ : decodeURIComponent(query[queryKey]);
11
+ const strippedKey = queryKey.substring(listKey.length + 1, queryKey.length - 1);
12
+ if (isListKey) updatedQuery[strippedKey] = decodedQueryValue;
13
+ });
14
+
15
+ return updatedQuery;
16
+ };
17
+
18
+ export default buildListNameQuery;
@@ -1,5 +1,4 @@
1
1
  const decodeValue = value => decodeURIComponent(value);
2
-
3
2
  const encodeValue = value => encodeURIComponent(value);
4
3
 
5
4
  export { decodeValue, encodeValue };
@@ -1,3 +1,4 @@
1
+ import buildListNameQuery from './build-list-name-query';
1
2
  import buildNewUrl from './build-new-url';
2
3
  import { decodeValue, encodeValue } from './decode-encode';
3
4
  import checkIfRangeUpdated from './check-if-range-updated';
@@ -16,6 +17,7 @@ import getUpdatedFilterBy from './get-updated-filter-by';
16
17
  import buildUrlQuery from './build-url-query';
17
18
 
18
19
  export {
20
+ buildListNameQuery,
19
21
  buildNewUrl,
20
22
  decodeValue,
21
23
  encodeValue,
@@ -1,5 +1,5 @@
1
1
  import React, { useState } from 'react';
2
- import Modal from '@blaze-react/modal';
2
+ import Modal from '../ModalAdapter';
3
3
  import VideoRender from './VideoRender';
4
4
 
5
5
  const VideoModal = ({ ...props }) => {
@@ -51,7 +51,6 @@ const VimeoProvider = ({ url, autoplay, loop, imageData }) => {
51
51
  role="button"
52
52
  className={VIDEO_WRAPPER_CLASS_NAME}
53
53
  style={videoStyle}
54
- aria-label="Open video"
55
54
  onClick={() => !shouldRenderVideo && setShouldRenderVideo(true)}>
56
55
  {shouldRenderVideo && !videoError && wrappedCode}
57
56
  {videoError && videoError.message}
@@ -32,7 +32,6 @@ const builFilterObject = ({ queryKey, value, filters, isRange, isInQuery }) => {
32
32
 
33
33
  const buildFiltersQuery = ({
34
34
  shouldAddFilters,
35
-
36
35
  filterBy,
37
36
  filterByProperty,
38
37
  rangeValues,
@@ -1,6 +1,8 @@
1
1
  import { getStringTypeProps } from '@blaze-cms/utils/src/helpers';
2
- import { getGenericRenderVariables, buildRawQueryBase, buildSetFilters } from '../../../helpers';
3
- import { DEFAULT_LIMIT } from '../../../constants';
2
+ import getGenericRenderVariables from './get-generic-render-variables';
3
+ import buildRawQueryBase from './build-raw-query-base';
4
+ import buildSetFilters from './build-set-filters';
5
+ import { DEFAULT_LIMIT } from '../constants';
4
6
 
5
7
  const filterQuerySetup = ({
6
8
  getEntitySchemas,
@@ -13,7 +15,7 @@ const filterQuerySetup = ({
13
15
  itemsToDisplay,
14
16
  entitySameAsCurrentItemEntity,
15
17
  entitySchema,
16
- useRandomSort
18
+ useRandomSort = false
17
19
  }) => {
18
20
  const stringProps = getStringTypeProps(entity, filterEntityRelations, getEntitySchemas);
19
21
  const filterValues =
@@ -1,5 +1,7 @@
1
- import { buildQueryFields, getInheritedFilters, getQueryProps } from '../../../helpers';
2
- import { getSearchPublishedContent } from '../../../application/query';
1
+ import buildQueryFields from './build-query-fields';
2
+ import getInheritedFilters from './get-inherited-filters';
3
+ import getQueryProps from './get-query-props';
4
+ import { getSearchPublishedContent } from '../application/query';
3
5
 
4
6
  const filtersSetup = ({
5
7
  entityFields,
@@ -16,6 +18,7 @@ const filtersSetup = ({
16
18
  const fields = buildQueryFields(entityFields, entityTypes, isFull);
17
19
  const action = getSearchPublishedContent(fields);
18
20
  const inheritedFilters = getInheritedFilters(filterBy, filterByProperty);
21
+
19
22
  const entitySameAsCurrentItemEntity = entities.includes(itemEntityUpdated);
20
23
  const { relations: filterEntityRelations = [] } = filterEntitySchema;
21
24
  const queryProps = getQueryProps(inheritedFilters, currentSchema, filterEntitySchema);
@@ -53,5 +53,11 @@ export { default as appendImages } from './append-images';
53
53
  export { default as parseTextBlock } from './parse-TextBlock';
54
54
  export { default as processDataSummaryValue } from './process-data-summary-value';
55
55
  export { default as buildQueryKey } from './build-query-key';
56
+ export { default as filterQuerySetup } from './filter-query-setup';
57
+ export { default as filtersSetup } from './filters-setup';
58
+ export { default as getUpdatedItemsToDisplay } from './get-updated-items-to-display';
59
+ export { default as getUpdatedSortProperties } from './get-updated-sort-properties';
60
+ export { default as shouldReturn } from './should-return';
61
+ export { default as shouldSkipSingleQuery } from './should-skip-single-query';
56
62
  export { default as buildRawQueryStringified } from './build-raw-query-stringified';
57
63
  export { default as buildFiltersQuery } from './build-filters-query';
@@ -1,4 +1,4 @@
1
- import { ID } from '../../../constants';
1
+ import { ID } from '../constants';
2
2
 
3
3
  const shouldSkipSingleQuery = (loading, getAction, queryProps) =>
4
4
  loading || !getAction || queryProps === ID;
@@ -7,3 +7,4 @@ export { default as useGetSingleEntitySchema } from './use-get-single-entity-sch
7
7
  export { default as useCheckMobileScreen } from './use-check-mobile-screen';
8
8
  export { default as useBannerInsertion } from './use-banner-insertion';
9
9
  export { default as useAppSyncEventHook } from './use-app-sync-event-hook';
10
+ export { default as usePortal } from './use-portal';
@@ -0,0 +1,18 @@
1
+ import React, { useEffect } from 'react';
2
+
3
+ function usePortal() {
4
+ const rootElemRef = React.useRef(document.createElement('div'));
5
+
6
+ useEffect(() => {
7
+ document.body.appendChild(rootElemRef.current);
8
+
9
+ const element = rootElemRef.current;
10
+ return function removeElement() {
11
+ element.remove();
12
+ };
13
+ }, []);
14
+
15
+ return rootElemRef.current;
16
+ }
17
+
18
+ export default usePortal;
@@ -1,19 +1,23 @@
1
1
  /**
2
2
  * @jest-environment jsdom
3
3
  */
4
+ import React from 'react';
4
5
  import '@testing-library/jest-dom/extend-expect';
5
- import { render } from '@blaze-cms/tools/test-helpers/test-functions';
6
+ import { render, screen } from '@testing-library/react';
6
7
  import BackToTop from '../../../../../src/components/BackToTop';
7
8
 
8
- describe('Breadcrumb component', () => {
9
+ describe('BackToTop component', () => {
9
10
  it('should be a function', () => {
10
11
  expect(typeof BackToTop).toEqual('function');
11
12
  });
12
13
 
13
14
  it('should render without throwing an error and match snapshot', () => {
14
- const { asFragment } = render(BackToTop, {
15
- showAfterPixels: 500
16
- });
15
+ const { asFragment } = render(<BackToTop showAfterPixels={500} />);
17
16
  expect(asFragment()).toMatchSnapshot();
18
17
  });
18
+
19
+ it('should not render the button initially', () => {
20
+ render(<BackToTop showAfterPixels={500} />);
21
+ expect(screen.queryByRole('link', { name: /back to top/i })).not.toBeInTheDocument();
22
+ });
19
23
  });
@@ -1,3 +1,3 @@
1
1
  // Jest Snapshot v1, https://goo.gl/fbAQLP
2
2
 
3
- exports[`Breadcrumb component should render without throwing an error and match snapshot 1`] = `<DocumentFragment />`;
3
+ exports[`BackToTop component should render without throwing an error and match snapshot 1`] = `<DocumentFragment />`;
@@ -2,8 +2,9 @@
2
2
  * @jest-environment jsdom
3
3
  */
4
4
  import React from 'react';
5
- import { render as _render, act, waitFor } from '@testing-library/react';
5
+ import { render as _render, act, waitFor, screen } from '@testing-library/react';
6
6
  import '@testing-library/jest-dom/extend-expect';
7
+ import { setEnvs, deleteEnvs } from '@blaze-cms/tools/test-helpers/test-files/test-env';
7
8
  import Card from '../../../../../src/components/Card/Card';
8
9
  import { pageBuilderComponentsMocks } from './mockData';
9
10
 
@@ -211,4 +212,18 @@ describe('Card component', () => {
211
212
  });
212
213
  expect(getByTestId('full-card')).toBeInTheDocument();
213
214
  });
215
+
216
+ it('should render link wrapper', async () => {
217
+ const envs = {
218
+ BLAZE_PB_ADD_CLICK_TO_CARDS: 'true'
219
+ };
220
+ setEnvs(envs);
221
+ const { asFragment } = await render(Card, {
222
+ ...componentProps,
223
+ pageBuilderComponents: pageBuilderComponentsMocks
224
+ });
225
+ expect(screen.getByLabelText(componentProps.name)).toBeInTheDocument();
226
+ expect(asFragment()).toMatchSnapshot();
227
+ deleteEnvs(envs);
228
+ });
214
229
  });