@asaleh37/ui-base 25.6.19-6 → 25.6.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 (162) hide show
  1. package/.github/workflows/publish-npm.yml +49 -0
  2. package/README.md +51 -51
  3. package/dist/index.d.ts +5 -0
  4. package/dist/index.js +6 -6
  5. package/dist/index.js.map +1 -1
  6. package/dist/index.mjs +6 -6
  7. package/dist/index.mjs.map +1 -1
  8. package/eslint.config.js +29 -29
  9. package/index.html +13 -13
  10. package/package.json +120 -120
  11. package/public/no_user.png +0 -0
  12. package/rollup.config-1748377725725.cjs +50 -50
  13. package/rollup.config.js +45 -45
  14. package/src/components/App.tsx +123 -123
  15. package/src/components/BaseApp.tsx +53 -53
  16. package/src/components/administration/admin/OrgMemberRoleForm.tsx +83 -83
  17. package/src/components/administration/admin/OrganizationApplicationModuleGrid.tsx +107 -107
  18. package/src/components/administration/admin/OrganizationGrid.tsx +118 -82
  19. package/src/components/administration/admin/OrganizationMemberGrid.tsx +176 -176
  20. package/src/components/administration/admin/OrganizationMemberRoleGrid.tsx +87 -87
  21. package/src/components/administration/admin/OrganizationRankGrid.tsx +133 -133
  22. package/src/components/administration/admin/OrganizationUnitGrid.tsx +143 -143
  23. package/src/components/administration/admin/OrganizationUnitTypeGrid.tsx +108 -108
  24. package/src/components/administration/admin/PersonGrid.tsx +334 -231
  25. package/src/components/administration/admin/RoleAuthoritiesForm.tsx +82 -82
  26. package/src/components/administration/admin/SystemApplicationAuthorityGrid.tsx +117 -126
  27. package/src/components/administration/admin/SystemApplicationGrid.tsx +83 -83
  28. package/src/components/administration/admin/SystemApplicationModuleGrid.tsx +96 -96
  29. package/src/components/administration/admin/SystemApplicationRoleAuthorityGrid.tsx +75 -67
  30. package/src/components/administration/admin/SystemApplicationRoleGrid.tsx +116 -116
  31. package/src/components/administration/dev/AttachmentConfigGrid.tsx +223 -223
  32. package/src/components/administration/dev/AttachmentGrid.tsx +172 -172
  33. package/src/components/administration/dev/BluePrintGrid.tsx +129 -129
  34. package/src/components/administration/dev/DashboardGrid.tsx +173 -173
  35. package/src/components/administration/dev/DashboardWidgetGrid.tsx +164 -164
  36. package/src/components/administration/dev/DataQueryGrid.tsx +206 -206
  37. package/src/components/administration/dev/DataQueryParameterGrid.tsx +191 -191
  38. package/src/components/administration/dev/DataQueryParametersForm.tsx +84 -84
  39. package/src/components/administration/dev/DatasourceConnectionGrid.tsx +150 -150
  40. package/src/components/administration/dev/EntityParameterGrid.tsx +279 -279
  41. package/src/components/administration/dev/LookupGrid.tsx +120 -120
  42. package/src/components/administration/dev/MailAttachmentGrid.tsx +155 -155
  43. package/src/components/administration/dev/MailBodyGrid.tsx +216 -216
  44. package/src/components/administration/dev/MailNotificationQueueGrid.tsx +245 -245
  45. package/src/components/administration/dev/MailRecipientGrid.tsx +169 -169
  46. package/src/components/administration/dev/MailSenderConfigGrid.tsx +478 -478
  47. package/src/components/administration/dev/MailTemplateGrid.tsx +384 -384
  48. package/src/components/administration/dev/NotificationGrid.tsx +432 -432
  49. package/src/components/administration/dev/NotificationQueueGrid.tsx +222 -222
  50. package/src/components/administration/dev/ReportGrid.tsx +506 -506
  51. package/src/components/administration/dev/ReportParameterGrid.tsx +186 -186
  52. package/src/components/administration/dev/ReportParametersForm.tsx +84 -84
  53. package/src/components/administration/dev/WidgetGrid.tsx +431 -431
  54. package/src/components/administration/dev/WorkflowDocumentActionGrid.tsx +264 -264
  55. package/src/components/administration/dev/WorkflowDocumentActionHistoryGrid.tsx +172 -172
  56. package/src/components/administration/dev/WorkflowDocumentActionMailGrid.tsx +161 -161
  57. package/src/components/administration/dev/WorkflowDocumentGrid.tsx +377 -377
  58. package/src/components/administration/dev/WorkflowDocumentMailLogGrid.tsx +218 -218
  59. package/src/components/administration/dev/WorkflowDocumentStatusGrid.tsx +243 -243
  60. package/src/components/common/ChangeOrgForm.tsx +81 -81
  61. package/src/components/common/Home.tsx +43 -43
  62. package/src/components/common/LanguageSwitcher.tsx +25 -25
  63. package/src/components/common/LayoutHandlers.tsx +11 -11
  64. package/src/components/common/LoadingMask.tsx +24 -24
  65. package/src/components/common/Login.tsx +214 -214
  66. package/src/components/common/MyNotificationsPanel.tsx +109 -103
  67. package/src/components/common/NotificationItem.tsx +138 -138
  68. package/src/components/index.ts +9 -9
  69. package/src/components/templates/DataEntryTemplates/DataEntryTypes.ts +324 -324
  70. package/src/components/templates/DataEntryTemplates/DataEntryUtil.ts +248 -248
  71. package/src/components/templates/DataEntryTemplates/TemplateDataForm/FormAction.tsx +60 -60
  72. package/src/components/templates/DataEntryTemplates/TemplateDataForm/FormElementField.tsx +231 -231
  73. package/src/components/templates/DataEntryTemplates/TemplateDataForm/FormElementGroup.tsx +106 -106
  74. package/src/components/templates/DataEntryTemplates/TemplateDataForm/FormFields/CheckBox.tsx +64 -64
  75. package/src/components/templates/DataEntryTemplates/TemplateDataForm/FormFields/ComboBox.tsx +93 -93
  76. package/src/components/templates/DataEntryTemplates/TemplateDataForm/FormFields/Datefield.tsx +65 -65
  77. package/src/components/templates/DataEntryTemplates/TemplateDataForm/FormFields/DatetimeField.tsx +64 -64
  78. package/src/components/templates/DataEntryTemplates/TemplateDataForm/FormFields/FiltersPanel.tsx +237 -237
  79. package/src/components/templates/DataEntryTemplates/TemplateDataForm/FormFields/SystemLookupCombobox.tsx +55 -55
  80. package/src/components/templates/DataEntryTemplates/TemplateDataForm/FormFields/TemplateTextField.tsx +17 -17
  81. package/src/components/templates/DataEntryTemplates/TemplateDataForm/TemplateForm.tsx +387 -387
  82. package/src/components/templates/DataEntryTemplates/TemplateDataGrid/DataGridColumnsUtil.tsx +189 -189
  83. package/src/components/templates/DataEntryTemplates/TemplateDataGrid/TemplateGrid.tsx +998 -998
  84. package/src/components/templates/DataEntryTemplates/TemplateDataGrid/TemplateGridMultiRecordAction.tsx +89 -89
  85. package/src/components/templates/DataEntryTemplates/TemplateDataGrid/TemplateGridRecordAction.tsx +95 -95
  86. package/src/components/templates/DataEntryTemplates/TemplateDataGrid/TemplateGridTopBar.tsx +227 -227
  87. package/src/components/templates/TransferList.tsx +257 -257
  88. package/src/components/templates/Window/ConfirmationWindow.tsx +55 -55
  89. package/src/components/templates/attachment/AttachmentCard.tsx +141 -141
  90. package/src/components/templates/attachment/AttachmentImageViewer.tsx +83 -45
  91. package/src/components/templates/attachment/AttachmentPanel.tsx +285 -271
  92. package/src/components/templates/index.ts +33 -33
  93. package/src/components/templates/report/ExcelReportViewer.tsx +71 -71
  94. package/src/components/templates/report/ReportViewer.tsx +382 -382
  95. package/src/components/templates/visuals/DashboardRouteView.tsx +9 -9
  96. package/src/components/templates/visuals/DashboardViewer.tsx +148 -148
  97. package/src/components/templates/visuals/WidgetViewer.tsx +198 -198
  98. package/src/components/templates/visuals/charts/TemplateBarChart.tsx +23 -23
  99. package/src/components/templates/visuals/charts/TemplateDataCard.tsx +35 -35
  100. package/src/components/templates/visuals/charts/TemplateGauge.tsx +21 -21
  101. package/src/components/templates/visuals/charts/TemplateLineChart.tsx +22 -22
  102. package/src/components/templates/visuals/charts/TemplateLineProgress.tsx +42 -42
  103. package/src/components/templates/visuals/charts/TemplatePieChart.tsx +24 -24
  104. package/src/components/templates/workflow/WorkflowDocumentPanel.tsx +606 -606
  105. package/src/components/templates/workflow/WorkflowDocumentTimeLine.tsx +140 -140
  106. package/src/components/templates/workflow/WorkflowRouteComponent.tsx +14 -14
  107. package/src/hooks/UseConfirmationWindow.tsx +54 -54
  108. package/src/hooks/UseMobile.tsx +13 -13
  109. package/src/hooks/UseSession.tsx +59 -40
  110. package/src/hooks/UseWindow.tsx +107 -107
  111. package/src/hooks/index.ts +7 -7
  112. package/src/hooks/useApiActions.ts +124 -124
  113. package/src/hooks/useAxios.tsx +316 -316
  114. package/src/hooks/useInterval.tsx +23 -23
  115. package/src/hooks/useLoadingMask.tsx +16 -16
  116. package/src/hooks/useLookupGridColumn.tsx +35 -35
  117. package/src/index.ts +4 -4
  118. package/src/layout/DrawerHeader.tsx +10 -10
  119. package/src/layout/Layout.tsx +90 -90
  120. package/src/layout/MainContent.tsx +117 -114
  121. package/src/layout/MobileDrawer.tsx +103 -103
  122. package/src/layout/NavigationTree.tsx +298 -293
  123. package/src/layout/NotificationButton.tsx +207 -207
  124. package/src/layout/RouteWrapper.tsx +63 -36
  125. package/src/layout/SideBar.tsx +85 -85
  126. package/src/layout/TopBar.tsx +229 -215
  127. package/src/locales/arabic/adminLocalsAr.json +93 -93
  128. package/src/locales/arabic/common.json +44 -44
  129. package/src/locales/arabic/devLocalsAr.json +317 -317
  130. package/src/locales/arabic/index.ts +9 -9
  131. package/src/locales/english/adminLocalsEn.json +96 -96
  132. package/src/locales/english/common.json +43 -43
  133. package/src/locales/english/devLocalsEn.json +318 -318
  134. package/src/locales/english/index.ts +9 -9
  135. package/src/locales/i18n.ts +8 -8
  136. package/src/locales/index.ts +9 -9
  137. package/src/main.tsx +23 -23
  138. package/src/navigationItems/Administration/adminNavigationItems.tsx +223 -222
  139. package/src/navigationItems/Administration/index.tsx +16 -16
  140. package/src/navigationItems/common/CommonNavigationItems.tsx +12 -12
  141. package/src/navigationItems/common/index.tsx +7 -7
  142. package/src/navigationItems/index.tsx +35 -34
  143. package/src/redux/features/administration/AdministrationStoresMetaData.ts +148 -126
  144. package/src/redux/features/common/AppInfoSlice.ts +65 -63
  145. package/src/redux/features/common/AppLayoutSlice.ts +29 -29
  146. package/src/redux/features/common/CommonStoreSlice.ts +44 -44
  147. package/src/redux/features/common/LoadingMaskSlice.ts +30 -30
  148. package/src/redux/features/common/SideBarSlice.ts +27 -27
  149. package/src/redux/features/common/UserSessionSlice.ts +54 -54
  150. package/src/redux/store.ts +29 -29
  151. package/src/routes/administration/adminRoutes.tsx +99 -99
  152. package/src/routes/administration/devRoutes.tsx +129 -129
  153. package/src/routes/administration/index.ts +8 -8
  154. package/src/routes/index.ts +11 -11
  155. package/src/routes/types/index.ts +6 -5
  156. package/src/styles/index.css +19 -19
  157. package/src/types/index.ts +8 -8
  158. package/src/util/AppUtils.ts +53 -53
  159. package/src/util/constants.ts +6 -6
  160. package/src/util/index.ts +2 -2
  161. package/tsconfig.json +135 -135
  162. package/vite.config.ts +24 -36
@@ -1,85 +1,85 @@
1
- import Divider from "@mui/material/Divider";
2
- import IconButton from "@mui/material/IconButton";
3
- import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
4
- import Drawer from "@mui/material/Drawer";
5
- import { useDispatch, useSelector } from "react-redux";
6
- import { DrawerHeader } from "./DrawerHeader";
7
- import { Box, Typography, useTheme } from "@mui/material";
8
- import { DRAWER_WIDTH } from "../redux/features/common/AppLayoutSlice";
9
- import NavigationTree from "./NavigationTree";
10
- import { useSession } from "../hooks";
11
- import { toggleSideBarState } from "../redux/features/common/SideBarSlice";
12
-
13
- const SideBar: React.FC = () => {
14
- const AppInfo = useSelector((state: any) => state.AppInfo.value);
15
- const { UserSession } = useSession();
16
- const currentOrganization = UserSession.value.currentOrganization;
17
- const theme = useTheme();
18
- const AppLayout = useSelector((state: any) => state.AppLayout);
19
- const SideBarState = useSelector((state: any) => state.SideBar);
20
- const dispatch = useDispatch();
21
- const toggleSideBar = () => {
22
- dispatch(toggleSideBarState());
23
- };
24
- return (
25
- <Drawer
26
- sx={{
27
- width: DRAWER_WIDTH,
28
- flexShrink: 0,
29
- "& .MuiDrawer-paper": {
30
- width: DRAWER_WIDTH,
31
- boxSizing: "border-box",
32
- },
33
- }}
34
- variant="persistent"
35
- anchor={AppLayout.appDirection === "ltr" ? "left" : "right"}
36
- open={SideBarState.isOpened}
37
- >
38
- <DrawerHeader>
39
- <Box sx={{ width: "100%" }}>
40
- <Typography
41
- color="primary"
42
- sx={{
43
- width: "100%",
44
- textAlign: "center",
45
- fontSize: 18,
46
- fontWeight: "bold",
47
- }}
48
- >
49
- System Content
50
- </Typography>
51
- <Box
52
- sx={{
53
- display: "flex",
54
- alignItems: "center",
55
- justifyContent: "space-around",
56
- marginTop: 1,
57
- }}
58
- >
59
- <Typography sx={{ fontSize: 12 }} color="textDisabled">
60
- {`${AppInfo.appName} - ${
61
- AppLayout.appDirection === "ltr"
62
- ? currentOrganization?.organizationEnName
63
- : currentOrganization?.organizationArName
64
- }`}
65
- </Typography>
66
- <Typography sx={{ fontSize: 12 }} color="textDisabled">
67
- V.{AppInfo.appVersion}
68
- </Typography>
69
- </Box>
70
- </Box>
71
- <IconButton onClick={toggleSideBar}>
72
- {theme.direction === "ltr" ? (
73
- <FontAwesomeIcon icon="angle-left" />
74
- ) : (
75
- <FontAwesomeIcon icon="angle-right" />
76
- )}
77
- </IconButton>
78
- </DrawerHeader>
79
- <Divider />
80
- <NavigationTree />
81
- </Drawer>
82
- );
83
- };
84
-
85
- export default SideBar;
1
+ import Divider from "@mui/material/Divider";
2
+ import IconButton from "@mui/material/IconButton";
3
+ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
4
+ import Drawer from "@mui/material/Drawer";
5
+ import { useDispatch, useSelector } from "react-redux";
6
+ import { DrawerHeader } from "./DrawerHeader";
7
+ import { Box, Typography, useTheme } from "@mui/material";
8
+ import { DRAWER_WIDTH } from "../redux/features/common/AppLayoutSlice";
9
+ import NavigationTree from "./NavigationTree";
10
+ import { useSession } from "../hooks";
11
+ import { toggleSideBarState } from "../redux/features/common/SideBarSlice";
12
+
13
+ const SideBar: React.FC = () => {
14
+ const AppInfo = useSelector((state: any) => state.AppInfo.value);
15
+ const { UserSession } = useSession();
16
+ const currentOrganization = UserSession.value.currentOrganization;
17
+ const theme = useTheme();
18
+ const AppLayout = useSelector((state: any) => state.AppLayout);
19
+ const SideBarState = useSelector((state: any) => state.SideBar);
20
+ const dispatch = useDispatch();
21
+ const toggleSideBar = () => {
22
+ dispatch(toggleSideBarState());
23
+ };
24
+ return (
25
+ <Drawer
26
+ sx={{
27
+ width: DRAWER_WIDTH,
28
+ flexShrink: 0,
29
+ "& .MuiDrawer-paper": {
30
+ width: DRAWER_WIDTH,
31
+ boxSizing: "border-box",
32
+ },
33
+ }}
34
+ variant="persistent"
35
+ anchor={AppLayout.appDirection === "ltr" ? "left" : "right"}
36
+ open={SideBarState.isOpened}
37
+ >
38
+ <DrawerHeader>
39
+ <Box sx={{ width: "100%" }}>
40
+ <Typography
41
+ color="primary"
42
+ sx={{
43
+ width: "100%",
44
+ textAlign: "center",
45
+ fontSize: 18,
46
+ fontWeight: "bold",
47
+ }}
48
+ >
49
+ System Content
50
+ </Typography>
51
+ <Box
52
+ sx={{
53
+ display: "flex",
54
+ alignItems: "center",
55
+ justifyContent: "space-around",
56
+ marginTop: 1,
57
+ }}
58
+ >
59
+ <Typography sx={{ fontSize: 12 }} color="textDisabled">
60
+ {`${AppInfo.appName} - ${
61
+ AppLayout.appDirection === "ltr"
62
+ ? currentOrganization?.organizationEnName
63
+ : currentOrganization?.organizationArName
64
+ }`}
65
+ </Typography>
66
+ <Typography sx={{ fontSize: 12 }} color="textDisabled">
67
+ V.{AppInfo.appVersion}
68
+ </Typography>
69
+ </Box>
70
+ </Box>
71
+ <IconButton onClick={toggleSideBar}>
72
+ {theme.direction === "ltr" ? (
73
+ <FontAwesomeIcon icon="angle-left" />
74
+ ) : (
75
+ <FontAwesomeIcon icon="angle-right" />
76
+ )}
77
+ </IconButton>
78
+ </DrawerHeader>
79
+ <Divider />
80
+ <NavigationTree />
81
+ </Drawer>
82
+ );
83
+ };
84
+
85
+ export default SideBar;
@@ -1,215 +1,229 @@
1
- import {
2
- Avatar,
3
- Box,
4
- IconButton,
5
- styled,
6
- Tooltip,
7
- Typography,
8
- } from "@mui/material";
9
- import MuiAppBar, { AppBarProps as MuiAppBarProps } from "@mui/material/AppBar";
10
- import Toolbar from "@mui/material/Toolbar";
11
- import { useDispatch, useSelector } from "react-redux";
12
- import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
13
- import { useIsMobile } from "../hooks/UseMobile";
14
- import {
15
- AppLayoutActions,
16
- DRAWER_WIDTH,
17
- } from "../redux/features/common/AppLayoutSlice";
18
- import useAxios from "../hooks/useAxios";
19
- import { UserSessionActions } from "../redux/features/common/UserSessionSlice";
20
- import i18n, { changeLanguage } from "../locales/i18n";
21
- import { useSession, useWindow } from "../hooks";
22
- import ChangeOrgForm from "../components/common/ChangeOrgForm";
23
- import { toggleSideBarState } from "../redux/features/common/SideBarSlice";
24
- import AttachmentImageViewer from "../components/templates/attachment/AttachmentImageViewer";
25
- import NotificationButton from "./NotificationButton";
26
-
27
- interface AppBarProps extends MuiAppBarProps {
28
- open?: boolean;
29
- }
30
-
31
- const AppBar = styled(MuiAppBar, {
32
- shouldForwardProp: (prop) => prop !== "open",
33
- })<AppBarProps>(({ theme }) => {
34
- const AppLayout = useSelector((state: any) => state.AppLayout);
35
- const isMobile = useIsMobile();
36
- return {
37
- transition: theme.transitions.create(["margin", "width"], {
38
- easing: theme.transitions.easing.sharp,
39
- duration: theme.transitions.duration.leavingScreen,
40
- }),
41
- variants: [
42
- {
43
- props: ({ open }) => open,
44
- style: {
45
- width: !isMobile ? `calc(100% - ${DRAWER_WIDTH}px)` : undefined,
46
- marginLeft:
47
- !isMobile && AppLayout.appDirection === "ltr"
48
- ? `${DRAWER_WIDTH}px`
49
- : undefined,
50
- marginRight:
51
- !isMobile && AppLayout.appDirection === "rtl"
52
- ? `${DRAWER_WIDTH}px`
53
- : undefined,
54
- transition: theme.transitions.create(["margin", "width"], {
55
- easing: theme.transitions.easing.easeOut,
56
- duration: theme.transitions.duration.enteringScreen,
57
- }),
58
- },
59
- },
60
- ],
61
- };
62
- });
63
-
64
- const TopBar: React.FC = () => {
65
- const { Window: ChangeOrgWindow, setWindowState: setChangeOrgWindowState } =
66
- useWindow({
67
- windowTitle: "Change Current Organization",
68
- windowIcon: "globe",
69
- width: "fit-content",
70
- height: "fit-content",
71
- });
72
- const AppInfo = useSelector((state: any) => state.AppInfo.value);
73
- const AppLayout = useSelector((state: any) => state.AppLayout);
74
- const SideBarState = useSelector((state: any) => state.SideBar);
75
- const { UserSession } = useSession();
76
- const currentOrganization = UserSession.value.currentOrganization;
77
- const { handleGetRequest } = useAxios();
78
- const isMobile = useIsMobile();
79
- const dispatch = useDispatch();
80
- const handleLogout = async () => {
81
- try {
82
- await handleGetRequest({ endPointURI: "api/auth/logout" });
83
- } catch (error) {}
84
- dispatch(UserSessionActions.setUnAuthenticated());
85
- };
86
- const toggleSideBar = () => {
87
- dispatch(toggleSideBarState());
88
- };
89
- return (
90
- <>
91
- <ChangeOrgWindow>
92
- <ChangeOrgForm
93
- successChangeCallBackFn={() => {
94
- setChangeOrgWindowState(false);
95
- }}
96
- />
97
- </ChangeOrgWindow>
98
- <AppBar position="fixed" open={SideBarState.isOpened}>
99
- <Toolbar>
100
- <IconButton
101
- color="inherit"
102
- aria-label="open drawer"
103
- onClick={toggleSideBar}
104
- edge="start"
105
- sx={[
106
- {
107
- mr: AppLayout.appDirection === "ltr" ? 2 : undefined,
108
- ml: AppLayout.appDirection === "rtl" ? 2 : undefined,
109
- },
110
- SideBarState.isOpened && { display: "none" },
111
- ]}
112
- >
113
- <FontAwesomeIcon icon="bars" />
114
- </IconButton>
115
- <Avatar
116
- src={AppInfo.appLogo}
117
- sx={{ marginRight: 1, marginLeft: 1 }}
118
- />
119
- <Typography variant="h6" noWrap component="div" sx={{ flex: 1 }}>
120
- {isMobile
121
- ? ""
122
- : `${AppInfo.appName} - ${
123
- AppLayout.appDirection === "ltr"
124
- ? currentOrganization?.organizationEnName
125
- : currentOrganization?.organizationArName
126
- }`}
127
- </Typography>
128
- <Tooltip
129
- title={
130
- AppLayout.themeMode === "light"
131
- ? "Switch Theme to Dark"
132
- : "Switch Theme to Light"
133
- }
134
- >
135
- <IconButton
136
- color="inherit"
137
- onClick={() => {
138
- dispatch(
139
- AppLayoutActions.setThemeMode(
140
- AppLayout.themeMode === "light" ? "dark" : "light"
141
- )
142
- );
143
- localStorage.setItem(
144
- "themeMode",
145
- AppLayout.themeMode === "light" ? "dark" : "light"
146
- );
147
- }}
148
- >
149
- {AppLayout.themeMode === "light" ? (
150
- <FontAwesomeIcon icon="moon" />
151
- ) : (
152
- <FontAwesomeIcon icon={{ prefix: "far", iconName: "sun" }} />
153
- )}
154
- </IconButton>
155
- </Tooltip>
156
- <Tooltip
157
- title={
158
- i18n.language === "ar"
159
- ? "Change Language To English"
160
- : "Change Language To Arabic"
161
- }
162
- >
163
- <IconButton
164
- color="inherit"
165
- onClick={() => {
166
- let nextLanguage = i18n.language === "ar" ? "en" : "ar";
167
- changeLanguage(nextLanguage);
168
- dispatch(
169
- AppLayoutActions.setAppDirection(
170
- nextLanguage === "ar" ? "rtl" : "ltr"
171
- )
172
- );
173
- }}
174
- >
175
- <FontAwesomeIcon icon="language" />
176
- </IconButton>
177
- </Tooltip>
178
- {UserSession.value?.userOrganizations &&
179
- UserSession.value?.userOrganizations.length > 1 ? (
180
- <Tooltip title="Change Current Organization">
181
- <IconButton
182
- color="inherit"
183
- onClick={() => {
184
- setChangeOrgWindowState(true);
185
- }}
186
- >
187
- <FontAwesomeIcon icon="globe" />
188
- </IconButton>
189
- </Tooltip>
190
- ) : (
191
- <></>
192
- )}
193
-
194
- <NotificationButton />
195
- <AttachmentImageViewer
196
- showAsAvatar={true}
197
- attachmentCode="EMPLOYEE_PHOTOS"
198
- refKey={UserSession.value?.id + ""}
199
- />
200
- <div style={{ marginLeft: 5, marginRight: 5 }}>
201
- {isMobile ? "" : UserSession.value?.username}
202
- </div>
203
- <IconButton color="inherit" onClick={handleLogout}>
204
- <FontAwesomeIcon
205
- rotation={AppLayout.appDirection === "rtl" ? 180 : undefined}
206
- icon="arrow-right-from-bracket"
207
- />
208
- </IconButton>
209
- </Toolbar>
210
- </AppBar>
211
- </>
212
- );
213
- };
214
-
215
- export default TopBar;
1
+ import {
2
+ Avatar,
3
+ Box,
4
+ IconButton,
5
+ styled,
6
+ Tooltip,
7
+ Typography,
8
+ } from "@mui/material";
9
+ import MuiAppBar, { AppBarProps as MuiAppBarProps } from "@mui/material/AppBar";
10
+ import Toolbar from "@mui/material/Toolbar";
11
+ import { useDispatch, useSelector } from "react-redux";
12
+ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
13
+ import { useIsMobile } from "../hooks/UseMobile";
14
+ import {
15
+ AppLayoutActions,
16
+ DRAWER_WIDTH,
17
+ } from "../redux/features/common/AppLayoutSlice";
18
+ import useAxios from "../hooks/useAxios";
19
+ import { UserSessionActions } from "../redux/features/common/UserSessionSlice";
20
+ import i18n, { changeLanguage } from "../locales/i18n";
21
+ import { useSession, useWindow } from "../hooks";
22
+ import ChangeOrgForm from "../components/common/ChangeOrgForm";
23
+ import { toggleSideBarState } from "../redux/features/common/SideBarSlice";
24
+ import AttachmentImageViewer from "../components/templates/attachment/AttachmentImageViewer";
25
+ import NotificationButton from "./NotificationButton";
26
+
27
+ interface AppBarProps extends MuiAppBarProps {
28
+ open?: boolean;
29
+ }
30
+
31
+ const AppBar = styled(MuiAppBar, {
32
+ shouldForwardProp: (prop) => prop !== "open",
33
+ })<AppBarProps>(({ theme }) => {
34
+ const AppLayout = useSelector((state: any) => state.AppLayout);
35
+ const isMobile = useIsMobile();
36
+ return {
37
+ transition: theme.transitions.create(["margin", "width"], {
38
+ easing: theme.transitions.easing.sharp,
39
+ duration: theme.transitions.duration.leavingScreen,
40
+ }),
41
+ variants: [
42
+ {
43
+ props: ({ open }) => open,
44
+ style: {
45
+ width: !isMobile ? `calc(100% - ${DRAWER_WIDTH}px)` : undefined,
46
+ marginLeft:
47
+ !isMobile && AppLayout.appDirection === "ltr"
48
+ ? `${DRAWER_WIDTH}px`
49
+ : undefined,
50
+ marginRight:
51
+ !isMobile && AppLayout.appDirection === "rtl"
52
+ ? `${DRAWER_WIDTH}px`
53
+ : undefined,
54
+ transition: theme.transitions.create(["margin", "width"], {
55
+ easing: theme.transitions.easing.easeOut,
56
+ duration: theme.transitions.duration.enteringScreen,
57
+ }),
58
+ },
59
+ },
60
+ ],
61
+ };
62
+ });
63
+
64
+ const TopBar: React.FC = () => {
65
+ const { Window: ChangeOrgWindow, setWindowState: setChangeOrgWindowState } =
66
+ useWindow({
67
+ windowTitle: "Change Current Organization",
68
+ windowIcon: "globe",
69
+ width: "fit-content",
70
+ height: "fit-content",
71
+ });
72
+ const AppInfo = useSelector((state: any) => state.AppInfo.value);
73
+ const AppLayout = useSelector((state: any) => state.AppLayout);
74
+ const SideBarState = useSelector((state: any) => state.SideBar);
75
+ const { UserSession } = useSession();
76
+ const currentOrganization = UserSession.value.currentOrganization;
77
+ const { handleGetRequest } = useAxios();
78
+ const isMobile = useIsMobile();
79
+ const dispatch = useDispatch();
80
+ const handleLogout = async () => {
81
+ try {
82
+ await handleGetRequest({ endPointURI: "api/auth/logout" });
83
+ } catch (error) {}
84
+ dispatch(UserSessionActions.setUnAuthenticated());
85
+ };
86
+ const toggleSideBar = () => {
87
+ dispatch(toggleSideBarState());
88
+ };
89
+ return (
90
+ <>
91
+ <ChangeOrgWindow>
92
+ <ChangeOrgForm
93
+ successChangeCallBackFn={() => {
94
+ setChangeOrgWindowState(false);
95
+ }}
96
+ />
97
+ </ChangeOrgWindow>
98
+ <AppBar position="fixed" open={SideBarState.isOpened}>
99
+ <Toolbar>
100
+ <IconButton
101
+ color="inherit"
102
+ aria-label="open drawer"
103
+ onClick={toggleSideBar}
104
+ edge="start"
105
+ sx={[
106
+ {
107
+ mr: AppLayout.appDirection === "ltr" ? 2 : undefined,
108
+ ml: AppLayout.appDirection === "rtl" ? 2 : undefined,
109
+ },
110
+ SideBarState.isOpened && { display: "none" },
111
+ ]}
112
+ >
113
+ <FontAwesomeIcon icon="bars" />
114
+ </IconButton>
115
+ <AttachmentImageViewer
116
+ showAsAvatar={true}
117
+ attachmentCode="ORGANIZATION_LOGOS"
118
+ refKey={UserSession.value.currentOrganization.id + ""}
119
+ onErrorImage="/logo.png"
120
+ style={{
121
+ marginRight: 1,
122
+ marginLeft: 1,
123
+ }}
124
+ />
125
+ {/* <Avatar
126
+ src={AppInfo.appLogo}
127
+ sx={{ marginRight: 1, marginLeft: 1 }}
128
+ /> */}
129
+ <Typography variant="h6" noWrap component="div" sx={{ flex: 1 }}>
130
+ {isMobile
131
+ ? ""
132
+ : `${AppInfo.appName} - ${
133
+ AppLayout.appDirection === "ltr"
134
+ ? currentOrganization?.organizationEnName
135
+ : currentOrganization?.organizationArName
136
+ }`}
137
+ </Typography>
138
+ <Tooltip
139
+ title={
140
+ AppLayout.themeMode === "light"
141
+ ? "Switch Theme to Dark"
142
+ : "Switch Theme to Light"
143
+ }
144
+ >
145
+ <IconButton
146
+ color="inherit"
147
+ onClick={() => {
148
+ dispatch(
149
+ AppLayoutActions.setThemeMode(
150
+ AppLayout.themeMode === "light" ? "dark" : "light"
151
+ )
152
+ );
153
+ localStorage.setItem(
154
+ "themeMode",
155
+ AppLayout.themeMode === "light" ? "dark" : "light"
156
+ );
157
+ }}
158
+ >
159
+ {AppLayout.themeMode === "light" ? (
160
+ <FontAwesomeIcon icon="moon" />
161
+ ) : (
162
+ <FontAwesomeIcon icon={{ prefix: "far", iconName: "sun" }} />
163
+ )}
164
+ </IconButton>
165
+ </Tooltip>
166
+ <Tooltip
167
+ title={
168
+ i18n.language === "ar"
169
+ ? "Change Language To English"
170
+ : "Change Language To Arabic"
171
+ }
172
+ >
173
+ <IconButton
174
+ color="inherit"
175
+ onClick={() => {
176
+ let nextLanguage = i18n.language === "ar" ? "en" : "ar";
177
+ changeLanguage(nextLanguage);
178
+ dispatch(
179
+ AppLayoutActions.setAppDirection(
180
+ nextLanguage === "ar" ? "rtl" : "ltr"
181
+ )
182
+ );
183
+ }}
184
+ >
185
+ <FontAwesomeIcon icon="language" />
186
+ </IconButton>
187
+ </Tooltip>
188
+ {UserSession.value?.userOrganizations &&
189
+ UserSession.value?.userOrganizations.length > 1 ? (
190
+ <Tooltip title="Change Current Organization">
191
+ <IconButton
192
+ color="inherit"
193
+ onClick={() => {
194
+ setChangeOrgWindowState(true);
195
+ }}
196
+ >
197
+ <FontAwesomeIcon icon="globe" />
198
+ </IconButton>
199
+ </Tooltip>
200
+ ) : (
201
+ <></>
202
+ )}
203
+ {AppInfo?.enableUINotifications === true ? (
204
+ <NotificationButton />
205
+ ) : (
206
+ <></>
207
+ )}
208
+ <AttachmentImageViewer
209
+ showAsAvatar={true}
210
+ onErrorImage="/no_user.png"
211
+ attachmentCode="EMPLOYEE_PHOTOS"
212
+ refKey={UserSession.value?.id + ""}
213
+ />
214
+ <div style={{ marginLeft: 5, marginRight: 5 }}>
215
+ {isMobile ? "" : UserSession.value?.username}
216
+ </div>
217
+ <IconButton color="inherit" onClick={handleLogout}>
218
+ <FontAwesomeIcon
219
+ rotation={AppLayout.appDirection === "rtl" ? 180 : undefined}
220
+ icon="arrow-right-from-bracket"
221
+ />
222
+ </IconButton>
223
+ </Toolbar>
224
+ </AppBar>
225
+ </>
226
+ );
227
+ };
228
+
229
+ export default TopBar;