@@ -44,23 +44,42 @@ const userRoles: DashboardSelectItem[] = [
44
44
title : "Admin" ,
45
45
description : "Can manage, create and delete all projects, configs, environments, flags and values." ,
46
46
} ,
47
+ {
48
+ value : "owner" ,
49
+ title : "Owner" ,
50
+ description : "Owns this team and can change it in any way. Selecting this option will change the ownership of this team."
51
+ }
47
52
] ;
48
53
49
54
export default function Team ( ) {
50
55
const [ teamData , projectsData , userData ] = useLoaderData ( ) as TeamLoaderData ;
51
56
const [ projects , setProjects ] = useState < ProjectRecord [ ] > ( projectsData ) ;
52
57
const [ newProjectName , setNewProjectName ] = useState < string > ( "" ) ;
53
- const [ userToAdd , setUserToAdd ] = useState < UserRecord | null > ( null ) ;
54
- const [ userRole , setUserRole ] = useState < DashboardSelectItem | null > ( userRoles [ 0 ] ) ;
58
+ const [ userToAdd , setUserToAddInner ] = useState < UserRecord | null > ( null ) ;
59
+ const [ userRole , setUserRoleInner ] = useState < DashboardSelectItem | null > ( userRoles [ 0 ] ) ;
55
60
const [ error , setError ] = useState < string > ( "" ) ;
56
61
const [ memberError , setMemberError ] = useState < string > ( "" ) ;
57
62
const [ team , setTeam ] = useState < TeamRecord > ( teamData ) ;
58
63
const [ reset , setReset ] = useState < boolean > ( false ) ;
64
+ const [ terribleActionConfirm , setTerribleActionConfirm ] = useState < boolean > ( false ) ;
59
65
60
66
const [ deleteObjectType , setDeleteObjectType ] = useState < string > ( "" ) ;
61
67
const [ deleteObject , setDeleteObject ] = useState < ProjectRecord | UserRecord | null > ( null ) ;
62
68
const [ deleteObjectError , setDeleteObjectError ] = useState < string > ( "" ) ;
63
69
70
+ // reset the terrible action confirmed if either input is changed.
71
+ function setUserRole ( item : DashboardSelectItem | null ) {
72
+ setTerribleActionConfirm ( false ) ;
73
+
74
+ setUserRoleInner ( item ) ;
75
+ }
76
+
77
+ function setUserToAdd ( item : UserRecord | null ) {
78
+ setTerribleActionConfirm ( false ) ;
79
+
80
+ setUserToAddInner ( item ) ;
81
+ }
82
+
64
83
const navigate = useNavigate ( ) ;
65
84
66
85
useEffect ( ( ) => {
@@ -135,8 +154,8 @@ export default function Team() {
135
154
< SelectInput items = { userRoles } onSelectedItemChange = { setUserRole } defaultValue = { userRole } />
136
155
</ DialogBody >
137
156
< DialogFooter >
138
- < button className = "dialog-action dialog-action__save"
139
- onClick = { ( ) => addTeamMember ( ) } > Add Member
157
+ < button className = { "dialog-action " + ( userRole ?. value === "owner" ? " dialog-action__delete" : " dialog- action__save") }
158
+ onClick = { ( ) => addTeamMember ( ) } > { userRole ?. value === "owner" ? "Transfer Ownership" : " Add Member" }
140
159
</ button >
141
160
< button className = "dialog-action dialog-action__cancel"
142
161
onClick = { ( ) => setUserAddDialogShowing ( false ) } > Cancel
@@ -148,6 +167,7 @@ export default function Team() {
148
167
if ( ! showing ) {
149
168
setUserToAdd ( null ) ;
150
169
setReset ( true ) ;
170
+ setTerribleActionConfirm ( false ) ;
151
171
} else {
152
172
setReset ( false ) ;
153
173
}
@@ -228,6 +248,26 @@ export default function Team() {
228
248
return ;
229
249
}
230
250
251
+ if ( userRole ?. value === "owner" ) {
252
+ if ( ! terribleActionConfirm ) {
253
+ setMemberError ( "Please click again to confirm that you want to transfer ownership" ) ;
254
+ setTimeout ( ( ) => setMemberError ( '' ) , 5000 ) ;
255
+ setTerribleActionConfirm ( true ) ;
256
+ return ;
257
+ }
258
+ } else {
259
+ setTerribleActionConfirm ( false ) ;
260
+ }
261
+
262
+ // check if the userRole is owner and warn them that they are about to transfer ownership
263
+ if ( userRole ?. value === "owner" ) {
264
+ if ( team . owner === userToAdd . id ) {
265
+ setMemberError ( "User is already the owner of the team" ) ;
266
+ setTimeout ( ( ) => setMemberError ( '' ) , 5000 ) ;
267
+ return ;
268
+ }
269
+ }
270
+
231
271
if ( userRole === null ) {
232
272
setMemberError ( "Please select a role for the user" ) ;
233
273
setTimeout ( ( ) => setMemberError ( '' ) , 5000 ) ;
@@ -259,22 +299,35 @@ export default function Team() {
259
299
return ;
260
300
}
261
301
262
- // add user to team
263
- pocketbase . collection ( 'team' ) . update ( team . id , {
302
+ let bodyParams : any = {
264
303
[ userRole . value ] : [ ...team [ userRole . value ] , userToAdd . id ] ,
265
- } ) . then ( ( ) => {
304
+ }
305
+
306
+ if ( userRole . value === "owner" ) {
307
+ bodyParams = {
308
+ ...bodyParams ,
309
+ owner : userToAdd . id ,
310
+ }
311
+ }
312
+
313
+ // add user to team (or replace owner)
314
+ pocketbase . collection ( 'team' ) . update ( team . id , bodyParams ) . then ( ( ) => {
266
315
// need to add it manually because otherwise we lose the extra data
267
316
const userObjectClone = { ...userToAdd } as UserRecord ;
268
317
269
318
setTeam ( team => {
270
319
let teamClone = { ...team } as TeamRecord ;
271
320
272
- teamClone [ userRole . value ] . push ( userObjectClone . id ) ;
321
+ if ( userRole . value === "owner" ) {
322
+ teamClone . owner = userObjectClone . id ;
323
+ } else {
324
+ teamClone [ userRole . value ] . push ( userObjectClone . id ) ;
273
325
274
- // @ts -ignore
275
- if ( teamClone . expand [ userRole . value ] ) {
276
326
// @ts -ignore
277
- teamClone . expand [ userRole . value ] . push ( userObjectClone ) ;
327
+ if ( teamClone . expand [ userRole . value ] ) {
328
+ // @ts -ignore
329
+ teamClone . expand [ userRole . value ] . push ( userObjectClone ) ;
330
+ }
278
331
}
279
332
280
333
return teamClone ;
0 commit comments