diff options
| author | qsm-odoo <qsm@odoo.com> | 2019-08-28 15:41:22 +0000 |
|---|---|---|
| committer | qsm-odoo <qsm@odoo.com> | 2019-08-29 07:24:16 +0000 |
| commit | 3daed421f4c06ce0851efb8eab0071b7fc002bff (patch) | |
| tree | bd1d73fb85ab7c29fa17a043c6c5ed64065b00d3 /addons/website/static/src | |
| parent | 4e9416b4d58cca1ad0d0a8000c159077a88ba8d3 (diff) | |
[FIX] website: restore edit menu dialog
Since saas-12.5, with recent ORM changes, writing on non-existing fields
does not trigger a warning anymore but instead crashes. This revealed
that the 12.0 "Edit Menu" dialog was doing some of that. Indeed,
depending on what was edited, we ended up writing on the 'is_homepage'
field, the 'text' field, the 'isNewWindow' field, ... which do not
exist.
This commit takes advantage of the fix to also lint the dialog code and
convert some of it to ES6.
Discovered while working on task-1925319
closes odoo/odoo#36204
Signed-off-by: Quentin Smetz (qsm) <qsm@odoo.com>
Diffstat (limited to 'addons/website/static/src')
| -rw-r--r-- | addons/website/static/src/js/menu/content.js | 97 | ||||
| -rw-r--r-- | addons/website/static/src/xml/website.contentMenu.xml | 4 |
2 files changed, 51 insertions, 50 deletions
diff --git a/addons/website/static/src/js/menu/content.js b/addons/website/static/src/js/menu/content.js index 9582e0f4778..491de616592 100644 --- a/addons/website/static/src/js/menu/content.js +++ b/addons/website/static/src/js/menu/content.js @@ -369,13 +369,12 @@ var MenuEntryDialog = weWidgets.LinkDialog.extend({ * @constructor */ init: function (parent, options, data) { - data.text = data.name || ''; - data.isNewWindow = data.new_window; - this._super(parent, _.extend({ title: _t("Add a menu item"), }, options || {}), _.extend({ needLabel: true, + text: data.name || '', + isNewWindow: data.new_window, }, data || {})); }, /** @@ -469,7 +468,6 @@ var EditMenuDialog = weWidgets.Dialog.extend({ */ willStart: function () { var defs = [this._super.apply(this, arguments)]; - var self = this; var context; this.trigger_up('context_get', { callback: function (ctx) { @@ -480,11 +478,11 @@ var EditMenuDialog = weWidgets.Dialog.extend({ model: 'website.menu', method: 'get_tree', args: [context.website_id, this.rootID], - }).then(function (menu) { - self.menu = menu; - self.root_menu_id = menu.id; - self.flat = self._flatenize(menu); - self.to_delete = []; + }).then(menu => { + this.menu = menu; + this.rootMenuID = menu.fields['id']; + this.flat = this._flatenize(menu); + this.toDelete = []; })); return Promise.all(defs); }, @@ -518,8 +516,7 @@ var EditMenuDialog = weWidgets.Dialog.extend({ */ save: function () { var _super = this._super.bind(this); - var self = this; - var new_menu = this.$('.oe_menu_editor').nestedSortable('toArray', {startDepthCount: 0}); + var newMenus = this.$('.oe_menu_editor').nestedSortable('toArray', {startDepthCount: 0}); var levels = []; var data = []; var context; @@ -529,20 +526,25 @@ var EditMenuDialog = weWidgets.Dialog.extend({ }, }); // Resequence, re-tree and remove useless data - new_menu.forEach(function (menu) { + newMenus.forEach(menu => { if (menu.id) { levels[menu.depth] = (levels[menu.depth] || 0) + 1; - var mobj = self.flat[menu.id]; - mobj.sequence = levels[menu.depth]; - mobj.parent_id = (menu.parent_id|0) || menu.parent_id || self.root_menu_id; - delete(mobj.children); - data.push(mobj); + var menuFields = this.flat[menu.id].fields; + menuFields['sequence'] = levels[menu.depth]; + menuFields['parent_id'] = parseInt(menu['parent_id']) || this.rootMenuID; + data.push(menuFields); } }); - this._rpc({ + return this._rpc({ model: 'website.menu', method: 'save', - args: [context.website_id, { data: data, to_delete: self.to_delete }], + args: [ + context.website_id, + { + 'data': data, + 'to_delete': this.toDelete, + } + ], }).then(function () { return _super(); }); @@ -563,10 +565,9 @@ var EditMenuDialog = weWidgets.Dialog.extend({ */ _flatenize: function (node, _dict) { _dict = _dict || {}; - var self = this; - _dict[node.id] = node; - node.children.forEach(function (child) { - self._flatenize(child, _dict); + _dict[node.fields['id']] = node; + node.children.forEach(child => { + this._flatenize(child, _dict); }); return _dict; }, @@ -582,21 +583,24 @@ var EditMenuDialog = weWidgets.Dialog.extend({ * @private */ _onAddMenuButtonClick: function () { - var self = this; var dialog = new MenuEntryDialog(this, {}, {}); - dialog.on('save', this, function (link) { - var new_menu = { - id: _.uniqueId('new-'), - name: link.text, - url: link.url, - new_window: link.isNewWindow, - parent_id: false, - sequence: 0, - children: [], + dialog.on('save', this, link => { + var newMenu = { + 'fields': { + 'id': _.uniqueId('new-'), + 'name': link.text, + 'url': link.url, + 'new_window': link.isNewWindow, + 'sequence': 0, + 'parent_id': false, + }, + 'children': [], + 'is_homepage': false, }; - self.flat[new_menu.id] = new_menu; - self.$('.oe_menu_editor').append( - qweb.render('website.contentMenu.dialog.submenu', { submenu: new_menu })); + this.flat[newMenu.fields['id']] = newMenu; + this.$('.oe_menu_editor').append( + qweb.render('website.contentMenu.dialog.submenu', {submenu: newMenu}) + ); }); dialog.open(); }, @@ -607,9 +611,9 @@ var EditMenuDialog = weWidgets.Dialog.extend({ */ _onDeleteMenuButtonClick: function (ev) { var $menu = $(ev.currentTarget).closest('[data-menu-id]'); - var menuID = $menu.data('menu-id')|0; + var menuID = parseInt($menu.data('menu-id')); if (menuID) { - this.to_delete.push(menuID); + this.toDelete.push(menuID); } $menu.remove(); }, @@ -620,21 +624,18 @@ var EditMenuDialog = weWidgets.Dialog.extend({ * @private */ _onEditMenuButtonClick: function (ev) { - var self = this; - var menu_id = $(ev.currentTarget).closest('[data-menu-id]').data('menu-id'); - var menu = self.flat[menu_id]; + var $menu = $(ev.currentTarget).closest('[data-menu-id]'); + var menuID = $menu.data('menu-id'); + var menu = this.flat[menuID]; if (menu) { - var dialog = new MenuEntryDialog(this, {}, menu); - dialog.on('save', this, function (link) { - var id = link.id; - var menu_obj = self.flat[id]; - _.extend(menu_obj, { + var dialog = new MenuEntryDialog(this, {}, menu.fields); + dialog.on('save', this, link => { + _.extend(menu.fields, { 'name': link.text, 'url': link.url, 'new_window': link.isNewWindow, }); - var $menu = self.$('[data-menu-id="' + id + '"]'); - $menu.find('.js_menu_label').first().text(menu_obj.name); + $menu.find('.js_menu_label').first().text(menu.fields['name']); }); dialog.open(); } else { diff --git a/addons/website/static/src/xml/website.contentMenu.xml b/addons/website/static/src/xml/website.contentMenu.xml index edf166b946d..9c938c38847 100644 --- a/addons/website/static/src/xml/website.contentMenu.xml +++ b/addons/website/static/src/xml/website.contentMenu.xml @@ -1,14 +1,14 @@ <?xml version="1.0" encoding="UTF-8"?> <templates id="template" xml:space="preserve"> <t t-name="website.contentMenu.dialog.submenu"> - <li t-att-data-menu-id="submenu.id"> + <li t-att-data-menu-id="submenu.fields['id']"> <div class="input-group"> <div class="input-group-prepend"> <span class="input-group-text fa fa-bars" role="img" aria-label="Dropdown menu" title="Dropdown menu"/> </div> <span class="form-control d-flex align-items-center"> <span class="js_menu_label o_text_overflow flex-grow-1"> - <t t-esc="submenu.name"/> + <t t-esc="submenu.fields['name']"/> </span> <i t-if="submenu.is_homepage" class="fa fa-home ml-3" role="img" aria-label="Home" title="Home"/> </span> |
