2018-03-17 18:26:18 +05:30
|
|
|
<script>
|
2018-12-13 13:39:08 +05:30
|
|
|
export default {
|
|
|
|
props: {
|
|
|
|
startSize: {
|
|
|
|
type: Number,
|
|
|
|
required: true,
|
2018-03-17 18:26:18 +05:30
|
|
|
},
|
2018-12-13 13:39:08 +05:30
|
|
|
side: {
|
|
|
|
type: String,
|
|
|
|
required: true,
|
2018-03-17 18:26:18 +05:30
|
|
|
},
|
2018-12-13 13:39:08 +05:30
|
|
|
minSize: {
|
|
|
|
type: Number,
|
|
|
|
required: false,
|
|
|
|
default: 0,
|
2018-03-17 18:26:18 +05:30
|
|
|
},
|
2018-12-13 13:39:08 +05:30
|
|
|
maxSize: {
|
|
|
|
type: Number,
|
|
|
|
required: false,
|
|
|
|
default: Number.MAX_VALUE,
|
|
|
|
},
|
|
|
|
enabled: {
|
|
|
|
type: Boolean,
|
|
|
|
required: false,
|
|
|
|
default: true,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
data() {
|
|
|
|
return {
|
|
|
|
size: this.startSize,
|
2019-07-07 11:18:12 +05:30
|
|
|
isDragging: false,
|
2018-12-13 13:39:08 +05:30
|
|
|
};
|
|
|
|
},
|
|
|
|
computed: {
|
|
|
|
className() {
|
2019-07-07 11:18:12 +05:30
|
|
|
return [`position-${this.side}-0`, { 'is-dragging': this.isDragging }];
|
2018-12-13 13:39:08 +05:30
|
|
|
},
|
|
|
|
cursorStyle() {
|
|
|
|
if (this.enabled) {
|
|
|
|
return { cursor: 'ew-resize' };
|
|
|
|
}
|
|
|
|
return {};
|
|
|
|
},
|
|
|
|
},
|
|
|
|
methods: {
|
|
|
|
resetSize(e) {
|
|
|
|
e.preventDefault();
|
|
|
|
this.$emit('resize-start', this.size);
|
2018-11-18 11:00:15 +05:30
|
|
|
|
2018-12-13 13:39:08 +05:30
|
|
|
this.size = this.startSize;
|
|
|
|
this.$emit('update:size', this.size);
|
2018-11-18 11:00:15 +05:30
|
|
|
|
2018-12-13 13:39:08 +05:30
|
|
|
// End resizing on next tick so that listeners can react to DOM changes
|
|
|
|
this.$nextTick(() => {
|
|
|
|
this.$emit('resize-end', this.size);
|
|
|
|
});
|
|
|
|
},
|
|
|
|
startDrag(e) {
|
|
|
|
if (this.enabled) {
|
2018-03-17 18:26:18 +05:30
|
|
|
e.preventDefault();
|
2019-07-07 11:18:12 +05:30
|
|
|
this.isDragging = true;
|
2018-12-13 13:39:08 +05:30
|
|
|
this.startPos = e.clientX;
|
|
|
|
this.currentStartSize = this.size;
|
|
|
|
document.addEventListener('mousemove', this.drag);
|
|
|
|
document.addEventListener('mouseup', this.endDrag, { once: true });
|
|
|
|
this.$emit('resize-start', this.size);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
drag(e) {
|
|
|
|
e.preventDefault();
|
|
|
|
let moved = e.clientX - this.startPos;
|
|
|
|
if (this.side === 'left') moved = -moved;
|
|
|
|
let newSize = this.currentStartSize + moved;
|
|
|
|
if (newSize < this.minSize) {
|
|
|
|
newSize = this.minSize;
|
|
|
|
} else if (newSize > this.maxSize) {
|
|
|
|
newSize = this.maxSize;
|
|
|
|
}
|
|
|
|
this.size = newSize;
|
2018-03-17 18:26:18 +05:30
|
|
|
|
2018-12-13 13:39:08 +05:30
|
|
|
this.$emit('update:size', newSize);
|
|
|
|
},
|
|
|
|
endDrag(e) {
|
|
|
|
e.preventDefault();
|
2019-07-07 11:18:12 +05:30
|
|
|
this.isDragging = false;
|
2018-12-13 13:39:08 +05:30
|
|
|
document.removeEventListener('mousemove', this.drag);
|
|
|
|
this.$emit('resize-end', this.size);
|
2018-03-17 18:26:18 +05:30
|
|
|
},
|
2018-12-13 13:39:08 +05:30
|
|
|
},
|
|
|
|
};
|
2018-03-17 18:26:18 +05:30
|
|
|
</script>
|
|
|
|
|
|
|
|
<template>
|
|
|
|
<div
|
|
|
|
:class="className"
|
|
|
|
:style="cursorStyle"
|
2019-07-07 11:18:12 +05:30
|
|
|
class="position-absolute position-top-0 position-bottom-0 drag-handle"
|
2018-03-17 18:26:18 +05:30
|
|
|
@mousedown="startDrag"
|
|
|
|
@dblclick="resetSize"
|
|
|
|
></div>
|
|
|
|
</template>
|