From 37dc8e22eebaf0d0ef5aa4932e43c23fc29addb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Chif=20Gerg=C5=91?= <chifgeri97@gmail.com> Date: Sat, 26 Jan 2019 14:56:09 +0100 Subject: [PATCH] Create delete action for notes, create modal for display notes --- src/actions/auth.js | 3 +- src/actions/notes.js | 19 ++++++++ src/actions/types.js | 1 + src/components/pages/CommentModal.js | 58 +++++++++++++++++++++++++ src/components/pages/EventDetail.js | 18 +++++++- src/components/pages/TraineeTableRow.js | 22 ++-------- src/reducers/NoteReducer.js | 4 ++ 7 files changed, 104 insertions(+), 21 deletions(-) create mode 100644 src/components/pages/CommentModal.js diff --git a/src/actions/auth.js b/src/actions/auth.js index ac0e9e5..a480dba 100644 --- a/src/actions/auth.js +++ b/src/actions/auth.js @@ -9,6 +9,7 @@ export const getUserData = () => ( const { id, join_date: joinDate, + full_name: fullName, nick, motivation_about: motivationAbout, motivation_profession: motivationProfession, @@ -36,7 +37,7 @@ export const getUserData = () => ( dispatch({ type: GET_USERDATA, payload: { - id, joinDate, nick, motivationAbout, motivationProfession, motivationExercise, signed, groups, role, permission + id, fullName, joinDate, nick, motivationAbout, motivationProfession, motivationExercise, signed, groups, role, permission }, }); } catch (e) { diff --git a/src/actions/notes.js b/src/actions/notes.js index 52074a9..4737c1f 100644 --- a/src/actions/notes.js +++ b/src/actions/notes.js @@ -4,6 +4,7 @@ import { WRITE_NOTE, ADD_EVENT_NOTE, CLEAR_WRITE, + DELETE_NOTE, } from './types'; export const getNotesByEvent = id => ( @@ -49,3 +50,21 @@ export const clearWrite = () => ( dispatch({ type: CLEAR_WRITE }); } ); + +export const deleteNote = note => ( + async (dispatch) => { + try { + const response = await axios.delete(`/api/v1/notes/${note.id}/`); + if (!response.data.id) { + alert('Sikeres tĂśrlĂŠs!'); + dispatch({ + type: DELETE_NOTE, + payload: note, + }); + } else { + alert('A tĂśrlĂŠs nem sikerĂźlt!'); + } + } catch (e) { + console.log(e); + } + }); diff --git a/src/actions/types.js b/src/actions/types.js index 71b7226..7624ef9 100644 --- a/src/actions/types.js +++ b/src/actions/types.js @@ -27,6 +27,7 @@ export const DELETE_EVENT = 'delete_event'; export const WRITE_NOTE = 'write_note'; export const CLEAR_NOTE = 'clear_note'; export const ADD_EVENT_NOTE = 'add_note'; +export const DELETE_NOTE = 'delete_note'; export const GET_PROFILES = 'get_profiles'; export const SET_STATUS = 'set_status'; diff --git a/src/components/pages/CommentModal.js b/src/components/pages/CommentModal.js new file mode 100644 index 0000000..eeba0fe --- /dev/null +++ b/src/components/pages/CommentModal.js @@ -0,0 +1,58 @@ +import React, { Component } from 'react'; +import { connect } from 'react-redux'; +import { Button, Comment, Modal } from 'semantic-ui-react'; +import { deleteNote } from '../../actions/notes'; +import ConfirmModal from '../forms/ConfirmModal'; + +class CommentModal extends Component { + renderComments() { + const { notes, user } = this.props; + return notes.map((note) => { + return ( + <Comment key={note.id}> + <Comment.Content> + <Comment.Author>{note.created_by_name}</Comment.Author> + <Comment.Text> + {note.note} + </Comment.Text> + { note.created_by_name === user.fullName ? + <ConfirmModal + text='tĂśrĂślni akarod a megjegyzĂŠst' + button={ + <Button + compact + color='red' + size='mini' + > + Delete + </Button> + } + onAccept={() => this.props.deleteNote(note)} + /> + : + null } + </Comment.Content> + </Comment> + ); + }); + } + render() { + return ( + <Modal + closeIcon + trigger={ + <Button icon='comment alternate outline' /> + } + > + <Modal.Header>MegjegyzĂŠsek:</Modal.Header> + <Modal.Content> + {this.renderComments()} + </Modal.Content> + </Modal> + ); + } +} + +const mapStateToProps = ({ user }) => ({ user }); + +export default connect(mapStateToProps, { deleteNote })(CommentModal); diff --git a/src/components/pages/EventDetail.js b/src/components/pages/EventDetail.js index 41b2b7c..e058b6f 100644 --- a/src/components/pages/EventDetail.js +++ b/src/components/pages/EventDetail.js @@ -11,9 +11,9 @@ import { import { connect } from 'react-redux'; import moment from 'moment'; import { getEventById, getTrainees, visitorChange, submitVisitors } from '../../actions/statistics'; -import { getNotesByEvent, writeNote, clearWrite, postEventNote } from '../../actions/notes'; +import { getNotesByEvent, writeNote, clearWrite, postEventNote, deleteNote } from '../../actions/notes'; import TraineeTableRow from './TraineeTableRow'; - +import ConfirmModal from '../forms/ConfirmModal'; class EventDetail extends Component { constructor(props) { @@ -74,6 +74,19 @@ class EventDetail extends Component { {note.note} </Comment.Text> </Comment.Content> + <ConfirmModal + text='tĂśrĂślni akarod a megjegyzĂŠst' + button={ + <Button + compact + color='red' + size='mini' + > + Delete + </Button> + } + onAccept={() => this.props.deleteNote(note)} + /> </Comment>); } return ''; @@ -177,4 +190,5 @@ export default connect(mapStateToProps, { writeNote, clearWrite, postEventNote, + deleteNote, })(EventDetail); diff --git a/src/components/pages/TraineeTableRow.js b/src/components/pages/TraineeTableRow.js index 4e7f2b7..34e58c3 100644 --- a/src/components/pages/TraineeTableRow.js +++ b/src/components/pages/TraineeTableRow.js @@ -10,8 +10,8 @@ import { } from 'semantic-ui-react'; import { connect } from 'react-redux'; import { visitorChange } from '../../actions/statistics'; -import { writeNote, clearWrite, postEventNote } from '../../actions/notes'; - +import { writeNote, clearWrite, postEventNote, deleteNote } from '../../actions/notes'; +import CommentModal from './CommentModal' class TraineeTableRow extends Component { constructor(props) { @@ -94,21 +94,7 @@ class TraineeTableRow extends Component { </Grid.Column> <Grid.Column floated='right' width={4} textAlign='right'> {notes.length > 0 ? - <Popup - on='click' - position='bottom left' - trigger={<Button icon='comment alternate outline' onClick={this.triggerMore} />} - content={notes.map((note) => { - return ( - <Comment.Content> - <Comment.Author>{note.created_by_name}</Comment.Author> - <Comment.Text> - {note.note} - </Comment.Text> - </Comment.Content> - ); - })} - /> + <CommentModal notes={notes} /> : null} <Popup @@ -146,4 +132,4 @@ class TraineeTableRow extends Component { } } -export default connect(() => {}, { writeNote, clearWrite, postEventNote, visitorChange})(TraineeTableRow) +export default connect(() => ({}), { writeNote, clearWrite, postEventNote, visitorChange, deleteNote })(TraineeTableRow) diff --git a/src/reducers/NoteReducer.js b/src/reducers/NoteReducer.js index 90e4c8d..37caf2f 100644 --- a/src/reducers/NoteReducer.js +++ b/src/reducers/NoteReducer.js @@ -3,6 +3,7 @@ import { WRITE_NOTE, ADD_EVENT_NOTE, CLEAR_WRITE, + DELETE_NOTE, } from '../actions/types'; const INITIAL_STATE = { eventNotes: [], actualNote: {} }; @@ -17,6 +18,9 @@ export default (state = INITIAL_STATE, action) => { return { ...state, eventNotes: [...state.eventNotes, action.payload] }; case CLEAR_WRITE: return { ...state, actualNote: { note: '' } }; + case DELETE_NOTE: + state.eventNotes.splice(state.eventNotes.indexOf(action.payload), 1); + return { ...state, eventNotes: [...state.eventNotes] }; default: return state; } -- GitLab