diff --git a/rdmo/projects/assets/js/interview/actions/interviewActions.js b/rdmo/projects/assets/js/interview/actions/interviewActions.js
index b37c6f7838..bf8bce4898 100644
--- a/rdmo/projects/assets/js/interview/actions/interviewActions.js
+++ b/rdmo/projects/assets/js/interview/actions/interviewActions.js
@@ -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 } from '../utils/value'
+import { activateFirstValue, gatherDefaultValues, initValues, compareValues, isEmptyValue } from '../utils/value'
import { projectId } from '../utils/meta'
import ValueFactory from '../factories/ValueFactory'
@@ -272,7 +272,7 @@ export function storeValue(value) {
return {type: NOOP}
} else {
return (dispatch, getState) => {
- const valueIndex = getState().interview.values.map((v) => v.id).indexOf(value.id)
+ const valueIndex = getState().interview.values.findIndex((v) => compareValues(v, value))
const valueFile = value.file
const valueSuccess = value.success
@@ -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}`
@@ -453,9 +478,10 @@ export function createSet(attrs) {
if (isNil(value)) {
return createSetSuccess()
} else {
- return dispatch(storeValue(value)).then((action) => {
- if (action.type === STORE_VALUE_SUCCESS) {
- createSetSuccess(action.value)
+ return dispatch(storeValue(value)).then(() => {
+ const storedValue = getState().interview.values.find((v) => compareValues(v, value))
+ if (!isNil(storedValue)) {
+ createSetSuccess(storedValue)
}
})
}
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 8a6155c8cf..56bc9eba84 100644
--- a/rdmo/projects/assets/js/interview/components/main/page/Page.js
+++ b/rdmo/projects/assets/js/interview/components/main/page/Page.js
@@ -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 = ''
@@ -58,6 +58,7 @@ const Page = ({ config, templates, overview, page, sets, values, fetchPage,
createValue={createValue}
updateValue={updateValue}
deleteValue={deleteValue}
+ copyValue={copyValue}
/>
)
} else {
@@ -66,17 +67,26 @@ 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 &&
value.set_index == currentSetIndex
))}
+ siblings={values.filter((value) => (
+ value.attribute == element.attribute &&
+ value.set_prefix == currentSetPrefix &&
+ value.set_index != currentSetIndex
+ ))}
disabled={overview.read_only}
isManager={isManager}
currentSet={currentSet}
createValue={createValue}
updateValue={updateValue}
deleteValue={deleteValue}
+ copyValue={copyValue}
/>
)
}
@@ -104,7 +114,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
diff --git a/rdmo/projects/assets/js/interview/components/main/page/PageHead.js b/rdmo/projects/assets/js/interview/components/main/page/PageHead.js
index 57f50e430b..2b3be16650 100644
--- a/rdmo/projects/assets/js/interview/components/main/page/PageHead.js
+++ b/rdmo/projects/assets/js/interview/components/main/page/PageHead.js
@@ -28,6 +28,11 @@ const PageHead = ({ templates, page, sets, values, currentSet, activateSet, crea
}
}
+ const handleOpenCreateModal = (event) => {
+ event.preventDefault()
+ openCreateModal()
+ }
+
const handleCreateSet = (text) => {
createSet({
attribute: page.attribute,
@@ -71,7 +76,7 @@ const PageHead = ({ templates, page, sets, values, currentSet, activateSet, crea
})
}
-
+
{capitalize(page.verbose_name)}
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 cea3c70ff4..a74e89ba96 100644
--- a/rdmo/projects/assets/js/interview/components/main/question/Question.js
+++ b/rdmo/projects/assets/js/interview/components/main/question/Question.js
@@ -12,8 +12,8 @@ import QuestionText from './QuestionText'
import QuestionWarning from './QuestionWarning'
import QuestionWidget from './QuestionWidget'
-const Question = ({ templates, question, values, disabled, isManager,
- currentSet, createValue, updateValue, deleteValue }) => {
+const Question = ({ templates, question, sets, values, siblings, disabled, isManager,
+ currentSet, createValue, updateValue, deleteValue, copyValue }) => {
return checkQuestion(question, currentSet) && (
@@ -25,12 +25,15 @@ const Question = ({ templates, question, values, disabled, isManager,
)
@@ -39,13 +42,16 @@ const Question = ({ templates, question, values, 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,
isManager: PropTypes.bool.isRequired,
currentSet: PropTypes.object.isRequired,
createValue: PropTypes.func.isRequired,
updateValue: PropTypes.func.isRequired,
deleteValue: PropTypes.func.isRequired,
+ copyValue: PropTypes.func.isRequired
}
export default Question
diff --git a/rdmo/projects/assets/js/interview/components/main/question/QuestionAddValue.js b/rdmo/projects/assets/js/interview/components/main/question/QuestionAddValue.js
index 19ca71f249..bf2ee56604 100644
--- a/rdmo/projects/assets/js/interview/components/main/question/QuestionAddValue.js
+++ b/rdmo/projects/assets/js/interview/components/main/question/QuestionAddValue.js
@@ -17,7 +17,7 @@ const AddValue = ({ question, values, currentSet, disabled, createValue }) => {
}
return !disabled && question.is_collection && (
-