element-plus
Version:
A Component Library for Vue 3
76 lines (73 loc) • 2.31 kB
JavaScript
import { ref, computed } from 'vue';
function useAllowCreate(props, states) {
const createOptionCount = ref(0);
const cachedSelectedOption = ref(null);
const enableAllowCreateMode = computed(() => {
return props.allowCreate && props.filterable;
});
function hasExistingOption(query) {
const hasValue = (option) => option.value === query;
return props.options && props.options.some(hasValue) || states.createdOptions.some(hasValue);
}
function selectNewOption(option) {
if (!enableAllowCreateMode.value) {
return;
}
if (props.multiple && option.created) {
createOptionCount.value++;
} else {
cachedSelectedOption.value = option;
}
}
function createNewOption(query) {
if (enableAllowCreateMode.value) {
if (query && query.length > 0 && !hasExistingOption(query)) {
const newOption = {
value: query,
label: query,
created: true,
disabled: false
};
if (states.createdOptions.length >= createOptionCount.value) {
states.createdOptions[createOptionCount.value] = newOption;
} else {
states.createdOptions.push(newOption);
}
} else {
if (props.multiple) {
states.createdOptions.length = createOptionCount.value;
} else {
const selectedOption = cachedSelectedOption.value;
states.createdOptions.length = 0;
if (selectedOption && selectedOption.created) {
states.createdOptions.push(selectedOption);
}
}
}
}
}
function removeNewOption(option) {
if (!enableAllowCreateMode.value || !option || !option.created || option.created && props.reserveKeyword && states.inputValue === option.label) {
return;
}
const idx = states.createdOptions.findIndex((it) => it.value === option.value);
if (~idx) {
states.createdOptions.splice(idx, 1);
createOptionCount.value--;
}
}
function clearAllNewOption() {
if (enableAllowCreateMode.value) {
states.createdOptions.length = 0;
createOptionCount.value = 0;
}
}
return {
createNewOption,
removeNewOption,
selectNewOption,
clearAllNewOption
};
}
export { useAllowCreate };
//# sourceMappingURL=useAllowCreate.mjs.map