@campxdev/shared 1.10.40 → 1.10.41

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 (280) hide show
  1. package/antd.customize.less +73 -73
  2. package/exports.ts +19 -19
  3. package/package.json +87 -87
  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/ApplicationProfile/ApplicationProfile.tsx +334 -334
  10. package/src/components/ApplicationProfile/DepartmentFilter.tsx +77 -77
  11. package/src/components/ApplicationProfile/UserProfileRelation.tsx +140 -140
  12. package/src/components/ApplicationProfile/index.tsx +1 -1
  13. package/src/components/ApplicationProfile/services.ts +83 -83
  14. package/src/components/Attachment.tsx +26 -26
  15. package/src/components/AutocompleteSearch/AutocompleteSearch.tsx +57 -57
  16. package/src/components/AutocompleteSearch/index.tsx +1 -1
  17. package/src/components/Breadcrumbs.tsx +72 -72
  18. package/src/components/Card.tsx +98 -98
  19. package/src/components/CardsGrid.tsx +28 -28
  20. package/src/components/ChangePassword.tsx +123 -123
  21. package/src/components/Chips.tsx +81 -81
  22. package/src/components/Detail.tsx +15 -15
  23. package/src/components/DetailsGrid.tsx +52 -52
  24. package/src/components/DividerHeading.tsx +41 -41
  25. package/src/components/DrawerWrapper/DialogWrapper.tsx +67 -67
  26. package/src/components/DrawerWrapper/DrawerTemplate.tsx +53 -53
  27. package/src/components/DrawerWrapper/DrawerWrapper.tsx +53 -53
  28. package/src/components/DropDownButton/AnchorElement.tsx +44 -44
  29. package/src/components/DropDownButton/DropDownButton.tsx +184 -184
  30. package/src/components/DropDownButton/DropdownMenuItem.tsx +122 -122
  31. package/src/components/DropDownButton/index.tsx +1 -1
  32. package/src/components/DropDownButton/styles.tsx +59 -59
  33. package/src/components/ErrorBoundary/ErrorBoundary.tsx +33 -33
  34. package/src/components/ErrorBoundary/ErrorFallback.tsx +240 -240
  35. package/src/components/ErrorBoundary/GlobalNetworkLoadingIndicator.tsx +13 -13
  36. package/src/components/ErrorBoundary/index.tsx +1 -1
  37. package/src/components/ErrorBox.tsx +42 -42
  38. package/src/components/ExcelToJsonInput/ExcelJsonUpload.tsx +50 -50
  39. package/src/components/ExcelToJsonInput/ExcelToJsonInput.tsx +57 -57
  40. package/src/components/ExcelToJsonInput/index.tsx +1 -1
  41. package/src/components/FilterComponents/FilterButton.tsx +56 -56
  42. package/src/components/FilterComponents/SearchBar.tsx +45 -45
  43. package/src/components/FloatingContainer.tsx +33 -33
  44. package/src/components/Form/Form.tsx +147 -147
  45. package/src/components/Form/RenderForm.tsx +189 -189
  46. package/src/components/FullScreenLoader.tsx +19 -19
  47. package/src/components/HookForm/AutoCompleteSearch.tsx +113 -113
  48. package/src/components/HookForm/DatePicker.tsx +40 -40
  49. package/src/components/HookForm/DateTimePicker.tsx +47 -47
  50. package/src/components/HookForm/FormLabel.tsx +14 -14
  51. package/src/components/HookForm/MultiCheckbox.tsx +69 -69
  52. package/src/components/HookForm/MultiSelect.tsx +61 -61
  53. package/src/components/HookForm/RadioGroup.tsx +47 -47
  54. package/src/components/HookForm/SingleCheckbox.tsx +34 -34
  55. package/src/components/HookForm/SingleSelect.tsx +46 -46
  56. package/src/components/HookForm/TextField.tsx +40 -40
  57. package/src/components/HookForm/TimePicker.tsx +40 -40
  58. package/src/components/HookForm/index.ts +23 -23
  59. package/src/components/IconButtons/IconButtons.tsx +137 -137
  60. package/src/components/IconButtons/Icons.tsx +299 -299
  61. package/src/components/IconButtons/assets/edit.svg +4 -4
  62. package/src/components/IconButtons/assets/eye.svg +6 -6
  63. package/src/components/IconButtons/assets/trash.svg +7 -7
  64. package/src/components/IconButtons/index.tsx +8 -8
  65. package/src/components/IconLabel.tsx +37 -37
  66. package/src/components/Image/Image.tsx +45 -45
  67. package/src/components/Image/index.tsx +1 -1
  68. package/src/components/ImageUpload.tsx +105 -98
  69. package/src/components/Input/AsyncSearchSelect/AsyncSearchSelect.tsx +216 -216
  70. package/src/components/Input/AsyncSearchSelect/index.tsx +1 -1
  71. package/src/components/Input/AsyncSearchSelect/styles.tsx +105 -105
  72. package/src/components/Input/AutoCompleteSearch.tsx +121 -121
  73. package/src/components/Input/DatePicker.tsx +94 -94
  74. package/src/components/Input/DateRangePicker.tsx +105 -105
  75. package/src/components/Input/DateTimePicker.tsx +87 -87
  76. package/src/components/Input/FormLabel.tsx +21 -21
  77. package/src/components/Input/MultiCheckbox.tsx +64 -64
  78. package/src/components/Input/MultiSelect.tsx +161 -161
  79. package/src/components/Input/RadioGroup.tsx +110 -110
  80. package/src/components/Input/SingleCheckbox.tsx +78 -78
  81. package/src/components/Input/SingleSelect.tsx +104 -104
  82. package/src/components/Input/TextField.tsx +46 -46
  83. package/src/components/Input/TimePicker.tsx +77 -77
  84. package/src/components/Input/index.ts +26 -26
  85. package/src/components/Input/types.ts +3 -3
  86. package/src/components/Institutions/InsititutionsDialog.tsx +78 -78
  87. package/src/components/Institutions/InsititutionsNotAssignedDialog .tsx +12 -12
  88. package/src/components/Institutions/InstitutionsDropdown.tsx +33 -33
  89. package/src/components/Institutions/index.tsx +1 -1
  90. package/src/components/Institutions/services.ts +12 -12
  91. package/src/components/JsonPreview.tsx +7 -7
  92. package/src/components/LabelValue.tsx +21 -21
  93. package/src/components/Layout/ChangePassword.tsx +49 -49
  94. package/src/components/Layout/Header/AppHeader.tsx +109 -109
  95. package/src/components/Layout/Header/AppsMenu.tsx +132 -132
  96. package/src/components/Layout/Header/HeaderActions/CogWheelMenu.tsx +33 -33
  97. package/src/components/Layout/Header/HeaderActions/FreshChatButton.tsx +61 -61
  98. package/src/components/Layout/Header/HeaderActions/FreshDeskHelpButton.tsx +53 -53
  99. package/src/components/Layout/Header/HeaderActions/HeaderActions.tsx +29 -29
  100. package/src/components/Layout/Header/HeaderActions/UserBox.tsx +74 -74
  101. package/src/components/Layout/Header/Notification.tsx +13 -13
  102. package/src/components/Layout/Header/Search/SearchButton.tsx +69 -69
  103. package/src/components/Layout/Header/Search/SearchDialog.tsx +178 -178
  104. package/src/components/Layout/Header/applications.ts +101 -101
  105. package/src/components/Layout/Header/assets/campx_square_small.svg +8 -8
  106. package/src/components/Layout/Header/assets/commuteX.png +0 -0
  107. package/src/components/Layout/Header/assets/commutex.svg +14 -14
  108. package/src/components/Layout/Header/assets/commutexSmall.svg +11 -11
  109. package/src/components/Layout/Header/assets/enroll.svg +14 -14
  110. package/src/components/Layout/Header/assets/enrollx.svg +14 -14
  111. package/src/components/Layout/Header/assets/exams_small.svg +11 -11
  112. package/src/components/Layout/Header/assets/examsx.svg +14 -14
  113. package/src/components/Layout/Header/assets/hostel_small.svg +13 -13
  114. package/src/components/Layout/Header/assets/hostelx.svg +13 -13
  115. package/src/components/Layout/Header/assets/index.ts +37 -37
  116. package/src/components/Layout/Header/assets/libraryx.svg +12 -12
  117. package/src/components/Layout/Header/assets/pay_small.svg +15 -15
  118. package/src/components/Layout/Header/assets/payx.svg +19 -19
  119. package/src/components/Layout/Header/assets/people_small.svg +9 -9
  120. package/src/components/Layout/Header/assets/peoplex.svg +12 -12
  121. package/src/components/Layout/Header/assets/squarex.svg +12 -12
  122. package/src/components/Layout/Header/icons.tsx +57 -57
  123. package/src/components/Layout/Header/index.tsx +1 -1
  124. package/src/components/Layout/Header/styles.tsx +133 -133
  125. package/src/components/Layout/Helmet.tsx +129 -129
  126. package/src/components/Layout/LayoutWrapper.tsx +28 -28
  127. package/src/components/Layout/SideMenuHeader.tsx +29 -29
  128. package/src/components/Layout/SideNav.tsx +168 -168
  129. package/src/components/Layout/Tickets/HelpWidget/HelpWidget.tsx +273 -273
  130. package/src/components/Layout/Tickets/HelpWidget/styles.tsx +94 -94
  131. package/src/components/Layout/Tickets/MyTickets.tsx +72 -72
  132. package/src/components/Layout/Tickets/TicketDetails.tsx +65 -65
  133. package/src/components/Layout/Tickets/TimeLine.tsx +64 -64
  134. package/src/components/Layout/Tickets/index.tsx +1 -1
  135. package/src/components/Layout/Tickets/services.ts +11 -11
  136. package/src/components/Layout/Tickets/styles.tsx +136 -136
  137. package/src/components/LinearProgress.tsx +19 -19
  138. package/src/components/ListItemButton.tsx +95 -95
  139. package/src/components/LoginForm.tsx +274 -274
  140. package/src/components/MediaRow/MediaRow.tsx +67 -67
  141. package/src/components/MediaRow/index.tsx +1 -1
  142. package/src/components/ModalButtons/DialogButton.tsx +133 -133
  143. package/src/components/ModalButtons/DrawerButton.tsx +118 -118
  144. package/src/components/ModalButtons/PopoverButton.tsx +99 -99
  145. package/src/components/ModalButtons/index.tsx +4 -4
  146. package/src/components/MyProfile/Education/Education.tsx +47 -47
  147. package/src/components/MyProfile/Education/EducationCard.tsx +62 -62
  148. package/src/components/MyProfile/Education/EducationForm.tsx +117 -117
  149. package/src/components/MyProfile/Education/Styles.tsx +27 -27
  150. package/src/components/MyProfile/Experience/Experience.tsx +47 -47
  151. package/src/components/MyProfile/Experience/ExperienceCard.tsx +65 -65
  152. package/src/components/MyProfile/Experience/ExperienceForm.tsx +134 -134
  153. package/src/components/MyProfile/Experience/Styles.tsx +27 -27
  154. package/src/components/MyProfile/FileUpload.tsx +69 -69
  155. package/src/components/MyProfile/MyProfile.tsx +161 -152
  156. package/src/components/MyProfile/NoDataSection.tsx +27 -27
  157. package/src/components/MyProfile/PaperPublication/Authors.tsx +88 -88
  158. package/src/components/MyProfile/PaperPublication/PaperPublications.tsx +52 -52
  159. package/src/components/MyProfile/PaperPublication/PublicationCard.tsx +80 -80
  160. package/src/components/MyProfile/PaperPublication/PublicationsForm.tsx +286 -286
  161. package/src/components/MyProfile/PaperPublication/Styles.tsx +51 -51
  162. package/src/components/MyProfile/ResearchProjects/FileRender.tsx +53 -0
  163. package/src/components/MyProfile/ResearchProjects/ResearchProjectCard.tsx +69 -0
  164. package/src/components/MyProfile/ResearchProjects/ResearchProjectData.tsx +36 -0
  165. package/src/components/MyProfile/ResearchProjects/ResearchProjectForm.tsx +475 -0
  166. package/src/components/MyProfile/ResearchProjects/ResearchProjects.tsx +55 -0
  167. package/src/components/MyProfile/ResearchProjects/Styles.tsx +26 -0
  168. package/src/components/MyProfile/ResearchProjects/services.tsx +42 -0
  169. package/src/components/MyProfile/StyledTabsContainer.tsx +53 -53
  170. package/src/components/MyProfile/Styles.tsx +128 -128
  171. package/src/components/MyProfile/Workshop/Styles.tsx +38 -38
  172. package/src/components/MyProfile/Workshop/Workshop.tsx +49 -49
  173. package/src/components/MyProfile/Workshop/WorkshopCard.tsx +64 -64
  174. package/src/components/MyProfile/Workshop/WorkshopData.tsx +36 -36
  175. package/src/components/MyProfile/Workshop/WorkshopForm.tsx +215 -215
  176. package/src/components/MyProfile/index.ts +1 -1
  177. package/src/components/MyProfile/service.ts +58 -58
  178. package/src/components/NoDataIllustration.tsx +35 -35
  179. package/src/components/PageContent.tsx +12 -12
  180. package/src/components/PageHeader.tsx +55 -55
  181. package/src/components/PageNotFound.tsx +26 -26
  182. package/src/components/PopupConfirm/ConfirmContextProvider.tsx +40 -40
  183. package/src/components/PopupConfirm/PopupConfirm.tsx +71 -71
  184. package/src/components/PopupConfirm/index.tsx +1 -1
  185. package/src/components/PopupConfirm/useConfirm.ts +47 -47
  186. package/src/components/ResetPassword.tsx +107 -107
  187. package/src/components/Row.tsx +24 -24
  188. package/src/components/Spinner.tsx +18 -18
  189. package/src/components/StepsHeader/StepsHeader.tsx +115 -115
  190. package/src/components/StepsHeader/index.tsx +1 -1
  191. package/src/components/StyledTableContainer.tsx +33 -33
  192. package/src/components/SwitchButton.tsx +41 -41
  193. package/src/components/Table.tsx +42 -42
  194. package/src/components/Tables/BasicTable/Table.tsx +198 -198
  195. package/src/components/Tables/BasicTable/TableFooter.tsx +86 -86
  196. package/src/components/Tables/BasicTable/index.tsx +1 -1
  197. package/src/components/Tables/ReactTable/BatchActionsHeader.tsx +58 -58
  198. package/src/components/Tables/ReactTable/ReactTable.tsx +295 -295
  199. package/src/components/Tables/ReactTable/RenderTableBody.tsx +49 -49
  200. package/src/components/Tables/ReactTable/index.tsx +1 -1
  201. package/src/components/Tables/ReactTable/react-table-config.d.ts +128 -128
  202. package/src/components/Tables/common/NoRecordsFound.tsx +31 -31
  203. package/src/components/Tables/common/TableStats.tsx +22 -22
  204. package/src/components/Tables/common/icons.tsx +50 -50
  205. package/src/components/Tables/common/no-data-illu.svg +23 -23
  206. package/src/components/Tables/common/styles.tsx +170 -170
  207. package/src/components/Tables/common/types.ts +57 -57
  208. package/src/components/Tabs/NavigationTabs.tsx +80 -80
  209. package/src/components/Tabs/Tabs.tsx +53 -53
  210. package/src/components/Tabs/TabsContainer.tsx +56 -56
  211. package/src/components/Tabs/index.tsx +1 -1
  212. package/src/components/Tabs/styles.tsx +55 -55
  213. package/src/components/ToastContainer/ToastContainer.tsx +57 -57
  214. package/src/components/ToastContainer/index.tsx +1 -1
  215. package/src/components/UploadButton/UploadButton.tsx +127 -127
  216. package/src/components/UploadButton/index.tsx +1 -1
  217. package/src/components/UploadButton/types.ts +20 -20
  218. package/src/components/UploadDocument.tsx +108 -108
  219. package/src/components/UploadFileDialog/UploadFileDialog.tsx +256 -256
  220. package/src/components/UploadFileDialog/index.tsx +1 -1
  221. package/src/components/index.ts +110 -110
  222. package/src/config/axios.ts +80 -80
  223. package/src/config/axiosEvaluator.ts +53 -53
  224. package/src/config/axiosXTenant.ts +57 -57
  225. package/src/constants/UIConstants.ts +128 -124
  226. package/src/constants/formValidations.ts +6 -6
  227. package/src/constants/index.ts +5 -5
  228. package/src/constants/isDevelopment.ts +4 -4
  229. package/src/constants/permissions.ts +67 -67
  230. package/src/constants/validateMessages.ts +12 -12
  231. package/src/contexts/LoginFormProvider.tsx +37 -37
  232. package/src/contexts/Providers.tsx +73 -73
  233. package/src/contexts/PublicProviders.tsx +30 -30
  234. package/src/contexts/QueryClientProvider.tsx +22 -22
  235. package/src/contexts/RootModal.tsx +76 -76
  236. package/src/hooks/index.ts +5 -5
  237. package/src/hooks/useAuth.ts +259 -259
  238. package/src/hooks/useExternalScript.ts +38 -38
  239. package/src/hooks/useFetch.ts +53 -53
  240. package/src/hooks/useFilters.ts +83 -83
  241. package/src/hooks/useRouter.ts +31 -31
  242. package/src/layouts/Components/DashBoardMenu.tsx +232 -232
  243. package/src/layouts/Components/icons/index.tsx +403 -403
  244. package/src/layouts/Components/styles.tsx +74 -74
  245. package/src/layouts/ComponentsLayout.tsx +3 -3
  246. package/src/permissions/PageWithPermission.tsx +18 -18
  247. package/src/permissions/PermissionDeniedPage.tsx +16 -16
  248. package/src/permissions/ValidateAccess.tsx +18 -18
  249. package/src/permissions/index.ts +2 -2
  250. package/src/react-app-env.d.ts +1 -1
  251. package/src/shared-state/AssetsStore.ts +15 -15
  252. package/src/shared-state/InstitutionsStore.ts +8 -8
  253. package/src/shared-state/PermissionsStore.ts +1299 -1299
  254. package/src/shared-state/UserStore.ts +15 -15
  255. package/src/shared-state/index.ts +4 -4
  256. package/src/sitemap/enrollx.ts +52 -52
  257. package/src/sitemap/exams_sitemap.ts +172 -172
  258. package/src/sitemap/payments.ts +128 -128
  259. package/src/sitemap/sitemap.ts +26 -26
  260. package/src/sitemap/square.ts +222 -222
  261. package/src/theme/App.less +3 -3
  262. package/src/theme/MuiThemeProvider.tsx +18 -18
  263. package/src/theme/customCssBaseline.ts +135 -135
  264. package/src/theme/index.css +28 -28
  265. package/src/theme/muiTheme.ts +597 -597
  266. package/src/theme/theme.d.ts +77 -77
  267. package/src/utils/adminAxios.ts +15 -15
  268. package/src/utils/alphabet.ts +23 -23
  269. package/src/utils/arrayPadEnd.ts +3 -3
  270. package/src/utils/buffertoCSV.ts +11 -11
  271. package/src/utils/formatCurrency.ts +9 -9
  272. package/src/utils/getUrlParams.ts +5 -5
  273. package/src/utils/index.ts +8 -8
  274. package/src/utils/logout.ts +25 -25
  275. package/src/utils/ordinalSuffixOf.ts +14 -14
  276. package/src/utils/romanize.ts +40 -40
  277. package/src/utils/withRouteWrapper.tsx +25 -25
  278. package/src/utils/withSuspense.tsx +6 -6
  279. package/styled-components.tsx +60 -60
  280. package/tsconfig.json +21 -21
@@ -1,147 +1,147 @@
1
- import { yupResolver } from '@hookform/resolvers/yup'
2
- import { Alert, Box, ButtonProps, Typography } from '@mui/material'
3
- import { AxiosResponse } from 'axios'
4
- import { ReactNode, useState } from 'react'
5
- import { useForm } from 'react-hook-form'
6
- import { useMutation, useQueryClient } from 'react-query'
7
- import { axiosErrorToast } from '../../config/axios'
8
- import ActionButton from '../ActionButton'
9
- import RenderForm, { generateYupSchema, RenderFormProps } from './RenderForm'
10
-
11
- interface FormProps extends Omit<RenderFormProps, 'control'> {
12
- buttonProps?: ButtonProps
13
- submitBtn?: { label?: ReactNode }
14
- cancelBtn?: { label?: ReactNode; hide: boolean }
15
- defaultValues?: any
16
- refetchKey?: string
17
- previousData?: any
18
- onCancel?: () => void
19
- postFunction: (body: any) => Promise<AxiosResponse>
20
- onPostSuccess?: (response: any) => void
21
- onPostError?: (error: any) => void
22
- onFormError?: (error: any) => void
23
- }
24
-
25
- export default function Form({
26
- submitBtn = { label: 'Submit' },
27
- cancelBtn = { label: 'Cancel', hide: false },
28
- buttonProps,
29
- defaultValues,
30
- cols,
31
- fields,
32
- dropdowns,
33
- refetchKey,
34
- onCancel,
35
- previousData,
36
- postFunction,
37
- onPostSuccess,
38
- onPostError,
39
- gap,
40
- onFormError,
41
- }: FormProps) {
42
- const queryClient = useQueryClient()
43
- const [error, setError] = useState<any>(null)
44
- const { control, watch, handleSubmit } = useForm({
45
- defaultValues: previousData ? previousData : null,
46
- resolver: yupResolver(
47
- generateYupSchema({
48
- fieldGroups: fields as any,
49
- }),
50
- ),
51
- })
52
-
53
- const { mutate, isLoading: posting } = useMutation(postFunction, {
54
- onSuccess(data) {
55
- queryClient.invalidateQueries(refetchKey)
56
- onPostSuccess && onPostSuccess(data)
57
- },
58
- onError(error: any) {
59
- onPostError ? onPostError(error) : axiosErrorToast(error)
60
- },
61
- })
62
-
63
- const onError = (error) => {
64
- const errorArray = Object.values(error)?.map((item: any) => item?.message)
65
- setError(errorArray)
66
- onFormError && onFormError(error)
67
- }
68
-
69
- return (
70
- <form
71
- onSubmit={handleSubmit((originalFormData) => {
72
- mutate(originalFormData)
73
- }, onError)}
74
- >
75
- <RenderForm
76
- cols={cols}
77
- gap={gap}
78
- fields={fields}
79
- control={control}
80
- dropdowns={dropdowns}
81
- />
82
-
83
- <FormErrorDisplay message={error} />
84
- <Box
85
- sx={{
86
- display: 'flex',
87
- gap: '20px',
88
- marginTop: `20px`,
89
- justifyContent: 'center',
90
- }}
91
- >
92
- <ActionButton
93
- loading={posting}
94
- disabled={posting}
95
- type="submit"
96
- {...buttonProps}
97
- >
98
- {submitBtn?.label}
99
- </ActionButton>
100
- {!cancelBtn?.hide && (
101
- <ActionButton
102
- fullWidth
103
- variant="outlined"
104
- onClick={() => {
105
- onCancel ? onCancel() : null
106
- }}
107
- {...buttonProps}
108
- >
109
- {cancelBtn?.label}
110
- </ActionButton>
111
- )}
112
- </Box>
113
- </form>
114
- )
115
- }
116
-
117
- const FormErrorDisplay = ({ message }: { message: string | string[] }) => {
118
- if (!message) return null
119
-
120
- if (typeof message === 'string')
121
- return (
122
- <Alert severity="error" sx={{ marginTop: '1rem' }}>
123
- {message}
124
- </Alert>
125
- )
126
-
127
- return (
128
- <Alert
129
- severity="error"
130
- sx={{
131
- marginTop: '1rem',
132
- '& .MuiAlert-icon': {
133
- display: 'flex',
134
- alignItems: 'center',
135
- },
136
- }}
137
- >
138
- <Box>
139
- {message?.map((item, index) => (
140
- <Typography color="error" variant="body1" key={index}>
141
- {item}
142
- </Typography>
143
- ))}
144
- </Box>
145
- </Alert>
146
- )
147
- }
1
+ import { yupResolver } from '@hookform/resolvers/yup'
2
+ import { Alert, Box, ButtonProps, Typography } from '@mui/material'
3
+ import { AxiosResponse } from 'axios'
4
+ import { ReactNode, useState } from 'react'
5
+ import { useForm } from 'react-hook-form'
6
+ import { useMutation, useQueryClient } from 'react-query'
7
+ import { axiosErrorToast } from '../../config/axios'
8
+ import ActionButton from '../ActionButton'
9
+ import RenderForm, { generateYupSchema, RenderFormProps } from './RenderForm'
10
+
11
+ interface FormProps extends Omit<RenderFormProps, 'control'> {
12
+ buttonProps?: ButtonProps
13
+ submitBtn?: { label?: ReactNode }
14
+ cancelBtn?: { label?: ReactNode; hide: boolean }
15
+ defaultValues?: any
16
+ refetchKey?: string
17
+ previousData?: any
18
+ onCancel?: () => void
19
+ postFunction: (body: any) => Promise<AxiosResponse>
20
+ onPostSuccess?: (response: any) => void
21
+ onPostError?: (error: any) => void
22
+ onFormError?: (error: any) => void
23
+ }
24
+
25
+ export default function Form({
26
+ submitBtn = { label: 'Submit' },
27
+ cancelBtn = { label: 'Cancel', hide: false },
28
+ buttonProps,
29
+ defaultValues,
30
+ cols,
31
+ fields,
32
+ dropdowns,
33
+ refetchKey,
34
+ onCancel,
35
+ previousData,
36
+ postFunction,
37
+ onPostSuccess,
38
+ onPostError,
39
+ gap,
40
+ onFormError,
41
+ }: FormProps) {
42
+ const queryClient = useQueryClient()
43
+ const [error, setError] = useState<any>(null)
44
+ const { control, watch, handleSubmit } = useForm({
45
+ defaultValues: previousData ? previousData : null,
46
+ resolver: yupResolver(
47
+ generateYupSchema({
48
+ fieldGroups: fields as any,
49
+ }),
50
+ ),
51
+ })
52
+
53
+ const { mutate, isLoading: posting } = useMutation(postFunction, {
54
+ onSuccess(data) {
55
+ queryClient.invalidateQueries(refetchKey)
56
+ onPostSuccess && onPostSuccess(data)
57
+ },
58
+ onError(error: any) {
59
+ onPostError ? onPostError(error) : axiosErrorToast(error)
60
+ },
61
+ })
62
+
63
+ const onError = (error) => {
64
+ const errorArray = Object.values(error)?.map((item: any) => item?.message)
65
+ setError(errorArray)
66
+ onFormError && onFormError(error)
67
+ }
68
+
69
+ return (
70
+ <form
71
+ onSubmit={handleSubmit((originalFormData) => {
72
+ mutate(originalFormData)
73
+ }, onError)}
74
+ >
75
+ <RenderForm
76
+ cols={cols}
77
+ gap={gap}
78
+ fields={fields}
79
+ control={control}
80
+ dropdowns={dropdowns}
81
+ />
82
+
83
+ <FormErrorDisplay message={error} />
84
+ <Box
85
+ sx={{
86
+ display: 'flex',
87
+ gap: '20px',
88
+ marginTop: `20px`,
89
+ justifyContent: 'center',
90
+ }}
91
+ >
92
+ <ActionButton
93
+ loading={posting}
94
+ disabled={posting}
95
+ type="submit"
96
+ {...buttonProps}
97
+ >
98
+ {submitBtn?.label}
99
+ </ActionButton>
100
+ {!cancelBtn?.hide && (
101
+ <ActionButton
102
+ fullWidth
103
+ variant="outlined"
104
+ onClick={() => {
105
+ onCancel ? onCancel() : null
106
+ }}
107
+ {...buttonProps}
108
+ >
109
+ {cancelBtn?.label}
110
+ </ActionButton>
111
+ )}
112
+ </Box>
113
+ </form>
114
+ )
115
+ }
116
+
117
+ const FormErrorDisplay = ({ message }: { message: string | string[] }) => {
118
+ if (!message) return null
119
+
120
+ if (typeof message === 'string')
121
+ return (
122
+ <Alert severity="error" sx={{ marginTop: '1rem' }}>
123
+ {message}
124
+ </Alert>
125
+ )
126
+
127
+ return (
128
+ <Alert
129
+ severity="error"
130
+ sx={{
131
+ marginTop: '1rem',
132
+ '& .MuiAlert-icon': {
133
+ display: 'flex',
134
+ alignItems: 'center',
135
+ },
136
+ }}
137
+ >
138
+ <Box>
139
+ {message?.map((item, index) => (
140
+ <Typography color="error" variant="body1" key={index}>
141
+ {item}
142
+ </Typography>
143
+ ))}
144
+ </Box>
145
+ </Alert>
146
+ )
147
+ }
@@ -1,189 +1,189 @@
1
- import { Box, Typography } from '@mui/material'
2
- import { ReactNode } from 'react'
3
- import * as yup from 'yup'
4
- import { Control } from 'react-hook-form'
5
- import {
6
- FormDatePicker,
7
- FormRadioGroup,
8
- FormSingleSelect,
9
- FormTextField,
10
- } from '../HookForm'
11
-
12
- export const generateYupSchema = (options: {
13
- fieldGroups: any[][]
14
- fieldArrayGroups?: any[]
15
- extraValidations?: any
16
- }) => {
17
- const flatArray = options.fieldGroups.flat()
18
-
19
- const validations = flatArray
20
- ?.filter(
21
- (item) => item?.required !== undefined || item?.validation !== undefined,
22
- )
23
- ?.reduce((acc, curr) => {
24
- return {
25
- [curr.name]:
26
- curr?.validation ??
27
- yup.string().required(`${curr?.label} is required`),
28
- ...acc,
29
- }
30
- }, {})
31
-
32
- return yup.object().shape({ ...validations, ...options.extraValidations })
33
- }
34
-
35
- type FormTypes =
36
- | 'FormTextField'
37
- | 'Display'
38
- | 'FormSingleSelect'
39
- | 'FormRadioGroup'
40
- | 'FormDatePicker'
41
-
42
- export interface Field {
43
- render: FormTypes
44
- name: string
45
- label?: string
46
- required?: boolean
47
- elementProps?: any
48
- disabled?: boolean
49
- valiation?: any
50
- }
51
-
52
- export interface RenderFormProps {
53
- fields: Field[]
54
- dropdowns?: { [x: string]: { label: string | ReactNode; value: any }[] }
55
- control: Control<any, any>
56
- cols: number
57
- data?: any
58
- fieldArrayOptions?: { index: number; name: string }
59
- gap?: string | number
60
- }
61
-
62
- const RenderForm = ({
63
- fields,
64
- dropdowns,
65
- control,
66
- cols,
67
- data = null,
68
- fieldArrayOptions,
69
- gap = '1rem',
70
- }: RenderFormProps) => {
71
- return (
72
- <>
73
- <Box
74
- sx={{
75
- display: 'grid',
76
- gridTemplateColumns: `repeat(${cols}, 1fr)`,
77
- gap,
78
- width: '100%',
79
- }}
80
- >
81
- {fields?.map((item) => {
82
- return renderFormField({
83
- field: item,
84
- control,
85
- dropdown: dropdowns ? dropdowns[item?.name] : null,
86
- elementProps: item?.elementProps,
87
- value: data ? data[item?.name] : null,
88
- fieldArrayOptions,
89
- })
90
- })}
91
- </Box>
92
- </>
93
- )
94
- }
95
- export default RenderForm
96
-
97
- const renderFormField = ({
98
- field,
99
- control,
100
- dropdown,
101
- elementProps,
102
- value,
103
- fieldArrayOptions,
104
- }) => {
105
- const name = fieldArrayOptions?.name
106
- ? `${fieldArrayOptions?.name}.${fieldArrayOptions?.index}.${field?.name}`
107
- : field?.name
108
-
109
- switch (field.render) {
110
- case 'FormTextField':
111
- return (
112
- <FormTextField
113
- control={control}
114
- name={name}
115
- label={field?.label}
116
- required={field?.required}
117
- disabled={field?.disabled}
118
- {...elementProps}
119
- />
120
- )
121
-
122
- case 'FormSingleSelect':
123
- return (
124
- <FormSingleSelect
125
- options={dropdown}
126
- control={control}
127
- name={name}
128
- label={field?.label}
129
- required={field?.required}
130
- disabled={field?.disabled}
131
- {...elementProps}
132
- />
133
- )
134
- case 'FormDatePicker':
135
- return (
136
- <FormDatePicker
137
- size="medium"
138
- control={control}
139
- name={name}
140
- label={field?.label}
141
- required={field?.required}
142
- disabled={field?.disabled}
143
- {...elementProps}
144
- />
145
- )
146
- case 'FormRadioGroup':
147
- return (
148
- <FormRadioGroup
149
- row={true}
150
- options={dropdown}
151
- control={control}
152
- name={name}
153
- label={field?.label}
154
- required={field?.required}
155
- disabled={field?.disabled}
156
- {...elementProps}
157
- />
158
- )
159
- case 'Display':
160
- return <FormDisplay label={field?.label} value={value} />
161
-
162
- case 'NestedForm':
163
- return <NestedForm label={field?.label} nestedFields={[]} />
164
-
165
- default:
166
- return <>{field?.label}</>
167
- }
168
- }
169
-
170
- const FormDisplay = ({ label, value }) => {
171
- return (
172
- <Box>
173
- <Typography variant="subtitle2">{label}</Typography>
174
- <Typography variant="body1" marginTop={'5px'}>
175
- {value ?? '-'}
176
- </Typography>
177
- </Box>
178
- )
179
- }
180
-
181
- const NestedForm = ({
182
- nestedFields,
183
- label,
184
- }: {
185
- label: ReactNode
186
- nestedFields: Field[]
187
- }) => {
188
- return <></>
189
- }
1
+ import { Box, Typography } from '@mui/material'
2
+ import { ReactNode } from 'react'
3
+ import * as yup from 'yup'
4
+ import { Control } from 'react-hook-form'
5
+ import {
6
+ FormDatePicker,
7
+ FormRadioGroup,
8
+ FormSingleSelect,
9
+ FormTextField,
10
+ } from '../HookForm'
11
+
12
+ export const generateYupSchema = (options: {
13
+ fieldGroups: any[][]
14
+ fieldArrayGroups?: any[]
15
+ extraValidations?: any
16
+ }) => {
17
+ const flatArray = options.fieldGroups.flat()
18
+
19
+ const validations = flatArray
20
+ ?.filter(
21
+ (item) => item?.required !== undefined || item?.validation !== undefined,
22
+ )
23
+ ?.reduce((acc, curr) => {
24
+ return {
25
+ [curr.name]:
26
+ curr?.validation ??
27
+ yup.string().required(`${curr?.label} is required`),
28
+ ...acc,
29
+ }
30
+ }, {})
31
+
32
+ return yup.object().shape({ ...validations, ...options.extraValidations })
33
+ }
34
+
35
+ type FormTypes =
36
+ | 'FormTextField'
37
+ | 'Display'
38
+ | 'FormSingleSelect'
39
+ | 'FormRadioGroup'
40
+ | 'FormDatePicker'
41
+
42
+ export interface Field {
43
+ render: FormTypes
44
+ name: string
45
+ label?: string
46
+ required?: boolean
47
+ elementProps?: any
48
+ disabled?: boolean
49
+ valiation?: any
50
+ }
51
+
52
+ export interface RenderFormProps {
53
+ fields: Field[]
54
+ dropdowns?: { [x: string]: { label: string | ReactNode; value: any }[] }
55
+ control: Control<any, any>
56
+ cols: number
57
+ data?: any
58
+ fieldArrayOptions?: { index: number; name: string }
59
+ gap?: string | number
60
+ }
61
+
62
+ const RenderForm = ({
63
+ fields,
64
+ dropdowns,
65
+ control,
66
+ cols,
67
+ data = null,
68
+ fieldArrayOptions,
69
+ gap = '1rem',
70
+ }: RenderFormProps) => {
71
+ return (
72
+ <>
73
+ <Box
74
+ sx={{
75
+ display: 'grid',
76
+ gridTemplateColumns: `repeat(${cols}, 1fr)`,
77
+ gap,
78
+ width: '100%',
79
+ }}
80
+ >
81
+ {fields?.map((item) => {
82
+ return renderFormField({
83
+ field: item,
84
+ control,
85
+ dropdown: dropdowns ? dropdowns[item?.name] : null,
86
+ elementProps: item?.elementProps,
87
+ value: data ? data[item?.name] : null,
88
+ fieldArrayOptions,
89
+ })
90
+ })}
91
+ </Box>
92
+ </>
93
+ )
94
+ }
95
+ export default RenderForm
96
+
97
+ const renderFormField = ({
98
+ field,
99
+ control,
100
+ dropdown,
101
+ elementProps,
102
+ value,
103
+ fieldArrayOptions,
104
+ }) => {
105
+ const name = fieldArrayOptions?.name
106
+ ? `${fieldArrayOptions?.name}.${fieldArrayOptions?.index}.${field?.name}`
107
+ : field?.name
108
+
109
+ switch (field.render) {
110
+ case 'FormTextField':
111
+ return (
112
+ <FormTextField
113
+ control={control}
114
+ name={name}
115
+ label={field?.label}
116
+ required={field?.required}
117
+ disabled={field?.disabled}
118
+ {...elementProps}
119
+ />
120
+ )
121
+
122
+ case 'FormSingleSelect':
123
+ return (
124
+ <FormSingleSelect
125
+ options={dropdown}
126
+ control={control}
127
+ name={name}
128
+ label={field?.label}
129
+ required={field?.required}
130
+ disabled={field?.disabled}
131
+ {...elementProps}
132
+ />
133
+ )
134
+ case 'FormDatePicker':
135
+ return (
136
+ <FormDatePicker
137
+ size="medium"
138
+ control={control}
139
+ name={name}
140
+ label={field?.label}
141
+ required={field?.required}
142
+ disabled={field?.disabled}
143
+ {...elementProps}
144
+ />
145
+ )
146
+ case 'FormRadioGroup':
147
+ return (
148
+ <FormRadioGroup
149
+ row={true}
150
+ options={dropdown}
151
+ control={control}
152
+ name={name}
153
+ label={field?.label}
154
+ required={field?.required}
155
+ disabled={field?.disabled}
156
+ {...elementProps}
157
+ />
158
+ )
159
+ case 'Display':
160
+ return <FormDisplay label={field?.label} value={value} />
161
+
162
+ case 'NestedForm':
163
+ return <NestedForm label={field?.label} nestedFields={[]} />
164
+
165
+ default:
166
+ return <>{field?.label}</>
167
+ }
168
+ }
169
+
170
+ const FormDisplay = ({ label, value }) => {
171
+ return (
172
+ <Box>
173
+ <Typography variant="subtitle2">{label}</Typography>
174
+ <Typography variant="body1" marginTop={'5px'}>
175
+ {value ?? '-'}
176
+ </Typography>
177
+ </Box>
178
+ )
179
+ }
180
+
181
+ const NestedForm = ({
182
+ nestedFields,
183
+ label,
184
+ }: {
185
+ label: ReactNode
186
+ nestedFields: Field[]
187
+ }) => {
188
+ return <></>
189
+ }