diff --git a/api/public/swagger.yaml b/api/public/swagger.yaml index e4b5a58..4784099 100644 --- a/api/public/swagger.yaml +++ b/api/public/swagger.yaml @@ -171,7 +171,7 @@ components: user: $ref: '#/components/schemas/UserResponse' group: - $ref: '#/components/schemas/GroupResponse' + $ref: '#/components/schemas/GroupDetailsResponse' required: - permissionId - uri @@ -1008,7 +1008,7 @@ paths: type: array examples: 'Example 1': - value: [{permissionId: 123, uri: /SASjsApi/code/execute, setting: Grant, user: {id: 1, username: johnSnow01, displayName: 'John Snow', isAdmin: false}}, {permissionId: 124, uri: /SASjsApi/code/execute, setting: Grant, group: {groupId: 1, name: DCGroup, description: 'This group represents Data Controller Users'}}] + value: [{permissionId: 123, uri: /SASjsApi/code/execute, setting: Grant, user: {id: 1, username: johnSnow01, displayName: 'John Snow', isAdmin: false}}, {permissionId: 124, uri: /SASjsApi/code/execute, setting: Grant, group: {groupId: 1, name: DCGroup, description: 'This group represents Data Controller Users', isActive: true, users: []}}] summary: 'Get list of all permissions (uri, setting and userDetail).' tags: - Permission diff --git a/api/src/controllers/group.ts b/api/src/controllers/group.ts index 1d324ef..0c37de9 100644 --- a/api/src/controllers/group.ts +++ b/api/src/controllers/group.ts @@ -20,7 +20,7 @@ export interface GroupResponse { description: string } -interface GroupDetailsResponse { +export interface GroupDetailsResponse { groupId: number name: string description: string diff --git a/api/src/controllers/permission.ts b/api/src/controllers/permission.ts index 8b48612..3dabaa7 100644 --- a/api/src/controllers/permission.ts +++ b/api/src/controllers/permission.ts @@ -15,7 +15,7 @@ import Permission from '../model/Permission' import User from '../model/User' import Group from '../model/Group' import { UserResponse } from './user' -import { GroupResponse } from './group' +import { GroupDetailsResponse } from './group' export enum PrincipalType { user = 'user', @@ -63,7 +63,7 @@ export interface PermissionDetailsResponse { uri: string setting: string user?: UserResponse - group?: GroupResponse + group?: GroupDetailsResponse } @Security('bearerAuth') @@ -93,7 +93,9 @@ export class PermissionController { group: { groupId: 1, name: 'DCGroup', - description: 'This group represents Data Controller Users' + description: 'This group represents Data Controller Users', + isActive: true, + users: [] } } ]) @@ -170,7 +172,12 @@ const getAllPermissions = async (): Promise => .populate({ path: 'user', select: 'id username displayName isAdmin -_id' }) .populate({ path: 'group', - select: 'groupId name description -_id' + select: 'groupId name description -_id', + populate: { + path: 'users', + select: 'id username displayName isAdmin -_id', + options: { limit: 15 } + } })) as unknown as PermissionDetailsResponse[] const createPermission = async ({ @@ -185,7 +192,7 @@ const createPermission = async ({ }) let user: UserResponse | undefined - let group: GroupResponse | undefined + let group: GroupDetailsResponse | undefined switch (principalType) { case PrincipalType.user: { @@ -251,7 +258,13 @@ const createPermission = async ({ group = { groupId: groupInDB.groupId, name: groupInDB.name, - description: groupInDB.description + description: groupInDB.description, + isActive: groupInDB.isActive, + users: groupInDB.populate({ + path: 'users', + select: 'id username displayName isAdmin -_id', + options: { limit: 15 } + }) as unknown as UserResponse[] } break } diff --git a/web/src/containers/Settings/deletePermissionModal.tsx b/web/src/containers/Settings/deletePermissionModal.tsx index 59527bd..23736f8 100644 --- a/web/src/containers/Settings/deletePermissionModal.tsx +++ b/web/src/containers/Settings/deletePermissionModal.tsx @@ -29,7 +29,7 @@ const DeleteModal = ({ open, setOpen, deletePermission }: DeleteModalProps) => { setOpen(false)} open={open}> - Are you sure to delete this permission? + Are you sure you want to delete this permission? diff --git a/web/src/containers/Settings/index.tsx b/web/src/containers/Settings/index.tsx index a93d400..71a8960 100644 --- a/web/src/containers/Settings/index.tsx +++ b/web/src/containers/Settings/index.tsx @@ -47,7 +47,7 @@ const Settings = () => { > {appContext.mode === ModeType.Server && ( - + )} diff --git a/web/src/containers/Settings/permission.tsx b/web/src/containers/Settings/permission.tsx index d4652b4..9f69793 100644 --- a/web/src/containers/Settings/permission.tsx +++ b/web/src/containers/Settings/permission.tsx @@ -12,7 +12,9 @@ import { Grid, CircularProgress, IconButton, - Tooltip + Tooltip, + Typography, + Popover } from '@mui/material' import FilterListIcon from '@mui/icons-material/FilterList' @@ -29,6 +31,7 @@ import UpdatePermissionModal from './updatePermissionModal' import DeleteModal from './deletePermissionModal' import { + GroupDetailsResponse, PermissionResponse, RegisterPermissionPayload } from '../../utils/types' @@ -401,8 +404,66 @@ const PermissionTable = ({ } const displayPrincipal = (permission: PermissionResponse) => { - if (permission.user) return permission.user?.username - if (permission.group) return permission.group?.name + if (permission.user) return permission.user.username + if (permission.group) return +} + +type DisplayGroupProps = { + group: GroupDetailsResponse +} + +const DisplayGroup = ({ group }: DisplayGroupProps) => { + const [anchorEl, setAnchorEl] = useState(null) + + const handlePopoverOpen = (event: React.MouseEvent) => { + setAnchorEl(event.currentTarget) + } + + const handlePopoverClose = () => { + setAnchorEl(null) + } + + const open = Boolean(anchorEl) + + return ( +
+ + {group.name} + + + + Group Users + + {group.users.map((user) => ( + + {user.username} + + ))} + +
+ ) } const displayPrincipalType = (permission: PermissionResponse) => { diff --git a/web/src/utils/types.ts b/web/src/utils/types.ts index 46fd226..4f0a80a 100644 --- a/web/src/utils/types.ts +++ b/web/src/utils/types.ts @@ -11,12 +11,17 @@ export interface GroupResponse { description: string } +export interface GroupDetailsResponse extends GroupResponse { + isActive: boolean + users: UserResponse[] +} + export interface PermissionResponse { permissionId: number uri: string setting: string user?: UserResponse - group?: GroupResponse + group?: GroupDetailsResponse } export interface RegisterPermissionPayload {