import { ref, toRaw } from 'vue' export type selectedValueType = string | number export type selectedLabelType = string | number export interface selectedValueItem { value: selectedValueType label: selectedLabelType } export type modelValueSelected = number[] | string[] export default (emit = null) => { const selectedValue = ref([]) const removeSelectedValue = (item: selectedValueItem) => { selectedValue.value = selectedValue.value.filter( selected => selected.value !== item.value, ) const selectedValueList = getSelectedValueList(selectedValue.value) emit && emit('remove-tag', { data: selectedValueList, item: toRaw(item), }) emit && emit('change', selectedValueList) emit && emit('update:modelValue', selectedValueList) } const addSelectedValue = (item: selectedValueItem) => { selectedValue.value.push(item) const selectedValueList = getSelectedValueList(selectedValue.value) emit && emit('change', selectedValueList) emit && emit('update:modelValue', selectedValueList) } const isSelected = (item: selectedValueItem) => { return selectedValue.value.some(valueItem => { return valueItem.value === item.value }) } const toggleSelect = (item: selectedValueItem) => { const isSelected = selectedValue.value.some( selectedItem => selectedItem.value === item.value, ) isSelected ? (selectedValue.value = selectedValue.value.filter( selectedItem => selectedItem.value !== item.value, )) : selectedValue.value.push(item) const selectedValueList = getSelectedValueList(selectedValue.value) emit && emit('select', { data: selectedValueList, item: toRaw(item), }) emit && emit('change', selectedValueList) emit && emit('update:modelValue', selectedValueList) } const clearSelectedValue = () => { selectedValue.value = [] emit && emit('clear') emit && emit('change', []) emit && emit('update:modelValue', []) } const addSelectedValueByModelValue = ( valueList: modelValueSelected, { sourceListMap }, ) => { selectedValue.value = valueList.map((value: number | string) => { return sourceListMap.value[value] }) } const getSelectedValueList = (list: selectedValueItem[]) => { return list.map(item => item.value) } return { selectedValue, removeSelectedValue, clearSelectedValue, addSelectedValue, getSelectedValueList, isSelected, toggleSelect, addSelectedValueByModelValue, } }