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.
226 lines
5.3 KiB
226 lines
5.3 KiB
"use strict";
|
|
|
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
|
|
exports.__esModule = true;
|
|
exports.default = void 0;
|
|
|
|
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
|
|
var _popperjs = require("@vant/popperjs");
|
|
|
|
var _utils = require("../utils");
|
|
|
|
var _constant = require("../utils/constant");
|
|
|
|
var _clickOutside = require("../mixins/click-outside");
|
|
|
|
var _icon = _interopRequireDefault(require("../icon"));
|
|
|
|
var _popup = _interopRequireDefault(require("../popup"));
|
|
|
|
// Mixins
|
|
// Components
|
|
var _createNamespace = (0, _utils.createNamespace)('popover'),
|
|
createComponent = _createNamespace[0],
|
|
bem = _createNamespace[1];
|
|
|
|
var _default2 = createComponent({
|
|
mixins: [(0, _clickOutside.ClickOutsideMixin)({
|
|
event: 'touchstart',
|
|
method: 'onClickOutside'
|
|
})],
|
|
props: {
|
|
value: Boolean,
|
|
trigger: String,
|
|
overlay: Boolean,
|
|
offset: {
|
|
type: Array,
|
|
default: function _default() {
|
|
return [0, 8];
|
|
}
|
|
},
|
|
theme: {
|
|
type: String,
|
|
default: 'light'
|
|
},
|
|
actions: {
|
|
type: Array,
|
|
default: function _default() {
|
|
return [];
|
|
}
|
|
},
|
|
placement: {
|
|
type: String,
|
|
default: 'bottom'
|
|
},
|
|
getContainer: {
|
|
type: [String, Function],
|
|
default: 'body'
|
|
},
|
|
closeOnClickAction: {
|
|
type: Boolean,
|
|
default: true
|
|
}
|
|
},
|
|
watch: {
|
|
value: 'updateLocation',
|
|
placement: 'updateLocation'
|
|
},
|
|
mounted: function mounted() {
|
|
this.updateLocation();
|
|
},
|
|
beforeDestroy: function beforeDestroy() {
|
|
if (this.popper) {
|
|
this.popper.destroy();
|
|
this.popper = null;
|
|
}
|
|
},
|
|
methods: {
|
|
createPopper: function createPopper() {
|
|
return (0, _popperjs.createPopper)(this.$refs.wrapper, this.$refs.popover.$el, {
|
|
placement: this.placement,
|
|
modifiers: [{
|
|
name: 'computeStyles',
|
|
options: {
|
|
adaptive: false,
|
|
gpuAcceleration: false
|
|
}
|
|
}, (0, _extends2.default)({}, _popperjs.offsetModifier, {
|
|
options: {
|
|
offset: this.offset
|
|
}
|
|
})]
|
|
});
|
|
},
|
|
updateLocation: function updateLocation() {
|
|
var _this = this;
|
|
|
|
this.$nextTick(function () {
|
|
if (!_this.value) {
|
|
return;
|
|
}
|
|
|
|
if (!_this.popper) {
|
|
_this.popper = _this.createPopper();
|
|
} else {
|
|
_this.popper.setOptions({
|
|
placement: _this.placement
|
|
});
|
|
}
|
|
});
|
|
},
|
|
renderAction: function renderAction(action, index) {
|
|
var _this2 = this;
|
|
|
|
var h = this.$createElement;
|
|
var icon = action.icon,
|
|
text = action.text,
|
|
disabled = action.disabled,
|
|
className = action.className;
|
|
return h("div", {
|
|
"attrs": {
|
|
"role": "menuitem"
|
|
},
|
|
"class": [bem('action', {
|
|
disabled: disabled,
|
|
'with-icon': icon
|
|
}), className],
|
|
"on": {
|
|
"click": function click() {
|
|
return _this2.onClickAction(action, index);
|
|
}
|
|
}
|
|
}, [icon && h(_icon.default, {
|
|
"attrs": {
|
|
"name": icon
|
|
},
|
|
"class": bem('action-icon')
|
|
}), h("div", {
|
|
"class": [bem('action-text'), _constant.BORDER_BOTTOM]
|
|
}, [text])]);
|
|
},
|
|
onToggle: function onToggle(value) {
|
|
this.$emit('input', value);
|
|
},
|
|
onClickWrapper: function onClickWrapper() {
|
|
if (this.trigger === 'click') {
|
|
this.onToggle(!this.value);
|
|
}
|
|
},
|
|
onTouchstart: function onTouchstart(event) {
|
|
event.stopPropagation();
|
|
this.$emit('touchstart', event);
|
|
},
|
|
onClickAction: function onClickAction(action, index) {
|
|
if (action.disabled) {
|
|
return;
|
|
}
|
|
|
|
this.$emit('select', action, index);
|
|
|
|
if (this.closeOnClickAction) {
|
|
this.$emit('input', false);
|
|
}
|
|
},
|
|
onClickOutside: function onClickOutside() {
|
|
this.$emit('input', false);
|
|
},
|
|
onOpen: function onOpen() {
|
|
this.$emit('open');
|
|
},
|
|
|
|
/* istanbul ignore next */
|
|
onOpened: function onOpened() {
|
|
this.$emit('opened');
|
|
},
|
|
onClose: function onClose() {
|
|
this.$emit('close');
|
|
},
|
|
|
|
/* istanbul ignore next */
|
|
onClosed: function onClosed() {
|
|
this.$emit('closed');
|
|
}
|
|
},
|
|
render: function render() {
|
|
var h = arguments[0];
|
|
return h("span", {
|
|
"ref": "wrapper",
|
|
"class": bem('wrapper'),
|
|
"on": {
|
|
"click": this.onClickWrapper
|
|
}
|
|
}, [h(_popup.default, {
|
|
"ref": "popover",
|
|
"attrs": {
|
|
"value": this.value,
|
|
"overlay": this.overlay,
|
|
"position": null,
|
|
"transition": "van-popover-zoom",
|
|
"lockScroll": false,
|
|
"getContainer": this.getContainer
|
|
},
|
|
"class": bem([this.theme]),
|
|
"on": {
|
|
"open": this.onOpen,
|
|
"close": this.onClose,
|
|
"input": this.onToggle,
|
|
"opened": this.onOpened,
|
|
"closed": this.onClosed
|
|
},
|
|
"nativeOn": {
|
|
"touchstart": this.onTouchstart
|
|
}
|
|
}, [h("div", {
|
|
"class": bem('arrow')
|
|
}), h("div", {
|
|
"class": bem('content'),
|
|
"attrs": {
|
|
"role": "menu"
|
|
}
|
|
}, [this.slots('default') || this.actions.map(this.renderAction)])]), this.slots('reference')]);
|
|
}
|
|
});
|
|
|
|
exports.default = _default2; |