diff --git a/CHANGELOG.md b/CHANGELOG.md index 45846bb524..123e8d4bcd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,21 +1,24 @@ # Changelog + All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - ## [1.11.0-rc.1] - UNRELEASED ### Added + - Extend storeview config after another storeview in multistore mode - @lukeromanowicz (#3057) - Default storeview settings are now overridden by specific storeview settings - @lukeromanowicz (#3057) - Apache2 proxy header support for store based on host - @resubaka (#3143) - Items count badges for Compare products and wishlist icons at header - @vishal-7037 (#3047) +- Add icons on the product tiles that allow to add to the wish list and to the list to compare products from the list of products - @Michal-Dziedzinski (#2773) - Get also none product image thumbnails via API - @cewald, @resubaka (#3207) - Added a config option `optimizeShoppingCartOmitFields` - @EmilsM (#3222) ### Fixed + - Fixed product link in wishlist and microcart - @michasik (#2987) - Fixed naming strategy for product prices - `special_priceInclTax` -> `special_price_incl_tax`, `priceInclTax` -> `price_incl_tax`, `priceTax` -> `price_tax`; old names have been kept as @deprecated - @pkarw (#2918) - The `final_price` field is now being used for setting the `special_price` or `price` of the product (depending on the value); `final_price` might been used along with `special_price` with Magento for the products with activated catalog pricing rules - @pkarw (#3099) @@ -31,6 +34,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fixed when store has updated, but plugin didn't called - @serzilo (#3238) ### Changed / Improved + - Shipping address is saved as default when not logged in user chooses to create account during checkout - @iwonapiotrowska (#2636) - Can set transition style for Modal content - @grimasod (#3146) - Added stock to cart items - @cheeerd (#3166) @@ -44,6 +48,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [1.10.0-rc.2] - UNRELEASED ### Fixed + - Wrong meta description attribute by page overwrite - @przspa (#3091) - The SSR Cms console errors fixed + `magento-2-cms` module removed - @pkarw (#3155) - Fixed the `AddToCart` button behavior in case of synchronization errors - @pkarw (#3150) @@ -51,15 +56,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fixed undefined id of color swatches issue for simple product - @vishal-7037 (#3239) ### Changed + - Renamed the `stock/check` to `stock/queueCheck` to better emphasize it's async nature; added `stock/check` which does exactly what name suggests - returning the true stock values - @pkarw (#3150) - Cart unit tests throwing lots of type warnings - @lukeromanowicz (#3185) -- Lack of possibility to mock src modules and theme components - @lukeromanowicz (#3185) +- Lack of possibility to mock src modules and theme components - @lukeromanowicz (#3185) - Outdated signature of Registration hooks for google-tag-manager - @vishal-7037 (#3208) - Added serveral missing german translations and fixed german language file structure - @unherz (#3202) ## [1.10.0-rc.1] - 2019.06.19 ### Added + - Cast cart_id as string - Order schema expects string, Magento does not generate a string as cart id in every case - @DaanKouters (#3097) - Make installer work for windows - @Flyingmana (#2616) - "Clear cart" button in the cart - @jablpiotrek (#2587) @@ -81,6 +88,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - OrderNumber on ThankYouPage - @Flyingmana (#2743) ### Removed + - The getter `cart/totals` has ben replaced with `cart/getTotals` - @pkarw (#2522) - The getter `cart/coupon` has ben replaced with `cart/getCoupon` - @pkarw (#2522) - The getter `cart/totalQuantity` has ben replaced with `cart/getItemsTotalQuantity` - @pkarw (#2522) @@ -92,6 +100,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Make all links with the primary color - @hackbard (#2932) ### Fixed + - Back button on the Error page has been fixed - @pkarw (#3077) - Special price got zeroed - @pkarw (#2940) - Microcart tax + discount totals fix - @pkarw (#2892) @@ -131,6 +140,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Remove static definition of `cashondelivery` in payment module - @danielmaier42 (#2983) ### Changed / Improved + - The `cart/sync`, `cart/addItems`, `cart/removeItem` and `cart/updateQuantity` now returns the `diffLog` object with all the notifications, server statuses and items changed during the shopping cart sync - The `cart/addItem` is no longer displaying the error messages - please use the `diffLog.clientNorifications` to update the UI instead (take a look at the `AddToCart.ts` for a reference) - The action `cart/userAfterLoggedin` got renamed to `cart/authorize` - @pkarw (#2522) @@ -142,7 +152,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Disabled the server cart sync in case user is in the checkout - @pkarw (#2749) - Improved ProductGalleryCarousel component to handle nonnumeric options id’s - @danieldomurad (#2586) - Number of displayed products is now visible on PLP on desktop - @awierzbiak (#2504) -- Improved visibility of product SKU in wishlist - @PanMisza (#2606) +- Improved visibility of product SKU in wishlist - @PanMisza (#2606) - Instant focus to search input field after click on search icon in navbar - @ca1zr (#2608) - Login flow from authorized pages after session expired, show the modal with new error message and redirect after login - @gdomiciano, @natalledm (#2674) - Added support for the newest node version - @gdomiciano (#2669) @@ -180,7 +190,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [1.9.2] - 2019.06.10 ### Fixed -- Instant Checkout visible on Safari - @przspa (#2991) + +- Instant Checkout visible on Safari - @przspa (#2991) - Search Sidebar on Safari - @przspa (#2990) - Country label style - @przspa (#2989) - BaseInputNumber for qty of the product in the cart can change by using arrows - @przspa (#2988) @@ -191,6 +202,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [1.9.1] - 2019.05.27 ### Fixed + - Remove security vulnerabilities by updating project dependencies - @patzick (#2942) - Fix Configurable Products not accessible in CSR when children visibility is set to "not visible individually" - @revlis-x (#2933) - ProductTile placeholders are visible on SSR - @patzick (#2939) @@ -198,18 +210,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [1.9.0] - 2019.05.06 ### Added + - The Url Dispatcher feature added for friendly URLs. When `config.seo.useUrlDispatcher` set to true the `product.url_path` and `category.url_path` fields are used as absolute URL addresses (no `/c` and `/p` prefixes anymore). Check the latest `mage2vuestorefront` snapshot and reimport Your products to properly set `url_path` fields - #2010 - @pkarw - Unit tests of cart module written in jest - @lukeromanowicz (#2305) - validation for UTF8 alpha and alphanumeric characters in most checkout fields - @lromanowicz (#2653) - helper to process config urls with default endpoint host `config.api.host` - @patzick (#2858) ### Changed / Improved + - The `core/helpers` parsing URL methods exchanged to `query-string` package - @pkarw (#2446) - Unit tests in Karma are now removed in favor of jest - @lukeromanowicz (#2305) - Material Icons are loaded asynchronously - @JKrupinski, @filrak (#2060) - Update to babel 7 - @lukeromanowicz (#2554) ### Fixed + - For first time setup of the SSR Cache, a local cache-version.json file is required. The path has been removed from .gitignore and a template has been added. - @rio-vps - Gallery low quality image in offline mode when high quality already cached - @patzick (#2557) - Payment issue when no address set - @szafran89 (#2593) @@ -243,28 +258,33 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [1.8.5] - 2019-04-17 ### Fixed + - Memory leaks on SSR with Vue.use - @patzick (#2745) ## [1.8.4] - 2019-03-26 ### Fixed + - Problem with incomplete category products load for offline use - @patzick (#2543) - Category products view crash on scrolling down in offline mode - @patzick (#2569) -- Default propery issue for the col-xs-* classes - @cnviradiya (#2558) +- Default propery issue for the col-xs-\* classes - @cnviradiya (#2558) - Wishlist and compare list not cached properly - @filrak (#2580) ### Changed / Improved + - Category and Homepage products are now cached for offline use on SSR entry - @patzick (@1698) ## [1.8.3] - 2019-03-03 ### Added + - Payment Request API integration - @qiqqq (#2306) - New reactive helper to check online state. Usage: `import { onlineHelper } from '@vue-storefront/core/helpers'` and then `onlineHelper.isOnline` - @patzick (#2510) - Cart count config, allows you to display the item count instead of a sum of the item quantities - @pauluse (#2483) - Video support in Product Gallery component. - @rain2o (#2433) ### Fixed + - Problem with placing second order (unbinding payment methods after first order) - @patzick (#2195, #2503) - Remaking order on user orders page - @patzick (#2480) - Images blinking on category page - @pkarw (#2523) @@ -273,6 +293,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Non-integer qty of product added to the cart - @pkarw (#2517) ### Changed / Improved + - Fixed an issue where the correct image for a product configuration wasn't set on the product page image carousel. Also added the fix on the productcarousel in the zoom component - @DaanKouters (#2419) - Way of creating VS Modules was changed to use factory method instead of explict object creation. - @filrak (#2434) - Added clear filters button on desktop also and only show if filters are applied - @DaanKouters (#2342) @@ -302,23 +323,28 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Removed editing mode from My Newsletter section - @aniamusial (#2766) - Clicking Remake order now adds your items and redirects you to the checkout - @mikesheward (#2710) - ### Deprecated / Removed + - `@vue-storefront/store` package deprecated - @filrak ## [1.8.2] - 2019-02-11 + - Fixed docker-compose configuration for network_mode and TS build config - @lukeromanowicz (#2415) ## [1.8.1] - 2019-02-10 + This is hot-fix release for fixing the payment methods switching issue when both: `payments-cash-on-delivery` and `payments-backend-methods` modules enabled. ### Changed / Improved - - Fixed doubled invlication of `placeOrder` when both: `payments-cash-on-delivery` and `payments-backend-methods` modules enabled - #2405 + +- Fixed doubled invlication of `placeOrder` when both: `payments-cash-on-delivery` and `payments-backend-methods` modules enabled - #2405 ## [1.8.0] - 2019-02-07 + Additional migration tips are available [here](https://github.com/DivanteLtd/vue-storefront/blob/master/docs/guide/upgrade-notes/README.md). ### Added + - Chinese translation added - @wadereye (#2265) - Categories filter in search view - @kjugi, @patzick (#1710) - AsyncDataLoader feature - @pkarw (#2300) @@ -331,6 +357,7 @@ Additional migration tips are available [here](https://github.com/DivanteLtd/vue - Hotjar integration - @lukeromanowicz (#840) ### Changed / Improved + - Theme structure improvements - @filrak (#2223) - Type interfaces and refactor - @filrak (#2227, #2267) - Changed beforeRegistration and afterRegistration hooks signature. Now it contains only one object VSF. The subfields are the same as before so changing `beforeRegistration( Vue, config, store, isServer )` to `beforeRegistration({ Vue, config, store, isServer })`(and same with `afterRegistration`) is enough to make a proper migration to new API. - @filrak (#2330) @@ -346,7 +373,7 @@ Additional migration tips are available [here](https://github.com/DivanteLtd/vue - `store/lib/search` has been moved to `core/lib/search` - @lukeromanowicz (#2225) - `store/lib/multistore` has been moved to `core/lib/multistore` - @lukeromanowicz (#2224) - BaseSelect syntax improvements - @jszczech (#2237) -- Optional cart discounts display on side cart - @mcspronko (#1758) +- Optional cart discounts display on side cart - @mcspronko (#1758) - Special price dates checking - backport of @igloczek's (#2245) - Category filters reset functionality on mobile - @vue-kacper, @patzick, @renatocason (#2262) - Improve sortBy mobile view - @martaradziszewska (#2251) @@ -379,12 +406,16 @@ Additional migration tips are available [here](https://github.com/DivanteLtd/vue - Configurable options attribute descriptor - @pkarw (#2384) ## [1.7.3] - 2019-01-31 + ### Fixed + - Output cache between build, cache versioning added - @igloczek (#2309) - Missing `no-ssr` wrapper around user specific content, which leads to broken app in production mode - @igloczek (#2314) ## [1.7.2] - 2019-01-28 + ### Fixed + - clear search filters on mobile - @patzick (#2282) - SSR problem on checkout page on reload - @vue-kacper (#2220) - Improved offline mode handlers - @pkarw (#2217) @@ -394,9 +425,11 @@ Additional migration tips are available [here](https://github.com/DivanteLtd/vue - SSR detection in components - @patzick (#2173) ### Added + - Hotjar extension (#840) ### Changed + - compress banner images - @patzick (#2280) - Dynamic attributes loader (#2137) - Dynamic categories prefetching (#2076) @@ -404,16 +437,21 @@ Additional migration tips are available [here](https://github.com/DivanteLtd/vue - Support regional characters in urls - Backport of @aekal's (#2243) ### Added + - Translations of banners - @patzick (#2276) - Banners title background on mobile - @patzick (#2272) - New main site look - @patzick (#2266) ## [1.7.1] - 2019-01-15 + ### Fixed + - Corrected scrolled sidebar menu position ## [1.7.0] - 2019-01-15 + ### Added + - Dynamic categories prefetching — @pkarw #2100 - Per-route codesplitting for SSR pages — @patzick #2068 - async/await support — @patzick #2092 @@ -427,6 +465,7 @@ Additional migration tips are available [here](https://github.com/DivanteLtd/vue - Out of the box GZIP compression and sourcemap removal in prod mode — @patzick #2186 ### Changed / Improved + - Invalidate output cache using POST - @Cyclonecode #2084 - NGNIX installation improvements for docs — @janmyszkier #2080 - HTML semantics improvements — @patzick #2094 @@ -443,6 +482,7 @@ Additional migration tips are available [here](https://github.com/DivanteLtd/vue - IndexedDb changed to LocalStorage + ServiceWorker native caching (#2112) ### Fixed + - Fix Notification.vue compiling issue on prod - @ladrua #2079 - Fix wishlist toggle bug — @shkodasv #2086 - findConfigurableChildAsync — fix checking stock for configurable child — @afirlejczyk #2097 @@ -464,19 +504,24 @@ Additional migration tips are available [here](https://github.com/DivanteLtd/vue - Fix Cart Configurable Item pulled from Magento loaded as Simple — @pkarw @valeriish #2169 #2181 ### Depreciated + - extendStore depreciation - @filrak #2143 - ValidationError class depreciation - @filrak #2143 ## [1.6.0] - 2018-12-05 + ### Added + - Lazy loading for SSR and non-SSR routes - app splitted into modules ### Removed + - `vsf-payment-stripe` module integration removed from core ### Changed -- There is new config option `config.orders.directBackendSync` that changes the behavior of placing an order. Please do read [more on this change](https://github.com/DivanteLtd/vue-storefront/commit/e73f2ca19a5d33a39f8b0fd6346543eced24167e) and [more on vue-storefront-api change](https://github.com/DivanteLtd/vue-storefront-api/commit/80c497f72362c72983db4fdcac14c8ba6f8729a8) + +- There is new config option `config.orders.directBackendSync` that changes the behavior of placing an order. Please do read [more on this change](https://github.com/DivanteLtd/vue-storefront/commit/e73f2ca19a5d33a39f8b0fd6346543eced24167e) and [more on vue-storefront-api change](https://github.com/DivanteLtd/vue-storefront-api/commit/80c497f72362c72983db4fdcac14c8ba6f8729a8) - ProductSlider, ProductLinks, ProductListing moved to theme. - Many theme-related logic moved to theme (+ deleted empty core components just with `name`) - Components required for backward compatibility moved to `compatibility` folder. For all this files you just need to add `compatibility` after `core` in import path to make them work like before. @@ -491,6 +536,7 @@ Additional migration tips are available [here](https://github.com/DivanteLtd/vue ## [1.5.0] - 2018-10-22 ### Added + - Contact form mailer - #1875 - Akbar Abdrakhmanov @akbarik - oauth2 configuration in setup - #1865 - Krister Andersson @Cyclonecode - GraphQL schema extendibility in the API - Yoann Vié @@ -499,9 +545,11 @@ Additional migration tips are available [here](https://github.com/DivanteLtd/vue - 'Apply' filters button on mobile category - #1709 - Damian Fiałkiewicz @Aekal ### Changed + - New Modules API, and base modules (cart, wishlist, newsletter ...) refactored [read more...](https://github.com/DivanteLtd/vue-storefront/blob/master/doc/api-modules/about-modules.md) - Filip Rakowski @filrak ### Fixed + - The `regionId` field added to Order interface - #1258 - Jim Hil @jimcreate78 - SSR Memory leaks fixed - #1882 Tomasz Duda @tomasz-duda - E2E tests fixed - #1861 - Patryk Tomczyk @patzik @@ -513,6 +561,7 @@ Additional migration tips are available [here](https://github.com/DivanteLtd/vue ## [1.4.0] - 2018-10-05 ### Added + - GraphQL support - #1616 - Yuri Boyko @yuriboyko, Vladimir Plastovets @VladimirPlastovets => [PHOENIX MEDIA](https://www.phoenix-media.eu/) - Layout switching + Advanced output mechanisms - #1787 - Piotr Karwatka @pkarw - Dynamic config reload - #1800 - Piotr Karwatka @pkarw @@ -523,9 +572,11 @@ Additional migration tips are available [here](https://github.com/DivanteLtd/vue - Console silent mode (disabled by default) - #1752 - Piotr Karwatka - @pkarw ### Changed + - Please check the [Upgrade notes](https://github.com/DivanteLtd/vue-storefront/blob/develop/doc/Upgrade%20notes.md) for the full list ### Fixed + - `docker-compose.yml` files updated - @kovinka - Non-core translations moved to theme resource files (i18n) - #1747 - David Rouyer @DavidRouyer - Non-core assets moved to the theme - #1739, #1740 - David Rouyer @DavidRouyer @@ -539,6 +590,7 @@ Additional migration tips are available [here](https://github.com/DivanteLtd/vue ## [1.3.0] - 2018-08-31 ### Added + - TypeScript support - please check [TypeScript Action Plan](https://github.com/DivanteLtd/vue-storefront/blob/master/docs/guide/basics/typescript.md) for details - New `core/modules` added regarding the [Refactor to modules plan](https://github.com/DivanteLtd/vue-storefront/blob/master/doc/api-modules/refactoring-to-modules.md) - Price tier's support #1625 @@ -548,15 +600,18 @@ Additional migration tips are available [here](https://github.com/DivanteLtd/vue - dynamic port allocation #1511 ### Removed + - unused `libs`, `components`, `core/api/cart` webpack aliases - `global.$VS` has been replaced with `rootStore` #1624 ### Changed + - `core` directory is now a `@vue-storefront/core` package, webpack alias and all related imports reflect this change [#1513] - `core/api` renamed to `core/modules`, mixin features moved to `core/modules/module_name/features` - `core/lib/i18n` moved into separate `@vue-storefront/i18n` package ### Fixed + - installer paths are now normalized (to support paths including spaces) #1645 - status check added to the configurable_children products #1639 - product info update when clicking the related products #1601 @@ -571,12 +626,14 @@ Additional migration tips are available [here](https://github.com/DivanteLtd/vue ## [1.2.0] - 2018-08-01 ### Fixed + - Improved integration tests [#1471] - Minor taxcalc.js improvements [#1467] - Search by SKU fixed [#1455] - ProductList dbl click fix [#1438] ### Added + - Docker support for vue-storefront - Production config docs added [#1450] - Integration tests for Compare products added [#1422] @@ -589,6 +646,7 @@ Additional migration tips are available [here](https://github.com/DivanteLtd/vue Please keep an eye on the **[UPGRADE NOTES](https://github.com/DivanteLtd/vue-storefront/blob/master/doc/Upgrade%20notes.md)** ### Fixed + - Zip Code validation [#1372] - Get inpspired block [#968] - Favicon [#836] @@ -600,6 +658,7 @@ Please keep an eye on the **[UPGRADE NOTES](https://github.com/DivanteLtd/vue-st - IndexedDB locking issue ### Added + - Added PM2 process manager [#1162] - Added billing data phone number support [#1338] - Added validation labels + generic control for CountrySelector [#1227] @@ -611,47 +670,61 @@ Please keep an eye on the **[UPGRADE NOTES](https://github.com/DivanteLtd/vue-st - Production ready Docker config for vue-storefront-api ## [1.0.5] - 2018-06-04 + ### Fixed + - Shipping region fix - Hotfix for missing config.storeViews.multistore check - Minor fixes ## [1.0.4] - 2018-06-02 + ### Fixed + - defaultCountry fix for IT - Tax classes hotfix - tax_class_id is required by taxcalc - restored along with version inc - Minor fixes ## [1.0.3] - 2018-06-02 + ### Fixed + - Minor fixes ## [1.0.2] - 2018-06-02 + ### Fixed + - vue-storefront-stripe renamed to vsf-payment-stripe hotfix - Minor fixes ## [1.0.1] - 2018-05-31 + ### Fixed + - Minor fixes ## [1.0.0] - 2018-05-30 + ### Added -- __Multistore__ - now it's possible to manage the store views with all the features like translations, custom category, and products content, shipping rates - basically all Magento2 features are supported! You can read more on how to setup Multistore here. -- __Bundle products__ - support for the Magento-like bundle products with all the custom options, pricing rules etc. -- __Configurable options__ - that allows users to select radio/checkbox options + put some custom notes (textboxes) on the products they like to order, -- __Crossell, Upsell, Related products__ - are now synchronized with Magento2, -- __Webpack4 support__ - we've migrated from Webpack2 -> Webpack4 and now the build process takes much less time while providing some cool new features, -- __Core components refactor__ - without changing APIs, we've stripped the core components from s to improve the performance and improve the code readability, -- __PWA Manifest fixes__ - iOS PWA support required us to adjust some settings, -- __Improved translations__ - we're constantly tweaking the translation files :) We've just added it-IT and pl-PL (finally!) support recently -- __Improved Travis-CI pipeline__ - and added support for end-2-end testing, -- __Lot of bugfixes + UX fixes__ - countless hours spent on improving the code and UI quality! -- __Please check it out:__ visit: https://demo.vuestorefront.io/ + +- **Multistore** - now it's possible to manage the store views with all the features like translations, custom category, and products content, shipping rates - basically all Magento2 features are supported! You can read more on how to setup Multistore here. +- **Bundle products** - support for the Magento-like bundle products with all the custom options, pricing rules etc. +- **Configurable options** - that allows users to select radio/checkbox options + put some custom notes (textboxes) on the products they like to order, +- **Crossell, Upsell, Related products** - are now synchronized with Magento2, +- **Webpack4 support** - we've migrated from Webpack2 -> Webpack4 and now the build process takes much less time while providing some cool new features, +- **Core components refactor** - without changing APIs, we've stripped the core components from s to improve the performance and improve the code readability, +- **PWA Manifest fixes** - iOS PWA support required us to adjust some settings, +- **Improved translations** - we're constantly tweaking the translation files :) We've just added it-IT and pl-PL (finally!) support recently +- **Improved Travis-CI pipeline** - and added support for end-2-end testing, +- **Lot of bugfixes + UX fixes** - countless hours spent on improving the code and UI quality! +- **Please check it out:** visit: https://demo.vuestorefront.io/ ## [1.0.0-rc.3] - 2018-04-29 + ### Added + - Performance tweaks: improved service worker config, reduced JSONs, two-stage caching, - User token auto refresh, - My Account fixes @@ -664,7 +737,9 @@ Please keep an eye on the **[UPGRADE NOTES](https://github.com/DivanteLtd/vue-st - Product and Category page refactoring ## [1.0.0-rc.2] - 2018-03-29 + ### Added + - Basic Magento 1.9 support, - Translations: ES, DE, NL, FR - Lerna support for managing the npm packages within the one repository, @@ -677,7 +752,9 @@ Please keep an eye on the **[UPGRADE NOTES](https://github.com/DivanteLtd/vue-st - Other fixes. ## [1.0.0-rc.0] - 2018-03-01 + ### Added + - i18n (internationalization) support for the UI, - Support for Magento2 dynamic cart totals - which enables the shopping cart rules mechanism of Magento to work with VS, - ESlint-plugin-vue installed, @@ -691,7 +768,9 @@ Please keep an eye on the **[UPGRADE NOTES](https://github.com/DivanteLtd/vue-st - Droppoints shipping methods (NL support) added. ## [0.4.0] - 2018-01-28 + ### Added + - Improved theming support + B2B product catalog theme included (original github repo); it's PoC made in just one week! Isn't it amazing that you can customize VS in just one week to this extent? :) - Pimcore support (more on this, github repo) - Customer's dashboard + address book, integration with Checkout @@ -706,7 +785,9 @@ Please keep an eye on the **[UPGRADE NOTES](https://github.com/DivanteLtd/vue-st - Lot of smaller tweaks ## [0.3.0] - 2017-12-21 + ### Added + - Bundle products support, - Tax calculation regarding the Magento's logic for different rates per countries, states. - User registration, log-in, password reset @@ -724,7 +805,9 @@ Please keep an eye on the **[UPGRADE NOTES](https://github.com/DivanteLtd/vue-st - Updated installer with support for Linux and MacOSX ## [0.2.1-alpha.0] - 2017-11-16 + ### Added + - Homepage - Category page - Product page @@ -739,5 +822,7 @@ Please keep an eye on the **[UPGRADE NOTES](https://github.com/DivanteLtd/vue-st - RWD (except some checkout issues to be fixed) ## [0.2.0-alpha.0] - 2017-11-15 + ### Fixed + - Lazy loaded blocks size fixed diff --git a/core/modules/compare/components/AddToCompare.ts b/core/modules/compare/components/AddToCompare.ts index 5823da9514..51ee030ac2 100644 --- a/core/modules/compare/components/AddToCompare.ts +++ b/core/modules/compare/components/AddToCompare.ts @@ -1,9 +1,20 @@ import Product from '@vue-storefront/core/modules/catalog/types/Product' +import { CompareModule } from '../' import compareMountedMixin from '@vue-storefront/core/modules/compare/mixins/compareMountedMixin' +import { registerModule } from '@vue-storefront/module'; export const AddToCompare = { name: 'AddToCompare', mixins: [compareMountedMixin], + props: { + product: { + required: true, + type: Object + } + }, + created () { + registerModule(CompareModule) + }, methods: { addToCompare (product: Product) { return this.$store.state['compare'] diff --git a/core/modules/compare/components/IsOnCompare.ts b/core/modules/compare/components/IsOnCompare.ts new file mode 100644 index 0000000000..953d775e1b --- /dev/null +++ b/core/modules/compare/components/IsOnCompare.ts @@ -0,0 +1,22 @@ +import { CompareModule } from '..' +import compareMountedMixin from '@vue-storefront/core/modules/compare/mixins/compareMountedMixin' +import { registerModule } from '@vue-storefront/module'; + +export const IsOnCompare = { + name: 'IsOnCompare', + mixins: [compareMountedMixin], + props: { + product: { + required: true, + type: Object + } + }, + created () { + registerModule(CompareModule) + }, + computed: { + isOnCompare () { + return this.$store.getters['compare/isOnCompare'](this.product) + } + } +} diff --git a/core/modules/compare/components/RemoveFromCompare.ts b/core/modules/compare/components/RemoveFromCompare.ts new file mode 100644 index 0000000000..4fc06dc960 --- /dev/null +++ b/core/modules/compare/components/RemoveFromCompare.ts @@ -0,0 +1,15 @@ +import Product from '@vue-storefront/core/modules/catalog/types/Product'; +import { CompareModule } from '..'; +import compareMountedMixin from '@vue-storefront/core/modules/compare/mixins/compareMountedMixin'; +import { registerModule } from '@vue-storefront/module'; + +export const RemoveFromCompare = { + name: 'RemoveFromCompare', + mixins: [compareMountedMixin], + methods: { + removeFromCompare (product: Product) { + registerModule(CompareModule) + this.$store.dispatch('compare/removeItem', product); + } + } +}; diff --git a/core/modules/compare/store/getters.ts b/core/modules/compare/store/getters.ts index aab30a8ed7..e69ffaa073 100644 --- a/core/modules/compare/store/getters.ts +++ b/core/modules/compare/store/getters.ts @@ -3,10 +3,10 @@ import RootState from '@vue-storefront/core/types/RootState' import CompareState from '../types/CompareState' const getters: GetterTree = { - isEmpty: (state) => state.items.length === 0, - isOnCompare: (state) => (product) => state.items.find(p => p.sku === product.sku), + isEmpty: state => state.items.length === 0, + isOnCompare: state => product => state.items.some(p => p.sku === product.sku), isCompareLoaded: state => state.loaded, - getCompareProductsCount: (state) => state.items.length + getCompareProductsCount: state => state.items.length } export default getters diff --git a/core/modules/wishlist/components/IsOnWishlist.ts b/core/modules/wishlist/components/IsOnWishlist.ts index 97b34b5d91..5c6b34abf8 100644 --- a/core/modules/wishlist/components/IsOnWishlist.ts +++ b/core/modules/wishlist/components/IsOnWishlist.ts @@ -15,8 +15,8 @@ export const IsOnWishlist = { registerModule(WishlistModule) }, computed: { - isOnWishlist (): boolean { - return !!this.$store.state.wishlist.items.find(p => p.sku === this.product.sku) || false + isOnWishlist () { + return this.$store.getters['wishlist/isOnWishlist'](this.product) } } } diff --git a/core/modules/wishlist/store/getters.ts b/core/modules/wishlist/store/getters.ts new file mode 100644 index 0000000000..f7708ca2a9 --- /dev/null +++ b/core/modules/wishlist/store/getters.ts @@ -0,0 +1,12 @@ +import { GetterTree } from 'vuex' +import RootState from '@vue-storefront/core/types/RootState' +import WishlistState from '../types/WishlistState' + +const getters: GetterTree = { + isOnWishlist: state => product => + state.items.some(p => p.sku === product.sku), + isWishlistLoaded: state => state.loaded, + getWishlistItemsCount: state => state.items.length +} + +export default getters diff --git a/core/modules/wishlist/store/index.ts b/core/modules/wishlist/store/index.ts index ad4e65804e..ff63f9ac3c 100644 --- a/core/modules/wishlist/store/index.ts +++ b/core/modules/wishlist/store/index.ts @@ -1,6 +1,7 @@ import { Module } from 'vuex' import actions from './actions' import mutations from './mutations' +import getters from './getters' import RootState from '@vue-storefront/core/types/RootState' import WishlistState from '../types/WishlistState' @@ -12,8 +13,5 @@ export const wishlistStore: Module = { }, actions, mutations, - getters: { - isWishlistLoaded: state => state.loaded, - getWishlistItemsCount: (state) => state.items.length - } + getters } diff --git a/docs/guide/components/product.md b/docs/guide/components/product.md index e7728ee332..b8eb05eace 100644 --- a/docs/guide/components/product.md +++ b/docs/guide/components/product.md @@ -11,15 +11,15 @@ No props - `compare` - Defines if the current product is in compare list. - `product` -A computed property that represents the current product that is shown on the page. Initially gets its value from `product/productCurrent` Vuex store getter. Includes all the options like size and color that the user sets on the page. - `originalProduct` - A computed property that represents the current product in its initial state. Gets its value from`product/productOriginal` Vuex store getter. -- `parentProduct` - A computed property that represents the current product parent product, if any. Gets its value from `product/productParent` Vuex store getter. +- `parentProduct` - A computed property that represents the current product parent product, if any. Gets its value from `product/productParent` Vuex store getter. - `attributesByCode` - A computed property that returns the list of all product attributes by their code. Gets its value from `attribute/attributeListByCode` Vuex store getter. - `attributesById` - A computed property that returns the list of all product attributes by their ID. Gets its value from `attribute/attributeListById` Vuex store getter. **This prop is not used anywhere**. - `breadcrumbs` - A computed property that represents breadcrumbs for the current product. Gets its value from `product/breadcrumbs` Vuex store getter. -- `configuration` - A computed property that represents an object that shows which attributes (like size and color) are chosen on the product. Gets its value from `product/currentConfiguration` Vuex store getter. +- `configuration` - A computed property that represents an object that shows which attributes (like size and color) are chosen on the product. Gets its value from `product/currentConfiguration` Vuex store getter. - `options` - A computed property that represents an object that shows what attributes (like size and color) with what values are available on the product. Gets its value from `product/currentOptions` Vuex store getter. - `category` - A computed property representing a category object of the current product. Gets its value from `category/getCurrentCategory` Vuex store getter. - `productName` - A computed property that represents a product name. Gets its value from `category/getCurrentCategory` Vuex store getter. -- `productId` - A computed property representing a product ID. Gets its value from `category/getCurrentCategory` Vuex store getter. +- `productId` - A computed property representing a product ID. Gets its value from `category/getCurrentCategory` Vuex store getter. - `isOnCompare` - A computed property that checks if a given product is in compare list. - `image` - A computed property that defines an image (thumbnail) that will be shown on the page and its size. - `customAttributes` - this is a subset of `attributesByCode` list of attributes that the current product has. @@ -55,7 +55,7 @@ Dispatches `product/reset` action that sets the current product to the original _Parameters_ -- `{store, route}` - An object that consists of references to the Vuex store and global router object. +- `{store, route}` - An object that consists of references to the Vuex store and global router object. #### stateCheck diff --git a/src/themes/default-amp/components/core/Header.vue b/src/themes/default-amp/components/core/Header.vue index 29cfa03e61..4eb4854bbb 100755 --- a/src/themes/default-amp/components/core/Header.vue +++ b/src/themes/default-amp/components/core/Header.vue @@ -23,7 +23,10 @@
- + {{ $t('Return to shopping') }}
@@ -33,12 +36,14 @@
- - {{ $t('Login to your account') }} - - - {{ $t('You are logged in as') }} {{ currentUser.firstname }} - + {{ $t('Login to your account') }} + + {{ $t('You are logged in as') }} {{ currentUser.firstname }}
@@ -79,9 +84,13 @@ export default { }) }, beforeMount () { - window.addEventListener('scroll', () => { - this.isScrolling = true - }, {passive: true}) + window.addEventListener( + 'scroll', + () => { + this.isScrolling = true + }, + { passive: true } + ) setInterval(() => { if (this.isScrolling) { @@ -96,7 +105,10 @@ export default { }, hasScrolled () { this.scrollTop = window.scrollY - if (this.scrollTop > this.lastScrollTop && this.scrollTop > this.navbarHeight) { + if ( + this.scrollTop > this.lastScrollTop && + this.scrollTop > this.navbarHeight + ) { this.navVisible = false } else { this.navVisible = true @@ -115,7 +127,7 @@ $color-icon-hover: color(secondary, $colors-background); header { height: 54px; top: -55px; - z-index: 2; + z-index: 3; transition: top 0.2s ease-in-out; &.is-visible { top: 0; @@ -148,12 +160,13 @@ header { } } .col-xs-2:first-of-type { - padding-left: 0; + padding-left: 0; } .col-xs-2:last-of-type { - padding-right: 0; + padding-right: 0; } - a, span { + a, + span { font-size: 12px; } } diff --git a/src/themes/default/components/core/ProductTile.vue b/src/themes/default/components/core/ProductTile.vue index 100e5d832e..3a5d8f8f19 100644 --- a/src/themes/default/components/core/ProductTile.vue +++ b/src/themes/default/components/core/ProductTile.vue @@ -1,8 +1,25 @@ @@ -54,11 +65,17 @@ import rootStore from '@vue-storefront/core/store' import { ProductTile } from '@vue-storefront/core/modules/catalog/components/ProductTile.ts' import config from 'config' import ProductImage from './ProductImage' +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' export default { - mixins: [ProductTile], + mixins: [ProductTile, IsOnWishlist, IsOnCompare], components: { - ProductImage + ProductImage, + AddToWishlist, + AddToCompare }, props: { labelsActive: { @@ -76,6 +93,9 @@ export default { src: this.thumbnail, loading: this.thumbnail } + }, + favoriteIcon () { + return this.isOnWishlist ? 'favorite' : 'favorite_border' } }, methods: { @@ -85,21 +105,24 @@ export default { } }, visibilityChanged (isVisible, entry) { - if (isVisible) { - if (config.products.configurableChildrenStockPrefetchDynamic && rootStore.products.filterUnavailableVariants) { - const skus = [this.product.sku] - if (this.product.type_id === 'configurable' && this.product.configurable_children && this.product.configurable_children.length > 0) { - for (const confChild of this.product.configurable_children) { - const cachedItem = rootStore.state.stock.cache[confChild.id] - if (typeof cachedItem === 'undefined' || cachedItem === null) { - skus.push(confChild.sku) - } - } - if (skus.length > 0) { - rootStore.dispatch('stock/list', { skus: skus }) // store it in the cache - } + if ( + isVisible && + config.products.configurableChildrenStockPrefetchDynamic && + rootStore.products.filterUnavailableVariants && + this.product.type_id === 'configurable' && + this.product.configurable_children && + this.product.configurable_children.length > 0 + ) { + const skus = [this.product.sku] + for (const confChild of this.product.configurable_children) { + const cachedItem = rootStore.state.stock.cache[confChild.id] + if (typeof cachedItem === 'undefined' || cachedItem === null) { + skus.push(confChild.sku) } } + if (skus.length > 0) { + rootStore.dispatch('stock/list', { skus: skus }) // store it in the cache + } } } }, @@ -122,9 +145,36 @@ $border-secondary: color(secondary, $colors-border); $color-white: color(white); .product { + position: relative; @media (max-width: 767px) { padding-bottom: 10px; } + &__icons { + position: absolute; + top: 0; + right: 0; + display: flex; + flex-direction: column; + padding-right: 20px; + padding-top: 10px; + } + &__icon { + padding-top: 10px; + opacity: 0; + z-index: 2; + transition: 0.3s opacity $motion-main; + @media (max-width: 767px) { + opacity: 1; + } + &--active { + opacity: 1; + } + } + &:hover { + .product__icon { + opacity: 1; + } + } } .price-original { @@ -146,35 +196,35 @@ $color-white: color(white); font-size: 12px; } -.product-cover{ +.product-cover { overflow: hidden; max-height: 300px; - &__thumb{ + &__thumb { padding-bottom: calc(143.88% / (164.5 / 100)); - @media screen and (min-width: 768px){ + @media screen and (min-width: 768px) { padding-bottom: calc(300% / (276.5 / 100)); } - opacity: .8; + opacity: 0.8; will-change: opacity, transform; - transition: .3s opacity $motion-main, .3s transform $motion-main; + transition: 0.3s opacity $motion-main, 0.3s transform $motion-main; } - &:hover{ - .product-cover__thumb{ + &:hover { + .product-cover__thumb { opacity: 1; transform: scale(1.1); } &.sale::after, - &.new::after{ - opacity: .8; + &.new::after { + opacity: 0.8; } } - &.sale{ + &.sale { &::after { @extend %label; content: 'Sale'; } } - &.new{ + &.new { &::after { @extend %label; content: 'New'; diff --git a/src/themes/default/components/core/blocks/Compare/AddToCompare.vue b/src/themes/default/components/core/blocks/Compare/AddToCompare.vue new file mode 100644 index 0000000000..da996729f5 --- /dev/null +++ b/src/themes/default/components/core/blocks/Compare/AddToCompare.vue @@ -0,0 +1,28 @@ + + + diff --git a/src/themes/default/components/core/blocks/Header/Header.vue b/src/themes/default/components/core/blocks/Header/Header.vue index bac6c645fa..e7e2c8e2e3 100644 --- a/src/themes/default/components/core/blocks/Header/Header.vue +++ b/src/themes/default/components/core/blocks/Header/Header.vue @@ -35,7 +35,10 @@
- + {{ $t('Return to shopping') }}
@@ -45,12 +48,13 @@
- - {{ $t('Login to your account') }} - - - {{ $t('You are logged in as') }} {{ currentUser.firstname }} - + {{ $t('Login to your account') }} + {{ $t('You are logged in as') }} {{ currentUser.firstname }}
@@ -98,13 +102,19 @@ export default { currentUser: state => state.user.current }), isThankYouPage () { - return this.$store.state.checkout.isThankYouPage ? this.$store.state.checkout.isThankYouPage : false + return this.$store.state.checkout.isThankYouPage + ? this.$store.state.checkout.isThankYouPage + : false } }, beforeMount () { - window.addEventListener('scroll', () => { - this.isScrolling = true - }, {passive: true}) + window.addEventListener( + 'scroll', + () => { + this.isScrolling = true + }, + { passive: true } + ) setInterval(() => { if (this.isScrolling) { @@ -119,7 +129,10 @@ export default { }, hasScrolled () { this.scrollTop = window.scrollY - if (this.scrollTop > this.lastScrollTop && this.scrollTop > this.navbarHeight) { + if ( + this.scrollTop > this.lastScrollTop && + this.scrollTop > this.navbarHeight + ) { this.navVisible = false } else { this.navVisible = true @@ -138,7 +151,7 @@ $color-icon-hover: color(secondary, $colors-background); header { height: 54px; top: -55px; - z-index: 2; + z-index: 3; transition: top 0.2s ease-in-out; &.is-visible { top: 0; @@ -171,12 +184,13 @@ header { } } .col-xs-2:first-of-type { - padding-left: 0; + padding-left: 0; } .col-xs-2:last-of-type { - padding-right: 0; + padding-right: 0; } - a, span { + a, + span { font-size: 12px; } } diff --git a/src/themes/default/components/core/blocks/Header/MinimalHeader.vue b/src/themes/default/components/core/blocks/Header/MinimalHeader.vue index 8b93243685..87ca8a66de 100644 --- a/src/themes/default/components/core/blocks/Header/MinimalHeader.vue +++ b/src/themes/default/components/core/blocks/Header/MinimalHeader.vue @@ -9,7 +9,11 @@
@@ -19,12 +23,7 @@ @@ -55,7 +54,7 @@ $color-icon-hover: color(secondary, $colors-background); header { height: 54px; top: -55px; - z-index: 2; + z-index: 3; transition: top 0.2s ease-in-out; &.is-visible { top: 0; @@ -88,12 +87,13 @@ header { } } .col-xs-2:first-of-type { - padding-left: 0; + padding-left: 0; } .col-xs-2:last-of-type { - padding-right: 0; + padding-right: 0; } - a, span { + a, + span { font-size: 12px; } } diff --git a/src/themes/default/components/core/blocks/Wishlist/AddToWishlist.vue b/src/themes/default/components/core/blocks/Wishlist/AddToWishlist.vue index 672bc03e99..0259b77f78 100644 --- a/src/themes/default/components/core/blocks/Wishlist/AddToWishlist.vue +++ b/src/themes/default/components/core/blocks/Wishlist/AddToWishlist.vue @@ -1,12 +1,14 @@ diff --git a/src/themes/default/pages/Compare.vue b/src/themes/default/pages/Compare.vue index a32b940c68..074e7ce644 100644 --- a/src/themes/default/pages/Compare.vue +++ b/src/themes/default/pages/Compare.vue @@ -18,20 +18,26 @@
  • {{ $t('SKU') }}
  • -
  • +
  • {{ attr.default_frontend_label }}
    • -
    • +
    • - - -
      • @@ -72,7 +78,6 @@