Skip to content
This repository was archived by the owner on Jan 26, 2024. It is now read-only.

Commit e33f46e

Browse files
authored
Merge pull request #2655 from DivanteLtd/hotfix/v1.8.4
Hotfix/v1.8.4
2 parents 7fdbf45 + 343a787 commit e33f46e

File tree

9 files changed

+89
-59
lines changed

9 files changed

+89
-59
lines changed

CHANGELOG.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,17 @@ All notable changes to this project will be documented in this file.
44
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
55
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
66

7+
## [1.8.4] - 2019.03.25
8+
9+
### Fixed
10+
- Problem with incomplete category products load for offline use - @patzick (#2543)
11+
- Category products view crash on scrolling down in offline mode - @patzick (#2569)
12+
- Default propery issue for the col-xs-* classes - @cnviradiya (#2558)
13+
- Wishlist and compare list not cached properly - @filrak (#2580)
14+
15+
### Changed / Improved
16+
- Category and Homepage products are now cached for offline use on SSR entry - @patzick (@1698)
17+
718
## [1.8.3] - 2019.03.03
819

920
### Added

core/modules/catalog/store/category/actions.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,10 @@ const actions: ActionTree<CategoryState, RootState> = {
330330
size: perPage,
331331
excludeFields: null,
332332
includeFields: null,
333-
updateState: false // not update the product listing - this request is only for caching
333+
configuration: configuration,
334+
sort: sort,
335+
updateState: false, // not update the product listing - this request is only for caching
336+
prefetchGroupProducts: prefetchGroupProducts
334337
}).catch((err) => {
335338
Logger.info("Problem with second stage caching - couldn't store the data", 'category')()
336339
Logger.info(err, 'category')()

core/modules/compare/store/plugin.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { Logger } from '@vue-storefront/core/lib/logger'
55
export function plugin (mutation, state) {
66
const type = mutation.type
77

8-
if (type.startsWith(types.SN_COMPARE)) { // check if this mutation is comapre related
8+
if (type.includes(types.COMPARE_ADD_ITEM) || type.includes(types.COMPARE_DEL_ITEM)) { // check if this mutation is comapre related
99
cacheStorage.setItem('current-compare', state.compare.items).catch((reason) => {
1010
Logger.error(reason, 'compare') // it doesn't work on SSR
1111
})

core/modules/wishlist/store/plugin.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@ import { Logger } from '@vue-storefront/core/lib/logger'
44

55
export function plugin (mutation, state) {
66
const type = mutation.type
7-
8-
if (type.startsWith(types.SN_WISHLIST)) { // check if this mutation is wishlist related
7+
if (type.includes(types.WISH_ADD_ITEM) || type.includes(types.WISH_DEL_ITEM)) { // check if this mutation is wishlist related
98
cacheStorage.setItem('current-wishlist', state.wishlist.items).catch((reason) => {
109
Logger.error(reason, 'wishlist') // it doesn't work on SSR
1110
})

core/pages/Category.js

Lines changed: 43 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import toString from 'lodash-es/toString'
44
import i18n from '@vue-storefront/i18n'
55
import store from '@vue-storefront/core/store'
66
import EventBus from '@vue-storefront/core/compatibility/plugins/event-bus'
7-
import { baseFilterProductsQuery, buildFilterProductsQuery } from '@vue-storefront/core/helpers'
7+
import { baseFilterProductsQuery, buildFilterProductsQuery, isServer } from '@vue-storefront/core/helpers'
88
import { htmlDecode } from '@vue-storefront/core/filters/html-decode'
99
import { currentStoreView, localizedRoute } from '@vue-storefront/core/lib/multistore'
1010
import Composite from '@vue-storefront/core/mixins/composite'
@@ -81,58 +81,51 @@ export default {
8181
append: false
8282
})
8383
},
84-
asyncData ({ store, route, context }) { // this is for SSR purposes to prefetch data
85-
return new Promise((resolve, reject) => {
86-
Logger.info('Entering asyncData in Category Page (core)')()
84+
async asyncData ({ store, route, context }) { // this is for SSR purposes to prefetch data
85+
Logger.info('Entering asyncData in Category Page (core)')()
86+
try {
8787
if (context) context.output.cacheTags.add(`category`)
8888
const defaultFilters = store.state.config.products.defaultFilters
89-
store.dispatch('category/list', { level: store.state.config.entities.category.categoriesDynamicPrefetch && store.state.config.entities.category.categoriesDynamicPrefetchLevel ? store.state.config.entities.category.categoriesDynamicPrefetchLevel : null, includeFields: store.state.config.entities.optimize && Vue.prototype.$isServer ? store.state.config.entities.category.includeFields : null }).then((categories) => {
90-
store.dispatch('attribute/list', { // load filter attributes for this specific category
91-
filterValues: defaultFilters, // TODO: assign specific filters/ attribute codes dynamicaly to specific categories
92-
includeFields: store.state.config.entities.optimize && Vue.prototype.$isServer ? store.state.config.entities.attribute.includeFields : null
93-
}).catch(err => {
94-
Logger.error(err)()
95-
reject(err)
96-
}).then((attrs) => {
97-
store.dispatch('category/single', { key: store.state.config.products.useMagentoUrlKeys ? 'url_key' : 'slug', value: route.params.slug }).then((parentCategory) => {
98-
let query = store.getters['category/getCurrentCategoryProductQuery']
99-
if (!query.searchProductQuery) {
100-
store.dispatch('category/mergeSearchOptions', {
101-
searchProductQuery: baseFilterProductsQuery(parentCategory, defaultFilters)
102-
})
103-
}
104-
store.dispatch('category/products', query).then((subloaders) => {
105-
if (subloaders) {
106-
Promise.all(subloaders).then((results) => {
107-
EventBus.$emitFilter('category-after-load', { store: store, route: route }).then((results) => {
108-
return resolve()
109-
}).catch((err) => {
110-
Logger.error(err)()
111-
return resolve()
112-
})
113-
}).catch(err => {
114-
Logger.error(err)()
115-
reject(err)
116-
})
117-
} else {
118-
const err = new Error('Category query returned empty result')
119-
Logger.error(err)()
120-
reject(err)
121-
}
122-
}).catch(err => {
123-
Logger.error(err)()
124-
reject(err)
125-
})
126-
}).catch(err => {
127-
Logger.error(err)()
128-
reject(err)
129-
})
89+
await store.dispatch('category/list', { level: store.state.config.entities.category.categoriesDynamicPrefetch && store.state.config.entities.category.categoriesDynamicPrefetchLevel ? store.state.config.entities.category.categoriesDynamicPrefetchLevel : null, includeFields: store.state.config.entities.optimize && Vue.prototype.$isServer ? store.state.config.entities.category.includeFields : null })
90+
await store.dispatch('attribute/list', { // load filter attributes for this specific category
91+
filterValues: defaultFilters, // TODO: assign specific filters/ attribute codes dynamicaly to specific categories
92+
includeFields: store.state.config.entities.optimize && Vue.prototype.$isServer ? store.state.config.entities.attribute.includeFields : null
93+
})
94+
const parentCategory = await store.dispatch('category/single', { key: store.state.config.products.useMagentoUrlKeys ? 'url_key' : 'slug', value: route.params.slug })
95+
let query = store.getters['category/getCurrentCategoryProductQuery']
96+
if (!query.searchProductQuery) {
97+
store.dispatch('category/mergeSearchOptions', {
98+
searchProductQuery: baseFilterProductsQuery(parentCategory, defaultFilters)
13099
})
131-
}).catch(err => {
132-
Logger.error(err)()
133-
reject(err)
100+
}
101+
const subloaders = await store.dispatch('category/products', query)
102+
if (subloaders) {
103+
await Promise.all(subloaders)
104+
await EventBus.$emitFilter('category-after-load', { store: store, route: route })
105+
} else {
106+
throw new Error('Category query returned empty result')
107+
}
108+
} catch (err) {
109+
Logger.error(err)()
110+
throw err
111+
}
112+
},
113+
async beforeRouteEnter (to, from, next) {
114+
if (!isServer && !from.name) { // Loading category products to cache on SSR render
115+
next(vm => {
116+
const defaultFilters = store.state.config.products.defaultFilters
117+
let parentCategory = store.getters['category/getCurrentCategory']
118+
let query = store.getters['category/getCurrentCategoryProductQuery']
119+
if (!query.searchProductQuery) {
120+
store.dispatch('category/mergeSearchOptions', {
121+
searchProductQuery: baseFilterProductsQuery(parentCategory, defaultFilters)
122+
})
123+
}
124+
store.dispatch('category/products', query)
134125
})
135-
})
126+
} else {
127+
next()
128+
}
136129
},
137130
beforeMount () {
138131
this.$bus.$on('filter-changed-category', this.onFilterChanged)
@@ -165,6 +158,7 @@ export default {
165158
return bottomOfPage || pageHeight < visible
166159
},
167160
pullMoreProducts () {
161+
if (typeof navigator !== 'undefined' && !navigator.onLine) return
168162
let current = this.getCurrentCategoryProductQuery.current + this.getCurrentCategoryProductQuery.perPage
169163
this.mergeSearchOptions({
170164
append: true,

docs/guide/installation/prod.vuestorefront.io

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,10 @@ server {
3838
gzip_types
3939
text/css
4040
text/javascript
41-
text/xml
4241
application/javascript
4342
application/json
44-
text/json
45-
text/html;
43+
text/xml
44+
text/json;
4645

4746
location / {
4847
proxy_pass http://localhost:3000/;

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
"all": "cross-env NODE_ENV=development node ./core/scripts/all",
3232
"cache": "node ./core/scripts/cache",
3333
"dev": "cross-env TS_NODE_PROJECT=\"tsconfig-build.json\" ts-node ./core/scripts/entry.ts",
34-
"dev:sw": "cross-env TS_NODE_PROJECT=\"tsconfig-build.json\" yarn build:sw && ts-node ./core/scripts/entry",
34+
"dev:sw": "cross-env TS_NODE_PROJECT=\"tsconfig-build.json\" yarn build:sw && yarn dev",
3535
"dev:inspect": "cross-env TS_NODE_PROJECT=\"tsconfig-build.json\" node --inspect -r ts-node/register ./core/scripts/entry",
3636
"build:sw": "cross-env NODE_ENV=production TS_NODE_PROJECT=\"tsconfig-build.json\" webpack --config ./core/build/webpack.prod.sw.config.ts --mode production --progress --hide-modules",
3737
"build:client": "cross-env NODE_ENV=production TS_NODE_PROJECT=\"tsconfig-build.json\" webpack --config ./core/build/webpack.prod.client.config.ts --mode production --progress --hide-modules",

src/themes/default/css/vendor/_flexboxgrid2.scss

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,16 @@
8383
max-width: 100%;
8484
}
8585

86+
[class^="col-xs"],
87+
[class*=" col-xs"] {
88+
box-sizing: border-box;
89+
-webkit-box-flex: 0;
90+
-ms-flex: 0 0 auto;
91+
flex: 0 0 auto;
92+
padding-right: 8px;
93+
padding-left: 8px;
94+
}
95+
8696
.col-xs {
8797
-webkit-box-flex: 1;
8898
-ms-flex-positive: 1;

src/themes/default/pages/Home.vue

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
<script>
3131
// query constructor
3232
import { prepareQuery } from '@vue-storefront/core/modules/catalog/queries/common'
33+
import { isServer } from '@vue-storefront/core/helpers'
3334
3435
// Core pages
3536
import Home from '@vue-storefront/core/pages/Home'
@@ -87,8 +88,7 @@ export default {
8788
const newProductsResult = await store.dispatch('product/list', {
8889
query: newProductsQuery,
8990
size: 8,
90-
sort: 'created_at:desc',
91-
includeFields: config.entities.optimize ? (config.products.setFirstVarianAsDefaultInURL ? config.entities.productListWithChildren.includeFields : config.entities.productList.includeFields) : []
91+
sort: 'created_at:desc'
9292
})
9393
if (newProductsResult) {
9494
store.state.homepage.new_collection = newProductsResult.items
@@ -106,6 +106,20 @@ export default {
106106
107107
await store.dispatch('promoted/updateHeadImage')
108108
await store.dispatch('promoted/updatePromotedOffers')
109+
},
110+
beforeRouteEnter (to, from, next) {
111+
if (!isServer && !from.name) { // Loading products to cache on SSR render
112+
next(vm => {
113+
let newProductsQuery = prepareQuery({ queryConfig: 'newProducts' })
114+
vm.$store.dispatch('product/list', {
115+
query: newProductsQuery,
116+
size: 8,
117+
sort: 'created_at:desc'
118+
})
119+
})
120+
} else {
121+
next()
122+
}
109123
}
110124
}
111125
</script>

0 commit comments

Comments
 (0)