@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
@@ -1,4 +1,4 @@
1
- /* eslint-disable react/no-unstable-nested-components */
1
+ /* eslint-disable react/no-unstable-nested-components,no-nested-ternary */
2
2
  import PropTypes from 'prop-types';
3
3
  import React, { useState } from 'react';
4
4
  import axios from 'axios';
@@ -11,12 +11,13 @@ import StatusRow from '@components/common/grid/rows/StatusRow';
11
11
  import ProductPriceRow from '@components/admin/catalog/productGrid/rows/PriceRow';
12
12
  import BasicRow from '@components/common/grid/rows/BasicRow';
13
13
  import ThumbnailRow from '@components/admin/catalog/productGrid/rows/ThumbnailRow';
14
- import BasicColumnHeader from '@components/common/grid/headers/Basic';
15
- import FromToColumnHeader from '@components/common/grid/headers/FromTo';
16
- import DropdownColumnHeader from '@components/common/grid/headers/Dropdown';
17
14
  import { Card } from '@components/admin/cms/Card';
18
15
  import DummyColumnHeader from '@components/common/grid/headers/Dummy';
19
16
  import QtyRow from '@components/admin/catalog/productGrid/rows/QtyRow';
17
+ import SortableHeader from '@components/common/grid/headers/Sortable';
18
+ import { Form } from '@components/common/form/Form';
19
+ import { Field } from '@components/common/form/Field';
20
+ import Filter from '@components/common/list/Filter';
20
21
 
21
22
  function Actions({ products = [], selectedIds = [] }) {
22
23
  const { openAlert, closeAlert } = useAlertContext();
@@ -170,6 +171,136 @@ export default function ProductGrid({
170
171
 
171
172
  return (
172
173
  <Card>
174
+ <Card.Session
175
+ title={
176
+ <Form submitBtn={false}>
177
+ <div className="flex gap-2 justify-center items-center">
178
+ <Area
179
+ id="productGridFilter"
180
+ noOuter
181
+ coreComponents={[
182
+ {
183
+ component: {
184
+ default: () => (
185
+ <Field
186
+ type="text"
187
+ id="keyword"
188
+ placeholder="Search"
189
+ value={
190
+ currentFilters.find((f) => f.key === 'keyword')
191
+ ?.value
192
+ }
193
+ onKeyPress={(e) => {
194
+ // If the user press enter, we should submit the form
195
+ if (e.key === 'Enter') {
196
+ const url = new URL(document.location);
197
+ const keyword =
198
+ document.getElementById('keyword')?.value;
199
+ if (keyword) {
200
+ url.searchParams.set('keyword', keyword);
201
+ } else {
202
+ url.searchParams.delete('keyword');
203
+ }
204
+ window.location.href = url;
205
+ }
206
+ }}
207
+ />
208
+ )
209
+ },
210
+ sortOrder: 5
211
+ },
212
+ {
213
+ component: {
214
+ default: () => (
215
+ <Filter
216
+ options={[
217
+ {
218
+ label: 'Enabled',
219
+ value: '1',
220
+ onSelect: () => {
221
+ const url = new URL(document.location);
222
+ url.searchParams.set('status', 1);
223
+ window.location.href = url;
224
+ }
225
+ },
226
+ {
227
+ label: 'Disabled',
228
+ value: '0',
229
+ onSelect: () => {
230
+ const url = new URL(document.location);
231
+ url.searchParams.set('status', 0);
232
+ window.location.href = url;
233
+ }
234
+ }
235
+ ]}
236
+ selectedOption={
237
+ currentFilters.find((f) => f.key === 'status')
238
+ ? currentFilters.find((f) => f.key === 'status')
239
+ .value === '1'
240
+ ? 'Enabled'
241
+ : 'Disabled'
242
+ : undefined
243
+ }
244
+ title="Status"
245
+ />
246
+ )
247
+ },
248
+ sortOrder: 10
249
+ },
250
+ {
251
+ component: {
252
+ default: () => (
253
+ <Filter
254
+ options={[
255
+ {
256
+ label: 'Simple',
257
+ value: '1',
258
+ onSelect: () => {
259
+ const url = new URL(document.location);
260
+ url.searchParams.set('type', 'simple');
261
+ window.location.href = url;
262
+ }
263
+ },
264
+ {
265
+ label: 'Configurable',
266
+ value: '0',
267
+ onSelect: () => {
268
+ const url = new URL(document.location);
269
+ url.searchParams.set('type', 'configurable');
270
+ window.location.href = url;
271
+ }
272
+ }
273
+ ]}
274
+ selectedOption={
275
+ currentFilters.find((f) => f.key === 'type')
276
+ ? currentFilters.find((f) => f.key === 'type')
277
+ .value
278
+ : undefined
279
+ }
280
+ title="Product type"
281
+ />
282
+ )
283
+ },
284
+ sortOrder: 15
285
+ }
286
+ ]}
287
+ currentFilters={currentFilters}
288
+ />
289
+ </div>
290
+ </Form>
291
+ }
292
+ actions={[
293
+ {
294
+ variant: 'interactive',
295
+ name: 'Clear filter',
296
+ onAction: () => {
297
+ const url = new URL(document.location);
298
+ url.search = '';
299
+ window.location.href = url.href;
300
+ }
301
+ }
302
+ ]}
303
+ />
173
304
  <table className="listing sticky">
174
305
  <thead>
175
306
  <tr>
@@ -189,15 +320,25 @@ export default function ProductGrid({
189
320
  noOuter
190
321
  coreComponents={[
191
322
  {
192
- component: { default: () => <DummyColumnHeader /> },
323
+ component: {
324
+ default: () => (
325
+ <th className="column">
326
+ <div className="table-header id-header">
327
+ <div className="font-medium uppercase text-xl">
328
+ <span>Thumbnail</span>
329
+ </div>
330
+ </div>
331
+ </th>
332
+ )
333
+ },
193
334
  sortOrder: 5
194
335
  },
195
336
  {
196
337
  component: {
197
338
  default: () => (
198
- <BasicColumnHeader
199
- title="Product Name"
200
- id="name"
339
+ <SortableHeader
340
+ title="Name"
341
+ name="name"
201
342
  currentFilters={currentFilters}
202
343
  />
203
344
  )
@@ -207,9 +348,9 @@ export default function ProductGrid({
207
348
  {
208
349
  component: {
209
350
  default: () => (
210
- <FromToColumnHeader
211
- id="price"
351
+ <SortableHeader
212
352
  title="Price"
353
+ name="price"
213
354
  currentFilters={currentFilters}
214
355
  />
215
356
  )
@@ -218,22 +359,16 @@ export default function ProductGrid({
218
359
  },
219
360
  {
220
361
  component: {
221
- default: () => (
222
- <BasicColumnHeader
223
- title="SKU"
224
- id="sku"
225
- currentFilters={currentFilters}
226
- />
227
- )
362
+ default: () => <DummyColumnHeader title="SKU" />
228
363
  },
229
364
  sortOrder: 20
230
365
  },
231
366
  {
232
367
  component: {
233
368
  default: () => (
234
- <FromToColumnHeader
235
- title="Qty"
236
- id="qty"
369
+ <SortableHeader
370
+ title="Stock"
371
+ name="qty"
237
372
  currentFilters={currentFilters}
238
373
  />
239
374
  )
@@ -243,14 +378,10 @@ export default function ProductGrid({
243
378
  {
244
379
  component: {
245
380
  default: () => (
246
- <DropdownColumnHeader
247
- id="status"
381
+ <SortableHeader
248
382
  title="Status"
383
+ name="status"
249
384
  currentFilters={currentFilters}
250
- options={[
251
- { value: 1, text: 'Enabled' },
252
- { value: 0, text: 'Disabled' }
253
- ]}
254
385
  />
255
386
  )
256
387
  },
@@ -432,6 +563,7 @@ export const query = `
432
563
  value
433
564
  }
434
565
  }
566
+ newProductUrl: url(routeId: "productNew")
435
567
  }
436
568
  `;
437
569
 
@@ -11,6 +11,5 @@ module.exports = (request, response) => {
11
11
  title: 'Products',
12
12
  description: 'Products'
13
13
  });
14
- const { query } = request;
15
- setContextValue(request, 'filtersFromUrl', buildFilterFromUrl(query));
14
+ setContextValue(request, 'filtersFromUrl', buildFilterFromUrl(request));
16
15
  };
@@ -2,6 +2,7 @@ import PropTypes from 'prop-types';
2
2
  import React, { useRef, useState } from 'react';
3
3
  import { Input } from '@components/common/form/fields/Input';
4
4
  import XIcon from '@heroicons/react/solid/esm/XIcon';
5
+ import { _ } from '@evershop/evershop/src/lib/locale/translate';
5
6
  import './SearchBox.scss';
6
7
 
7
8
  export default function SearchBox({ searchPageUrl }) {
@@ -72,7 +73,7 @@ export default function SearchBox({ searchPageUrl }) {
72
73
  />
73
74
  </svg>
74
75
  }
75
- placeholder="Search"
76
+ placeholder={_('Search')}
76
77
  ref={InputRef}
77
78
  value={keyword}
78
79
  onChange={(e) => {
@@ -1,66 +1,11 @@
1
1
  const {
2
- translate
3
- } = require('@evershop/evershop/src/lib/locale/translate/translate');
2
+ buildFilterFromUrl
3
+ } = require('@evershop/evershop/src/lib/util/buildFilterFromUrl');
4
4
  const {
5
5
  setContextValue
6
6
  } = require('@evershop/evershop/src/modules/graphql/services/contextHelper');
7
7
 
8
8
  module.exports = (request, response, delegate, next) => {
9
- const { query } = request;
10
- if (!query) {
11
- setContextValue(request, 'filtersFromUrl', []);
12
- next();
13
- } else {
14
- const filtersFromUrl = [];
15
-
16
- const { sortBy } = query;
17
- const sortOrder =
18
- query.sortOrder && ['ASC', 'DESC'].includes(query.sortOrder.toUpperCase())
19
- ? query.sortOrder.toUpperCase()
20
- : 'ASC';
21
- if (sortBy) {
22
- filtersFromUrl.push({
23
- key: 'sortBy',
24
- operation: '=',
25
- value: sortBy
26
- });
27
- }
28
-
29
- if (sortOrder !== 'ASC') {
30
- filtersFromUrl.push({
31
- key: 'sortOrder',
32
- operation: '=',
33
- value: sortOrder
34
- });
35
- }
36
- // Paging
37
- const page = Number.isNaN(parseInt(query.page, 10))
38
- ? '1'
39
- : query.page.toString();
40
- if (page !== '1') {
41
- filtersFromUrl.push({ key: 'page', operation: '=', value: page });
42
- }
43
- const limit = Number.isNaN(parseInt(query.limit, 10))
44
- ? '20'
45
- : query.limit.toString(); // TODO: Get from config
46
- if (limit !== '20') {
47
- filtersFromUrl.push({ key: 'limit', operation: '=', value: limit });
48
- }
49
-
50
- // Remove html tags
51
- const {keyword} = query;
52
- setContextValue(request, 'pageInfo', {
53
- title: translate('Search results for "${keyword}"', { keyword }),
54
- description: translate('Search results for "${keyword}"', { keyword })
55
- });
56
-
57
- filtersFromUrl.push({
58
- key: 'keyword',
59
- operation: '=',
60
- value: keyword
61
- });
62
-
63
- setContextValue(request, 'filtersFromUrl', filtersFromUrl);
64
- next();
65
- }
9
+ setContextValue(request, 'filtersFromUrl', buildFilterFromUrl(request));
10
+ next();
66
11
  };
@@ -1,4 +1,10 @@
1
+ const {
2
+ translate
3
+ } = require('@evershop/evershop/src/lib/locale/translate/translate');
1
4
  const { get } = require('@evershop/evershop/src/lib/util/get');
5
+ const {
6
+ setContextValue
7
+ } = require('@evershop/evershop/src/modules/graphql/services/contextHelper');
2
8
 
3
9
  module.exports = (request, response, delegate, next) => {
4
10
  // Get the keyword from the request query
@@ -7,6 +13,11 @@ module.exports = (request, response, delegate, next) => {
7
13
  // Redirect to the home page if no keyword is not provided
8
14
  response.redirect('/');
9
15
  } else {
16
+ setContextValue(request, 'pageInfo', {
17
+ title: translate('Search results for: ${keyword}', { keyword }),
18
+ description: translate('Search results for: ${keyword}', { keyword }),
19
+ url: request.url
20
+ });
10
21
  next();
11
22
  }
12
23
  };
@@ -30,24 +30,40 @@ export default function Filter({
30
30
  if (
31
31
  currentFilters[i].key === 'page' ||
32
32
  currentFilters[i].key === 'limit' ||
33
- currentFilters[i].key === 'sortBy' ||
34
- currentFilters[i].key === 'sortOrder'
33
+ currentFilters[i].key === 'ob' ||
34
+ currentFilters[i].key === 'od'
35
35
  ) {
36
36
  continue;
37
37
  }
38
- url.searchParams.delete(currentFilters[i].key);
38
+ if (currentFilters[i].operation === 'eq') {
39
+ url.searchParams.delete(currentFilters[i].key);
40
+ } else {
41
+ url.searchParams.delete(`${currentFilters[i].key}[operation]`);
42
+ url.searchParams.delete(`${currentFilters[i].key}[value]`);
43
+ }
39
44
  }
40
45
 
41
46
  for (let i = 0; i < newFilters.length; i += 1) {
42
47
  if (
43
48
  newFilters[i].key === 'page' ||
44
49
  newFilters[i].key === 'limit' ||
45
- newFilters[i].key === 'sortBy' ||
46
- newFilters[i].key === 'sortOrder'
50
+ newFilters[i].key === 'ob' ||
51
+ newFilters[i].key === 'od'
47
52
  ) {
48
53
  continue;
49
54
  }
50
- url.searchParams.append(newFilters[i].key, newFilters[i].value);
55
+ if (newFilters[i].operation === 'eq') {
56
+ url.searchParams.append(newFilters[i].key, newFilters[i].value);
57
+ } else {
58
+ url.searchParams.append(
59
+ `${newFilters[i].key}[operation]`,
60
+ newFilters[i].operation
61
+ );
62
+ url.searchParams.append(
63
+ `${newFilters[i].key}[value]`,
64
+ newFilters[i].value
65
+ );
66
+ }
51
67
  }
52
68
  // window.location.href = url;
53
69
  url.searchParams.delete('ajax', true);
@@ -50,7 +50,9 @@ input[type='range'] {
50
50
  input[type='range'],
51
51
  input[type='range']::-webkit-slider-runnable-track,
52
52
  input[type='range']::-webkit-slider-thumb {
53
+ appearance: none;
53
54
  -webkit-appearance: none;
55
+ -moz-appearance: auto;
54
56
  background: none;
55
57
  }
56
58
  input[type='range']::-webkit-slider-runnable-track {
@@ -1,111 +1,11 @@
1
- const { select } = require('@evershop/postgres-query-builder');
2
- const { pool } = require('@evershop/evershop/src/lib/postgres/connection');
1
+ const {
2
+ buildFilterFromUrl
3
+ } = require('@evershop/evershop/src/lib/util/buildFilterFromUrl');
3
4
  const {
4
5
  setContextValue
5
6
  } = require('../../../../graphql/services/contextHelper');
6
7
 
7
8
  module.exports = async (request, response, delegate, next) => {
8
- const filterableAttributes = await select()
9
- .from('attribute')
10
- .where('type', '=', 'select')
11
- .and('is_filterable', '=', 1)
12
- .execute(pool);
13
-
14
- const { query } = request;
15
- if (!query) {
16
- setContextValue(request, 'filtersFromUrl', []);
17
- next();
18
- } else {
19
- const filtersFromUrl = [];
20
-
21
- // Price filter
22
- // const priceFilter = query.price;
23
- const minPrice = Object.keys(query).find((key) => key === 'minPrice');
24
- const maxPrice = Object.keys(query).find((key) => key === 'maxPrice');
25
- if (minPrice) {
26
- filtersFromUrl.push({
27
- key: 'minPrice',
28
- operation: '=',
29
- value: `${query[minPrice]}`
30
- });
31
- }
32
- if (maxPrice) {
33
- filtersFromUrl.push({
34
- key: 'maxPrice',
35
- operation: '=',
36
- value: `${query[maxPrice]}`
37
- });
38
- }
39
-
40
- // Category filter
41
- const categoryFilter = Object.keys(query).find((key) => key === 'cat');
42
- if (categoryFilter) {
43
- filtersFromUrl.push({
44
- key: 'cat',
45
- operation: '=',
46
- value: `${query[categoryFilter]}`
47
- });
48
- }
49
- // Attribute filters
50
- Object.keys(query).forEach((key) => {
51
- const filter = query[key];
52
- const attribute = filterableAttributes.find(
53
- (a) => a.attribute_code === key
54
- );
55
- if (attribute) {
56
- if (Array.isArray(filter)) {
57
- const values = filter
58
- .map((v) => parseInt(v, 10))
59
- .filter((v) => Number.isNaN(v) === false);
60
- if (values.length > 0) {
61
- filtersFromUrl.push({
62
- key,
63
- operation: '=',
64
- value: values.join(',')
65
- });
66
- }
67
- } else {
68
- filtersFromUrl.push({
69
- key,
70
- operation: '=',
71
- value: filter
72
- });
73
- }
74
- }
75
- });
76
-
77
- const { sortBy } = query;
78
- const sortOrder =
79
- query.sortOrder && ['ASC', 'DESC'].includes(query.sortOrder.toUpperCase())
80
- ? query.sortOrder.toUpperCase()
81
- : 'ASC';
82
- if (sortBy) {
83
- filtersFromUrl.push({
84
- key: 'sortBy',
85
- operation: '=',
86
- value: sortBy.toString()
87
- });
88
- }
89
-
90
- filtersFromUrl.push({
91
- key: 'sortOrder',
92
- operation: '=',
93
- value: sortOrder
94
- });
95
- // Paging
96
- const page = Number.isNaN(parseInt(query.page, 10))
97
- ? '1'
98
- : query.page.toString();
99
- if (page !== '1') {
100
- filtersFromUrl.push({ key: 'page', operation: '=', value: page });
101
- }
102
- const limit = Number.isNaN(parseInt(query.limit, 10))
103
- ? '20'
104
- : query.limit.toString(); // TODO: Get from config
105
- if (limit !== '20') {
106
- filtersFromUrl.push({ key: 'limit', operation: '=', value: limit });
107
- }
108
- setContextValue(request, 'filtersFromUrl', filtersFromUrl);
109
- next();
110
- }
9
+ setContextValue(request, 'filtersFromUrl', buildFilterFromUrl(request));
10
+ next();
111
11
  };
@@ -59,7 +59,7 @@ export const query = `
59
59
  collection (code: "homepage") {
60
60
  collectionId
61
61
  name
62
- products (filters: [{key: "limit", operation: "=", value: "4"}]) {
62
+ products (filters: [{key: "limit", operation: eq, value: "4"}]) {
63
63
  items {
64
64
  productId
65
65
  name
@@ -11,6 +11,7 @@ import Button from '@components/common/form/Button';
11
11
  import './Form.scss';
12
12
  import { useAppDispatch, useAppState } from '@components/common/context/app';
13
13
  import { _ } from '@evershop/evershop/src/lib/locale/translate';
14
+ import ProductNoThumbnail from '@components/common/ProductNoThumbnail';
14
15
 
15
16
  function ToastMessage({ thumbnail, name, qty, count, cartUrl, toastId }) {
16
17
  return (
@@ -43,8 +44,12 @@ function ToastMessage({ thumbnail, name, qty, count, cartUrl, toastId }) {
43
44
  </div>
44
45
  </div>
45
46
  <div className="item-line flex justify-between">
46
- <div className="popup-thumbnail flex justify-center">
47
- <img src={thumbnail} alt={name} />
47
+ <div className="popup-thumbnail flex justify-center items-center">
48
+ {thumbnail ? (
49
+ <img src={thumbnail} alt={name} />
50
+ ) : (
51
+ <ProductNoThumbnail width={25} height={25} />
52
+ )}
48
53
  </div>
49
54
  <div className="item-info flex justify-between">
50
55
  <div className="name">
@@ -151,7 +156,7 @@ export default function ProductForm({ product, action }) {
151
156
  qty={response.data.item.qty}
152
157
  count={response.data.count}
153
158
  cartUrl="/cart"
154
- toastId={toastId}
159
+ toastId={`${toastId}-${Math.random().toString(36).slice(2)}`}
155
160
  />,
156
161
  { closeButton: false }
157
162
  )