diff --git a/editors/demo/src/Editors.js b/editors/demo/src/Editors.js index dac3414348846efed6dfe5010f4d79fc5d323b8a..774b1d788062488961e815ef274ca2a6b3850b23 100644 --- a/editors/demo/src/Editors.js +++ b/editors/demo/src/Editors.js @@ -48,7 +48,7 @@ const Editors = () => { case 'ncbi': break; default: - return <Editoria />; + return <HHMI />; } }; diff --git a/editors/demo/src/HHMI/HHMI.js b/editors/demo/src/HHMI/HHMI.js index 956b2d8a90c985ef729c79273e102cd0e4a92db0..f9e2283cae44cc909b2e7f06e158bef7a4f5aa28 100644 --- a/editors/demo/src/HHMI/HHMI.js +++ b/editors/demo/src/HHMI/HHMI.js @@ -4,6 +4,7 @@ import { Wax } from 'wax-prosemirror-core'; import { HhmiLayout } from './layout'; import { config } from './config'; +import TestComponent from './MultipleChoiceQuestionService/components/TestComponent'; const renderImage = file => { const reader = new FileReader(); @@ -24,6 +25,7 @@ const Hhmi = () => { fileUpload={file => renderImage(file)} value="" targetFormat="JSON" + nodeViews={[{ multiple_choice: { component: TestComponent } }]} // readonly layout={HhmiLayout} // onChange={source => console.log(source)} diff --git a/editors/demo/src/HHMI/MultipleChoiceQuestionService/MultipleChoiceQuestion.js b/editors/demo/src/HHMI/MultipleChoiceQuestionService/MultipleChoiceQuestion.js index 7f7cbdec7176531ba0e90177dd93dfc0f242dcef..e921c333d46a9a9c931f816e95b0caaab0c959c8 100644 --- a/editors/demo/src/HHMI/MultipleChoiceQuestionService/MultipleChoiceQuestion.js +++ b/editors/demo/src/HHMI/MultipleChoiceQuestionService/MultipleChoiceQuestion.js @@ -1,5 +1,6 @@ import { injectable } from 'inversify'; import { Tools } from 'wax-prosemirror-services'; +import { wrapIn } from 'prosemirror-commands'; @injectable() class MultipleChoiceQuestion extends Tools { @@ -8,7 +9,9 @@ class MultipleChoiceQuestion extends Tools { name = 'Multiple Choice'; get run() { - return (state, dispatch) => {}; + return (state, dispatch) => { + wrapIn(state.config.schema.nodes.multiple_choice)(state, dispatch); + }; } get active() { diff --git a/editors/demo/src/HHMI/MultipleChoiceQuestionService/MultipleChoiceQuestionService.js b/editors/demo/src/HHMI/MultipleChoiceQuestionService/MultipleChoiceQuestionService.js index c128ee4208a83ac385824edb7248b787730d31d0..7d926286d751ead6767ca44291297d1e971b810b 100644 --- a/editors/demo/src/HHMI/MultipleChoiceQuestionService/MultipleChoiceQuestionService.js +++ b/editors/demo/src/HHMI/MultipleChoiceQuestionService/MultipleChoiceQuestionService.js @@ -1,5 +1,6 @@ import { Service } from 'wax-prosemirror-services'; import MultipleChoiceQuestion from './MultipleChoiceQuestion'; +import multipleChoiceNode from './schema/multipleChoiceNode'; class MultipleChoiceQuestionService extends Service { boot() {} @@ -7,7 +8,10 @@ class MultipleChoiceQuestionService extends Service { register() { this.container.bind('MultipleChoiceQuestion').to(MultipleChoiceQuestion); const createNode = this.container.get('CreateNode'); - console.log(createNode); + createNode({ + multiple_choice: multipleChoiceNode, + }); + console.log(this.schema); } } diff --git a/wax-prosemirror-core/src/BlockQuote.js b/editors/demo/src/HHMI/MultipleChoiceQuestionService/components/TestComponent.js similarity index 100% rename from wax-prosemirror-core/src/BlockQuote.js rename to editors/demo/src/HHMI/MultipleChoiceQuestionService/components/TestComponent.js diff --git a/editors/demo/src/HHMI/MultipleChoiceQuestionService/schema/multipleChoiceNode.js b/editors/demo/src/HHMI/MultipleChoiceQuestionService/schema/multipleChoiceNode.js new file mode 100644 index 0000000000000000000000000000000000000000..da9539965a392d357c95670f570261b1a68f15fd --- /dev/null +++ b/editors/demo/src/HHMI/MultipleChoiceQuestionService/schema/multipleChoiceNode.js @@ -0,0 +1,24 @@ +// const multipleChoiceNode = { +// group: 'block multiple', +// content: 'text*', +// atom: true, +// code: true, +// toDOM: () => ['multiple-choice', { class: 'multiple-choice' }, 0], +// parseDOM: [ +// { +// tag: 'multiple-choice', +// }, +// ], +// }; + +const multipleChoiceNode = { + content: 'block+', + group: 'block', + defining: true, + parseDOM: [{ tag: 'multiple-choice' }], + toDOM() { + return ['multiple-choice', 0]; + }, +}; + +export default multipleChoiceNode; diff --git a/editors/demo/src/HHMI/config/config.js b/editors/demo/src/HHMI/config/config.js index e972699d6d16745d994cca0fe55f689ca55f7f92..d0e0640f5be2b3ee570fe83c0aab4f23c73f65a8 100644 --- a/editors/demo/src/HHMI/config/config.js +++ b/editors/demo/src/HHMI/config/config.js @@ -17,17 +17,8 @@ import { DisplayToolGroupService, TextBlockLevelService, TextToolGroupService, - NoteService, - NoteToolGroupService, - TrackChangeService, - CommentsService, - CodeBlockService, - CodeBlockToolGroupService, DisplayTextToolGroupService, MathService, - FindAndReplaceService, - EditingSuggestingService, - TrackingAndEditingToolGroupService, FullScreenService, FullScreenToolGroupService, SpecialCharactersService, @@ -38,13 +29,13 @@ import { BottomInfoService, TransformService, TransformToolGroupService, - TrackOptionsToolGroupService, - TrackCommentOptionsToolGroupService, - CustomTagInlineToolGroupService, - CustomTagBlockToolGroupService, - CustomTagService, } from 'wax-prosemirror-services'; +/* Questions Services */ + +import MultipleChoiceQuestionService from '../MultipleChoiceQuestionService/MultipleChoiceQuestionService'; +import QuestionsToolGroupService from '../QuestionsToolGroupService/QuestionsToolGroupService'; + import { DefaultSchema } from 'wax-prosemirror-utilities'; import { WaxSelectionPlugin } from 'wax-prosemirror-plugins'; @@ -77,6 +68,7 @@ export default { 'Images', 'SpecialCharacters', 'Tables', + 'Questions', 'FullScreen', ], }, @@ -93,6 +85,8 @@ export default { ], services: [ + new MultipleChoiceQuestionService(), + new QuestionsToolGroupService(), new DisplayBlockLevelService(), new DisplayToolGroupService(), new TextBlockLevelService(), diff --git a/wax-prosemirror-core/src/Wax.js b/wax-prosemirror-core/src/Wax.js index fc15ccd02c111a129ca772927dfcd2f5a34b8f54..b344cce3c1a6f7afab68c9524758dc518961b3a7 100644 --- a/wax-prosemirror-core/src/Wax.js +++ b/wax-prosemirror-core/src/Wax.js @@ -66,6 +66,7 @@ const Wax = props => { user, onChange, targetFormat, + nodeViews, } = props; if (!application) return null; @@ -144,6 +145,7 @@ const Wax = props => { targetFormat={targetFormat} TrackChange={TrackChange} user={user} + nodeViews={nodeViews} > {({ editor }) => <WaxRender className={className} editor={editor} />} </WaxView> diff --git a/wax-prosemirror-core/src/WaxView.js b/wax-prosemirror-core/src/WaxView.js index 41563bdb748e2b59216ef71546062493d5e2a6cd..f12d4c69aeebf28d16640b29d7714c33115ae5da 100644 --- a/wax-prosemirror-core/src/WaxView.js +++ b/wax-prosemirror-core/src/WaxView.js @@ -10,7 +10,6 @@ import { trackedTransaction } from 'wax-prosemirror-services'; import { WaxContext, useReactNodeViewPortals } from './WaxContext'; import transformPasted from './helpers/TransformPasted'; import { createReactNodeView } from './ReactNodeView'; -import BlockQuote from './BlockQuote'; let previousDoc; @@ -23,13 +22,13 @@ export default props => { autoFocus, user, targetFormat, + nodeViews, } = props; const editorRef = useRef(); let view; const context = useContext(WaxContext); const { createPortal } = useReactNodeViewPortals(); - const handleCreatePortal = useCallback(createPortal, []); const setEditorRef = useCallback( @@ -49,19 +48,7 @@ export default props => { user, scrollMargin: 200, scrollThreshold: 200, - nodeViews: { - blockquote(node, view, getPos, decorations) { - console.log('rerenders for ever'); - return createReactNodeView({ - node, - view, - getPos, - decorations, - component: BlockQuote, - onCreatePortal: handleCreatePortal, - }); - }, - }, + nodeViews: createNodeVies(), handleDOMEvents: { blur: onBlur ? view => { @@ -97,6 +84,26 @@ export default props => { [readonly], ); + const createNodeVies = () => { + const test = nodeViews.map((nodeView, key) => { + return { + multiple_choice(node, view, getPos, decorations) { + console.log('rerenders for ever'); + return createReactNodeView({ + node, + view, + getPos, + decorations, + component: nodeView.multiple_choice.component, + onCreatePortal: handleCreatePortal, + }); + }, + }; + }); + console.log(test); + return test[0]; + }; + const dispatchTransaction = transaction => { const { TrackChange } = props; const tr =