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