Proyectos de Subversion LeadersLinked - Backend

Rev

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

Rev Autor Línea Nro. Línea
9928 stevensc 1
import React, { useState, useEffect } from 'react'
9502 stevensc 2
import axios from 'axios'
9512 stevensc 3
import { Card } from 'react-bootstrap'
10061 stevensc 4
import { LengthFilter, SearchInput, Table, TablePagination } from '../../components/TableComponents'
9622 stevensc 5
import { useHistory } from 'react-router-dom'
9907 stevensc 6
import { addNotification } from '../../../redux/notification/notification.actions'
7
import { useDispatch } from 'react-redux'
9908 stevensc 8
import DeleteModal from '../../../shared/DeleteModal'
9469 stevensc 9
 
9543 stevensc 10
const headers = [
11
  { key: "name", label: "Nombre", isSorteable: true },
12
  { key: "job_description", label: "Descripción de cargo", isSorteable: true },
13
  { key: "actions", label: "Acciones", isSorteable: false }
14
]
15
 
9929 stevensc 16
const MainView = ({ table_link, setActionLink, permisions, add_link }) => {
9502 stevensc 17
 
9622 stevensc 18
  const history = useHistory()
9907 stevensc 19
  const dispatch = useDispatch()
9929 stevensc 20
  const [showDeleteModal, setShowDeleteModal] = useState(false)
21
  const [deleteLink, setDeleteLink] = useState('')
9928 stevensc 22
  const [data, setData] = useState({})
9575 stevensc 23
  const [search, setSearch] = useState('')
9512 stevensc 24
  const [dataLength, setDataLength] = useState(10);
25
  const [pages, setPages] = useState({
26
    current: 1,
27
    last: 1
28
  });
9502 stevensc 29
 
30
  const getData = ({ url = '', params = {} }) => {
31
 
32
    axios.get(url, { params: { ...params } })
33
      .then(({ data }) => {
9512 stevensc 34
        if (!data.success) {
9907 stevensc 35
          dispatch(addNotification({
36
            style: "error",
37
            msg: "Ha ocurrido un error"
38
          }))
9512 stevensc 39
        }
9502 stevensc 40
 
9512 stevensc 41
        setData(data.data)
9521 stevensc 42
        setPages({ ...pages, last: Math.ceil(data.data.total / dataLength) })
9502 stevensc 43
      })
9907 stevensc 44
      .catch((err) => dispatch(addNotification({
45
        style: "error",
46
        msg: "Ha ocurrido un error"
47
      })))
9502 stevensc 48
  }
49
 
50
  useEffect(() => {
9575 stevensc 51
    getData({
52
      url: table_link,
53
      params: {
54
        search: search,
55
        length: dataLength,
56
        page: pages.current
57
      }
58
    })
59
  }, [search, dataLength, pages.current])
9502 stevensc 60
 
9469 stevensc 61
  return (
9907 stevensc 62
    <>
63
      <section className="content">
64
        <div className="container-fluid">
65
          <div className="row">
66
            <div className="col-12">
67
              <Card>
68
                <Card.Header>
69
                  <div className="row justify-content-end" style={{ gap: '10px' }}>
70
                    {
10093 stevensc 71
                      permisions.allowAdd
9907 stevensc 72
                      &&
73
                      <label
74
                        className='d-flex align-items-center'
75
                        onClick={() => {
76
                          setActionLink(add_link)
77
                          history.push('/recruitment-and-selection/vacancies/add')
78
                        }}
9910 stevensc 79
                        style={{ cursor: 'pointer' }}
9907 stevensc 80
                      >
81
                        <i className="fa fa-plus mr-2" />
82
                        Agregar
83
                      </label>
84
                    }
9910 stevensc 85
                    <label
86
                      className='d-flex align-items-center'
87
                      onClick={() => getData({
88
                        url: table_link,
89
                        params: {
90
                          search: search,
91
                          length: dataLength,
92
                          page: pages.current
93
                        }
94
                      })}
95
                      style={{ cursor: 'pointer' }}
96
                    >
9907 stevensc 97
                      <i className='fa fa-refresh mr-2' />
98
                      Actualizar
9634 stevensc 99
                    </label>
9907 stevensc 100
                  </div>
101
                  <div className="row justify-content-between align-items-center">
102
                    <LengthFilter onChange={(e) => setDataLength(e.target.value)} />
103
                    <SearchInput onChange={(e) => setSearch(e.target.value)} />
104
                  </div>
105
                </Card.Header>
106
                <Card.Body>
107
                  <Table data={data.items} headers={headers} setData={setData}>
108
                    {
9928 stevensc 109
                      data.items?.map((item, index) => (
9907 stevensc 110
                        <tr key={index}>
111
                          <td>{item.name}</td>
112
                          <td>{item.job_description}</td>
113
                          <td className='d-flex' style={{ gap: '10px' }}>
114
                            {
10093 stevensc 115
                              permisions.allowEdit
9907 stevensc 116
                              &&
117
                              <i
118
                                className='fa fa-pencil'
119
                                onClick={() => {
120
                                  setActionLink(item.actions.link_edit)
121
                                  history.push('/recruitment-and-selection/vacancies/edit')
122
                                }}
123
                                style={{ cursor: 'pointer' }}
124
                              />
125
                            }
126
                            {
10093 stevensc 127
                              permisions.allowDelete
9907 stevensc 128
                              &&
129
                              <i
130
                                className='fa fa-trash'
9909 stevensc 131
                                onClick={() => {
9928 stevensc 132
                                  setShowDeleteModal(true)
9929 stevensc 133
                                  setDeleteLink(item.actions.link_delete)
9909 stevensc 134
                                }}
9907 stevensc 135
                                style={{ cursor: 'pointer' }}
136
                              />
137
                            }
138
                          </td>
139
                        </tr>
140
                      ))
141
                    }
142
                  </Table>
143
                  <div className='row justify-content-between align-items-center'>
144
                    <p className='mb-0'>
145
                      {`Mostrando registros del ${(dataLength * pages.current) - (dataLength - 1) || 0} al ${(dataLength * pages.current) - (dataLength - data.total) || 0} de un total de ${data.total || 0} registros`}
146
                    </p>
147
                    <TablePagination
148
                      onDecrement={(e) => setPages(prev => prev.current -= 1)}
149
                      onIncrement={(e) => setPages(prev => prev.current += 1)}
150
                      totalPages={pages.last}
151
                      currentPage={pages.current}
152
                    />
153
                  </div>
154
                </Card.Body>
155
              </Card>
156
            </div>
157
          </div >
9512 stevensc 158
        </div >
9907 stevensc 159
      </section >
160
      <DeleteModal
9929 stevensc 161
        url={deleteLink}
9907 stevensc 162
        isOpen={showDeleteModal}
163
        closeModal={() => setShowDeleteModal(false)}
164
        title="Esta seguro de borrar esta vacante?"
165
        onComplete={() => setData({ ...data, items: data.items.filter((item) => item.actions.link_delete !== actionLink) })}
166
        message="Vacante eliminada"
167
      />
168
    </>
9469 stevensc 169
  )
9489 stevensc 170
}
171
export default MainView