From e7dc82a3f0f9e93bbda3cf6e190a4d590e48c603 Mon Sep 17 00:00:00 2001
From: chris <kokosias@yahoo.gr>
Date: Tue, 12 May 2020 15:39:35 +0300
Subject: [PATCH] replace setblockType to preserver attrs

---
 .../src/components/HeadingsDropDown.js        |  9 +++---
 .../DisplayBlockLevel/AuthorService/Author.js |  6 ++--
 .../EpigraphPoetryService/EpigraphPoetry.js   | 11 +++++--
 .../EpigraphProseService/EpigraphProse.js     | 11 +++++--
 .../HeadingService/Heading1.js                |  9 +++---
 .../HeadingService/Heading2.js                |  9 +++---
 .../HeadingService/Heading3.js                |  9 +++---
 .../SubTitleService/SubTitle.js               |  9 ++++--
 .../DisplayBlockLevel/TitleService/Title.js   |  6 ++--
 .../ExtractPoetryService/ExtractPoetry.js     | 11 +++++--
 .../ExtractProseService/ExtractProse.js       | 11 +++++--
 .../ParagraphContinued.js                     | 11 +++++--
 .../ParagraphService/Paragraph.js             |  9 ++++--
 .../SourceNoteService/SourceNote.js           |  9 ++++--
 .../src/commands/Commands.js                  | 30 +++++++++++++++++++
 15 files changed, 110 insertions(+), 50 deletions(-)

diff --git a/wax-prosemirror-components/src/components/HeadingsDropDown.js b/wax-prosemirror-components/src/components/HeadingsDropDown.js
index 9de03389a..d4fdcaea7 100644
--- a/wax-prosemirror-components/src/components/HeadingsDropDown.js
+++ b/wax-prosemirror-components/src/components/HeadingsDropDown.js
@@ -1,6 +1,6 @@
 import React from "react";
 import styled from "styled-components";
-import { setBlockType } from "prosemirror-commands";
+import { Commands } from "wax-prosemirror-utilities";
 import Dropdown from "react-dropdown";
 import "react-dropdown/style.css";
 
@@ -21,10 +21,9 @@ const HeadingsDropDown = ({ dispatch, state, item }) => (
   <DropdownStyled
     options={dropDownOptions}
     onChange={option => {
-      setBlockType(state.config.schema.nodes.heading, { level: option.value })(
-        state,
-        dispatch
-      );
+      Commands.setBlockType(state.config.schema.nodes.heading, {
+        level: option.value
+      })(state, dispatch);
     }}
     placeholder="Choose heading"
     select={item.select && item.select(state)}
diff --git a/wax-prosemirror-services/src/DisplayBlockLevel/AuthorService/Author.js b/wax-prosemirror-services/src/DisplayBlockLevel/AuthorService/Author.js
index 6be138dd8..e5bbf60a3 100644
--- a/wax-prosemirror-services/src/DisplayBlockLevel/AuthorService/Author.js
+++ b/wax-prosemirror-services/src/DisplayBlockLevel/AuthorService/Author.js
@@ -1,6 +1,6 @@
 import Tools from "../../lib/Tools";
 import { injectable } from "inversify";
-import { setBlockType } from "prosemirror-commands";
+import { Commands } from "wax-prosemirror-utilities";
 
 @injectable()
 export default class Author extends Tools {
@@ -9,13 +9,13 @@ export default class Author extends Tools {
 
   get run() {
     return (state, dispatch) => {
-      setBlockType(state.config.schema.nodes.author)(state, dispatch);
+      Commands.setBlockType(state.config.schema.nodes.author)(state, dispatch);
     };
   }
 
   get enable() {
     return state => {
-      return setBlockType(state.config.schema.nodes.author)(state);
+      return Commands.setBlockType(state.config.schema.nodes.author)(state);
     };
   }
 }
diff --git a/wax-prosemirror-services/src/DisplayBlockLevel/EpigraphPoetryService/EpigraphPoetry.js b/wax-prosemirror-services/src/DisplayBlockLevel/EpigraphPoetryService/EpigraphPoetry.js
index e3d63856a..f09ca8a85 100644
--- a/wax-prosemirror-services/src/DisplayBlockLevel/EpigraphPoetryService/EpigraphPoetry.js
+++ b/wax-prosemirror-services/src/DisplayBlockLevel/EpigraphPoetryService/EpigraphPoetry.js
@@ -1,6 +1,6 @@
 import Tools from "../../lib/Tools";
 import { injectable } from "inversify";
-import { setBlockType } from "prosemirror-commands";
+import { Commands } from "wax-prosemirror-utilities";
 
 @injectable()
 export default class EpigraphPoetry extends Tools {
@@ -9,13 +9,18 @@ export default class EpigraphPoetry extends Tools {
 
   get run() {
     return (state, dispatch) => {
-      setBlockType(state.config.schema.nodes.epigraphPoetry)(state, dispatch);
+      Commands.setBlockType(state.config.schema.nodes.epigraphPoetry)(
+        state,
+        dispatch
+      );
     };
   }
 
   get enable() {
     return state => {
-      return setBlockType(state.config.schema.nodes.epigraphPoetry)(state);
+      return Commands.setBlockType(state.config.schema.nodes.epigraphPoetry)(
+        state
+      );
     };
   }
 }
diff --git a/wax-prosemirror-services/src/DisplayBlockLevel/EpigraphProseService/EpigraphProse.js b/wax-prosemirror-services/src/DisplayBlockLevel/EpigraphProseService/EpigraphProse.js
index 8347f6bcb..735e98ada 100644
--- a/wax-prosemirror-services/src/DisplayBlockLevel/EpigraphProseService/EpigraphProse.js
+++ b/wax-prosemirror-services/src/DisplayBlockLevel/EpigraphProseService/EpigraphProse.js
@@ -1,6 +1,6 @@
 import Tools from "../../lib/Tools";
 import { injectable } from "inversify";
-import { setBlockType } from "prosemirror-commands";
+import { Commands } from "wax-prosemirror-utilities";
 
 @injectable()
 export default class EpigraphProse extends Tools {
@@ -9,13 +9,18 @@ export default class EpigraphProse extends Tools {
 
   get run() {
     return (state, dispatch) => {
-      setBlockType(state.config.schema.nodes.epigraphProse)(state, dispatch);
+      Commands.setBlockType(state.config.schema.nodes.epigraphProse)(
+        state,
+        dispatch
+      );
     };
   }
 
   get enable() {
     return state => {
-      return setBlockType(state.config.schema.nodes.epigraphProse)(state);
+      return Commands.setBlockType(state.config.schema.nodes.epigraphProse)(
+        state
+      );
     };
   }
 }
diff --git a/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading1.js b/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading1.js
index 8ad2dc681..7cd58aec6 100644
--- a/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading1.js
+++ b/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading1.js
@@ -1,6 +1,6 @@
 import Tools from "../../lib/Tools";
 import { injectable } from "inversify";
-import { setBlockType } from "prosemirror-commands";
+import { Commands } from "wax-prosemirror-utilities";
 
 @injectable()
 export default class Heading1 extends Tools {
@@ -9,7 +9,7 @@ export default class Heading1 extends Tools {
 
   get run() {
     return (state, dispatch) => {
-      setBlockType(state.config.schema.nodes.heading, { level: 1 })(
+      Commands.setBlockType(state.config.schema.nodes.heading, { level: 1 })(
         state,
         dispatch
       );
@@ -18,9 +18,8 @@ export default class Heading1 extends Tools {
 
   get enable() {
     return state => {
-      return setBlockType(state.config.schema.nodes.heading, {
-        level: 1,
-        track: []
+      return Commands.setBlockType(state.config.schema.nodes.heading, {
+        level: 1
       })(state);
     };
   }
diff --git a/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading2.js b/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading2.js
index 80a7b88e8..77bc4d4ea 100644
--- a/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading2.js
+++ b/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading2.js
@@ -1,6 +1,6 @@
 import Tools from "../../lib/Tools";
 import { injectable } from "inversify";
-import { setBlockType } from "prosemirror-commands";
+import { Commands } from "wax-prosemirror-utilities";
 
 @injectable()
 export default class Heading2 extends Tools {
@@ -9,7 +9,7 @@ export default class Heading2 extends Tools {
 
   get run() {
     return (state, dispatch) => {
-      setBlockType(state.config.schema.nodes.heading, { level: 2 })(
+      Commands.setBlockType(state.config.schema.nodes.heading, { level: 2 })(
         state,
         dispatch
       );
@@ -18,9 +18,8 @@ export default class Heading2 extends Tools {
 
   get enable() {
     return state => {
-      return setBlockType(state.config.schema.nodes.heading, {
-        level: 2,
-        track: []
+      return Commands.setBlockType(state.config.schema.nodes.heading, {
+        level: 2
       })(state);
     };
   }
diff --git a/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading3.js b/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading3.js
index 8163289fb..bf27f4bce 100644
--- a/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading3.js
+++ b/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading3.js
@@ -1,6 +1,6 @@
 import Tools from "../../lib/Tools";
 import { injectable } from "inversify";
-import { setBlockType } from "prosemirror-commands";
+import { Commands } from "wax-prosemirror-utilities";
 
 @injectable()
 export default class Heading3 extends Tools {
@@ -9,7 +9,7 @@ export default class Heading3 extends Tools {
 
   get run() {
     return (state, dispatch) => {
-      setBlockType(state.config.schema.nodes.heading, { level: 3 })(
+      Commands.setBlockType(state.config.schema.nodes.heading, { level: 3 })(
         state,
         dispatch
       );
@@ -18,9 +18,8 @@ export default class Heading3 extends Tools {
 
   get enable() {
     return state => {
-      return setBlockType(state.config.schema.nodes.heading, {
-        level: 3,
-        track: []
+      return Commands.setBlockType(state.config.schema.nodes.heading, {
+        level: 3
       })(state);
     };
   }
diff --git a/wax-prosemirror-services/src/DisplayBlockLevel/SubTitleService/SubTitle.js b/wax-prosemirror-services/src/DisplayBlockLevel/SubTitleService/SubTitle.js
index caac1427b..e5932b625 100644
--- a/wax-prosemirror-services/src/DisplayBlockLevel/SubTitleService/SubTitle.js
+++ b/wax-prosemirror-services/src/DisplayBlockLevel/SubTitleService/SubTitle.js
@@ -1,6 +1,6 @@
 import Tools from "../../lib/Tools";
 import { injectable } from "inversify";
-import { setBlockType } from "prosemirror-commands";
+import { Commands } from "wax-prosemirror-utilities";
 
 @injectable()
 export default class SubTitle extends Tools {
@@ -9,13 +9,16 @@ export default class SubTitle extends Tools {
 
   get run() {
     return (state, dispatch) => {
-      setBlockType(state.config.schema.nodes.subtitle)(state, dispatch);
+      Commands.setBlockType(state.config.schema.nodes.subtitle)(
+        state,
+        dispatch
+      );
     };
   }
 
   get enable() {
     return state => {
-      return setBlockType(state.config.schema.nodes.subtitle)(state);
+      return Commands.setBlockType(state.config.schema.nodes.subtitle)(state);
     };
   }
 }
diff --git a/wax-prosemirror-services/src/DisplayBlockLevel/TitleService/Title.js b/wax-prosemirror-services/src/DisplayBlockLevel/TitleService/Title.js
index 9f77b510c..e61b8665f 100644
--- a/wax-prosemirror-services/src/DisplayBlockLevel/TitleService/Title.js
+++ b/wax-prosemirror-services/src/DisplayBlockLevel/TitleService/Title.js
@@ -1,6 +1,6 @@
 import Tools from "../../lib/Tools";
 import { injectable } from "inversify";
-import { setBlockType } from "prosemirror-commands";
+import { Commands } from "wax-prosemirror-utilities";
 
 @injectable()
 export default class Title extends Tools {
@@ -9,13 +9,13 @@ export default class Title extends Tools {
 
   get run() {
     return (state, dispatch) => {
-      setBlockType(state.config.schema.nodes.title)(state, dispatch);
+      Commands.setBlockType(state.config.schema.nodes.title)(state, dispatch);
     };
   }
 
   get enable() {
     return state => {
-      return setBlockType(state.config.schema.nodes.title)(state);
+      return Commands.setBlockType(state.config.schema.nodes.title)(state);
     };
   }
 }
diff --git a/wax-prosemirror-services/src/TextBlockLevel/ExtractPoetryService/ExtractPoetry.js b/wax-prosemirror-services/src/TextBlockLevel/ExtractPoetryService/ExtractPoetry.js
index f3507f5d8..6987304d1 100644
--- a/wax-prosemirror-services/src/TextBlockLevel/ExtractPoetryService/ExtractPoetry.js
+++ b/wax-prosemirror-services/src/TextBlockLevel/ExtractPoetryService/ExtractPoetry.js
@@ -1,6 +1,6 @@
 import Tools from "../../lib/Tools";
 import { injectable } from "inversify";
-import { setBlockType } from "prosemirror-commands";
+import { Commands } from "wax-prosemirror-utilities";
 
 @injectable()
 class ExtractPoetry extends Tools {
@@ -9,13 +9,18 @@ class ExtractPoetry extends Tools {
 
   get run() {
     return (state, dispatch) => {
-      setBlockType(state.config.schema.nodes.extractPoetry)(state, dispatch);
+      Commands.setBlockType(state.config.schema.nodes.extractPoetry)(
+        state,
+        dispatch
+      );
     };
   }
 
   get enable() {
     return state => {
-      return setBlockType(state.config.schema.nodes.extractPoetry)(state);
+      return Commands.setBlockType(state.config.schema.nodes.extractPoetry)(
+        state
+      );
     };
   }
 }
diff --git a/wax-prosemirror-services/src/TextBlockLevel/ExtractProseService/ExtractProse.js b/wax-prosemirror-services/src/TextBlockLevel/ExtractProseService/ExtractProse.js
index 261cfe18d..05dd9edad 100644
--- a/wax-prosemirror-services/src/TextBlockLevel/ExtractProseService/ExtractProse.js
+++ b/wax-prosemirror-services/src/TextBlockLevel/ExtractProseService/ExtractProse.js
@@ -1,6 +1,6 @@
 import Tools from "../../lib/Tools";
 import { injectable } from "inversify";
-import { setBlockType } from "prosemirror-commands";
+import { Commands } from "wax-prosemirror-utilities";
 
 @injectable()
 class ExtractProse extends Tools {
@@ -9,13 +9,18 @@ class ExtractProse extends Tools {
 
   get run() {
     return (state, dispatch) => {
-      setBlockType(state.config.schema.nodes.extractProse)(state, dispatch);
+      Commands.setBlockType(state.config.schema.nodes.extractProse)(
+        state,
+        dispatch
+      );
     };
   }
 
   get enable() {
     return state => {
-      return setBlockType(state.config.schema.nodes.extractProse)(state);
+      return Commands.setBlockType(state.config.schema.nodes.extractProse)(
+        state
+      );
     };
   }
 }
diff --git a/wax-prosemirror-services/src/TextBlockLevel/ParagraphContinuedService/ParagraphContinued.js b/wax-prosemirror-services/src/TextBlockLevel/ParagraphContinuedService/ParagraphContinued.js
index bcc3c506e..1d2206f84 100644
--- a/wax-prosemirror-services/src/TextBlockLevel/ParagraphContinuedService/ParagraphContinued.js
+++ b/wax-prosemirror-services/src/TextBlockLevel/ParagraphContinuedService/ParagraphContinued.js
@@ -1,6 +1,6 @@
 import Tools from "../../lib/Tools";
 import { injectable } from "inversify";
-import { setBlockType } from "prosemirror-commands";
+import { Commands } from "wax-prosemirror-utilities";
 
 @injectable()
 class ParagraphContinued extends Tools {
@@ -9,13 +9,18 @@ class ParagraphContinued extends Tools {
 
   get run() {
     return (state, dispatch) => {
-      setBlockType(state.config.schema.nodes.paragraphCont)(state, dispatch);
+      Commands.setBlockType(state.config.schema.nodes.paragraphCont)(
+        state,
+        dispatch
+      );
     };
   }
 
   get enable() {
     return state => {
-      return setBlockType(state.config.schema.nodes.paragraphCont)(state);
+      return Commands.setBlockType(state.config.schema.nodes.paragraphCont)(
+        state
+      );
     };
   }
 }
diff --git a/wax-prosemirror-services/src/TextBlockLevel/ParagraphService/Paragraph.js b/wax-prosemirror-services/src/TextBlockLevel/ParagraphService/Paragraph.js
index b4480b8d9..4d7b2bbed 100644
--- a/wax-prosemirror-services/src/TextBlockLevel/ParagraphService/Paragraph.js
+++ b/wax-prosemirror-services/src/TextBlockLevel/ParagraphService/Paragraph.js
@@ -1,6 +1,6 @@
 import Tools from "../../lib/Tools";
 import { injectable } from "inversify";
-import { setBlockType } from "prosemirror-commands";
+import { Commands } from "wax-prosemirror-utilities";
 
 @injectable()
 export default class Paragraph extends Tools {
@@ -9,13 +9,16 @@ export default class Paragraph extends Tools {
 
   get run() {
     return (state, dispatch) => {
-      setBlockType(state.config.schema.nodes.paragraph)(state, dispatch);
+      Commands.setBlockType(state.config.schema.nodes.paragraph)(
+        state,
+        dispatch
+      );
     };
   }
 
   get enable() {
     return state => {
-      return setBlockType(state.config.schema.nodes.paragraph)(state);
+      return Commands.setBlockType(state.config.schema.nodes.paragraph)(state);
     };
   }
 }
diff --git a/wax-prosemirror-services/src/TextBlockLevel/SourceNoteService/SourceNote.js b/wax-prosemirror-services/src/TextBlockLevel/SourceNoteService/SourceNote.js
index 5e05eea06..833bb7fc9 100644
--- a/wax-prosemirror-services/src/TextBlockLevel/SourceNoteService/SourceNote.js
+++ b/wax-prosemirror-services/src/TextBlockLevel/SourceNoteService/SourceNote.js
@@ -1,6 +1,6 @@
 import Tools from "../../lib/Tools";
 import { injectable } from "inversify";
-import { setBlockType } from "prosemirror-commands";
+import { Commands } from "wax-prosemirror-utilities";
 
 @injectable()
 class SourceNote extends Tools {
@@ -9,13 +9,16 @@ class SourceNote extends Tools {
 
   get run() {
     return (state, dispatch) => {
-      setBlockType(state.config.schema.nodes.sourceNote)(state, dispatch);
+      Commands.setBlockType(state.config.schema.nodes.sourceNote)(
+        state,
+        dispatch
+      );
     };
   }
 
   get enable() {
     return state => {
-      return setBlockType(state.config.schema.nodes.sourceNote)(state);
+      return Commands.setBlockType(state.config.schema.nodes.sourceNote)(state);
     };
   }
 }
diff --git a/wax-prosemirror-utilities/src/commands/Commands.js b/wax-prosemirror-utilities/src/commands/Commands.js
index 74d926b4d..555e9f2fd 100644
--- a/wax-prosemirror-utilities/src/commands/Commands.js
+++ b/wax-prosemirror-utilities/src/commands/Commands.js
@@ -1,5 +1,34 @@
 import { v4 as uuidv4 } from "uuid";
 
+const setBlockType = (nodeType, attrs = {}) => {
+  return (state, dispatch) => {
+    const { from, to } = state.selection;
+    const tr = state.tr;
+    state.doc.nodesBetween(from, to, (node, pos) => {
+      if (!node.isTextblock || node.hasMarkup(nodeType, attrs)) return;
+      let applicable = false;
+      if (node.type == nodeType) {
+        applicable = true;
+      } else {
+        const $pos = state.doc.resolve(pos),
+          index = $pos.index();
+        applicable = $pos.parent.canReplaceWith(index, index + 1, nodeType);
+      }
+      if (applicable) {
+        tr.setBlockType(
+          pos,
+          pos + node.nodeSize,
+          nodeType,
+          Object.assign({}, node.attrs, attrs)
+        );
+      }
+    });
+    if (!tr.steps.length) return false;
+    if (dispatch) dispatch(tr.scrollIntoView());
+    return true;
+  };
+};
+
 const markActive = type => state => {
   const { from, $from, to, empty } = state.selection;
 
@@ -83,6 +112,7 @@ const createComment = (state, dispatch, group) => {
 };
 
 export default {
+  setBlockType,
   blockActive,
   canInsert,
   createComment,
-- 
GitLab