@blaze-cms/react-page-builder 0.131.0 → 0.132.0-admin-updates.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 (229) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/lib/components/Button.js +2 -1
  3. package/lib/components/Button.js.map +1 -1
  4. package/lib/components/Card/CardsRender.js +13 -6
  5. package/lib/components/Card/CardsRender.js.map +1 -1
  6. package/lib/components/Card/helpers/get-updated-items-to-display.js +55 -0
  7. package/lib/components/Card/helpers/get-updated-items-to-display.js.map +1 -0
  8. package/lib/components/Card/helpers/index.js +7 -0
  9. package/lib/components/Card/helpers/index.js.map +1 -1
  10. package/lib/components/CarouselWrapper/SmoothScrollCarousel.js +2 -2
  11. package/lib/components/CarouselWrapper/SmoothScrollCarousel.js.map +1 -1
  12. package/lib/components/Code/Code.js +7 -3
  13. package/lib/components/Code/Code.js.map +1 -1
  14. package/lib/components/DataSummary/helpers/build-loop-props-content.js +6 -3
  15. package/lib/components/DataSummary/helpers/build-loop-props-content.js.map +1 -1
  16. package/lib/components/DataSummary/helpers/build-props-to-display-with-content.js +3 -2
  17. package/lib/components/DataSummary/helpers/build-props-to-display-with-content.js.map +1 -1
  18. package/lib/components/DataSummary/helpers/get-link-to-published-content.js +2 -0
  19. package/lib/components/DataSummary/helpers/get-link-to-published-content.js.map +1 -1
  20. package/lib/components/List/ListFactory.js +16 -11
  21. package/lib/components/List/ListFactory.js.map +1 -1
  22. package/lib/components/List/helpers/get-list-query.js +43 -0
  23. package/lib/components/List/helpers/get-list-query.js.map +1 -0
  24. package/lib/components/List/helpers/get-list-specific-search-filter.js +21 -0
  25. package/lib/components/List/helpers/get-list-specific-search-filter.js.map +1 -0
  26. package/lib/components/List/helpers/index.js +14 -0
  27. package/lib/components/List/helpers/index.js.map +1 -1
  28. package/lib/components/List/helpers/strip-query-key.js +14 -0
  29. package/lib/components/List/helpers/strip-query-key.js.map +1 -0
  30. package/lib/components/SearchContent/SearchContent.js +8 -8
  31. package/lib/components/SearchContent/SearchContent.js.map +1 -1
  32. package/lib/components/SearchFilter/SearchFilter/SearchFilter.js +17 -13
  33. package/lib/components/SearchFilter/SearchFilter/SearchFilter.js.map +1 -1
  34. package/lib/components/SearchFilter/SearchFilterContainer.js +64 -83
  35. package/lib/components/SearchFilter/SearchFilterContainer.js.map +1 -1
  36. package/lib/components/SearchFilter/helpers/build-filters-query.js +3 -1
  37. package/lib/components/SearchFilter/helpers/build-filters-query.js.map +1 -1
  38. package/lib/components/SearchFilter/helpers/build-new-url.js +17 -0
  39. package/lib/components/SearchFilter/helpers/build-new-url.js.map +1 -0
  40. package/lib/components/SearchFilter/helpers/build-url-query.js +49 -0
  41. package/lib/components/SearchFilter/helpers/build-url-query.js.map +1 -0
  42. package/lib/components/SearchFilter/helpers/get-filter-ranges-and-checkboxes-values.js +32 -0
  43. package/lib/components/SearchFilter/helpers/get-filter-ranges-and-checkboxes-values.js.map +1 -0
  44. package/lib/components/SearchFilter/helpers/get-filter-values.js +31 -0
  45. package/lib/components/SearchFilter/helpers/get-filter-values.js.map +1 -0
  46. package/lib/components/SearchFilter/helpers/index.js +18 -11
  47. package/lib/components/SearchFilter/helpers/index.js.map +1 -1
  48. package/lib/components/SearchFilter/index.js.map +1 -1
  49. package/lib/components/SearchFilter/searchFilterReducer.js +43 -0
  50. package/lib/components/SearchFilter/searchFilterReducer.js.map +1 -0
  51. package/lib/components/SearchFilterSort/SearchFilterSort.js +31 -11
  52. package/lib/components/SearchFilterSort/SearchFilterSort.js.map +1 -1
  53. package/lib/components/SearchFilterSort/helpers/handle-sort-update.js +19 -5
  54. package/lib/components/SearchFilterSort/helpers/handle-sort-update.js.map +1 -1
  55. package/lib/components/SearchFilterSort/helpers/update-sort.js +9 -5
  56. package/lib/components/SearchFilterSort/helpers/update-sort.js.map +1 -1
  57. package/lib/helpers/build-inherited-filters.js +2 -0
  58. package/lib/helpers/build-inherited-filters.js.map +1 -1
  59. package/lib/helpers/build-props-query.js +5 -2
  60. package/lib/helpers/build-props-query.js.map +1 -1
  61. package/lib/helpers/build-query-key.js +16 -0
  62. package/lib/helpers/build-query-key.js.map +1 -0
  63. package/lib/helpers/build-set-filters.js +5 -1
  64. package/lib/helpers/build-set-filters.js.map +1 -1
  65. package/lib/helpers/get-entities-with-banner.js +8 -2
  66. package/lib/helpers/get-entities-with-banner.js.map +1 -1
  67. package/lib/helpers/get-query-filters.js +6 -8
  68. package/lib/helpers/get-query-filters.js.map +1 -1
  69. package/lib/helpers/get-query-props.js +13 -2
  70. package/lib/helpers/get-query-props.js.map +1 -1
  71. package/lib/helpers/get-wrapped-value-with-link.js +2 -3
  72. package/lib/helpers/get-wrapped-value-with-link.js.map +1 -1
  73. package/lib/helpers/index.js +14 -0
  74. package/lib/helpers/index.js.map +1 -1
  75. package/lib/helpers/parse-props-to-display.js +13 -8
  76. package/lib/helpers/parse-props-to-display.js.map +1 -1
  77. package/lib/helpers/process-data-summary-value.js +56 -0
  78. package/lib/helpers/process-data-summary-value.js.map +1 -0
  79. package/lib-es/components/Button.js +2 -1
  80. package/lib-es/components/Button.js.map +1 -1
  81. package/lib-es/components/Card/CardsRender.js +14 -7
  82. package/lib-es/components/Card/CardsRender.js.map +1 -1
  83. package/lib-es/components/Card/helpers/get-updated-items-to-display.js +32 -0
  84. package/lib-es/components/Card/helpers/get-updated-items-to-display.js.map +1 -0
  85. package/lib-es/components/Card/helpers/index.js +1 -0
  86. package/lib-es/components/Card/helpers/index.js.map +1 -1
  87. package/lib-es/components/CarouselWrapper/SmoothScrollCarousel.js +2 -2
  88. package/lib-es/components/CarouselWrapper/SmoothScrollCarousel.js.map +1 -1
  89. package/lib-es/components/Code/Code.js +8 -4
  90. package/lib-es/components/Code/Code.js.map +1 -1
  91. package/lib-es/components/DataSummary/helpers/build-loop-props-content.js +6 -3
  92. package/lib-es/components/DataSummary/helpers/build-loop-props-content.js.map +1 -1
  93. package/lib-es/components/DataSummary/helpers/build-props-to-display-with-content.js +4 -3
  94. package/lib-es/components/DataSummary/helpers/build-props-to-display-with-content.js.map +1 -1
  95. package/lib-es/components/DataSummary/helpers/get-link-to-published-content.js +2 -1
  96. package/lib-es/components/DataSummary/helpers/get-link-to-published-content.js.map +1 -1
  97. package/lib-es/components/List/ListFactory.js +16 -12
  98. package/lib-es/components/List/ListFactory.js.map +1 -1
  99. package/lib-es/components/List/helpers/get-list-query.js +24 -0
  100. package/lib-es/components/List/helpers/get-list-query.js.map +1 -0
  101. package/lib-es/components/List/helpers/get-list-specific-search-filter.js +12 -0
  102. package/lib-es/components/List/helpers/get-list-specific-search-filter.js.map +1 -0
  103. package/lib-es/components/List/helpers/index.js +2 -0
  104. package/lib-es/components/List/helpers/index.js.map +1 -1
  105. package/lib-es/components/List/helpers/strip-query-key.js +6 -0
  106. package/lib-es/components/List/helpers/strip-query-key.js.map +1 -0
  107. package/lib-es/components/SearchContent/SearchContent.js +8 -8
  108. package/lib-es/components/SearchContent/SearchContent.js.map +1 -1
  109. package/lib-es/components/SearchFilter/SearchFilter/SearchFilter.js +18 -13
  110. package/lib-es/components/SearchFilter/SearchFilter/SearchFilter.js.map +1 -1
  111. package/lib-es/components/SearchFilter/SearchFilterContainer.js +48 -70
  112. package/lib-es/components/SearchFilter/SearchFilterContainer.js.map +1 -1
  113. package/lib-es/components/SearchFilter/helpers/build-filters-query.js +2 -0
  114. package/lib-es/components/SearchFilter/helpers/build-filters-query.js.map +1 -1
  115. package/lib-es/components/SearchFilter/helpers/build-new-url.js +8 -0
  116. package/lib-es/components/SearchFilter/helpers/build-new-url.js.map +1 -0
  117. package/lib-es/components/SearchFilter/helpers/build-url-query.js +31 -0
  118. package/lib-es/components/SearchFilter/helpers/build-url-query.js.map +1 -0
  119. package/lib-es/components/SearchFilter/helpers/get-filter-ranges-and-checkboxes-values.js +18 -0
  120. package/lib-es/components/SearchFilter/helpers/get-filter-ranges-and-checkboxes-values.js.map +1 -0
  121. package/lib-es/components/SearchFilter/helpers/get-filter-values.js +19 -0
  122. package/lib-es/components/SearchFilter/helpers/get-filter-values.js.map +1 -0
  123. package/lib-es/components/SearchFilter/helpers/index.js +5 -4
  124. package/lib-es/components/SearchFilter/helpers/index.js.map +1 -1
  125. package/lib-es/components/SearchFilter/index.js +2 -2
  126. package/lib-es/components/SearchFilter/index.js.map +1 -1
  127. package/lib-es/components/SearchFilter/searchFilterReducer.js +26 -0
  128. package/lib-es/components/SearchFilter/searchFilterReducer.js.map +1 -0
  129. package/lib-es/components/SearchFilterSort/SearchFilterSort.js +26 -10
  130. package/lib-es/components/SearchFilterSort/SearchFilterSort.js.map +1 -1
  131. package/lib-es/components/SearchFilterSort/helpers/handle-sort-update.js +21 -4
  132. package/lib-es/components/SearchFilterSort/helpers/handle-sort-update.js.map +1 -1
  133. package/lib-es/components/SearchFilterSort/helpers/update-sort.js +8 -4
  134. package/lib-es/components/SearchFilterSort/helpers/update-sort.js.map +1 -1
  135. package/lib-es/helpers/build-inherited-filters.js +2 -0
  136. package/lib-es/helpers/build-inherited-filters.js.map +1 -1
  137. package/lib-es/helpers/build-props-query.js +4 -2
  138. package/lib-es/helpers/build-props-query.js.map +1 -1
  139. package/lib-es/helpers/build-query-key.js +7 -0
  140. package/lib-es/helpers/build-query-key.js.map +1 -0
  141. package/lib-es/helpers/build-set-filters.js +5 -1
  142. package/lib-es/helpers/build-set-filters.js.map +1 -1
  143. package/lib-es/helpers/get-entities-with-banner.js +9 -2
  144. package/lib-es/helpers/get-entities-with-banner.js.map +1 -1
  145. package/lib-es/helpers/get-query-filters.js +6 -8
  146. package/lib-es/helpers/get-query-filters.js.map +1 -1
  147. package/lib-es/helpers/get-query-props.js +10 -2
  148. package/lib-es/helpers/get-query-props.js.map +1 -1
  149. package/lib-es/helpers/get-wrapped-value-with-link.js +2 -2
  150. package/lib-es/helpers/get-wrapped-value-with-link.js.map +1 -1
  151. package/lib-es/helpers/index.js +2 -0
  152. package/lib-es/helpers/index.js.map +1 -1
  153. package/lib-es/helpers/parse-props-to-display.js +12 -9
  154. package/lib-es/helpers/parse-props-to-display.js.map +1 -1
  155. package/lib-es/helpers/process-data-summary-value.js +36 -0
  156. package/lib-es/helpers/process-data-summary-value.js.map +1 -0
  157. package/package.json +10 -10
  158. package/src/components/Button.js +2 -1
  159. package/src/components/Card/CardsRender.js +27 -7
  160. package/src/components/Card/helpers/get-updated-items-to-display.js +32 -0
  161. package/src/components/Card/helpers/index.js +1 -0
  162. package/src/components/CarouselWrapper/SmoothScrollCarousel.js +2 -2
  163. package/src/components/Code/Code.js +7 -3
  164. package/src/components/DataSummary/helpers/build-loop-props-content.js +7 -3
  165. package/src/components/DataSummary/helpers/build-props-to-display-with-content.js +6 -3
  166. package/src/components/DataSummary/helpers/get-link-to-published-content.js +4 -1
  167. package/src/components/List/ListFactory.js +25 -15
  168. package/src/components/List/helpers/get-list-query.js +28 -0
  169. package/src/components/List/helpers/get-list-specific-search-filter.js +10 -0
  170. package/src/components/List/helpers/index.js +2 -0
  171. package/src/components/List/helpers/strip-query-key.js +6 -0
  172. package/src/components/SearchContent/SearchContent.js +8 -8
  173. package/src/components/SearchFilter/SearchFilter/SearchFilter.js +21 -18
  174. package/src/components/SearchFilter/SearchFilterContainer.js +59 -67
  175. package/src/components/SearchFilter/helpers/build-filters-query.js +9 -1
  176. package/src/components/SearchFilter/helpers/build-new-url.js +8 -0
  177. package/src/components/SearchFilter/helpers/build-url-query.js +33 -0
  178. package/src/components/SearchFilter/helpers/get-filter-ranges-and-checkboxes-values.js +17 -0
  179. package/src/components/SearchFilter/helpers/get-filter-values.js +21 -0
  180. package/src/components/SearchFilter/helpers/index.js +9 -7
  181. package/src/components/SearchFilter/index.js +2 -2
  182. package/src/components/SearchFilter/searchFilterReducer.js +15 -0
  183. package/src/components/SearchFilterSort/SearchFilterSort.js +18 -8
  184. package/src/components/SearchFilterSort/helpers/handle-sort-update.js +14 -5
  185. package/src/components/SearchFilterSort/helpers/update-sort.js +7 -3
  186. package/src/helpers/build-inherited-filters.js +3 -1
  187. package/src/helpers/build-props-query.js +4 -2
  188. package/src/helpers/build-query-key.js +7 -0
  189. package/src/helpers/build-set-filters.js +2 -1
  190. package/src/helpers/get-entities-with-banner.js +3 -2
  191. package/src/helpers/get-query-filters.js +4 -4
  192. package/src/helpers/get-query-props.js +12 -4
  193. package/src/helpers/get-wrapped-value-with-link.js +6 -3
  194. package/src/helpers/index.js +2 -0
  195. package/src/helpers/parse-props-to-display.js +25 -21
  196. package/src/helpers/process-data-summary-value.js +22 -0
  197. package/tests/helpers/mocks.js +3 -5
  198. package/tests/unit/src/components/Card/helpers/get-updated-items-to-display.test.js +72 -0
  199. package/tests/unit/src/components/Code/Code.test.js +5 -0
  200. package/tests/unit/src/components/Code/__snapshots__/Code.test.js.snap +8 -0
  201. package/tests/unit/src/components/DataSummary/helpers/build-loop-props-content.test.js +50 -0
  202. package/tests/unit/src/components/DataSummary/helpers/get-link-to-published-content.test.js +21 -0
  203. package/tests/unit/src/components/SearchFilter/__snapshots__/SearchFilterContainer.test.js.snap +1 -7
  204. package/tests/unit/src/components/SearchFilter/helpers/build-new-query.test.js +10 -10
  205. package/tests/unit/src/components/SearchFilter/helpers/build-query.test.js +24 -7
  206. package/tests/unit/src/components/SearchFilter/helpers/get-initial-filter-values.test.js +10 -10
  207. package/tests/unit/src/components/SearchFilterSort/SearchFilterSort.test.js +4 -1
  208. package/tests/unit/src/components/SearchFilterSort/helpers/handle-sort-update.test.js +26 -19
  209. package/tests/unit/src/components/SearchFilterSort/helpers/update-sort.test.js +10 -1
  210. package/tests/unit/src/helpers/__snapshots__/get-wrapped-value-with-link.test.js.snap +18 -0
  211. package/tests/unit/src/helpers/build-props-query.test.js +25 -0
  212. package/tests/unit/src/helpers/get-wrapped-value-with-link.test.js +2 -2
  213. package/tests/unit/src/helpers/parse-props-to-display.test.js +4 -0
  214. package/tests/unit/src/helpers/prcoess-data-summary-value.test.js +52 -0
  215. package/lib/components/SearchFilter/helpers/build-new-query.js +0 -15
  216. package/lib/components/SearchFilter/helpers/build-new-query.js.map +0 -1
  217. package/lib/components/SearchFilter/helpers/build-query.js +0 -37
  218. package/lib/components/SearchFilter/helpers/build-query.js.map +0 -1
  219. package/lib/components/SearchFilter/helpers/get-initial-filter-values.js +0 -43
  220. package/lib/components/SearchFilter/helpers/get-initial-filter-values.js.map +0 -1
  221. package/lib-es/components/SearchFilter/helpers/build-new-query.js +0 -6
  222. package/lib-es/components/SearchFilter/helpers/build-new-query.js.map +0 -1
  223. package/lib-es/components/SearchFilter/helpers/build-query.js +0 -23
  224. package/lib-es/components/SearchFilter/helpers/build-query.js.map +0 -1
  225. package/lib-es/components/SearchFilter/helpers/get-initial-filter-values.js +0 -26
  226. package/lib-es/components/SearchFilter/helpers/get-initial-filter-values.js.map +0 -1
  227. package/src/components/SearchFilter/helpers/build-new-query.js +0 -6
  228. package/src/components/SearchFilter/helpers/build-query.js +0 -26
  229. package/src/components/SearchFilter/helpers/get-initial-filter-values.js +0 -30
@@ -7,7 +7,13 @@ import { MainContext } from '@blaze-cms/nextjs-components';
7
7
  import { generateSingleItemQuery, getItemList } from '../../application/query';
8
8
  import ListBuilder from './ListBuilder';
9
9
  import { AZ_LIST_TYPE } from './constants';
10
- import { getAzQueryFilter, getSortProps, hasRequiredItemListDetails } from './helpers';
10
+ import {
11
+ getAzQueryFilter,
12
+ getSortProps,
13
+ hasRequiredItemListDetails,
14
+ getListSpecificSearchFilter,
15
+ getListQuery
16
+ } from './helpers';
11
17
  import {
12
18
  getGenericProps,
13
19
  getRequiredSchemas,
@@ -37,7 +43,7 @@ const ListFactory = props => {
37
43
  type,
38
44
  sortby: defaultSortBy,
39
45
  sort: defaultSort,
40
- searchFilter,
46
+ allSearchFilters,
41
47
  operator: filterOperator,
42
48
  sortProperties,
43
49
  itemListName
@@ -46,11 +52,13 @@ const ListFactory = props => {
46
52
  const router = useRouter();
47
53
  const { asPath } = router;
48
54
  const parsedQuery = asPath.replace(/%5D/g, ']').replace(/%5B/g, '[');
49
- const {
50
- query,
51
- url,
52
- query: { sort: querySort, sortby: querySortBy, itemListId: queryItemListId } = {}
53
- } = parseUrl(parsedQuery);
55
+ const [searchFilter, hasListSpecificFilters] = getListSpecificSearchFilter(
56
+ allSearchFilters,
57
+ name
58
+ );
59
+ const { query, url, query: { itemListId: queryItemListId } = {} } = parseUrl(parsedQuery);
60
+ const updatedQuery = getListQuery(query, hasListSpecificFilters, name);
61
+ const { sort: querySort, sortby: querySortBy } = updatedQuery;
54
62
  const { sortbyFilters, updatedSortProperties } = getSortProps({
55
63
  querySort,
56
64
  sortProperties,
@@ -62,8 +70,8 @@ const ListFactory = props => {
62
70
  const itemListId = getItemListId(itemListName, queryItemListId);
63
71
  const { itemEntity: parentEntity, itemId: parentId } = parent;
64
72
  const updatedParentEntity = getUnpublishedEntityName(parentEntity);
65
- const paginationIndex = getPaginationIndex(query, name);
66
- const azFilter = getAzQueryFilter(query, name);
73
+ const paginationIndex = getPaginationIndex(updatedQuery, name);
74
+ const azFilter = getAzQueryFilter(updatedQuery, name);
67
75
 
68
76
  const entitiesToUse = entities && entities.length ? entities : [legacyEntity];
69
77
  const [filterEntity] = entitiesToUse;
@@ -123,10 +131,12 @@ const ListFactory = props => {
123
131
  const [textFilter] = getSearchFilterType(searchFilter, TEXT_SEARCH);
124
132
  const shouldApplyTextFilter = textFilter && textFilter.propsToDisplay.length;
125
133
  const operator = shouldApplyTextFilter ? getElasticsearchOperator(textFilter) : AND_OPERATOR;
126
- const valuesText = shouldApplyTextFilter ? buildSearchValuesText(textFilter, query) : [];
127
- const { valuesAnd, valuesOr } = getQueryFilters(searchFilter, query);
134
+ const valuesText = shouldApplyTextFilter
135
+ ? buildSearchValuesText(textFilter, updatedQuery, name)
136
+ : [];
137
+ const { valuesAnd, valuesOr } = getQueryFilters(searchFilter, updatedQuery, name);
128
138
  const isTextSearchFilterApplied = !!(
129
- query.search_term &&
139
+ updatedQuery.search_term &&
130
140
  searchFilter &&
131
141
  getSearchFilterType(searchFilter, TEXT_SEARCH).length
132
142
  );
@@ -139,7 +149,7 @@ const ListFactory = props => {
139
149
  const listProps = {
140
150
  ...props,
141
151
  ...genericProps,
142
- query,
152
+ query: updatedQuery,
143
153
  url,
144
154
  isCard,
145
155
  isAZ,
@@ -179,7 +189,7 @@ ListFactory.propTypes = {
179
189
  name: PropTypes.string,
180
190
  sortby: PropTypes.array,
181
191
  sort: PropTypes.string,
182
- searchFilter: PropTypes.object,
192
+ allSearchFilters: PropTypes.array,
183
193
  sortProperties: PropTypes.array,
184
194
  itemListName: PropTypes.string
185
195
  };
@@ -195,7 +205,7 @@ ListFactory.defaultProps = {
195
205
  sortProperties: [],
196
206
  sort: '',
197
207
  operator: AND,
198
- searchFilter: {},
208
+ allSearchFilters: [],
199
209
  itemListName: ''
200
210
  };
201
211
 
@@ -0,0 +1,28 @@
1
+ import stripQueryKey from './strip-query-key';
2
+
3
+ const getListQuery = (query, hasListSpecificFilters, name) => {
4
+ const updatedQuery = {};
5
+ const listKey = `pb[${name}]`;
6
+ const paginationKey = `${listKey}[page]`;
7
+ const sortKey = `${listKey}[sort]`;
8
+ const sortByKey = `${listKey}[sortby]`;
9
+
10
+ Object.keys(query).forEach(queryKey => {
11
+ const isListKey = queryKey.indexOf(`${listKey}`) !== -1;
12
+ const decodedQueryValue = Array.isArray(query[queryKey])
13
+ ? query[queryKey].map(value => decodeURIComponent(value))
14
+ : decodeURIComponent(query[queryKey]);
15
+ if (hasListSpecificFilters) {
16
+ const strippedKey = stripQueryKey(queryKey, listKey, paginationKey);
17
+ if (isListKey) updatedQuery[strippedKey] = decodedQueryValue;
18
+ } else {
19
+ if (queryKey.indexOf('pb[') === -1) updatedQuery[queryKey] = decodedQueryValue;
20
+ if (queryKey.indexOf(paginationKey) !== -1) updatedQuery[queryKey] = decodedQueryValue;
21
+ }
22
+ });
23
+ updatedQuery.sort = query[sortKey] || query.sort;
24
+ updatedQuery.sortby = query[sortByKey] || query.sortby;
25
+ return updatedQuery;
26
+ };
27
+
28
+ export default getListQuery;
@@ -0,0 +1,10 @@
1
+ const getListSpecificSearchFilter = (searchFilters, listName) => {
2
+ const searchFilterMatch = searchFilters.find(
3
+ ({ settings: { listComponentName } }) => listComponentName === listName
4
+ );
5
+ const hasListSpecificFilters = !!searchFilterMatch;
6
+ const searchFilterToUse = searchFilterMatch || searchFilters[0] || {};
7
+ return [searchFilterToUse, hasListSpecificFilters];
8
+ };
9
+
10
+ export default getListSpecificSearchFilter;
@@ -7,3 +7,5 @@ export { default as getItemsPerPageToUse } from './get-items-per-page-to-use';
7
7
  export { default as getSortProps } from './get-sort-props';
8
8
  export { default as hasRequiredItemListDetails } from './has-required-item-list-details';
9
9
  export { default as getListComponent } from './get-list-component';
10
+ export { default as getListQuery } from './get-list-query';
11
+ export { default as getListSpecificSearchFilter } from './get-list-specific-search-filter';
@@ -0,0 +1,6 @@
1
+ const stripQueryKey = (fullKey, listNameKey, paginationKey) => {
2
+ if (paginationKey === fullKey) return fullKey;
3
+ return fullKey.substring(listNameKey.length + 1, fullKey.length - 1);
4
+ };
5
+
6
+ export default stripQueryKey;
@@ -10,12 +10,12 @@ const SearchContent = ({
10
10
  searchInputAlignment,
11
11
  searchInputWrapperMobile,
12
12
  searchInputWrapperDesktop,
13
- collapsible,
14
13
  isMobile,
15
14
  placeholder,
16
- modifier
15
+ modifier,
16
+ collapsedSearch
17
17
  }) => {
18
- const [collapsed, setCollapsed] = useState(collapsible);
18
+ const [collapsed, setCollapsed] = useState(collapsedSearch);
19
19
  const router = useRouter();
20
20
 
21
21
  const { results, searchTerm, setSearchTerm, debouncedSearchTerm } = useDebounceSearch({
@@ -50,7 +50,7 @@ const SearchContent = ({
50
50
  };
51
51
 
52
52
  const handleOnBlur = () => {
53
- if (!collapsible) return;
53
+ if (!collapsedSearch) return;
54
54
  if (!debouncedSearchTerm || debouncedSearchTerm === '') setCollapsed(true);
55
55
  };
56
56
 
@@ -118,9 +118,9 @@ SearchContent.propTypes = {
118
118
  searchInputWrapperDesktop: PropTypes.string,
119
119
  placeholder: PropTypes.string,
120
120
  isMobile: PropTypes.bool,
121
- collapsible: PropTypes.bool,
122
121
  entities: PropTypes.array.isRequired,
123
- modifier: PropTypes.string
122
+ modifier: PropTypes.string,
123
+ collapsedSearch: PropTypes.bool
124
124
  };
125
125
 
126
126
  SearchContent.defaultProps = {
@@ -129,8 +129,8 @@ SearchContent.defaultProps = {
129
129
  searchInputWrapperDesktop: '',
130
130
  placeholder: '',
131
131
  isMobile: false,
132
- collapsible: false,
133
- modifier: ''
132
+ modifier: '',
133
+ collapsedSearch: false
134
134
  };
135
135
 
136
136
  export default SearchContent;
@@ -3,12 +3,7 @@ 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 {
7
- isDeviceDesktop,
8
- buildQuery,
9
- getInitialFilterValues,
10
- getResponsiveFilterClassnames
11
- } from '../helpers';
6
+ import { isDeviceDesktop, buildUrlQuery, getResponsiveFilterClassnames } from '../helpers';
12
7
  import CloseMobileForm from './CloseMobileForm';
13
8
  import ResetDesktopForm from './ResetDesktopForm';
14
9
  import MobileFormToolbar from './MobileFormToolbar';
@@ -16,6 +11,7 @@ import { SEARCH, REFINE, MORE_FILTERS_CLASSES } from '../constants';
16
11
 
17
12
  const SearchFilter = ({
18
13
  searchFilterRef,
14
+ listComponentName,
19
15
  data,
20
16
  filters,
21
17
  hasUrl,
@@ -28,13 +24,14 @@ const SearchFilter = ({
28
24
  groupAfterDesktop,
29
25
  groupAfterMobile,
30
26
  filterValues,
31
- setAppliedFilters
27
+ setAppliedFilters,
28
+ query
32
29
  }) => {
33
30
  const [moreFiltersMobileCollapsed, setMoreFiltersMobileCollapsed] = useState(true);
34
31
  const [moreFiltersDesktopCollapsed, setMoreFiltersDesktopCollapsed] = useState(true);
35
32
 
36
- const doSubmit = (newValues = filterValues) => {
37
- const newQuery = buildQuery(newValues, filters);
33
+ const doSubmit = newValues => {
34
+ const newQuery = buildUrlQuery(newValues, filters, listComponentName, query);
38
35
  handleSearch(newQuery);
39
36
  setMoreFiltersDesktopCollapsed(true);
40
37
  setMoreFiltersMobileCollapsed(true);
@@ -69,9 +66,8 @@ const SearchFilter = ({
69
66
  const formId = `filter-${name}-form`;
70
67
 
71
68
  const handleReset = () => {
72
- const newValues = getInitialFilterValues(null, filters, {});
73
- setAppliedFilters({ newValues, type: 'reset' });
74
- doSubmit(newValues);
69
+ setAppliedFilters({ type: 'reset' });
70
+ doSubmit();
75
71
  };
76
72
 
77
73
  const updateFilterValues = (newValues, shouldSubmit) => {
@@ -79,7 +75,7 @@ const SearchFilter = ({
79
75
  };
80
76
 
81
77
  const shouldGroup = !!(groupAfterDesktop || groupAfterMobile);
82
- const shouldSearch = !hasUrl;
78
+
83
79
  return (
84
80
  <>
85
81
  <form
@@ -89,7 +85,7 @@ const SearchFilter = ({
89
85
  id={formId}
90
86
  onSubmit={e => {
91
87
  e.preventDefault();
92
- doSubmit();
88
+ doSubmit(filterValues);
93
89
  }}>
94
90
  {displaySearchFilter && (
95
91
  <CloseMobileForm handleClose={() => setDisplaySearchFilter(false)} />
@@ -101,7 +97,7 @@ const SearchFilter = ({
101
97
  <div className="filter__wrapper filter__wrapper--search-refine">
102
98
  {!shouldGroup && (
103
99
  <FiltersList
104
- shouldSearch={shouldSearch}
100
+ shouldSearch={!hasUrl}
105
101
  data={data}
106
102
  filters={filters}
107
103
  hasUrl={hasUrl}
@@ -114,7 +110,7 @@ const SearchFilter = ({
114
110
  {shouldGroup && (
115
111
  <>
116
112
  <FiltersList
117
- shouldSearch={shouldSearch}
113
+ shouldSearch={!hasUrl}
118
114
  data={data}
119
115
  filters={filters.slice(0, groupAfterMobile)}
120
116
  hasUrl={hasUrl}
@@ -136,7 +132,7 @@ const SearchFilter = ({
136
132
  <div className={moreFiltersMobileWrapperClass}>
137
133
  <div className={MORE_FILTERS_CLASSES.MOBILE_CONTENT}>
138
134
  <FiltersList
139
- shouldSearch={shouldSearch && isDeviceDesktop()}
135
+ shouldSearch={!hasUrl && isDeviceDesktop()}
140
136
  data={data}
141
137
  filters={filters.slice(
142
138
  groupAfterMobile,
@@ -233,7 +229,14 @@ SearchFilter.propTypes = {
233
229
  groupAfterDesktop: PropTypes.number.isRequired,
234
230
  groupAfterMobile: PropTypes.number.isRequired,
235
231
  filterValues: PropTypes.object.isRequired,
236
- setAppliedFilters: PropTypes.func.isRequired
232
+ setAppliedFilters: PropTypes.func.isRequired,
233
+ listComponentName: PropTypes.string,
234
+ query: PropTypes.object
235
+ };
236
+
237
+ SearchFilter.defaultProps = {
238
+ listComponentName: '',
239
+ query: {}
237
240
  };
238
241
 
239
242
  export default SearchFilter;
@@ -2,33 +2,37 @@ import React, { useState, useRef, useReducer, useEffect } from 'react';
2
2
  import { useRouter } from 'next/router';
3
3
  import { useQuery } from '@apollo/client';
4
4
  import PropTypes from 'prop-types';
5
- import { parseUrl, stringify } from 'query-string';
5
+ import { parseUrl } from 'query-string';
6
6
  import SearchFilter from './SearchFilter';
7
7
  import { withTitle } from '../../HOC';
8
8
  import { getSearchPublishedContent } from '../../application/query';
9
9
  import {
10
- buildNewQuery,
10
+ buildNewUrl,
11
11
  buildRawQueryStringified,
12
- getInitialFilterValues,
13
- buildFiltersQuery
12
+ getFilterValues,
13
+ buildFiltersQuery,
14
+ getFilterRangesAndCheckboxesValues
14
15
  } from './helpers';
15
16
  import { getEntityData } from '../../helpers';
16
- import { RAW_RESULTS, RANGE, CHECKBOX_SELECT } from './constants';
17
+ import { RAW_RESULTS } from './constants';
17
18
  import { SCROLL_OFFSET } from '../../constants';
19
+ import searchFilterReducer from './searchFilterReducer';
20
+
21
+ const getFiltersUrlQuery = (query, listName) => {
22
+ if (!listName) return query;
23
+ const updatedQuery = {};
24
+ const listKey = `pb[${listName}]`;
25
+ Object.keys(query).forEach(queryKey => {
26
+ const isListKey = queryKey.indexOf(`${listName}`) !== -1;
27
+ if (!isListKey) return;
28
+ const decodedQueryValue = Array.isArray(query[queryKey])
29
+ ? query[queryKey].map(value => decodeURIComponent(value))
30
+ : decodeURIComponent(query[queryKey]);
31
+ const strippedKey = queryKey.substring(listKey.length + 1, queryKey.length - 1);
32
+ if (isListKey) updatedQuery[strippedKey] = decodedQueryValue;
33
+ });
18
34
 
19
- const reducer = (state, action) => {
20
- const { newValues, type, shouldSearch = true } = action;
21
-
22
- switch (type) {
23
- case 'update':
24
- return { ...state, ...newValues, shouldSearch };
25
- case 'resetSearch':
26
- return { ...state, shouldSearch: false };
27
- case 'reset':
28
- return { ...newValues, shouldSearch: false };
29
- default:
30
- throw new Error();
31
- }
35
+ return updatedQuery;
32
36
  };
33
37
 
34
38
  const SearchFilterContainer = ({
@@ -41,7 +45,8 @@ const SearchFilterContainer = ({
41
45
  groupAfterDesktop,
42
46
  filterBy,
43
47
  filterByProperty,
44
- shouldAddFilters
48
+ shouldAddFilters,
49
+ listComponentName
45
50
  }) => {
46
51
  const router = useRouter();
47
52
  const { asPath } = router;
@@ -49,15 +54,10 @@ const SearchFilterContainer = ({
49
54
  const [key, setKey] = useState(`filter-${name}`);
50
55
  const [displaySearchFilter, setDisplaySearchFilter] = useState(false);
51
56
  const [urlPath, setUrlPath] = useState(asPath); // used as asPath can take too long to update
52
- const {
53
- url: currentUrl,
54
- query: { sort, sortby },
55
- query
56
- } = parseUrl(urlPath);
57
- const [filterValues, dispatch] = useReducer(
58
- reducer,
59
- getInitialFilterValues(null, filters, query)
60
- );
57
+ const { url: currentUrl, query } = parseUrl(urlPath);
58
+ const updatedQuery = getFiltersUrlQuery(query, listComponentName);
59
+
60
+ const [filterValues, dispatch] = useReducer(searchFilterReducer, null);
61
61
 
62
62
  useEffect(
63
63
  () => {
@@ -66,34 +66,19 @@ const SearchFilterContainer = ({
66
66
  [asPath]
67
67
  );
68
68
 
69
- const hasUrl = !!url;
70
-
71
- const sortValues = sort && sortby ? stringify({ sort, sortby }) : '';
72
- const baseQuery = sortValues ? `${currentUrl}?${sortValues}` : currentUrl;
73
-
74
69
  const action = getSearchPublishedContent(RAW_RESULTS);
75
- const checkboxSelectValues = [];
76
- const rangeValues = [];
77
-
78
- filters.forEach(({ type, propsToDisplay }) => {
79
- if (CHECKBOX_SELECT.includes(type)) {
80
- checkboxSelectValues.push(propsToDisplay[0]);
81
- } else if (type === RANGE) {
82
- rangeValues.push(...propsToDisplay);
83
- }
84
- });
70
+ const [checkboxSelectValues, rangeValues] = getFilterRangesAndCheckboxesValues(filters);
85
71
 
86
72
  const { docType } = getEntityData(entity);
87
73
 
88
- const filtersQuery = shouldAddFilters
89
- ? buildFiltersQuery({
90
- query: filterValues,
91
- filterBy,
92
- filterByProperty,
93
- rangeValues,
94
- queryKeys: Object.keys(query)
95
- })
96
- : [];
74
+ const filtersQuery = buildFiltersQuery({
75
+ shouldAddFilters,
76
+ query: filterValues || {},
77
+ filterBy,
78
+ filterByProperty,
79
+ rangeValues,
80
+ queryKeys: Object.keys(updatedQuery)
81
+ });
97
82
 
98
83
  const rawQueryStringified = buildRawQueryStringified(
99
84
  checkboxSelectValues,
@@ -102,7 +87,7 @@ const SearchFilterContainer = ({
102
87
  filtersQuery
103
88
  );
104
89
 
105
- const { data, error } = useQuery(action, {
90
+ const { data, error, loading } = useQuery(action, {
106
91
  variables: { rawQueryStringified, limit: 0 }, // we only want aggs so limit=0 for no search results
107
92
  skip: !rawQueryStringified
108
93
  });
@@ -113,30 +98,32 @@ const SearchFilterContainer = ({
113
98
  const { searchPublishedContent: { rawResults: { aggregations: filterData } = {} } = {} } =
114
99
  data || {};
115
100
 
116
- if (filterValues.dataNotSet && filterData) {
117
- const initialFilterValues = getInitialFilterValues(filterData, filters, query);
118
- dispatch({ newValues: initialFilterValues, shouldSearch: false, type: 'update' });
101
+ if (!filterValues && !loading && (filterData || !rawQueryStringified)) {
102
+ const newValues = getFilterValues(filterData, filters, updatedQuery);
103
+ dispatch({ newValues, shouldSearch: false, type: 'update' });
104
+ return null;
119
105
  }
120
106
 
121
107
  const handleSearch = newQuery => {
122
108
  setDisplaySearchFilter(false);
123
-
109
+ const hashBit = asPath.split('#')[1] || '';
110
+ const parsedHashBit = hashBit ? `#${hashBit}` : '';
111
+ scrollToFirstList();
124
112
  if (!newQuery) {
125
- scrollToFirstList();
113
+ const baseQuery = `${currentUrl}${parsedHashBit}`;
126
114
  setUrlPath(baseQuery);
127
- return router.push('/Resolver', baseQuery, { shallow: !hasUrl, scroll: false }).then(() => {
115
+ return router.push('/Resolver', baseQuery, { shallow: !url, scroll: false }).then(() => {
128
116
  setKey(`filter-${name}:${Date.now()}`); // remove after range component update
129
117
  });
130
118
  }
131
- const newUrl = buildNewQuery(url, currentUrl, newQuery, sortValues);
132
- scrollToFirstList();
119
+ const newUrl = buildNewUrl(url, currentUrl, newQuery, hashBit);
133
120
  setUrlPath(newUrl);
134
- return router.push('/Resolver', newUrl, { shallow: !hasUrl, scroll: false });
121
+ return router.push('/Resolver', newUrl, { shallow: !url, scroll: false });
135
122
  };
136
123
 
137
124
  const scrollToFirstList = () => {
138
125
  const [list] = document.getElementsByClassName('list-top');
139
- const shouldScrollToFirstList = !hasUrl && list;
126
+ const shouldScrollToFirstList = !url && list;
140
127
 
141
128
  if (shouldScrollToFirstList) {
142
129
  window.scrollTo({
@@ -147,16 +134,19 @@ const SearchFilterContainer = ({
147
134
  window.scrollTo(0, 0);
148
135
  }
149
136
  };
150
- if (!filterValues) return '';
137
+
138
+ if (!filterValues) return null;
151
139
 
152
140
  return (
153
141
  <SearchFilter
154
142
  key={key}
155
143
  setAppliedFilters={dispatch}
144
+ query={updatedQuery}
145
+ listComponentName={listComponentName}
156
146
  searchFilterRef={searchFilterRef}
157
147
  data={filterData}
158
148
  filters={filters}
159
- hasUrl={hasUrl}
149
+ hasUrl={!!url}
160
150
  entity={entity}
161
151
  handleSearch={handleSearch}
162
152
  filterValues={filterValues}
@@ -180,7 +170,8 @@ SearchFilterContainer.propTypes = {
180
170
  groupAfterDesktop: PropTypes.number,
181
171
  filterBy: PropTypes.array,
182
172
  filterByProperty: PropTypes.array,
183
- shouldAddFilters: PropTypes.bool
173
+ shouldAddFilters: PropTypes.bool,
174
+ listComponentName: PropTypes.string
184
175
  };
185
176
 
186
177
  SearchFilterContainer.defaultProps = {
@@ -192,7 +183,8 @@ SearchFilterContainer.defaultProps = {
192
183
  groupAfterDesktop: 0,
193
184
  filterBy: [],
194
185
  filterByProperty: [],
195
- shouldAddFilters: false
186
+ shouldAddFilters: false,
187
+ listComponentName: ''
196
188
  };
197
189
 
198
190
  export default withTitle(SearchFilterContainer);
@@ -29,7 +29,15 @@ const builFilterObject = ({ queryKey, value, filters, isRange, isInQuery }) => {
29
29
  filters.push({ match: { [key]: filterValue } });
30
30
  });
31
31
  };
32
- const buildFiltersQuery = ({ query, filterBy, filterByProperty, rangeValues, queryKeys }) => {
32
+ const buildFiltersQuery = ({
33
+ shouldAddFilters,
34
+ query,
35
+ filterBy,
36
+ filterByProperty,
37
+ rangeValues,
38
+ queryKeys
39
+ }) => {
40
+ if (!shouldAddFilters) return [];
33
41
  const mustFilters = [];
34
42
  Object.keys(query).forEach(queryKey => {
35
43
  if (QUERY_KEYS_TO_IGNORE.includes(queryKey)) return;
@@ -0,0 +1,8 @@
1
+ const buildNewUrl = (url, currentUrl, queryParams, hashBit) => {
2
+ const encodedQuery = encodeURI(queryParams);
3
+ const baseUrl = url || currentUrl;
4
+ const newUrl = encodedQuery ? `${baseUrl}?${encodedQuery}` : `${baseUrl}`;
5
+ return hashBit ? `${newUrl}#${hashBit}` : newUrl;
6
+ };
7
+
8
+ export default buildNewUrl;
@@ -0,0 +1,33 @@
1
+ import { SEARCH_TERM, TEXT_SEARCH } from '../constants';
2
+ import parseFilterValue from './parse-filter-value';
3
+ import { buildQueryKey } from '../../../helpers';
4
+
5
+ const buildUrlQuery = (filterValues, filters, listComponentName = '', query = {}) => {
6
+ if (!filterValues) return '';
7
+
8
+ const newQuery = [];
9
+ const queryKeys = [];
10
+ const searchValue = filterValues[SEARCH_TERM];
11
+ const searchKey = buildQueryKey(SEARCH_TERM, listComponentName);
12
+ queryKeys.push(searchKey);
13
+ if (searchValue) newQuery.push(`${searchKey}=${searchValue}`);
14
+
15
+ filters.forEach(({ propsToDisplay, type }) => {
16
+ if (type === TEXT_SEARCH) return;
17
+ propsToDisplay.forEach(prop => {
18
+ const value = filterValues[prop];
19
+ const filterKey = buildQueryKey(prop, listComponentName);
20
+ queryKeys.push(filterKey);
21
+ const parsedValue = parseFilterValue(filterKey, type, value, newQuery);
22
+ if (parsedValue && !newQuery.includes(parsedValue)) newQuery.push(parsedValue);
23
+ });
24
+ });
25
+
26
+ Object.keys(query).forEach(key => {
27
+ if (queryKeys.indexOf(key) === -1) newQuery.push(`${key}=${query[key]}`);
28
+ });
29
+
30
+ return newQuery.join('&');
31
+ };
32
+
33
+ export default buildUrlQuery;
@@ -0,0 +1,17 @@
1
+ import { RANGE, CHECKBOX_SELECT } from '../constants';
2
+
3
+ const getFilterRangesAndCheckboxesValues = filters => {
4
+ const checkboxSelectValues = [];
5
+ const rangeValues = [];
6
+
7
+ filters.forEach(({ type, propsToDisplay }) => {
8
+ if (CHECKBOX_SELECT.includes(type)) {
9
+ checkboxSelectValues.push(propsToDisplay[0]);
10
+ } else if (type === RANGE) {
11
+ rangeValues.push(...propsToDisplay);
12
+ }
13
+ });
14
+ return [checkboxSelectValues, rangeValues];
15
+ };
16
+
17
+ export default getFilterRangesAndCheckboxesValues;
@@ -0,0 +1,21 @@
1
+ import { SEARCH_TERM, TEXT_SEARCH } from '../constants';
2
+ import getFilterValueFromQuery from './get-filter-value-from-query';
3
+
4
+ const getFilterValues = (filterData, filters, query) => {
5
+ const filterValues = {};
6
+ filterValues[SEARCH_TERM] = query[SEARCH_TERM] || '';
7
+
8
+ filters.forEach(filterProps => {
9
+ const {
10
+ propsToDisplay: [key],
11
+ type
12
+ } = filterProps;
13
+ if (type === TEXT_SEARCH) return;
14
+ const data = filterData && filterData[key] ? filterData[key] : {};
15
+ filterValues[key] = getFilterValueFromQuery(key, filterProps, data, query);
16
+ });
17
+ filterValues.dataNotSet = !filterData;
18
+ return filterValues;
19
+ };
20
+
21
+ export default getFilterValues;
@@ -1,4 +1,4 @@
1
- import buildNewQuery from './build-new-query';
1
+ import buildNewUrl from './build-new-url';
2
2
  import buildRawQueryStringified from './build-raw-query-stringified';
3
3
  import { decodeValue, encodeValue } from './decode-encode';
4
4
  import checkIfRangeUpdated from './check-if-range-updated';
@@ -10,14 +10,15 @@ import getIntersectedProp from './get-intersected-prop';
10
10
  import getRangeValue from './get-range-value';
11
11
  import getSelectOptions from './get-select-options';
12
12
  import isDeviceDesktop from './is-device-desktop';
13
- import getInitialFilterValues from './get-initial-filter-values';
13
+ import getFilterValues from './get-filter-values';
14
14
  import getFilterValueFromQuery from './get-filter-value-from-query';
15
- import buildQuery from './build-query';
15
+ import buildUrlQuery from './build-url-query';
16
16
  import buildFiltersQuery from './build-filters-query';
17
+ import getFilterRangesAndCheckboxesValues from './get-filter-ranges-and-checkboxes-values';
17
18
 
18
19
  export {
19
- buildQuery,
20
- buildNewQuery,
20
+ buildUrlQuery,
21
+ buildNewUrl,
21
22
  buildRawQueryStringified,
22
23
  decodeValue,
23
24
  encodeValue,
@@ -30,7 +31,8 @@ export {
30
31
  getRangeValue,
31
32
  getSelectOptions,
32
33
  isDeviceDesktop,
33
- getInitialFilterValues,
34
+ getFilterValues,
34
35
  getFilterValueFromQuery,
35
- buildFiltersQuery
36
+ buildFiltersQuery,
37
+ getFilterRangesAndCheckboxesValues
36
38
  };
@@ -1,3 +1,3 @@
1
- import SearchFilterContainer from './SearchFilterContainer';
1
+ import SearchFilter from './SearchFilterContainer';
2
2
 
3
- export default SearchFilterContainer;
3
+ export default SearchFilter;