import { createNamespace } from '../utils'; import { stopPropagation } from '../utils/dom/event'; import { BindEventMixin } from '../mixins/bind-event'; import Key from './Key'; const [createComponent, bem, t] = createNamespace('number-keyboard'); const CLOSE_KEY_THEME = ['blue', 'big']; const DELETE_KEY_THEME = ['delete', 'big', 'gray']; export default createComponent({ mixins: [ BindEventMixin(function (bind) { if (this.hideOnClickOutside) { bind(document.body, 'touchstart', this.onBlur); } }) ], model: { event: 'update:value' }, props: { show: Boolean, title: String, closeButtonText: String, deleteButtonText: String, safeAreaInsetBottom: Boolean, theme: { type: String, default: 'default' }, value: { type: String, default: '' }, extraKey: { type: String, default: '' }, maxlength: { type: [Number, String], default: Number.MAX_VALUE }, zIndex: { type: Number, default: 100 }, transition: { type: Boolean, default: true }, showDeleteKey: { type: Boolean, default: true }, hideOnClickOutside: { type: Boolean, default: true } }, watch: { show() { if (!this.transition) { this.$emit(this.show ? 'show' : 'hide'); } } }, computed: { keys() { const keys = []; for (let i = 1; i <= 9; i++) { keys.push({ text: i }); } switch (this.theme) { case 'default': keys.push( { text: this.extraKey, theme: ['gray'] }, { text: 0 }, { text: this.deleteText, theme: ['gray'], type: 'delete' } ); break; case 'custom': keys.push({ text: 0, theme: ['middle'] }, { text: this.extraKey }); break; } return keys; }, deleteText() { return this.deleteButtonText || t('delete'); } }, methods: { onBlur() { this.$emit('blur'); }, onClose() { this.$emit('close'); this.onBlur(); }, onAnimationEnd() { this.$emit(this.show ? 'show' : 'hide'); }, onPress(text, type) { if (text === '') { return; } const { value } = this; if (type === 'delete') { this.$emit('delete'); this.$emit('update:value', value.slice(0, value.length - 1)); } else if (type === 'close') { this.onClose(); } else if (value.length < this.maxlength) { this.$emit('input', text); this.$emit('update:value', value + text); } } }, render(h) { const { title, theme, onPress, closeButtonText } = this; const titleLeftSlot = this.slots('title-left'); const showTitleClose = closeButtonText && theme === 'default'; const showTitle = title || showTitleClose || titleLeftSlot; const Title = showTitle && (
{titleLeftSlot && {titleLeftSlot}} {title && {title}} {showTitleClose && ( {closeButtonText} )}
); const Keys = this.keys.map(key => ( {key.type === 'delete' && this.slots('delete')} )); const Sidebar = theme === 'custom' && (
{this.slots('delete')}
); return (
{Title}
{Keys}
{Sidebar}
); } });