@@ -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,22 @@ 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+ :model- value =" 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"
470- @change ="
471- handleChangeRole(
472- member.name,
473- ($event.target as HTMLSelectElement).value as 'developer' | 'admin' | 'owner',
474- )
475- "
476- >
477- <option value =" developer" >{{ getRoleLabel('developer') }}</option >
478- <option value =" admin" >{{ getRoleLabel('admin') }}</option >
479- <option value =" owner" >{{ getRoleLabel('owner') }}</option >
480- </select >
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"
480+ @update:modelValue =" value => handleChangeRole(member.name, value as MemberRole)"
481+ />
481482 <!-- Remove button -->
482483 <button
483484 type =" button"
@@ -528,30 +529,36 @@ watch(lastExecutionTime, () => {
528529 size =" small"
529530 />
530531 <div class =" flex items-center gap-2" >
531- <label for =" new-member-role" class =" sr-only" >{{ $t('org.members.role_label') }}</label >
532- <select
532+ <SelectField
533+ :label =" $t('org.members.role_label')"
534+ hidden-label
533535 id =" new-member-role"
534536 v-model =" newRole"
535537 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 >
538+ block
539+ class =" flex-1"
540+ size =" sm"
541+ :items =" [
542+ { label: $t('org.members.role.developer'), value: 'developer' },
543+ { label: $t('org.members.role.admin'), value: 'admin' },
544+ { label: $t('org.members.role.owner'), value: 'owner' },
545+ ]"
546+ />
542547 <!-- Team selection -->
543- <label for =" new-member-team" class =" sr-only" >{{ $t('org.members.team_label') }}</label >
544- <select
548+ <SelectField
549+ :label =" $t('org.members.team_label')"
550+ hidden-label
545551 id =" new-member-team"
546552 v-model =" newTeam"
547553 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 >
554+ block
555+ class =" flex-1"
556+ size =" sm"
557+ :items =" [
558+ { label: $t('org.members.no_team'), value: '' },
559+ ...teamNames.map(team => ({ label: team, value: team })),
560+ ]"
561+ />
555562 <button
556563 type =" submit"
557564 :disabled =" !newUsername.trim() || isAddingMember"
0 commit comments