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.

225 lines
5.4 KiB

"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
exports.__esModule = true;
exports.default = void 0;
var _utils = require("../utils");
var _event = require("../utils/dom/event");
var _portal = require("../mixins/portal");
var _relation = require("../mixins/relation");
var _cell = _interopRequireDefault(require("../cell"));
var _icon = _interopRequireDefault(require("../icon"));
var _popup = _interopRequireDefault(require("../popup"));
// Utils
// Mixins
// Components
var _createNamespace = (0, _utils.createNamespace)('dropdown-item'),
createComponent = _createNamespace[0],
bem = _createNamespace[1];
var _default2 = createComponent({
mixins: [(0, _portal.PortalMixin)({
ref: 'wrapper'
}), (0, _relation.ChildrenMixin)('vanDropdownMenu')],
props: {
value: null,
title: String,
disabled: Boolean,
titleClass: String,
options: {
type: Array,
default: function _default() {
return [];
}
},
lazyRender: {
type: Boolean,
default: true
}
},
data: function data() {
return {
transition: true,
showPopup: false,
showWrapper: false
};
},
computed: {
displayTitle: function displayTitle() {
var _this = this;
if (this.title) {
return this.title;
}
var match = this.options.filter(function (option) {
return option.value === _this.value;
});
return match.length ? match[0].text : '';
}
},
watch: {
showPopup: function showPopup(val) {
this.bindScroll(val);
}
},
beforeCreate: function beforeCreate() {
var _this2 = this;
var createEmitter = function createEmitter(eventName) {
return function () {
return _this2.$emit(eventName);
};
};
this.onOpen = createEmitter('open');
this.onClose = createEmitter('close');
this.onOpened = createEmitter('opened');
},
methods: {
// @exposed-api
toggle: function toggle(show, options) {
if (show === void 0) {
show = !this.showPopup;
}
if (options === void 0) {
options = {};
}
if (show === this.showPopup) {
return;
}
this.transition = !options.immediate;
this.showPopup = show;
if (show) {
this.parent.updateOffset();
this.showWrapper = true;
}
},
bindScroll: function bindScroll(bind) {
var scroller = this.parent.scroller;
var action = bind ? _event.on : _event.off;
action(scroller, 'scroll', this.onScroll, true);
},
onScroll: function onScroll() {
this.parent.updateOffset();
},
onClickWrapper: function onClickWrapper(event) {
// prevent being identified as clicking outside and closed when use get-contaienr
if (this.getContainer) {
event.stopPropagation();
}
}
},
render: function render() {
var _this3 = this;
var h = arguments[0];
var _this$parent = this.parent,
zIndex = _this$parent.zIndex,
offset = _this$parent.offset,
overlay = _this$parent.overlay,
duration = _this$parent.duration,
direction = _this$parent.direction,
activeColor = _this$parent.activeColor,
closeOnClickOverlay = _this$parent.closeOnClickOverlay;
var Options = this.options.map(function (option) {
var active = option.value === _this3.value;
return h(_cell.default, {
"attrs": {
"clickable": true,
"icon": option.icon,
"title": option.text
},
"key": option.value,
"class": bem('option', {
active: active
}),
"style": {
color: active ? activeColor : ''
},
"on": {
"click": function click() {
_this3.showPopup = false;
if (option.value !== _this3.value) {
_this3.$emit('input', option.value);
_this3.$emit('change', option.value);
}
}
}
}, [active && h(_icon.default, {
"class": bem('icon'),
"attrs": {
"color": activeColor,
"name": "success"
}
})]);
});
var style = {
zIndex: zIndex
};
if (direction === 'down') {
style.top = offset + "px";
} else {
style.bottom = offset + "px";
}
return h("div", [h("div", {
"directives": [{
name: "show",
value: this.showWrapper
}],
"ref": "wrapper",
"style": style,
"class": bem([direction]),
"on": {
"click": this.onClickWrapper
}
}, [h(_popup.default, {
"attrs": {
"overlay": overlay,
"position": direction === 'down' ? 'top' : 'bottom',
"duration": this.transition ? duration : 0,
"lazyRender": this.lazyRender,
"overlayStyle": {
position: 'absolute'
},
"closeOnClickOverlay": closeOnClickOverlay
},
"class": bem('content'),
"on": {
"open": this.onOpen,
"close": this.onClose,
"opened": this.onOpened,
"closed": function closed() {
_this3.showWrapper = false;
_this3.$emit('closed');
}
},
"model": {
value: _this3.showPopup,
callback: function callback($$v) {
_this3.showPopup = $$v;
}
}
}, [Options, this.slots('default')])])]);
}
});
exports.default = _default2;