@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
@@ -12,9 +12,11 @@ import AttributeNameRow from '@components/admin/catalog/attributeGrid/rows/Attri
12
12
  import GroupRow from '@components/admin/catalog/attributeGrid/rows/GroupRow';
13
13
  import BasicRow from '@components/common/grid/rows/BasicRow';
14
14
  import YesNoRow from '@components/common/grid/rows/YesNoRow';
15
- import BasicColumnHeader from '@components/common/grid/headers/Basic';
16
- import GroupHeader from '@components/admin/catalog/attributeGrid/headers/GroupHeader';
17
- import DropdownColumnHeader from '@components/common/grid/headers/Dropdown';
15
+ import SortableHeader from '@components/common/grid/headers/Sortable';
16
+ import DummyColumnHeader from '@components/common/grid/headers/Dummy';
17
+ import { Form } from '@components/common/form/Form';
18
+ import { Field } from '@components/common/form/Field';
19
+ import { toast } from 'react-toastify';
18
20
 
19
21
  function Actions({ attributes = [], selectedIds = [] }) {
20
22
  const { openAlert, closeAlert } = useAlertContext();
@@ -22,13 +24,29 @@ function Actions({ attributes = [], selectedIds = [] }) {
22
24
 
23
25
  const deleteAttributes = async () => {
24
26
  setIsLoading(true);
25
- const promises = attributes
26
- .filter((attribute) => selectedIds.includes(attribute.uuid))
27
- .map((attribute) => axios.delete(attribute.deleteApi));
28
- await Promise.all(promises);
29
- setIsLoading(false);
30
- // Refresh the page
31
- window.location.reload();
27
+ try {
28
+ const promises = attributes
29
+ .filter((attribute) => selectedIds.includes(attribute.uuid))
30
+ .map((attribute) =>
31
+ axios.delete(attribute.deleteApi, {
32
+ validateStatus: () => true
33
+ })
34
+ );
35
+ const responses = await Promise.allSettled(promises);
36
+ setIsLoading(false);
37
+ responses.forEach((response) => {
38
+ // Get the axios response status code
39
+ const { status } = response.value;
40
+ if (status !== 200) {
41
+ throw new Error(response.value.data.error.message);
42
+ }
43
+ });
44
+ // Refresh the page
45
+ window.location.reload();
46
+ } catch (e) {
47
+ setIsLoading(false);
48
+ toast.error(e.message);
49
+ }
32
50
  };
33
51
 
34
52
  const actions = [
@@ -107,6 +125,45 @@ export default function AttributeGrid({
107
125
 
108
126
  return (
109
127
  <Card>
128
+ <Card.Session
129
+ title={
130
+ <Form submitBtn={false}>
131
+ <Field
132
+ type="text"
133
+ id="name"
134
+ placeholder="Search"
135
+ value={currentFilters.find((f) => f.key === 'name')?.value}
136
+ onKeyPress={(e) => {
137
+ // If the user press enter, we should submit the form
138
+ if (e.key === 'Enter') {
139
+ const url = new URL(document.location);
140
+ const name = document.getElementById('name')?.value;
141
+ if (name) {
142
+ url.searchParams.set('name[operation]', 'like');
143
+ url.searchParams.set('name[value]', name);
144
+ } else {
145
+ url.searchParams.delete('name[operation]');
146
+ url.searchParams.delete('name[value]');
147
+ }
148
+ window.location.href = url;
149
+ }
150
+ }}
151
+ />
152
+ </Form>
153
+ }
154
+ actions={[
155
+ {
156
+ variant: 'interactive',
157
+ name: 'Clear filter',
158
+ onAction: () => {
159
+ // Just get the url and remove all query params
160
+ const url = new URL(document.location);
161
+ url.search = '';
162
+ window.location.href = url.href;
163
+ }
164
+ }
165
+ ]}
166
+ />
110
167
  <table className="listing sticky">
111
168
  <thead>
112
169
  <tr>
@@ -127,8 +184,8 @@ export default function AttributeGrid({
127
184
  {
128
185
  component: {
129
186
  default: () => (
130
- <BasicColumnHeader
131
- id="name"
187
+ <SortableHeader
188
+ name="name"
132
189
  title="Attribute Name"
133
190
  currentFilters={currentFilters}
134
191
  />
@@ -138,25 +195,17 @@ export default function AttributeGrid({
138
195
  },
139
196
  {
140
197
  component: {
141
- default: () => (
142
- <GroupHeader id="group" currentFilters={currentFilters} />
143
- )
198
+ default: () => <DummyColumnHeader title="Groups" />
144
199
  },
145
200
  sortOrder: 15
146
201
  },
147
202
  {
148
203
  component: {
149
204
  default: () => (
150
- <DropdownColumnHeader
151
- id="type"
205
+ <SortableHeader
206
+ name="type"
152
207
  title="Type"
153
208
  currentFilters={currentFilters}
154
- options={[
155
- { value: 'text', text: 'Text' },
156
- { value: 'select', text: 'Select' },
157
- { value: 'multiselect', text: 'Multi Select' },
158
- { value: 'textarea', text: 'Text Area' }
159
- ]}
160
209
  />
161
210
  )
162
211
  },
@@ -165,14 +214,10 @@ export default function AttributeGrid({
165
214
  {
166
215
  component: {
167
216
  default: () => (
168
- <DropdownColumnHeader
169
- id="isRequired"
217
+ <SortableHeader
218
+ name="is_required"
170
219
  title="Is Required?"
171
220
  currentFilters={currentFilters}
172
- options={[
173
- { value: 1, text: 'Yes' },
174
- { value: 0, text: 'No' }
175
- ]}
176
221
  />
177
222
  )
178
223
  },
@@ -181,14 +226,10 @@ export default function AttributeGrid({
181
226
  {
182
227
  component: {
183
228
  default: () => (
184
- <DropdownColumnHeader
185
- id="isFilterable"
229
+ <SortableHeader
230
+ name="is_filterable"
186
231
  title="Is Filterable?"
187
232
  currentFilters={currentFilters}
188
- options={[
189
- { value: 1, text: 'Yes' },
190
- { value: 0, text: 'No' }
191
- ]}
192
233
  />
193
234
  )
194
235
  },
@@ -238,7 +279,7 @@ export default function AttributeGrid({
238
279
  },
239
280
  {
240
281
  component: {
241
- default: () => <GroupRow groups={a.groups} />
282
+ default: () => <GroupRow groups={a.groups?.items} />
242
283
  },
243
284
  sortOrder: 15
244
285
  },
@@ -329,9 +370,11 @@ export const query = `
329
370
  updateApi
330
371
  deleteApi
331
372
  groups {
332
- attributeGroupId
333
- groupName
334
- updateApi
373
+ items {
374
+ attributeGroupId
375
+ groupName
376
+ updateApi
377
+ }
335
378
  }
336
379
  }
337
380
  total
@@ -11,5 +11,5 @@ module.exports = (request, response) => {
11
11
  title: 'Attributes',
12
12
  description: 'Attributes'
13
13
  });
14
- setContextValue(request, 'filtersFromUrl', buildFilterFromUrl(request.query));
14
+ setContextValue(request, 'filtersFromUrl', buildFilterFromUrl(request));
15
15
  };
@@ -46,13 +46,13 @@ export default function Products({ category: { categoryId, addProductApi } }) {
46
46
  id: parseInt(categoryId, 10),
47
47
  filters: !keyword
48
48
  ? [
49
- { key: 'page', operation: '=', value: page.toString() },
50
- { key: 'limit', operation: '=', value: '10' }
49
+ { key: 'page', operation: 'eq', value: page.toString() },
50
+ { key: 'limit', operation: 'eq', value: '10' }
51
51
  ]
52
52
  : [
53
- { key: 'page', operation: '=', value: page.toString() },
54
- { key: 'limit', operation: '=', value: '10' },
55
- { key: 'keyword', operation: '=', value: keyword }
53
+ { key: 'page', operation: 'eq', value: page.toString() },
54
+ { key: 'limit', operation: 'eq', value: '10' },
55
+ { key: 'keyword', operation: 'eq', value: keyword }
56
56
  ]
57
57
  },
58
58
  pause: true
@@ -10,10 +10,11 @@ import { useAlertContext } from '@components/common/modal/Alert';
10
10
  import { Checkbox } from '@components/common/form/fields/Checkbox';
11
11
  import { Card } from '@components/admin/cms/Card';
12
12
  import CategoryNameRow from '@components/admin/catalog/categoryGrid/rows/CategoryName';
13
- import BasicColumnHeader from '@components/common/grid/headers/Basic';
14
- import DropdownColumnHeader from '@components/common/grid/headers/Dropdown';
15
13
  import StatusRow from '@components/common/grid/rows/StatusRow';
16
14
  import YesNoRow from '@components/common/grid/rows/YesNoRow';
15
+ import SortableHeader from '@components/common/grid/headers/Sortable';
16
+ import { Form } from '@components/common/form/Form';
17
+ import { Field } from '@components/common/form/Field';
17
18
 
18
19
  function Actions({ categories = [], selectedIds = [] }) {
19
20
  const { openAlert, closeAlert } = useAlertContext();
@@ -106,6 +107,45 @@ export default function CategoryGrid({
106
107
 
107
108
  return (
108
109
  <Card>
110
+ <Card.Session
111
+ title={
112
+ <Form submitBtn={false}>
113
+ <Field
114
+ type="text"
115
+ id="name"
116
+ placeholder="Search"
117
+ value={currentFilters.find((f) => f.key === 'name')?.value}
118
+ onKeyPress={(e) => {
119
+ // If the user press enter, we should submit the form
120
+ if (e.key === 'Enter') {
121
+ const url = new URL(document.location);
122
+ const name = document.getElementById('name')?.value;
123
+ if (name) {
124
+ url.searchParams.set('name[operation]', 'like');
125
+ url.searchParams.set('name[value]', name);
126
+ } else {
127
+ url.searchParams.delete('name[operation]');
128
+ url.searchParams.delete('name[value]');
129
+ }
130
+ window.location.href = url;
131
+ }
132
+ }}
133
+ />
134
+ </Form>
135
+ }
136
+ actions={[
137
+ {
138
+ variant: 'interactive',
139
+ name: 'Clear filter',
140
+ onAction: () => {
141
+ // Just get the url and remove all query params
142
+ const url = new URL(document.location);
143
+ url.search = '';
144
+ window.location.href = url.href;
145
+ }
146
+ }
147
+ ]}
148
+ />
109
149
  <table className="listing sticky">
110
150
  <thead>
111
151
  <tr>
@@ -128,9 +168,9 @@ export default function CategoryGrid({
128
168
  {
129
169
  component: {
130
170
  default: () => (
131
- <BasicColumnHeader
171
+ <SortableHeader
132
172
  title="Category Name"
133
- id="name"
173
+ name="name"
134
174
  currentFilters={currentFilters}
135
175
  />
136
176
  )
@@ -140,14 +180,10 @@ export default function CategoryGrid({
140
180
  {
141
181
  component: {
142
182
  default: () => (
143
- <DropdownColumnHeader
144
- id="status"
183
+ <SortableHeader
184
+ name="status"
145
185
  title="Status"
146
186
  currentFilters={currentFilters}
147
- options={[
148
- { value: 1, text: 'Enabled' },
149
- { value: 0, text: 'Disabled' }
150
- ]}
151
187
  />
152
188
  )
153
189
  },
@@ -156,14 +192,10 @@ export default function CategoryGrid({
156
192
  {
157
193
  component: {
158
194
  default: () => (
159
- <DropdownColumnHeader
160
- id="includeInNav"
195
+ <SortableHeader
196
+ name="include_in_nav"
161
197
  title="Include In Menu"
162
198
  currentFilters={currentFilters}
163
- options={[
164
- { value: 1, text: 'Yes' },
165
- { value: 0, text: 'No' }
166
- ]}
167
199
  />
168
200
  )
169
201
  },
@@ -11,5 +11,5 @@ module.exports = (request, response) => {
11
11
  title: 'Categories',
12
12
  description: 'Categories'
13
13
  });
14
- setContextValue(request, 'filtersFromUrl', buildFilterFromUrl(request.query));
14
+ setContextValue(request, 'filtersFromUrl', buildFilterFromUrl(request));
15
15
  };
@@ -46,13 +46,13 @@ export default function Products({ collection: { code, addProductApi } }) {
46
46
  code,
47
47
  filters: !keyword
48
48
  ? [
49
- { key: 'page', operation: '=', value: page.toString() },
50
- { key: 'limit', operation: '=', value: '10' }
49
+ { key: 'page', operation: 'eq', value: page.toString() },
50
+ { key: 'limit', operation: 'eq', value: '10' }
51
51
  ]
52
52
  : [
53
- { key: 'page', operation: '=', value: page.toString() },
54
- { key: 'limit', operation: '=', value: '10' },
55
- { key: 'keyword', operation: '=', value: keyword }
53
+ { key: 'page', operation: 'eq', value: page.toString() },
54
+ { key: 'limit', operation: 'eq', value: '10' },
55
+ { key: 'keyword', operation: 'eq', value: keyword }
56
56
  ]
57
57
  },
58
58
  pause: true
@@ -10,9 +10,11 @@ import { useAlertContext } from '@components/common/modal/Alert';
10
10
  import { Checkbox } from '@components/common/form/fields/Checkbox';
11
11
  import { Card } from '@components/admin/cms/Card';
12
12
  import CollectionNameRow from '@components/admin/catalog/collectionGrid/rows/CollectionNameRow';
13
- import BasicColumnHeader from '@components/common/grid/headers/Basic';
14
13
  import TextRow from '@components/common/grid/rows/TextRow';
15
14
  import DummyColumnHeader from '@components/common/grid/headers/Dummy';
15
+ import SortableHeader from '@components/common/grid/headers/Sortable';
16
+ import { Form } from '@components/common/form/Form';
17
+ import { Field } from '@components/common/form/Field';
16
18
 
17
19
  function Actions({ collections = [], selectedIds = [] }) {
18
20
  const { openAlert, closeAlert } = useAlertContext();
@@ -106,6 +108,45 @@ export default function CollectionGrid({
106
108
  return (
107
109
  <div className="w-2/3" style={{ margin: '0 auto' }}>
108
110
  <Card>
111
+ <Card.Session
112
+ title={
113
+ <Form submitBtn={false}>
114
+ <Field
115
+ type="text"
116
+ id="name"
117
+ placeholder="Search"
118
+ value={currentFilters.find((f) => f.key === 'name')?.value}
119
+ onKeyPress={(e) => {
120
+ // If the user press enter, we should submit the form
121
+ if (e.key === 'Enter') {
122
+ const url = new URL(document.location);
123
+ const name = document.getElementById('name')?.value;
124
+ if (name) {
125
+ url.searchParams.set('name[operation]', 'like');
126
+ url.searchParams.set('name[value]', name);
127
+ } else {
128
+ url.searchParams.delete('name[operation]');
129
+ url.searchParams.delete('name[value]');
130
+ }
131
+ window.location.href = url;
132
+ }
133
+ }}
134
+ />
135
+ </Form>
136
+ }
137
+ actions={[
138
+ {
139
+ variant: 'interactive',
140
+ name: 'Clear filter',
141
+ onAction: () => {
142
+ // Just get the url and remove all query params
143
+ const url = new URL(document.location);
144
+ url.search = '';
145
+ window.location.href = url.href;
146
+ }
147
+ }
148
+ ]}
149
+ />
109
150
  <table className="listing sticky">
110
151
  <thead>
111
152
  <tr>
@@ -140,9 +181,9 @@ export default function CollectionGrid({
140
181
  {
141
182
  component: {
142
183
  default: () => (
143
- <BasicColumnHeader
184
+ <SortableHeader
144
185
  title="Collection Name"
145
- id="name"
186
+ name="name"
146
187
  currentFilters={currentFilters}
147
188
  />
148
189
  )
@@ -152,9 +193,9 @@ export default function CollectionGrid({
152
193
  {
153
194
  component: {
154
195
  default: () => (
155
- <BasicColumnHeader
196
+ <SortableHeader
156
197
  title="Code"
157
- id="code"
198
+ name="code"
158
199
  currentFilters={currentFilters}
159
200
  />
160
201
  )
@@ -11,5 +11,5 @@ module.exports = (request, response) => {
11
11
  title: 'Collections',
12
12
  description: 'Collections'
13
13
  });
14
- setContextValue(request, 'filtersFromUrl', buildFilterFromUrl(request.query));
14
+ setContextValue(request, 'filtersFromUrl', buildFilterFromUrl(request));
15
15
  };
@@ -66,7 +66,7 @@ export default function Attributes({ product, groups: { items } }) {
66
66
  <Card.Session title="Attributes">
67
67
  <table className="table table-auto">
68
68
  <tbody>
69
- {currentGroup.attributes.map((attribute, index) => {
69
+ {currentGroup.attributes.items.map((attribute, index) => {
70
70
  const valueIndex = attributeIndex.find(
71
71
  (idx) => idx.attributeId === attribute.attributeId
72
72
  );
@@ -210,21 +210,23 @@ Attributes.propTypes = {
210
210
  PropTypes.shape({
211
211
  groupId: PropTypes.number,
212
212
  groupName: PropTypes.string,
213
- attributes: PropTypes.arrayOf(
214
- PropTypes.shape({
215
- attributeId: PropTypes.number,
216
- attributeName: PropTypes.string,
217
- attributeCode: PropTypes.string,
218
- type: PropTypes.string,
219
- isRequired: PropTypes.number,
220
- options: PropTypes.arrayOf(
221
- PropTypes.shape({
222
- optionId: PropTypes.number,
223
- optionText: PropTypes.string
224
- })
225
- )
226
- })
227
- )
213
+ attributes: {
214
+ items: PropTypes.arrayOf(
215
+ PropTypes.shape({
216
+ attributeId: PropTypes.number,
217
+ attributeName: PropTypes.string,
218
+ attributeCode: PropTypes.string,
219
+ type: PropTypes.string,
220
+ isRequired: PropTypes.number,
221
+ options: PropTypes.arrayOf(
222
+ PropTypes.shape({
223
+ optionId: PropTypes.number,
224
+ optionText: PropTypes.string
225
+ })
226
+ )
227
+ })
228
+ )
229
+ }
228
230
  })
229
231
  )
230
232
  }),
@@ -267,14 +269,16 @@ export const query = `
267
269
  groupId: attributeGroupId
268
270
  groupName
269
271
  attributes {
270
- attributeId
271
- attributeName
272
- attributeCode
273
- type
274
- isRequired
275
- options {
276
- optionId: attributeOptionId
277
- optionText
272
+ items {
273
+ attributeId
274
+ attributeName
275
+ attributeCode
276
+ type
277
+ isRequired
278
+ options {
279
+ optionId: attributeOptionId
280
+ optionText
281
+ }
278
282
  }
279
283
  }
280
284
  }