@blaze-cms/react-page-builder 0.133.0-project-admin-customisations.0 → 0.134.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 (93) hide show
  1. package/CHANGELOG.md +90 -5
  2. package/lib/components/Banner/AdSlotRender.js +12 -3
  3. package/lib/components/Banner/AdSlotRender.js.map +1 -1
  4. package/lib/components/Banner/Banner.js +4 -7
  5. package/lib/components/Banner/Banner.js.map +1 -1
  6. package/lib/components/Banner/BannerRender.js +5 -1
  7. package/lib/components/Banner/BannerRender.js.map +1 -1
  8. package/lib/components/Button.js +3 -1
  9. package/lib/components/Button.js.map +1 -1
  10. package/lib/components/ContentGroupSection/ContentGroupSection.js +4 -1
  11. package/lib/components/ContentGroupSection/ContentGroupSection.js.map +1 -1
  12. package/lib/components/List/helpers/get-sort-props.js +9 -6
  13. package/lib/components/List/helpers/get-sort-props.js.map +1 -1
  14. package/lib/components/SearchFilter/SearchFilter/SearchFilter.js +2 -2
  15. package/lib/components/SearchFilter/SearchFilter/SearchFilter.js.map +1 -1
  16. package/lib/components/SearchFilter/SearchFilterContainer.js +58 -22
  17. package/lib/components/SearchFilter/SearchFilterContainer.js.map +1 -1
  18. package/lib/components/SearchFilter/helpers/build-filters-query.js +18 -16
  19. package/lib/components/SearchFilter/helpers/build-filters-query.js.map +1 -1
  20. package/lib/components/SearchFilter/helpers/build-url-query.js +3 -2
  21. package/lib/components/SearchFilter/helpers/build-url-query.js.map +1 -1
  22. package/lib/components/SearchFilter/helpers/get-initial-filter-values.js +33 -0
  23. package/lib/components/SearchFilter/helpers/get-initial-filter-values.js.map +1 -0
  24. package/lib/components/SearchFilter/helpers/get-updated-filter-by.js +38 -0
  25. package/lib/components/SearchFilter/helpers/get-updated-filter-by.js.map +1 -0
  26. package/lib/components/SearchFilter/helpers/index.js +8 -1
  27. package/lib/components/SearchFilter/helpers/index.js.map +1 -1
  28. package/lib/components/SocialFollow/sf.config.js +2 -1
  29. package/lib/components/SocialFollow/sf.config.js.map +1 -1
  30. package/lib/helpers/build-raw-query.js +7 -6
  31. package/lib/helpers/build-raw-query.js.map +1 -1
  32. package/lib/helpers/build-sort-values.js +4 -1
  33. package/lib/helpers/build-sort-values.js.map +1 -1
  34. package/lib-es/components/Banner/AdSlotRender.js +12 -3
  35. package/lib-es/components/Banner/AdSlotRender.js.map +1 -1
  36. package/lib-es/components/Banner/Banner.js +4 -7
  37. package/lib-es/components/Banner/Banner.js.map +1 -1
  38. package/lib-es/components/Banner/BannerRender.js +6 -2
  39. package/lib-es/components/Banner/BannerRender.js.map +1 -1
  40. package/lib-es/components/Button.js +2 -1
  41. package/lib-es/components/Button.js.map +1 -1
  42. package/lib-es/components/ContentGroupSection/ContentGroupSection.js +8 -4
  43. package/lib-es/components/ContentGroupSection/ContentGroupSection.js.map +1 -1
  44. package/lib-es/components/List/helpers/get-sort-props.js +9 -6
  45. package/lib-es/components/List/helpers/get-sort-props.js.map +1 -1
  46. package/lib-es/components/SearchFilter/SearchFilter/SearchFilter.js +3 -3
  47. package/lib-es/components/SearchFilter/SearchFilter/SearchFilter.js.map +1 -1
  48. package/lib-es/components/SearchFilter/SearchFilterContainer.js +54 -13
  49. package/lib-es/components/SearchFilter/SearchFilterContainer.js.map +1 -1
  50. package/lib-es/components/SearchFilter/helpers/build-filters-query.js +18 -16
  51. package/lib-es/components/SearchFilter/helpers/build-filters-query.js.map +1 -1
  52. package/lib-es/components/SearchFilter/helpers/build-url-query.js +1 -2
  53. package/lib-es/components/SearchFilter/helpers/build-url-query.js.map +1 -1
  54. package/lib-es/components/SearchFilter/helpers/get-initial-filter-values.js +21 -0
  55. package/lib-es/components/SearchFilter/helpers/get-initial-filter-values.js.map +1 -0
  56. package/lib-es/components/SearchFilter/helpers/get-updated-filter-by.js +19 -0
  57. package/lib-es/components/SearchFilter/helpers/get-updated-filter-by.js.map +1 -0
  58. package/lib-es/components/SearchFilter/helpers/index.js +3 -2
  59. package/lib-es/components/SearchFilter/helpers/index.js.map +1 -1
  60. package/lib-es/components/SocialFollow/sf.config.js +3 -2
  61. package/lib-es/components/SocialFollow/sf.config.js.map +1 -1
  62. package/lib-es/helpers/build-raw-query.js +5 -4
  63. package/lib-es/helpers/build-raw-query.js.map +1 -1
  64. package/lib-es/helpers/build-sort-values.js +1 -1
  65. package/lib-es/helpers/build-sort-values.js.map +1 -1
  66. package/package.json +12 -12
  67. package/src/components/Banner/AdSlotRender.js +9 -5
  68. package/src/components/Banner/Banner.js +9 -11
  69. package/src/components/Banner/BannerRender.js +4 -0
  70. package/src/components/Button.js +6 -1
  71. package/src/components/ContentGroupSection/ContentGroupSection.js +1 -1
  72. package/src/components/List/helpers/get-sort-props.js +4 -6
  73. package/src/components/SearchFilter/SearchFilter/SearchFilter.js +6 -3
  74. package/src/components/SearchFilter/SearchFilterContainer.js +42 -14
  75. package/src/components/SearchFilter/helpers/build-filters-query.js +23 -20
  76. package/src/components/SearchFilter/helpers/build-url-query.js +1 -3
  77. package/src/components/SearchFilter/helpers/get-initial-filter-values.js +24 -0
  78. package/src/components/SearchFilter/helpers/get-updated-filter-by.js +18 -0
  79. package/src/components/SearchFilter/helpers/index.js +5 -3
  80. package/src/components/SocialFollow/sf.config.js +2 -2
  81. package/src/helpers/build-raw-query.js +5 -1
  82. package/src/helpers/build-sort-values.js +1 -1
  83. package/tests/unit/src/components/Banner/AdSlotRender.test.js +6 -11
  84. package/tests/unit/src/components/Banner/__snapshots__/AdSlotRender.test.js.snap +45 -25
  85. package/tests/unit/src/components/Banner/__snapshots__/BannerRender.test.js.snap +8 -3
  86. package/tests/unit/src/components/List/helpers/get-sort-props.test.js +23 -0
  87. package/tests/unit/src/components/SearchFilter/helpers/build-query.test.js +6 -0
  88. package/tests/unit/src/components/SearchFilter/helpers/get-updated-filter-by.test.js +28 -0
  89. package/tests/unit/src/components/SocialFollow/__snapshots__/SocialFollow.test.js.snap +1 -1
  90. package/tests/unit/src/helpers/build-raw-query.test.js +70 -1
  91. package/tests/unit/src/helpers/build-sort-values.test.js +20 -0
  92. package/tests/unit/src/helpers/get-generic-render-variables.test.js +25 -0
  93. /package/tests/unit/src/components/SearchFilter/helpers/{build-new-query.test.js → build-new-url.test.js} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"build-sort-values.js","names":["getSortbyFieldName","buildAzSort","sortFilters","relations","stringProps","sortValues","forEach","sort","propsToDisplay","sortFieldName","toLowerCase","buildSortValues","useSortObject","length","map","isScore","filter","Boolean","join"],"sources":["../../src/helpers/build-sort-values.js"],"sourcesContent":["import getSortbyFieldName from './get-sort-by-field-name';\n\nconst buildAzSort = (sortFilters, relations, stringProps) => {\n const sortValues = {};\n sortFilters.forEach(({ sort, propsToDisplay }) => {\n if (!sort) return;\n const sortFieldName = getSortbyFieldName(relations, propsToDisplay, stringProps);\n if (sortFieldName) sortValues[sortFieldName] = sort.toLowerCase();\n });\n\n return sortValues;\n};\n\nconst buildSortValues = (sortFilters, relations, stringProps, useSortObject) => {\n if (!sortFilters || !sortFilters.length) return useSortObject ? null : { sort: [] };\n if (useSortObject) return buildAzSort(sortFilters, relations, stringProps);\n\n const sortValues = sortFilters\n .map(({ sort, propsToDisplay, isScore }) => {\n if (isScore) return '_score';\n if (!sort) return null;\n\n const sortFieldName = getSortbyFieldName(relations, propsToDisplay, stringProps);\n return sortFieldName ? `${sortFieldName}:${sort.toLowerCase()}` : null;\n })\n .filter(Boolean)\n .join(',');\n\n return { sort: sortValues };\n};\n\nexport default buildSortValues;\n"],"mappings":"AAAA,OAAOA,kBAAkB,MAAM,0BAA0B;AAEzD,MAAMC,WAAW,GAAGA,CAACC,WAAW,EAAEC,SAAS,EAAEC,WAAW,KAAK;EAC3D,MAAMC,UAAU,GAAG,CAAC,CAAC;EACrBH,WAAW,CAACI,OAAO,CAAC,CAAC;IAAEC,IAAI;IAAEC;EAAe,CAAC,KAAK;IAChD,IAAI,CAACD,IAAI,EAAE;IACX,MAAME,aAAa,GAAGT,kBAAkB,CAACG,SAAS,EAAEK,cAAc,EAAEJ,WAAW,CAAC;IAChF,IAAIK,aAAa,EAAEJ,UAAU,CAACI,aAAa,CAAC,GAAGF,IAAI,CAACG,WAAW,CAAC,CAAC;EACnE,CAAC,CAAC;EAEF,OAAOL,UAAU;AACnB,CAAC;AAED,MAAMM,eAAe,GAAGA,CAACT,WAAW,EAAEC,SAAS,EAAEC,WAAW,EAAEQ,aAAa,KAAK;EAC9E,IAAI,CAACV,WAAW,IAAI,CAACA,WAAW,CAACW,MAAM,EAAE,OAAOD,aAAa,GAAG,IAAI,GAAG;IAAEL,IAAI,EAAE;EAAG,CAAC;EACnF,IAAIK,aAAa,EAAE,OAAOX,WAAW,CAACC,WAAW,EAAEC,SAAS,EAAEC,WAAW,CAAC;EAE1E,MAAMC,UAAU,GAAGH,WAAW,CAC3BY,GAAG,CAAC,CAAC;IAAEP,IAAI;IAAEC,cAAc;IAAEO;EAAQ,CAAC,KAAK;IAC1C,IAAIA,OAAO,EAAE,OAAO,QAAQ;IAC5B,IAAI,CAACR,IAAI,EAAE,OAAO,IAAI;IAEtB,MAAME,aAAa,GAAGT,kBAAkB,CAACG,SAAS,EAAEK,cAAc,EAAEJ,WAAW,CAAC;IAChF,OAAOK,aAAa,GAAI,GAAEA,aAAc,IAAGF,IAAI,CAACG,WAAW,CAAC,CAAE,EAAC,GAAG,IAAI;EACxE,CAAC,CAAC,CACDM,MAAM,CAACC,OAAO,CAAC,CACfC,IAAI,CAAC,GAAG,CAAC;EAEZ,OAAO;IAAEX,IAAI,EAAEF;EAAW,CAAC;AAC7B,CAAC;AAED,eAAeM,eAAe"}
1
+ {"version":3,"file":"build-sort-values.js","names":["getSortbyFieldName","buildAzSort","sortFilters","relations","stringProps","sortValues","forEach","sort","propsToDisplay","sortFieldName","toLowerCase","buildSortValues","useSortObject","length","map","isScore","filter","item","index","arr","indexOf","join"],"sources":["../../src/helpers/build-sort-values.js"],"sourcesContent":["import getSortbyFieldName from './get-sort-by-field-name';\n\nconst buildAzSort = (sortFilters, relations, stringProps) => {\n const sortValues = {};\n sortFilters.forEach(({ sort, propsToDisplay }) => {\n if (!sort) return;\n const sortFieldName = getSortbyFieldName(relations, propsToDisplay, stringProps);\n if (sortFieldName) sortValues[sortFieldName] = sort.toLowerCase();\n });\n\n return sortValues;\n};\n\nconst buildSortValues = (sortFilters, relations, stringProps, useSortObject) => {\n if (!sortFilters || !sortFilters.length) return useSortObject ? null : { sort: [] };\n if (useSortObject) return buildAzSort(sortFilters, relations, stringProps);\n\n const sortValues = sortFilters\n .map(({ sort, propsToDisplay, isScore }) => {\n if (isScore) return '_score';\n if (!sort) return null;\n\n const sortFieldName = getSortbyFieldName(relations, propsToDisplay, stringProps);\n return sortFieldName ? `${sortFieldName}:${sort.toLowerCase()}` : null;\n })\n .filter((item, index, arr) => (!item ? false : arr.indexOf(item) === index))\n .join(',');\n\n return { sort: sortValues };\n};\n\nexport default buildSortValues;\n"],"mappings":"AAAA,OAAOA,kBAAkB,MAAM,0BAA0B;AAEzD,MAAMC,WAAW,GAAGA,CAACC,WAAW,EAAEC,SAAS,EAAEC,WAAW,KAAK;EAC3D,MAAMC,UAAU,GAAG,CAAC,CAAC;EACrBH,WAAW,CAACI,OAAO,CAAC,CAAC;IAAEC,IAAI;IAAEC;EAAe,CAAC,KAAK;IAChD,IAAI,CAACD,IAAI,EAAE;IACX,MAAME,aAAa,GAAGT,kBAAkB,CAACG,SAAS,EAAEK,cAAc,EAAEJ,WAAW,CAAC;IAChF,IAAIK,aAAa,EAAEJ,UAAU,CAACI,aAAa,CAAC,GAAGF,IAAI,CAACG,WAAW,CAAC,CAAC;EACnE,CAAC,CAAC;EAEF,OAAOL,UAAU;AACnB,CAAC;AAED,MAAMM,eAAe,GAAGA,CAACT,WAAW,EAAEC,SAAS,EAAEC,WAAW,EAAEQ,aAAa,KAAK;EAC9E,IAAI,CAACV,WAAW,IAAI,CAACA,WAAW,CAACW,MAAM,EAAE,OAAOD,aAAa,GAAG,IAAI,GAAG;IAAEL,IAAI,EAAE;EAAG,CAAC;EACnF,IAAIK,aAAa,EAAE,OAAOX,WAAW,CAACC,WAAW,EAAEC,SAAS,EAAEC,WAAW,CAAC;EAE1E,MAAMC,UAAU,GAAGH,WAAW,CAC3BY,GAAG,CAAC,CAAC;IAAEP,IAAI;IAAEC,cAAc;IAAEO;EAAQ,CAAC,KAAK;IAC1C,IAAIA,OAAO,EAAE,OAAO,QAAQ;IAC5B,IAAI,CAACR,IAAI,EAAE,OAAO,IAAI;IAEtB,MAAME,aAAa,GAAGT,kBAAkB,CAACG,SAAS,EAAEK,cAAc,EAAEJ,WAAW,CAAC;IAChF,OAAOK,aAAa,GAAI,GAAEA,aAAc,IAAGF,IAAI,CAACG,WAAW,CAAC,CAAE,EAAC,GAAG,IAAI;EACxE,CAAC,CAAC,CACDM,MAAM,CAAC,CAACC,IAAI,EAAEC,KAAK,EAAEC,GAAG,KAAM,CAACF,IAAI,GAAG,KAAK,GAAGE,GAAG,CAACC,OAAO,CAACH,IAAI,CAAC,KAAKC,KAAM,CAAC,CAC3EG,IAAI,CAAC,GAAG,CAAC;EAEZ,OAAO;IAAEd,IAAI,EAAEF;EAAW,CAAC;AAC7B,CAAC;AAED,eAAeM,eAAe"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blaze-cms/react-page-builder",
3
- "version": "0.133.0-project-admin-customisations.0",
3
+ "version": "0.134.0-admin-updates.0",
4
4
  "description": "Blaze react page builder",
5
5
  "main": "lib/index.js",
6
6
  "module": "lib-es/index.js",
@@ -27,15 +27,15 @@
27
27
  },
28
28
  "license": "GPL-3.0",
29
29
  "dependencies": {
30
- "@blaze-cms/core-auth-ui": "0.133.0-project-admin-customisations.0",
31
- "@blaze-cms/core-errors": "0.133.0-project-admin-customisations.0",
32
- "@blaze-cms/core-errors-ui": "0.133.0-project-admin-customisations.0",
33
- "@blaze-cms/image-cdn-react": "0.3.0-alpha.5",
34
- "@blaze-cms/nextjs-components": "0.133.0-project-admin-customisations.0",
35
- "@blaze-cms/plugin-search-ui": "0.133.0-project-admin-customisations.0",
36
- "@blaze-cms/setup-ui": "0.133.0-project-admin-customisations.0",
37
- "@blaze-cms/utils": "0.133.0-project-admin-customisations.0",
38
- "@blaze-cms/utils-handlebars": "0.133.0-project-admin-customisations.0",
30
+ "@blaze-cms/core-auth-ui": "0.134.0-admin-updates.0",
31
+ "@blaze-cms/core-errors": "0.134.0-admin-updates.0",
32
+ "@blaze-cms/core-errors-ui": "0.134.0-admin-updates.0",
33
+ "@blaze-cms/image-cdn-react": "0.3.0-alpha.6",
34
+ "@blaze-cms/nextjs-components": "0.134.0-admin-updates.0",
35
+ "@blaze-cms/plugin-search-ui": "0.134.0-admin-updates.0",
36
+ "@blaze-cms/setup-ui": "0.134.0-admin-updates.0",
37
+ "@blaze-cms/utils": "0.134.0-admin-updates.0",
38
+ "@blaze-cms/utils-handlebars": "0.134.0-admin-updates.0",
39
39
  "@blaze-react/breadcrumb": "0.8.0-alpha.60",
40
40
  "@blaze-react/button": "0.5.19",
41
41
  "@blaze-react/checkboxes": "0.5.31",
@@ -75,7 +75,7 @@
75
75
  "next": "12.x",
76
76
  "prop-types": "^15.7.2",
77
77
  "react": "^17.0.2",
78
- "react-icons": ">= 4.3.1"
78
+ "react-icons": "^4.11.0"
79
79
  },
80
80
  "devDependencies": {
81
81
  "@testing-library/jest-dom": "^5.11.3",
@@ -89,5 +89,5 @@
89
89
  "lib/*",
90
90
  "lib-es/*"
91
91
  ],
92
- "gitHead": "aaf10121050962f9219e752b37ad56e8b5bf265b"
92
+ "gitHead": "6eebfa2c3fdbef9c3cf817a86ea4ecb0224c9880"
93
93
  }
@@ -2,6 +2,7 @@ import React, { useState } from 'react';
2
2
  import { AdSlot } from 'react-dfp';
3
3
  import PropTypes from 'prop-types';
4
4
  import { BANNER_LOADING, BANNER_EMPTY, BANNER_LOADED } from '../../constants';
5
+ import Wrapper from '../Wrapper';
5
6
 
6
7
  const AdSlotRender = ({
7
8
  shouldShowBanner,
@@ -9,6 +10,7 @@ const AdSlotRender = ({
9
10
  sizeId,
10
11
  parsedAdunit,
11
12
  parsedSizes,
13
+ modifiers,
12
14
  targetingArguments
13
15
  }) => {
14
16
  const [{ loadingStatus = BANNER_LOADING, minHeight }, setLoadingStatus] = useState({});
@@ -24,11 +26,11 @@ const AdSlotRender = ({
24
26
  })
25
27
  .sort();
26
28
  const className = `ad-slot ad-slot-${loadingStatus} ${bannerClass}`;
27
-
29
+ const newModifers = `${modifiers} banner-${loadingStatus}`;
28
30
  return (
29
- <>
31
+ <Wrapper className="banner" modifiers={newModifers}>
30
32
  {styles && <style>{styles.join('\n')}</style>}
31
- <div className={className} style={{ minHeight }}>
33
+ <div className={className} style={{ minHeight }} data-testid="ad-slot">
32
34
  {shouldShowBanner && (
33
35
  <AdSlot
34
36
  adUnit={parsedAdunit}
@@ -46,7 +48,7 @@ const AdSlotRender = ({
46
48
  />
47
49
  )}
48
50
  </div>
49
- </>
51
+ </Wrapper>
50
52
  );
51
53
  };
52
54
 
@@ -56,11 +58,13 @@ AdSlotRender.propTypes = {
56
58
  sizeId: PropTypes.string.isRequired,
57
59
  parsedAdunit: PropTypes.string.isRequired,
58
60
  parsedSizes: PropTypes.array,
61
+ modifiers: PropTypes.string,
59
62
  targetingArguments: PropTypes.object.isRequired
60
63
  };
61
64
 
62
65
  AdSlotRender.defaultProps = {
63
- parsedSizes: null
66
+ parsedSizes: null,
67
+ modifiers: ''
64
68
  };
65
69
 
66
70
  export default AdSlotRender;
@@ -7,7 +7,6 @@ import { useQuery } from '@apollo/client';
7
7
  import { useRouter } from 'next/router';
8
8
  import { buildUserQuery, buildPropsData } from './helpers';
9
9
  import { getSingleEntitySchema, getUser } from '../../application/query';
10
- import Wrapper from '../Wrapper';
11
10
  import BannerRender from './BannerRender';
12
11
  import buildPropsQuery from '../../helpers/build-props-query';
13
12
  import { getClassModifiers } from '../../utils';
@@ -47,16 +46,15 @@ const Banner = ({ type, ...otherProps }) => {
47
46
  const bannerKey = `${sizeId}${asPath}`;
48
47
 
49
48
  return (
50
- <Wrapper className={type} modifiers={modifiers}>
51
- <BannerRender
52
- key={bannerKey}
53
- {...otherProps}
54
- action={action}
55
- actionKey={actionKey}
56
- asPath={asPath}
57
- userPropsData={userPropsData}
58
- />
59
- </Wrapper>
49
+ <BannerRender
50
+ key={bannerKey}
51
+ {...otherProps}
52
+ action={action}
53
+ actionKey={actionKey}
54
+ asPath={asPath}
55
+ userPropsData={userPropsData}
56
+ modifiers={modifiers}
57
+ />
60
58
  );
61
59
  };
62
60
 
@@ -34,6 +34,7 @@ const BannerRender = ({
34
34
  actionKey,
35
35
  renderCounter,
36
36
  userPropsData,
37
+ modifiers,
37
38
  ...otherProps
38
39
  }) => {
39
40
  const { id } = otherProps;
@@ -90,6 +91,7 @@ const BannerRender = ({
90
91
  sizeId={sizeId}
91
92
  parsedAdunit={parsedAdunit}
92
93
  parsedSizes={parsedSizes}
94
+ modifiers={modifiers}
93
95
  targetingArguments={targetingArguments}
94
96
  />
95
97
  );
@@ -108,6 +110,7 @@ BannerRender.propTypes = {
108
110
  targetings: PropTypes.string,
109
111
  sizes: PropTypes.string,
110
112
  renderCounter: PropTypes.number,
113
+ modifiers: PropTypes.string,
111
114
  userPropsData: PropTypes.object
112
115
  };
113
116
 
@@ -120,6 +123,7 @@ BannerRender.defaultProps = {
120
123
  targetings: '',
121
124
  sizes: '',
122
125
  renderCounter: null,
126
+ modifiers: '',
123
127
  userPropsData: {}
124
128
  };
125
129
 
@@ -60,7 +60,12 @@ const Button = props => {
60
60
  const logout = () => {
61
61
  handleLogout(client);
62
62
  if (hasChildren(children)) return setShowChildren(true);
63
- return url ? router.reload(urlToUse) : router.reload();
63
+
64
+ if (!urlToUse) return router.reload();
65
+
66
+ return urlToUse.startsWith('/')
67
+ ? router.push('/Resolver', urlToUse)
68
+ : (window.location.href = urlToUse);
64
69
  };
65
70
 
66
71
  const handleClick = () => {
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import { hasChildren } from '../../helpers';
4
4
 
5
- const ContentGroupSection = ({ children, name }) => {
5
+ const ContentGroupSection = ({ children, name, ...props }) => {
6
6
  if (!hasChildren(children)) return null;
7
7
 
8
8
  return (
@@ -6,14 +6,12 @@ const getSortProps = ({
6
6
  defaultSortBy,
7
7
  isTextSearchFilterApplied
8
8
  }) => {
9
- const sort = querySort || (sortProperties.length ? null : defaultSort);
10
- let sortby = null;
11
- if (querySortBy) sortby = [querySortBy];
12
- else if (!sortProperties.length) sortby = defaultSortBy;
13
-
14
9
  const updatedSortProperties = [...sortProperties];
10
+ if (!querySort && !sortProperties.length) {
11
+ updatedSortProperties.unshift({ sort: defaultSort, propsToDisplay: defaultSortBy });
12
+ }
15
13
  if (isTextSearchFilterApplied) updatedSortProperties.unshift({ isScore: true });
16
- if (sort) updatedSortProperties.unshift({ sort, propsToDisplay: sortby });
14
+ if (querySort) updatedSortProperties.unshift({ sort: querySort, propsToDisplay: [querySortBy] });
17
15
 
18
16
  const sortbyFilters = updatedSortProperties
19
17
  .map(({ propsToDisplay: filterProps }) => filterProps)
@@ -3,7 +3,8 @@ 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, buildUrlQuery, getResponsiveFilterClassnames } from '../helpers';
6
+ import { isDeviceDesktop, getResponsiveFilterClassnames, buildUrlQuery } from '../helpers';
7
+
7
8
  import CloseMobileForm from './CloseMobileForm';
8
9
  import ResetDesktopForm from './ResetDesktopForm';
9
10
  import MobileFormToolbar from './MobileFormToolbar';
@@ -31,7 +32,9 @@ const SearchFilter = ({
31
32
  const [moreFiltersDesktopCollapsed, setMoreFiltersDesktopCollapsed] = useState(true);
32
33
 
33
34
  const doSubmit = newValues => {
34
- const newQuery = buildUrlQuery(newValues, filters, listComponentName, query);
35
+ const newQuery = filterValues
36
+ ? buildUrlQuery(newValues, filters, listComponentName, query)
37
+ : '';
35
38
  handleSearch(newQuery);
36
39
  setMoreFiltersDesktopCollapsed(true);
37
40
  setMoreFiltersMobileCollapsed(true);
@@ -152,7 +155,7 @@ const SearchFilter = ({
152
155
  onClick={() =>
153
156
  setMoreFiltersDesktopCollapsed(!moreFiltersDesktopCollapsed)
154
157
  }>
155
- More filters
158
+ {moreFiltersDesktopCollapsed ? 'More filters' : 'Less filters'}
156
159
  </button>
157
160
  )}
158
161
 
@@ -1,22 +1,25 @@
1
- import React, { useState, useRef, useReducer, useEffect } from 'react';
1
+ import React, { useState, useEffect, useRef, useReducer, useContext } from 'react';
2
+ import { MainContext } from '@blaze-cms/nextjs-components';
2
3
  import { useRouter } from 'next/router';
3
4
  import { useQuery } from '@apollo/client';
4
5
  import PropTypes from 'prop-types';
5
6
  import { parseUrl } from 'query-string';
6
7
  import SearchFilter from './SearchFilter';
7
8
  import { withTitle } from '../../HOC';
8
- import { getSearchPublishedContent } from '../../application/query';
9
+ import { getSearchPublishedContent, generateSingleItemQuery } from '../../application/query';
9
10
  import {
10
11
  buildNewUrl,
11
12
  buildRawQueryStringified,
12
13
  getFilterValues,
13
14
  buildFiltersQuery,
14
- getFilterRangesAndCheckboxesValues
15
+ getFilterRangesAndCheckboxesValues,
16
+ getUpdatedFilterBy
15
17
  } from './helpers';
16
- import { getEntityData } from '../../helpers';
18
+ import { getEntityData, getInheritedFilters, getQueryProps } from '../../helpers';
17
19
  import { RAW_RESULTS } from './constants';
18
20
  import { SCROLL_OFFSET } from '../../constants';
19
21
  import searchFilterReducer from './searchFilterReducer';
22
+ import { useGetEntitySchemasAsObj } from '../../hooks';
20
23
 
21
24
  const getFiltersUrlQuery = (query, listName) => {
22
25
  if (!listName) return query;
@@ -46,18 +49,20 @@ const SearchFilterContainer = ({
46
49
  filterBy,
47
50
  filterByProperty,
48
51
  shouldAddFilters,
49
- listComponentName
52
+ listComponentName,
53
+ parent
50
54
  }) => {
55
+ const { isPreview } = useContext(MainContext);
51
56
  const router = useRouter();
52
57
  const { asPath } = router;
53
58
  const searchFilterRef = useRef(null);
54
59
  const [key, setKey] = useState(`filter-${name}`);
55
60
  const [displaySearchFilter, setDisplaySearchFilter] = useState(false);
56
61
  const [urlPath, setUrlPath] = useState(asPath); // used as asPath can take too long to update
62
+ const [filterValues, dispatch] = useReducer(searchFilterReducer, null);
57
63
  const { url: currentUrl, query } = parseUrl(urlPath);
58
64
  const updatedQuery = getFiltersUrlQuery(query, listComponentName);
59
-
60
- const [filterValues, dispatch] = useReducer(searchFilterReducer, null);
65
+ const { itemId: parentId, itemEntity: parentEntity } = parent;
61
66
 
62
67
  useEffect(
63
68
  () => {
@@ -65,6 +70,27 @@ const SearchFilterContainer = ({
65
70
  },
66
71
  [asPath]
67
72
  );
73
+ const { data: mainSchemas = {}, loading: schemasLoading } = useGetEntitySchemasAsObj([
74
+ parentEntity,
75
+ entity
76
+ ]);
77
+ const { [parentEntity]: parentSchema = {}, [entity]: filterEntitySchema = {} } = mainSchemas;
78
+ const { actions = {} } = parentSchema || {};
79
+ const getAction = isPreview ? actions.get : actions.getPublished;
80
+ const inheritedFilters = getInheritedFilters(filterBy, filterByProperty);
81
+ const queryProps = getQueryProps(inheritedFilters, parentSchema, filterEntitySchema);
82
+ const { data: { entityData: parentData } = {}, loading: parentQueryLoading } = useQuery(
83
+ generateSingleItemQuery(getAction, queryProps),
84
+ {
85
+ variables: { id: parentId },
86
+ skip: schemasLoading || !inheritedFilters.length
87
+ }
88
+ );
89
+ const { updatedFilterBy, updatedFilterByProperty } = getUpdatedFilterBy(
90
+ filterBy,
91
+ filterByProperty,
92
+ parentData
93
+ );
68
94
 
69
95
  const action = getSearchPublishedContent(RAW_RESULTS);
70
96
  const [checkboxSelectValues, rangeValues] = getFilterRangesAndCheckboxesValues(filters);
@@ -73,9 +99,9 @@ const SearchFilterContainer = ({
73
99
 
74
100
  const filtersQuery = buildFiltersQuery({
75
101
  shouldAddFilters,
76
- query: filterValues || {},
77
- filterBy,
78
- filterByProperty,
102
+ query: filterValues,
103
+ filterBy: updatedFilterBy,
104
+ filterByProperty: updatedFilterByProperty,
79
105
  rangeValues,
80
106
  queryKeys: Object.keys(updatedQuery)
81
107
  });
@@ -89,7 +115,7 @@ const SearchFilterContainer = ({
89
115
 
90
116
  const { data, error, loading } = useQuery(action, {
91
117
  variables: { rawQueryStringified, limit: 0 }, // we only want aggs so limit=0 for no search results
92
- skip: !rawQueryStringified
118
+ skip: !rawQueryStringified || parentQueryLoading
93
119
  });
94
120
 
95
121
  if (error) return error.message;
@@ -98,7 +124,7 @@ const SearchFilterContainer = ({
98
124
  const { searchPublishedContent: { rawResults: { aggregations: filterData } = {} } = {} } =
99
125
  data || {};
100
126
 
101
- if (!filterValues && !loading && (filterData || !rawQueryStringified)) {
127
+ if (!filterValues && !loading && !parentQueryLoading && (filterData || !rawQueryStringified)) {
102
128
  const newValues = getFilterValues(filterData, filters, updatedQuery);
103
129
  dispatch({ newValues, shouldSearch: false, type: 'update' });
104
130
  return null;
@@ -171,7 +197,8 @@ SearchFilterContainer.propTypes = {
171
197
  filterBy: PropTypes.array,
172
198
  filterByProperty: PropTypes.array,
173
199
  shouldAddFilters: PropTypes.bool,
174
- listComponentName: PropTypes.string
200
+ listComponentName: PropTypes.string,
201
+ parent: PropTypes.object
175
202
  };
176
203
 
177
204
  SearchFilterContainer.defaultProps = {
@@ -184,7 +211,8 @@ SearchFilterContainer.defaultProps = {
184
211
  filterBy: [],
185
212
  filterByProperty: [],
186
213
  shouldAddFilters: false,
187
- listComponentName: ''
214
+ listComponentName: '',
215
+ parent: {}
188
216
  };
189
217
 
190
218
  export default withTitle(SearchFilterContainer);
@@ -29,38 +29,41 @@ const builFilterObject = ({ queryKey, value, filters, isRange, isInQuery }) => {
29
29
  filters.push({ match: { [key]: filterValue } });
30
30
  });
31
31
  };
32
+
32
33
  const buildFiltersQuery = ({
33
34
  shouldAddFilters,
34
- query,
35
+
35
36
  filterBy,
36
37
  filterByProperty,
37
38
  rangeValues,
38
- queryKeys
39
+ queryKeys,
40
+ query
39
41
  }) => {
40
42
  if (!shouldAddFilters) return [];
41
43
  const mustFilters = [];
42
- Object.keys(query).forEach(queryKey => {
43
- if (QUERY_KEYS_TO_IGNORE.includes(queryKey)) return;
44
- if (!queryKey || !query[queryKey]) return;
45
- const queryValue = query[queryKey];
44
+ if (query) {
45
+ Object.keys(query).forEach(queryKey => {
46
+ if (QUERY_KEYS_TO_IGNORE.includes(queryKey)) return;
47
+ if (!queryKey || !query[queryKey]) return;
48
+ const queryValue = query[queryKey];
46
49
 
47
- const isRange = rangeValues.includes(queryKey);
48
- const isInQuery = queryKeys.includes(queryKey);
49
- builFilterObject({ queryKey, value: queryValue, filters: mustFilters, isRange, isInQuery });
50
- });
50
+ const isRange = rangeValues.includes(queryKey);
51
+ const isInQuery = queryKeys.includes(queryKey);
52
+ builFilterObject({ queryKey, value: queryValue, filters: mustFilters, isRange, isInQuery });
53
+ });
54
+ }
51
55
 
52
56
  if (filterByProperty && filterByProperty.length) {
53
- filterByProperty &&
54
- filterByProperty.forEach(filterByPropOption => {
55
- const [filterByPropKey] = filterByPropOption.split('/');
56
- filterBy.forEach(filterByOption => {
57
- if (filterByOption.indexOf(filterByPropKey) === -1) return;
58
- const [, filteryByValue] = filterByOption.split('/');
59
- const filterByKeyword = `${filterByPropKey}.keyword`;
60
- if (!filteryByValue) return;
61
- mustFilters.push({ match: { [filterByKeyword]: filteryByValue } });
62
- });
57
+ filterByProperty.forEach(filterByPropOption => {
58
+ const [filterByPropKey] = filterByPropOption.split('/');
59
+ filterBy.forEach(filterByOption => {
60
+ if (filterByOption.indexOf(filterByPropKey) === -1) return;
61
+ const [, filteryByValue] = filterByOption.split('/');
62
+ const filterByKeyword = `${filterByPropKey}.keyword`;
63
+ if (!filteryByValue) return;
64
+ mustFilters.push({ match: { [filterByKeyword]: filteryByValue } });
63
65
  });
66
+ });
64
67
  }
65
68
 
66
69
  return mustFilters;
@@ -2,9 +2,7 @@ import { SEARCH_TERM, TEXT_SEARCH } from '../constants';
2
2
  import parseFilterValue from './parse-filter-value';
3
3
  import { buildQueryKey } from '../../../helpers';
4
4
 
5
- const buildUrlQuery = (filterValues, filters, listComponentName = '', query = {}) => {
6
- if (!filterValues) return '';
7
-
5
+ const buildUrlQuery = (filterValues = {}, filters = [], listComponentName = '', query = {}) => {
8
6
  const newQuery = [];
9
7
  const queryKeys = [];
10
8
  const searchValue = filterValues[SEARCH_TERM];
@@ -0,0 +1,24 @@
1
+ import { SEARCH_TERM, TEXT_SEARCH } from '../constants';
2
+ import getFilterValueFromQuery from './get-filter-value-from-query';
3
+ import { buildQueryKey } from '../../../helpers';
4
+
5
+ const getInitialFilterValues = (filterData, filters, query, listComponentName) => {
6
+ const filterValues = {};
7
+ const searchQueryKey = buildQueryKey(SEARCH_TERM, listComponentName);
8
+ filterValues[SEARCH_TERM] = query[searchQueryKey] || '';
9
+
10
+ filters.forEach(filterProps => {
11
+ const {
12
+ propsToDisplay: [key],
13
+ type
14
+ } = filterProps;
15
+ if (type === TEXT_SEARCH) return;
16
+ const data = filterData && filterData[key] ? filterData[key] : {};
17
+ const queryKey = buildQueryKey(key, listComponentName);
18
+ filterValues[key] = getFilterValueFromQuery(queryKey, filterProps, data, query);
19
+ });
20
+
21
+ return filterValues;
22
+ };
23
+
24
+ export default getInitialFilterValues;
@@ -0,0 +1,18 @@
1
+ const getUpdatedFilterBy = (filterBy, filterByProperty, parentData) => {
2
+ if (!parentData || (filterBy && filterBy.length))
3
+ return { updatedFilterBy: filterBy, updatedFilterByProperty: filterByProperty };
4
+
5
+ const updatedFilterBy = [];
6
+ filterByProperty.forEach(property => {
7
+ const [key] = property.split('/');
8
+ const filterData = parentData[key];
9
+
10
+ if (!filterData) return;
11
+ if (Array.isArray(filterData)) filterData.forEach(dat => updatedFilterBy.push(`${key}/${dat}`));
12
+ else updatedFilterBy.push(`${key}/${filterData}`);
13
+ });
14
+
15
+ return { updatedFilterBy, updatedFilterByProperty: filterByProperty };
16
+ };
17
+
18
+ export default getUpdatedFilterBy;
@@ -12,12 +12,12 @@ import getSelectOptions from './get-select-options';
12
12
  import isDeviceDesktop from './is-device-desktop';
13
13
  import getFilterValues from './get-filter-values';
14
14
  import getFilterValueFromQuery from './get-filter-value-from-query';
15
- import buildUrlQuery from './build-url-query';
16
15
  import buildFiltersQuery from './build-filters-query';
17
16
  import getFilterRangesAndCheckboxesValues from './get-filter-ranges-and-checkboxes-values';
17
+ import getUpdatedFilterBy from './get-updated-filter-by';
18
+ import buildUrlQuery from './build-url-query';
18
19
 
19
20
  export {
20
- buildUrlQuery,
21
21
  buildNewUrl,
22
22
  buildRawQueryStringified,
23
23
  decodeValue,
@@ -34,5 +34,7 @@ export {
34
34
  getFilterValues,
35
35
  getFilterValueFromQuery,
36
36
  buildFiltersQuery,
37
- getFilterRangesAndCheckboxesValues
37
+ getFilterRangesAndCheckboxesValues,
38
+ getUpdatedFilterBy,
39
+ buildUrlQuery
38
40
  };
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  FaFacebookF,
3
- FaTwitter,
4
3
  FaPinterestP,
5
4
  FaInstagram,
6
5
  FaLinkedinIn,
7
6
  FaYoutube,
8
7
  FaTiktok
9
8
  } from 'react-icons/fa';
9
+ import { FaXTwitter } from 'react-icons/fa6';
10
10
 
11
11
  export const BASE_CLASS_NAME_FOLLOW = 'social__list-item social__list-item--follow';
12
12
  export const PORTRAIT = 'portrait';
@@ -22,7 +22,7 @@ export const SOCIAL_NETWORKS = {
22
22
  twitter: {
23
23
  name: 'Twitter',
24
24
  className: 'twitter',
25
- Icon: FaTwitter,
25
+ Icon: FaXTwitter,
26
26
  spanClassName: 'hidden'
27
27
  },
28
28
  pinterest: {
@@ -20,8 +20,12 @@ const buildRawQuery = ({
20
20
  searchValuesCheckboxOr
21
21
  } = searchValues;
22
22
  const { filterValues, filterOperator, relations, stringProps, azFilter } = filterData;
23
+
23
24
  const { isAZ, sortProperties = [] } = azOptions || {};
24
- const [{ propsToDisplay: [azSortProp] } = { propsToDisplay: [] }] = sortProperties;
25
+ const sortPropertyToUse = isAZ && sortProperties[0] && sortProperties[0].isScore ? 1 : 0;
26
+ const { propsToDisplay: [azSortProp] = [] } = sortProperties[sortPropertyToUse] || {
27
+ propsToDisplay: []
28
+ };
25
29
  const azSortProperty = azSortProp || AZ_DEFAULT_PROP;
26
30
 
27
31
  const searchValuesTextCheckboxSelectJoined =
@@ -23,7 +23,7 @@ const buildSortValues = (sortFilters, relations, stringProps, useSortObject) =>
23
23
  const sortFieldName = getSortbyFieldName(relations, propsToDisplay, stringProps);
24
24
  return sortFieldName ? `${sortFieldName}:${sort.toLowerCase()}` : null;
25
25
  })
26
- .filter(Boolean)
26
+ .filter((item, index, arr) => (!item ? false : arr.indexOf(item) === index))
27
27
  .join(',');
28
28
 
29
29
  return { sort: sortValues };
@@ -50,17 +50,17 @@ describe('Banner render component', () => {
50
50
  <AdSlotRender {...defaultProps} shouldShowBanner={false} />
51
51
  );
52
52
 
53
- expect(container.childNodes[0].nodeName).toEqual('STYLE');
54
- expect(container.childNodes[1]).toHaveClass('ad-slot ad-slot-loading banner-sizeId');
53
+ expect(container.childNodes[0].nodeName).toEqual('DIV');
54
+ expect(getByTestId('ad-slot')).toHaveClass('ad-slot ad-slot-loading banner-sizeId');
55
55
  expect(() => getByTestId(slotTestId)).toThrow();
56
56
  expect(asFragment()).toMatchSnapshot();
57
57
  });
58
58
 
59
59
  describe('AdSlot loading', () => {
60
60
  it('should render AdSlot', () => {
61
- const { asFragment, container, getByTestId } = render(<AdSlotRender {...defaultProps} />);
61
+ const { asFragment, getByTestId } = render(<AdSlotRender {...defaultProps} />);
62
62
  expect(getByTestId('adslot-test')).toBeDefined();
63
- expect(container.childNodes[1]).toHaveClass('ad-slot ad-slot-loading banner-sizeId');
63
+ expect(getByTestId('ad-slot')).toHaveClass('ad-slot ad-slot-loading banner-sizeId');
64
64
  expect(asFragment()).toMatchSnapshot();
65
65
  });
66
66
 
@@ -69,16 +69,11 @@ describe('Banner render component', () => {
69
69
  const adSlot = getByTestId(slotTestId);
70
70
 
71
71
  fireEvent.mouseOver(adSlot);
72
- await waitFor(() =>
73
- expect(container.childNodes[0]).toHaveClass('ad-slot ad-slot-loaded banner-sizeId')
74
- );
75
- expect(container.childNodes[0]).toHaveStyle('min-height: 250px');
72
+ await waitFor(() => expect(container.childNodes[0]).toHaveClass('banner banner-loaded'));
76
73
  expect(asFragment()).toMatchSnapshot();
77
74
 
78
75
  fireEvent.mouseLeave(adSlot);
79
- await waitFor(() =>
80
- expect(container.childNodes[0]).toHaveClass('ad-slot ad-slot-empty banner-sizeId')
81
- );
76
+ await waitFor(() => expect(container.childNodes[0]).toHaveClass('banner banner-empty'));
82
77
  expect(asFragment()).toMatchSnapshot();
83
78
  });
84
79
  });