diff --git a/editors/demo/src/Editors.js b/editors/demo/src/Editors.js index d19991a2ed8613a7f85ed0fed95a7dc6ef294736..abd0628fb70695fdd171c22a2956784070ef3345 100644 --- a/editors/demo/src/Editors.js +++ b/editors/demo/src/Editors.js @@ -70,7 +70,7 @@ const Editors = () => { case 'ncbi': return <NCBI />; default: - return <HHMI />; + return <Editoria />; } }; diff --git a/editors/demo/src/HHMI/layout/EditorElements.js b/editors/demo/src/HHMI/layout/EditorElements.js index 9e50d1c478584ab846f4dc7fb463619280391613..65f8294b55907923cda2f6c2d467c62f43518158 100644 --- a/editors/demo/src/HHMI/layout/EditorElements.js +++ b/editors/demo/src/HHMI/layout/EditorElements.js @@ -326,7 +326,8 @@ export default css` .multiple-choice, .multiple-choice-single-correct, - .true-false { + .true-false, + .true-false-single-correct { border: 3px solid #f5f5f7; counter-reset: question-item-multiple; margin: 38px; diff --git a/wax-prosemirror-services/src/MultipleChoiceQuestionService/MultipleChoiceQuestionService.js b/wax-prosemirror-services/src/MultipleChoiceQuestionService/MultipleChoiceQuestionService.js index 29a78d46fca77f1eb14777d2ecf1ab8e553394c0..32b9cd5317ef61b6163734252bdc3fc2d1d8f1ec 100644 --- a/wax-prosemirror-services/src/MultipleChoiceQuestionService/MultipleChoiceQuestionService.js +++ b/wax-prosemirror-services/src/MultipleChoiceQuestionService/MultipleChoiceQuestionService.js @@ -6,6 +6,7 @@ import QuestionComponent from './components/QuestionComponent'; import MultipleChoiceNodeView from './MultipleChoiceNodeView'; import MultipleChoiceSingleCorrectQuestionService from './MultipleChoiceSingleCorrectQuestionService/MultipleChoiceSingleCorrectQuestionService'; import TrueFalseQuestionService from './TrueFalseQuestionService/TrueFalseQuestionService'; +import TrueFalseSingleCorrectQuestionService from './TrueFalseSingleCorrectQuestionService/TrueFalseSingleCorrectQuestionService'; class MultipleChoiceQuestionService extends Service { register() { @@ -31,6 +32,7 @@ class MultipleChoiceQuestionService extends Service { dependencies = [ new MultipleChoiceSingleCorrectQuestionService(), new TrueFalseQuestionService(), + new TrueFalseSingleCorrectQuestionService(), ]; } diff --git a/wax-prosemirror-services/src/MultipleChoiceQuestionService/TrueFalseQuestionService/TrueFalseQuestion.js b/wax-prosemirror-services/src/MultipleChoiceQuestionService/TrueFalseQuestionService/TrueFalseQuestion.js index 403b2455100fb8c68e21db121c0d8d0074e14c58..c8b5de6ec35281bf18254204c056191fec0e9910 100644 --- a/wax-prosemirror-services/src/MultipleChoiceQuestionService/TrueFalseQuestionService/TrueFalseQuestion.js +++ b/wax-prosemirror-services/src/MultipleChoiceQuestionService/TrueFalseQuestionService/TrueFalseQuestion.js @@ -3,15 +3,12 @@ import { isEmpty } from 'lodash'; import { injectable } from 'inversify'; import { Commands } from 'wax-prosemirror-utilities'; import { v4 as uuidv4 } from 'uuid'; -import { Fragment } from 'prosemirror-model'; -import { TextSelection } from 'prosemirror-state'; -import { wrapIn } from 'prosemirror-commands'; import ToolBarBtn from '../components/ToolBarBtn'; import helpers from '../helpers/helpers'; import Tools from '../../lib/Tools'; @injectable() -class MultipleChoiceQuestion extends Tools { +class TrueFalseQuestion extends Tools { title = 'Add True False Question'; icon = 'multipleChoice'; name = 'TrueFalse'; @@ -66,4 +63,4 @@ class MultipleChoiceQuestion extends Tools { } } -export default MultipleChoiceQuestion; +export default TrueFalseQuestion; diff --git a/wax-prosemirror-services/src/MultipleChoiceQuestionService/TrueFalseSingleCorrectQuestionService/TrueFalseSingleCorrectNodeView.js b/wax-prosemirror-services/src/MultipleChoiceQuestionService/TrueFalseSingleCorrectQuestionService/TrueFalseSingleCorrectNodeView.js index 327937384a6fcd686c6ae87a4faf854223029f37..d57375c18a0d127cb8bbc958004cc113d00c2289 100644 --- a/wax-prosemirror-services/src/MultipleChoiceQuestionService/TrueFalseSingleCorrectQuestionService/TrueFalseSingleCorrectNodeView.js +++ b/wax-prosemirror-services/src/MultipleChoiceQuestionService/TrueFalseSingleCorrectQuestionService/TrueFalseSingleCorrectNodeView.js @@ -23,7 +23,6 @@ export default class TrueFalseSingleCorrectNodeView extends AbstractNodeView { } update(node) { - // if (!node.sameMarkup(this.node)) return false; this.node = node; if (this.context.view[node.attrs.id]) { const { state } = this.context.view[node.attrs.id]; diff --git a/wax-prosemirror-services/src/MultipleChoiceQuestionService/TrueFalseSingleCorrectQuestionService/TrueFalseSingleCorrectQuestionService.js b/wax-prosemirror-services/src/MultipleChoiceQuestionService/TrueFalseSingleCorrectQuestionService/TrueFalseSingleCorrectQuestionService.js index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..f90d3bb2b41b767eea2e6d93019c5a1fe48e9983 100644 --- a/wax-prosemirror-services/src/MultipleChoiceQuestionService/TrueFalseSingleCorrectQuestionService/TrueFalseSingleCorrectQuestionService.js +++ b/wax-prosemirror-services/src/MultipleChoiceQuestionService/TrueFalseSingleCorrectQuestionService/TrueFalseSingleCorrectQuestionService.js @@ -0,0 +1,32 @@ +import Service from '../../Service'; +import TrueFalseSingleCorrectQuestion from './TrueFalseSingleCorrectQuestion'; +import trueFalseSingleCorrectNode from './schema/trueFalseSingleCorrectNode'; +import trueFalseSingleCorrectContainerNode from './schema/trueFalseSingleCorrectContainerNode'; +import QuestionComponent from './components/QuestionComponent'; +import TrueFalseSingleCorrectNodeView from './TrueFalseSingleCorrectNodeView'; + +class TrueFalseSingleCorrectQuestionService extends Service { + register() { + this.container + .bind('TrueFalseSingleCorrectQuestion') + .to(TrueFalseSingleCorrectQuestion); + const createNode = this.container.get('CreateNode'); + const addPortal = this.container.get('AddPortal'); + + createNode({ + true_false_single_correct: trueFalseSingleCorrectNode, + }); + + createNode({ + true_false_single_correct_container: trueFalseSingleCorrectContainerNode, + }); + + addPortal({ + nodeView: TrueFalseSingleCorrectNodeView, + component: QuestionComponent, + context: this.app, + }); + } +} + +export default TrueFalseSingleCorrectQuestionService; diff --git a/wax-prosemirror-services/src/MultipleChoiceQuestionService/TrueFalseSingleCorrectQuestionService/components/QuestionComponent.js b/wax-prosemirror-services/src/MultipleChoiceQuestionService/TrueFalseSingleCorrectQuestionService/components/QuestionComponent.js index 1fb3cca3d7489a1a3c00529244e13dc237922a05..7f14fd96d7a80aa64e1425b767bc21ad9959620f 100644 --- a/wax-prosemirror-services/src/MultipleChoiceQuestionService/TrueFalseSingleCorrectQuestionService/components/QuestionComponent.js +++ b/wax-prosemirror-services/src/MultipleChoiceQuestionService/TrueFalseSingleCorrectQuestionService/components/QuestionComponent.js @@ -92,7 +92,7 @@ export default ({ node, view, getPos }) => { const addOption = nodeId => { const newAnswerId = uuidv4(); context.view.main.state.doc.descendants((editorNode, index) => { - if (editorNode.type.name === 'multiple_choice_single_correct') { + if (editorNode.type.name === 'true_false_single_correct') { if (editorNode.attrs.id === nodeId) { context.view.main.dispatch( context.view.main.state.tr.setSelection( @@ -104,7 +104,7 @@ export default ({ node, view, getPos }) => { ), ); - const answerOption = context.view.main.state.config.schema.nodes.multiple_choice_single_correct.create( + const answerOption = context.view.main.state.config.schema.nodes.true_false_single_correct.create( { id: newAnswerId }, Fragment.empty, ); diff --git a/wax-prosemirror-services/src/MultipleChoiceQuestionService/TrueFalseSingleCorrectQuestionService/components/SwitchComponent.js b/wax-prosemirror-services/src/MultipleChoiceQuestionService/TrueFalseSingleCorrectQuestionService/components/SwitchComponent.js index e9110f8f34ca4c96aa609c5ba83983de21910798..434a544c5d13070af63d4ba9c4e20094eca0272b 100644 --- a/wax-prosemirror-services/src/MultipleChoiceQuestionService/TrueFalseSingleCorrectQuestionService/components/SwitchComponent.js +++ b/wax-prosemirror-services/src/MultipleChoiceQuestionService/TrueFalseSingleCorrectQuestionService/components/SwitchComponent.js @@ -41,13 +41,13 @@ const CustomSwitch = ({ node, getPos }) => { ); const parentContainer = findParentOfType( main.state, - main.state.config.schema.nodes.multiple_choice_single_correct_container, + main.state.config.schema.nodes.true_false_single_correct_container, ); let parentPosition = 0; main.state.doc.descendants((parentNode, parentPos) => { if ( - parentNode.type.name === 'multiple_choice_single_correct_container' && + parentNode.type.name === 'true_false_single_correct_container' && parentNode.attrs.id === parentContainer.attrs.id ) { parentPosition = parentPos; @@ -58,7 +58,7 @@ const CustomSwitch = ({ node, getPos }) => { parentContainer.descendants((element, position) => { if ( - element.type.name === 'multiple_choice_single_correct' && + element.type.name === 'true_false_single_correct' && element.attrs.id === node.attrs.id ) { tr.setNodeMarkup(getPos(), undefined, { @@ -66,7 +66,7 @@ const CustomSwitch = ({ node, getPos }) => { correct: !checked, }); } else if ( - element.type.name === 'multiple_choice_single_correct' && + element.type.name === 'true_false_single_correct' && element.attrs.correct ) { tr.setNodeMarkup(parentPosition + position + 1, undefined, { @@ -95,7 +95,7 @@ const getNodes = view => { const allNodes = DocumentHelpers.findBlockNodes(view.state.doc); const multipleChoiceNodes = []; allNodes.forEach(node => { - if (node.node.type.name === 'multiple_choice_single_correct') { + if (node.node.type.name === 'true_false_single_correct') { multipleChoiceNodes.push(node); } }); diff --git a/wax-prosemirror-services/src/MultipleChoiceQuestionService/TrueFalseSingleCorrectQuestionService/schema/trueFalseSingleCorrectNode.js b/wax-prosemirror-services/src/MultipleChoiceQuestionService/TrueFalseSingleCorrectQuestionService/schema/trueFalseSingleCorrectNode.js index b0720142709739573eb649ef169613ee0f3d6d90..6182b81c7693eda0a4f40928ec3ca5cb545e27e6 100644 --- a/wax-prosemirror-services/src/MultipleChoiceQuestionService/TrueFalseSingleCorrectQuestionService/schema/trueFalseSingleCorrectNode.js +++ b/wax-prosemirror-services/src/MultipleChoiceQuestionService/TrueFalseSingleCorrectQuestionService/schema/trueFalseSingleCorrectNode.js @@ -13,7 +13,7 @@ const trueFalseSingleCorrectNode = { parseDOM: [ { - tag: 'true-false-single-correct-option', + tag: 'div.true-false-single-correct-option', getAttrs(dom) { return { id: dom.getAttribute('id'), diff --git a/wax-prosemirror-services/src/MultipleChoiceQuestionService/components/FeedbackComponent.js b/wax-prosemirror-services/src/MultipleChoiceQuestionService/components/FeedbackComponent.js index ce6248364514b317fce896059b5f98aac8a67c17..bc3a009d2643fd1dafc018bf1a1a2a7e984c90a9 100644 --- a/wax-prosemirror-services/src/MultipleChoiceQuestionService/components/FeedbackComponent.js +++ b/wax-prosemirror-services/src/MultipleChoiceQuestionService/components/FeedbackComponent.js @@ -24,7 +24,7 @@ const FeedBackInput = styled.input` export default ({ node, view, getPos }) => { const context = useContext(WaxContext); - const [feedBack, setFeedBack] = useState(''); + const [feedBack, setFeedBack] = useState(' '); const [isFirstRun, setFirstRun] = useState(true); const [typing, setTyping] = useState(false); const feedBackRef = useRef(null); diff --git a/wax-prosemirror-services/src/NoteService/Editor.js b/wax-prosemirror-services/src/NoteService/Editor.js index fea500af3b59fd6db8b9e7ea0b982340a8e7ca05..79abe8b23f60bbac01052e780b1ecf4b1a09393f 100644 --- a/wax-prosemirror-services/src/NoteService/Editor.js +++ b/wax-prosemirror-services/src/NoteService/Editor.js @@ -83,13 +83,22 @@ export default ({ node, view }) => { const dispatchTransaction = transaction => { const { user } = view.props; + const TrackChange = context.app.config.get( 'config.EnableTrackChangeService', ); - const tr = TrackChange.enabled - ? trackedTransaction(transaction, noteView.state, user, 'notes', noteId) - : transaction; + let tr = transaction; + + if (TrackChange && TrackChange.enabled) { + tr = trackedTransaction( + transaction, + noteView.state, + user, + 'notes', + noteId, + ); + } const { state, transactions } = noteView.state.applyTransaction(tr); noteView.updateState(state); diff --git a/wax-prosemirror-services/src/WaxToolGroups/MultipleDropDownToolGroupService/MultipleDropDown.js b/wax-prosemirror-services/src/WaxToolGroups/MultipleDropDownToolGroupService/MultipleDropDown.js index 75f1b2359b9b7246af15978d2b4604373a71b6b7..a0c9e89d7b73e003fb583bb7dc4a3ad35346eee2 100644 --- a/wax-prosemirror-services/src/WaxToolGroups/MultipleDropDownToolGroupService/MultipleDropDown.js +++ b/wax-prosemirror-services/src/WaxToolGroups/MultipleDropDownToolGroupService/MultipleDropDown.js @@ -1,4 +1,4 @@ -import React, { useContext, useMemo } from 'react'; +import React, { useContext, useMemo, useEffect, useState } from 'react'; import { injectable, inject } from 'inversify'; import { isEmpty } from 'lodash'; import { v4 as uuidv4 } from 'uuid'; @@ -16,12 +16,14 @@ class MultipleDropDown extends ToolGroup { @inject('MultipleChoiceSingleCorrectQuestion') multipleChoiceSingleCorrectQuestion, @inject('TrueFalseQuestion') trueFalseQuestion, + @inject('TrueFalseSingleCorrectQuestion') trueFalseSingleCorrectQuestion, ) { super(); this.tools = [ multipleChoiceQuestion, multipleChoiceSingleCorrectQuestion, trueFalseQuestion, + trueFalseSingleCorrectQuestion, ]; } @@ -64,10 +66,13 @@ class MultipleDropDown extends ToolGroup { const { activeView, + activeViewId, view: { main }, } = context; const { state } = view; + const [label, setLabel] = useState(null); + const dropDownOptions = [ { label: 'Multiple Choice', @@ -84,20 +89,22 @@ class MultipleDropDown extends ToolGroup { value: '2', item: this._tools[2], }, - // { - // label: 'True/False (single correct)', - // value: '3', - // item: this._tools[0], - // }, + { + label: 'True/False (single correct)', + value: '3', + item: this._tools[3], + }, ]; + useEffect(() => { + dropDownOptions.forEach((option, i) => { + if (option.item.active(main.state)) { + setLabel(option.label); + } + }); + }, [activeViewId]); + const isDisabled = this._tools[0].select(state, activeView); - let found = ''; - dropDownOptions.forEach((option, i) => { - if (option.item.active(main.state)) { - found = option.label; - } - }); const onChange = option => { this._tools[option.value].run(main, context); @@ -107,7 +114,7 @@ class MultipleDropDown extends ToolGroup { () => ( <Wrapper key={uuidv4()}> <DropdownStyled - value={found} + value={label} key={uuidv4()} options={dropDownOptions} onChange={option => onChange(option)} @@ -116,7 +123,7 @@ class MultipleDropDown extends ToolGroup { /> </Wrapper> ), - [isDisabled], + [isDisabled, label], ); return MultipleDropDown;