Skip to content

Commit

Permalink
Add copyValue action to interview
Browse files Browse the repository at this point in the history
  • Loading branch information
jochenklar committed Aug 16, 2024
1 parent 6cd46d4 commit 1152302
Show file tree
Hide file tree
Showing 17 changed files with 147 additions and 29 deletions.
27 changes: 26 additions & 1 deletion rdmo/projects/assets/js/interview/actions/interviewActions.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import { updateLocation } from '../utils/location'
import { updateOptions } from '../utils/options'
import { initPage } from '../utils/page'
import { gatherSets, getDescendants, initSets } from '../utils/set'
import { activateFirstValue, gatherDefaultValues, initValues, compareValues } from '../utils/value'
import { activateFirstValue, gatherDefaultValues, initValues, compareValues, isEmptyValue } from '../utils/value'
import projectId from '../utils/projectId'

import ValueFactory from '../factories/ValueFactory'
Expand Down Expand Up @@ -363,6 +363,31 @@ export function updateValue(value, attrs, store = true) {
}
}

export function copyValue(value) {
return (dispatch, getState) => {
const sets = getState().interview.sets
const values = getState().interview.values

sets.filter((set) => (
(set.set_prefix == value.set_prefix) &&
(set.set_index != value.set_index)
)).forEach((set) => {
const sibling = values.find((v) => (
(v.attribute == value.attribute) &&
(v.set_prefix == set.set_prefix) &&
(v.set_index == set.set_index) &&
(v.collection_index == value.collection_index)
))

if (isNil(sibling)) {
dispatch(storeValue(ValueFactory.create({ ...value, set_index: set.set_index })))
} else if (isEmptyValue(sibling)) {
dispatch(storeValue(ValueFactory.update(sibling, value)))
}
})
}
}

export function deleteValue(value) {
const pendingId = `deleteValue/${value.id}`

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import PageButtons from './PageButtons'
import PageHead from './PageHead'

const Page = ({ config, templates, overview, page, sets, values, fetchPage,
createValue, updateValue, deleteValue,
createValue, updateValue, deleteValue, copyValue,
activateSet, createSet, updateSet, deleteSet }) => {

const currentSetPrefix = ''
Expand Down Expand Up @@ -58,6 +58,7 @@ const Page = ({ config, templates, overview, page, sets, values, fetchPage,
createValue={createValue}
updateValue={updateValue}
deleteValue={deleteValue}
copyValue={copyValue}
/>
)
} else {
Expand All @@ -77,6 +78,7 @@ const Page = ({ config, templates, overview, page, sets, values, fetchPage,
createValue={createValue}
updateValue={updateValue}
deleteValue={deleteValue}
copyValue={copyValue}
/>
)
}
Expand Down Expand Up @@ -104,7 +106,8 @@ Page.propTypes = {
activateSet: PropTypes.func.isRequired,
createSet: PropTypes.func.isRequired,
updateSet: PropTypes.func.isRequired,
deleteSet: PropTypes.func.isRequired
deleteSet: PropTypes.func.isRequired,
copyValue: PropTypes.func.isRequired
}

export default Page
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import QuestionWarning from './QuestionWarning'
import QuestionWidget from './QuestionWidget'

const Question = ({ templates, question, values, disabled, isManager,
currentSet, createValue, updateValue, deleteValue }) => {
currentSet, createValue, updateValue, deleteValue, copyValue }) => {
return checkQuestion(question, currentSet) && (
<div className={`interview-question col-md-${question.width || '12'}`}>
<QuestionOptional question={question} />
Expand All @@ -31,6 +31,7 @@ const Question = ({ templates, question, values, disabled, isManager,
createValue={createValue}
updateValue={updateValue}
deleteValue={deleteValue}
copyValue={copyValue}
/>
</div>
)
Expand All @@ -46,6 +47,7 @@ Question.propTypes = {
createValue: PropTypes.func.isRequired,
updateValue: PropTypes.func.isRequired,
deleteValue: PropTypes.func.isRequired,
copyValue: PropTypes.func.isRequired
}

export default Question
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import React from 'react'
import PropTypes from 'prop-types'

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

const QuestionCopyValue = ({ question, value, copyValue }) => {
return (
question.set_collection && !isEmptyValue(value) && (
<button className="btn btn-link btn-apply-to-all" onClick={() => copyValue(value)}
title={gettext('Apply this answer to all tabs where this question is empty')}>
<i className="fa fa-arrow-circle-right fa-btn"></i>
</button>
)
)
}

QuestionCopyValue.propTypes = {
question: PropTypes.object.isRequired,
value: PropTypes.object.isRequired,
copyValue: PropTypes.func.isRequired
}

export default QuestionCopyValue
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import React from 'react'
import PropTypes from 'prop-types'

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

const QuestionCopyValues = ({ question, values, copyValue }) => {
const handleCopyValues = () => {
values.forEach((value) => copyValue(value))
}

console.log(values)

return (
question.set_collection && values.some((v) => !isEmptyValue(v)) && (
<button className="btn btn-link btn-apply-to-all" onClick={handleCopyValues}
title={gettext('Apply this answer to all tabs where this question is empty')}>
<i className="fa fa-arrow-circle-right fa-btn"></i>
</button>
)
)
}

QuestionCopyValues.propTypes = {
question: PropTypes.object.isRequired,
values: PropTypes.array.isRequired,
copyValue: PropTypes.func.isRequired
}

export default QuestionCopyValues
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import QuestionSetRemoveSet from './QuestionSetRemoveSet'

const QuestionSet = ({ templates, questionset, sets, values, disabled, isManager,
parentSet, createSet, updateSet, deleteSet,
createValue, updateValue, deleteValue }) => {
createValue, updateValue, deleteValue, copyValue }) => {

const setPrefix = getChildPrefix(parentSet)

Expand Down Expand Up @@ -58,6 +58,7 @@ const QuestionSet = ({ templates, questionset, sets, values, disabled, isManager
createValue={createValue}
updateValue={updateValue}
deleteValue={deleteValue}
copyValue={copyValue}
/>
)
} else {
Expand All @@ -77,6 +78,7 @@ const QuestionSet = ({ templates, questionset, sets, values, disabled, isManager
createValue={createValue}
updateValue={updateValue}
deleteValue={deleteValue}
copyValue={copyValue}
/>
)
}
Expand Down Expand Up @@ -107,7 +109,8 @@ QuestionSet.propTypes = {
deleteSet: PropTypes.func.isRequired,
createValue: PropTypes.func.isRequired,
updateValue: PropTypes.func.isRequired,
deleteValue: PropTypes.func.isRequired
deleteValue: PropTypes.func.isRequired,
copyValue: PropTypes.func.isRequired
}

export default QuestionSet
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,14 @@ import { maxBy } from 'lodash'

import { gatherOptions } from '../../../utils/options'

import QuestionCopyValues from '../question/QuestionCopyValues'
import QuestionError from '../question/QuestionError'
import QuestionSuccess from '../question/QuestionSuccess'

import CheckboxInput from './CheckboxInput'

const CheckboxWidget = ({ question, values, currentSet, disabled, createValue, updateValue, deleteValue }) => {
const CheckboxWidget = ({ question, values, currentSet, disabled,
createValue, updateValue, deleteValue, copyValue }) => {

const handleCreateValue = (option, additionalInput) => {
const lastValue = maxBy(values, (v) => v.collection_index)
Expand Down Expand Up @@ -69,6 +71,7 @@ const CheckboxWidget = ({ question, values, currentSet, disabled, createValue, u
</div>
<div className="buttons">
<QuestionSuccess value={{ success }} />
<QuestionCopyValues question={question} values={values} copyValue={copyValue} />
</div>
</div>
</div>
Expand All @@ -84,7 +87,8 @@ CheckboxWidget.propTypes = {
currentSet: PropTypes.object.isRequired,
createValue: PropTypes.func.isRequired,
updateValue: PropTypes.func.isRequired,
deleteValue: PropTypes.func.isRequired
deleteValue: PropTypes.func.isRequired,
copyValue: PropTypes.func.isRequired
}

export default CheckboxWidget
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import React from 'react'
import PropTypes from 'prop-types'

import QuestionAddValue from '../question/QuestionAddValue'
import QuestionCopyValue from '../question/QuestionCopyValue'
import QuestionDefault from '../question/QuestionDefault'
import QuestionError from '../question/QuestionError'
import QuestionEraseValue from '../question/QuestionEraseValue'
Expand All @@ -10,7 +11,7 @@ import QuestionRemoveValue from '../question/QuestionRemoveValue'

import DateInput from './DateInput'

const DateWidget = ({ question, values, currentSet, disabled, createValue, updateValue, deleteValue }) => {
const DateWidget = ({ question, values, currentSet, disabled, createValue, updateValue, deleteValue, copyValue }) => {
return (
<div className="interview-widgets">
{
Expand All @@ -33,6 +34,7 @@ const DateWidget = ({ question, values, currentSet, disabled, createValue, updat
disabled={disabled}
deleteValue={deleteValue}
/>
<QuestionCopyValue question={question} value={value} copyValue={copyValue} />
<QuestionDefault question={question} value={value} />
</div>
}
Expand All @@ -48,6 +50,7 @@ const DateWidget = ({ question, values, currentSet, disabled, createValue, updat
currentSet={currentSet}
disabled={disabled}
createValue={createValue}
copyValue={copyValue}
/>
</div>
)
Expand All @@ -60,7 +63,8 @@ DateWidget.propTypes = {
currentSet: PropTypes.object.isRequired,
createValue: PropTypes.func.isRequired,
updateValue: PropTypes.func.isRequired,
deleteValue: PropTypes.func.isRequired
deleteValue: PropTypes.func.isRequired,
copyValue: PropTypes.func.isRequired
}

export default DateWidget
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import PropTypes from 'prop-types'
import { gatherOptions } from '../../../utils/options'

import QuestionAddValue from '../question/QuestionAddValue'
import QuestionCopyValue from '../question/QuestionCopyValue'
import QuestionDefault from '../question/QuestionDefault'
import QuestionError from '../question/QuestionError'
import QuestionSuccess from '../question/QuestionSuccess'
Expand All @@ -12,7 +13,7 @@ import QuestionRemoveValue from '../question/QuestionRemoveValue'

import RadioInput from './RadioInput'

const RadioWidget = ({ question, values, currentSet, disabled, createValue, updateValue, deleteValue }) => {
const RadioWidget = ({ question, values, currentSet, disabled, createValue, updateValue, deleteValue, copyValue }) => {
return (
<div className="interview-widgets">
{
Expand All @@ -36,6 +37,7 @@ const RadioWidget = ({ question, values, currentSet, disabled, createValue, upda
disabled={disabled}
deleteValue={deleteValue}
/>
<QuestionCopyValue question={question} value={value} copyValue={copyValue} />
<QuestionDefault question={question} value={value} />
</div>
}
Expand All @@ -51,6 +53,7 @@ const RadioWidget = ({ question, values, currentSet, disabled, createValue, upda
currentSet={currentSet}
disabled={disabled}
createValue={createValue}
copyValue={copyValue}
/>
</div>
)
Expand All @@ -63,7 +66,8 @@ RadioWidget.propTypes = {
currentSet: PropTypes.object.isRequired,
createValue: PropTypes.func.isRequired,
updateValue: PropTypes.func.isRequired,
deleteValue: PropTypes.func.isRequired
deleteValue: PropTypes.func.isRequired,
copyValue: PropTypes.func.isRequired
}

export default RadioWidget
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import PropTypes from 'prop-types'
import { initRange } from '../../../utils/value'

import QuestionAddValue from '../question/QuestionAddValue'
import QuestionCopyValue from '../question/QuestionCopyValue'
import QuestionDefault from '../question/QuestionDefault'
import QuestionError from '../question/QuestionError'
import QuestionSuccess from '../question/QuestionSuccess'
Expand All @@ -12,7 +13,7 @@ import QuestionRemoveValue from '../question/QuestionRemoveValue'

import RangeInput from './RangeInput'

const RangeWidget = ({ question, values, currentSet, disabled, createValue, updateValue, deleteValue }) => {
const RangeWidget = ({ question, values, currentSet, disabled, createValue, updateValue, deleteValue, copyValue }) => {

const handleCreateValue = (value) => {
initRange(question, value)
Expand Down Expand Up @@ -46,6 +47,7 @@ const RangeWidget = ({ question, values, currentSet, disabled, createValue, upda
disabled={disabled}
deleteValue={deleteValue}
/>
<QuestionCopyValue question={question} value={value} copyValue={copyValue} />
<QuestionDefault question={question} value={value} />
</div>
}
Expand All @@ -61,6 +63,7 @@ const RangeWidget = ({ question, values, currentSet, disabled, createValue, upda
currentSet={currentSet}
disabled={disabled}
createValue={handleCreateValue}
copyValue={copyValue}
/>
</div>
)
Expand All @@ -73,7 +76,8 @@ RangeWidget.propTypes = {
currentSet: PropTypes.object.isRequired,
createValue: PropTypes.func.isRequired,
updateValue: PropTypes.func.isRequired,
deleteValue: PropTypes.func.isRequired
deleteValue: PropTypes.func.isRequired,
copyValue: PropTypes.func.isRequired
}

export default RangeWidget
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import PropTypes from 'prop-types'
import { gatherOptions } from '../../../utils/options'

import QuestionAddValue from '../question/QuestionAddValue'
import QuestionCopyValue from '../question/QuestionCopyValue'
import QuestionDefault from '../question/QuestionDefault'
import QuestionEraseValue from '../question/QuestionEraseValue'
import QuestionError from '../question/QuestionError'
Expand All @@ -13,7 +14,7 @@ import QuestionRemoveValue from '../question/QuestionRemoveValue'
import SelectInput from './SelectInput'

const SelectWidget = ({ question, values, currentSet, disabled, creatable,
createValue, updateValue, deleteValue }) => {
createValue, updateValue, deleteValue, copyValue }) => {
return (
<div className="interview-widgets">
{
Expand All @@ -38,6 +39,7 @@ const SelectWidget = ({ question, values, currentSet, disabled, creatable,
disabled={disabled}
deleteValue={deleteValue}
/>
<QuestionCopyValue question={question} value={value} copyValue={copyValue} />
<QuestionDefault question={question} value={value} />
</div>
}
Expand Down Expand Up @@ -66,7 +68,8 @@ SelectWidget.propTypes = {
currentSet: PropTypes.object.isRequired,
createValue: PropTypes.func.isRequired,
updateValue: PropTypes.func.isRequired,
deleteValue: PropTypes.func.isRequired
deleteValue: PropTypes.func.isRequired,
copyValue: PropTypes.func.isRequired
}

export default SelectWidget
Loading

0 comments on commit 1152302

Please sign in to comment.