@diagramers/admin
Version:
Diagramers Admin Template - React starter for admin dashboards.
219 lines (203 loc) • 7.72 kB
JavaScript
/* eslint-disable no-plusplus */
import React, { useEffect, useState } from 'react';
import { Badge, Col, Form, Row } from 'react-bootstrap';
import { useTable, useGlobalFilter, useSortBy, usePagination, useRowSelect, useRowState, useAsyncDebounce } from 'react-table';
import axios from 'axios';
import HtmlHead from 'components/html-head/HtmlHead';
import BreadcrumbList from 'components/breadcrumb-list/BreadcrumbList';
import { SERVICE_URL } from 'config.js';
import ButtonsCheckAll from './components/ButtonsCheckAll';
import ButtonsAddNew from './components/ButtonsAddNew';
import ControlsPageSize from './components/ControlsPageSize';
import ControlsAdd from './components/ControlsAdd';
import ControlsEdit from './components/ControlsEdit';
import ControlsDelete from './components/ControlsDelete';
import ControlsSearch from './components/ControlsSearch';
import ModalAddEdit from './components/ModalAddEdit';
import Table from './components/Table';
import TablePagination from './components/TablePagination';
const ServerSide = () => {
const title = 'Server Side';
const description = 'Server side api implementation.';
const breadcrumbs = [
{ to: '', text: 'Home' },
{ to: 'interface', text: 'Interface' },
{ to: 'interface/plugins', title: 'Plugins' },
{ to: 'interface/plugins/datatables', title: 'Datatables' },
];
const columns = React.useMemo(() => {
return [
{
Header: 'Name',
accessor: 'name',
sortable: true,
headerClassName: 'text-muted text-small text-uppercase w-30',
Cell: ({ cell }) => {
return (
<a
className="list-item-heading body"
href="#!"
onClick={(e) => {
e.preventDefault();
}}
>
{cell.value}
</a>
);
},
},
{ Header: 'Sales', accessor: 'sales', sortable: true, headerClassName: 'text-muted text-small text-uppercase w-10' },
{ Header: 'Stock', accessor: 'stock', sortable: true, headerClassName: 'text-muted text-small text-uppercase w-10' },
{ Header: 'Category', accessor: 'category', sortable: true, headerClassName: 'text-muted text-small text-uppercase w-20' },
{
Header: 'Tag',
accessor: 'tag',
sortable: true,
headerClassName: 'text-muted text-small text-uppercase w-10',
Cell: ({ cell }) => {
return <Badge bg="outline-primary">{cell.value}</Badge>;
},
},
{
Header: '',
id: 'action',
headerClassName: 'empty w-10',
Cell: ({ row }) => {
const { checked, onChange } = row.getToggleRowSelectedProps();
return <Form.Check className="form-check float-end mt-1" type="checkbox" checked={checked} onChange={onChange} />;
},
},
];
}, []);
const [data, setData] = useState([]);
const [pageCount, setPageCount] = React.useState(3);
const [isOpenAddEditModal, setIsOpenAddEditModal] = useState(false);
const [term, setTerm] = useState('');
const tableInstance = useTable(
{
columns,
data,
setData,
isOpenAddEditModal,
setIsOpenAddEditModal,
manualPagination: true,
manualFilters: true,
manualSortBy: true,
autoResetPage: false,
autoResetSortBy: false,
pageCount,
initialState: { pageIndex: 0, sortBy: [{ id: 'name', desc: false }], hiddenColumns: ['id'] },
},
useGlobalFilter,
useSortBy,
usePagination,
useRowSelect,
useRowState
);
const {
state: { pageIndex, pageSize, sortBy },
} = tableInstance;
const fetchData = React.useCallback(async () => {
document.body.classList.add('spinner');
const response = await axios.get(`${SERVICE_URL}/datatable`, { params: { term, sortBy, pageSize, pageIndex } });
setTimeout(() => {
const { items, pageCount: pCount } = response.data;
setData(items);
setPageCount(pCount);
document.body.classList.remove('spinner');
}, 1000);
}, [sortBy, pageIndex, pageSize, term]);
const addItem = React.useCallback(
async ({ item }) => {
document.body.classList.add('spinner');
const response = await axios.post(`${SERVICE_URL}/datatable`, { sortBy, pageSize, pageIndex, item });
setTimeout(() => {
const { items, pageCount: pCount } = response.data;
setData(items);
setPageCount(pCount);
document.body.classList.remove('spinner');
}, 1000);
},
[sortBy, pageIndex, pageSize]
);
const editItem = React.useCallback(
async ({ item }) => {
document.body.classList.add('spinner');
const response = await axios.put(`${SERVICE_URL}/datatable`, { sortBy, pageSize, pageIndex, item });
setTimeout(() => {
const { items, pageCount: pCount } = response.data;
setData(items);
setPageCount(pCount);
document.body.classList.remove('spinner');
}, 1000);
},
[sortBy, pageIndex, pageSize]
);
const deleteItems = React.useCallback(
async ({ ids }) => {
document.body.classList.add('spinner');
const response = await axios.delete(`${SERVICE_URL}/datatable`, { sortBy, pageSize, pageIndex, ids });
setTimeout(() => {
const { items, pageCount: pCount } = response.data;
setData(items);
setPageCount(pCount);
document.body.classList.remove('spinner');
}, 1000);
},
[sortBy, pageIndex, pageSize]
);
const searchItem = useAsyncDebounce((val) => {
setTerm(val || undefined);
}, 200);
useEffect(() => {
fetchData();
}, [sortBy, fetchData, pageIndex, pageSize, term]);
return (
<>
<HtmlHead title={title} description={description} />
<Row>
<Col>
<div className="page-title-container">
<Row>
<Col xs="12" md="7">
<h1 className="mb-0 pb-0 display-4">{title}</h1>
<BreadcrumbList items={breadcrumbs} />
</Col>
<Col xs="12" md="5" className="d-flex align-items-start justify-content-end">
<ButtonsAddNew tableInstance={tableInstance} /> <ButtonsCheckAll tableInstance={tableInstance} />
</Col>
</Row>
</div>
<div>
<Row className="mb-3">
<Col sm="12" md="5" lg="3" xxl="2">
<div className="d-inline-block float-md-start me-1 mb-1 mb-md-0 search-input-container w-100 shadow bg-foreground">
<ControlsSearch tableInstance={tableInstance} onChange={searchItem} />
</div>
</Col>
<Col sm="12" md="7" lg="9" xxl="10" className="text-end">
<div className="d-inline-block me-0 me-sm-3 float-start float-md-none">
<ControlsAdd tableInstance={tableInstance} /> <ControlsEdit tableInstance={tableInstance} />{' '}
<ControlsDelete tableInstance={tableInstance} deleteItems={deleteItems} />
</div>
<div className="d-inline-block">
<ControlsPageSize tableInstance={tableInstance} />
</div>
</Col>
</Row>
<Row>
<Col xs="12">
<Table className="react-table rows" tableInstance={tableInstance} />
</Col>
<Col xs="12">
<TablePagination tableInstance={tableInstance} />
</Col>
</Row>
</div>
<ModalAddEdit tableInstance={tableInstance} addItem={addItem} editItem={editItem} />
</Col>
</Row>
</>
);
};
export default ServerSide;