Skip to content

Work / Scrvio / Wiki / Surfaces

members

Surfacecanonicalverified 2026-10-04

SURFACE.WEB.MEMBERS

Summary

The members of a workspace, each with a role badge and, for non-owners, role and remove actions.

Raw wireframe

  • .context/designs/web/workspace/members.html
  • .context/designs/web/workspace/members-empty.html

Why it is drawn this way

The owner row has no actions. Change Role and the remove button render only when member.role !== "OWNER".

The actions ignore who is looking. The page never checks the viewer's own role, so a Member sees the same buttons. The server refuses: org-member.service.ts allows only OWNER and ADMIN.

VIEWER is handled but does not exist. getRoleBadgeColor has a VIEWER case, and auth/benefits.ts advertises the role. The Prisma enum OrgMemberRole is OWNER, ADMIN, MEMBER only, and the role select offers only Member and Admin.

Remove is a confirm that is not drawn here. The trash button opens a ConfirmDialog titled Remove Member with the default Confirm label and no destructive styling. It is a button in the wireframe; the shape is on the confirm-dialogs sheet.

The empty state should not happen. Creating a workspace also creates the owner's membership (organization.service.ts), so the list has at least one row. The branch exists in the code, so it is drawn.

No way back to the workspace. There is no breadcrumb or back link on this page.

Avatars are one colour. The app picks one of six colours from a hash of the name. The drawing uses the set's single avatar colour.

Related

Sources

  • apps/website/src/app/workspace/[id]/members/page.tsx
  • packages/db/prisma/schema.prisma
  • apps/server/src/api/02-organization/org-member/org-member.service.ts
  • packages/ui/src/components/ui/avatar.tsx