diff --git a/xwiki-platform-core/xwiki-platform-ckeditor/xwiki-platform-ckeditor-ui/src/main/resources/CKEditor/InlineEditor.xml b/xwiki-platform-core/xwiki-platform-ckeditor/xwiki-platform-ckeditor-ui/src/main/resources/CKEditor/InlineEditor.xml index 47f0b42d80b6162180da6778293252d9f323c50c..cfbe2307de5faafac50250ebf01457de91a58e71 100644 --- a/xwiki-platform-core/xwiki-platform-ckeditor/xwiki-platform-ckeditor-ui/src/main/resources/CKEditor/InlineEditor.xml +++ b/xwiki-platform-core/xwiki-platform-ckeditor/xwiki-platform-ckeditor-ui/src/main/resources/CKEditor/InlineEditor.xml @@ -296,6 +296,8 @@ }); $(document).on('xwiki:actions:beforeSave.contentEditor', function(event) { config.document[editor.mode === 'source' ? 'content' : 'renderedContent'] = editor.getData(); + // Delete the document content field that is not used so that the in-place editor knows what to submit on save. + delete config.document[editor.mode === 'source' ? 'renderedContent' : 'content']; config.document.syntax = editor.config.sourceSyntax; }); $(document).one('xwiki:actions:view.contentEditor', function(event, data) { diff --git a/xwiki-platform-core/xwiki-platform-edit/xwiki-platform-edit-test/xwiki-platform-edit-test-docker/pom.xml b/xwiki-platform-core/xwiki-platform-edit/xwiki-platform-edit-test/xwiki-platform-edit-test-docker/pom.xml index c9f1a90af6dd40ca9e56ee8d8a20ba2ad9e6c14b..3f86729754a5b1cc52c4295ac42194593c74f8dc 100644 --- a/xwiki-platform-core/xwiki-platform-edit/xwiki-platform-edit-test/xwiki-platform-edit-test-docker/pom.xml +++ b/xwiki-platform-core/xwiki-platform-edit/xwiki-platform-edit-test/xwiki-platform-edit-test-docker/pom.xml @@ -96,6 +96,12 @@ <version>${project.version}</version> <scope>test</scope> </dependency> + <dependency> + <groupId>org.xwiki.platform</groupId> + <artifactId>xwiki-platform-ckeditor-test-pageobjects</artifactId> + <version>${project.version}</version> + <scope>test</scope> + </dependency> </dependencies> <build> <testSourceDirectory>src/test/it</testSourceDirectory> diff --git a/xwiki-platform-core/xwiki-platform-edit/xwiki-platform-edit-test/xwiki-platform-edit-test-docker/src/test/it/org/xwiki/edit/test/ui/InplaceEditIT.java b/xwiki-platform-core/xwiki-platform-edit/xwiki-platform-edit-test/xwiki-platform-edit-test-docker/src/test/it/org/xwiki/edit/test/ui/InplaceEditIT.java index 984ada0376e8c80b06d20814ad0fe25f80a563dd..fefc3585892d2610938d42980b1f192bc93aa844 100644 --- a/xwiki-platform-core/xwiki-platform-edit/xwiki-platform-edit-test/xwiki-platform-edit-test-docker/src/test/it/org/xwiki/edit/test/ui/InplaceEditIT.java +++ b/xwiki-platform-core/xwiki-platform-edit/xwiki-platform-edit-test/xwiki-platform-edit-test-docker/src/test/it/org/xwiki/edit/test/ui/InplaceEditIT.java @@ -28,7 +28,12 @@ import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; import org.openqa.selenium.Alert; +import org.openqa.selenium.Keys; +import org.openqa.selenium.WebElement; import org.openqa.selenium.support.ui.ExpectedConditions; +import org.xwiki.ckeditor.test.po.AutocompleteDropdown; +import org.xwiki.ckeditor.test.po.CKEditor; +import org.xwiki.ckeditor.test.po.RichTextAreaElement; import org.xwiki.edit.test.po.InplaceEditablePage; import org.xwiki.test.docker.junit5.TestReference; import org.xwiki.test.docker.junit5.UITest; @@ -135,6 +140,53 @@ void editInplace(TestUtils setup, TestReference testReference) @Test @Order(2) + void saveFromSourceMode(TestUtils setup, TestReference testReference) + { + // Enter in-place edit mode. + InplaceEditablePage viewPage = new InplaceEditablePage().editInplace(); + CKEditor ckeditor = new CKEditor("content"); + RichTextAreaElement richTextArea = ckeditor.getRichTextArea(); + richTextArea.clear(); + + // Insert a macro that is editable in-line. + richTextArea.sendKeys("/inf"); + AutocompleteDropdown qa = new AutocompleteDropdown(); + qa.waitForItemSelected("/inf", "Info Box"); + richTextArea.sendKeys(Keys.ENTER); + qa.waitForItemSubmitted(); + + // The content is reloaded after the macro is inserted. + ckeditor.getRichTextArea(); + + // Switch to Source mode and save without making any change. + ckeditor.getToolBar().toggleSourceMode(); + assertEquals("", ckeditor.getSourceTextArea().getText()); + viewPage.saveAndView(); + + // Edit again and check the source. + viewPage.editInplace(); + ckeditor = new CKEditor("content"); + // Focus the rich text area to get the floating toolbar. + ckeditor.getRichTextArea().click(); + ckeditor.getToolBar().toggleSourceMode(); + WebElement sourceTextArea = ckeditor.getSourceTextArea(); + assertEquals("{{info}}\nType your information message here.\n{{/info}}", sourceTextArea.getAttribute("value")); + + // Modify the soure and save twice, without any change in between. + sourceTextArea.clear(); + sourceTextArea.sendKeys("{{success}}test{{/success}}"); + viewPage.save().saveAndView(); + + // Edit again and check the source. + viewPage.editInplace(); + ckeditor = new CKEditor("content"); + ckeditor.getRichTextArea().click(); + ckeditor.getToolBar().toggleSourceMode(); + assertEquals("{{success}}\ntest\n{{/success}}", ckeditor.getSourceTextArea().getAttribute("value")); + } + + @Test + @Order(3) void editInPlaceWithMandatoryTitle(TestUtils setup, TestReference testReference) throws Exception { // First of all, test that we can save with an empty title. @@ -172,7 +224,7 @@ void editInPlaceWithMandatoryTitle(TestUtils setup, TestReference testReference) } @Test - @Order(3) + @Order(4) void editInPlaceWithMandatoryVersionSummary(TestUtils setup, TestReference testReference) throws Exception { setup.loginAsSuperAdmin(); @@ -222,7 +274,7 @@ void editInPlaceWithMandatoryVersionSummary(TestUtils setup, TestReference testR } @Test - @Order(4) + @Order(5) void saveWithMergeReloadsEditor(TestUtils setup, TestReference testReference) throws Exception { // Enter in-place edit mode. diff --git a/xwiki-platform-core/xwiki-platform-edit/xwiki-platform-edit-ui/src/main/resources/XWiki/InplaceEditing.xml b/xwiki-platform-core/xwiki-platform-edit/xwiki-platform-edit-ui/src/main/resources/XWiki/InplaceEditing.xml index 0644fc5c8656acdcd329f5f8b74b2bc4d0c13356..93eff18478d10ba512ede583a980884f03bc3f36 100644 --- a/xwiki-platform-core/xwiki-platform-edit/xwiki-platform-edit-ui/src/main/resources/XWiki/InplaceEditing.xml +++ b/xwiki-platform-core/xwiki-platform-edit/xwiki-platform-edit-ui/src/main/resources/XWiki/InplaceEditing.xml @@ -873,7 +873,7 @@ // Submit either the raw (source) content (no syntax conversion needed in this case) or the rendered content (HTML) // in which case we have to force the conversion to the document syntax on the server. - const submitRawContent = xwikiDocument.content !== xwikiDocument.originalDocument.content; + const submitRawContent = typeof xwikiDocument.renderedContent !== 'string'; form.find('input[name="content"]').val(submitRawContent ? xwikiDocument.content : xwikiDocument.renderedContent); form.find('input[name="RequiresHTMLConversion"]').prop('disabled', submitRawContent); form.find('input[name="content_syntax"]').val(xwikiDocument.syntax).prop('disabled', submitRawContent);