diff --git a/rdmo/projects/assets/js/interview/components/main/page/Page.js b/rdmo/projects/assets/js/interview/components/main/page/Page.js index dcab49451..56bc9eba8 100644 --- a/rdmo/projects/assets/js/interview/components/main/page/Page.js +++ b/rdmo/projects/assets/js/interview/components/main/page/Page.js @@ -67,6 +67,9 @@ const Page = ({ config, templates, overview, page, sets, values, fetchPage, key={elementIndex} templates={templates} question={element} + sets={sets.filter((set) => ( + set.set_prefix == currentSetPrefix + ))} values={values.filter((value) => ( value.attribute == element.attribute && value.set_prefix == currentSetPrefix && diff --git a/rdmo/projects/assets/js/interview/components/main/question/Question.js b/rdmo/projects/assets/js/interview/components/main/question/Question.js index 617cfc945..a74e89ba9 100644 --- a/rdmo/projects/assets/js/interview/components/main/question/Question.js +++ b/rdmo/projects/assets/js/interview/components/main/question/Question.js @@ -12,7 +12,7 @@ import QuestionText from './QuestionText' import QuestionWarning from './QuestionWarning' import QuestionWidget from './QuestionWidget' -const Question = ({ templates, question, values, siblings, disabled, isManager, +const Question = ({ templates, question, sets, values, siblings, disabled, isManager, currentSet, createValue, updateValue, deleteValue, copyValue }) => { return checkQuestion(question, currentSet) && (
@@ -25,6 +25,7 @@ const Question = ({ templates, question, values, siblings, disabled, isManager, { +const QuestionCopyValues = ({ question, sets, values, siblings, currentSet, copyValue }) => { const handleCopyValues = () => { values.forEach((value) => copyValue(value)) } @@ -19,19 +20,37 @@ const QuestionCopyValues = ({ question, values, siblings, copyValue }) => { ) + const hasValues = values.some((value) => !isEmptyValue(value)) + + const hasEmptySiblings = sets.filter((set) => ( + (set.set_prefix == currentSet.set_prefix) && + (set.set_index != currentSet.set_index) + )).some((set) => { + // loop over all other sets and filter siblings accordingly + const setSiblings = siblings.filter((value) => ( + (value.set_prefix == set.set_prefix) && + (value.set_index == set.set_index) + )) + + // check if this set has no sibling at all (for checkboxes) or if they are empty + return isEmpty(setSiblings) || setSiblings.some((value) => isEmptyValue(value)) + }) + return ( question.is_collection && question.set_collection && - values.some((v) => !isEmptyValue(v)) && - siblings.some((value) => isEmptyValue(value)) && + hasValues && + hasEmptySiblings && button ) } QuestionCopyValues.propTypes = { question: PropTypes.object.isRequired, + sets: PropTypes.array.isRequired, values: PropTypes.array.isRequired, siblings: PropTypes.array, + currentSet: PropTypes.object.isRequired, copyValue: PropTypes.func.isRequired } diff --git a/rdmo/projects/assets/js/interview/components/main/questionset/QuestionSet.js b/rdmo/projects/assets/js/interview/components/main/questionset/QuestionSet.js index 0a807c366..a0a30396e 100644 --- a/rdmo/projects/assets/js/interview/components/main/questionset/QuestionSet.js +++ b/rdmo/projects/assets/js/interview/components/main/questionset/QuestionSet.js @@ -67,6 +67,9 @@ const QuestionSet = ({ templates, questionset, sets, values, disabled, isManager key={elementIndex} templates={templates} question={element} + sets={sets.filter((set) => ( + set.set_prefix == setPrefix + ))} values={values.filter((value) => ( value.attribute == element.attribute && value.set_prefix == set.set_prefix && diff --git a/rdmo/projects/assets/js/interview/components/main/widget/CheckboxWidget.js b/rdmo/projects/assets/js/interview/components/main/widget/CheckboxWidget.js index eff2db4e7..625ebbcb3 100644 --- a/rdmo/projects/assets/js/interview/components/main/widget/CheckboxWidget.js +++ b/rdmo/projects/assets/js/interview/components/main/widget/CheckboxWidget.js @@ -10,7 +10,7 @@ import QuestionSuccess from '../question/QuestionSuccess' import CheckboxInput from './CheckboxInput' -const CheckboxWidget = ({ question, values, siblings, currentSet, disabled, +const CheckboxWidget = ({ question, sets, values, siblings, currentSet, disabled, createValue, updateValue, deleteValue, copyValue }) => { const handleCreateValue = (option, additionalInput) => { @@ -71,7 +71,14 @@ const CheckboxWidget = ({ question, values, siblings, currentSet, disabled,
- +
@@ -82,6 +89,7 @@ const CheckboxWidget = ({ question, values, siblings, currentSet, disabled, CheckboxWidget.propTypes = { question: PropTypes.object.isRequired, + sets: PropTypes.array.isRequired, values: PropTypes.array.isRequired, siblings: PropTypes.array, disabled: PropTypes.bool, diff --git a/rdmo/projects/assets/js/interview/components/main/widget/DateWidget.js b/rdmo/projects/assets/js/interview/components/main/widget/DateWidget.js index ae7f8ce42..71903b3a2 100644 --- a/rdmo/projects/assets/js/interview/components/main/widget/DateWidget.js +++ b/rdmo/projects/assets/js/interview/components/main/widget/DateWidget.js @@ -12,7 +12,8 @@ import QuestionRemoveValue from '../question/QuestionRemoveValue' import DateInput from './DateInput' -const DateWidget = ({ question, values, siblings, currentSet, disabled, createValue, updateValue, deleteValue, copyValue }) => { +const DateWidget = ({ question, sets, values, siblings, currentSet, disabled, + createValue, updateValue, deleteValue, copyValue }) => { return (
{ @@ -55,8 +56,10 @@ const DateWidget = ({ question, values, siblings, currentSet, disabled, createVa />
@@ -65,6 +68,7 @@ const DateWidget = ({ question, values, siblings, currentSet, disabled, createVa DateWidget.propTypes = { question: PropTypes.object.isRequired, + sets: PropTypes.array.isRequired, values: PropTypes.array.isRequired, siblings: PropTypes.array, disabled: PropTypes.bool, diff --git a/rdmo/projects/assets/js/interview/components/main/widget/RadioWidget.js b/rdmo/projects/assets/js/interview/components/main/widget/RadioWidget.js index 15ea8d32c..4a43ece34 100644 --- a/rdmo/projects/assets/js/interview/components/main/widget/RadioWidget.js +++ b/rdmo/projects/assets/js/interview/components/main/widget/RadioWidget.js @@ -14,7 +14,7 @@ import QuestionRemoveValue from '../question/QuestionRemoveValue' import RadioInput from './RadioInput' -const RadioWidget = ({ question, values, siblings, currentSet, disabled, +const RadioWidget = ({ question, sets, values, siblings, currentSet, disabled, createValue, updateValue, deleteValue, copyValue }) => { return (
@@ -59,8 +59,10 @@ const RadioWidget = ({ question, values, siblings, currentSet, disabled, />
@@ -69,6 +71,7 @@ const RadioWidget = ({ question, values, siblings, currentSet, disabled, RadioWidget.propTypes = { question: PropTypes.object.isRequired, + sets: PropTypes.array.isRequired, values: PropTypes.array.isRequired, siblings: PropTypes.array, disabled: PropTypes.bool, diff --git a/rdmo/projects/assets/js/interview/components/main/widget/RangeWidget.js b/rdmo/projects/assets/js/interview/components/main/widget/RangeWidget.js index 6bcd8f990..9d7d42b9b 100644 --- a/rdmo/projects/assets/js/interview/components/main/widget/RangeWidget.js +++ b/rdmo/projects/assets/js/interview/components/main/widget/RangeWidget.js @@ -14,7 +14,7 @@ import QuestionRemoveValue from '../question/QuestionRemoveValue' import RangeInput from './RangeInput' -const RangeWidget = ({ question, values, siblings, currentSet, disabled, +const RangeWidget = ({ question, sets, values, siblings, currentSet, disabled, createValue, updateValue, deleteValue, copyValue }) => { const handleCreateValue = (value) => { @@ -69,8 +69,10 @@ const RangeWidget = ({ question, values, siblings, currentSet, disabled, /> @@ -79,6 +81,7 @@ const RangeWidget = ({ question, values, siblings, currentSet, disabled, RangeWidget.propTypes = { question: PropTypes.object.isRequired, + sets: PropTypes.array.isRequired, values: PropTypes.array.isRequired, siblings: PropTypes.array, disabled: PropTypes.bool, diff --git a/rdmo/projects/assets/js/interview/components/main/widget/SelectWidget.js b/rdmo/projects/assets/js/interview/components/main/widget/SelectWidget.js index 7124f1d20..fce4140a7 100644 --- a/rdmo/projects/assets/js/interview/components/main/widget/SelectWidget.js +++ b/rdmo/projects/assets/js/interview/components/main/widget/SelectWidget.js @@ -14,7 +14,7 @@ import QuestionRemoveValue from '../question/QuestionRemoveValue' import SelectInput from './SelectInput' -const SelectWidget = ({ question, values, siblings, currentSet, disabled, creatable, +const SelectWidget = ({ question, sets, values, siblings, currentSet, disabled, creatable, createValue, updateValue, deleteValue, copyValue }) => { return (
@@ -59,8 +59,10 @@ const SelectWidget = ({ question, values, siblings, currentSet, disabled, creata />
@@ -69,6 +71,7 @@ const SelectWidget = ({ question, values, siblings, currentSet, disabled, creata SelectWidget.propTypes = { question: PropTypes.object.isRequired, + sets: PropTypes.array.isRequired, values: PropTypes.array.isRequired, siblings: PropTypes.array, disabled: PropTypes.bool, diff --git a/rdmo/projects/assets/js/interview/components/main/widget/TextWidget.js b/rdmo/projects/assets/js/interview/components/main/widget/TextWidget.js index ed823ee85..fbee0d523 100644 --- a/rdmo/projects/assets/js/interview/components/main/widget/TextWidget.js +++ b/rdmo/projects/assets/js/interview/components/main/widget/TextWidget.js @@ -11,7 +11,7 @@ import QuestionSuccess from '../question/QuestionSuccess' import TextInput from './TextInput' -const TextWidget = ({ question, values, siblings, currentSet, disabled, +const TextWidget = ({ question, sets, values, siblings, currentSet, disabled, createValue, updateValue, deleteValue, copyValue }) => { return (
@@ -53,8 +53,10 @@ const TextWidget = ({ question, values, siblings, currentSet, disabled, />
@@ -63,6 +65,7 @@ const TextWidget = ({ question, values, siblings, currentSet, disabled, TextWidget.propTypes = { question: PropTypes.object.isRequired, + sets: PropTypes.array.isRequired, values: PropTypes.array.isRequired, siblings: PropTypes.array, disabled: PropTypes.bool, diff --git a/rdmo/projects/assets/js/interview/components/main/widget/TextareaWidget.js b/rdmo/projects/assets/js/interview/components/main/widget/TextareaWidget.js index 8d6720102..cc063a3bf 100644 --- a/rdmo/projects/assets/js/interview/components/main/widget/TextareaWidget.js +++ b/rdmo/projects/assets/js/interview/components/main/widget/TextareaWidget.js @@ -11,7 +11,7 @@ import QuestionRemoveValue from '../question/QuestionRemoveValue' import TextareaInput from './TextareaInput' -const TextareaWidget = ({ question, values, siblings, currentSet, disabled, +const TextareaWidget = ({ question, sets, values, siblings, currentSet, disabled, createValue, updateValue, deleteValue, copyValue }) => { return (
@@ -53,8 +53,10 @@ const TextareaWidget = ({ question, values, siblings, currentSet, disabled, />
@@ -63,6 +65,7 @@ const TextareaWidget = ({ question, values, siblings, currentSet, disabled, TextareaWidget.propTypes = { question: PropTypes.object.isRequired, + sets: PropTypes.array.isRequired, values: PropTypes.array.isRequired, siblings: PropTypes.array, disabled: PropTypes.bool, diff --git a/rdmo/projects/assets/js/interview/components/main/widget/YesNoWidget.js b/rdmo/projects/assets/js/interview/components/main/widget/YesNoWidget.js index 5be4f0285..ec7e96527 100644 --- a/rdmo/projects/assets/js/interview/components/main/widget/YesNoWidget.js +++ b/rdmo/projects/assets/js/interview/components/main/widget/YesNoWidget.js @@ -12,7 +12,7 @@ import QuestionRemoveValue from '../question/QuestionRemoveValue' import YesNoInput from './YesNoInput' -const YesNoWidget = ({ question, values, siblings, currentSet, disabled, +const YesNoWidget = ({ question, sets, values, siblings, currentSet, disabled, createValue, updateValue, deleteValue, copyValue }) => { return (
@@ -53,13 +53,21 @@ const YesNoWidget = ({ question, values, siblings, currentSet, disabled, disabled={disabled} createValue={createValue} /> - +
) } YesNoWidget.propTypes = { question: PropTypes.object.isRequired, + sets: PropTypes.array.isRequired, values: PropTypes.array.isRequired, siblings: PropTypes.array, disabled: PropTypes.bool, diff --git a/rdmo/projects/assets/js/interview/utils/value.js b/rdmo/projects/assets/js/interview/utils/value.js index 17d8538b9..0c6065a8c 100644 --- a/rdmo/projects/assets/js/interview/utils/value.js +++ b/rdmo/projects/assets/js/interview/utils/value.js @@ -39,28 +39,33 @@ const initValues = (sets, values, element, setPrefix) => { setPrefix = '' } + // loop over all sets of the current set prefix and over all questions sets.filter((set) => set.set_prefix === setPrefix).forEach((set) => { element.elements.filter((e) => (e.model === 'questions.question')).forEach((question) => { + // check if there is any value for this question and set if (isNil(values.find((value) => ( (value.attribute === question.attribute) && (value.set_prefix == set.set_prefix) && (value.set_index == set.set_index) )))) { - const value = ValueFactory.create({ - attribute: question.attribute, - set_prefix: set.set_prefix, - set_index: set.set_index, - set_collection: question.set_collection, - text: question.default_text, - option: question.default_option, - external_id: question.default_external_id - }) - - if (question.widget_class === 'range') { - initRange(question, value) + // if there is no value, create one, but not for checkboxes + if (question.widget_class !== 'checkbox') { + const value = ValueFactory.create({ + attribute: question.attribute, + set_prefix: set.set_prefix, + set_index: set.set_index, + set_collection: question.set_collection, + text: question.default_text, + option: question.default_option, + external_id: question.default_external_id + }) + + if (question.widget_class === 'range') { + initRange(question, value) + } + + values.push(value) } - - values.push(value) } })