@@ -35,7 +35,7 @@ const isLoadingTeams = shallowRef(false)
3535// Search/filter
3636const searchQuery = shallowRef (' ' )
3737const filterRole = shallowRef <MemberRoleFilter >(' all' )
38- const filterTeam = shallowRef <string | null >( null )
38+ const filterTeam = shallowRef <string >( ' ' )
3939const sortBy = shallowRef <' name' | ' role' >(' name' )
4040const sortOrder = shallowRef <' asc' | ' desc' >(' asc' )
4141
@@ -362,18 +362,19 @@ watch(lastExecutionTime, () => {
362362 </div >
363363 <!-- Team filter -->
364364 <div v-if =" teamNames.length > 0" >
365- <label for =" team-filter" class =" sr-only" >{{ $t('org.members.filter_by_team') }}</label >
366- <select
365+ <SelectField
366+ :label =" $t('org.members.filter_by_team')"
367+ hidden-label
367368 id =" team-filter"
368369 v-model =" filterTeam"
369370 name =" team-filter"
370- class = " px-2 py-1 font-mono text-xs bg-bg-subtle border border-border rounded text-fg transition-colors duration-200 focus:border-border-hover "
371- >
372- < option :value = " null " >{{ $t('org.members.all_teams') }}</ option >
373- < option v-for = " team in teamNames " :key = " team " : value= " team " >
374- {{ team }}
375- </ option >
376- </ select >
371+ block
372+ size = " sm "
373+ :items = " [
374+ { label: $t('org.members.all_teams'), value: '' },
375+ ...teamNames.map(team => ({ label: team, value: team })),
376+ ] "
377+ / >
377378 </div >
378379 <div
379380 class =" flex items-center gap-1 text-xs"
@@ -462,22 +463,27 @@ watch(lastExecutionTime, () => {
462463 <label :for =" `role-${member.name}`" class =" sr-only" >{{
463464 $t('org.members.change_role_for', { name: member.name })
464465 }}</label >
465- <select
466+ <SelectField
467+ :label =" $t('org.members.change_role_for', { name: member.name })"
468+ hidden-label
466469 :id =" `role-${member.name}`"
467- :value =" member.role"
470+ v-model =" member.role"
468471 :name =" `role-${member.name}`"
469- class =" px-1.5 py-0.5 font-mono text-xs bg-bg-subtle border border-border rounded text-fg transition-colors duration-200 focus:border-border-hover"
472+ block
473+ size =" sm"
474+ :items =" [
475+ { label: getRoleLabel('developer'), value: 'developer' },
476+ { label: getRoleLabel('admin'), value: 'admin' },
477+ { label: getRoleLabel('owner'), value: 'owner' },
478+ ]"
479+ :value =" member.role"
470480 @change ="
471481 handleChangeRole(
472482 member.name,
473483 ($event.target as HTMLSelectElement).value as 'developer' | 'admin' | 'owner',
474484 )
475485 "
476- >
477- <option value =" developer" >{{ getRoleLabel('developer') }}</option >
478- <option value =" admin" >{{ getRoleLabel('admin') }}</option >
479- <option value =" owner" >{{ getRoleLabel('owner') }}</option >
480- </select >
486+ />
481487 <!-- Remove button -->
482488 <button
483489 type =" button"
@@ -528,30 +534,36 @@ watch(lastExecutionTime, () => {
528534 size =" small"
529535 />
530536 <div class =" flex items-center gap-2" >
531- <label for =" new-member-role" class =" sr-only" >{{ $t('org.members.role_label') }}</label >
532- <select
537+ <SelectField
538+ :label =" $t('org.members.role_label')"
539+ hidden-label
533540 id =" new-member-role"
534541 v-model =" newRole"
535542 name =" new-member-role"
536- class =" flex-1 px-2 py-1.5 font-mono text-sm bg-bg border border-border rounded text-fg transition-colors duration-200 focus:border-border-hover"
537- >
538- <option value =" developer" >{{ $t('org.members.role.developer') }}</option >
539- <option value =" admin" >{{ $t('org.members.role.admin') }}</option >
540- <option value =" owner" >{{ $t('org.members.role.owner') }}</option >
541- </select >
543+ block
544+ class =" flex-1"
545+ size =" sm"
546+ :items =" [
547+ { label: $t('org.members.role.developer'), value: 'developer' },
548+ { label: $t('org.members.role.admin'), value: 'admin' },
549+ { label: $t('org.members.role.owner'), value: 'owner' },
550+ ]"
551+ />
542552 <!-- Team selection -->
543- <label for =" new-member-team" class =" sr-only" >{{ $t('org.members.team_label') }}</label >
544- <select
553+ <SelectField
554+ :label =" $t('org.members.team_label')"
555+ hidden-label
545556 id =" new-member-team"
546557 v-model =" newTeam"
547558 name =" new-member-team"
548- class =" flex-1 px-2 py-1.5 font-mono text-sm bg-bg border border-border rounded text-fg transition-colors duration-200 focus:border-border-hover"
549- >
550- <option value =" " >{{ $t('org.members.no_team') }}</option >
551- <option v-for =" team in teamNames" :key =" team" :value =" team" >
552- {{ team }}
553- </option >
554- </select >
559+ block
560+ class =" flex-1"
561+ size =" sm"
562+ :items =" [
563+ { label: $t('org.members.no_team'), value: '' },
564+ ...teamNames.map(team => ({ label: team, value: team })),
565+ ]"
566+ />
555567 <button
556568 type =" submit"
557569 :disabled =" !newUsername.trim() || isAddingMember"
0 commit comments