@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
@@ -0,0 +1,50 @@
1
+ const {
2
+ OPERATION_MAP
3
+ } = require('@evershop/evershop/src/lib/util/filterOperationMapp');
4
+ const { getValueSync } = require('@evershop/evershop/src/lib/util/registry');
5
+
6
+ module.exports =
7
+ async function registerDefaultCustomerGroupCollectionFilters() {
8
+ // List of default supported filters
9
+ const defaultFilters = [
10
+ {
11
+ key: 'name',
12
+ operation: ['like'],
13
+ callback: (query, operation, value, currentFilters) => {
14
+ query.andWhere(
15
+ 'customer_group.group_name',
16
+ OPERATION_MAP[operation],
17
+ `%${value}%`
18
+ );
19
+ currentFilters.push({
20
+ key: 'name',
21
+ operation,
22
+ value
23
+ });
24
+ }
25
+ },
26
+ {
27
+ key: 'ob',
28
+ operation: ['eq'],
29
+ callback: (query, operation, value, currentFilters) => {
30
+ const customerGroupCollectionSortBy = getValueSync(
31
+ 'customerGroupCollectionSortBy',
32
+ {
33
+ name: (query) => query.orderBy('customer_group.group_name')
34
+ }
35
+ );
36
+
37
+ if (customerGroupCollectionSortBy[value]) {
38
+ customerGroupCollectionSortBy[value](query, operation);
39
+ currentFilters.push({
40
+ key: 'ob',
41
+ operation,
42
+ value
43
+ });
44
+ }
45
+ }
46
+ }
47
+ ];
48
+
49
+ return defaultFilters;
50
+ };
@@ -8,7 +8,7 @@ const {
8
8
  } = require('@evershop/evershop/src/lib/webpack/getRouteBuildPath');
9
9
  const { CONSTANTS } = require('@evershop/evershop/src/lib/helpers');
10
10
  const { getRoutes } = require('@evershop/evershop/src/lib/router/Router');
11
- const { error } = require('@evershop/evershop/src/lib/log/debuger');
11
+ const { error } = require('@evershop/evershop/src/lib/log/logger');
12
12
  // eslint-disable-next-line no-unused-vars
13
13
  const { getContextValue } = require('../../services/contextHelper');
14
14
 
@@ -1,7 +1,7 @@
1
1
  const { execute } = require('graphql');
2
2
  const { parse } = require('graphql');
3
3
  const { validate } = require('graphql/validation');
4
- const { debug } = require('@evershop/evershop/src/lib/log/debuger');
4
+ const { debug } = require('@evershop/evershop/src/lib/log/logger');
5
5
  const adminSchema = require('../../services/buildSchema');
6
6
  const storeFrontSchema = require('../../services/buildStoreFrontSchema');
7
7
  const { getContext } = require('../../services/contextHelper');
@@ -38,7 +38,7 @@ module.exports.graphqlMiddleware = (schema) =>
38
38
  });
39
39
  if (data.errors) {
40
40
  // Create an Error instance with message and stack trace
41
- next(new Error(data.errors[0].message));
41
+ next(data.errors[0]);
42
42
  } else {
43
43
  response.status(OK).json({
44
44
  data: data.data
@@ -1,4 +1,9 @@
1
1
  const config = require('config');
2
+ const registerDefaultOrderCollectionFilters = require('./services/registerDefaultOrderCollectionFilters');
3
+ const {
4
+ defaultPaginationFilters
5
+ } = require('../../lib/util/defaultPaginationFilters');
6
+ const { addProcessor } = require('../../lib/util/registry');
2
7
 
3
8
  module.exports = () => {
4
9
  // Default order status and carriers configuration
@@ -57,4 +62,16 @@ module.exports = () => {
57
62
  }
58
63
  };
59
64
  config.util.setModuleDefaults('oms', orderStatusConfig);
65
+
66
+ // Reigtering the default filters for attribute collection
67
+ addProcessor(
68
+ 'orderCollectionFilters',
69
+ registerDefaultOrderCollectionFilters,
70
+ 1
71
+ );
72
+ addProcessor(
73
+ 'orderCollectionFilters',
74
+ (filters) => [...filters, ...defaultPaginationFilters],
75
+ 2
76
+ );
60
77
  };
@@ -8,7 +8,7 @@ module.exports = {
8
8
  orders: async (_, { filters = [] }) => {
9
9
  const query = getOrdersBaseQuery();
10
10
  const root = new OrderCollection(query);
11
- await root.init({}, { filters });
11
+ await root.init(filters);
12
12
  return root;
13
13
  }
14
14
  },
@@ -2,11 +2,12 @@ const { select } = require('@evershop/postgres-query-builder');
2
2
  const { camelCase } = require('@evershop/evershop/src/lib/util/camelCase');
3
3
  const { getConfig } = require('@evershop/evershop/src/lib/util/getConfig');
4
4
  const { buildUrl } = require('@evershop/evershop/src/lib/router/buildUrl');
5
+ const { getOrdersBaseQuery } = require('../../../services/getOrdersBaseQuery');
5
6
 
6
7
  module.exports = {
7
8
  Query: {
8
9
  order: async (_, { uuid }, { pool }) => {
9
- const query = select().from('order');
10
+ const query = getOrdersBaseQuery();
10
11
  query.where('uuid', '=', uuid);
11
12
  const order = await query.load(pool);
12
13
  if (!order) {
@@ -7,16 +7,16 @@ import Pagination from '@components/common/grid/Pagination';
7
7
  import { Checkbox } from '@components/common/form/fields/Checkbox';
8
8
  import { useAlertContext } from '@components/common/modal/Alert';
9
9
  import { Card } from '@components/admin/cms/Card';
10
- import BasicColumnHeader from '@components/common/grid/headers/Basic';
11
- import FromToColumnHeader from '@components/common/grid/headers/FromTo';
12
- import ShipmentStatusColumnHeader from '@components/admin/oms/orderGrid/headers/ShipmentStatusColumnHeader';
13
- import PaymentStatusColumnHeader from '@components/admin/oms/orderGrid/headers/PaymentStatusColumnHeader';
14
10
  import OrderNumberRow from '@components/admin/oms/orderGrid/rows/OrderNumberRow';
15
11
  import BasicRow from '@components/common/grid/rows/BasicRow';
16
12
  import ShipmentStatusRow from '@components/admin/oms/orderGrid/rows/ShipmentStatus';
17
13
  import PaymentStatusRow from '@components/admin/oms/orderGrid/rows/PaymentStatus';
18
14
  import TotalRow from '@components/admin/oms/orderGrid/rows/TotalRow';
19
15
  import CreateAt from '@components/admin/customer/customerGrid/rows/CreateAt';
16
+ import { Form } from '@components/common/form/Form';
17
+ import { Field } from '@components/common/form/Field';
18
+ import SortableHeader from '@components/common/grid/headers/Sortable';
19
+ import Filter from '@components/common/list/Filter';
20
20
 
21
21
  function Actions({ orders = [], selectedIds = [] }) {
22
22
  const { openAlert, closeAlert } = useAlertContext();
@@ -104,8 +104,8 @@ Actions.propTypes = {
104
104
 
105
105
  export default function OrderGrid({
106
106
  orders: { items: orders, total, currentFilters = [] },
107
- shipmentStatusList,
108
- paymentStatusList
107
+ paymentStatusList,
108
+ shipmentStatusList
109
109
  }) {
110
110
  const page = currentFilters.find((filter) => filter.key === 'page')
111
111
  ? currentFilters.find((filter) => filter.key === 'page').value
@@ -119,6 +119,125 @@ export default function OrderGrid({
119
119
 
120
120
  return (
121
121
  <Card>
122
+ <Card.Session
123
+ title={
124
+ <Form submitBtn={false}>
125
+ <div className="flex gap-2 justify-center items-center">
126
+ <Area
127
+ id="orderGridFilter"
128
+ noOuter
129
+ coreComponents={[
130
+ {
131
+ component: {
132
+ default: () => (
133
+ <Field
134
+ type="text"
135
+ id="keyword"
136
+ placeholder="Search"
137
+ value={
138
+ currentFilters.find((f) => f.key === 'keyword')
139
+ ?.value
140
+ }
141
+ onKeyPress={(e) => {
142
+ // If the user press enter, we should submit the form
143
+ if (e.key === 'Enter') {
144
+ const url = new URL(document.location);
145
+ const keyword =
146
+ document.getElementById('keyword')?.value;
147
+ if (keyword) {
148
+ url.searchParams.set('keyword', keyword);
149
+ } else {
150
+ url.searchParams.delete('keyword');
151
+ }
152
+ window.location.href = url;
153
+ }
154
+ }}
155
+ />
156
+ )
157
+ },
158
+ sortOrder: 5
159
+ },
160
+ {
161
+ component: {
162
+ default: () => (
163
+ <Filter
164
+ options={paymentStatusList.map((status) => ({
165
+ label: status.name,
166
+ value: status.code,
167
+ onSelect: () => {
168
+ const url = new URL(document.location);
169
+ url.searchParams.set(
170
+ 'payment_status',
171
+ status.code
172
+ );
173
+ window.location.href = url;
174
+ }
175
+ }))}
176
+ selectedOption={
177
+ currentFilters.find(
178
+ (f) => f.key === 'payment_status'
179
+ )
180
+ ? currentFilters.find(
181
+ (f) => f.key === 'payment_status'
182
+ ).value
183
+ : undefined
184
+ }
185
+ title="Payment status"
186
+ />
187
+ )
188
+ },
189
+ sortOrder: 10
190
+ },
191
+ {
192
+ component: {
193
+ default: () => (
194
+ <Filter
195
+ options={shipmentStatusList.map((status) => ({
196
+ label: status.name,
197
+ value: status.code,
198
+ onSelect: () => {
199
+ const url = new URL(document.location);
200
+ url.searchParams.set(
201
+ 'shipment_status',
202
+ status.code
203
+ );
204
+ window.location.href = url;
205
+ }
206
+ }))}
207
+ selectedOption={
208
+ currentFilters.find(
209
+ (f) => f.key === 'shipment_status'
210
+ )
211
+ ? currentFilters.find(
212
+ (f) => f.key === 'shipment_status'
213
+ ).value
214
+ : undefined
215
+ }
216
+ title="Shipment status"
217
+ />
218
+ )
219
+ },
220
+ sortOrder: 15
221
+ }
222
+ ]}
223
+ currentFilters={currentFilters}
224
+ />
225
+ </div>
226
+ </Form>
227
+ }
228
+ actions={[
229
+ {
230
+ variant: 'interactive',
231
+ name: 'Clear filter',
232
+ onAction: () => {
233
+ // Just get the url and remove all query params
234
+ const url = new URL(document.location);
235
+ url.search = '';
236
+ window.location.href = url.href;
237
+ }
238
+ }
239
+ ]}
240
+ />
122
241
  <table className="listing sticky">
123
242
  <thead>
124
243
  <tr>
@@ -141,9 +260,9 @@ export default function OrderGrid({
141
260
  {
142
261
  component: {
143
262
  default: () => (
144
- <BasicColumnHeader
263
+ <SortableHeader
145
264
  title="Order Number"
146
- id="orderNumber"
265
+ name="number"
147
266
  currentFilters={currentFilters}
148
267
  />
149
268
  )
@@ -153,9 +272,9 @@ export default function OrderGrid({
153
272
  {
154
273
  component: {
155
274
  default: () => (
156
- <FromToColumnHeader
275
+ <SortableHeader
157
276
  title="Date"
158
- id="createdAt"
277
+ name="created_at"
159
278
  currentFilters={currentFilters}
160
279
  />
161
280
  )
@@ -165,9 +284,9 @@ export default function OrderGrid({
165
284
  {
166
285
  component: {
167
286
  default: () => (
168
- <BasicColumnHeader
287
+ <SortableHeader
169
288
  title="Customer Email"
170
- id="customerEmail"
289
+ name="email"
171
290
  currentFilters={currentFilters}
172
291
  />
173
292
  )
@@ -177,10 +296,9 @@ export default function OrderGrid({
177
296
  {
178
297
  component: {
179
298
  default: () => (
180
- <ShipmentStatusColumnHeader
299
+ <SortableHeader
181
300
  title="Shipment Status"
182
- id="shipmentStatus"
183
- shipmentStatusList={shipmentStatusList}
301
+ name="shipment_status"
184
302
  currentFilters={currentFilters}
185
303
  />
186
304
  )
@@ -190,10 +308,9 @@ export default function OrderGrid({
190
308
  {
191
309
  component: {
192
310
  default: () => (
193
- <PaymentStatusColumnHeader
311
+ <SortableHeader
194
312
  title="Payment Status"
195
- id="paymentStatus"
196
- paymentStatusList={paymentStatusList}
313
+ name="payment_status"
197
314
  currentFilters={currentFilters}
198
315
  />
199
316
  )
@@ -203,9 +320,9 @@ export default function OrderGrid({
203
320
  {
204
321
  component: {
205
322
  default: () => (
206
- <FromToColumnHeader
323
+ <SortableHeader
207
324
  title="Total"
208
- id="grandTotal"
325
+ name="total"
209
326
  currentFilters={currentFilters}
210
327
  />
211
328
  )
@@ -308,22 +425,6 @@ export default function OrderGrid({
308
425
  }
309
426
 
310
427
  OrderGrid.propTypes = {
311
- paymentStatusList: PropTypes.arrayOf(
312
- PropTypes.shape({
313
- text: PropTypes.string.isRequired,
314
- value: PropTypes.string.isRequired,
315
- badge: PropTypes.string.isRequired,
316
- progress: PropTypes.number.isRequired
317
- })
318
- ).isRequired,
319
- shipmentStatusList: PropTypes.arrayOf(
320
- PropTypes.shape({
321
- text: PropTypes.string.isRequired,
322
- value: PropTypes.string.isRequired,
323
- badge: PropTypes.string.isRequired,
324
- progress: PropTypes.number.isRequired
325
- })
326
- ).isRequired,
327
428
  orders: PropTypes.shape({
328
429
  items: PropTypes.arrayOf(
329
430
  PropTypes.shape({
@@ -364,12 +465,16 @@ OrderGrid.propTypes = {
364
465
  })
365
466
  ).isRequired
366
467
  }).isRequired,
367
- total: PropTypes.number.isRequired,
368
- currentFilters: PropTypes.arrayOf(
468
+ paymentStatusList: PropTypes.arrayOf(
469
+ PropTypes.shape({
470
+ code: PropTypes.string.isRequired,
471
+ name: PropTypes.string.isRequired
472
+ })
473
+ ).isRequired,
474
+ shipmentStatusList: PropTypes.arrayOf(
369
475
  PropTypes.shape({
370
- key: PropTypes.string.isRequired,
371
- operation: PropTypes.string.isRequired,
372
- value: PropTypes.string.isRequired
476
+ code: PropTypes.string.isRequired,
477
+ name: PropTypes.string.isRequired
373
478
  })
374
479
  ).isRequired
375
480
  };
@@ -417,17 +522,13 @@ export const query = `
417
522
  value
418
523
  }
419
524
  }
420
- shipmentStatusList {
421
- text: name
422
- value: code
423
- badge
424
- progress
425
- }
426
525
  paymentStatusList {
427
- text: name
428
- value: code
429
- badge
430
- progress
526
+ code
527
+ name
528
+ }
529
+ shipmentStatusList {
530
+ code
531
+ name
431
532
  }
432
533
  }
433
534
  `;
@@ -11,6 +11,5 @@ module.exports = (request, response) => {
11
11
  title: 'Orders',
12
12
  description: 'Orders'
13
13
  });
14
- const { query } = request;
15
- setContextValue(request, 'filtersFromUrl', buildFilterFromUrl(query));
14
+ setContextValue(request, 'filtersFromUrl', buildFilterFromUrl(request));
16
15
  };
@@ -1,158 +1,38 @@
1
1
  const { camelCase } = require('@evershop/evershop/src/lib/util/camelCase');
2
2
  const { pool } = require('@evershop/evershop/src/lib/postgres/connection');
3
+ const { getValue } = require('@evershop/evershop/src/lib/util/registry');
3
4
 
4
5
  class OrderCollection {
5
6
  constructor(baseQuery) {
6
7
  this.baseQuery = baseQuery;
8
+ this.baseQuery.orderBy('order.order_id', 'DESC');
7
9
  }
8
10
 
9
- async init(args, { filters = [] }) {
11
+ async init(filters = []) {
10
12
  const currentFilters = [];
11
13
 
12
- // Number filter
13
- const numberFilter = filters.find((f) => f.key === 'orderNumber');
14
- if (numberFilter) {
15
- this.baseQuery.andWhere(
16
- 'order.order_number',
17
- 'ILIKE',
18
- `%${numberFilter.value}%`
19
- );
20
- currentFilters.push({
21
- key: 'orderNumber',
22
- operation: '=',
23
- value: numberFilter.value
24
- });
25
- }
26
-
27
- // Email filter
28
- const customerEmailFilter = filters.find((f) => f.key === 'customerEmail');
29
- if (customerEmailFilter) {
30
- this.baseQuery.andWhere(
31
- 'order.customer_email',
32
- 'ILIKE',
33
- `%${customerEmailFilter.value}%`
34
- );
35
- currentFilters.push({
36
- key: 'customerEmail',
37
- operation: '=',
38
- value: customerEmailFilter.value
39
- });
40
- }
41
-
42
- // Keyword search
43
- const keywordFilter = filters.find((f) => f.key === 'keyword');
44
- if (keywordFilter) {
45
- this.baseQuery
46
- .andWhere('order.customer_email', 'ILIKE', `%${keywordFilter.value}%`)
47
- .or('order.order_number', 'ILIKE', `%${keywordFilter.value}%`)
48
- .or('order.customer_full_name', 'ILIKE', `%${keywordFilter.value}%`);
49
- currentFilters.push({
50
- key: 'keyword',
51
- operation: '=',
52
- value: keywordFilter.value
53
- });
54
- }
55
-
56
- // Status filter
57
- const shipmentStatusFilter = filters.find(
58
- (f) => f.key === 'shipmentStatus'
59
- );
60
- if (shipmentStatusFilter) {
61
- this.baseQuery.andWhere(
62
- 'order.shipment_status',
63
- '=',
64
- shipmentStatusFilter.value
65
- );
66
- currentFilters.push({
67
- key: 'shipmentStatus',
68
- operation: '=',
69
- value: shipmentStatusFilter.value
70
- });
71
- }
72
-
73
- // Status filter
74
- const paymentStatusFilter = filters.find((f) => f.key === 'paymentStatus');
75
- if (paymentStatusFilter) {
76
- this.baseQuery.andWhere(
77
- 'order.payment_status',
78
- '=',
79
- paymentStatusFilter.value
80
- );
81
- currentFilters.push({
82
- key: 'paymentStatus',
83
- operation: '=',
84
- value: paymentStatusFilter.value
85
- });
86
- }
87
-
88
- // Order Total filter
89
- const totalFilter = filters.find((f) => f.key === 'total');
90
- if (totalFilter) {
91
- const [min, max] = totalFilter.value.split('-').map((v) => parseFloat(v));
92
- let currentTotalFilter;
93
- if (Number.isNaN(min) === false) {
94
- this.baseQuery.andWhere('order.grand_total', '>=', min);
95
- currentTotalFilter = { key: 'total', value: `${min}` };
96
- }
97
-
98
- if (Number.isNaN(max) === false) {
99
- this.baseQuery.andWhere('order.grand_total', '<=', max);
100
- currentTotalFilter = {
101
- key: 'total',
102
- value: `${currentTotalFilter.value}-${max}`
103
- };
14
+ // Apply the filters
15
+ const orderCollectionFilters = await getValue('orderCollectionFilters', []);
16
+ orderCollectionFilters.forEach((filter) => {
17
+ const check = filters.find((f) => f.key === filter.key);
18
+ if (check) {
19
+ if (filter.operation.includes(check.operation)) {
20
+ filter.callback(
21
+ this.baseQuery,
22
+ check.operation,
23
+ check.value,
24
+ currentFilters
25
+ );
26
+ }
104
27
  }
105
- if (currentTotalFilter) {
106
- currentFilters.push(currentTotalFilter);
107
- }
108
- }
109
-
110
- const sortBy = filters.find((f) => f.key === 'sortBy');
111
- const sortOrder = filters.find(
112
- (f) => f.key === 'sortOrder' && ['ASC', 'DESC'].includes(f.value)
113
- ) || { value: 'ASC' };
114
-
115
- if (sortBy && sortBy.value === 'orderNumber') {
116
- this.baseQuery.orderBy('order.order_number', sortOrder.value);
117
- currentFilters.push({
118
- key: 'sortBy',
119
- operation: '=',
120
- value: sortBy.value
121
- });
122
- } else {
123
- this.baseQuery.orderBy('order.order_id', 'DESC');
124
- }
125
- if (sortOrder.key) {
126
- currentFilters.push({
127
- key: 'sortOrder',
128
- operation: '=',
129
- value: sortOrder.value
130
- });
131
- }
28
+ });
132
29
 
133
30
  // Clone the main query for getting total right before doing the paging
134
31
  const totalQuery = this.baseQuery.clone();
135
32
  totalQuery.select('COUNT("order".order_id)', 'total');
136
33
  totalQuery.removeOrderBy();
137
- // Paging
138
- const page = filters.find((f) => f.key === 'page') || { value: 1 };
139
- const limit = filters.find((f) => f.key === 'limit' && f.value > 0) || {
140
- value: 20
141
- }; // TODO: Get from the config
142
- currentFilters.push({
143
- key: 'page',
144
- operation: '=',
145
- value: page.value
146
- });
147
- currentFilters.push({
148
- key: 'limit',
149
- operation: '=',
150
- value: limit.value
151
- });
152
- this.baseQuery.limit(
153
- (page.value - 1) * parseInt(limit.value, 10),
154
- parseInt(limit.value, 10)
155
- );
34
+ totalQuery.removeLimit();
35
+
156
36
  this.currentFilters = currentFilters;
157
37
  this.totalQuery = totalQuery;
158
38
  }