@campxdev/shared 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (253) hide show
  1. package/.eslintrc.js +34 -0
  2. package/.prettierrc +10 -0
  3. package/.storybook/main.js +16 -0
  4. package/.storybook/preview.js +9 -0
  5. package/antd.customize.less +73 -0
  6. package/exports.ts +20 -0
  7. package/package.json +78 -0
  8. package/public/dean.JPG +0 -0
  9. package/public/download.png +0 -0
  10. package/public/illustrations/bookmark.svg +19 -0
  11. package/public/illustrations/girl-writing.png +0 -0
  12. package/public/illustrations/whiteboard.svg +24 -0
  13. package/public/images/AnimatedUploadFile.gif +0 -0
  14. package/public/images/doc@2x.png +0 -0
  15. package/public/images/greenTick.png +0 -0
  16. package/public/images/jpg.png +0 -0
  17. package/public/images/paperclip@2x.png +0 -0
  18. package/public/images/pdf.png +0 -0
  19. package/public/images/ppt.png +0 -0
  20. package/public/images/profileImage.jpg +0 -0
  21. package/public/images/profileImage.png +0 -0
  22. package/public/index.html +50 -0
  23. package/public/logo.png +0 -0
  24. package/public/logo_campx_full.png +0 -0
  25. package/public/logo_square.svg +21 -0
  26. package/public/omr_sign.jpg +0 -0
  27. package/src/App.tsx +35 -0
  28. package/src/assets/fonts/avenir/Avenir.ttc +0 -0
  29. package/src/assets/fonts/avenir/index.ts +2 -0
  30. package/src/assets/fonts/poppins/Poppins-Bold.ttf +0 -0
  31. package/src/assets/fonts/poppins/Poppins-Italic.ttf +0 -0
  32. package/src/assets/fonts/poppins/Poppins-Light.ttf +0 -0
  33. package/src/assets/fonts/poppins/Poppins-LightItalic.ttf +0 -0
  34. package/src/assets/fonts/poppins/Poppins-Medium.ttf +0 -0
  35. package/src/assets/fonts/poppins/Poppins-MediumItalic.ttf +0 -0
  36. package/src/assets/fonts/poppins/Poppins-Regular.ttf +0 -0
  37. package/src/assets/fonts/poppins/Poppins-SemiBold.ttf +0 -0
  38. package/src/assets/fonts/poppins/Poppins-SemiBoldItalic.ttf +0 -0
  39. package/src/assets/fonts/poppins/index.ts +7 -0
  40. package/src/assets/images/File bundle-bro.svg +122 -0
  41. package/src/assets/images/Filebundle.png +0 -0
  42. package/src/assets/images/NoPart.png +0 -0
  43. package/src/assets/images/ResultProcess.png +0 -0
  44. package/src/assets/images/ResultProcess.svg +99 -0
  45. package/src/assets/images/attachment.svg +1 -0
  46. package/src/assets/images/avatar.png +0 -0
  47. package/src/assets/images/index.ts +19 -0
  48. package/src/assets/images/pdf.png +0 -0
  49. package/src/assets/images/taskAttachment.png +0 -0
  50. package/src/assets/images/welcomeimage.jpg +0 -0
  51. package/src/assets/static_files/External_Marks_Import .xlsx +0 -0
  52. package/src/assets/static_files/Leads_Sample.xlsx +0 -0
  53. package/src/assets/static_files/Subject_Topic_Import_Sheet.xlsx +0 -0
  54. package/src/assets/static_files/admissions_Sample.xlsx +0 -0
  55. package/src/assets/static_files/barcodes_template.xlsx +0 -0
  56. package/src/assets/static_files/hostel_rooms_import.xlsx +0 -0
  57. package/src/assets/static_files/index.ts +24 -0
  58. package/src/assets/static_files/sample_admissions.xlsx +0 -0
  59. package/src/assets/static_files/sample_admissions_report.xlsx +0 -0
  60. package/src/assets/static_files/sample_curriculum_subjects_template.xlsx +0 -0
  61. package/src/assets/static_files/sample_import_students_new.xlsx +0 -0
  62. package/src/assets/static_files/sample_internal_marks.xlsx +0 -0
  63. package/src/assets/static_files/sample_student_subjects_template.xlsx +0 -0
  64. package/src/components/ActionButton.tsx +28 -0
  65. package/src/components/Attachment.tsx +26 -0
  66. package/src/components/AutocompleteSearch/AutocompleteSearch.tsx +57 -0
  67. package/src/components/AutocompleteSearch/index.tsx +1 -0
  68. package/src/components/Breadcrumbs.tsx +73 -0
  69. package/src/components/Card.tsx +97 -0
  70. package/src/components/CardsGrid.tsx +28 -0
  71. package/src/components/Chips.tsx +77 -0
  72. package/src/components/Detail.tsx +15 -0
  73. package/src/components/DetailsGrid.tsx +52 -0
  74. package/src/components/DividerHeading.tsx +40 -0
  75. package/src/components/DrawerWrapper/DialogWrapper.tsx +63 -0
  76. package/src/components/DrawerWrapper/DrawerTemplate.tsx +53 -0
  77. package/src/components/DrawerWrapper/DrawerWrapper.tsx +53 -0
  78. package/src/components/DropDownButton.tsx +184 -0
  79. package/src/components/ErrorBoundary.js +45 -0
  80. package/src/components/ErrorBox.tsx +42 -0
  81. package/src/components/FloatingContainer.tsx +26 -0
  82. package/src/components/FullCalendar/Actions.tsx +162 -0
  83. package/src/components/FullCalendar/FullCalendarWrapper.tsx +54 -0
  84. package/src/components/HookForm/AutoCompleteSearch.tsx +143 -0
  85. package/src/components/HookForm/DatePicker.tsx +65 -0
  86. package/src/components/HookForm/DateTimePicker.tsx +70 -0
  87. package/src/components/HookForm/FormLabel.tsx +14 -0
  88. package/src/components/HookForm/MultiCheckbox.tsx +82 -0
  89. package/src/components/HookForm/MultiSelect.tsx +100 -0
  90. package/src/components/HookForm/RadioGroup.tsx +113 -0
  91. package/src/components/HookForm/SingleCheckbox.tsx +46 -0
  92. package/src/components/HookForm/SingleSelect.tsx +93 -0
  93. package/src/components/HookForm/TextField.tsx +74 -0
  94. package/src/components/HookForm/TimePicker.tsx +82 -0
  95. package/src/components/HookForm/index.ts +23 -0
  96. package/src/components/IconButtons/IconButtons.tsx +137 -0
  97. package/src/components/IconButtons/Icons.tsx +269 -0
  98. package/src/components/IconButtons/assets/edit.svg +4 -0
  99. package/src/components/IconButtons/assets/eye.svg +6 -0
  100. package/src/components/IconButtons/assets/trash.svg +7 -0
  101. package/src/components/IconButtons/index.tsx +8 -0
  102. package/src/components/IconLabel.tsx +37 -0
  103. package/src/components/Image/Image.tsx +43 -0
  104. package/src/components/Image/broken-image.png +0 -0
  105. package/src/components/Image/index.tsx +1 -0
  106. package/src/components/ImageUpload.tsx +98 -0
  107. package/src/components/Input/AutoCompleteSearch.tsx +143 -0
  108. package/src/components/Input/DatePicker.tsx +60 -0
  109. package/src/components/Input/DateRangePicker.tsx +131 -0
  110. package/src/components/Input/DateTimePicker.tsx +70 -0
  111. package/src/components/Input/FormLabel.tsx +14 -0
  112. package/src/components/Input/MultiCheckbox.tsx +79 -0
  113. package/src/components/Input/MultiSelect.tsx +52 -0
  114. package/src/components/Input/RadioGroup.tsx +55 -0
  115. package/src/components/Input/SingleCheckbox.tsx +23 -0
  116. package/src/components/Input/SingleSelect.tsx +139 -0
  117. package/src/components/Input/TextField.tsx +50 -0
  118. package/src/components/Input/TimePicker.tsx +82 -0
  119. package/src/components/Input/index.ts +26 -0
  120. package/src/components/JsonPreview/JsonPreview.tsx +7 -0
  121. package/src/components/JsonPreview/index.tsx +1 -0
  122. package/src/components/LabelValue/LabelValue.tsx +21 -0
  123. package/src/components/LabelValue/index.tsx +1 -0
  124. package/src/components/Layout/ChangePassword.tsx +49 -0
  125. package/src/components/Layout/Header/AppHeader.tsx +150 -0
  126. package/src/components/Layout/Header/CogWheelMenu.tsx +35 -0
  127. package/src/components/Layout/Header/FreshDeskHelpButton.tsx +19 -0
  128. package/src/components/Layout/Header/MainAppHeader.tsx +6 -0
  129. package/src/components/Layout/Header/Notification.tsx +13 -0
  130. package/src/components/Layout/Header/UserBox.tsx +51 -0
  131. package/src/components/Layout/Header/applications.tsx +39 -0
  132. package/src/components/Layout/Header/icons.tsx +57 -0
  133. package/src/components/Layout/Header/index.tsx +1 -0
  134. package/src/components/Layout/Header/styles.tsx +48 -0
  135. package/src/components/LinearProgress/LinearProgress.tsx +27 -0
  136. package/src/components/LinearProgress/index.tsx +1 -0
  137. package/src/components/MediaRow/MediaRow.tsx +69 -0
  138. package/src/components/MediaRow/index.tsx +1 -0
  139. package/src/components/MenuButton.tsx +105 -0
  140. package/src/components/ModalButtons/DialogButton.tsx +84 -0
  141. package/src/components/ModalButtons/DrawerButton.tsx +89 -0
  142. package/src/components/ModalButtons/index.tsx +4 -0
  143. package/src/components/NoDataIllustration/NoDataIllustration.tsx +32 -0
  144. package/src/components/NoDataIllustration/index.tsx +1 -0
  145. package/src/components/PageContent.tsx +14 -0
  146. package/src/components/PageHeader.tsx +52 -0
  147. package/src/components/PopupConfirm/ConfirmContextProvider.tsx +22 -0
  148. package/src/components/PopupConfirm/PopupConfirm.tsx +33 -0
  149. package/src/components/PopupConfirm/index.tsx +1 -0
  150. package/src/components/PopupConfirm/useConfirm.ts +47 -0
  151. package/src/components/Row/Row.tsx +24 -0
  152. package/src/components/Row/index.tsx +1 -0
  153. package/src/components/SearchBar/SearchBar.tsx +53 -0
  154. package/src/components/SearchBar/index.tsx +1 -0
  155. package/src/components/Spinner.tsx +18 -0
  156. package/src/components/StepsHeader/StepsHeader.tsx +115 -0
  157. package/src/components/StepsHeader/index.tsx +1 -0
  158. package/src/components/Styled/OutlinedIconButton.tsx +7 -0
  159. package/src/components/Styled/index.tsx +1 -0
  160. package/src/components/StyledTableContainer.tsx +33 -0
  161. package/src/components/Swiper/Swiper.tsx +39 -0
  162. package/src/components/Swiper/index.tsx +1 -0
  163. package/src/components/SwitchButton/SwitchButton.tsx +41 -0
  164. package/src/components/SwitchButton/index.tsx +1 -0
  165. package/src/components/TableComponent/BatchActionsHeader.tsx +58 -0
  166. package/src/components/TableComponent/Icons/index.tsx +50 -0
  167. package/src/components/TableComponent/ReactTable.tsx +293 -0
  168. package/src/components/TableComponent/RenderTableBody.tsx +65 -0
  169. package/src/components/TableComponent/TableFooter/TableFooter.tsx +102 -0
  170. package/src/components/TableComponent/TableFooter/index.tsx +1 -0
  171. package/src/components/TableComponent/TableFooter/styles.tsx +28 -0
  172. package/src/components/TableComponent/index.tsx +219 -0
  173. package/src/components/TableComponent/no-data-illu.svg +1 -0
  174. package/src/components/TableComponent/react-table-config.d.ts +129 -0
  175. package/src/components/TableComponent/styles.tsx +173 -0
  176. package/src/components/TableComponent/types.ts +57 -0
  177. package/src/components/Tabs/Tabs.tsx +52 -0
  178. package/src/components/Tabs/TabsContainer.tsx +50 -0
  179. package/src/components/Tabs/index.tsx +1 -0
  180. package/src/components/Tabs/styles.tsx +55 -0
  181. package/src/components/ToastContainer/ToastContainer.tsx +42 -0
  182. package/src/components/ToastContainer/index.tsx +1 -0
  183. package/src/components/UploadButton/UploadButton.tsx +98 -0
  184. package/src/components/UploadButton/index.tsx +1 -0
  185. package/src/components/UploadButton/types.ts +14 -0
  186. package/src/components/UploadDocument/UploadDocument.tsx +108 -0
  187. package/src/components/UploadDocument/index.tsx +1 -0
  188. package/src/components/UploadFileDialog/UploadFileDialog.tsx +240 -0
  189. package/src/components/UploadFileDialog/index.tsx +1 -0
  190. package/src/components/index.ts +59 -0
  191. package/src/config/axios.ts +138 -0
  192. package/src/constants/UIConstants.ts +97 -0
  193. package/src/constants/formValidations.ts +6 -0
  194. package/src/constants/index.ts +4 -0
  195. package/src/constants/permissions.ts +67 -0
  196. package/src/constants/validateMessages.ts +12 -0
  197. package/src/contexts/Providers.tsx +24 -0
  198. package/src/contexts/QueryClientProvider.tsx +22 -0
  199. package/src/hooks/index.ts +2 -0
  200. package/src/hooks/useFetch.ts +53 -0
  201. package/src/hooks/useRouter.ts +31 -0
  202. package/src/index.tsx +9 -0
  203. package/src/layouts/ComponentsLayout.tsx +3 -0
  204. package/src/pages/LoginPage/LoginPage.tsx +166 -0
  205. package/src/pages/LoginPage/index.ts +1 -0
  206. package/src/pages/LoginPage/styles.tsx +121 -0
  207. package/src/pages/index.ts +4 -0
  208. package/src/permissions/PageWithPermission.tsx +58 -0
  209. package/src/permissions/PermissionDeniedPage.tsx +23 -0
  210. package/src/permissions/PermissionsStore.ts +289 -0
  211. package/src/permissions/ValidateAccess.tsx +18 -0
  212. package/src/permissions/index.ts +3 -0
  213. package/src/react-app-env.d.ts +1 -0
  214. package/src/shared-state/AssetsStore.ts +15 -0
  215. package/src/shared-state/UserStore.ts +13 -0
  216. package/src/shared-state/index.ts +3 -0
  217. package/src/stories/Button.stories.tsx +41 -0
  218. package/src/stories/Button.tsx +48 -0
  219. package/src/stories/Header.stories.tsx +25 -0
  220. package/src/stories/Header.tsx +56 -0
  221. package/src/stories/Introduction.stories.mdx +211 -0
  222. package/src/stories/Page.stories.tsx +26 -0
  223. package/src/stories/Page.tsx +73 -0
  224. package/src/stories/TextField.stories.tsx +18 -0
  225. package/src/stories/TextField.tsx +49 -0
  226. package/src/stories/assets/code-brackets.svg +1 -0
  227. package/src/stories/assets/colors.svg +1 -0
  228. package/src/stories/assets/comments.svg +1 -0
  229. package/src/stories/assets/direction.svg +1 -0
  230. package/src/stories/assets/flow.svg +1 -0
  231. package/src/stories/assets/plugin.svg +1 -0
  232. package/src/stories/assets/repo.svg +1 -0
  233. package/src/stories/assets/stackalt.svg +1 -0
  234. package/src/stories/button.css +30 -0
  235. package/src/stories/header.css +32 -0
  236. package/src/stories/page.css +69 -0
  237. package/src/theme/App.less +3 -0
  238. package/src/theme/MuiThemeProvider.tsx +11 -0
  239. package/src/theme/customCssBaseline.ts +78 -0
  240. package/src/theme/index.css +75 -0
  241. package/src/theme/muiTheme.ts +516 -0
  242. package/src/theme/theme.d.ts +75 -0
  243. package/src/utils/alphabet.ts +23 -0
  244. package/src/utils/arrayPadEnd.ts +3 -0
  245. package/src/utils/formatCurrency.ts +9 -0
  246. package/src/utils/getUrlParams.ts +5 -0
  247. package/src/utils/index.ts +6 -0
  248. package/src/utils/ordinalSuffixOf.ts +14 -0
  249. package/src/utils/romanize.ts +40 -0
  250. package/src/utils/withRouteWrapper.tsx +25 -0
  251. package/src/utils/withSuspense.tsx +6 -0
  252. package/styled-components.tsx +60 -0
  253. package/tsconfig.json +21 -0
@@ -0,0 +1,100 @@
1
+ import { Close } from '@mui/icons-material'
2
+ import { Autocomplete, CircularProgress, TextField } from '@mui/material'
3
+ import React from 'react'
4
+ import { Controller } from 'react-hook-form'
5
+ import FormLabel from './FormLabel'
6
+
7
+ interface MultiSelectProps {
8
+ control?: any
9
+ label: string
10
+ name?: string
11
+ options: { key: string | number; name: any }[]
12
+ placeholder?: string
13
+ loading?: boolean
14
+ [key: string]: any
15
+ hookForm?: boolean
16
+ value?: any
17
+ onChange?: (value: any) => void
18
+ }
19
+
20
+ export default function FormMultiSelect({
21
+ control,
22
+ name,
23
+ options,
24
+ label,
25
+ loading,
26
+ value,
27
+ onChange,
28
+ hookForm = true,
29
+ ...props
30
+ }: MultiSelectProps) {
31
+ if (!hookForm) {
32
+ return (
33
+ <Autocomplete
34
+ multiple
35
+ value={value}
36
+ loading={loading}
37
+ fullWidth
38
+ isOptionEqualToValue={(option, value) => option.key === value.key}
39
+ onChange={(e, value) => {
40
+ if (!onChange) return
41
+ onChange(value)
42
+ }}
43
+ options={options || []}
44
+ getOptionLabel={(option) => option?.name || ''}
45
+ renderInput={(params) => (
46
+ <TextField
47
+ {...params}
48
+ variant="outlined"
49
+ label={<FormLabel label={label} required={props.required} />}
50
+ />
51
+ )}
52
+ {...props}
53
+ />
54
+ )
55
+ }
56
+ return (
57
+ <Controller
58
+ control={control}
59
+ name={name}
60
+ render={({ field, fieldState: { error } }) => (
61
+ <Autocomplete
62
+ multiple
63
+ value={field.value}
64
+ loading={loading}
65
+ fullWidth
66
+ isOptionEqualToValue={(option, value) => option.key === value.key}
67
+ onChange={(e, value) => {
68
+ field.onChange(value)
69
+ }}
70
+ options={options || []}
71
+ getOptionLabel={(option) => option?.name || ''}
72
+ renderInput={(params) => (
73
+ <TextField
74
+ {...params}
75
+ variant="outlined"
76
+ InputProps={{
77
+ ...params.InputProps,
78
+ endAdornment: (
79
+ <React.Fragment>
80
+ {loading ? (
81
+ <CircularProgress color="inherit" size={20} />
82
+ ) : null}
83
+ {params.InputProps.endAdornment}
84
+ </React.Fragment>
85
+ ),
86
+ }}
87
+ label={<FormLabel label={label} required={props.required} />}
88
+ error={error ? true : false}
89
+ helperText={error ? error.message : null}
90
+ />
91
+ )}
92
+ ChipProps={{
93
+ deleteIcon: <Close />,
94
+ }}
95
+ {...props}
96
+ />
97
+ )}
98
+ />
99
+ )
100
+ }
@@ -0,0 +1,113 @@
1
+ import {
2
+ Box,
3
+ FormControlLabel,
4
+ Radio,
5
+ RadioGroup as MuiRadioGroup,
6
+ RadioGroupProps,
7
+ Stack,
8
+ Typography,
9
+ } from '@mui/material'
10
+ import { ReactNode } from 'react'
11
+ import { Controller } from 'react-hook-form'
12
+ import FormLabel from './FormLabel'
13
+
14
+ interface Props extends RadioGroupProps {
15
+ label: string
16
+ name: string
17
+ control: any
18
+ sx?: any
19
+ row?: boolean
20
+ required?: boolean
21
+ options: { value: any; label: string | ReactNode }[]
22
+ Container?: any
23
+ }
24
+
25
+ export default function FormRadioGroup(props: Props) {
26
+ const {
27
+ name,
28
+ control,
29
+ label,
30
+ sx,
31
+ options = [],
32
+ row = false,
33
+ required = false,
34
+ Container,
35
+ } = props
36
+
37
+ return (
38
+ <>
39
+ <Controller
40
+ name={name}
41
+ control={control}
42
+ render={({ field, fieldState: { error } }) => (
43
+ <Stack direction={row ? 'row' : 'column'}>
44
+ {Container ? (
45
+ <Container style={{ borderColor: error ? 'red' : '' }}>
46
+ {
47
+ <RadioComponent
48
+ field={field}
49
+ name={name}
50
+ label={label}
51
+ row={row}
52
+ options={options}
53
+ required={required}
54
+ />
55
+ }
56
+ </Container>
57
+ ) : (
58
+ <RadioComponent
59
+ field={field}
60
+ name={name}
61
+ label={label}
62
+ row={row}
63
+ options={options}
64
+ required={required}
65
+ />
66
+ )}
67
+ {error && (
68
+ <Typography
69
+ variant="subtitle1"
70
+ sx={{ pl: '2px' }}
71
+ color="rgb(211, 47, 47)"
72
+ >
73
+ {error.message}
74
+ </Typography>
75
+ )}
76
+ </Stack>
77
+ )}
78
+ />
79
+ </>
80
+ )
81
+ }
82
+
83
+ const RadioComponent = ({ label, required, row, options, name, field }) => {
84
+ return (
85
+ <>
86
+ <Box>
87
+ <Box sx={{ display: 'flex' }}>
88
+ <Typography variant="subtitle2">{label}</Typography>
89
+ {required && (
90
+ <Typography fontSize={14} component={'span'} color="error">
91
+ {' *'}
92
+ </Typography>
93
+ )}
94
+ </Box>
95
+ <MuiRadioGroup
96
+ value={field.value}
97
+ onChange={field.onChange}
98
+ row={row}
99
+ name={name}
100
+ >
101
+ {options.map((item, index) => (
102
+ <FormControlLabel
103
+ key={index}
104
+ value={item.value}
105
+ control={<Radio />}
106
+ label={item.label}
107
+ />
108
+ ))}
109
+ </MuiRadioGroup>
110
+ </Box>
111
+ </>
112
+ )
113
+ }
@@ -0,0 +1,46 @@
1
+ import { Checkbox, FormControlLabel, Typography } from '@mui/material'
2
+ import { Controller } from 'react-hook-form'
3
+
4
+ interface Props {
5
+ label?: string
6
+ name: string
7
+ size?: 'small' | 'medium'
8
+ control: any
9
+ sx?: any
10
+ }
11
+
12
+ export default function FormSingleCheckbox(props: Props) {
13
+ const { name, size = 'medium', control, label = '', sx } = props
14
+ return (
15
+ <>
16
+ <Controller
17
+ name={name}
18
+ control={control}
19
+ render={({ field, fieldState: { error } }) => (
20
+ <>
21
+ <FormControlLabel
22
+ sx={{ width: '100%', ...sx }}
23
+ control={
24
+ <Checkbox
25
+ size={size}
26
+ checked={field.value}
27
+ onChange={field.onChange}
28
+ />
29
+ }
30
+ label={label}
31
+ />
32
+ {error && (
33
+ <Typography
34
+ variant="caption"
35
+ sx={{ pl: '2px' }}
36
+ color="rgb(211, 47, 47)"
37
+ >
38
+ {error.message}
39
+ </Typography>
40
+ )}
41
+ </>
42
+ )}
43
+ />
44
+ </>
45
+ )
46
+ }
@@ -0,0 +1,93 @@
1
+ import {
2
+ FormControl,
3
+ InputLabel,
4
+ MenuItem,
5
+ Select,
6
+ SelectProps,
7
+ styled,
8
+ Typography,
9
+ } from '@mui/material'
10
+ import { ReactNode } from 'react'
11
+ import { Controller } from 'react-hook-form'
12
+ import FormLabel from './FormLabel'
13
+ interface Props extends SelectProps {
14
+ name?: string
15
+ control?: any
16
+ options: Array<{ label: ReactNode; value: any }>
17
+ label?: string
18
+ textColor?: string
19
+ onChange?: (value: any) => void
20
+ required?: boolean
21
+ firstItemEmpty?: boolean
22
+ }
23
+
24
+ const StyledFormControl = styled(FormControl)(({ theme }) => ({}))
25
+
26
+ export default function FormSingleSelect(props: Props) {
27
+ const {
28
+ name = 'select',
29
+ options,
30
+ control,
31
+ label,
32
+ textColor,
33
+ onChange,
34
+ required,
35
+ firstItemEmpty = false,
36
+ size = 'medium',
37
+ } = props
38
+
39
+ const inputOptions = firstItemEmpty
40
+ ? [{ label: 'All', value: '__empty__' }, ...options]
41
+ : options
42
+
43
+ return (
44
+ <Controller
45
+ name={name}
46
+ control={control}
47
+ render={({ field, fieldState: { error } }) => (
48
+ <StyledFormControl size={size} fullWidth>
49
+ <InputLabel id={name}>
50
+ <FormLabel required={required} label={label} />
51
+ </InputLabel>
52
+ <Select
53
+ size={size}
54
+ error={Boolean(error)}
55
+ variant="outlined"
56
+ sx={{ color: textColor }}
57
+ fullWidth
58
+ label={label}
59
+ displayEmpty={firstItemEmpty}
60
+ MenuProps={{
61
+ PaperProps: {
62
+ sx: { maxHeight: 300 },
63
+ },
64
+ }}
65
+ value={field.value}
66
+ onChange={(e) => {
67
+ if (onChange) onChange(e.target.value)
68
+ field.onChange(e.target.value)
69
+ }}
70
+ >
71
+ {inputOptions?.map((item, index) => (
72
+ <MenuItem key={index} value={item.value}>
73
+ {item.label}
74
+ </MenuItem>
75
+ ))}
76
+ </Select>
77
+ {error && (
78
+ <Typography
79
+ fontSize={12}
80
+ sx={{
81
+ paddingLeft: '2px',
82
+ marginTop: '2px',
83
+ }}
84
+ color="error"
85
+ >
86
+ {error.message}
87
+ </Typography>
88
+ )}
89
+ </StyledFormControl>
90
+ )}
91
+ />
92
+ )
93
+ }
@@ -0,0 +1,74 @@
1
+ import {
2
+ TextField as MuiTextField,
3
+ TextFieldProps as MuiTextFieldProps,
4
+ Typography,
5
+ } from '@mui/material'
6
+ import React from 'react'
7
+ import { Controller } from 'react-hook-form'
8
+ import FormLabel from './FormLabel'
9
+
10
+ type MyTextFieldProps = MuiTextFieldProps & {
11
+ control?: any
12
+ label?: string
13
+ name?: string
14
+ value?: any
15
+ hookForm?: boolean
16
+ required?: boolean
17
+ handleChange?: React.ChangeEventHandler<
18
+ HTMLTextAreaElement | HTMLInputElement
19
+ >
20
+ }
21
+
22
+ export default function FormTextField({
23
+ name,
24
+ control,
25
+ label,
26
+ value,
27
+ handleChange,
28
+ required = false,
29
+ hookForm = true,
30
+ ...rest
31
+ }: MyTextFieldProps) {
32
+ if (!hookForm)
33
+ return (
34
+ <MuiTextField
35
+ label={
36
+ <>
37
+ {label}
38
+ {required && (
39
+ <Typography fontSize={14} component={'span'} color="error">
40
+ {' *'}
41
+ </Typography>
42
+ )}
43
+ </>
44
+ }
45
+ value={value}
46
+ name={name}
47
+ onChange={handleChange}
48
+ {...rest}
49
+ />
50
+ )
51
+ return (
52
+ <Controller
53
+ control={control}
54
+ name={name}
55
+ defaultValue=""
56
+ render={({ field: { onChange, value }, fieldState: { error } }) => (
57
+ <MuiTextField
58
+ {...rest}
59
+ name={name}
60
+ label={<FormLabel required={required} label={label} />}
61
+ onChange={(e) => {
62
+ onChange(e)
63
+ if (handleChange) {
64
+ handleChange(e)
65
+ }
66
+ }}
67
+ value={value}
68
+ error={error ? true : false}
69
+ helperText={error ? error.message : null}
70
+ />
71
+ )}
72
+ />
73
+ )
74
+ }
@@ -0,0 +1,82 @@
1
+ import DateRangeIcon from '@mui/icons-material/DateRange'
2
+ import { InputAdornment, TextField, Typography } from '@mui/material'
3
+ import {
4
+ LocalizationProvider,
5
+ TimePicker as MuiTimePicker,
6
+ } from '@mui/x-date-pickers'
7
+ import { AdapterMoment } from '@mui/x-date-pickers/AdapterMoment'
8
+ import { Controller } from 'react-hook-form'
9
+
10
+ interface Props {
11
+ label?: string
12
+ name: string
13
+ size?: 'small' | 'medium'
14
+ control: any
15
+ required?: boolean
16
+ hookForm?: boolean
17
+ }
18
+
19
+ export default function FormTimePicker(props: Props) {
20
+ const {
21
+ name,
22
+ size = 'small',
23
+ control,
24
+ label = '',
25
+ required,
26
+ hookForm = true,
27
+ } = props
28
+
29
+ return (
30
+ <LocalizationProvider dateAdapter={AdapterMoment}>
31
+ <Controller
32
+ name={name}
33
+ control={control}
34
+ render={({ field, fieldState: { error } }) => (
35
+ <>
36
+ <MuiTimePicker
37
+ label={
38
+ <>
39
+ {label}
40
+ {required && (
41
+ <Typography fontSize={14} component={'span'} color="error">
42
+ {' *'}
43
+ </Typography>
44
+ )}
45
+ </>
46
+ }
47
+ mask="__:__ _M"
48
+ inputFormat="hh:mm a"
49
+ value={field.value || null}
50
+ onChange={field.onChange}
51
+ InputProps={{
52
+ endAdornment: (
53
+ <InputAdornment position="end">
54
+ <DateRangeIcon />
55
+ </InputAdornment>
56
+ ),
57
+ }}
58
+ renderInput={(params) => (
59
+ <TextField
60
+ fullWidth
61
+ size={size}
62
+ {...params}
63
+ error={Boolean(error)}
64
+ onBlur={field.onBlur}
65
+ />
66
+ )}
67
+ />
68
+ {error && (
69
+ <Typography
70
+ variant="caption"
71
+ sx={{ pl: '2px' }}
72
+ color="rgb(211, 47, 47)"
73
+ >
74
+ {error.message}
75
+ </Typography>
76
+ )}
77
+ </>
78
+ )}
79
+ />
80
+ </LocalizationProvider>
81
+ )
82
+ }
@@ -0,0 +1,23 @@
1
+ import SingleSelect from './SingleSelect'
2
+ import FormDatePicker from './DatePicker'
3
+ import MultiCheckbox from './MultiCheckbox'
4
+ import MultiSelect from './MultiSelect'
5
+ import RadioGroup from './RadioGroup'
6
+ import SingleCheckbox from './SingleCheckbox'
7
+ import AutoCompleteSearch from './AutoCompleteSearch'
8
+ import FormTextField from './TextField'
9
+ import TimePicker from './TimePicker'
10
+ import FormDateTimePicker from './DateTimePicker'
11
+
12
+ export {
13
+ SingleSelect as FormSingleSelect,
14
+ FormDatePicker,
15
+ FormTextField,
16
+ MultiCheckbox as FormMultiCheckbox,
17
+ MultiSelect as FormMultiSelect,
18
+ RadioGroup as FormRadioGroup,
19
+ SingleCheckbox as FormSingleCheckbox,
20
+ AutoCompleteSearch as FormAutoCompleteSearch,
21
+ TimePicker as FormTimePicker,
22
+ FormDateTimePicker,
23
+ }
@@ -0,0 +1,137 @@
1
+ import { Box, IconButton, IconButtonProps, styled } from '@mui/material'
2
+ import { ReactNode } from 'react'
3
+ import {
4
+ DeleteIcon,
5
+ DisabledDeleteIcon,
6
+ DisabledEditIcon,
7
+ EditIcon,
8
+ ViewIcon,
9
+ PrintIcon,
10
+ } from './Icons'
11
+
12
+ interface ButtonProps extends IconButtonProps {
13
+ disabledText?: string
14
+ actionType?: 'delete' | 'edit' | 'view' | 'print'
15
+ }
16
+
17
+ function Button({ ...props }: ButtonProps) {
18
+ const handleClick = (e) => {
19
+ e.stopPropagation()
20
+ if (!props.onClick) return
21
+ props.onClick(e)
22
+ }
23
+ return (
24
+ <StyledIconButton
25
+ {...props}
26
+ onClick={handleClick}
27
+ actionType={props.actionType ? props.actionType : 'view'}
28
+ >
29
+ {props.children}
30
+ </StyledIconButton>
31
+ )
32
+ }
33
+
34
+ function DisabledButton({
35
+ disabledText,
36
+ children,
37
+ }: {
38
+ disabledText?: string
39
+ children: ReactNode
40
+ }) {
41
+ return (
42
+ <Box
43
+ sx={{
44
+ maxHeight: '14px',
45
+ }}
46
+ title={disabledText ? disabledText : 'disabled'}
47
+ >
48
+ {children}
49
+ </Box>
50
+ )
51
+ }
52
+
53
+ export function ViewButton({ disabled, disabledText, ...props }: ButtonProps) {
54
+ if (disabled) {
55
+ return (
56
+ <DisabledButton {...props} disabledText={disabledText}>
57
+ <ViewIcon />
58
+ </DisabledButton>
59
+ )
60
+ }
61
+ return (
62
+ <Button {...props} actionType="view">
63
+ <ViewIcon />
64
+ </Button>
65
+ )
66
+ }
67
+
68
+ export function EditButton({ disabled, disabledText, ...props }: ButtonProps) {
69
+ if (disabled) {
70
+ return (
71
+ <DisabledButton
72
+ disabledText={disabledText ?? 'Default types can not be edited'}
73
+ >
74
+ <DisabledEditIcon />
75
+ </DisabledButton>
76
+ )
77
+ }
78
+ return (
79
+ <Button {...props} actionType="edit">
80
+ <EditIcon />
81
+ </Button>
82
+ )
83
+ }
84
+
85
+ export function PrintButton({ disabled, disabledText, ...props }: ButtonProps) {
86
+ if (disabled) {
87
+ return (
88
+ <DisabledButton
89
+ disabledText={disabledText ?? 'Default types can not be edited'}
90
+ >
91
+ <DisabledEditIcon />
92
+ </DisabledButton>
93
+ )
94
+ }
95
+ return (
96
+ <Button {...props} actionType="print">
97
+ <PrintIcon />
98
+ </Button>
99
+ )
100
+ }
101
+
102
+ export function DeleteButton({
103
+ disabled,
104
+ disabledText,
105
+ ...props
106
+ }: ButtonProps) {
107
+ if (disabled) {
108
+ return (
109
+ <DisabledButton
110
+ disabledText={disabledText ?? 'Default types can not be deleted'}
111
+ >
112
+ <DisabledDeleteIcon />
113
+ </DisabledButton>
114
+ )
115
+ }
116
+ return (
117
+ <Button {...props} actionType="delete">
118
+ <DeleteIcon />
119
+ </Button>
120
+ )
121
+ }
122
+
123
+ const StyledIconButton = styled(IconButton)<{
124
+ actionType: 'delete' | 'edit' | 'view' | 'print'
125
+ }>(({ theme, actionType }) => ({
126
+ padding: 0,
127
+ '&:hover': {
128
+ '& path': {
129
+ fill:
130
+ actionType === 'delete'
131
+ ? 'red'
132
+ : actionType === 'edit'
133
+ ? theme.palette.common.yellow
134
+ : theme.palette.error.main,
135
+ },
136
+ },
137
+ }))