diff --git a/addons/website/models/website_page.py b/addons/website/models/website_page.py
index 05d1879f897..c3e01a1d34e 100644
--- a/addons/website/models/website_page.py
+++ b/addons/website/models/website_page.py
@@ -150,19 +150,24 @@ class Page(models.Model):
return super(Page, self).copy(default=default)
@api.model
- def clone_page(self, page_id, clone_menu=True):
+ def clone_page(self, page_id, page_name=None, clone_menu=True):
""" Clone a page, given its identifier
:param page_id : website.page identifier
"""
page = self.browse(int(page_id))
- new_page = page.copy(dict(name=page.name, website_id=self.env['website'].get_current_website().id))
+ copy_param = dict(name=page_name or page.name, website_id=self.env['website'].get_current_website().id)
+ if page_name:
+ page_url = '/' + slugify(page_name, max_length=1024, path=True)
+ copy_param['url'] = self.env['website'].get_unique_path(page_url)
+
+ new_page = page.copy(copy_param)
# Should not clone menu if the page was cloned from one website to another
# Eg: Cloning a generic page (no website) will create a page with a website, we can't clone menu (not same container)
if clone_menu and new_page.website_id == page.website_id:
menu = self.env['website.menu'].search([('page_id', '=', page_id)], limit=1)
if menu:
# If the page being cloned has a menu, clone it too
- menu.copy({'url': new_page.url, 'name': menu.name, 'page_id': new_page.id})
+ menu.copy({'url': new_page.url, 'name': new_page.name, 'page_id': new_page.id})
return new_page.url + '?enable_editor=1'
diff --git a/addons/website/static/src/js/menu/content.js b/addons/website/static/src/js/menu/content.js
index b8743f27932..d8be9ba80ff 100644
--- a/addons/website/static/src/js/menu/content.js
+++ b/addons/website/static/src/js/menu/content.js
@@ -44,22 +44,32 @@ var PagePropertiesDialog = weWidgets.Dialog.extend({
var buttons = [
{text: _t("Save"), classes: 'btn-primary', click: this.save},
- {text: _t("Discard"), close: true},
+ {text: _t("Discard"), classes: 'mr-auto', close: true},
];
if (options.fromPageManagement) {
buttons.push({
text: _t("Go To Page"),
icon: 'fa-globe',
- classes: 'btn-link float-right',
+ classes: 'btn-link',
click: function (e) {
window.location.href = '/' + self.page.url;
},
});
}
+ buttons.push({
+ text: _t("Duplicate Page"),
+ icon: 'fa-clone',
+ classes: 'btn-link',
+ click: function (e) {
+ // modal('hide') will break the rpc, so hide manually
+ this.$el.closest('.modal').addClass('d-none');
+ _clonePage.call(this, self.page_id);
+ },
+ });
buttons.push({
text: _t("Delete Page"),
icon: 'fa-trash',
- classes: 'btn-link float-right',
+ classes: 'btn-link',
click: function (e) {
_deletePage.call(this, self.page_id, options.fromPageManagement);
},
@@ -985,13 +995,7 @@ var PageManagement = Widget.extend({
},
_onClonePageButtonClick: function (ev) {
var pageId = $(ev.currentTarget).data('id');
- this._rpc({
- model: 'website.page',
- method: 'clone_page',
- args: [pageId],
- }).then(function (path) {
- window.location.href = path;
- });
+ _clonePage.call(this, pageId);
},
_onDeletePageButtonClick: function (ev) {
var pageId = $(ev.currentTarget).data('id');
@@ -1040,6 +1044,33 @@ function _deletePage(pageId, fromPageManagement) {
}, reject);
});
}
+/**
+ * Duplicate the page after showing the wizard to enter new page name.
+ *
+ * @private
+ * @param {integer} pageId - The ID of the page to be duplicate
+ *
+ */
+function _clonePage(pageId) {
+ var self = this;
+ new Promise(function (resolve, reject) {
+ Dialog.confirm(this, undefined, {
+ title: _t("Duplicate Page"),
+ $content: $(qweb.render('website.duplicate_page_action_dialog')),
+ confirm_callback: function () {
+ var new_page_name = this.$('#page_name').val();
+ return self._rpc({
+ model: 'website.page',
+ method: 'clone_page',
+ args: [pageId, new_page_name],
+ }).then(function (path) {
+ window.location.href = path;
+ }).guardedCatch(reject);
+ },
+ cancel_callback: reject,
+ }).on('closed', null, reject);
+ });
+}
websiteNavbarData.websiteNavbarRegistry.add(ContentMenu, '#content-menu');
websiteRootData.websiteRootRegistry.add(PageManagement, '#list_website_pages');
diff --git a/addons/website/static/src/xml/website.xml b/addons/website/static/src/xml/website.xml
index d4193d7cbc2..a8af566ecfb 100644
--- a/addons/website/static/src/xml/website.xml
+++ b/addons/website/static/src/xml/website.xml
@@ -76,4 +76,13 @@