11import { GroupRoleInfo , GroupUser , OrgGroup , TacoRoles } from "constants/orgConstants" ;
22import { User } from "constants/userConstants" ;
3- import { AddIcon , ArrowIcon , CustomSelect , PackUpIcon , SuperUserIcon } from "lowcoder-design" ;
3+ import { AddIcon , ArrowIcon , CustomSelect , PackUpIcon , Search , SuperUserIcon } from "lowcoder-design" ;
44import { trans } from "i18n" ;
55import ProfileImage from "pages/common/profileImage" ;
6- import React , { useMemo } from "react" ;
6+ import React , { useCallback , useEffect , useMemo , useState } from "react" ;
77import { useDispatch } from "react-redux" ;
88import {
99 deleteGroupUserAction ,
@@ -20,7 +20,6 @@ import {
2020 GroupNameView ,
2121 HeaderBack ,
2222 LAST_ADMIN_QUIT ,
23- PermissionHeaderWrapper ,
2423 QuestionTooltip ,
2524 RoleSelectSubTitle ,
2625 RoleSelectTitle ,
@@ -31,13 +30,35 @@ import {
3130import history from "util/history" ;
3231import { PERMISSION_SETTING } from "constants/routesURL" ;
3332import Column from "antd/es/table/Column" ;
33+ import { debounce } from "lodash" ;
34+ import { fetchGroupUsrPagination } from "@lowcoder-ee/util/pagination/axios" ;
3435
3536const StyledAddIcon = styled ( AddIcon ) `
3637 g path {
3738 fill: #ffffff;
3839 }
3940` ;
4041
42+ const PermissionHeaderWrapper = styled . div `
43+ display: flex;
44+ align-items: center;
45+ justify-content: space-between;
46+ width: 100%;
47+ margin-bottom: 16px;
48+ ` ;
49+
50+ const OptionsHeader = styled . div `
51+ display: flex;
52+ align-items: center;
53+ gap: 12px;
54+ ` ;
55+
56+ type ElementsState = {
57+ elements : any [ ] ;
58+ total : number ;
59+ role : string ;
60+ } ;
61+
4162type GroupPermissionProp = {
4263 group : OrgGroup ;
4364 orgId : string ;
@@ -47,11 +68,24 @@ type GroupPermissionProp = {
4768 setModify ?: any ;
4869 modify ?: boolean ;
4970 loading ?: boolean ;
71+ setElements : React . Dispatch < React . SetStateAction < ElementsState > > ;
5072} ;
5173
52- function GroupUsersPermission ( props : GroupPermissionProp ) {
53- // const { Column } = TableStyled;
54- const { group, orgId, groupUsers, currentUserGroupRole, currentUser, setModify, modify, loading } = props ;
74+ const GroupUsersPermission : React . FC < GroupPermissionProp > = ( props ) => {
75+ const {
76+ group,
77+ orgId,
78+ groupUsers,
79+ currentUserGroupRole,
80+ currentUser,
81+ setModify,
82+ modify,
83+ loading,
84+ setElements
85+ } = props ;
86+ const [ searchValue , setSearchValue ] = useState ( "" )
87+ const dispatch = useDispatch ( ) ;
88+
5589 const adminCount = groupUsers . filter ( ( user ) => isGroupAdmin ( user . role ) ) . length ;
5690 const sortedGroupUsers = useMemo ( ( ) => {
5791 return [ ...groupUsers ] . sort ( ( a , b ) => {
@@ -64,7 +98,31 @@ function GroupUsersPermission(props: GroupPermissionProp) {
6498 }
6599 } ) ;
66100 } , [ groupUsers ] ) ;
67- const dispatch = useDispatch ( ) ;
101+
102+ const debouncedFetchPotentialMembers = useCallback (
103+ debounce ( ( searchVal : string ) => {
104+ fetchGroupUsrPagination ( { groupId : group . groupId , search : searchVal } )
105+ . then ( result => {
106+ if ( result . success ) {
107+ setElements ( {
108+ elements : result . data || [ ] ,
109+ total : result . total || 0 ,
110+ role : result . visitorRole || ""
111+ } ) ;
112+ }
113+ } )
114+ } , 500 ) , [ dispatch ]
115+ ) ;
116+
117+ useEffect ( ( ) => {
118+ if ( searchValue . length > 2 || searchValue === "" ) {
119+ debouncedFetchPotentialMembers ( searchValue ) ;
120+ }
121+ return ( ) => {
122+ debouncedFetchPotentialMembers . cancel ( ) ;
123+ } ;
124+ } , [ searchValue , debouncedFetchPotentialMembers ] ) ;
125+
68126 return (
69127 < >
70128 < PermissionHeaderWrapper >
@@ -78,19 +136,31 @@ function GroupUsersPermission(props: GroupPermissionProp) {
78136 ) }
79137 </ HeaderBack >
80138 { isGroupAdmin ( currentUserGroupRole ) && ! group . syncGroup && (
81- < AddGroupUserDialog
82- groupUsers = { groupUsers }
83- orgId = { orgId }
84- groupId = { group . groupId }
85- setModify = { setModify }
86- modify = { modify }
87- trigger = {
88- < AddMemberButton buttonType = "primary" icon = { < StyledAddIcon /> } >
89- { trans ( "memberSettings.addMember" ) }
90- </ AddMemberButton >
91- }
92- style = { { marginLeft : "auto" } }
93- />
139+ < OptionsHeader >
140+ < Search
141+ placeholder = { trans ( "memberSettings.searchMember" ) }
142+ value = { searchValue }
143+ onChange = { ( e ) => setSearchValue ( e . target . value ) }
144+ style = { {
145+ width : "20%" ,
146+ minWidth : "160px" ,
147+ height : "32px" ,
148+ marginTop : 'auto'
149+ } }
150+ />
151+ < AddGroupUserDialog
152+ groupUsers = { groupUsers }
153+ orgId = { orgId }
154+ groupId = { group . groupId }
155+ setModify = { setModify }
156+ modify = { modify }
157+ trigger = {
158+ < AddMemberButton buttonType = "primary" icon = { < StyledAddIcon /> } >
159+ { trans ( "memberSettings.addMember" ) }
160+ </ AddMemberButton >
161+ }
162+ />
163+ </ OptionsHeader >
94164 ) }
95165 </ PermissionHeaderWrapper >
96166 < TableStyled
0 commit comments