diff --git a/src/components/datatable/DataTable.vue b/src/components/datatable/DataTable.vue index b3e6d7b83..03e9f6760 100644 --- a/src/components/datatable/DataTable.vue +++ b/src/components/datatable/DataTable.vue @@ -404,8 +404,8 @@ export default { const sorted = this.sortMode === 'single' ? (this.d_sortField === (column.field || column.sortField)) : this.getMultiSortMetaIndex(column) > -1; return [column.headerClass, - {'p-sortable-column': column.sortable}, - {'p-resizable-column': this.resizableColumns}, + {'p-sortable-column': column.sortable}, + {'p-resizable-column': this.resizableColumns}, {'p-highlight': sorted} ]; }, @@ -943,7 +943,7 @@ export default { 'p-datatable-hoverable-rows': (this.rowHover || this.selectionMode), 'p-datatable-auto-layout': this.autoLayout, 'p-datatable-resizable': this.resizableColumns, - 'p-datatable-resizable-fit': this.resizableColumns && this.columnResizeMode === 'fit', + 'p-datatable-resizable-fit': this.resizableColumns && this.columnResizeMode === 'fit' } ]; }, diff --git a/src/components/treetable/TreeTable.vue b/src/components/treetable/TreeTable.vue index c3d8289fb..382e31473 100644 --- a/src/components/treetable/TreeTable.vue +++ b/src/components/treetable/TreeTable.vue @@ -19,11 +19,12 @@ -
- +
+
+ {{col.header}} @@ -65,6 +66,7 @@ + @@ -185,8 +187,20 @@ export default { filterMode: { type: String, default: 'lenient' + }, + resizableColumns: { + type: Boolean, + default: false + }, + columnResizeMode: { + type: String, + default: 'fit' } }, + documentColumnResizeListener: null, + documentColumnResizeEndListener: null, + lastResizeHelperX: null, + resizeColumnElement: null, data() { return { allChildren: null, @@ -341,6 +355,7 @@ export default { return [column.headerClass, {'p-sortable-column': column.sortable}, + {'p-resizable-column': this.resizableColumns}, {'p-highlight': sorted} ]; }, @@ -604,13 +619,97 @@ export default { }, isNodeLeaf(node) { return node.leaf === false ? false : !(node.children && node.children.length); + }, + onColumnResizeStart(event) { + let containerLeft = DomHandler.getOffset(this.$el).left; + this.resizeColumnElement = event.target.parentElement; + this.columnResizing = true; + this.lastResizeHelperX = (event.pageX - containerLeft + this.$el.scrollLeft); + + this.bindColumnResizeEvents(); + }, + onColumnResize(event) { + let containerLeft = DomHandler.getOffset(this.$el).left; + DomHandler.addClass(this.$el, 'p-unselectable-text'); + this.$refs.resizeHelper.style.height = this.$el.offsetHeight + 'px'; + this.$refs.resizeHelper.style.top = 0 + 'px'; + this.$refs.resizeHelper.style.left = (event.pageX - containerLeft + this.$el.scrollLeft) + 'px'; + + this.$refs.resizeHelper.style.display = 'block'; + }, + onColumnResizeEnd() { + let delta = this.$refs.resizeHelper.offsetLeft - this.lastResizeHelperX; + let columnWidth = this.resizeColumnElement.offsetWidth; + let newColumnWidth = columnWidth + delta; + let minWidth = this.resizeColumnElement.style.minWidth||15; + + if(columnWidth + delta > parseInt(minWidth, 10)) { + if(this.columnResizeMode === 'fit') { + let nextColumn = this.resizeColumnElement.nextElementSibling; + let nextColumnWidth = nextColumn.offsetWidth - delta; + + if(newColumnWidth > 15 && nextColumnWidth > 15) { + this.resizeColumnElement.style.width = newColumnWidth + 'px'; + if(nextColumn) { + nextColumn.style.width = nextColumnWidth + 'px'; + } + } + } + else if(this.columnResizeMode === 'expand') { + this.$refs.table.style.width = this.$refs.table.offsetWidth + delta + 'px'; + this.resizeColumnElement.style.width = newColumnWidth + 'px'; + } + + this.$emit('column-resize-end', { + element: this.resizeColumnElement, + delta: delta + }); + } + + this.$refs.resizeHelper.style.display = 'none'; + this.resizeColumn = null; + DomHandler.removeClass(this.$el, 'p-unselectable-text'); + + this.unbindColumnResizeEvents(); + }, + bindColumnResizeEvents() { + if (!this.documentColumnResizeListener) { + this.documentColumnResizeListener = document.addEventListener('mousemove', (event) => { + if(this.columnResizing) { + this.onColumnResize(event); + } + }); + } + + if (!this.documentColumnResizeEndListener) { + this.documentColumnResizeEndListener = document.addEventListener('mouseup', (event) => { + if(this.columnResizing) { + this.columnResizing = false; + this.onColumnResizeEnd(); + } + }); + } + + }, + unbindColumnResizeEvents() { + if (this.documentColumnResizeListener) { + document.removeEventListener('document', this.documentColumnResizeListener); + this.documentColumnResizeListener = null; + } + + if (this.documentColumnResizeEndListener) { + document.removeEventListener('document', this.documentColumnResizeEndListener); + this.documentColumnResizeEndListener = null; + } } }, computed: { containerClass() { return ['p-treetable p-component', { 'p-treetable-hoverable-rows': (this.rowHover || this.rowSelectionMode), - 'p-treetable-auto-layout': this.autoLayout + 'p-treetable-auto-layout': this.autoLayout, + 'p-treetable-resizable': this.resizableColumns, + 'p-treetable-resizable-fit': this.resizableColumns && this.columnResizeMode === 'fit', }]; }, columns() { diff --git a/src/router.js b/src/router.js index a79a24b00..471bf0662 100644 --- a/src/router.js +++ b/src/router.js @@ -430,6 +430,11 @@ export default new Router({ path: '/treetable/responsive', name: 'treetableresponsive', component: () => import('./views/treetable/TreeTableResponsiveDemo.vue') + }, + { + path: '/treetable/colresize', + name: 'treetablecolresize', + component: () => import('./views/treetable/TreeTableColResizeDemo.vue') }, { path: '/tristatecheckbox', diff --git a/src/views/datatable/DataTableColResizeDemo.vue b/src/views/datatable/DataTableColResizeDemo.vue index fec2c889f..918975d92 100644 --- a/src/views/datatable/DataTableColResizeDemo.vue +++ b/src/views/datatable/DataTableColResizeDemo.vue @@ -6,25 +6,25 @@

DataTable - Column Resize

Columns can be resized using drag drop by setting the resizableColumns to true. There are two resize modes; "fit" and "expand". Fit is the default one and the overall table width does not change when a column is resized. - In "expand" mode, table width also changes along with the column width. onColumnResize is a callback that passes the resized column header as a parameter.

+ In "expand" mode, table width also changes along with the column width.

Fit Mode

- - - - + + + +

Expand Mode

- - - - + + + +
@@ -35,18 +35,18 @@ diff --git a/src/views/datatable/DataTableDoc.vue b/src/views/datatable/DataTableDoc.vue index d90bbcd82..5cbfafd6f 100644 --- a/src/views/datatable/DataTableDoc.vue +++ b/src/views/datatable/DataTableDoc.vue @@ -540,10 +540,10 @@ data() { @@ -552,10 +552,10 @@ data() { diff --git a/src/views/treetable/TreeTableColResizeDemo.vue b/src/views/treetable/TreeTableColResizeDemo.vue new file mode 100644 index 000000000..38a7777f0 --- /dev/null +++ b/src/views/treetable/TreeTableColResizeDemo.vue @@ -0,0 +1,52 @@ + + + \ No newline at end of file diff --git a/src/views/treetable/TreeTableSubMenu.vue b/src/views/treetable/TreeTableSubMenu.vue index 9ff1ac971..0e2e6aef5 100644 --- a/src/views/treetable/TreeTableSubMenu.vue +++ b/src/views/treetable/TreeTableSubMenu.vue @@ -9,7 +9,7 @@
  • ● Selection
  • ● Lazy
  • ● ColToggle
  • -
  • ● Resize
  • +
  • ● Resize
  • ● Responsive