Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 11474 | Rev 11476 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
11467 stevensc 1
/* eslint-disable no-mixed-spaces-and-tabs */
2
import React, { useState, useEffect } from 'react'
3
import { Card } from 'react-bootstrap'
4
import { useDispatch } from 'react-redux'
5
import { Link } from 'react-router-dom'
6
import axios from 'axios'
7
import { LengthFilter, SearchInput, Table, TablePagination } from '../../../recruitment_and_selection/components/TableComponents'
8
import { addNotification } from '../../../redux/notification/notification.actions'
9
import ContentTitle from '../../../shared/ContentTitle'
10
import DeleteModal from '../../../shared/DeleteModal'
11
 
12
const headers = [
13
	{ key: 'title', label: 'Nombre', isSorteable: true },
14
	{ key: 'description', label: 'Descripción', isSorteable: true },
15
	{ key: 'progress', label: 'Progreso', isSorteable: true },
16
	{ key: 'cost', label: 'Costo', isSorteable: true },
17
	{ key: 'status', label: 'Estatus', isSorteable: true },
18
	{ key: 'actions', label: 'Acciones', isSorteable: false }
19
]
20
 
11471 stevensc 21
const TableView = ({ add_link, table_link, permisions }) => {
11467 stevensc 22
 
23
	const dispatch = useDispatch()
24
	const [modalToShow, setModalToShow] = useState('')
25
	const [actionLink, setActionLink] = useState(add_link)
26
	const [items, setItems] = useState([])
27
	const [objetive, setObjetive] = useState({})
28
	const [total, setTotal] = useState(0)
29
	const [search, setSearch] = useState('')
30
	const [dataLength, setDataLength] = useState(10)
31
	const [pages, setPages] = useState({
32
		current: 1,
33
		last: 1
34
	})
35
 
36
	const getData = ({ url = '', params = {} }) => {
37
 
38
		axios.get(url, { params: { ...params } })
39
			.then(({ data }) => {
40
				if (!data.success) {
41
					return dispatch(addNotification({
42
						style: 'danger',
43
						msg: 'Ha ocurrido un error'
44
					}))
45
				}
46
 
47
				setItems(data.data.items)
11474 stevensc 48
				setObjetive(data.data.objective)
11467 stevensc 49
				setTotal(data.data.total)
50
				setPages({ ...pages, last: Math.ceil(data.data.total / dataLength) })
51
			})
52
			.catch(() => dispatch(addNotification({
53
				style: 'danger',
54
				msg: 'Ha ocurrido un error'
55
			})))
56
	}
57
 
58
	useEffect(() => {
59
		getData({
60
			url: table_link,
61
			params: {
62
				search: search,
63
				length: dataLength,
64
				page: pages.current
65
			}
66
		})
67
	}, [search, dataLength, pages.current])
68
 
69
	return (
70
		<ContentTitle title='Planificación - Objetivos y Metas'>
11472 stevensc 71
			<section className="content">
72
				<div className="container-fluid">
73
					<div className="row">
74
						<div className="col-12">
75
							<Card>
76
								<Card.Header>
77
									<div className="row justify-content-end" style={{ gap: '10px' }}>
78
										{
79
											permisions.allowAdd
80
                                            &&
81
                                            <label
82
                                            	className='d-flex align-items-center'
83
                                            	onClick={() => {
84
                                            		setActionLink(add_link)
85
                                            		setModalToShow('add')
86
                                            	}}
87
                                            	style={{ cursor: 'pointer' }}
88
                                            >
89
                                            	<i className="fa fa-plus mr-2" />
90
                                                Agregar
91
                                            </label>
92
										}
93
										<label
94
											className='d-flex align-items-center'
95
											onClick={() => getData({
96
												url: table_link,
97
												params: {
98
													search: search,
99
													length: dataLength,
100
													page: pages.current
101
												}
102
											})}
103
											style={{ cursor: 'pointer' }}
104
										>
105
											<i className='fa fa-refresh mr-2' />
106
                                            Actualizar
107
										</label>
108
									</div>
109
									<div className="row justify-content-between align-items-center">
110
										<LengthFilter onChange={(e) => setDataLength(e.target.value)} />
111
										<SearchInput onChange={(e) => setSearch(e.target.value)} />
112
									</div>
113
								</Card.Header>
114
								<Card.Body>
115
									<div className="table-responsive">
116
										<Table data={items} headers={headers} setData={setItems}>
117
											{
118
												items.length
119
                                                &&
120
                                                items.map((item, index) => (
121
                                                	<tr key={index}>
122
                                                		<td className='text-vertical-middle'>{item.title}</td>
123
                                                		<td className='text-vertical-middle'>{item.description}</td>
124
                                                		<td className='text-vertical-middle'>{item.date}</td>
125
                                                		<td className='d-flex align-items-center'>
126
                                                			{
127
                                                				item.progress > 0
128
                                                					?
129
                                                					<>
130
                                                						<progress value={item.progress} max='100' />
131
                                                						<span className='ml-2'>{item.progress}</span>
132
                                                					</>
133
                                                					:
134
                                                					'Sin metas'
135
                                                			}
136
                                                		</td>
137
                                                		<td className='text-vertical-middle'>{item.cost}</td>
138
                                                		<td className='text-vertical-middle'>
139
                                                			{
140
                                                				item.status === 'a'
141
                                                					? 'Activo'
142
                                                					: 'Inactivo'
143
                                                			}
144
                                                		</td>
145
                                                		<td>
146
                                                			<div className="d-flex align-items-center" style={{ gap: '5px' }}>
147
                                                				{
148
                                                					permisions.allowEdit
149
                                                                    &&
150
                                                                    <i
151
                                                                    	className='fa fa-pencil'
152
                                                                    	onClick={() => {
153
                                                                    		setActionLink(item.actions.link_edit)
154
                                                                    		setModalToShow('edit')
155
                                                                    	}}
156
                                                                    	style={{ cursor: 'pointer' }}
157
                                                                    />
158
                                                				}
159
                                                				{
160
                                                					permisions.allowDelete
161
                                                                    &&
162
                                                                    <i
163
                                                                    	className='fa fa-trash'
164
                                                                    	onClick={() => {
165
                                                                    		setActionLink(item.actions.link_delete)
166
                                                                    		setModalToShow('delete')
167
                                                                    	}}
168
                                                                    	style={{ cursor: 'pointer' }}
169
                                                                    />
170
                                                				}
171
                                                			</div>
172
                                                		</td>
173
                                                	</tr>
174
                                                ))
175
											}
176
										</Table>
177
									</div>
178
									<div className='row justify-content-between align-items-center'>
179
										<p className='mb-0'>
180
											{`Mostrando registros del ${(dataLength * pages.current) - (dataLength - 1) || 0} al ${(dataLength * pages.current) - (dataLength - total) || 0} de un total de ${total || 0} registros`}
181
										</p>
182
										<TablePagination
183
											onDecrement={() => setPages(prev => prev.current -= 1)}
184
											onIncrement={() => setPages(prev => prev.current += 1)}
185
											totalPages={pages.last}
186
											currentPage={pages.current}
187
										/>
188
									</div>
189
								</Card.Body>
190
							</Card>
191
						</div>
192
					</div >
193
				</div >
194
			</section >
195
			<DeleteModal
196
				url={actionLink}
197
				isOpen={modalToShow === 'delete'}
198
				closeModal={() => setModalToShow('')}
199
				title="Esta seguro de borrar este objetivo?"
200
				onComplete={() => setItems(items.filter((item) => item.actions.link_delete !== actionLink))}
201
				message="Registro borrado"
202
			/>
11467 stevensc 203
		</ContentTitle >
204
	)
205
}
206
 
207
export default TableView