Handle project form submission
authorMichal Klobukowski <michal.klobukowski@contractors.roche.com>
Tue, 10 Jul 2018 11:22:24 +0000 (13:22 +0200)
committerMichal Klobukowski <michal.klobukowski@contractors.roche.com>
Tue, 10 Jul 2018 11:22:24 +0000 (13:22 +0200)
Feature #13694

Arvados-DCO-1.1-Signed-off-by: Michal Klobukowski <michal.klobukowski@contractors.roche.com>

src/store/project/project-action.ts
src/store/project/project-reducer.ts
src/views-components/create-project-dialog/create-project-dialog.tsx
src/views-components/dialog-create/dialog-project-create.tsx

index 184922e3ecde97900cb0e694a4b193639c02e1bb..c1a002f98a760d109c03bdbd022eeb36b7a94a10 100644 (file)
@@ -9,9 +9,10 @@ import { Dispatch } from "redux";
 import { getResourceKind } from "../../models/resource";
 import FilterBuilder from "../../common/api/filter-builder";
 import { ThunkAction } from "../../../node_modules/redux-thunk";
+import { RootState } from "../store";
 
 const actions = unionize({
-    OPEN_PROJECT_CREATOR: ofType<{ownerUuid: string}>(),
+    OPEN_PROJECT_CREATOR: ofType<{ ownerUuid: string }>(),
     CLOSE_PROJECT_CREATOR: ofType<{}>(),
     CREATE_PROJECT: ofType<Partial<ProjectResource>>(),
     CREATE_PROJECT_SUCCESS: ofType<ProjectResource>(),
@@ -44,10 +45,12 @@ export const getProjectList = (parentUuid: string = '') => (dispatch: Dispatch)
 };
 
 export const createProject = (project: Partial<ProjectResource>) =>
-    (dispatch: Dispatch) => {
-        dispatch(actions.CREATE_PROJECT(project));
+    (dispatch: Dispatch, getState: () => RootState) => {
+        const { ownerUuid } = getState().projects.creator;
+        const projectData = { ownerUuid, ...project };
+        dispatch(actions.CREATE_PROJECT(projectData));
         return projectService
-            .create(project)
+            .create(projectData)
             .then(project => dispatch(actions.CREATE_PROJECT_SUCCESS(project)))
             .catch(() => dispatch(actions.CREATE_PROJECT_ERROR("Could not create a project")));
     };
index 2c1ab81eb50bb4cc3f138eb4cc98badbee5275da..8ee9e9f916be5e95792d4fc7119b13e7b803cee3 100644 (file)
@@ -115,7 +115,7 @@ const projectsReducer = (state: ProjectState = initialState, action: ProjectActi
     return actions.match(action, {
         OPEN_PROJECT_CREATOR: ({ ownerUuid }) => updateCreator(state, { ownerUuid, opened: true, pending: false }),
         CLOSE_PROJECT_CREATOR: () => updateCreator(state, { opened: false }),
-        CREATE_PROJECT: () => updateCreator(state, { pending: true }),
+        CREATE_PROJECT: () => updateCreator(state, { opened: false, pending: true }),
         CREATE_PROJECT_SUCCESS: () => updateCreator(state, { ownerUuid: "", pending: false }),
         CREATE_PROJECT_ERROR: () => updateCreator(state, { ownerUuid: "", pending: false }),
         REMOVE_PROJECT: () => state,
index c7a7852d41d0e5080d9ac418c1a031d586dad5be..c1d4e06324cfbfd8d1f86fd2384bd6ad41f51745 100644 (file)
@@ -6,7 +6,7 @@ import { connect } from "react-redux";
 import { Dispatch } from "../../../node_modules/redux";
 import { RootState } from "../../store/store";
 import DialogProjectCreate from "../dialog-create/dialog-project-create";
-import actions from "../../store/project/project-action";
+import actions, { createProject } from "../../store/project/project-action";
 
 const mapStateToProps = (state: RootState) => ({
     open: state.projects.creator.opened
@@ -15,6 +15,9 @@ const mapStateToProps = (state: RootState) => ({
 const mapDispatchToProps = (dispatch: Dispatch) => ({
     handleClose: () => {
         dispatch(actions.CLOSE_PROJECT_CREATOR());
+    },
+    onSubmit: (data: { name: string, description: string }) => {
+        dispatch<any>(createProject(data));
     }
 });
 
index 475f83714d53db86307fde45656d0ed5f41c28dd..ef07ea2f4a7d8608bbd2aa523018dca88c8033d8 100644 (file)
@@ -15,6 +15,7 @@ import Validator from '../../utils/dialog-validator';
 interface ProjectCreateProps {
   open: boolean;
   handleClose: () => void;
+  onSubmit: (data: { name: string, description: string }) => void;
 }
 
 interface DialogState {
@@ -72,13 +73,20 @@ class DialogProjectCreate extends React.Component<ProjectCreateProps & WithStyle
           </DialogContent>
           <DialogActions>
             <Button onClick={handleClose} className={classes.button} color="primary">CANCEL</Button>
-            <Button onClick={handleClose} className={classes.lastButton} color="primary" disabled={!this.state.isNameValid || (!this.state.isDescriptionValid && description.length > 0)} variant="raised">CREATE A PROJECT</Button>
+            <Button onClick={this.handleSubmit} className={classes.lastButton} color="primary" disabled={!this.state.isNameValid || (!this.state.isDescriptionValid && description.length > 0)} variant="raised">CREATE A PROJECT</Button>
           </DialogActions>
         </div>
       </Dialog>
     );
   }
 
+  handleSubmit = () => {
+    this.props.onSubmit({
+      name: this.state.name,
+      description: this.state.description
+    });
+  }
+
   handleProjectName(e: any) {
     this.setState({
       name: e.target.value,