diff --git a/editors/demo/src/HHMI/HHMI.js b/editors/demo/src/HHMI/HHMI.js index 77c52f59b717a961acacc022526d75577c6238e7..39d314117da0ed7e2e749bbb6cd7f7a71f8ca965 100644 --- a/editors/demo/src/HHMI/HHMI.js +++ b/editors/demo/src/HHMI/HHMI.js @@ -15,16 +15,7 @@ const renderImage = file => { }); }; -const t = `<p class="paragraph">Based on the equation below</p> -<math-display class="math-node">x + y = 5</math-display><p class="paragraph">Which ones are correct?</p> -<p class="paragraph"></p> -<div id="" class="multiple-choice"><div class="multiple-choice-option" id="d7b65415-ff82-446f-afa4-accaa3837f4a" correct="false" feedback=""> -<p class="paragraph">answer 1</p><p class="paragraph"><math-inline class="math-node">x+y=1</math-inline></p></div> -<div class="multiple-choice-option" id="e7d6bb2f-7cd7-44f1-92a0-281e72157538" correct="true" feedback=""> -<p class="paragraph">answer 2</p></div><div class="multiple-choice-option" id="d6fc749f-afae-4203-9562-d68c380a86e5" correct="false" feedback="1111111"> -<p class="paragraph">answer 3</p></div></div> - -<div id="" class="fill-the-gap"><p class="paragraph">A <span id="bfd4376c-4424-455e-9187-f53282fa1024" class="fill-the-gap">DNA</span> molecule is very long and usually consists of hundreds or thousands of genes.</p><p class="paragraph">An electron having a certain discrete amount of <span id="14dedf44-728f-4384-835f-e3af82b25623" class="fill-the-gap">energy</span> is something like a ball on a staircase.</p></div><p class="paragraph"></p>`; +const t = `<p class="paragraph"></p><div id="84db3734-94ed-4dd0-82bb-15404854df0f" class="multiple-choice"><div class="multiple-choice-question" id="38de8538-647a-489d-8474-f92d0d256c32"><p class="paragraph">question</p></div><div class="multiple-choice-option" id="debb868e-bbfe-4ba2-bf93-c963153ff791" correct="false" feedback=""><p class="paragraph">answer 1</p></div><div class="multiple-choice-option" id="810bcf10-4fcb-4d1e-9dab-ce35cbd28527" correct="false" feedback=""><p class="paragraph">answer 2</p></div></div>`; const Hhmi = () => { return ( diff --git a/wax-prosemirror-services/src/MultipleChoiceQuestionService/TrueFalseQuestionService/QuestionTrueFalseNodeView.js b/wax-prosemirror-services/src/MultipleChoiceQuestionService/TrueFalseQuestionService/QuestionTrueFalseNodeView.js index 55c935358fb493935a81018224d99ecdc6168cb5..f373d41b5f2bf7218dbdb4bbec9a8c56d851abc6 100644 --- a/wax-prosemirror-services/src/MultipleChoiceQuestionService/TrueFalseQuestionService/QuestionTrueFalseNodeView.js +++ b/wax-prosemirror-services/src/MultipleChoiceQuestionService/TrueFalseQuestionService/QuestionTrueFalseNodeView.js @@ -1,6 +1,6 @@ import AbstractNodeView from '../../PortalService/AbstractNodeView'; -export default class QuestionNodeView extends AbstractNodeView { +export default class QuestionTrueFalseNodeView extends AbstractNodeView { constructor( node, view, diff --git a/wax-prosemirror-services/src/MultipleChoiceQuestionService/TrueFalseSingleCorrectQuestionService/QuestionTrueFalseSingleNodeView.js b/wax-prosemirror-services/src/MultipleChoiceQuestionService/TrueFalseSingleCorrectQuestionService/QuestionTrueFalseSingleNodeView.js new file mode 100644 index 0000000000000000000000000000000000000000..9496fe060164aadcb1cb2d06e5f4d51d1c41fd4b --- /dev/null +++ b/wax-prosemirror-services/src/MultipleChoiceQuestionService/TrueFalseSingleCorrectQuestionService/QuestionTrueFalseSingleNodeView.js @@ -0,0 +1,55 @@ +import AbstractNodeView from '../../PortalService/AbstractNodeView'; + +export default class QuestionTrueFalseSingleNodeView extends AbstractNodeView { + constructor( + node, + view, + getPos, + decorations, + createPortal, + Component, + context, + ) { + super(node, view, getPos, decorations, createPortal, Component, context); + + this.node = node; + this.outerView = view; + this.getPos = getPos; + this.context = context; + } + + static name() { + return 'question_node_true_false_single'; + } + + update(node) { + this.node = node; + if (this.context.view[node.attrs.id]) { + const { state } = this.context.view[node.attrs.id]; + const start = node.content.findDiffStart(state.doc.content); + if (start != null) { + let { a: endA, b: endB } = node.content.findDiffEnd(state.doc.content); + const overlap = start - Math.min(endA, endB); + if (overlap > 0) { + endA += overlap; + endB += overlap; + } + this.context.view[node.attrs.id].dispatch( + state.tr + .replace(start, endB, node.slice(start, endA)) + .setMeta('fromOutside', true), + ); + } + } + + return true; + } + + stopEvent(event) { + if (event.target.type === 'text') { + return true; + } + const innerView = this.context.view[this.node.attrs.id]; + return innerView && innerView.dom.contains(event.target); + } +} diff --git a/wax-prosemirror-services/src/MultipleChoiceQuestionService/TrueFalseSingleCorrectQuestionService/TrueFalseSingleCorrectQuestion.js b/wax-prosemirror-services/src/MultipleChoiceQuestionService/TrueFalseSingleCorrectQuestionService/TrueFalseSingleCorrectQuestion.js index 0098426d830a01dfdf76e819dde8d60219252550..218758c7a743734994233b646bfd3515c9cc868c 100644 --- a/wax-prosemirror-services/src/MultipleChoiceQuestionService/TrueFalseSingleCorrectQuestionService/TrueFalseSingleCorrectQuestion.js +++ b/wax-prosemirror-services/src/MultipleChoiceQuestionService/TrueFalseSingleCorrectQuestionService/TrueFalseSingleCorrectQuestion.js @@ -19,8 +19,9 @@ class TrueFalseSingleCorrectQuestion extends Tools { helpers.createOptions( view, context, - view.state.config.schema.nodes.true_false_single_correct, view.state.config.schema.nodes.true_false_single_correct_container, + view.state.config.schema.nodes.question_node_true_false_single, + view.state.config.schema.nodes.true_false_single_correct, ); }; } diff --git a/wax-prosemirror-services/src/MultipleChoiceQuestionService/TrueFalseSingleCorrectQuestionService/TrueFalseSingleCorrectQuestionService.js b/wax-prosemirror-services/src/MultipleChoiceQuestionService/TrueFalseSingleCorrectQuestionService/TrueFalseSingleCorrectQuestionService.js index f90d3bb2b41b767eea2e6d93019c5a1fe48e9983..27d1710560a54e7bf45ae60e3685ef84e1c04c7b 100644 --- a/wax-prosemirror-services/src/MultipleChoiceQuestionService/TrueFalseSingleCorrectQuestionService/TrueFalseSingleCorrectQuestionService.js +++ b/wax-prosemirror-services/src/MultipleChoiceQuestionService/TrueFalseSingleCorrectQuestionService/TrueFalseSingleCorrectQuestionService.js @@ -2,8 +2,11 @@ import Service from '../../Service'; import TrueFalseSingleCorrectQuestion from './TrueFalseSingleCorrectQuestion'; import trueFalseSingleCorrectNode from './schema/trueFalseSingleCorrectNode'; import trueFalseSingleCorrectContainerNode from './schema/trueFalseSingleCorrectContainerNode'; -import QuestionComponent from './components/QuestionComponent'; +import questionTrueFalseSingleNode from './schema/questionTrueFalseSingleNode'; +import AnswerComponent from './components/AnswerComponent'; import TrueFalseSingleCorrectNodeView from './TrueFalseSingleCorrectNodeView'; +import QuestionTrueFalseSingleNodeView from './QuestionTrueFalseSingleNodeView'; +import QuestionComponent from '../components/QuestionComponent'; class TrueFalseSingleCorrectQuestionService extends Service { register() { @@ -21,11 +24,21 @@ class TrueFalseSingleCorrectQuestionService extends Service { true_false_single_correct_container: trueFalseSingleCorrectContainerNode, }); + createNode({ + question_node_true_false_single: questionTrueFalseSingleNode, + }); + addPortal({ - nodeView: TrueFalseSingleCorrectNodeView, + nodeView: QuestionTrueFalseSingleNodeView, component: QuestionComponent, context: this.app, }); + + addPortal({ + nodeView: TrueFalseSingleCorrectNodeView, + component: AnswerComponent, + context: this.app, + }); } } diff --git a/wax-prosemirror-services/src/MultipleChoiceQuestionService/TrueFalseSingleCorrectQuestionService/components/QuestionComponent.js b/wax-prosemirror-services/src/MultipleChoiceQuestionService/TrueFalseSingleCorrectQuestionService/components/AnswerComponent.js similarity index 100% rename from wax-prosemirror-services/src/MultipleChoiceQuestionService/TrueFalseSingleCorrectQuestionService/components/QuestionComponent.js rename to wax-prosemirror-services/src/MultipleChoiceQuestionService/TrueFalseSingleCorrectQuestionService/components/AnswerComponent.js diff --git a/wax-prosemirror-services/src/MultipleChoiceQuestionService/TrueFalseSingleCorrectQuestionService/components/SwitchComponent.js b/wax-prosemirror-services/src/MultipleChoiceQuestionService/TrueFalseSingleCorrectQuestionService/components/SwitchComponent.js index 434a544c5d13070af63d4ba9c4e20094eca0272b..60944f668591683a46680248c242c014476124aa 100644 --- a/wax-prosemirror-services/src/MultipleChoiceQuestionService/TrueFalseSingleCorrectQuestionService/components/SwitchComponent.js +++ b/wax-prosemirror-services/src/MultipleChoiceQuestionService/TrueFalseSingleCorrectQuestionService/components/SwitchComponent.js @@ -82,11 +82,11 @@ const CustomSwitch = ({ node, getPos }) => { return ( <StyledSwitch checked={checked} - checkedChildren="YES" - label="Correct?" + checkedChildren="True" + label="True/false?" labelPosition="left" onChange={handleChange} - unCheckedChildren="NO" + unCheckedChildren="False" /> ); }; diff --git a/wax-prosemirror-services/src/MultipleChoiceQuestionService/TrueFalseSingleCorrectQuestionService/schema/questionTrueFalseSingleNode.js b/wax-prosemirror-services/src/MultipleChoiceQuestionService/TrueFalseSingleCorrectQuestionService/schema/questionTrueFalseSingleNode.js new file mode 100644 index 0000000000000000000000000000000000000000..a75a918c7aa385406a6d566f41e9202e0d5b4d84 --- /dev/null +++ b/wax-prosemirror-services/src/MultipleChoiceQuestionService/TrueFalseSingleCorrectQuestionService/schema/questionTrueFalseSingleNode.js @@ -0,0 +1,27 @@ +import { v4 as uuidv4 } from 'uuid'; + +const questionTrueFalseNode = { + attrs: { + class: { default: 'true-false-question-single' }, + id: { default: uuidv4() }, + }, + group: 'block questions', + content: 'block*', + defining: true, + + // atom: true, + parseDOM: [ + { + tag: 'div.true-false-question-single', + getAttrs(dom) { + return { + id: dom.getAttribute('id'), + class: dom.getAttribute('class'), + }; + }, + }, + ], + toDOM: node => ['div', node.attrs, 0], +}; + +export default questionTrueFalseNode; diff --git a/wax-prosemirror-services/src/MultipleChoiceQuestionService/helpers/helpers.js b/wax-prosemirror-services/src/MultipleChoiceQuestionService/helpers/helpers.js index 96c6fa2004efa1284c7ca4bb082d38f039592ff3..3a41832382a3548b702966a2630796f16a1111ed 100644 --- a/wax-prosemirror-services/src/MultipleChoiceQuestionService/helpers/helpers.js +++ b/wax-prosemirror-services/src/MultipleChoiceQuestionService/helpers/helpers.js @@ -46,13 +46,7 @@ const checkifEmpty = view => { } }; -const createOptions = ( - main, - context, - parentType, - questionType, - answerTtype, -) => { +const createOptions = (main, context, parentType, questionType, answerType) => { checkifEmpty(main); const { state, dispatch } = main; /* Create Wrapping */ @@ -60,7 +54,7 @@ const createOptions = ( const range = $from.blockRange($to); const { tr } = main.state; - const wrapping = range && findWrapping(range, parentType, { id: uuidv4 }); + const wrapping = range && findWrapping(range, parentType, { id: uuidv4() }); if (!wrapping) return false; tr.wrap(range, wrapping); @@ -75,10 +69,10 @@ const createOptions = ( const question = questionType.create({ id: uuidv4() }, Fragment.empty); /* create First Option */ - const firstOption = answerTtype.create({ id: uuidv4() }, Fragment.empty); + const firstOption = answerType.create({ id: uuidv4() }, Fragment.empty); /* create Second Option */ - const secondOption = answerTtype.create({ id: uuidv4() }, Fragment.empty); + const secondOption = answerType.create({ id: uuidv4() }, Fragment.empty); tr.replaceSelectionWith(question); tr.replaceSelectionWith(firstOption); tr.setSelection(TextSelection.create(tr.doc, newPos + 1)); diff --git a/wax-prosemirror-services/src/MultipleChoiceQuestionService/schema/questionNode.js b/wax-prosemirror-services/src/MultipleChoiceQuestionService/schema/questionNode.js index ca2378579ed39e0183efcf94401591462b859bdd..efa190215d10c3f2bb8c907603e53c77d432a62e 100644 --- a/wax-prosemirror-services/src/MultipleChoiceQuestionService/schema/questionNode.js +++ b/wax-prosemirror-services/src/MultipleChoiceQuestionService/schema/questionNode.js @@ -9,7 +9,6 @@ const questionNode = { content: 'block*', defining: true, - // atom: true, parseDOM: [ { tag: 'div.multiple-choice-question',