import { use } from '../utils'; import { inherit, emit } from '../utils/functional'; import { preventDefault } from '../utils/event'; import Field from '../field'; // Types import { CreateElement, RenderContext } from 'vue/types'; import { DefaultSlots, ScopedSlot } from '../utils/types'; const [sfc, bem, t] = use('search'); export type SearchProps = { shape: string; value?: string; label?: string; leftIcon: string; rightIcon?: string; clearable: boolean; background: string; showAction?: boolean; }; export type SearchSlots = DefaultSlots & { label?: ScopedSlot; action?: ScopedSlot; 'left-icon'?: ScopedSlot; 'right-icon'?: ScopedSlot; }; export type SearchEvents = { onCancel?(): void; onInput?(value: string): void; onSearch?(value: string): void; onKeypress?(event: KeyboardEvent): void; }; function Search( h: CreateElement, props: SearchProps, slots: SearchSlots, ctx: RenderContext ) { function Label() { if (slots.label || props.label) { return
{slots.label ? slots.label() : props.label}
; } } function Action() { if (!props.showAction) { return; } function onCancel() { emit(ctx, 'input', ''); emit(ctx, 'cancel'); } return (
{slots.action ? slots.action() :
{t('cancel')}
}
); } const fieldData = { attrs: ctx.data.attrs, on: { ...ctx.listeners, input(value: string) { emit(ctx, 'input', value); }, keypress(event: KeyboardEvent) { // press enter if (event.keyCode === 13) { preventDefault(event); emit(ctx, 'search', props.value); } emit(ctx, 'keypress', event); } } }; const inheritData = inherit(ctx); delete inheritData.attrs; return (
{Label()}
{Action()}
); } Search.props = { value: String, label: String, rightIcon: String, showAction: Boolean, shape: { type: String, default: 'square' }, clearable: { type: Boolean, default: true }, background: { type: String, default: '#fff' }, leftIcon: { type: String, default: 'search' } }; export default sfc(Search);