From 6d0422437deaa80877d121ebf2dcf4b1cbced1e9 Mon Sep 17 00:00:00 2001 From: tkostuch Date: Fri, 31 Jan 2020 08:56:16 +0100 Subject: [PATCH 1/3] add lazy create cart token --- CHANGELOG.md | 1 + config/default.json | 1 - .../cart/store/actions/connectActions.ts | 33 +++++++------- .../modules/cart/store/actions/itemActions.ts | 1 + .../cart/store/actions/synchronizeActions.ts | 4 +- .../test/unit/store/connectActions.spec.ts | 44 ++++++++++++++++--- .../cart/test/unit/store/itemActions.spec.ts | 3 +- .../unit/store/synchronizeActions.spec.ts | 2 +- core/modules/checkout/components/Payment.ts | 6 +++ .../checkout/store/checkout/actions.ts | 2 +- .../test/unit/store/checkout/actions.spec.ts | 8 ++-- core/modules/order/store/actions.ts | 2 +- .../order/test/unit/store/actions.spec.ts | 4 +- core/modules/user/store/actions.ts | 2 +- .../user/test/unit/store/actions.spec.ts | 2 +- docs/guide/basics/configuration.md | 7 --- docs/guide/cookbook/setup.md | 1 - .../components/InstantCheckout.vue | 2 +- .../core/blocks/Microcart/Microcart.vue | 2 +- 19 files changed, 81 insertions(+), 46 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a45c442775..75d587759d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - Add `ProductPrice` component with bundleOptions and customOptions prices - @gibkigonzo (#3978) +- Add lazy create cart token - @gibkigonzo (#3994) ### Changed / Improved - Set cache tag when loading a category - @haelbichalex (#3940) diff --git a/config/default.json b/config/default.json index c11151aa3b..5399fe6cd8 100644 --- a/config/default.json +++ b/config/default.json @@ -270,7 +270,6 @@ "width": 150, "height": 150 }, - "bypassCartLoaderForAuthorizedUsers": true, "serverMergeByDefault": true, "serverSyncCanRemoveLocalItems": false, "serverSyncCanModifyLocalItems": false, diff --git a/core/modules/cart/store/actions/connectActions.ts b/core/modules/cart/store/actions/connectActions.ts index d6ff2c9072..257e5bbe56 100644 --- a/core/modules/cart/store/actions/connectActions.ts +++ b/core/modules/cart/store/actions/connectActions.ts @@ -9,28 +9,20 @@ const connectActions = { toggleMicrocart ({ commit }) { commit(types.CART_TOGGLE_MICROCART) }, - async clear ({ commit, dispatch, getters }, options = { recreateAndSyncCart: true }) { + async clear ({ commit, dispatch, getters }) { await commit(types.CART_LOAD_CART, []) - if (options.recreateAndSyncCart && getters.isCartSyncEnabled) { - await commit(types.CART_LOAD_CART_SERVER_TOKEN, null) - await commit(types.CART_SET_ITEMS_HASH, null) - await dispatch('connect', { guestCart: !config.orders.directBackendSync }) // guest cart when not using directBackendSync because when the order hasn't been passed to Magento yet it will repopulate your cart - } + await commit(types.CART_LOAD_CART_SERVER_TOKEN, null) + await commit(types.CART_SET_ITEMS_HASH, null) }, async disconnect ({ commit }) { commit(types.CART_LOAD_CART_SERVER_TOKEN, null) }, async authorize ({ dispatch, getters }) { - const coupon = getters.getCoupon.code - const lastCartBypassTs = await StorageManager.get('user').getItem('last-cart-bypass-ts') - const timeBypassCart = config.orders.directBackendSync || (Date.now() - lastCartBypassTs) >= (1000 * 60 * 24) - - if (!config.cart.bypassCartLoaderForAuthorizedUsers || timeBypassCart) { - await dispatch('connect', { guestCart: false }) + await dispatch('connect', { guestCart: false }) - if (!getters.getCoupon) { - await dispatch('applyCoupon', coupon) - } + const coupon = getters.getCoupon.code + if (!getters.getCoupon) { + await dispatch('applyCoupon', coupon) } }, async connect ({ getters, dispatch, commit }, { guestCart = false, forceClientState = false }) { @@ -53,6 +45,17 @@ const connectActions = { Logger.warn('Cart sync is disabled by the config', 'cart')() return createDiffLog() + }, + /** + * Create cart token when there are products in cart and we don't have token already + */ + async create ({ dispatch, getters }) { + const storedItems = getters['getCartItems'] || [] + const cartToken = getters['getCartToken'] + if (storedItems.length && !cartToken) { + Logger.info('Creating server cart token', 'cart')() + await dispatch('connect', { guestCart: false }) + } } } diff --git a/core/modules/cart/store/actions/itemActions.ts b/core/modules/cart/store/actions/itemActions.ts index 3cc36d2f08..ec8e5399cc 100644 --- a/core/modules/cart/store/actions/itemActions.ts +++ b/core/modules/cart/store/actions/itemActions.ts @@ -80,6 +80,7 @@ const itemActions = { productIndex++ } } + await dispatch('create') if (getters.isCartSyncEnabled && getters.isCartConnected && !forceServerSilence) { return dispatch('sync', { forceClientState: true }) } diff --git a/core/modules/cart/store/actions/synchronizeActions.ts b/core/modules/cart/store/actions/synchronizeActions.ts index fc1fb9210d..18d628265d 100644 --- a/core/modules/cart/store/actions/synchronizeActions.ts +++ b/core/modules/cart/store/actions/synchronizeActions.ts @@ -36,10 +36,8 @@ const synchronizeActions = { Logger.info('Cart token received from cache.', 'cache', token)() Logger.info('Syncing cart with the server.', 'cart')() dispatch('sync', { forceClientState, dryRun: !serverMergeByDefault }) - } else { - Logger.info('Creating server cart token', 'cart')() - await dispatch('connect', { guestCart: false }) } + await dispatch('create') }, /** @deprecated backward compatibility only */ async serverPull ({ dispatch }, { forceClientState = false, dryRun = false }) { diff --git a/core/modules/cart/test/unit/store/connectActions.spec.ts b/core/modules/cart/test/unit/store/connectActions.spec.ts index 107e52198e..08961fdf70 100644 --- a/core/modules/cart/test/unit/store/connectActions.spec.ts +++ b/core/modules/cart/test/unit/store/connectActions.spec.ts @@ -63,7 +63,6 @@ describe('Cart connectActions', () => { expect(contextMock.commit).toHaveBeenNthCalledWith(1, types.CART_LOAD_CART, []); expect(contextMock.commit).toHaveBeenNthCalledWith(2, types.CART_LOAD_CART_SERVER_TOKEN, null); expect(contextMock.commit).toHaveBeenNthCalledWith(3, types.CART_SET_ITEMS_HASH, null); - expect(contextMock.dispatch).toBeCalledWith('connect', { guestCart: true }); }) it('disconnects cart', async () => { @@ -85,10 +84,6 @@ describe('Cart connectActions', () => { } }) - config.cart = { - bypassCartLoaderForAuthorizedUsers: false - } - await (cartActions as any).authorize(contextMock) expect(contextMock.dispatch).toHaveBeenNthCalledWith(1, 'connect', { guestCart: false }); }) @@ -136,4 +131,43 @@ describe('Cart connectActions', () => { expect(contextMock.commit).toBeCalledWith(types.CART_UPDATE_BYPASS_COUNTER, { counter: 1 }) expect(contextMock.dispatch).toBeCalledWith('connect', { guestCart: true }) }) + it('Create cart token when there are products in cart and we don\'t have token already', async () => { + const contextMock = { + commit: jest.fn(), + dispatch: jest.fn(), + getters: { getCartItems: [{id: 1}], getCartToken: '' } + }; + + const wrapper = (actions: any) => actions.create(contextMock); + + await wrapper(cartActions); + + expect(contextMock.dispatch).toBeCalledWith('connect', {guestCart: false}); + }) + it('doesn\'t create cart token when there are NO products in cart', async () => { + const contextMock = { + commit: jest.fn(), + dispatch: jest.fn(), + getters: { getCartItems: [], getCartToken: '' } + }; + + const wrapper = (actions: any) => actions.create(contextMock); + + await wrapper(cartActions); + + expect(contextMock.dispatch).toHaveBeenCalledTimes(0); + }) + it('doesn\'t create cart token when there are products in cart but we have token already', async () => { + const contextMock = { + commit: jest.fn(), + dispatch: jest.fn(), + getters: { getCartItems: [{id: 1}], getCartToken: 'xyz' } + }; + + const wrapper = (actions: any) => actions.create(contextMock); + + await wrapper(cartActions); + + expect(contextMock.dispatch).toHaveBeenCalledTimes(0); + }) }) diff --git a/core/modules/cart/test/unit/store/itemActions.spec.ts b/core/modules/cart/test/unit/store/itemActions.spec.ts index dda55f99d1..2dfffbea87 100644 --- a/core/modules/cart/test/unit/store/itemActions.spec.ts +++ b/core/modules/cart/test/unit/store/itemActions.spec.ts @@ -145,7 +145,8 @@ describe('Cart itemActions', () => { await (cartActions as any).addItems(contextMock, { productsToAdd: [product] }) expect(contextMock.commit).toBeCalledWith(types.CART_ADD_ITEM, { product: { ...product, onlineStockCheckid: 1 } }) expect(contextMock.dispatch).toHaveBeenNthCalledWith(1, 'checkProductStatus', { product }) - expect(contextMock.dispatch).toHaveBeenNthCalledWith(2, 'sync', { forceClientState: true }) + expect(contextMock.dispatch).toHaveBeenNthCalledWith(2, 'create') + expect(contextMock.dispatch).toHaveBeenNthCalledWith(3, 'sync', { forceClientState: true }) }) it('removes item from the cart', async () => { diff --git a/core/modules/cart/test/unit/store/synchronizeActions.spec.ts b/core/modules/cart/test/unit/store/synchronizeActions.spec.ts index 918acc9785..d137051a96 100644 --- a/core/modules/cart/test/unit/store/synchronizeActions.spec.ts +++ b/core/modules/cart/test/unit/store/synchronizeActions.spec.ts @@ -119,7 +119,7 @@ describe('Cart synchronizeActions', () => { await (cartActions as any).synchronizeCart(contextMock, { forceClientState: false }); expect(contextMock.commit).not.toHaveBeenNthCalledWith(1, types.CART_SET_ITEMS_HASH, 'hash-token') expect(contextMock.commit).not.toHaveBeenNthCalledWith(2, types.CART_LOAD_CART_SERVER_TOKEN, 'hash-token') - expect(contextMock.dispatch).toBeCalledWith('connect', { guestCart: false }) + expect(contextMock.dispatch).toBeCalledWith('create') }) it('merges current cart', async () => { diff --git a/core/modules/checkout/components/Payment.ts b/core/modules/checkout/components/Payment.ts index c33f780519..f22cf22a29 100644 --- a/core/modules/checkout/components/Payment.ts +++ b/core/modules/checkout/components/Payment.ts @@ -1,6 +1,7 @@ import { mapState, mapGetters } from 'vuex' import RootState from '@vue-storefront/core/types/RootState' import toString from 'lodash-es/toString' +import debounce from 'lodash-es/debounce' const Countries = require('@vue-storefront/i18n/resource/countries.json') export const Payment = { @@ -76,6 +77,11 @@ export const Payment = { handler () { this.useGenerateInvoice() } + }, + paymentMethods: { + handler: debounce(function () { + this.changePaymentMethod() + }, 500) } }, methods: { diff --git a/core/modules/checkout/store/checkout/actions.ts b/core/modules/checkout/store/checkout/actions.ts index e97337a814..bd26d0807d 100644 --- a/core/modules/checkout/store/checkout/actions.ts +++ b/core/modules/checkout/store/checkout/actions.ts @@ -11,7 +11,7 @@ const actions: ActionTree = { const result = await dispatch('order/placeOrder', order, { root: true }) if (!result.resultCode || result.resultCode === 200) { await dispatch('updateOrderTimestamp') - await dispatch('cart/clear', { recreateAndSyncCart: true }, { root: true }) + await dispatch('cart/clear', null, { root: true }) await dispatch('dropPassword') } } catch (e) { diff --git a/core/modules/checkout/test/unit/store/checkout/actions.spec.ts b/core/modules/checkout/test/unit/store/checkout/actions.spec.ts index cba2de367e..273f6bbadc 100644 --- a/core/modules/checkout/test/unit/store/checkout/actions.spec.ts +++ b/core/modules/checkout/test/unit/store/checkout/actions.spec.ts @@ -43,7 +43,7 @@ describe('Checkout actions', () => { expect(mockContext.dispatch).toHaveBeenCalledTimes(4); expect(mockContext.dispatch).toHaveBeenNthCalledWith(1, 'order/placeOrder', order, { root: true }); expect(mockContext.dispatch).toHaveBeenNthCalledWith(2, 'updateOrderTimestamp'); - expect(mockContext.dispatch).toHaveBeenNthCalledWith(3, 'cart/clear', { recreateAndSyncCart: true }, { root: true }); + expect(mockContext.dispatch).toHaveBeenNthCalledWith(3, 'cart/clear', null, { root: true }); expect(mockContext.dispatch).toHaveBeenNthCalledWith(4, 'dropPassword'); }); @@ -54,7 +54,7 @@ describe('Checkout actions', () => { expect(mockContext.dispatch).toHaveBeenCalledTimes(4); expect(mockContext.dispatch).toHaveBeenNthCalledWith(1, 'order/placeOrder', order, { root: true }); expect(mockContext.dispatch).toHaveBeenNthCalledWith(2, 'updateOrderTimestamp'); - expect(mockContext.dispatch).toHaveBeenNthCalledWith(3, 'cart/clear', { recreateAndSyncCart: true }, { root: true }); + expect(mockContext.dispatch).toHaveBeenNthCalledWith(3, 'cart/clear', null, { root: true }); expect(mockContext.dispatch).toHaveBeenNthCalledWith(4, 'dropPassword'); }); @@ -65,7 +65,7 @@ describe('Checkout actions', () => { expect(mockContext.dispatch).toHaveBeenCalledTimes(1); expect(mockContext.dispatch).toHaveBeenNthCalledWith(1, 'order/placeOrder', order, { root: true }); expect(mockContext.dispatch).not.toHaveBeenNthCalledWith(2, 'updateOrderTimestamp'); - expect(mockContext.dispatch).not.toHaveBeenNthCalledWith(3, 'cart/clear', { recreateAndSyncCart: true }, { root: true }); + expect(mockContext.dispatch).not.toHaveBeenNthCalledWith(3, 'cart/clear', null, { root: true }); expect(mockContext.dispatch).not.toHaveBeenNthCalledWith(4, 'dropPassword'); }); @@ -76,7 +76,7 @@ describe('Checkout actions', () => { expect(mockContext.dispatch).toHaveBeenCalledTimes(1); expect(mockContext.dispatch).toHaveBeenNthCalledWith(1, 'order/placeOrder', order, { root: true }); expect(mockContext.dispatch).not.toHaveBeenNthCalledWith(2, 'updateOrderTimestamp'); - expect(mockContext.dispatch).not.toHaveBeenNthCalledWith(3, 'cart/clear', { recreateAndSyncCart: true }, { root: true }); + expect(mockContext.dispatch).not.toHaveBeenNthCalledWith(3, 'cart/clear', null, { root: true }); expect(mockContext.dispatch).not.toHaveBeenNthCalledWith(4, 'dropPassword'); expect(Logger.error).toHaveBeenCalled(); }); diff --git a/core/modules/order/store/actions.ts b/core/modules/order/store/actions.ts index b680cda15b..4c141a7175 100644 --- a/core/modules/order/store/actions.ts +++ b/core/modules/order/store/actions.ts @@ -34,7 +34,7 @@ const actions: ActionTree = { EventBus.$emit('order-before-placed', { order: preparedOrder }) const order = orderHooksExecutors.beforePlaceOrder(preparedOrder) - if (!config.orders.directBackendSync || !isOnline()) { + if (!isOnline()) { dispatch('enqueueOrder', { newOrder: order }) EventBus.$emit('order-after-placed', { order }) orderHooksExecutors.beforePlaceOrder({ order, task: { resultCode: 200 } }) diff --git a/core/modules/order/test/unit/store/actions.spec.ts b/core/modules/order/test/unit/store/actions.spec.ts index 1955db08ae..47401ac81c 100644 --- a/core/modules/order/test/unit/store/actions.spec.ts +++ b/core/modules/order/test/unit/store/actions.spec.ts @@ -980,7 +980,7 @@ describe('Order actions', () => { expect(contextMock.commit).not.toBeCalledWith(types.ORDER_ADD_SESSION_STAMPS); }) - it('should dispatch enqueueOrder', async () => { + it('should dispatch processOrder', async () => { const contextMock = createContextMock({ getters: { getSessionOrderHashes: 'current-order-hash' } }); @@ -1036,7 +1036,7 @@ describe('Order actions', () => { await (orderActions as any).placeOrder(contextMock, order) - expect(contextMock.dispatch).toBeCalledWith('enqueueOrder', { newOrder: newOrder }) + expect(contextMock.dispatch).toBeCalledWith('processOrder', { newOrder: newOrder, currentOrderHash }) }) it('should dispatch processOrder', async () => { diff --git a/core/modules/user/store/actions.ts b/core/modules/user/store/actions.ts index 6e5af68765..d5899743eb 100644 --- a/core/modules/user/store/actions.ts +++ b/core/modules/user/store/actions.ts @@ -226,7 +226,7 @@ const actions: ActionTree = { await dispatch('cart/disconnect', {}, { root: true }) await dispatch('clearCurrentUser') EventBus.$emit('user-after-logout') - await dispatch('cart/clear', { recreateAndSyncCart: true }, { root: true }) + await dispatch('cart/clear', null, { root: true }) if (!silent) { await dispatch('notification/spawnNotification', { diff --git a/core/modules/user/test/unit/store/actions.spec.ts b/core/modules/user/test/unit/store/actions.spec.ts index c1718ec3be..f4cee6dd77 100644 --- a/core/modules/user/test/unit/store/actions.spec.ts +++ b/core/modules/user/test/unit/store/actions.spec.ts @@ -414,7 +414,7 @@ describe('User actions', () => { expect(contextMock.commit).toBeCalledWith(types.USER_END_SESSION) expect(contextMock.dispatch).toHaveBeenNthCalledWith(1, 'cart/disconnect', {}, {root: true}) expect(contextMock.dispatch).toHaveBeenNthCalledWith(2, 'clearCurrentUser') - expect(contextMock.dispatch).toHaveBeenNthCalledWith(3, 'cart/clear', {recreateAndSyncCart: true}, {root: true}) + expect(contextMock.dispatch).toHaveBeenNthCalledWith(3, 'cart/clear', null, {root: true}) expect(contextMock.dispatch).toHaveBeenNthCalledWith(4, 'notification/spawnNotification', { type: 'success', message: "You're logged out", diff --git a/docs/guide/basics/configuration.md b/docs/guide/basics/configuration.md index 4382698a95..64c5fa9a0d 100644 --- a/docs/guide/basics/configuration.md +++ b/docs/guide/basics/configuration.md @@ -328,13 +328,6 @@ Starting with Vue Storefront 1.7, we added a configuration option `config.entiti ## Cart -```json -"cart": { - "bypassCartLoaderForAuthorizedUsers": true, -``` - -The cart-loader bypass feature is there because we're posting orders to Magento asynchronously. It may happen that directly after placing an order, the Magento’s user still has the same quote ID, and after browsing through the VS store, old items will be restored to the shopping cart. Now you can disable this behavior by setting `bypassCartLoaderForAuthorizedUsers` option to `false` - ```json "cart": { "serverMergeByDefault": true, diff --git a/docs/guide/cookbook/setup.md b/docs/guide/cookbook/setup.md index 412e72d922..24c2e4fdf4 100644 --- a/docs/guide/cookbook/setup.md +++ b/docs/guide/cookbook/setup.md @@ -1092,7 +1092,6 @@ At [`vue-storefront/config/default.json`](https://github.com/DivanteLtd/vue-stor } }, "cart": { - "bypassCartLoaderForAuthorizedUsers": true, "serverMergeByDefault": true, "serverSyncCanRemoveLocalItems": false, "serverSyncCanModifyLocalItems": false, diff --git a/src/modules/instant-checkout/components/InstantCheckout.vue b/src/modules/instant-checkout/components/InstantCheckout.vue index 6987182579..9060feaffe 100644 --- a/src/modules/instant-checkout/components/InstantCheckout.vue +++ b/src/modules/instant-checkout/components/InstantCheckout.vue @@ -149,7 +149,7 @@ export default { this.$store.dispatch('checkout/setThankYouPage', true) this.$store.commit('ui/setMicrocart', false) this.$router.push(this.localizedRoute('/checkout')) - this.$store.dispatch('cart/clear', { recreateAndSyncCart: true }, {root: true}) + this.$store.dispatch('cart/clear', null, {root: true}) } }) }) diff --git a/src/themes/default/components/core/blocks/Microcart/Microcart.vue b/src/themes/default/components/core/blocks/Microcart/Microcart.vue index fdb3d257b6..dff82a60cb 100644 --- a/src/themes/default/components/core/blocks/Microcart/Microcart.vue +++ b/src/themes/default/components/core/blocks/Microcart/Microcart.vue @@ -227,7 +227,7 @@ export default { action1: { label: i18n.t('Cancel'), action: 'close' }, action2: { label: i18n.t('OK'), action: async () => { - await this.$store.dispatch('cart/clear', { recreateAndSyncCart: false }) // just clear the items without sync + await this.$store.dispatch('cart/clear') // just clear the items without sync await this.$store.dispatch('cart/sync', { forceClientState: true }) } }, From 25d2e2aca1e141b208ef4a4f44ae366d54344d09 Mon Sep 17 00:00:00 2001 From: tkostuch Date: Fri, 31 Jan 2020 09:17:32 +0100 Subject: [PATCH 2/3] add products quantity only when token is created --- CHANGELOG.md | 1 + .../cart/helpers/createCartItemForUpdate.ts | 4 ++-- .../cart/store/actions/connectActions.ts | 2 +- .../cart/store/actions/mergeActions.ts | 23 ++++++++++--------- .../cart/store/actions/synchronizeActions.ts | 5 ++-- .../test/unit/store/connectActions.spec.ts | 2 +- .../cart/test/unit/store/mergeActions.spec.ts | 4 ++-- .../unit/store/synchronizeActions.spec.ts | 3 ++- 8 files changed, 24 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 75d587759d..e3b8cf86a8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,6 +34,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fixed sku attribute is missing on compare page - @gibkigonzo (#4036) - Fixed z-index for aside in compare list - @gibkigonzo (#4037) - Disable checking max quantity when manage stock is set to false - @gibkigonzo (#4038) +- Add products quantity only when token is created - @gibkigonzo (#4017) ## [1.11.0] - 2019.12.20 diff --git a/core/modules/cart/helpers/createCartItemForUpdate.ts b/core/modules/cart/helpers/createCartItemForUpdate.ts index 8380fa896c..6c0224edae 100644 --- a/core/modules/cart/helpers/createCartItemForUpdate.ts +++ b/core/modules/cart/helpers/createCartItemForUpdate.ts @@ -1,11 +1,11 @@ import config from 'config' import CartItem from '@vue-storefront/core/modules/cart/types/CartItem'; -const createCartItemForUpdate = (clientItem: CartItem, serverItem: any, updateIds: boolean = false): CartItem => { +const createCartItemForUpdate = (clientItem: CartItem, serverItem: any, updateIds: boolean = false, mergeQty: boolean = false): CartItem => { const sku = clientItem.parentSku && config.cart.setConfigurableProductOptions ? clientItem.parentSku : clientItem.sku const cartItem = { sku, - qty: clientItem.qty, + qty: mergeQty ? (clientItem.qty + serverItem.qty) : clientItem.qty, product_option: clientItem.product_option } as any as CartItem diff --git a/core/modules/cart/store/actions/connectActions.ts b/core/modules/cart/store/actions/connectActions.ts index 257e5bbe56..37b423a630 100644 --- a/core/modules/cart/store/actions/connectActions.ts +++ b/core/modules/cart/store/actions/connectActions.ts @@ -33,7 +33,7 @@ const connectActions = { Logger.info('Server cart token created.', 'cart', result)() commit(types.CART_LOAD_CART_SERVER_TOKEN, result) - return dispatch('sync', { forceClientState, dryRun: !config.cart.serverMergeByDefault }) + return dispatch('sync', { forceClientState, dryRun: !config.cart.serverMergeByDefault, mergeQty: true }) } if (resultCode === 401 && getters.bypassCounter < config.queues.maxCartBypassAttempts) { diff --git a/core/modules/cart/store/actions/mergeActions.ts b/core/modules/cart/store/actions/mergeActions.ts index 448d87f0a2..0b024b500e 100644 --- a/core/modules/cart/store/actions/mergeActions.ts +++ b/core/modules/cart/store/actions/mergeActions.ts @@ -30,9 +30,9 @@ const mergeActions = { await dispatch('updateItem', { product }) EventBus.$emit('cart-after-itemchanged', { item: cartItem }) }, - async updateServerItem ({ getters, rootGetters, commit, dispatch }, { clientItem, serverItem, updateIds }) { + async updateServerItem ({ getters, rootGetters, commit, dispatch }, { clientItem, serverItem, updateIds, mergeQty }) { const diffLog = createDiffLog() - const cartItem = createCartItemForUpdate(clientItem, serverItem, updateIds) + const cartItem = createCartItemForUpdate(clientItem, serverItem, updateIds, mergeQty) const event = await CartService.updateItem(getters.getCartToken, cartItem) const wasUpdatedSuccessfully = event.resultCode === 200 Logger.debug('Cart item server sync' + event, 'cart')() @@ -65,7 +65,7 @@ const mergeActions = { return diffLog }, - async synchronizeServerItem ({ dispatch }, { serverItem, clientItem, forceClientState, dryRun }) { + async synchronizeServerItem ({ dispatch }, { serverItem, clientItem, forceClientState, dryRun, mergeQty }) { const diffLog = createDiffLog() if (!serverItem) { @@ -82,12 +82,12 @@ const mergeActions = { return diffLog } - if (serverItem.qty !== clientItem.qty) { + if (serverItem.qty !== clientItem.qty || mergeQty) { Logger.log('Wrong qty for ' + clientItem.sku, clientItem.qty, serverItem.qty)() diffLog.pushServerParty({ sku: clientItem.sku, status: 'wrong-qty', 'client-qty': clientItem.qty, 'server-qty': serverItem.qty }) if (dryRun) return diffLog if (forceClientState || !config.cart.serverSyncCanModifyLocalItems) { - const updateServerItemDiffLog = await dispatch('updateServerItem', { clientItem, serverItem, updateIds: true }) + const updateServerItemDiffLog = await dispatch('updateServerItem', { clientItem, serverItem, updateIds: true, mergeQty }) return diffLog.merge(updateServerItemDiffLog) } @@ -97,9 +97,9 @@ const mergeActions = { return diffLog }, - async mergeClientItem ({ dispatch }, { clientItem, serverItems, forceClientState, dryRun }) { + async mergeClientItem ({ dispatch }, { clientItem, serverItems, forceClientState, dryRun, mergeQty }) { const serverItem = serverItems.find(itm => productsEquals(itm, clientItem)) - const diffLog = await dispatch('synchronizeServerItem', { serverItem, clientItem, forceClientState, dryRun }) + const diffLog = await dispatch('synchronizeServerItem', { serverItem, clientItem, forceClientState, dryRun, mergeQty }) if (!diffLog.isEmpty()) return diffLog @@ -118,12 +118,12 @@ const mergeActions = { return diffLog }, - async mergeClientItems ({ dispatch }, { clientItems, serverItems, forceClientState, dryRun }) { + async mergeClientItems ({ dispatch }, { clientItems, serverItems, forceClientState, dryRun, mergeQty }) { const diffLog = createDiffLog() for (const clientItem of clientItems) { try { - const mergeClientItemDiffLog = await dispatch('mergeClientItem', { clientItem, serverItems, forceClientState, dryRun }) + const mergeClientItemDiffLog = await dispatch('mergeClientItem', { clientItem, serverItems, forceClientState, dryRun, mergeQty }) diffLog.merge(mergeClientItemDiffLog) } catch (e) { Logger.debug('Problem syncing clientItem', 'cart', clientItem)() @@ -186,7 +186,7 @@ const mergeActions = { commit(types.CART_SET_ITEMS_HASH, getters.getCurrentCartHash) }, - async merge ({ getters, dispatch }, { serverItems, clientItems, dryRun = false, forceClientState = false }) { + async merge ({ getters, dispatch }, { serverItems, clientItems, dryRun = false, forceClientState = false, mergeQty = false }) { const hookResult = cartHooksExecutors.beforeSync({ clientItems, serverItems }) const diffLog = createDiffLog() @@ -194,7 +194,8 @@ const mergeActions = { clientItems: hookResult.clientItems, serverItems: hookResult.serverItems, forceClientState, - dryRun + dryRun, + mergeQty } const mergeClientItemsDiffLog = await dispatch('mergeClientItems', mergeParameters) const mergeServerItemsDiffLog = await dispatch('mergeServerItems', mergeParameters) diff --git a/core/modules/cart/store/actions/synchronizeActions.ts b/core/modules/cart/store/actions/synchronizeActions.ts index 18d628265d..066ea70eb2 100644 --- a/core/modules/cart/store/actions/synchronizeActions.ts +++ b/core/modules/cart/store/actions/synchronizeActions.ts @@ -44,7 +44,7 @@ const synchronizeActions = { Logger.warn('The "cart/serverPull" action is deprecated and will not be supported with the Vue Storefront 1.11', 'cart')() return dispatch('sync', { forceClientState, dryRun }) }, - async sync ({ getters, rootGetters, commit, dispatch, state }, { forceClientState = false, dryRun = false }) { + async sync ({ getters, rootGetters, commit, dispatch, state }, { forceClientState = false, dryRun = false, mergeQty = false }) { const shouldUpdateClientState = rootGetters['checkout/isUserInCheckout'] || forceClientState const { getCartItems, canUpdateMethods, isSyncRequired, bypassCounter } = getters if (!canUpdateMethods || !isSyncRequired) return createDiffLog() @@ -57,7 +57,8 @@ const synchronizeActions = { dryRun, serverItems, clientItems, - forceClientState: shouldUpdateClientState + forceClientState: shouldUpdateClientState, + mergeQty }) cartHooksExecutors.afterSync(diffLog) return diffLog diff --git a/core/modules/cart/test/unit/store/connectActions.spec.ts b/core/modules/cart/test/unit/store/connectActions.spec.ts index 08961fdf70..7ebd24a6f1 100644 --- a/core/modules/cart/test/unit/store/connectActions.spec.ts +++ b/core/modules/cart/test/unit/store/connectActions.spec.ts @@ -105,7 +105,7 @@ describe('Cart connectActions', () => { await (cartActions as any).connect(contextMock, {}) expect(contextMock.commit).toBeCalledWith(types.CART_LOAD_CART_SERVER_TOKEN, 'server-cart-token') - expect(contextMock.dispatch).toBeCalledWith('sync', { forceClientState: false, dryRun: true }) + expect(contextMock.dispatch).toBeCalledWith('sync', { forceClientState: false, dryRun: true, mergeQty: true }) }) it('attempts bypassing guest cart', async () => { diff --git a/core/modules/cart/test/unit/store/mergeActions.spec.ts b/core/modules/cart/test/unit/store/mergeActions.spec.ts index b4ea2d7848..fe3313afa4 100644 --- a/core/modules/cart/test/unit/store/mergeActions.spec.ts +++ b/core/modules/cart/test/unit/store/mergeActions.spec.ts @@ -351,8 +351,8 @@ describe('Cart mergeActions', () => { (createDiffLog as jest.Mock).mockImplementation(() => diffLog) await (cartActions as any).merge(contextMock, { clientItems: [clientItem], serverItems: [serverItem] }); - expect(contextMock.dispatch).toHaveBeenNthCalledWith(1, 'mergeClientItems', { clientItems: [clientItem], serverItems: [serverItem], dryRun: false, forceClientState: false }) - expect(contextMock.dispatch).toHaveBeenNthCalledWith(2, 'mergeServerItems', { clientItems: [clientItem], serverItems: [serverItem], dryRun: false, forceClientState: false }) + expect(contextMock.dispatch).toHaveBeenNthCalledWith(1, 'mergeClientItems', { clientItems: [clientItem], serverItems: [serverItem], dryRun: false, forceClientState: false, mergeQty: false }) + expect(contextMock.dispatch).toHaveBeenNthCalledWith(2, 'mergeServerItems', { clientItems: [clientItem], serverItems: [serverItem], dryRun: false, forceClientState: false, mergeQty: false }) expect(contextMock.dispatch).toHaveBeenNthCalledWith(3, 'updateTotalsAfterMerge', { clientItems: [clientItem], dryRun: false }) }) }); diff --git a/core/modules/cart/test/unit/store/synchronizeActions.spec.ts b/core/modules/cart/test/unit/store/synchronizeActions.spec.ts index d137051a96..0ff0734020 100644 --- a/core/modules/cart/test/unit/store/synchronizeActions.spec.ts +++ b/core/modules/cart/test/unit/store/synchronizeActions.spec.ts @@ -144,7 +144,8 @@ describe('Cart synchronizeActions', () => { clientItems: [], dryRun: false, forceClientState: true, - serverItems: [] + serverItems: [], + mergeQty: false }) }) From 4027922728e0e98d4bbb2d83ae134ed39e815135 Mon Sep 17 00:00:00 2001 From: tkostuch Date: Fri, 31 Jan 2020 09:40:32 +0100 Subject: [PATCH 3/3] bugfix - revert init filters --- CHANGELOG.md | 1 + core/app.ts | 10 ------ core/filters/date.js | 7 ++-- core/filters/price.js | 8 ++--- core/lib/multistore.ts | 36 +++++++++++++------ core/mixins/multistore.js | 16 ++------- .../components/core/ProductTile.vue | 12 +++++-- src/themes/default-amp/pages/Product.vue | 9 +++-- .../default/components/core/ProductLinks.vue | 12 +++++-- .../default/components/core/ProductPrice.vue | 10 ++++-- .../default/components/core/ProductTile.vue | 10 ++++-- .../core/blocks/Checkout/CartSummary.vue | 10 ++++-- .../blocks/Checkout/OrderConfirmation.vue | 10 ++++-- .../core/blocks/Checkout/Product.vue | 16 +++++---- .../core/blocks/Checkout/Shipping.vue | 8 +++-- .../core/blocks/Microcart/Microcart.vue | 10 ++++-- .../core/blocks/Microcart/Product.vue | 17 +++++---- .../core/blocks/MyAccount/MyOrder.vue | 22 +++++++----- .../core/blocks/MyAccount/MyOrders.vue | 12 +++++-- .../core/blocks/Wishlist/Product.vue | 9 +++-- .../theme/blocks/Reviews/ReviewsList.vue | 6 +++- 21 files changed, 158 insertions(+), 93 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e3b8cf86a8..51d7ac9d4c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fixed z-index for aside in compare list - @gibkigonzo (#4037) - Disable checking max quantity when manage stock is set to false - @gibkigonzo (#4038) - Add products quantity only when token is created - @gibkigonzo (#4017) +- Revert init filters in Vue app - add storeView to global/store and pass it to filters - @gibkigonzo (#3929) ## [1.11.0] - 2019.12.20 diff --git a/core/app.ts b/core/app.ts index 0cde365b6e..4e82eeac59 100755 --- a/core/app.ts +++ b/core/app.ts @@ -77,16 +77,6 @@ const createApp = async (ssrContext, config, storeCode = null): Promise<{app: Vu }) }) - // @todo remove this part when we'll get rid of global multistore mixin - if (isServer) { - Object.defineProperty(ssrContext, 'helpers', { - value: { - currentStoreView - }, - writable: true - }) - } - let vueOptions = { router: routerProxy, store, diff --git a/core/filters/date.js b/core/filters/date.js index fee5d40065..1bcd01b9c2 100644 --- a/core/filters/date.js +++ b/core/filters/date.js @@ -12,9 +12,10 @@ once('__VUE_EXTEND_DAYJS_LOCALIZED_FORMAT__', () => { * @param {String} date * @param {String} format */ -export function date (date, format) { - const displayFormat = format || currentStoreView().i18n.dateFormat - let storeLocale = currentStoreView().i18n.defaultLocale.toLocaleLowerCase() +export function date (date, format, storeView) { + const _storeView = storeView || currentStoreView() + const displayFormat = format || _storeView.i18n.dateFormat + let storeLocale = _storeView.i18n.defaultLocale.toLocaleLowerCase() const separatorIndex = storeLocale.indexOf('-') const languageCode = (separatorIndex > -1) ? storeLocale.substr(0, separatorIndex) : storeLocale diff --git a/core/filters/price.js b/core/filters/price.js index c69462fb41..a7e6d858a4 100644 --- a/core/filters/price.js +++ b/core/filters/price.js @@ -13,15 +13,15 @@ const applyCurrencySign = (formattedPrice, { currencySign, priceFormat }) => { * Converts number to price string * @param {Number} value */ -export function price (value) { +export function price (value, storeView) { if (isNaN(value)) { return value; } - const storeView = currentStoreView(); - if (!storeView.i18n) { + const _storeView = storeView || currentStoreView(); + if (!_storeView.i18n) { return value; } - const { defaultLocale, currencySign, priceFormat } = storeView.i18n + const { defaultLocale, currencySign, priceFormat } = _storeView.i18n const formattedValue = formatValue(value, defaultLocale); const valueWithSign = applyCurrencySign(formattedValue, { currencySign, priceFormat }) diff --git a/core/lib/multistore.ts b/core/lib/multistore.ts index 57e0e727c7..354ead2751 100644 --- a/core/lib/multistore.ts +++ b/core/lib/multistore.ts @@ -11,6 +11,9 @@ import { coreHooksExecutors } from '@vue-storefront/core/hooks' import { StorageManager } from '@vue-storefront/core/lib/storage-manager' import { LocalizedRoute, StoreView } from './types' import storeCodeFromRoute from './storeCodeFromRoute' +import cloneDeep from 'lodash-es/cloneDeep' +import get from 'lodash-es/get' +import { isServer } from '@vue-storefront/core/helpers' function getExtendedStoreviewConfig (storeView: StoreView): StoreView { if (storeView.extend) { @@ -30,20 +33,28 @@ function getExtendedStoreviewConfig (storeView: StoreView): StoreView { return storeView } +/** + * Returns base storeView object that can be created without storeCode + */ +function buildBaseStoreView (): StoreView { + return cloneDeep({ + tax: config.tax, + i18n: config.i18n, + elasticsearch: config.elasticsearch, + storeCode: null, + storeId: config.defaultStoreCode && config.defaultStoreCode !== '' ? config.storeViews[config.defaultStoreCode].storeId : 1, + seo: config.seo + }) +} + export function currentStoreView (): StoreView { - // TODO: Change to getter all along our code - return rootStore.state.storeView + const serverStoreView = get(global, 'process.storeView', undefined) + const clientStoreView = get(rootStore, 'state.storeView', undefined) + return (isServer ? serverStoreView : clientStoreView) || buildBaseStoreView() } export async function prepareStoreView (storeCode: string): Promise { - let storeView: StoreView = { // current, default store - tax: Object.assign({}, config.tax), - i18n: Object.assign({}, config.i18n), - elasticsearch: Object.assign({}, config.elasticsearch), - storeCode: null, - storeId: config.defaultStoreCode && config.defaultStoreCode !== '' ? config.storeViews[config.defaultStoreCode].storeId : 1, - seo: Object.assign({}, config.seo) - } + let storeView: StoreView = buildBaseStoreView() // current, default store if (config.storeViews.multistore === true) { storeView.storeCode = storeCode || config.defaultStoreCode || '' @@ -61,6 +72,11 @@ export async function prepareStoreView (storeCode: string): Promise { if (storeViewHasChanged) { storeView = coreHooksExecutors.beforeStoreViewChanged(storeView) rootStore.state.storeView = storeView + + if (global && isServer) { + (global.process as any).storeView = storeView + } + await loadLanguageAsync(storeView.i18n.defaultLocale) } if (storeViewHasChanged || StorageManager.currentStoreCode !== storeCode) { diff --git a/core/mixins/multistore.js b/core/mixins/multistore.js index 4f8135e186..8964566055 100644 --- a/core/mixins/multistore.js +++ b/core/mixins/multistore.js @@ -10,13 +10,7 @@ export const multistore = { * @param {Int} height */ localizedRoute (routeObj) { - let storeView - - if (isServer) { - storeView = this.$ssrContext.helpers.currentStoreView() - } else { - storeView = currentStoreView() - } + const storeView = currentStoreView() return localizedRouteHelper(routeObj, storeView.storeCode) }, @@ -27,13 +21,7 @@ export const multistore = { * @param {Int} height */ localizedDispatcherRoute (routeObj) { - let storeView - - if (isServer) { - storeView = this.$ssrContext.helpers.currentStoreView() - } else { - storeView = currentStoreView() - } + const storeView = currentStoreView() return localizedDispatcherRouteHelper(routeObj, storeView.storeCode) } diff --git a/src/themes/default-amp/components/core/ProductTile.vue b/src/themes/default-amp/components/core/ProductTile.vue index deb9dbde2d..d2daa0a3b9 100755 --- a/src/themes/default-amp/components/core/ProductTile.vue +++ b/src/themes/default-amp/components/core/ProductTile.vue @@ -28,21 +28,21 @@ class="price-original mr5 lh30 cl-secondary" v-if="product.special_price && parseFloat(product.original_price_incl_tax) > 0 && !onlyImage" > - {{ product.original_price_incl_tax | price }} + {{ product.original_price_incl_tax | price(storeView) }} - {{ product.price_incl_tax | price }} + {{ product.price_incl_tax | price(storeView) }} - {{ product.price_incl_tax | price }} + {{ product.price_incl_tax | price(storeView) }} @@ -52,6 +52,7 @@ import rootStore from '@vue-storefront/core/store' import { ProductTile } from '@vue-storefront/core/modules/catalog/components/ProductTile.ts' import config from 'config' +import { currentStoreView } from '@vue-storefront/core/lib/multistore' export default { mixins: [ProductTile], @@ -65,6 +66,11 @@ export default { default: false } }, + computed: { + storeView () { + return currentStoreView() + } + }, methods: { onProductPriceUpdate (product) { if (product.sku === this.product.sku) { diff --git a/src/themes/default-amp/pages/Product.vue b/src/themes/default-amp/pages/Product.vue index 58b2de643d..6753b018be 100755 --- a/src/themes/default-amp/pages/Product.vue +++ b/src/themes/default-amp/pages/Product.vue @@ -44,17 +44,17 @@ v-if="product.special_price && product.price_incl_tax && product.original_price_incl_tax" > - {{ product.price_incl_tax * product.qty | price }} + {{ product.price_incl_tax * product.qty | price(storeView) }}   - {{ product.original_price_incl_tax * product.qty | price }} + {{ product.original_price_incl_tax * product.qty | price(storeView) }}
- {{ product.price_incl_tax * product.qty | price }} + {{ product.price_incl_tax * product.qty | price(storeView) }}
currentStoreView().i18n.currencyCode }, directives: { focusClean }, diff --git a/src/themes/default/components/core/ProductLinks.vue b/src/themes/default/components/core/ProductLinks.vue index 5f66771428..317a81cd46 100644 --- a/src/themes/default/components/core/ProductLinks.vue +++ b/src/themes/default/components/core/ProductLinks.vue @@ -8,11 +8,11 @@

- {{ productLink.product.price_incl_tax | price }}  - {{ productLink.product.original_price_incl_tax | price }} + {{ productLink.product.price_incl_tax | price(storeView) }}  + {{ productLink.product.original_price_incl_tax | price(storeView) }}
- {{ productLink.product.price_incl_tax | price }} + {{ productLink.product.price_incl_tax | price(storeView) }}
@@ -35,12 +35,18 @@ diff --git a/src/themes/default/components/core/ProductPrice.vue b/src/themes/default/components/core/ProductPrice.vue index 2e9cdea05f..d38d5ece2a 100644 --- a/src/themes/default/components/core/ProductPrice.vue +++ b/src/themes/default/components/core/ProductPrice.vue @@ -6,16 +6,16 @@ > {{ price.special | price }}  + >{{ price.special | price(storeView) }}  {{ price.original | price }} + >{{ price.original | price(storeView) }}
- {{ price.default | price }} + {{ price.default | price(storeView) }}
@@ -23,6 +23,7 @@ import { getCustomOptionValues, getCustomOptionPriceDelta } from '@vue-storefront/core/modules/catalog/helpers/customOption' import { getBundleOptionsValues, getBundleOptionPrice } from '@vue-storefront/core/modules/catalog/helpers/bundleOptions' import get from 'lodash-es/get' +import { currentStoreView } from '@vue-storefront/core/lib/multistore' export default { name: 'ProductPrice', @@ -81,6 +82,9 @@ export default { original: this.product.original_price_incl_tax || this.product.originalPriceInclTax || 0, special: this.product.special_price || this.product.specialPrice || 0 } + }, + storeView () { + return currentStoreView() } } } diff --git a/src/themes/default/components/core/ProductTile.vue b/src/themes/default/components/core/ProductTile.vue index 101b4dbf71..d7e1497103 100644 --- a/src/themes/default/components/core/ProductTile.vue +++ b/src/themes/default/components/core/ProductTile.vue @@ -45,17 +45,17 @@ {{ product.original_price_incl_tax | price }} + >{{ product.original_price_incl_tax | price(storeView) }} {{ product.price_incl_tax | price }} + >{{ product.price_incl_tax | price(storeView) }} {{ product.price_incl_tax | price }} + >{{ product.price_incl_tax | price(storeView) }} @@ -69,6 +69,7 @@ import AddToWishlist from 'theme/components/core/blocks/Wishlist/AddToWishlist' import AddToCompare from 'theme/components/core/blocks/Compare/AddToCompare' import { IsOnWishlist } from '@vue-storefront/core/modules/wishlist/components/IsOnWishlist' import { IsOnCompare } from '@vue-storefront/core/modules/compare/components/IsOnCompare' +import { currentStoreView } from '@vue-storefront/core/lib/multistore' export default { mixins: [ProductTile, IsOnWishlist, IsOnCompare], @@ -96,6 +97,9 @@ export default { }, favoriteIcon () { return this.isOnWishlist ? 'favorite' : 'favorite_border' + }, + storeView () { + return currentStoreView() } }, methods: { diff --git a/src/themes/default/components/core/blocks/Checkout/CartSummary.vue b/src/themes/default/components/core/blocks/Checkout/CartSummary.vue index 2cac035558..0d02305458 100644 --- a/src/themes/default/components/core/blocks/Checkout/CartSummary.vue +++ b/src/themes/default/components/core/blocks/Checkout/CartSummary.vue @@ -11,7 +11,7 @@ {{ segment.title }}
- {{ segment.value | price }} + {{ segment.value | price(storeView) }}
@@ -20,7 +20,7 @@ {{ segment.title }}
- {{ segment.value | price }} + {{ segment.value | price(storeView) }}
@@ -53,12 +53,18 @@ diff --git a/src/themes/default/components/core/blocks/Checkout/OrderConfirmation.vue b/src/themes/default/components/core/blocks/Checkout/OrderConfirmation.vue index e710b545cd..720a285e0d 100644 --- a/src/themes/default/components/core/blocks/Checkout/OrderConfirmation.vue +++ b/src/themes/default/components/core/blocks/Checkout/OrderConfirmation.vue @@ -34,13 +34,13 @@ - {{ product.price_incl_tax | price }} + {{ product.price_incl_tax | price(storeView) }} {{ product.qty }} - {{ product.price_incl_tax * product.qty | price }} + {{ product.price_incl_tax * product.qty | price(storeView) }} @@ -65,6 +65,7 @@ import { ConfirmOrders } from '@vue-storefront/core/modules/offline-order/compon import { CancelOrders } from '@vue-storefront/core/modules/offline-order/components/CancelOrders' import Modal from 'theme/components/core/Modal' import ButtonFull from 'theme/components/theme/ButtonFull.vue' +import { currentStoreView } from '@vue-storefront/core/lib/multistore' export default { props: { @@ -79,6 +80,11 @@ export default { this.$bus.$emit('modal-show', 'modal-order-confirmation') }) }, + computed: { + storeView () { + return currentStoreView() + } + }, methods: { confirmOrders () { ConfirmOrders.methods.confirmOrders.call(this) diff --git a/src/themes/default/components/core/blocks/Checkout/Product.vue b/src/themes/default/components/core/blocks/Checkout/Product.vue index bca6719ee6..78bac119ac 100644 --- a/src/themes/default/components/core/blocks/Checkout/Product.vue +++ b/src/themes/default/components/core/blocks/Checkout/Product.vue @@ -42,14 +42,14 @@
- {{ product.totals.row_total - product.totals.discount_amount + product.totals.tax_amount | price }} - {{ product.totals.row_total_incl_tax | price }} - {{ product.totals.row_total_incl_tax | price }} + {{ product.totals.row_total - product.totals.discount_amount + product.totals.tax_amount | price(storeView) }} + {{ product.totals.row_total_incl_tax | price(storeView) }} + {{ product.totals.row_total_incl_tax | price(storeView) }}
- {{ product.price_incl_tax * product.qty | price }} - {{ product.original_price_incl_tax * product.qty | price }} - {{ product.price_incl_tax * product.qty | price }} + {{ product.price_incl_tax * product.qty | price(storeView) }} + {{ product.original_price_incl_tax * product.qty | price(storeView) }} + {{ product.price_incl_tax * product.qty | price(storeView) }}
@@ -61,9 +61,13 @@ import { Product } from '@vue-storefront/core/modules/checkout/components/Product' import { onlineHelper } from '@vue-storefront/core/helpers' import ProductImage from 'theme/components/core/ProductImage' +import { currentStoreView } from '@vue-storefront/core/lib/multistore' export default { computed: { + storeView () { + return currentStoreView() + }, isOnline () { return onlineHelper.isOnline }, diff --git a/src/themes/default/components/core/blocks/Checkout/Shipping.vue b/src/themes/default/components/core/blocks/Checkout/Shipping.vue index a093fc0c0d..fef1da91c7 100644 --- a/src/themes/default/components/core/blocks/Checkout/Shipping.vue +++ b/src/themes/default/components/core/blocks/Checkout/Shipping.vue @@ -184,7 +184,7 @@ {{ $t('Shipping method') }}
-
-
- {{ segment.value | price }} + {{ segment.value | price(storeView) }}
@@ -94,7 +94,7 @@ {{ segment.title }}
- {{ segment.value | price }} + {{ segment.value | price(storeView) }}
@@ -127,6 +127,7 @@ import { mapGetters, mapActions } from 'vuex' import i18n from '@vue-storefront/i18n' import { isModuleRegistered } from '@vue-storefront/core/lib/modules' +import { currentStoreView } from '@vue-storefront/core/lib/multistore' import VueOfflineMixin from 'vue-offline/mixin' import onEscapePress from '@vue-storefront/core/mixins/onEscapePress' @@ -184,7 +185,10 @@ export default { appliedCoupon: 'cart/getCoupon', totals: 'cart/getTotals', isOpen: 'cart/getIsMicroCartOpen' - }) + }), + storeView () { + return currentStoreView() + } }, methods: { ...mapActions({ diff --git a/src/themes/default/components/core/blocks/Microcart/Product.vue b/src/themes/default/components/core/blocks/Microcart/Product.vue index 42b13073f6..0489553725 100644 --- a/src/themes/default/components/core/blocks/Microcart/Product.vue +++ b/src/themes/default/components/core/blocks/Microcart/Product.vue @@ -63,29 +63,29 @@
- {{ product.price_incl_tax * product.qty | price }} + {{ product.price_incl_tax * product.qty | price(storeView) }} - {{ product.original_price_incl_tax * product.qty | price }} + {{ product.original_price_incl_tax * product.qty | price(storeView) }} - {{ (product.original_price_incl_tax ? product.original_price_incl_tax : product.price_incl_tax) * product.qty | price }} + {{ (product.original_price_incl_tax ? product.original_price_incl_tax : product.price_incl_tax) * product.qty | price(storeView) }}
- {{ product.totals.row_total - product.totals.discount_amount + product.totals.tax_amount | price }} + {{ product.totals.row_total - product.totals.discount_amount + product.totals.tax_amount | price(storeView) }} - {{ product.totals.row_total_incl_tax | price }} + {{ product.totals.row_total_incl_tax | price(storeView) }} - {{ product.totals.row_total_incl_tax | price }} + {{ product.totals.row_total_incl_tax | price(storeView) }}
- {{ (product.regular_price || product.price_incl_tax) * product.qty | price }} + {{ (product.regular_price || product.price_incl_tax) * product.qty | price(storeView) }}
@@ -227,6 +227,9 @@ export default { return this.quantityError || this.isStockInfoLoading || (this.isOnline && !this.maxQuantity && this.isSimpleOrConfigurable) + }, + storeView () { + return currentStoreView() } }, methods: { diff --git a/src/themes/default/components/core/blocks/MyAccount/MyOrder.vue b/src/themes/default/components/core/blocks/MyAccount/MyOrder.vue index 4e46ba6d0e..e34a73aeab 100644 --- a/src/themes/default/components/core/blocks/MyAccount/MyOrder.vue +++ b/src/themes/default/components/core/blocks/MyAccount/MyOrder.vue @@ -17,7 +17,7 @@
-

{{ order.created_at | date('LLL') }}

+

{{ order.created_at | date('LLL', storeView) }}

{{ $t('Remake order') }}

@@ -58,13 +58,13 @@ {{ item.sku }} - {{ item.price_incl_tax | price }} + {{ item.price_incl_tax | price(storeView) }} {{ item.qty_ordered }} - {{ item.row_total_incl_tax | price }} + {{ item.row_total_incl_tax | price(storeView) }} @@ -76,31 +76,31 @@ {{ $t('Subtotal') }} - {{ order.subtotal | price }} + {{ order.subtotal | price(storeView) }} {{ $t('Shipping') }} - {{ order.shipping_amount | price }} + {{ order.shipping_amount | price(storeView) }} {{ $t('Tax') }} - {{ order.tax_amount + order.discount_tax_compensation_amount | price }} + {{ order.tax_amount + order.discount_tax_compensation_amount | price(storeView) }} {{ $t('Discount') }} - {{ order.discount_amount | price }} + {{ order.discount_amount | price(storeView) }} {{ $t('Grand total') }} - {{ order.grand_total | price }} + {{ order.grand_total | price(storeView) }} @@ -148,6 +148,7 @@ import MyOrder from '@vue-storefront/core/compatibility/components/blocks/MyAcco import ReturnIcon from 'theme/components/core/blocks/Header/ReturnIcon' import ProductImage from 'theme/components/core/ProductImage' import { getThumbnailPath, productThumbnailPath } from '@vue-storefront/core/helpers' +import { currentStoreView } from '@vue-storefront/core/lib/multistore' import { mapActions } from 'vuex' export default { @@ -161,6 +162,11 @@ export default { itemThumbnail: [] } }, + computed: { + storeView () { + return currentStoreView() + } + }, methods: { ...mapActions({ getProduct: 'product/single' diff --git a/src/themes/default/components/core/blocks/MyAccount/MyOrders.vue b/src/themes/default/components/core/blocks/MyAccount/MyOrders.vue index 8d4f0b1cee..bf0006b0ad 100644 --- a/src/themes/default/components/core/blocks/MyAccount/MyOrders.vue +++ b/src/themes/default/components/core/blocks/MyAccount/MyOrders.vue @@ -43,13 +43,13 @@ #{{ order.increment_id }} - {{ order.created_at | date }} + {{ order.created_at | date(null, storeView) }} {{ order.customer_firstname }} {{ order.customer_lastname }} - {{ order.grand_total | price }} + {{ order.grand_total | price(storeView) }} {{ $t('Purchase') }} @@ -81,9 +81,15 @@ diff --git a/src/themes/default/components/core/blocks/Wishlist/Product.vue b/src/themes/default/components/core/blocks/Wishlist/Product.vue index 531b510dbb..af1bb9c086 100644 --- a/src/themes/default/components/core/blocks/Wishlist/Product.vue +++ b/src/themes/default/components/core/blocks/Wishlist/Product.vue @@ -31,11 +31,11 @@
- {{ product.price_incl_tax | price }}  - {{ product.original_price_incl_tax | price }} + {{ product.price_incl_tax | price(storeView) }}  + {{ product.original_price_incl_tax | price(storeView) }} - {{ product.price_incl_tax | price }} + {{ product.price_incl_tax | price(storeView) }}
@@ -80,6 +80,9 @@ export default { loading: this.thumbnail, src: this.thumbnail } + }, + storeView () { + return currentStoreView() } }, methods: { diff --git a/src/themes/default/components/theme/blocks/Reviews/ReviewsList.vue b/src/themes/default/components/theme/blocks/Reviews/ReviewsList.vue index 3fd1cac16c..d5cc2880ce 100644 --- a/src/themes/default/components/theme/blocks/Reviews/ReviewsList.vue +++ b/src/themes/default/components/theme/blocks/Reviews/ReviewsList.vue @@ -9,7 +9,7 @@ {{ item.title }}

- {{ item.nickname }}, {{ item.created_at | date }} + {{ item.nickname }}, {{ item.created_at | date(null, storeView) }}

{{ item.detail }} @@ -35,6 +35,7 @@