@asaleh37/ui-base 25.6.1 → 25.6.2-0.1

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 (160) hide show
  1. package/.github/workflows/publish-npm.yml +31 -0
  2. package/README.md +51 -51
  3. package/dist/index.js +1 -1
  4. package/dist/index.js.map +1 -1
  5. package/dist/index.mjs +1 -1
  6. package/dist/index.mjs.map +1 -1
  7. package/eslint.config.js +29 -29
  8. package/index.html +13 -13
  9. package/package.json +120 -120
  10. package/rollup.config-1748377725725.cjs +50 -50
  11. package/rollup.config.js +45 -45
  12. package/src/components/App.tsx +123 -123
  13. package/src/components/BaseApp.tsx +53 -53
  14. package/src/components/administration/admin/OrgMemberRoleForm.tsx +83 -83
  15. package/src/components/administration/admin/OrganizationApplicationModuleGrid.tsx +107 -107
  16. package/src/components/administration/admin/OrganizationGrid.tsx +82 -82
  17. package/src/components/administration/admin/OrganizationMemberGrid.tsx +176 -176
  18. package/src/components/administration/admin/OrganizationMemberRoleGrid.tsx +87 -87
  19. package/src/components/administration/admin/OrganizationRankGrid.tsx +133 -133
  20. package/src/components/administration/admin/OrganizationUnitGrid.tsx +143 -143
  21. package/src/components/administration/admin/OrganizationUnitTypeGrid.tsx +108 -108
  22. package/src/components/administration/admin/PersonGrid.tsx +231 -231
  23. package/src/components/administration/admin/RoleAuthoritiesForm.tsx +82 -82
  24. package/src/components/administration/admin/SystemApplicationAuthorityGrid.tsx +126 -126
  25. package/src/components/administration/admin/SystemApplicationGrid.tsx +83 -83
  26. package/src/components/administration/admin/SystemApplicationModuleGrid.tsx +96 -96
  27. package/src/components/administration/admin/SystemApplicationRoleAuthorityGrid.tsx +67 -67
  28. package/src/components/administration/admin/SystemApplicationRoleGrid.tsx +116 -116
  29. package/src/components/administration/dev/AttachmentConfigGrid.tsx +223 -223
  30. package/src/components/administration/dev/AttachmentGrid.tsx +172 -172
  31. package/src/components/administration/dev/BluePrintGrid.tsx +129 -129
  32. package/src/components/administration/dev/DashboardGrid.tsx +173 -173
  33. package/src/components/administration/dev/DashboardWidgetGrid.tsx +164 -164
  34. package/src/components/administration/dev/DataQueryGrid.tsx +206 -206
  35. package/src/components/administration/dev/DataQueryParameterGrid.tsx +191 -191
  36. package/src/components/administration/dev/DataQueryParametersForm.tsx +84 -84
  37. package/src/components/administration/dev/DatasourceConnectionGrid.tsx +150 -150
  38. package/src/components/administration/dev/EntityParameterGrid.tsx +279 -279
  39. package/src/components/administration/dev/LookupGrid.tsx +120 -120
  40. package/src/components/administration/dev/MailAttachmentGrid.tsx +155 -155
  41. package/src/components/administration/dev/MailBodyGrid.tsx +216 -216
  42. package/src/components/administration/dev/MailNotificationQueueGrid.tsx +245 -245
  43. package/src/components/administration/dev/MailRecipientGrid.tsx +169 -169
  44. package/src/components/administration/dev/MailSenderConfigGrid.tsx +478 -478
  45. package/src/components/administration/dev/MailTemplateGrid.tsx +384 -384
  46. package/src/components/administration/dev/NotificationGrid.tsx +432 -432
  47. package/src/components/administration/dev/NotificationQueueGrid.tsx +222 -222
  48. package/src/components/administration/dev/ReportGrid.tsx +506 -506
  49. package/src/components/administration/dev/ReportParameterGrid.tsx +186 -186
  50. package/src/components/administration/dev/ReportParametersForm.tsx +84 -84
  51. package/src/components/administration/dev/WidgetGrid.tsx +431 -431
  52. package/src/components/administration/dev/WorkflowDocumentActionGrid.tsx +264 -264
  53. package/src/components/administration/dev/WorkflowDocumentActionHistoryGrid.tsx +172 -172
  54. package/src/components/administration/dev/WorkflowDocumentActionMailGrid.tsx +161 -161
  55. package/src/components/administration/dev/WorkflowDocumentGrid.tsx +377 -377
  56. package/src/components/administration/dev/WorkflowDocumentMailLogGrid.tsx +218 -218
  57. package/src/components/administration/dev/WorkflowDocumentStatusGrid.tsx +243 -243
  58. package/src/components/common/ChangeOrgForm.tsx +81 -81
  59. package/src/components/common/Home.tsx +43 -43
  60. package/src/components/common/LanguageSwitcher.tsx +25 -25
  61. package/src/components/common/LayoutHandlers.tsx +11 -11
  62. package/src/components/common/LoadingMask.tsx +24 -24
  63. package/src/components/common/Login.tsx +214 -214
  64. package/src/components/common/MyNotificationsPanel.tsx +103 -103
  65. package/src/components/common/NotificationItem.tsx +138 -138
  66. package/src/components/index.ts +9 -9
  67. package/src/components/templates/DataEntryTemplates/DataEntryTypes.ts +324 -324
  68. package/src/components/templates/DataEntryTemplates/DataEntryUtil.ts +248 -248
  69. package/src/components/templates/DataEntryTemplates/TemplateDataForm/FormAction.tsx +60 -60
  70. package/src/components/templates/DataEntryTemplates/TemplateDataForm/FormElementField.tsx +231 -231
  71. package/src/components/templates/DataEntryTemplates/TemplateDataForm/FormElementGroup.tsx +106 -106
  72. package/src/components/templates/DataEntryTemplates/TemplateDataForm/FormFields/CheckBox.tsx +64 -64
  73. package/src/components/templates/DataEntryTemplates/TemplateDataForm/FormFields/ComboBox.tsx +93 -93
  74. package/src/components/templates/DataEntryTemplates/TemplateDataForm/FormFields/Datefield.tsx +65 -65
  75. package/src/components/templates/DataEntryTemplates/TemplateDataForm/FormFields/DatetimeField.tsx +64 -64
  76. package/src/components/templates/DataEntryTemplates/TemplateDataForm/FormFields/FiltersPanel.tsx +237 -237
  77. package/src/components/templates/DataEntryTemplates/TemplateDataForm/FormFields/SystemLookupCombobox.tsx +55 -55
  78. package/src/components/templates/DataEntryTemplates/TemplateDataForm/FormFields/TemplateTextField.tsx +17 -17
  79. package/src/components/templates/DataEntryTemplates/TemplateDataForm/TemplateForm.tsx +387 -387
  80. package/src/components/templates/DataEntryTemplates/TemplateDataGrid/DataGridColumnsUtil.tsx +189 -189
  81. package/src/components/templates/DataEntryTemplates/TemplateDataGrid/TemplateGrid.tsx +998 -998
  82. package/src/components/templates/DataEntryTemplates/TemplateDataGrid/TemplateGridMultiRecordAction.tsx +89 -89
  83. package/src/components/templates/DataEntryTemplates/TemplateDataGrid/TemplateGridRecordAction.tsx +95 -95
  84. package/src/components/templates/DataEntryTemplates/TemplateDataGrid/TemplateGridTopBar.tsx +227 -227
  85. package/src/components/templates/TransferList.tsx +257 -257
  86. package/src/components/templates/Window/ConfirmationWindow.tsx +55 -55
  87. package/src/components/templates/attachment/AttachmentCard.tsx +141 -141
  88. package/src/components/templates/attachment/AttachmentImageViewer.tsx +45 -45
  89. package/src/components/templates/attachment/AttachmentPanel.tsx +271 -271
  90. package/src/components/templates/index.ts +33 -33
  91. package/src/components/templates/report/ExcelReportViewer.tsx +71 -71
  92. package/src/components/templates/report/ReportViewer.tsx +382 -382
  93. package/src/components/templates/visuals/DashboardRouteView.tsx +9 -9
  94. package/src/components/templates/visuals/DashboardViewer.tsx +148 -148
  95. package/src/components/templates/visuals/WidgetViewer.tsx +198 -198
  96. package/src/components/templates/visuals/charts/TemplateBarChart.tsx +23 -23
  97. package/src/components/templates/visuals/charts/TemplateDataCard.tsx +35 -35
  98. package/src/components/templates/visuals/charts/TemplateGauge.tsx +21 -21
  99. package/src/components/templates/visuals/charts/TemplateLineChart.tsx +22 -22
  100. package/src/components/templates/visuals/charts/TemplateLineProgress.tsx +42 -42
  101. package/src/components/templates/visuals/charts/TemplatePieChart.tsx +24 -24
  102. package/src/components/templates/workflow/WorkflowDocumentPanel.tsx +606 -606
  103. package/src/components/templates/workflow/WorkflowDocumentTimeLine.tsx +140 -140
  104. package/src/components/templates/workflow/WorkflowRouteComponent.tsx +14 -14
  105. package/src/hooks/UseConfirmationWindow.tsx +54 -54
  106. package/src/hooks/UseMobile.tsx +13 -13
  107. package/src/hooks/UseSession.tsx +40 -40
  108. package/src/hooks/UseWindow.tsx +107 -107
  109. package/src/hooks/index.ts +7 -7
  110. package/src/hooks/useApiActions.ts +124 -124
  111. package/src/hooks/useAxios.tsx +316 -316
  112. package/src/hooks/useInterval.tsx +23 -23
  113. package/src/hooks/useLoadingMask.tsx +16 -16
  114. package/src/hooks/useLookupGridColumn.tsx +35 -35
  115. package/src/index.ts +4 -4
  116. package/src/layout/DrawerHeader.tsx +10 -10
  117. package/src/layout/Layout.tsx +90 -90
  118. package/src/layout/MainContent.tsx +114 -114
  119. package/src/layout/MobileDrawer.tsx +103 -103
  120. package/src/layout/NavigationTree.tsx +295 -295
  121. package/src/layout/NotificationButton.tsx +207 -207
  122. package/src/layout/RouteWrapper.tsx +36 -36
  123. package/src/layout/SideBar.tsx +85 -85
  124. package/src/layout/TopBar.tsx +215 -215
  125. package/src/locales/arabic/adminLocalsAr.json +93 -93
  126. package/src/locales/arabic/common.json +44 -44
  127. package/src/locales/arabic/devLocalsAr.json +317 -317
  128. package/src/locales/arabic/index.ts +9 -9
  129. package/src/locales/english/adminLocalsEn.json +96 -96
  130. package/src/locales/english/common.json +43 -43
  131. package/src/locales/english/devLocalsEn.json +318 -318
  132. package/src/locales/english/index.ts +9 -9
  133. package/src/locales/i18n.ts +8 -8
  134. package/src/locales/index.ts +9 -9
  135. package/src/main.tsx +23 -23
  136. package/src/navigationItems/Administration/adminNavigationItems.tsx +222 -222
  137. package/src/navigationItems/Administration/index.tsx +16 -16
  138. package/src/navigationItems/common/CommonNavigationItems.tsx +12 -12
  139. package/src/navigationItems/common/index.tsx +7 -7
  140. package/src/navigationItems/index.tsx +34 -34
  141. package/src/redux/features/administration/AdministrationStoresMetaData.ts +126 -126
  142. package/src/redux/features/common/AppInfoSlice.ts +63 -63
  143. package/src/redux/features/common/AppLayoutSlice.ts +29 -29
  144. package/src/redux/features/common/CommonStoreSlice.ts +44 -44
  145. package/src/redux/features/common/LoadingMaskSlice.ts +30 -30
  146. package/src/redux/features/common/SideBarSlice.ts +27 -27
  147. package/src/redux/features/common/UserSessionSlice.ts +54 -54
  148. package/src/redux/store.ts +29 -29
  149. package/src/routes/administration/adminRoutes.tsx +99 -99
  150. package/src/routes/administration/devRoutes.tsx +129 -129
  151. package/src/routes/administration/index.ts +8 -8
  152. package/src/routes/index.ts +11 -11
  153. package/src/routes/types/index.ts +5 -5
  154. package/src/styles/index.css +19 -19
  155. package/src/types/index.ts +8 -8
  156. package/src/util/AppUtils.ts +53 -53
  157. package/src/util/constants.ts +6 -6
  158. package/src/util/index.ts +2 -2
  159. package/tsconfig.json +135 -135
  160. package/vite.config.ts +36 -36
@@ -1,43 +1,43 @@
1
- import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
2
- import { Box } from "@mui/material";
3
- import { TemplateForm } from "../templates";
4
- import ReportViewer from "../templates/report/ReportViewer";
5
- import WorkflowDocumentPanel from "../templates/workflow/WorkflowDocumentPanel";
6
- import DashboardViewer from "../templates/visuals/DashboardViewer";
7
- import AttachmentPanel from "../templates/attachment/AttachmentPanel";
8
- import { useSelector } from "react-redux";
9
-
10
- const Home: React.FC = () => {
11
- const AppInfo = useSelector((state: any) => state.AppInfo.value);
12
- return (
13
- <Box
14
- sx={{
15
- display: "flex",
16
- flexDirection: "column",
17
- alignItems: "center",
18
- justifyContent: "center",
19
- flex: 1,
20
- fontSize: 24,
21
- fontWeight: "bold",
22
- }}
23
- >
24
- <img
25
- src={AppInfo.appLogo}
26
- style={{ margin: 5, height: 200, width: 200 }}
27
- />
28
- <div>
29
- Welcome to {AppInfo.appName} v.{AppInfo.appVersion}
30
- </div>
31
- <div style={{ fontSize: 16 }}>
32
- Use side menu [
33
- <FontAwesomeIcon
34
- icon="bars"
35
- style={{ marginLeft: 10, marginRight: 10 }}
36
- />
37
- ] to navigate to your authorized system modules
38
- </div>
39
- </Box>
40
- );
41
- };
42
-
43
- export default Home;
1
+ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
2
+ import { Box } from "@mui/material";
3
+ import { TemplateForm } from "../templates";
4
+ import ReportViewer from "../templates/report/ReportViewer";
5
+ import WorkflowDocumentPanel from "../templates/workflow/WorkflowDocumentPanel";
6
+ import DashboardViewer from "../templates/visuals/DashboardViewer";
7
+ import AttachmentPanel from "../templates/attachment/AttachmentPanel";
8
+ import { useSelector } from "react-redux";
9
+
10
+ const Home: React.FC = () => {
11
+ const AppInfo = useSelector((state: any) => state.AppInfo.value);
12
+ return (
13
+ <Box
14
+ sx={{
15
+ display: "flex",
16
+ flexDirection: "column",
17
+ alignItems: "center",
18
+ justifyContent: "center",
19
+ flex: 1,
20
+ fontSize: 24,
21
+ fontWeight: "bold",
22
+ }}
23
+ >
24
+ <img
25
+ src={AppInfo.appLogo}
26
+ style={{ margin: 5, height: 200, width: 200 }}
27
+ />
28
+ <div>
29
+ Welcome to {AppInfo.appName} v.{AppInfo.appVersion}
30
+ </div>
31
+ <div style={{ fontSize: 16 }}>
32
+ Use side menu [
33
+ <FontAwesomeIcon
34
+ icon="bars"
35
+ style={{ marginLeft: 10, marginRight: 10 }}
36
+ />
37
+ ] to navigate to your authorized system modules
38
+ </div>
39
+ </Box>
40
+ );
41
+ };
42
+
43
+ export default Home;
@@ -1,25 +1,25 @@
1
- import { changeLanguage } from "../../locales/i18n";
2
-
3
-
4
- const LanguageSwitcher: React.FC = () => {
5
- return (
6
- <div>
7
- <button
8
- onClick={() => {
9
- changeLanguage("ar");
10
- }}
11
- >
12
- arabic
13
- </button>
14
- <button
15
- onClick={() => {
16
- changeLanguage("en");
17
- }}
18
- >
19
- english
20
- </button>
21
- </div>
22
- );
23
- };
24
-
25
- export default LanguageSwitcher;
1
+ import { changeLanguage } from "../../locales/i18n";
2
+
3
+
4
+ const LanguageSwitcher: React.FC = () => {
5
+ return (
6
+ <div>
7
+ <button
8
+ onClick={() => {
9
+ changeLanguage("ar");
10
+ }}
11
+ >
12
+ arabic
13
+ </button>
14
+ <button
15
+ onClick={() => {
16
+ changeLanguage("en");
17
+ }}
18
+ >
19
+ english
20
+ </button>
21
+ </div>
22
+ );
23
+ };
24
+
25
+ export default LanguageSwitcher;
@@ -1,12 +1,12 @@
1
- import rtlPlugin from "stylis-plugin-rtl";
2
- import { prefixer } from "stylis";
3
- import createCache from "@emotion/cache";
4
-
5
- export const cacheRtl = createCache({
6
- key: "muirtl",
7
- stylisPlugins: [prefixer, rtlPlugin],
8
- });
9
-
10
- export const cacheLtr = createCache({
11
- key: "mui",
1
+ import rtlPlugin from "stylis-plugin-rtl";
2
+ import { prefixer } from "stylis";
3
+ import createCache from "@emotion/cache";
4
+
5
+ export const cacheRtl = createCache({
6
+ key: "muirtl",
7
+ stylisPlugins: [prefixer, rtlPlugin],
8
+ });
9
+
10
+ export const cacheLtr = createCache({
11
+ key: "mui",
12
12
  });
@@ -1,24 +1,24 @@
1
- import { useSelector } from "react-redux";
2
- import { Backdrop, CircularProgress } from "@mui/material";
3
- import { useTranslation } from "react-i18next";
4
-
5
- const LoadingMask: React.FC = () => {
6
- const { t } = useTranslation();
7
- const loadingMask = useSelector((state: any) => state.loadingMask.value);
8
- const AppLayoutState = useSelector((state: any) => state.AppLayout);
9
-
10
- return (
11
- <Backdrop
12
- dir={AppLayoutState.appDirection}
13
- sx={{ color: "#fff", zIndex: (theme) => theme.zIndex.drawer + 1 }}
14
- open={loadingMask.isOpened}
15
- >
16
- <CircularProgress color="inherit" />
17
- <div style={{ marginRight: 10, marginLeft: 10 }}>
18
- {loadingMask?.message || t("DEFAULT_LOADING_MESSAGE")}
19
- </div>
20
- </Backdrop>
21
- );
22
- };
23
-
24
- export default LoadingMask;
1
+ import { useSelector } from "react-redux";
2
+ import { Backdrop, CircularProgress } from "@mui/material";
3
+ import { useTranslation } from "react-i18next";
4
+
5
+ const LoadingMask: React.FC = () => {
6
+ const { t } = useTranslation();
7
+ const loadingMask = useSelector((state: any) => state.loadingMask.value);
8
+ const AppLayoutState = useSelector((state: any) => state.AppLayout);
9
+
10
+ return (
11
+ <Backdrop
12
+ dir={AppLayoutState.appDirection}
13
+ sx={{ color: "#fff", zIndex: (theme) => theme.zIndex.drawer + 1 }}
14
+ open={loadingMask.isOpened}
15
+ >
16
+ <CircularProgress color="inherit" />
17
+ <div style={{ marginRight: 10, marginLeft: 10 }}>
18
+ {loadingMask?.message || t("DEFAULT_LOADING_MESSAGE")}
19
+ </div>
20
+ </Backdrop>
21
+ );
22
+ };
23
+
24
+ export default LoadingMask;
@@ -1,214 +1,214 @@
1
- import {
2
- Box,
3
- Button,
4
- CircularProgress,
5
- createTheme,
6
- Paper,
7
- TextField,
8
- Typography,
9
- } from "@mui/material";
10
- import { useDispatch, useSelector } from "react-redux";
11
- import { ThemeProvider } from "@emotion/react";
12
- import { useEffect, useState } from "react";
13
- import axios from "axios";
14
- import { toast } from "react-toastify";
15
- import { UserSessionActions } from "../../redux/features/common/UserSessionSlice";
16
- import {
17
- DARK_THEME_INITIAL_MAIN_COLOR,
18
- DARK_THEME_INITIAL_SECANDARY_COLOR,
19
- } from "../../util";
20
-
21
- const Login: React.FC = () => {
22
- const appInfo = useSelector((state: any) => state.AppInfo.value);
23
- const [username, setUsername] = useState("");
24
- const [password, setPassword] = useState("");
25
- const [isLoginInProcess, setIsLoginInProcess] = useState(false);
26
- const UserSessionState = useSelector((state: any) => state.UserSession.value);
27
- const dispatch = useDispatch();
28
- const handleLogin = async () => {
29
- if (username == null || username == "") {
30
- toast.error("username is required to proceed");
31
- return;
32
- }
33
- if (password == null || password == "") {
34
- toast.error("password is required to proceed");
35
- return;
36
- }
37
- setIsLoginInProcess(true);
38
- let response: any = null;
39
- try {
40
- response = await axios.post(
41
- `${appInfo.apiBaseUrl}/api/auth/login`,
42
- {
43
- username,
44
- password,
45
- },
46
- {
47
- withCredentials: true,
48
- }
49
- );
50
- if (response.data != null && response.data !== "") {
51
- setIsLoginInProcess(false);
52
- const UserSession = {
53
- ...response.data,
54
- isAuthenticated: true,
55
- };
56
- dispatch(UserSessionActions.setAuthenticated(UserSession));
57
- }
58
- } catch (e: any) {
59
- setIsLoginInProcess(false);
60
- toast.error(
61
- e?.response?.data ||
62
- "failed to authenticate, contact your administrator"
63
- );
64
- }
65
- };
66
- const userSession = useSelector((state: any) => state.UserSession.value);
67
- const loginTheme = createTheme({
68
- components: {
69
- MuiCssBaseline: {
70
- styleOverrides: `
71
- /* Custom Scrollbar */
72
- * {
73
- scrollbar-width: thin;
74
- scrollbar-color: ${
75
- appInfo.appTheme?.dark?.primaryColor ||
76
- DARK_THEME_INITIAL_MAIN_COLOR
77
- } #121212;
78
- }
79
-
80
- /* Webkit Browsers */
81
- *::-webkit-scrollbar {
82
- width: 12px;
83
- height: 10px;
84
- }
85
- `,
86
- },
87
- },
88
- palette: {
89
- mode: "dark",
90
- primary: {
91
- main:
92
- appInfo.appTheme?.dark?.primaryColor || DARK_THEME_INITIAL_MAIN_COLOR,
93
- },
94
- secondary: {
95
- main:
96
- appInfo.appTheme?.dark?.secondaryColor ||
97
- DARK_THEME_INITIAL_SECANDARY_COLOR,
98
- },
99
- },
100
- });
101
- const checkUserSession = async () => {
102
- if (appInfo?.apiBaseUrl) {
103
- if (userSession.isAuthenticated == null) {
104
- try {
105
- let response = await axios.get(
106
- `${appInfo.apiBaseUrl}/api/auth/userInfo`,
107
- {
108
- withCredentials: true,
109
- }
110
- );
111
- if (response != null && response.data != null) {
112
- const UserSession = {
113
- ...response.data,
114
- isAuthenticated: true,
115
- };
116
- dispatch(UserSessionActions.setAuthenticated(UserSession));
117
- } else {
118
- dispatch(UserSessionActions.setUnAuthenticated());
119
- }
120
- } catch (error) {
121
- dispatch(UserSessionActions.setUnAuthenticated());
122
- }
123
- }
124
- }
125
- };
126
- useEffect(() => {
127
- checkUserSession();
128
- }, [appInfo]);
129
- return (
130
- <ThemeProvider theme={loginTheme}>
131
- <Paper
132
- sx={{
133
- display: "flex",
134
- height: "100vh",
135
- width: "100%",
136
- borderRadius: 0,
137
- alignItems: "center",
138
- justifyContent: "center",
139
- }}
140
- >
141
- {UserSessionState.isAuthenticated == false ? (
142
- <Box
143
- sx={{
144
- display: "flex",
145
- flexDirection: "column",
146
- alignItems: "center",
147
- justifyContent: "center",
148
- }}
149
- >
150
- <img src={appInfo?.appLogo} width={150} height={150} />
151
- <Typography sx={{ m: 1 }} variant="h4" color="textSecondary">
152
- {appInfo?.appName}
153
- </Typography>
154
- <Typography
155
- sx={{
156
- paddingRight: 1,
157
- width: "100%",
158
- textAlign: "right",
159
- fontSize: 10,
160
- }}
161
- variant="caption"
162
- color="textSecondary"
163
- >
164
- V.{appInfo.appVersion}
165
- </Typography>
166
- <TextField
167
- label="username"
168
- sx={{ width: 300, m: 1 }}
169
- value={username}
170
- onChange={(event) => {
171
- setUsername(event.target.value);
172
- }}
173
- onKeyDown={(event) => {
174
- if (event.key === "Enter") {
175
- handleLogin();
176
- }
177
- }}
178
- />
179
- <TextField
180
- label="password"
181
- sx={{ width: 300, m: 1 }}
182
- value={password}
183
- type="password"
184
- onChange={(event) => {
185
- setPassword(event.target.value);
186
- }}
187
- onKeyDown={(event) => {
188
- if (event.key === "Enter") {
189
- handleLogin();
190
- }
191
- }}
192
- />
193
- <Button
194
- loading={isLoginInProcess}
195
- onClick={handleLogin}
196
- variant="contained"
197
- color="primary"
198
- sx={{ m: 1 }}
199
- >
200
- login
201
- </Button>
202
- </Box>
203
- ) : (
204
- <>
205
- <CircularProgress sx={{ marginRight: 1 }} />
206
- <div>You will be redirected shortly ... please wait</div>
207
- </>
208
- )}
209
- </Paper>
210
- </ThemeProvider>
211
- );
212
- };
213
-
214
- export default Login;
1
+ import {
2
+ Box,
3
+ Button,
4
+ CircularProgress,
5
+ createTheme,
6
+ Paper,
7
+ TextField,
8
+ Typography,
9
+ } from "@mui/material";
10
+ import { useDispatch, useSelector } from "react-redux";
11
+ import { ThemeProvider } from "@emotion/react";
12
+ import { useEffect, useState } from "react";
13
+ import axios from "axios";
14
+ import { toast } from "react-toastify";
15
+ import { UserSessionActions } from "../../redux/features/common/UserSessionSlice";
16
+ import {
17
+ DARK_THEME_INITIAL_MAIN_COLOR,
18
+ DARK_THEME_INITIAL_SECANDARY_COLOR,
19
+ } from "../../util";
20
+
21
+ const Login: React.FC = () => {
22
+ const appInfo = useSelector((state: any) => state.AppInfo.value);
23
+ const [username, setUsername] = useState("");
24
+ const [password, setPassword] = useState("");
25
+ const [isLoginInProcess, setIsLoginInProcess] = useState(false);
26
+ const UserSessionState = useSelector((state: any) => state.UserSession.value);
27
+ const dispatch = useDispatch();
28
+ const handleLogin = async () => {
29
+ if (username == null || username == "") {
30
+ toast.error("username is required to proceed");
31
+ return;
32
+ }
33
+ if (password == null || password == "") {
34
+ toast.error("password is required to proceed");
35
+ return;
36
+ }
37
+ setIsLoginInProcess(true);
38
+ let response: any = null;
39
+ try {
40
+ response = await axios.post(
41
+ `${appInfo.apiBaseUrl}/api/auth/login`,
42
+ {
43
+ username,
44
+ password,
45
+ },
46
+ {
47
+ withCredentials: true,
48
+ }
49
+ );
50
+ if (response.data != null && response.data !== "") {
51
+ setIsLoginInProcess(false);
52
+ const UserSession = {
53
+ ...response.data,
54
+ isAuthenticated: true,
55
+ };
56
+ dispatch(UserSessionActions.setAuthenticated(UserSession));
57
+ }
58
+ } catch (e: any) {
59
+ setIsLoginInProcess(false);
60
+ toast.error(
61
+ e?.response?.data ||
62
+ "failed to authenticate, contact your administrator"
63
+ );
64
+ }
65
+ };
66
+ const userSession = useSelector((state: any) => state.UserSession.value);
67
+ const loginTheme = createTheme({
68
+ components: {
69
+ MuiCssBaseline: {
70
+ styleOverrides: `
71
+ /* Custom Scrollbar */
72
+ * {
73
+ scrollbar-width: thin;
74
+ scrollbar-color: ${
75
+ appInfo.appTheme?.dark?.primaryColor ||
76
+ DARK_THEME_INITIAL_MAIN_COLOR
77
+ } #121212;
78
+ }
79
+
80
+ /* Webkit Browsers */
81
+ *::-webkit-scrollbar {
82
+ width: 12px;
83
+ height: 10px;
84
+ }
85
+ `,
86
+ },
87
+ },
88
+ palette: {
89
+ mode: "dark",
90
+ primary: {
91
+ main:
92
+ appInfo.appTheme?.dark?.primaryColor || DARK_THEME_INITIAL_MAIN_COLOR,
93
+ },
94
+ secondary: {
95
+ main:
96
+ appInfo.appTheme?.dark?.secondaryColor ||
97
+ DARK_THEME_INITIAL_SECANDARY_COLOR,
98
+ },
99
+ },
100
+ });
101
+ const checkUserSession = async () => {
102
+ if (appInfo?.apiBaseUrl) {
103
+ if (userSession.isAuthenticated == null) {
104
+ try {
105
+ let response = await axios.get(
106
+ `${appInfo.apiBaseUrl}/api/auth/userInfo`,
107
+ {
108
+ withCredentials: true,
109
+ }
110
+ );
111
+ if (response != null && response.data != null) {
112
+ const UserSession = {
113
+ ...response.data,
114
+ isAuthenticated: true,
115
+ };
116
+ dispatch(UserSessionActions.setAuthenticated(UserSession));
117
+ } else {
118
+ dispatch(UserSessionActions.setUnAuthenticated());
119
+ }
120
+ } catch (error) {
121
+ dispatch(UserSessionActions.setUnAuthenticated());
122
+ }
123
+ }
124
+ }
125
+ };
126
+ useEffect(() => {
127
+ checkUserSession();
128
+ }, [appInfo]);
129
+ return (
130
+ <ThemeProvider theme={loginTheme}>
131
+ <Paper
132
+ sx={{
133
+ display: "flex",
134
+ height: "100vh",
135
+ width: "100%",
136
+ borderRadius: 0,
137
+ alignItems: "center",
138
+ justifyContent: "center",
139
+ }}
140
+ >
141
+ {UserSessionState.isAuthenticated == false ? (
142
+ <Box
143
+ sx={{
144
+ display: "flex",
145
+ flexDirection: "column",
146
+ alignItems: "center",
147
+ justifyContent: "center",
148
+ }}
149
+ >
150
+ <img src={appInfo?.appLogo} width={150} height={150} />
151
+ <Typography sx={{ m: 1 }} variant="h4" color="textSecondary">
152
+ {appInfo?.appName}
153
+ </Typography>
154
+ <Typography
155
+ sx={{
156
+ paddingRight: 1,
157
+ width: "100%",
158
+ textAlign: "right",
159
+ fontSize: 10,
160
+ }}
161
+ variant="caption"
162
+ color="textSecondary"
163
+ >
164
+ V.{appInfo.appVersion}
165
+ </Typography>
166
+ <TextField
167
+ label="username"
168
+ sx={{ width: 300, m: 1 }}
169
+ value={username}
170
+ onChange={(event) => {
171
+ setUsername(event.target.value);
172
+ }}
173
+ onKeyDown={(event) => {
174
+ if (event.key === "Enter") {
175
+ handleLogin();
176
+ }
177
+ }}
178
+ />
179
+ <TextField
180
+ label="password"
181
+ sx={{ width: 300, m: 1 }}
182
+ value={password}
183
+ type="password"
184
+ onChange={(event) => {
185
+ setPassword(event.target.value);
186
+ }}
187
+ onKeyDown={(event) => {
188
+ if (event.key === "Enter") {
189
+ handleLogin();
190
+ }
191
+ }}
192
+ />
193
+ <Button
194
+ loading={isLoginInProcess}
195
+ onClick={handleLogin}
196
+ variant="contained"
197
+ color="primary"
198
+ sx={{ m: 1 }}
199
+ >
200
+ login
201
+ </Button>
202
+ </Box>
203
+ ) : (
204
+ <>
205
+ <CircularProgress sx={{ marginRight: 1 }} />
206
+ <div>You will be redirected shortly ... please wait</div>
207
+ </>
208
+ )}
209
+ </Paper>
210
+ </ThemeProvider>
211
+ );
212
+ };
213
+
214
+ export default Login;