You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

265 lines
6.3 KiB

import { createNamespace } from '../utils';
import { stopPropagation } from '../utils/dom/event';
import { PortalMixin } from '../mixins/portal';
import { BindEventMixin } from '../mixins/bind-event';
import Key from './Key';
var _createNamespace = createNamespace('number-keyboard'),
createComponent = _createNamespace[0],
bem = _createNamespace[1];
export default createComponent({
mixins: [PortalMixin(), BindEventMixin(function (bind) {
if (this.hideOnClickOutside) {
bind(document.body, 'touchstart', this.onBlur);
}
})],
model: {
event: 'update:value'
},
props: {
show: Boolean,
title: String,
zIndex: [Number, String],
closeButtonText: String,
deleteButtonText: String,
closeButtonLoading: Boolean,
theme: {
type: String,
default: 'default'
},
value: {
type: String,
default: ''
},
extraKey: {
type: [String, Array],
default: ''
},
maxlength: {
type: [Number, String],
default: Number.MAX_VALUE
},
transition: {
type: Boolean,
default: true
},
showDeleteKey: {
type: Boolean,
default: true
},
hideOnClickOutside: {
type: Boolean,
default: true
},
safeAreaInsetBottom: {
type: Boolean,
default: true
}
},
watch: {
show: function show(val) {
if (!this.transition) {
this.$emit(val ? 'show' : 'hide');
}
}
},
computed: {
keys: function keys() {
if (this.theme === 'custom') {
return this.genCustomKeys();
}
return this.genDefaultKeys();
}
},
methods: {
genBasicKeys: function genBasicKeys() {
var keys = [];
for (var i = 1; i <= 9; i++) {
keys.push({
text: i
});
}
return keys;
},
genDefaultKeys: function genDefaultKeys() {
return [].concat(this.genBasicKeys(), [{
text: this.extraKey,
type: 'extra'
}, {
text: 0
}, {
text: this.showDeleteKey ? this.deleteButtonText : '',
type: this.showDeleteKey ? 'delete' : ''
}]);
},
genCustomKeys: function genCustomKeys() {
var keys = this.genBasicKeys();
var extraKey = this.extraKey;
var extraKeys = Array.isArray(extraKey) ? extraKey : [extraKey];
if (extraKeys.length === 1) {
keys.push({
text: 0,
wider: true
}, {
text: extraKeys[0],
type: 'extra'
});
} else if (extraKeys.length === 2) {
keys.push({
text: extraKeys[0],
type: 'extra'
}, {
text: 0
}, {
text: extraKeys[1],
type: 'extra'
});
}
return keys;
},
onBlur: function onBlur() {
this.show && this.$emit('blur');
},
onClose: function onClose() {
this.$emit('close');
this.onBlur();
},
onAnimationEnd: function onAnimationEnd() {
this.$emit(this.show ? 'show' : 'hide');
},
onPress: function onPress(text, type) {
if (text === '') {
if (type === 'extra') {
this.onBlur();
}
return;
}
var value = this.value;
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);
}
},
genTitle: function genTitle() {
var h = this.$createElement;
var title = this.title,
theme = this.theme,
closeButtonText = this.closeButtonText;
var titleLeft = this.slots('title-left');
var showClose = closeButtonText && theme === 'default';
var showTitle = title || showClose || titleLeft;
if (!showTitle) {
return;
}
return h("div", {
"class": bem('header')
}, [titleLeft && h("span", {
"class": bem('title-left')
}, [titleLeft]), title && h("h2", {
"class": bem('title')
}, [title]), showClose && h("button", {
"attrs": {
"type": "button"
},
"class": bem('close'),
"on": {
"click": this.onClose
}
}, [closeButtonText])]);
},
genKeys: function genKeys() {
var _this = this;
var h = this.$createElement;
return this.keys.map(function (key) {
return h(Key, {
"key": key.text,
"attrs": {
"text": key.text,
"type": key.type,
"wider": key.wider,
"color": key.color
},
"on": {
"press": _this.onPress
}
}, [key.type === 'delete' && _this.slots('delete'), key.type === 'extra' && _this.slots('extra-key')]);
});
},
genSidebar: function genSidebar() {
var h = this.$createElement;
if (this.theme === 'custom') {
return h("div", {
"class": bem('sidebar')
}, [this.showDeleteKey && h(Key, {
"attrs": {
"large": true,
"text": this.deleteButtonText,
"type": "delete"
},
"on": {
"press": this.onPress
}
}, [this.slots('delete')]), h(Key, {
"attrs": {
"large": true,
"text": this.closeButtonText,
"type": "close",
"color": "blue",
"loading": this.closeButtonLoading
},
"on": {
"press": this.onPress
}
})]);
}
}
},
render: function render() {
var h = arguments[0];
var Title = this.genTitle();
return h("transition", {
"attrs": {
"name": this.transition ? 'van-slide-up' : ''
}
}, [h("div", {
"directives": [{
name: "show",
value: this.show
}],
"style": {
zIndex: this.zIndex
},
"class": bem({
unfit: !this.safeAreaInsetBottom,
'with-title': Title
}),
"on": {
"touchstart": stopPropagation,
"animationend": this.onAnimationEnd,
"webkitAnimationEnd": this.onAnimationEnd
}
}, [Title, h("div", {
"class": bem('body')
}, [h("div", {
"class": bem('keys')
}, [this.genKeys()]), this.genSidebar()])])]);
}
});