@blaze-cms/react-page-builder 0.124.0-alpha.9 → 0.124.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 (279) hide show
  1. package/CHANGELOG.md +303 -0
  2. package/README.md +8 -0
  3. package/lib/application/query/index.js +8 -2
  4. package/lib/application/query/index.js.map +1 -1
  5. package/lib/components/Button.js +18 -5
  6. package/lib/components/Button.js.map +1 -1
  7. package/lib/components/Card/CardContainer.js +3 -7
  8. package/lib/components/Card/CardContainer.js.map +1 -1
  9. package/lib/components/Card/CardFactory.js +6 -3
  10. package/lib/components/Card/CardFactory.js.map +1 -1
  11. package/lib/components/CarouselWrapper.js +2 -2
  12. package/lib/components/CarouselWrapper.js.map +1 -1
  13. package/lib/components/Image/ImageRender.js +5 -1
  14. package/lib/components/Image/ImageRender.js.map +1 -1
  15. package/lib/components/ItemList/ItemListButton/ItemListButton.js +161 -0
  16. package/lib/components/ItemList/ItemListButton/ItemListButton.js.map +1 -0
  17. package/lib/components/ItemList/ItemListButton/index.js +16 -0
  18. package/lib/components/ItemList/ItemListButton/index.js.map +1 -0
  19. package/lib/components/ItemList/ItemListCounter/ItemListCounter.js +83 -0
  20. package/lib/components/ItemList/ItemListCounter/ItemListCounter.js.map +1 -0
  21. package/lib/components/ItemList/ItemListCounter/index.js +16 -0
  22. package/lib/components/ItemList/ItemListCounter/index.js.map +1 -0
  23. package/lib/components/ItemList/ItemListNew/ItemListNew.js +87 -0
  24. package/lib/components/ItemList/ItemListNew/ItemListNew.js.map +1 -0
  25. package/lib/components/ItemList/ItemListNew/index.js +16 -0
  26. package/lib/components/ItemList/ItemListNew/index.js.map +1 -0
  27. package/lib/components/ItemList/constants.js +19 -0
  28. package/lib/components/ItemList/constants.js.map +1 -0
  29. package/lib/components/ItemList/helpers/get-item-list-data.js +17 -0
  30. package/lib/components/ItemList/helpers/get-item-list-data.js.map +1 -0
  31. package/lib/components/ItemList/helpers/get-item-list-id.js +23 -0
  32. package/lib/components/ItemList/helpers/get-item-list-id.js.map +1 -0
  33. package/lib/components/ItemList/helpers/get-item-list-ids.js +28 -0
  34. package/lib/components/ItemList/helpers/get-item-list-ids.js.map +1 -0
  35. package/lib/components/ItemList/helpers/index.js +50 -0
  36. package/lib/components/ItemList/helpers/index.js.map +1 -0
  37. package/lib/components/ItemList/helpers/set-item-list-id.js +22 -0
  38. package/lib/components/ItemList/helpers/set-item-list-id.js.map +1 -0
  39. package/lib/components/ItemList/helpers/set-param-and-redirect.js +51 -0
  40. package/lib/components/ItemList/helpers/set-param-and-redirect.js.map +1 -0
  41. package/lib/components/ItemList/hooks/index.js +18 -0
  42. package/lib/components/ItemList/hooks/index.js.map +1 -0
  43. package/lib/components/ItemList/hooks/use-item-list-id.js +45 -0
  44. package/lib/components/ItemList/hooks/use-item-list-id.js.map +1 -0
  45. package/lib/components/LazyImage/LazyImage.js +5 -1
  46. package/lib/components/LazyImage/LazyImage.js.map +1 -1
  47. package/lib/components/List/ListBuilder.js +12 -6
  48. package/lib/components/List/ListBuilder.js.map +1 -1
  49. package/lib/components/List/ListFactory.js +34 -7
  50. package/lib/components/List/ListFactory.js.map +1 -1
  51. package/lib/components/List/helpers/has-required-item-list-details.js +29 -0
  52. package/lib/components/List/helpers/has-required-item-list-details.js.map +1 -0
  53. package/lib/components/List/helpers/index.js +8 -0
  54. package/lib/components/List/helpers/index.js.map +1 -1
  55. package/lib/components/Menu/Menu.js +41 -28
  56. package/lib/components/Menu/Menu.js.map +1 -1
  57. package/lib/components/Menu/MenuContext.js +20 -0
  58. package/lib/components/Menu/MenuContext.js.map +1 -0
  59. package/lib/components/MenuItem/MenuItem.js +26 -7
  60. package/lib/components/MenuItem/MenuItem.js.map +1 -1
  61. package/lib/components/SearchContent/SearchContent.js +183 -0
  62. package/lib/components/SearchContent/SearchContent.js.map +1 -0
  63. package/lib/components/SearchContent/SearchContentItems.js +51 -0
  64. package/lib/components/SearchContent/SearchContentItems.js.map +1 -0
  65. package/lib/components/SearchContent/SearchContentResults.js +45 -0
  66. package/lib/components/SearchContent/SearchContentResults.js.map +1 -0
  67. package/lib/components/SearchContent/SearchContentToggleIcon.js +42 -0
  68. package/lib/components/SearchContent/SearchContentToggleIcon.js.map +1 -0
  69. package/lib/components/SearchContent/index.js +2 -301
  70. package/lib/components/SearchContent/index.js.map +1 -1
  71. package/lib/components/SearchFilter/SearchFilter/FiltersList.js +2 -4
  72. package/lib/components/SearchFilter/SearchFilter/FiltersList.js.map +1 -1
  73. package/lib/components/SearchFilter/SearchFilter/SearchFilter.js +16 -66
  74. package/lib/components/SearchFilter/SearchFilter/SearchFilter.js.map +1 -1
  75. package/lib/components/SearchFilter/SearchFilterContainer.js +87 -23
  76. package/lib/components/SearchFilter/SearchFilterContainer.js.map +1 -1
  77. package/lib/components/SearchFilter/components/Checkbox.js +19 -9
  78. package/lib/components/SearchFilter/components/Checkbox.js.map +1 -1
  79. package/lib/components/SearchFilter/components/Select.js +27 -11
  80. package/lib/components/SearchFilter/components/Select.js.map +1 -1
  81. package/lib/components/SearchFilter/components/TextSearch.js +1 -5
  82. package/lib/components/SearchFilter/components/TextSearch.js.map +1 -1
  83. package/lib/components/SearchFilter/helpers/build-filters-query.js +87 -0
  84. package/lib/components/SearchFilter/helpers/build-filters-query.js.map +1 -0
  85. package/lib/components/SearchFilter/helpers/build-query.js +1 -1
  86. package/lib/components/SearchFilter/helpers/build-query.js.map +1 -1
  87. package/lib/components/SearchFilter/helpers/build-raw-query-stringified.js +2 -1
  88. package/lib/components/SearchFilter/helpers/build-raw-query-stringified.js.map +1 -1
  89. package/lib/components/SearchFilter/helpers/get-initial-filter-values.js +18 -3
  90. package/lib/components/SearchFilter/helpers/get-initial-filter-values.js.map +1 -1
  91. package/lib/components/SearchFilter/helpers/index.js +8 -0
  92. package/lib/components/SearchFilter/helpers/index.js.map +1 -1
  93. package/lib/components/SearchFilter/helpers/parse-filter-value.js +3 -7
  94. package/lib/components/SearchFilter/helpers/parse-filter-value.js.map +1 -1
  95. package/lib/components/index.js +16 -1
  96. package/lib/components/index.js.map +1 -1
  97. package/lib/constants/index.js +3 -1
  98. package/lib/constants/index.js.map +1 -1
  99. package/lib/helpers/build-raw-query.js.map +1 -1
  100. package/lib/hooks/helpers/append-gtm-classname.js +1 -0
  101. package/lib/hooks/helpers/append-gtm-classname.js.map +1 -1
  102. package/lib-es/application/query/index.js +45 -1
  103. package/lib-es/application/query/index.js.map +1 -1
  104. package/lib-es/components/Button.js +18 -6
  105. package/lib-es/components/Button.js.map +1 -1
  106. package/lib-es/components/Card/CardContainer.js +3 -7
  107. package/lib-es/components/Card/CardContainer.js.map +1 -1
  108. package/lib-es/components/Card/CardFactory.js +7 -4
  109. package/lib-es/components/Card/CardFactory.js.map +1 -1
  110. package/lib-es/components/CarouselWrapper.js +2 -2
  111. package/lib-es/components/CarouselWrapper.js.map +1 -1
  112. package/lib-es/components/Image/ImageRender.js +4 -1
  113. package/lib-es/components/Image/ImageRender.js.map +1 -1
  114. package/lib-es/components/ItemList/ItemListButton/ItemListButton.js +111 -0
  115. package/lib-es/components/ItemList/ItemListButton/ItemListButton.js.map +1 -0
  116. package/lib-es/components/ItemList/ItemListButton/index.js +3 -0
  117. package/lib-es/components/ItemList/ItemListButton/index.js.map +1 -0
  118. package/lib-es/components/ItemList/ItemListCounter/ItemListCounter.js +60 -0
  119. package/lib-es/components/ItemList/ItemListCounter/ItemListCounter.js.map +1 -0
  120. package/lib-es/components/ItemList/ItemListCounter/index.js +3 -0
  121. package/lib-es/components/ItemList/ItemListCounter/index.js.map +1 -0
  122. package/lib-es/components/ItemList/ItemListNew/ItemListNew.js +64 -0
  123. package/lib-es/components/ItemList/ItemListNew/ItemListNew.js.map +1 -0
  124. package/lib-es/components/ItemList/ItemListNew/index.js +3 -0
  125. package/lib-es/components/ItemList/ItemListNew/index.js.map +1 -0
  126. package/lib-es/components/ItemList/constants.js +6 -0
  127. package/lib-es/components/ItemList/constants.js.map +1 -0
  128. package/lib-es/components/ItemList/helpers/get-item-list-data.js +7 -0
  129. package/lib-es/components/ItemList/helpers/get-item-list-data.js.map +1 -0
  130. package/lib-es/components/ItemList/helpers/get-item-list-id.js +11 -0
  131. package/lib-es/components/ItemList/helpers/get-item-list-id.js.map +1 -0
  132. package/lib-es/components/ItemList/helpers/get-item-list-ids.js +13 -0
  133. package/lib-es/components/ItemList/helpers/get-item-list-ids.js.map +1 -0
  134. package/lib-es/components/ItemList/helpers/index.js +6 -0
  135. package/lib-es/components/ItemList/helpers/index.js.map +1 -0
  136. package/lib-es/components/ItemList/helpers/set-item-list-id.js +10 -0
  137. package/lib-es/components/ItemList/helpers/set-item-list-id.js.map +1 -0
  138. package/lib-es/components/ItemList/helpers/set-param-and-redirect.js +20 -0
  139. package/lib-es/components/ItemList/helpers/set-param-and-redirect.js.map +1 -0
  140. package/lib-es/components/ItemList/hooks/index.js +2 -0
  141. package/lib-es/components/ItemList/hooks/index.js.map +1 -0
  142. package/lib-es/components/ItemList/hooks/use-item-list-id.js +26 -0
  143. package/lib-es/components/ItemList/hooks/use-item-list-id.js.map +1 -0
  144. package/lib-es/components/LazyImage/LazyImage.js +4 -1
  145. package/lib-es/components/LazyImage/LazyImage.js.map +1 -1
  146. package/lib-es/components/List/ListBuilder.js +12 -6
  147. package/lib-es/components/List/ListBuilder.js.map +1 -1
  148. package/lib-es/components/List/ListFactory.js +33 -9
  149. package/lib-es/components/List/ListFactory.js.map +1 -1
  150. package/lib-es/components/List/helpers/has-required-item-list-details.js +20 -0
  151. package/lib-es/components/List/helpers/has-required-item-list-details.js.map +1 -0
  152. package/lib-es/components/List/helpers/index.js +1 -0
  153. package/lib-es/components/List/helpers/index.js.map +1 -1
  154. package/lib-es/components/Menu/Menu.js +54 -46
  155. package/lib-es/components/Menu/Menu.js.map +1 -1
  156. package/lib-es/components/Menu/MenuContext.js +6 -0
  157. package/lib-es/components/Menu/MenuContext.js.map +1 -0
  158. package/lib-es/components/MenuItem/MenuItem.js +24 -9
  159. package/lib-es/components/MenuItem/MenuItem.js.map +1 -1
  160. package/lib-es/components/SearchContent/SearchContent.js +129 -0
  161. package/lib-es/components/SearchContent/SearchContent.js.map +1 -0
  162. package/lib-es/components/SearchContent/SearchContentItems.js +33 -0
  163. package/lib-es/components/SearchContent/SearchContentItems.js.map +1 -0
  164. package/lib-es/components/SearchContent/SearchContentResults.js +31 -0
  165. package/lib-es/components/SearchContent/SearchContentResults.js.map +1 -0
  166. package/lib-es/components/SearchContent/SearchContentToggleIcon.js +30 -0
  167. package/lib-es/components/SearchContent/SearchContentToggleIcon.js.map +1 -0
  168. package/lib-es/components/SearchContent/index.js +1 -205
  169. package/lib-es/components/SearchContent/index.js.map +1 -1
  170. package/lib-es/components/SearchFilter/SearchFilter/FiltersList.js +2 -4
  171. package/lib-es/components/SearchFilter/SearchFilter/FiltersList.js.map +1 -1
  172. package/lib-es/components/SearchFilter/SearchFilter/SearchFilter.js +10 -43
  173. package/lib-es/components/SearchFilter/SearchFilter/SearchFilter.js.map +1 -1
  174. package/lib-es/components/SearchFilter/SearchFilterContainer.js +70 -15
  175. package/lib-es/components/SearchFilter/SearchFilterContainer.js.map +1 -1
  176. package/lib-es/components/SearchFilter/components/Checkbox.js +18 -9
  177. package/lib-es/components/SearchFilter/components/Checkbox.js.map +1 -1
  178. package/lib-es/components/SearchFilter/components/Select.js +23 -8
  179. package/lib-es/components/SearchFilter/components/Select.js.map +1 -1
  180. package/lib-es/components/SearchFilter/components/TextSearch.js +1 -5
  181. package/lib-es/components/SearchFilter/components/TextSearch.js.map +1 -1
  182. package/lib-es/components/SearchFilter/helpers/build-filters-query.js +54 -0
  183. package/lib-es/components/SearchFilter/helpers/build-filters-query.js.map +1 -0
  184. package/lib-es/components/SearchFilter/helpers/build-query.js +1 -1
  185. package/lib-es/components/SearchFilter/helpers/build-query.js.map +1 -1
  186. package/lib-es/components/SearchFilter/helpers/build-raw-query-stringified.js +2 -1
  187. package/lib-es/components/SearchFilter/helpers/build-raw-query-stringified.js.map +1 -1
  188. package/lib-es/components/SearchFilter/helpers/get-initial-filter-values.js +13 -1
  189. package/lib-es/components/SearchFilter/helpers/get-initial-filter-values.js.map +1 -1
  190. package/lib-es/components/SearchFilter/helpers/index.js +2 -1
  191. package/lib-es/components/SearchFilter/helpers/index.js.map +1 -1
  192. package/lib-es/components/SearchFilter/helpers/parse-filter-value.js +3 -3
  193. package/lib-es/components/SearchFilter/helpers/parse-filter-value.js.map +1 -1
  194. package/lib-es/components/index.js +10 -1
  195. package/lib-es/components/index.js.map +1 -1
  196. package/lib-es/constants/index.js +2 -1
  197. package/lib-es/constants/index.js.map +1 -1
  198. package/lib-es/helpers/build-raw-query.js.map +1 -1
  199. package/lib-es/hooks/helpers/append-gtm-classname.js +1 -0
  200. package/lib-es/hooks/helpers/append-gtm-classname.js.map +1 -1
  201. package/package.json +5 -4
  202. package/src/application/query/index.js +51 -1
  203. package/src/components/Button.js +27 -5
  204. package/src/components/Card/CardContainer.js +2 -6
  205. package/src/components/Card/CardFactory.js +5 -3
  206. package/src/components/CarouselWrapper.js +2 -2
  207. package/src/components/Image/ImageRender.js +3 -0
  208. package/src/components/ItemList/ItemListButton/ItemListButton.js +94 -0
  209. package/src/components/ItemList/ItemListButton/index.js +3 -0
  210. package/src/components/ItemList/ItemListCounter/ItemListCounter.js +52 -0
  211. package/src/components/ItemList/ItemListCounter/index.js +3 -0
  212. package/src/components/ItemList/ItemListNew/ItemListNew.js +51 -0
  213. package/src/components/ItemList/ItemListNew/index.js +3 -0
  214. package/src/components/ItemList/constants.js +5 -0
  215. package/src/components/ItemList/helpers/get-item-list-data.js +6 -0
  216. package/src/components/ItemList/helpers/get-item-list-id.js +11 -0
  217. package/src/components/ItemList/helpers/get-item-list-ids.js +10 -0
  218. package/src/components/ItemList/helpers/index.js +5 -0
  219. package/src/components/ItemList/helpers/set-item-list-id.js +9 -0
  220. package/src/components/ItemList/helpers/set-param-and-redirect.js +20 -0
  221. package/src/components/ItemList/hooks/index.js +1 -0
  222. package/src/components/ItemList/hooks/use-item-list-id.js +27 -0
  223. package/src/components/LazyImage/LazyImage.js +11 -1
  224. package/src/components/List/ListBuilder.js +10 -5
  225. package/src/components/List/ListFactory.js +48 -12
  226. package/src/components/List/helpers/has-required-item-list-details.js +14 -0
  227. package/src/components/List/helpers/index.js +1 -0
  228. package/src/components/Menu/Menu.js +61 -54
  229. package/src/components/Menu/MenuContext.js +5 -0
  230. package/src/components/MenuItem/MenuItem.js +39 -14
  231. package/src/components/SearchContent/SearchContent.js +136 -0
  232. package/src/components/SearchContent/SearchContentItems.js +28 -0
  233. package/src/components/SearchContent/SearchContentResults.js +27 -0
  234. package/src/components/SearchContent/SearchContentToggleIcon.js +27 -0
  235. package/src/components/SearchContent/index.js +1 -217
  236. package/src/components/SearchFilter/SearchFilter/FiltersList.js +30 -37
  237. package/src/components/SearchFilter/SearchFilter/SearchFilter.js +10 -25
  238. package/src/components/SearchFilter/SearchFilterContainer.js +61 -16
  239. package/src/components/SearchFilter/components/Checkbox.js +23 -8
  240. package/src/components/SearchFilter/components/Select.js +18 -11
  241. package/src/components/SearchFilter/components/TextSearch.js +1 -3
  242. package/src/components/SearchFilter/helpers/build-filters-query.js +40 -0
  243. package/src/components/SearchFilter/helpers/build-query.js +3 -1
  244. package/src/components/SearchFilter/helpers/build-raw-query-stringified.js +2 -1
  245. package/src/components/SearchFilter/helpers/get-initial-filter-values.js +12 -1
  246. package/src/components/SearchFilter/helpers/index.js +3 -1
  247. package/src/components/SearchFilter/helpers/parse-filter-value.js +3 -3
  248. package/src/components/index.js +10 -1
  249. package/src/constants/index.js +2 -0
  250. package/src/helpers/build-raw-query.js +1 -0
  251. package/src/hooks/helpers/append-gtm-classname.js +3 -0
  252. package/tests/unit/src/components/Button.test.js +55 -1
  253. package/tests/unit/src/components/ItemList/ItemListButton.test.js +175 -0
  254. package/tests/unit/src/components/ItemList/ItemListCounter.test.js +65 -0
  255. package/tests/unit/src/components/ItemList/ItemListNew.test.js +164 -0
  256. package/tests/unit/src/components/ItemList/__snapshots__/ItemListButton.test.js.snap +107 -0
  257. package/tests/unit/src/components/ItemList/__snapshots__/ItemListCounter.test.js.snap +31 -0
  258. package/tests/unit/src/components/ItemList/__snapshots__/ItemListNew.test.js.snap +27 -0
  259. package/tests/unit/src/components/ItemList/helpers/get-item-list-data.test.js +28 -0
  260. package/tests/unit/src/components/ItemList/helpers/get-item-list-id.test.js +20 -0
  261. package/tests/unit/src/components/ItemList/helpers/get-item-list-ids.test.js +19 -0
  262. package/tests/unit/src/components/ItemList/helpers/set-item-list-id.test.js +13 -0
  263. package/tests/unit/src/components/ItemList/helpers/set-param-and-redirect.test.js +30 -0
  264. package/tests/unit/src/components/ItemList/hooks/use-item-list-id.test.js +32 -0
  265. package/tests/unit/src/components/List/helpers/has-required-item-list-details.test.js +30 -0
  266. package/tests/unit/src/components/Menu/Menu.test.js +9 -3
  267. package/tests/unit/src/components/Menu/__snapshots__/Menu.test.js.snap +12 -11
  268. package/tests/unit/src/components/MenuItem/MenuItem.test.js +1 -1
  269. package/tests/unit/src/components/MenuItem/SubMenu.test.js +5 -1
  270. package/tests/unit/src/components/MenuItem/__snapshots__/MenuItem.test.js.snap +54 -10
  271. package/tests/unit/src/components/SearchContent/SearchContent.test.js +29 -0
  272. package/tests/unit/src/components/SearchContent/__snapshots__/SearchContent.test.js.snap +9 -0
  273. package/tests/unit/src/components/SearchFilter/SearchFilter/SearchFilter.test.js +3 -6
  274. package/tests/unit/src/components/SearchFilter/components/__snapshots__/Checkbox.test.js.snap +2 -0
  275. package/tests/unit/src/components/SearchFilter/components/__snapshots__/Select.test.js.snap +4 -0
  276. package/tests/unit/src/components/SearchFilter/helpers/build-query.test.js +2 -2
  277. package/tests/unit/src/components/SearchFilter/helpers/get-initial-filter-values.test.js +25 -11
  278. package/tests/unit/src/components/SearchFilter/helpers/parse-filter-value.test.js +1 -1
  279. package/tests/unit/src/components/__snapshots__/index.test.js.snap +12 -0
@@ -4,10 +4,14 @@ import { parseUrl } from 'query-string';
4
4
  import PropTypes from 'prop-types';
5
5
  import { useRouter } from 'next/router';
6
6
  import { MainContext } from '@blaze-cms/nextjs-components';
7
- import { getSingleEntitySchema, generateSingleItemQuery } from '../../application/query';
7
+ import {
8
+ getSingleEntitySchema,
9
+ generateSingleItemQuery,
10
+ getItemList
11
+ } from '../../application/query';
8
12
  import ListBuilder from './ListBuilder';
9
13
  import { AZ_LIST_TYPE } from './constants';
10
- import { getAzQueryFilter, getSortProps } from './helpers';
14
+ import { getAzQueryFilter, getSortProps, hasRequiredItemListDetails } from './helpers';
11
15
  import {
12
16
  getGenericProps,
13
17
  getRequiredSchemas,
@@ -21,6 +25,7 @@ import {
21
25
  getInheritedFilters,
22
26
  getQueryProps
23
27
  } from '../../helpers';
28
+ import { getItemListId, getItemListIds } from '../ItemList/helpers';
24
29
  import { useGetEntitySchemasAsObj } from '../../hooks';
25
30
  import { AND_OPERATOR, TEXT_SEARCH, ID, AND, FULL } from '../../constants';
26
31
 
@@ -37,16 +42,18 @@ const ListFactory = props => {
37
42
  sort: defaultSort,
38
43
  searchFilter,
39
44
  operator: filterOperator,
40
- sortProperties
45
+ sortProperties,
46
+ itemListName
41
47
  } = props;
42
-
43
48
  const { isPreview } = useContext(MainContext);
44
49
  const router = useRouter();
45
50
  const { asPath } = router;
46
51
  const parsedQuery = asPath.replace(/%5D/g, ']').replace(/%5B/g, '[');
47
- const { query, url, query: { sort: querySort, sortby: querySortBy } = {} } = parseUrl(
48
- parsedQuery
49
- );
52
+ const {
53
+ query,
54
+ url,
55
+ query: { sort: querySort, sortby: querySortBy, itemListId: queryItemListId } = {}
56
+ } = parseUrl(parsedQuery);
50
57
  const { sortbyFilters, updatedSortProperties } = getSortProps({
51
58
  querySort,
52
59
  sortProperties,
@@ -55,6 +62,7 @@ const ListFactory = props => {
55
62
  defaultSortBy
56
63
  });
57
64
 
65
+ const itemListId = getItemListId(itemListName, queryItemListId);
58
66
  const { itemEntity, itemId } = parent;
59
67
  const itemEntityUpdated = getUnpublishedEntityName(itemEntity);
60
68
  const paginationIndex = getPaginationIndex(query, name);
@@ -98,13 +106,38 @@ const ListFactory = props => {
98
106
  variables: { id: itemId },
99
107
  skip: schemasLoading || (!inheritedFilters.length && queryProps === ID)
100
108
  });
101
- const errorsToCheck = [schemaError, schemasError, requiredSchemaError, itemQueryError];
109
+
110
+ const { data: itemListData = {}, error: itemListError, loading: itemListLoading } = useQuery(
111
+ getItemList,
112
+ {
113
+ variables: { id: itemListId },
114
+ skip: !itemListId
115
+ }
116
+ );
117
+
118
+ if (!hasRequiredItemListDetails({ itemListName, router, itemListId, queryItemListId })) return '';
119
+
120
+ const errorsToCheck = [
121
+ schemaError,
122
+ schemasError,
123
+ requiredSchemaError,
124
+ itemQueryError,
125
+ itemListError
126
+ ];
102
127
  const { hasErr, errMsg } = checkForError(errorsToCheck);
103
128
 
104
- if (requiredSchemaLoading || schemasLoading || schemaLoading || itemQueryLoading) return '';
129
+ if (
130
+ requiredSchemaLoading ||
131
+ schemasLoading ||
132
+ schemaLoading ||
133
+ itemQueryLoading ||
134
+ itemListLoading
135
+ )
136
+ return '';
105
137
  if (hasErr) return errMsg;
106
138
  if (!entitySchema) return null;
107
139
 
140
+ const itemListIds = getItemListIds(itemListData);
108
141
  const isCard = type !== FULL;
109
142
  const isAZ = type === AZ_LIST_TYPE;
110
143
  const genericProps = getGenericProps(props);
@@ -147,7 +180,8 @@ const ListFactory = props => {
147
180
  paginationIndex,
148
181
  entityData,
149
182
  inheritedFilters,
150
- filterOperator
183
+ filterOperator,
184
+ itemListIds
151
185
  };
152
186
 
153
187
  return <ListBuilder {...listProps} />;
@@ -165,7 +199,8 @@ ListFactory.propTypes = {
165
199
  sortby: PropTypes.array,
166
200
  sort: PropTypes.string,
167
201
  searchFilter: PropTypes.object,
168
- sortProperties: PropTypes.array
202
+ sortProperties: PropTypes.array,
203
+ itemListName: PropTypes.string
169
204
  };
170
205
 
171
206
  ListFactory.defaultProps = {
@@ -177,7 +212,8 @@ ListFactory.defaultProps = {
177
212
  sortProperties: [],
178
213
  sort: '',
179
214
  operator: AND,
180
- searchFilter: {}
215
+ searchFilter: {},
216
+ itemListName: ''
181
217
  };
182
218
 
183
219
  export default ListFactory;
@@ -0,0 +1,14 @@
1
+ import { setParamAndRedirect } from '../../ItemList/helpers';
2
+
3
+ const hasRequiredItemListDetails = ({ itemListName, router, itemListId, queryItemListId }) => {
4
+ if (!itemListName) return true;
5
+
6
+ if (!queryItemListId && itemListId) {
7
+ setParamAndRedirect(router, itemListId);
8
+ return false;
9
+ }
10
+
11
+ return !!queryItemListId;
12
+ };
13
+
14
+ export default hasRequiredItemListDetails;
@@ -5,3 +5,4 @@ export { default as buildAzUrl } from './build-az-url';
5
5
  export { default as sortAggs } from './sort-aggs';
6
6
  export { default as getItemsPerPageToUse } from './get-items-per-page-to-use';
7
7
  export { default as getSortProps } from './get-sort-props';
8
+ export { default as hasRequiredItemListDetails } from './has-required-item-list-details';
@@ -1,9 +1,11 @@
1
- import React, { useState } from 'react';
1
+ import React, { useState, useEffect } from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import BlazeButton from '@blaze-react/button';
4
+ import classnames from 'classnames';
5
+ import { useRouter } from 'next/router';
4
6
  import { MdMenu, MdClose } from 'react-icons/md';
5
- import { useCheckMobileScreen } from '../../hooks';
6
- import { HIDDEN } from '../../constants';
7
+ import { Link } from '@blaze-cms/nextjs-components';
8
+ import MenuContext from './MenuContext';
7
9
 
8
10
  const Menu = ({
9
11
  children,
@@ -21,65 +23,68 @@ const Menu = ({
21
23
  logoOnMobileModifier,
22
24
  logoOnDesktopModifier,
23
25
  logoOnDesktopAlignment,
24
- closeIconModifier,
25
- ...rest
26
+ closeIconModifier
26
27
  }) => {
27
- const isMobile = useCheckMobileScreen();
28
+ const router = useRouter();
28
29
  const [showMobileMenu, setShowMobileMenu] = useState(false);
29
30
 
30
- const shouldDisplayCollapsed = collapse && isMobile;
31
- const mobileButtonClass = shouldDisplayCollapsed && isMobile ? mobileButtonModifier : HIDDEN;
32
- const shouldDisplayChildren = shouldDisplayCollapsed ? showMobileMenu : true;
33
- const childrenDesktopModifier =
34
- shouldDisplayChildren && !isMobile ? modifier : `${modifier} ${HIDDEN}`;
31
+ useEffect(
32
+ () => {
33
+ const handleRouteChange = () => setShowMobileMenu(false);
34
+ router.events.on('routeChangeStart', handleRouteChange);
35
35
 
36
- const childrenMobileModifier =
37
- shouldDisplayChildren && isMobile ? `${mobileMenuChildrenModifier}` : ` ${HIDDEN}`;
36
+ return () => {
37
+ router.events.off('routeChangeStart', handleRouteChange);
38
+ };
39
+ },
40
+ [router.events]
41
+ );
42
+
43
+ const shouldDisplayChildren = collapse ? showMobileMenu : true;
44
+
45
+ const childModifiers = classnames({
46
+ [mobileMenuChildrenModifier]: shouldDisplayChildren,
47
+ [modifier]: !showMobileMenu
48
+ });
38
49
 
39
50
  const isMobileMenuExpanded = showMobileMenu ? `${mobileMenuModifier}` : '';
51
+ const menuWrapperClasses = classnames('menu--wrapper', {
52
+ 'menu--wrapper--mobile-open': showMobileMenu,
53
+ 'menu--wrapper--mobile-closed': collapse && !showMobileMenu
54
+ });
40
55
 
41
56
  return (
42
- <>
43
- {collapse && (
44
- <div className="menu--mobile-wrapper">
45
- <div
46
- className={`flex w-screen z-50 justify-${mobileIconAlignment} ${isMobileMenuExpanded}`}>
47
- <BlazeButton
48
- className={mobileButtonClass}
49
- onClick={() => setShowMobileMenu(!showMobileMenu)}>
50
- <i>
51
- {showMobileMenu ? (
52
- <MdClose className={closeIconModifier} />
53
- ) : (
54
- <MdMenu className={hamburgerIconModifier} />
55
- )}
56
- </i>
57
- </BlazeButton>
57
+ <MenuContext.Provider value={{ showMobileMenu }}>
58
+ <div className={menuWrapperClasses}>
59
+ {collapse && (
60
+ <div className="menu--mobile-wrapper">
61
+ <div
62
+ className={`flex w-screen z-50 justify-${mobileIconAlignment} ${isMobileMenuExpanded}`}>
63
+ <BlazeButton
64
+ className={`menu--mobile-button ${mobileButtonModifier}`}
65
+ onClick={() => setShowMobileMenu(!showMobileMenu)}>
66
+ <i>
67
+ {showMobileMenu ? (
68
+ <MdClose className={closeIconModifier} />
69
+ ) : (
70
+ <MdMenu className={hamburgerIconModifier} />
71
+ )}
72
+ </i>
73
+ </BlazeButton>
74
+ </div>
58
75
  </div>
59
- </div>
60
- )}
61
- {logoOnMobile && (
62
- <a href="/">
63
- <img src={logoOnMobileUrl} alt={logoOnMobileAlt} className={logoOnMobileModifier} />
64
- </a>
65
- )}
76
+ )}
77
+ {logoOnMobile &&
78
+ !showMobileMenu && (
79
+ <Link href="/">
80
+ <img src={logoOnMobileUrl} alt={logoOnMobileAlt} className={logoOnMobileModifier} />
81
+ </Link>
82
+ )}
66
83
 
67
- <div className="menu--desktop-wrapper">
68
- <ul className={isMobile ? childrenMobileModifier : childrenDesktopModifier}>
69
- {logoOnDesktop &&
70
- logoOnDesktopAlignment === 'left' && (
71
- <a href="/" className="menu--desktop__logo-wrapper">
72
- <img
73
- src={logoOnMobileUrl}
74
- alt={logoOnMobileAlt}
75
- className={logoOnDesktopModifier}
76
- />
77
- </a>
78
- )}
79
- {children}
80
- {logoOnDesktop &&
81
- logoOnDesktopAlignment === 'right' && (
82
- <a href="/" className="menu--desktop__logo-wrapper">
84
+ <div className="menu--desktop-wrapper">
85
+ <ul className={childModifiers}>
86
+ {logoOnDesktop && (
87
+ <a href="/" className="">
83
88
  <img
84
89
  src={logoOnMobileUrl}
85
90
  alt={logoOnMobileAlt}
@@ -87,9 +92,11 @@ const Menu = ({
87
92
  />
88
93
  </a>
89
94
  )}
90
- </ul>
95
+ {children}
96
+ </ul>
97
+ </div>
91
98
  </div>
92
- </>
99
+ </MenuContext.Provider>
93
100
  );
94
101
  };
95
102
 
@@ -0,0 +1,5 @@
1
+ import React from 'react';
2
+
3
+ const MenuContext = React.createContext({ showMobileMenu: false });
4
+
5
+ export default MenuContext;
@@ -1,35 +1,60 @@
1
- import React, { useState } from 'react';
1
+ import React, { useState, useContext, useEffect } from 'react';
2
2
  import PropTypes from 'prop-types';
3
- import { HOVER, MOUSE_ENTER, MOUSE_LEAVE, CLICK, HIDDEN } from '../../constants';
3
+ import { FaChevronDown, FaChevronUp } from 'react-icons/fa';
4
+ import { HOVER, MOUSE_ENTER, MOUSE_LEAVE, HIDDEN } from '../../constants';
4
5
  import { hasChildren } from '../../helpers';
5
6
  import BlazeLink from '../BlazeLink';
7
+ import MenuContext from '../Menu/MenuContext';
6
8
 
7
9
  const MenuItem = ({ children, eventType, text, modifier, url }) => {
8
10
  const [displayChildren, setDisplayChildren] = useState(false);
11
+ const { showMobileMenu } = useContext(MenuContext);
12
+
13
+ useEffect(
14
+ () => {
15
+ if (!showMobileMenu) setDisplayChildren(false);
16
+ },
17
+ [showMobileMenu]
18
+ );
19
+
9
20
  const isHoverEvent = eventType === HOVER;
10
21
  const childrenDisplayClass = displayChildren ? '' : HIDDEN;
11
22
 
12
23
  const handleItemEvent = ({ type }) => {
13
24
  if (isHoverEvent) {
14
- if (type === MOUSE_ENTER) setDisplayChildren(true);
15
- if (type === MOUSE_LEAVE) setDisplayChildren(false);
16
- }
17
- if (type === CLICK && eventType === CLICK && !url) {
18
- setDisplayChildren(!displayChildren);
25
+ if (type === MOUSE_ENTER) {
26
+ setDisplayChildren(true);
27
+ }
28
+ if (type === MOUSE_LEAVE) {
29
+ setDisplayChildren(false);
30
+ }
19
31
  }
20
32
  };
21
33
  const hasValidChildren = hasChildren(children);
22
34
 
23
35
  return (
24
36
  <li className={modifier} onMouseEnter={handleItemEvent} onMouseLeave={handleItemEvent}>
25
- {url ? (
26
- <BlazeLink href={url}>{text}</BlazeLink>
27
- ) : (
28
- <span role="button" onClick={handleItemEvent}>
29
- {text}
30
- </span>
37
+ <div className="menu--item--link">
38
+ {url ? (
39
+ <BlazeLink href={url}>{text}</BlazeLink>
40
+ ) : (
41
+ <span role="button" onClick={handleItemEvent}>
42
+ {text}
43
+ </span>
44
+ )}
45
+ {hasValidChildren && (
46
+ <i
47
+ role="button"
48
+ className="menu--item--link--icon"
49
+ onClick={() => setDisplayChildren(!displayChildren)}>
50
+ {displayChildren ? <FaChevronUp /> : <FaChevronDown />}
51
+ </i>
52
+ )}
53
+ </div>
54
+
55
+ {hasValidChildren && (
56
+ <div className={`menu--item-children ${childrenDisplayClass}`}>{children}</div>
31
57
  )}
32
- {hasValidChildren && <div className={childrenDisplayClass}>{children}</div>}
33
58
  </li>
34
59
  );
35
60
  };
@@ -0,0 +1,136 @@
1
+ import React, { useState, useEffect } from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { useRouter } from 'next/router';
4
+ import { useDebounceSearch } from '@blaze-cms/plugin-search-ui';
5
+ import SearchContentResults from './SearchContentResults';
6
+ import SearchContentToggleIcon from './SearchContentToggleIcon';
7
+
8
+ const SearchContent = ({
9
+ entities,
10
+ searchInputAlignment,
11
+ searchInputWrapperMobile,
12
+ searchInputWrapperDesktop,
13
+ collapsible,
14
+ isMobile,
15
+ placeholder,
16
+ modifier
17
+ }) => {
18
+ const [collapsed, setCollapsed] = useState(collapsible);
19
+ const router = useRouter();
20
+
21
+ const { results, searchTerm, setSearchTerm, debouncedSearchTerm } = useDebounceSearch({
22
+ entities,
23
+ initialSearchTerm: '',
24
+ resultKeys: 'id, name, image { url }, url'
25
+ });
26
+
27
+ useEffect(
28
+ () => {
29
+ const handleRouteChange = () => setSearchTerm('');
30
+ router.events.on('routeChangeStart', handleRouteChange);
31
+
32
+ return () => {
33
+ router.events.off('routeChangeStart', handleRouteChange);
34
+ };
35
+ },
36
+ [router.events, setSearchTerm]
37
+ );
38
+
39
+ const responsiveClasses = isMobile ? searchInputWrapperMobile : searchInputWrapperDesktop;
40
+
41
+ const handleClick = (e, url) => {
42
+ e.preventDefault();
43
+ router.push(url);
44
+ };
45
+
46
+ const handleKeyPress = e => {
47
+ if (e.key === 'Enter' && e.target.value !== '') {
48
+ router.push(`/search?search_term=${e.target.value}`);
49
+ }
50
+ };
51
+
52
+ const handleOnBlur = () => {
53
+ if (!collapsible) return;
54
+ if (!debouncedSearchTerm || debouncedSearchTerm === '') setCollapsed(true);
55
+ };
56
+
57
+ const handleClearSearchResults = () => {
58
+ setSearchTerm('');
59
+ };
60
+
61
+ const className = ['search-content', modifier, responsiveClasses].filter(Boolean).join(' ');
62
+ return collapsed ? (
63
+ <div className={className}>
64
+ <div className="search-content--collapse__wrapper">
65
+ <label className="search-content--collapse__label">
66
+ <span className="search-content--collapse__icon_wrapper">
67
+ <svg className="search-content--collapse__icon" viewBox="0 0 20 20">
68
+ <path
69
+ fillRule="evenodd"
70
+ d="M8 4a4 4 0 100 8 4 4 0 000-8zM2 8a6 6 0 1110.89 3.476l4.817 4.817a1 1 0 01-1.414 1.414l-4.816-4.816A6 6 0 012 8z"
71
+ clipRule="evenodd"
72
+ />
73
+ </svg>
74
+ </span>
75
+ <input
76
+ onFocus={() => setCollapsed(false)}
77
+ onChange={e => setSearchTerm(e.target.value)}
78
+ type="text"
79
+ name="search"
80
+ className="search-content--collapse__input"
81
+ />
82
+ </label>
83
+ </div>
84
+ </div>
85
+ ) : (
86
+ <>
87
+ <div className={className}>
88
+ <div className="search-content--expanded__wrapper">
89
+ <label className="search-content--expanded__label">
90
+ <span className="search-content--expanded__icon_wrapper">
91
+ <SearchContentToggleIcon results={results} onClear={handleClearSearchResults} />
92
+ </span>
93
+ <input
94
+ type="text"
95
+ name="search"
96
+ onChange={e => setSearchTerm(e.target.value)}
97
+ onKeyPress={handleKeyPress}
98
+ className="search-content--expanded__input"
99
+ placeholder={placeholder}
100
+ value={searchTerm}
101
+ onBlur={handleOnBlur}
102
+ />
103
+ </label>
104
+ </div>
105
+ <SearchContentResults
106
+ results={results}
107
+ debouncedSearchTerm={debouncedSearchTerm}
108
+ handleClick={handleClick}
109
+ />
110
+ </div>
111
+ </>
112
+ );
113
+ };
114
+
115
+ SearchContent.propTypes = {
116
+ searchInputAlignment: PropTypes.string,
117
+ searchInputWrapperMobile: PropTypes.string,
118
+ searchInputWrapperDesktop: PropTypes.string,
119
+ placeholder: PropTypes.string,
120
+ isMobile: PropTypes.bool,
121
+ collapsible: PropTypes.bool,
122
+ entities: PropTypes.array.isRequired,
123
+ modifier: PropTypes.string
124
+ };
125
+
126
+ SearchContent.defaultProps = {
127
+ searchInputAlignment: '',
128
+ searchInputWrapperMobile: '',
129
+ searchInputWrapperDesktop: '',
130
+ placeholder: '',
131
+ isMobile: false,
132
+ collapsible: false,
133
+ modifier: ''
134
+ };
135
+
136
+ export default SearchContent;
@@ -0,0 +1,28 @@
1
+ import React from 'react';
2
+ import BlazeLink from '../BlazeLink';
3
+ import LazyImage from '../LazyImage';
4
+
5
+ const SearchContentItems = ({ results = [], onClick }) =>
6
+ results.map(item => {
7
+ if (!item.url) return null;
8
+
9
+ const { id, name, image, url } = item;
10
+
11
+ return (
12
+ <BlazeLink href={url} onClick={onClick} key={id}>
13
+ <div className="search-content--results__wrapper">
14
+ {image?.url ? (
15
+ <LazyImage
16
+ src={image.url}
17
+ alt={name}
18
+ className="search-content--results__image"
19
+ sizeKey="search-result"
20
+ />
21
+ ) : null}
22
+ <span className="search-content--results__title">{name}</span>
23
+ </div>
24
+ </BlazeLink>
25
+ );
26
+ });
27
+
28
+ export default SearchContentItems;
@@ -0,0 +1,27 @@
1
+ import React from 'react';
2
+ import BlazeLink from '../BlazeLink';
3
+ import SearchContentItems from './SearchContentItems';
4
+
5
+ const SearchContentResults = ({ results, debouncedSearchTerm, onClick }) => {
6
+ if (debouncedSearchTerm !== '') {
7
+ return (
8
+ <div className="search-content--results__wrapper">
9
+ <div className="search-content--results__wrapper--message">
10
+ <div className="search-content--results__content">
11
+ {results.length === 0 && (
12
+ <div className="search-content--results__message">
13
+ <BlazeLink href={`/search?search_term=${debouncedSearchTerm}`}>
14
+ {`Search all results for: ${debouncedSearchTerm}`}
15
+ </BlazeLink>
16
+ </div>
17
+ )}
18
+ {results.length > 0 && <SearchContentItems results={results} onClick={onClick} />}
19
+ </div>
20
+ </div>
21
+ </div>
22
+ );
23
+ }
24
+ return null;
25
+ };
26
+
27
+ export default SearchContentResults;
@@ -0,0 +1,27 @@
1
+ import React from 'react';
2
+
3
+ const SearchContentToggleIcon = ({ results, onClear }) => {
4
+ if (results && results.length > 0) {
5
+ return (
6
+ <svg className="search-content--expanded__icon" viewBox="0 0 20 20" onClick={onClear}>
7
+ <path
8
+ fillRule="evenodd"
9
+ d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z"
10
+ clipRule="evenodd"
11
+ />
12
+ </svg>
13
+ );
14
+ }
15
+
16
+ return (
17
+ <svg className="search-content--expanded__icon" viewBox="0 0 20 20">
18
+ <path
19
+ fillRule="evenodd"
20
+ d="M8 4a4 4 0 100 8 4 4 0 000-8zM2 8a6 6 0 1110.89 3.476l4.817 4.817a1 1 0 01-1.414 1.414l-4.816-4.816A6 6 0 012 8z"
21
+ clipRule="evenodd"
22
+ />
23
+ </svg>
24
+ );
25
+ };
26
+
27
+ export default SearchContentToggleIcon;