design filter part and do step1 (default value for filterFn)

This commit is contained in:
2024-05-25 17:32:26 +03:30
parent 23f1b9a4b1
commit fddf629214
5 changed files with 232 additions and 60 deletions

View File

@@ -1,58 +1,103 @@
'use client'
import {Box, Drawer, IconButton, Typography} from "@mui/material";
import CancelIcon from '@mui/icons-material/Cancel';
import {Box, Button, Drawer, styled} from "@mui/material";
import {Form, Formik} from "formik";
import useTableSetting from "@/lib/hooks/useTableSetting";
import {useEffect, useState} from "react";
import FilterBodyField from "@/core/components/DataTable/filter/FilterBodyField";
import FilterHeader from "@/core/components/DataTable/filter/FilterHeader";
const ScrollBox = styled(Box)({
flexGrow: 1,
padding: '16px',
overflowY: 'scroll',
maxWidth: "450px",
'::-webkit-scrollbar': {
width: '5px',
},
'::-webkit-scrollbar-track': {
boxShadow: 'inset 0 0 5px #fff',
borderRadius: '5px',
},
'::-webkit-scrollbar-thumb': {
background: '#16534a',
borderRadius: '0px',
},
'::-webkit-scrollbar-thumb:hover': {
background: '#ffffff',
},
});
function FilterBody({columns, drawerState, setDrawerState}) {
// const initialValues = columns.reduce((acc, column) => {
// if (column.enableColumnFilter) {
// const filter = settingStore?.[userId]?.[pageName]?.[tableName]?.['filters']?.find((filter) => filter.id === column.id);
// if (column.filterFn === 'betweenNum' || column.filterFn === 'betweenDate') {
// acc[column.id] = filter?.value || ["", ""];
// } else if (column.type === 'select2') {
// acc[column.id] = filter?.value || [];
// } else {
// acc[column.id] = filter?.value || '';
// }
// }
// return acc;
// }, {});
// const initialValues = {};
const [userId, setUserId] = useState(0);
const [pageName, setPageName] = useState('testPage');
const [tableName, setTableName] = useState('testTable');
const {settingStore, filterAction} = useTableSetting();
const [initialValues, setInitialValues] = useState({});
useEffect(() => {
const values = columns.reduce((acc, column) => {
if (!column.enableColumnFilter) return acc;
const filter = settingStore?.[userId]?.[pageName]?.[tableName]?.['filters']?.find((filter) => filter.id === column.id);
if (column.datatype === 'select2') {
acc[column.id] = filter?.value || [];
} else {
acc[column.id] = filter?.value || '';
}
return acc;
}, {});
setInitialValues(values);
}, [columns, settingStore, userId, pageName, tableName]);
const handleSubmit = (values) => {
console.log("Form values:", values);
};
return (
<Drawer open={drawerState} onClose={() => {
setDrawerState(false)
}}>
<Box
sx={{
display: "flex",
alignItems: "center",
justifyContent: "space-between",
px: 2,
py: 1,
backgroundColor: "#095b8c",
width: 400
}}>
<Typography variant="h5" sx={{color: "#fff"}}>فیلتر</Typography>
<IconButton sx={{color: "#fff"}} onClick={() => {
setDrawerState(false)
}}>
<CancelIcon sx={{fontSize: "1.2em"}}/>
</IconButton>
</Box>
<Box sx={{display: "flex", flexDirection: "column"}}>
{/*<Formik*/}
{/* initialValues={initialValues}*/}
{/* onSubmit={handleSubmit}*/}
{/* validationSchema={validationSchema}*/}
{/*>*/}
{columns.map((column) => {
<FilterBodyField column={column}/>
})}
{/*</Formik>*/}
<Drawer open={drawerState} onClose={() => setDrawerState(false)}
sx={{overflowY: "hidden", display: "flex", flexDirection: "column", height: "100%"}}>
<FilterHeader setDrawerState={setDrawerState}/>
<ScrollBox>
{Object.keys(initialValues).length > 0 && (
<Formik
initialValues={initialValues}
onSubmit={handleSubmit}
>
{({values, handleChange, handleBlur}) => (
<Form>
{columns.map((column) => (
column.enableColumnFilter && (
<FilterBodyField
key={column.id}
column={column}
value={values[column.id]}
onChange={handleChange}
onBlur={handleBlur}
/>
)
))}
</Form>
)}
</Formik>
)}
</ScrollBox>
<Box sx={{
display: 'flex',
justifyContent: 'center',
alignItems: 'center',
boxShadow: "rgba(0, 0, 0, 0.23) 0px 6px 6px, rgba(0, 0, 0, 0.19) 10px 0px 20px",
py: 1,
}}>
<Button variant="contained" size="large" onClick={handleSubmit}
sx={{
backgroundColor: "#16534a", ':hover': {
backgroundColor: "#16534a",
}, width: "50%"
}}>اعمال فیلتر</Button>
</Box>
</Drawer>
);
}
export default FilterBody;
export default FilterBody;

View File

@@ -1,8 +1,63 @@
'use client'
function FilterBodyField({column}) {
import {InputAdornment, TextField, Typography} from "@mui/material";
import FilterListIcon from '@mui/icons-material/FilterList';
import {useState} from "react";
import FilterOptionList from "@/core/components/DataTable/filter/FilterOptionList";
import useTableSetting from "@/lib/hooks/useTableSetting";
const columnFilterModeOptionFa = {
equals: "برابر",
notEquals: "نابرابر",
contains: "شامل",
lessThan: "کوچکتر",
greaterThan: "بزرگتر",
fuzzy: "فازی",
between: "مابین"
}
function FilterBodyField({column, value}) {
const [anchorEl, setAnchorEl] = useState(null);
const [userId, setUserId] = useState(0);
const [pageName, setPageName] = useState('testPage');
const [tableName, setTableName] = useState('testTable');
const {settingStore} = useTableSetting();
const defaultFilter = (settingStore?.[userId]?.[pageName]?.[tableName]?.['filters'] || []).find(filter => filter.id === column.id)?.fn || column._filterFn;
const defaultFilterTranslation = columnFilterModeOptionFa[defaultFilter] || defaultFilter;
const HandleOpenFilterBox = (event) => {
setAnchorEl(event.currentTarget);
};
const handleCloseFilterBox = () => {
setAnchorEl(null);
};
return (
asdasdasd
<>
<TextField
id={column.id}
label={column.header}
value={value}
fullWidth
helperText={<Typography variant="button" sx={{color: "#16534a"}}>
نوع فیلتر: {defaultFilterTranslation}
</Typography>}
variant="outlined"
size="normal"
sx={{marginY: 1}}
InputProps={{
endAdornment: (
<InputAdornment position="end" sx={{cursor: "pointer"}} onClick={HandleOpenFilterBox}>
<FilterListIcon/>
</InputAdornment>
),
}}
/>
<FilterOptionList handleCloseFilterBox={handleCloseFilterBox} anchorEl={anchorEl}
filterOption={column.columnFilterModeOptions}
defaultFilter={defaultFilter}
columnFilterModeOptionFa={columnFilterModeOptionFa}/>
</>
);
}

View File

@@ -0,0 +1,32 @@
'use client'
import {Box, IconButton, Typography} from "@mui/material";
import CancelIcon from '@mui/icons-material/Cancel';
import FilterAltIcon from '@mui/icons-material/FilterAlt';
function FilterHeader({setDrawerState}) {
return (
<Box
sx={{
display: "flex",
alignItems: "center",
justifyContent: "space-between",
px: 2,
py: 1,
backgroundColor: "#16534a",
boxShadow: "rgba(0, 0, 0, 0.19) 0px 10px 20px, rgba(0, 0, 0, 0.23) 0px 6px 6px",
maxWidth: "450px"
}}
>
<Box sx={{display: "flex", alignItems: "center"}}>
<FilterAltIcon sx={{color: "#fff"}}/>
<Typography variant="h6" sx={{color: "#fff"}}>فیلتر</Typography>
</Box>
<IconButton sx={{color: "#fff"}} onClick={() => setDrawerState(false)}>
<CancelIcon sx={{fontSize: "1em"}}/>
</IconButton>
</Box>
);
}
export default FilterHeader;

View File

@@ -0,0 +1,29 @@
'use client'
import {ListItem, Menu} from "@mui/material";
import {useState} from "react";
function FilterOptionList({defaultFilter, filterOption, handleCloseFilterBox, anchorEl, columnFilterModeOptionFa}) {
const [selectedFilter, setSelectedFilter] = useState(defaultFilter);
return (
<Menu
id="simple-menu"
anchorEl={anchorEl}
keepMounted
open={Boolean(anchorEl)}
onClose={handleCloseFilterBox}
>
{filterOption.map((option, index) => (
<ListItem key={index}
selected={option === selectedFilter}
sx={{cursor: 'pointer', width: "100px", display: "flex", justifyContent: "center"}}>
{columnFilterModeOptionFa[option]}
</ListItem>
))}
</Menu>
);
}
export default FilterOptionList;