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)
}
})