Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(interview): apply to all [2] #1125

Merged
merged 11 commits into from
Jan 10, 2025
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) => {
MyPyDavid marked this conversation as resolved.
Show resolved Hide resolved
// 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)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

do these need to be strict === as well?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

in principle == would be ok, I guess but I will change it (JS is weird).

)))) {
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
Loading