source: frontend/src/Dashboard/ToDo.js@ 63f5ced

Last change on this file since 63f5ced was a569b7c, checked in by Danilo <danilo.najkov@…>, 23 months ago

todo items full functionality

  • Property mode set to 100644
File size: 10.0 KB
Line 
1import React, {useEffect, useState} from 'react'
2import {
3 Button,
4 Card,
5 DatePicker,
6 Dropdown,
7 Form,
8 Input,
9 List, Menu,
10 Modal,
11 notification,
12 Rate,
13 Select, Space,
14 Spin,
15 Tooltip
16} from "antd";
17import moment from "moment";
18import axios from "axios";
19import env from "../env";
20import AddNewReservation from "./AddNewReservation";
21import {DownOutlined} from "@ant-design/icons";
22
23const ToDo = ({}) => {
24
25 const [loading, setLoading] = useState(true);
26 const [todoItems, setToDoItems] = useState([]);
27 const [newTodoVisible, setNewTodoVisible] = useState(false);
28 const [saveNewTodoLoading, setSaveNewTodoLoading] = useState(false)
29 const [restaurant, setRestaurant] = useState({reviews:[]})
30 const [showReview, setShowReview] = useState(null);
31 const [sortSelect, setSortSelect] = useState('date')
32
33 useEffect(()=> {
34 setLoading(true);
35 getToDos()
36 getRestaurant()
37 },[])
38
39 const getToDos = () => {
40 setSortSelect(type=> {
41 axios.get(env.api + 'ToDo', {
42 params: {sortBy: type},
43 headers: {Authorization: localStorage.getItem('Auth')}
44 }).then(res => {
45 console.log(res.data)
46 setToDoItems(res.data);
47 setLoading(false);
48 });
49 })
50 }
51
52 const updateSort = (type)=>{
53 setSortSelect(type);
54 getToDos();
55 }
56
57 const createToDo = (data) => {
58 console.log(data)
59 setSaveNewTodoLoading(true);
60 axios.post(env.api + 'ToDo', data, {headers:{Authorization:localStorage.getItem('Auth')}}).then(res=>{
61 setSaveNewTodoLoading(false);
62 setNewTodoVisible(false);
63 getToDos()
64 });
65 }
66
67
68 const getRestaurant = () => {
69 axios.get(env.api + 'Restaurants').then(res=>{
70 setRestaurant(res.data);
71 setLoading(false);
72 });
73 }
74
75 const changeStatus = (id, newStatus) => {
76 axios.put(env.api + 'ToDo/'+id, {}, {params:{newStatus:newStatus}, headers:{Authorization:localStorage.getItem('Auth')}}).then(res=>{
77 getToDos()
78 });
79 }
80
81 return(
82 <div style={{padding: '20px',textAlign:'center'}}>
83 <div style={{
84 width: '100%',
85 backgroundColor: 'white',
86 padding: '20px',
87 height:'75px',
88 border: '1px solid lightgray'
89 }} id={'expandMain'}>
90 <h2 style={{float: 'left'}}>ToDo листа</h2>
91 <Button style={{float:'right'}} type={'primary'} onClick={()=>setNewTodoVisible(true)}>Внеси нов запис</Button>
92 <div style={{float:'right', marginRight:'20px'}}>
93 <span style={{marginRight:'5px'}}>Начин на подредување:</span>
94 <Select
95 defaultValue="date"
96 style={{
97 width: 120,
98 }}
99 onChange={(el)=>updateSort(el)}
100 >
101 <Select.Option value="date">Датум</Select.Option>
102 <Select.Option value="priority">Приоритет</Select.Option>
103 </Select>
104 </div>
105 </div>
106 {loading ? <Spin style={{margin: '20px', textAlign:'center'}}/> :
107 <div style={{textAlign:'start'}}>
108 <List dataSource={todoItems} itemLayout={'horizontal'} locale={{emptyText:'Немате направено ToDo'}}
109 renderItem={item => (
110 <Card title={item.title} style={{width:'98%',backgroundColor:'white',margin:'1%'}}
111 actions={
112 item.status == 0 ?
113 [<a style={{color:'#1890ff'}} onClick={()=>changeStatus(item.id,1)}>Започни</a>, <a style={{color:'red'}} onClick={()=>changeStatus(item.id,3)}>Отфрли</a>]
114 : item.status == 1 ? [<a style={{color:'green'}} onClick={()=>changeStatus(item.id,2)}>Заврши</a>, <a style={{color:'red'}} onClick={()=>changeStatus(item.id,3)}>Отфрли</a>]
115 : []}
116 extra={<div style={{textAlign:'end'}}>
117 {
118 item.status == 0 ? [<span style={{color:'#1890ff'}}>Ново</span>] :
119 item.status == 1 ? [<span style={{color:'orange'}}>Започнато</span>] :
120 item.status == 2 ? [<span style={{color:'green'}}>Завршено</span>] :
121 item.status == 3 ? [<span style={{color:'red'}}>Отфрлено</span>] : ''
122 }
123 <br/>
124 <span style={{color:'gray'}}>{moment(item.createdAt).format("DD.MM.yyyy")}</span>
125 </div>}
126 >
127 <p>{item.description}</p>
128 <div style={{borderTop:'1px solid rgb(242, 242, 242)', marginBottom:'15px'}}/>
129 <span style={{float:'left'}}>{item.linkedReview ? <p onClick={() => setShowReview(item.linkedReview)}>Поврзана оценка: <span style={{textDecoration:'underline', cursor:'pointer'}}>{item.linkedReview.id +' - '+ item.linkedReview.title}</span></p> : <></>}</span>
130 <span style={{float:'right'}}>Приоритет: {item.priority}</span>
131 </Card>
132 )}/>
133 </div>
134
135 }
136 <Modal
137 style={{top: 20}}
138 width={'700px'}
139 title="Нова ToDo"
140 footer={[
141 <Button form="newToDoForm" key="submit" htmlType="submit" type={'primary'} loading={saveNewTodoLoading}>
142 Прати
143 </Button>
144 ]}
145 onCancel={()=>setNewTodoVisible(false)}
146 visible={newTodoVisible}>
147 <div>
148 <Form onFinish={createToDo}
149 id={'newToDoForm'}
150 onFinishFailed={()=>
151 notification['error']({
152 message: 'Ве молиме поправете ги сите грешки пред зачувување!',
153 })}>
154 <Form.Item
155 label="Наслов"
156 name="title"
157 rules={[
158 {
159 required: true,
160 message: 'Ве молиме внесете наслов!',
161 },
162 ]}
163 >
164 <Input/>
165 </Form.Item>
166 <Form.Item
167 label="Опис"
168 name="description"
169 rules={[
170 {
171 required: true,
172 message: 'Ве молиме внесете опис!',
173 },
174 ]}
175 >
176 <Input.TextArea rows={4}/>
177 </Form.Item>
178 <Form.Item
179 label="Приоритет"
180 name="priority"
181 rules={[
182 {
183 required: true,
184 message: 'Ве молиме внесете приоритет!',
185 },
186 {
187 regex: new RegExp('^[1-9]\\d*$'),
188 message: 'Ве молиме внесете позитивен број!',
189 },
190 ]}
191 >
192 <Input type={'number'}/>
193 </Form.Item>
194 <Form.Item
195 label="Поврзана оценка"
196 name="reviewId"
197 >
198 <Select>
199 {restaurant.reviews.map(el =>(
200 <Select.Option value={el.id}>{el.id +" - "+ el.title}</Select.Option>
201 ))}
202 </Select>
203 </Form.Item>
204 </Form>
205 </div>
206 </Modal>
207 <Modal
208 style={{top: '10%', padding:'0'}}
209 bodyStyle={{backgroundColor:'rgb(242, 242, 242)'}}
210 width={'700px'}
211 title="Поврзана оценка"
212 footer={[
213 <Button onClick={()=>setShowReview(null)}>
214 Затвори
215 </Button>
216 ]}
217 onCancel={()=>setShowReview(null)}
218 visible={showReview != null}>
219 <div style={{backgroundColor:'rgb(242, 242, 242)'}}>
220 {showReview ?
221 <Card title={showReview.title} >
222 <p>{showReview.description}</p>
223 <Rate disabled value={showReview.stars}/>
224 <p style={{color: 'gray'}}>{moment(showReview.createdAt).format("DD.MM.yyyy")}</p>
225 </Card>
226 :<></>}
227 </div>
228 </Modal>
229 </div>
230 )
231}
232export default ToDo;
Note: See TracBrowser for help on using the repository browser.