@evershop/evershop 1.0.0 → 1.1.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 (214) hide show
  1. package/bin/build/client/index.js +1 -1
  2. package/bin/build/complie.js +1 -1
  3. package/bin/build/index.js +1 -1
  4. package/bin/build/server/index.js +1 -1
  5. package/bin/build/server/useDDL.js +1 -1
  6. package/bin/dev/index.js +2 -1
  7. package/bin/evershop +8 -7
  8. package/bin/extension/index.js +1 -1
  9. package/bin/install/index.js +1 -1
  10. package/bin/lib/addDefaultMiddlewareFuncs.js +2 -2
  11. package/bin/lib/app.js +1 -1
  12. package/bin/lib/bootstrap/migrate.js +1 -1
  13. package/bin/lib/buildEntry.js +1 -1
  14. package/bin/lib/onError.js +1 -1
  15. package/bin/lib/onListening.js +1 -1
  16. package/bin/lib/startUp.js +10 -9
  17. package/bin/lib/watch/watchComponents.js +16 -26
  18. package/bin/lib/watch/watchMF.js +1 -1
  19. package/bin/lib/watch/watchMR.js +1 -1
  20. package/bin/lib/watch/watchSchema.js +1 -1
  21. package/bin/user/changePassword.js +1 -1
  22. package/bin/user/create.js +1 -1
  23. package/package.json +2 -2
  24. package/src/components/admin/catalog/productEdit/category/CategoryItem.jsx +1 -1
  25. package/src/components/admin/catalog/productEdit/category/CategoryTree.jsx +1 -1
  26. package/src/components/admin/catalog/productEdit/variants/CreateVariantGroup.jsx +3 -8
  27. package/src/components/admin/catalog/productEdit/variants/Variant.jsx +1 -1
  28. package/src/components/admin/catalog/productEdit/variants/VariantModal.jsx +62 -6
  29. package/src/components/admin/catalog/productEdit/variants/Variants.jsx +1 -1
  30. package/src/components/admin/checkout/shippingSetting/Method.jsx +130 -0
  31. package/src/components/admin/{oms → checkout}/shippingSetting/MethodForm.jsx +124 -13
  32. package/src/components/admin/{oms → checkout}/shippingSetting/Methods.jsx +2 -2
  33. package/src/components/admin/checkout/shippingSetting/PriceBasedPrice.jsx +101 -0
  34. package/src/components/admin/checkout/shippingSetting/WeightBasedPrice.jsx +101 -0
  35. package/src/components/admin/{oms → checkout}/shippingSetting/Zone.jsx +34 -4
  36. package/src/components/admin/{oms → checkout}/shippingSetting/Zones.jsx +6 -3
  37. package/src/components/admin/promotion/couponEdit/AttributeGroupSelector.jsx +5 -5
  38. package/src/components/admin/promotion/couponEdit/CategorySelector.jsx +5 -5
  39. package/src/components/admin/promotion/couponEdit/CollectionSelector.jsx +5 -5
  40. package/src/components/admin/promotion/couponEdit/ProductSkuSelector.jsx +27 -6
  41. package/src/components/common/context/checkout.jsx +8 -14
  42. package/src/components/common/form/Field.jsx +1 -1
  43. package/src/components/common/form/fields/Input.jsx +2 -1
  44. package/src/components/common/form/validator.js +6 -2
  45. package/src/components/common/grid/headers/Dummy.jsx +1 -1
  46. package/src/components/common/grid/headers/Sortable.jsx +148 -0
  47. package/src/components/common/grid/rows/StatusRow.jsx +1 -1
  48. package/src/components/common/list/Filter.jsx +83 -0
  49. package/src/components/common/list/Filter.scss +39 -0
  50. package/src/components/frontStore/catalog/categoryView/filter/AttributeFilter.jsx +19 -5
  51. package/src/components/frontStore/catalog/categoryView/filter/CategoryFilter.jsx +59 -52
  52. package/src/components/frontStore/catalog/categoryView/filter/PriceFilter.jsx +20 -11
  53. package/src/components/frontStore/catalog/product/list/SortOptions.jsx +4 -2
  54. package/src/components/frontStore/catalog/product/list/Sorting.jsx +5 -5
  55. package/src/components/frontStore/checkout/checkout/payment/paymentStep/StepContent.jsx +9 -6
  56. package/src/components/frontStore/stripe/checkout/CheckoutForm.jsx +8 -4
  57. package/src/lib/event/callSubscibers.js +14 -11
  58. package/src/lib/event/event-manager.js +1 -1
  59. package/src/lib/event/loadSubscribers.js +2 -2
  60. package/src/lib/helpers.js +3 -1
  61. package/src/lib/log/CustomColorize.js +22 -0
  62. package/src/lib/log/logger.js +153 -19
  63. package/src/lib/middleware/Handler.js +2 -3
  64. package/src/lib/middleware/async.js +5 -9
  65. package/src/lib/middleware/sync.js +5 -10
  66. package/src/lib/middleware/tests/app/app.js +1 -1
  67. package/src/lib/router/buildAbsoluteUrl.js +1 -1
  68. package/src/lib/util/buildFilterFromUrl.js +31 -64
  69. package/src/lib/util/defaultPaginationFilters.js +102 -0
  70. package/src/lib/util/filterOperationMapp.js +16 -0
  71. package/src/lib/util/registry.js +44 -6
  72. package/src/lib/webpack/dev/createConfigClient.js +2 -0
  73. package/src/lib/webpack/loaders/AreaLoader.js +1 -1
  74. package/src/lib/webpack/loaders/loadTranslationFromCsv.js +1 -1
  75. package/src/lib/webpack/plugins/Tailwindcss.js +1 -1
  76. package/src/modules/auth/graphql/types/AdminUser/AdminUser.admin.resolvers.js +6 -6
  77. package/src/modules/auth/pages/admin/adminLogin/LoginForm.jsx +1 -15
  78. package/src/modules/base/api/global/[apiResponse]apiErrorHandler.js +2 -2
  79. package/src/modules/base/pages/global/[response]errorHandler.js +2 -2
  80. package/src/modules/catalog/api/addProductToCategory/addProducts.js +1 -1
  81. package/src/modules/catalog/api/addProductToCollection/addProducts.js +35 -22
  82. package/src/modules/catalog/api/removeProductFromCollection/removeProducts.js +20 -5
  83. package/src/modules/catalog/bootstrap.js +63 -0
  84. package/src/modules/catalog/graphql/types/Attribute/Attribute.admin.graphql +2 -2
  85. package/src/modules/catalog/graphql/types/Attribute/Attribute.admin.resolvers.js +48 -276
  86. package/src/modules/catalog/graphql/types/Category/Category.graphql +15 -2
  87. package/src/modules/catalog/graphql/types/Category/Category.resolvers.js +2 -2
  88. package/src/modules/catalog/graphql/types/Collection/Collection.resolvers.js +2 -2
  89. package/src/modules/catalog/graphql/types/Product/Product.resolvers.js +1 -1
  90. package/src/modules/catalog/graphql/types/Product/Variant/Variant.graphql +2 -2
  91. package/src/modules/catalog/graphql/types/Product/Variant/Variant.resolvers.js +68 -92
  92. package/src/modules/catalog/pages/admin/attributeEdit+attributeNew/General.jsx +13 -9
  93. package/src/modules/catalog/pages/admin/attributeGrid/Grid.jsx +82 -39
  94. package/src/modules/catalog/pages/admin/attributeGrid/index.js +1 -1
  95. package/src/modules/catalog/pages/admin/categoryEdit/Products.jsx +5 -5
  96. package/src/modules/catalog/pages/admin/categoryGrid/Grid.jsx +48 -16
  97. package/src/modules/catalog/pages/admin/categoryGrid/index.js +1 -1
  98. package/src/modules/catalog/pages/admin/collectionEdit/Products.jsx +5 -5
  99. package/src/modules/catalog/pages/admin/collectionGrid/Grid.jsx +46 -5
  100. package/src/modules/catalog/pages/admin/collectionGrid/index.js +1 -1
  101. package/src/modules/catalog/pages/admin/productEdit+productNew/Attributes.jsx +28 -24
  102. package/src/modules/catalog/pages/admin/productGrid/Grid.jsx +158 -26
  103. package/src/modules/catalog/pages/admin/productGrid/index.js +1 -2
  104. package/src/modules/catalog/pages/frontStore/all/SearchBox.jsx +2 -1
  105. package/src/modules/catalog/pages/frontStore/catalogSearch/[index]filters.js +4 -59
  106. package/src/modules/catalog/pages/frontStore/catalogSearch/index.js +11 -0
  107. package/src/modules/catalog/pages/frontStore/categoryView/Filter.jsx +22 -6
  108. package/src/modules/catalog/pages/frontStore/categoryView/Filter.scss +2 -0
  109. package/src/modules/catalog/pages/frontStore/categoryView/[index]filters.js +5 -105
  110. package/src/modules/catalog/pages/frontStore/homepage/FeaturedProducts.jsx +1 -1
  111. package/src/modules/catalog/pages/frontStore/productView/Form.jsx +8 -3
  112. package/src/modules/catalog/pages/frontStore/productView/Variants.jsx +102 -40
  113. package/src/modules/catalog/services/AttributeCollection.js +59 -0
  114. package/src/modules/catalog/services/AttributeGroupCollection.js +100 -0
  115. package/src/modules/catalog/services/CategoryCollection.js +27 -84
  116. package/src/modules/catalog/services/CollectionCollection.js +24 -72
  117. package/src/modules/catalog/services/ProductCollection.js +50 -216
  118. package/src/modules/catalog/services/attribute/deleteProductAttribute.js +15 -0
  119. package/src/modules/catalog/services/getAttributeGroupsBaseQuery.js +3 -0
  120. package/src/modules/catalog/services/getAttributesBaseQuery.js +3 -0
  121. package/src/modules/catalog/services/getCollectionsBaseQuery.js +0 -1
  122. package/src/modules/catalog/services/product/updateProduct.js +8 -2
  123. package/src/modules/catalog/services/registerDefaultAttributeCollectionFilters.js +149 -0
  124. package/src/modules/catalog/services/registerDefaultCategoryCollectionFilters.js +85 -0
  125. package/src/modules/catalog/services/registerDefaultCollectionCollectionFilters.js +65 -0
  126. package/src/modules/catalog/services/registerDefaultProductCollectionFilters.js +219 -0
  127. package/src/modules/catalog/subscribers/category_created/buildUrlRewrite.js +1 -1
  128. package/src/modules/catalog/subscribers/category_deleted/deleteUrlRewrite.js +1 -1
  129. package/src/modules/catalog/subscribers/category_updated/builUrlRewrite.js +1 -1
  130. package/src/modules/catalog/subscribers/product_created/builUrlRewrite.js +1 -1
  131. package/src/modules/catalog/subscribers/product_deleted/deleteUrlRewrite.js +1 -1
  132. package/src/modules/catalog/subscribers/product_image_added/localGenerateProductImageVariant.js +3 -3
  133. package/src/modules/checkout/api/addCartShippingMethod/saveShippingMethod.js +6 -1
  134. package/src/modules/checkout/api/createCart/[context]bodyParser[auth].js +5 -0
  135. package/src/modules/checkout/api/createCart/createNewCart.js +92 -0
  136. package/src/modules/checkout/api/createCart/payloadSchema.json +44 -0
  137. package/src/modules/checkout/api/createCart/route.json +5 -0
  138. package/src/modules/checkout/api/deleteShippingZone/deleteShippingZone.js +58 -0
  139. package/src/modules/checkout/api/deleteShippingZone/route.json +5 -0
  140. package/src/modules/checkout/api/deleteShippingZoneMethod/deleteShippingZoneMethod.js +85 -0
  141. package/src/modules/checkout/api/deleteShippingZoneMethod/route.json +5 -0
  142. package/src/modules/checkout/api/getShippingMethods/sendMethods.js +37 -0
  143. package/src/modules/checkout/api/updateShippingMethod/[context]borderParser[auth].js +5 -0
  144. package/src/modules/checkout/api/updateShippingMethod/payloadSchema.json +12 -0
  145. package/src/modules/checkout/api/updateShippingMethod/route.json +5 -0
  146. package/src/modules/checkout/api/updateShippingMethod/updateShippingMethod.js +64 -0
  147. package/src/modules/checkout/api/updateShippingZoneMethod/payloadSchema.json +43 -1
  148. package/src/modules/checkout/api/updateShippingZoneMethod/updateShippingZoneMethod.js +17 -3
  149. package/src/modules/checkout/bootstrap.js +1 -1
  150. package/src/modules/checkout/graphql/types/ShippingMethod/ShippingMethod.graphql +1 -0
  151. package/src/modules/checkout/graphql/types/ShippingMethod/ShippingMethod.resolvers.js +4 -0
  152. package/src/modules/checkout/graphql/types/ShippingZone/ShippingZone.graphql +21 -1
  153. package/src/modules/checkout/graphql/types/ShippingZone/ShippingZone.resolvers.js +34 -4
  154. package/src/modules/checkout/graphql/types/Weight/Weight.resolvers.js +8 -11
  155. package/src/modules/checkout/migration/Version-1.0.5.js +28 -0
  156. package/src/modules/{oms → checkout}/pages/admin/shippingSetting/ShippingSetting.jsx +66 -43
  157. package/src/modules/checkout/pages/frontStore/all/[auth]addCustomerToCart.js +3 -3
  158. package/src/modules/checkout/pages/frontStore/checkout/PaymentStep.jsx +3 -2
  159. package/src/modules/checkout/pages/frontStore/checkout/ShippingMethods.jsx +23 -10
  160. package/src/modules/checkout/pages/frontStore/checkout/SummaryMobile.jsx +132 -0
  161. package/src/modules/checkout/pages/frontStore/checkout/SummaryMobile.scss +7 -0
  162. package/src/modules/checkout/services/cart/Cart.js +23 -7
  163. package/src/modules/checkout/services/cart/DataObject.js +3 -3
  164. package/src/modules/checkout/services/cart/registerCartBaseFields.js +32 -0
  165. package/src/modules/checkout/services/cart/registerCartItemBaseFields.js +3 -2
  166. package/src/modules/cms/bootstrap.js +17 -0
  167. package/src/modules/cms/graphql/types/CmsPage/CmsPage.resolvers.js +2 -11
  168. package/src/modules/cms/pages/admin/all/Layout.scss +3 -2
  169. package/src/modules/cms/pages/admin/all/SearchBox.jsx +1 -1
  170. package/src/modules/cms/pages/admin/cmsPageGrid/Grid.jsx +62 -9
  171. package/src/modules/cms/pages/admin/cmsPageGrid/index.js +1 -2
  172. package/src/modules/cms/services/CMSPageCollection.js +23 -70
  173. package/src/modules/cms/services/registerDefaultPageCollectionFilters.js +62 -0
  174. package/src/modules/cms/services/tailwind.admin.config.js +6 -1
  175. package/src/modules/customer/api/createCustomer/[bodyParser]createCustomer.js +2 -2
  176. package/src/modules/customer/api/resetPassword/[bodyParser]resetPassword.js +2 -2
  177. package/src/modules/customer/api/updatePassword/[bodyParser]updatePassword.js +2 -2
  178. package/src/modules/customer/bootstrap.js +29 -0
  179. package/src/modules/customer/graphql/types/Customer/Customer.admin.resolvers.js +2 -4
  180. package/src/modules/customer/pages/admin/customerGrid/Grid.jsx +108 -14
  181. package/src/modules/customer/pages/admin/customerGrid/index.js +1 -2
  182. package/src/modules/customer/pages/frontStore/login/LoginForm.jsx +0 -1
  183. package/src/modules/customer/services/CustomerCollection.js +23 -104
  184. package/src/modules/customer/services/CustomerGroupCollection.js +21 -70
  185. package/src/modules/customer/services/registerDefaultCustomerCollectionFilters.js +90 -0
  186. package/src/modules/customer/services/registerDefaultCustomerGroupCollectionFilters.js +50 -0
  187. package/src/modules/graphql/pages/global/[bodyParser]buildQuery[graphql].js +1 -1
  188. package/src/modules/graphql/pages/global/[buildQuery]graphql[notification].js +1 -1
  189. package/src/modules/graphql/services/graphqlMiddleware.js +1 -1
  190. package/src/modules/oms/bootstrap.js +17 -0
  191. package/src/modules/oms/graphql/types/Order/Order.admin.resolvers.js +1 -1
  192. package/src/modules/oms/graphql/types/Order/Order.resolvers.js +2 -1
  193. package/src/modules/oms/pages/admin/orderGrid/Grid.jsx +152 -51
  194. package/src/modules/oms/pages/admin/orderGrid/index.js +1 -2
  195. package/src/modules/oms/services/OrderCollection.js +19 -139
  196. package/src/modules/oms/services/registerDefaultOrderCollectionFilters.js +121 -0
  197. package/src/modules/promotion/bootstrap.js +16 -0
  198. package/src/modules/promotion/graphql/types/Coupon/Coupon.admin.resolvers.js +2 -7
  199. package/src/modules/promotion/pages/admin/couponGrid/Grid.jsx +157 -33
  200. package/src/modules/promotion/pages/admin/couponGrid/index.js +1 -2
  201. package/src/modules/promotion/services/CouponCollection.js +21 -130
  202. package/src/modules/promotion/services/registerDefaultCouponCollectionFilters.js +72 -0
  203. package/src/modules/stripe/api/stripeWebHook/[bodyJson]webhook.js +4 -2
  204. package/src/modules/tax/bootstrap.js +17 -0
  205. package/src/modules/tax/services/TaxClassCollection.js +22 -56
  206. package/src/modules/tax/services/registerDefaultTaxClassCollectionFilters.js +49 -0
  207. package/src/components/admin/oms/shippingSetting/Method.jsx +0 -73
  208. package/src/components/common/grid/headers/Basic.jsx +0 -55
  209. package/src/lib/log/debuger.js +0 -89
  210. package/src/modules/customer/pages/frontStore/login/LoginButton.jsx +0 -27
  211. /package/src/components/admin/{oms → checkout}/shippingSetting/ZoneForm.jsx +0 -0
  212. /package/src/modules/{oms → checkout}/pages/admin/all/ShippingSettingMenu.jsx +0 -0
  213. /package/src/modules/{oms → checkout}/pages/admin/shippingSetting/index.js +0 -0
  214. /package/src/modules/{oms → checkout}/pages/admin/shippingSetting/route.json +0 -0
@@ -47,7 +47,7 @@ export function Field(props) {
47
47
  return () => {
48
48
  context.removeField(name);
49
49
  };
50
- }, []);
50
+ }, [name]);
51
51
 
52
52
  React.useEffect(() => {
53
53
  setFieldValue(value);
@@ -24,7 +24,8 @@ const inputProps = function buidProps(props) {
24
24
  'onKeyPress',
25
25
  'onKeyDown',
26
26
  'onKeyUp',
27
- 'value'
27
+ 'value',
28
+ 'id'
28
29
  ].forEach((a) => {
29
30
  if (props[a]) obj[a] = props[a];
30
31
  obj.defaultValue = props.value;
@@ -13,8 +13,12 @@ const rules = {
13
13
  },
14
14
  number: {
15
15
  handler(value) {
16
- if (value === null || value === undefined || value === '') return true;
17
- return /^-?[0-9]+$/.test(value);
16
+ if (value === null || value === undefined || value === '') {
17
+ return true;
18
+ }
19
+
20
+ // Allowing integer and float
21
+ return !Number.isNaN(value);
18
22
  },
19
23
  errorMessage: 'Invalid number'
20
24
  },
@@ -5,7 +5,7 @@ export default function DummyColumnHeader({ title }) {
5
5
  return (
6
6
  <th className="column">
7
7
  <div className="table-header id-header">
8
- <div className="title">
8
+ <div className="font-medium uppercase text-xl">
9
9
  <span>{title}</span>
10
10
  </div>
11
11
  </div>
@@ -0,0 +1,148 @@
1
+ /* eslint-disable no-nested-ternary */
2
+ import React from 'react';
3
+ import PropTypes from 'prop-types';
4
+
5
+ function Up() {
6
+ return (
7
+ <svg
8
+ width="12"
9
+ height="12"
10
+ viewBox="0 0 17 23"
11
+ fill="none"
12
+ xmlns="http://www.w3.org/2000/svg"
13
+ >
14
+ <path
15
+ d="M1 8.5L8.5 1L16 8.5"
16
+ stroke="black"
17
+ strokeWidth="1.5"
18
+ strokeLinecap="round"
19
+ strokeLinejoin="round"
20
+ />
21
+ <path
22
+ d="M16 14L8.5 21.5L1 14"
23
+ stroke="#e1e3e5"
24
+ strokeWidth="1.5"
25
+ strokeLinecap="round"
26
+ strokeLinejoin="round"
27
+ />
28
+ </svg>
29
+ );
30
+ }
31
+
32
+ function Down() {
33
+ return (
34
+ <svg
35
+ width="12"
36
+ height="12"
37
+ viewBox="0 0 17 23"
38
+ fill="none"
39
+ xmlns="http://www.w3.org/2000/svg"
40
+ >
41
+ <path
42
+ d="M1 8.5L8.5 1L16 8.5"
43
+ stroke="#e1e3e5"
44
+ strokeWidth="1.5"
45
+ strokeLinecap="round"
46
+ strokeLinejoin="round"
47
+ />
48
+ <path
49
+ d="M16 14L8.5 21.5L1 14"
50
+ stroke="black"
51
+ strokeWidth="1.5"
52
+ strokeLinecap="round"
53
+ strokeLinejoin="round"
54
+ />
55
+ </svg>
56
+ );
57
+ }
58
+
59
+ function None() {
60
+ return (
61
+ <svg
62
+ width="12"
63
+ height="12"
64
+ viewBox="0 0 17 23"
65
+ fill="none"
66
+ xmlns="http://www.w3.org/2000/svg"
67
+ >
68
+ <path
69
+ d="M1 8.5L8.5 1L16 8.5"
70
+ stroke="#e1e3e5"
71
+ strokeWidth="1.5"
72
+ strokeLinecap="round"
73
+ strokeLinejoin="round"
74
+ />
75
+ <path
76
+ d="M16 14L8.5 21.5L1 14"
77
+ stroke="#e1e3e5"
78
+ strokeWidth="1.5"
79
+ strokeLinecap="round"
80
+ strokeLinejoin="round"
81
+ />
82
+ </svg>
83
+ );
84
+ }
85
+
86
+ export default function SortableHeader({ title, name, currentFilters }) {
87
+ const [currentDirection] = React.useState(() => {
88
+ const currentOrderBy = currentFilters.find((filter) => filter.key === 'ob');
89
+ if (!currentOrderBy || currentOrderBy.value !== name) {
90
+ return null;
91
+ } else {
92
+ return (
93
+ currentFilters.find((filter) => filter.key === 'od')?.value || 'asc'
94
+ );
95
+ }
96
+ });
97
+ const onChange = () => {
98
+ const url = new URL(window.location.href);
99
+ url.searchParams.set('ob', name);
100
+ // Get the current direction by checking the currentFilters
101
+ const currentDirection = currentFilters.find(
102
+ (filter) => filter.key === 'od'
103
+ );
104
+ if (!currentDirection || currentDirection.value === 'asc') {
105
+ url.searchParams.set('od', 'desc');
106
+ } else {
107
+ url.searchParams.set('od', 'asc');
108
+ }
109
+ window.location.href = url;
110
+ };
111
+
112
+ return (
113
+ <th className="column">
114
+ <div className="table-header flex justify-start gap-1 content-center">
115
+ <div className="font-medium uppercase text-xl">
116
+ <span>{title}</span>
117
+ </div>
118
+ <div className="sort">
119
+ <button type="button" onClick={onChange}>
120
+ {currentDirection === 'asc' ? (
121
+ <Down />
122
+ ) : currentDirection === 'desc' ? (
123
+ <Up />
124
+ ) : (
125
+ <None />
126
+ )}
127
+ </button>
128
+ </div>
129
+ </div>
130
+ </th>
131
+ );
132
+ }
133
+
134
+ SortableHeader.propTypes = {
135
+ title: PropTypes.string.isRequired,
136
+ name: PropTypes.string.isRequired,
137
+ currentFilters: PropTypes.arrayOf(
138
+ PropTypes.shape({
139
+ key: PropTypes.string.isRequired,
140
+ operations: PropTypes.string.isRequired,
141
+ value: PropTypes.string.isRequired
142
+ })
143
+ )
144
+ };
145
+
146
+ SortableHeader.defaultProps = {
147
+ currentFilters: []
148
+ };
@@ -5,7 +5,7 @@ import Dot from '@components/common/Dot';
5
5
  export default function StatusRow({ id, areaProps }) {
6
6
  return (
7
7
  <td>
8
- <div className="flex justify-center">
8
+ <div>
9
9
  {parseInt(areaProps.row[id], 10) === 0 && (
10
10
  <Dot variant="default" size="1.2rem" />
11
11
  )}
@@ -0,0 +1,83 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import './Filter.scss';
4
+
5
+ export default function Filter({ title, options, selectedOption }) {
6
+ const [show, setShow] = React.useState(false);
7
+
8
+ return (
9
+ <div className="filter-container">
10
+ <button
11
+ type="button"
12
+ onClick={() => setShow(!show)}
13
+ className="flex gap-1 justify-center items-center"
14
+ >
15
+ <span>{selectedOption || title}</span>
16
+ {!show && (
17
+ <svg
18
+ width="6"
19
+ height="5"
20
+ viewBox="0 0 118 106"
21
+ fill="none"
22
+ xmlns="http://www.w3.org/2000/svg"
23
+ >
24
+ <path
25
+ d="M54.6478 2.69522C56.5621 -0.689529 61.4379 -0.689535 63.3522 2.69521L117.134 97.7885C119.019 101.122 116.611 105.25 112.782 105.25H5.21828C1.38899 105.25 -1.01899 101.122 0.866121 97.7886L54.6478 2.69522Z"
26
+ fill="#2F2F2F"
27
+ />
28
+ </svg>
29
+ )}
30
+
31
+ {show && (
32
+ <svg
33
+ width="6"
34
+ height="5"
35
+ viewBox="0 0 118 106"
36
+ fill="none"
37
+ xmlns="http://www.w3.org/2000/svg"
38
+ >
39
+ <path
40
+ d="M63.3522 103.305C61.4379 106.69 56.5621 106.69 54.6478 103.305L0.866142 8.21144C-1.01897 4.8783 1.38901 0.749989 5.2183 0.749989L112.782 0.749998C116.611 0.749999 119.019 4.8783 117.134 8.21144L63.3522 103.305Z"
41
+ fill="#2F2F2F"
42
+ />
43
+ </svg>
44
+ )}
45
+ </button>
46
+ {show && (
47
+ <ul>
48
+ {options.map((option) => (
49
+ <li key={option.value}>
50
+ <a
51
+ href="#"
52
+ onClick={(e) => {
53
+ e.preventDefault();
54
+ option.onSelect();
55
+ }}
56
+ >
57
+ {option.label}
58
+ </a>
59
+ </li>
60
+ ))}
61
+ </ul>
62
+ )}
63
+ </div>
64
+ );
65
+ }
66
+
67
+ Filter.propTypes = {
68
+ title: PropTypes.string,
69
+ options: PropTypes.arrayOf(
70
+ PropTypes.shape({
71
+ label: PropTypes.string,
72
+ value: PropTypes.string,
73
+ onSelect: PropTypes.func
74
+ })
75
+ ),
76
+ selectedOption: PropTypes.string
77
+ };
78
+
79
+ Filter.defaultProps = {
80
+ title: '',
81
+ options: [],
82
+ selectedOption: ''
83
+ };
@@ -0,0 +1,39 @@
1
+ .filter-container {
2
+ display: flex;
3
+ flex-direction: column;
4
+ gap: 1rem;
5
+ position: relative;
6
+ }
7
+
8
+ .filter-container button {
9
+ background: none;
10
+ border-bottom: 1px solid #ccc;
11
+ color: var(--color-text);
12
+ font-size: 1.5rem;
13
+ text-align: left;
14
+ font-size: 12px;
15
+ padding: 0 5px;
16
+ text-transform: capitalize;
17
+ }
18
+
19
+ .filter-container ul {
20
+ list-style: none;
21
+ padding: 10px;
22
+ position: absolute;
23
+ background: white;
24
+ border: 1px solid #ccc;
25
+ border-radius: 0.5rem;
26
+ box-shadow: 0 0 0.5rem rgba(0, 0, 0, 0.1);
27
+ z-index: 1;
28
+ top: 100%;
29
+ left: 0;
30
+ width: max-content;
31
+ }
32
+
33
+ .filter-container ul li {
34
+ padding: 3px 5px;
35
+ text-transform: capitalize;
36
+ &:hover {
37
+ background: #f9f9f9;
38
+ }
39
+ }
@@ -24,8 +24,15 @@ export function AttributeFilter({
24
24
  // Update the filter
25
25
  updateFilter(
26
26
  currentFilters.map((f) => {
27
- if (f.key !== attributeCode) return f;
28
- else return { key: attributeCode, value: value.join(',') };
27
+ if (f.key !== attributeCode) {
28
+ return f;
29
+ } else {
30
+ return {
31
+ key: attributeCode,
32
+ operation: 'in',
33
+ value: value.join(',')
34
+ };
35
+ }
29
36
  })
30
37
  );
31
38
  }
@@ -33,18 +40,25 @@ export function AttributeFilter({
33
40
  // Add the option to the filter
34
41
  updateFilter(
35
42
  currentFilters.map((f) => {
36
- if (f.key !== attributeCode) return f;
37
- else
43
+ if (f.key !== attributeCode) {
44
+ return f;
45
+ } else {
38
46
  return {
39
47
  key: attributeCode,
48
+ operation: 'in',
40
49
  value: value.concat(optionId).join(',')
41
50
  };
51
+ }
42
52
  })
43
53
  );
44
54
  }
45
55
  } else {
46
56
  updateFilter(
47
- currentFilters.concat({ key: attributeCode, value: optionId })
57
+ currentFilters.concat({
58
+ key: attributeCode,
59
+ operation: 'in',
60
+ value: optionId
61
+ })
48
62
  );
49
63
  }
50
64
  };
@@ -24,7 +24,7 @@ export function CategoryFilter({ currentFilters, categories, updateFilter }) {
24
24
  if (f.key !== 'cat') {
25
25
  return f;
26
26
  } else {
27
- return { key: 'cat', value: value.join(',') };
27
+ return { key: 'cat', operation: 'in', value: value.join(',') };
28
28
  }
29
29
  })
30
30
  );
@@ -38,6 +38,7 @@ export function CategoryFilter({ currentFilters, categories, updateFilter }) {
38
38
  } else {
39
39
  return {
40
40
  key: 'cat',
41
+ operation: 'in',
41
42
  value: value.concat(categoryId).join(',')
42
43
  };
43
44
  }
@@ -45,7 +46,13 @@ export function CategoryFilter({ currentFilters, categories, updateFilter }) {
45
46
  );
46
47
  }
47
48
  } else {
48
- updateFilter(currentFilters.concat({ key: 'cat', value: categoryId }));
49
+ updateFilter(
50
+ currentFilters.concat({
51
+ key: 'cat',
52
+ operation: 'in',
53
+ value: categoryId
54
+ })
55
+ );
49
56
  }
50
57
  };
51
58
 
@@ -55,59 +62,59 @@ export function CategoryFilter({ currentFilters, categories, updateFilter }) {
55
62
 
56
63
  return (
57
64
  <div className="category-filter mt-2">
58
- <div className="filter-item-title">
59
- <span className="font-medium">{_('Category')}</span>
60
- </div>
61
- <ul className="filter-option-list">
62
- {categories.map((c) => {
63
- const isChecked = currentFilters.find(
64
- (f) =>
65
- f.key === 'cat' &&
66
- f.value.split(',').includes(c.categoryId.toString())
67
- );
65
+ <div className="filter-item-title">
66
+ <span className="font-medium">{_('Category')}</span>
67
+ </div>
68
+ <ul className="filter-option-list">
69
+ {categories.map((c) => {
70
+ const isChecked = currentFilters.find(
71
+ (f) =>
72
+ f.key === 'cat' &&
73
+ f.value.split(',').includes(c.categoryId.toString())
74
+ );
68
75
 
69
- return (
70
- <li key={c.uuid} className="mt-05 mr-05">
71
- <a
72
- href="#"
73
- className="flex justify-start items-center"
74
- onClick={(e) => onChange(e, c.categoryId)}
75
- >
76
- {isChecked && (
77
- <svg width="24px" height="24px" viewBox="0 0 24 24">
78
- <g
79
- stroke="none"
80
- strokeWidth="1"
81
- fill="none"
82
- fillRule="evenodd"
83
- >
84
- <g fill="#212121" fillRule="nonzero">
85
- <path d="M18,3 C19.6568542,3 21,4.34314575 21,6 L21,18 C21,19.6568542 19.6568542,21 18,21 L6,21 C4.34314575,21 3,19.6568542 3,18 L3,6 C3,4.34314575 4.34314575,3 6,3 L18,3 Z M16.4696699,7.96966991 L10,14.4393398 L7.53033009,11.9696699 C7.23743687,11.6767767 6.76256313,11.6767767 6.46966991,11.9696699 C6.1767767,12.2625631 6.1767767,12.7374369 6.46966991,13.0303301 L9.46966991,16.0303301 C9.76256313,16.3232233 10.2374369,16.3232233 10.5303301,16.0303301 L17.5303301,9.03033009 C17.8232233,8.73743687 17.8232233,8.26256313 17.5303301,7.96966991 C17.2374369,7.6767767 16.7625631,7.6767767 16.4696699,7.96966991 Z" />
86
- </g>
76
+ return (
77
+ <li key={c.uuid} className="mt-05 mr-05">
78
+ <a
79
+ href="#"
80
+ className="flex justify-start items-center"
81
+ onClick={(e) => onChange(e, c.categoryId)}
82
+ >
83
+ {isChecked && (
84
+ <svg width="24px" height="24px" viewBox="0 0 24 24">
85
+ <g
86
+ stroke="none"
87
+ strokeWidth="1"
88
+ fill="none"
89
+ fillRule="evenodd"
90
+ >
91
+ <g fill="#212121" fillRule="nonzero">
92
+ <path d="M18,3 C19.6568542,3 21,4.34314575 21,6 L21,18 C21,19.6568542 19.6568542,21 18,21 L6,21 C4.34314575,21 3,19.6568542 3,18 L3,6 C3,4.34314575 4.34314575,3 6,3 L18,3 Z M16.4696699,7.96966991 L10,14.4393398 L7.53033009,11.9696699 C7.23743687,11.6767767 6.76256313,11.6767767 6.46966991,11.9696699 C6.1767767,12.2625631 6.1767767,12.7374369 6.46966991,13.0303301 L9.46966991,16.0303301 C9.76256313,16.3232233 10.2374369,16.3232233 10.5303301,16.0303301 L17.5303301,9.03033009 C17.8232233,8.73743687 17.8232233,8.26256313 17.5303301,7.96966991 C17.2374369,7.6767767 16.7625631,7.6767767 16.4696699,7.96966991 Z" />
87
93
  </g>
88
- </svg>
89
- )}
90
- {!isChecked && (
91
- <svg width="24px" height="24px" viewBox="0 0 24 24">
92
- <g
93
- stroke="none"
94
- strokeWidth="1"
95
- fill="none"
96
- fillRule="evenodd"
97
- >
98
- <g fill="#212121" fillRule="nonzero">
99
- <path d="M5.75,3 L18.25,3 C19.7687831,3 21,4.23121694 21,5.75 L21,18.25 C21,19.7687831 19.7687831,21 18.25,21 L5.75,21 C4.23121694,21 3,19.7687831 3,18.25 L3,5.75 C3,4.23121694 4.23121694,3 5.75,3 Z M5.75,4.5 C5.05964406,4.5 4.5,5.05964406 4.5,5.75 L4.5,18.25 C4.5,18.9403559 5.05964406,19.5 5.75,19.5 L18.25,19.5 C18.9403559,19.5 19.5,18.9403559 19.5,18.25 L19.5,5.75 C19.5,5.05964406 18.9403559,4.5 18.25,4.5 L5.75,4.5 Z" />
100
- </g>
94
+ </g>
95
+ </svg>
96
+ )}
97
+ {!isChecked && (
98
+ <svg width="24px" height="24px" viewBox="0 0 24 24">
99
+ <g
100
+ stroke="none"
101
+ strokeWidth="1"
102
+ fill="none"
103
+ fillRule="evenodd"
104
+ >
105
+ <g fill="#212121" fillRule="nonzero">
106
+ <path d="M5.75,3 L18.25,3 C19.7687831,3 21,4.23121694 21,5.75 L21,18.25 C21,19.7687831 19.7687831,21 18.25,21 L5.75,21 C4.23121694,21 3,19.7687831 3,18.25 L3,5.75 C3,4.23121694 4.23121694,3 5.75,3 Z M5.75,4.5 C5.05964406,4.5 4.5,5.05964406 4.5,5.75 L4.5,18.25 C4.5,18.9403559 5.05964406,19.5 5.75,19.5 L18.25,19.5 C18.9403559,19.5 19.5,18.9403559 19.5,18.25 L19.5,5.75 C19.5,5.05964406 18.9403559,4.5 18.25,4.5 L5.75,4.5 Z" />
101
107
  </g>
102
- </svg>
103
- )}
104
- <span className="filter-option">{c.name}</span>
105
- </a>
106
- </li>
107
- );
108
- })}
109
- </ul>
110
- </div>
108
+ </g>
109
+ </svg>
110
+ )}
111
+ <span className="filter-option">{c.name}</span>
112
+ </a>
113
+ </li>
114
+ );
115
+ })}
116
+ </ul>
117
+ </div>
111
118
  );
112
119
  }
113
120
 
@@ -1,6 +1,7 @@
1
1
  import React from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import './PriceFilter.scss';
4
+ import { _ } from '@evershop/evershop/src/lib/locale/translate';
4
5
 
5
6
  export function PriceFilter({
6
7
  priceRange: { min: minPrice, max: maxPrice },
@@ -10,7 +11,7 @@ export function PriceFilter({
10
11
  }) {
11
12
  const firstRender = React.useRef(true);
12
13
  const [from, setFrom] = React.useState(() => {
13
- const minPriceFilter = currentFilters.find((f) => f.key === 'minPrice');
14
+ const minPriceFilter = currentFilters.find((f) => f.key === 'min_price');
14
15
  if (minPriceFilter) {
15
16
  return minPriceFilter.value;
16
17
  } else {
@@ -19,7 +20,7 @@ export function PriceFilter({
19
20
  });
20
21
 
21
22
  const [to, setTo] = React.useState(() => {
22
- const maxPriceFilter = currentFilters.find((f) => f.key === 'maxPrice');
23
+ const maxPriceFilter = currentFilters.find((f) => f.key === 'max_price');
23
24
  if (maxPriceFilter) {
24
25
  return maxPriceFilter.value;
25
26
  } else {
@@ -30,7 +31,7 @@ export function PriceFilter({
30
31
  React.useEffect(() => {
31
32
  firstRender.current = true;
32
33
  setFrom(() => {
33
- const minPriceFilter = currentFilters.find((f) => f.key === 'minPrice');
34
+ const minPriceFilter = currentFilters.find((f) => f.key === 'min_price');
34
35
  if (minPriceFilter) {
35
36
  return minPriceFilter.value;
36
37
  } else {
@@ -38,7 +39,7 @@ export function PriceFilter({
38
39
  }
39
40
  });
40
41
  setTo(() => {
41
- const maxPriceFilter = currentFilters.find((f) => f.key === 'maxPrice');
42
+ const maxPriceFilter = currentFilters.find((f) => f.key === 'max_price');
42
43
  if (maxPriceFilter) {
43
44
  return maxPriceFilter.value;
44
45
  } else {
@@ -62,13 +63,13 @@ export function PriceFilter({
62
63
  }
63
64
  if (minValue || maxValue) {
64
65
  const newFilters = currentFilters.map((f) => {
65
- if (f.key === 'minPrice' && minValue) {
66
+ if (f.key === 'min_price' && minValue) {
66
67
  return {
67
68
  ...f,
68
69
  value: minValue
69
70
  };
70
71
  }
71
- if (f.key === 'maxPrice' && maxValue) {
72
+ if (f.key === 'max_price' && maxValue) {
72
73
  return {
73
74
  ...f,
74
75
  value: maxValue
@@ -78,17 +79,25 @@ export function PriceFilter({
78
79
  });
79
80
  // Check if the minPrice filter is already in the filter
80
81
  const minPriceIndex = currentFilters.findIndex(
81
- (f) => f.key === 'minPrice'
82
+ (f) => f.key === 'min_price'
82
83
  );
83
84
  if (minPriceIndex === -1 && minValue) {
84
- newFilters.push({ key: 'minPrice', value: minValue });
85
+ newFilters.push({
86
+ key: 'min_price',
87
+ operation: 'eq',
88
+ value: minValue
89
+ });
85
90
  }
86
91
  // Check if the maxPrice filter is already in the filter
87
92
  const maxPriceIndex = currentFilters.findIndex(
88
- (f) => f.key === 'maxPrice'
93
+ (f) => f.key === 'max_price'
89
94
  );
90
95
  if (maxPriceIndex === -1 && maxValue) {
91
- newFilters.push({ key: 'maxPrice', value: maxValue });
96
+ newFilters.push({
97
+ key: 'max_price',
98
+ operation: 'eq',
99
+ value: maxValue
100
+ });
92
101
  }
93
102
 
94
103
  updateFilter(newFilters);
@@ -131,7 +140,7 @@ export function PriceFilter({
131
140
 
132
141
  return (
133
142
  <div className="price-filter">
134
- <div className="filter-item-title">Price</div>
143
+ <div className="filter-item-title">{_('Price')}</div>
135
144
  <div className="rangeslider">
136
145
  <input
137
146
  className="min"
@@ -1,6 +1,8 @@
1
+ import { _ } from '@evershop/evershop/src/lib/locale/translate';
2
+
1
3
  const options = [
2
- { code: 'price', name: 'Price' },
3
- { code: 'name', name: 'Name' }
4
+ { code: 'price', name: _('Price') },
5
+ { code: 'name', name: _('Name') }
4
6
  ];
5
7
 
6
8
  export default options;
@@ -12,7 +12,7 @@ export default function Sorting() {
12
12
  // Check if this is browser or server
13
13
  if (typeof window !== 'undefined') {
14
14
  const params = new URL(document.location).searchParams;
15
- return params.get('sortBy') || 'id';
15
+ return params.get('ob') || 'id';
16
16
  } else {
17
17
  return undefined;
18
18
  }
@@ -22,7 +22,7 @@ export default function Sorting() {
22
22
  // Check if this is browser or server
23
23
  if (typeof window !== 'undefined') {
24
24
  const params = new URL(document.location).searchParams;
25
- return params.get('sortOrder') || 'asc';
25
+ return params.get('od') || 'asc';
26
26
  } else {
27
27
  return undefined;
28
28
  }
@@ -33,9 +33,9 @@ export default function Sorting() {
33
33
  e.preventDefault();
34
34
  const url = new URL(currentUrl, window.location.origin);
35
35
  if (e.target.value === '') {
36
- url.searchParams.delete('sortBy');
36
+ url.searchParams.delete('ob');
37
37
  } else {
38
- url.searchParams.set('sortBy', e.target.value);
38
+ url.searchParams.set('ob', e.target.value);
39
39
  }
40
40
  url.searchParams.append('ajax', true);
41
41
  setSortBy(e.target.value);
@@ -49,7 +49,7 @@ export default function Sorting() {
49
49
  e.preventDefault();
50
50
  const url = new URL(currentUrl, window.location.origin);
51
51
  const order = sortOrder.toLowerCase() === 'asc' ? 'desc' : 'asc';
52
- url.searchParams.set('sortOrder', order);
52
+ url.searchParams.set('od', order);
53
53
  url.searchParams.append('ajax', true);
54
54
  setSortOrder(order);
55
55
  await AppContextDispatch.fetchPageData(url);