|
- "use client";
- import React, { useState, FC } from 'react';
- import {
- Stack,
- Typography,
- FormControlLabel,
- Checkbox,
- Autocomplete,
- Button,
- Grid,
- TextField,
- CardHeader,
- Card,
- FormControl,
- InputLabel,
- Select,
- MenuItem,
- ThemeProvider
- } from '@mui/material';
- import { useForm, Controller } from 'react-hook-form';
- import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';
- import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';
- import dayjs from 'dayjs';
- import SearchIcon from '@mui/icons-material/Search';
- import RefreshIcon from '@mui/icons-material/Refresh';
- import { DemoItem } from '@mui/x-date-pickers/internals/demo';
- import { DatePicker } from '@mui/x-date-pickers/DatePicker';
-
- interface Field {
- id: any;
- label: any;
- type: string;
- options?: Array<{ id: string; label: string }>;
- setValue: ((value: any) => void) | Array<(value: any) => void>;
- value?: any;
- required?: boolean;
- }
-
- interface FormComponentProps {
- fields: Field[];
- onSubmit: (data: any) => void;
- resetForm: () => void;
- sx?: any;
- }
-
- interface SearchFormProps {
- applySearch: (data: any) => void;
- fields: Field[];
- title?: string;
- sx?: any;
- }
-
- const FormComponent: FC<FormComponentProps> = ({ fields, onSubmit, resetForm, sx }) => {
- const { reset, register, handleSubmit, control } = useForm();
- const [fromDate, setFromDate] = useState<dayjs.Dayjs | null>(null);
- const [dayRangeFromDate, setDayRangeFromDate] = useState<dayjs.Dayjs | null>(null);
- const [dayRangeToDate, setDayRangeToDate] = useState<dayjs.Dayjs | null>(null);
- const [value, setValue] = useState<{ [key: string]: any }>({});
- const [checkbox1, setCheckbox1] = useState(false);
-
- const handleFormSubmit = (data: any) => {
- if (fromDate != null || fromDate != undefined) {
- data.fromDate = dayjs(fromDate).format('YYYY-MM-DD');
- }
- if (value !== null) {
- data.dropdownCombo = value
- }
- if (value !== null) {
- data.checkbox = checkbox1;
- }
- if (dayRangeFromDate != null || dayRangeFromDate != undefined) {
- data.dayRangeFromDate = dayjs(dayRangeFromDate).format('YYYY-MM-DD');
- }
- if (dayRangeToDate != null || dayRangeToDate != undefined) {
- data.dayRangeToDate = dayjs(dayRangeToDate).format('YYYY-MM-DD');
- }
- onSubmit(data);
- };
-
- const handleFormReset = () => {
- reset();
- resetForm();
- setFromDate(null);
- fields.forEach((field) => {
- if (typeof(field.setValue) === "function") {
- field.setValue(typeof (field.value) === "boolean" ? false : null);
- } else if (Array.isArray(field.setValue)) {
- field.setValue.forEach((setFunc) => {
- setFunc(null);
- });
- }
- });
- };
-
- return (
- <form onSubmit={handleSubmit(handleFormSubmit)}>
- <Grid container alignItems="center">
- {fields.map((field) => {
- if (field.type === 'dropdown') {
- return (
- <Grid item xs={12} sm={5.5} md={5.5} lg={5.5} sx={{ ml: 3, mr: 3, mb: 3 }} key={field.id}>
- <FormControl fullWidth>
- <InputLabel id={`${field.id}-label`}>{field.label}</InputLabel>
- <Controller
- name={field.id}
- control={control}
- defaultValue=""
- render={({ field: { onChange, value } }) => (
- <Select
- labelId={`${field.id}-label`}
- id={field.id}
- value={value}
- onChange={(e) => {
- onChange(e.target.value);
- }}
- >
- {field.options?.map((option) => (
- <MenuItem
- value={option.id ?? JSON.stringify(option)}
- key={option.id ?? JSON.stringify(option)}
- >
- {option.id !== undefined ? option.label : JSON.stringify(option)}
- </MenuItem>
- ))}
- </Select>
- )}
- />
- </FormControl>
- </Grid>
- );
- } else if (field.type === 'date') {
- return (
- <Grid item xs={12} sm={5.5} md={5.5} lg={5.5} sx={{ ml: 3, mr: 3, mb: 3 }} key={field.id}>
- <LocalizationProvider dateAdapter={AdapterDayjs}>
- <DemoItem>
- <DatePicker
- slotProps={{
- textField: {
- id:field.id,
- },
- }}
- label={field.label}
- value={fromDate === null ? null : dayjs(fromDate)}
- onChange={(newValue) => {
- setFromDate(newValue);
- }}
- />
- </DemoItem>
- </LocalizationProvider>
- </Grid>
- );
- } else if (field.type === 'checkbox') {
- return (
- <Grid item xs={12} sm={5.5} md={5.5} lg={5.5} sx={{ ml: 3, mr: 3, mb: 3 }} key={field.id}>
- <FormControlLabel
- control={
- <Checkbox
- id={field.id}
- checked={field.value}
- onChange={(event) => {
- if (typeof field.setValue === 'function') {
- field.setValue(event.target.checked);
- setCheckbox1(event.target.checked);
- }
- }}
- color="primary"
- />
- }
- label={<Typography style={{fontSize:"1.15em"}}>{field.label}</Typography>}
- />
- </Grid>
- )
- } else if (field.type === 'dateRange') {
- return (
- <Grid container key={field.id[0]}>
- <Grid item xs={12} sm={7} md={7} lg={7} sx={{ ml: 3, mr: 3, mb: 3 }}>
- <Grid container>
- <Grid>
- <LocalizationProvider dateAdapter={AdapterDayjs}>
- <DatePicker
- label={field.label[0]}
- value={field.value[0]}
- onChange={(newValue) => setDayRangeFromDate(newValue)}
- />
- </LocalizationProvider>
- </Grid>
-
- <Grid item xs={1.5} sm={1.5} md={1.5} lg={1.5} sx={{ display: 'flex', justifyContent: "center", alignItems: 'center' }}>
- To
- </Grid>
-
- <Grid item xs={5.25} sm={5.25} md={5.25} lg={5.25}>
- <LocalizationProvider dateAdapter={AdapterDayjs}>
- <DatePicker
- label={field.label[1]}
- value={field.value[1]}
- onChange={(newValue) => setDayRangeToDate(newValue)}
- />
-
- </LocalizationProvider>
- </Grid>
- </Grid>
- </Grid>
- </Grid>
- )
- }
- return (
- <Grid item xs={12} sm={5.5} md={5.5} lg={5.5} sx={{ ml: 3, mr: 3, mb: 3 }} key={field.id}>
- <TextField
- fullWidth
- {...register(field.id)}
- id={field.id}
- label={field.label}
- defaultValue={field.value !== undefined && field.value !== null ? `${field.value}` : ''}
- required={field.required === true ? field.required : false}
- sx={{ ...sx }}
- />
- </Grid>
- );
- })}
- </Grid>
- <Grid container maxWidth="lg" justifyContent="space-between" style={{marginTop:-20}}>
- <Stack direction="row">
- <Grid item sx={{ ml: 3, mr: 3, mb: 3, mt: 3 }}>
- <Button className="h-12 w-32" style={{backgroundColor:"#92c1e9",color:"white",fontSize:"1.15em",fontWeight:100}} type="submit">
- <SearchIcon/> Search
- </Button>
- </Grid>
- <Grid item sx={{ ml: 3, mr: 3, mb: 3, mt: 3 }}>
- <Button className="h-12 w-32" style={{backgroundColor:"#f890a5",color:"white",fontSize:"1.15em",fontWeight:100}} onClick={handleFormReset}>
- <RefreshIcon/> Reset
- </Button>
- </Grid>
- </Stack>
- </Grid>
- </form>
- );
- };
-
- const CustomSearchForm: FC<SearchFormProps> = ({ applySearch, fields, title, sx }) => {
- const Title = title || "Searching Criteria";
-
- const handleSubmit = (data: any) => {
- if (applySearch) {
- applySearch(data);
- } else {
- console.log('applySearch function is null');
- }
- };
-
- const handleFormReset = () => {
- console.log('Form Reset');
- };
-
- return (
- <Card style={{marginRight:20}}>
- <CardHeader className="text-slate-500" style={{marginTop:-20}} titleTypographyProps={{ variant: 'h5' }} title={Title}></CardHeader>
- <FormComponent fields={fields} onSubmit={handleSubmit} resetForm={handleFormReset} sx={sx} />
- </Card>
- );
- };
-
- export default CustomSearchForm;
|