diff --git a/editors/demo/src/HHMI/HHMI.js b/editors/demo/src/HHMI/HHMI.js index 19ab37c7bd3d70f8d215612b458ac567b67731be..7f543eb1373cda386ac1ca1fb57c25e67f50021c 100644 --- a/editors/demo/src/HHMI/HHMI.js +++ b/editors/demo/src/HHMI/HHMI.js @@ -142,6 +142,30 @@ const Hhmi = () => { const { readOnly, testMode, submitted, content } = stateProps; + const data = { + type: 'doc', + content: [ + { + type: 'numerical_answer_container', + attrs: { + id: 'f9c33d03-68ee-4c27-8a03-5072447fac1a', + class: 'numerical-answer', + feedback: '', + answerType: 'exactAnswer', + answersExact: [], + }, + content: [ + { + type: 'paragraph', + attrs: { + class: 'paragraph', + }, + }, + ], + }, + ], + }; + return ( <> <ButtonContainer> @@ -167,7 +191,7 @@ const Hhmi = () => { ref={editorRef} customValues={{ showFeedBack: submitted, testMode }} fileUpload={file => renderImage(file)} - // value={content} + value={data} targetFormat="JSON" readonly={readOnly} layout={HhmiLayout} diff --git a/wax-questions-service/src/NumericalAnswerService/components/ExactAnswerComponent.js b/wax-questions-service/src/NumericalAnswerService/components/ExactAnswerComponent.js index a9e8452d8ba20247a730b36798f9eff37e746cdb..c4d552494d68dc25b2ad09241793e517a2dc92dd 100644 --- a/wax-questions-service/src/NumericalAnswerService/components/ExactAnswerComponent.js +++ b/wax-questions-service/src/NumericalAnswerService/components/ExactAnswerComponent.js @@ -26,9 +26,8 @@ const ValueInnerContainer = styled.div` flex-direction: column; `; -const ExactAnswerComponent = ({ getPos, node }) => { +const ExactAnswerComponent = ({ node }) => { const context = useContext(WaxContext); - const { activeView } = context; const [exact, setExact] = useState(''); const [marginError, setMarginError] = useState(''); diff --git a/wax-questions-service/src/NumericalAnswerService/components/NumericalAnswerContainerComponent.js b/wax-questions-service/src/NumericalAnswerService/components/NumericalAnswerContainerComponent.js index 8abd8c6b8b55943d1105ece30022c19156ec2d01..a80946804905dbe899283b3b6ff884cba7935819 100644 --- a/wax-questions-service/src/NumericalAnswerService/components/NumericalAnswerContainerComponent.js +++ b/wax-questions-service/src/NumericalAnswerService/components/NumericalAnswerContainerComponent.js @@ -1,4 +1,4 @@ -import React, { useContext } from 'react'; +import React, { useContext, useEffect, useState } from 'react'; import { WaxContext, DocumentHelpers, Icon } from 'wax-prosemirror-core'; import styled from 'styled-components'; import EditorComponent from '../../MultipleChoiceQuestionService/components/EditorComponent'; @@ -55,7 +55,7 @@ export default ({ node, view, getPos }) => { options, pmViews: { main }, } = context; - + const [answerType, setAnswerType] = useState(node.attrs.answerType); const customProps = main.props.customValues; const { testMode } = customProps; @@ -80,6 +80,15 @@ export default ({ node, view, getPos }) => { }); }; + useEffect(() => { + const allNodes = getNodes(context.pmViews.main); + allNodes.forEach(singleNode => { + if (singleNode.node.attrs.id === node.attrs.id) { + setAnswerType(singleNode.node.attrs.answerType); + } + }); + }, []); + return ( <NumericalAnswerWrapper> <div> @@ -104,15 +113,20 @@ export default ({ node, view, getPos }) => { view={view} /> <NumericalAnswerOption> - {!options[node.attrs.id] && <>No Type Selected</>} - {options[node.attrs.id]?.numericalAnswer === 'exactAnswer' && ( - <ExactAnswerComponent getPos={getPos} node={node} /> + {!options[node.attrs.id] && answerType === '' && ( + <>No Type Selected</> + )} + {(options[node.attrs.id]?.numericalAnswer === 'exactAnswer' || + answerType === 'exactAnswer') && ( + <ExactAnswerComponent node={node} /> )} - {options[node.attrs.id]?.numericalAnswer === 'rangeAnswer' && ( - <RangeAnswerComponent getPos={getPos} node={node} /> + {(options[node.attrs.id]?.numericalAnswer === 'rangeAnswer' || + answerType === 'rangeAnswer') && ( + <RangeAnswerComponent node={node} /> )} - {options[node.attrs.id]?.numericalAnswer === 'preciseAnswer' && ( - <PreciseAnswerComponent getPos={getPos} node={node} /> + {(options[node.attrs.id]?.numericalAnswer === 'preciseAnswer' || + answerType === 'preciseAnswer') && ( + <PreciseAnswerComponent node={node} /> )} </NumericalAnswerOption> {!testMode && !(readOnly && feedback === '') && ( diff --git a/wax-questions-service/src/NumericalAnswerService/components/NumericalAnswerDropDownCompontent.js b/wax-questions-service/src/NumericalAnswerService/components/NumericalAnswerDropDownCompontent.js index a743a3949cf7a12e38bde23b3e83c400c790c29d..623edace57c23b3603dc598914a6b6ff60a01d19 100644 --- a/wax-questions-service/src/NumericalAnswerService/components/NumericalAnswerDropDownCompontent.js +++ b/wax-questions-service/src/NumericalAnswerService/components/NumericalAnswerDropDownCompontent.js @@ -161,11 +161,32 @@ const NumericalAnswerDropDownCompontent = ({ nodeId }) => { } }; + const SaveTypeToNode = option => { + const allNodes = getNodes(context.pmViews.main); + allNodes.forEach(singleNode => { + if (singleNode.node.attrs.id === nodeId) { + context.pmViews.main.dispatch( + context.pmViews.main.state.tr.setNodeMarkup( + singleNode.pos, + undefined, + { + ...singleNode.node.attrs, + answerType: option, + answersExact: [], + answersRange: [], + answersPrecise: [], + }, + ), + ); + } + }); + }; + const onChange = option => { context.setOption({ [nodeId]: { numericalAnswer: option.value } }); setLabel(option.label); openCloseMenu(); - activeView.dispatch(activeView.state.tr.setMeta('addToHistory', false)); + SaveTypeToNode(option.value); activeView.focus(); }; diff --git a/wax-questions-service/src/NumericalAnswerService/components/PreciseAnswerComponent.js b/wax-questions-service/src/NumericalAnswerService/components/PreciseAnswerComponent.js index 506230e5a8a62403ee9b9659d90b2710e729f56a..1e714958909c5a9dd582d5429dc74f910324f8b5 100644 --- a/wax-questions-service/src/NumericalAnswerService/components/PreciseAnswerComponent.js +++ b/wax-questions-service/src/NumericalAnswerService/components/PreciseAnswerComponent.js @@ -1,6 +1,6 @@ -import React, { useRef, useState } from 'react'; +import React, { useRef, useState, useContext } from 'react'; import styled from 'styled-components'; -import { DocumentHelpers } from 'wax-prosemirror-core'; +import { DocumentHelpers, WaxContext } from 'wax-prosemirror-core'; const AnswerContainer = styled.div` display: flex; @@ -26,7 +26,8 @@ const ValueInnerContainer = styled.div` flex-direction: column; `; -const PreciseAnswerComponent = () => { +const PreciseAnswerComponent = ({ node }) => { + const context = useContext(WaxContext); const [precise, setPrecise] = useState(''); const preciseRef = useRef(null); @@ -38,8 +39,31 @@ const PreciseAnswerComponent = () => { .replace(/^0[^.]/, '0'); }; + const SaveValuesToNode = () => { + const allNodes = getNodes(context.pmViews.main); + allNodes.forEach(singleNode => { + if (singleNode.node.attrs.id === node.attrs.id) { + const obj = { + exactAnswer: onlyNumbers(preciseRef.current.value), + }; + + context.pmViews.main.dispatch( + context.pmViews.main.state.tr.setNodeMarkup( + singleNode.pos, + undefined, + { + ...singleNode.node.attrs, + answersPrecise: obj, + }, + ), + ); + } + }); + }; + const onChangePrecice = () => { setPrecise(onlyNumbers(preciseRef.current.value)); + SaveValuesToNode(); }; return ( diff --git a/wax-questions-service/src/NumericalAnswerService/components/RangeAnswerComponent.js b/wax-questions-service/src/NumericalAnswerService/components/RangeAnswerComponent.js index c0be1d170700256d4802da681aa4527e6cd51e93..e4ee4770c2dd5b69be575fb9af7e9a0426aa5dc5 100644 --- a/wax-questions-service/src/NumericalAnswerService/components/RangeAnswerComponent.js +++ b/wax-questions-service/src/NumericalAnswerService/components/RangeAnswerComponent.js @@ -1,6 +1,6 @@ -import React, { useRef, useState } from 'react'; +import React, { useRef, useState, useContext } from 'react'; import styled from 'styled-components'; -import { DocumentHelpers } from 'wax-prosemirror-core'; +import { DocumentHelpers, WaxContext } from 'wax-prosemirror-core'; const AnswerContainer = styled.div` display: flex; @@ -26,7 +26,8 @@ const ValueInnerContainer = styled.div` flex-direction: column; `; -const RangeAnswerComponent = () => { +const RangeAnswerComponent = ({ node }) => { + const context = useContext(WaxContext); const [minValue, setMinValue] = useState(''); const [maxValue, setMaxValue] = useState(''); @@ -40,12 +41,37 @@ const RangeAnswerComponent = () => { .replace(/^0[^.]/, '0'); }; + const SaveValuesToNode = () => { + const allNodes = getNodes(context.pmViews.main); + allNodes.forEach(singleNode => { + if (singleNode.node.attrs.id === node.attrs.id) { + const obj = { + minAnswer: onlyNumbers(minRef.current.value), + maxError: onlyNumbers(maxRef.current.value), + }; + + context.pmViews.main.dispatch( + context.pmViews.main.state.tr.setNodeMarkup( + singleNode.pos, + undefined, + { + ...singleNode.node.attrs, + answersRange: obj, + }, + ), + ); + } + }); + }; + const onChangeMin = () => { setMinValue(onlyNumbers(minRef.current.value)); + SaveValuesToNode(); }; const onChangeMax = () => { setMaxValue(onlyNumbers(maxRef.current.value)); + SaveValuesToNode(); }; return ( diff --git a/wax-questions-service/src/NumericalAnswerService/schema/NumericalAnswerContainerNode.js b/wax-questions-service/src/NumericalAnswerService/schema/NumericalAnswerContainerNode.js index e70db45d3b9e237d0a1a168e9dd306d8a72e63e3..2c15c55c0717fd4dfd05f01366d520067a5ea5cd 100644 --- a/wax-questions-service/src/NumericalAnswerService/schema/NumericalAnswerContainerNode.js +++ b/wax-questions-service/src/NumericalAnswerService/schema/NumericalAnswerContainerNode.js @@ -5,6 +5,8 @@ const NumericalAnswerContainerNode = { feedback: { default: '' }, answerType: { default: '' }, answersExact: { default: [] }, + answersRange: { default: [] }, + answersPrecise: { default: [] }, }, group: 'block questions', atom: true, @@ -15,6 +17,8 @@ const NumericalAnswerContainerNode = { getAttrs(dom) { return { answersExact: JSON.parse(dom.getAttribute('answersExact')), + answersRange: JSON.parse(dom.getAttribute('answersRange')), + answersPrecise: JSON.parse(dom.getAttribute('answersPrecise')), id: dom.getAttribute('id'), class: dom.getAttribute('class'), feedback: dom.getAttribute('feedback'), @@ -27,11 +31,13 @@ const NumericalAnswerContainerNode = { return [ 'div', { + answerType: node.attrs.answerType, + answersExact: JSON.stringify(node.attrs.answersExact), + answersRange: JSON.stringify(node.attrs.answersRange), + answersPrecise: JSON.stringify(node.attrs.answersPrecise), id: node.attrs.id, class: node.attrs.class, - answersExact: JSON.stringify(node.attrs.answersExact), feedback: node.attrs.feedback, - answerType: node.attrs.answerType, }, ]; },