diff --git a/addons/website/static/src/client_actions/website_preview/website_preview.js b/addons/website/static/src/client_actions/website_preview/website_preview.js index ba4df10f974..535fcbaacd1 100644 --- a/addons/website/static/src/client_actions/website_preview/website_preview.js +++ b/addons/website/static/src/client_actions/website_preview/website_preview.js @@ -192,17 +192,22 @@ export class WebsitePreview extends Component { this.websiteService.pageDocument = this.iframe.el.contentDocument; this.websiteService.contentWindow = this.iframe.el.contentWindow; + + // This is needed for the registerThemeHomepageTour tours + const { editable, viewXmlid } = this.websiteService.currentWebsite.metadata; + this.container.el.dataset.viewXmlid = viewXmlid; + if (!editable) { + this.iframefallback.el.classList.add('d-none'); + } + this.iframe.el.contentWindow.addEventListener('PUBLIC-ROOT-READY', (event) => { this.iframe.el.setAttribute('is-ready', 'true'); - if (!this.websiteContext.edition) { + if (!this.websiteContext.edition && editable) { this.addWelcomeMessage(); } this.websiteService.websiteRootInstance = event.detail.rootInstance; }); - // This is needed for the registerThemeHomepageTour tours - this.container.el.dataset.viewXmlid = this.iframe.el.contentDocument.documentElement.dataset.viewXmlid; - // The clicks on the iframe are listened, so that links with external // redirections can be opened in the top window. this.iframe.el.contentDocument.addEventListener('click', (ev) => { @@ -238,8 +243,11 @@ export class WebsitePreview extends Component { // Before leaving the iframe, its content is replicated on an // underlying iframe, to avoid for white flashes (visible on // Chrome Windows/Linux). - if (!this.websiteContext.edition) { + // If the iframe is currently displaying an XML file, the body does not + // exist, so we do not replace the iframefallback content. + if (!this.websiteContext.edition && this.iframe.el.contentDocument.body) { this.iframefallback.el.contentDocument.body.replaceWith(this.iframe.el.contentDocument.body.cloneNode(true)); + this.iframefallback.el.classList.remove('d-none'); $().getScrollingElement(this.iframefallback.el.contentDocument)[0].scrollTop = $().getScrollingElement(this.iframe.el.contentDocument)[0].scrollTop; } } diff --git a/addons/website/static/src/components/navbar/navbar.js b/addons/website/static/src/components/navbar/navbar.js index 1ad5eae5872..1716fea9dad 100644 --- a/addons/website/static/src/components/navbar/navbar.js +++ b/addons/website/static/src/components/navbar/navbar.js @@ -121,7 +121,7 @@ patch(NavBar.prototype, 'website_navbar', { }, canShowAceEditor() { - return this.websiteService.pageDocument && this.websiteService.pageDocument.documentElement.dataset.viewXmlid + return this.websiteService.currentWebsite && this.websiteService.currentWebsite.metadata.viewXmlid && !this.websiteContext.showNewContentModal && !this.websiteContext.edition; }, }); diff --git a/addons/website/static/src/services/website_service.js b/addons/website/static/src/services/website_service.js index 1375de3370c..4d57e8544a9 100644 --- a/addons/website/static/src/services/website_service.js +++ b/addons/website/static/src/services/website_service.js @@ -88,17 +88,28 @@ export const websiteService = { if (!document) { return; } - const { mainObject, seoObject, isPublished, canPublish, editableInBackend, translatable } = document.documentElement.dataset; - currentMetadata = { - path: document.location.href, - mainObject: unslugHtmlDataObject(mainObject), - seoObject: unslugHtmlDataObject(seoObject), - isPublished: isPublished === 'True', - canPublish: canPublish === 'True', - editableInBackend: editableInBackend === 'True', - title: document.title, - translatable: !!translatable, - }; + // Not all files have a dataset. (e.g. XML) + if (!document.documentElement.dataset) { + currentMetadata = {}; + } else { + const { mainObject, seoObject, isPublished, canPublish, editableInBackend, translatable, viewXmlid } = document.documentElement.dataset; + currentMetadata = { + path: document.location.href, + mainObject: unslugHtmlDataObject(mainObject), + seoObject: unslugHtmlDataObject(seoObject), + isPublished: isPublished === 'True', + canPublish: canPublish === 'True', + editableInBackend: editableInBackend === 'True', + title: document.title, + translatable: !!translatable, + // TODO: Find a better way to figure out if + // a page is editable or not. For now, we use + // the editable selector because it's the common + // denominator of editable pages. + editable: !!document.getElementById('wrapwrap'), + viewXmlid: viewXmlid, + }; + } websiteSystrayRegistry.trigger('CONTENT-UPDATED'); }, get pageDocument() { diff --git a/addons/website/static/src/systray_items/edit_website.js b/addons/website/static/src/systray_items/edit_website.js index 38a4764ecd9..b34b6faf5ed 100644 --- a/addons/website/static/src/systray_items/edit_website.js +++ b/addons/website/static/src/systray_items/edit_website.js @@ -59,6 +59,7 @@ EditWebsiteSystray.template = "website.EditWebsiteSystray"; export const systrayItem = { Component: EditWebsiteSystray, + isDisplayed: (env) => env.services.website.currentWebsite.metadata.editable, }; registry.category("website_systray").add("EditWebsite", systrayItem, { sequence: 8 });