diff --git a/addons/website/models/website_page.py b/addons/website/models/website_page.py
index f1384394ca2..5e65ea34821 100644
--- a/addons/website/models/website_page.py
+++ b/addons/website/models/website_page.py
@@ -121,7 +121,8 @@ class Page(models.Model):
page = self.browse(int(page_id))
copy_param = dict(name=page_name or page.name, website_id=self.env['website'].get_current_website().id)
if page_name:
- copy_param['url'] = self.get_valid_page_url(page_name)
+ url = '/' + slugify(page_name, max_length=1024, path=True)
+ copy_param['url'] = self.env['website'].get_unique_path(url)
new_page = page.copy(copy_param)
# Should not clone menu if the page was cloned from one website to another
@@ -158,17 +159,16 @@ class Page(models.Model):
# If URL has been edited, slug it
if 'url' in vals:
- url = vals['url']
+ url = vals['url'] or ''
redirect_old_url = redirect_type = None
# TODO This should be done another way after the backend/frontend merge
if isinstance(url, dict):
redirect_old_url = url.get('redirect_old_url')
redirect_type = url.get('redirect_type')
url = url.get('url')
- if not url.startswith('/'):
- url = '/' + url
+ url = '/' + slugify(url, max_length=1024, path=True)
if page.url != url:
- url = self.get_valid_page_url(url, website_id)
+ url = self.env['website'].with_context(website_id=website_id).get_unique_path(url)
page.menu_ids.write({'url': url})
if redirect_old_url:
self.env['website.rewrite'].create({
@@ -271,10 +271,6 @@ class Page(models.Model):
results = results.filtered(lambda result: filter_page(search, result, results))
return results, count
- def get_valid_page_url(self, page_url, website_id=False):
- url = '/' + slugify(page_url, max_length=1024, path=True)
- return self.env['website'].with_context(website_id=website_id).get_unique_path(url)
-
def action_page_debug_view(self):
return {
'type': 'ir.actions.act_window',
diff --git a/addons/website/static/src/components/fields/fields.js b/addons/website/static/src/components/fields/fields.js
index 0905895f91e..a77a6b487ca 100644
--- a/addons/website/static/src/components/fields/fields.js
+++ b/addons/website/static/src/components/fields/fields.js
@@ -3,7 +3,7 @@
import {PageDependencies} from '@website/components/dialog/page_properties';
import {standardFieldProps} from '@web/views/fields/standard_field_props';
import {useInputField} from '@web/views/fields/input_field_hook';
-import {useService} from '@web/core/utils/hooks';
+import {useAutofocus, useService} from '@web/core/utils/hooks';
import {Switch} from '@website/components/switch/switch';
import {registry} from '@web/core/registry';
import {formatChar} from '@web/views/fields/formatters';
@@ -16,15 +16,17 @@ const {Component, useState, onWillStart} = owl;
*/
class PageUrlField extends Component {
setup() {
+ this.orm = useService('orm');
+ this.serverUrl = `${window.location.origin}/`;
+ this.pageUrl = this.fieldURL;
+
this.state = useState({
redirect_old_url: false,
- url: this.props.value,
+ url: this.pageUrl,
redirect_type: '301',
});
- useInputField({getValue: () => this.props.value.url || this.props.value});
- this.serverUrl = window.location.origin;
- this.pageUrl = this.props.value;
+ useInputField({getValue: () => this.fieldURL});
}
get enableRedirect() {
@@ -36,6 +38,11 @@ class PageUrlField extends Component {
this.updateValues();
}
+ get fieldURL() {
+ const value = this.props.value;
+ return (value.url !== undefined ? value.url : value).replace(/^\//g, '');
+ }
+
updateValues() {
// HACK: update redirect data from the URL field.
// TODO: remove this and use a transient model with redirect fields.
@@ -73,6 +80,7 @@ class PageNameField extends Component {
this.pageName = this.props.value;
this.supportedMimetypes = {};
+ useAutofocus({refName: 'input'});
onWillStart(() => this.onWillStart());
}
diff --git a/addons/website/views/website_pages_views.xml b/addons/website/views/website_pages_views.xml
index 7b831c0ee83..bf095a3f6a2 100644
--- a/addons/website/views/website_pages_views.xml
+++ b/addons/website/views/website_pages_views.xml
@@ -37,29 +37,17 @@
-
-
-
+
-
-
-
-
-
-
-
-
-
-