diff --git a/src/actions/homework.js b/src/actions/homework.js index 144ed3cb8d0b19b8b2c03aec2b8fcaf1b9924451..ccd4c8b1461226aa73bf9e6133e5354332d3f266 100644 --- a/src/actions/homework.js +++ b/src/actions/homework.js @@ -4,6 +4,8 @@ import { GET_TASKS, ADD_TASK, DELETE_TASK, WRITE_TASK, + EDIT_TASK, + SELECT_TASK, CLEAR_WRITE, ADD_SOLUTION, WRITE_SOLUTION, @@ -62,6 +64,32 @@ export const addTask = ({ title, text, deadline }) => ( } ); +export const editTask = ({ + id, + title, + text, + deadline, +}) => ( + async (dispatch) => { + try { + const response = await axios.patch(`/api/v1/homework/tasks/${id}/`, { + title, + text, + deadline, + }); + if (response.data.id) { + dispatch({ + type: EDIT_TASK, + payload: response.data, + + }); + } + } catch (e) { + console.log(e); + } + } +); + export const deleteTask = task => ( async (dispatch) => { try { @@ -77,6 +105,12 @@ export const deleteTask = task => ( } }); +export const setSelectedTask = task => ( + (dispatch) => { + dispatch({ type: SELECT_TASK, payload: task }); + } +); + export const addDocument = ({ name, description, file, solution, }) => ( @@ -117,7 +151,7 @@ export const addSolution = ({ note, }); if (response.data.id) { - console.log(response.data.id) + console.log(response.data.id); dispatch({ type: ADD_SOLUTION, payload: response.data, diff --git a/src/actions/types.js b/src/actions/types.js index 029a7155d742a21329302e79fa37793d6d5d753e..9d9ffca6c57401bbf78d6a88ef2424c54fcd324c 100644 --- a/src/actions/types.js +++ b/src/actions/types.js @@ -14,7 +14,9 @@ export const SELECT_NEWS = 'select_news'; export const GET_TASKS = 'get_homeworks'; export const ADD_TASK = 'add_task'; export const DELETE_TASK = 'delete_task'; +export const EDIT_TASK = 'edit_task'; export const WRITE_TASK = 'write_task'; +export const SELECT_TASK = 'select_task'; export const WRITE_SOLUTION = 'write_solution'; export const WRITE_SOLUTION_FILE = 'write_solution_file'; export const WRITE_TASK_DEADLINE = 'write_task_deadline'; diff --git a/src/components/forms/EditTaskForm.js b/src/components/forms/EditTaskForm.js new file mode 100644 index 0000000000000000000000000000000000000000..c1592f6e01fe5dcb81726a4bfcaebc040783428e --- /dev/null +++ b/src/components/forms/EditTaskForm.js @@ -0,0 +1,110 @@ +import React, { Component } from 'react'; +import { Modal, Button, Form, Input, TextArea, Icon } from 'semantic-ui-react'; +import { connect } from 'react-redux'; +import { DateTimeInput } from 'semantic-ui-calendar-react'; +import { writeTask, writeTaskDeadline, editTask, clearWrite } from '../../actions/homework'; + +class EditTaskForm extends Component { + constructor(props) { + super(props); + this.state = { + showModal: false, + }; + } + + render() { + const { + id, + title, + text, + deadline, + } = this.props.selectedTask; + return ( + <Modal + open={this.state.showModal} + onOpen={this.props.onClick} + trigger={ + <Button + inverted + style={{ marginRight: '2em' }} + color='orange' + onClick={() => { this.setState({ showModal: true }); }} + > + <Icon name='edit' /> MĂłdosĂtĂĄs + </Button> + } + > + <Modal.Header>A {title} nevĹą feladat mĂłdosĂtĂĄsa:</Modal.Header> + <Modal.Content> + <Form> + <Form.Field + control={Input} + label='CĂm:' + name='title' + onChange={e => this.props.writeTask(e)} + value={title} + placeholder='Add meg a feladat cĂmĂŠt.' + /> + <Form.Field + control={TextArea} + label='LeĂrĂĄs:' + name='text' + onChange={e => this.props.writeTask(e)} + value={text} + placeholder='Add meg a feladat leĂrĂĄsĂĄt...' + /> + <Form.Field + control={DateTimeInput} + label='BeadĂĄsi hatĂĄridĹ:' + name='deadline' + placeholder='BeadĂĄsi hatĂĄridĹ' + iconPosition='left' + dateTimeFormat='YYYY-MM-DDTHH:mm' + onChange={(e, { name, value }) => { + this.props.writeTaskDeadline({ name, value }); + }} + value={deadline} + /> + </Form> + </Modal.Content> + <Modal.Actions> + <Button + inverted + color='red' + onClick={() => { + this.setState({ showModal: false }); + this.props.clearWrite(); + }} + > + <Icon name='remove' /> MĂŠgse + </Button> + <Button + inverted + color='green' + onClick={() => { + this.props.editTask({ + id, + title, + text, + deadline, + }); + this.setState({ showModal: false }); + this.props.clearWrite(); + }} + > + <Icon name='checkmark' /> MĂłdosĂtĂĄs + </Button> + </Modal.Actions> + </Modal> + ); + } +} + +const mapStateToProps = ({ selectedTask, user }) => ({ selectedTask, user }); + +export default connect(mapStateToProps, { + writeTask, + writeTaskDeadline, + editTask, + clearWrite, +})(EditTaskForm); diff --git a/src/components/pages/Homework.js b/src/components/pages/Homework.js index 57ca4ebaa7cf6c14fc18448d94d7437f53370bc3..3d889ca0ec5e62f810e736405a6f6b7ba3fd630f 100644 --- a/src/components/pages/Homework.js +++ b/src/components/pages/Homework.js @@ -10,10 +10,20 @@ import { } from 'semantic-ui-react'; import { connect } from 'react-redux'; import moment from 'moment'; -import { getTasks, getSolutions, addTask, deleteTask, addDocument, getProfiles, getDocuments } from '../../actions/homework'; +import { + getTasks, + getSolutions, + addTask, + setSelectedTask, + deleteTask, + addDocument, + getProfiles, + getDocuments, +} from '../../actions/homework'; import AddTaskForm from '../forms/AddTaskForm'; import AddSolutionForm from '../forms/AddSolutionForm'; import SolutionDetailsForm from '../forms/SolutionDetailsForm'; +import EditTaskForm from '../forms/EditTaskForm'; import ConfirmModal from '../forms/ConfirmModal'; const displayTypes = { @@ -150,6 +160,7 @@ class Homework extends Component { {moment(task.deadline).format('YYYY. MM. DD. HH:mm')} </Table.Cell> <Table.Cell> + <EditTaskForm onClick={() => this.props.setSelectedTask(task)} /> <ConfirmModal button={deleteButton} text='tĂśrlĂśd a kivĂĄlaszott feladatot a mĂĄr beadott megoldĂĄsokkal egyĂźtt' @@ -303,12 +314,13 @@ class Homework extends Component { } } -const mapStateToProps = ({ homeworks, user }) => ({ homeworks, user }); +const mapStateToProps = ({ selectedTask, homeworks, user }) => ({ selectedTask, homeworks, user }); export default connect( mapStateToProps, { getTasks, + setSelectedTask, getSolutions, addTask, deleteTask, diff --git a/src/reducers/EditTaskReducer.js b/src/reducers/EditTaskReducer.js new file mode 100644 index 0000000000000000000000000000000000000000..0dc50e0b3cb23b8225c9a99a2d6c056f74b58bbf --- /dev/null +++ b/src/reducers/EditTaskReducer.js @@ -0,0 +1,18 @@ +import { SELECT_TASK, WRITE_TASK, WRITE_TASK_DEADLINE, CLEAR_WRITE } from '../actions/types'; + +const INITIAL_STATE = { }; + +export default (state = INITIAL_STATE, action) => { + switch (action.type) { + case SELECT_TASK: + return action.payload; + case WRITE_TASK: + return { ...state, [action.target]: action.payload }; + case WRITE_TASK_DEADLINE: + return { ...state, [action.target]: action.payload }; + case CLEAR_WRITE: + return INITIAL_STATE; + default: + return state; + } +}; diff --git a/src/reducers/HomeworksReducer.js b/src/reducers/HomeworksReducer.js index 05262e3476c71d3550ba9a07fe84b4f38469b6a3..fa60aee79c8a321ca58f0f869afb330d18613879 100644 --- a/src/reducers/HomeworksReducer.js +++ b/src/reducers/HomeworksReducer.js @@ -1,4 +1,11 @@ -import { GET_TASKS, GET_SOLUTIONS, ADD_TASK, DELETE_TASK, ADD_SOLUTION, GET_PROFILES, GET_DOCUMENTS } from '../actions/types'; +import { GET_TASKS, + GET_SOLUTIONS, + ADD_TASK, + DELETE_TASK, + EDIT_TASK, + ADD_SOLUTION, + GET_PROFILES, + GET_DOCUMENTS } from '../actions/types'; const INITIAL_STATE = { id: 0, @@ -25,6 +32,17 @@ export default (state = INITIAL_STATE, action) => { tasks: [...state.tasks.slice(0, state.tasks.indexOf(action.payload)), ...state.tasks.slice(state.tasks.indexOf(action.payload) + 1)], }; + case EDIT_TASK: + return { + ...state, + tasks: [...state.tasks.map((task) => { + if (task.id !== action.payload.id) { + return task; + } + return action.payload; + }), + ], + }; case GET_PROFILES: return { ...state, profiles: action.payload }; case GET_DOCUMENTS: diff --git a/src/reducers/index.js b/src/reducers/index.js index ff180a9621c82082581a81d33d9cb7625e74ac67..2464c572a060e17e375effcb11717ebbc430f479 100644 --- a/src/reducers/index.js +++ b/src/reducers/index.js @@ -10,6 +10,7 @@ import EventReducer from './EventReducer'; import TraineeReducer from './TraineeReducer'; import NoteReducer from './NoteReducer'; import CorrectSolutionReducer from './CorrectSolutionReducer'; +import EditTaskReducer from './EditTaskReducer'; const rootReducer = combineReducers({ user: UserReducer, @@ -19,6 +20,7 @@ const rootReducer = combineReducers({ homeworks: HomeworksReducer, correction: CorrectSolutionReducer, newTask: AddTaskReducer, + selectedTask: EditTaskReducer, newSolution: AddSolutionReducer, events: EventReducer, trainees: TraineeReducer,