@campxdev/shared 1.4.9 → 1.4.11

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 (213) 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 +2 -2
  5. package/src/assets/fonts/poppins/index.ts +7 -7
  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/DropDownButton.tsx +177 -177
  24. package/src/components/DropDownButton/index.tsx +1 -1
  25. package/src/components/DropDownButton/styles.tsx +56 -56
  26. package/src/components/ErrorBoundary/ErrorBoundary.tsx +28 -28
  27. package/src/components/ErrorBoundary/ErrorFallback.tsx +236 -236
  28. package/src/components/ErrorBoundary/GlobalNetworkLoadingIndicator.tsx +13 -13
  29. package/src/components/ErrorBoundary/index.tsx +1 -1
  30. package/src/components/ErrorBox.tsx +42 -42
  31. package/src/components/FloatingContainer.tsx +33 -33
  32. package/src/components/Form/Form.tsx +156 -156
  33. package/src/components/Form/RenderForm.tsx +188 -188
  34. package/src/components/FullCalendar/Actions.tsx +162 -162
  35. package/src/components/FullCalendar/FullCalendarWrapper.tsx +54 -54
  36. package/src/components/FullScreenLoader.tsx +19 -19
  37. package/src/components/HookForm/AutoCompleteSearch.tsx +113 -113
  38. package/src/components/HookForm/DatePicker.tsx +40 -40
  39. package/src/components/HookForm/DateTimePicker.tsx +47 -47
  40. package/src/components/HookForm/FormLabel.tsx +14 -14
  41. package/src/components/HookForm/MultiCheckbox.tsx +69 -69
  42. package/src/components/HookForm/MultiSelect.tsx +50 -50
  43. package/src/components/HookForm/RadioGroup.tsx +45 -45
  44. package/src/components/HookForm/SingleCheckbox.tsx +34 -34
  45. package/src/components/HookForm/SingleSelect.tsx +46 -46
  46. package/src/components/HookForm/TextField.tsx +40 -40
  47. package/src/components/HookForm/TimePicker.tsx +40 -40
  48. package/src/components/HookForm/index.ts +23 -23
  49. package/src/components/IconButtons/IconButtons.tsx +137 -137
  50. package/src/components/IconButtons/Icons.tsx +268 -268
  51. package/src/components/IconButtons/assets/edit.svg +4 -4
  52. package/src/components/IconButtons/assets/eye.svg +6 -6
  53. package/src/components/IconButtons/assets/trash.svg +7 -7
  54. package/src/components/IconButtons/index.tsx +8 -8
  55. package/src/components/IconLabel.tsx +37 -37
  56. package/src/components/Image/Image.tsx +43 -43
  57. package/src/components/Image/index.tsx +1 -1
  58. package/src/components/ImageUpload.tsx +98 -98
  59. package/src/components/Input/AsyncSearchSelect/AsyncSearchSelect.tsx +216 -216
  60. package/src/components/Input/AsyncSearchSelect/index.tsx +1 -1
  61. package/src/components/Input/AsyncSearchSelect/styles.tsx +105 -105
  62. package/src/components/Input/AutoCompleteSearch.tsx +121 -121
  63. package/src/components/Input/DatePicker.tsx +69 -69
  64. package/src/components/Input/DateRangePicker.tsx +131 -131
  65. package/src/components/Input/DateTimePicker.tsx +75 -75
  66. package/src/components/Input/FormLabel.tsx +21 -21
  67. package/src/components/Input/MultiCheckbox.tsx +64 -64
  68. package/src/components/Input/MultiSelect.tsx +148 -148
  69. package/src/components/Input/RadioGroup.tsx +104 -104
  70. package/src/components/Input/SingleCheckbox.tsx +78 -78
  71. package/src/components/Input/SingleSelect.tsx +104 -104
  72. package/src/components/Input/TextField.tsx +46 -46
  73. package/src/components/Input/TimePicker.tsx +70 -70
  74. package/src/components/Input/index.ts +26 -26
  75. package/src/components/Input/types.ts +3 -3
  76. package/src/components/JsonPreview.tsx +7 -7
  77. package/src/components/LabelValue.tsx +21 -21
  78. package/src/components/Layout/ChangePassword.tsx +49 -49
  79. package/src/components/Layout/Header/AppHeader.tsx +102 -102
  80. package/src/components/Layout/Header/AppsMenu.tsx +98 -98
  81. package/src/components/Layout/Header/CogWheelMenu.tsx +33 -33
  82. package/src/components/Layout/Header/Notification.tsx +13 -13
  83. package/src/components/Layout/Header/UserBox.tsx +81 -81
  84. package/src/components/Layout/Header/applications.ts +91 -91
  85. package/src/components/Layout/Header/assets/campx_square_small.svg +9 -9
  86. package/src/components/Layout/Header/assets/commutex.svg +14 -14
  87. package/src/components/Layout/Header/assets/commutexSmall.svg +11 -11
  88. package/src/components/Layout/Header/assets/enroll.svg +14 -14
  89. package/src/components/Layout/Header/assets/enrollx.svg +14 -14
  90. package/src/components/Layout/Header/assets/exams_small.svg +12 -12
  91. package/src/components/Layout/Header/assets/examsx.svg +14 -14
  92. package/src/components/Layout/Header/assets/hostel_small.svg +13 -13
  93. package/src/components/Layout/Header/assets/hostelx.svg +13 -13
  94. package/src/components/Layout/Header/assets/index.ts +33 -33
  95. package/src/components/Layout/Header/assets/libraryx.svg +12 -12
  96. package/src/components/Layout/Header/assets/pay_small.svg +16 -16
  97. package/src/components/Layout/Header/assets/payx.svg +19 -19
  98. package/src/components/Layout/Header/assets/people_small.svg +9 -9
  99. package/src/components/Layout/Header/assets/peoplex.svg +12 -12
  100. package/src/components/Layout/Header/assets/squarex.svg +12 -12
  101. package/src/components/Layout/Header/icons.tsx +57 -57
  102. package/src/components/Layout/Header/index.tsx +1 -1
  103. package/src/components/Layout/Header/styles.tsx +124 -124
  104. package/src/components/Layout/{Header → Tickets}/HelpWidget/HelpWidget.tsx +273 -273
  105. package/src/components/Layout/{Header → Tickets}/HelpWidget/styles.tsx +94 -94
  106. package/src/components/Layout/Tickets/MyTickets.tsx +72 -72
  107. package/src/components/Layout/Tickets/TicketDetails.tsx +65 -65
  108. package/src/components/Layout/Tickets/TimeLine.tsx +64 -64
  109. package/src/components/Layout/Tickets/index.tsx +1 -1
  110. package/src/components/Layout/Tickets/services.ts +11 -11
  111. package/src/components/Layout/Tickets/styles.tsx +136 -136
  112. package/src/components/LayoutWrapper.tsx +25 -25
  113. package/src/components/LinearProgress.tsx +19 -19
  114. package/src/components/ListItemButton.tsx +95 -95
  115. package/src/components/LoginForm.tsx +80 -80
  116. package/src/components/MediaRow/MediaRow.tsx +69 -69
  117. package/src/components/MediaRow/index.tsx +1 -1
  118. package/src/components/ModalButtons/DialogButton.tsx +93 -93
  119. package/src/components/ModalButtons/DrawerButton.tsx +85 -85
  120. package/src/components/ModalButtons/index.tsx +4 -4
  121. package/src/components/NoDataIllustration.tsx +32 -32
  122. package/src/components/PageContent.tsx +17 -17
  123. package/src/components/PageHeader.tsx +55 -55
  124. package/src/components/PageNotFound.tsx +26 -26
  125. package/src/components/PopupConfirm/ConfirmContextProvider.tsx +40 -40
  126. package/src/components/PopupConfirm/PopupConfirm.tsx +34 -34
  127. package/src/components/PopupConfirm/index.tsx +1 -1
  128. package/src/components/PopupConfirm/useConfirm.ts +47 -47
  129. package/src/components/Row.tsx +24 -24
  130. package/src/components/SearchBar.tsx +60 -60
  131. package/src/components/SideMenuHeader.tsx +29 -29
  132. package/src/components/SideNav.tsx +168 -168
  133. package/src/components/Spinner.tsx +18 -18
  134. package/src/components/StepsHeader/StepsHeader.tsx +115 -115
  135. package/src/components/StepsHeader/index.tsx +1 -1
  136. package/src/components/StyledTableContainer.tsx +33 -33
  137. package/src/components/SwitchButton.tsx +41 -41
  138. package/src/components/Table.tsx +42 -42
  139. package/src/components/TableComponent/BatchActionsHeader.tsx +58 -58
  140. package/src/components/TableComponent/Icons/index.tsx +50 -50
  141. package/src/components/TableComponent/ReactTable.tsx +293 -293
  142. package/src/components/TableComponent/RenderTableBody.tsx +66 -66
  143. package/src/components/TableComponent/Table.tsx +200 -200
  144. package/src/components/TableComponent/TableFooter/TableFooter.tsx +104 -104
  145. package/src/components/TableComponent/TableFooter/index.tsx +1 -1
  146. package/src/components/TableComponent/TableFooter/styles.tsx +28 -28
  147. package/src/components/TableComponent/index.tsx +1 -1
  148. package/src/components/TableComponent/react-table-config.d.ts +128 -128
  149. package/src/components/TableComponent/styles.tsx +170 -170
  150. package/src/components/TableComponent/types.ts +57 -57
  151. package/src/components/Tabs/Tabs.tsx +52 -52
  152. package/src/components/Tabs/TabsContainer.tsx +50 -50
  153. package/src/components/Tabs/index.tsx +1 -1
  154. package/src/components/Tabs/styles.tsx +55 -55
  155. package/src/components/ToastContainer/ToastContainer.tsx +42 -42
  156. package/src/components/ToastContainer/index.tsx +1 -1
  157. package/src/components/UploadButton/UploadButton.tsx +126 -126
  158. package/src/components/UploadButton/index.tsx +1 -1
  159. package/src/components/UploadButton/types.ts +19 -19
  160. package/src/components/UploadDocument.tsx +108 -108
  161. package/src/components/UploadFileDialog/UploadFileDialog.tsx +238 -238
  162. package/src/components/UploadFileDialog/index.tsx +1 -1
  163. package/src/components/index.ts +87 -84
  164. package/src/config/axios.ts +73 -73
  165. package/src/config/axiosEvaluator.ts +53 -53
  166. package/src/config/axiosXTenant.ts +57 -57
  167. package/src/constants/UIConstants.ts +97 -97
  168. package/src/constants/formValidations.ts +6 -6
  169. package/src/constants/index.ts +5 -5
  170. package/src/constants/isDevelopment.ts +3 -3
  171. package/src/constants/permissions.ts +67 -67
  172. package/src/constants/validateMessages.ts +12 -12
  173. package/src/contexts/LoginFormProvider.tsx +39 -39
  174. package/src/contexts/Providers.tsx +71 -71
  175. package/src/contexts/PublicProviders.tsx +30 -30
  176. package/src/contexts/QueryClientProvider.tsx +22 -22
  177. package/src/hooks/index.ts +3 -3
  178. package/src/hooks/useAuth.ts +96 -96
  179. package/src/hooks/useFetch.ts +53 -53
  180. package/src/hooks/useRouter.ts +31 -31
  181. package/src/layouts/Components/DashBoardMenu.tsx +232 -232
  182. package/src/layouts/Components/icons/index.tsx +403 -403
  183. package/src/layouts/Components/styles.tsx +60 -60
  184. package/src/layouts/ComponentsLayout.tsx +3 -3
  185. package/src/permissions/PageWithPermission.tsx +18 -18
  186. package/src/permissions/PermissionDeniedPage.tsx +16 -16
  187. package/src/permissions/ValidateAccess.tsx +18 -18
  188. package/src/permissions/index.ts +2 -2
  189. package/src/react-app-env.d.ts +1 -1
  190. package/src/shared-state/AssetsStore.ts +15 -15
  191. package/src/shared-state/PermissionsStore.ts +352 -352
  192. package/src/shared-state/UserStore.ts +13 -13
  193. package/src/shared-state/index.ts +4 -4
  194. package/src/theme/App.less +3 -3
  195. package/src/theme/MuiThemeProvider.tsx +13 -13
  196. package/src/theme/customCssBaseline.ts +78 -78
  197. package/src/theme/index.css +75 -75
  198. package/src/theme/muiTheme.ts +560 -560
  199. package/src/theme/theme.d.ts +75 -75
  200. package/src/utils/alphabet.ts +23 -23
  201. package/src/utils/arrayPadEnd.ts +3 -3
  202. package/src/utils/formatCurrency.ts +9 -9
  203. package/src/utils/getUrlParams.ts +5 -5
  204. package/src/utils/index.ts +8 -8
  205. package/src/utils/logout.ts +24 -24
  206. package/src/utils/ordinalSuffixOf.ts +14 -14
  207. package/src/utils/romanize.ts +40 -40
  208. package/src/utils/withLocalization.tsx +11 -11
  209. package/src/utils/withRouteWrapper.tsx +25 -25
  210. package/src/utils/withSuspense.tsx +6 -6
  211. package/styled-components.tsx +60 -60
  212. package/tsconfig.json +21 -21
  213. package/src/components/Layout/Header/assets/commuteX.png +0 -0
@@ -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
+ }
@@ -1,188 +1,188 @@
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 = (
13
- normalFieldGroups: any[][],
14
- fieldArrayGroups?: any[],
15
- ) => {
16
- const flatArray = normalFieldGroups.flat()
17
-
18
- const validations = flatArray
19
- ?.filter(
20
- (item) => item?.required !== undefined || item?.validation !== undefined,
21
- )
22
- ?.reduce((acc, curr) => {
23
- return {
24
- [curr.name]:
25
- curr?.validation ??
26
- yup.string().required(`${curr?.label} is required`),
27
- ...acc,
28
- }
29
- }, {})
30
-
31
- return yup.object().shape(validations)
32
- }
33
-
34
- type FormTypes =
35
- | 'FormTextField'
36
- | 'Display'
37
- | 'FormSingleSelect'
38
- | 'FormRadioGroup'
39
- | 'FormDatePicker'
40
-
41
- export interface Field {
42
- render: FormTypes
43
- name: string
44
- label?: string
45
- required?: boolean
46
- elementProps?: any
47
- disabled?: boolean
48
- valiation?: any
49
- }
50
-
51
- export interface RenderFormProps {
52
- fields: Field[]
53
- dropdowns?: { [x: string]: { label: string | ReactNode; value: any }[] }
54
- control: Control<any, any>
55
- cols: number
56
- data?: any
57
- fieldArrayOptions?: { index: number; name: string }
58
- gap?: string | number
59
- }
60
-
61
- const RenderForm = ({
62
- fields,
63
- dropdowns,
64
- control,
65
- cols,
66
- data = null,
67
- fieldArrayOptions,
68
- gap = '1rem',
69
- }: RenderFormProps) => {
70
- return (
71
- <>
72
- <Box
73
- sx={{
74
- display: 'grid',
75
- gridTemplateColumns: `repeat(${cols}, 1fr)`,
76
- gap,
77
- width: '100%',
78
- }}
79
- >
80
- {fields?.map((item) => {
81
- return renderFormField({
82
- field: item,
83
- control,
84
- dropdown: dropdowns ? dropdowns[item?.name] : null,
85
- elementProps: item?.elementProps,
86
- value: data ? data[item?.name] : null,
87
- fieldArrayOptions,
88
- })
89
- })}
90
- </Box>
91
- </>
92
- )
93
- }
94
- export default RenderForm
95
-
96
- const renderFormField = ({
97
- field,
98
- control,
99
- dropdown,
100
- elementProps,
101
- value,
102
- fieldArrayOptions,
103
- }) => {
104
- const name = fieldArrayOptions?.name
105
- ? `${fieldArrayOptions?.name}.${fieldArrayOptions?.index}.${field?.name}`
106
- : field?.name
107
-
108
- switch (field.render) {
109
- case 'FormTextField':
110
- return (
111
- <FormTextField
112
- control={control}
113
- name={name}
114
- label={field?.label}
115
- required={field?.required}
116
- disabled={field?.disabled}
117
- {...elementProps}
118
- />
119
- )
120
-
121
- case 'FormSingleSelect':
122
- return (
123
- <FormSingleSelect
124
- options={dropdown}
125
- control={control}
126
- name={name}
127
- label={field?.label}
128
- required={field?.required}
129
- disabled={field?.disabled}
130
- {...elementProps}
131
- />
132
- )
133
- case 'FormDatePicker':
134
- return (
135
- <FormDatePicker
136
- size="medium"
137
- control={control}
138
- name={name}
139
- label={field?.label}
140
- required={field?.required}
141
- disabled={field?.disabled}
142
- {...elementProps}
143
- />
144
- )
145
- case 'FormRadioGroup':
146
- return (
147
- <FormRadioGroup
148
- row={true}
149
- options={dropdown}
150
- control={control}
151
- name={name}
152
- label={field?.label}
153
- required={field?.required}
154
- disabled={field?.disabled}
155
- {...elementProps}
156
- />
157
- )
158
- case 'Display':
159
- return <FormDisplay label={field?.label} value={value} />
160
-
161
- case 'NestedForm':
162
- return <NestedForm label={field?.label} nestedFields={[]} />
163
-
164
- default:
165
- return <>{field?.label}</>
166
- }
167
- }
168
-
169
- const FormDisplay = ({ label, value }) => {
170
- return (
171
- <Box>
172
- <Typography variant="subtitle2">{label}</Typography>
173
- <Typography variant="body1" marginTop={'5px'}>
174
- {value ?? '-'}
175
- </Typography>
176
- </Box>
177
- )
178
- }
179
-
180
- const NestedForm = ({
181
- nestedFields,
182
- label,
183
- }: {
184
- label: ReactNode
185
- nestedFields: Field[]
186
- }) => {
187
- return <></>
188
- }
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 = (
13
+ normalFieldGroups: any[][],
14
+ fieldArrayGroups?: any[],
15
+ ) => {
16
+ const flatArray = normalFieldGroups.flat()
17
+
18
+ const validations = flatArray
19
+ ?.filter(
20
+ (item) => item?.required !== undefined || item?.validation !== undefined,
21
+ )
22
+ ?.reduce((acc, curr) => {
23
+ return {
24
+ [curr.name]:
25
+ curr?.validation ??
26
+ yup.string().required(`${curr?.label} is required`),
27
+ ...acc,
28
+ }
29
+ }, {})
30
+
31
+ return yup.object().shape(validations)
32
+ }
33
+
34
+ type FormTypes =
35
+ | 'FormTextField'
36
+ | 'Display'
37
+ | 'FormSingleSelect'
38
+ | 'FormRadioGroup'
39
+ | 'FormDatePicker'
40
+
41
+ export interface Field {
42
+ render: FormTypes
43
+ name: string
44
+ label?: string
45
+ required?: boolean
46
+ elementProps?: any
47
+ disabled?: boolean
48
+ valiation?: any
49
+ }
50
+
51
+ export interface RenderFormProps {
52
+ fields: Field[]
53
+ dropdowns?: { [x: string]: { label: string | ReactNode; value: any }[] }
54
+ control: Control<any, any>
55
+ cols: number
56
+ data?: any
57
+ fieldArrayOptions?: { index: number; name: string }
58
+ gap?: string | number
59
+ }
60
+
61
+ const RenderForm = ({
62
+ fields,
63
+ dropdowns,
64
+ control,
65
+ cols,
66
+ data = null,
67
+ fieldArrayOptions,
68
+ gap = '1rem',
69
+ }: RenderFormProps) => {
70
+ return (
71
+ <>
72
+ <Box
73
+ sx={{
74
+ display: 'grid',
75
+ gridTemplateColumns: `repeat(${cols}, 1fr)`,
76
+ gap,
77
+ width: '100%',
78
+ }}
79
+ >
80
+ {fields?.map((item) => {
81
+ return renderFormField({
82
+ field: item,
83
+ control,
84
+ dropdown: dropdowns ? dropdowns[item?.name] : null,
85
+ elementProps: item?.elementProps,
86
+ value: data ? data[item?.name] : null,
87
+ fieldArrayOptions,
88
+ })
89
+ })}
90
+ </Box>
91
+ </>
92
+ )
93
+ }
94
+ export default RenderForm
95
+
96
+ const renderFormField = ({
97
+ field,
98
+ control,
99
+ dropdown,
100
+ elementProps,
101
+ value,
102
+ fieldArrayOptions,
103
+ }) => {
104
+ const name = fieldArrayOptions?.name
105
+ ? `${fieldArrayOptions?.name}.${fieldArrayOptions?.index}.${field?.name}`
106
+ : field?.name
107
+
108
+ switch (field.render) {
109
+ case 'FormTextField':
110
+ return (
111
+ <FormTextField
112
+ control={control}
113
+ name={name}
114
+ label={field?.label}
115
+ required={field?.required}
116
+ disabled={field?.disabled}
117
+ {...elementProps}
118
+ />
119
+ )
120
+
121
+ case 'FormSingleSelect':
122
+ return (
123
+ <FormSingleSelect
124
+ options={dropdown}
125
+ control={control}
126
+ name={name}
127
+ label={field?.label}
128
+ required={field?.required}
129
+ disabled={field?.disabled}
130
+ {...elementProps}
131
+ />
132
+ )
133
+ case 'FormDatePicker':
134
+ return (
135
+ <FormDatePicker
136
+ size="medium"
137
+ control={control}
138
+ name={name}
139
+ label={field?.label}
140
+ required={field?.required}
141
+ disabled={field?.disabled}
142
+ {...elementProps}
143
+ />
144
+ )
145
+ case 'FormRadioGroup':
146
+ return (
147
+ <FormRadioGroup
148
+ row={true}
149
+ options={dropdown}
150
+ control={control}
151
+ name={name}
152
+ label={field?.label}
153
+ required={field?.required}
154
+ disabled={field?.disabled}
155
+ {...elementProps}
156
+ />
157
+ )
158
+ case 'Display':
159
+ return <FormDisplay label={field?.label} value={value} />
160
+
161
+ case 'NestedForm':
162
+ return <NestedForm label={field?.label} nestedFields={[]} />
163
+
164
+ default:
165
+ return <>{field?.label}</>
166
+ }
167
+ }
168
+
169
+ const FormDisplay = ({ label, value }) => {
170
+ return (
171
+ <Box>
172
+ <Typography variant="subtitle2">{label}</Typography>
173
+ <Typography variant="body1" marginTop={'5px'}>
174
+ {value ?? '-'}
175
+ </Typography>
176
+ </Box>
177
+ )
178
+ }
179
+
180
+ const NestedForm = ({
181
+ nestedFields,
182
+ label,
183
+ }: {
184
+ label: ReactNode
185
+ nestedFields: Field[]
186
+ }) => {
187
+ return <></>
188
+ }