|
|
|
<script setup lang="ts">
|
|
|
|
import { onMounted } from '@vue/runtime-core'
|
|
|
|
|
|
|
|
interface Props {
|
|
|
|
modelValue: Record<string, any>[]
|
|
|
|
availableChannelList: Record<string, any>[]
|
|
|
|
placeholder: string
|
|
|
|
}
|
|
|
|
|
|
|
|
const { availableChannelList, placeholder, ...rest } = defineProps<Props>()
|
|
|
|
|
|
|
|
const emit = defineEmits(['update:modelValue'])
|
|
|
|
|
|
|
|
const vModel = useVModel(rest, 'modelValue', emit)
|
|
|
|
|
|
|
|
// idx of selected channels
|
|
|
|
const localChannelValues = $ref<number[]>([])
|
|
|
|
|
|
|
|
// availableChannelList with idx enriched
|
|
|
|
let availableChannelWithIdxList = $ref<Record<string, any>[]>()
|
|
|
|
|
|
|
|
watch(
|
|
|
|
() => localChannelValues,
|
|
|
|
(v) => {
|
|
|
|
const res = []
|
|
|
|
for (const channelIdx of v) {
|
|
|
|
const target = availableChannelWithIdxList.find((availableChannel) => availableChannel.idx === channelIdx)
|
|
|
|
if (target) {
|
|
|
|
// push without target.idx
|
|
|
|
res.push({ webhook_url: target.webhook_url, channel: target.channel })
|
|
|
|
}
|
|
|
|
}
|
|
|
|
vModel.value = res
|
|
|
|
},
|
|
|
|
)
|
|
|
|
|
|
|
|
onMounted(() => {
|
|
|
|
if (availableChannelList.length) {
|
|
|
|
// enrich idx
|
|
|
|
let idx = 0
|
|
|
|
availableChannelWithIdxList = availableChannelList.map((channel) => ({
|
|
|
|
...channel,
|
|
|
|
idx: idx++,
|
|
|
|
}))
|
|
|
|
|
|
|
|
// build localChannelValues from modelValue
|
|
|
|
for (const channel of rest.modelValue || []) {
|
|
|
|
const target = availableChannelWithIdxList.find(
|
|
|
|
(availableChannelWithIdx) =>
|
|
|
|
availableChannelWithIdx.webhook_url === channel.webhook_url && availableChannelWithIdx.channel === channel.channel,
|
|
|
|
)
|
|
|
|
if (target) {
|
|
|
|
localChannelValues.push(target.idx)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
|
|
|
</script>
|
|
|
|
|
|
|
|
<template>
|
|
|
|
<a-select v-model:value="localChannelValues" mode="multiple" :placeholder="placeholder" max-tag-count="responsive">
|
|
|
|
<a-select-option v-for="channel of availableChannelWithIdxList" :key="channel.idx" :value="channel.idx">
|
|
|
|
{{ channel.channel }}
|
|
|
|
</a-select-option>
|
|
|
|
</a-select>
|
|
|
|
</template>
|