@riosst100/pwa-marketplace 1.3.2 → 1.3.4

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 (165) hide show
  1. package/.github/workflows/dependabot.yml +28 -28
  2. package/package.json +18 -18
  3. package/src/componentOverrideMapping.js +14 -0
  4. package/src/components/BecomeSellerLink/becomeSellerLink.js +1 -1
  5. package/src/components/BecomeSellerLink/becomeSellerLink.module.css +0 -4
  6. package/src/components/CurrencySwitcher/currencySwitcher.himmer.js +6 -0
  7. package/src/components/CurrencySwitcher/currencySwitcher.module.css +102 -0
  8. package/src/components/CurrencySwitcher/index.js +107 -0
  9. package/src/components/CurrencySwitcher/switcherItem.js +47 -0
  10. package/src/components/CurrencySwitcher/switcherItem.module.css +20 -0
  11. package/src/components/FilterOption/FilterOptionModal.module.css +90 -0
  12. package/src/components/FilterOption/filterOptionModal.js +48 -0
  13. package/src/components/FilterOptionModal/filterOptionModal.js +66 -0
  14. package/src/components/Header/becomeSellerLink.module.css +0 -4
  15. package/src/components/Header/websiteSwitcher.js +0 -1
  16. package/src/components/Header/websiteSwitcher.module.css +107 -111
  17. package/src/components/WebsiteSwitcher/websiteSwitcher.js +18 -6
  18. package/src/components/WebsiteSwitcher/websiteSwitcher.module.css +107 -111
  19. package/src/overwrites/peregrine/lib/talons/FilterModal/useFilterList.js +62 -0
  20. package/src/overwrites/peregrine/lib/talons/MegaMenu/useMegaMenuItem.js +66 -0
  21. package/src/overwrites/peregrine/lib/talons/MegaMenu/useSubMenu.js +20 -0
  22. package/src/overwrites/peregrine/lib/talons/RootComponents/Category/useCategoryContent.js +0 -2
  23. package/src/overwrites/venia-ui/lib/RootComponents/Category/NoProductsFound/index.js +1 -0
  24. package/src/overwrites/venia-ui/lib/RootComponents/Category/NoProductsFound/noProductsFound.js +77 -0
  25. package/src/overwrites/venia-ui/lib/RootComponents/Category/NoProductsFound/noProductsFound.module.css +39 -0
  26. package/src/overwrites/venia-ui/lib/RootComponents/Category/NoProductsFound/noProductsFound.png +0 -0
  27. package/src/overwrites/venia-ui/lib/RootComponents/Category/category.gql.js +17 -0
  28. package/src/overwrites/venia-ui/lib/RootComponents/Category/category.js +91 -0
  29. package/src/overwrites/venia-ui/lib/RootComponents/Category/category.module.css +77 -0
  30. package/src/overwrites/venia-ui/lib/RootComponents/Category/categoryContent.js +12 -14
  31. package/src/overwrites/venia-ui/lib/RootComponents/Category/categoryContent.shimmer.js +74 -0
  32. package/src/overwrites/venia-ui/lib/RootComponents/Category/images/001.jpg +0 -0
  33. package/src/overwrites/venia-ui/lib/RootComponents/Category/images/002.jpg +0 -0
  34. package/src/overwrites/venia-ui/lib/RootComponents/Category/images/003.jpg +0 -0
  35. package/src/overwrites/venia-ui/lib/RootComponents/Category/images/004.jpg +0 -0
  36. package/src/overwrites/venia-ui/lib/RootComponents/Category/images/005.jpg +0 -0
  37. package/src/overwrites/venia-ui/lib/RootComponents/Category/images/006.jpg +0 -0
  38. package/src/overwrites/venia-ui/lib/RootComponents/Category/images/007.jpg +0 -0
  39. package/src/overwrites/venia-ui/lib/RootComponents/Category/images/008.jpg +0 -0
  40. package/src/overwrites/venia-ui/lib/RootComponents/Category/images/009.jpg +0 -0
  41. package/src/overwrites/venia-ui/lib/RootComponents/Category/images/010.jpg +0 -0
  42. package/src/overwrites/venia-ui/lib/RootComponents/Category/images/011.jpg +0 -0
  43. package/src/overwrites/venia-ui/lib/RootComponents/Category/images/012.jpg +0 -0
  44. package/src/overwrites/venia-ui/lib/RootComponents/Category/images/index.js +12 -0
  45. package/src/overwrites/venia-ui/lib/RootComponents/Category/index.js +6 -0
  46. package/src/overwrites/venia-ui/lib/components/Breadcrumbs/breadcrumbs.js +112 -0
  47. package/src/overwrites/venia-ui/lib/components/Breadcrumbs/breadcrumbs.module.css +32 -0
  48. package/src/overwrites/venia-ui/lib/components/Breadcrumbs/breadcrumbs.shimmer.js +24 -0
  49. package/src/overwrites/venia-ui/lib/components/Breadcrumbs/index.js +2 -0
  50. package/src/overwrites/venia-ui/lib/components/Checkbox/checkbox.js +78 -0
  51. package/src/overwrites/venia-ui/lib/components/Checkbox/checkbox.module.css +73 -0
  52. package/src/overwrites/venia-ui/lib/components/Checkbox/index.js +1 -0
  53. package/src/overwrites/venia-ui/lib/components/FilterModal/CurrentFilters/currentFilter.js +60 -0
  54. package/src/overwrites/venia-ui/lib/components/FilterModal/CurrentFilters/currentFilter.module.css +21 -0
  55. package/src/overwrites/venia-ui/lib/components/FilterModal/CurrentFilters/currentFilters.js +65 -0
  56. package/src/overwrites/venia-ui/lib/components/FilterModal/CurrentFilters/currentFilters.module.css +17 -0
  57. package/src/overwrites/venia-ui/lib/components/FilterModal/CurrentFilters/index.js +1 -0
  58. package/src/overwrites/venia-ui/lib/components/FilterModal/FilterList/filterDefault.js +18 -18
  59. package/src/overwrites/venia-ui/lib/components/FilterModal/FilterList/filterDefault.module.css +0 -0
  60. package/src/overwrites/venia-ui/lib/components/FilterModal/FilterList/filterItem.js +79 -0
  61. package/src/overwrites/venia-ui/lib/components/FilterModal/FilterList/filterItemRadio.js +76 -0
  62. package/src/overwrites/venia-ui/lib/components/FilterModal/FilterList/filterItemRadio.module.css +0 -0
  63. package/src/overwrites/venia-ui/lib/components/FilterModal/FilterList/filterItemRadioGroup.js +86 -0
  64. package/src/overwrites/venia-ui/lib/components/FilterModal/FilterList/filterList.js +265 -0
  65. package/src/overwrites/venia-ui/lib/components/FilterModal/FilterList/filterList.module.css +20 -0
  66. package/src/overwrites/venia-ui/lib/components/FilterModal/FilterList/index.js +1 -0
  67. package/src/overwrites/venia-ui/lib/components/FilterModal/filterBlock.js +135 -0
  68. package/src/overwrites/venia-ui/lib/components/FilterModal/filterBlock.module.css +25 -0
  69. package/src/overwrites/venia-ui/lib/components/FilterModal/filterFooter.js +49 -0
  70. package/src/overwrites/venia-ui/lib/components/FilterModal/filterFooter.module.css +10 -0
  71. package/src/overwrites/venia-ui/lib/components/FilterModal/filterModal.js +166 -0
  72. package/src/overwrites/venia-ui/lib/components/FilterModal/filterModal.module.css +87 -0
  73. package/src/overwrites/venia-ui/lib/components/FilterModal/filterSearch.module.css +3 -0
  74. package/src/overwrites/venia-ui/lib/components/FilterModal/index.js +1 -0
  75. package/src/overwrites/venia-ui/lib/components/FilterSidebar/__tests__/filterSidebar.spec.js +246 -0
  76. package/src/overwrites/venia-ui/lib/components/FilterSidebar/filterSidebar.js +10 -10
  77. package/src/overwrites/venia-ui/lib/components/FilterSidebar/filterSidebar.module.css +57 -0
  78. package/src/overwrites/venia-ui/lib/components/FilterSidebar/filterSidebar.shimmer.js +24 -0
  79. package/src/overwrites/venia-ui/lib/components/FilterSidebar/index.js +2 -0
  80. package/src/overwrites/venia-ui/lib/components/Gallery/addToCartButton.js +116 -0
  81. package/src/overwrites/venia-ui/lib/components/Gallery/addToCartButton.module.css +38 -0
  82. package/src/overwrites/venia-ui/lib/components/Gallery/gallery.js +56 -0
  83. package/src/overwrites/venia-ui/lib/components/Gallery/gallery.module.css +28 -0
  84. package/src/overwrites/venia-ui/lib/components/Gallery/gallery.shimmer.js +39 -0
  85. package/src/overwrites/venia-ui/lib/components/Gallery/index.js +3 -0
  86. package/src/overwrites/venia-ui/lib/components/Gallery/item.js +204 -0
  87. package/src/overwrites/venia-ui/lib/components/Gallery/item.module.css +109 -0
  88. package/src/overwrites/venia-ui/lib/components/Gallery/item.shimmer.js +38 -0
  89. package/src/overwrites/venia-ui/lib/components/Gallery/star.js +12 -0
  90. package/src/overwrites/venia-ui/lib/components/Header/accountTrigger.js +98 -0
  91. package/src/overwrites/venia-ui/lib/components/Header/cartTrigger.js +116 -0
  92. package/src/overwrites/venia-ui/lib/components/Header/header.js +12 -9
  93. package/src/overwrites/venia-ui/lib/components/Header/storeSwitcher.js +22 -8
  94. package/src/overwrites/venia-ui/lib/components/Header/storeSwitcher.module.css +107 -0
  95. package/src/overwrites/venia-ui/lib/components/Header/wishlistTrigger.js +23 -0
  96. package/src/overwrites/venia-ui/lib/components/MegaMenu/megaMenuItem.js +1 -1
  97. package/src/overwrites/venia-ui/lib/components/MegaMenu/submenu.module.css +0 -1
  98. package/src/overwrites/venia-ui/lib/components/Pagination/index.js +1 -0
  99. package/src/overwrites/venia-ui/lib/components/Pagination/navButton.js +65 -0
  100. package/src/overwrites/venia-ui/lib/components/Pagination/pagination.js +107 -0
  101. package/src/overwrites/venia-ui/lib/components/Pagination/tile.js +41 -0
  102. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Boolean/boolean.js +74 -0
  103. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Boolean/boolean.module.css +9 -0
  104. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Boolean/index.js +1 -0
  105. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Date/date.js +82 -0
  106. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Date/date.module.css +9 -0
  107. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Date/index.js +1 -0
  108. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/DateTime/dateTime.js +85 -0
  109. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/DateTime/dateTime.module.css +9 -0
  110. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/DateTime/index.js +1 -0
  111. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Multiselect/index.js +1 -0
  112. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Multiselect/multiselect.js +104 -0
  113. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Multiselect/multiselect.module.css +22 -0
  114. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Price/index.js +1 -0
  115. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Price/price.js +74 -0
  116. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Price/price.module.css +9 -0
  117. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Select/index.js +1 -0
  118. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Select/select.js +99 -0
  119. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Select/select.module.css +13 -0
  120. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Text/index.js +1 -0
  121. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Text/text.js +88 -0
  122. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Text/text.module.css +13 -0
  123. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Textarea/index.js +1 -0
  124. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Textarea/textarea.js +94 -0
  125. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/Textarea/textarea.module.css +13 -0
  126. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/attributeType.js +67 -0
  127. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/AttributeType/index.js +1 -0
  128. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/customAttributes.js +64 -0
  129. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/customAttributes.module.css +9 -0
  130. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/CustomAttributes/index.js +1 -0
  131. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/index.js +1 -0
  132. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/productFullDetail.gql.js +7 -0
  133. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/productFullDetail.js +413 -0
  134. package/src/overwrites/venia-ui/lib/components/ProductFullDetail/productFullDetail.module.css +203 -0
  135. package/src/overwrites/venia-ui/lib/components/ProductImageCarousel/carousel.js +180 -0
  136. package/src/overwrites/venia-ui/lib/components/ProductImageCarousel/carousel.module.css +102 -0
  137. package/src/overwrites/venia-ui/lib/components/ProductImageCarousel/carousel.shimmer.js +51 -0
  138. package/src/overwrites/venia-ui/lib/components/ProductImageCarousel/carousel.shimmer.module.css +7 -0
  139. package/src/overwrites/venia-ui/lib/components/ProductImageCarousel/index.js +1 -0
  140. package/src/overwrites/venia-ui/lib/components/ProductImageCarousel/thumbnail.js +108 -0
  141. package/src/overwrites/venia-ui/lib/components/ProductImageCarousel/thumbnail.module.css +47 -0
  142. package/src/overwrites/venia-ui/lib/components/ProductSort/index.js +2 -0
  143. package/src/overwrites/venia-ui/lib/components/ProductSort/productSort.js +233 -0
  144. package/src/overwrites/venia-ui/lib/components/ProductSort/productSort.module.css +65 -0
  145. package/src/overwrites/venia-ui/lib/components/ProductSort/productSort.shimmer.js +28 -0
  146. package/src/overwrites/venia-ui/lib/components/ProductSort/productSort.shimmer.module.css +10 -0
  147. package/src/overwrites/venia-ui/lib/components/ProductSort/sortItem.js +57 -0
  148. package/src/overwrites/venia-ui/lib/components/ProductSort/sortItem.module.css +23 -0
  149. package/src/overwrites/venia-ui/lib/components/QuantityStepper/index.js +1 -0
  150. package/src/overwrites/venia-ui/lib/components/QuantityStepper/quantityStepper.js +94 -0
  151. package/src/overwrites/venia-ui/lib/components/QuantityStepper/quantityStepper.module.css +78 -0
  152. package/src/overwrites/venia-ui/lib/components/RichContent/index.js +1 -0
  153. package/src/overwrites/venia-ui/lib/components/RichContent/plainHtmlRenderer.js +17 -0
  154. package/src/overwrites/venia-ui/lib/components/RichContent/richContent.js +59 -0
  155. package/src/overwrites/venia-ui/lib/components/RichContent/richContent.module.css +146 -0
  156. package/src/overwrites/venia-ui/lib/components/RichContent/richContentRenderers.js +7 -0
  157. package/src/overwrites/venia-ui/lib/components/SearchBar/searchBar.module.css +1 -2
  158. package/src/overwrites/venia-ui/lib/components/SearchBar/searchField.js +3 -2
  159. package/src/overwrites/venia-ui/lib/components/TextInput/field.module.css +50 -0
  160. package/src/overwrites/venia-ui/lib/components/TextInput/index.js +1 -0
  161. package/src/overwrites/venia-ui/lib/components/TextInput/textInput.js +48 -0
  162. package/src/overwrites/venia-ui/lib/components/TextInput/textInput.module.css +21 -0
  163. package/src/talons/FilterOption/useFilterOptionModal.js +11 -0
  164. package/src/talons/FilterOptionModal/useFilterOptionModal.js +11 -0
  165. package/src/theme/vars.js +12 -0
@@ -0,0 +1,265 @@
1
+ import React, { Fragment, Suspense, useMemo } from 'react';
2
+ import { array, func, number, shape, string } from 'prop-types';
3
+ import { useIntl } from 'react-intl';
4
+ import setValidator from '@magento/peregrine/lib/validators/set';
5
+ import { useFilterList } from '@magento/peregrine/lib/talons/FilterModal';
6
+
7
+ import { useStyle } from '@magento/venia-ui/lib/classify';
8
+ import FilterItem from './filterItem';
9
+ import defaultClasses from './filterList.module.css';
10
+ import FilterItemRadioGroup from './filterItemRadioGroup';
11
+
12
+ const labels = new WeakMap();
13
+ const labels2 = new WeakMap();
14
+
15
+ const FilterOptionModal = React.lazy(() => import('@riosst100/pwa-marketplace/src/components/FilterOption/filterOptionModal'));
16
+
17
+ const FilterList = props => {
18
+ const {
19
+ filterApi,
20
+ filterState,
21
+ filterFrontendInput,
22
+ name,
23
+ group,
24
+ itemCountToShow,
25
+ items,
26
+ onApply
27
+ } = props;
28
+ const classes = useStyle(defaultClasses, props.classes);
29
+ const talonProps = useFilterList({ filterState, items, itemCountToShow });
30
+ const { isListExpanded, handleListToggle, handleShowMore, activeFilter, setActiveFilter } = talonProps;
31
+ const { formatMessage } = useIntl();
32
+
33
+ let data = items.reduce((r, e) => {
34
+ // get first letter of name of current element
35
+ let grouping = e.title[0];
36
+ // if there is no property in accumulator with this letter create it
37
+ if(!r[grouping]) r[grouping] = {grouping, children: [e]}
38
+ // if there is push current element to children array for that letter
39
+ else r[grouping].children.push(e);
40
+ // return accumulator
41
+ return r;
42
+ }, {})
43
+
44
+ // since data at this point is an object, to get array of values
45
+ // we use Object.values method
46
+ let items2 = Object.values(data)
47
+
48
+ items2 = items2.sort((a, b) => a.grouping.localeCompare(b.grouping));
49
+
50
+ const groupingItemElements = useMemo(() => {
51
+ return items2.map((data, index) => {
52
+ const { grouping, children } = data;
53
+
54
+ const elements1 = [];
55
+
56
+ children.map((item, index) => {
57
+ const { title, value } = item;
58
+
59
+ const key = `item-${group}-${value}`;
60
+
61
+ // create an element for each item
62
+ elements1.push(
63
+ <li
64
+ key={key}
65
+ className={classes.item}
66
+ data-cy="FilterList-item"
67
+ >
68
+ <FilterItem
69
+ filterApi={filterApi}
70
+ filterState={filterState}
71
+ group={group}
72
+ item={item}
73
+ onApply={onApply}
74
+ />
75
+ </li>
76
+ );
77
+
78
+ // associate each element with its normalized title
79
+ // titles are not unique, so use the element as the key
80
+ // labels2.set(element1, title.toUpperCase());
81
+
82
+ // return element2;
83
+ });
84
+
85
+ const element2 = <ul><div><b>{grouping}</b></div>{elements1}</ul>;
86
+
87
+ return element2;
88
+ });
89
+ }, [
90
+ classes,
91
+ filterApi,
92
+ filterState,
93
+ filterFrontendInput,
94
+ name,
95
+ group,
96
+ items,
97
+ isListExpanded,
98
+ itemCountToShow,
99
+ onApply
100
+ ]);
101
+
102
+ // memoize item creation
103
+ // search value is not referenced, so this array is stable
104
+ const itemElements = useMemo(() => {
105
+ if (filterFrontendInput === 'boolean') {
106
+ const key = `item-${group}`;
107
+ return (
108
+ <li
109
+ key={key}
110
+ className={classes.item}
111
+ data-cy="FilterList-item"
112
+ >
113
+ <FilterItemRadioGroup
114
+ filterApi={filterApi}
115
+ filterState={filterState}
116
+ group={group}
117
+ name={name}
118
+ items={items}
119
+ onApply={onApply}
120
+ labels={labels}
121
+ />
122
+ </li>
123
+ );
124
+ }
125
+
126
+ return items.map((item, index) => {
127
+ const { title, value } = item;
128
+ const key = `item-${group}-${value}`;
129
+
130
+ if (!isListExpanded && index >= itemCountToShow) {
131
+ return null;
132
+ }
133
+
134
+ // create an element for each item
135
+ const element = (
136
+ <li
137
+ key={key}
138
+ className={classes.item}
139
+ data-cy="FilterList-item"
140
+ >
141
+ <FilterItem
142
+ filterApi={filterApi}
143
+ filterState={filterState}
144
+ group={group}
145
+ item={item}
146
+ onApply={onApply}
147
+ />
148
+ </li>
149
+ );
150
+
151
+ // associate each element with its normalized title
152
+ // titles are not unique, so use the element as the key
153
+ labels.set(element, title.toUpperCase());
154
+ return element;
155
+ });
156
+ }, [
157
+ classes,
158
+ filterApi,
159
+ filterState,
160
+ filterFrontendInput,
161
+ name,
162
+ group,
163
+ items,
164
+ isListExpanded,
165
+ itemCountToShow,
166
+ onApply
167
+ ]);
168
+
169
+ const showMoreLessItem = useMemo(() => {
170
+ if (items.length <= itemCountToShow) {
171
+ return null;
172
+ }
173
+
174
+ const label = isListExpanded
175
+ ? formatMessage({
176
+ id: 'filterList.showLess',
177
+ defaultMessage: 'Show Less'
178
+ })
179
+ : formatMessage({
180
+ id: 'filterList.showMore',
181
+ defaultMessage: 'Show More'
182
+ });
183
+
184
+ return (
185
+ <li className={classes.showMoreLessItem}>
186
+ <button
187
+ onClick={handleListToggle}
188
+ className={classes.showMoreLessButton}
189
+ data-cy="FilterList-showMoreLessButton"
190
+ >
191
+ {label}
192
+ </button>
193
+ </li>
194
+ );
195
+ }, [
196
+ isListExpanded,
197
+ handleListToggle,
198
+ items,
199
+ itemCountToShow,
200
+ formatMessage,
201
+ classes
202
+ ]);
203
+
204
+ const showMoreItem = useMemo(() => {
205
+ if (items.length <= itemCountToShow) {
206
+ return null;
207
+ }
208
+
209
+ const label = formatMessage({
210
+ id: 'filterList.showMore',
211
+ defaultMessage: 'Show More'
212
+ });
213
+
214
+ return (
215
+ <li className={classes.showMoreLessItem}>
216
+ <button
217
+ onClick={handleShowMore}
218
+ className={classes.showMoreLessButton}
219
+ data-cy="FilterList-showMoreLessButton"
220
+ >
221
+ {label}
222
+ </button>
223
+ </li>
224
+ );
225
+ }, [
226
+ handleShowMore,
227
+ items,
228
+ itemCountToShow,
229
+ formatMessage,
230
+ classes
231
+ ]);
232
+
233
+ return (
234
+ <Fragment>
235
+ <ul className={classes.items}>
236
+ {itemElements}
237
+ {showMoreItem}
238
+ </ul>
239
+ <Suspense fallback={null}>
240
+ {activeFilter && <FilterOptionModal groupingItemElements={groupingItemElements} setActiveFilter={setActiveFilter} />}
241
+ </Suspense>
242
+ </Fragment>
243
+ );
244
+ };
245
+
246
+ FilterList.defaultProps = {
247
+ onApply: null,
248
+ itemCountToShow: 2
249
+ };
250
+
251
+ FilterList.propTypes = {
252
+ classes: shape({
253
+ item: string,
254
+ items: string
255
+ }),
256
+ filterApi: shape({}),
257
+ filterState: setValidator,
258
+ name: string,
259
+ group: string,
260
+ items: array,
261
+ onApply: func,
262
+ itemCountToShow: number
263
+ };
264
+
265
+ export default FilterList;
@@ -0,0 +1,20 @@
1
+ .items {
2
+ composes: gap-[15px] from global;
3
+ composes: grid from global;
4
+ /* composes: -ml-1.5 from global; */
5
+ composes: py-2.5 from global;
6
+ grid-template-columns: 100%;
7
+ composes: border-t from global;
8
+ composes: border-gray-100 from global;
9
+ }
10
+
11
+ .showMoreLessItem {
12
+ composes: pl-1 from global;
13
+ }
14
+
15
+ .showMoreLessButton {
16
+ composes: text-sm from global;
17
+ composes: underline from global;
18
+
19
+ composes: hover_no-underline from global;
20
+ }
@@ -0,0 +1 @@
1
+ export { default } from './filterList';
@@ -0,0 +1,135 @@
1
+ import React from 'react';
2
+ import { arrayOf, shape, string, func, bool } from 'prop-types';
3
+ import { useIntl } from 'react-intl';
4
+ import { ChevronDown as ArrowDown, ChevronUp as ArrowUp } from 'react-feather';
5
+ import { Form } from 'informed';
6
+
7
+ import { useFilterBlock } from '@magento/peregrine/lib/talons/FilterModal';
8
+ import setValidator from '@magento/peregrine/lib/validators/set';
9
+
10
+ import { useStyle } from '@magento/venia-ui/lib/classify';
11
+ import Icon from '@magento/venia-ui/lib/components/Icon';
12
+ import FilterList from './FilterList';
13
+ import defaultClasses from './filterBlock.module.css';
14
+ import { ArrowUp2 } from 'iconsax-react';
15
+ import cn from 'classnames';
16
+
17
+ const FilterBlock = props => {
18
+ const {
19
+ filterApi,
20
+ filterState,
21
+ filterFrontendInput,
22
+ group,
23
+ items,
24
+ name,
25
+ onApply,
26
+ initialOpen
27
+ } = props;
28
+
29
+ const { formatMessage } = useIntl();
30
+ const talonProps = useFilterBlock({
31
+ filterState,
32
+ items,
33
+ initialOpen
34
+ });
35
+ const { handleClick, isExpanded } = talonProps;
36
+ const iconSrc = isExpanded ? ArrowUp : ArrowDown;
37
+ const classes = useStyle(defaultClasses, props.classes);
38
+
39
+ const itemAriaLabel = formatMessage(
40
+ {
41
+ id: 'filterModal.item.ariaLabel',
42
+ defaultMessage: 'Filter products by "{itemName}"'
43
+ },
44
+ {
45
+ itemName: name
46
+ }
47
+ );
48
+
49
+ const toggleItemOptionsAriaLabel = isExpanded
50
+ ? formatMessage(
51
+ {
52
+ id: 'filterModal.item.hideOptions',
53
+ defaultMessage: 'Hide "{itemName}" filter item options.'
54
+ },
55
+ {
56
+ itemName: name
57
+ }
58
+ )
59
+ : formatMessage(
60
+ {
61
+ id: 'filterModal.item.showOptions',
62
+ defaultMessage: 'Show "{itemName}" filter item options.'
63
+ },
64
+ {
65
+ itemName: name
66
+ }
67
+ );
68
+
69
+ const list = isExpanded ? (
70
+ <Form className={classes.list}>
71
+ <FilterList
72
+ filterApi={filterApi}
73
+ filterState={filterState}
74
+ name={name}
75
+ filterFrontendInput={filterFrontendInput}
76
+ group={group}
77
+ items={items}
78
+ onApply={onApply}
79
+ />
80
+ </Form>
81
+ ) : null;
82
+
83
+ return (
84
+ <li
85
+ className={classes.root}
86
+ aria-label={itemAriaLabel}
87
+ data-cy="FilterBlock-root"
88
+ >
89
+ <button
90
+ className={classes.trigger}
91
+ onClick={handleClick}
92
+ data-cy="FilterBlock-triggerButton"
93
+ type="button"
94
+ aria-expanded={isExpanded}
95
+ aria-label={toggleItemOptionsAriaLabel}
96
+ >
97
+ <span className={classes.header}>
98
+ <span className={classes.name}>{name}</span>
99
+ {/* <Icon src={iconSrc} /> */}
100
+ <ArrowUp2
101
+ size={15}
102
+ className={cn('text-gray-900 transition-all stroke-[#292D32]', isExpanded ? 'rotate-0' : 'rotate-180')}
103
+ variant="Outline"
104
+ />
105
+ </span>
106
+ </button>
107
+ {list}
108
+ </li>
109
+ );
110
+ };
111
+
112
+ FilterBlock.defaultProps = {
113
+ onApply: null,
114
+ initialOpen: false
115
+ };
116
+
117
+ FilterBlock.propTypes = {
118
+ classes: shape({
119
+ header: string,
120
+ list: string,
121
+ name: string,
122
+ root: string,
123
+ trigger: string
124
+ }),
125
+ filterFrontendInput: string,
126
+ filterApi: shape({}).isRequired,
127
+ filterState: setValidator,
128
+ group: string.isRequired,
129
+ items: arrayOf(shape({})),
130
+ name: string.isRequired,
131
+ onApply: func,
132
+ initialOpen: bool
133
+ };
134
+
135
+ export default FilterBlock;
@@ -0,0 +1,25 @@
1
+ .root {
2
+ composes: grid from global;
3
+ }
4
+
5
+ .header {
6
+ composes: grid from global;
7
+ composes: grid-cols-autoLast from global;
8
+ composes: grid-flow-col from global;
9
+ composes: items-center from global;
10
+ composes: py-2.5 from global;
11
+ }
12
+
13
+ .name {
14
+ composes: leading-[14px] from global;
15
+ composes: text-left from global;
16
+ composes: text-[14px] from global;
17
+ composes: font-semibold from global;
18
+ }
19
+
20
+ .list {}
21
+
22
+ /* TODO @TW: cannot compose */
23
+ .list:empty {
24
+ display: none;
25
+ }
@@ -0,0 +1,49 @@
1
+ import React from 'react';
2
+ import { useIntl } from 'react-intl';
3
+ import { bool, func, shape, string } from 'prop-types';
4
+ import { useFilterFooter } from '@magento/peregrine/lib/talons/FilterModal';
5
+
6
+ import { useStyle } from '@magento/venia-ui/lib/classify';
7
+ import Button from '@magento/venia-ui/lib/components/Button';
8
+ import defaultClasses from './filterFooter.module.css';
9
+
10
+ const FilterFooter = props => {
11
+ const { applyFilters, hasFilters, isOpen } = props;
12
+ const { formatMessage } = useIntl();
13
+ const { touched } = useFilterFooter({
14
+ hasFilters,
15
+ isOpen
16
+ });
17
+
18
+ const classes = useStyle(defaultClasses, props.classes);
19
+ const buttonLabel = formatMessage({
20
+ id: 'filterFooter.results',
21
+ defaultMessage: 'See Results'
22
+ });
23
+
24
+ return (
25
+ <div className={classes.root}>
26
+ <Button
27
+ disabled={!touched}
28
+ onClick={applyFilters}
29
+ data-cy="FilterFooter-button"
30
+ aria-label={buttonLabel}
31
+ aria-disabled={!touched}
32
+ priority="high"
33
+ >
34
+ {buttonLabel}
35
+ </Button>
36
+ </div>
37
+ );
38
+ };
39
+
40
+ FilterFooter.propTypes = {
41
+ applyFilters: func.isRequired,
42
+ classes: shape({
43
+ root: string
44
+ }),
45
+ hasFilters: bool,
46
+ isOpen: bool
47
+ };
48
+
49
+ export default FilterFooter;
@@ -0,0 +1,10 @@
1
+ .root {
2
+ composes: bg-white from global;
3
+ composes: content-center from global;
4
+ composes: gap-y-1 from global;
5
+ composes: grid from global;
6
+ composes: h-[7rem] from global;
7
+ composes: items-center from global;
8
+ composes: justify-items-center from global;
9
+ composes: relative from global;
10
+ }
@@ -0,0 +1,166 @@
1
+ import React, { useMemo } from 'react';
2
+ import { FormattedMessage, useIntl } from 'react-intl';
3
+ import { FocusScope } from 'react-aria';
4
+ import { array, arrayOf, shape, string } from 'prop-types';
5
+ import { X as CloseIcon } from 'react-feather';
6
+ import { useFilterModal } from '@magento/peregrine/lib/talons/FilterModal';
7
+
8
+ import { useStyle } from '@magento/venia-ui/lib/classify';
9
+ import Icon from '@magento/venia-ui/lib/components/Icon';
10
+ import LinkButton from '@magento/venia-ui/lib/components/LinkButton';
11
+ import { Portal } from '@magento/venia-ui/lib/components/Portal';
12
+ import CurrentFilters from './CurrentFilters';
13
+ import FilterBlock from './filterBlock';
14
+ import FilterFooter from './filterFooter';
15
+ import defaultClasses from './filterModal.module.css';
16
+
17
+ /**
18
+ * A view that displays applicable and applied filters.
19
+ *
20
+ * @param {Object} props.filters - filters to display
21
+ */
22
+ const FilterModal = props => {
23
+ const { filters } = props;
24
+ const { formatMessage } = useIntl();
25
+ const talonProps = useFilterModal({ filters });
26
+ const {
27
+ filterApi,
28
+ filterItems,
29
+ filterNames,
30
+ filterFrontendInput,
31
+ filterState,
32
+ handleApply,
33
+ handleClose,
34
+ handleReset,
35
+ handleKeyDownActions,
36
+ isOpen
37
+ } = talonProps;
38
+
39
+ const classes = useStyle(defaultClasses, props.classes);
40
+ const modalClass = isOpen ? classes.root_open : classes.root;
41
+
42
+ const filtersList = useMemo(
43
+ () =>
44
+ Array.from(filterItems, ([group, items]) => {
45
+ const blockState = filterState.get(group);
46
+ const groupName = filterNames.get(group);
47
+ const frontendInput = filterFrontendInput.get(group);
48
+ return (
49
+ <FilterBlock
50
+ key={group}
51
+ filterApi={filterApi}
52
+ filterState={blockState}
53
+ filterFrontendInput={frontendInput}
54
+ group={group}
55
+ items={items}
56
+ name={groupName}
57
+ />
58
+ );
59
+ }),
60
+ [filterApi, filterItems, filterNames, filterState, filterFrontendInput]
61
+ );
62
+
63
+ const filtersAriaLabel = formatMessage({
64
+ id: 'filterModal.filters.ariaLabel',
65
+ defaultMessage: 'Filters'
66
+ });
67
+
68
+ const closeAriaLabel = formatMessage({
69
+ id: 'filterModal.filters.close.ariaLabel',
70
+ defaultMessage: 'Close filters popup.'
71
+ });
72
+
73
+ const clearAllAriaLabel = formatMessage({
74
+ id: 'filterModal.action.clearAll.ariaLabel',
75
+ defaultMessage: 'Clear all applied filters'
76
+ });
77
+
78
+ const clearAll = filterState.size ? (
79
+ <div className={classes.action}>
80
+ <LinkButton
81
+ type="button"
82
+ onClick={handleReset}
83
+ ariaLabel={clearAllAriaLabel}
84
+ data-cy="FilterModal-clearButton"
85
+ >
86
+ <FormattedMessage
87
+ id={'filterModal.action'}
88
+ defaultMessage={'Clear all'}
89
+ />
90
+ </LinkButton>
91
+ </div>
92
+ ) : null;
93
+
94
+ if (!isOpen) {
95
+ return null;
96
+ }
97
+
98
+ return (
99
+ <Portal>
100
+ {/* eslint-disable-next-line jsx-a11y/no-autofocus */}
101
+ <FocusScope contain restoreFocus autoFocus>
102
+ {/* eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions */}
103
+ <aside
104
+ className={modalClass}
105
+ onKeyDown={handleKeyDownActions}
106
+ data-cy="FilterModal-root"
107
+ >
108
+ <div className={classes.body}>
109
+ <div className={classes.header}>
110
+ <h2 className={classes.headerTitle}>
111
+ <FormattedMessage
112
+ id={'filterModal.headerTitle'}
113
+ defaultMessage={'Filters'}
114
+ />
115
+ </h2>
116
+ <button
117
+ onClick={handleClose}
118
+ aria-disabled={false}
119
+ aria-label={closeAriaLabel}
120
+ >
121
+ <Icon src={CloseIcon} />
122
+ </button>
123
+ </div>
124
+ <CurrentFilters
125
+ filterApi={filterApi}
126
+ filterNames={filterNames}
127
+ filterState={filterState}
128
+ />
129
+ {clearAll}
130
+ <ul
131
+ className={classes.blocks}
132
+ aria-label={filtersAriaLabel}
133
+ >
134
+ {filtersList}
135
+ </ul>
136
+ </div>
137
+ <FilterFooter
138
+ applyFilters={handleApply}
139
+ hasFilters={!!filterState.size}
140
+ isOpen={isOpen}
141
+ />
142
+ </aside>
143
+ </FocusScope>
144
+ </Portal>
145
+ );
146
+ };
147
+
148
+ FilterModal.propTypes = {
149
+ classes: shape({
150
+ action: string,
151
+ blocks: string,
152
+ body: string,
153
+ header: string,
154
+ headerTitle: string,
155
+ root: string,
156
+ root_open: string
157
+ }),
158
+ filters: arrayOf(
159
+ shape({
160
+ attribute_code: string,
161
+ items: array
162
+ })
163
+ )
164
+ };
165
+
166
+ export default FilterModal;