1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- <template>
- <t-select
- v-model="selected"
- filterable
- clearable
- v-bind="attrs"
- @change="onChange"
- >
- <t-option
- v-for="item in optionList"
- :key="item.id"
- :value="item.id"
- :label="item.level"
- />
- </t-select>
- </template>
- <script setup name="SelectServiceLevel">
- import { onMounted, ref, useAttrs, watch, computed } from 'vue';
- import { serviceLevelListApi } from '@/api/system';
- let optionList = ref([]);
- let selected = ref('');
- const attrs = useAttrs();
- const emit = defineEmits(['update:modelValue', 'change']);
- const props = defineProps({
- modelValue: { type: [Number, String, Array], default: '' },
- type: { type: String, default: '' },
- typeRequired: { type: Boolean, default: false },
- });
- const isMultiple = computed(() => {
- const multiple = attrs.multiple;
- return multiple === '' || multiple;
- });
- const search = async () => {
- if (props.typeRequired && !props.type) return;
- optionList.value = [];
- let data = { enable: true };
- if (props.type) data.type = props.type;
- const res = await serviceLevelListApi(data).catch(() => {});
- if (!res) return;
- optionList.value = res;
- };
- const onChange = () => {
- const selectedData = isMultiple.value
- ? optionList.value.filter(
- (item) => selected.value && selected.value.includes(item.id)
- )
- : optionList.value.filter((item) => selected.value === item.id);
- emit('update:modelValue', selected.value);
- emit('change', isMultiple.value ? selectedData : selectedData[0]);
- };
- onMounted(() => {
- search();
- });
- watch(
- () => props.modelValue,
- (val) => {
- selected.value = val;
- }
- );
- watch(
- () => props.type,
- (val, oldval) => {
- if (val !== oldval) {
- search();
- emit('update:modelValue', null);
- emit('change', isMultiple.value ? [] : null);
- }
- }
- );
- </script>
|