mirror of https://github.com/halo-dev/halo-admin
johnniang
6 years ago
3 changed files with 178 additions and 22 deletions
@ -0,0 +1,103 @@ |
|||||||
|
<template> |
||||||
|
<div> |
||||||
|
<a-select |
||||||
|
v-model="selectedTagNames" |
||||||
|
style="width: 100%" |
||||||
|
allowClear |
||||||
|
mode="tags" |
||||||
|
placeholder="选择或输入标签" |
||||||
|
@blur="handleBlur" |
||||||
|
> |
||||||
|
<a-select-option |
||||||
|
v-for="tag in tags" |
||||||
|
:key="tag.id" |
||||||
|
:value="tag.name" |
||||||
|
>{{ tag.name }}</a-select-option> |
||||||
|
</a-select> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script> |
||||||
|
import tagApi from '@/api/tag' |
||||||
|
import axios from 'axios' |
||||||
|
|
||||||
|
export default { |
||||||
|
name: 'TagSelect', |
||||||
|
model: { |
||||||
|
prop: 'tagIds', |
||||||
|
event: 'change' |
||||||
|
}, |
||||||
|
props: { |
||||||
|
tagIds: { |
||||||
|
type: Array, |
||||||
|
required: false, |
||||||
|
default: () => [] |
||||||
|
} |
||||||
|
}, |
||||||
|
data() { |
||||||
|
return { |
||||||
|
tags: [], |
||||||
|
selectedTagNames: [] |
||||||
|
} |
||||||
|
}, |
||||||
|
created() { |
||||||
|
this.loadTags() |
||||||
|
this.selectedTagNames = this.tagIds.map(tagId => this.tagIdMap[tagId].name) |
||||||
|
}, |
||||||
|
computed: { |
||||||
|
tagIdMap() { |
||||||
|
const tagIdMap = {} |
||||||
|
this.tags.forEach(tag => { |
||||||
|
tagIdMap[tag.id] = tag |
||||||
|
}) |
||||||
|
return tagIdMap |
||||||
|
}, |
||||||
|
tagNameMap() { |
||||||
|
const tagNameMap = {} |
||||||
|
this.tags.forEach(tag => { |
||||||
|
tagNameMap[tag.name] = tag |
||||||
|
}) |
||||||
|
return tagNameMap |
||||||
|
} |
||||||
|
}, |
||||||
|
methods: { |
||||||
|
loadTags(callback) { |
||||||
|
tagApi.listAll(true).then(response => { |
||||||
|
this.tags = response.data.data |
||||||
|
if (callback) { |
||||||
|
callback() |
||||||
|
} |
||||||
|
}) |
||||||
|
}, |
||||||
|
handleBlur() { |
||||||
|
this.$log.debug('Blured') |
||||||
|
const tagNamesToCreate = this.selectedTagNames.filter(tagName => !this.tagNameMap[tagName]) |
||||||
|
|
||||||
|
this.$log.debug('Tag names to create', tagNamesToCreate) |
||||||
|
|
||||||
|
if (tagNamesToCreate === []) { |
||||||
|
const tagIds = this.selectedTagNames.map(tagName => this.tagNameMap[tagName].id) |
||||||
|
// If empty |
||||||
|
this.$emit('change', tagIds) |
||||||
|
return |
||||||
|
} |
||||||
|
|
||||||
|
const createPromises = tagNamesToCreate.map(tagName => tagApi.createWithName(tagName)) |
||||||
|
|
||||||
|
axios.all(createPromises).then( |
||||||
|
axios.spread(() => { |
||||||
|
this.loadTags(() => { |
||||||
|
this.$log.debug('Tag name map', this.tagNameMap) |
||||||
|
// Get all tag id |
||||||
|
const tagIds = this.selectedTagNames.map(tagName => this.tagNameMap[tagName].id) |
||||||
|
this.$emit('change', tagIds) |
||||||
|
}) |
||||||
|
}) |
||||||
|
) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
</script> |
||||||
|
|
||||||
|
<style> |
||||||
|
</style> |
Loading…
Reference in new issue