@blaze-cms/react-page-builder 0.123.0-alpha.9 → 0.123.1-alpha.1
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.
- package/CHANGELOG.md +104 -790
- package/lib/components/Card/Card.js +20 -6
- package/lib/components/Card/Card.js.map +1 -1
- package/lib/components/Card/CardContainer.js +20 -4
- package/lib/components/Card/CardContainer.js.map +1 -1
- package/lib/components/CarouselWrapper.js +12 -5
- package/lib/components/CarouselWrapper.js.map +1 -1
- package/lib/components/DataSummary/helpers/get-link-based-on-value.js +4 -0
- package/lib/components/DataSummary/helpers/get-link-based-on-value.js.map +1 -1
- package/lib/components/List/components/Cards/CardsRenderItem.js +23 -4
- package/lib/components/List/components/Cards/CardsRenderItem.js.map +1 -1
- package/lib/components/Menu/Menu.js +6 -29
- package/lib/components/Menu/Menu.js.map +1 -1
- package/lib/components/SearchContent/index.js +34 -25
- package/lib/components/SearchContent/index.js.map +1 -1
- package/lib/components/SearchFilter/SearchFilter/FiltersList.js +16 -11
- package/lib/components/SearchFilter/SearchFilter/FiltersList.js.map +1 -1
- package/lib/components/SearchFilter/SearchFilter/SearchFilter.js +15 -50
- package/lib/components/SearchFilter/SearchFilter/SearchFilter.js.map +1 -1
- package/lib/components/SearchFilter/components/Select.js +22 -10
- package/lib/components/SearchFilter/components/Select.js.map +1 -1
- package/lib/components/index.js +5 -0
- package/lib/components/index.js.map +1 -1
- package/lib/constants/index.js +5 -2
- package/lib/constants/index.js.map +1 -1
- package/lib-es/components/Card/Card.js +18 -4
- package/lib-es/components/Card/Card.js.map +1 -1
- package/lib-es/components/Card/CardContainer.js +21 -5
- package/lib-es/components/Card/CardContainer.js.map +1 -1
- package/lib-es/components/CarouselWrapper.js +12 -5
- package/lib-es/components/CarouselWrapper.js.map +1 -1
- package/lib-es/components/DataSummary/helpers/get-link-based-on-value.js +5 -1
- package/lib-es/components/DataSummary/helpers/get-link-based-on-value.js.map +1 -1
- package/lib-es/components/List/components/Cards/CardsRenderItem.js +23 -4
- package/lib-es/components/List/components/Cards/CardsRenderItem.js.map +1 -1
- package/lib-es/components/Menu/Menu.js +7 -30
- package/lib-es/components/Menu/Menu.js.map +1 -1
- package/lib-es/components/SearchContent/index.js +31 -24
- package/lib-es/components/SearchContent/index.js.map +1 -1
- package/lib-es/components/SearchFilter/SearchFilter/FiltersList.js +20 -16
- package/lib-es/components/SearchFilter/SearchFilter/FiltersList.js.map +1 -1
- package/lib-es/components/SearchFilter/SearchFilter/SearchFilter.js +10 -40
- package/lib-es/components/SearchFilter/SearchFilter/SearchFilter.js.map +1 -1
- package/lib-es/components/SearchFilter/components/Select.js +22 -6
- package/lib-es/components/SearchFilter/components/Select.js.map +1 -1
- package/lib-es/components/index.js +4 -1
- package/lib-es/components/index.js.map +1 -1
- package/lib-es/constants/index.js +3 -1
- package/lib-es/constants/index.js.map +1 -1
- package/package.json +3 -3
- package/src/components/Card/Card.js +28 -3
- package/src/components/Card/CardContainer.js +18 -2
- package/src/components/CarouselWrapper.js +8 -5
- package/src/components/DataSummary/helpers/get-link-based-on-value.js +9 -1
- package/src/components/List/components/Cards/CardsRenderItem.js +22 -3
- package/src/components/Menu/Menu.js +4 -37
- package/src/components/SearchContent/index.js +29 -20
- package/src/components/SearchFilter/SearchFilter/FiltersList.js +5 -2
- package/src/components/SearchFilter/SearchFilter/SearchFilter.js +113 -148
- package/src/components/SearchFilter/components/Select.js +29 -6
- package/src/components/index.js +2 -1
- package/src/constants/index.js +3 -1
- package/tests/unit/src/components/Card/__snapshots__/Card.test.js.snap +10 -10
- package/tests/unit/src/components/Card/__snapshots__/CardContainer.test.js.snap +8 -8
- package/tests/unit/src/components/Card/__snapshots__/CardRender.test.js.snap +2 -2
- package/tests/unit/src/components/Card/mockData.js +2 -0
- package/tests/unit/src/components/DataSummary/helpers/get-link-based-on-value.test.js +29 -0
- package/tests/unit/src/components/List/components/Cards/__snapshots__/CardsRender.test.js.snap +12 -12
- package/tests/unit/src/components/Menu/Menu.test.js +3 -1
- package/tests/unit/src/components/Menu/__snapshots__/Menu.test.js.snap +3 -0
- package/tests/unit/src/components/SearchFilter/SearchFilter/SearchFilter.test.js +64 -86
- package/tests/unit/src/components/SearchFilter/SearchFilter/__snapshots__/SearchFilter.test.js.snap +133 -61
- package/tests/unit/src/components/SearchFilter/components/Select.test.js +58 -4
- package/tests/unit/src/components/SearchFilter/components/__snapshots__/Select.test.js.snap +28 -5
- package/tests/unit/src/components/__snapshots__/index.test.js.snap +4 -0
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
DATA_SUMMARY_EMAIL_REGEX,
|
|
3
|
+
DATA_SUMMARY_URL_REGEX,
|
|
4
|
+
DATA_SUMMARY_TEL_REGEX
|
|
5
|
+
} from '../../../constants';
|
|
2
6
|
|
|
3
7
|
function getLinkBasedOnValue(value) {
|
|
4
8
|
if (DATA_SUMMARY_EMAIL_REGEX.test(value)) {
|
|
@@ -8,6 +12,10 @@ function getLinkBasedOnValue(value) {
|
|
|
8
12
|
return value;
|
|
9
13
|
}
|
|
10
14
|
|
|
15
|
+
if (DATA_SUMMARY_TEL_REGEX.test(value)) {
|
|
16
|
+
return `tel:${value}`;
|
|
17
|
+
}
|
|
18
|
+
|
|
11
19
|
return '';
|
|
12
20
|
}
|
|
13
21
|
|
|
@@ -21,7 +21,12 @@ const CardsRenderItem = ({
|
|
|
21
21
|
propsToDisplay,
|
|
22
22
|
shouldRenderBanner,
|
|
23
23
|
bannerIndex,
|
|
24
|
-
priority
|
|
24
|
+
priority,
|
|
25
|
+
enableOverlay,
|
|
26
|
+
autoScrollTimer,
|
|
27
|
+
arrowSize,
|
|
28
|
+
overlayModifier,
|
|
29
|
+
titleOverlayModifier
|
|
25
30
|
}) => {
|
|
26
31
|
const {
|
|
27
32
|
initialOffset,
|
|
@@ -73,6 +78,10 @@ const CardsRenderItem = ({
|
|
|
73
78
|
gtmId={name}
|
|
74
79
|
gtmChildren={gtmChildren}
|
|
75
80
|
priority={priority}
|
|
81
|
+
arrowSize={arrowSize}
|
|
82
|
+
enableOverlay={enableOverlay}
|
|
83
|
+
overlayModifier={overlayModifier}
|
|
84
|
+
titleOverlayModifier={titleOverlayModifier}
|
|
76
85
|
{...cardProps}
|
|
77
86
|
/>
|
|
78
87
|
</div>
|
|
@@ -96,7 +105,12 @@ CardsRenderItem.propTypes = {
|
|
|
96
105
|
modifier: PropTypes.string,
|
|
97
106
|
cardChildren: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node]),
|
|
98
107
|
gtmChildren: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node]),
|
|
99
|
-
priority: PropTypes.bool
|
|
108
|
+
priority: PropTypes.bool,
|
|
109
|
+
enableOverlay: PropTypes.bool,
|
|
110
|
+
overlayModifier: PropTypes.string,
|
|
111
|
+
titleOverlayModifier: PropTypes.string,
|
|
112
|
+
autoScrollTimer: PropTypes.number,
|
|
113
|
+
arrowSize: PropTypes.string
|
|
100
114
|
};
|
|
101
115
|
|
|
102
116
|
CardsRenderItem.defaultProps = {
|
|
@@ -106,7 +120,12 @@ CardsRenderItem.defaultProps = {
|
|
|
106
120
|
propsToDisplay: [],
|
|
107
121
|
modifier: '',
|
|
108
122
|
cardChildren: [],
|
|
109
|
-
gtmChildren: []
|
|
123
|
+
gtmChildren: [],
|
|
124
|
+
enableOverlay: false,
|
|
125
|
+
autoScrollTimer: 0,
|
|
126
|
+
overlayModifier: '',
|
|
127
|
+
titleOverlayModifier: '',
|
|
128
|
+
arrowSize: ''
|
|
110
129
|
};
|
|
111
130
|
|
|
112
131
|
export default CardsRenderItem;
|
|
@@ -15,9 +15,6 @@ const Menu = ({
|
|
|
15
15
|
mobileIconAlignment,
|
|
16
16
|
mobileButtonModifier,
|
|
17
17
|
hamburgerIconModifier,
|
|
18
|
-
searchInputAlignment,
|
|
19
|
-
searchInputWrapperMobile,
|
|
20
|
-
searchInputWrapperDesktop,
|
|
21
18
|
logoOnMobile,
|
|
22
19
|
logoOnDesktop,
|
|
23
20
|
logoOnMobileUrl,
|
|
@@ -26,7 +23,6 @@ const Menu = ({
|
|
|
26
23
|
logoOnDesktopModifier,
|
|
27
24
|
logoOnDesktopAlignment,
|
|
28
25
|
closeIconModifier,
|
|
29
|
-
entity,
|
|
30
26
|
...rest
|
|
31
27
|
}) => {
|
|
32
28
|
const isMobile = useCheckMobileScreen();
|
|
@@ -73,7 +69,7 @@ const Menu = ({
|
|
|
73
69
|
<ul className={isMobile ? childrenMobileModifier : childrenDesktopModifier}>
|
|
74
70
|
{logoOnDesktop &&
|
|
75
71
|
logoOnDesktopAlignment === 'left' && (
|
|
76
|
-
<a href="/" className="">
|
|
72
|
+
<a href="/" className="menu--desktop__logo-wrapper">
|
|
77
73
|
<img
|
|
78
74
|
src={logoOnMobileUrl}
|
|
79
75
|
alt={logoOnMobileAlt}
|
|
@@ -81,32 +77,10 @@ const Menu = ({
|
|
|
81
77
|
/>
|
|
82
78
|
</a>
|
|
83
79
|
)}
|
|
84
|
-
{searchInputAlignment === 'left' && (
|
|
85
|
-
<li>
|
|
86
|
-
<SearchContent
|
|
87
|
-
searchInputWrapperMobile={searchInputWrapperMobile}
|
|
88
|
-
searchInputWrapperDesktop={searchInputWrapperDesktop}
|
|
89
|
-
searchInputAlignment={searchInputAlignment}
|
|
90
|
-
entity={entity}
|
|
91
|
-
isMobile={isMobile}
|
|
92
|
-
/>
|
|
93
|
-
</li>
|
|
94
|
-
)}
|
|
95
80
|
{children}
|
|
96
|
-
{searchInputAlignment === 'right' && (
|
|
97
|
-
<li>
|
|
98
|
-
<SearchContent
|
|
99
|
-
searchInputWrapperMobile={searchInputWrapperMobile}
|
|
100
|
-
searchInputWrapperDesktop={searchInputWrapperDesktop}
|
|
101
|
-
searchInputAlignment={searchInputAlignment}
|
|
102
|
-
entity={entity}
|
|
103
|
-
isMobile={isMobile}
|
|
104
|
-
/>
|
|
105
|
-
</li>
|
|
106
|
-
)}
|
|
107
81
|
{logoOnDesktop &&
|
|
108
82
|
logoOnDesktopAlignment === 'right' && (
|
|
109
|
-
<a href="/" className="">
|
|
83
|
+
<a href="/" className="menu--desktop__logo-wrapper">
|
|
110
84
|
<img
|
|
111
85
|
src={logoOnMobileUrl}
|
|
112
86
|
alt={logoOnMobileAlt}
|
|
@@ -123,7 +97,7 @@ const Menu = ({
|
|
|
123
97
|
Menu.propTypes = {
|
|
124
98
|
collapse: PropTypes.bool.isRequired,
|
|
125
99
|
logoOnMobile: PropTypes.bool.isRequired,
|
|
126
|
-
logoOnDesktop: PropTypes.bool
|
|
100
|
+
logoOnDesktop: PropTypes.bool,
|
|
127
101
|
logoOnMobileUrl: PropTypes.string,
|
|
128
102
|
logoOnMobileAlt: PropTypes.string,
|
|
129
103
|
logoOnMobileModifier: PropTypes.string,
|
|
@@ -136,14 +110,11 @@ Menu.propTypes = {
|
|
|
136
110
|
mobileMenuChildrenModifier: PropTypes.string,
|
|
137
111
|
modifier: PropTypes.string,
|
|
138
112
|
mobileIconAlignment: PropTypes.string,
|
|
139
|
-
entity: PropTypes.string,
|
|
140
|
-
searchInputAlignment: PropTypes.string,
|
|
141
|
-
searchInputWrapperMobile: PropTypes.string,
|
|
142
|
-
searchInputWrapperDesktop: PropTypes.string,
|
|
143
113
|
children: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node])
|
|
144
114
|
};
|
|
145
115
|
|
|
146
116
|
Menu.defaultProps = {
|
|
117
|
+
logoOnDesktop: false,
|
|
147
118
|
logoOnMobileUrl: '',
|
|
148
119
|
logoOnMobileAlt: '',
|
|
149
120
|
logoOnMobileModifier: '',
|
|
@@ -155,11 +126,7 @@ Menu.defaultProps = {
|
|
|
155
126
|
mobileMenuModifier: '',
|
|
156
127
|
mobileMenuChildrenModifier: '',
|
|
157
128
|
logoOnDesktopAlignment: 'left',
|
|
158
|
-
searchInputAlignment: 'right',
|
|
159
|
-
searchInputWrapperMobile: '',
|
|
160
|
-
searchInputWrapperDesktop: '',
|
|
161
129
|
modifier: '',
|
|
162
|
-
entity: 'PublishedPage',
|
|
163
130
|
children: []
|
|
164
131
|
};
|
|
165
132
|
|
|
@@ -7,11 +7,13 @@ import BlazeLink from '../BlazeLink';
|
|
|
7
7
|
|
|
8
8
|
const SearchContent = ({
|
|
9
9
|
entity,
|
|
10
|
+
searchInputAlignment,
|
|
10
11
|
searchInputWrapperMobile,
|
|
11
12
|
searchInputWrapperDesktop,
|
|
13
|
+
displayCollapsed,
|
|
12
14
|
isMobile
|
|
13
15
|
}) => {
|
|
14
|
-
const [collapsed, setCollapsed] = useState(
|
|
16
|
+
const [collapsed, setCollapsed] = useState(displayCollapsed);
|
|
15
17
|
const [searchTerm, setSearchTerm] = useState(null);
|
|
16
18
|
const router = useRouter();
|
|
17
19
|
|
|
@@ -49,20 +51,26 @@ const SearchContent = ({
|
|
|
49
51
|
});
|
|
50
52
|
|
|
51
53
|
if (loading) return null;
|
|
52
|
-
if (error) return
|
|
54
|
+
if (error) return null;
|
|
53
55
|
|
|
54
56
|
const handleClick = (e, url) => {
|
|
55
57
|
e.preventDefault();
|
|
56
58
|
router.push(url);
|
|
57
59
|
};
|
|
58
60
|
|
|
61
|
+
const handleKeyPress = e => {
|
|
62
|
+
if (e.key === 'Enter' && e.target.value !== '') {
|
|
63
|
+
router.push(`/search?search_term=${e.target.value}`);
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
|
|
59
67
|
const renderResults = () => {
|
|
60
68
|
// eslint-disable-next-line no-undef
|
|
61
69
|
const { results } = data?.searchPublishedContent;
|
|
62
70
|
|
|
63
71
|
if (results && searchTerm && searchTerm !== '') {
|
|
64
72
|
return results.map(({ name, url }) => {
|
|
65
|
-
if (name.
|
|
73
|
+
if (name.includes(searchTerm)) {
|
|
66
74
|
return (
|
|
67
75
|
<BlazeLink href={url} onClick={e => handleClick(e, url)}>
|
|
68
76
|
{name}
|
|
@@ -81,10 +89,10 @@ const SearchContent = ({
|
|
|
81
89
|
|
|
82
90
|
return collapsed ? (
|
|
83
91
|
<div className={isMobile ? searchInputWrapperMobile : searchInputWrapperDesktop}>
|
|
84
|
-
<div className="
|
|
85
|
-
<label className="
|
|
86
|
-
<span className="
|
|
87
|
-
<svg className="
|
|
92
|
+
<div className="search-content--collapse__wrapper">
|
|
93
|
+
<label className="search-content--collapse__label">
|
|
94
|
+
<span className="search-content--collapse__icon_wrapper">
|
|
95
|
+
<svg className="search-content--collapse__icon" viewBox="0 0 20 20">
|
|
88
96
|
<path
|
|
89
97
|
fillRule="evenodd"
|
|
90
98
|
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"
|
|
@@ -92,14 +100,13 @@ const SearchContent = ({
|
|
|
92
100
|
/>
|
|
93
101
|
</svg>
|
|
94
102
|
</span>
|
|
95
|
-
<span className="sr-only">Search</span>
|
|
96
103
|
<input
|
|
97
104
|
onFocus={() => setCollapsed(false)}
|
|
98
105
|
onChange={e => setSearchTerm(e.target.value)}
|
|
99
106
|
type="text"
|
|
100
107
|
name="search"
|
|
101
108
|
value=""
|
|
102
|
-
className="
|
|
109
|
+
className="search-content--collapse__input"
|
|
103
110
|
/>
|
|
104
111
|
</label>
|
|
105
112
|
</div>
|
|
@@ -107,10 +114,10 @@ const SearchContent = ({
|
|
|
107
114
|
) : (
|
|
108
115
|
<>
|
|
109
116
|
<div className={`${isMobile ? searchInputWrapperMobile : searchInputWrapperDesktop}`}>
|
|
110
|
-
<div className="
|
|
111
|
-
<label className="
|
|
112
|
-
<span className="
|
|
113
|
-
<svg className="
|
|
117
|
+
<div className="search-content--expanded__wrapper">
|
|
118
|
+
<label className="search-content--expanded__label">
|
|
119
|
+
<span className="search-content--expanded__icon_wrapper">
|
|
120
|
+
<svg className="search-content--expanded__icon" viewBox="0 0 20 20">
|
|
114
121
|
<path
|
|
115
122
|
fillRule="evenodd"
|
|
116
123
|
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"
|
|
@@ -118,12 +125,12 @@ const SearchContent = ({
|
|
|
118
125
|
/>
|
|
119
126
|
</svg>
|
|
120
127
|
</span>
|
|
121
|
-
<span className="sr-only">Search</span>
|
|
122
128
|
<input
|
|
123
129
|
type="text"
|
|
124
130
|
name="search"
|
|
125
131
|
onChange={e => setSearchTerm(e.target.value)}
|
|
126
|
-
|
|
132
|
+
onKeyPress={handleKeyPress}
|
|
133
|
+
className="search-content--expanded__input"
|
|
127
134
|
placeholder="Search for anything..."
|
|
128
135
|
onBlur={() => {
|
|
129
136
|
if (!searchTerm || searchTerm === '') setCollapsed(true);
|
|
@@ -133,12 +140,12 @@ const SearchContent = ({
|
|
|
133
140
|
</div>
|
|
134
141
|
{data &&
|
|
135
142
|
searchResultsMessage !== '' && (
|
|
136
|
-
<div className="
|
|
137
|
-
<div className="
|
|
143
|
+
<div className="search-content--results__wrapper">
|
|
144
|
+
<div className="search-content--results__wrapper--message">
|
|
138
145
|
<div className="text-sm pt-2">{searchResultsMessage}</div>
|
|
139
146
|
|
|
140
|
-
<div className="
|
|
141
|
-
<div className="
|
|
147
|
+
<div className="search-content--results__message">
|
|
148
|
+
<div className="search-content--results__content">{renderResults()}</div>
|
|
142
149
|
</div>
|
|
143
150
|
</div>
|
|
144
151
|
</div>
|
|
@@ -153,6 +160,7 @@ SearchContent.propTypes = {
|
|
|
153
160
|
searchInputWrapperMobile: PropTypes.string,
|
|
154
161
|
searchInputWrapperDesktop: PropTypes.string,
|
|
155
162
|
isMobile: PropTypes.bool,
|
|
163
|
+
displayCollapsed: PropTypes.bool,
|
|
156
164
|
entity: PropTypes.string.isRequired
|
|
157
165
|
};
|
|
158
166
|
|
|
@@ -160,7 +168,8 @@ SearchContent.defaultProps = {
|
|
|
160
168
|
searchInputAlignment: '',
|
|
161
169
|
searchInputWrapperMobile: '',
|
|
162
170
|
searchInputWrapperDesktop: '',
|
|
163
|
-
isMobile: false
|
|
171
|
+
isMobile: false,
|
|
172
|
+
displayCollapsed: false
|
|
164
173
|
};
|
|
165
174
|
|
|
166
175
|
export default SearchContent;
|
|
@@ -15,7 +15,7 @@ const FiltersList = ({
|
|
|
15
15
|
}) => {
|
|
16
16
|
const { itemId } = useContext(MainContext);
|
|
17
17
|
|
|
18
|
-
return filters.map(({ type, label, propsToDisplay,
|
|
18
|
+
return filters.map(({ type, label, propsToDisplay, elementTitle, ...otherProps }, index) => {
|
|
19
19
|
if (!propsToDisplay && !propsToDisplay.length) return null;
|
|
20
20
|
|
|
21
21
|
const dynamicKey = [itemId, index].join('-');
|
|
@@ -32,6 +32,7 @@ const FiltersList = ({
|
|
|
32
32
|
key={dynamicKey}
|
|
33
33
|
className="filter__section filter__section--search-refine filter__section--search">
|
|
34
34
|
<TextSearch
|
|
35
|
+
{...otherProps}
|
|
35
36
|
label={label}
|
|
36
37
|
elementTitle={elementTitle}
|
|
37
38
|
searchValue={filterValues[SEARCH_TERM]}
|
|
@@ -47,6 +48,7 @@ const FiltersList = ({
|
|
|
47
48
|
key={dynamicKey}
|
|
48
49
|
className="filter__section filter__section--search-refine filter__section--checkboxes">
|
|
49
50
|
<Checkbox
|
|
51
|
+
{...otherProps}
|
|
50
52
|
data={data}
|
|
51
53
|
prop={propsToDisplay[0]}
|
|
52
54
|
label={label}
|
|
@@ -66,6 +68,7 @@ const FiltersList = ({
|
|
|
66
68
|
key={dynamicKey}
|
|
67
69
|
className="filter__section filter__section--search-refine filter__section--selects">
|
|
68
70
|
<SelectFilter
|
|
71
|
+
{...otherProps}
|
|
69
72
|
data={data}
|
|
70
73
|
prop={propsToDisplay[0]}
|
|
71
74
|
label={label}
|
|
@@ -83,9 +86,9 @@ const FiltersList = ({
|
|
|
83
86
|
!!areAggregationsAvailable && (
|
|
84
87
|
<div key={dynamicKey} className="range-slider__wrapper">
|
|
85
88
|
<Range
|
|
89
|
+
{...otherProps}
|
|
86
90
|
dataAggregations={dataAggregations}
|
|
87
91
|
propsToDisplay={propsToDisplay}
|
|
88
|
-
rangeInterval={rangeInterval}
|
|
89
92
|
label={label}
|
|
90
93
|
elementTitle={elementTitle}
|
|
91
94
|
entity={entity}
|
|
@@ -44,8 +44,6 @@ const SearchFilter = ({
|
|
|
44
44
|
groupAfterDesktop,
|
|
45
45
|
groupAfterMobile
|
|
46
46
|
}) => {
|
|
47
|
-
const [isDesktop, setIsDesktop] = useState(true);
|
|
48
|
-
const [pageWidth, setPageWidth] = useState(null);
|
|
49
47
|
const [moreFiltersMobileCollapsed, setMoreFiltersMobileCollapsed] = useState(true);
|
|
50
48
|
const [moreFiltersDesktopCollapsed, setMoreFiltersDesktopCollapsed] = useState(true);
|
|
51
49
|
const [filterValues, dispatch] = useReducer(reducer, initialFilterValues);
|
|
@@ -55,27 +53,6 @@ const SearchFilter = ({
|
|
|
55
53
|
handleSearch(newQuery);
|
|
56
54
|
}, 200);
|
|
57
55
|
|
|
58
|
-
useEffect(
|
|
59
|
-
() => {
|
|
60
|
-
if (window && !pageWidth) {
|
|
61
|
-
setPageWidth(window.innerWidth);
|
|
62
|
-
setIsDesktop(isDeviceDesktop());
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
const handleResize = ({ target: { innerWidth } }) => {
|
|
66
|
-
setIsDesktop(isDeviceDesktop());
|
|
67
|
-
setPageWidth(innerWidth);
|
|
68
|
-
if (isDesktop) setDisplaySearchFilter(false);
|
|
69
|
-
};
|
|
70
|
-
|
|
71
|
-
window.addEventListener('resize', handleResize);
|
|
72
|
-
return () => {
|
|
73
|
-
window.removeEventListener('resize', handleResize);
|
|
74
|
-
};
|
|
75
|
-
},
|
|
76
|
-
[isDesktop, pageWidth, setDisplaySearchFilter]
|
|
77
|
-
);
|
|
78
|
-
|
|
79
56
|
useEffect(
|
|
80
57
|
() => {
|
|
81
58
|
if (filterValues.shouldSearch) {
|
|
@@ -86,16 +63,9 @@ const SearchFilter = ({
|
|
|
86
63
|
[filterValues, handleSubmit]
|
|
87
64
|
);
|
|
88
65
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
if (!isDesktop && isCollapsedOnResponsive) {
|
|
93
|
-
isMobileFormDisplayed = displaySearchFilter;
|
|
94
|
-
isDesktopFormDisplayed = false;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
const formClass = classnames({
|
|
98
|
-
'filter__form filter__form--mobile': isMobileFormDisplayed
|
|
66
|
+
const formClass = classnames('filter__form filter__form--initial', {
|
|
67
|
+
'filter__form--mobile': isCollapsedOnResponsive && displaySearchFilter,
|
|
68
|
+
'filter__form--collapsible': isCollapsedOnResponsive
|
|
99
69
|
});
|
|
100
70
|
|
|
101
71
|
const {
|
|
@@ -122,143 +92,138 @@ const SearchFilter = ({
|
|
|
122
92
|
|
|
123
93
|
return (
|
|
124
94
|
<>
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
{
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
<
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
95
|
+
<form
|
|
96
|
+
ref={searchFilterRef}
|
|
97
|
+
className={formClass}
|
|
98
|
+
data-testid={formId}
|
|
99
|
+
id={formId}
|
|
100
|
+
onSubmit={e => {
|
|
101
|
+
e.preventDefault();
|
|
102
|
+
const newQuery = buildQuery(filterValues, filters);
|
|
103
|
+
handleSearch(newQuery);
|
|
104
|
+
}}>
|
|
105
|
+
{displaySearchFilter && (
|
|
106
|
+
<CloseMobileForm handleClose={() => setDisplaySearchFilter(false)} />
|
|
107
|
+
)}
|
|
108
|
+
|
|
109
|
+
<div className="filter filter--search-refine">
|
|
110
|
+
<ResetDesktopForm handleReset={handleReset} />
|
|
111
|
+
|
|
112
|
+
<div className="filter__wrapper filter__wrapper--search-refine">
|
|
113
|
+
{!shouldGroup && (
|
|
114
|
+
<FiltersList
|
|
115
|
+
shouldSearch={shouldSearch}
|
|
116
|
+
data={data}
|
|
117
|
+
filters={filters}
|
|
118
|
+
hasUrl={hasUrl}
|
|
119
|
+
entity={entity}
|
|
120
|
+
filterValues={filterValues}
|
|
121
|
+
updateFilterValues={updateFilterValues}
|
|
122
|
+
/>
|
|
123
|
+
)}
|
|
124
|
+
|
|
125
|
+
{shouldGroup && (
|
|
126
|
+
<>
|
|
145
127
|
<FiltersList
|
|
146
128
|
shouldSearch={shouldSearch}
|
|
147
129
|
data={data}
|
|
148
|
-
filters={filters}
|
|
130
|
+
filters={filters.slice(0, groupAfterMobile)}
|
|
149
131
|
hasUrl={hasUrl}
|
|
150
132
|
entity={entity}
|
|
151
133
|
filterValues={filterValues}
|
|
152
134
|
updateFilterValues={updateFilterValues}
|
|
153
135
|
/>
|
|
154
|
-
)}
|
|
155
|
-
|
|
156
|
-
{shouldGroup && (
|
|
157
|
-
<>
|
|
158
|
-
<FiltersList
|
|
159
|
-
shouldSearch={shouldSearch}
|
|
160
|
-
data={data}
|
|
161
|
-
filters={filters.slice(0, groupAfterMobile)}
|
|
162
|
-
hasUrl={hasUrl}
|
|
163
|
-
entity={entity}
|
|
164
|
-
filterValues={filterValues}
|
|
165
|
-
updateFilterValues={updateFilterValues}
|
|
166
|
-
/>
|
|
167
136
|
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
)}
|
|
186
|
-
hasUrl={hasUrl}
|
|
187
|
-
entity={entity}
|
|
188
|
-
filterValues={filterValues}
|
|
189
|
-
updateFilterValues={updateFilterValues}
|
|
190
|
-
/>
|
|
191
|
-
|
|
192
|
-
{!!groupAfterDesktop && (
|
|
193
|
-
<button
|
|
194
|
-
className={moreFiltersDesktopTogglerClass}
|
|
195
|
-
type="button"
|
|
196
|
-
onClick={() =>
|
|
197
|
-
setMoreFiltersDesktopCollapsed(!moreFiltersDesktopCollapsed)
|
|
198
|
-
}>
|
|
199
|
-
More filters
|
|
200
|
-
</button>
|
|
137
|
+
{!!groupAfterMobile && (
|
|
138
|
+
<button
|
|
139
|
+
className={moreFiltersMobileTogglerClass}
|
|
140
|
+
type="button"
|
|
141
|
+
onClick={() => setMoreFiltersMobileCollapsed(!moreFiltersMobileCollapsed)}>
|
|
142
|
+
Filters
|
|
143
|
+
</button>
|
|
144
|
+
)}
|
|
145
|
+
|
|
146
|
+
<div className={moreFiltersMobileWrapperClass}>
|
|
147
|
+
<div className={MORE_FILTERS_CLASSES.MOBILE_CONTENT}>
|
|
148
|
+
<FiltersList
|
|
149
|
+
shouldSearch={shouldSearch && isDeviceDesktop()}
|
|
150
|
+
data={data}
|
|
151
|
+
filters={filters.slice(
|
|
152
|
+
groupAfterMobile,
|
|
153
|
+
groupAfterDesktop ? groupAfterDesktop - 1 : 0
|
|
201
154
|
)}
|
|
155
|
+
hasUrl={hasUrl}
|
|
156
|
+
entity={entity}
|
|
157
|
+
filterValues={filterValues}
|
|
158
|
+
updateFilterValues={updateFilterValues}
|
|
159
|
+
/>
|
|
160
|
+
|
|
161
|
+
{!!groupAfterDesktop && (
|
|
162
|
+
<button
|
|
163
|
+
className={moreFiltersDesktopTogglerClass}
|
|
164
|
+
type="button"
|
|
165
|
+
onClick={() =>
|
|
166
|
+
setMoreFiltersDesktopCollapsed(!moreFiltersDesktopCollapsed)
|
|
167
|
+
}>
|
|
168
|
+
More filters
|
|
169
|
+
</button>
|
|
170
|
+
)}
|
|
171
|
+
|
|
172
|
+
<div className={moreFiltersDesktopWrapperClass}>
|
|
173
|
+
<div className={MORE_FILTERS_CLASSES.DESKTOP_CONTENT}>
|
|
174
|
+
<FiltersList
|
|
175
|
+
shouldSearch={false}
|
|
176
|
+
data={data}
|
|
177
|
+
filters={filters.slice(groupAfterDesktop)}
|
|
178
|
+
hasUrl={hasUrl}
|
|
179
|
+
entity={entity}
|
|
180
|
+
filterValues={filterValues}
|
|
181
|
+
updateFilterValues={updateFilterValues}
|
|
182
|
+
/>
|
|
183
|
+
</div>
|
|
202
184
|
|
|
203
|
-
<div className={
|
|
204
|
-
<
|
|
205
|
-
<FiltersList
|
|
206
|
-
shouldSearch={false}
|
|
207
|
-
data={data}
|
|
208
|
-
filters={filters.slice(groupAfterDesktop)}
|
|
209
|
-
hasUrl={hasUrl}
|
|
210
|
-
entity={entity}
|
|
211
|
-
filterValues={filterValues}
|
|
212
|
-
updateFilterValues={updateFilterValues}
|
|
213
|
-
/>
|
|
214
|
-
</div>
|
|
215
|
-
|
|
216
|
-
<div className={MORE_FILTERS_CLASSES.DESKTOP_BUTTONS}>
|
|
217
|
-
<ResetDesktopForm handleReset={handleReset} />
|
|
185
|
+
<div className={MORE_FILTERS_CLASSES.DESKTOP_BUTTONS}>
|
|
186
|
+
<ResetDesktopForm handleReset={handleReset} />
|
|
218
187
|
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
</div>
|
|
188
|
+
<button className="button button--full-width" type="submit">
|
|
189
|
+
{SEARCH}
|
|
190
|
+
</button>
|
|
223
191
|
</div>
|
|
224
192
|
</div>
|
|
193
|
+
</div>
|
|
225
194
|
|
|
226
|
-
|
|
227
|
-
|
|
195
|
+
<div className={MORE_FILTERS_CLASSES.MOBILE_BUTTONS}>
|
|
196
|
+
<ResetDesktopForm handleReset={handleReset} />
|
|
228
197
|
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
</div>
|
|
198
|
+
<button className="button button--full-width" type="submit">
|
|
199
|
+
{SEARCH}
|
|
200
|
+
</button>
|
|
233
201
|
</div>
|
|
234
|
-
|
|
235
|
-
|
|
202
|
+
</div>
|
|
203
|
+
</>
|
|
204
|
+
)}
|
|
236
205
|
|
|
237
|
-
|
|
206
|
+
<br />
|
|
238
207
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
</div>
|
|
208
|
+
{!displaySearchFilter && (
|
|
209
|
+
<button className="button button--full-width" type="submit">
|
|
210
|
+
{SEARCH}
|
|
211
|
+
</button>
|
|
212
|
+
)}
|
|
245
213
|
</div>
|
|
214
|
+
</div>
|
|
215
|
+
|
|
216
|
+
{displaySearchFilter && <MobileFormToolbar formId={formId} handleReset={handleReset} />}
|
|
217
|
+
</form>
|
|
246
218
|
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
<div
|
|
253
|
-
className="filter__refine filter__refine--mobile-close"
|
|
254
|
-
data-testid="refine-mobile">
|
|
255
|
-
<div role="button" onClick={() => setDisplaySearchFilter(true)}>
|
|
256
|
-
{REFINE}
|
|
257
|
-
</div>
|
|
219
|
+
{isCollapsedOnResponsive &&
|
|
220
|
+
!displaySearchFilter && (
|
|
221
|
+
<div className="filter__refine filter__refine--mobile-close" data-testid="refine-mobile">
|
|
222
|
+
<div role="button" onClick={() => setDisplaySearchFilter(true)}>
|
|
223
|
+
{REFINE}
|
|
258
224
|
</div>
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
)}
|
|
225
|
+
</div>
|
|
226
|
+
)}
|
|
262
227
|
</>
|
|
263
228
|
);
|
|
264
229
|
};
|