@campxdev/shared 1.5.8 → 1.6.0

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.
Files changed (219) hide show
  1. package/antd.customize.less +73 -73
  2. package/exports.ts +18 -18
  3. package/package.json +86 -86
  4. package/src/assets/fonts/avenir/index.ts +13 -13
  5. package/src/assets/fonts/poppins/index.ts +18 -18
  6. package/src/assets/images/index.ts +17 -17
  7. package/src/assets/images/unauth.svg +92 -92
  8. package/src/components/ActionButton.tsx +20 -20
  9. package/src/components/Attachment.tsx +26 -26
  10. package/src/components/AutocompleteSearch/AutocompleteSearch.tsx +57 -57
  11. package/src/components/AutocompleteSearch/index.tsx +1 -1
  12. package/src/components/Breadcrumbs.tsx +72 -72
  13. package/src/components/Card.tsx +98 -98
  14. package/src/components/CardsGrid.tsx +28 -28
  15. package/src/components/ChangePassword.tsx +123 -123
  16. package/src/components/Chips.tsx +81 -81
  17. package/src/components/Detail.tsx +15 -15
  18. package/src/components/DetailsGrid.tsx +52 -52
  19. package/src/components/DividerHeading.tsx +41 -41
  20. package/src/components/DrawerWrapper/DialogWrapper.tsx +67 -67
  21. package/src/components/DrawerWrapper/DrawerTemplate.tsx +53 -53
  22. package/src/components/DrawerWrapper/DrawerWrapper.tsx +53 -53
  23. package/src/components/DropDownButton/AnchorElement.tsx +44 -44
  24. package/src/components/DropDownButton/DropDownButton.tsx +184 -184
  25. package/src/components/DropDownButton/DropdownMenuItem.tsx +110 -110
  26. package/src/components/DropDownButton/index.tsx +1 -1
  27. package/src/components/DropDownButton/styles.tsx +59 -59
  28. package/src/components/ErrorBoundary/ErrorBoundary.tsx +28 -28
  29. package/src/components/ErrorBoundary/ErrorFallback.tsx +236 -236
  30. package/src/components/ErrorBoundary/GlobalNetworkLoadingIndicator.tsx +13 -13
  31. package/src/components/ErrorBoundary/index.tsx +1 -1
  32. package/src/components/ErrorBox.tsx +42 -42
  33. package/src/components/FilterComponents/FilterButton.tsx +56 -56
  34. package/src/components/FilterComponents/SearchBar.tsx +45 -45
  35. package/src/components/FloatingContainer.tsx +33 -33
  36. package/src/components/Form/Form.tsx +156 -156
  37. package/src/components/Form/RenderForm.tsx +188 -188
  38. package/src/components/FullCalendar/Actions.tsx +162 -162
  39. package/src/components/FullCalendar/FullCalendarWrapper.tsx +54 -54
  40. package/src/components/FullScreenLoader.tsx +19 -19
  41. package/src/components/HookForm/AutoCompleteSearch.tsx +113 -113
  42. package/src/components/HookForm/DatePicker.tsx +40 -40
  43. package/src/components/HookForm/DateTimePicker.tsx +47 -47
  44. package/src/components/HookForm/FormLabel.tsx +14 -14
  45. package/src/components/HookForm/MultiCheckbox.tsx +69 -69
  46. package/src/components/HookForm/MultiSelect.tsx +53 -53
  47. package/src/components/HookForm/RadioGroup.tsx +45 -45
  48. package/src/components/HookForm/SingleCheckbox.tsx +34 -34
  49. package/src/components/HookForm/SingleSelect.tsx +46 -46
  50. package/src/components/HookForm/TextField.tsx +40 -40
  51. package/src/components/HookForm/TimePicker.tsx +40 -40
  52. package/src/components/HookForm/index.ts +23 -23
  53. package/src/components/IconButtons/IconButtons.tsx +137 -137
  54. package/src/components/IconButtons/Icons.tsx +268 -268
  55. package/src/components/IconButtons/assets/edit.svg +4 -4
  56. package/src/components/IconButtons/assets/eye.svg +6 -6
  57. package/src/components/IconButtons/assets/trash.svg +7 -7
  58. package/src/components/IconButtons/index.tsx +8 -8
  59. package/src/components/IconLabel.tsx +37 -37
  60. package/src/components/Image/Image.tsx +45 -45
  61. package/src/components/Image/index.tsx +1 -1
  62. package/src/components/ImageUpload.tsx +98 -98
  63. package/src/components/Input/AsyncSearchSelect/AsyncSearchSelect.tsx +216 -216
  64. package/src/components/Input/AsyncSearchSelect/index.tsx +1 -1
  65. package/src/components/Input/AsyncSearchSelect/styles.tsx +105 -105
  66. package/src/components/Input/AutoCompleteSearch.tsx +121 -121
  67. package/src/components/Input/DatePicker.tsx +73 -73
  68. package/src/components/Input/DateRangePicker.tsx +105 -105
  69. package/src/components/Input/DateTimePicker.tsx +81 -81
  70. package/src/components/Input/FormLabel.tsx +21 -21
  71. package/src/components/Input/MultiCheckbox.tsx +64 -64
  72. package/src/components/Input/MultiSelect.tsx +150 -150
  73. package/src/components/Input/RadioGroup.tsx +104 -104
  74. package/src/components/Input/SingleCheckbox.tsx +78 -78
  75. package/src/components/Input/SingleSelect.tsx +104 -104
  76. package/src/components/Input/TextField.tsx +46 -46
  77. package/src/components/Input/TimePicker.tsx +74 -74
  78. package/src/components/Input/index.ts +26 -26
  79. package/src/components/Input/types.ts +3 -3
  80. package/src/components/JsonPreview.tsx +7 -7
  81. package/src/components/LabelValue.tsx +21 -21
  82. package/src/components/Layout/ChangePassword.tsx +49 -49
  83. package/src/components/Layout/Header/AppHeader.tsx +102 -102
  84. package/src/components/Layout/Header/AppsMenu.tsx +98 -98
  85. package/src/components/Layout/Header/CogWheelMenu.tsx +33 -33
  86. package/src/components/Layout/Header/Notification.tsx +13 -13
  87. package/src/components/Layout/Header/UserBox.tsx +70 -70
  88. package/src/components/Layout/Header/applications.ts +91 -91
  89. package/src/components/Layout/Header/assets/campx_square_small.svg +9 -9
  90. package/src/components/Layout/Header/assets/commutex.svg +14 -14
  91. package/src/components/Layout/Header/assets/commutexSmall.svg +11 -11
  92. package/src/components/Layout/Header/assets/enroll.svg +14 -14
  93. package/src/components/Layout/Header/assets/enrollx.svg +14 -14
  94. package/src/components/Layout/Header/assets/exams_small.svg +12 -12
  95. package/src/components/Layout/Header/assets/examsx.svg +14 -14
  96. package/src/components/Layout/Header/assets/hostel_small.svg +13 -13
  97. package/src/components/Layout/Header/assets/hostelx.svg +13 -13
  98. package/src/components/Layout/Header/assets/index.ts +33 -33
  99. package/src/components/Layout/Header/assets/libraryx.svg +12 -12
  100. package/src/components/Layout/Header/assets/pay_small.svg +16 -16
  101. package/src/components/Layout/Header/assets/payx.svg +19 -19
  102. package/src/components/Layout/Header/assets/people_small.svg +9 -9
  103. package/src/components/Layout/Header/assets/peoplex.svg +12 -12
  104. package/src/components/Layout/Header/assets/squarex.svg +12 -12
  105. package/src/components/Layout/Header/icons.tsx +57 -57
  106. package/src/components/Layout/Header/index.tsx +1 -1
  107. package/src/components/Layout/Header/styles.tsx +124 -124
  108. package/src/components/Layout/Helmet.tsx +49 -49
  109. package/src/components/Layout/LayoutWrapper.tsx +28 -28
  110. package/src/components/Layout/SideMenuHeader.tsx +29 -29
  111. package/src/components/Layout/SideNav.tsx +168 -168
  112. package/src/components/Layout/Tickets/HelpWidget/HelpWidget.tsx +273 -273
  113. package/src/components/Layout/Tickets/HelpWidget/styles.tsx +94 -94
  114. package/src/components/Layout/Tickets/MyTickets.tsx +72 -72
  115. package/src/components/Layout/Tickets/TicketDetails.tsx +65 -65
  116. package/src/components/Layout/Tickets/TimeLine.tsx +64 -64
  117. package/src/components/Layout/Tickets/index.tsx +1 -1
  118. package/src/components/Layout/Tickets/services.ts +11 -11
  119. package/src/components/Layout/Tickets/styles.tsx +136 -136
  120. package/src/components/LinearProgress.tsx +19 -19
  121. package/src/components/ListItemButton.tsx +95 -95
  122. package/src/components/LoginForm.tsx +80 -80
  123. package/src/components/MediaRow/MediaRow.tsx +69 -69
  124. package/src/components/MediaRow/index.tsx +1 -1
  125. package/src/components/ModalButtons/DialogButton.tsx +121 -121
  126. package/src/components/ModalButtons/DrawerButton.tsx +113 -113
  127. package/src/components/ModalButtons/index.tsx +4 -4
  128. package/src/components/NoDataIllustration.tsx +32 -32
  129. package/src/components/PageContent.tsx +12 -12
  130. package/src/components/PageHeader.tsx +55 -55
  131. package/src/components/PageNotFound.tsx +26 -26
  132. package/src/components/PopupConfirm/ConfirmContextProvider.tsx +40 -40
  133. package/src/components/PopupConfirm/PopupConfirm.tsx +67 -67
  134. package/src/components/PopupConfirm/index.tsx +1 -1
  135. package/src/components/PopupConfirm/useConfirm.ts +47 -47
  136. package/src/components/Row.tsx +24 -24
  137. package/src/components/Spinner.tsx +18 -18
  138. package/src/components/StepsHeader/StepsHeader.tsx +115 -115
  139. package/src/components/StepsHeader/index.tsx +1 -1
  140. package/src/components/StyledTableContainer.tsx +33 -33
  141. package/src/components/SwitchButton.tsx +41 -41
  142. package/src/components/Table.tsx +42 -42
  143. package/src/components/TableComponent/BatchActionsHeader.tsx +58 -58
  144. package/src/components/TableComponent/Icons/index.tsx +50 -50
  145. package/src/components/TableComponent/ReactTable.tsx +295 -295
  146. package/src/components/TableComponent/RenderTableBody.tsx +68 -68
  147. package/src/components/TableComponent/Table.tsx +197 -197
  148. package/src/components/TableComponent/TableFooter/TableFooter.tsx +104 -104
  149. package/src/components/TableComponent/TableFooter/index.tsx +1 -1
  150. package/src/components/TableComponent/TableFooter/styles.tsx +28 -28
  151. package/src/components/TableComponent/index.tsx +1 -1
  152. package/src/components/TableComponent/react-table-config.d.ts +128 -128
  153. package/src/components/TableComponent/styles.tsx +170 -170
  154. package/src/components/TableComponent/types.ts +57 -57
  155. package/src/components/Tabs/NavigationTabs.tsx +80 -80
  156. package/src/components/Tabs/Tabs.tsx +53 -53
  157. package/src/components/Tabs/TabsContainer.tsx +50 -50
  158. package/src/components/Tabs/index.tsx +1 -1
  159. package/src/components/Tabs/styles.tsx +55 -55
  160. package/src/components/ToastContainer/ToastContainer.tsx +57 -57
  161. package/src/components/ToastContainer/index.tsx +1 -1
  162. package/src/components/UploadButton/UploadButton.tsx +126 -126
  163. package/src/components/UploadButton/index.tsx +1 -1
  164. package/src/components/UploadButton/types.ts +19 -19
  165. package/src/components/UploadDocument.tsx +108 -108
  166. package/src/components/UploadFileDialog/UploadFileDialog.tsx +238 -238
  167. package/src/components/UploadFileDialog/index.tsx +1 -1
  168. package/src/components/index.ts +93 -93
  169. package/src/config/axios.ts +73 -73
  170. package/src/config/axiosEvaluator.ts +53 -53
  171. package/src/config/axiosXTenant.ts +57 -57
  172. package/src/constants/UIConstants.ts +97 -97
  173. package/src/constants/formValidations.ts +6 -6
  174. package/src/constants/index.ts +5 -5
  175. package/src/constants/isDevelopment.ts +3 -3
  176. package/src/constants/permissions.ts +67 -67
  177. package/src/constants/validateMessages.ts +12 -12
  178. package/src/contexts/LoginFormProvider.tsx +39 -39
  179. package/src/contexts/Providers.tsx +73 -73
  180. package/src/contexts/PublicProviders.tsx +30 -30
  181. package/src/contexts/QueryClientProvider.tsx +22 -22
  182. package/src/hooks/index.ts +4 -4
  183. package/src/hooks/useAuth.ts +96 -96
  184. package/src/hooks/useFetch.ts +53 -53
  185. package/src/hooks/useFilters.ts +80 -80
  186. package/src/hooks/useRouter.ts +31 -31
  187. package/src/layouts/Components/DashBoardMenu.tsx +232 -232
  188. package/src/layouts/Components/icons/index.tsx +403 -403
  189. package/src/layouts/Components/styles.tsx +74 -74
  190. package/src/layouts/ComponentsLayout.tsx +3 -3
  191. package/src/permissions/PageWithPermission.tsx +18 -18
  192. package/src/permissions/PermissionDeniedPage.tsx +16 -16
  193. package/src/permissions/ValidateAccess.tsx +18 -18
  194. package/src/permissions/index.ts +2 -2
  195. package/src/react-app-env.d.ts +1 -1
  196. package/src/shared-state/AssetsStore.ts +15 -15
  197. package/src/shared-state/PermissionsStore.ts +352 -352
  198. package/src/shared-state/UserStore.ts +13 -13
  199. package/src/shared-state/index.ts +4 -4
  200. package/src/theme/App.less +3 -3
  201. package/src/theme/MuiThemeProvider.tsx +13 -13
  202. package/src/theme/customCssBaseline.ts +135 -135
  203. package/src/theme/index.css +28 -28
  204. package/src/theme/muiTheme.ts +592 -592
  205. package/src/theme/theme.d.ts +75 -75
  206. package/src/utils/alphabet.ts +23 -23
  207. package/src/utils/arrayPadEnd.ts +3 -3
  208. package/src/utils/formatCurrency.ts +9 -9
  209. package/src/utils/getUrlParams.ts +5 -5
  210. package/src/utils/index.ts +7 -7
  211. package/src/utils/logout.ts +25 -25
  212. package/src/utils/ordinalSuffixOf.ts +14 -14
  213. package/src/utils/romanize.ts +40 -40
  214. package/src/utils/withRouteWrapper.tsx +25 -25
  215. package/src/utils/withSuspense.tsx +6 -6
  216. package/styled-components.tsx +60 -60
  217. package/tsconfig.json +21 -21
  218. package/yarn-error.log +109 -0
  219. package/src/components/Layout/Header/assets/commuteX.png +0 -0
@@ -1,56 +1,56 @@
1
- import { Tune } from '@mui/icons-material'
2
- import { Box, styled } from '@mui/material'
3
- import { useEffect, useState } from 'react'
4
-
5
- const StyledButtonWrapper = styled(Box)<{ size: 'regular' | 'large' }>(
6
- ({ theme, size }) => ({
7
- width: size === 'regular' ? '40px' : '50px',
8
- height: size === 'regular' ? '40px' : '50px',
9
- flexShrink: 0,
10
- border: theme.borders.grayLight,
11
- display: 'flex',
12
- position: 'relative',
13
- alignItems: 'center',
14
- justifyContent: 'center',
15
- borderRadius: '10px',
16
- cursor: 'pointer',
17
- '&:active': {
18
- border: `1px solid ${theme.palette.primary.main}`,
19
- },
20
- transition: 'border 0.1s ease-in-out',
21
- }),
22
- )
23
-
24
- const StyledNotify = styled(Box)(({ theme }) => ({
25
- height: '5px',
26
- width: '5px',
27
- backgroundColor: theme.palette.error.main,
28
- position: 'absolute',
29
- borderRadius: '50%',
30
- top: 5,
31
- right: 5,
32
- }))
33
-
34
- export default function FilterButton({
35
- onClick,
36
- size = 'large',
37
- filtersApplied,
38
- ...props
39
- }: {
40
- onClick: (e: any) => void
41
- size?: 'regular' | 'large'
42
- filtersApplied?: any
43
- }) {
44
- const handleClick = (e) => {
45
- e.stopPropagation()
46
- if (!onClick) return
47
- onClick(e)
48
- }
49
-
50
- return (
51
- <StyledButtonWrapper size={size} {...props} onClick={handleClick}>
52
- {filtersApplied && <StyledNotify />}
53
- <Tune />
54
- </StyledButtonWrapper>
55
- )
56
- }
1
+ import { Tune } from '@mui/icons-material'
2
+ import { Box, styled } from '@mui/material'
3
+ import { useEffect, useState } from 'react'
4
+
5
+ const StyledButtonWrapper = styled(Box)<{ size: 'regular' | 'large' }>(
6
+ ({ theme, size }) => ({
7
+ width: size === 'regular' ? '40px' : '50px',
8
+ height: size === 'regular' ? '40px' : '50px',
9
+ flexShrink: 0,
10
+ border: theme.borders.grayLight,
11
+ display: 'flex',
12
+ position: 'relative',
13
+ alignItems: 'center',
14
+ justifyContent: 'center',
15
+ borderRadius: '10px',
16
+ cursor: 'pointer',
17
+ '&:active': {
18
+ border: `1px solid ${theme.palette.primary.main}`,
19
+ },
20
+ transition: 'border 0.1s ease-in-out',
21
+ }),
22
+ )
23
+
24
+ const StyledNotify = styled(Box)(({ theme }) => ({
25
+ height: '5px',
26
+ width: '5px',
27
+ backgroundColor: theme.palette.error.main,
28
+ position: 'absolute',
29
+ borderRadius: '50%',
30
+ top: 5,
31
+ right: 5,
32
+ }))
33
+
34
+ export default function FilterButton({
35
+ onClick,
36
+ size = 'large',
37
+ filtersApplied,
38
+ ...props
39
+ }: {
40
+ onClick: (e: any) => void
41
+ size?: 'regular' | 'large'
42
+ filtersApplied?: any
43
+ }) {
44
+ const handleClick = (e) => {
45
+ e.stopPropagation()
46
+ if (!onClick) return
47
+ onClick(e)
48
+ }
49
+
50
+ return (
51
+ <StyledButtonWrapper size={size} {...props} onClick={handleClick}>
52
+ {filtersApplied && <StyledNotify />}
53
+ <Tune />
54
+ </StyledButtonWrapper>
55
+ )
56
+ }
@@ -1,45 +1,45 @@
1
- import { Search } from '@mui/icons-material'
2
- import { InputAdornment } from '@mui/material'
3
- import _ from 'lodash'
4
- import { ReactNode, useMemo, useState } from 'react'
5
- import { TextField } from '../Input'
6
- import { ITextFieldProps } from '../Input/TextField'
7
-
8
- interface SearchBarProps {
9
- onSearch: (v: string) => void
10
- label?: ReactNode
11
- textFieldProps?: ITextFieldProps
12
- }
13
-
14
- export default function SearchBar({
15
- onSearch,
16
- label,
17
- ...restProps
18
- }: SearchBarProps) {
19
- const [, setSearch] = useState('')
20
-
21
- const debouncedChangeHandler = useMemo(
22
- () =>
23
- _.debounce((e) => {
24
- setSearch(e.target.value)
25
- onSearch(e.target.value)
26
- }, 300),
27
- [],
28
- )
29
-
30
- return (
31
- <TextField
32
- label={label}
33
- placeholder="Search"
34
- onChange={debouncedChangeHandler}
35
- InputProps={{
36
- endAdornment: (
37
- <InputAdornment position="end">
38
- <Search />
39
- </InputAdornment>
40
- ),
41
- }}
42
- {...restProps.textFieldProps}
43
- />
44
- )
45
- }
1
+ import { Search } from '@mui/icons-material'
2
+ import { InputAdornment } from '@mui/material'
3
+ import _ from 'lodash'
4
+ import { ReactNode, useMemo, useState } from 'react'
5
+ import { TextField } from '../Input'
6
+ import { ITextFieldProps } from '../Input/TextField'
7
+
8
+ interface SearchBarProps {
9
+ onSearch: (v: string) => void
10
+ label?: ReactNode
11
+ textFieldProps?: ITextFieldProps
12
+ }
13
+
14
+ export default function SearchBar({
15
+ onSearch,
16
+ label,
17
+ ...restProps
18
+ }: SearchBarProps) {
19
+ const [, setSearch] = useState('')
20
+
21
+ const debouncedChangeHandler = useMemo(
22
+ () =>
23
+ _.debounce((e) => {
24
+ setSearch(e.target.value)
25
+ onSearch(e.target.value)
26
+ }, 300),
27
+ [],
28
+ )
29
+
30
+ return (
31
+ <TextField
32
+ label={label}
33
+ placeholder="Search"
34
+ onChange={debouncedChangeHandler}
35
+ InputProps={{
36
+ endAdornment: (
37
+ <InputAdornment position="end">
38
+ <Search />
39
+ </InputAdornment>
40
+ ),
41
+ }}
42
+ {...restProps.textFieldProps}
43
+ />
44
+ )
45
+ }
@@ -1,33 +1,33 @@
1
- import { Box, styled } from '@mui/material'
2
- export const StyledFooter = styled(Box)<{
3
- show: boolean
4
- }>`
5
- position: fixed;
6
- background: #fff;
7
- bottom: ${(props) => (props.show ? '0' : '-70px')};
8
- right: 16px;
9
- width: calc(100% - 236px);
10
- height: 64px;
11
- display: flex;
12
- justify-content: center;
13
- align-items: center;
14
- gap: 1.5rem;
15
- padding: 1rem;
16
- transition: bottom 400ms ease-in-out;
17
- box-shadow: 0px -1px 0px 0px rgba(0, 0, 0, 0.1);
18
- `
19
-
20
- function FloatingContainer({
21
- children,
22
- show,
23
- }: {
24
- show?: boolean
25
- children: React.ReactNode
26
- }) {
27
- return (
28
- <>
29
- <StyledFooter show={show ? show : true}>{children}</StyledFooter>
30
- </>
31
- )
32
- }
33
- export default FloatingContainer
1
+ import { Box, styled } from '@mui/material'
2
+ export const StyledFooter = styled(Box)<{
3
+ show: boolean
4
+ }>`
5
+ position: fixed;
6
+ background: #fff;
7
+ bottom: ${(props) => (props.show ? '0' : '-70px')};
8
+ right: 16px;
9
+ width: calc(100% - 236px);
10
+ height: 64px;
11
+ display: flex;
12
+ justify-content: center;
13
+ align-items: center;
14
+ gap: 1.5rem;
15
+ padding: 1rem;
16
+ transition: bottom 400ms ease-in-out;
17
+ box-shadow: 0px -1px 0px 0px rgba(0, 0, 0, 0.1);
18
+ `
19
+
20
+ function FloatingContainer({
21
+ children,
22
+ show,
23
+ }: {
24
+ show?: boolean
25
+ children: React.ReactNode
26
+ }) {
27
+ return (
28
+ <>
29
+ <StyledFooter show={show ? show : true}>{children}</StyledFooter>
30
+ </>
31
+ )
32
+ }
33
+ export default FloatingContainer
@@ -1,156 +1,156 @@
1
- import axios, { axiosErrorToast } from '../../config/axios'
2
- import { yupResolver } from '@hookform/resolvers/yup'
3
- import { Alert, Box, Button, ButtonProps, Typography } from '@mui/material'
4
- import RenderForm, { generateYupSchema, RenderFormProps } from './RenderForm'
5
- import { ReactNode, useState } from 'react'
6
- import { useForm } from 'react-hook-form'
7
- import { useMutation, useQueryClient } from 'react-query'
8
- import { toast } from 'react-toastify'
9
-
10
- const makePostRequest = async ({
11
- endpoint,
12
- postBody,
13
- }: {
14
- endpoint: string
15
- postBody: any
16
- }) => {
17
- const method = postBody?.id ? 'PUT' : 'POST'
18
- const url = postBody?.id ? `${endpoint}/${postBody?.id}` : endpoint
19
- return await axios({
20
- url,
21
- method,
22
- data: postBody,
23
- })
24
- }
25
-
26
- interface FormProps extends Omit<RenderFormProps, 'control'> {
27
- buttonProps?: ButtonProps
28
- submitBtn?: { label?: ReactNode }
29
- cancelBtn?: { label?: ReactNode }
30
- onSubmit?: (formData) => any
31
- onCancel?: () => void
32
- endPoint?: string
33
- defaultValues?: any
34
- refetchKey?: string
35
- onSuccess?: () => void
36
- previousData?: any
37
- }
38
-
39
- export default function Form({
40
- submitBtn = { label: 'Submit' },
41
- cancelBtn = { label: 'Cancel' },
42
- buttonProps,
43
- onSubmit = () => {},
44
- endPoint,
45
- defaultValues,
46
- cols,
47
- fields,
48
- dropdowns,
49
- refetchKey,
50
- onSuccess = () => {},
51
- onCancel,
52
- previousData,
53
- }: FormProps) {
54
- const queryClient = useQueryClient()
55
- const [error, setError] = useState<any>(null)
56
- const { control, watch, handleSubmit } = useForm({
57
- defaultValues,
58
- resolver: yupResolver(generateYupSchema([fields])),
59
- })
60
-
61
- const {
62
- data,
63
- mutate,
64
- isLoading: posting,
65
- } = useMutation(makePostRequest, {
66
- onSuccess(data) {
67
- queryClient.invalidateQueries(refetchKey)
68
- toast.success('Created/Updated Successfully')
69
- onSuccess && onSuccess()
70
- },
71
- onError(error: any) {
72
- setError(error?.response?.data?.message)
73
- axiosErrorToast(error)
74
- },
75
- })
76
-
77
- const onError = (error) => {
78
- const errorArray = Object.values(error)?.map((item: any) => item?.message)
79
- setError(errorArray)
80
- }
81
-
82
- return (
83
- <form
84
- onSubmit={handleSubmit((originalFormData) => {
85
- const modifiedFormData = onSubmit(originalFormData) ?? originalFormData
86
-
87
- mutate({
88
- endpoint: endPoint,
89
- postBody: modifiedFormData,
90
- })
91
- }, onError)}
92
- >
93
- <RenderForm
94
- cols={cols}
95
- fields={fields}
96
- control={control}
97
- dropdowns={dropdowns}
98
- />
99
-
100
- <FormErrorDisplay message={error} />
101
- <Box
102
- sx={{
103
- display: 'flex',
104
- gap: '20px',
105
- marginTop: '1rem',
106
- }}
107
- >
108
- <Button fullWidth type="submit" {...buttonProps}>
109
- {submitBtn?.label}
110
- </Button>
111
- <Button
112
- fullWidth
113
- variant="outlined"
114
- onClick={() => {
115
- onCancel ? onCancel() : null
116
- }}
117
- {...buttonProps}
118
- >
119
- {cancelBtn?.label}
120
- </Button>
121
- </Box>
122
- </form>
123
- )
124
- }
125
-
126
- const FormErrorDisplay = ({ message }: { message: string | string[] }) => {
127
- if (!message) return null
128
-
129
- if (typeof message === 'string')
130
- return (
131
- <Alert severity="error" sx={{ marginTop: '1rem' }}>
132
- {message}
133
- </Alert>
134
- )
135
-
136
- return (
137
- <Alert
138
- severity="error"
139
- sx={{
140
- marginTop: '1rem',
141
- '& .MuiAlert-icon': {
142
- display: 'flex',
143
- alignItems: 'center',
144
- },
145
- }}
146
- >
147
- <Box>
148
- {message?.map((item, index) => (
149
- <Typography color="error" variant="body1" key={index}>
150
- {item}
151
- </Typography>
152
- ))}
153
- </Box>
154
- </Alert>
155
- )
156
- }
1
+ import axios, { axiosErrorToast } from '../../config/axios'
2
+ import { yupResolver } from '@hookform/resolvers/yup'
3
+ import { Alert, Box, Button, ButtonProps, Typography } from '@mui/material'
4
+ import RenderForm, { generateYupSchema, RenderFormProps } from './RenderForm'
5
+ import { ReactNode, useState } from 'react'
6
+ import { useForm } from 'react-hook-form'
7
+ import { useMutation, useQueryClient } from 'react-query'
8
+ import { toast } from 'react-toastify'
9
+
10
+ const makePostRequest = async ({
11
+ endpoint,
12
+ postBody,
13
+ }: {
14
+ endpoint: string
15
+ postBody: any
16
+ }) => {
17
+ const method = postBody?.id ? 'PUT' : 'POST'
18
+ const url = postBody?.id ? `${endpoint}/${postBody?.id}` : endpoint
19
+ return await axios({
20
+ url,
21
+ method,
22
+ data: postBody,
23
+ })
24
+ }
25
+
26
+ interface FormProps extends Omit<RenderFormProps, 'control'> {
27
+ buttonProps?: ButtonProps
28
+ submitBtn?: { label?: ReactNode }
29
+ cancelBtn?: { label?: ReactNode }
30
+ onSubmit?: (formData) => any
31
+ onCancel?: () => void
32
+ endPoint?: string
33
+ defaultValues?: any
34
+ refetchKey?: string
35
+ onSuccess?: () => void
36
+ previousData?: any
37
+ }
38
+
39
+ export default function Form({
40
+ submitBtn = { label: 'Submit' },
41
+ cancelBtn = { label: 'Cancel' },
42
+ buttonProps,
43
+ onSubmit = () => {},
44
+ endPoint,
45
+ defaultValues,
46
+ cols,
47
+ fields,
48
+ dropdowns,
49
+ refetchKey,
50
+ onSuccess = () => {},
51
+ onCancel,
52
+ previousData,
53
+ }: FormProps) {
54
+ const queryClient = useQueryClient()
55
+ const [error, setError] = useState<any>(null)
56
+ const { control, watch, handleSubmit } = useForm({
57
+ defaultValues,
58
+ resolver: yupResolver(generateYupSchema([fields])),
59
+ })
60
+
61
+ const {
62
+ data,
63
+ mutate,
64
+ isLoading: posting,
65
+ } = useMutation(makePostRequest, {
66
+ onSuccess(data) {
67
+ queryClient.invalidateQueries(refetchKey)
68
+ toast.success('Created/Updated Successfully')
69
+ onSuccess && onSuccess()
70
+ },
71
+ onError(error: any) {
72
+ setError(error?.response?.data?.message)
73
+ axiosErrorToast(error)
74
+ },
75
+ })
76
+
77
+ const onError = (error) => {
78
+ const errorArray = Object.values(error)?.map((item: any) => item?.message)
79
+ setError(errorArray)
80
+ }
81
+
82
+ return (
83
+ <form
84
+ onSubmit={handleSubmit((originalFormData) => {
85
+ const modifiedFormData = onSubmit(originalFormData) ?? originalFormData
86
+
87
+ mutate({
88
+ endpoint: endPoint,
89
+ postBody: modifiedFormData,
90
+ })
91
+ }, onError)}
92
+ >
93
+ <RenderForm
94
+ cols={cols}
95
+ fields={fields}
96
+ control={control}
97
+ dropdowns={dropdowns}
98
+ />
99
+
100
+ <FormErrorDisplay message={error} />
101
+ <Box
102
+ sx={{
103
+ display: 'flex',
104
+ gap: '20px',
105
+ marginTop: '1rem',
106
+ }}
107
+ >
108
+ <Button fullWidth type="submit" {...buttonProps}>
109
+ {submitBtn?.label}
110
+ </Button>
111
+ <Button
112
+ fullWidth
113
+ variant="outlined"
114
+ onClick={() => {
115
+ onCancel ? onCancel() : null
116
+ }}
117
+ {...buttonProps}
118
+ >
119
+ {cancelBtn?.label}
120
+ </Button>
121
+ </Box>
122
+ </form>
123
+ )
124
+ }
125
+
126
+ const FormErrorDisplay = ({ message }: { message: string | string[] }) => {
127
+ if (!message) return null
128
+
129
+ if (typeof message === 'string')
130
+ return (
131
+ <Alert severity="error" sx={{ marginTop: '1rem' }}>
132
+ {message}
133
+ </Alert>
134
+ )
135
+
136
+ return (
137
+ <Alert
138
+ severity="error"
139
+ sx={{
140
+ marginTop: '1rem',
141
+ '& .MuiAlert-icon': {
142
+ display: 'flex',
143
+ alignItems: 'center',
144
+ },
145
+ }}
146
+ >
147
+ <Box>
148
+ {message?.map((item, index) => (
149
+ <Typography color="error" variant="body1" key={index}>
150
+ {item}
151
+ </Typography>
152
+ ))}
153
+ </Box>
154
+ </Alert>
155
+ )
156
+ }