From 85c45cb85b28f12922746c2b8a7095dbe09a7eae Mon Sep 17 00:00:00 2001
From: chris <kokosias@yahoo.gr>
Date: Sat, 13 Mar 2021 15:11:41 +0200
Subject: [PATCH] caption in progress

---
 .../src/images/captionPlugin.js               | 25 ++++++++++++++-----
 wax-prosemirror-schema/src/nodes/imageNode.js |  2 +-
 .../HeadingService/Heading2.js                |  7 +++++-
 .../HeadingService/Heading3.js                |  7 +++++-
 .../HeadingService/Heading4.js                |  7 +++++-
 5 files changed, 38 insertions(+), 10 deletions(-)

diff --git a/wax-prosemirror-plugins/src/images/captionPlugin.js b/wax-prosemirror-plugins/src/images/captionPlugin.js
index 8f8a5181b..ea7acd9ff 100644
--- a/wax-prosemirror-plugins/src/images/captionPlugin.js
+++ b/wax-prosemirror-plugins/src/images/captionPlugin.js
@@ -1,5 +1,5 @@
 import { DecorationSet } from 'prosemirror-view';
-import { Plugin, PluginKey } from 'prosemirror-state';
+import { Plugin, PluginKey, NodeSelection } from 'prosemirror-state';
 
 const captionPlugin = key =>
   new Plugin({
@@ -29,23 +29,23 @@ const captionPlugin = key =>
             e.target.nodeName === 'IMG' &&
             e.target.parentNode.lastElementChild.nodeName !== 'FIGCAPTION'
           ) {
+            let pos = view.posAtDOM(e.target);
             const id = {};
             const { tr } = view.state;
-            const pos = view.posAtDOM(e.target);
-            const pos1 = pos + 1;
+            pos += 1;
             //  insert figure caption node
             view.dispatch(
               tr
                 .replaceWith(
-                  pos1,
-                  pos1,
+                  pos,
+                  pos,
                   view.state.schema.nodes.figcaption.create({
                     class: 'decoration',
                     dataContent: 'Caption : ',
                   }),
                 )
                 .setMeta(captionPlugins, {
-                  add: { id, pos: pos + 1 },
+                  add: { id, pos },
                 }),
             );
           } else if (e.target.nodeName !== 'FIGCAPTION') {
@@ -68,6 +68,19 @@ const captionPlugin = key =>
             }
           }
 
+          if (e.target.nodeName === 'IMG') {
+            let pos = view.posAtDOM(e.target);
+            const { $from } = view.state.selection;
+            const same = $from.sharedDepth(pos);
+            if (same === 0) return false;
+            pos = $from.before(same);
+            view.dispatch(
+              view.state.tr.setSelection(
+                NodeSelection.create(view.state.doc, pos),
+              ),
+            );
+          }
+
           return true;
         },
         keyup(view, e) {
diff --git a/wax-prosemirror-schema/src/nodes/imageNode.js b/wax-prosemirror-schema/src/nodes/imageNode.js
index 612e2938b..34e825c63 100644
--- a/wax-prosemirror-schema/src/nodes/imageNode.js
+++ b/wax-prosemirror-schema/src/nodes/imageNode.js
@@ -8,7 +8,7 @@ const image = {
     track: { default: [] },
   },
   group: 'figure',
-  draggable: true,
+  draggable: false,
   parseDOM: [
     {
       tag: 'img[src]',
diff --git a/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading2.js b/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading2.js
index f29ab8467..d48724224 100644
--- a/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading2.js
+++ b/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading2.js
@@ -27,7 +27,12 @@ class Heading2 extends Tools {
       if (activeViewId !== 'main') return false;
       const { from, to } = state.selection;
       state.doc.nodesBetween(from, to, (node, pos) => {
-        if (node.type.name === 'list_item' || node.type.name === 'image') {
+        if (
+          node.type.name === 'list_item' ||
+          node.type.name === 'image' ||
+          node.type.name === 'figure' ||
+          node.type.name === 'figcaption'
+        ) {
           isActive = false;
         }
       });
diff --git a/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading3.js b/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading3.js
index e2dd3d94e..e79ea62f3 100644
--- a/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading3.js
+++ b/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading3.js
@@ -27,7 +27,12 @@ class Heading3 extends Tools {
       if (activeViewId !== 'main') return false;
       const { from, to } = state.selection;
       state.doc.nodesBetween(from, to, (node, pos) => {
-        if (node.type.name === 'list_item' || node.type.name === 'image') {
+        if (
+          node.type.name === 'list_item' ||
+          node.type.name === 'image' ||
+          node.type.name === 'figure' ||
+          node.type.name === 'figcaption'
+        ) {
           isActive = false;
         }
       });
diff --git a/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading4.js b/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading4.js
index 3991590cf..31df0dcb9 100644
--- a/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading4.js
+++ b/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading4.js
@@ -27,7 +27,12 @@ class Heading4 extends Tools {
       if (activeViewId !== 'main') return false;
       const { from, to } = state.selection;
       state.doc.nodesBetween(from, to, (node, pos) => {
-        if (node.type.name === 'list_item' || node.type.name === 'image') {
+        if (
+          node.type.name === 'list_item' ||
+          node.type.name === 'image' ||
+          node.type.name === 'figure' ||
+          node.type.name === 'figcaption'
+        ) {
           isActive = false;
         }
       });
-- 
GitLab