import { defineComponent, onBeforeUpdate, onMounted, type PropType, ref, } from 'vue'; import InputWrapper from '../_input'; import BCMSMultiAddItem from './item'; import { DefaultComponentProps } from '../../_default'; const component = defineComponent({ props: { ...DefaultComponentProps, value: { type: Array as PropType, required: true, }, placeholder: String, label: String, invalidText: String, helperText: String, disabled: { type: Boolean, default: false, }, format: Function as PropType<(value: string) => string>, validate: Function as PropType<(value: string[]) => string | null>, focusOnLoad: Boolean, }, emits: { input: (_value: string[]) => { return true; }, }, setup(props, ctx) { const inputRef = ref(null); const itemsBuffer = ref(props.value); const items = ref(props.value); const invalidText = ref(props.invalidText); onBeforeUpdate(async () => { let update = false; if (itemsBuffer.value.length !== props.value.length) { update = true; } else { for (let i = 0; i < props.value.length; i++) { if (itemsBuffer.value[i] !== props.value[i]) { update = true; break; } } } if (update) { itemsBuffer.value = props.value; items.value = props.value; } }); onMounted(() => { setTimeout(() => { if (props.focusOnLoad && inputRef.value) { inputRef.value.focus(); } }, 0); }); function handleInput(event: Event | KeyboardEvent) { const element = event.target as HTMLInputElement; if (!element) { return; } if ((event as KeyboardEvent).key === 'Enter' && element.value) { if (typeof props.validate === 'function') { const error = props.validate([...items.value, element.value]); if (error) { invalidText.value = error; return; } } items.value = [...items.value, element.value]; element.value = ''; ctx.emit('input', items.value); } else { if (typeof props.format === 'function') { element.value = props.format(element.value); } } } return () => ( {items.value.length > 0 && (
    {items.value.map((item) => ( { items.value = items.value.filter((e) => e !== item); ctx.emit('input', items.value); }} /> ))}
)}
); }, }); export default component;