]> BookStack Code Mirror - bookstack/blobdiff - resources/js/wysiwyg/plugins-details.js
Fixed local_secure_restricted preventing attachment uploads
[bookstack] / resources / js / wysiwyg / plugins-details.js
index 9b5287947c406d026b7ce2bc21c69eaa589f45e0..44a0a35ab1228a4ffbe0ee49a263e8595684764a 100644 (file)
@@ -2,6 +2,7 @@
  * @param {Editor} editor
  * @param {String} url
  */
+import {blockElementTypes} from "./util";
 
 function register(editor, url) {
 
@@ -64,13 +65,13 @@ function register(editor, url) {
         editor.insertContent(details.outerHTML);
         editor.focus();
 
-        const domDetails = editor.dom.$(`[data-id="${id}"]`);
+        const domDetails = editor.dom.select(`[data-id="${id}"]`)[0] || null;
         if (domDetails) {
-            const firstChild = domDetails.find('doc-root > *');
+            const firstChild = domDetails.querySelector('doc-root > *');
             if (firstChild) {
-                firstChild[0].focus();
+                firstChild.focus();
             }
-            domDetails.removeAttr('data-id');
+            domDetails.removeAttribute('data-id');
         }
     });
 
@@ -169,6 +170,7 @@ function setSummary(editor, summaryContent) {
  */
 function unwrapDetailsInSelection(editor) {
     const details = editor.selection.getNode().closest('details');
+    const selectionBm = editor.selection.getBookmark();
 
     if (details) {
         const elements = details.querySelectorAll('details > *:not(summary, doc-root), doc-root > *');
@@ -180,7 +182,9 @@ function unwrapDetailsInSelection(editor) {
             details.remove();
         });
     }
+
     editor.focus();
+    editor.selection.moveToBookmark(selectionBm);
 }
 
 /**
@@ -214,14 +218,26 @@ function ensureDetailsWrappedInEditable(detailsEl) {
     unwrapDetailsEditable(detailsEl);
 
     detailsEl.attr('contenteditable', 'false');
-    const wrap = tinymce.html.Node.create('doc-root', {contenteditable: 'true'});
+    const rootWrap = tinymce.html.Node.create('doc-root', {contenteditable: 'true'});
+    let previousBlockWrap = null;
+
     for (const child of detailsEl.children()) {
-        if (child.name !== 'summary') {
-            wrap.append(child);
+        if (child.name === 'summary') continue;
+        const isBlock = blockElementTypes.includes(child.name);
+
+        if (!isBlock) {
+            if (!previousBlockWrap) {
+                previousBlockWrap = tinymce.html.Node.create('p');
+                rootWrap.append(previousBlockWrap);
+            }
+            previousBlockWrap.append(child);
+        } else {
+            rootWrap.append(child);
+            previousBlockWrap = null;
         }
     }
 
-    detailsEl.append(wrap);
+    detailsEl.append(rootWrap);
 }
 
 /**