1- import React from "react" ;
2- import { Flex } from "../flex/Flex" ;
3- import { NamespaceMember } from "@code0-tech/sagittarius-graphql-types" ;
4- import { useService , useStore } from "../../utils" ;
5- import { DNamespaceMemberReactiveService } from "./DNamespaceMember.service" ;
6- import { DUserReactiveService } from "../d-user" ;
7- import { DNamespaceRoleReactiveService } from "../d-role" ;
8- import { Avatar } from "../avatar/Avatar" ;
9- import { Text } from "../text/Text" ;
10- import { Badge } from "../badge/Badge" ;
11- import { IconDots , IconMailCheck , IconUserCog , IconUserOff } from "@tabler/icons-react" ;
12- import { Button } from "../button/Button" ;
13- import { Tooltip , TooltipArrow , TooltipContent , TooltipPortal , TooltipTrigger } from "../tooltip/Tooltip" ;
14- import { DNamespaceRolePermissions } from "../d-role/DNamespaceRolePermissions" ;
15- import { Menu , MenuContent , MenuItem , MenuLabel , MenuPortal , MenuTrigger } from "../menu/Menu" ;
16- import { DNamespaceMemberView } from "./DNamespaceMember.view" ;
1+ import React from "react"
2+ import { Flex } from "../flex/Flex"
3+ import { NamespaceMember } from "@code0-tech/sagittarius-graphql-types"
4+ import { useService , useStore } from "../../utils"
5+ import { DNamespaceMemberReactiveService } from "./DNamespaceMember.service"
6+ import { DUserReactiveService } from "../d-user"
7+ import { DNamespaceRoleReactiveService , DNamespaceRoleView } from "../d-role"
8+ import { Avatar } from "../avatar/Avatar"
9+ import { Text } from "../text/Text"
10+ import { Badge } from "../badge/Badge"
11+ import { IconDots , IconMailCheck , IconTrash , IconUserCog , IconUserOff } from "@tabler/icons-react"
12+ import { Button } from "../button/Button"
13+ import { Tooltip , TooltipArrow , TooltipContent , TooltipPortal , TooltipTrigger } from "../tooltip/Tooltip"
14+ import { DNamespaceRolePermissions } from "../d-role/DNamespaceRolePermissions"
15+ import { Menu , MenuContent , MenuItem , MenuLabel , MenuPortal , MenuSeparator , MenuTrigger } from "../menu/Menu"
16+ import { DNamespaceMemberView } from "./DNamespaceMember.view"
17+ import { Dialog , DialogClose , DialogContent , DialogPortal } from "../dialog/Dialog"
18+ import { Card } from "../card/Card"
19+ import CardSection from "../card/CardSection"
1720
1821export interface DNamespaceMemberContentProps {
1922 memberId : NamespaceMember [ 'id' ]
2023 onRemove ?: ( member : DNamespaceMemberView ) => void
21- onAssignRole ?: ( member : DNamespaceMemberView ) => void
24+ onAssignRole ?: ( member : DNamespaceMemberView , roles : DNamespaceRoleView [ ] ) => void
2225}
2326
2427export const DNamespaceMemberContent : React . FC < DNamespaceMemberContentProps > = ( props ) => {
@@ -35,8 +38,92 @@ export const DNamespaceMemberContent: React.FC<DNamespaceMemberContentProps> = (
3538 const member = React . useMemo ( ( ) => memberService . getById ( memberId ) , [ memberStore , memberId ] )
3639 const user = React . useMemo ( ( ) => userService . getById ( member ?. user ?. id ) , [ userStore , member ] )
3740 const assignedRoles = React . useMemo ( ( ) => member ?. roles ?. nodes ?. map ( role => roleService . getById ( role ?. id , { namespaceId : member ?. namespace ?. id } ) ) || [ ] , [ roleStore , member ] )
41+ const [ localAssignedRoles , setLocalAssignedRoles ] = React . useState ( assignedRoles )
42+ const [ openRemovedMemberDialog , setOpenRemovedMemberDialog ] = React . useState ( false )
43+ const [ openAssignRolesDialog , setOpenAssignRolesDialog ] = React . useState ( false )
44+ const rolesToAssign = roleService
45+ . values ( { namespaceId : member ?. namespace ?. id } )
46+ . filter ( role => ! localAssignedRoles . find ( aRole => aRole ?. id === role . id ) )
3847
3948 return < Flex align = { "center" } style = { { gap : "1.3rem" } } justify = { "space-between" } >
49+ < Dialog open = { openRemovedMemberDialog } onOpenChange = { open => setOpenRemovedMemberDialog ( open ) } >
50+ < DialogPortal >
51+ < DialogContent showCloseButton title = { "Remove member" } >
52+ < Text size = { "md" } hierarchy = { "secondary" } >
53+ Are you sure you want to remove { " " }
54+ < Badge color = { "info" } >
55+ < Text size = { "md" } style = { { color : "inherit" } } > @{ user ?. username } </ Text >
56+ </ Badge > { " " }
57+ from the namespace members?
58+ </ Text >
59+ < Flex justify = { "space-between" } align = { "center" } >
60+ < DialogClose asChild >
61+ < Button color = { "secondary" } > No, go back!</ Button >
62+ </ DialogClose >
63+ < Button color = { "error" } onClick = { ( ) => onRemove ( member ! ! ) } > Yes, remove!</ Button >
64+ </ Flex >
65+ </ DialogContent >
66+ </ DialogPortal >
67+ </ Dialog >
68+ < Dialog open = { openAssignRolesDialog } onOpenChange = { open => setOpenAssignRolesDialog ( open ) } >
69+ < DialogPortal >
70+ < DialogContent autoFocus showCloseButton title = { "Assign roles" } >
71+ < Text size = { "md" } hierarchy = { "tertiary" } > Assign, remove and manage the roles of a active
72+ member</ Text >
73+ < Card paddingSize = { "xs" } color = { "secondary" } >
74+ { localAssignedRoles . map ( role => {
75+ return < CardSection border key = { role ?. id } >
76+ < Flex style = { { gap : "0.7rem" } } align = { "center" } justify = { "space-between" } >
77+ < Flex align = { "center" } style = { { gap : "1.3rem" } } >
78+ < Text hierarchy = { "primary" } > { role ?. name } </ Text >
79+ < DNamespaceRolePermissions abilities = { role ?. abilities ! ! } />
80+ </ Flex >
81+ < Button color = { "error" } paddingSize = { "xxs" } onClick = { ( ) => {
82+ setLocalAssignedRoles ( prevState => prevState . filter ( aRole => aRole ?. id != role ?. id ) )
83+ } } >
84+ < IconTrash size = { 16 } />
85+ </ Button >
86+ </ Flex >
87+
88+ </ CardSection >
89+ } ) }
90+ < Menu >
91+ < MenuTrigger asChild >
92+ < CardSection hover p = { 0.35 } border display = { "flex" } justify = { "center" } >
93+ < Button paddingSize = { "xxs" } variant = { "none" } > Assign roles</ Button >
94+ </ CardSection >
95+ </ MenuTrigger >
96+ < MenuPortal >
97+ < MenuContent side = { "bottom" } sideOffset = { 8 } align = { "center" } >
98+ < MenuLabel > Roles to add</ MenuLabel >
99+ { rolesToAssign . map ( ( role , index ) => {
100+ return < >
101+ < MenuItem onSelect = { ( ) => {
102+ setLocalAssignedRoles ( prevState => [ ...prevState , role ] )
103+ } } >
104+ < Flex align = { "center" } style = { { gap : "1.3rem" } } >
105+ < Text hierarchy = { "primary" } > { role ?. name } </ Text >
106+ < DNamespaceRolePermissions abilities = { role ?. abilities ! ! } />
107+ </ Flex >
108+ </ MenuItem >
109+ { index < rolesToAssign . length - 1 && < MenuSeparator /> }
110+ </ >
111+ } ) }
112+ </ MenuContent >
113+ </ MenuPortal >
114+ </ Menu >
115+ </ Card >
116+ < Flex justify = { "space-between" } align = { "center" } >
117+ < DialogClose asChild >
118+ < Button color = { "secondary" } > No, go back!</ Button >
119+ </ DialogClose >
120+
121+ < Button onClick = { ( ) => onAssignRole ( member ! ! , localAssignedRoles as DNamespaceRoleView [ ] ) }
122+ color = { "success" } > Yes, save!</ Button >
123+ </ Flex >
124+ </ DialogContent >
125+ </ DialogPortal >
126+ </ Dialog >
40127 < Flex style = { { gap : "1.3rem" } } align = { "center" } >
41128 < Flex align = { "center" } style = { { gap : ".7rem" } } >
42129 < Avatar identifier = { user ?. username ! ! } bg = { "transparent" } />
@@ -96,13 +183,13 @@ export const DNamespaceMemberContent: React.FC<DNamespaceMemberContentProps> = (
96183 < MenuContent align = { "end" } side = { "bottom" } sideOffset = { 8 } >
97184 < MenuLabel > Actions</ MenuLabel >
98185 { member ?. userAbilities ?. deleteMember && (
99- < MenuItem onSelect = { ( ) => onRemove ( member ) } >
186+ < MenuItem onSelect = { ( ) => setOpenRemovedMemberDialog ( true ) } >
100187 < IconUserOff size = { 16 } />
101188 < Text > Remove member</ Text >
102189 </ MenuItem >
103190 ) }
104191 { member ?. userAbilities ?. assignMemberRoles && (
105- < MenuItem onSelect = { ( ) => onAssignRole ( member ) } >
192+ < MenuItem onSelect = { ( ) => setOpenAssignRolesDialog ( true ) } >
106193 < IconUserCog size = { 16 } />
107194 < Text > Assign role</ Text >
108195 </ MenuItem >
0 commit comments