From 5178a7f59c1d11ee641acfd7516a335277072f6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A1na=20Kohanov=C3=A1?= Date: Fri, 20 Nov 2020 07:42:25 +0100 Subject: [PATCH] #454 Store and retrieve project actions in/from the backend --- .../snapshot/redux/dispatchActions.js | 9 ++- js/reducers/tracking/dispatchActions.js | 71 +++++++++++++------ 2 files changed, 57 insertions(+), 23 deletions(-) diff --git a/js/components/snapshot/redux/dispatchActions.js b/js/components/snapshot/redux/dispatchActions.js index bb543bf79..8d5e9d123 100644 --- a/js/components/snapshot/redux/dispatchActions.js +++ b/js/components/snapshot/redux/dispatchActions.js @@ -25,6 +25,10 @@ import { base_url, URLS } from '../../routes/constants'; import { resetCurrentSnapshot, setCurrentSnapshot, setForceCreateProject } from '../../projects/redux/actions'; import { selectFirstMolGroup } from '../../preview/moleculeGroups/redux/dispatchActions'; import { reloadDatasetsReducer } from '../../datasets/redux/actions'; +import { + sendTruckingActionsByProjectId, + appendAndSendTruckingActions +} from '../../../reducers/tracking/dispatchActions'; export const getListOfSnapshots = () => (dispatch, getState) => { const userID = DJANGO_CONTEXT['pk'] || null; @@ -261,6 +265,7 @@ export const activateSnapshotDialog = (loggedInUserID = undefined, finallyShareS }; dispatch(createProjectFromSnapshotDialog(data)) .then(() => { + dispatch(appendAndSendTruckingActions(null)); dispatch(setOpenSnapshotSavingDialog(true)); }) .catch(error => { @@ -268,7 +273,6 @@ export const activateSnapshotDialog = (loggedInUserID = undefined, finallyShareS }); } else if (finallyShareSnapshot === true && loggedInUserID && projectID !== null && currentSnapshotAuthor === null) { dispatch(setForceCreateProject(true)); - dispatch(setOpenSnapshotSavingDialog(true)); } else { dispatch(setOpenSnapshotSavingDialog(true)); @@ -342,6 +346,7 @@ export const saveAndShareSnapshot = (target = undefined) => (dispatch, getState) author: loggedInUserID || null, tags: '[]' }; + dispatch(createProjectWithoutStateModification(data)) .then(projectID => { const username = DJANGO_CONTEXT['username']; @@ -353,6 +358,8 @@ export const saveAndShareSnapshot = (target = undefined) => (dispatch, getState) const parent = null; const session_project = projectID; + dispatch(sendTruckingActionsByProjectId(projectID, author)); + return dispatch( createNewSnapshotWithoutStateModification({ title, description, type, author, parent, session_project }) ); diff --git a/js/reducers/tracking/dispatchActions.js b/js/reducers/tracking/dispatchActions.js index 8d89cc39b..b68f5f56c 100644 --- a/js/reducers/tracking/dispatchActions.js +++ b/js/reducers/tracking/dispatchActions.js @@ -54,7 +54,7 @@ import { import * as listType from '../../constants/listTypes'; import { assignRepresentationToComp } from '../../components/nglView/generatingObjects'; import { deleteObject } from '../../../js/reducers/ngl/dispatchActions'; -import { setSendActionsList, setIsActionsSending, setIsActionsLoading } from './actions'; +import { setSendActionsList, setIsActionsSending, setIsActionsLoading, setActionsList } from './actions'; import { api, METHOD } from '../../../js/utils/api'; import { base_url } from '../../components/routes/constants'; import { CONSTANTS } from '../../../js/constants/constants'; @@ -514,9 +514,8 @@ export const undoAction = (stages = []) => (dispatch, getState) => { actionsLenght = actionsLenght > 0 ? actionsLenght - 1 : actionsLenght; action = actions.truck_actions_list[actionsLenght]; - Promise.resolve(dispatch(handleUndoAction(action, stages))).then(function(response) { + Promise.resolve(dispatch(handleUndoAction(action, stages))).then(() => { dispatch(setIsUndoRedoAction(false)); - return response; }); } }; @@ -533,9 +532,8 @@ export const redoAction = (stages = []) => (dispatch, getState) => { actionsLenght = actionsLenght > 0 ? actionsLenght - 1 : actionsLenght; action = actions.truck_actions_list[actionsLenght]; - Promise.resolve(dispatch(dispatch(handleRedoAction(action, stages)))).then(function(response) { + Promise.resolve(dispatch(dispatch(handleRedoAction(action, stages)))).then(() => { dispatch(setIsUndoRedoAction(false)); - return response; }); } }; @@ -887,18 +885,20 @@ export const getCanRedo = () => (dispatch, getState) => { export const appendAndSendTruckingActions = truckAction => (dispatch, getState) => { const state = getState(); const currentProject = state.projectReducers.currentProject; - const projectID = currentProject && currentProject.projectID; const sendActions = state.trackingReducers.send_actions_list; - Promise.resolve(dispatch(checkActionsProject(sendActions, projectID))).then(response => { - dispatch(appendToActionList(truckAction)); - dispatch(appendToSendActionList(truckAction)); - dispatch(checkSendTruckingActions(truckAction)); - return response; + Promise.resolve(dispatch(checkActionsProject(sendActions, currentProject))).then(response => { + if (truckAction) { + dispatch(appendToActionList(truckAction)); + dispatch(appendToSendActionList(truckAction)); + } + if (response === true) { + dispatch(checkSendTruckingActions()); + } }); }; -const checkSendTruckingActions = truckAction => (dispatch, getState) => { +export const checkSendTruckingActions = () => (dispatch, getState) => { const state = getState(); const currentProject = state.projectReducers.currentProject; const sendActions = state.trackingReducers.send_actions_list; @@ -913,7 +913,7 @@ const sendTruckingActions = (sendActions, project) => (dispatch, getState) => { if (project) { const projectID = project && project.projectID; - if (projectID) { + if (projectID && sendActions && sendActions.length > 0) { dispatch(setIsActionsSending(true)); const dataToSend = { @@ -927,7 +927,7 @@ const sendTruckingActions = (sendActions, project) => (dispatch, getState) => { method: METHOD.POST, data: JSON.stringify(dataToSend) }) - .then(response => { + .then(() => { dispatch(setSendActionsList([])); }) .catch(error => { @@ -947,13 +947,9 @@ const sendTruckingActions = (sendActions, project) => (dispatch, getState) => { export const setProjectTruckingActions = () => (dispatch, getState) => { const state = getState(); const currentProject = state.projectReducers.currentProject; - const sendActions = state.trackingReducers.send_actions_list; const projectID = currentProject && currentProject.projectID; - Promise.resolve(dispatch(checkActionsProject(sendActions, projectID))).then(response => { - dispatch(getTruckingActions(projectID)); - return response; - }); + dispatch(getTruckingActions(projectID)); }; const getTruckingActions = projectID => (dispatch, getState) => { @@ -983,16 +979,33 @@ const getTruckingActions = projectID => (dispatch, getState) => { dispatch(setIsActionsLoading(false)); }); } else { + let projectActions = [...sendActions]; + dispatch(setProjectActionList(projectActions)); return Promise.resolve(); } }; -const checkActionsProject = (actions, currentProjectID) => (dispatch, getState) => { - let project = dispatch(getActionProject(actions, currentProjectID)); +const checkActionsProject = (actions, currentProject) => (dispatch, getState) => { + const state = getState(); + const currentProjectID = currentProject && currentProject.projectID; + const actionList = state.trackingReducers.truck_actions_list; + + let project = dispatch(getActionProject(actionList, currentProjectID)); if (project !== null) { dispatch(sendTruckingActions(actions, project)); + + let newProject = { projectID: currentProject.projectID, authorID: currentProject.authorID }; + let newActionsList = []; + + actionList.forEach(r => { + newActionsList.push(Object.assign({ ...r, project: newProject })); + }); + + dispatch(setActionsList(newActionsList)); + dispatch(sendTruckingActions(newActionsList, currentProject)); + return Promise.resolve(false); } else { - return Promise.resolve(); + return Promise.resolve(true); } }; @@ -1004,3 +1017,17 @@ const getActionProject = (actions, currentProjectID) => (dispatch, getState) => } return project; }; + +export const sendTruckingActionsByProjectId = (projectID, authorID) => (dispatch, getState) => { + const state = getState(); + const actionList = state.trackingReducers.truck_actions_list; + const project = { projectID, authorID }; + + let newActionsList = []; + + actionList.forEach(r => { + newActionsList.push(Object.assign({ ...r, project: project })); + }); + + dispatch(sendTruckingActions(newActionsList, project)); +};