diff options
Diffstat (limited to 'addons/web')
| -rw-r--r-- | addons/web/static/src/js/components/dropdown_menu.js | 7 | ||||
| -rw-r--r-- | addons/web/static/src/js/views/form/form_controller.js | 6 | ||||
| -rw-r--r-- | addons/web/static/src/xml/base.xml | 1 | ||||
| -rw-r--r-- | addons/web/static/tests/views/form_tests.js | 52 |
4 files changed, 62 insertions, 4 deletions
diff --git a/addons/web/static/src/js/components/dropdown_menu.js b/addons/web/static/src/js/components/dropdown_menu.js index 0684a1fd69d..c536f3caba7 100644 --- a/addons/web/static/src/js/components/dropdown_menu.js +++ b/addons/web/static/src/js/components/dropdown_menu.js @@ -110,7 +110,11 @@ odoo.define('web.DropdownMenu', function (require) { * @private * @param {OwlEvent} ev */ - _onItemSelected(ev) { } + _onItemSelected(/* ev */) { + if (this.props.closeOnSelected) { + this.state.open = false; + } + } /** * @private @@ -143,6 +147,7 @@ odoo.define('web.DropdownMenu', function (require) { optional: 1, }, title: { type: String, optional: 1 }, + closeOnSelected: { type: Boolean, optional: 1 }, }; DropdownMenu.template = 'web.DropdownMenu'; diff --git a/addons/web/static/src/js/views/form/form_controller.js b/addons/web/static/src/js/views/form/form_controller.js index eeb1153b16f..30eea51d740 100644 --- a/addons/web/static/src/js/views/form/form_controller.js +++ b/addons/web/static/src/js/views/form/form_controller.js @@ -188,15 +188,15 @@ var FormController = BasicController.extend({ * @override * @private **/ - _getActionMenuItems: function () { + _getActionMenuItems: function (state) { if (!this.hasActionMenus || this.mode === 'edit') { return null; } const props = this._super(...arguments); - const activeField = this.model.getActiveField(this.initialState); + const activeField = this.model.getActiveField(state); const otherActionItems = []; if (this.archiveEnabled && activeField) { - if (this.initialState.data[activeField]) { + if (state.data[activeField]) { otherActionItems.push({ description: _t("Archive"), callback: () => { diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index 0c3c5813a87..7cb009b95fb 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -624,6 +624,7 @@ title="env._t('Action')" items="actionItems" icon="'fa fa-cog'" + closeOnSelected="true" /> </div> </t> diff --git a/addons/web/static/tests/views/form_tests.js b/addons/web/static/tests/views/form_tests.js index 99c49fc9519..227980cc634 100644 --- a/addons/web/static/tests/views/form_tests.js +++ b/addons/web/static/tests/views/form_tests.js @@ -2136,6 +2136,58 @@ QUnit.module('Views', { form.destroy(); }); + QUnit.test('archive/unarchive a record', async function (assert) { + assert.expect(10); + + // add active field on partner model to have archive option + this.data.partner.fields.active = {string: 'Active', type: 'char', default: true}; + + const form = await createView({ + View: FormView, + model: 'partner', + data: this.data, + res_id: 1, + viewOptions: { hasActionMenus: true }, + arch: '<form><field name="active"/><field name="foo"/></form>', + mockRPC: function (route, args) { + assert.step(args.method); + if (args.method === 'action_archive') { + this.data.partner.records[0].active = false; + return Promise.resolve(); + } + if (args.method === 'action_unarchive') { + this.data.partner.records[0].active = true; + return Promise.resolve(); + } + return this._super(...arguments); + }, + }); + + await cpHelpers.toggleActionMenu(form); + assert.containsOnce(form, '.o_cp_action_menus a:contains(Archive)'); + + await cpHelpers.toggleMenuItem(form, "Archive"); + assert.containsOnce(document.body, '.modal'); + + await testUtils.dom.click($('.modal-footer .btn-primary')); + await cpHelpers.toggleActionMenu(form); + assert.containsOnce(form, '.o_cp_action_menus a:contains(Unarchive)'); + + await cpHelpers.toggleMenuItem(form, "Unarchive"); + await cpHelpers.toggleActionMenu(form); + assert.containsOnce(form, '.o_cp_action_menus a:contains(Archive)'); + + assert.verifySteps([ + 'read', + 'action_archive', + 'read', + 'action_unarchive', + 'read', + ]); + + form.destroy(); + }); + QUnit.test('can duplicate a record', async function (assert) { assert.expect(3); |
