@campxdev/shared 1.4.5 → 1.4.7

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.5",
3
+ "version": "1.4.7",
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
  }
@@ -64,6 +64,19 @@ const StyledPopper = styled(Popper)(({ theme }) => ({
64
64
  padding: 0,
65
65
  },
66
66
  },
67
+ '&::-webkit-scrollbar': {
68
+ width: '0.5em',
69
+ height: '0.5em',
70
+ },
71
+
72
+ '&::-webkit-scrollbar-thumb': {
73
+ backgroundColor: 'rgba(0, 0, 0, 0.15)',
74
+ borderRadius: '3px',
75
+
76
+ '&:hover': {
77
+ background: 'rgba(0, 0, 0, 0.2)',
78
+ },
79
+ },
67
80
  },
68
81
  }))
69
82
 
@@ -17,6 +17,8 @@ const StyledTextField = styled(MuiTextField)(({ theme }) => ({
17
17
  },
18
18
  }))
19
19
 
20
+ type TextFieldProps = {} & MuiTextFieldProps
21
+
20
22
  export default function TextField({
21
23
  name,
22
24
  label,
@@ -24,7 +26,7 @@ export default function TextField({
24
26
  onChange,
25
27
  required = false,
26
28
  ...rest
27
- }: MuiTextFieldProps) {
29
+ }: TextFieldProps) {
28
30
  return (
29
31
  <Box width="100%">
30
32
  <FieldLabel label={label} required={required} name={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
  }
@@ -187,7 +187,7 @@ const muiTheme = createTheme({
187
187
  styleOverrides: {
188
188
  root: {
189
189
  fontFamily: PRIMARY_FONT,
190
- fontWeight: 500,
190
+ fontWeight: 'normal',
191
191
  minHeight: '50px',
192
192
  borderRadius: '10px',
193
193
  '& input': {
@@ -1,6 +1,6 @@
1
1
  import { Suspense } from 'react'
2
2
  import PageWithPermission from '../permissions/PageWithPermission'
3
- import { LinearProgress } from '../components/LinearProgress'
3
+ import { Spinner } from '../components'
4
4
 
5
5
  const withRouteWrapper = (routes) => {
6
6
  return routes?.map((item, index) => {
@@ -13,7 +13,7 @@ const withRouteWrapper = (routes) => {
13
13
  return {
14
14
  ...item,
15
15
  element: item?.element ? (
16
- <Suspense fallback={<LinearProgress />} key={index}>
16
+ <Suspense fallback={<Spinner />} key={index}>
17
17
  <PageWithPermission permissionKey={item?.permissionKey}>
18
18
  {item.element}
19
19
  </PageWithPermission>