Proyectos de Subversion LeadersLinked - Backend

Rev

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

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