@campxdev/shared 1.6.2 → 1.6.3

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 +121 -121
  84. package/src/components/Layout/Header/AppsMenu.tsx +102 -102
  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 +61 -61
  88. package/src/components/Layout/Header/applications.ts +91 -91
  89. package/src/components/Layout/Header/assets/campx_square_small.svg +8 -8
  90. package/src/components/Layout/Header/assets/commuteX.png +0 -0
  91. package/src/components/Layout/Header/assets/commutex.svg +14 -14
  92. package/src/components/Layout/Header/assets/commutexSmall.svg +11 -11
  93. package/src/components/Layout/Header/assets/enroll.svg +14 -14
  94. package/src/components/Layout/Header/assets/enrollx.svg +14 -14
  95. package/src/components/Layout/Header/assets/exams_small.svg +11 -11
  96. package/src/components/Layout/Header/assets/examsx.svg +14 -14
  97. package/src/components/Layout/Header/assets/hostel_small.svg +13 -13
  98. package/src/components/Layout/Header/assets/hostelx.svg +13 -13
  99. package/src/components/Layout/Header/assets/index.ts +33 -33
  100. package/src/components/Layout/Header/assets/libraryx.svg +12 -12
  101. package/src/components/Layout/Header/assets/pay_small.svg +15 -15
  102. package/src/components/Layout/Header/assets/payx.svg +19 -19
  103. package/src/components/Layout/Header/assets/people_small.svg +9 -9
  104. package/src/components/Layout/Header/assets/peoplex.svg +12 -12
  105. package/src/components/Layout/Header/assets/squarex.svg +12 -12
  106. package/src/components/Layout/Header/icons.tsx +57 -57
  107. package/src/components/Layout/Header/index.tsx +1 -1
  108. package/src/components/Layout/Header/styles.tsx +133 -133
  109. package/src/components/Layout/Helmet.tsx +49 -49
  110. package/src/components/Layout/LayoutWrapper.tsx +28 -28
  111. package/src/components/Layout/SideMenuHeader.tsx +29 -29
  112. package/src/components/Layout/SideNav.tsx +168 -168
  113. package/src/components/Layout/Tickets/HelpWidget/HelpWidget.tsx +273 -273
  114. package/src/components/Layout/Tickets/HelpWidget/styles.tsx +94 -94
  115. package/src/components/Layout/Tickets/MyTickets.tsx +72 -72
  116. package/src/components/Layout/Tickets/TicketDetails.tsx +65 -65
  117. package/src/components/Layout/Tickets/TimeLine.tsx +64 -64
  118. package/src/components/Layout/Tickets/index.tsx +1 -1
  119. package/src/components/Layout/Tickets/services.ts +11 -11
  120. package/src/components/Layout/Tickets/styles.tsx +136 -136
  121. package/src/components/LinearProgress.tsx +19 -19
  122. package/src/components/ListItemButton.tsx +95 -95
  123. package/src/components/LoginForm.tsx +80 -80
  124. package/src/components/MediaRow/MediaRow.tsx +69 -69
  125. package/src/components/MediaRow/index.tsx +1 -1
  126. package/src/components/ModalButtons/DialogButton.tsx +121 -121
  127. package/src/components/ModalButtons/DrawerButton.tsx +113 -113
  128. package/src/components/ModalButtons/index.tsx +4 -4
  129. package/src/components/NoDataIllustration.tsx +32 -32
  130. package/src/components/PageContent.tsx +12 -12
  131. package/src/components/PageHeader.tsx +55 -55
  132. package/src/components/PageNotFound.tsx +26 -26
  133. package/src/components/PopupConfirm/ConfirmContextProvider.tsx +40 -40
  134. package/src/components/PopupConfirm/PopupConfirm.tsx +67 -67
  135. package/src/components/PopupConfirm/index.tsx +1 -1
  136. package/src/components/PopupConfirm/useConfirm.ts +47 -47
  137. package/src/components/Row.tsx +24 -24
  138. package/src/components/Spinner.tsx +18 -18
  139. package/src/components/StepsHeader/StepsHeader.tsx +115 -115
  140. package/src/components/StepsHeader/index.tsx +1 -1
  141. package/src/components/StyledTableContainer.tsx +33 -33
  142. package/src/components/SwitchButton.tsx +41 -41
  143. package/src/components/Table.tsx +42 -42
  144. package/src/components/TableComponent/BatchActionsHeader.tsx +58 -58
  145. package/src/components/TableComponent/Icons/index.tsx +50 -50
  146. package/src/components/TableComponent/ReactTable.tsx +295 -295
  147. package/src/components/TableComponent/RenderTableBody.tsx +68 -68
  148. package/src/components/TableComponent/Table.tsx +197 -197
  149. package/src/components/TableComponent/TableFooter/TableFooter.tsx +104 -104
  150. package/src/components/TableComponent/TableFooter/index.tsx +1 -1
  151. package/src/components/TableComponent/TableFooter/styles.tsx +28 -28
  152. package/src/components/TableComponent/index.tsx +1 -1
  153. package/src/components/TableComponent/react-table-config.d.ts +128 -128
  154. package/src/components/TableComponent/styles.tsx +170 -170
  155. package/src/components/TableComponent/types.ts +57 -57
  156. package/src/components/Tabs/NavigationTabs.tsx +80 -80
  157. package/src/components/Tabs/Tabs.tsx +53 -53
  158. package/src/components/Tabs/TabsContainer.tsx +50 -50
  159. package/src/components/Tabs/index.tsx +1 -1
  160. package/src/components/Tabs/styles.tsx +55 -55
  161. package/src/components/ToastContainer/ToastContainer.tsx +57 -57
  162. package/src/components/ToastContainer/index.tsx +1 -1
  163. package/src/components/UploadButton/UploadButton.tsx +126 -126
  164. package/src/components/UploadButton/index.tsx +1 -1
  165. package/src/components/UploadButton/types.ts +19 -19
  166. package/src/components/UploadDocument.tsx +108 -108
  167. package/src/components/UploadFileDialog/UploadFileDialog.tsx +238 -238
  168. package/src/components/UploadFileDialog/index.tsx +1 -1
  169. package/src/components/index.ts +93 -93
  170. package/src/config/axios.ts +73 -73
  171. package/src/config/axiosEvaluator.ts +53 -53
  172. package/src/config/axiosXTenant.ts +57 -57
  173. package/src/constants/UIConstants.ts +97 -97
  174. package/src/constants/formValidations.ts +6 -6
  175. package/src/constants/index.ts +5 -5
  176. package/src/constants/isDevelopment.ts +3 -3
  177. package/src/constants/permissions.ts +67 -67
  178. package/src/constants/validateMessages.ts +12 -12
  179. package/src/contexts/LoginFormProvider.tsx +39 -39
  180. package/src/contexts/Providers.tsx +44 -73
  181. package/src/contexts/PublicProviders.tsx +30 -30
  182. package/src/contexts/QueryClientProvider.tsx +22 -22
  183. package/src/hooks/index.ts +4 -4
  184. package/src/hooks/useAuth.ts +96 -96
  185. package/src/hooks/useFetch.ts +53 -53
  186. package/src/hooks/useFilters.ts +80 -80
  187. package/src/hooks/useRouter.ts +31 -31
  188. package/src/layouts/Components/DashBoardMenu.tsx +232 -232
  189. package/src/layouts/Components/icons/index.tsx +403 -403
  190. package/src/layouts/Components/styles.tsx +74 -74
  191. package/src/layouts/ComponentsLayout.tsx +3 -3
  192. package/src/permissions/PageWithPermission.tsx +18 -18
  193. package/src/permissions/PermissionDeniedPage.tsx +16 -16
  194. package/src/permissions/ValidateAccess.tsx +18 -18
  195. package/src/permissions/index.ts +2 -2
  196. package/src/react-app-env.d.ts +1 -1
  197. package/src/shared-state/AssetsStore.ts +15 -15
  198. package/src/shared-state/PermissionsStore.ts +352 -352
  199. package/src/shared-state/UserStore.ts +13 -13
  200. package/src/shared-state/index.ts +4 -4
  201. package/src/theme/App.less +3 -3
  202. package/src/theme/MuiThemeProvider.tsx +18 -13
  203. package/src/theme/customCssBaseline.ts +135 -135
  204. package/src/theme/index.css +28 -28
  205. package/src/theme/muiTheme.ts +592 -592
  206. package/src/theme/theme.d.ts +75 -75
  207. package/src/utils/alphabet.ts +23 -23
  208. package/src/utils/arrayPadEnd.ts +3 -3
  209. package/src/utils/formatCurrency.ts +9 -9
  210. package/src/utils/getUrlParams.ts +5 -5
  211. package/src/utils/index.ts +7 -7
  212. package/src/utils/logout.ts +25 -25
  213. package/src/utils/ordinalSuffixOf.ts +14 -14
  214. package/src/utils/romanize.ts +40 -40
  215. package/src/utils/withRouteWrapper.tsx +25 -25
  216. package/src/utils/withSuspense.tsx +6 -6
  217. package/styled-components.tsx +60 -60
  218. package/tsconfig.json +21 -21
  219. package/yarn-error.log +0 -109
@@ -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
+ }