diff --git a/addons/website/controllers/main.py b/addons/website/controllers/main.py
index d322366f359..34838401607 100644
--- a/addons/website/controllers/main.py
+++ b/addons/website/controllers/main.py
@@ -283,6 +283,10 @@ class Website(Home):
views = views.sorted(key=lambda v: (v.inherit_id.id, v.name))
return views.read(['name', 'id', 'key', 'xml_id', 'arch', 'active', 'inherit_id'])
+ @http.route('/website/toggle_switchable_view', type='json', auth='user', website=True)
+ def toggle_switchable_view(self, view_key):
+ request.website.viewref(view_key).toggle()
+
@http.route('/website/reset_template', type='http', auth='user', methods=['POST'], website=True, csrf=False)
def reset_template(self, view_id, mode='soft', redirect='/', **kwargs):
""" This method will try to reset a broken view.
diff --git a/addons/website/static/src/js/menu/customize.js b/addons/website/static/src/js/menu/customize.js
index 59c4e865242..00d2bef687b 100644
--- a/addons/website/static/src/js/menu/customize.js
+++ b/addons/website/static/src/js/menu/customize.js
@@ -12,7 +12,7 @@ var CustomizeMenu = Widget.extend({
xmlDependencies: ['/website/static/src/xml/website.editor.xml'],
events: {
'show.bs.dropdown': '_onDropdownShow',
- 'click .dropdown-item[data-view-id]': '_onCustomizeOptionClick',
+ 'click .dropdown-item[data-view-key]': '_onCustomizeOptionClick',
},
/**
@@ -44,17 +44,18 @@ var CustomizeMenu = Widget.extend({
* Enables/Disables a view customization whose id is given.
*
* @private
- * @param {integer} viewID
+ * @param {string} viewKey
* @returns {Promise}
* Unresolved if the customization succeeded as the page will be
* reloaded.
* Rejected otherwise.
*/
- _doCustomize: function (viewID) {
+ _doCustomize: function (viewKey) {
return this._rpc({
- model: 'ir.ui.view',
- method: 'toggle',
- args: [[viewID]],
+ route: '/website/toggle_switchable_view',
+ params: {
+ 'view_key': viewKey,
+ },
}).then(function () {
window.location.reload();
return new Promise(function () {});
@@ -92,7 +93,7 @@ var CustomizeMenu = Widget.extend({
currentGroup = item.inherit_id[1];
$menu.append('
');
}
- var $a = $('', {href: '#', class: 'dropdown-item', 'data-view-id': item.id, role: 'menuitem'})
+ var $a = $('', {href: '#', class: 'dropdown-item', 'data-view-key': item.key, role: 'menuitem'})
.append(qweb.render('website.components.switch', {id: 'switch-' + item.id, label: item.name}));
$a.find('input').prop('checked', !!item.active);
$menu.append($a);
@@ -113,8 +114,8 @@ var CustomizeMenu = Widget.extend({
*/
_onCustomizeOptionClick: function (ev) {
ev.preventDefault();
- var viewID = parseInt($(ev.currentTarget).data('view-id'), 10);
- this._doCustomize(viewID);
+ var viewKey = $(ev.currentTarget).data('viewKey');
+ this._doCustomize(viewKey);
},
/**
* @private
diff --git a/addons/website_sale/controllers/main.py b/addons/website_sale/controllers/main.py
index de1bfcc6915..6f92c035714 100644
--- a/addons/website_sale/controllers/main.py
+++ b/addons/website_sale/controllers/main.py
@@ -126,6 +126,12 @@ class Website(Website):
views = [v for v in views if v['id'] != view_product_variants.id]
return views
+ @http.route()
+ def toggle_switchable_view(self, view_key):
+ super(Website, self).toggle_switchable_view(view_key)
+ if view_key in ('website_sale.products_list_view', 'website_sale.add_grid_or_list_option'):
+ request.session.pop('website_sale_shop_layout_mode', None)
+
class WebsiteSale(http.Controller):
@@ -268,6 +274,13 @@ class WebsiteSale(http.Controller):
compute_currency = self._get_compute_currency(pricelist, products[:1])
+ layout_mode = request.session.get('website_sale_shop_layout_mode')
+ if not layout_mode:
+ if request.website.viewref('website_sale.products_list_view').active:
+ layout_mode = 'list'
+ else:
+ layout_mode = 'grid'
+
values = {
'search': search,
'category': category,
@@ -287,6 +300,7 @@ class WebsiteSale(http.Controller):
'keep': keep,
'parent_category_ids': parent_category_ids,
'search_categories_ids': search_categories and search_categories.ids,
+ 'layout_mode': layout_mode,
}
if category:
values['main_object'] = category
@@ -475,6 +489,11 @@ class WebsiteSale(http.Controller):
})
return value
+ @http.route('/shop/save_shop_layout_mode', type='json', auth='public', website=True)
+ def save_shop_layout_mode(self, layout_mode):
+ assert layout_mode in ('grid', 'list'), "Invalid shop layout mode"
+ request.session['website_sale_shop_layout_mode'] = layout_mode
+
# ------------------------------------------------------
# Checkout
# ------------------------------------------------------
diff --git a/addons/website_sale/static/src/js/website_sale.js b/addons/website_sale/static/src/js/website_sale.js
index dda36aa12e9..b1771a6e4fe 100644
--- a/addons/website_sale/static/src/js/website_sale.js
+++ b/addons/website_sale/static/src/js/website_sale.js
@@ -189,15 +189,6 @@ publicWidget.registry.WebsiteSale = publicWidget.Widget.extend(VariantMixin, {
this._startZoom();
- var $active = null;
- if (this.$('#products_grid').hasClass('o_wsale_layout_list')) {
- $active = this.$('.o_wsale_apply_list');
- } else {
- $active = this.$('.o_wsale_apply_grid');
- }
- $active.find('input').prop('checked', true);
- $active.button('toggle').blur();
-
return def;
},
/**
@@ -442,6 +433,12 @@ publicWidget.registry.WebsiteSale = publicWidget.Widget.extend(VariantMixin, {
*/
_onApplyShopLayoutChange: function (ev) {
var switchToList = $(ev.currentTarget).find('.o_wsale_apply_list input').is(':checked');
+ this._rpc({
+ route: '/shop/save_shop_layout_mode',
+ params: {
+ 'layout_mode': switchToList ? 'list' : 'grid',
+ },
+ });
var $grid = this.$('#products_grid');
// Disable transition on all list elements, then switch to the new
// layout then reenable all transitions after having forced a redraw
diff --git a/addons/website_sale/views/templates.xml b/addons/website_sale/views/templates.xml
index ed77d418665..d0de096639d 100644
--- a/addons/website_sale/views/templates.xml
+++ b/addons/website_sale/views/templates.xml
@@ -215,7 +215,7 @@