@campxdev/shared 1.4.6 → 1.4.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@campxdev/shared",
3
- "version": "1.4.6",
3
+ "version": "1.4.8",
4
4
  "main": "./exports.ts",
5
5
  "scripts": {
6
6
  "start": "react-scripts start",
@@ -42,6 +42,7 @@
42
42
  "react": "^18.2.0",
43
43
  "react-dom": "^18.2.0",
44
44
  "react-error-boundary": "^3.1.4",
45
+ "react-flatpickr": "^3.10.13",
45
46
  "react-hook-form": "^7.40.0",
46
47
  "react-query": "^3.39.0",
47
48
  "react-router-dom": "^6.4.2",
@@ -52,6 +53,7 @@
52
53
  "yup": "^0.32.11"
53
54
  },
54
55
  "devDependencies": {
56
+ "@types/react-flatpickr": "^3.8.8",
55
57
  "@storybook/addon-actions": "^6.5.14",
56
58
  "@storybook/addon-essentials": "^6.5.14",
57
59
  "@storybook/addon-interactions": "^6.5.14",
@@ -1,65 +1,40 @@
1
- import { Box, TextField, Typography } from '@mui/material'
2
- import { DatePicker, LocalizationProvider } from '@mui/x-date-pickers'
3
- import { AdapterMoment } from '@mui/x-date-pickers/AdapterMoment'
4
1
  import { Controller } from 'react-hook-form'
5
- import FormLabel from './FormLabel'
6
- interface Props {
7
- label?: string
2
+ import { DatePicker } from '../Input'
3
+ import { IDatePicker } from '../Input/DatePicker'
4
+ interface Props extends Omit<IDatePicker, 'onChange' | 'value'> {
8
5
  name: string
9
- size?: 'small' | 'medium'
10
6
  control: any
11
- minDate?: any
12
- maxDate?: any
13
- required?: boolean
14
7
  }
15
- export default function FormDatePicker(props: Props) {
16
- const {
17
- name,
18
- size = 'small',
19
- control,
20
- label = '',
21
- minDate,
22
- maxDate,
23
- required = false,
24
- } = props
8
+
9
+ export default function FormDatePicker({
10
+ name,
11
+ control,
12
+ minDate,
13
+ maxDate,
14
+ label,
15
+ required = false,
16
+ ...rest
17
+ }: Props) {
25
18
  return (
26
- <LocalizationProvider dateAdapter={AdapterMoment}>
27
- <Controller
28
- name={name}
29
- control={control}
30
- render={({ field, fieldState: { error } }) => (
31
- <Box>
32
- <DatePicker
33
- label={<FormLabel label={label} required={required} />}
34
- mask="__/__/____"
35
- inputFormat="DD/MM/yyyy"
36
- value={field.value ?? null}
37
- onChange={field.onChange}
38
- minDate={minDate}
39
- maxDate={maxDate}
40
- renderInput={(params) => (
41
- <TextField
42
- fullWidth
43
- size={size}
44
- {...params}
45
- error={Boolean(error)}
46
- onBlur={field.onBlur}
47
- />
48
- )}
49
- />
50
- {error && (
51
- <Typography
52
- variant="caption"
53
- component={'div'}
54
- sx={{ pl: '2px' }}
55
- color="rgb(211, 47, 47)"
56
- >
57
- {error.message}
58
- </Typography>
59
- )}
60
- </Box>
61
- )}
62
- />
63
- </LocalizationProvider>
19
+ <Controller
20
+ name={name}
21
+ control={control}
22
+ render={({ field, fieldState: { error } }) => (
23
+ <DatePicker
24
+ label={label}
25
+ required={required}
26
+ onChange={field.onChange}
27
+ value={field.value}
28
+ minDate={minDate}
29
+ maxDate={maxDate}
30
+ inputProps={{
31
+ ...rest.inputProps,
32
+ error: !!error,
33
+ helperText: error?.message ?? '',
34
+ }}
35
+ {...rest}
36
+ />
37
+ )}
38
+ />
64
39
  )
65
40
  }
@@ -1,70 +1,47 @@
1
- import { InputAdornment, TextField, Typography } from '@mui/material'
2
- import { DateTimePicker, LocalizationProvider } from '@mui/x-date-pickers'
3
- import { AdapterMoment } from '@mui/x-date-pickers/AdapterMoment'
4
1
  import { Controller } from 'react-hook-form'
5
- import DateRangeIcon from '@mui/icons-material/DateRange'
6
- interface Props {
7
- label?: string
2
+ import DateTimePicker, { IDateTimePicker } from '../Input/DateTimePicker'
3
+
4
+ interface Props extends Omit<IDateTimePicker, 'onChange' | 'value'> {
8
5
  name: string
9
- size?: 'small' | 'medium'
10
6
  control: any
11
- required?: boolean
12
- minDate?: any
13
7
  }
14
- export default function FormDateTimePicker(props: Props) {
15
- const { name, size = 'small', control, label = '', required, minDate } = props
8
+
9
+ export default function FormDateTimePicker({
10
+ name,
11
+ control,
12
+ label,
13
+ required,
14
+ minDate,
15
+ maxDate,
16
+ minTime,
17
+ maxTime,
18
+ ...rest
19
+ }: Props) {
16
20
  return (
17
- <LocalizationProvider dateAdapter={AdapterMoment}>
18
- <Controller
19
- name={name}
20
- control={control}
21
- render={({ field, fieldState: { error } }) => (
22
- <>
23
- <DateTimePicker
24
- label={
25
- <>
26
- {label}
27
- {required && (
28
- <Typography fontSize={14} component={'span'} color="error">
29
- {' *'}
30
- </Typography>
31
- )}
32
- </>
33
- }
34
- minDate={minDate && minDate}
35
- mask="__/__/____ __:__ _M"
36
- inputFormat="DD/MM/yyyy hh:mm a"
37
- value={field.value || null}
38
- onChange={field.onChange}
39
- InputProps={{
40
- endAdornment: (
41
- <InputAdornment position="end">
42
- <DateRangeIcon />
43
- </InputAdornment>
44
- ),
45
- }}
46
- renderInput={(params) => (
47
- <TextField
48
- fullWidth
49
- size={size}
50
- {...params}
51
- error={Boolean(error)}
52
- onBlur={field.onBlur}
53
- />
54
- )}
55
- />
56
- {error && (
57
- <Typography
58
- variant="caption"
59
- sx={{ pl: '2px' }}
60
- color="rgb(211, 47, 47)"
61
- >
62
- {error.message}
63
- </Typography>
64
- )}
65
- </>
66
- )}
67
- />
68
- </LocalizationProvider>
21
+ <Controller
22
+ name={name}
23
+ control={control}
24
+ render={({ field, fieldState: { error } }) => (
25
+ <DateTimePicker
26
+ name={name}
27
+ label={label}
28
+ required={required}
29
+ onChange={(v) => {
30
+ field.onChange(v)
31
+ }}
32
+ value={field.value}
33
+ minDate={minDate}
34
+ maxDate={maxDate}
35
+ minTime={minTime}
36
+ maxTime={maxTime}
37
+ inputProps={{
38
+ ...rest.inputProps,
39
+ error: !!error,
40
+ helperText: error?.message ?? '',
41
+ }}
42
+ {...rest}
43
+ />
44
+ )}
45
+ />
69
46
  )
70
47
  }
@@ -1,82 +1,40 @@
1
- import DateRangeIcon from '@mui/icons-material/DateRange'
2
- import { InputAdornment, TextField, Typography } from '@mui/material'
3
- import {
4
- LocalizationProvider,
5
- TimePicker as MuiTimePicker,
6
- } from '@mui/x-date-pickers'
7
- import { AdapterMoment } from '@mui/x-date-pickers/AdapterMoment'
8
1
  import { Controller } from 'react-hook-form'
2
+ import TimePicker, { ITimePicker } from '../Input/TimePicker'
9
3
 
10
- interface Props {
11
- label?: string
4
+ interface Props extends Omit<ITimePicker, 'onChange' | 'value'> {
12
5
  name: string
13
- size?: 'small' | 'medium'
14
6
  control: any
15
- required?: boolean
16
- hookForm?: boolean
17
7
  }
18
8
 
19
- export default function FormTimePicker(props: Props) {
20
- const {
21
- name,
22
- size = 'small',
23
- control,
24
- label = '',
25
- required,
26
- hookForm = true,
27
- } = props
28
-
9
+ export default function FormTimePicker({
10
+ name,
11
+ control,
12
+ label,
13
+ minTime,
14
+ maxTime,
15
+ required,
16
+ ...rest
17
+ }: Props) {
29
18
  return (
30
- <LocalizationProvider dateAdapter={AdapterMoment}>
31
- <Controller
32
- name={name}
33
- control={control}
34
- render={({ field, fieldState: { error } }) => (
35
- <>
36
- <MuiTimePicker
37
- label={
38
- <>
39
- {label}
40
- {required && (
41
- <Typography fontSize={14} component={'span'} color="error">
42
- {' *'}
43
- </Typography>
44
- )}
45
- </>
46
- }
47
- mask="__:__ _M"
48
- inputFormat="hh:mm a"
49
- value={field.value || null}
50
- onChange={field.onChange}
51
- InputProps={{
52
- endAdornment: (
53
- <InputAdornment position="end">
54
- <DateRangeIcon />
55
- </InputAdornment>
56
- ),
57
- }}
58
- renderInput={(params) => (
59
- <TextField
60
- fullWidth
61
- size={size}
62
- {...params}
63
- error={Boolean(error)}
64
- onBlur={field.onBlur}
65
- />
66
- )}
67
- />
68
- {error && (
69
- <Typography
70
- variant="caption"
71
- sx={{ pl: '2px' }}
72
- color="rgb(211, 47, 47)"
73
- >
74
- {error.message}
75
- </Typography>
76
- )}
77
- </>
78
- )}
79
- />
80
- </LocalizationProvider>
19
+ <Controller
20
+ name={name}
21
+ control={control}
22
+ render={({ field, fieldState: { error } }) => (
23
+ <TimePicker
24
+ label={label}
25
+ required={required}
26
+ onChange={field.onChange}
27
+ value={field.value}
28
+ minTime={minTime}
29
+ maxTime={maxTime}
30
+ inputProps={{
31
+ ...rest.inputProps,
32
+ error: !!error,
33
+ helperText: error?.message ?? '',
34
+ }}
35
+ {...rest}
36
+ />
37
+ )}
38
+ />
81
39
  )
82
40
  }
@@ -1,60 +1,69 @@
1
- import { Box, TextField } from '@mui/material'
2
- import { DatePicker, LocalizationProvider } from '@mui/x-date-pickers'
3
- import { AdapterMoment } from '@mui/x-date-pickers/AdapterMoment'
4
- import FormLabel from './FormLabel'
5
- interface Props {
6
- label?: string
1
+ import EventIcon from '@mui/icons-material/Event'
2
+ import { InputAdornment, TextFieldProps } from '@mui/material'
3
+ import 'flatpickr/dist/flatpickr.css'
4
+ import { ReactNode } from 'react'
5
+ import Flatpickr, { DateTimePickerProps } from 'react-flatpickr'
6
+ import TextField from './TextField'
7
+
8
+ export interface IDatePicker {
9
+ label: ReactNode
7
10
  name?: string
8
- size?: 'small' | 'medium'
9
11
  control?: any
10
- minDate?: any
11
- maxDate?: any
12
+ minDate?: Date | string | number
13
+ maxDate?: Date | string | number
12
14
  required?: boolean
13
- value: any
14
- onChange: any
15
+ value: Date | null
16
+ onChange: (value: Date) => void
17
+ placeholder?: string
18
+ inputProps?: TextFieldProps
15
19
  }
16
- export default function FormDatePicker(props: Props) {
17
- const {
18
- name,
19
- size = 'small',
20
- label = '',
21
- minDate,
22
- maxDate,
23
- required = false,
24
- value,
25
- onChange,
26
- } = props
20
+
21
+ export default function FormDatePicker({
22
+ name,
23
+ label,
24
+ minDate,
25
+ maxDate,
26
+ value,
27
+ onChange,
28
+ placeholder,
29
+ required = false,
30
+ ...rest
31
+ }: IDatePicker) {
27
32
  return (
28
- <LocalizationProvider dateAdapter={AdapterMoment}>
29
- <Box>
30
- <DatePicker
31
- label={<FormLabel label={label} required={required} name={name} />}
32
- mask="__/__/____"
33
- inputFormat="DD/MM/yyyy"
34
- value={value}
35
- onChange={onChange}
36
- minDate={minDate}
37
- maxDate={maxDate}
38
- renderInput={(params) => (
39
- <TextField
40
- fullWidth
41
- size={size}
42
- {...params}
43
- // error={Boolean(error)}
44
- />
45
- )}
46
- />
47
- {/* {error && (
48
- <Typography
49
- variant="caption"
50
- component={'div'}
51
- sx={{ pl: '2px' }}
52
- color="rgb(211, 47, 47)"
53
- >
54
- {error.message}
55
- </Typography>
56
- )} */}
57
- </Box>
58
- </LocalizationProvider>
33
+ <Flatpickr
34
+ onChange={(dates: Date[]) => {
35
+ if (onChange) onChange(dates[0])
36
+ }}
37
+ options={{
38
+ dateFormat: 'd-m-Y',
39
+ minDate,
40
+ maxDate,
41
+ }}
42
+ value={value || null}
43
+ render={(
44
+ props: Omit<DateTimePickerProps, 'options' | 'render'>,
45
+ ref: (node: HTMLInputElement | null) => void,
46
+ ) => {
47
+ return (
48
+ <TextField
49
+ placeholder={placeholder}
50
+ label={label}
51
+ name={name}
52
+ variant="outlined"
53
+ autoComplete="off"
54
+ required={required}
55
+ inputRef={ref}
56
+ InputProps={{
57
+ endAdornment: (
58
+ <InputAdornment position="end">
59
+ <EventIcon />
60
+ </InputAdornment>
61
+ ),
62
+ }}
63
+ {...rest.inputProps}
64
+ />
65
+ )
66
+ }}
67
+ />
59
68
  )
60
69
  }
@@ -1,70 +1,75 @@
1
- import { InputAdornment, TextField, Typography } from '@mui/material'
2
- import { DateTimePicker, LocalizationProvider } from '@mui/x-date-pickers'
3
- import { AdapterMoment } from '@mui/x-date-pickers/AdapterMoment'
4
- import { Controller } from 'react-hook-form'
5
- import DateRangeIcon from '@mui/icons-material/DateRange'
6
- interface Props {
7
- label?: string
8
- name: string
9
- size?: 'small' | 'medium'
10
- control: any
1
+ import EventIcon from '@mui/icons-material/Event'
2
+ import { InputAdornment, TextFieldProps } from '@mui/material'
3
+ import 'flatpickr/dist//flatpickr.css'
4
+ import { ReactNode } from 'react'
5
+ import Flatpickr, { DateTimePickerProps } from 'react-flatpickr'
6
+ import TextField from './TextField'
7
+
8
+ export interface IDateTimePicker {
9
+ label?: ReactNode
10
+ name?: string
11
11
  required?: boolean
12
- minDate?: any
12
+ minDate?: Date | string | number
13
+ maxDate?: Date | string | number
14
+ minTime?: Date | string | number
15
+ maxTime?: Date | string | number
16
+ value: Date | null
17
+ onChange: (value: Date) => void
18
+ placeholder?: string
19
+ inputProps?: TextFieldProps
13
20
  }
14
- export default function FormDateTimePicker(props: Props) {
15
- const { name, size = 'small', control, label = '', required, minDate } = props
21
+
22
+ export default function DateTimePicker({
23
+ name,
24
+ label,
25
+ required,
26
+ minDate,
27
+ maxDate,
28
+ minTime,
29
+ maxTime,
30
+ onChange,
31
+ value,
32
+ placeholder,
33
+ ...rest
34
+ }: IDateTimePicker) {
16
35
  return (
17
- <LocalizationProvider dateAdapter={AdapterMoment}>
18
- <Controller
19
- name={name}
20
- control={control}
21
- render={({ field, fieldState: { error } }) => (
22
- <>
23
- <DateTimePicker
24
- label={
25
- <>
26
- {label}
27
- {required && (
28
- <Typography fontSize={14} component={'span'} color="error">
29
- {' *'}
30
- </Typography>
31
- )}
32
- </>
33
- }
34
- minDate={minDate && minDate}
35
- mask="__/__/____ __:__ _M"
36
- inputFormat="DD/MM/yyyy hh:mm a"
37
- value={field.value || null}
38
- onChange={field.onChange}
39
- InputProps={{
40
- endAdornment: (
41
- <InputAdornment position="end">
42
- <DateRangeIcon />
43
- </InputAdornment>
44
- ),
45
- }}
46
- renderInput={(params) => (
47
- <TextField
48
- fullWidth
49
- size={size}
50
- {...params}
51
- error={Boolean(error)}
52
- onBlur={field.onBlur}
53
- />
54
- )}
55
- />
56
- {error && (
57
- <Typography
58
- variant="caption"
59
- sx={{ pl: '2px' }}
60
- color="rgb(211, 47, 47)"
61
- >
62
- {error.message}
63
- </Typography>
64
- )}
65
- </>
66
- )}
67
- />
68
- </LocalizationProvider>
36
+ <Flatpickr
37
+ options={{
38
+ enableTime: true,
39
+ dateFormat: 'd-m-Y h:i:K',
40
+ minDate,
41
+ maxDate,
42
+ minTime,
43
+ maxTime,
44
+ }}
45
+ onChange={(dates: Date[]) => {
46
+ if (onChange) onChange(dates[0])
47
+ }}
48
+ value={value || null}
49
+ render={(
50
+ props: Omit<DateTimePickerProps, 'options' | 'render'>,
51
+ ref: (node: HTMLInputElement | null) => void,
52
+ ) => {
53
+ return (
54
+ <TextField
55
+ placeholder={placeholder}
56
+ label={label}
57
+ name={name}
58
+ variant="outlined"
59
+ autoComplete="off"
60
+ required={required}
61
+ inputRef={ref}
62
+ InputProps={{
63
+ endAdornment: (
64
+ <InputAdornment position="end">
65
+ <EventIcon />
66
+ </InputAdornment>
67
+ ),
68
+ }}
69
+ {...rest.inputProps}
70
+ />
71
+ )
72
+ }}
73
+ />
69
74
  )
70
75
  }
@@ -1,62 +1,64 @@
1
- import { Box, FormGroup, FormHelperText } from '@mui/material'
1
+ import { Box, BoxProps, FormGroup, FormHelperText } from '@mui/material'
2
+ import { ReactNode } from 'react'
2
3
  import { Controller } from 'react-hook-form'
3
4
  import FormLabel from './FormLabel'
4
5
  import SingleCheckbox from './SingleCheckbox'
5
6
 
6
7
  interface Props {
7
- label?: string
8
+ label?: ReactNode
8
9
  name: string
9
10
  size?: 'small' | 'medium'
10
- control: any
11
- options: Array<{ label: string; value: string }>
11
+ options: Array<{ label: ReactNode; value: any }>
12
12
  required?: boolean
13
13
  row?: boolean
14
+ error?: boolean
15
+ helperText?: ReactNode
16
+ value: { label: string; value: any }[]
17
+ onChange: (value: { label: ReactNode; value: any }[]) => void
18
+ containerProps?: BoxProps
14
19
  }
15
20
 
16
- export default function MultiCheckbox(props: Props) {
17
- const {
18
- name,
19
- control,
20
- label = '',
21
- options = [],
22
- required = false,
23
- row = true,
24
- } = props
25
-
21
+ export default function MultiCheckbox({
22
+ name,
23
+ label,
24
+ options = [],
25
+ required = false,
26
+ value = [],
27
+ onChange,
28
+ error,
29
+ helperText,
30
+ row = true,
31
+ containerProps,
32
+ ...rest
33
+ }: Props) {
26
34
  return (
27
- <Controller
28
- name={name}
29
- control={control}
30
- render={({ field, fieldState: { error } }) => (
31
- <Box width="100%">
32
- <FormLabel label={label} required={required} name={name} />
33
- <FormGroup row={row} sx={{ flexWrap: 'wrap' }}>
34
- {options?.map((item, index) => (
35
- <SingleCheckbox
36
- name={name}
37
- key={index}
38
- label={item.label}
39
- checked={field?.value
40
- ?.map((item: any) => item?.value)
41
- ?.includes(item?.value)}
42
- onChange={(e) => {
43
- let value = field.value || []
44
- if (e.target.checked) {
45
- let newValue = [...value, item]
46
- field.onChange(newValue)
47
- } else {
48
- let filteredValue = value.filter(
49
- (opt: any) => opt?.value !== item.value,
50
- )
51
- field.onChange(filteredValue)
52
- }
53
- }}
54
- />
55
- ))}
56
- </FormGroup>
57
- {error && <FormHelperText>{error.message}</FormHelperText>}
58
- </Box>
59
- )}
60
- />
35
+ <Box width="100%" {...containerProps}>
36
+ <FormLabel label={label} required={required} name={name} />
37
+ <FormGroup row={row} sx={{ flexWrap: 'wrap' }}>
38
+ {options?.map((item, index) => (
39
+ <SingleCheckbox
40
+ name={name}
41
+ key={index}
42
+ label={item.label}
43
+ checked={value
44
+ ?.map((item: any) => item?.value)
45
+ ?.includes(item?.value)}
46
+ onChange={(e) => {
47
+ if (e.target.checked) {
48
+ let newValue = [...value, item]
49
+ onChange(newValue)
50
+ } else {
51
+ let filteredValue = value.filter(
52
+ (opt: any) => opt?.value !== item.value,
53
+ )
54
+ onChange(filteredValue)
55
+ }
56
+ }}
57
+ {...rest}
58
+ />
59
+ ))}
60
+ </FormGroup>
61
+ {error && <FormHelperText>{helperText}</FormHelperText>}
62
+ </Box>
61
63
  )
62
64
  }
@@ -1,5 +1,6 @@
1
1
  import {
2
2
  Box,
3
+ BoxProps,
3
4
  FormControlLabel,
4
5
  Radio,
5
6
  RadioGroup as MuiRadioGroup,
@@ -56,6 +57,7 @@ interface Props extends RadioGroupProps {
56
57
  row?: boolean
57
58
  required?: boolean
58
59
  options: { value: any; label: string | ReactNode }[]
60
+ containerProps?: BoxProps
59
61
  }
60
62
 
61
63
  export default function RadioGroup(props: Props) {
@@ -67,10 +69,11 @@ export default function RadioGroup(props: Props) {
67
69
  required = false,
68
70
  value,
69
71
  onChange,
72
+ containerProps,
70
73
  ...rest
71
74
  } = props
72
75
  return (
73
- <Box width="100%">
76
+ <Box width="100%" {...containerProps}>
74
77
  <FormLabel label={label} name={name} required={required} />
75
78
  <MuiRadioGroup
76
79
  value={value}
@@ -7,18 +7,11 @@ import {
7
7
  Select,
8
8
  FormHelperText,
9
9
  Box,
10
+ BoxProps,
10
11
  } from '@mui/material'
11
12
  import { ReactNode } from 'react'
12
13
  import FormLabel from './FormLabel'
13
14
 
14
- type Props = {
15
- options: Array<{ label: ReactNode; value: any }>
16
- onChange?: (value: any) => void
17
- required?: boolean
18
- firstItemEmpty?: boolean
19
- helperText?: string
20
- } & SelectProps
21
-
22
15
  const StyledFormControl = styled(FormControl)(({ theme }) => ({
23
16
  '& .MuiInputBase-root': {
24
17
  '& legend': { display: 'none' },
@@ -39,7 +32,6 @@ const PaperProps = {
39
32
  maxHeight: 360,
40
33
  marginTop: '1px',
41
34
  '& .MuiList-root': {
42
- minWidth: '240px',
43
35
  padding: 0,
44
36
  '& li': {
45
37
  height: '60px',
@@ -55,6 +47,15 @@ const PaperProps = {
55
47
  },
56
48
  }
57
49
 
50
+ type Props = {
51
+ options: Array<{ label: ReactNode; value: any }>
52
+ onChange?: (value: any) => void
53
+ required?: boolean
54
+ firstItemEmpty?: boolean
55
+ helperText?: string
56
+ containerProps?: BoxProps
57
+ } & SelectProps
58
+
58
59
  export default function SingleSelect({
59
60
  name = 'select',
60
61
  options = [],
@@ -63,6 +64,7 @@ export default function SingleSelect({
63
64
  required,
64
65
  value,
65
66
  helperText,
67
+ containerProps,
66
68
  firstItemEmpty = false,
67
69
  ...props
68
70
  }: Props) {
@@ -71,7 +73,7 @@ export default function SingleSelect({
71
73
  : options
72
74
 
73
75
  return (
74
- <Box width="100%">
76
+ <Box width="100%" {...containerProps}>
75
77
  <FormLabel required={required} label={label} name={name} />
76
78
  <StyledFormControl fullWidth>
77
79
  <Select
@@ -1,5 +1,6 @@
1
1
  import {
2
2
  Box,
3
+ BoxProps,
3
4
  styled,
4
5
  TextField as MuiTextField,
5
6
  TextFieldProps as MuiTextFieldProps,
@@ -17,16 +18,21 @@ const StyledTextField = styled(MuiTextField)(({ theme }) => ({
17
18
  },
18
19
  }))
19
20
 
21
+ type TextFieldProps = {
22
+ containerProps?: BoxProps
23
+ } & MuiTextFieldProps
24
+
20
25
  export default function TextField({
21
26
  name,
22
27
  label,
23
28
  value,
24
29
  onChange,
25
30
  required = false,
31
+ containerProps,
26
32
  ...rest
27
- }: MuiTextFieldProps) {
33
+ }: TextFieldProps) {
28
34
  return (
29
- <Box width="100%">
35
+ <Box width="100%" {...containerProps}>
30
36
  <FieldLabel label={label} required={required} name={name} />
31
37
  <StyledTextField
32
38
  id={name}
@@ -1,82 +1,70 @@
1
- import DateRangeIcon from '@mui/icons-material/DateRange'
2
- import { InputAdornment, TextField, Typography } from '@mui/material'
3
- import {
4
- LocalizationProvider,
5
- TimePicker as MuiTimePicker,
6
- } from '@mui/x-date-pickers'
7
- import { AdapterMoment } from '@mui/x-date-pickers/AdapterMoment'
8
- import { Controller } from 'react-hook-form'
1
+ import { QueryBuilder } from '@mui/icons-material'
2
+ import { InputAdornment, TextFieldProps } from '@mui/material'
3
+ import 'flatpickr/dist/flatpickr.css'
4
+ import { ReactNode } from 'react'
5
+ import Flatpickr, { DateTimePickerProps } from 'react-flatpickr'
6
+ import TextField from './TextField'
9
7
 
10
- interface Props {
11
- label?: string
12
- name: string
13
- size?: 'small' | 'medium'
14
- control: any
8
+ export interface ITimePicker {
9
+ label?: ReactNode
10
+ name?: string
15
11
  required?: boolean
16
- hookForm?: boolean
12
+ minTime?: Date | string | number
13
+ maxTime?: Date | string | number
14
+ value: Date | null
15
+ onChange: (value: Date) => void
16
+ placeholder?: string
17
+ inputProps?: TextFieldProps
17
18
  }
18
19
 
19
- export default function TimePicker(props: Props) {
20
- const {
21
- name,
22
- size = 'small',
23
- control,
24
- label = '',
25
- required,
26
- hookForm = true,
27
- } = props
28
-
20
+ export default function TimePicker({
21
+ name,
22
+ label,
23
+ required,
24
+ minTime,
25
+ maxTime,
26
+ onChange,
27
+ value,
28
+ placeholder,
29
+ ...rest
30
+ }: ITimePicker) {
29
31
  return (
30
- <LocalizationProvider dateAdapter={AdapterMoment}>
31
- <Controller
32
- name={name}
33
- control={control}
34
- render={({ field, fieldState: { error } }) => (
35
- <>
36
- <MuiTimePicker
37
- label={
38
- <>
39
- {label}
40
- {required && (
41
- <Typography fontSize={14} component={'span'} color="error">
42
- {' *'}
43
- </Typography>
44
- )}
45
- </>
46
- }
47
- mask="__:__ _M"
48
- inputFormat="hh:mm a"
49
- value={field.value || null}
50
- onChange={field.onChange}
51
- InputProps={{
52
- endAdornment: (
53
- <InputAdornment position="end">
54
- <DateRangeIcon />
55
- </InputAdornment>
56
- ),
57
- }}
58
- renderInput={(params) => (
59
- <TextField
60
- fullWidth
61
- size={size}
62
- {...params}
63
- error={Boolean(error)}
64
- onBlur={field.onBlur}
65
- />
66
- )}
67
- />
68
- {error && (
69
- <Typography
70
- variant="caption"
71
- sx={{ pl: '2px' }}
72
- color="rgb(211, 47, 47)"
73
- >
74
- {error.message}
75
- </Typography>
76
- )}
77
- </>
78
- )}
79
- />
80
- </LocalizationProvider>
32
+ <Flatpickr
33
+ options={{
34
+ enableTime: true,
35
+ noCalendar: true,
36
+ dateFormat: 'h:i:K',
37
+ minTime,
38
+ maxTime,
39
+ }}
40
+ onChange={(dates: Date[]) => {
41
+ if (onChange) onChange(dates[0])
42
+ }}
43
+ value={value || null}
44
+ render={(
45
+ props: Omit<DateTimePickerProps, 'options' | 'render'>,
46
+ ref: (node: HTMLInputElement | null) => void,
47
+ ) => {
48
+ return (
49
+ <TextField
50
+ placeholder={placeholder}
51
+ label={label}
52
+ name={name}
53
+ variant="outlined"
54
+ autoComplete="off"
55
+ required={required}
56
+ inputRef={ref}
57
+ InputProps={{
58
+ endAdornment: (
59
+ <InputAdornment position="end">
60
+ <QueryBuilder />
61
+ </InputAdornment>
62
+ ),
63
+ }}
64
+ {...rest.inputProps}
65
+ />
66
+ )
67
+ }}
68
+ />
81
69
  )
82
70
  }