@asaleh37/ui-base 25.6.24 → 25.7.26-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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@asaleh37/ui-base",
3
- "version": "25.6.24",
3
+ "version": "25.7.26-1",
4
4
  "description": "",
5
5
  "license": "ISC",
6
6
  "author": "Ahmed Saleh Mohamed",
@@ -0,0 +1,128 @@
1
+ import { Box, Button, Divider, Paper } from "@mui/material";
2
+ import { TemplateTextField } from "../../templates";
3
+ import { useState } from "react";
4
+ import { toast } from "react-toastify";
5
+ import { useAxios } from "../../../hooks";
6
+
7
+ interface ChangePasswordPanelProps {
8
+ selectedPerson: any;
9
+ isSelfService: boolean;
10
+ onSuccessCallBk: () => void;
11
+ }
12
+
13
+ const ChangePasswordPanel: React.FC<ChangePasswordPanelProps> = (props) => {
14
+ const [currentPassword, setCurrentPassword] = useState("");
15
+ const [password1, setPassword1] = useState("");
16
+ const [password2, setPassword2] = useState("");
17
+ const { handlePostRequest } = useAxios();
18
+ const handleChangePasswordRequest = async () => {
19
+ if (props.isSelfService) {
20
+ if (currentPassword === null || currentPassword.trim() === "") {
21
+ toast.error(
22
+ "You must enter your current password to process your request"
23
+ );
24
+ return;
25
+ }
26
+ }
27
+ if (
28
+ password1 === null ||
29
+ password1 === "" ||
30
+ password2 === null ||
31
+ password2 === "" ||
32
+ password1 != password2
33
+ ) {
34
+ toast.error(
35
+ "You must enter new password in required fields and must be identical"
36
+ );
37
+ return;
38
+ }
39
+ await handlePostRequest({
40
+ endPointURI: props.isSelfService
41
+ ? "api/v1/ss/changeMyPassword"
42
+ : "api/v1/admin/changeUserPassword",
43
+ data: {
44
+ personId: props?.selectedPerson?.id,
45
+ currentPassword,
46
+ newPassword: password1,
47
+ },
48
+ successCallBkFn: () => {
49
+ props.onSuccessCallBk();
50
+ toast.success("Your request has been processed successfully");
51
+ },
52
+ showMask: true,
53
+ });
54
+ };
55
+ return (
56
+ <Paper
57
+ sx={{
58
+ display: "flex",
59
+ flexDirection: "column",
60
+ alignItems: "center",
61
+ justifyContent: "center",
62
+ width: 400,
63
+ padding: 1,
64
+ }}
65
+ >
66
+ <Box
67
+ sx={{
68
+ m: 1,
69
+ display: "flex",
70
+ alignItems: "center",
71
+ justifyContent: "flex-start",
72
+ width: "100%",
73
+ fontWeight: "bold",
74
+ fontSize: 16,
75
+ }}
76
+ >
77
+ Changing Password For : {props?.selectedPerson?.employeeEnName}
78
+ </Box>
79
+ <Divider variant="fullWidth" sx={{ width: "100%", marginBottom: 2 }} />
80
+ {props.isSelfService ? (
81
+ <TemplateTextField
82
+ label="Current Password"
83
+ value={currentPassword}
84
+ onChange={(e) => {
85
+ setCurrentPassword(e.target.value);
86
+ }}
87
+ sx={{ m: 1 }}
88
+ fullWidth
89
+ type="password"
90
+ />
91
+ ) : (
92
+ <></>
93
+ )}
94
+
95
+ <TemplateTextField
96
+ label="New Password"
97
+ value={password1}
98
+ onChange={(e) => {
99
+ setPassword1(e.target.value);
100
+ }}
101
+ sx={{ m: 1 }}
102
+ fullWidth
103
+ type="password"
104
+ />
105
+ <TemplateTextField
106
+ label="Confirm New Password"
107
+ value={password2}
108
+ onChange={(e) => {
109
+ setPassword2(e.target.value);
110
+ }}
111
+ sx={{ m: 1 }}
112
+ fullWidth
113
+ type="password"
114
+ />
115
+ <Button
116
+ sx={{ m: 1 }}
117
+ variant="contained"
118
+ onClick={() => {
119
+ handleChangePasswordRequest();
120
+ }}
121
+ >
122
+ Change Password
123
+ </Button>
124
+ </Paper>
125
+ );
126
+ };
127
+
128
+ export default ChangePasswordPanel;
@@ -9,6 +9,7 @@ import { Box } from "@mui/material";
9
9
  import AttachmentImageViewer from "../../templates/attachment/AttachmentImageViewer";
10
10
  import { useSelector } from "react-redux";
11
11
  import OrgMemberRoleForm from "./OrgMemberRoleForm";
12
+ import ChangePasswordPanel from "./ChangePasswordPanel";
12
13
 
13
14
  const PersonGrid: React.FC = () => {
14
15
  const { t } = useTranslation();
@@ -44,6 +45,15 @@ const PersonGrid: React.FC = () => {
44
45
  windowTitle: "Organization Member Roles",
45
46
  width: "50%",
46
47
  });
48
+ const {
49
+ Window: ChangePasswordWindow,
50
+ setWindowState: setChangePasswordWindow,
51
+ } = useWindow({
52
+ windowIcon: "key",
53
+ windowTitle: "Change Password",
54
+ width: "fit-content",
55
+ height: "fit-content",
56
+ });
47
57
 
48
58
  const formElements: Array<FormElementProps> = [
49
59
  {
@@ -251,6 +261,15 @@ const PersonGrid: React.FC = () => {
251
261
  <OrganizationMembersWindow>
252
262
  <OrganizationMemberGrid selectedPerson={selectedPerson} />
253
263
  </OrganizationMembersWindow>
264
+ <ChangePasswordWindow>
265
+ <ChangePasswordPanel
266
+ selectedPerson={selectedPerson}
267
+ isSelfService={false}
268
+ onSuccessCallBk={() => {
269
+ setChangePasswordWindow(false);
270
+ }}
271
+ />
272
+ </ChangePasswordWindow>
254
273
  <TemplateGrid
255
274
  attachment={{ attachmentCode: "EMPLOYEE_PHOTOS" }}
256
275
  apiActions={apiActions}
@@ -268,6 +287,14 @@ const PersonGrid: React.FC = () => {
268
287
  keyColumnName={"id"}
269
288
  gridTitle="PERSON_PLURAL"
270
289
  rowActions={[
290
+ {
291
+ icon: "key",
292
+ label: "Change User Password",
293
+ actionFn: async (data) => {
294
+ setSelectedPerson(data);
295
+ setChangePasswordWindow(true);
296
+ },
297
+ },
271
298
  {
272
299
  icon: "tags",
273
300
  label: "Current Organization User Roles",
@@ -18,7 +18,7 @@ const SystemApplicationRoleGrid: React.FC = () => {
18
18
  width: "50%",
19
19
  });
20
20
  const apiActions = useApiActions({
21
- findAll: "SystemApplicationRoles",
21
+ commonStoreKey: "SystemApplicationRoles",
22
22
  deleteById: "api/v1/admin/systemapplicationrole",
23
23
  save: "api/v1/admin/systemapplicationrole",
24
24
  findById: "api/v1/admin/systemapplicationrole",
@@ -53,7 +53,7 @@ const TransferList: React.FC<TransferListProps> = ({
53
53
  }, [options]);
54
54
  React.useEffect(() => {
55
55
  if (selectedOptions) {
56
- setRight([...selectedOptions]);
56
+ setRight([...selectedOptions]);
57
57
  }
58
58
  }, [selectedOptions]);
59
59
 
@@ -104,9 +104,8 @@ const TransferList: React.FC<TransferListProps> = ({
104
104
  title: string,
105
105
  unfilteredItems: Array<any>,
106
106
  side: "left" | "right"
107
- ) => {
107
+ ) => {
108
108
  const items = unfilteredItems.filter((option: any) => {
109
-
110
109
  if (option[displayField]) {
111
110
  const value: string = option[displayField];
112
111
  if (
@@ -170,7 +169,7 @@ const TransferList: React.FC<TransferListProps> = ({
170
169
  <List
171
170
  sx={{
172
171
  width: "100%",
173
- height: "100%",
172
+ height: "80%",
174
173
  bgcolor: "secondary",
175
174
  overflow: "auto",
176
175
  }}
@@ -2,6 +2,8 @@ import {
2
2
  Avatar,
3
3
  Box,
4
4
  IconButton,
5
+ Menu,
6
+ MenuItem,
5
7
  styled,
6
8
  Tooltip,
7
9
  Typography,
@@ -23,6 +25,8 @@ import ChangeOrgForm from "../components/common/ChangeOrgForm";
23
25
  import { toggleSideBarState } from "../redux/features/common/SideBarSlice";
24
26
  import AttachmentImageViewer from "../components/templates/attachment/AttachmentImageViewer";
25
27
  import NotificationButton from "./NotificationButton";
28
+ import { useState } from "react";
29
+ import ChangePasswordPanel from "../components/administration/admin/ChangePasswordPanel";
26
30
 
27
31
  interface AppBarProps extends MuiAppBarProps {
28
32
  open?: boolean;
@@ -70,10 +74,26 @@ const TopBar: React.FC = () => {
70
74
  height: "fit-content",
71
75
  });
72
76
  const AppInfo = useSelector((state: any) => state.AppInfo.value);
77
+ const [anchorElUser, setAnchorElUser] = useState<null | HTMLElement>(null);
78
+ const handleCloseUserMenu = () => {
79
+ setAnchorElUser(null);
80
+ };
81
+ const handleOpenUserMenu = (event: React.MouseEvent<HTMLElement>) => {
82
+ setAnchorElUser(event.currentTarget);
83
+ };
73
84
  const AppLayout = useSelector((state: any) => state.AppLayout);
74
85
  const SideBarState = useSelector((state: any) => state.SideBar);
75
86
  const { UserSession } = useSession();
76
87
  const currentOrganization = UserSession.value.currentOrganization;
88
+ const {
89
+ Window: ChangePasswordWindow,
90
+ setWindowState: setChangePasswordWindow,
91
+ } = useWindow({
92
+ windowIcon: "key",
93
+ windowTitle: "Change Password",
94
+ width: "fit-content",
95
+ height: "fit-content",
96
+ });
77
97
  const { handleGetRequest } = useAxios();
78
98
  const isMobile = useIsMobile();
79
99
  const dispatch = useDispatch();
@@ -88,6 +108,40 @@ const TopBar: React.FC = () => {
88
108
  };
89
109
  return (
90
110
  <>
111
+ <ChangePasswordWindow>
112
+ <ChangePasswordPanel
113
+ selectedPerson={UserSession.value}
114
+ isSelfService={true}
115
+ onSuccessCallBk={() => {
116
+ setChangePasswordWindow(false);
117
+ }}
118
+ />
119
+ </ChangePasswordWindow>
120
+ <Menu
121
+ sx={{ mt: "45px" }}
122
+ id="menu-appbar"
123
+ anchorEl={anchorElUser}
124
+ anchorOrigin={{
125
+ vertical: "top",
126
+ horizontal: "right",
127
+ }}
128
+ keepMounted
129
+ transformOrigin={{
130
+ vertical: "top",
131
+ horizontal: "right",
132
+ }}
133
+ open={Boolean(anchorElUser)}
134
+ onClose={handleCloseUserMenu}
135
+ >
136
+ <MenuItem
137
+ onClick={() => {
138
+ setChangePasswordWindow(true);
139
+ handleCloseUserMenu();
140
+ }}
141
+ >
142
+ <Typography sx={{ textAlign: "center" }}>Change Password</Typography>
143
+ </MenuItem>
144
+ </Menu>
91
145
  <ChangeOrgWindow>
92
146
  <ChangeOrgForm
93
147
  successChangeCallBackFn={() => {
@@ -205,13 +259,19 @@ const TopBar: React.FC = () => {
205
259
  ) : (
206
260
  <></>
207
261
  )}
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 }}>
262
+ <div onClick={handleOpenUserMenu} style={{ cursor: "pointer" }}>
263
+ <AttachmentImageViewer
264
+ showAsAvatar={true}
265
+ onErrorImage="/no_user.png"
266
+ attachmentCode="EMPLOYEE_PHOTOS"
267
+ refKey={UserSession.value?.id + ""}
268
+ />
269
+ </div>
270
+
271
+ <div
272
+ style={{ marginLeft: 5, marginRight: 5, cursor: "pointer" }}
273
+ onClick={handleOpenUserMenu}
274
+ >
215
275
  {isMobile ? "" : UserSession.value?.username}
216
276
  </div>
217
277
  <IconButton color="inherit" onClick={handleLogout}>