diff --git a/wax-prosemirror-components/src/components/Button.js b/wax-prosemirror-components/src/components/Button.js index 7f6ec04c5010ab201202c7ec203764fcd8c66753..ed968a69aa5dcd5c0f61011fd9ddeb0cc4a5a4b6 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 18e843d46f5f74019bff19790d3d8f74fa15a016..8bd7a8564d91f4fd757975d809c2a8a7f08eb636 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 => { + 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 ef7b404fbf01d239cd441a7fde12a5e280afe9e3..7155f17258e68aaee0598a7430819658f5344a56 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 => { + 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 eebf0a30c24e5a2e21c6e50393ab6d12e8b13658..365321ad08a3c1a950721f87ced1745bf8a0943f 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 => { + 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 cb21632813e39978dd90e2d226270d5e990b1d6d..f1d954587439c1d25b0f59cdb21ec84a34444ad1 100644 --- a/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading1.js +++ b/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading1.js @@ -18,6 +18,23 @@ class Heading1 extends Tools { }; } + get active() { + return (state, activeViewId) => { + let isActive = true; + if (activeViewId !== 'main') return false; + const { from, to } = state.selection; + state.doc.nodesBetween(from, to, (node, pos) => { + if (node.type.name === 'list_item') { + isActive = false; + } + }); + if (!isActive) return false; + return !Commands.setBlockType(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 23bf3763961e6eab6e21d0327cfc7f81d6046272..cb07816bf7c506dd466ec057a1b91f4e98d0ca20 100644 --- a/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading2.js +++ b/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading2.js @@ -18,6 +18,23 @@ class Heading2 extends Tools { }; } + get active() { + return (state, activeViewId) => { + let isActive = true; + if (activeViewId !== 'main') return false; + const { from, to } = state.selection; + state.doc.nodesBetween(from, to, (node, pos) => { + if (node.type.name === 'list_item') { + isActive = false; + } + }); + if (!isActive) return false; + return !Commands.setBlockType(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 01e16ca8e771fd2cf3cadfee41916a037add87ec..a4d4448106d984ace70c1d885ab65273bf79d76c 100644 --- a/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading3.js +++ b/wax-prosemirror-services/src/DisplayBlockLevel/HeadingService/Heading3.js @@ -18,6 +18,23 @@ class Heading3 extends Tools { }; } + get active() { + return (state, activeViewId) => { + let isActive = true; + if (activeViewId !== 'main') return false; + const { from, to } = state.selection; + state.doc.nodesBetween(from, to, (node, pos) => { + if (node.type.name === 'list_item') { + isActive = false; + } + }); + if (!isActive) return false; + return !Commands.setBlockType(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 cb14ab9fe6532e60d31d19693dc7304672adc44b..17293be671c324d0c75a37d4c659aff9a5895227 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 => { + 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 443be005b94823baa770aca815c96d4e58332f18..6ac176a9ba1525523717920f975d1a725fcaeb61 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 => { + 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 46e9adf51cfc6399bf078233c4ea102a25cdc527..c5e8fdfca4080b0a1207d467736b633f5435c7fd 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 => { + 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 8573250630e87481cdc253d3a0991c4a5087f299..0760fabbed7f528a3d258e8bd040142eb5375c48 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 => { + 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 203509e551cf5c8467554ae199ff3a76101162ac..774a432142d337f3126bffe139cac6b2f18744f2 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 => { + 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 1554be67dd2d501a2a22a2b4a232dcbb3ab90086..f0ebddd07ba0eb1b59065700874608d400035b4a 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 => { + 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 99e94d5e3c695c3fd50fa2da69b7a3ca360c0f28..17c67a2789f5edb2f86015c94ed208cf57fd05f0 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 => { + 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 b4cc52255654bea57bf04a7166e661c5c60adea8..d5193ac54f3295ef2a41de4a1049d233cf99b90c 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;