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