diff --git a/rdmo/core/settings.py b/rdmo/core/settings.py
index 430e3234bb..3097bb8e72 100644
--- a/rdmo/core/settings.py
+++ b/rdmo/core/settings.py
@@ -226,6 +226,7 @@
'projects/project_interview_add_field_help.html',
'projects/project_interview_add_set_help.html',
'projects/project_interview_buttons_help.html',
+ 'projects/project_interview_done.html',
'projects/project_interview_multiple_values_warning.html',
'projects/project_interview_navigation_help.html',
'projects/project_interview_overview_help.html',
diff --git a/rdmo/projects/assets/js/interview/actions/interviewActions.js b/rdmo/projects/assets/js/interview/actions/interviewActions.js
index bc93cfe3ad..68d75a5ce6 100644
--- a/rdmo/projects/assets/js/interview/actions/interviewActions.js
+++ b/rdmo/projects/assets/js/interview/actions/interviewActions.js
@@ -35,21 +35,29 @@ import {
import { updateConfig } from 'rdmo/core/assets/js/actions/configActions'
export function fetchPage(pageId) {
- return (dispatch) => {
- const promise = isNil(pageId) ? PageApi.fetchContinue(projectId)
- : PageApi.fetchPage(projectId, pageId)
- return promise.then((page) => {
- updateLocation(page.id)
- initPage(page)
- dispatch(fetchNavigation(page))
- dispatch(fetchValues(page))
- dispatch(fetchPageSuccess(page))
- })
+ if (pageId === 'done') {
+ return (dispatch) => {
+ updateLocation('done')
+ dispatch(fetchNavigation(null))
+ dispatch(fetchPageSuccess(null, true))
+ }
+ } else {
+ return (dispatch) => {
+ const promise = isNil(pageId) ? PageApi.fetchContinue(projectId)
+ : PageApi.fetchPage(projectId, pageId)
+ return promise.then((page) => {
+ updateLocation(page.id)
+ initPage(page)
+ dispatch(fetchNavigation(page))
+ dispatch(fetchValues(page))
+ dispatch(fetchPageSuccess(page, false))
+ })
+ }
}
}
-export function fetchPageSuccess(page) {
- return {type: FETCH_PAGE_SUCCESS, page}
+export function fetchPageSuccess(page, done) {
+ return {type: FETCH_PAGE_SUCCESS, page, done}
}
export function fetchPageError(errors) {
@@ -58,7 +66,7 @@ export function fetchPageError(errors) {
export function fetchNavigation(page) {
return (dispatch) => {
- return ProjectApi.fetchNavigation(projectId, page.section.id)
+ return ProjectApi.fetchNavigation(projectId, page && page.section.id)
.then((navigation) => dispatch(fetchNavigationSuccess(navigation)))
.catch((errors) => dispatch(fetchNavigationError(errors)))
diff --git a/rdmo/projects/assets/js/interview/api/ProjectApi.js b/rdmo/projects/assets/js/interview/api/ProjectApi.js
index dd57d03728..fa45e530b3 100644
--- a/rdmo/projects/assets/js/interview/api/ProjectApi.js
+++ b/rdmo/projects/assets/js/interview/api/ProjectApi.js
@@ -1,3 +1,5 @@
+import { isNil } from 'lodash'
+
import BaseApi from 'rdmo/core/assets/js/api/BaseApi'
class ProjectsApi extends BaseApi {
@@ -7,7 +9,11 @@ class ProjectsApi extends BaseApi {
}
static fetchNavigation(projectId, page_id) {
- return this.get(`/api/v1/projects/projects/${projectId}/navigation/${page_id}`)
+ if (isNil(page_id)) {
+ return this.get(`/api/v1/projects/projects/${projectId}/navigation/`)
+ } else {
+ return this.get(`/api/v1/projects/projects/${projectId}/navigation/${page_id}`)
+ }
}
static fetchProgress(projectId) {
diff --git a/rdmo/projects/assets/js/interview/components/main/Breadcrump.js b/rdmo/projects/assets/js/interview/components/main/Breadcrump.js
index 2ba76ab429..781e95b347 100644
--- a/rdmo/projects/assets/js/interview/components/main/Breadcrump.js
+++ b/rdmo/projects/assets/js/interview/components/main/Breadcrump.js
@@ -22,18 +22,22 @@ const Breadcrump = ({ overview, page, fetchPage }) => {
{overview.title}
-
-
- {page.section.title}
-
-
+ {
+ page && (
+
+
+ {page.section.title}
+
+
+ )
+ }
)
}
Breadcrump.propTypes = {
overview: PropTypes.object.isRequired,
- page: PropTypes.object.isRequired,
+ page: PropTypes.object,
fetchPage: PropTypes.func.isRequired
}
diff --git a/rdmo/projects/assets/js/interview/components/main/Done.js b/rdmo/projects/assets/js/interview/components/main/Done.js
new file mode 100644
index 0000000000..55cb0cd850
--- /dev/null
+++ b/rdmo/projects/assets/js/interview/components/main/Done.js
@@ -0,0 +1,33 @@
+import React from 'react'
+import PropTypes from 'prop-types'
+
+import baseUrl from 'rdmo/core/assets/js/utils/baseUrl'
+
+import Template from 'rdmo/core/assets/js/components/Template'
+
+const Done = ({ templates, overview }) => {
+
+ const projectUrl = `${baseUrl}/projects/${overview.id}/`
+ const answersUrl = `${baseUrl}/projects/${overview.id}/answers/`
+
+ return (
+ <>
+
+
+
+ {gettext('View answers')}
+
+
+
+ {gettext('Back to project overview')}
+
+ >
+ )
+}
+
+Done.propTypes = {
+ templates: PropTypes.object.isRequired,
+ overview: PropTypes.object.isRequired
+}
+
+export default Done
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 75c2f04fa3..d14a00437a 100644
--- a/rdmo/projects/assets/js/interview/components/main/page/Page.js
+++ b/rdmo/projects/assets/js/interview/components/main/page/Page.js
@@ -10,7 +10,7 @@ import PageButtons from './PageButtons'
import PageHead from './PageHead'
import PageHelp from './PageHelp'
-const Page = ({ config, templates, project, page, sets, values, fetchPage,
+const Page = ({ config, templates, overview, page, sets, values, fetchPage,
createValue, updateValue, deleteValue,
activateSet, createSet, updateSet, deleteSet }) => {
@@ -50,7 +50,7 @@ const Page = ({ config, templates, project, page, sets, values, fetchPage,
questionset={element}
sets={sets}
values={values.filter((value) => element.attributes.includes(value.attribute))}
- disabled={project.overview.read_only}
+ disabled={overview.read_only}
focus={elementIndex == 0}
parentSet={currentSet}
createSet={createSet}
@@ -72,7 +72,7 @@ const Page = ({ config, templates, project, page, sets, values, fetchPage,
value.set_prefix == currentSetPrefix &&
value.set_index == currentSetIndex
))}
- disabled={project.overview.read_only}
+ disabled={overview.read_only}
focus={elementIndex == 0}
currentSet={currentSet}
createValue={createValue}
@@ -94,7 +94,7 @@ const Page = ({ config, templates, project, page, sets, values, fetchPage,
Page.propTypes = {
config: PropTypes.object.isRequired,
templates: PropTypes.object.isRequired,
- project: PropTypes.object.isRequired,
+ overview: PropTypes.object.isRequired,
page: PropTypes.object.isRequired,
sets: PropTypes.array.isRequired,
values: PropTypes.array.isRequired,
diff --git a/rdmo/projects/assets/js/interview/components/main/page/PageButtons.js b/rdmo/projects/assets/js/interview/components/main/page/PageButtons.js
index 3bb64260a6..2edc0d5358 100644
--- a/rdmo/projects/assets/js/interview/components/main/page/PageButtons.js
+++ b/rdmo/projects/assets/js/interview/components/main/page/PageButtons.js
@@ -18,7 +18,7 @@ const PageButtons = ({ page, fetchPage }) => {
{gettext('Proceed')}
) : (
-