-
+
+
@@ -409,7 +410,7 @@ export default {
default: false
},
canResize: {
- //是否可拖拽改变宽度
+ //是否可拖拽改变宽度,拖拽调整列宽时触发on-column-width-resize(newWidth, oldWidth, column, event)
type: Boolean,
default: false
},
@@ -605,7 +606,8 @@ export default {
isRendered: true, //表格渲染需要时间导致第一次取值有问题,这里标记是否需要从新计算offsetWidth的值
resizeEvent: null,
visible: false, //控制表头排序是否显示的poptip是否显示
- tableRowStyle: GLOBAL_TABLESTRYLE || (process.env && process.env.VUE_APP_TABLESTRYLE)
+ tableRowStyle: GLOBAL_TABLESTRYLE || (process.env && process.env.VUE_APP_TABLESTRYLE),
+ showResizeLine: false
};
},
beforeCreate() {},
diff --git a/src/resources/components/TsTable/component/table-thead.vue b/src/resources/components/TsTable/component/table-thead.vue
index e765191e1055bb548e343e22e7d664de780396f1..3d98cc1d3daa461dac6fee35114391f2b913065a 100644
--- a/src/resources/components/TsTable/component/table-thead.vue
+++ b/src/resources/components/TsTable/component/table-thead.vue
@@ -49,7 +49,12 @@
-
+
@@ -96,7 +101,10 @@ export default {
},
data() {
return {
- scrollLeft: 0
+ scrollLeft: 0,
+ draggingColumn: null,
+ dragging: false,
+ dragState: {}
};
},
beforeCreate() {},
@@ -155,6 +163,91 @@ export default {
},
switchStatus(item) {
this.$emit('switchStatus', item);
+ },
+ handleMouseDown(column, event) {
+ if (this.draggingColumn) {
+ this.dragging = true;
+
+ const table = this.$parent;
+ const tableEl = table.$el;
+ const tableLeft = tableEl.getBoundingClientRect().left;
+ const columnEl = this.$el.querySelector(`.th-${column.key}`);
+ const columnRect = columnEl.getBoundingClientRect();
+ const minLeft = columnRect.left - tableLeft + 30;
+
+ table.showResizeLine = true;
+
+ this.dragState = {
+ startMouseLeft: event.clientX,
+ startLeft: columnRect.right - tableLeft,
+ startColumnLeft: columnRect.left - tableLeft,
+ tableLeft
+ };
+
+ const resizeProxy = table.$refs.resizeLine;
+ resizeProxy.style.left = this.dragState.startLeft + 'px';
+
+ document.onselectstart = function() {
+ return false;
+ };
+ document.ondragstart = function() {
+ return false;
+ };
+
+ const handleMouseMove = event => {
+ const deltaLeft = event.clientX - this.dragState.startMouseLeft;
+ const proxyLeft = this.dragState.startLeft + deltaLeft;
+
+ resizeProxy.style.left = Math.max(minLeft, proxyLeft) + 'px';
+ };
+
+ const handleMouseUp = () => {
+ if (this.dragging) {
+ const { startColumnLeft, startLeft } = this.dragState;
+
+ const finalLeft = parseInt(resizeProxy.style.left, 10);
+ const columnWidth = finalLeft - startColumnLeft;
+
+ const _column = table.colsList.find(item => item.key === column.key + 'Width');
+ if (_column) {
+ this.$set(_column, 'width', columnWidth);
+ }
+ table.$emit('on-column-width-resize', _column.width, startLeft - startColumnLeft, column, event);
+ this.dragging = false;
+ this.draggingColumn = null;
+ this.dragState = {};
+
+ table.showResizeLine = false;
+ }
+
+ document.removeEventListener('mousemove', handleMouseMove);
+ document.removeEventListener('mouseup', handleMouseUp);
+ document.onselectstart = null;
+ document.ondragstart = null;
+ };
+
+ document.addEventListener('mousemove', handleMouseMove);
+ document.addEventListener('mouseup', handleMouseUp);
+ }
+ },
+ handleMouseMove(column, event) {
+ let target = event.target;
+
+ while (target && target.tagName !== 'TH') {
+ target = target.parentNode;
+ }
+
+ if (!column || !this.canResize) return;
+
+ if (!this.dragging) {
+ let rect = target.getBoundingClientRect();
+
+ if (rect.width > 12 && rect.right - event.pageX < 8) {
+ this.draggingColumn = column;
+ } else if (!this.dragging) {
+ this.draggingColumn = null;
+ }
+ }
}
},
computed: {