@campxdev/shared 1.5.7 → 1.5.9

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 (222) 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/Avenir-Heavy.ttf +0 -0
  5. package/src/assets/fonts/avenir/Avenir-Medium.ttf +0 -0
  6. package/src/assets/fonts/avenir/Avenir-Regular.ttf +0 -0
  7. package/src/assets/fonts/avenir/index.ts +13 -13
  8. package/src/assets/fonts/poppins/index.ts +18 -18
  9. package/src/assets/images/index.ts +17 -17
  10. package/src/assets/images/unauth.svg +92 -92
  11. package/src/components/ActionButton.tsx +20 -20
  12. package/src/components/Attachment.tsx +26 -26
  13. package/src/components/AutocompleteSearch/AutocompleteSearch.tsx +57 -57
  14. package/src/components/AutocompleteSearch/index.tsx +1 -1
  15. package/src/components/Breadcrumbs.tsx +72 -72
  16. package/src/components/Card.tsx +98 -98
  17. package/src/components/CardsGrid.tsx +28 -28
  18. package/src/components/ChangePassword.tsx +123 -123
  19. package/src/components/Chips.tsx +81 -81
  20. package/src/components/Detail.tsx +15 -15
  21. package/src/components/DetailsGrid.tsx +52 -52
  22. package/src/components/DividerHeading.tsx +41 -41
  23. package/src/components/DrawerWrapper/DialogWrapper.tsx +67 -67
  24. package/src/components/DrawerWrapper/DrawerTemplate.tsx +53 -53
  25. package/src/components/DrawerWrapper/DrawerWrapper.tsx +53 -53
  26. package/src/components/DropDownButton/AnchorElement.tsx +44 -44
  27. package/src/components/DropDownButton/DropDownButton.tsx +184 -184
  28. package/src/components/DropDownButton/DropdownMenuItem.tsx +110 -110
  29. package/src/components/DropDownButton/index.tsx +1 -1
  30. package/src/components/DropDownButton/styles.tsx +59 -59
  31. package/src/components/ErrorBoundary/ErrorBoundary.tsx +28 -28
  32. package/src/components/ErrorBoundary/ErrorFallback.tsx +236 -236
  33. package/src/components/ErrorBoundary/GlobalNetworkLoadingIndicator.tsx +13 -13
  34. package/src/components/ErrorBoundary/index.tsx +1 -1
  35. package/src/components/ErrorBox.tsx +42 -42
  36. package/src/components/FilterComponents/FilterButton.tsx +56 -56
  37. package/src/components/FilterComponents/SearchBar.tsx +45 -45
  38. package/src/components/FloatingContainer.tsx +33 -33
  39. package/src/components/Form/Form.tsx +156 -156
  40. package/src/components/Form/RenderForm.tsx +188 -188
  41. package/src/components/FullCalendar/Actions.tsx +162 -162
  42. package/src/components/FullCalendar/FullCalendarWrapper.tsx +54 -54
  43. package/src/components/FullScreenLoader.tsx +19 -19
  44. package/src/components/HookForm/AutoCompleteSearch.tsx +113 -113
  45. package/src/components/HookForm/DatePicker.tsx +40 -40
  46. package/src/components/HookForm/DateTimePicker.tsx +47 -47
  47. package/src/components/HookForm/FormLabel.tsx +14 -14
  48. package/src/components/HookForm/MultiCheckbox.tsx +69 -69
  49. package/src/components/HookForm/MultiSelect.tsx +53 -53
  50. package/src/components/HookForm/RadioGroup.tsx +45 -45
  51. package/src/components/HookForm/SingleCheckbox.tsx +34 -34
  52. package/src/components/HookForm/SingleSelect.tsx +46 -46
  53. package/src/components/HookForm/TextField.tsx +40 -40
  54. package/src/components/HookForm/TimePicker.tsx +40 -40
  55. package/src/components/HookForm/index.ts +23 -23
  56. package/src/components/IconButtons/IconButtons.tsx +137 -137
  57. package/src/components/IconButtons/Icons.tsx +268 -268
  58. package/src/components/IconButtons/assets/edit.svg +4 -4
  59. package/src/components/IconButtons/assets/eye.svg +6 -6
  60. package/src/components/IconButtons/assets/trash.svg +7 -7
  61. package/src/components/IconButtons/index.tsx +8 -8
  62. package/src/components/IconLabel.tsx +37 -37
  63. package/src/components/Image/Image.tsx +45 -45
  64. package/src/components/Image/index.tsx +1 -1
  65. package/src/components/ImageUpload.tsx +98 -98
  66. package/src/components/Input/AsyncSearchSelect/AsyncSearchSelect.tsx +216 -216
  67. package/src/components/Input/AsyncSearchSelect/index.tsx +1 -1
  68. package/src/components/Input/AsyncSearchSelect/styles.tsx +105 -105
  69. package/src/components/Input/AutoCompleteSearch.tsx +121 -121
  70. package/src/components/Input/DatePicker.tsx +73 -73
  71. package/src/components/Input/DateRangePicker.tsx +105 -105
  72. package/src/components/Input/DateTimePicker.tsx +81 -81
  73. package/src/components/Input/FormLabel.tsx +21 -21
  74. package/src/components/Input/MultiCheckbox.tsx +64 -64
  75. package/src/components/Input/MultiSelect.tsx +150 -150
  76. package/src/components/Input/RadioGroup.tsx +104 -104
  77. package/src/components/Input/SingleCheckbox.tsx +78 -78
  78. package/src/components/Input/SingleSelect.tsx +104 -104
  79. package/src/components/Input/TextField.tsx +46 -46
  80. package/src/components/Input/TimePicker.tsx +74 -74
  81. package/src/components/Input/index.ts +26 -26
  82. package/src/components/Input/types.ts +3 -3
  83. package/src/components/JsonPreview.tsx +7 -7
  84. package/src/components/LabelValue.tsx +21 -21
  85. package/src/components/Layout/ChangePassword.tsx +49 -49
  86. package/src/components/Layout/Header/AppHeader.tsx +102 -102
  87. package/src/components/Layout/Header/AppsMenu.tsx +98 -98
  88. package/src/components/Layout/Header/CogWheelMenu.tsx +33 -33
  89. package/src/components/Layout/Header/Notification.tsx +13 -13
  90. package/src/components/Layout/Header/UserBox.tsx +70 -70
  91. package/src/components/Layout/Header/applications.ts +91 -91
  92. package/src/components/Layout/Header/assets/campx_square_small.svg +9 -9
  93. package/src/components/Layout/Header/assets/commutex.svg +14 -14
  94. package/src/components/Layout/Header/assets/commutexSmall.svg +11 -11
  95. package/src/components/Layout/Header/assets/enroll.svg +14 -14
  96. package/src/components/Layout/Header/assets/enrollx.svg +14 -14
  97. package/src/components/Layout/Header/assets/exams_small.svg +12 -12
  98. package/src/components/Layout/Header/assets/examsx.svg +14 -14
  99. package/src/components/Layout/Header/assets/hostel_small.svg +13 -13
  100. package/src/components/Layout/Header/assets/hostelx.svg +13 -13
  101. package/src/components/Layout/Header/assets/index.ts +33 -33
  102. package/src/components/Layout/Header/assets/libraryx.svg +12 -12
  103. package/src/components/Layout/Header/assets/pay_small.svg +16 -16
  104. package/src/components/Layout/Header/assets/payx.svg +19 -19
  105. package/src/components/Layout/Header/assets/people_small.svg +9 -9
  106. package/src/components/Layout/Header/assets/peoplex.svg +12 -12
  107. package/src/components/Layout/Header/assets/squarex.svg +12 -12
  108. package/src/components/Layout/Header/icons.tsx +57 -57
  109. package/src/components/Layout/Header/index.tsx +1 -1
  110. package/src/components/Layout/Header/styles.tsx +124 -124
  111. package/src/components/Layout/Helmet.tsx +49 -49
  112. package/src/components/Layout/LayoutWrapper.tsx +28 -28
  113. package/src/components/Layout/SideMenuHeader.tsx +29 -29
  114. package/src/components/Layout/SideNav.tsx +168 -168
  115. package/src/components/Layout/Tickets/HelpWidget/HelpWidget.tsx +273 -273
  116. package/src/components/Layout/Tickets/HelpWidget/styles.tsx +94 -94
  117. package/src/components/Layout/Tickets/MyTickets.tsx +72 -72
  118. package/src/components/Layout/Tickets/TicketDetails.tsx +65 -65
  119. package/src/components/Layout/Tickets/TimeLine.tsx +64 -64
  120. package/src/components/Layout/Tickets/index.tsx +1 -1
  121. package/src/components/Layout/Tickets/services.ts +11 -11
  122. package/src/components/Layout/Tickets/styles.tsx +136 -136
  123. package/src/components/LinearProgress.tsx +19 -19
  124. package/src/components/ListItemButton.tsx +95 -95
  125. package/src/components/LoginForm.tsx +80 -80
  126. package/src/components/MediaRow/MediaRow.tsx +69 -69
  127. package/src/components/MediaRow/index.tsx +1 -1
  128. package/src/components/ModalButtons/DialogButton.tsx +121 -121
  129. package/src/components/ModalButtons/DrawerButton.tsx +113 -113
  130. package/src/components/ModalButtons/index.tsx +4 -4
  131. package/src/components/NoDataIllustration.tsx +32 -32
  132. package/src/components/PageContent.tsx +12 -12
  133. package/src/components/PageHeader.tsx +55 -55
  134. package/src/components/PageNotFound.tsx +26 -26
  135. package/src/components/PopupConfirm/ConfirmContextProvider.tsx +40 -40
  136. package/src/components/PopupConfirm/PopupConfirm.tsx +67 -67
  137. package/src/components/PopupConfirm/index.tsx +1 -1
  138. package/src/components/PopupConfirm/useConfirm.ts +47 -47
  139. package/src/components/Row.tsx +24 -24
  140. package/src/components/Spinner.tsx +18 -18
  141. package/src/components/StepsHeader/StepsHeader.tsx +115 -115
  142. package/src/components/StepsHeader/index.tsx +1 -1
  143. package/src/components/StyledTableContainer.tsx +33 -33
  144. package/src/components/SwitchButton.tsx +41 -41
  145. package/src/components/Table.tsx +42 -42
  146. package/src/components/TableComponent/BatchActionsHeader.tsx +58 -58
  147. package/src/components/TableComponent/Icons/index.tsx +50 -50
  148. package/src/components/TableComponent/ReactTable.tsx +295 -295
  149. package/src/components/TableComponent/RenderTableBody.tsx +68 -68
  150. package/src/components/TableComponent/Table.tsx +197 -197
  151. package/src/components/TableComponent/TableFooter/TableFooter.tsx +104 -104
  152. package/src/components/TableComponent/TableFooter/index.tsx +1 -1
  153. package/src/components/TableComponent/TableFooter/styles.tsx +28 -28
  154. package/src/components/TableComponent/index.tsx +1 -1
  155. package/src/components/TableComponent/react-table-config.d.ts +128 -128
  156. package/src/components/TableComponent/styles.tsx +170 -170
  157. package/src/components/TableComponent/types.ts +57 -57
  158. package/src/components/Tabs/NavigationTabs.tsx +80 -80
  159. package/src/components/Tabs/Tabs.tsx +53 -53
  160. package/src/components/Tabs/TabsContainer.tsx +50 -50
  161. package/src/components/Tabs/index.tsx +1 -1
  162. package/src/components/Tabs/styles.tsx +55 -55
  163. package/src/components/ToastContainer/ToastContainer.tsx +57 -57
  164. package/src/components/ToastContainer/index.tsx +1 -1
  165. package/src/components/UploadButton/UploadButton.tsx +126 -126
  166. package/src/components/UploadButton/index.tsx +1 -1
  167. package/src/components/UploadButton/types.ts +19 -19
  168. package/src/components/UploadDocument.tsx +108 -108
  169. package/src/components/UploadFileDialog/UploadFileDialog.tsx +238 -238
  170. package/src/components/UploadFileDialog/index.tsx +1 -1
  171. package/src/components/index.ts +93 -93
  172. package/src/config/axios.ts +73 -73
  173. package/src/config/axiosEvaluator.ts +53 -53
  174. package/src/config/axiosXTenant.ts +57 -57
  175. package/src/constants/UIConstants.ts +97 -97
  176. package/src/constants/formValidations.ts +6 -6
  177. package/src/constants/index.ts +5 -5
  178. package/src/constants/isDevelopment.ts +3 -3
  179. package/src/constants/permissions.ts +67 -67
  180. package/src/constants/validateMessages.ts +12 -12
  181. package/src/contexts/LoginFormProvider.tsx +39 -39
  182. package/src/contexts/Providers.tsx +73 -73
  183. package/src/contexts/PublicProviders.tsx +30 -30
  184. package/src/contexts/QueryClientProvider.tsx +22 -22
  185. package/src/hooks/index.ts +4 -4
  186. package/src/hooks/useAuth.ts +96 -96
  187. package/src/hooks/useFetch.ts +53 -53
  188. package/src/hooks/useFilters.ts +80 -80
  189. package/src/hooks/useRouter.ts +31 -31
  190. package/src/layouts/Components/DashBoardMenu.tsx +232 -232
  191. package/src/layouts/Components/icons/index.tsx +403 -403
  192. package/src/layouts/Components/styles.tsx +74 -74
  193. package/src/layouts/ComponentsLayout.tsx +3 -3
  194. package/src/permissions/PageWithPermission.tsx +18 -18
  195. package/src/permissions/PermissionDeniedPage.tsx +16 -16
  196. package/src/permissions/ValidateAccess.tsx +18 -18
  197. package/src/permissions/index.ts +2 -2
  198. package/src/react-app-env.d.ts +1 -1
  199. package/src/shared-state/AssetsStore.ts +15 -15
  200. package/src/shared-state/PermissionsStore.ts +352 -352
  201. package/src/shared-state/UserStore.ts +13 -13
  202. package/src/shared-state/index.ts +4 -4
  203. package/src/theme/App.less +3 -3
  204. package/src/theme/MuiThemeProvider.tsx +13 -13
  205. package/src/theme/customCssBaseline.ts +135 -135
  206. package/src/theme/index.css +28 -28
  207. package/src/theme/muiTheme.ts +592 -592
  208. package/src/theme/theme.d.ts +75 -75
  209. package/src/utils/alphabet.ts +23 -23
  210. package/src/utils/arrayPadEnd.ts +3 -3
  211. package/src/utils/formatCurrency.ts +9 -9
  212. package/src/utils/getUrlParams.ts +5 -5
  213. package/src/utils/index.ts +7 -7
  214. package/src/utils/logout.ts +25 -25
  215. package/src/utils/ordinalSuffixOf.ts +14 -14
  216. package/src/utils/romanize.ts +40 -40
  217. package/src/utils/withRouteWrapper.tsx +25 -25
  218. package/src/utils/withSuspense.tsx +6 -6
  219. package/styled-components.tsx +60 -60
  220. package/tsconfig.json +21 -21
  221. package/yarn-error.log +109 -0
  222. 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
+ }