From 58f2080613283eff863a61342791676feaeb769b Mon Sep 17 00:00:00 2001
From: vimal1083 <vimal1083@gmail.com>
Date: Thu, 22 Oct 2020 12:07:26 +0530
Subject: [PATCH] Add Determination

---
 hypha/static_src/src/app/src/api/index.js     |   4 +-
 .../static_src/src/app/src/api/submissions.js |   6 +
 .../src/app/src/containers/Determination.js   |  71 +++++++++
 .../src/app/src/containers/Determination.scss |   3 +
 .../containers/DeterminationForm/actions.js   |  54 +++++++
 .../containers/DeterminationForm/constants.js |  11 ++
 .../src/containers/DeterminationForm/index.js | 145 ++++++++++++++++++
 .../containers/DeterminationForm/models.js    |  10 ++
 .../containers/DeterminationForm/reducer.js   |  24 +++
 .../src/containers/DeterminationForm/sagas.js | 110 +++++++++++++
 .../containers/DeterminationForm/selectors.js |   7 +
 .../containers/DeterminationForm/styles.scss  |   6 +
 .../app/src/containers/DisplayPanel/index.js  |  19 ++-
 .../src/app/src/redux/actions/submissions.js  |  42 ++++-
 .../src/app/src/redux/reducers/submissions.js |  48 +++++-
 .../app/src/redux/selectors/submissions.js    |   9 ++
 hypha/static_src/src/app/src/redux/store.js   |   6 +-
 17 files changed, 560 insertions(+), 15 deletions(-)
 create mode 100644 hypha/static_src/src/app/src/containers/Determination.js
 create mode 100644 hypha/static_src/src/app/src/containers/Determination.scss
 create mode 100644 hypha/static_src/src/app/src/containers/DeterminationForm/actions.js
 create mode 100644 hypha/static_src/src/app/src/containers/DeterminationForm/constants.js
 create mode 100644 hypha/static_src/src/app/src/containers/DeterminationForm/index.js
 create mode 100644 hypha/static_src/src/app/src/containers/DeterminationForm/models.js
 create mode 100644 hypha/static_src/src/app/src/containers/DeterminationForm/reducer.js
 create mode 100644 hypha/static_src/src/app/src/containers/DeterminationForm/sagas.js
 create mode 100644 hypha/static_src/src/app/src/containers/DeterminationForm/selectors.js
 create mode 100644 hypha/static_src/src/app/src/containers/DeterminationForm/styles.scss

diff --git a/hypha/static_src/src/app/src/api/index.js b/hypha/static_src/src/app/src/api/index.js
index 332d88cb2..320423098 100644
--- a/hypha/static_src/src/app/src/api/index.js
+++ b/hypha/static_src/src/app/src/api/index.js
@@ -3,7 +3,8 @@ import {
     fetchSubmission,
     fetchSubmissionsByRound,
     fetchSubmissionsByStatuses,
-    fetchReviewDraft
+    fetchReviewDraft,
+    fetchDeterminationDraft
 } from '@api/submissions';
 import { fetchRound, fetchRounds } from '@api/rounds';
 import { createNoteForSubmission, fetchNotesForSubmission, fetchNewNotesForSubmission, editNoteForSubmission } from '@api/notes';
@@ -15,6 +16,7 @@ export default {
     fetchSubmissionsByStatuses,
     fetchSubmission,
     fetchReviewDraft,
+    fetchDeterminationDraft,
 
     fetchRound,
     fetchRounds,
diff --git a/hypha/static_src/src/app/src/api/submissions.js b/hypha/static_src/src/app/src/api/submissions.js
index 6c7b3d9d7..fc51f4d01 100644
--- a/hypha/static_src/src/app/src/api/submissions.js
+++ b/hypha/static_src/src/app/src/api/submissions.js
@@ -20,6 +20,12 @@ export function fetchReviewDraft(id) {
     };
 }
 
+export function fetchDeterminationDraft(id) {
+    return {
+        path: `/v1/submissions/${id}/determinations/draft/`,
+    };
+}
+
 export function fetchSubmissionsByStatuses(statuses) {
     const params = new URLSearchParams
     params.append('page_size', 1000)
diff --git a/hypha/static_src/src/app/src/containers/Determination.js b/hypha/static_src/src/app/src/containers/Determination.js
new file mode 100644
index 000000000..b296ff7be
--- /dev/null
+++ b/hypha/static_src/src/app/src/containers/Determination.js
@@ -0,0 +1,71 @@
+import React from 'react'
+import SidebarBlock from '@components/SidebarBlock'
+import PropTypes from 'prop-types'
+import { connect } from 'react-redux'
+import { getDeterminationButtonStatus, getDeterminationDraftStatus } from '@selectors/submissions'
+import { toggleDeterminationFormAction, setCurrentDeterminationAction } from '@actions/submissions'
+import './Determination.scss';
+
+class DeterminationContainer extends React.PureComponent {
+
+    render(){
+        const determination = this.props.submission ? this.props.submission.determination : null
+        const drafted = determination && 
+        determination.count ? 
+        determination.determinations[1] ? Math.max(determination.determinations[0].id, determination.determinations[1].id): determination.determinations[0].id 
+        : null
+        return <div className="determination-container">
+            {determination  ? 
+            <SidebarBlock title="Determination">
+                {!determination.count ?
+                    <p>Awaiting determination</p> 
+                :
+                <>
+                   {determination.determinations.map((d, index) => {
+                       return (
+                           <p key={index}>
+                            {this.props.determinationDraftStatus && d.id == drafted && 
+                            "[Draft]"}{d.outcome}- {d.updatedAt.slice(0,10)} by {d.author}
+                           {(!this.props.determinationDraftStatus || (this.props.determinationDraftStatus && d.id != drafted)) 
+                            &&
+                           <a onClick={() => { this.props.setCurrentDetermination(d.id); this.props.toggleDeterminationForm(true) }} title="Edit" >
+                             <svg className="icon icon--pen"><use href="#pen"></use></svg>
+                            </a> 
+                            }
+                           </p>
+                       )
+                   })}
+                    
+                </>
+                }
+                {this.props.determinationDraftStatus && 
+                <div className="status-actions"><button onClick = {() =>  this.props.toggleDeterminationForm(true)} className="button button--primary button--half-width">Update Draft</button></div>}
+                {!this.props.determinationDraftStatus && 
+                this.props.submission.actions.some(action => action.display.includes("Determination")) && <div className="status-actions"><button onClick = {() =>  this.props.toggleDeterminationForm(true)} className="button button--primary button--full-width">Add determination</button></div>}
+            </SidebarBlock>
+           : null
+           }
+        </div>
+    }
+}
+
+DeterminationContainer.propTypes = {
+    submission: PropTypes.object,
+    showDeterminationForm: PropTypes.bool,
+    determinationDraftStatus: PropTypes.bool,
+    toggleDeterminationForm: PropTypes.func,
+    setCurrentDetermination: PropTypes.func,
+}
+
+const mapStateToProps = (state) => ({
+    showDeterminationForm: getDeterminationButtonStatus(state),
+    determinationDraftStatus: getDeterminationDraftStatus(state),
+})
+
+const mapDispatchToProps = (dispatch) => ({
+    toggleDeterminationForm: (status) => dispatch(toggleDeterminationFormAction(status)),
+    setCurrentDetermination: (reviewId) => dispatch(setCurrentDeterminationAction(reviewId)),
+    // deleteReview: (reviewId, submissionID) => dispatch(deleteReviewAction(reviewId, submissionID)),
+})
+
+export default connect(mapStateToProps, mapDispatchToProps)(DeterminationContainer)
\ No newline at end of file
diff --git a/hypha/static_src/src/app/src/containers/Determination.scss b/hypha/static_src/src/app/src/containers/Determination.scss
new file mode 100644
index 000000000..db2262cca
--- /dev/null
+++ b/hypha/static_src/src/app/src/containers/Determination.scss
@@ -0,0 +1,3 @@
+.determination-container{
+    padding-right: 15px
+}
\ No newline at end of file
diff --git a/hypha/static_src/src/app/src/containers/DeterminationForm/actions.js b/hypha/static_src/src/app/src/containers/DeterminationForm/actions.js
new file mode 100644
index 000000000..db7e40648
--- /dev/null
+++ b/hypha/static_src/src/app/src/containers/DeterminationForm/actions.js
@@ -0,0 +1,54 @@
+import * as ActionTypes from './constants';
+
+export const initializeAction = (id, determinationId = null) => ({
+  type: ActionTypes.INITIALIZE,
+  id,
+  determinationId
+});
+
+
+export const getDeterminationFieldsSuccessAction = (data) => ({
+  type: ActionTypes.GET_DETERMINATION_FIELDS_SUCCESS,
+  data
+});
+
+export const getDeterminationValuesSuccessAction = (data) => ({
+  type: ActionTypes.GET_DETERMINATION_VALUES_SUCCESS,
+  data
+});
+
+export const submitDeterminationAction = (determinationData, id) => ({
+  type: ActionTypes.SUBMIT_DETERMINATION_DATA,
+  id,
+  determinationData,
+});
+
+export const updateDeterminationAction = (determinationData, id, determinationId) => ({
+  type: ActionTypes.UPDATE_DETERMINATION_DATA,
+  id,
+  determinationData,
+  determinationId
+});
+
+export const deleteDeterminationAction = (determinationId, id) => ({
+  type: ActionTypes.DELETE_DETERMINATION_DATA,
+  id,
+  determinationId
+});
+
+export const showLoadingAction = () => ({
+	type: ActionTypes.SHOW_LOADING,
+})
+
+export const hideLoadingAction = () => ({
+	type: ActionTypes.HIDE_LOADING,
+})
+
+export const clearInitialValues = () => ({
+  type: ActionTypes.CLEAR_INITIAL_VALUES
+})
+
+export const toggleSaveDraftAction = (status) => ({
+  type: ActionTypes.TOGGLE_SAVE_DRAFT,
+  status
+})
\ No newline at end of file
diff --git a/hypha/static_src/src/app/src/containers/DeterminationForm/constants.js b/hypha/static_src/src/app/src/containers/DeterminationForm/constants.js
new file mode 100644
index 000000000..40d49b2dd
--- /dev/null
+++ b/hypha/static_src/src/app/src/containers/DeterminationForm/constants.js
@@ -0,0 +1,11 @@
+
+export const INITIALIZE = 'DeterminationForm/constants/INITIALIZE';
+export const GET_DETERMINATION_FIELDS_SUCCESS = 'DeterminationForm/constants/GET_DETERMINATION_FIELDS_SUCCESS';
+export const SHOW_LOADING = 'DeterminationForm/constants/SHOW_LOADING'
+export const HIDE_LOADING = 'DeterminationForm/constants/HIDE_LOADING'
+export const SUBMIT_DETERMINATION_DATA = 'DeterminationForm/constants/SUBMIT_DETERMINATION_DATA'
+export const UPDATE_DETERMINATION_DATA = 'DeterminationForm/constants/UPDATE_DETERMINATION_DATA'
+export const DELETE_DETERMINATION_DATA = 'DeterminationForm/constants/DELETE_DETERMINATION_DATA'
+export const GET_DETERMINATION_VALUES_SUCCESS = 'DeterminationForm/constants/GET_DETERMINATION_VALUES_SUCCESS'
+export const CLEAR_INITIAL_VALUES = 'DeterminationForm/constants/CLEAR_INITIAL_VALUES'
+export const TOGGLE_SAVE_DRAFT = 'DeterminationForm/constants/TOGGLE_SAVE_DRAFT'
diff --git a/hypha/static_src/src/app/src/containers/DeterminationForm/index.js b/hypha/static_src/src/app/src/containers/DeterminationForm/index.js
new file mode 100644
index 000000000..6149fb89e
--- /dev/null
+++ b/hypha/static_src/src/app/src/containers/DeterminationForm/index.js
@@ -0,0 +1,145 @@
+import React from 'react';
+// import {createStore} from 'redux';
+import injectReducer from '@utils/injectReducer'
+import injectSaga from '@utils/injectSaga'
+import { withRouter } from 'react-router-dom';
+import { connect } from 'react-redux';
+import { bindActionCreators, compose } from 'redux';
+import PropTypes from 'prop-types';
+import * as Actions from './actions';
+import reducer from './reducer';
+import saga from './sagas';
+// import App from "./app"
+import { getCurrentDetermination } from '@selectors/submissions'
+import * as Selectors from './selectors';
+import "./styles.scss";
+import FormContainer from '@common/containers/FormContainer';
+import LoadingPanel from '@components/LoadingPanel'
+import { toggleDeterminationFormAction, clearCurrentDeterminationAction } from '../../redux/actions/submissions'
+
+
+class DeterminationFormContainer extends React.PureComponent {
+
+  componentDidMount(){
+    this.props.initializeAction(this.props.submissionID, this.props.determinationId ? this.props.determinationId : null)
+    }
+
+  getMetaFields(){
+
+   let metaFieldsActions = [{
+        text: "back",
+        type: "secondary",
+        callback: () => {this.props.toggleDeterminationForm(false); this.props.clearCurrentDetermination()}
+        }] ;
+
+    if(this.props.formData.saveAsDraft){
+      metaFieldsActions.push({
+        text: "Update Draft",
+        type: "secondary",
+        callback: values => {
+          let newValues = {...values, is_draft: true} 
+          this.props.submitDetermination(newValues, this.props.submissionID)
+             }  })
+    }else if(!this.props.determinationId){
+      metaFieldsActions.push({
+        text: "Save Draft",
+        type: "secondary",
+        callback: values => {
+          let newValues = {...values, is_draft: true}
+          this.props.submitDetermination(newValues, this.props.submissionID)
+        }
+       })
+    }
+    
+    if(this.props.determinationId){
+      metaFieldsActions.push({
+          text: "Update",
+          type: "primary",
+          callback: values => this.props.updateDetermination(values,this.props.submissionID, this.props.determinationId)
+        })
+      // metaFieldsActions.push({
+      //     text: "Delete",
+      //     type: "warning",
+      //     callback: () => this.props.deleteDetermination(this.props.determinationId, this.props.submissionID)
+      //   })
+    }
+    else{
+      metaFieldsActions.push({
+          text: "Create",
+          type: "primary",
+          callback: values => this.props.submitDetermination(values, this.props.submissionID)
+        })
+    }
+
+
+    return {
+      fields: this.props.currentDetermination ? this.props.formData.metaStructure.filter(field => field.type !== "TypedChoiceField") : this.props.formData.metaStructure,
+      actions: metaFieldsActions,
+      initialValues: this.props.formData.initialValues
+    }
+  }
+
+  render() {
+      return <div 
+      className={"container"}> 
+      {this.props.determinationId ? <h3>Update Determination</h3> : <h3>Create Determination</h3> }
+      {this.props.formData.loading ? <LoadingPanel /> : <> 
+        <FormContainer metadata={this.getMetaFields()} formId={"myIntialForm"} />
+      </>}
+    </div>
+  }
+}
+
+DeterminationFormContainer.propTypes = {
+  formData: PropTypes.object,
+  initializeAction: PropTypes.func,
+  submitDetermination: PropTypes.func,
+  deleteDetermination: PropTypes.func,
+  updateDetermination: PropTypes.func,
+  toggleDeterminationForm: PropTypes.func,
+  toggleSaveDraft: PropTypes.func,
+  submissionID: PropTypes.number,
+  determinationId: PropTypes.number,
+  clearCurrentDetermination: PropTypes.func,
+  currentDetermination: PropTypes.number
+}
+
+
+const mapStateToProps = state =>  ({
+    formData: Selectors.selectFieldsInfo(state),
+    currentDetermination: getCurrentDetermination(state)
+  });
+
+
+function mapDispatchToProps(dispatch) {
+  return bindActionCreators(
+    {
+      initializeAction: Actions.initializeAction,
+      submitDetermination: Actions.submitDeterminationAction,
+      deleteDetermination: Actions.deleteDeterminationAction,
+      updateDetermination: Actions.updateDeterminationAction,
+      toggleDeterminationForm: toggleDeterminationFormAction,
+      toggleSaveDraft: Actions.toggleSaveDraftAction,
+      clearCurrentDetermination: clearCurrentDeterminationAction
+
+    },
+    dispatch,
+  );
+}
+
+const withConnect = connect(
+  mapStateToProps,
+  mapDispatchToProps,
+);
+
+const withReducer = injectReducer({ key: 'DeterminationFormContainer', reducer });
+const withSaga = injectSaga({ key: 'DeterminationFormContainer', saga });
+
+
+
+export default compose(
+  withSaga,
+  withReducer,
+  withConnect,
+  withRouter,
+)(DeterminationFormContainer);
diff --git a/hypha/static_src/src/app/src/containers/DeterminationForm/models.js b/hypha/static_src/src/app/src/containers/DeterminationForm/models.js
new file mode 100644
index 000000000..33debd726
--- /dev/null
+++ b/hypha/static_src/src/app/src/containers/DeterminationForm/models.js
@@ -0,0 +1,10 @@
+import * as Immutable from 'seamless-immutable';
+
+const initialState = Immutable.from({
+  metaStructure : null,
+  loading : true,
+  initialValues : null,
+  saveAsDraft: false
+});
+
+export default initialState;
diff --git a/hypha/static_src/src/app/src/containers/DeterminationForm/reducer.js b/hypha/static_src/src/app/src/containers/DeterminationForm/reducer.js
new file mode 100644
index 000000000..3d3e6ca73
--- /dev/null
+++ b/hypha/static_src/src/app/src/containers/DeterminationForm/reducer.js
@@ -0,0 +1,24 @@
+import * as ActionTypes from './constants';
+import initialState from './models';
+
+/* eslint-disable default-case, no-param-reassign */
+const determinationFormReducer = (state = initialState, action) => {
+  switch (action.type) {
+    case ActionTypes.GET_DETERMINATION_FIELDS_SUCCESS:
+      return state.set("metaStructure", action.data).set("initialValues", null);
+    case ActionTypes.SHOW_LOADING:
+      return state.set("loading", true);
+    case ActionTypes.HIDE_LOADING:
+      return state.set("loading", false);
+    case ActionTypes.GET_DETERMINATION_VALUES_SUCCESS:
+      return state.set("initialValues", action.data);
+    case ActionTypes.CLEAR_INITIAL_VALUES:
+      return state.set("initialValues", null)
+    case ActionTypes.TOGGLE_SAVE_DRAFT:
+      return state.set("saveAsDraft", action.status)
+	default:
+      return state;
+  }
+};
+
+export default determinationFormReducer;
\ No newline at end of file
diff --git a/hypha/static_src/src/app/src/containers/DeterminationForm/sagas.js b/hypha/static_src/src/app/src/containers/DeterminationForm/sagas.js
new file mode 100644
index 000000000..01dacc350
--- /dev/null
+++ b/hypha/static_src/src/app/src/containers/DeterminationForm/sagas.js
@@ -0,0 +1,110 @@
+import {
+  call,
+  put,
+  takeLatest,
+} from 'redux-saga/effects';
+import * as ActionTypes from './constants';
+import * as Actions from './actions';
+import { toggleDeterminationFormAction } from '../../redux/actions/submissions'
+import { apiFetch } from '@api/utils'
+
+function* initialFetch(action) {
+  
+  try {
+    yield put(Actions.showLoadingAction())
+    let response = yield call(apiFetch, {path : `/v1/submissions/${action.id}/determinations/fields/`});
+    let data = yield response.json()
+    yield put(
+      Actions.getDeterminationFieldsSuccessAction(data),
+    );
+   let url = `/v1/submissions/${action.id}/determinations/draft/`
+
+    if(action.determinationId !== null){
+       url = `/v1/submissions/${action.id}/determinations/${action.determinationId}`
+       }
+
+       response = yield call(apiFetch, {path : url})
+       data = yield response.json()
+       if(data.length)
+       {
+       yield put(Actions.toggleSaveDraftAction(data.is_draft))
+     }
+      yield put(Actions.getDeterminationValuesSuccessAction(data))
+      yield put(Actions.hideLoadingAction())
+
+  } catch (e) {
+    yield put(Actions.hideLoadingAction())
+  }
+}
+
+function* submitDetermination(action){
+  const url = `/v1/submissions/${action.id}/determinations/`
+  try{
+    yield put(Actions.showLoadingAction())
+    yield call(
+      apiFetch, 
+      {
+        path : url,
+        method : "POST",
+        options : {
+            body : JSON.stringify(action.determinationData),
+        }
+      }
+      )
+    yield put(toggleDeterminationFormAction(false))
+    yield put(Actions.hideLoadingAction())
+  }catch(e){
+     yield put(Actions.hideLoadingAction())
+  }
+}
+
+// function* deleteDetermination(action){
+//   const url = `/v1/submissions/${action.id}/determinations/${action.determinationId}`
+//   try{
+//     yield put(Actions.showLoadingAction())
+//     yield call(
+//       apiFetch, 
+//       {
+//         path : url,
+//         method : "DELETE",
+//       }
+//       )
+//     yield put(Actions.clearInitialValues())
+//     yield put(clearCurrentDeterminationAction()) 
+//     yield put(toggleDeterminationFormAction(false))
+//     yield put(Actions.hideLoadingAction())
+
+//   }catch(e){
+//      yield put(Actions.hideLoadingAction())
+//   }
+// }
+
+function* updateDetermination(action){
+  const url = `/v1/submissions/${action.id}/determinations/${action.determinationId}/`
+  try{
+    yield put(Actions.showLoadingAction())
+    yield call(
+      apiFetch, 
+      {
+        path : url,
+        method : "PUT",
+        options : {
+            body : JSON.stringify(action.determinationData),
+        }
+      }
+      )
+    yield put(toggleDeterminationFormAction(false))
+    yield put(Actions.hideLoadingAction())
+}
+  catch(e){
+     yield put(Actions.hideLoadingAction())
+  }
+
+}
+
+export default function* homePageSaga() {
+  yield takeLatest(ActionTypes.INITIALIZE, initialFetch);
+  yield takeLatest(ActionTypes.SUBMIT_DETERMINATION_DATA, submitDetermination)
+  // yield takeLatest(ActionTypes.DELETE_DETERMINATION_DATA, deleteDetermination)
+  yield takeLatest(ActionTypes.UPDATE_DETERMINATION_DATA, updateDetermination)
+}
diff --git a/hypha/static_src/src/app/src/containers/DeterminationForm/selectors.js b/hypha/static_src/src/app/src/containers/DeterminationForm/selectors.js
new file mode 100644
index 000000000..6cc62d1d9
--- /dev/null
+++ b/hypha/static_src/src/app/src/containers/DeterminationForm/selectors.js
@@ -0,0 +1,7 @@
+import { createSelector } from 'reselect';
+import initialState from './models';
+
+export const selectFieldsRenderer = state =>
+  state.DeterminationFormContainer ? state.DeterminationFormContainer : initialState;
+
+export const selectFieldsInfo = createSelector(selectFieldsRenderer, domain => domain);
diff --git a/hypha/static_src/src/app/src/containers/DeterminationForm/styles.scss b/hypha/static_src/src/app/src/containers/DeterminationForm/styles.scss
new file mode 100644
index 000000000..9a4ca0eee
--- /dev/null
+++ b/hypha/static_src/src/app/src/containers/DeterminationForm/styles.scss
@@ -0,0 +1,6 @@
+.container {
+background-color: white;
+margin: 30px ;
+padding: 20px;
+width: 80%
+}
\ No newline at end of file
diff --git a/hypha/static_src/src/app/src/containers/DisplayPanel/index.js b/hypha/static_src/src/app/src/containers/DisplayPanel/index.js
index 190ed93b1..48d4a144e 100644
--- a/hypha/static_src/src/app/src/containers/DisplayPanel/index.js
+++ b/hypha/static_src/src/app/src/containers/DisplayPanel/index.js
@@ -9,7 +9,9 @@ import {
     getCurrentSubmission,
     getCurrentSubmissionID,
     getReviewButtonStatus,
-    getCurrentReview
+    getCurrentReview,
+    getDeterminationButtonStatus,
+    getCurrentDetermination
 } from '@selectors/submissions'
 import { getDraftNoteForSubmission } from '@selectors/notes';
 
@@ -22,6 +24,8 @@ import StatusActions from '@containers/StatusActions'
 import Tabber, {Tab} from '@components/Tabber'
 import SubmissionLink from '@components/SubmissionLink';
 import ReviewFormContainer from '@containers/ReviewForm';
+import Determination from '../Determination';
+import DeterminationFormContainer from '@containers/DeterminationForm'
 
 
 import './style.scss'
@@ -29,7 +33,7 @@ import './style.scss'
 
 
 const DisplayPanel = props => {
-    const { submissionID, submission, addMessage, showReviewForm, currentReview} = props
+    const { submissionID, submission, addMessage, showReviewForm, currentReview, showDeterminationForm, currentDetermination} = props
     const [ currentStatus, setCurrentStatus ] = useState(undefined)
     const [ localSubmissionID, setLocalSubmissionID ] = useState(submissionID)
 
@@ -66,6 +70,7 @@ const DisplayPanel = props => {
 
     let tabs = [
         <Tab button="Status" key="status">
+            <Determination submissionID={submissionID} submission={submission}/>
             <ScreeningOutcome submissionID={submissionID} />
             <StatusActions submissionID={submissionID} />
             <ReviewInformation submissionID={submissionID} />
@@ -83,14 +88,14 @@ const DisplayPanel = props => {
         tabs = [
             <Tab button="Back" key="back" handleClick={ clearSubmission } />,
             <Tab button="Application" key="application">
-                {showReviewForm ? <CurrentSubmissionDisplay /> : <ReviewFormContainer submissionID={submissionID} reviewId={currentReview}/>}  
+                {!showReviewForm ? showDeterminationForm ? <DeterminationFormContainer submissionID={submissionID} determinationId={currentDetermination}/> :<CurrentSubmissionDisplay /> : <ReviewFormContainer submissionID={submissionID} reviewId={currentReview}/>}  
             </Tab>,
             ...tabs
         ]
     }
- 
     return (
         showReviewForm ? <ReviewFormContainer submissionID={submissionID} reviewId={currentReview}/>  :
+        showDeterminationForm ? <DeterminationFormContainer submissionID={submissionID} determinationId={currentDetermination}/> :
         <div className="display-panel">
 
             { !isMobile && (
@@ -127,14 +132,18 @@ DisplayPanel.propTypes = {
     addMessage: PropTypes.func,
     draftNote: PropTypes.object,
     showReviewForm: PropTypes.bool,
-    currentReview: PropTypes.number
+    currentReview: PropTypes.number,
+    currentDetermination: PropTypes.number,
+    showDeterminationForm: PropTypes.bool
 }
 
 const mapStateToProps = (state, ownProps) => ({
     submissionID: getCurrentSubmissionID(state),
     submission: getCurrentSubmission(state),
     showReviewForm: getReviewButtonStatus(state),
+    showDeterminationForm: getDeterminationButtonStatus(state),
     currentReview: getCurrentReview(state),
+    currentDetermination: getCurrentDetermination(state),
     draftNote: getDraftNoteForSubmission(getCurrentSubmissionID(state))(state),
 })
 
diff --git a/hypha/static_src/src/app/src/redux/actions/submissions.js b/hypha/static_src/src/app/src/redux/actions/submissions.js
index 9b2f2d4ac..919c442f3 100644
--- a/hypha/static_src/src/app/src/redux/actions/submissions.js
+++ b/hypha/static_src/src/app/src/redux/actions/submissions.js
@@ -67,7 +67,41 @@ export const TOGGLE_REVIEW_FORM = 'TOGGLE_REVIEW_FORM';
 export const SET_CURRENT_REVIEW = 'SET_CURRENT_REVIEW';
 export const CLEAR_CURRENT_REVIEW = 'CLEAR_CURRENT_REVIEW';
 export const FETCH_REVIEW_DRAFT = 'FETCH_REVIEW_DRAFT';
-export const CLEAR_REVIEW_DRAFT = 'CLEAR_REVIEW_DRAFT'
+export const CLEAR_REVIEW_DRAFT = 'CLEAR_REVIEW_DRAFT';
+
+// Determination
+export const TOGGLE_DETERMINATION_FORM = 'TOGGLE_DETERMINATION_FORM';
+export const SET_CURRENT_DETERMINATION = 'SET_CURRENT_DETERMINATION';
+export const CLEAR_CURRENT_DETERMINATION = 'CLEAR_CURRENT_DETERMINATION';
+export const FETCH_DETERMINATION_DRAFT = 'FETCH_DETERMINATION_DRAFT';
+export const CLEAR_DETERMINATION_DRAFT = 'CLEAR_DETERMINATION_DRAFT';
+
+
+export const fetchDeterminationDraft = (submissionID) => ({
+    [CALL_API]: {
+        types: [ START_LOADING_SUBMISSION, FETCH_DETERMINATION_DRAFT, FAIL_LOADING_SUBMISSION],
+        endpoint: api.fetchDeterminationDraft(submissionID),
+    },
+    submissionID,
+})
+
+export const clearDeterminationDraftAction = () => ({
+    type: CLEAR_DETERMINATION_DRAFT,
+});
+
+export const toggleDeterminationFormAction = (status) =>({
+    type : TOGGLE_DETERMINATION_FORM,
+    status
+});
+
+export const setCurrentDeterminationAction = (determinationId) =>({
+    type : SET_CURRENT_DETERMINATION,
+    determinationId
+});
+
+export const clearCurrentDeterminationAction = () => ({
+    type: CLEAR_CURRENT_DETERMINATION,
+});
 
 export const fetchReviewDraft = (submissionID) => ({
     [CALL_API]: {
@@ -159,6 +193,9 @@ export const setCurrentSubmission = id => (dispatch, getState) => {
     dispatch(toggleReviewFormAction(false))
     dispatch(clearCurrentReviewAction())
     dispatch(clearReviewDraftAction())
+    dispatch(toggleDeterminationFormAction(false))
+    dispatch(clearCurrentDeterminationAction())
+    dispatch(clearDeterminationDraftAction())
     dispatch(setSubmissionParam(id));
 
     return dispatch({
@@ -298,7 +335,8 @@ export const loadCurrentSubmission = (requiredFields=[], { bypassCache = false }
         return null
     }
     dispatch(fetchSubmission(submissionID))
-    return dispatch(fetchReviewDraft(submissionID))
+    dispatch(fetchReviewDraft(submissionID))
+    return dispatch(fetchDeterminationDraft(submissionID))
 }
 
 
diff --git a/hypha/static_src/src/app/src/redux/reducers/submissions.js b/hypha/static_src/src/app/src/redux/reducers/submissions.js
index 116f6435b..7d86158d3 100644
--- a/hypha/static_src/src/app/src/redux/reducers/submissions.js
+++ b/hypha/static_src/src/app/src/redux/reducers/submissions.js
@@ -14,7 +14,14 @@ import {
     SET_CURRENT_REVIEW,
     CLEAR_CURRENT_REVIEW,
     FETCH_REVIEW_DRAFT,
-    CLEAR_REVIEW_DRAFT
+    CLEAR_REVIEW_DRAFT,
+    TOGGLE_DETERMINATION_FORM,
+    SET_CURRENT_DETERMINATION,
+    CLEAR_CURRENT_DETERMINATION,
+    FETCH_DETERMINATION_DRAFT,
+    CLEAR_DETERMINATION_DRAFT,
+    DETERMINATION_OUTCOME,
+    CLEAR_DETERMINATION_OUTCOME
 } from '@actions/submissions';
 
 import { CREATE_NOTE, UPDATE_NOTES, UPDATE_NOTE } from '@actions/notes'
@@ -35,7 +42,6 @@ function submission(state={comments: []}, action) {
                 isErrored: true,
             };
         case UPDATE_SUBMISSION:
-        
             return {
                 ...state,
                 ...action.data,
@@ -168,14 +174,48 @@ function isReviewDraftExist(state = false, action) {
     }
 }
 
+function toggleDeterminationForm(state= false, action){
+    switch(action.type){
+        case TOGGLE_DETERMINATION_FORM:
+            return action.status
+        default:
+            return state
+    }
+}
+
+function currentDetermination(state = null, action) {
+    switch(action.type) {
+        case SET_CURRENT_DETERMINATION:
+            return action.determinationId;
+        case CLEAR_CURRENT_DETERMINATION:
+            return null;
+        default:
+            return state;
+    }
+}
+
+function isDeterminationDraftExist(state = false, action) {
+    switch(action.type) {
+        case FETCH_DETERMINATION_DRAFT:
+            return action.data.isDraft ? true : false;
+        case CLEAR_DETERMINATION_DRAFT:
+            return false;
+        default:
+            return state;
+    }
+}
+
 
 
 const submissions = combineReducers({
     byID: submissionsByID,
     current: currentSubmission,
     showReviewForm : toggleReviewForm,
-    currentReview: currentReview,
-    isReviewDraftExist: isReviewDraftExist
+    currentReview,
+    isReviewDraftExist,
+    showDeterminationForm: toggleDeterminationForm,
+    currentDetermination,
+    isDeterminationDraftExist,
 });
 
 export default submissions;
diff --git a/hypha/static_src/src/app/src/redux/selectors/submissions.js b/hypha/static_src/src/app/src/redux/selectors/submissions.js
index 940b3702c..5bcb0d6f9 100644
--- a/hypha/static_src/src/app/src/redux/selectors/submissions.js
+++ b/hypha/static_src/src/app/src/redux/selectors/submissions.js
@@ -18,6 +18,12 @@ const getCurrentReview = state => state.submissions.currentReview;
 
 const getReviewDraftStatus = state => state.submissions.isReviewDraftExist;
 
+const getDeterminationButtonStatus = state => state.submissions.showDeterminationForm;
+
+const getCurrentDetermination = state => state.submissions.currentDetermination;
+
+const getDeterminationDraftStatus = state => state.submissions.isDeterminationDraftExist;
+
 
 const getCurrentRoundSubmissions = createSelector(
     [ getCurrentRoundSubmissionIDs, getSubmissions],
@@ -61,6 +67,9 @@ export {
     getReviewButtonStatus,
     getCurrentReview,
     getReviewDraftStatus,
+    getDeterminationButtonStatus,
+    getCurrentDetermination,
+    getDeterminationDraftStatus,
     getSubmissionsByRoundError,
     getSubmissionsByRoundLoadingState,
     getSubmissionLoadingState,
diff --git a/hypha/static_src/src/app/src/redux/store.js b/hypha/static_src/src/app/src/redux/store.js
index e62869fc8..41f507424 100644
--- a/hypha/static_src/src/app/src/redux/store.js
+++ b/hypha/static_src/src/app/src/redux/store.js
@@ -18,9 +18,9 @@ const MIDDLEWARE = [
     sagaMiddleware
 ];
 
-if (process.env.NODE_ENV === 'development') {
-    MIDDLEWARE.push(logger);
-}
+// if (process.env.NODE_ENV === 'development') {
+//     MIDDLEWARE.push(logger);
+// }
 
 
 export default initialState => {
-- 
GitLab