role sorting order and show user avatars that are in role

main
alex 2023-06-20 23:23:10 +02:00
parent 090e50240a
commit 5a953a606f
2 changed files with 124 additions and 13 deletions

View File

@ -1,4 +1,5 @@
import { import {
Avatar,
Button, Button,
Collapse, Collapse,
Input, Input,
@ -11,6 +12,7 @@ import {
} from "antd"; } from "antd";
import { import {
Constants, Constants,
MyAvatar,
SentMessagesCommands, SentMessagesCommands,
WebSocketContext, WebSocketContext,
} from "../../../utils"; } from "../../../utils";
@ -18,8 +20,8 @@ import {
ArrowDownOutlined, ArrowDownOutlined,
ArrowUpOutlined, ArrowUpOutlined,
CloseOutlined, CloseOutlined,
DeleteOutlined,
EditOutlined, EditOutlined,
ExpandAltOutlined,
PlusOutlined, PlusOutlined,
SaveOutlined, SaveOutlined,
} from "@ant-design/icons"; } from "@ant-design/icons";
@ -76,8 +78,6 @@ export default function AdminAreaRoles() {
} }
} }
console.log("createListFromArgument", result);
return result; return result;
} }
@ -93,8 +93,6 @@ export default function AdminAreaRoles() {
(r) => r.RoleId === role.Id (r) => r.RoleId === role.Id
); );
console.warn("getRolePermissions", rolePermissions);
if (rolePermissions === undefined || rolePermissions.Permissions === null) { if (rolePermissions === undefined || rolePermissions.Permissions === null) {
return []; return [];
} }
@ -144,8 +142,8 @@ export default function AdminAreaRoles() {
function Role({ treeData, role, webSocketContext, notificationApi }) { function Role({ treeData, role, webSocketContext, notificationApi }) {
const [editMode, setEditMode] = useState(false); const [editMode, setEditMode] = useState(false);
const [roleDisplayName, setRoleDisplayName] = useState(role.DisplayName); const [roleDisplayName, setRoleDisplayName] = useState("");
const [roleDescription, setRoleDescription] = useState(role.Description); const [roleDescription, setRoleDescription] = useState("");
const getRolePermissions = (role) => { const getRolePermissions = (role) => {
const rolePermissions = webSocketContext.AdminAreaRolesPermissions.find( const rolePermissions = webSocketContext.AdminAreaRolesPermissions.find(
@ -201,6 +199,9 @@ function Role({ treeData, role, webSocketContext, notificationApi }) {
const onEditClick = () => { const onEditClick = () => {
setCheckedTreeKeyPermissions(rolePermissions); setCheckedTreeKeyPermissions(rolePermissions);
setEditMode(true); setEditMode(true);
setRoleDisplayName(role.DisplayName);
setRoleDescription(role.Description);
}; };
const onSaveClick = () => { const onSaveClick = () => {
@ -282,6 +283,60 @@ function Role({ treeData, role, webSocketContext, notificationApi }) {
setRoleDescription(role.Description); setRoleDescription(role.Description);
}; };
const onMoveUpClick = () => {
webSocketContext.SendSocketMessage(
SentMessagesCommands.AdminAreaUpdateRoleSortingOrder,
{
RoleId: role.Id,
Direction: 0,
}
);
};
const onMoveDownClick = () => {
webSocketContext.SendSocketMessage(
SentMessagesCommands.AdminAreaUpdateRoleSortingOrder,
{
RoleId: role.Id,
Direction: 1,
}
);
};
const UserAvatarsInRole = () => {
const usersInRole = webSocketContext.AllUsers.filter(
(user) => user.RoleId === role.Id
);
if (usersInRole.length > 0) {
let avatars = [];
usersInRole.forEach((user) => {
avatars.push(
<MyAvatar
key={user.Id}
avatarWidth={26}
avatar={user.Avatar}
tooltip
tooltipTitle={user.Username}
/>
);
});
return (
<Avatar.Group
maxCount={6}
size={28}
maxStyle={{ color: "#f56a00", backgroundColor: "#fde3cf" }}
>
{avatars}
</Avatar.Group>
);
}
return null;
};
return ( return (
<Collapse <Collapse
collapsible={editMode ? "icon" : "header"} collapsible={editMode ? "icon" : "header"}
@ -290,12 +345,15 @@ function Role({ treeData, role, webSocketContext, notificationApi }) {
{ {
key: "2", key: "2",
extra: editMode ? ( extra: editMode ? (
<Space style={{ paddingLeft: 10 }} size="small"> <Space key="spaceedit" style={{ paddingLeft: 10 }} size="small">
<Tooltip title="Delete">
<DeleteOutlined />
</Tooltip>
<Tooltip title="Move role up"> <Tooltip title="Move role up">
<ArrowUpOutlined /> <ArrowUpOutlined onClick={() => onMoveUpClick()} />
</Tooltip> </Tooltip>
<Tooltip title="Move role down"> <Tooltip title="Move role down">
<ArrowDownOutlined /> <ArrowDownOutlined onClick={() => onMoveDownClick()} />
</Tooltip> </Tooltip>
<Tooltip title="Save"> <Tooltip title="Save">
<SaveOutlined onClick={() => onSaveClick()} /> <SaveOutlined onClick={() => onSaveClick()} />
@ -305,9 +363,13 @@ function Role({ treeData, role, webSocketContext, notificationApi }) {
</Tooltip> </Tooltip>
</Space> </Space>
) : ( ) : (
<Tooltip title="Edit"> <Space style={{ paddingLeft: 10 }} size="small" align="start">
<EditOutlined onClick={() => onEditClick()} /> <UserAvatarsInRole />
</Tooltip>
<Tooltip title="Edit">
<EditOutlined onClick={() => onEditClick()} />
</Tooltip>
</Space>
), ),
label: ( label: (
<> <>

View File

@ -140,6 +140,7 @@ const ReceivedMessagesCommands = {
UserProfileUpdated: 18, UserProfileUpdated: 18,
AdminAreaNewRoleCreated: 19, AdminAreaNewRoleCreated: 19,
AdminAreaRoleUpdated: 20, AdminAreaRoleUpdated: 20,
AdminAreaUpdateRoleSortingOrder: 21,
}; };
// commands sent to the backend server // commands sent to the backend server
@ -152,6 +153,7 @@ export const SentMessagesCommands = {
UpdateUserProfile: 6, UpdateUserProfile: 6,
AdminAreaCreateNewRole: 7, AdminAreaCreateNewRole: 7,
AdminAreaUpdateRole: 8, AdminAreaUpdateRole: 8,
AdminAreaUpdateRoleSortingOrder: 9,
}; };
export function WebSocketProvider({ export function WebSocketProvider({
@ -527,6 +529,11 @@ export function WebSocketProvider({
break; break;
case ReceivedMessagesCommands.AdminAreaNewRoleCreated: case ReceivedMessagesCommands.AdminAreaNewRoleCreated:
setAllRoles((arr) => [...arr, body]); setAllRoles((arr) => [...arr, body]);
setAdminAreaRolesPermissions((arr) => [
...arr,
{ RoleId: body.Id, Permissions: [] },
]);
break; break;
case ReceivedMessagesCommands.AdminAreaRoleUpdated: case ReceivedMessagesCommands.AdminAreaRoleUpdated:
setAllRoles((arr) => { setAllRoles((arr) => {
@ -597,7 +604,49 @@ export function WebSocketProvider({
} }
} }
} }
break;
case ReceivedMessagesCommands.AdminAreaUpdateRoleSortingOrder:
setAllRoles((arr) => {
const newArr = [...arr];
const updatedRoleIndex = newArr.findIndex(
(role) => role.Id === body.RoleId
);
const currentSortingOrder = newArr[updatedRoleIndex].SortingOrder;
if (body.Direction === 0) {
newArr[updatedRoleIndex].SortingOrder =
newArr[updatedRoleIndex].SortingOrder - 1;
} else {
newArr[updatedRoleIndex].SortingOrder =
newArr[updatedRoleIndex].SortingOrder + 1;
}
const newSortingOrder = newArr[updatedRoleIndex].SortingOrder;
for (let i = 0; i < newArr.length; i++) {
if (newArr[i].Id !== newArr[updatedRoleIndex].Id) {
if (newArr[i].SortingOrder === newSortingOrder) {
newArr[i].SortingOrder = currentSortingOrder;
} else if (
newArr[i].SortingOrder < currentSortingOrder &&
newArr[i].SortingOrder >= newSortingOrder
) {
newArr[i].SortingOrder = newArr[i].SortingOrder + 1;
} else if (
newArr[i].SortingOrder > currentSortingOrder &&
newArr[i].SortingOrder <= newSortingOrder
) {
newArr[i].SortingOrder = newArr[i] - 1;
}
}
}
newArr.sort((a, b) => a.SortingOrder - b.SortingOrder);
return newArr;
});
break; break;
default: default: