1515 :rules =" formRules"
1616 :label-col =" { style: { width: '100px' } }"
1717 :wrapper-col =" { flex: 1 }" >
18- <a-form-item
19- :label =" $t('pages.member.form.user')"
20- name =" user" >
21- <a-input
22- :placeholder =" $t('pages.member.form.user.placeholder')"
23- v-model:value =" formData.user"
24- :disabled =" modal.type === 'edit'" />
25- </a-form-item >
2618 <a-form-item
2719 :label =" $t('pages.member.form.tenant')"
2820 name =" tenant" >
29- <a-input
21+ <a-select
22+ v-model:value =" formData.tenant"
23+ show-search
24+ :disabled =" modal.type === 'edit'"
3025 :placeholder =" $t('pages.member.form.tenant.placeholder')"
31- v-model:value =" formData.tenant" />
26+ :filter-option =" filterSpaceOption" >
27+ <a-select-option
28+ v-for =" item in spaceOptions"
29+ :key =" item.value"
30+ :value =" item.value"
31+ :label =" item.label" >
32+ {{ item.label }}
33+ </a-select-option >
34+ </a-select >
35+ </a-form-item >
36+ <a-form-item
37+ :label =" $t('pages.member.form.user')"
38+ name =" user" >
39+ <a-select
40+ v-model:value =" formData.user"
41+ show-search
42+ :disabled =" modal.type === 'edit'"
43+ :placeholder =" $t('pages.member.form.user.placeholder')"
44+ :filter-option =" filterUserOption" >
45+ <a-select-option
46+ v-for =" item in userOptions"
47+ :key =" item.value"
48+ :value =" item.value"
49+ :label =" item.label" >
50+ {{ item.label }}
51+ </a-select-option >
52+ </a-select >
3253 </a-form-item >
3354 <a-form-item
3455 :label =" $t('pages.member.form.role')"
3556 name =" role" >
3657 <a-select
3758 :placeholder =" $t('pages.member.form.role.placeholder')"
3859 v-model:value =" formData.role" >
39- <a-select-option value =" owner" >owner</a-select-option >
4060 <a-select-option value =" admin" >admin</a-select-option >
61+ <a-select-option value =" user" >user</a-select-option >
4162 <a-select-option value =" viewer" >viewer</a-select-option >
4263 </a-select >
4364 </a-form-item >
4465 <a-form-item
4566 :label =" $t('pages.member.form.permission')"
4667 name =" permission" >
47- <a-checkbox-group v-model:value =" formData.permissions" >
68+ <a-checkbox-group
69+ v-model:value =" formData.permissions"
70+ disabled >
4871 <a-checkbox value =" read" >{{ $t('pages.member.form.permission.read') }}</a-checkbox >
4972 <a-checkbox value =" write" >{{ $t('pages.member.form.permission.write') }}</a-checkbox >
5073 <a-checkbox value =" delete" >{{ $t('pages.member.form.permission.delete') }}</a-checkbox >
5679
5780<script setup>
5881import { cloneDeep } from ' lodash-es'
59- import { ref } from ' vue'
82+ import { ref , watch } from ' vue'
6083import { config } from ' @/config'
6184import apis from ' @/apis'
6285import { useForm , useModal } from ' @/hooks'
@@ -73,6 +96,71 @@ const { t } = useI18n()
7396const cancelText = ref (t (' button.cancel' ))
7497const okText = ref (t (' button.confirm' ))
7598
99+ const userOptions = ref ([])
100+ const spaceOptions = ref ([])
101+
102+ async function loadUsers () {
103+ try {
104+ const result = await apis .users .getUsersList ({ pageSize: 100 , current: 1 }).catch (() => null )
105+ const list = []
106+ if (result && config (' http.code.success' ) === result .success && result .data ) {
107+ list .push (
108+ ... result .data .map ((user ) => ({
109+ label: user .name ? ` ${ user .name } (${ user .username } )` : user .username ,
110+ value: user .username ,
111+ }))
112+ )
113+ }
114+ userOptions .value = list
115+ } catch (e) {
116+ console .error (' 加载成员列表失败:' , e)
117+ }
118+ }
119+
120+ async function loadSpaces () {
121+ try {
122+ const result = await apis .space .getSpaceList ({ pageSize: 100 , current: 1 }).catch (() => null )
123+ const list = []
124+ if (result && config (' http.code.success' ) === result .success && result .data ) {
125+ list .push (
126+ ... result .data .map ((space ) => ({
127+ label: space .name ? ` ${ space .name } (${ space .code } )` : space .code ,
128+ value: space .code ,
129+ }))
130+ )
131+ }
132+ spaceOptions .value = list
133+ } catch (e) {
134+ console .error (' 加载空间列表失败:' , e)
135+ }
136+ }
137+
138+ function filterUserOption (input , option ) {
139+ const label = option .label || ' '
140+ return label .toLowerCase ().includes (input .toLowerCase ())
141+ }
142+
143+ function filterSpaceOption (input , option ) {
144+ const label = option .label || ' '
145+ return label .toLowerCase ().includes (input .toLowerCase ())
146+ }
147+
148+ loadUsers ()
149+ loadSpaces ()
150+
151+ watch (
152+ () => formData .value .role ,
153+ (newRole ) => {
154+ if (newRole === ' admin' ) {
155+ formData .value .permissions = [' read' , ' write' , ' delete' ]
156+ } else if (newRole === ' user' ) {
157+ formData .value .permissions = [' read' , ' write' ]
158+ } else if (newRole === ' viewer' ) {
159+ formData .value .permissions = [' read' ]
160+ }
161+ }
162+ )
163+
76164const permToBits = { read: 1 , write: 2 , delete: 4 }
77165const bitsToPerms = (bits ) => {
78166 const perms = []
@@ -94,7 +182,12 @@ function handleCreate() {
94182 type: ' create' ,
95183 title: t (' pages.member.add' ),
96184 })
97- formData .value = { permissions: [' read' ] }
185+ formData .value = {
186+ user: undefined ,
187+ tenant: undefined ,
188+ role: undefined ,
189+ permissions: [' read' ],
190+ }
98191}
99192
100193async function handleEdit (record = {}) {
@@ -121,7 +214,7 @@ function handleOk() {
121214 user: values .user ,
122215 tenant: values .tenant ,
123216 role: values .role ,
124- permission: permsToBits (values .permissions || []),
217+ permission: permsToBits (formData . value .permissions || []),
125218 }
126219 let result = null
127220 switch (modal .value .type ) {
0 commit comments