@evershop/evershop 1.1.0 → 1.2.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 (390) hide show
  1. package/bin/build/index.js +24 -0
  2. package/bin/extension/index.js +2 -2
  3. package/bin/lib/addDefaultMiddlewareFuncs.js +7 -2
  4. package/bin/lib/buildEntry.js +15 -0
  5. package/bin/lib/onListening.js +7 -4
  6. package/bin/lib/startUp.js +6 -0
  7. package/package.json +9 -1
  8. package/src/components/admin/catalog/productEdit/category/CategoryItem.jsx +2 -7
  9. package/src/components/admin/catalog/productEdit/category/CategoryTree.jsx +14 -7
  10. package/src/components/admin/catalog/productEdit/category/CategoryTree.scss +10 -0
  11. package/src/components/admin/catalog/productEdit/variants/CreateVariant.jsx +2 -2
  12. package/src/components/admin/catalog/productEdit/variants/CreateVariantGroup.jsx +1 -1
  13. package/src/components/admin/catalog/productEdit/variants/EditVariant.jsx +1 -1
  14. package/src/components/admin/catalog/productEdit/variants/New.jsx +2 -2
  15. package/src/components/admin/catalog/productEdit/variants/Search.jsx +1 -1
  16. package/src/components/admin/catalog/productEdit/variants/SearchModal.jsx +1 -1
  17. package/src/components/admin/catalog/productEdit/variants/VariantModal.jsx +6 -6
  18. package/src/components/admin/catalog/productGrid/rows/ThumbnailRow.jsx +1 -1
  19. package/src/components/admin/checkout/shippingSetting/Method.jsx +6 -6
  20. package/src/components/admin/checkout/shippingSetting/MethodForm.jsx +4 -4
  21. package/src/components/admin/checkout/shippingSetting/Methods.jsx +3 -3
  22. package/src/components/admin/checkout/shippingSetting/PriceBasedPrice.jsx +2 -2
  23. package/src/components/admin/checkout/shippingSetting/WeightBasedPrice.jsx +2 -2
  24. package/src/components/admin/checkout/shippingSetting/Zone.jsx +7 -7
  25. package/src/components/admin/checkout/shippingSetting/ZoneForm.jsx +1 -1
  26. package/src/components/admin/cms/Card.jsx +3 -3
  27. package/src/components/admin/cms/PageHeading.jsx +3 -3
  28. package/src/components/admin/cms/widget/WidgetTypes.jsx +28 -0
  29. package/src/components/admin/cms/widget/grid/WidgetTypeRow.jsx +29 -0
  30. package/src/components/admin/oms/orderEdit/items/ItemVariantOptions.jsx +1 -1
  31. package/src/components/admin/oms/orderEdit/items/Name.jsx +1 -1
  32. package/src/components/admin/oms/orderGrid/headers/OrderDateColumnHeader.jsx +1 -1
  33. package/src/components/admin/promotion/couponEdit/AttributeGroupSelector.jsx +3 -3
  34. package/src/components/admin/promotion/couponEdit/BuyXGetY.jsx +2 -2
  35. package/src/components/admin/promotion/couponEdit/CategorySelector.jsx +6 -6
  36. package/src/components/admin/promotion/couponEdit/CollectionSelector.jsx +3 -3
  37. package/src/components/admin/promotion/couponEdit/ProductSkuSelector.jsx +4 -4
  38. package/src/components/admin/promotion/couponEdit/RequireProducts.jsx +2 -2
  39. package/src/components/admin/promotion/couponEdit/Setting.jsx +1 -1
  40. package/src/components/admin/promotion/couponEdit/TargetProducts.jsx +4 -4
  41. package/src/components/admin/tax/taxSetting/Rate.jsx +6 -6
  42. package/src/components/admin/tax/taxSetting/RateForm.jsx +5 -5
  43. package/src/components/admin/tax/taxSetting/Rates.jsx +6 -6
  44. package/src/components/admin/tax/taxSetting/TaxClass.jsx +3 -3
  45. package/src/components/admin/tax/taxSetting/TaxClassForm.jsx +1 -1
  46. package/src/components/admin/widgets/BasicMenuSetting.jsx +614 -0
  47. package/src/components/admin/widgets/BasicMenuSetting.scss +19 -0
  48. package/src/components/admin/widgets/CollectionProductsSetting.jsx +203 -0
  49. package/src/components/admin/widgets/TextBlockSetting.jsx +70 -0
  50. package/src/components/common/Area.jsx +31 -8
  51. package/src/components/common/Badge.jsx +1 -1
  52. package/src/components/common/Editor.jsx +191 -0
  53. package/src/components/common/Notification.scss +1 -0
  54. package/src/components/common/SimplePagination.jsx +2 -2
  55. package/src/components/common/form/Form.jsx +1 -1
  56. package/src/components/common/form/fields/Checkbox.jsx +1 -1
  57. package/src/components/common/form/fields/Ckeditor.jsx +11 -11
  58. package/src/components/common/form/fields/Editor.jsx +326 -0
  59. package/src/components/common/form/fields/Editor.scss +29 -0
  60. package/src/components/common/form/fields/Radio.jsx +1 -1
  61. package/src/components/common/form/fields/editor/FileBrowser.jsx +419 -0
  62. package/src/components/common/form/fields/editor/FileBrowser.scss +37 -0
  63. package/src/components/common/form/fields/editor/GetColumnClasses.jsx +14 -0
  64. package/src/components/common/form/fields/editor/GetRowClasses.jsx +18 -0
  65. package/src/components/common/form/fields/editor/RowTemplates.jsx +154 -0
  66. package/src/components/common/grid/Pagination.jsx +4 -4
  67. package/src/components/common/grid/headers/FromTo.jsx +1 -1
  68. package/src/components/common/grid/headers/Sortable.jsx +1 -1
  69. package/src/components/common/grid/rows/ThumbnailRow.jsx +1 -1
  70. package/src/components/common/list/Filter.jsx +1 -1
  71. package/src/components/common/modal/Alert.jsx +1 -1
  72. package/src/components/common/modal/Modal.jsx +1 -1
  73. package/src/components/frontStore/catalog/categoryView/filter/AttributeFilter.jsx +2 -2
  74. package/src/components/frontStore/catalog/categoryView/filter/CategoryFilter.jsx +3 -2
  75. package/src/components/frontStore/catalog/categoryView/filter/CategoryFilter.scss +5 -0
  76. package/src/components/frontStore/catalog/product/list/List.jsx +4 -4
  77. package/src/components/frontStore/catalog/product/list/Pagination.jsx +1 -1
  78. package/src/components/frontStore/catalog/product/list/Sorting.jsx +2 -2
  79. package/src/components/frontStore/catalog/product/list/item/Name.jsx +1 -1
  80. package/src/components/frontStore/checkout/cart/Empty.jsx +3 -3
  81. package/src/components/frontStore/checkout/cart/items/ItemOptions.jsx +1 -1
  82. package/src/components/frontStore/checkout/cart/items/ItemVariantOptions.jsx +1 -1
  83. package/src/components/frontStore/checkout/cart/items/Items.jsx +20 -21
  84. package/src/components/frontStore/checkout/cart/items/Items.scss +47 -0
  85. package/src/components/frontStore/checkout/cart/items/Quantity.jsx +154 -0
  86. package/src/components/frontStore/checkout/checkout/StepTitle.jsx +1 -1
  87. package/src/components/frontStore/checkout/checkout/payment/paymentStep/StepContent.jsx +5 -5
  88. package/src/components/frontStore/checkout/checkout/shipment/StepContent.jsx +1 -1
  89. package/src/components/frontStore/checkout/checkout/summary/Cart.jsx +10 -12
  90. package/src/components/frontStore/checkout/checkout/summary/Items.jsx +9 -9
  91. package/src/components/frontStore/checkout/checkout/summary/cart/Total.jsx +6 -6
  92. package/src/components/frontStore/checkout/success/summary/items/ItemOptions.jsx +1 -1
  93. package/src/components/frontStore/checkout/success/summary/items/Items.jsx +9 -6
  94. package/src/components/frontStore/checkout/success/summary/order/OrderSummary.jsx +9 -13
  95. package/src/components/frontStore/checkout/success/summary/order/Total.jsx +5 -5
  96. package/src/components/frontStore/customer/address/addressForm/AddressFormLoadingSkeleton.jsx +2 -2
  97. package/src/components/frontStore/customer/address/addressForm/NameAndTelephone.jsx +1 -1
  98. package/src/components/frontStore/customer/address/addressForm/ProvinceAndPostcode.jsx +1 -1
  99. package/src/components/frontStore/customer/checkout/Edit.jsx +2 -2
  100. package/src/components/frontStore/customer/detail/Order.jsx +4 -4
  101. package/src/components/frontStore/stripe/checkout/CheckoutForm.jsx +2 -2
  102. package/src/components/frontStore/stripe/checkout/TestCards.jsx +1 -1
  103. package/src/components/frontStore/widgets/BasicMenu.jsx +129 -0
  104. package/src/{modules/catalog/pages/frontStore/homepage/FeaturedProducts.jsx → components/frontStore/widgets/CollectionProducts.jsx} +40 -32
  105. package/src/components/frontStore/widgets/TextBlock.jsx +46 -0
  106. package/src/lib/componee/getComponentsByRoute.js +15 -2
  107. package/src/lib/event/event-manager.js +1 -1
  108. package/src/lib/middleware/tests/app/modules/404page/pages/frontStore/product/route.json +2 -1
  109. package/src/lib/middlewares/static.js +3 -1
  110. package/src/lib/response/render.js +5 -6
  111. package/src/lib/router/Router.js +1 -1
  112. package/src/lib/router/loadModuleRoutes.js +3 -0
  113. package/src/lib/router/registerAdminRoute.js +9 -1
  114. package/src/lib/router/registerFrontStoreRoute.js +2 -0
  115. package/src/lib/router/scanForRoutes.js +1 -0
  116. package/src/lib/router/tests/unit/unit.validateRoute.test.js +7 -1
  117. package/src/lib/util/defaultPaginationFilters.js +19 -17
  118. package/src/lib/util/getEnabledWidgets.js +28 -0
  119. package/src/lib/util/merge.js +67 -14
  120. package/src/lib/util/tests/unit/util.merge.test.js +21 -4
  121. package/src/lib/util/validateConfiguration.js +83 -0
  122. package/src/lib/webpack/createBaseConfig.js +4 -1
  123. package/src/lib/webpack/dev/createConfigClient.js +10 -2
  124. package/src/lib/webpack/loaders/AreaLoader.js +14 -3
  125. package/src/lib/webpack/util/parseGraphql.js +29 -16
  126. package/src/lib/webpack/util/parseGraphqlByFile.js +16 -2
  127. package/src/modules/auth/pages/admin/adminLogin/LoginForm.jsx +54 -21
  128. package/src/modules/auth/pages/admin/all/AdminUser.jsx +3 -3
  129. package/src/modules/base/bootstrap.js +79 -0
  130. package/src/modules/base/graphql/types/Route/Route.admin.graphql +15 -0
  131. package/src/modules/base/graphql/types/Route/Route.admin.resolvers.js +10 -0
  132. package/src/modules/base/pages/global/response[errorHandler].js +23 -0
  133. package/src/modules/catalog/bootstrap.js +125 -5
  134. package/src/modules/catalog/graphql/types/Category/Category.graphql +4 -3
  135. package/src/modules/catalog/graphql/types/Category/Category.resolvers.js +34 -0
  136. package/src/modules/catalog/graphql/types/Collection/Collection.graphql +2 -2
  137. package/src/modules/catalog/graphql/types/Collection/Collection.resolvers.js +34 -0
  138. package/src/modules/catalog/graphql/types/Product/Attribute/ProductAttribute.resolvers.js +1 -0
  139. package/src/modules/catalog/graphql/types/Product/Product.graphql +1 -1
  140. package/src/modules/catalog/graphql/types/Product/Product.resolvers.js +34 -0
  141. package/src/modules/catalog/graphql/types/Widget/CollectionProductsWidget/CollectionProductsWidget.graphql +11 -0
  142. package/src/modules/catalog/graphql/types/Widget/CollectionProductsWidget/CollectionProductsWidget.resolvers.js +8 -0
  143. package/src/modules/catalog/migration/Version-1.0.0.js +1 -0
  144. package/src/modules/catalog/migration/Version-1.0.7.js +10 -0
  145. package/src/modules/catalog/pages/admin/attributeEdit+attributeNew/FormContent.jsx +4 -4
  146. package/src/modules/catalog/pages/admin/attributeEdit+attributeNew/General.jsx +5 -5
  147. package/src/modules/catalog/pages/admin/attributeGrid/Grid.jsx +2 -2
  148. package/src/modules/catalog/pages/admin/categoryEdit/Products.jsx +4 -4
  149. package/src/modules/catalog/pages/admin/categoryEdit+categoryNew/FormContent.jsx +4 -4
  150. package/src/modules/catalog/pages/admin/categoryEdit+categoryNew/General.jsx +16 -18
  151. package/src/modules/catalog/pages/admin/categoryEdit+categoryNew/Image.jsx +1 -2
  152. package/src/modules/catalog/pages/admin/categoryEdit+categoryNew/Status.jsx +16 -1
  153. package/src/modules/catalog/pages/admin/categoryGrid/Grid.jsx +3 -3
  154. package/src/modules/catalog/pages/admin/collectionEdit/Products.jsx +4 -4
  155. package/src/modules/catalog/pages/admin/collectionEdit+collectionNew/FormContent.jsx +2 -2
  156. package/src/modules/catalog/pages/admin/collectionEdit+collectionNew/General.jsx +2 -2
  157. package/src/modules/catalog/pages/admin/collectionGrid/Grid.jsx +3 -3
  158. package/src/modules/catalog/pages/admin/productEdit/Collection.jsx +7 -7
  159. package/src/modules/catalog/pages/admin/productEdit+productNew/Attributes.jsx +1 -1
  160. package/src/modules/catalog/pages/admin/productEdit+productNew/CustomOptions.jsss +4 -4
  161. package/src/modules/catalog/pages/admin/productEdit+productNew/FormContent.jsx +4 -4
  162. package/src/modules/catalog/pages/admin/productEdit+productNew/General.jsx +15 -17
  163. package/src/modules/catalog/pages/admin/productGrid/Grid.jsx +3 -3
  164. package/src/modules/catalog/pages/frontStore/catalogSearch/General.jsx +2 -2
  165. package/src/modules/catalog/pages/frontStore/catalogSearch/Products.jsx +1 -1
  166. package/src/modules/catalog/pages/frontStore/catalogSearch/route.json +2 -1
  167. package/src/modules/catalog/pages/frontStore/categoryView/CategoryView.jsx +19 -2
  168. package/src/modules/catalog/pages/frontStore/categoryView/Filter.scss +1 -0
  169. package/src/modules/catalog/pages/frontStore/categoryView/General.jsx +6 -8
  170. package/src/modules/catalog/pages/frontStore/categoryView/General.scss +0 -2
  171. package/src/modules/catalog/pages/frontStore/categoryView/Pagination.jsx +6 -0
  172. package/src/modules/catalog/pages/frontStore/categoryView/Products.jsx +8 -1
  173. package/src/modules/catalog/pages/frontStore/categoryView/route.json +2 -1
  174. package/src/modules/catalog/pages/frontStore/productView/Description.jsx +3 -3
  175. package/src/modules/catalog/pages/frontStore/productView/Form.jsx +4 -4
  176. package/src/modules/catalog/pages/frontStore/productView/Form.scss +1 -0
  177. package/src/modules/catalog/pages/frontStore/productView/GeneralInfo.jsx +1 -1
  178. package/src/modules/catalog/pages/frontStore/productView/Images.jsx +1 -1
  179. package/src/modules/catalog/pages/frontStore/productView/Layout.jsx +1 -1
  180. package/src/modules/catalog/pages/frontStore/productView/Options.jsx +2 -2
  181. package/src/modules/catalog/pages/frontStore/productView/Variants.jsx +4 -4
  182. package/src/modules/catalog/pages/frontStore/productView/route.json +2 -1
  183. package/src/modules/catalog/services/AttributeCollection.js +10 -10
  184. package/src/modules/catalog/services/AttributeGroupCollection.js +10 -10
  185. package/src/modules/catalog/services/CategoryCollection.js +10 -10
  186. package/src/modules/catalog/services/CollectionCollection.js +10 -10
  187. package/src/modules/catalog/services/registerCartItemProductUrlField.js +35 -0
  188. package/src/modules/catalog/services/registerCartItemVariantOptionsField.js +51 -0
  189. package/src/modules/catalog/services/registerDefaultCategoryCollectionFilters.js +16 -0
  190. package/src/modules/checkout/api/addShippingNote/[context]bodyParser[auth].js +5 -0
  191. package/src/modules/checkout/api/addShippingNote/payloadSchema.json +15 -0
  192. package/src/modules/checkout/api/addShippingNote/route.json +5 -0
  193. package/src/modules/checkout/api/addShippingNote/saveShippingNote.js +50 -0
  194. package/src/modules/checkout/api/createCart/createNewCart.js +28 -1
  195. package/src/modules/checkout/api/updateCartItemQty/[bodyParser]updateQty.js +49 -0
  196. package/src/modules/checkout/api/updateCartItemQty/[context]bodyParser[auth].js +5 -0
  197. package/src/modules/checkout/api/updateCartItemQty/payloadSchema.json +21 -0
  198. package/src/modules/checkout/api/updateCartItemQty/route.json +5 -0
  199. package/src/modules/checkout/api/updateMineCartItemQty/[context]bodyParser[auth].js +5 -0
  200. package/src/modules/checkout/api/updateMineCartItemQty/[detectCurrentCart]updateQty.js +51 -0
  201. package/src/modules/checkout/api/updateMineCartItemQty/[getCurrentCustomer]detectCurrentCart.js +32 -0
  202. package/src/modules/checkout/api/updateMineCartItemQty/payloadSchema.json +21 -0
  203. package/src/modules/checkout/api/updateMineCartItemQty/route.json +5 -0
  204. package/src/modules/checkout/bootstrap.js +27 -0
  205. package/src/modules/checkout/graphql/types/Cart/Cart.graphql +22 -3
  206. package/src/modules/checkout/graphql/types/Cart/Cart.resolvers.js +18 -2
  207. package/src/modules/checkout/graphql/types/CheckoutSetting/CheckoutSetting.graphql +3 -0
  208. package/src/modules/checkout/graphql/types/CheckoutSetting/CheckoutSetting.resolvers.js +7 -0
  209. package/src/modules/checkout/migration/Version-1.0.0.js +14 -0
  210. package/src/modules/checkout/migration/Version-1.0.6.js +201 -0
  211. package/src/modules/checkout/pages/admin/shippingSetting/ShippingSetting.jsx +2 -2
  212. package/src/modules/checkout/pages/frontStore/all/[context]detectCurrentCart[auth].js +5 -0
  213. package/src/modules/checkout/pages/frontStore/cart/ShoppingCart.jsx +17 -8
  214. package/src/modules/checkout/pages/frontStore/cart/Summary.jsx +18 -19
  215. package/src/modules/checkout/pages/frontStore/cart/route.json +2 -1
  216. package/src/modules/checkout/pages/frontStore/checkout/Checkout.jsx +5 -5
  217. package/src/modules/checkout/pages/frontStore/checkout/Checkout.scss +4 -0
  218. package/src/modules/checkout/pages/frontStore/checkout/ShippingMethods.jsx +2 -2
  219. package/src/modules/checkout/pages/frontStore/checkout/ShippingNote.jsx +105 -0
  220. package/src/modules/checkout/pages/frontStore/checkout/Summary.jsx +14 -14
  221. package/src/modules/checkout/pages/frontStore/checkout/SummaryMobile.jsx +12 -15
  222. package/src/modules/checkout/pages/frontStore/checkout/route.json +2 -1
  223. package/src/modules/checkout/pages/frontStore/checkoutSuccess/CheckoutSuccess.jsx +1 -1
  224. package/src/modules/checkout/pages/frontStore/checkoutSuccess/CheckoutSuccess.scss +4 -0
  225. package/src/modules/checkout/pages/frontStore/checkoutSuccess/CustomerInfo.jsx +30 -32
  226. package/src/modules/checkout/pages/frontStore/checkoutSuccess/ShippingNote.jsx +47 -0
  227. package/src/modules/checkout/pages/frontStore/checkoutSuccess/Summary.jsx +12 -15
  228. package/src/modules/checkout/pages/frontStore/checkoutSuccess/route.json +2 -1
  229. package/src/modules/checkout/services/cart/Cart.js +31 -27
  230. package/src/modules/checkout/services/cart/registerCartBaseFields.js +133 -41
  231. package/src/modules/checkout/services/cart/registerCartItemBaseFields.js +300 -374
  232. package/src/modules/checkout/services/toPrice.js +1 -1
  233. package/src/modules/checkout/tests/basicSetup.js +85 -0
  234. package/src/modules/checkout/tests/coupons.js +82 -0
  235. package/src/modules/checkout/tests/products.js +67 -0
  236. package/src/modules/checkout/tests/taxRates.js +3 -0
  237. package/src/modules/checkout/tests/unit/discountAmount.test.js +60 -0
  238. package/src/modules/checkout/tests/unit/grandTotal.test.js +83 -0
  239. package/src/modules/checkout/tests/unit/lineTotal.test.js +90 -0
  240. package/src/modules/checkout/tests/unit/lineTotalWithDiscount.test.js +103 -0
  241. package/src/modules/checkout/tests/unit/productPrice.test.js +67 -0
  242. package/src/modules/checkout/tests/unit/subTotal.test.js +85 -0
  243. package/src/modules/checkout/tests/unit/subTotalWithDiscount.test.js +117 -0
  244. package/src/modules/checkout/tests/unit/taxAmount.test.js +67 -0
  245. package/src/modules/checkout/tests/unit/taxAmountRounding.test.js +277 -0
  246. package/src/modules/cms/api/createWidget/[context]bodyParser[auth].js +5 -0
  247. package/src/modules/cms/api/createWidget/createWidget[finish].js +17 -0
  248. package/src/modules/cms/api/createWidget/finish[apiResponse].js +27 -0
  249. package/src/modules/cms/api/createWidget/payloadSchema.json +18 -0
  250. package/src/modules/cms/api/createWidget/route.json +5 -0
  251. package/src/modules/cms/api/deleteWidget/deleteWidget.js +27 -0
  252. package/src/modules/cms/api/deleteWidget/route.json +5 -0
  253. package/src/modules/cms/api/updateWidget/[context]bodyParser[auth].js +5 -0
  254. package/src/modules/cms/api/updateWidget/finish[apiResponse].js +27 -0
  255. package/src/modules/cms/api/updateWidget/payloadSchema.json +18 -0
  256. package/src/modules/cms/api/updateWidget/route.json +5 -0
  257. package/src/modules/cms/api/updateWidget/updateWidget[finish].js +17 -0
  258. package/src/modules/cms/bootstrap.js +223 -3
  259. package/src/modules/cms/graphql/types/CmsPage/CmsPage.graphql +1 -2
  260. package/src/modules/cms/graphql/types/CmsPage/CmsPage.resolvers.js +35 -1
  261. package/src/modules/cms/graphql/types/Widget/Widget.graphql +91 -0
  262. package/src/modules/cms/graphql/types/Widget/Widget.resolvers.js +142 -0
  263. package/src/modules/cms/migration/Version-1.1.0.js +22 -0
  264. package/src/modules/cms/migration/Version-1.1.1.js +103 -0
  265. package/src/modules/cms/pages/admin/adminNotFound/NotFound.jsx +4 -4
  266. package/src/modules/cms/pages/admin/all/CmsMenuGroup.jsx +12 -4
  267. package/src/modules/cms/pages/admin/all/Notification.scss +1 -1
  268. package/src/modules/cms/pages/admin/all/search/NoResult.jsx +2 -2
  269. package/src/modules/cms/pages/admin/all/search/Results.jsx +3 -3
  270. package/src/modules/cms/pages/admin/cmsPageEdit+cmsPageNew/FormContent.jsx +7 -9
  271. package/src/modules/cms/pages/admin/cmsPageEdit+cmsPageNew/General.jsx +3 -3
  272. package/src/modules/cms/pages/admin/cmsPageEdit+cmsPageNew/Seo.jsx +1 -1
  273. package/src/modules/cms/pages/admin/cmsPageEdit+cmsPageNew/Status.jsx +40 -0
  274. package/src/modules/cms/pages/admin/cmsPageGrid/Grid.jsx +3 -4
  275. package/src/modules/cms/pages/admin/dashboard/Layout.jsx +3 -3
  276. package/src/modules/cms/pages/admin/widgetEdit/WidgetForm.jsx +52 -0
  277. package/src/modules/cms/pages/admin/widgetEdit/index.js +36 -0
  278. package/src/modules/cms/pages/admin/widgetEdit/route.json +4 -0
  279. package/src/modules/cms/pages/admin/widgetEdit+widgetNew/FormContent.jsx +69 -0
  280. package/src/modules/cms/pages/admin/widgetEdit+widgetNew/FormContent.scss +7 -0
  281. package/src/modules/cms/pages/admin/widgetEdit+widgetNew/General.jsx +185 -0
  282. package/src/modules/cms/pages/admin/widgetEdit+widgetNew/PageHeading.jsx +37 -0
  283. package/src/modules/cms/pages/admin/widgetEdit+widgetNew/Setting.jsx +55 -0
  284. package/src/modules/cms/pages/admin/widgetGrid/Grid.jsx +415 -0
  285. package/src/modules/cms/pages/admin/widgetGrid/Heading.jsx +11 -0
  286. package/src/modules/cms/pages/admin/widgetGrid/NewWidgetButton.jsx +52 -0
  287. package/src/modules/cms/pages/admin/widgetGrid/index.js +15 -0
  288. package/src/modules/cms/pages/admin/widgetGrid/route.json +4 -0
  289. package/src/modules/cms/pages/admin/widgetNew/WidgetNewForm.jsx +60 -0
  290. package/src/modules/cms/pages/admin/widgetNew/index.js +11 -0
  291. package/src/modules/cms/pages/admin/widgetNew/route.json +4 -0
  292. package/src/modules/cms/pages/admin/widgetNew/typeValidate.js +21 -0
  293. package/src/modules/cms/pages/frontStore/all/Breadcrumb.jsx +1 -1
  294. package/src/modules/cms/pages/frontStore/all/Footer.jsx +2 -2
  295. package/src/modules/cms/pages/frontStore/all/Layout.jsx +3 -3
  296. package/src/modules/cms/pages/frontStore/all/Layout.scss +13 -0
  297. package/src/modules/cms/pages/frontStore/all/Logo.jsx +2 -2
  298. package/src/modules/cms/pages/frontStore/all/Logo.scss +2 -4
  299. package/src/modules/cms/pages/frontStore/all/Notification.scss +1 -1
  300. package/src/modules/cms/pages/frontStore/cmsPageView/Layout.jsx +2 -2
  301. package/src/modules/cms/pages/frontStore/cmsPageView/View.jsx +5 -3
  302. package/src/modules/cms/pages/frontStore/cmsPageView/index.js +6 -12
  303. package/src/modules/cms/pages/frontStore/cmsPageView/route.json +2 -1
  304. package/src/modules/cms/pages/frontStore/homepage/route.json +2 -1
  305. package/src/modules/cms/pages/frontStore/notFound/NotFound.jsx +4 -4
  306. package/src/modules/cms/pages/frontStore/notFound/route.json +2 -1
  307. package/src/modules/cms/pages/frontStore/staticAsset/[context]staticAssets[auth].js +1 -1
  308. package/src/modules/cms/services/CMSPageCollection.js +10 -10
  309. package/src/modules/cms/services/WidgetCollection.js +62 -0
  310. package/src/modules/cms/services/getWidgetsBaseQuery.js +7 -0
  311. package/src/modules/cms/services/page/createPage.js +1 -2
  312. package/src/modules/cms/services/page/pageDataSchema.json +0 -4
  313. package/src/modules/cms/services/registerDefaultWidgetCollectionFilters.js +62 -0
  314. package/src/modules/cms/services/tailwind.admin.config.js +22 -107
  315. package/src/modules/cms/services/tailwind.frontStore.config.js +23 -108
  316. package/src/modules/cms/services/widget/createWidget.js +73 -0
  317. package/src/modules/cms/services/widget/deleteWidget.js +49 -0
  318. package/src/modules/cms/services/widget/loadWidgetInstances.js +54 -0
  319. package/src/modules/cms/services/widget/updateWidget.js +86 -0
  320. package/src/modules/cms/services/widget/widgetDataSchema.json +29 -0
  321. package/src/modules/cod/pages/admin/paymentSetting/CODSetting.jsx +2 -2
  322. package/src/modules/cod/pages/frontStore/checkout/CashOnDelivery.jsx +1 -1
  323. package/src/modules/customer/bootstrap.js +21 -4
  324. package/src/modules/customer/pages/admin/customerEdit/CustomerEditForm.jsx +3 -3
  325. package/src/modules/customer/pages/admin/customerEdit+customerNew/OrderHistory.jsx +1 -1
  326. package/src/modules/customer/pages/admin/customerGrid/Grid.jsx +3 -3
  327. package/src/modules/customer/pages/frontStore/account/AccountDetails.jsx +3 -3
  328. package/src/modules/customer/pages/frontStore/account/Layout.jsx +3 -3
  329. package/src/modules/customer/pages/frontStore/account/OrderHistory.jsx +1 -1
  330. package/src/modules/customer/pages/frontStore/account/route.json +2 -1
  331. package/src/modules/customer/pages/frontStore/login/LoginForm.jsx +2 -2
  332. package/src/modules/customer/pages/frontStore/login/route.json +2 -1
  333. package/src/modules/customer/pages/frontStore/register/RegisterForm.jsx +2 -2
  334. package/src/modules/customer/pages/frontStore/register/route.json +2 -1
  335. package/src/modules/customer/pages/frontStore/resetPasswordPage/ResetPasswordForm.jsx +2 -2
  336. package/src/modules/customer/pages/frontStore/resetPasswordPage/route.json +2 -1
  337. package/src/modules/customer/pages/frontStore/updatePasswordPage/UpdatePasswordForm.jsx +3 -3
  338. package/src/modules/customer/pages/frontStore/updatePasswordPage/route.json +2 -1
  339. package/src/modules/customer/services/CustomerCollection.js +10 -10
  340. package/src/modules/customer/services/CustomerGroupCollection.js +10 -10
  341. package/src/modules/graphql/pages/global/[bodyParser]buildQuery[graphql].js +238 -6
  342. package/src/modules/graphql/pages/global/[buildQuery]graphql[notification].js +12 -8
  343. package/src/modules/oms/bootstrap.js +87 -3
  344. package/src/modules/oms/graphql/types/Order/Order.graphql +11 -2
  345. package/src/modules/oms/graphql/types/Order/Order.resolvers.js +7 -1
  346. package/src/modules/oms/pages/admin/dashboard/Bestsellers.jsx +2 -2
  347. package/src/modules/oms/pages/admin/dashboard/Lifetimesales.jsx +5 -5
  348. package/src/modules/oms/pages/admin/orderEdit/AddTrackingButton.jsx +1 -1
  349. package/src/modules/oms/pages/admin/orderEdit/Items.jsx +7 -7
  350. package/src/modules/oms/pages/admin/orderEdit/Layout.jsx +3 -3
  351. package/src/modules/oms/pages/admin/orderEdit/Payment.jsx +6 -6
  352. package/src/modules/oms/pages/admin/orderEdit/ShipButton.jsx +1 -1
  353. package/src/modules/oms/pages/admin/orderGrid/Grid.jsx +3 -3
  354. package/src/modules/oms/services/OrderCollection.js +10 -10
  355. package/src/modules/paypal/api/paypalCreateOrder/[bodyParser]createOrder.js +55 -24
  356. package/src/modules/paypal/pages/admin/paymentSetting/PaypalSetting.jsx +6 -6
  357. package/src/modules/paypal/pages/frontStore/checkout/Paypal.jsx +3 -4
  358. package/src/modules/promotion/bootstrap.js +19 -101
  359. package/src/modules/promotion/pages/admin/couponEdit+couponNew/DiscountType.jsx +1 -1
  360. package/src/modules/promotion/pages/admin/couponEdit+couponNew/FormContent.jsx +5 -5
  361. package/src/modules/promotion/pages/admin/couponGrid/Grid.jsx +3 -3
  362. package/src/modules/promotion/pages/frontStore/cart/Coupon.jsx +2 -2
  363. package/src/modules/promotion/services/CouponCollection.js +10 -10
  364. package/src/modules/promotion/services/couponValidator.js +4 -7
  365. package/src/modules/promotion/services/discountCalculator.js +2 -7
  366. package/src/modules/promotion/services/registerCartItemPromotionFields.js +80 -0
  367. package/src/modules/promotion/services/registerCartPromotionFields.js +128 -0
  368. package/src/modules/promotion/services/registerDefaultCalculators.js +48 -20
  369. package/src/modules/promotion/services/registerDefaultValidators.js +16 -4
  370. package/src/modules/setting/pages/admin/paymentSetting/PaymentSetting.jsx +2 -2
  371. package/src/modules/setting/pages/admin/storeSetting/StoreSetting.jsx +98 -35
  372. package/src/modules/stripe/pages/admin/paymentSetting/StripePayment.jsx +5 -5
  373. package/src/modules/stripe/pages/frontStore/checkout/Stripe.jsx +1 -1
  374. package/src/modules/tax/bootstrap.js +40 -5
  375. package/src/modules/tax/graphql/types/Product/Price/ProductPrice.resolvers.js +6 -39
  376. package/src/modules/tax/graphql/types/TaxSetting/TaxSetting.graphql +1 -2
  377. package/src/modules/tax/graphql/types/TaxSetting/TaxSetting.resolvers.js +1 -8
  378. package/src/modules/tax/pages/admin/taxSetting/TaxSetting.jsx +4 -4
  379. package/src/modules/tax/services/TaxClassCollection.js +10 -10
  380. package/src/modules/tax/services/calculateTaxAmount.js +12 -9
  381. package/src/modules/tax/services/registerCartItemTaxPercentField.js +76 -0
  382. package/src/modules/auth/services/adminSessionMiddleware.js +0 -0
  383. package/src/modules/catalog/pages/frontStore/homepage/FeaturedCategories.jsx +0 -58
  384. package/src/modules/cms/pages/admin/cmsPageEdit+cmsPageNew/StatusAndLayout.jsx +0 -61
  385. package/src/modules/cms/pages/frontStore/all/Menu.jsx +0 -46
  386. package/src/modules/cms/pages/frontStore/all/Menu.scss +0 -7
  387. package/src/modules/cms/pages/frontStore/all/MobileMenu.jsx +0 -73
  388. package/src/modules/cms/pages/frontStore/all/MobileMenu.scss +0 -35
  389. package/src/modules/cms/pages/frontStore/homepage/MainBanner.jsx +0 -31
  390. package/src/modules/cms/pages/frontStore/homepage/MainBanner.scss +0 -48
@@ -1,398 +1,324 @@
1
- const { pool } = require('@evershop/evershop/src/lib/postgres/connection');
2
- const { select } = require('@evershop/postgres-query-builder');
3
1
  const { buildUrl } = require('@evershop/evershop/src/lib/router/buildUrl');
4
2
  const { v4: uuidv4 } = require('uuid');
3
+ const { getConfig } = require('@evershop/evershop/src/lib/util/getConfig');
5
4
  const { toPrice } = require('../toPrice');
6
5
  const {
7
6
  calculateTaxAmount
8
7
  } = require('../../../tax/services/calculateTaxAmount');
9
- const { getSetting } = require('../../../setting/services/setting');
10
- const { getTaxPercent } = require('../../../tax/services/getTaxPercent');
11
- const { getTaxRates } = require('../../../tax/services/getTaxRates');
12
8
 
13
- module.exports.registerCartItemBaseFields =
14
- function registerCartItemBaseFields() {
15
- return [
16
- {
17
- key: 'cart_item_id',
18
- resolvers: [
19
- async function resolver() {
20
- return this.getData('cart_item_id');
9
+ module.exports.registerCartItemBaseFields = function registerCartItemBaseFields(
10
+ fields
11
+ ) {
12
+ const newFields = fields.concat([
13
+ {
14
+ key: 'cart_item_id',
15
+ resolvers: [
16
+ async function resolver() {
17
+ return this.getData('cart_item_id');
18
+ }
19
+ ]
20
+ },
21
+ {
22
+ key: 'uuid',
23
+ resolvers: [
24
+ async function resolver() {
25
+ return this.getData('uuid') ?? uuidv4();
26
+ }
27
+ ]
28
+ },
29
+ {
30
+ key: 'cart_id',
31
+ resolvers: [
32
+ async function resolver() {
33
+ const cart = this.getCart();
34
+ return cart.getData('cart_id');
35
+ }
36
+ ],
37
+ dependencies: ['cart_item_id']
38
+ },
39
+ {
40
+ key: 'product_id',
41
+ resolvers: [
42
+ async function resolver() {
43
+ const product = await this.getProduct();
44
+ if (product.status === false) {
45
+ this.setError('product_id', 'This product is not available');
21
46
  }
22
- ]
23
- },
24
- {
25
- key: 'uuid',
26
- resolvers: [
27
- async function resolver() {
28
- return this.getData('uuid') ?? uuidv4();
47
+ return product.product_id;
48
+ }
49
+ ]
50
+ },
51
+ {
52
+ key: 'product_uuid',
53
+ resolvers: [
54
+ async function resolver() {
55
+ const product = await this.getProduct();
56
+ return product.uuid;
57
+ }
58
+ ]
59
+ },
60
+ {
61
+ key: 'product_sku',
62
+ resolvers: [
63
+ async function resolver() {
64
+ const product = await this.getProduct();
65
+ return product.sku;
66
+ }
67
+ ]
68
+ },
69
+ {
70
+ key: 'group_id',
71
+ resolvers: [
72
+ async function resolver() {
73
+ const product = await this.getProduct();
74
+ return parseInt(product.group_id, 10) ?? null;
75
+ }
76
+ ],
77
+ dependencies: ['product_id']
78
+ },
79
+ {
80
+ key: 'category_id',
81
+ resolvers: [
82
+ async function resolver() {
83
+ const product = await this.getProduct();
84
+ return product.category_id ? parseInt(product.category_id, 10) : null;
85
+ }
86
+ ],
87
+ dependencies: ['product_id']
88
+ },
89
+ {
90
+ key: 'product_name',
91
+ resolvers: [
92
+ async function resolver() {
93
+ const product = await this.getProduct();
94
+ return product.name ?? null;
95
+ }
96
+ ],
97
+ dependencies: ['product_id']
98
+ },
99
+ {
100
+ key: 'thumbnail',
101
+ resolvers: [
102
+ async function resolver() {
103
+ const product = await this.getProduct();
104
+ if (product.thumb_image) {
105
+ return product.thumb_image;
106
+ } else {
107
+ return null;
29
108
  }
30
- ]
31
- },
32
- {
33
- key: 'cart_id',
34
- resolvers: [
35
- async function resolver() {
36
- const cart = this.getCart();
37
- return cart.getData('cart_id');
38
- }
39
- ],
40
- dependencies: ['cart_item_id']
41
- },
42
- {
43
- key: 'product_id',
44
- resolvers: [
45
- async function resolver() {
46
- const product = await this.getProduct();
47
- if (product.status === false) {
48
- this.setError('product_id', 'This product is not available');
49
- }
50
- return product.product_id;
51
- }
52
- ]
53
- },
54
- {
55
- key: 'product_uuid',
56
- resolvers: [
57
- async function resolver() {
58
- const product = await this.getProduct();
59
- return product.uuid;
60
- }
61
- ]
62
- },
63
- {
64
- key: 'product_sku',
65
- resolvers: [
66
- async function resolver() {
67
- const product = await this.getProduct();
68
- return product.sku;
69
- }
70
- ]
71
- },
72
- {
73
- key: 'group_id',
74
- resolvers: [
75
- async function resolver() {
76
- const product = await this.getProduct();
77
- return parseInt(product.group_id, 10) ?? null;
78
- }
79
- ],
80
- dependencies: ['product_id']
81
- },
82
- {
83
- key: 'category_id',
84
- resolvers: [
85
- async function resolver() {
86
- const product = await this.getProduct();
87
- return product.category_id
88
- ? parseInt(product.category_id, 10)
89
- : null;
90
- }
91
- ],
92
- dependencies: ['product_id']
93
- },
94
- {
95
- key: 'product_name',
96
- resolvers: [
97
- async function resolver() {
98
- const product = await this.getProduct();
99
- return product.name ?? null;
100
- }
101
- ],
102
- dependencies: ['product_id']
103
- },
104
- {
105
- key: 'thumbnail',
106
- resolvers: [
107
- async function resolver() {
108
- const product = await this.getProduct();
109
- if (product.thumb_image) {
110
- return product.thumb_image;
111
- } else {
112
- return null;
113
- }
114
- }
115
- ],
116
- dependencies: ['product_id']
117
- },
118
- {
119
- key: 'product_weight',
120
- resolvers: [
121
- async function resolver() {
122
- const product = await this.getProduct();
123
- return parseFloat(product.weight) ?? null;
124
- }
125
- ],
126
- dependencies: ['product_id']
127
- },
128
- {
129
- key: 'product_price',
130
- resolvers: [
131
- async function resolver() {
132
- const product = await this.getProduct();
133
- return toPrice(product.price);
134
- }
135
- ],
136
- dependencies: ['product_id']
137
- },
138
- {
139
- key: 'product_price_incl_tax',
140
- resolvers: [
141
- async function resolver() {
142
- const taxAmount = calculateTaxAmount(
143
- this.getData('tax_percent'),
144
- this.getData('product_price'),
145
- 1
146
- );
147
- return toPrice(this.getData('product_price')) + taxAmount;
148
- }
149
- ],
150
- dependencies: ['product_price', 'tax_percent']
151
- },
152
- {
153
- key: 'qty',
154
- resolvers: [
155
- async function resolver() {
156
- const triggeredField = this.getTriggeredField();
157
- const requestedValue = this.getRequestedValue();
158
- const qty =
159
- triggeredField === 'qty' ? requestedValue : this.getData('qty');
160
- const product = await this.getProduct();
161
- if (product.manage_stock === true && product.qty < 1) {
162
- this.setError('qty', 'This item is out of stock');
163
- } else if (product.manage_stock === true && product.qty < qty) {
164
- this.setError('qty', 'We do not have enough stock');
165
- }
109
+ }
110
+ ],
111
+ dependencies: ['product_id']
112
+ },
113
+ {
114
+ key: 'product_weight',
115
+ resolvers: [
116
+ async function resolver() {
117
+ const product = await this.getProduct();
118
+ return parseFloat(product.weight) ?? null;
119
+ }
120
+ ],
121
+ dependencies: ['product_id']
122
+ },
123
+ {
124
+ key: 'tax_class_id',
125
+ resolvers: [
126
+ async function resolver() {
127
+ const product = await this.getProduct();
128
+ return product.tax_class ?? null;
129
+ }
130
+ ],
131
+ dependencies: ['product_id']
132
+ },
166
133
 
167
- return parseInt(qty, 10) ?? null;
168
- }
169
- ]
170
- },
171
- {
172
- key: 'final_price',
173
- resolvers: [
174
- async function resolver() {
175
- return toPrice(this.getData('product_price')); // TODO This price should include the custom option price
176
- }
177
- ],
178
- dependencies: ['product_price']
179
- },
180
- {
181
- key: 'final_price_incl_tax',
182
- resolvers: [
183
- async function resolver() {
134
+ {
135
+ key: 'product_price',
136
+ resolvers: [
137
+ async function resolver() {
138
+ const product = await this.getProduct();
139
+ const catalogPriceInclTax = getConfig(
140
+ 'pricing.tax.price_including_tax',
141
+ false
142
+ );
143
+ if (catalogPriceInclTax) {
184
144
  const taxAmount = calculateTaxAmount(
185
145
  this.getData('tax_percent'),
186
- this.getData('final_price'),
187
- 1
146
+ product.price,
147
+ 1,
148
+ true
188
149
  );
189
- return toPrice(this.getData('final_price')) + taxAmount;
190
- }
191
- ],
192
- dependencies: ['final_price', 'tax_percent']
193
- },
194
- {
195
- key: 'sub_total',
196
- resolvers: [
197
- async function resolver() {
198
- return toPrice(this.getData('final_price') * this.getData('qty'));
150
+ return toPrice(product.price - taxAmount);
151
+ } else {
152
+ return toPrice(product.price);
199
153
  }
200
- ],
201
- dependencies: ['final_price', 'qty']
202
- },
203
- {
204
- key: 'total',
205
- resolvers: [
206
- async function resolver() {
207
- return toPrice(
208
- this.getData('final_price') * this.getData('qty') +
209
- this.getData('tax_amount')
154
+ }
155
+ ],
156
+ dependencies: ['product_id', 'tax_percent']
157
+ },
158
+ {
159
+ key: 'tax_amount_before_discount',
160
+ resolvers: [
161
+ async function resolver() {
162
+ const catalogPriceInclTax = getConfig(
163
+ 'pricing.tax.price_including_tax',
164
+ false
165
+ );
166
+ if (catalogPriceInclTax) {
167
+ return calculateTaxAmount(
168
+ this.getData('tax_percent'),
169
+ this.getData('product_price_incl_tax'),
170
+ this.getData('qty'),
171
+ true
210
172
  );
211
- }
212
- ],
213
- dependencies: ['final_price', 'qty', 'tax_amount']
214
- },
215
- {
216
- key: 'tax_class_id',
217
- resolvers: [
218
- async function resolver() {
219
- const product = await this.getProduct();
220
- return product.tax_class ?? null;
221
- }
222
- ],
223
- dependencies: ['product_id']
224
- },
225
- {
226
- key: 'tax_percent',
227
- resolvers: [
228
- async function resolver() {
229
- if (!this.getData('tax_class_id')) {
230
- return 0;
231
- } else {
232
- const taxClass = await select()
233
- .from('tax_class')
234
- .where('tax_class_id', '=', this.getData('tax_class_id'))
235
- .load(pool);
236
- if (!taxClass) {
237
- return 0;
238
- } else {
239
- const baseCalculationAddress = await getSetting(
240
- 'baseCalculationAddress',
241
- 'shippingAddress'
242
- );
243
- if (baseCalculationAddress === 'storeAddress') {
244
- const percentage = getTaxPercent(
245
- await getTaxRates(
246
- this.getData('tax_class_id'),
247
- await getSetting('storeCountry', null),
248
- await getSetting('storeProvince', null),
249
- await getSetting('storePostalCode', null)
250
- )
251
- );
252
- return percentage;
253
- } else {
254
- const cart = this.getCart();
255
- const addressId =
256
- baseCalculationAddress === 'billingAddress'
257
- ? cart.getData('billing_address_id')
258
- : cart.getData('shipping_address_id');
259
-
260
- if (!addressId) {
261
- return 0;
262
- } else {
263
- const address = await select()
264
- .from('cart_address')
265
- .where('cart_address_id', '=', addressId)
266
- .load(pool);
267
- if (!address) {
268
- return 0;
269
- } else {
270
- const percentage = getTaxPercent(
271
- await getTaxRates(
272
- this.getData('tax_class_id'),
273
- address.country,
274
- address.province,
275
- address.postcode
276
- )
277
- );
278
- return percentage;
279
- }
280
- }
281
- }
282
- }
283
- }
284
- }
285
- ],
286
- dependencies: ['cart_id', 'tax_class_id']
287
- },
288
- {
289
- key: 'tax_amount',
290
- resolvers: [
291
- async function resolver() {
292
- const discountAmount = this.getData('discount_amount');
293
- const finalPrice = this.getData('final_price');
294
-
295
- // The discount amount is total (all quantity), we need to Get the final price after discount per unit
296
- const finalPricePerUnit =
297
- finalPrice - discountAmount / this.getData('qty');
173
+ } else {
298
174
  return calculateTaxAmount(
299
175
  this.getData('tax_percent'),
300
- finalPricePerUnit,
176
+ this.getData('product_price'),
301
177
  this.getData('qty')
302
178
  );
303
179
  }
304
- ],
305
- dependencies: ['tax_percent', 'final_price', 'qty', 'discount_amount']
306
- },
307
- {
308
- key: 'variant_group_id',
309
- resolvers: [
310
- async function resolver() {
311
- const product = await this.getProduct();
312
- return product.variant_group_id ?? null;
313
- }
314
- ],
315
- dependencies: ['product_id']
316
- },
317
- {
318
- key: 'variant_options',
319
- resolvers: [
320
- async function resolver() {
321
- const product = await this.getProduct();
322
- if (product.variant_group_id) {
323
- const group = await select('attribute_one')
324
- .select('attribute_two')
325
- .select('attribute_three')
326
- .select('attribute_four')
327
- .select('attribute_five')
328
- .from('variant_group')
329
- .where('variant_group_id', '=', product.variant_group_id)
330
- .load(pool);
331
- if (!group) {
332
- return null;
333
- } else {
334
- const query = select('a.attribute_code')
335
- .select('a.attribute_name')
336
- .select('a.attribute_id')
337
- .select('o.option_id')
338
- .select('o.option_text')
339
- .from('attribute', 'a');
340
- query
341
- .innerJoin('product_attribute_value_index', 'o')
342
- .on('a.attribute_id', '=', 'o.attribute_id');
343
- query.where('o.product_id', '=', product.product_id).and(
344
- 'a.attribute_id',
345
- 'IN',
346
- Object.values(group).filter((v) => v != null)
347
- );
180
+ }
181
+ ],
182
+ dependencies: [
183
+ 'tax_percent',
184
+ 'product_price',
185
+ 'product_price_incl_tax',
186
+ 'qty'
187
+ ]
188
+ },
189
+ {
190
+ key: 'tax_amount',
191
+ resolvers: [
192
+ async function resolver() {
193
+ const priceIncludingTax = getConfig(
194
+ 'pricing.tax.price_including_tax',
195
+ false
196
+ );
197
+ const discountAmount = this.getData('discount_amount');
198
+ const discountAmountPerUnit = discountAmount / this.getData('qty');
199
+ const finalPricePerUnit = priceIncludingTax
200
+ ? this.getData('final_price_incl_tax') - discountAmountPerUnit
201
+ : this.getData('final_price') - discountAmountPerUnit;
202
+ return calculateTaxAmount(
203
+ this.getData('tax_percent'),
204
+ finalPricePerUnit,
205
+ this.getData('qty'),
206
+ priceIncludingTax
207
+ );
208
+ }
209
+ ],
210
+ dependencies: [
211
+ 'discount_amount',
212
+ 'tax_percent',
213
+ 'final_price',
214
+ 'final_price_incl_tax',
215
+ 'qty'
216
+ ]
217
+ },
218
+ {
219
+ key: 'product_price_incl_tax',
220
+ resolvers: [
221
+ async function resolver() {
222
+ const product = await this.getProduct();
223
+ const catalogPriceInclTax = getConfig(
224
+ 'pricing.tax.price_including_tax',
225
+ false
226
+ );
348
227
 
349
- return JSON.stringify(await query.execute(pool));
350
- }
351
- } else {
352
- return null;
353
- }
228
+ if (catalogPriceInclTax) {
229
+ return toPrice(product.price);
230
+ } else {
231
+ const taxAmount = calculateTaxAmount(
232
+ this.getData('tax_percent'),
233
+ this.getData('product_price'),
234
+ 1
235
+ );
236
+ return toPrice(this.getData('product_price') + taxAmount);
354
237
  }
355
- ],
356
- dependencies: ['variant_group_id']
357
- },
358
- {
359
- key: 'productUrl',
360
- resolvers: [
361
- async function resolver() {
362
- const product = await this.getProduct();
363
- if (!this.getData('product_id')) {
364
- return null;
365
- }
366
- const urlRewrite = await select()
367
- .from('url_rewrite')
368
- .where('entity_uuid', '=', product.uuid)
369
- .and('entity_type', '=', 'product')
370
- .load(pool);
371
- if (!urlRewrite) {
372
- return buildUrl('productView', {
373
- uuid: product.uuid
374
- });
375
- } else {
376
- return urlRewrite.request_path;
377
- }
238
+ }
239
+ ],
240
+ dependencies: ['product_price', 'tax_percent']
241
+ },
242
+ {
243
+ key: 'qty',
244
+ resolvers: [
245
+ async function resolver() {
246
+ const triggeredField = this.getTriggeredField();
247
+ const requestedValue = this.getRequestedValue();
248
+ const qty =
249
+ triggeredField === 'qty' ? requestedValue : this.getData('qty');
250
+ const product = await this.getProduct();
251
+ if (product.manage_stock === true && product.qty < 1) {
252
+ this.setError('qty', 'This item is out of stock');
253
+ } else if (product.manage_stock === true && product.qty < qty) {
254
+ this.setError('qty', 'We do not have enough stock');
378
255
  }
379
- ],
380
- dependencies: ['product_id']
381
- },
382
- {
383
- key: 'removeUrl',
384
- resolvers: [
385
- async function resolver() {
386
- if (this.getData('cart_item_id')) {
387
- return buildUrl('removeMineCartItem', {
388
- item_id: this.getData('uuid')
389
- });
390
- } else {
391
- return undefined;
392
- }
256
+
257
+ return parseInt(qty, 10) ?? null;
258
+ }
259
+ ]
260
+ },
261
+ {
262
+ key: 'final_price',
263
+ resolvers: [
264
+ async function resolver() {
265
+ return this.getData('product_price'); // TODO This price should include the custom option price
266
+ }
267
+ ],
268
+ dependencies: ['product_price']
269
+ },
270
+ {
271
+ key: 'final_price_incl_tax',
272
+ resolvers: [
273
+ async function resolver() {
274
+ return this.getData('product_price_incl_tax');
275
+ }
276
+ ],
277
+ dependencies: ['product_price_incl_tax']
278
+ },
279
+ {
280
+ key: 'line_total',
281
+ resolvers: [
282
+ async function resolver() {
283
+ return this.getData('final_price') * this.getData('qty');
284
+ }
285
+ ],
286
+ dependencies: ['final_price', 'qty']
287
+ },
288
+ {
289
+ key: 'line_total_incl_tax',
290
+ resolvers: [
291
+ async function resolver() {
292
+ return this.getData('final_price_incl_tax') * this.getData('qty');
293
+ }
294
+ ],
295
+ dependencies: ['final_price_incl_tax', 'qty']
296
+ },
297
+ {
298
+ key: 'variant_group_id',
299
+ resolvers: [
300
+ async function resolver() {
301
+ const product = await this.getProduct();
302
+ return product.variant_group_id ?? null;
303
+ }
304
+ ],
305
+ dependencies: ['product_id']
306
+ },
307
+ {
308
+ key: 'removeUrl',
309
+ resolvers: [
310
+ async function resolver() {
311
+ if (this.getData('cart_item_id')) {
312
+ return buildUrl('removeMineCartItem', {
313
+ item_id: this.getData('uuid')
314
+ });
315
+ } else {
316
+ return undefined;
393
317
  }
394
- ],
395
- dependencies: ['cart_item_id', 'uuid']
396
- }
397
- ];
398
- };
318
+ }
319
+ ],
320
+ dependencies: ['cart_item_id', 'uuid']
321
+ }
322
+ ]);
323
+ return newFields;
324
+ };