Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 15310 | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
11024 stevensc 1
/* eslint-disable no-mixed-spaces-and-tabs */
10061 stevensc 2
import React, { useState, useEffect } from 'react'
3
import axios from 'axios'
4
import { Card } from 'react-bootstrap'
15319 stevensc 5
import { LengthFilter, SearchInput, TablePagination } from '../../components/TableComponents'
10061 stevensc 6
import { addNotification } from '../../../redux/notification/notification.actions'
7
import { useDispatch } from 'react-redux'
8
import DeleteModal from '../../../shared/DeleteModal'
10095 stevensc 9
import ContentTitle from '../../../shared/ContentTitle'
11046 stevensc 10
import AddModal from '../components/AddModal'
11061 stevensc 11
import EditModal from '../components/EditModal'
15319 stevensc 12
import Table from '../../../shared/content-table/Table'
13
import TableRow from '../../../shared/content-table/TableRow'
9954 stevensc 14
 
10061 stevensc 15
const headers = [
11024 stevensc 16
	{ key: 'first_name', label: 'Nombre', isSorteable: true },
17
	{ key: 'last_name', label: 'Apellido', isSorteable: true },
18
	{ key: 'email', label: 'Correo electrónico', isSorteable: true },
19
	{ key: 'status', label: 'Estatus', isSorteable: false },
20
	{ key: 'actions', label: 'Acciones', isSorteable: false }
10061 stevensc 21
]
9954 stevensc 22
 
11024 stevensc 23
const MainView = ({ email_link, add_link, table_link, permisions, vacancies }) => {
9954 stevensc 24
 
11024 stevensc 25
	const dispatch = useDispatch()
26
	const [showDeleteModal, setShowDeleteModal] = useState(false)
11046 stevensc 27
	const [isShowAddModal, setIsShowAddModal] = useState(false)
11061 stevensc 28
	const [currentEditLink, setCurrentEditLink] = useState('')
29
	const [isShowEditModal, setIsShowEditModal] = useState(false)
15310 stevensc 30
	const [currentVacancy, setCurrentVacancy] = useState((vacancies.length > 0) ? vacancies[0].uuid : '')
11024 stevensc 31
	const [actionLink, setActionLink] = useState('')
12712 stevensc 32
	const [items, setItems] = useState([])
33
	const [total, setTotal] = useState(0)
11024 stevensc 34
	const [search, setSearch] = useState('')
35
	const [dataLength, setDataLength] = useState(10)
12375 stevensc 36
	const [startItem, setStartItem] = useState(1)
37
	const [lastItem, setLastItem] = useState(10)
11024 stevensc 38
	const [pages, setPages] = useState({
39
		current: 1,
40
		last: 1
41
	})
10061 stevensc 42
 
11024 stevensc 43
	const getData = ({ url = '', params = {} }) => {
10061 stevensc 44
 
11024 stevensc 45
		axios.get(`${url}/${currentVacancy}`, { params: { ...params } })
46
			.then(({ data }) => {
47
				if (!data.success) {
48
					dispatch(addNotification({
11051 stevensc 49
						style: 'danger',
11024 stevensc 50
						msg: 'Ha ocurrido un error'
51
					}))
52
				}
10061 stevensc 53
 
12712 stevensc 54
				setItems(data.data.items)
55
				setTotal(data.data.total)
11024 stevensc 56
				setPages({ ...pages, last: Math.ceil(data.data.total / dataLength) })
57
			})
58
			.catch(() => dispatch(addNotification({
11051 stevensc 59
				style: 'danger',
11024 stevensc 60
				msg: 'Ha ocurrido un error'
61
			})))
62
	}
10061 stevensc 63
 
11024 stevensc 64
	useEffect(() => {
65
		getData({
66
			url: table_link,
67
			params: {
68
				search: search,
69
				length: dataLength,
12375 stevensc 70
				start: pages.current
11024 stevensc 71
			}
72
		})
11025 stevensc 73
	}, [search, dataLength, pages.current, currentVacancy])
10061 stevensc 74
 
12375 stevensc 75
	useEffect(() => {
76
		if (pages.current > 1) {
77
			setStartItem((dataLength * (pages.current - 1)) + 1)
78
		} else {
79
			setStartItem(1)
80
		}
81
	}, [pages.current])
82
 
83
	useEffect(() => {
12712 stevensc 84
		if (items) {
12375 stevensc 85
			if (startItem > 1) {
12712 stevensc 86
				setLastItem(startItem + (items.length - 1))
12375 stevensc 87
			} else {
12712 stevensc 88
				setLastItem(items.length)
12375 stevensc 89
			}
90
		}
12712 stevensc 91
	}, [items])
12375 stevensc 92
 
15319 stevensc 93
	const handleSort = (result) => setItems(result)
94
 
95
	const handleEdit = (url) => {
96
		setCurrentEditLink(url)
97
		setIsShowEditModal(true)
98
	}
99
 
100
	const handleDelete = (url) => {
101
		setShowDeleteModal(true)
102
		setActionLink(url)
103
	}
104
 
11024 stevensc 105
	return (
106
		<ContentTitle title='Preselección'>
107
			<section className="content">
108
				<div className="container-fluid">
109
					<div className="row">
110
						<div className="col-12">
111
							<Card>
112
								<Card.Header>
113
									<div className="row" style={{ gap: '10px' }}>
114
										<div className="form-group">
115
											<label>Vacantes</label>
116
											<select
117
												className="form-control"
118
												value={currentVacancy}
119
												onChange={(e) => setCurrentVacancy(e.target.value)}
120
												defaultValue={vacancies[0].uuid}
121
											>
122
												{
123
													vacancies.map((vacancy) => (
124
														<option key={vacancy.uuid} value={vacancy.uuid}>{vacancy.name}</option>
125
													))
126
												}
127
											</select>
128
										</div>
129
									</div>
130
									<div className="row justify-content-end" style={{ gap: '10px' }}>
15310 stevensc 131
										{permisions.allowAdd &&
11059 stevensc 132
											<label
133
												className='d-flex align-items-center'
134
												onClick={() => setIsShowAddModal(true)}
135
												style={{ cursor: 'pointer' }}
136
											>
137
												<i className="fa fa-plus mr-2" />
138
												Agregar
139
											</label>
11024 stevensc 140
										}
141
										<label
142
											className='d-flex align-items-center'
143
											onClick={() => getData({
144
												url: table_link,
145
												params: {
146
													search: search,
147
													length: dataLength,
148
													page: pages.current
149
												}
150
											})}
151
											style={{ cursor: 'pointer' }}
152
										>
153
											<i className='fa fa-refresh mr-2' />
11059 stevensc 154
											Actualizar
11024 stevensc 155
										</label>
156
									</div>
157
									<div className="row justify-content-between align-items-center">
158
										<LengthFilter onChange={(e) => setDataLength(e.target.value)} />
159
										<SearchInput onChange={(e) => setSearch(e.target.value)} />
160
									</div>
161
								</Card.Header>
162
								<Card.Body>
11268 stevensc 163
									<div className="table-responsive">
15319 stevensc 164
										<Table data={items} headers={headers} setData={handleSort}>
165
											{() => items.map((item, index) =>
166
												<TableRow
167
													key={index}
168
													item={item}
169
													editOptions={{
170
														permission: permisions.allowEdit,
171
														icon: (value) => <i className='fa fa-pencil cursor-pointer' onClick={() => handleEdit(value)} />
172
													}}
173
													deleteOptions={{
174
														permission: permisions.allowDelete,
175
														icon: (value) => <i className='fa fa-trash  cursor-pointer' onClick={() => handleDelete(value)} />
176
													}}
177
												/>)}
178
 
11268 stevensc 179
										</Table>
180
									</div>
11024 stevensc 181
									<div className='row justify-content-between align-items-center'>
182
										<p className='mb-0'>
12712 stevensc 183
											{`Mostrando registros del ${startItem} al ${lastItem} de un total de ${total} registros`}
11024 stevensc 184
										</p>
185
										<TablePagination
12326 stevensc 186
											onDecrement={() => setPages({ ...pages, current: pages.current - 1 })}
187
											onIncrement={() => setPages({ ...pages, current: pages.current + 1 })}
11024 stevensc 188
											totalPages={pages.last}
189
											currentPage={pages.current}
190
										/>
191
									</div>
192
								</Card.Body>
193
							</Card>
194
						</div>
195
					</div >
196
				</div >
197
			</section >
11049 stevensc 198
			<AddModal
11046 stevensc 199
				email_link={email_link}
11059 stevensc 200
				add_link={add_link.replace('UUID_PLACEHOLDER', currentVacancy)}
11046 stevensc 201
				closeModal={() => setIsShowAddModal(false)}
202
				isOpen={isShowAddModal}
15310 stevensc 203
				onComplete={() => getData({ url: table_link })}
11049 stevensc 204
			/>
11061 stevensc 205
			<EditModal
206
				edit_link={currentEditLink}
207
				closeModal={() => setIsShowEditModal(false)}
208
				isOpen={isShowEditModal}
11227 stevensc 209
				resetLink={() => setCurrentEditLink('')}
11061 stevensc 210
			/>
11024 stevensc 211
			<DeleteModal
212
				url={actionLink}
213
				isOpen={showDeleteModal}
214
				closeModal={() => setShowDeleteModal(false)}
15310 stevensc 215
				title="Esta seguro de borrar este candidato?"
12712 stevensc 216
				onComplete={() => setItems(items.filter((item) => item.actions.link_delete !== actionLink))}
15310 stevensc 217
				message="Candidato eliminado"
11024 stevensc 218
			/>
219
		</ContentTitle>
220
	)
9954 stevensc 221
}
222
export default MainView