From 46681afb8fdc645060ac8cb014c5de09b7ec0e11 Mon Sep 17 00:00:00 2001
From: chris <kokosias@yahoo.gr>
Date: Tue, 29 Sep 2020 19:14:55 +0300
Subject: [PATCH] active block levels

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

diff --git a/wax-prosemirror-components/src/components/Button.js b/wax-prosemirror-components/src/components/Button.js
index 7f6ec04c5..ed968a69a 100644
--- a/wax-prosemirror-components/src/components/Button.js
+++ b/wax-prosemirror-components/src/components/Button.js
@@ -19,10 +19,10 @@ const Button = ({ view = {}, item }) => {
     run(state, dispatch);
   };
 
-  const isActive = active && active(state);
+  const isActive = active && active(state, activeViewId);
 
   const isDisabled =
-    enable && !enable(state) && !(select && select(view.state, activeViewId));
+    enable && !enable(state) && !(select && select(state, activeViewId));
 
   return (
     <MenuButton
diff --git a/wax-prosemirror-services/src/DisplayBlockLevel/AuthorService/Author.js b/wax-prosemirror-services/src/DisplayBlockLevel/AuthorService/Author.js
index 18e843d46..d622e7606 100644
--- a/wax-prosemirror-services/src/DisplayBlockLevel/AuthorService/Author.js
+++ b/wax-prosemirror-services/src/DisplayBlockLevel/AuthorService/Author.js
@@ -16,6 +16,12 @@ class Author extends Tools {
     };
   }
 
+  get active() {
+    return (state, activeViewId) => {
+      return Commands.blockActive(state.config.schema.nodes.author)(state);
+    };
+  }
+
   select = (state, activeViewId) => {
     if (activeViewId !== 'main') return false;
     return true;
diff --git a/wax-prosemirror-services/src/DisplayBlockLevel/EpigraphPoetryService/EpigraphPoetry.js b/wax-prosemirror-services/src/DisplayBlockLevel/EpigraphPoetryService/EpigraphPoetry.js
index ef7b404fb..fb321b08f 100644
--- a/wax-prosemirror-services/src/DisplayBlockLevel/EpigraphPoetryService/EpigraphPoetry.js
+++ b/wax-prosemirror-services/src/DisplayBlockLevel/EpigraphPoetryService/EpigraphPoetry.js
@@ -16,6 +16,14 @@ class EpigraphPoetry extends Tools {
     };
   }
 
+  get active() {
+    return (state, activeViewId) => {
+      return Commands.blockActive(state.config.schema.nodes.epigraphPoetry)(
+        state,
+      );
+    };
+  }
+
   select = (state, activeViewId) => {
     if (activeViewId !== 'main') return false;
     return true;
diff --git a/wax-prosemirror-services/src/DisplayBlockLevel/EpigraphProseService/EpigraphProse.js b/wax-prosemirror-services/src/DisplayBlockLevel/EpigraphProseService/EpigraphProse.js
index eebf0a30c..257d3a922 100644
--- a/wax-prosemirror-services/src/DisplayBlockLevel/EpigraphProseService/EpigraphProse.js
+++ b/wax-prosemirror-services/src/DisplayBlockLevel/EpigraphProseService/EpigraphProse.js
@@ -17,6 +17,14 @@ class EpigraphProse extends Tools {
     };
   }
 
+  get active() {
+    return (state, activeViewId) => {
+      return Commands.blockActive(state.config.schema.nodes.epigraphProse)(
+        state,
+      );
+    };
+  }
+
   select = (state, activeViewId) => {
     if (activeViewId !== 'main') return false;
     return true;
diff --git a/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading1.js b/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading1.js
index cb2163281..87c28214f 100644
--- a/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading1.js
+++ b/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading1.js
@@ -18,6 +18,14 @@ class Heading1 extends Tools {
     };
   }
 
+  get active() {
+    return (state, activeViewId) => {
+      return Commands.blockActive(state.config.schema.nodes.heading, {
+        level: 1,
+      })(state);
+    };
+  }
+
   select = (state, activeViewId) => {
     if (activeViewId !== 'main') return false;
     return true;
diff --git a/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading2.js b/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading2.js
index 23bf37639..fca907f60 100644
--- a/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading2.js
+++ b/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading2.js
@@ -18,6 +18,14 @@ class Heading2 extends Tools {
     };
   }
 
+  get active() {
+    return (state, activeViewId) => {
+      return Commands.blockActive(state.config.schema.nodes.heading, {
+        level: 2,
+      })(state);
+    };
+  }
+
   select = (state, activeViewId) => {
     if (activeViewId !== 'main') return false;
     return true;
diff --git a/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading3.js b/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading3.js
index 01e16ca8e..682b0fc80 100644
--- a/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading3.js
+++ b/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading3.js
@@ -18,6 +18,14 @@ class Heading3 extends Tools {
     };
   }
 
+  get active() {
+    return (state, activeViewId) => {
+      return Commands.blockActive(state.config.schema.nodes.heading, {
+        level: 3,
+      })(state);
+    };
+  }
+
   select = (state, activeViewId) => {
     if (activeViewId !== 'main') return false;
     return true;
diff --git a/wax-prosemirror-services/src/DisplayBlockLevel/SubTitleService/SubTitle.js b/wax-prosemirror-services/src/DisplayBlockLevel/SubTitleService/SubTitle.js
index cb14ab9fe..a4fb4795b 100644
--- a/wax-prosemirror-services/src/DisplayBlockLevel/SubTitleService/SubTitle.js
+++ b/wax-prosemirror-services/src/DisplayBlockLevel/SubTitleService/SubTitle.js
@@ -17,6 +17,12 @@ class SubTitle extends Tools {
     };
   }
 
+  get active() {
+    return (state, activeViewId) => {
+      return Commands.blockActive(state.config.schema.nodes.subtitle)(state);
+    };
+  }
+
   select = (state, activeViewId) => {
     if (activeViewId !== 'main') return false;
     return true;
diff --git a/wax-prosemirror-services/src/DisplayBlockLevel/TitleService/Title.js b/wax-prosemirror-services/src/DisplayBlockLevel/TitleService/Title.js
index 443be005b..0de73d091 100644
--- a/wax-prosemirror-services/src/DisplayBlockLevel/TitleService/Title.js
+++ b/wax-prosemirror-services/src/DisplayBlockLevel/TitleService/Title.js
@@ -2,7 +2,7 @@ import Tools from '../../lib/Tools';
 import { injectable } from 'inversify';
 import { Commands } from 'wax-prosemirror-utilities';
 
-export default 
+export default
 @injectable()
 class Title extends Tools {
   title = 'Change to Title';
@@ -17,6 +17,12 @@ class Title extends Tools {
     };
   }
 
+  get active() {
+    return (state, activeViewId) => {
+      return Commands.blockActive(state.config.schema.nodes.title)(state);
+    };
+  }
+
   select = (state, activeViewId) => {
     if (activeViewId !== 'main') return false;
     return true;
diff --git a/wax-prosemirror-services/src/TextBlockLevel/ExtractPoetryService/ExtractPoetry.js b/wax-prosemirror-services/src/TextBlockLevel/ExtractPoetryService/ExtractPoetry.js
index 46e9adf51..be5fe1906 100644
--- a/wax-prosemirror-services/src/TextBlockLevel/ExtractPoetryService/ExtractPoetry.js
+++ b/wax-prosemirror-services/src/TextBlockLevel/ExtractPoetryService/ExtractPoetry.js
@@ -21,6 +21,14 @@ class ExtractPoetry extends Tools {
     return true;
   };
 
+  get active() {
+    return (state, activeViewId) => {
+      return Commands.blockActive(state.config.schema.nodes.extractPoetry)(
+        state,
+      );
+    };
+  }
+
   get enable() {
     return state => {
       return Commands.setBlockType(state.config.schema.nodes.extractPoetry)(
diff --git a/wax-prosemirror-services/src/TextBlockLevel/ExtractProseService/ExtractProse.js b/wax-prosemirror-services/src/TextBlockLevel/ExtractProseService/ExtractProse.js
index 857325063..7da57142c 100644
--- a/wax-prosemirror-services/src/TextBlockLevel/ExtractProseService/ExtractProse.js
+++ b/wax-prosemirror-services/src/TextBlockLevel/ExtractProseService/ExtractProse.js
@@ -16,6 +16,14 @@ class ExtractProse extends Tools {
     };
   }
 
+  get active() {
+    return (state, activeViewId) => {
+      return Commands.blockActive(state.config.schema.nodes.extractProse)(
+        state,
+      );
+    };
+  }
+
   select = (state, activeViewId) => {
     if (activeViewId !== 'main') return false;
     return true;
diff --git a/wax-prosemirror-services/src/TextBlockLevel/ParagraphContinuedService/ParagraphContinued.js b/wax-prosemirror-services/src/TextBlockLevel/ParagraphContinuedService/ParagraphContinued.js
index 203509e55..a7437e99a 100644
--- a/wax-prosemirror-services/src/TextBlockLevel/ParagraphContinuedService/ParagraphContinued.js
+++ b/wax-prosemirror-services/src/TextBlockLevel/ParagraphContinuedService/ParagraphContinued.js
@@ -16,6 +16,14 @@ class ParagraphContinued extends Tools {
     };
   }
 
+  get active() {
+    return (state, activeViewId) => {
+      return Commands.blockActive(state.config.schema.nodes.paragraphCont)(
+        state,
+      );
+    };
+  }
+
   select = (state, activeViewId) => {
     if (activeViewId !== 'main') return false;
     return true;
diff --git a/wax-prosemirror-services/src/TextBlockLevel/ParagraphService/Paragraph.js b/wax-prosemirror-services/src/TextBlockLevel/ParagraphService/Paragraph.js
index 1554be67d..1b1c6dee6 100644
--- a/wax-prosemirror-services/src/TextBlockLevel/ParagraphService/Paragraph.js
+++ b/wax-prosemirror-services/src/TextBlockLevel/ParagraphService/Paragraph.js
@@ -17,6 +17,12 @@ class Paragraph extends Tools {
     };
   }
 
+  get active() {
+    return (state, activeViewId) => {
+      return Commands.blockActive(state.config.schema.nodes.paragraph)(state);
+    };
+  }
+
   select = (state, activeViewId) => {
     if (activeViewId !== 'main') return false;
     return true;
diff --git a/wax-prosemirror-services/src/TextBlockLevel/SourceNoteService/SourceNote.js b/wax-prosemirror-services/src/TextBlockLevel/SourceNoteService/SourceNote.js
index 99e94d5e3..959808225 100644
--- a/wax-prosemirror-services/src/TextBlockLevel/SourceNoteService/SourceNote.js
+++ b/wax-prosemirror-services/src/TextBlockLevel/SourceNoteService/SourceNote.js
@@ -16,6 +16,12 @@ class SourceNote extends Tools {
     };
   }
 
+  get active() {
+    return (state, activeViewId) => {
+      return Commands.blockActive(state.config.schema.nodes.sourceNote)(state);
+    };
+  }
+
   select = (state, activeViewId) => {
     if (activeViewId !== 'main') return false;
     return true;
diff --git a/wax-prosemirror-utilities/src/commands/Commands.js b/wax-prosemirror-utilities/src/commands/Commands.js
index b4cc52255..d5193ac54 100644
--- a/wax-prosemirror-utilities/src/commands/Commands.js
+++ b/wax-prosemirror-utilities/src/commands/Commands.js
@@ -38,16 +38,31 @@ const markActive = type => state => {
     : state.doc.rangeHasMark(from, to, type);
 };
 
-const blockActive = (type, attrs = {}) => state => {
-  const { $from, to, node } = state.selection;
-
-  if (node) {
-    return node.hasMarkup(type, attrs);
-  }
-
-  return to <= $from.end() && $from.parent.hasMarkup(type, attrs);
+const blockActive = (nodeType, attrs = {}) => {
+  return (state, dispatch) => {
+    const { from, to } = state.selection;
+    let isActive = false;
+    state.doc.nodesBetween(from, to, (node, pos) => {
+      if (!node.isTextblock || node.hasMarkup(nodeType, attrs)) return;
+      if (node.type === nodeType) {
+        isActive = true;
+      }
+    });
+    return isActive;
+  };
 };
 
+//
+// const blockActive = (type, attrs = {}) => state => {
+//   const { $from, to, node } = state.selection;
+//
+//   if (node) {
+//     return node.hasMarkup(type, attrs);
+//   }
+//
+//   return to <= $from.end() && $from.parent.hasMarkup(type, attrs);
+// };
+
 const canInsert = type => state => {
   const { $from } = state.selection;
 
-- 
GitLab