@@ -148,6 +148,7 @@ interface WorkspaceSharingFormProps {
148148updatingGroupId ?:WorkspaceGroup [ "id" ] | undefined ;
149149onRemoveGroup :( group :Group ) => void ;
150150addMemberForm ?:ReactNode ;
151+ isCompact ?:boolean ;
151152}
152153
153154export const WorkspaceSharingForm :FC < WorkspaceSharingFormProps > = ( {
@@ -161,143 +162,168 @@ export const WorkspaceSharingForm: FC<WorkspaceSharingFormProps> = ({
161162onUpdateGroup,
162163onRemoveGroup,
163164addMemberForm,
165+ isCompact,
164166} ) => {
165167const isEmpty = Boolean (
166168workspaceACL &&
167169workspaceACL . users . length === 0 &&
168170workspaceACL . group . length === 0 ,
169171) ;
170172
171- return (
172- < div className = "flex flex-col gap-4" >
173- { Boolean ( error ) && < ErrorAlert error = { error } /> }
174- { canUpdatePermissions && addMemberForm }
175- < Table >
176- < TableHeader >
177- < TableRow >
178- < TableHead className = "w-[60%] py-2" > Member</ TableHead >
179- < TableHead className = "w-[40%] py-2" > Role</ TableHead >
180- < TableHead className = "w-[1%] py-2" />
181- </ TableRow >
182- </ TableHeader >
183- < TableBody >
184- { ! workspaceACL ?(
185- < TableLoader />
186- ) :isEmpty ?(
187- < TableRow >
188- < TableCell colSpan = { 999 } >
189- < EmptyState
190- message = "No shared members or groups yet"
191- description = "Add a member or group using the controls above"
173+ const tableHeader = (
174+ < TableHeader >
175+ < TableRow >
176+ < TableHead className = "w-[50%] py-2" > Member</ TableHead >
177+ < TableHead className = "w-[40%] py-2" > Role</ TableHead >
178+ < TableHead className = "w-[10%] py-2" />
179+ </ TableRow >
180+ </ TableHeader >
181+ ) ;
182+
183+ const tableBody = (
184+ < TableBody >
185+ { ! workspaceACL ?(
186+ < TableLoader />
187+ ) :isEmpty ?(
188+ < TableRow >
189+ < TableCell colSpan = { 999 } >
190+ < EmptyState
191+ message = "No shared members or groups yet"
192+ description = "Add a member or group using the controls above"
193+ isCompact = { isCompact }
194+ />
195+ </ TableCell >
196+ </ TableRow >
197+ ) :(
198+ < >
199+ { workspaceACL . group . map ( ( group ) => (
200+ < TableRow key = { group . id } >
201+ < TableCell className = "py-2 w-[50%]" >
202+ < AvatarData
203+ avatar = {
204+ < Avatar
205+ size = "lg"
206+ fallback = { group . display_name || group . name }
207+ src = { group . avatar_url }
208+ />
209+ }
210+ title = { group . display_name || group . name }
211+ subtitle = { getGroupSubtitle ( group ) }
192212/>
193213</ TableCell >
214+ < TableCell className = "py-2 w-[40%]" >
215+ { canUpdatePermissions ?(
216+ < RoleSelect
217+ value = { group . role }
218+ disabled = { updatingGroupId === group . id }
219+ onValueChange = { ( value ) => onUpdateGroup ( group , value ) }
220+ />
221+ ) :(
222+ < div className = "capitalize" > { group . role } </ div >
223+ ) }
224+ </ TableCell >
225+
226+ < TableCell className = "py-2 w-[10%]" >
227+ { canUpdatePermissions && (
228+ < DropdownMenu >
229+ < DropdownMenuTrigger asChild >
230+ < Button
231+ size = "icon-lg"
232+ variant = "subtle"
233+ aria-label = "Open menu"
234+ >
235+ < EllipsisVertical aria-hidden = "true" />
236+ < span className = "sr-only" > Open menu</ span >
237+ </ Button >
238+ </ DropdownMenuTrigger >
239+ < DropdownMenuContent align = "end" >
240+ < DropdownMenuItem
241+ className = "text-content-destructive focus:text-content-destructive"
242+ onClick = { ( ) => onRemoveGroup ( group ) }
243+ >
244+ Remove
245+ </ DropdownMenuItem >
246+ </ DropdownMenuContent >
247+ </ DropdownMenu >
248+ ) }
249+ </ TableCell >
194250</ TableRow >
195- ) :(
196- < >
197- { workspaceACL . group . map ( ( group ) => (
198- < TableRow key = { group . id } >
199- < TableCell className = "py-2" >
200- < AvatarData
201- avatar = {
202- < Avatar
203- size = "lg"
204- fallback = { group . display_name || group . name }
205- src = { group . avatar_url }
206- />
207- }
208- title = { group . display_name || group . name }
209- subtitle = { getGroupSubtitle ( group ) }
210- />
211- </ TableCell >
212- < TableCell className = "py-2" >
213- { canUpdatePermissions ?(
214- < RoleSelect
215- value = { group . role }
216- disabled = { updatingGroupId === group . id }
217- onValueChange = { ( value ) => onUpdateGroup ( group , value ) }
218- />
219- ) :(
220- < div className = "capitalize" > { group . role } </ div >
221- ) }
222- </ TableCell >
251+ ) ) }
223252
224- < TableCell className = "py-2" >
225- { canUpdatePermissions && (
226- < DropdownMenu >
227- < DropdownMenuTrigger asChild >
228- < Button
229- size = "icon-lg"
230- variant = "subtle"
231- aria-label = "Open menu"
232- >
233- < EllipsisVertical aria-hidden = "true" />
234- < span className = "sr-only" > Open menu</ span >
235- </ Button >
236- </ DropdownMenuTrigger >
237- < DropdownMenuContent align = "end" >
238- < DropdownMenuItem
239- className = "text-content-destructive focus:text-content-destructive"
240- onClick = { ( ) => onRemoveGroup ( group ) }
241- >
242- Remove
243- </ DropdownMenuItem >
244- </ DropdownMenuContent >
245- </ DropdownMenu >
246- ) }
247- </ TableCell >
248- </ TableRow >
249- ) ) }
253+ { workspaceACL . users . map ( ( user ) => (
254+ < TableRow key = { user . id } >
255+ < TableCell className = "py-2 w-[50%]" >
256+ < AvatarData
257+ title = { user . username }
258+ subtitle = { user . name }
259+ src = { user . avatar_url }
260+ />
261+ </ TableCell >
262+ < TableCell className = "py-2 w-[40%]" >
263+ { canUpdatePermissions ?(
264+ < RoleSelect
265+ value = { user . role }
266+ disabled = { updatingUserId === user . id }
267+ onValueChange = { ( value ) => onUpdateUser ( user , value ) }
268+ />
269+ ) :(
270+ < div className = "capitalize" > { user . role } </ div >
271+ ) }
272+ </ TableCell >
250273
251- { workspaceACL . users . map ( ( user ) => (
252- < TableRow key = { user . id } >
253- < TableCell className = "py-2" >
254- < AvatarData
255- title = { user . username }
256- subtitle = { user . name }
257- src = { user . avatar_url }
258- />
259- </ TableCell >
260- < TableCell className = "py-2" >
261- { canUpdatePermissions ?(
262- < RoleSelect
263- value = { user . role }
264- disabled = { updatingUserId === user . id }
265- onValueChange = { ( value ) => onUpdateUser ( user , value ) }
266- />
267- ) :(
268- < div className = "capitalize" > { user . role } </ div >
269- ) }
270- </ TableCell >
274+ < TableCell className = "py-2 w-[10%]" >
275+ { canUpdatePermissions && (
276+ < DropdownMenu >
277+ < DropdownMenuTrigger asChild >
278+ < Button
279+ size = "icon-lg"
280+ variant = "subtle"
281+ aria-label = "Open menu"
282+ >
283+ < EllipsisVertical aria-hidden = "true" />
284+ < span className = "sr-only" > Open menu</ span >
285+ </ Button >
286+ </ DropdownMenuTrigger >
287+ < DropdownMenuContent align = "end" >
288+ < DropdownMenuItem
289+ className = "text-content-destructive focus:text-content-destructive"
290+ onClick = { ( ) => onRemoveUser ( user ) }
291+ >
292+ Remove
293+ </ DropdownMenuItem >
294+ </ DropdownMenuContent >
295+ </ DropdownMenu >
296+ ) }
297+ </ TableCell >
298+ </ TableRow >
299+ ) ) }
300+ </ >
301+ ) }
302+ </ TableBody >
303+ ) ;
271304
272- < TableCell className = "py-2" >
273- { canUpdatePermissions && (
274- < DropdownMenu >
275- < DropdownMenuTrigger asChild >
276- < Button
277- size = "icon-lg"
278- variant = "subtle"
279- aria-label = "Open menu"
280- >
281- < EllipsisVertical aria-hidden = "true" />
282- < span className = "sr-only" > Open menu</ span >
283- </ Button >
284- </ DropdownMenuTrigger >
285- < DropdownMenuContent align = "end" >
286- < DropdownMenuItem
287- className = "text-content-destructive focus:text-content-destructive"
288- onClick = { ( ) => onRemoveUser ( user ) }
289- >
290- Remove
291- </ DropdownMenuItem >
292- </ DropdownMenuContent >
293- </ DropdownMenu >
294- ) }
295- </ TableCell >
296- </ TableRow >
297- ) ) }
298- </ >
299- ) }
300- </ TableBody >
305+ if ( isCompact ) {
306+ return (
307+ < div className = "flex flex-col gap-4" >
308+ { Boolean ( error ) && < ErrorAlert error = { error } /> }
309+ { canUpdatePermissions && addMemberForm }
310+ < div >
311+ < Table > { tableHeader } </ Table >
312+ < div className = "max-h-60 overflow-y-auto" >
313+ < Table > { tableBody } </ Table >
314+ </ div >
315+ </ div >
316+ </ div >
317+ ) ;
318+ }
319+
320+ return (
321+ < div className = "flex flex-col gap-4" >
322+ { Boolean ( error ) && < ErrorAlert error = { error } /> }
323+ { canUpdatePermissions && addMemberForm }
324+ < Table >
325+ { tableHeader }
326+ { tableBody }
301327</ Table >
302328</ div >
303329) ;