diff --git a/src/actions/auth.js b/src/actions/auth.js index ac0e9e51764333deae7eacf7741ad0510b9bc3f9..a480dba7a94dc0b614d822fb046b9d84a2f2ca3e 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 04362abded024bf05f5e633f1948309eca9e4ca6..4737c1f411186ebe3133de36ea78a62f3c2f311e 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 => ( @@ -29,7 +30,7 @@ export const postEventNote = ({ eventid, userid, note }) => ( try { const response = await axios.post('/api/v1/notes/', { event: eventid ? eventid : '', - profile: userid ? eventid : '', + profile: userid ? userid : '', note, }); if (response.data.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/statistics.js b/src/actions/statistics.js index ce574c26e099bad3df53766b86381527f2528699..1f92b1e2e54fe6001ef4d8722dc34e18136a9acb 100644 --- a/src/actions/statistics.js +++ b/src/actions/statistics.js @@ -12,6 +12,9 @@ import { SET_STATUS, ABSENT_CHANGE, CHANGE_NO, + EDIT_EVENT, + WRITE_EDITED_EVENT, + SELECT_EVENT_FOR_EDIT, } from './types'; export const getStaffEvents = () => ( @@ -59,7 +62,7 @@ export const getEventById = id => ( export const getTrainees = () => ( async (dispatch) => { try { - const response = await axios.get('/api/v1/profiles/'); + const response = await axios.get('/api/v1/profiles/', { params: { role: 'Student' } }); dispatch({ type: GET_TRAINEES, payload: response.data, @@ -82,12 +85,16 @@ export const visitorChange = ({ id, value }) => { } }; -export const submitVisitors = ({ id, visitors }) => ( +export const submitVisitors = ({ id, visitors, absent }) => ( async () => { try { const response = await axios.patch(`/api/v1/staff_events/${id}/`, { - visitors + visitors, + absent, }); + if (response.data.id) { + alert('Sikeres mentĂŠs!'); + } } catch (e) { console.log(e); } @@ -100,10 +107,39 @@ export const writeEvent = ({ target: { name, value } }) => ( } ); +export const selectEventForEdit = editEvent => ( + (dispatch) => { + dispatch({ type: SELECT_EVENT_FOR_EDIT, payload: editEvent }); + } +); -export const eventDate = (name, value) => ( +export const writeEditEvent = ({ target: { name, value } }) => ( (dispatch) => { - dispatch({ type: WRITE_EVENT, payload: value, target: name }); + dispatch({ type: WRITE_EDITED_EVENT, payload: value, target: name }); + } +); + +export const editEvent = ({ id, name, description, date }) => ( + async (dispatch) => { + try { + const response = await axios.patch(`/api/v1/staff_events/${id}/`, { + name, + description, + date, + }); + if (response.data.id) { + alert('Sikeres mentĂŠs!'); + dispatch({ + type: EDIT_EVENT, + payload: response.data, + + }); + } else { + alert('MentĂŠs nem sikerĂźlt!'); + } + } catch (e) { + console.log(e); + } } ); diff --git a/src/actions/types.js b/src/actions/types.js index 5f0f6047717975390343ad5ecd701dfa5227d68e..024a17f0450bc8cdca9fca7506ea6ce0d0efa8d9 100644 --- a/src/actions/types.js +++ b/src/actions/types.js @@ -21,12 +21,16 @@ export const CHANGE_NO = 'change_no'; export const GET_NOTES_BY_EVENT = 'get_notes_by_event'; export const WRITE_EVENT = 'write_event'; +export const WRITE_EDITED_EVENT = 'write_selected_event'; export const ADD_EVENT = 'add_event'; +export const SELECT_EVENT_FOR_EDIT = 'select_event_for_edit'; +export const EDIT_EVENT = 'edit_event'; 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/forms/AddEventForm.js b/src/components/forms/AddEventForm.js index a9dd5d98df4a8e3e717b8ef2003caddc05a3fd46..22b4016f42da3e2bdc3cc8609bf7f41939f83fe0 100644 --- a/src/components/forms/AddEventForm.js +++ b/src/components/forms/AddEventForm.js @@ -1,8 +1,8 @@ import React, { Component } from 'react'; -import { Modal, Button, Form, Input, TextArea, Icon } from 'semantic-ui-react'; +import { Modal, Button, Form, Input, Icon } from 'semantic-ui-react'; import { connect } from 'react-redux'; import { DateTimeInput } from 'semantic-ui-calendar-react'; -import { writeEvent, eventDate, addEvent } from '../../actions/statistics' +import { writeEvent, addEvent } from '../../actions/statistics' import { clearWrite } from '../../actions/news' class AddEventForm extends Component { @@ -21,7 +21,7 @@ class AddEventForm extends Component { if (this.state.hasOwnProperty(name)) { this.setState({ [name]: value }); } - this.props.eventDate(name, value) + this.props.writeEvent({ target: {name, value} }); } render() { @@ -53,7 +53,7 @@ class AddEventForm extends Component { style={{ marginBottom: '20px', }} - placeholder='Title' + placeholder='NĂŠv' /> <Form.TextArea name='description' @@ -66,8 +66,8 @@ class AddEventForm extends Component { name="date" label="DĂĄtum:" dateFormat='YYYY-MM-DD' - placeholder="Date" - value={this.state.date} + placeholder="DĂĄtum" + value={date} iconPosition="left" onChange={this.handleChange} /> @@ -81,7 +81,7 @@ class AddEventForm extends Component { this.props.clearWrite();}} > <Icon name='remove' /> - Cancel + MĂŠgse </Button> <Button inverted @@ -89,9 +89,10 @@ class AddEventForm extends Component { onClick={() => { this.props.addEvent(this.props.newEvent); this.setState({ showModal: false, date: '' }); + this.props.clearWrite(); }} > - <Icon name='checkmark' /> Add + <Icon name='checkmark' /> HozzĂĄad </Button> </Modal.Actions> </Modal> @@ -101,4 +102,4 @@ class AddEventForm extends Component { const mapStateToProps = ({ events: { newEvent } }) => ({ newEvent }); -export default connect(mapStateToProps, { writeEvent, addEvent, eventDate, clearWrite })(AddEventForm); +export default connect(mapStateToProps, { writeEvent, addEvent, clearWrite })(AddEventForm); diff --git a/src/components/forms/AddNewsForm.js b/src/components/forms/AddNewsForm.js index 0a1103249b65a530a58aa6f899a60a736d7ace9a..24deefa957e9f4cd515baca9deeb28b26a5a3be7 100644 --- a/src/components/forms/AddNewsForm.js +++ b/src/components/forms/AddNewsForm.js @@ -31,19 +31,19 @@ class AddNewsForm extends Component { <Form> <Form.Field control={Input} - label='Title' + label='CĂm' name='title' onChange={e => this.props.writeNews(e)} value={title} - placeholder='Title' + placeholder='CĂm' /> <Form.Field control={TextArea} - label='Text' + label='SzĂśveg' name='text' onChange={e => this.props.writeNews(e)} value={text} - placeholder='Tell us what you want...' + placeholder='SzĂśveg' /> </Form> </Modal.Content> @@ -54,7 +54,7 @@ class AddNewsForm extends Component { onClick={() => { this.setState({ showModal: false }); }} > <Icon name='remove' /> - Cancel + MĂŠgse </Button> <Button inverted @@ -65,7 +65,7 @@ class AddNewsForm extends Component { this.props.clearWrite(); }} > - <Icon name='checkmark' /> Add + <Icon name='checkmark' /> HozzĂĄad </Button> </Modal.Actions> </Modal> diff --git a/src/components/forms/ConfirmModal.js b/src/components/forms/ConfirmModal.js index 586d624b7caceb695bbb8154e553e29b0aa03b00..4e196ff1d2703afa7f82e5a6a60d8ce5f43032ba 100644 --- a/src/components/forms/ConfirmModal.js +++ b/src/components/forms/ConfirmModal.js @@ -26,7 +26,7 @@ class ConfirmModal extends Component { size='small' basic > - <Header icon='question' content='Confirm' /> + <Header icon='question' content='MegerĹsĂtĂŠs' /> <Modal.Content> <p> Biztos hogy {text}? @@ -37,10 +37,9 @@ class ConfirmModal extends Component { basic color='red' inverted - inverted onClick={() => this.close()} > - <Icon name='remove' /> No + <Icon name='remove' /> Nem </Button> <Button color='green' @@ -50,7 +49,7 @@ class ConfirmModal extends Component { } } > - <Icon name='checkmark' /> Yes + <Icon name='checkmark' /> Igen </Button> </Modal.Actions> </Modal> diff --git a/src/components/forms/EditEventForm.js b/src/components/forms/EditEventForm.js new file mode 100644 index 0000000000000000000000000000000000000000..fd50446b7a47901767cb89964d956fe6ef19874e --- /dev/null +++ b/src/components/forms/EditEventForm.js @@ -0,0 +1,112 @@ +import React, { Component } from 'react'; +import { Modal, Button, Form, Input, Icon } from 'semantic-ui-react'; +import { connect } from 'react-redux'; +import moment from 'moment'; +import { DateTimeInput } from 'semantic-ui-calendar-react'; +import { + writeEditEvent, + editEvent, +} from '../../actions/statistics' +import { clearWrite } from '../../actions/news' + +class EditEventForm extends Component { + constructor(props) { + super(props); + this.state = { + showModal: false, + date: '', + }; + } + + // Handling change in redux action creator throws an exception + // Temporal solotion using the components state to display, instead redux state + handleChange = (event, {name, value}) => { + if (this.state.hasOwnProperty(name)) { + this.setState({ [name]: value }); + } + this.props.writeEditEvent({target: {name: name, value: value}}) + } + + render() { + const { name, date, description } = this.props.editedEvent; + return ( + <Modal + open={this.state.showModal} + trigger={ + <Button + compact + onClick={() => { this.props.onClick(); + this.setState({ showModal: true }); }} + size='mini' + > + Szerkeszt + </Button> + } + > + <Modal.Header>Alkalom szerkesztĂŠse:</Modal.Header> + <Modal.Content + style={{ + paddingTop: '20px', + }} + > + <Form> + <Form.Field + control={Input} + label='NĂŠv' + name='name' + onChange={e => this.props.writeEditEvent(e)} + value={name} + style={{ + marginBottom: '20px', + }} + placeholder='NĂŠv' + /> + <Form.TextArea + name='description' + label='LeĂrĂĄs:' + placeholder='RĂśvid leĂrĂĄs' + value={description} + onChange={e => this.props.writeEditEvent(e)} + /> + <DateTimeInput + name="date" + label="DĂĄtum:" + dateFormat='YYYY-MM-DD' + placeholder="DĂĄtum" + value={moment(date).format('YYYY-MM-DD hh:mm')} + iconPosition="left" + onChange={this.handleChange} + /> + </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.editEvent(this.props.editedEvent); + this.setState({ showModal: false, date: '' }); + this.props.clearWrite(); + }} + > + <Icon name='checkmark' /> Szerkeszt + </Button> + </Modal.Actions> + </Modal> + ); + } +} + +const mapStateToProps = ({ events: { editedEvent } }) => ({ editedEvent }); + +export default connect(mapStateToProps, { writeEditEvent, editEvent, clearWrite })(EditEventForm); diff --git a/src/components/forms/EditNewsForm.js b/src/components/forms/EditNewsForm.js index 7107e8d947e76d4fbbbc69cf448baf3f631b2e42..da1944bf92a0d9a8b75dbfc328f7cf9b8ff76424 100644 --- a/src/components/forms/EditNewsForm.js +++ b/src/components/forms/EditNewsForm.js @@ -25,7 +25,7 @@ class EditNewsForm extends Component { onClick={() => { this.setState({ showModal: true }); }} size='mini' > - Edit + Szerkeszt </Button> } > @@ -34,19 +34,19 @@ class EditNewsForm extends Component { <Form> <Form.Field control={Input} - label='Title' + label='CĂm' name='title' onChange={e => this.props.writeNews(e)} value={title} - placeholder='Title' + placeholder='CĂm' /> <Form.Field control={TextArea} - label='Text' + label='SzĂśveg' name='text' onChange={e => this.props.writeNews(e)} value={text} - placeholder='Tell us what you want...' + placeholder='SzĂśveg' /> </Form> </Modal.Content> @@ -56,7 +56,7 @@ class EditNewsForm extends Component { color='red' onClick={() => { this.setState({ showModal: false }); }} > - <Icon name='remove' /> Cancel + <Icon name='remove' /> MĂŠgse </Button> <Button inverted @@ -69,7 +69,7 @@ class EditNewsForm extends Component { this.props.clearWrite(); }} > - <Icon name='checkmark' /> Edit + <Icon name='checkmark' /> Szerkeszt </Button> </Modal.Actions> </Modal> diff --git a/src/components/pages/Applications.js b/src/components/pages/Applications.js index 6fac3330108f0610c51405e8b85772edbd6aab6c..68e6ce9ca2521880986e17a23f95da35bb155aec 100644 --- a/src/components/pages/Applications.js +++ b/src/components/pages/Applications.js @@ -44,20 +44,24 @@ class Applications extends Component { </Table.Cell> : <Table.Cell textAlign='center'> - <Label color='red'>Nem jelentkezett</Label> + { profile.role === 'Staff' ? + <Label color='blue'>Staff</Label> + : + <Label color='red'>Nem jelentkezett</Label> + } </Table.Cell> } <Table.Cell> - <ConfirmModal - button = {<Button - color='blue' - size='tiny' - > - ADD STAFF STATUS - </Button>} - text='staff jogot adsz neki' - onAccept={() => this.props.setStatus(profile.id, 'Staff')} - /> + <ConfirmModal + button = {<Button + color='blue' + size='tiny' + > + Staff jog adĂĄs + </Button>} + text='staff jogot adsz neki' + onAccept={() => this.props.setStatus(profile.id, 'Staff')} + /> </Table.Cell> </Table.Row> ); diff --git a/src/components/pages/CommentModal.js b/src/components/pages/CommentModal.js new file mode 100644 index 0000000000000000000000000000000000000000..eeba0feeb2628c848cdb518bd7b6ad3a07c37978 --- /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 e48fe9bffbeb815014d6804003e6ab4f53ca0976..fc748e5e90b481b71b1463bba924661d794e160b 100644 --- a/src/components/pages/EventDetail.js +++ b/src/components/pages/EventDetail.js @@ -7,17 +7,13 @@ import { Form, Header, Table, - Icon, - Checkbox, - Popup, - Grid, } from 'semantic-ui-react'; 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) { @@ -36,7 +32,6 @@ class EventDetail extends Component { renderTrainees() { const event = this.props.selectedEvent; - const note = this.props.actualNote; return this.props.trainees.map((item) => { const notes = this.props.eventNotes.filter(note => note.profile === item.id); return ( @@ -79,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 ''; @@ -120,7 +128,7 @@ class EventDetail extends Component { <Button onClick={() => this.setState({ edit: true })} > - Edit + Szerkeszt </Button> { this.state.edit ? <Button @@ -129,7 +137,7 @@ class EventDetail extends Component { this.props.submitVisitors(this.props.selectedEvent); } } - >Save + >MentĂŠs </Button> : '' @@ -182,4 +190,5 @@ export default connect(mapStateToProps, { writeNote, clearWrite, postEventNote, + deleteNote, })(EventDetail); diff --git a/src/components/pages/Events.js b/src/components/pages/Events.js index 3d5c8fca3566e71690424e84075a51c52c0a0130..d5b6d30b8b3eb9f69ac2c3df9059accaa4feb5ee 100644 --- a/src/components/pages/Events.js +++ b/src/components/pages/Events.js @@ -3,8 +3,10 @@ import moment from 'moment'; import { Link } from 'react-router-dom'; import { Container, Table, Button } from 'semantic-ui-react'; import { connect } from 'react-redux'; -import { getStaffEvents, deleteEvent } from '../../actions/statistics'; +import { getStaffEvents, deleteEvent, selectEventForEdit } from '../../actions/statistics'; import AddEventForm from '../forms/AddEventForm'; +import EditEventForm from '../forms/EditEventForm'; +import ConfirmModal from '../forms/ConfirmModal'; class Events extends Component { componentWillMount() { @@ -23,14 +25,20 @@ class Events extends Component { <Table.Cell>{moment(event.date).format('LL')}</Table.Cell> <Table.Cell>{event.visitor_number}</Table.Cell> <Table.Cell> - <Button - onClick={() => this.props.deleteEvent(event)} - color='red' - compact - size='small' - > - Delete - </Button> + <ConfirmModal + text={`tĂśrĂślni akarod a kĂśvetkezĹ alkalmat:${event.name}`} + button={ + <Button + compact + color='red' + size='mini' + > + TĂśrlĂŠs + </Button> + } + onAccept={() => this.props.deleteEvent(event)} + /> + <EditEventForm onClick={() => this.props.selectEventForEdit(event)} /> </Table.Cell> </Table.Row> ); @@ -62,4 +70,4 @@ class Events extends Component { const mapStateToProps = ({ events: { events }, user }) => ({ events, user }); -export default connect(mapStateToProps, { getStaffEvents, deleteEvent })(Events); +export default connect(mapStateToProps, { getStaffEvents, selectEventForEdit, deleteEvent })(Events); diff --git a/src/components/pages/News.js b/src/components/pages/News.js index 41260ea92dd30a22084df8dc50bcb0e638380b97..012ad5f1745f81d8325b6e18339e5066728ca202 100644 --- a/src/components/pages/News.js +++ b/src/components/pages/News.js @@ -2,6 +2,7 @@ import React, { Component } from 'react'; import { Container, Segment, Item, Button, Grid } from 'semantic-ui-react'; import { connect } from 'react-redux'; import moment from 'moment'; +import ConfirmModal from '../forms/ConfirmModal'; import AddNewsForm from '../forms/AddNewsForm'; import EditNewsForm from '../forms/EditNewsForm'; @@ -19,48 +20,41 @@ class News extends Component { return this.props.news.map(item => ( <Item key={item.id}> <Item.Content> - <Item.Header - style={{ fontSize: '2em', width: '100%' }} - > - <Grid> - <Grid.Column floated='center' width={12}> - {item.title} - </Grid.Column> - { this.props.user.role === 'Staff' ? - <Grid.Column floated='right' width={4}> - <EditNewsForm - onClick={() => this.props.setSelectedNews(item)} - /> - <Button - compact - color='red' - size='mini' - onClick={() => this.props.deleteNews(item)} - > - Delete - </Button> - </Grid.Column> - : null } - </Grid> - </Item.Header> - <Item.Description className='news-text' style={{ fontSize: '1.33em' }}> - {this.renderMultiLine(item.text)} - </Item.Description> - <Item.Extra> - <Grid> - <Grid.Row className='news-extra'> - <Grid.Column floated='left' width={10}> - <p> KĂŠszĂźlt: {moment(item.created_at).format('LLLL')} </p> - <p> Szerkesztve: {moment(item.updated_at).format('LLLL')}</p> + <Container text textAlign='left'> + <Item.Header + style={{ fontSize: '2em', width: '100%' }} + > + <Grid> + <Grid.Column floated='left' width={8}> + {item.title} </Grid.Column> - <Grid.Column floated='right' width={5}> - <p> Ărta: <strong>{item.author_name}</strong></p> - {/* TODO get the edited by name */} - <p> Szerkesztette: {item.author_name}</p> - </Grid.Column> - </Grid.Row> - </Grid> - </Item.Extra> + { this.props.user.role === 'Staff' ? + <Grid.Column floated='right' width={4}> + <EditNewsForm + onClick={() => this.props.setSelectedNews(item)} + /> + <ConfirmModal + text={`tĂśrĂślni akarod a kĂśvetkezĹ hĂrt: ${item.title}`} + button={ + <Button + compact + color='red' + size='mini' + > + TĂśrlĂŠs + </Button> + } + onAccept={() => this.props.deleteNews(item)} + /> + </Grid.Column> + : null } + </Grid> + </Item.Header> + <Item.Meta style={{ fontSize: '0.75em', fontStyle: 'italic' }}>KĂśzzĂŠtĂŠve: {moment(item.created_at).format('LLLL')}</Item.Meta> + <Item.Description className='news-text' style={{ fontSize: '1em' }}> + {this.renderMultiLine(item.text)} + </Item.Description> + </Container> </Item.Content> </Item> )); diff --git a/src/components/pages/Schedule.js b/src/components/pages/Schedule.js index db3877fad2df7893212e1164a84a5fe6595d41e2..1b7e66eda96f72edf024bb86160b8e911110b3d9 100644 --- a/src/components/pages/Schedule.js +++ b/src/components/pages/Schedule.js @@ -24,29 +24,31 @@ class Schedule extends Component { const events = this.props.events; const panels = events.map(event => ( - <> + <div> <Accordion.Title active={activeIndex === event.id} index={event.id} onClick={this.handleClick} > - <h2> + <h3> <Grid> <Grid.Column floated='left' width={5} textAlign='left'> - <Icon name='quidditch' color='blue' />{event.name} + <Icon name='angle right' color='blue' />{event.name} </Grid.Column> <Grid.Column floated='right' width={8} textAlign='right'> {moment(event.date).locale('hu').format('LLLL')} </Grid.Column> </Grid> - </h2> + </h3> </Accordion.Title> <Accordion.Content active={activeIndex === event.id}> + <Container text textAlign='left'> <p> {event.description} </p> + </Container> </Accordion.Content> - </> + </div> )); return ( diff --git a/src/components/pages/TraineeTableRow.js b/src/components/pages/TraineeTableRow.js index 3a9ae4fb2e1e478c5f3b550bafc29694eff1377a..34e58c3c4ac541fded95a5663c55875f3047e0d2 100644 --- a/src/components/pages/TraineeTableRow.js +++ b/src/components/pages/TraineeTableRow.js @@ -7,50 +7,38 @@ import { Grid, Button, Form, - Dropdown, } from 'semantic-ui-react'; import { connect } from 'react-redux'; -import { visitorChange, submitVisitors } from '../../actions/statistics'; -import { writeNote, clearWrite, postEventNote } from '../../actions/notes'; - -const visitStates = [ - { - text: 'Igen', - value: 'Visitor', - }, - { - text: 'SzĂłlt h nem', - value: 'Absent', - }, - { - text: 'Nem', - value: 'No', - } -] +import { visitorChange } from '../../actions/statistics'; +import { writeNote, clearWrite, postEventNote, deleteNote } from '../../actions/notes'; +import CommentModal from './CommentModal' class TraineeTableRow extends Component { constructor(props) { super(props); this.state = { - showAddPopup: false, - showMorePopup: false, - }; + note: '', + } } - triggerAdd = () => this.setState({ ...this.state, showAddPopup: !this.state.showAddPopup}) - triggerMore = () => this.setState({ ...this.state, showMorePopup: !this.state.showMorePopup }) + handleWrite = (e) => { + this.setState({ ...this.state, note: e.target.value }); + } + + clearWrite = () => { + this.setState({ ...this.state, note: '' }); + } render() { - const note = this.props.actualNote; - const { trainee, edit, actualNote, selectedEvent, notes } = this.props; + const { trainee, edit, selectedEvent, notes } = this.props; const isVisitor = selectedEvent.visitors.includes(trainee.id); const isAbsent = selectedEvent.absent.includes(trainee.id); return ( - <Table.Row> + <Table.Row key={trainee.id}> <Table.Cell> {trainee.full_name} </Table.Cell> - {!this.props.edit ? + {!edit ? <Table.Cell textAlign='center'> { isVisitor ? @@ -64,11 +52,23 @@ class TraineeTableRow extends Component { </Table.Cell> : <Table.Cell textAlign='center'> - <Dropdown - defaultValue={isVisitor ? 'Visitor' : isAbsent ? 'Absent' : 'No'} - selection - options={visitStates} - onChange={(_, v) => this.props.visitorChange({ id : trainee.id, value: v.value })} + <Button + compact + icon={<Icon color='green' name='checkmark' />} + color={isVisitor ? 'blue' : 'lightgrey'} + onClick={() => this.props.visitorChange({ id: trainee.id, value: 'Visitor' })} + /> + <Button + compact + icon={<Icon color='orange' name='minus' />} + color={isAbsent ? 'blue' : 'lightgrey'} + onClick={() => this.props.visitorChange({ id: trainee.id, value: 'Absent' })} + /> + <Button + compact + icon={<Icon color='red' name='cancel' />} + color={!isVisitor && !isAbsent ? 'blue' : 'lightgrey'} + onClick={() => this.props.visitorChange({ id: trainee.id, value: 'No' })} /> </Table.Cell> } @@ -92,41 +92,27 @@ class TraineeTableRow extends Component { null } </Grid.Column> - <Grid.Column floated='right' width={3} textAlign='right'> + <Grid.Column floated='right' width={4} textAlign='right'> {notes.length > 0 ? - <Popup - basic - open={this.state.showMorePopup} - 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 trigger={<Button icon='plus' onClick={this.triggerAdd}/>} - basic - open={this.state.showAddPopup} + on='click' + position='bottom left' content={ <Form reply> <Form.TextArea - value={note.note} - onChange={e => this.props.writeNote(e)} + value={this.state.note} + onChange={e => this.handleWrite(e)} /> <Button onClick={() => { this.props.postEventNote({ eventid:selectedEvent.id, userid: trainee.id, - note: note.note }); - this.props.clearWrite(); + note: this.state.note }); + this.clearWrite(); } } content='MegjegyzĂŠs hozzĂĄadĂĄsa' @@ -145,6 +131,5 @@ class TraineeTableRow extends Component { ); } } -const mapStateToProps = ({ notes: { actualNote } }) => ({ actualNote }) -export default connect(mapStateToProps, { writeNote, clearWrite, postEventNote, visitorChange})(TraineeTableRow) +export default connect(() => ({}), { writeNote, clearWrite, postEventNote, visitorChange, deleteNote })(TraineeTableRow) diff --git a/src/components/pages/Trainees.js b/src/components/pages/Trainees.js index 804c801a8b82f25d8b33da7d5c8732dd15399413..e49cc33900e5f54780cff2cd80c38f9db6da2bd3 100644 --- a/src/components/pages/Trainees.js +++ b/src/components/pages/Trainees.js @@ -19,7 +19,11 @@ class Trainees extends Component { } return ( <Table.Cell textAlign='center'> - <Icon color='red' name='cancel' /> + { event.absent.includes(trainee.id) ? + <Icon color='orange' name='minus' /> + : + <Icon color='red' name='cancel' /> + } </Table.Cell>); })); } diff --git a/src/reducers/EventReducer.js b/src/reducers/EventReducer.js index 5dd067d018da28027a91239edfb17d9b7a41637c..72a976407b8a514e31953543163f3cb92b6a1665 100644 --- a/src/reducers/EventReducer.js +++ b/src/reducers/EventReducer.js @@ -8,9 +8,12 @@ import { CLEAR_WRITE, ABSENT_CHANGE, CHANGE_NO, + SELECT_EVENT_FOR_EDIT, + EDIT_EVENT, + WRITE_EDITED_EVENT, } from '../actions/types'; -const INITIAL_STATE = { events: [], newEvent: {} }; +const INITIAL_STATE = { events: [], newEvent: {}, editedEvent: {} }; export default (state = INITIAL_STATE, action) => { switch (action.type) { @@ -75,8 +78,16 @@ export default (state = INITIAL_STATE, action) => { case DELETE_EVENT: state.events.splice(state.events.indexOf(action.payload), 1); return { ...state, events: [...state.events] }; + case SELECT_EVENT_FOR_EDIT: + return { ...state, editedEvent: action.payload } + case WRITE_EDITED_EVENT: + return { ...state, editedEvent: { ...state.editedEvent, [action.target]: action.payload } }; + case EDIT_EVENT: + const index = state.events.findIndex(item => item.id === action.payload.id); + state.events.splice(index, 1, action.payload); + return { ...state, events: [...state.events] }; case CLEAR_WRITE: - return { ...state, newEvent: {} }; + return { ...state, newEvent: {}, editedEvent: {} }; default: return state; } diff --git a/src/reducers/NoteReducer.js b/src/reducers/NoteReducer.js index 90e4c8db7dba6f73a721b4eec4bbb8d51d3b5101..37caf2f13db724e0a386e7158fab0b5ae103bded 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; }