Files
cmanager/src/views/tenant/mission/Dialog/Skill.vue

294 lines
7.6 KiB
Vue
Raw Normal View History

2024-02-02 15:04:47 +08:00
<template>
<div>
<el-tag
class="skill-select-tag"
:key="tag.id"
v-for="tag in selectedSkills"
:disable-transitions="true"
size="medium"
>{{ tag.name }}</el-tag
>
<el-button
v-if="canSelect"
class="button-new-tag"
size="small"
@click="showSelect"
:disabled="!this.id"
>+ 选择技能</el-button
>
<el-dialog
title="技能标签"
:visible.sync="dialogVisible"
width="30%"
:close-on-click-modal="false"
:close-on-press-escape="false"
:append-to-body="true"
v-loading="loading"
>
<el-row>
<el-col :span="24">
<div>
<el-tag
class="skill-select-tag"
:key="tag.id"
v-for="(tag, index) in tobeSelectedSkills"
closable
type="primary"
:disable-transitions="true"
@close="removeSkill(index)"
size="medium"
>{{ tag.name }}</el-tag
>
</div>
</el-col>
</el-row>
<div>请选择或者添加您所需的技能标签最多5个</div>
<el-row>
<el-col :span="24">
<div class="autocompleteBox">
<el-autocomplete
popper-class="my-autocomplete"
v-model.trim="search"
:fetch-suggestions="querySearch"
placeholder="请选择行业类型"
@select="handleSelect"
maxlength="15"
show-word-limit
>
<el-button
type="primary"
:disabled = "addBtnState"
slot="suffix"
@click="handleIconClick"
size="mini"
>+添加</el-button>
<!-- <i class="el-icon-arrow-down" slot="suffix" @click="handleIconClickArrowDown"></i> -->
<template slot-scope="{ item }">
<div class="name">{{item.value}}</div>
</template>
</el-autocomplete>
</div>
<!-- <el-autocomplete
v-model="search"
:fetch-suggestions="querySearch"
:trigger-on-focus="false"
placeholder="搜索您想要的标签"
@select="editSkill"
style="width: 100%"
:validate-event="false"
>
<template slot-scope="{ item }">
<div>{{ item.name }}</div>
</template>
</el-autocomplete> -->
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<div>
<a
class="skill-select-tag"
href="javascript:void(0)"
v-for="tag in allSkill"
:key="tag.id"
@click="editSkill(tag)"
>
<el-tag
type="info"
:disable-transitions="true"
size="medium"
effect="plain"
>{{ tag.name }}</el-tag
>
</a>
</div>
</el-col>
</el-row>
<span slot="footer" class="dialog-footer">
<el-button
icon="el-icon-circle-plus-outline"
type="primary"
@click="submit"
> </el-button
>
<el-button icon="el-icon-circle-close" @click="dialogVisible = false"
> </el-button
>
</span>
</el-dialog>
</div>
</template>
<script>
import { getSkillList } from "@/api/tenant/common";
import {skillListAdd} from "@/api/tenant/mission";
import _ from "lodash";
export default {
name: "skillSelect",
props: {
selectedSkills: Array,
canSelect: Boolean,
id: String,
},
data() {
return {
search: "",
loading: false,
dialogVisible: false,
tobeSelectedSkills: [],
allSkill: [],
flags:true,
addBtnState:true,
nameAttr:[]
};
},
created() {
},
computed: {},
watch: {
id: function (val, oldVal) {
if (val !== oldVal && oldVal) {
this.$emit("add-skill", []);
}
},
search:function(n,o){
if((n || o!='') && this.tobeSelectedSkills.length != 0){
this.$emit('clear-validator');
}
}
},
methods: {
//获取技能列表
getData() {
if (this.id) {
this.loading = true;
getSkillList(this.id).then((res) => {
this.allSkill = res.data.data.records;
this.nameAttr = this.allSkill.map((ele)=>{
return ele.name
})
this.loading = false;
});
}
},
handleSelect(item) {
this.addBtnState = true;
// console(item);
this.editSkill(item);
},
querySearch(queryString, cb) {
let results = [];
let nameState = this.nameAttr.indexOf(queryString);
if(nameState == -1){
this.addBtnState = false;
}else{
this.addBtnState = true;
}
for(let i of this.allSkill){
i.value = i.name;
}
results = queryString ? this.allSkill.filter(this.createStateFilter(queryString)) : this.allSkill;
cb(results);
},
createStateFilter(queryString) {
return (state) => {
return (state.value.toLowerCase().indexOf(queryString.toLowerCase()) === 0);
};
},
handleIconClick() {
let nameState = this.nameAttr.indexOf(this.search)
if(this.search == ""){
this.$message.closeAll()
this.$message({
type: "error",
message: "请输入要添加的技能!",
})
}else if(nameState != -1){
this.$message({
type: "error",
message: "此技能已存在,请在列表中选择!",
})
}else{
skillListAdd(this.id,this.search).then((res) =>{
if(res.data.code == 200){
//this.search = res.data.data;
this.$message({
type: "success",
message: res.data.msg,
})
this.addBtnState = true;
this.getData();
}else{
this.$message({
type: "error",
message: res.data.msg,
})
}
});
}
},
/*技能*/
editSkill(tag) {
if (this.tobeSelectedSkills.length < 5) {
if (
this.tobeSelectedSkills.find((item) => {
return item.id === tag.id;
})
) {
if(!this.flags){
this.$message({
message: "您已添加该技能标签",
type: "warning",
});
this.flags=true;
}
} else {
this.tobeSelectedSkills.push(tag);
this.$emit('clear-validator');
this.flags=false;
}
} else {
this.$message({
message: "最多添加5个技能标签",
type: "warning",
});
}
},
removeSkill(index) {
this.tobeSelectedSkills.splice(index, 1);
},
submit() {
if (this.tobeSelectedSkills.length) {
this.dialogVisible = false;
this.$emit("add-skill", this.tobeSelectedSkills);
} else {
this.$message.closeAll();
this.$message({
message: "请至少选择一个技能标签",
type: "warning",
});
}
},
showSelect() {
this.tobeSelectedSkills = _.cloneDeep(this.selectedSkills || []);
this.getData();
this.dialogVisible = true;
},
},
};
</script>
<style scoped>
.skill-select-tag {
margin: 0px 5px;
}
.autocompleteBox .el-autocomplete{
width:100%;
}
</style>