UNPKG

@diagramers/admin

Version:

Diagramers Admin Template - React starter for admin dashboards.

219 lines (203 loc) 7.72 kB
/* 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;