-
Notifications
You must be signed in to change notification settings - Fork 289
/
Copy pathuse-auto-complete-render.ts
70 lines (63 loc) · 2.46 KB
/
use-auto-complete-render.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import { computed, ComputedRef, inject, watch } from 'vue';
import type { SetupContext, Ref } from 'vue';
import { FORM_ITEM_TOKEN, STYLE_TOKEN } from '../../../form';
import { AutoCompleteProps, UseAutoCompleteRender, AutoCompleteSize } from '../auto-complete-types';
import { useNamespace } from '@devui/shared/utils';
export function useAutoCompleteRender(
props: AutoCompleteProps,
ctx: SetupContext,
visible: Ref<boolean>,
isFocus: Ref<boolean>,
isDisabled: ComputedRef<boolean>,
autoCompleteSize: ComputedRef<AutoCompleteSize>
): UseAutoCompleteRender {
const formItemContext = inject(FORM_ITEM_TOKEN, undefined);
const styleType = inject(STYLE_TOKEN, undefined)
const ns = useNamespace('auto-complete');
const inputNs = useNamespace('auto-complete-input');
const slotNs = useNamespace('auto-complete-slot');
const formNs = useNamespace('form-group');
const feedbackNs = useNamespace('has-feedback');
const selectNs = useNamespace('select-open');
const formControlNs = useNamespace('form-control');
const dropdownNs = useNamespace('dropdown-origin');
const dropdownOpenNs = useNamespace('dropdown-origin-open');
const slots = ctx.slots;
const isValidatorError = computed(() => formItemContext?.validateState === 'error');
const autoCompleteTopClasses = computed(() => ({
[ns.b()]: true,
[ns.m(autoCompleteSize.value)]: true,
[formNs.b()]: true,
[feedbackNs.b()]: true,
[selectNs.b()]: visible.value,
}));
const inputClasses = computed(() => ({
[inputNs.b()]: true,
[ns.m('focus')]: isFocus.value,
[slotNs.b()]: slots.prepend || slots.append || props.prefix || props.suffix,
[ns.m('append')]: slots.append,
[ns.m('prepend')]: slots.prepend,
[ns.m('gray-style')]: styleType === 'gray',
}));
const inputWrapperClasses = computed(() => ({
[inputNs.e('wrapper')]: true,
[inputNs.em('wrapper', 'error')]: isValidatorError.value,
[inputNs.em('wrapper', 'feedback')]: Boolean(formItemContext?.validateState) && formItemContext?.showFeedback,
[ns.m('disabled')]: isDisabled.value,
}));
const inputInnerClasses = computed(() => [
{
[formControlNs.b()]: true,
[dropdownNs.b()]: true,
[dropdownOpenNs.b()]: isFocus.value,
['disabled']: isDisabled.value,
},
]);
watch(
() => props.modelValue,
() => {
formItemContext?.validate('change').catch(() => { });
}
);
return { autoCompleteTopClasses, inputClasses, inputWrapperClasses, inputInnerClasses };
}