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 @@
-
+
Drag building blocks here to customize the header for "" category.
@@ -308,11 +308,11 @@