Skip to content

Commit

Permalink
Fix QuestionCopyValues
Browse files Browse the repository at this point in the history
  • Loading branch information
jochenklar committed Jan 6, 2025
1 parent 7e74ab9 commit c1146d4
Show file tree
Hide file tree
Showing 13 changed files with 95 additions and 28 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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 &&
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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) && (
<div className={`interview-question col-md-${question.width || '12'}`}>
Expand All @@ -25,6 +25,7 @@ const Question = ({ templates, question, values, siblings, disabled, isManager,
<QuestionManagement question={question} isManager={isManager} />
<QuestionWidget
question={question}
sets={sets}
values={values}
siblings={siblings}
disabled={disabled}
Expand All @@ -41,6 +42,7 @@ const Question = ({ templates, question, values, siblings, disabled, isManager,
Question.propTypes = {
templates: PropTypes.object.isRequired,
question: PropTypes.object.isRequired,
sets: PropTypes.array.isRequired,
values: PropTypes.array.isRequired,
siblings: PropTypes.array,
disabled: PropTypes.bool.isRequired,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import React from 'react'
import PropTypes from 'prop-types'
import { isEmpty } from 'lodash'

import { isEmptyValue } from '../../../utils/value'

const QuestionCopyValues = ({ question, values, siblings, copyValue }) => {
const QuestionCopyValues = ({ question, sets, values, siblings, currentSet, copyValue }) => {
const handleCopyValues = () => {
values.forEach((value) => copyValue(value))
}
Expand All @@ -19,19 +20,37 @@ const QuestionCopyValues = ({ question, values, siblings, copyValue }) => {
</button>
)

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
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 &&
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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) => {
Expand Down Expand Up @@ -71,7 +71,14 @@ const CheckboxWidget = ({ question, values, siblings, currentSet, disabled,
</div>
<div className="buttons">
<QuestionSuccess value={{ success }} />
<QuestionCopyValues question={question} values={values} siblings={siblings} copyValue={copyValue} />
<QuestionCopyValues
question={question}
sets={sets}
values={values}
siblings={siblings}
currentSet={currentSet}
copyValue={copyValue}
/>
</div>
</div>
</div>
Expand All @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 (
<div className="interview-widgets">
{
Expand Down Expand Up @@ -55,8 +56,10 @@ const DateWidget = ({ question, values, siblings, currentSet, disabled, createVa
/>
<QuestionCopyValues
question={question}
sets={sets}
values={values}
siblings={siblings}
currentSet={currentSet}
copyValue={copyValue}
/>
</div>
Expand All @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 (
<div className="interview-widgets">
Expand Down Expand Up @@ -59,8 +59,10 @@ const RadioWidget = ({ question, values, siblings, currentSet, disabled,
/>
<QuestionCopyValues
question={question}
sets={sets}
values={values}
siblings={siblings}
currentSet={currentSet}
copyValue={copyValue}
/>
</div>
Expand All @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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) => {
Expand Down Expand Up @@ -69,8 +69,10 @@ const RangeWidget = ({ question, values, siblings, currentSet, disabled,
/>
<QuestionCopyValues
question={question}
sets={sets}
values={values}
siblings={siblings}
currentSet={currentSet}
copyValue={copyValue}
/>
</div>
Expand All @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 (
<div className="interview-widgets">
Expand Down Expand Up @@ -59,8 +59,10 @@ const SelectWidget = ({ question, values, siblings, currentSet, disabled, creata
/>
<QuestionCopyValues
question={question}
sets={sets}
values={values}
siblings={siblings}
currentSet={currentSet}
copyValue={copyValue}
/>
</div>
Expand All @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 (
<div className="interview-widgets">
Expand Down Expand Up @@ -53,8 +53,10 @@ const TextWidget = ({ question, values, siblings, currentSet, disabled,
/>
<QuestionCopyValues
question={question}
sets={sets}
values={values}
siblings={siblings}
currentSet={currentSet}
copyValue={copyValue}
/>
</div>
Expand All @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 (
<div className="interview-widgets">
Expand Down Expand Up @@ -53,8 +53,10 @@ const TextareaWidget = ({ question, values, siblings, currentSet, disabled,
/>
<QuestionCopyValues
question={question}
sets={sets}
values={values}
siblings={siblings}
currentSet={currentSet}
copyValue={copyValue}
/>
</div>
Expand All @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 (
<div className="interview-widgets">
Expand Down Expand Up @@ -53,13 +53,21 @@ const YesNoWidget = ({ question, values, siblings, currentSet, disabled,
disabled={disabled}
createValue={createValue}
/>
<QuestionCopyValues question={question} values={values} siblings={siblings} copyValue={copyValue} />
<QuestionCopyValues
question={question}
sets={sets}
values={values}
siblings={siblings}
currentSet={currentSet}
copyValue={copyValue}
/>
</div>
)
}

YesNoWidget.propTypes = {
question: PropTypes.object.isRequired,
sets: PropTypes.array.isRequired,
values: PropTypes.array.isRequired,
siblings: PropTypes.array,
disabled: PropTypes.bool,
Expand Down
33 changes: 19 additions & 14 deletions rdmo/projects/assets/js/interview/utils/value.js
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
})

Expand Down

0 comments on commit c1146d4

Please sign in to comment.