From 8c9db5dfcc7524ff5292189acf4e0450292b0084 Mon Sep 17 00:00:00 2001
From: chris <kokosias@yahoo.gr>
Date: Tue, 26 Apr 2022 14:02:57 +0300
Subject: [PATCH] overlay

---
 .../CreateDropDownService/CreateDropDown.js   | 41 +++++++++++++++++--
 .../CreateDropDownService.js                  | 21 ++++++++--
 .../components/ContainerEditor.js             |  9 +++-
 .../components/DropDownComponent.js           | 28 +++++++++++++
 .../MultipleDropDownContainerComponent.js     | 10 ++---
 .../schema/multipleDropDownOptionNode.js      |  9 ++--
 .../src/NoteService/Editor.js                 |  1 -
 7 files changed, 101 insertions(+), 18 deletions(-)
 create mode 100644 wax-prosemirror-services/src/MultipleDropDownService/components/DropDownComponent.js

diff --git a/wax-prosemirror-services/src/MultipleDropDownService/CreateDropDownService/CreateDropDown.js b/wax-prosemirror-services/src/MultipleDropDownService/CreateDropDownService/CreateDropDown.js
index e11177d2e..b5cdc6750 100644
--- a/wax-prosemirror-services/src/MultipleDropDownService/CreateDropDownService/CreateDropDown.js
+++ b/wax-prosemirror-services/src/MultipleDropDownService/CreateDropDownService/CreateDropDown.js
@@ -1,5 +1,7 @@
 import { injectable } from 'inversify';
-import { Fragment } from 'prosemirror-model';
+import { TextSelection } from 'prosemirror-state';
+import { AddMarkStep } from 'prosemirror-transform';
+
 import { v4 as uuidv4 } from 'uuid';
 import Tools from '../../lib/Tools';
 
@@ -10,10 +12,43 @@ class CreateDropDown extends Tools {
   name = 'Create_Drop_Down';
 
   get run() {
-    return (state, dispatch) => {};
+    return (state, dispatch) => {
+      const {
+        tr,
+        selection: { from, to },
+      } = state;
+
+      console.log(tr);
+      tr.insertText('hi');
+
+      const selectionFrom = new TextSelection(state.doc.resolve(from));
+
+      const selectionTo = new TextSelection(state.doc.resolve(to + 2));
+
+      console.log(selectionFrom.$anchor, selectionTo.$head);
+
+      state.tr.setSelection(
+        TextSelection.between(selectionFrom.$anchor, selectionTo.$head),
+      );
+
+      tr.step(
+        new AddMarkStep(
+          from,
+          to + 2,
+          state.config.schema.marks.multiple_drop_down_option.create({
+            id: uuidv4(),
+            class: 'multiple-drop-down-option',
+          }),
+        ),
+      );
+
+      dispatch(tr);
+    };
   }
 
-  select = (state, activeViewId, activeView) => {};
+  select = (state, activeViewId, activeView) => {
+    return true;
+  };
 
   get active() {
     return state => {};
diff --git a/wax-prosemirror-services/src/MultipleDropDownService/CreateDropDownService/CreateDropDownService.js b/wax-prosemirror-services/src/MultipleDropDownService/CreateDropDownService/CreateDropDownService.js
index bbb0fcd2f..e7b9367f2 100644
--- a/wax-prosemirror-services/src/MultipleDropDownService/CreateDropDownService/CreateDropDownService.js
+++ b/wax-prosemirror-services/src/MultipleDropDownService/CreateDropDownService/CreateDropDownService.js
@@ -3,15 +3,30 @@ import CreateDropDown from './CreateDropDown';
 import multipleDropDownOptionNode from '../schema/multipleDropDownOptionNode';
 import MultipleDropDownNodeView from './MultipleDropDownNodeView';
 import MultipleDropDownComponent from '../components/MultipleDropDownComponent';
+import DropDownComponent from '../components/DropDownComponent';
 
 class CreateDropDownService extends Service {
+  name = 'CreateDropDownService';
+
+  boot() {
+    const createOverlay = this.container.get('CreateOverlay');
+    createOverlay(
+      DropDownComponent,
+      {},
+      {
+        markType: 'multiple_drop_down_option',
+        followCursor: true,
+        selection: false,
+      },
+    );
+  }
+
   register() {
-    const createNode = this.container.get('CreateNode');
+    const CreateMark = this.container.get('CreateMark');
     const addPortal = this.container.get('AddPortal');
-
     this.container.bind('CreateDropDown').to(CreateDropDown);
 
-    createNode({
+    CreateMark({
       multiple_drop_down_option: multipleDropDownOptionNode,
     });
 
diff --git a/wax-prosemirror-services/src/MultipleDropDownService/components/ContainerEditor.js b/wax-prosemirror-services/src/MultipleDropDownService/components/ContainerEditor.js
index 12e97db7c..38df6616f 100644
--- a/wax-prosemirror-services/src/MultipleDropDownService/components/ContainerEditor.js
+++ b/wax-prosemirror-services/src/MultipleDropDownService/components/ContainerEditor.js
@@ -8,9 +8,11 @@ import { StepMap } from 'prosemirror-transform';
 import { keymap } from 'prosemirror-keymap';
 import { baseKeymap } from 'prosemirror-commands';
 import { undo, redo } from 'prosemirror-history';
-import { WaxContext } from 'wax-prosemirror-core';
+import { WaxContext, ComponentPlugin } from 'wax-prosemirror-core';
 
 const EditorWrapper = styled.div`
+  position: relative;
+
   > .ProseMirror {
     padding: 5px;
     &:focus {
@@ -31,6 +33,8 @@ const EditorWrapper = styled.div`
   }
 `;
 
+let WaxOverlays = () => true;
+
 const ContainerEditor = ({ node, view, getPos }) => {
   const editorRef = useRef();
 
@@ -68,6 +72,8 @@ const ContainerEditor = ({ node, view, getPos }) => {
   finalPlugins = finalPlugins.concat([...plugins]);
 
   useEffect(() => {
+    WaxOverlays = ComponentPlugin('waxOverlays');
+
     multipleDropDownContainerNodeView = new EditorView(
       {
         mount: editorRef.current,
@@ -148,6 +154,7 @@ const ContainerEditor = ({ node, view, getPos }) => {
   return (
     <EditorWrapper>
       <div ref={editorRef} />
+      <WaxOverlays activeViewId={questionId} group="questions" />
     </EditorWrapper>
   );
 };
diff --git a/wax-prosemirror-services/src/MultipleDropDownService/components/DropDownComponent.js b/wax-prosemirror-services/src/MultipleDropDownService/components/DropDownComponent.js
new file mode 100644
index 000000000..f2ced9463
--- /dev/null
+++ b/wax-prosemirror-services/src/MultipleDropDownService/components/DropDownComponent.js
@@ -0,0 +1,28 @@
+/* eslint-disable react/prop-types */
+import React, { useContext } from 'react';
+import { WaxContext } from 'wax-prosemirror-core';
+import styled from 'styled-components';
+
+const DropDownComponent = styled.div`
+  width: 150px;
+  height: 100px;
+  background: white;
+  border: 1px solid green;
+`;
+
+export default ({ node, view, getPos }) => {
+  const context = useContext(WaxContext);
+  const {
+    pmViews: { main },
+  } = context;
+
+  const customProps = main.props.customValues;
+
+  const isEditable = main.props.editable(editable => {
+    return editable;
+  });
+
+  const readOnly = !isEditable;
+
+  return <DropDownComponent>Created DropDown</DropDownComponent>;
+};
diff --git a/wax-prosemirror-services/src/MultipleDropDownService/components/MultipleDropDownContainerComponent.js b/wax-prosemirror-services/src/MultipleDropDownService/components/MultipleDropDownContainerComponent.js
index 34584b560..d6725bb7d 100644
--- a/wax-prosemirror-services/src/MultipleDropDownService/components/MultipleDropDownContainerComponent.js
+++ b/wax-prosemirror-services/src/MultipleDropDownService/components/MultipleDropDownContainerComponent.js
@@ -5,11 +5,6 @@ import styled from 'styled-components';
 import ContainerEditor from './ContainerEditor';
 import FeedbackComponent from './FeedbackComponent';
 
-const MultipleDropDownpContainer = styled.div`
-  border: 3px solid #f5f5f7;
-  margin-bottom: 30px;
-`;
-
 const MultipleDropDownpWrapper = styled.div`
   margin-bottom: ;
   margin: 0px 38px 15px 38px;
@@ -17,6 +12,11 @@ const MultipleDropDownpWrapper = styled.div`
   margin-top: 10px;
 `;
 
+const MultipleDropDownpContainer = styled.div`
+  border: 3px solid #f5f5f7;
+  margin-bottom: 30px;
+`;
+
 export default ({ node, view, getPos }) => {
   const context = useContext(WaxContext);
   const {
diff --git a/wax-prosemirror-services/src/MultipleDropDownService/schema/multipleDropDownOptionNode.js b/wax-prosemirror-services/src/MultipleDropDownService/schema/multipleDropDownOptionNode.js
index 5002ec17d..8a3df4538 100644
--- a/wax-prosemirror-services/src/MultipleDropDownService/schema/multipleDropDownOptionNode.js
+++ b/wax-prosemirror-services/src/MultipleDropDownService/schema/multipleDropDownOptionNode.js
@@ -18,8 +18,8 @@ const multipleDropDownOptionNode = {
         return {
           id: dom.getAttribute('id'),
           class: dom.getAttribute('class'),
-          isfirst: JSON.parse(dom.getAttribute('isfirst').toLowerCase()),
-          answer: JSON.parse(dom.getAttribute('answer').toLowerCase()),
+          // isfirst: JSON.parse(dom.getAttribute('isfirst').toLowerCase()),
+          // answer: JSON.parse(dom.getAttribute('answer').toLowerCase()),
         };
       },
     },
@@ -30,9 +30,8 @@ const multipleDropDownOptionNode = {
       {
         id: node.attrs.id,
         class: node.attrs.class,
-        isfirst: node.attrs.isfirst,
-        answer: JSON.stringify(node.attrs.answer),
-        feedback: node.attrs.feedback,
+        // isfirst: node.attrs.isfirst,
+        // answer: JSON.stringify(node.attrs.answer),
       },
       0,
     ];
diff --git a/wax-prosemirror-services/src/NoteService/Editor.js b/wax-prosemirror-services/src/NoteService/Editor.js
index 38ae9a305..3a43864b6 100644
--- a/wax-prosemirror-services/src/NoteService/Editor.js
+++ b/wax-prosemirror-services/src/NoteService/Editor.js
@@ -29,7 +29,6 @@ export default ({ node, view }) => {
   let typing = false;
 
   const {
-    activeViewId,
     pmViews,
     pmViews: { main },
   } = context;
-- 
GitLab