jcloude/dashboard/src/components/LinkControl.vue
2025-12-23 20:48:07 +08:00

90 lines
1.9 KiB
Vue

<template>
<FormControl
v-bind="$attrs"
type="autocomplete"
:label="label"
:options="autocompleteOptions"
:modelValue="modelValue"
:placeholder="placeholder"
@update:query="onQuery"
@update:model-value="
(option) => {
if (option?.value) {
$emit('update:modelValue', option.value);
} else {
$emit('update:modelValue', undefined);
}
}
"
/>
</template>
<script>
import { FormControl, debounce } from 'jingrow-ui';
export default {
name: 'LinkControl',
props: ['label', 'options', 'modelValue', 'placeholder'],
emits: ['update:modelValue'],
inheritAttrs: false,
components: {
FormControl,
},
data() {
return {
query: '',
currentValidValueInOptions: null,
};
},
resources: {
options() {
return {
url: 'jcloude.api.client.search_link',
params: {
doctype: this.options.doctype,
order_by: this.options.orderBy,
page_length: this.options.pageLength || 10,
filters: this.options.filters,
query: this.query,
},
auto: true,
initialData: this.options.initialData || [],
transform: (data) => {
return data.map((option) => ({
label: option.label || option.value,
description: option.label ? option.value : undefined,
value: option.value,
}));
},
};
},
},
methods: {
onQuery: debounce(function (query) {
this.query = query.trim();
}, 500),
},
computed: {
autocompleteOptions() {
let options = this.$resources.options.data || [];
const currentValueInOptions = options.find(
(o) => o.value === this.modelValue,
);
if (currentValueInOptions) {
this.currentValidValueInOptions = currentValueInOptions;
}
if (
this.modelValue &&
!currentValueInOptions &&
this.currentValidValueInOptions
) {
options = [this.currentValidValueInOptions, ...options];
}
return options;
},
},
};
</script>