diff --git a/addons/test_website/static/tests/tours/custom_snippets.js b/addons/test_website/static/tests/tours/custom_snippets.js new file mode 100644 index 00000000000..1b6b4a593ba --- /dev/null +++ b/addons/test_website/static/tests/tours/custom_snippets.js @@ -0,0 +1,96 @@ +odoo.define('test_website.custom_snippets', function (require) { +'use strict'; + +var tour = require('web_tour.tour'); + +/** + * The purpose of this tour is to check the custom snippets flow: + * + * -> go to edit mode + * -> drag a banner into page content + * -> customize banner (set text) + * -> save banner as custom snippet + * -> confirm name (TODO: remove when implicit default name feature is implemented) + * -> go to blocks + * -> ensure custom snippet is available + * -> drag custom snippet + * -> ensure block appears as banner + * -> ensure block appears as custom banner + * -> delete custom snippet + * -> confirm delete + * -> ensure it was deleted + */ + +tour.register('test_custom_snippet', { + url: '/', + test: true +}, [ + { + content: "enter edit mode", + trigger: "a[data-action=edit]" + }, + { + content: "drop a snippet", + trigger: "#oe_snippets .oe_snippet[name='Banner'] .oe_snippet_thumbnail:not(.o_we_already_dragging)", + extra_trigger: "body.editor_enable.editor_has_snippets", + moveTrigger: ".oe_drop_zone", + run: "drag_and_drop #wrap", + }, + { + content: "customize snippet", + trigger: "#wrapwrap .s_banner h1", + run: "text", + consumeEvent: "input", + }, + { + content: "save custom snippet", + trigger: ".snippet-option-SnippetSave we-button", + }, + { + content: "confirm save name", + trigger: ".modal-dialog button span:contains('Save')", + }, + { + content: "go to blocks", + trigger: ".o_we_add_snippet_btn", + }, + { + content: "ensure custom snippet appeared", + trigger: "#oe_snippets .oe_snippet[name='Custom Banner']", + run: function() {}, // check + }, + { + content: "drop custom snippet", + trigger: ".oe_snippet[name='Custom Banner'] .oe_snippet_thumbnail:not(.o_we_already_dragging)", + extra_trigger: "body.editor_enable.editor_has_snippets", + moveTrigger: ".oe_drop_zone", + run: "drag_and_drop #wrap", + }, + { + content: "ensure banner section exists", + trigger: "#wrap section[data-name='Banner']", + run: function() {}, // check + }, + { + content: "ensure custom banner section exists", + trigger: "#wrap section[data-name='Custom Banner']", + run: function() {}, // check + }, + { + content: "delete custom snippet", + trigger: ".oe_snippet[name='Custom Banner'] we-button.o_delete_btn", + extra_trigger: ".oe_snippet[name='Custom Banner'] .oe_snippet_thumbnail:not(.o_we_already_dragging)", + }, + { + content: "confirm delete", + trigger: ".modal-dialog button:has(span:contains('Yes'))", + }, + { + content: "ensure custom snippet disappeared", + trigger: "#oe_snippets", + extra_trigger: "#oe_snippets:not(:has(.oe_snippet[name='Custom Banner']))", + run: function() {}, // check + }, +]); + +}); diff --git a/addons/test_website/tests/__init__.py b/addons/test_website/tests/__init__.py index 08a794bfaab..c5469f4cd31 100644 --- a/addons/test_website/tests/__init__.py +++ b/addons/test_website/tests/__init__.py @@ -2,6 +2,7 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. from . import test_controller_args +from . import test_custom_snippet from . import test_error from . import test_is_multilang from . import test_multi_company diff --git a/addons/test_website/tests/test_custom_snippet.py b/addons/test_website/tests/test_custom_snippet.py new file mode 100644 index 00000000000..c79ed227dc0 --- /dev/null +++ b/addons/test_website/tests/test_custom_snippet.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +import odoo.tests +from odoo.tools import mute_logger + + +@odoo.tests.common.tagged('post_install', '-at_install') +class TestCustomSnippet(odoo.tests.HttpCase): + + @mute_logger('odoo.addons.http_routing.models.ir_http', 'odoo.http') + def test_01_run_tour(self): + self.start_tour("/", 'test_custom_snippet', login="admin") diff --git a/addons/test_website/views/templates.xml b/addons/test_website/views/templates.xml index 9d12bd612a6..2bbee7e9714 100644 --- a/addons/test_website/views/templates.xml +++ b/addons/test_website/views/templates.xml @@ -11,6 +11,7 @@ + diff --git a/addons/web_editor/static/src/js/editor/snippets.editor.js b/addons/web_editor/static/src/js/editor/snippets.editor.js index 210d81f2075..ace0bbc8a96 100644 --- a/addons/web_editor/static/src/js/editor/snippets.editor.js +++ b/addons/web_editor/static/src/js/editor/snippets.editor.js @@ -2356,6 +2356,8 @@ var SnippetsMenu = Widget.extend({ */ _onDeleteBtnClick: function (ev) { const $snippet = $(ev.target).closest('.oe_snippet'); + const snippetId = parseInt(ev.currentTarget.dataset.snippetId); + ev.stopPropagation(); new Dialog(this, { size: 'medium', title: _t('Confirmation'), @@ -2369,7 +2371,7 @@ var SnippetsMenu = Widget.extend({ model: 'ir.ui.view', method: 'delete_snippet', kwargs: { - 'view_id': parseInt(ev.currentTarget.dataset.snippetId), + 'view_id': snippetId, 'template_key': this.options.snippets, }, });