From 7ecec3d322f4a8c29a73cb68b7fb4fb0767dcfae Mon Sep 17 00:00:00 2001
From: chris <kokosias@yahoo.gr>
Date: Mon, 26 Apr 2021 10:10:44 +0300
Subject: [PATCH] cleanup

---
 .../MultipleChoiceNodeView.js                 | 100 ++++++++++--------
 .../components/TestComponent.js               |  79 +-------------
 .../demo/src/HHMI/layout/EditorElements.js    |   4 +-
 .../src/PortalService/AbstractNodeView.js     |   2 +-
 4 files changed, 63 insertions(+), 122 deletions(-)

diff --git a/editors/demo/src/HHMI/MultipleChoiceQuestionService/MultipleChoiceNodeView.js b/editors/demo/src/HHMI/MultipleChoiceQuestionService/MultipleChoiceNodeView.js
index 098ea0632..e4422c4c7 100644
--- a/editors/demo/src/HHMI/MultipleChoiceQuestionService/MultipleChoiceNodeView.js
+++ b/editors/demo/src/HHMI/MultipleChoiceQuestionService/MultipleChoiceNodeView.js
@@ -7,61 +7,75 @@ let questionView;
 export default class MultipleChoiceNodeView extends AbstractNodeView {
   constructor(node, view, getPos, decorations, createPortal, Component) {
     super(node, view, getPos, decorations, createPortal, Component);
+    this.node = node;
+    this.outerView = view;
+    this.getPos = getPos;
 
-    setTimeout(() => {
-      console.log(document.getElementById('test'));
-      questionView = new EditorView(
-        { mount: document.getElementById('test') },
-        {
-          state: EditorState.create({
-            doc: node,
-          }),
-          dispatchTransaction: tr => {
-            console.log('dispatch', questionView.state.applyTransaction(tr));
-            let { state, transactions } = questionView.state.applyTransaction(
-              tr,
-            );
-            questionView.updateState(state);
+    this.innerView = new EditorView(
+      {
+        mount: this.dom.appendChild(document.createElement('div')),
+      },
+      {
+        state: EditorState.create({
+          doc: node,
+        }),
+        dispatchTransaction: this.dispatchInner.bind(this),
 
-            if (!tr.getMeta('fromOutside')) {
-              let outerTr = view.state.tr,
-                offsetMap = StepMap.offset(getPos() + 1);
-              for (let i = 0; i < transactions.length; i++) {
-                let steps = transactions[i].steps;
-                for (let j = 0; j < steps.length; j++)
-                  outerTr.step(steps[j].map(offsetMap));
-              }
-              if (outerTr.docChanged) view.dispatch(outerTr);
-            }
+        handleDOMEvents: {
+          mousedown: () => {
+            // Kludge to prevent issues due to the fact that the whole
+            // footnote is node-selected (and thus DOM-selected) when
+            // the parent editor is focused.
+            if (this.outerView.hasFocus()) this.innerView.focus();
           },
+        },
 
-          attributes: {
-            spellcheck: 'false',
-          },
+        attributes: {
+          spellcheck: 'false',
         },
-      );
-    });
+      },
+    );
   }
   static name() {
     return 'multiple_choice';
   }
 
+  dispatchInner(tr) {
+    let { state, transactions } = this.innerView.state.applyTransaction(tr);
+    this.innerView.updateState(state);
+
+    if (!tr.getMeta('fromOutside')) {
+      let outerTr = this.outerView.state.tr,
+        offsetMap = StepMap.offset(this.getPos() + 1);
+      for (let i = 0; i < transactions.length; i++) {
+        let steps = transactions[i].steps;
+        for (let j = 0; j < steps.length; j++)
+          outerTr.step(steps[j].map(offsetMap));
+      }
+      if (outerTr.docChanged) this.outerView.dispatch(outerTr);
+    }
+  }
+
   update(node) {
-    const { state } = questionView;
-    const start = node.content.findDiffStart(state.doc.content);
-    console.log('start', start);
-    if (start != null) {
-      let { a: endA, b: endB } = node.content.findDiffEnd(state.doc.content);
-      const overlap = start - Math.min(endA, endB);
-      if (overlap > 0) {
-        endA += overlap;
-        endB += overlap;
+    if (!node.sameMarkup(this.node)) return false;
+    this.node = node;
+    if (this.innerView) {
+      let state = this.innerView.state;
+      let start = node.content.findDiffStart(state.doc.content);
+      if (start != null) {
+        let { a: endA, b: endB } = node.content.findDiffEnd(state.doc.content);
+        let overlap = start - Math.min(endA, endB);
+        if (overlap > 0) {
+          endA += overlap;
+          endB += overlap;
+        }
+        this.innerView.dispatch(
+          state.tr
+            .replace(start, endB, node.slice(start, endA))
+            .setMeta('fromOutside', true),
+        );
       }
-      questionView.dispatch(
-        state.tr
-          .replace(start, endB, node.slice(start, endA))
-          .setMeta('fromOutside', true),
-      );
     }
+    return true;
   }
 }
diff --git a/editors/demo/src/HHMI/MultipleChoiceQuestionService/components/TestComponent.js b/editors/demo/src/HHMI/MultipleChoiceQuestionService/components/TestComponent.js
index 237819d55..f7d37081b 100644
--- a/editors/demo/src/HHMI/MultipleChoiceQuestionService/components/TestComponent.js
+++ b/editors/demo/src/HHMI/MultipleChoiceQuestionService/components/TestComponent.js
@@ -20,92 +20,19 @@ const EditorWrapper = styled.div`
   user-select: all;
 `;
 
-let showExp = false;
-let questionView;
+
 export default ({ node, view, getPos }) => {
   const [showExplanation, setShowExplanation] = useState(false);
-  const editorRef = useRef();
-  console.log(node);
-  // const setEditorRef = useCallback(
-  //   // eslint-disable-next-line consistent-return
-  //   editorNode => {
-  //     if (editorRef.current) {
-  //       console.log(editorRef);
-  //     }
-  //     if (editorNode) {
-  //       questionView = new EditorView(
-  //         { mount: editorNode },
-  //         {
-  //           state: EditorState.create({
-  //             doc: node,
-  //           }),
-  //           dispatchTransaction,
-  //           scrollMargin: 200,
-  //           scrollThreshold: 200,
-
-  //           attributes: {
-  //             spellcheck: 'false',
-  //           },
-  //         },
-  //       );
-  //     }
-  //     editorRef.current = editorNode;
-  //   },
-  //   [],
-  // );
-  // const dispatchTransaction = tr => {
-  //   console.log('dispatch', questionView.state.applyTransaction(tr));
-  //   let { state, transactions } = questionView.state.applyTransaction(tr);
-  //   questionView.updateState(state);
-
-  //   if (!tr.getMeta('fromOutside')) {
-  //     let outerTr = view.state.tr,
-  //       offsetMap = StepMap.offset(getPos() + 1);
-  //     for (let i = 0; i < transactions.length; i++) {
-  //       let steps = transactions[i].steps;
-  //       for (let j = 0; j < steps.length; j++)
-  //         outerTr.step(steps[j].map(offsetMap));
-  //     }
-  //     if (outerTr.docChanged) view.dispatch(outerTr);
-  //   }
-  // };
-
-  // console.log(questionView);
-  // if (questionView) {
-  //   const { state } = questionView;
-  //   const start = node.content.findDiffStart(state.doc.content);
-  //   if (start != null) {
-  //     let { a: endA, b: endB } = node.content.findDiffEnd(state.doc.content);
-  //     const overlap = start - Math.min(endA, endB);
-  //     if (overlap > 0) {
-  //       endA += overlap;
-  //       endB += overlap;
-  //     }
-  //     questionView.dispatch(
-  //       state.tr
-  //         .replace(start, endB, node.slice(start, endA))
-  //         .setMeta('fromOutside', true),
-  //     );
-  //   }
+ }
   // }
 
   const clickMe = () => {
-    // console.log(node.attrs);
     setShowExplanation(true);
     showExp = true;
     // view.dispatch(view.state.tr);
   };
 
-  const MemorizedComponent = useMemo(
-    () => (
-      <>
-        <button onClick={clickMe}>Add Explanation</button>
-        {showExplanation && <input type="text"></input>}
-      </>
-    ),
-    [showExplanation],
-  );
-  console.log(showExplanation);
+;
   return (
     <>
       <button onClick={clickMe}>Show Explanation</button>
diff --git a/editors/demo/src/HHMI/layout/EditorElements.js b/editors/demo/src/HHMI/layout/EditorElements.js
index bdf538bc6..378569c00 100644
--- a/editors/demo/src/HHMI/layout/EditorElements.js
+++ b/editors/demo/src/HHMI/layout/EditorElements.js
@@ -45,8 +45,8 @@ export default css`
   }
 
   div[contenteditable='false'] {
-    pointer-events: none;
-    user-select: none;
+    // pointer-events: none;
+    // user-select: none;
   }
 
   /* .ProseMirror title {
diff --git a/wax-prosemirror-services/src/PortalService/AbstractNodeView.js b/wax-prosemirror-services/src/PortalService/AbstractNodeView.js
index 1b4f39edc..214ef693a 100644
--- a/wax-prosemirror-services/src/PortalService/AbstractNodeView.js
+++ b/wax-prosemirror-services/src/PortalService/AbstractNodeView.js
@@ -3,7 +3,7 @@ import { v4 as uuidv4 } from 'uuid';
 export default class AbstractNodeView {
   constructor(node, view, getPos, decorations, createPortal, Component) {
     this.dom = document.createElement('div');
-    this.dom.setAttribute('contenteditable', true);
+    // this.dom.setAttribute('contenteditable', true);
     const testDiv = document.createElement('div');
 
     testDiv.setAttribute('id', 'test');
-- 
GitLab