diff --git a/addons/website/data/website_data.xml b/addons/website/data/website_data.xml index 5bcbc10e10f..180667f0d63 100644 --- a/addons/website/data/website_data.xml +++ b/addons/website/data/website_data.xml @@ -240,8 +240,13 @@ / self + + Website Edit Mode + /?enable_editor=1 + self + - + open diff --git a/addons/website/models/ir_actions.py b/addons/website/models/ir_actions.py index 24fbc937514..305820503c7 100644 --- a/addons/website/models/ir_actions.py +++ b/addons/website/models/ir_actions.py @@ -60,3 +60,18 @@ class ServerAction(models.Model): """ res = super(ServerAction, self)._run_action_code_multi(eval_context) return eval_context.get('response', res) + + +class IrActionsTodo(models.Model): + _name = 'ir.actions.todo' + _inherit = 'ir.actions.todo' + + def action_launch(self): + res = super().action_launch() # do ensure_one() + + if self.id == self.env.ref('website.theme_install_todo').id: + # Pick a theme consume all ir.actions.todo by default (due to lower sequence). + # Once done, we re-enable the main ir.act.todo: open_menu + self.env.ref('base.open_menu').action_open() + + return res diff --git a/addons/website/models/ir_module_module.py b/addons/website/models/ir_module_module.py index ff843663161..9ec53dcc519 100644 --- a/addons/website/models/ir_module_module.py +++ b/addons/website/models/ir_module_module.py @@ -360,7 +360,11 @@ class IrModuleModule(models.Model): # this will install 'self' if it is not installed yet self._theme_upgrade_upstream() - return website.button_go_website(mode_edit=True) + active_todo = self.env['ir.actions.todo'].search([('state', '=', 'open')], limit=1) + if active_todo: + return active_todo.action_launch() + else: + return website.button_go_website(mode_edit=True) def button_remove_theme(self): """Remove the current theme of the current website.""" diff --git a/addons/website/static/src/js/menu/new_content.js b/addons/website/static/src/js/menu/new_content.js index e52801bd123..13de4a27794 100644 --- a/addons/website/static/src/js/menu/new_content.js +++ b/addons/website/static/src/js/menu/new_content.js @@ -5,6 +5,7 @@ var core = require('web.core'); var Dialog = require('web.Dialog'); var websiteNavbarData = require('website.navbar'); var wUtils = require('website.utils'); +var tour = require('web_tour.tour'); var qweb = core.qweb; var _t = core._t; @@ -56,6 +57,15 @@ var NewContentMenu = websiteNavbarData.WebsiteNavbarActionWidget.extend({ this.$lastLink = this.$newContentMenuChoices.find('a:last'); if ($.deparam.querystring()[enableFlag] !== undefined) { + Object.keys(tour.tours).forEach( + el => { + let element = tour.tours[el]; + if (element.steps[0].trigger == '#new-content-menu > a' + && !element.steps[0].extra_trigger) { + element.steps[0].auto = true; + } + } + ); this._showMenu(); } return this._super.apply(this, arguments); diff --git a/addons/website/static/src/js/tours/homepage.js b/addons/website/static/src/js/tours/homepage.js index cb962512564..bff0ec93d40 100644 --- a/addons/website/static/src/js/tours/homepage.js +++ b/addons/website/static/src/js/tours/homepage.js @@ -3,12 +3,11 @@ odoo.define("website.tour.homepage", function (require) { var core = require("web.core"); var tour = require("web_tour.tour"); +const wTourUtils = require("website.tour_utils"); var _t = core._t; -tour.register("homepage", { - url: "/", -}, [{ +wTourUtils.registerThemeHomepageTour('homepage', [{ trigger: "a[data-action=edit]", content: _t("Click Edit to start designing your homepage."), extra_trigger: ".homepage", diff --git a/addons/website/static/src/js/tours/tour_utils.js b/addons/website/static/src/js/tours/tour_utils.js index 172bc9c9377..3d3e2ed6ab1 100644 --- a/addons/website/static/src/js/tours/tour_utils.js +++ b/addons/website/static/src/js/tours/tour_utils.js @@ -4,6 +4,8 @@ odoo.define("website.tour_utils", function (require) { const core = require("web.core"); const _t = core._t; +var tour = require("web_tour.tour"); + /** const snippets = [ @@ -216,7 +218,28 @@ function selectSnippetColumn(snippet, index = 0, position = "bottom") { position: position, run: "click", }; - } +} + +function prepend_trigger(steps, prepend_text='') { + for (const step of steps) { + if (!step.noPrepend && prepend_text) { + step.trigger = prepend_text + step.trigger; + } + } + return steps; +} + +function registerThemeHomepageTour(name, steps) { + tour.register(name, { + url: "/", + sequence: 1010, + saveAs: "homepage", + }, prepend_trigger( + steps, + "html[data-view-xmlid='website.homepage'] " + )); +} + return { addMedia, @@ -236,5 +259,7 @@ return { goToOptions, selectHeader, selectSnippetColumn, + + registerThemeHomepageTour, }; }); diff --git a/addons/website/views/website_views.xml b/addons/website/views/website_views.xml index 9ce2f21b28d..2cf4a1e2f11 100644 --- a/addons/website/views/website_views.xml +++ b/addons/website/views/website_views.xml @@ -443,6 +443,7 @@ + Go to theme 0 diff --git a/addons/website_blog/static/src/js/tours/website_blog.js b/addons/website_blog/static/src/js/tours/website_blog.js index 069fb96daf6..0cccc361ae7 100644 --- a/addons/website_blog/static/src/js/tours/website_blog.js +++ b/addons/website_blog/static/src/js/tours/website_blog.js @@ -10,8 +10,9 @@ odoo.define("website_blog.tour", function (require) { url: "/", }, [{ trigger: '#new-content-menu > a', - auto: true, + content: _t("Click here to add new content on your website."), position: 'bottom', + }, { trigger: "a[data-action=new_blog_post]", content: _t("Select this menu item to create a new blog post."), diff --git a/addons/website_event/static/src/js/tours/website_event.js b/addons/website_event/static/src/js/tours/website_event.js index 127e1cd1e12..eeefcf3d2ca 100644 --- a/addons/website_event/static/src/js/tours/website_event.js +++ b/addons/website_event/static/src/js/tours/website_event.js @@ -9,8 +9,8 @@ odoo.define("website_event.tour", function (require) { tour.register("event", { url: "/", }, [{ + content: _t("Click here to add new content on your website."), trigger: '#new-content-menu > a', - auto: true, position: 'bottom', }, { trigger: "a[data-action=new_event]", @@ -19,7 +19,7 @@ odoo.define("website_event.tour", function (require) { }, { trigger: '.modal-dialog #editor_new_event input[type=text]', content: _t("Create a name for your new event and click \"Continue\". e.g: Technical Training"), - position: "right", + position: "left", }, { trigger: '.modal-footer button.btn-primary.btn-continue', extra_trigger: '#editor_new_event input[type=text][value!=""]', diff --git a/odoo/addons/base/views/base_menus.xml b/odoo/addons/base/views/base_menus.xml index 077eaa71e86..a2ed6b88f73 100644 --- a/odoo/addons/base/views/base_menus.xml +++ b/odoo/addons/base/views/base_menus.xml @@ -40,6 +40,7 @@ + Open Menu 100 done