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/projects/projectsSlice' 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 "./configureProjectsCols"; import _ from 'lodash'; import dataFormatter from '../../helpers/dataFormatter' import {dataGridStyles} from "../../styles"; const perPage = 100 const TableProjects = ({ filterItems, setFilterItems, filters }) => { const notify = (type, msg) => toast( msg, {type, position: "bottom-center"}); const dispatch = useAppDispatch(); const router = useRouter(); 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 { projects, loading, count, notify: projectsNotify, refetch } = useAppSelector((state) => state.projects) 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 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 (projectsNotify.showNotification) { notify(projectsNotify.typeNotification, projectsNotify.textNotification); } }, [projectsNotify.showNotification]); useEffect(() => { if (!currentUser) return; loadData(); }, [sortModel, currentUser]); useEffect(() => { if (refetch) { loadData(0); dispatch(setRefetch(false)); } }, [refetch, dispatch]); const [isModalTrashActive, setIsModalTrashActive] = useState(false) const handleModalAction = () => { 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, `projects`, currentUser, ).then((newCols) => setColumns(newCols)); }, [currentUser]); const handleTableSubmit = async (id: string, data) => { 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'; 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--row`} rows={projects ?? []} columns={columns} initialState={{ pagination: { paginationModel: { pageSize: 10, }, }, }} disableRowSelectionOnClick 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); }} />
{selectedRows.length > 0 && createPortal( onDeleteRows(selectedRows)} />, document.getElementById('delete-rows-button'), )} ) } export default TableProjects