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.
232 lines
5.8 KiB
232 lines
5.8 KiB
"use strict";
|
|
|
|
exports.__esModule = true;
|
|
exports.default = void 0;
|
|
|
|
var _utils = require("../utils");
|
|
|
|
var _number = require("../utils/format/number");
|
|
|
|
var _event = require("../utils/dom/event");
|
|
|
|
var _touch = require("../mixins/touch");
|
|
|
|
var _clickOutside = require("../mixins/click-outside");
|
|
|
|
// Utils
|
|
// Mixins
|
|
var _createNamespace = (0, _utils.createNamespace)('swipe-cell'),
|
|
createComponent = _createNamespace[0],
|
|
bem = _createNamespace[1];
|
|
|
|
var THRESHOLD = 0.15;
|
|
|
|
var _default = createComponent({
|
|
mixins: [_touch.TouchMixin, (0, _clickOutside.ClickOutsideMixin)({
|
|
event: 'touchstart',
|
|
method: 'onClick'
|
|
})],
|
|
props: {
|
|
// @deprecated
|
|
// should be removed in next major version, use beforeClose instead
|
|
onClose: Function,
|
|
disabled: Boolean,
|
|
leftWidth: [Number, String],
|
|
rightWidth: [Number, String],
|
|
beforeClose: Function,
|
|
stopPropagation: Boolean,
|
|
name: {
|
|
type: [Number, String],
|
|
default: ''
|
|
}
|
|
},
|
|
data: function data() {
|
|
return {
|
|
offset: 0,
|
|
dragging: false
|
|
};
|
|
},
|
|
computed: {
|
|
computedLeftWidth: function computedLeftWidth() {
|
|
return +this.leftWidth || this.getWidthByRef('left');
|
|
},
|
|
computedRightWidth: function computedRightWidth() {
|
|
return +this.rightWidth || this.getWidthByRef('right');
|
|
}
|
|
},
|
|
mounted: function mounted() {
|
|
this.bindTouchEvent(this.$el);
|
|
},
|
|
methods: {
|
|
getWidthByRef: function getWidthByRef(ref) {
|
|
if (this.$refs[ref]) {
|
|
var rect = this.$refs[ref].getBoundingClientRect();
|
|
return rect.width;
|
|
}
|
|
|
|
return 0;
|
|
},
|
|
// @exposed-api
|
|
open: function open(position) {
|
|
var offset = position === 'left' ? this.computedLeftWidth : -this.computedRightWidth;
|
|
this.opened = true;
|
|
this.offset = offset;
|
|
this.$emit('open', {
|
|
position: position,
|
|
name: this.name,
|
|
// @deprecated
|
|
// should be removed in next major version
|
|
detail: this.name
|
|
});
|
|
},
|
|
// @exposed-api
|
|
close: function close(position) {
|
|
this.offset = 0;
|
|
|
|
if (this.opened) {
|
|
this.opened = false;
|
|
this.$emit('close', {
|
|
position: position,
|
|
name: this.name
|
|
});
|
|
}
|
|
},
|
|
onTouchStart: function onTouchStart(event) {
|
|
if (this.disabled) {
|
|
return;
|
|
}
|
|
|
|
this.startOffset = this.offset;
|
|
this.touchStart(event);
|
|
},
|
|
onTouchMove: function onTouchMove(event) {
|
|
if (this.disabled) {
|
|
return;
|
|
}
|
|
|
|
this.touchMove(event);
|
|
|
|
if (this.direction === 'horizontal') {
|
|
this.dragging = true;
|
|
this.lockClick = true;
|
|
var isPrevent = !this.opened || this.deltaX * this.startOffset < 0;
|
|
|
|
if (isPrevent) {
|
|
(0, _event.preventDefault)(event, this.stopPropagation);
|
|
}
|
|
|
|
this.offset = (0, _number.range)(this.deltaX + this.startOffset, -this.computedRightWidth, this.computedLeftWidth);
|
|
}
|
|
},
|
|
onTouchEnd: function onTouchEnd() {
|
|
var _this = this;
|
|
|
|
if (this.disabled) {
|
|
return;
|
|
}
|
|
|
|
if (this.dragging) {
|
|
this.toggle(this.offset > 0 ? 'left' : 'right');
|
|
this.dragging = false; // compatible with desktop scenario
|
|
|
|
setTimeout(function () {
|
|
_this.lockClick = false;
|
|
}, 0);
|
|
}
|
|
},
|
|
toggle: function toggle(direction) {
|
|
var offset = Math.abs(this.offset);
|
|
var threshold = this.opened ? 1 - THRESHOLD : THRESHOLD;
|
|
var computedLeftWidth = this.computedLeftWidth,
|
|
computedRightWidth = this.computedRightWidth;
|
|
|
|
if (computedRightWidth && direction === 'right' && offset > computedRightWidth * threshold) {
|
|
this.open('right');
|
|
} else if (computedLeftWidth && direction === 'left' && offset > computedLeftWidth * threshold) {
|
|
this.open('left');
|
|
} else {
|
|
this.close();
|
|
}
|
|
},
|
|
onClick: function onClick(position) {
|
|
if (position === void 0) {
|
|
position = 'outside';
|
|
}
|
|
|
|
this.$emit('click', position);
|
|
|
|
if (this.opened && !this.lockClick) {
|
|
if (this.beforeClose) {
|
|
this.beforeClose({
|
|
position: position,
|
|
name: this.name,
|
|
instance: this
|
|
});
|
|
} else if (this.onClose) {
|
|
this.onClose(position, this, {
|
|
name: this.name
|
|
});
|
|
} else {
|
|
this.close(position);
|
|
}
|
|
}
|
|
},
|
|
getClickHandler: function getClickHandler(position, stop) {
|
|
var _this2 = this;
|
|
|
|
return function (event) {
|
|
if (stop) {
|
|
event.stopPropagation();
|
|
}
|
|
|
|
_this2.onClick(position);
|
|
};
|
|
},
|
|
genLeftPart: function genLeftPart() {
|
|
var h = this.$createElement;
|
|
var content = this.slots('left');
|
|
|
|
if (content) {
|
|
return h("div", {
|
|
"ref": "left",
|
|
"class": bem('left'),
|
|
"on": {
|
|
"click": this.getClickHandler('left', true)
|
|
}
|
|
}, [content]);
|
|
}
|
|
},
|
|
genRightPart: function genRightPart() {
|
|
var h = this.$createElement;
|
|
var content = this.slots('right');
|
|
|
|
if (content) {
|
|
return h("div", {
|
|
"ref": "right",
|
|
"class": bem('right'),
|
|
"on": {
|
|
"click": this.getClickHandler('right', true)
|
|
}
|
|
}, [content]);
|
|
}
|
|
}
|
|
},
|
|
render: function render() {
|
|
var h = arguments[0];
|
|
var wrapperStyle = {
|
|
transform: "translate3d(" + this.offset + "px, 0, 0)",
|
|
transitionDuration: this.dragging ? '0s' : '.6s'
|
|
};
|
|
return h("div", {
|
|
"class": bem(),
|
|
"on": {
|
|
"click": this.getClickHandler('cell')
|
|
}
|
|
}, [h("div", {
|
|
"class": bem('wrapper'),
|
|
"style": wrapperStyle
|
|
}, [this.genLeftPart(), this.slots(), this.genRightPart()])]);
|
|
}
|
|
});
|
|
|
|
exports.default = _default; |