import React, { useEffect, useState, useMemo } from 'react'; import { createPortal } from 'react-dom'; import { ToastContainer, toast } from 'react-toastify'; import BaseButton from '../BaseButton'; import CardBoxModal from '../CardBoxModal'; import CardBox from '../CardBox'; import { fetch, update, deleteItem, setRefetch, deleteItemsByIds, } from '../../stores/users/usersSlice'; import { useAppDispatch, useAppSelector } from '../../stores/hooks'; import { useRouter } from 'next/router'; import { Field, Form, Formik } from 'formik'; import { DataGrid, GridColDef } from '@mui/x-data-grid'; import { loadColumns } from './configureUsersCols'; import _ from 'lodash'; import dataFormatter from '../../helpers/dataFormatter'; import { dataGridStyles } from '../../styles'; const perPage = 10; const TableSampleUsers = ({ filterItems, setFilterItems, filters, showGrid, }) => { const notify = (type, msg) => toast(msg, { type, position: 'bottom-center' }); const dispatch = useAppDispatch(); const router = useRouter(); const pagesList = []; const [id, setId] = useState(null); const [currentPage, setCurrentPage] = useState(0); const [filterRequest, setFilterRequest] = React.useState(''); const [columns, setColumns] = useState([]); const [selectedRows, setSelectedRows] = useState([]); const [sortModel, setSortModel] = useState([ { field: '', sort: 'desc', }, ]); const { users, loading, count, notify: usersNotify, refetch, } = useAppSelector((state) => state.users); const { currentUser } = useAppSelector((state) => state.auth); const focusRing = useAppSelector((state) => state.style.focusRingColor); const bgColor = useAppSelector((state) => state.style.bgLayoutColor); const corners = useAppSelector((state) => state.style.corners); const numPages = Math.floor(count / perPage) === 0 ? 1 : Math.ceil(count / perPage); for (let i = 0; i < numPages; i++) { pagesList.push(i); } const loadData = async (page = currentPage, request = filterRequest) => { if (page !== currentPage) setCurrentPage(page); if (request !== filterRequest) setFilterRequest(request); const { sort, field } = sortModel[0]; const query = `?page=${page}&limit=${perPage}${request}&sort=${sort}&field=${field}`; dispatch(fetch({ limit: perPage, page, query })); }; useEffect(() => { if (usersNotify.showNotification) { notify(usersNotify.typeNotification, usersNotify.textNotification); } }, [usersNotify.showNotification]); useEffect(() => { if (!currentUser) return; loadData(); }, [sortModel, currentUser]); useEffect(() => { if (refetch) { loadData(0); dispatch(setRefetch(false)); } }, [refetch, dispatch]); const [isModalInfoActive, setIsModalInfoActive] = useState(false); const [isModalTrashActive, setIsModalTrashActive] = useState(false); const handleModalAction = () => { setIsModalInfoActive(false); setIsModalTrashActive(false); }; const handleDeleteModalAction = (id: string) => { setId(id); setIsModalTrashActive(true); }; const handleDeleteAction = async () => { if (id) { await dispatch(deleteItem(id)); await loadData(0); setIsModalTrashActive(false); } }; const generateFilterRequests = useMemo(() => { let request = '&'; filterItems.forEach((item) => { const isRangeFilter = filters.find( (filter) => filter.title === item.fields.selectedField && (filter.number || filter.date), ); if (isRangeFilter) { const from = item.fields.filterValueFrom; const to = item.fields.filterValueTo; if (from) { request += `${item.fields.selectedField}Range=${from}&`; } if (to) { request += `${item.fields.selectedField}Range=${to}&`; } } else { const value = item.fields.filterValue; if (value) { request += `${item.fields.selectedField}=${value}&`; } } }); return request; }, [filterItems, filters]); const deleteFilter = (value) => { const newItems = filterItems.filter((item) => item.id !== value); if (newItems.length) { setFilterItems(newItems); } else { loadData(0, ''); setFilterItems(newItems); } }; const handleSubmit = () => { loadData(0, generateFilterRequests); }; const handleChange = (id) => (e) => { const value = e.target.value; const name = e.target.name; setFilterItems( filterItems.map((item) => { if (item.id !== id) return item; if (name === 'selectedField') return { id, fields: { [name]: value } }; return { id, fields: { ...item.fields, [name]: value } }; }), ); }; const handleReset = () => { setFilterItems([]); loadData(0, ''); }; const onPageChange = (page: number) => { loadData(page); setCurrentPage(page); }; useEffect(() => { if (!currentUser) return; loadColumns(handleDeleteModalAction, `users`, currentUser).then((newCols) => setColumns(newCols), ); }, [currentUser]); const handleTableSubmit = async (id: string, data) => { delete data?.password; if (!_.isEmpty(data)) { await dispatch(update({ id, data })) .unwrap() .then((res) => res) .catch((err) => { throw new Error(err); }); } }; const onDeleteRows = async (selectedRows) => { await dispatch(deleteItemsByIds(selectedRows)); await loadData(0); }; const controlClasses = 'w-full py-2 px-2 my-2 rounded dark:placeholder-gray-400 ' + ` ${bgColor} ${focusRing} ${corners} ` + 'dark:bg-slate-800 border'; const dataGrid = (
`datagrid--row`} rows={users ?? []} columns={columns} initialState={{ pagination: { paginationModel: { pageSize: 10, }, }, }} disableRowSelectionOnClick onProcessRowUpdateError={(params) => { console.log('Error', params); }} processRowUpdate={async (newRow, oldRow) => { const data = dataFormatter.dataGridEditFormatter(newRow); try { await handleTableSubmit(newRow.id, data); return newRow; } catch { return oldRow; } }} sortingMode={'server'} checkboxSelection onRowSelectionModelChange={(ids) => { setSelectedRows(ids); }} onSortModelChange={(params) => { params.length ? setSortModel(params) : setSortModel([{ field: '', sort: 'desc' }]); }} rowCount={count} pageSizeOptions={[10]} paginationMode={'server'} loading={loading} onPaginationModelChange={(params) => { onPageChange(params.page); }} />
); return ( <> {filterItems && Array.isArray(filterItems) && filterItems.length ? ( null} >
<> {filterItems && filterItems.map((filterItem) => { return (
Filter
{filters.map((selectOption) => ( ))}
{filters.find( (filter) => filter.title === filterItem?.fields?.selectedField, )?.type === 'enum' ? (
Value
{filters .find( (filter) => filter.title === filterItem?.fields?.selectedField, ) ?.options?.map((option) => ( ))}
) : filters.find( (filter) => filter.title === filterItem?.fields?.selectedField, )?.number ? (
From
To
) : filters.find( (filter) => filter.title === filterItem?.fields?.selectedField, )?.date ? (
From
To
) : (
Contains
)}
Action
{ deleteFilter(filterItem.id); }} />
); })}
) : null}

Are you sure you want to delete this item?

{dataGrid} {selectedRows.length > 0 && createPortal( onDeleteRows(selectedRows)} />, document.getElementById('delete-rows-button'), )} ); }; export default TableSampleUsers;