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
+
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 @@