@campxdev/shared 1.4.19 → 1.4.21

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 (216) hide show
  1. package/antd.customize.less +73 -73
  2. package/exports.ts +18 -18
  3. package/package.json +84 -84
  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/AnchorElement.tsx +44 -0
  24. package/src/components/DropDownButton/DropDownButton.tsx +175 -177
  25. package/src/components/DropDownButton/DropdownMenuItem.tsx +100 -0
  26. package/src/components/DropDownButton/index.tsx +1 -1
  27. package/src/components/DropDownButton/styles.tsx +59 -56
  28. package/src/components/ErrorBoundary/ErrorBoundary.tsx +28 -28
  29. package/src/components/ErrorBoundary/ErrorFallback.tsx +236 -236
  30. package/src/components/ErrorBoundary/GlobalNetworkLoadingIndicator.tsx +13 -13
  31. package/src/components/ErrorBoundary/index.tsx +1 -1
  32. package/src/components/ErrorBox.tsx +42 -42
  33. package/src/components/FilterComponents/FilterButton.tsx +40 -40
  34. package/src/components/FilterComponents/SearchBar.tsx +40 -40
  35. package/src/components/FloatingContainer.tsx +33 -33
  36. package/src/components/Form/Form.tsx +156 -156
  37. package/src/components/Form/RenderForm.tsx +188 -188
  38. package/src/components/FullCalendar/Actions.tsx +162 -162
  39. package/src/components/FullCalendar/FullCalendarWrapper.tsx +54 -54
  40. package/src/components/FullScreenLoader.tsx +19 -19
  41. package/src/components/HookForm/AutoCompleteSearch.tsx +113 -113
  42. package/src/components/HookForm/DatePicker.tsx +40 -40
  43. package/src/components/HookForm/DateTimePicker.tsx +47 -47
  44. package/src/components/HookForm/FormLabel.tsx +14 -14
  45. package/src/components/HookForm/MultiCheckbox.tsx +69 -69
  46. package/src/components/HookForm/MultiSelect.tsx +53 -53
  47. package/src/components/HookForm/RadioGroup.tsx +45 -45
  48. package/src/components/HookForm/SingleCheckbox.tsx +34 -34
  49. package/src/components/HookForm/SingleSelect.tsx +46 -46
  50. package/src/components/HookForm/TextField.tsx +40 -40
  51. package/src/components/HookForm/TimePicker.tsx +40 -40
  52. package/src/components/HookForm/index.ts +23 -23
  53. package/src/components/IconButtons/IconButtons.tsx +137 -137
  54. package/src/components/IconButtons/Icons.tsx +268 -268
  55. package/src/components/IconButtons/assets/edit.svg +4 -4
  56. package/src/components/IconButtons/assets/eye.svg +6 -6
  57. package/src/components/IconButtons/assets/trash.svg +7 -7
  58. package/src/components/IconButtons/index.tsx +8 -8
  59. package/src/components/IconLabel.tsx +37 -37
  60. package/src/components/Image/Image.tsx +45 -45
  61. package/src/components/Image/index.tsx +1 -1
  62. package/src/components/ImageUpload.tsx +98 -98
  63. package/src/components/Input/AsyncSearchSelect/AsyncSearchSelect.tsx +216 -216
  64. package/src/components/Input/AsyncSearchSelect/index.tsx +1 -1
  65. package/src/components/Input/AsyncSearchSelect/styles.tsx +105 -105
  66. package/src/components/Input/AutoCompleteSearch.tsx +121 -121
  67. package/src/components/Input/DatePicker.tsx +69 -69
  68. package/src/components/Input/DateRangePicker.tsx +105 -105
  69. package/src/components/Input/DateTimePicker.tsx +77 -77
  70. package/src/components/Input/FormLabel.tsx +21 -21
  71. package/src/components/Input/MultiCheckbox.tsx +64 -64
  72. package/src/components/Input/MultiSelect.tsx +150 -150
  73. package/src/components/Input/RadioGroup.tsx +104 -104
  74. package/src/components/Input/SingleCheckbox.tsx +78 -78
  75. package/src/components/Input/SingleSelect.tsx +104 -104
  76. package/src/components/Input/TextField.tsx +46 -46
  77. package/src/components/Input/TimePicker.tsx +70 -70
  78. package/src/components/Input/index.ts +26 -26
  79. package/src/components/Input/types.ts +3 -3
  80. package/src/components/JsonPreview.tsx +7 -7
  81. package/src/components/LabelValue.tsx +21 -21
  82. package/src/components/Layout/ChangePassword.tsx +49 -49
  83. package/src/components/Layout/Header/AppHeader.tsx +102 -102
  84. package/src/components/Layout/Header/AppsMenu.tsx +98 -98
  85. package/src/components/Layout/Header/CogWheelMenu.tsx +33 -33
  86. package/src/components/Layout/Header/Notification.tsx +13 -13
  87. package/src/components/Layout/Header/UserBox.tsx +81 -81
  88. package/src/components/Layout/Header/applications.ts +91 -91
  89. package/src/components/Layout/Header/assets/campx_square_small.svg +9 -9
  90. package/src/components/Layout/Header/assets/commutex.svg +14 -14
  91. package/src/components/Layout/Header/assets/commutexSmall.svg +11 -11
  92. package/src/components/Layout/Header/assets/enroll.svg +14 -14
  93. package/src/components/Layout/Header/assets/enrollx.svg +14 -14
  94. package/src/components/Layout/Header/assets/exams_small.svg +12 -12
  95. package/src/components/Layout/Header/assets/examsx.svg +14 -14
  96. package/src/components/Layout/Header/assets/hostel_small.svg +13 -13
  97. package/src/components/Layout/Header/assets/hostelx.svg +13 -13
  98. package/src/components/Layout/Header/assets/index.ts +33 -33
  99. package/src/components/Layout/Header/assets/libraryx.svg +12 -12
  100. package/src/components/Layout/Header/assets/pay_small.svg +16 -16
  101. package/src/components/Layout/Header/assets/payx.svg +19 -19
  102. package/src/components/Layout/Header/assets/people_small.svg +9 -9
  103. package/src/components/Layout/Header/assets/peoplex.svg +12 -12
  104. package/src/components/Layout/Header/assets/squarex.svg +12 -12
  105. package/src/components/Layout/Header/icons.tsx +57 -57
  106. package/src/components/Layout/Header/index.tsx +1 -1
  107. package/src/components/Layout/Header/styles.tsx +124 -124
  108. package/src/components/Layout/LayoutWrapper.tsx +28 -28
  109. package/src/components/Layout/SideMenuHeader.tsx +29 -29
  110. package/src/components/Layout/SideNav.tsx +168 -168
  111. package/src/components/Layout/Tickets/HelpWidget/HelpWidget.tsx +273 -273
  112. package/src/components/Layout/Tickets/HelpWidget/styles.tsx +94 -94
  113. package/src/components/Layout/Tickets/MyTickets.tsx +72 -72
  114. package/src/components/Layout/Tickets/TicketDetails.tsx +65 -65
  115. package/src/components/Layout/Tickets/TimeLine.tsx +64 -64
  116. package/src/components/Layout/Tickets/index.tsx +1 -1
  117. package/src/components/Layout/Tickets/services.ts +11 -11
  118. package/src/components/Layout/Tickets/styles.tsx +136 -136
  119. package/src/components/LinearProgress.tsx +19 -19
  120. package/src/components/ListItemButton.tsx +95 -95
  121. package/src/components/LoginForm.tsx +80 -80
  122. package/src/components/MediaRow/MediaRow.tsx +69 -69
  123. package/src/components/MediaRow/index.tsx +1 -1
  124. package/src/components/ModalButtons/DialogButton.tsx +121 -93
  125. package/src/components/ModalButtons/DrawerButton.tsx +113 -84
  126. package/src/components/ModalButtons/index.tsx +4 -4
  127. package/src/components/NoDataIllustration.tsx +32 -32
  128. package/src/components/PageContent.tsx +12 -12
  129. package/src/components/PageHeader.tsx +55 -55
  130. package/src/components/PageNotFound.tsx +26 -26
  131. package/src/components/PopupConfirm/ConfirmContextProvider.tsx +40 -40
  132. package/src/components/PopupConfirm/PopupConfirm.tsx +34 -34
  133. package/src/components/PopupConfirm/index.tsx +1 -1
  134. package/src/components/PopupConfirm/useConfirm.ts +47 -47
  135. package/src/components/Row.tsx +24 -24
  136. package/src/components/Spinner.tsx +18 -18
  137. package/src/components/StepsHeader/StepsHeader.tsx +115 -115
  138. package/src/components/StepsHeader/index.tsx +1 -1
  139. package/src/components/StyledTableContainer.tsx +33 -33
  140. package/src/components/SwitchButton.tsx +41 -41
  141. package/src/components/Table.tsx +42 -42
  142. package/src/components/TableComponent/BatchActionsHeader.tsx +58 -58
  143. package/src/components/TableComponent/Icons/index.tsx +50 -50
  144. package/src/components/TableComponent/ReactTable.tsx +295 -295
  145. package/src/components/TableComponent/RenderTableBody.tsx +68 -68
  146. package/src/components/TableComponent/Table.tsx +197 -197
  147. package/src/components/TableComponent/TableFooter/TableFooter.tsx +104 -104
  148. package/src/components/TableComponent/TableFooter/index.tsx +1 -1
  149. package/src/components/TableComponent/TableFooter/styles.tsx +28 -28
  150. package/src/components/TableComponent/index.tsx +1 -1
  151. package/src/components/TableComponent/react-table-config.d.ts +128 -128
  152. package/src/components/TableComponent/styles.tsx +170 -170
  153. package/src/components/TableComponent/types.ts +57 -57
  154. package/src/components/Tabs/Tabs.tsx +52 -52
  155. package/src/components/Tabs/TabsContainer.tsx +50 -50
  156. package/src/components/Tabs/index.tsx +1 -1
  157. package/src/components/Tabs/styles.tsx +55 -55
  158. package/src/components/ToastContainer/ToastContainer.tsx +42 -42
  159. package/src/components/ToastContainer/index.tsx +1 -1
  160. package/src/components/UploadButton/UploadButton.tsx +126 -126
  161. package/src/components/UploadButton/index.tsx +1 -1
  162. package/src/components/UploadButton/types.ts +19 -19
  163. package/src/components/UploadDocument.tsx +108 -108
  164. package/src/components/UploadFileDialog/UploadFileDialog.tsx +238 -238
  165. package/src/components/UploadFileDialog/index.tsx +1 -1
  166. package/src/components/index.ts +89 -89
  167. package/src/config/axios.ts +73 -73
  168. package/src/config/axiosEvaluator.ts +53 -53
  169. package/src/config/axiosXTenant.ts +57 -57
  170. package/src/constants/UIConstants.ts +97 -97
  171. package/src/constants/formValidations.ts +6 -6
  172. package/src/constants/index.ts +5 -5
  173. package/src/constants/isDevelopment.ts +3 -3
  174. package/src/constants/permissions.ts +67 -67
  175. package/src/constants/validateMessages.ts +12 -12
  176. package/src/contexts/LoginFormProvider.tsx +39 -39
  177. package/src/contexts/Providers.tsx +73 -73
  178. package/src/contexts/PublicProviders.tsx +30 -30
  179. package/src/contexts/QueryClientProvider.tsx +22 -22
  180. package/src/hooks/index.ts +3 -3
  181. package/src/hooks/useAuth.ts +96 -96
  182. package/src/hooks/useFetch.ts +53 -53
  183. package/src/hooks/useRouter.ts +31 -31
  184. package/src/layouts/Components/DashBoardMenu.tsx +232 -232
  185. package/src/layouts/Components/icons/index.tsx +403 -403
  186. package/src/layouts/Components/styles.tsx +74 -74
  187. package/src/layouts/ComponentsLayout.tsx +3 -3
  188. package/src/permissions/PageWithPermission.tsx +18 -18
  189. package/src/permissions/PermissionDeniedPage.tsx +16 -16
  190. package/src/permissions/ValidateAccess.tsx +18 -18
  191. package/src/permissions/index.ts +2 -2
  192. package/src/react-app-env.d.ts +1 -1
  193. package/src/shared-state/AssetsStore.ts +15 -15
  194. package/src/shared-state/PermissionsStore.ts +352 -352
  195. package/src/shared-state/UserStore.ts +13 -13
  196. package/src/shared-state/index.ts +4 -4
  197. package/src/theme/App.less +3 -3
  198. package/src/theme/MuiThemeProvider.tsx +13 -13
  199. package/src/theme/customCssBaseline.ts +78 -78
  200. package/src/theme/index.css +75 -75
  201. package/src/theme/muiTheme.ts +592 -560
  202. package/src/theme/theme.d.ts +75 -75
  203. package/src/utils/alphabet.ts +23 -23
  204. package/src/utils/arrayPadEnd.ts +3 -3
  205. package/src/utils/formatCurrency.ts +9 -9
  206. package/src/utils/getUrlParams.ts +5 -5
  207. package/src/utils/index.ts +7 -7
  208. package/src/utils/logout.ts +24 -24
  209. package/src/utils/ordinalSuffixOf.ts +14 -14
  210. package/src/utils/romanize.ts +40 -40
  211. package/src/utils/withRouteWrapper.tsx +25 -25
  212. package/src/utils/withSuspense.tsx +6 -6
  213. package/styled-components.tsx +60 -60
  214. package/tsconfig.json +21 -21
  215. package/yarn-error.log +109 -0
  216. package/src/components/Layout/Header/assets/commuteX.png +0 -0
@@ -1,53 +1,53 @@
1
- import { createContext, useContext, useState } from 'react'
2
- import { DrawerTemplate } from './DrawerTemplate'
3
-
4
- interface IProps {
5
- title: string
6
- modalType?: 'dialog' | 'drawer'
7
- content: ({ close }: { close: () => void }) => any
8
- }
9
-
10
- type ContextType = (props: IProps) => void
11
-
12
- const DialogContext = createContext<ContextType>(null)
13
-
14
- export default function DialogProvider({ children }) {
15
- const [modal, setModal] = useState({
16
- title: '',
17
- open: false,
18
- content: ({ close }) => null,
19
- modalType: 'drawer',
20
- })
21
-
22
- const handleClose = () => {
23
- setModal({
24
- ...modal,
25
- open: false,
26
- })
27
- }
28
-
29
- const showModal = (props) => {
30
- setModal({
31
- ...modal,
32
- open: true,
33
- title: props.title,
34
- content: props.content,
35
- // modalType: props.modalType ?? 'drawer',
36
- })
37
- }
38
-
39
- return (
40
- <DialogContext.Provider value={showModal}>
41
- {children}
42
- <>
43
- <DrawerTemplate
44
- handleClose={handleClose}
45
- modal={modal}
46
- setModal={setModal}
47
- />
48
- </>
49
- </DialogContext.Provider>
50
- )
51
- }
52
-
53
- export const useModal = () => useContext(DialogContext)
1
+ import { createContext, useContext, useState } from 'react'
2
+ import { DrawerTemplate } from './DrawerTemplate'
3
+
4
+ interface IProps {
5
+ title: string
6
+ modalType?: 'dialog' | 'drawer'
7
+ content: ({ close }: { close: () => void }) => any
8
+ }
9
+
10
+ type ContextType = (props: IProps) => void
11
+
12
+ const DialogContext = createContext<ContextType>(null)
13
+
14
+ export default function DialogProvider({ children }) {
15
+ const [modal, setModal] = useState({
16
+ title: '',
17
+ open: false,
18
+ content: ({ close }) => null,
19
+ modalType: 'drawer',
20
+ })
21
+
22
+ const handleClose = () => {
23
+ setModal({
24
+ ...modal,
25
+ open: false,
26
+ })
27
+ }
28
+
29
+ const showModal = (props) => {
30
+ setModal({
31
+ ...modal,
32
+ open: true,
33
+ title: props.title,
34
+ content: props.content,
35
+ // modalType: props.modalType ?? 'drawer',
36
+ })
37
+ }
38
+
39
+ return (
40
+ <DialogContext.Provider value={showModal}>
41
+ {children}
42
+ <>
43
+ <DrawerTemplate
44
+ handleClose={handleClose}
45
+ modal={modal}
46
+ setModal={setModal}
47
+ />
48
+ </>
49
+ </DialogContext.Provider>
50
+ )
51
+ }
52
+
53
+ export const useModal = () => useContext(DialogContext)
@@ -0,0 +1,44 @@
1
+ import { KeyboardArrowDown } from '@mui/icons-material'
2
+ import { CircularProgress } from '@mui/material'
3
+ import { StyledDropDownButton, StyledIconButton } from './styles'
4
+
5
+ export default function AnchorElement({
6
+ button,
7
+ icon,
8
+ handleClick,
9
+ loading,
10
+ anchor,
11
+ }) {
12
+ if (anchor) return <>{anchor({ open: handleClick })}</>
13
+
14
+ if (button)
15
+ return (
16
+ <StyledDropDownButton
17
+ onClick={handleClick}
18
+ variant="outlined"
19
+ disabled={loading}
20
+ endIcon={
21
+ loading ? (
22
+ <CircularProgress size="20px" thickness={1.7} />
23
+ ) : (
24
+ <KeyboardArrowDown />
25
+ )
26
+ }
27
+ {...button?.buttonProps}
28
+ >
29
+ {button?.label}
30
+ </StyledDropDownButton>
31
+ )
32
+
33
+ if (!button && !anchor) {
34
+ return (
35
+ <StyledIconButton
36
+ outlined={icon?.outlined ?? false}
37
+ onClick={handleClick}
38
+ {...icon.iconProps}
39
+ >
40
+ {icon.icon}
41
+ </StyledIconButton>
42
+ )
43
+ }
44
+ }
@@ -1,177 +1,175 @@
1
- import { KeyboardArrowDown, MoreVert } from '@mui/icons-material'
2
- import {
3
- ButtonProps,
4
- CircularProgress,
5
- IconButtonProps,
6
- ListItemIcon,
7
- ListItemText,
8
- Menu,
9
- MenuItem,
10
- MenuListProps,
11
- MenuProps,
12
- } from '@mui/material'
13
- import { ReactNode, useState } from 'react'
14
- import {
15
- StyledDropDownButton,
16
- StyledIconButton,
17
- StyledMenu,
18
- StyledMenuItem,
19
- } from './styles'
20
-
21
- type MenuItem =
22
- | {
23
- label: string | ReactNode
24
- icon?: ReactNode
25
- onClick: (props?: any) => any
26
- }
27
- | { customButton?: ReactNode }
28
-
29
- interface DropDownButtonProps {
30
- icon?: {
31
- icon: ReactNode
32
- iconProps?: IconButtonProps
33
- outlined?: boolean
34
- }
35
- button?: {
36
- label?: string
37
- buttonProps?: ButtonProps
38
- }
39
- anchor?: (props: { open: () => void }) => ReactNode
40
- loading?: boolean
41
- menu: MenuItem[]
42
- menuProps?: Omit<MenuProps, 'open'>
43
- menuListProps?: MenuListProps
44
- }
45
- const defaultIcon = {
46
- icon: <MoreVert color="primary" />,
47
- outlined: true,
48
- }
49
-
50
- const RenderAnchor = ({ button, icon, handleClick, loading, anchor }) => {
51
- if (anchor) return <>{anchor({ open: handleClick })}</>
52
-
53
- if (button)
54
- return (
55
- <StyledDropDownButton
56
- onClick={handleClick}
57
- variant="outlined"
58
- disabled={loading}
59
- endIcon={
60
- loading ? (
61
- <CircularProgress size="20px" thickness={1.7} />
62
- ) : (
63
- <KeyboardArrowDown />
64
- )
65
- }
66
- {...button?.buttonProps}
67
- >
68
- {button?.label}
69
- </StyledDropDownButton>
70
- )
71
-
72
- if (!button && !anchor) {
73
- return (
74
- <StyledIconButton
75
- outlined={icon?.outlined ?? false}
76
- onClick={handleClick}
77
- {...icon.iconProps}
78
- >
79
- {icon.icon}
80
- </StyledIconButton>
81
- )
82
- }
83
- }
84
-
85
- const DropDownButton = ({
86
- button,
87
- icon = defaultIcon,
88
- menu = [],
89
- menuProps,
90
- menuListProps,
91
- loading = false,
92
- anchor,
93
- }: DropDownButtonProps) => {
94
- const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null)
95
- const open = Boolean(anchorEl)
96
-
97
- const handleClick = (event: any) => {
98
- setAnchorEl(event.currentTarget)
99
- }
100
-
101
- const handleClose = () => {
102
- setAnchorEl(null)
103
- }
104
-
105
- return (
106
- <>
107
- <RenderAnchor
108
- anchor={anchor}
109
- loading={loading}
110
- button={button}
111
- icon={icon}
112
- handleClick={handleClick}
113
- />
114
- <StyledMenu
115
- elevation={0}
116
- id="basic-menu"
117
- anchorEl={anchorEl}
118
- open={open}
119
- onClose={handleClose}
120
- PaperProps={{
121
- elevation: 0,
122
- }}
123
- MenuListProps={{ ...menuListProps }}
124
- anchorOrigin={{
125
- vertical: 'bottom',
126
- horizontal: 'right',
127
- }}
128
- transitionDuration={150}
129
- transformOrigin={{
130
- vertical: 'top',
131
- horizontal: 'right',
132
- }}
133
- {...menuProps}
134
- >
135
- <RenderMenuItems menu={menu} handleClose={handleClose} />
136
- </StyledMenu>
137
- </>
138
- )
139
- }
140
-
141
- DropDownButton.MenuItem = ({ icon, label, ...props }) => {
142
- return (
143
- <StyledMenuItem
144
- sx={{ minWidth: '120px', width: '100%', ...props?.sx }}
145
- {...props}
146
- >
147
- {icon && <ListItemIcon>{icon}</ListItemIcon>}
148
- <ListItemText>{label}</ListItemText>
149
- </StyledMenuItem>
150
- )
151
- }
152
-
153
- export default DropDownButton
154
-
155
- const RenderMenuItems = ({ menu, handleClose }) => {
156
- return (
157
- <>
158
- {menu.map((item, index) => (
159
- <>
160
- {item?.customButton ? (
161
- item.customButton
162
- ) : (
163
- <DropDownButton.MenuItem
164
- icon={item?.icon}
165
- label={item?.label}
166
- key={index}
167
- onClick={() => {
168
- handleClose()
169
- item.onClick()
170
- }}
171
- />
172
- )}
173
- </>
174
- ))}
175
- </>
176
- )
177
- }
1
+ import { MoreVert } from '@mui/icons-material'
2
+ import {
3
+ ButtonProps,
4
+ IconButtonProps,
5
+ MenuListProps,
6
+ MenuProps,
7
+ } from '@mui/material'
8
+ import { ReactNode, useState } from 'react'
9
+ import { useImmer } from 'use-immer'
10
+ import { CustomDialog } from '../ModalButtons/DialogButton'
11
+ import { CustomDrawer } from '../ModalButtons/DrawerButton'
12
+ import AnchorElement from './AnchorElement'
13
+ import {
14
+ IMenuItemProps,
15
+ MenuItemType,
16
+ RenderMenuItem,
17
+ } from './DropdownMenuItem'
18
+ import { StyledMenu } from './styles'
19
+
20
+ interface DropDownButtonProps {
21
+ icon?: {
22
+ icon: ReactNode
23
+ iconProps?: IconButtonProps
24
+ outlined?: boolean
25
+ }
26
+ button?: {
27
+ label?: string
28
+ buttonProps?: ButtonProps
29
+ }
30
+ anchor?: (props: { open: () => void }) => ReactNode
31
+ loading?: boolean
32
+ menu: IMenuItemProps[]
33
+ menuProps?: Omit<MenuProps, 'open'>
34
+ menuListProps?: MenuListProps
35
+ }
36
+
37
+ const defaultIcon = {
38
+ icon: <MoreVert color="primary" />,
39
+ outlined: true,
40
+ }
41
+
42
+ interface IModalState {
43
+ open: boolean
44
+ content: any
45
+ type: MenuItemType
46
+ }
47
+
48
+ const DropDownButton = ({
49
+ button,
50
+ icon = defaultIcon,
51
+ menu = [],
52
+ menuProps,
53
+ menuListProps,
54
+ loading = false,
55
+ anchor,
56
+ }: DropDownButtonProps) => {
57
+ const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null)
58
+ const [open, setOpen] = useState(false)
59
+
60
+ const [modalState, setModalState] = useImmer<IModalState>({
61
+ open: false,
62
+ content: null,
63
+ type: 'drawer',
64
+ })
65
+
66
+ const handleClick = (event: any) => {
67
+ setAnchorEl(event.currentTarget)
68
+ setOpen(true)
69
+ }
70
+
71
+ const handleClose = () => {
72
+ setAnchorEl(null)
73
+ setOpen(false)
74
+ }
75
+
76
+ const onModalClose = () => {
77
+ setModalState((s) => {
78
+ s.open = false
79
+ s.content = null
80
+ })
81
+ }
82
+ const onModalOpen = (item) => {
83
+ setModalState((s) => {
84
+ s.content = item.content
85
+ s.open = true
86
+ s.type = item.actionType
87
+ })
88
+ }
89
+
90
+ return (
91
+ <>
92
+ <AnchorElement
93
+ anchor={anchor}
94
+ loading={loading}
95
+ button={button}
96
+ icon={icon}
97
+ handleClick={handleClick}
98
+ />
99
+ <StyledMenu
100
+ elevation={0}
101
+ id="basic-menu"
102
+ anchorEl={anchorEl}
103
+ keepMounted
104
+ open={open}
105
+ onClose={handleClose}
106
+ PaperProps={{
107
+ elevation: 0,
108
+ }}
109
+ MenuListProps={{ ...menuListProps }}
110
+ anchorOrigin={{
111
+ vertical: 'bottom',
112
+ horizontal: 'right',
113
+ }}
114
+ transitionDuration={150}
115
+ transformOrigin={{
116
+ vertical: 'top',
117
+ horizontal: 'right',
118
+ }}
119
+ {...menuProps}
120
+ >
121
+ {menu.map((item, index) => (
122
+ <RenderMenuItem
123
+ onModalOpen={() => onModalOpen(item)}
124
+ modalState={modalState}
125
+ key={index}
126
+ handleClose={handleClose}
127
+ label={item.label}
128
+ actionType={item?.actionType}
129
+ onClick={item?.onClick}
130
+ />
131
+ ))}
132
+ </StyledMenu>
133
+ {modalState?.open && (
134
+ <RenderContent
135
+ onClose={onModalClose}
136
+ modalState={modalState}
137
+ contentType={modalState.type}
138
+ />
139
+ )}
140
+ </>
141
+ )
142
+ }
143
+
144
+ export default DropDownButton
145
+
146
+ const RenderContent = ({
147
+ contentType,
148
+ modalState,
149
+ onClose,
150
+ }: {
151
+ contentType: MenuItemType
152
+ modalState: any
153
+ onClose: () => void
154
+ }) => {
155
+ if (contentType === 'dialog')
156
+ return (
157
+ <CustomDialog
158
+ onClose={onClose}
159
+ open={modalState.open}
160
+ content={modalState.content}
161
+ title="Dialog Button"
162
+ />
163
+ )
164
+
165
+ if (contentType === 'drawer')
166
+ return (
167
+ <CustomDrawer
168
+ onClose={onClose}
169
+ open={modalState.open}
170
+ content={modalState.content}
171
+ title="Dialog Button"
172
+ />
173
+ )
174
+ return <></>
175
+ }
@@ -0,0 +1,100 @@
1
+ import { ListItemIcon, ListItemText, styled } from '@mui/material'
2
+ import { ReactNode } from 'react'
3
+ import { Link } from 'react-router-dom'
4
+ import { DrawerButtonProps } from '../ModalButtons/DrawerButton'
5
+ import { StyledMenuItem } from './styles'
6
+
7
+ const StyledLink = styled(Link)(({ theme }) => ({
8
+ display: 'block',
9
+ textTransform: 'none',
10
+ textDecoration: 'none',
11
+ }))
12
+
13
+ export type MenuItemType = 'normal' | 'dialog' | 'drawer' | 'link'
14
+
15
+ export type MenuItemButtonProps = {
16
+ icon?: ReactNode
17
+ label: ReactNode
18
+ onClick: () => void
19
+ link?: {
20
+ to: string
21
+ target?: '_self' | '_blank'
22
+ }
23
+ }
24
+
25
+ const MenuItemButton = ({
26
+ icon,
27
+ label,
28
+ onClick,
29
+ ...props
30
+ }: MenuItemButtonProps) => {
31
+ return (
32
+ <StyledMenuItem
33
+ sx={{ minWidth: '180px', width: '100%' }}
34
+ onClick={onClick}
35
+ {...props}
36
+ >
37
+ {icon && <ListItemIcon>{icon}</ListItemIcon>}
38
+ <ListItemText>{label}</ListItemText>
39
+ </StyledMenuItem>
40
+ )
41
+ }
42
+
43
+ export type IMenuItemProps = Omit<MenuItemButtonProps, 'onClick'> & {
44
+ content?: DrawerButtonProps['content']
45
+ contentTitle?: ReactNode
46
+ actionType?: MenuItemType
47
+ onClick?: () => void
48
+ }
49
+
50
+ export interface IRenderMenuItemProps extends IMenuItemProps {
51
+ handleClose: () => void
52
+ modalState: any
53
+ onModalOpen: () => void
54
+ }
55
+
56
+ export const RenderMenuItem = ({
57
+ onClick,
58
+ actionType = 'normal',
59
+ handleClose,
60
+ modalState,
61
+ onModalOpen,
62
+ link,
63
+ ...props
64
+ }: IRenderMenuItemProps) => {
65
+ const renderMenuItem: Record<MenuItemType, ReactNode> = {
66
+ normal: (
67
+ <MenuItemButton
68
+ {...props}
69
+ onClick={() => {
70
+ onClick()
71
+ handleClose()
72
+ }}
73
+ />
74
+ ),
75
+ dialog: (
76
+ <MenuItemButton
77
+ {...props}
78
+ onClick={() => {
79
+ onModalOpen()
80
+ handleClose()
81
+ }}
82
+ />
83
+ ),
84
+ drawer: (
85
+ <MenuItemButton
86
+ {...props}
87
+ onClick={() => {
88
+ onModalOpen()
89
+ handleClose()
90
+ }}
91
+ />
92
+ ),
93
+ link: (
94
+ <StyledLink to={link?.to ?? ''} target={link.target ?? '_blank'}>
95
+ <MenuItemButton onClick={() => {}} {...props} />
96
+ </StyledLink>
97
+ ),
98
+ }
99
+ return <>{renderMenuItem[actionType]}</>
100
+ }
@@ -1 +1 @@
1
- export { default } from './DropDownButton'
1
+ export { default } from './DropDownButton'