22import type { NewOperation } from ' ~/composables/useConnector'
33import { buildScopeTeam } from ' ~/utils/npm/common'
44
5+ type MemberRole = ' developer' | ' admin' | ' owner'
6+ type MemberRoleFilter = MemberRole | ' all'
7+
58const props = defineProps <{
69 orgName: string
710}>()
@@ -21,7 +24,7 @@ const {
2124} = useConnector ()
2225
2326// Members data: { username: role }
24- const members = shallowRef <Record <string , ' developer ' | ' admin ' | ' owner ' >>({})
27+ const members = shallowRef <Record <string , MemberRole >>({})
2528const isLoading = shallowRef (false )
2629const error = shallowRef <string | null >(null )
2730
@@ -31,15 +34,15 @@ const isLoadingTeams = shallowRef(false)
3134
3235// Search/filter
3336const searchQuery = shallowRef (' ' )
34- const filterRole = shallowRef <' all ' | ' developer ' | ' admin ' | ' owner ' >(' all' )
37+ const filterRole = shallowRef <MemberRoleFilter >(' all' )
3538const filterTeam = shallowRef <string | null >(null )
3639const sortBy = shallowRef <' name' | ' role' >(' name' )
3740const sortOrder = shallowRef <' asc' | ' desc' >(' asc' )
3841
3942// Add member form
4043const showAddMember = shallowRef (false )
4144const newUsername = shallowRef (' ' )
42- const newRole = shallowRef <' developer ' | ' admin ' | ' owner ' >(' developer' )
45+ const newRole = shallowRef <MemberRole >(' developer' )
4346const newTeam = shallowRef <string >(' ' ) // Empty string means "developers" (default)
4447const isAddingMember = shallowRef (false )
4548
@@ -259,6 +262,17 @@ function getRoleBadgeClass(role: string): string {
259262 }
260263}
261264
265+ const roleLabels = computed (() => ({
266+ owner: $t (' org.members.role.owner' ),
267+ admin: $t (' org.members.role.admin' ),
268+ developer: $t (' org.members.role.developer' ),
269+ all: $t (' org.members.role.all' ),
270+ }))
271+
272+ function getRoleLabel(role : MemberRoleFilter ): string {
273+ return roleLabels .value [role ]
274+ }
275+
262276// Click on team badge to switch to teams tab and highlight
263277function handleTeamClick(teamName : string ) {
264278 emit (' select-team' , teamName )
@@ -341,7 +355,7 @@ watch(lastExecutionTime, () => {
341355 :aria-pressed =" filterRole === role"
342356 @click =" filterRole = role"
343357 >
344- {{ $t(`org.members. role.${role}` ) }}
358+ {{ getRoleLabel( role) }}
345359 <span v-if =" role !== 'all'" class =" text-fg-subtle" >({{ roleCounts[role] }})</span >
346360 </button >
347361 </div >
@@ -439,7 +453,7 @@ watch(lastExecutionTime, () => {
439453 class =" px-1.5 py-0.5 font-mono text-xs border rounded"
440454 :class =" getRoleBadgeClass(member.role)"
441455 >
442- {{ member.role }}
456+ {{ getRoleLabel( member.role) }}
443457 </span >
444458 </div >
445459 <div class =" flex items-center gap-1" >
@@ -459,9 +473,9 @@ watch(lastExecutionTime, () => {
459473 )
460474 "
461475 >
462- <option value =" developer" >{{ $t('org.members.role. developer') }}</option >
463- <option value =" admin" >{{ $t('org.members.role. admin') }}</option >
464- <option value =" owner" >{{ $t('org.members.role. owner') }}</option >
476+ <option value =" developer" >{{ getRoleLabel(' developer') }}</option >
477+ <option value =" admin" >{{ getRoleLabel(' admin') }}</option >
478+ <option value =" owner" >{{ getRoleLabel(' owner') }}</option >
465479 </select >
466480 <!-- Remove button -->
467481 <button
0 commit comments