From 50fdf66e5e6e7971e2263d5f1f1b829ec1a559d3 Mon Sep 17 00:00:00 2001 From: Deundre Williams Date: Thu, 8 Sep 2022 12:02:32 -0400 Subject: [PATCH 1/6] add margin of error validation --- .../NumericAnswer/numeric-option.js | 60 +++++++++++++++++-- 1 file changed, 55 insertions(+), 5 deletions(-) diff --git a/packages/obonode/obojobo-chunks-numeric-assessment/NumericAnswer/numeric-option.js b/packages/obonode/obojobo-chunks-numeric-assessment/NumericAnswer/numeric-option.js index b23c7cd447..84171e5fc8 100644 --- a/packages/obonode/obojobo-chunks-numeric-assessment/NumericAnswer/numeric-option.js +++ b/packages/obonode/obojobo-chunks-numeric-assessment/NumericAnswer/numeric-option.js @@ -6,7 +6,8 @@ import { WITHIN_A_RANGE, requirementDropdown, marginDropdown, - simplifedToFullText + simplifedToFullText, + PERCENT } from '../constants' import NumericEntry from '../entry/numeric-entry' import { @@ -95,12 +96,30 @@ const getRangeEndValidityString = (startValueString, endValueString) => { } } -const onBlurAnswer = event => { - event.target.setCustomValidity(getValidityString(event.target.value)) - event.target.reportValidity() +const getMarginOfErrorValidityString = (answer, errorType) => { + + // Filter out leading zeroes + const parsedAnswer = parseInt(answer) + + switch(simplifedToFullText[errorType]) { + case PERCENT: { + if (parsedAnswer === 0) + return 'Answer cannot be 0 while Error Type is Percent' + else + return '' + } + default: + return '' + } + } -const NumericOption = ({ numericChoice, onHandleInputChange, onHandleSelectChange }) => { +const NumericOption = ({ editor, numericChoice, onHandleInputChange, onHandleSelectChange }) => { + + const answerRef = React.createRef() + + const marginErrorTypeRef = React.createRef() + const inputStartRef = React.createRef() const inputEndRef = React.createRef() const { requirement, answer, start, end, margin, type } = numericChoice @@ -111,6 +130,24 @@ const NumericOption = ({ numericChoice, onHandleInputChange, onHandleSelectChang onHandleInputChange(event) } + const onBlurAnswer = event => { + + // Get normal error validity string + let answerValidityString = getValidityString(event.target.value) + + // Validate for margin of error + if (answerValidityString === '' && !isRefRelatedTarget(event, marginErrorTypeRef)) { + answerValidityString = getMarginOfErrorValidityString(answer, type) + } + + if (answerValidityString !== '') { + editor.addToErrors(event.target) + } + + event.target.setCustomValidity(answerValidityString) + event.target.reportValidity() + } + const onBlurErrorValue = event => { const errorAmount = parseFloat(event.target.value) @@ -151,6 +188,16 @@ const NumericOption = ({ numericChoice, onHandleInputChange, onHandleSelectChang onBlurAnswer(event) } + const onBlurMarginOfErrorType = event => { + + // If not moving to related input, get validity string + if (!isRefRelatedTarget(event, answerRef)) { + event.target.setCustomValidity(getMarginOfErrorValidityString(answer, type)) + event.target.reportValidity() + } + + } + switch (simplifedToFullText[requirement]) { case WITHIN_A_RANGE: return ( @@ -222,6 +269,7 @@ const NumericOption = ({ numericChoice, onHandleInputChange, onHandleSelectChang onBlur={onBlurAnswer} contentEditable={false} autoComplete="off" + ref={answerRef} />