create custom components for fileds and start to get hand dirty on datepicker (step2)

This commit is contained in:
2024-06-01 17:19:56 +03:30
parent fddf629214
commit 474e6f3e8d
8 changed files with 287 additions and 46 deletions

View File

@@ -14,7 +14,7 @@ function HomeComponent() {
accessorKey: 'name.firstName', accessorKey: 'name.firstName',
header: 'نام', header: 'نام',
id: "firstName", id: "firstName",
enableColumnFilter: false, enableColumnFilter: true,
datatype: "text", datatype: "text",
filterFn: "contains", filterFn: "contains",
enableClickToCopy: true, enableClickToCopy: true,
@@ -67,7 +67,6 @@ function HomeComponent() {
"greaterThan", "greaterThan",
"fuzzy" "fuzzy"
], ],
}, },
{ {
accessorKey: 'state', accessorKey: 'state',
@@ -87,7 +86,7 @@ function HomeComponent() {
header: 'محدوده', header: 'محدوده',
id: "price", id: "price",
enableColumnFilter: true, enableColumnFilter: true,
datatype: "nemeric", datatype: "numeric",
filterFn: "between", filterFn: "between",
columnFilterModeOptions: [ columnFilterModeOptions: [
"equals", "equals",
@@ -102,23 +101,18 @@ function HomeComponent() {
enableColumnFilter: true, enableColumnFilter: true,
datatype: "date", datatype: "date",
filterFn: "between", filterFn: "between",
columnFilterModeOptions: [
"equals",
"notEquals",
"between"
],
}, },
{ {
accessorKey: 'company', accessorKey: 'company',
header: 'نام شرکت', header: 'نام شرکت',
id: "company", id: "company",
enableColumnFilter: true, enableColumnFilter: true,
datatype: "select2", datatype: "numeric",
filterFn: "equals", filterFn: "equals",
columnFilterModeOptions: [ columnSelectOption: [
"equals", {value: 1, label: "وایتل"},
"notEquals", {value: 2, label: "اسنپ"},
"contains" {value: 3, label: "تپسی"}
], ],
}, },
{ {
@@ -126,12 +120,12 @@ function HomeComponent() {
header: 'منطقه', header: 'منطقه',
id: "area", id: "area",
enableColumnFilter: true, enableColumnFilter: true,
datatype: "text", datatype: "numeric",
filterFn: "equals", filterFn: "equals",
columnFilterModeOptions: [ columnSelectOption: [
"equals", {value: 1, label: "وایتل"},
"notEquals", {value: 2, label: "اسنپ"},
"contains" {value: 3, label: "تپسی"}
], ],
}, },
], ],

View File

@@ -1,10 +1,14 @@
'use client' 'use client'
import {InputAdornment, TextField, Typography} from "@mui/material";
import FilterListIcon from '@mui/icons-material/FilterList';
import {useState} from "react"; import {useState} from "react";
import FilterOptionList from "@/core/components/DataTable/filter/FilterOptionList"; import FilterOptionList from "@/core/components/DataTable/filter/FilterOptionList";
import useTableSetting from "@/lib/hooks/useTableSetting"; import useTableSetting from "@/lib/hooks/useTableSetting";
import CustomSelect from "@/core/components/DataTable/filter/fieldsType/CustomSelect";
import CustomTextField from "@/core/components/DataTable/filter/fieldsType/CustomTextField";
import CustomTextFieldRange from "@/core/components/DataTable/filter/fieldsType/CustomTextFieldRange";
import CustomDatePicker from "@/core/components/DataTable/filter/fieldsType/CustomDatePicker";
import CustomSelectMultiple from "@/core/components/DataTable/filter/fieldsType/CustomSelectMultiple";
import CustomDatePickerRange from "@/core/components/DataTable/filter/fieldsType/CustomDatePickerRange";
const columnFilterModeOptionFa = { const columnFilterModeOptionFa = {
equals: "برابر", equals: "برابر",
@@ -25,40 +29,68 @@ function FilterBodyField({column, value}) {
const defaultFilter = (settingStore?.[userId]?.[pageName]?.[tableName]?.['filters'] || []).find(filter => filter.id === column.id)?.fn || column._filterFn; const defaultFilter = (settingStore?.[userId]?.[pageName]?.[tableName]?.['filters'] || []).find(filter => filter.id === column.id)?.fn || column._filterFn;
const defaultFilterTranslation = columnFilterModeOptionFa[defaultFilter] || defaultFilter; const defaultFilterTranslation = columnFilterModeOptionFa[defaultFilter] || defaultFilter;
const HandleOpenFilterBox = (event) => { const handleOpenFilterBox = (event) => {
setAnchorEl(event.currentTarget); setAnchorEl(event.currentTarget);
}; };
const handleCloseFilterBox = () => { const handleCloseFilterBox = () => {
setAnchorEl(null); setAnchorEl(null);
}; };
return ( return (
<> <>
<TextField {column.datatype === "numeric" && column._filterFn === "between" ? (
id={column.id} <CustomTextFieldRange
label={column.header} column={column}
value={value} value={value}
fullWidth defaultFilterTranslation={defaultFilterTranslation}
helperText={<Typography variant="button" sx={{color: "#16534a"}}> handleOpenFilterBox={handleOpenFilterBox}
نوع فیلتر: {defaultFilterTranslation} />
</Typography>} ) : column.datatype === "numeric" && column._filterFn === "equals" && Array.isArray(column.columnSelectOption) ? (
variant="outlined" <CustomSelect
size="normal" column={column}
sx={{marginY: 1}} value={value}
InputProps={{ defaultFilterTranslation={defaultFilterTranslation}
endAdornment: ( handleOpenFilterBox={handleOpenFilterBox}
<InputAdornment position="end" sx={{cursor: "pointer"}} onClick={HandleOpenFilterBox}> />
<FilterListIcon/> ) : column.datatype === "date" && column._filterFn === "equals" ? (
</InputAdornment> <CustomDatePicker
), column={column}
}} value={value}
/> defaultFilterTranslation={defaultFilterTranslation}
<FilterOptionList handleCloseFilterBox={handleCloseFilterBox} anchorEl={anchorEl} handleOpenFilterBox={handleOpenFilterBox}
filterOption={column.columnFilterModeOptions} />
defaultFilter={defaultFilter} ) : column.datatype === "date" && column._filterFn === "between" ? (
columnFilterModeOptionFa={columnFilterModeOptionFa}/> <CustomDatePickerRange
column={column}
value={value}
defaultFilterTranslation={defaultFilterTranslation}
handleOpenFilterBox={handleOpenFilterBox}
/>
) : column.datatype === "array" && column._filterFn === "equals" ? (
<CustomSelectMultiple
column={column}
value={value}
defaultFilterTranslation={defaultFilterTranslation}
handleOpenFilterBox={handleOpenFilterBox}
/>
) : (
<CustomTextField
column={column}
value={value}
defaultFilterTranslation={defaultFilterTranslation}
handleOpenFilterBox={handleOpenFilterBox}
/>
)}
{Array.isArray(column.columnFilterModeOptions) && anchorEl !== null && (
<FilterOptionList
handleCloseFilterBox={handleCloseFilterBox}
anchorEl={anchorEl}
filterOption={column.columnFilterModeOptions}
defaultFilter={defaultFilter}
columnFilterModeOptionFa={columnFilterModeOptionFa}
/>
)}
</> </>
); );
} }
export default FilterBodyField; export default FilterBodyField;

View File

@@ -0,0 +1,30 @@
'use client'
import {InputAdornment, TextField, Typography} from "@mui/material";
import FilterListIcon from '@mui/icons-material/FilterList';
function CustomDatePicker({column, value, defaultFilterTranslation, handleOpenFilterBox}) {
return (
<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>
),
}}
/>
);
}
export default CustomDatePicker;

View File

@@ -0,0 +1,30 @@
'use client'
import {InputAdornment, TextField, Typography} from "@mui/material";
import FilterListIcon from '@mui/icons-material/FilterList';
function CustomDatePickerRange({column, value, defaultFilterTranslation, handleOpenFilterBox}) {
return (
<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>
),
}}
/>
);
}
export default CustomDatePickerRange;

View File

@@ -0,0 +1,44 @@
'use client'
import {FormControl, FormHelperText, InputLabel, MenuItem, OutlinedInput, Select, Typography} from "@mui/material";
import {useState} from "react";
function CustomSelect({column, value, defaultFilterTranslation}) {
const [fieldValue, setFieldValue] = useState(value);
const columnSelectOption = column.columnSelectOption;
const handleChange = (event) => {
setFieldValue(event.target.value);
};
return (
<FormControl fullWidth sx={{marginY: 1}}>
<InputLabel htmlFor="uncontrolled-native"
id={`label${column.id}`}>{column.header}</InputLabel>
<Select
labelId={`label${column.id}`}
id={column.id}
name={column.header}
value={fieldValue}
input={<OutlinedInput label={column.header}/>}
onChange={handleChange}
>
{columnSelectOption.map((option) => (
<MenuItem
key={option.value}
value={option.value}
>
{option.label}
</MenuItem>
))}
</Select>
<FormHelperText>
<Typography variant="button" sx={{color: "#16534a"}}>
نوع فیلتر: {defaultFilterTranslation}
</Typography>
</FormHelperText>
</FormControl>
);
}
export default CustomSelect;

View File

@@ -0,0 +1,36 @@
'use client'
import {FormControl, FormHelperText, InputLabel, MenuItem, OutlinedInput, Select, Typography} from "@mui/material";
function CustomSelectMultiple({column, value, defaultFilterTranslation}) {
const columnSelectOption = column.columnSelectOption;
return (
<FormControl fullWidth sx={{marginY: 1}}>
<InputLabel htmlFor="uncontrolled-native"
id={`label${column.id}`}>{column.header}</InputLabel>
<Select
labelId={`label${column.id}`}
id={column.id}
value={value}
input={<OutlinedInput label={column.header}/>}
// onChange={handleChange}
>
{columnSelectOption.map((option) => (
<MenuItem
key={option.value}
value={option.value}
>
{option.label}
</MenuItem>
))}
</Select>
<FormHelperText>
<Typography variant="button" sx={{color: "#16534a"}}>
نوع فیلتر: {defaultFilterTranslation}
</Typography>
</FormHelperText>
</FormControl>
);
}
export default CustomSelectMultiple;

View File

@@ -0,0 +1,30 @@
'use client'
import {InputAdornment, TextField, Typography} from "@mui/material";
import FilterListIcon from '@mui/icons-material/FilterList';
function CustomTextField({column, value, defaultFilterTranslation, handleOpenFilterBox}) {
return (
<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>
),
}}
/>
);
}
export default CustomTextField;

View File

@@ -0,0 +1,45 @@
'use client'
import {Box, InputAdornment, TextField, Typography} from "@mui/material";
import FilterListIcon from '@mui/icons-material/FilterList';
function CustomTextFieldRange({column, value, defaultFilterTranslation, handleOpenFilterBox}) {
return (
<Box sx={{display: "flex"}}>
<TextField
id={column.id}
label={<Typography>
از {column.header}
</Typography>}
value={value}
fullWidth
helperText={<Typography variant="button" sx={{color: "#16534a"}}>
نوع فیلتر: {defaultFilterTranslation}
</Typography>}
variant="outlined"
size="normal"
sx={{marginY: 1, marginRight: 1}}
/>
<TextField
id={column.id}
label={<Typography>
تا {column.header}
</Typography>}
value={value}
fullWidth
variant="outlined"
size="normal"
sx={{marginY: 1}}
InputProps={{
endAdornment: (
<InputAdornment position="end" sx={{cursor: "pointer"}} onClick={handleOpenFilterBox}>
<FilterListIcon/>
</InputAdornment>
),
}}
/>
</Box>
);
}
export default CustomTextFieldRange;