Skip to content

Commit a257fbb

Browse files
committed
feat: 更新成员设置,添加学校选择功能并优化角色过滤
1 parent 5d15dad commit a257fbb

7 files changed

Lines changed: 87 additions & 65 deletions

File tree

src/assets/css/team/raid/member_setting.less

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -236,23 +236,6 @@
236236
}
237237
}
238238

239-
.m-raid-member-divider {
240-
display: flex;
241-
align-items: center;
242-
margin: 10px 0;
243-
color: @team-text-muted;
244-
font-size: 11px;
245-
gap: 10px;
246-
247-
&::before,
248-
&::after {
249-
height: 1px;
250-
flex: 1;
251-
background: @team-border-light;
252-
content: "";
253-
}
254-
}
255-
256239
.m-raid-member-setting__footer {
257240
display: flex;
258241
justify-content: flex-end;

src/components/team/raid/RaidMemberSetting.vue

Lines changed: 70 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,31 @@
2424
<span>{{ $t("team.raid.memberSetting.roleInfoHint") }}</span>
2525
</header>
2626

27-
<el-form-item :label="$t('team.raid.memberSetting.roleName')" prop="name">
28-
<el-input
29-
v-if="!['normal', 'sub'].includes(mode)"
30-
v-model="form.name"
31-
:placeholder="$t('team.raid.memberSetting.rolePlaceholder')"
27+
<el-form-item :label="$t('team.raid.memberSetting.school')">
28+
<el-select
29+
v-model="selectedSchool"
30+
:placeholder="$t('team.raid.memberSetting.schoolPlaceholder')"
3231
:disabled="!canEdit"
32+
filterable
3333
clearable
34-
/>
34+
@change="handleSchoolChange"
35+
>
36+
<el-option
37+
v-for="school in schoolOptions"
38+
:key="school.id"
39+
:label="school.name"
40+
:value="school.id"
41+
>
42+
<div class="m-raid-member-option">
43+
<img :src="showSchoolIcon(school.id)" :alt="school.name" />
44+
<span>{{ school.name }}</span>
45+
</div>
46+
</el-option>
47+
</el-select>
48+
</el-form-item>
3549

36-
<div v-else class="m-raid-member-source">
50+
<el-form-item :label="$t('team.raid.memberSetting.roleName')" prop="name">
51+
<div class="m-raid-member-source">
3752
<div v-if="form.role_id" class="m-raid-selected-role">
3853
<img :src="showMountIcon(form.mount)" :alt="form.name" />
3954
<div>
@@ -48,26 +63,25 @@
4863
popper-class="m-raid-pop-member-select"
4964
teleported
5065
filterable
66+
allow-create
5167
clearable
52-
:placeholder="$t('team.raid.memberSetting.selectBound')"
68+
:placeholder="$t('team.raid.memberSetting.rolePlaceholder')"
5369
:disabled="!canEdit"
5470
@change="handleChange"
5571
>
56-
<el-option v-for="role in roles" :key="role.ID" :label="role.name" :value="role.ID">
72+
<el-option
73+
v-for="role in filteredRoles"
74+
:key="role.ID"
75+
:label="role.name"
76+
:value="role.ID"
77+
>
5778
<div class="m-raid-member-option">
5879
<img :src="showSchoolIcon(role.mount)" :alt="role.name" />
5980
<span>{{ role.name }}</span>
6081
<small v-if="role.server">{{ role.server }}</small>
6182
</div>
6283
</el-option>
6384
</el-select>
64-
<div class="m-raid-member-divider"><span>{{ $t("team.raid.memberSetting.orTemporary") }}</span></div>
65-
<el-input
66-
v-model="form.name"
67-
:placeholder="$t('team.raid.memberSetting.temporaryPlaceholder')"
68-
:disabled="!canEdit"
69-
clearable
70-
/>
7185
</template>
7286
</div>
7387
</el-form-item>
@@ -113,9 +127,10 @@
113127
</template>
114128

115129
<script>
116-
import { getRoles, addNormalMember, addSubMember, updateMember } from "@/service/team/raid.js";
130+
import { addNormalMember, addSubMember, updateMember } from "@/service/team/raid.js";
117131
import xf_map from "@jx3box/jx3box-data/data/xf/xf.json";
118132
import mountg from "@jx3box/jx3box-data/data/xf/mount_group.json";
133+
import school_map from "@jx3box/jx3box-data/data/xf/schoolid.json";
119134
import cloneDeep from "lodash/cloneDeep";
120135
import pick from "lodash/pick";
121136
import { showMountIcon, showSchoolIcon } from "@/utils/filters";
@@ -147,7 +162,6 @@ export default {
147162
rules: {},
148163
roles: [],
149164
substitute: [],
150-
loading: false,
151165
addLoading: false,
152166
selectedSchool: 0,
153167
@@ -179,6 +193,13 @@ export default {
179193
}
180194
return Object.values(xf_map);
181195
},
196+
schoolOptions() {
197+
return Object.entries(school_map).map(([id, name]) => ({ id: Number(id), name }));
198+
},
199+
filteredRoles() {
200+
if (!this.selectedSchool) return this.roles;
201+
return this.roles.filter((role) => this.getSchoolByMount(role.mount) === this.selectedSchool);
202+
},
182203
allRoles() {
183204
return this.$store.state.roles;
184205
},
@@ -203,6 +224,8 @@ export default {
203224
for (const key of Object.keys(val)) {
204225
this.form[key] = val[key];
205226
}
227+
this.selectedSchool = this.getSchoolByMount(val.mount);
228+
this.tmpVal = val.role_id || val.name || "";
206229
}
207230
},
208231
},
@@ -284,43 +307,48 @@ export default {
284307
},
285308
handleChange(val) {
286309
this.form.role_id = 0;
287-
const [member] = this.roles ? this.roles.filter((role) => role.ID === val) : [];
310+
const member = this.roles.find((role) => String(role.ID) === String(val));
288311
289312
if (member) {
290313
this.form.name = member.name;
291314
this.form.role_id = member.ID;
292-
this.selectedSchool = Number(member.mount) || 0;
315+
this.selectedSchool = this.getSchoolByMount(member.mount);
293316
this.form.mount = this.xfMaps[0]?.id || "";
317+
this.tmpVal = member.ID;
318+
return;
294319
}
320+
321+
this.form.name = typeof val === "string" ? val.trim() : "";
322+
this.tmpVal = this.form.name;
323+
this.ensureMountMatchesSchool();
295324
},
296-
remoteMethod(query) {
297-
if (query !== "") {
298-
getRoles(this.teamId, query).then((res) => {
299-
this.roles = res.data.data.list;
300-
this.loading = false;
301-
});
302-
// 如果新的id不在角色列表则重置已选择的门派
303-
if (this.roles?.some((r) => r.name === this.form.name)) {
304-
this.selectedSchool = 0;
325+
getSchoolByMount(mount) {
326+
const mountId = Number(mount);
327+
const mountInfo = Object.values(xf_map).find((item) => Number(item.id) === mountId);
328+
return Number(mountInfo?.school) || mountId || 0;
329+
},
330+
handleSchoolChange() {
331+
if (this.form.role_id) {
332+
const role = this.roles.find((item) => String(item.ID) === String(this.form.role_id));
333+
if (!this.selectedSchool || this.getSchoolByMount(role?.mount) !== this.selectedSchool) {
334+
this.clearRole();
305335
}
306-
} else {
307-
this.roles = cloneDeep(this.allRoles);
308-
this.selectedSchool = 0;
309336
}
337+
this.ensureMountMatchesSchool();
310338
},
311-
// 清空选择
312-
handleClear() {
313-
this.roles = cloneDeep(this.allRoles);
314-
this.selectedSchool = 0;
315-
},
316-
handleNameInput(val) {
317-
this.remoteMethod(val);
339+
ensureMountMatchesSchool() {
340+
if (!this.selectedSchool) return;
341+
const hasCurrentMount = this.xfMaps.some((item) => Number(item.id) === Number(this.form.mount));
342+
if (!hasCurrentMount) this.form.mount = this.xfMaps[0]?.id || "";
318343
},
319-
removeRole() {
320-
this.form.role_id = "";
344+
clearRole() {
345+
this.form.role_id = 0;
321346
this.form.name = "";
322347
this.form.mount = "";
323-
this.selectedSchool = 0;
348+
this.tmpVal = "";
349+
},
350+
removeRole() {
351+
this.clearRole();
324352
},
325353
showMountIcon,
326354
showSchoolIcon,

src/locale/en-US/team.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/locale/vi/team.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)