CFE-24 fixed any bug and fixed performance datatable

This commit is contained in:
AmirHossein Mahmoodi
2023-10-10 16:06:17 +03:30
parent 606c167e3a
commit c265010d7f

View File

@@ -9,56 +9,45 @@ import useRequest from "@/lib/app/hooks/useRequest";
function DataTable(props) { function DataTable(props) {
const requestServer = useRequest({auth: true}) const requestServer = useRequest({auth: true})
const fetcher = (...args) => {
return requestServer(args, 'get', {
pending: false,
success: {notification: {show: false}}
}).then((response) => {
setRowCount(response.data.meta.totalRowCount);
return response.data.data;
}).catch(() => {
})
};
const t = useTranslations(); const t = useTranslations();
const {languageApp, languageList} = useLanguage(); const {languageApp, languageList} = useLanguage();
const [columnFilters, setColumnFilters] = useState([]); const [columnFilters, setColumnFilters] = useState([]);
const [sorting, setSorting] = useState([]); const [sorting, setSorting] = useState([]);
const [pagination, setPagination] = useState({pageIndex: 0, pageSize: 10}); const [pagination, setPagination] = useState({pageIndex: 0, pageSize: 10});
const [rowCount, setRowCount] = useState(0);
const [columnFilterFns, setColumnFilterFns] = useState(() => { const [columnFilterFns, setColumnFilterFns] = useState(() => {
let output = {}; let output = {};
const list = props.columns.map((item) => const list = props.columns.map((item) =>
item.enableColumnFilter ? {[item.id]: item.filterFn} : {[item.id]: ""} item.enableColumnFilter ? {[item.id]: item.filterFn} : {[item.id]: ""}
); );
for (var key in list) { for (const key in list) {
var nestedObj = list[key]; const nestedObj = list[key];
for (var nestedKey in nestedObj) { for (const nestedKey in nestedObj) {
output[nestedKey] = nestedObj[nestedKey]; output[nestedKey] = nestedObj[nestedKey];
} }
} }
return output; return output;
}); });
const [updateTime, setupdateTime] = useState( const [updateTime, setUpdateTime] = useState(
moment().format("HH:mm | jYYYY/jM/jD") moment().format("HH:mm | jYYYY/jM/jD")
); );
const tableLocalization = useMemo( const tableLocalization = useMemo(
() => () =>
languageList.find((item) => item.key == languageApp).tableLocalization, languageList.find((item) => item.key === languageApp).tableLocalization,
[languageApp, languageList] [languageApp, languageList]
); );
const fetchUrl = useMemo(() => { const fetchUrl = useMemo(() => {
const url = new URL(props.tableUrl); const params = new URLSearchParams();
url.searchParams.set( params.set(
"start", "start",
`${pagination.pageIndex * pagination.pageSize}` `${pagination.pageIndex * pagination.pageSize}`
); );
const filters = columnFilters.map((filter) => { const filters = columnFilters.map((filter) => {
let datatype; let datatype;
for (const i in props.columns) { for (const i in props.columns) {
if (props.columns[i].id == filter.id) { if (props.columns[i].id === filter.id) {
datatype = props.columns[i].datatype; datatype = props.columns[i].datatype;
} }
} }
@@ -68,10 +57,10 @@ function DataTable(props) {
datatype: datatype, datatype: datatype,
}; };
}); });
url.searchParams.set("size", pagination.pageSize); params.set("size", pagination.pageSize);
url.searchParams.set("filters", JSON.stringify(filters ?? [])); params.set("filters", JSON.stringify(filters ?? []));
url.searchParams.set("sorting", JSON.stringify(sorting ?? [])); params.set("sorting", JSON.stringify(sorting ?? []));
return url; return `${props.tableUrl}?${params}`;
}, [ }, [
props.tableUrl, props.tableUrl,
columnFilters, columnFilters,
@@ -81,20 +70,27 @@ function DataTable(props) {
props.columns, props.columns,
]); ]);
const {data, isValidating, mutate} = useSWR(fetchUrl, fetcher, { const {data, isValidating, mutate} = useSWR(fetchUrl, (...args) =>
revalidateIfStale: false, requestServer(args, 'get', {
revalidateOnFocus: false, pending: false,
revalidateOnReconnect: false success: {notification: {show: false}}
}); }).then((response) => response.data).catch(() => {
})
, {
revalidateIfStale: false,
revalidateOnFocus: false,
revalidateOnReconnect: true,
keepPreviousData: true
});
useEffect(() => { useEffect(() => {
setupdateTime(moment().format("HH:mm | jYYYY/jM/jD")); setUpdateTime(moment().format("HH:mm | jYYYY/jM/jD"));
}, [isValidating, languageApp]); }, [isValidating, languageApp]);
return ( return (
<MaterialReactTable <MaterialReactTable
localization={tableLocalization} localization={tableLocalization}
data={data ?? []} data={data?.data ?? []}
manualFiltering manualFiltering
manualPagination manualPagination
manualSorting manualSorting
@@ -125,7 +121,7 @@ function DataTable(props) {
}} }}
enableColumnFilterModes enableColumnFilterModes
muiTablePaperProps={{elevation: 0}} muiTablePaperProps={{elevation: 0}}
rowCount={rowCount} rowCount={data?.meta.totalRowCount}
onColumnFilterFnsChange={setColumnFilterFns} onColumnFilterFnsChange={setColumnFilterFns}
onColumnFiltersChange={setColumnFilters} onColumnFiltersChange={setColumnFilters}
onPaginationChange={setPagination} onPaginationChange={setPagination}
@@ -134,7 +130,7 @@ function DataTable(props) {
renderTopToolbarCustomActions={({table}) => ( renderTopToolbarCustomActions={({table}) => (
<> <>
{props.enableCustomToolbar /* send condition */ {props.enableCustomToolbar /* send condition */
? <props.CustomToolbar fetchUrl={fetchUrl} mutate={mutate} /> /* send component */ ? <props.CustomToolbar fetchUrl={fetchUrl} mutate={mutate}/> /* send component */
: "<span></span>"} : "<span></span>"}
</> </>
)} )}
@@ -159,6 +155,7 @@ function DataTable(props) {
</> </>
)} )}
state={{ state={{
showProgressBars: isValidating,
columnFilters, columnFilters,
columnFilterFns, columnFilterFns,
pagination, pagination,