Rev 15314 | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |
import React, { useState, useEffect } from "react";
import axios from "axios";
import { Card } from "react-bootstrap";
import {
LengthFilter,
SearchInput,
TablePagination,
} from "../../components/TableComponents";
import { addNotification } from "../../../redux/notification/notification.actions";
import { useDispatch } from "react-redux";
import DeleteModal from "../../../shared/DeleteModal";
import Table from "../../../shared/content-table/Table";
import TableRow from "../../../shared/content-table/TableRow";
const headers = [
{ key: "name", label: "Nombre", isSorteable: true },
{ key: "job_description", label: "Descripción de cargo", isSorteable: true },
{ key: "status", label: "Estatus", isSorteable: true },
{ key: "actions", label: "Acciones", isSorteable: false },
];
const MainView = ({
table_link,
setActionLink,
permisions,
add_link,
setAction,
}) => {
const dispatch = useDispatch();
const [showDeleteModal, setShowDeleteModal] = useState(false);
const [deleteLink, setDeleteLink] = useState("");
const [items, setItems] = useState([]);
const [total, setTotal] = useState(0);
const [search, setSearch] = useState("");
const [startItem, setStartItem] = useState(1);
const [lastItem, setLastItem] = useState(10);
const [dataLength, setDataLength] = useState(10);
const [pages, setPages] = useState({
current: 1,
last: 1,
});
const getData = ({ url = "", params = {} }) => {
axios
.get(url, { params: { ...params } })
.then(({ data }) => {
if (!data.success) {
dispatch(
addNotification({
style: "danger",
msg: "Ha ocurrido un error",
})
);
}
setItems(data.data.items);
setTotal(data.data.total);
setPages({ ...pages, last: Math.ceil(data.data.total / dataLength) });
})
.catch(() =>
dispatch(
addNotification({
style: "danger",
msg: "Ha ocurrido un error",
})
)
);
};
useEffect(() => {
getData({
url: table_link,
params: {
search: search,
length: dataLength,
start: pages.current,
},
});
}, [search, dataLength, pages.current]);
useEffect(() => {
if (pages.current > 1) {
setStartItem(dataLength * (pages.current - 1) + 1);
} else {
setStartItem(1);
}
}, [pages.current]);
useEffect(() => {
if (items) {
if (startItem > 1) {
setLastItem(startItem + (items.length - 1));
} else {
setLastItem(items.length);
}
}
}, [items]);
const handleSort = (result) => setItems(result);
const handleEdit = (url) => {
setActionLink(url);
setAction("edit");
};
const handleDelete = (url) => {
setDeleteLink(url);
setShowDeleteModal(true);
};
return (
<>
<section className="content">
<div className="container-fluid">
<div className="row">
<div className="col-12">
<Card>
<Card.Header>
<div
className="row justify-content-end"
style={{ gap: "10px" }}
>
{permisions.allowAdd && (
<label
className="d-flex align-items-center"
onClick={() => {
setActionLink(add_link);
setAction("add");
}}
style={{ cursor: "pointer" }}
>
<i className="fa fa-plus mr-2" />
Agregar
</label>
)}
<label
className="d-flex align-items-center"
onClick={() =>
getData({
url: table_link,
params: {
search: search,
length: dataLength,
page: pages.current,
},
})
}
style={{ cursor: "pointer" }}
>
<i className="fa fa-refresh mr-2" />
Actualizar
</label>
</div>
<div className="row justify-content-between align-items-center">
<LengthFilter
onChange={(e) => setDataLength(e.target.value)}
/>
<SearchInput onChange={(e) => setSearch(e.target.value)} />
</div>
</Card.Header>
<Card.Body>
<div className="table-responsive">
<Table data={items} headers={headers} setData={handleSort}>
{() =>
items.map((item, index) => (
<TableRow
key={index}
item={item}
editOptions={{
permission: permisions.allowEdit,
icon: (value) => (
<i
className="fa fa-pencil cursor-pointer"
onClick={() => handleEdit(value)}
/>
),
}}
deleteOptions={{
permission: permisions.allowDelete,
icon: (value) => (
<i
className="fa fa-trash cursor-pointer"
onClick={() => handleDelete(value)}
/>
),
}}
/>
))
}
</Table>
</div>
<div className="row justify-content-between align-items-center">
<p className="mb-0">
{`Mostrando registros del ${startItem} al ${lastItem} de un total de ${total} registros`}
</p>
<TablePagination
onDecrement={() =>
setPages({ ...pages, current: pages.current - 1 })
}
onIncrement={() =>
setPages({ ...pages, current: pages.current + 1 })
}
totalPages={pages.last}
currentPage={pages.current}
/>
</div>
</Card.Body>
</Card>
</div>
</div>
</div>
</section>
<DeleteModal
url={deleteLink}
isOpen={showDeleteModal}
closeModal={() => setShowDeleteModal(false)}
title="¿Está seguro de borrar esta vacante?"
onComplete={() =>
setItems(
items.filter((item) => item.actions.link_delete !== deleteLink)
)
}
message="Vacante eliminada"
/>
</>
);
};
export default MainView;