mirror of https://github.com/ElemeFE/element
Table: forward fixed column's mousewheel event to entire table (#9323)
parent
f9ad3f117c
commit
bbe6e62ee1
|
@ -54,6 +54,7 @@
|
||||||
"async-validator": "~1.8.1",
|
"async-validator": "~1.8.1",
|
||||||
"babel-helper-vue-jsx-merge-props": "^2.0.0",
|
"babel-helper-vue-jsx-merge-props": "^2.0.0",
|
||||||
"deepmerge": "^1.2.0",
|
"deepmerge": "^1.2.0",
|
||||||
|
"normalize-wheel": "^1.0.1",
|
||||||
"throttle-debounce": "^1.0.1"
|
"throttle-debounce": "^1.0.1"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
}, tableSize ? `el-table--${ tableSize }` : '']"
|
}, tableSize ? `el-table--${ tableSize }` : '']"
|
||||||
@mouseleave="handleMouseLeave($event)">
|
@mouseleave="handleMouseLeave($event)">
|
||||||
<div class="hidden-columns" ref="hiddenColumns"><slot></slot></div>
|
<div class="hidden-columns" ref="hiddenColumns"><slot></slot></div>
|
||||||
<div class="el-table__header-wrapper" ref="headerWrapper" v-if="showHeader">
|
<div class="el-table__header-wrapper" ref="headerWrapper" v-if="showHeader" v-mousewheel="handleHeaderFooterMousewheel">
|
||||||
<table-header
|
<table-header
|
||||||
ref="tableHeader"
|
ref="tableHeader"
|
||||||
:store="store"
|
:store="store"
|
||||||
|
@ -44,7 +44,7 @@
|
||||||
<slot name="append"></slot>
|
<slot name="append"></slot>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="el-table__footer-wrapper" ref="footerWrapper" v-if="showSummary" v-show="data && data.length > 0">
|
<div class="el-table__footer-wrapper" ref="footerWrapper" v-if="showSummary" v-show="data && data.length > 0" v-mousewheel="handleHeaderFooterMousewheel">
|
||||||
<table-footer
|
<table-footer
|
||||||
:store="store"
|
:store="store"
|
||||||
:layout="layout"
|
:layout="layout"
|
||||||
|
@ -57,6 +57,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="el-table__fixed" ref="fixedWrapper"
|
<div class="el-table__fixed" ref="fixedWrapper"
|
||||||
v-if="fixedColumns.length > 0"
|
v-if="fixedColumns.length > 0"
|
||||||
|
v-mousewheel="handleFixedMousewheel"
|
||||||
:style="[
|
:style="[
|
||||||
{ width: layout.fixedWidth ? layout.fixedWidth + 'px' : '' },
|
{ width: layout.fixedWidth ? layout.fixedWidth + 'px' : '' },
|
||||||
fixedHeight
|
fixedHeight
|
||||||
|
@ -102,6 +103,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="el-table__fixed-right" ref="rightFixedWrapper"
|
<div class="el-table__fixed-right" ref="rightFixedWrapper"
|
||||||
v-if="rightFixedColumns.length > 0"
|
v-if="rightFixedColumns.length > 0"
|
||||||
|
v-mousewheel="handleFixedMousewheel"
|
||||||
:style="[
|
:style="[
|
||||||
{ width: layout.rightFixedWidth ? layout.rightFixedWidth + 'px' : '' },
|
{ width: layout.rightFixedWidth ? layout.rightFixedWidth + 'px' : '' },
|
||||||
{ right: layout.scrollY ? (border ? layout.gutterWidth : (layout.gutterWidth || 0)) + 'px' : '' },
|
{ right: layout.scrollY ? (border ? layout.gutterWidth : (layout.gutterWidth || 0)) + 'px' : '' },
|
||||||
|
@ -155,6 +157,7 @@
|
||||||
import throttle from 'throttle-debounce/throttle';
|
import throttle from 'throttle-debounce/throttle';
|
||||||
import debounce from 'throttle-debounce/debounce';
|
import debounce from 'throttle-debounce/debounce';
|
||||||
import { addResizeListener, removeResizeListener } from 'element-ui/src/utils/resize-event';
|
import { addResizeListener, removeResizeListener } from 'element-ui/src/utils/resize-event';
|
||||||
|
import Mousewheel from 'element-ui/src/directives/mousewheel';
|
||||||
import Locale from 'element-ui/src/mixins/locale';
|
import Locale from 'element-ui/src/mixins/locale';
|
||||||
import Migrating from 'element-ui/src/mixins/migrating';
|
import Migrating from 'element-ui/src/mixins/migrating';
|
||||||
import TableStore from './table-store';
|
import TableStore from './table-store';
|
||||||
|
@ -162,7 +165,6 @@
|
||||||
import TableBody from './table-body';
|
import TableBody from './table-body';
|
||||||
import TableHeader from './table-header';
|
import TableHeader from './table-header';
|
||||||
import TableFooter from './table-footer';
|
import TableFooter from './table-footer';
|
||||||
import { mousewheel } from './util';
|
|
||||||
|
|
||||||
let tableIdSeed = 1;
|
let tableIdSeed = 1;
|
||||||
|
|
||||||
|
@ -171,6 +173,10 @@
|
||||||
|
|
||||||
mixins: [Locale, Migrating],
|
mixins: [Locale, Migrating],
|
||||||
|
|
||||||
|
directives: {
|
||||||
|
Mousewheel
|
||||||
|
},
|
||||||
|
|
||||||
props: {
|
props: {
|
||||||
data: {
|
data: {
|
||||||
type: Array,
|
type: Array,
|
||||||
|
@ -294,10 +300,35 @@
|
||||||
this.layout.updateScrollY();
|
this.layout.updateScrollY();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
handleFixedMousewheel(event, data) {
|
||||||
|
const bodyWrapper = this.bodyWrapper;
|
||||||
|
if (Math.abs(data.spinY) > 0) {
|
||||||
|
const currentScrollTop = bodyWrapper.scrollTop;
|
||||||
|
if (data.pixelY < 0 && currentScrollTop !== 0) {
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
if (data.pixelY > 0 && bodyWrapper.scrollHeight - bodyWrapper.clientHeight > currentScrollTop) {
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
bodyWrapper.scrollTop += Math.ceil(data.pixelY / 5);
|
||||||
|
} else {
|
||||||
|
bodyWrapper.scrollLeft += Math.ceil(data.pixelX / 5);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
handleHeaderFooterMousewheel(event, data) {
|
||||||
|
const { pixelX, pixelY } = data;
|
||||||
|
if (Math.abs(pixelX) >= Math.abs(pixelY)) {
|
||||||
|
event.preventDefault();
|
||||||
|
this.bodyWrapper.scrollLeft += data.pixelX / 5;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
bindEvents() {
|
bindEvents() {
|
||||||
const { headerWrapper, footerWrapper } = this.$refs;
|
const { headerWrapper, footerWrapper } = this.$refs;
|
||||||
const refs = this.$refs;
|
const refs = this.$refs;
|
||||||
let self = this;
|
let self = this;
|
||||||
|
|
||||||
this.bodyWrapper.addEventListener('scroll', function() {
|
this.bodyWrapper.addEventListener('scroll', function() {
|
||||||
if (headerWrapper) headerWrapper.scrollLeft = this.scrollLeft;
|
if (headerWrapper) headerWrapper.scrollLeft = this.scrollLeft;
|
||||||
if (footerWrapper) footerWrapper.scrollLeft = this.scrollLeft;
|
if (footerWrapper) footerWrapper.scrollLeft = this.scrollLeft;
|
||||||
|
@ -314,24 +345,6 @@
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const scrollBodyWrapper = event => {
|
|
||||||
const { deltaX, deltaY } = event;
|
|
||||||
|
|
||||||
if (Math.abs(deltaX) < Math.abs(deltaY)) return;
|
|
||||||
|
|
||||||
if (deltaX > 0) {
|
|
||||||
this.bodyWrapper.scrollLeft += 10;
|
|
||||||
} else if (deltaX < 0) {
|
|
||||||
this.bodyWrapper.scrollLeft -= 10;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
if (headerWrapper) {
|
|
||||||
mousewheel(headerWrapper, throttle(16, scrollBodyWrapper));
|
|
||||||
}
|
|
||||||
if (footerWrapper) {
|
|
||||||
mousewheel(footerWrapper, throttle(16, scrollBodyWrapper));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.fit) {
|
if (this.fit) {
|
||||||
this.windowResizeListener = throttle(50, () => {
|
this.windowResizeListener = throttle(50, () => {
|
||||||
if (this.$ready) this.doLayout();
|
if (this.$ready) this.doLayout();
|
||||||
|
|
|
@ -92,14 +92,6 @@ export const getColumnByCell = function(table, cell) {
|
||||||
return null;
|
return null;
|
||||||
};
|
};
|
||||||
|
|
||||||
const isFirefox = typeof navigator !== 'undefined' && navigator.userAgent.toLowerCase().indexOf('firefox') > -1;
|
|
||||||
|
|
||||||
export const mousewheel = function(element, callback) {
|
|
||||||
if (element && element.addEventListener) {
|
|
||||||
element.addEventListener(isFirefox ? 'DOMMouseScroll' : 'mousewheel', callback, { passive: true });
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
export const getRowIdentity = (row, rowKey) => {
|
export const getRowIdentity = (row, rowKey) => {
|
||||||
if (!row) throw new Error('row is required when get row identity');
|
if (!row) throw new Error('row is required when get row identity');
|
||||||
if (typeof rowKey === 'string') {
|
if (typeof rowKey === 'string') {
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
import normalizeWheel from 'normalize-wheel';
|
||||||
|
|
||||||
|
const isFirefox = typeof navigator !== 'undefined' && navigator.userAgent.toLowerCase().indexOf('firefox') > -1;
|
||||||
|
|
||||||
|
const mousewheel = function(element, callback) {
|
||||||
|
if (element && element.addEventListener) {
|
||||||
|
element.addEventListener(isFirefox ? 'DOMMouseScroll' : 'mousewheel', function(event) {
|
||||||
|
const normalized = normalizeWheel(event);
|
||||||
|
callback && callback.apply(this, [event, normalized]);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export default {
|
||||||
|
bind(el, binding) {
|
||||||
|
mousewheel(el, binding.value);
|
||||||
|
}
|
||||||
|
};
|
|
@ -5500,6 +5500,10 @@ normalize-url@^1.4.0:
|
||||||
query-string "^4.1.0"
|
query-string "^4.1.0"
|
||||||
sort-keys "^1.0.0"
|
sort-keys "^1.0.0"
|
||||||
|
|
||||||
|
normalize-wheel@^1.0.1:
|
||||||
|
version "1.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/normalize-wheel/-/normalize-wheel-1.0.1.tgz#aec886affdb045070d856447df62ecf86146ec45"
|
||||||
|
|
||||||
npm-run-path@^2.0.0:
|
npm-run-path@^2.0.0:
|
||||||
version "2.0.2"
|
version "2.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
|
resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
|
||||||
|
|
Loading…
Reference in New Issue