diff --git a/Gruntfile.js b/Gruntfile.js
index 664716e7a..ce4ad486c 100644
--- a/Gruntfile.js
+++ b/Gruntfile.js
@@ -7,6 +7,10 @@ module.exports = function (grunt) {
options: {
separator: ''
},
+ polyfillJs: {
+ src: ['src/polyfill/**/*.js'],
+ dest: 'docs/polyfill.js'
+ },
coreJs: {
src: [
'src/core/jquery.js',
@@ -30,41 +34,7 @@ module.exports = function (grunt) {
],
dest: 'docs/core.js'
},
- biCoreJs: {
- src: [
- 'src/core/underscore.js',
- 'src/core/foundation.js',
- 'src/core/mvc/**/*.js',
- 'src/core/base.js',
- 'src/core/alias.js',
- 'src/core/events.js',
- 'src/core/var.js',
- 'src/core/ob.js',
- 'src/core/widget.js',
- 'src/core/model.js',
- 'src/core/view.js',
- 'src/core/shortcut.js',
- 'src/core/plugin.js',
- 'src/core/controller.js',
- 'src/core/proto/**/*.js',
- 'src/core/utils/**/*.js',
- 'src/core/behavior/behavior.js',
- 'src/core/wrapper/layout.js',
- 'src/core/action/**/*.js',
- 'src/core/adapter/**/*.js',
- 'src/core/controller/**/*.js',
- 'src/core/event/**/*.js',
- 'src/core/func/**/*.js',
- 'src/core/listener/**/*.js',
- 'src/core/loader/**/*.js',
- 'src/core/logic/**/*.js',
- 'src/data/data.js',
- 'src/data/**/*.js',
- 'src/config.js'
- ],
- dest: 'bi/core.js'
- },
//最基础的控件
baseJs: {
src: [
@@ -137,6 +107,11 @@ module.exports = function (grunt) {
dest: 'docs/demo.css'
},
+ bi_polyfillJs: {
+ src: ['src/polyfill/**/*.js'],
+ dest: 'bi/polyfill.js'
+ },
+
bi_coreJs: {
src: [
'src/core/foundation.js',
diff --git a/bi/base.js b/bi/base.js
index 888d21cba..9476b3d85 100644
--- a/bi/base.js
+++ b/bi/base.js
@@ -2539,10 +2539,11 @@ BI.Collection = BI.inherit(BI.Widget, {
var self = this, o = this.options;
this.renderedCells = [];
this.renderedKeys = [];
+ this.renderRange = {};
this._scrollLock = false;
this._debounceRelease = BI.debounce(function () {
self._scrollLock = false;
- }, 150);
+ }, 1000 / 60);
this.container = BI.createWidget({
type: "bi.absolute"
});
@@ -2588,12 +2589,10 @@ BI.Collection = BI.inherit(BI.Widget, {
for (var index = 0, len = o.items.length; index < len; index++) {
var cellMetadatum = o.cellSizeAndPositionGetter(index);
- if (
- cellMetadatum.height == null || isNaN(cellMetadatum.height) ||
+ if (cellMetadatum.height == null || isNaN(cellMetadatum.height) ||
cellMetadatum.width == null || isNaN(cellMetadatum.width) ||
cellMetadatum.x == null || isNaN(cellMetadatum.x) ||
- cellMetadatum.y == null || isNaN(cellMetadatum.y)
- ) {
+ cellMetadatum.y == null || isNaN(cellMetadatum.y)) {
throw Error();
}
@@ -2634,75 +2633,134 @@ BI.Collection = BI.inherit(BI.Widget, {
var top = Math.max(0, scrollTop - o.verticalOverscanSize);
var right = Math.min(this._width, scrollLeft + o.width + o.horizontalOverscanSize);
var bottom = Math.min(this._height, scrollTop + o.height + o.verticalOverscanSize);
- var childrenToDisplay = this._cellRenderers(bottom - top, right - left, left, top);
- var renderedCells = [], renderedKeys = [];
- for (var i = 0, len = childrenToDisplay.length; i < len; i++) {
- var datum = childrenToDisplay[i];
- var index = BI.deepIndexOf(this.renderedKeys, datum.index);
- if (index > -1) {
- if (datum.width !== this.renderedCells[index]._width) {
- this.renderedCells[index]._width = datum.width;
- this.renderedCells[index].el.setWidth(datum.width);
+ if (right > 0 && bottom > 0) {
+ //如果滚动的区间并没有超出渲染的范围
+ if (top >= this.renderRange.minY && bottom <= this.renderRange.maxY && left >= this.renderRange.minX && right <= this.renderRange.maxX) {
+ return;
+ }
+ var childrenToDisplay = this._cellRenderers(bottom - top, right - left, left, top);
+ var renderedCells = [], renderedKeys = [];
+ //存储所有的left和top
+ var lefts = {}, tops = {};
+ for (var i = 0, len = childrenToDisplay.length; i < len; i++) {
+ var datum = childrenToDisplay[i];
+ lefts[datum.x] = datum.x;
+ lefts[datum.x + datum.width] = datum.x + datum.width;
+ tops[datum.y] = datum.y;
+ tops[datum.y + datum.height] = datum.y + datum.height;
+ }
+ lefts = BI.toArray(lefts);
+ tops = BI.toArray(tops);
+ var leftMap = BI.invert(lefts);
+ var topMap = BI.invert(tops);
+ //存储上下左右四个边界
+ var leftBorder = {}, rightBorder = {}, topBorder = {}, bottomBorder = {};
+ var assertMinBorder = function (border, offset) {
+ if (border[offset] == null) {
+ border[offset] = Number.MAX_VALUE;
+ }
+ };
+ var assertMaxBorder = function (border, offset) {
+ if (border[offset] == null) {
+ border[offset] = 0;
}
- if (datum.height !== this.renderedCells[index]._height) {
- this.renderedCells[index]._height = datum.height;
- this.renderedCells[index].el.setHeight(datum.height);
+ };
+ for (var i = 0, len = childrenToDisplay.length; i < len; i++) {
+ var datum = childrenToDisplay[i];
+ var index = BI.deepIndexOf(this.renderedKeys, datum.index);
+ if (index > -1) {
+ if (datum.width !== this.renderedCells[index]._width) {
+ this.renderedCells[index]._width = datum.width;
+ this.renderedCells[index].el.setWidth(datum.width);
+ }
+ if (datum.height !== this.renderedCells[index]._height) {
+ this.renderedCells[index]._height = datum.height;
+ this.renderedCells[index].el.setHeight(datum.height);
+ }
+ if (this.renderedCells[index].left !== datum.x) {
+ this.renderedCells[index].el.element.css("left", datum.x + "px");
+ }
+ if (this.renderedCells[index].top !== datum.y) {
+ this.renderedCells[index].el.element.css("top", datum.y + "px");
+ }
+ renderedCells.push(this.renderedCells[index]);
+ } else {
+ var child = BI.createWidget(BI.extend({
+ type: "bi.label",
+ width: datum.width,
+ height: datum.height
+ }, o.items[datum.index], {
+ cls: (o.items[datum.index].cls || "") + " container-cell" + (datum.y === 0 ? " first-row" : "") + (datum.x === 0 ? " first-col" : ""),
+ _left: datum.x,
+ _top: datum.y
+ }));
+ renderedCells.push({
+ el: child,
+ left: datum.x,
+ top: datum.y,
+ _width: datum.width,
+ _height: datum.height
+ });
}
- if (this.renderedCells[index].left !== datum.x) {
- this.renderedCells[index].el.element.css("left", datum.x + "px");
+ var startTopIndex = topMap[datum.y] | 0;
+ var endTopIndex = topMap[datum.y + datum.height] | 0;
+ for (var k = startTopIndex; k <= endTopIndex; k++) {
+ var t = tops[k];
+ assertMinBorder(leftBorder, t);
+ assertMaxBorder(rightBorder, t);
+ leftBorder[t] = Math.min(leftBorder[t], datum.x);
+ rightBorder[t] = Math.max(rightBorder[t], datum.x + datum.width);
}
- if (this.renderedCells[index].top !== datum.y) {
- this.renderedCells[index].el.element.css("top", datum.y + "px");
+ var startLeftIndex = leftMap[datum.x] | 0;
+ var endLeftIndex = leftMap[datum.x + datum.width] | 0;
+ for (var k = startLeftIndex; k <= endLeftIndex; k++) {
+ var l = lefts[k];
+ assertMinBorder(topBorder, l);
+ assertMaxBorder(bottomBorder, l);
+ topBorder[l] = Math.min(topBorder[l], datum.y);
+ bottomBorder[l] = Math.max(bottomBorder[l], datum.y + datum.height);
}
- renderedCells.push(this.renderedCells[index]);
- } else {
- var child = BI.createWidget(BI.extend({
- type: "bi.label",
- width: datum.width,
- height: datum.height
- }, o.items[datum.index], {
- cls: (o.items[datum.index].cls || "") + " container-cell" + (datum.y === 0 ? " first-row" : "") + (datum.x === 0 ? " first-col" : ""),
- _left: datum.x,
- _top: datum.y
- }));
- renderedCells.push({
- el: child,
- left: datum.x,
- top: datum.y,
- _width: datum.width,
- _height: datum.height
- });
+
+ renderedKeys.push(datum.index);
}
- renderedKeys.push(datum.index);
+ //已存在的, 需要添加的和需要删除的
+ var existSet = {}, addSet = {}, deleteArray = [];
+ BI.each(renderedKeys, function (i, key) {
+ if (BI.deepContains(self.renderedKeys, key)) {
+ existSet[i] = key;
+ } else {
+ addSet[i] = key;
+ }
+ });
+ BI.each(this.renderedKeys, function (i, key) {
+ if (BI.deepContains(existSet, key)) {
+ return;
+ }
+ if (BI.deepContains(addSet, key)) {
+ return;
+ }
+ deleteArray.push(i);
+ });
+ BI.each(deleteArray, function (i, index) {
+ self.renderedCells[index].el.destroy();
+ });
+ var addedItems = [];
+ BI.each(addSet, function (index) {
+ addedItems.push(renderedCells[index])
+ });
+ this.container.addItems(addedItems);
+ this.renderedCells = renderedCells;
+ this.renderedKeys = renderedKeys;
+
+ //Todo 左右比较特殊
+ var minX = BI.min(leftBorder);
+ var maxX = BI.max(rightBorder);
+
+ var minY = BI.max(topBorder);
+ var maxY = BI.min(bottomBorder);
+
+ this.renderRange = {minX: minX, minY: minY, maxX: maxX, maxY: maxY};
}
- //已存在的, 需要添加的和需要删除的
- var existSet = {}, addSet = {}, deleteArray = [];
- BI.each(renderedKeys, function (i, key) {
- if (BI.deepContains(self.renderedKeys, key)) {
- existSet[i] = key;
- } else {
- addSet[i] = key;
- }
- });
- BI.each(this.renderedKeys, function (i, key) {
- if (BI.deepContains(existSet, key)) {
- return;
- }
- if (BI.deepContains(addSet, key)) {
- return;
- }
- deleteArray.push(i);
- });
- BI.each(deleteArray, function (i, index) {
- self.renderedCells[index].el.destroy();
- });
- var addedItems = [];
- BI.each(addSet, function (index) {
- addedItems.push(renderedCells[index])
- });
- this.container.addItems(addedItems);
- this.renderedCells = renderedCells;
- this.renderedKeys = renderedKeys;
},
_getMaxScrollLeft: function () {
@@ -2789,6 +2847,7 @@ BI.Collection = BI.inherit(BI.Widget, {
});
this.renderedCells = [];
this.renderedKeys = [];
+ this.renderRange = {};
this._scrollLock = false;
},
@@ -14613,10 +14672,11 @@ BI.Grid = BI.inherit(BI.Widget, {
var self = this, o = this.options;
this.renderedCells = [];
this.renderedKeys = [];
+ this.renderRange = {};
this._scrollLock = false;
this._debounceRelease = BI.debounce(function () {
self._scrollLock = false;
- }, 150);
+ }, 1000 / 60);
this.container = BI.createWidget({
type: "bi.absolute"
});
@@ -14661,13 +14721,17 @@ BI.Grid = BI.inherit(BI.Widget, {
_calculateChildrenToRender: function () {
var self = this, o = this.options;
- var width = o.width, height = o.height, scrollLeft = BI.clamp(o.scrollLeft, 0, this._getMaxScrollLeft()), scrollTop = BI.clamp(o.scrollTop, 0, this._getMaxScrollTop()),
+ var width = o.width, height = o.height, scrollLeft = BI.clamp(o.scrollLeft, 0, this._getMaxScrollLeft()),
+ scrollTop = BI.clamp(o.scrollTop, 0, this._getMaxScrollTop()),
overscanColumnCount = o.overscanColumnCount, overscanRowCount = o.overscanRowCount;
if (height > 0 && width > 0) {
var visibleColumnIndices = this._columnSizeAndPositionManager.getVisibleCellRange(width, scrollLeft);
var visibleRowIndices = this._rowSizeAndPositionManager.getVisibleCellRange(height, scrollTop);
+ if (BI.isEmpty(visibleColumnIndices) || BI.isEmpty(visibleRowIndices)) {
+ return;
+ }
var horizontalOffsetAdjustment = this._columnSizeAndPositionManager.getOffsetAdjustment(width, scrollLeft);
var verticalOffsetAdjustment = this._rowSizeAndPositionManager.getOffsetAdjustment(height, scrollTop);
@@ -14685,8 +14749,22 @@ BI.Grid = BI.inherit(BI.Widget, {
var rowStartIndex = overscanRowIndices.overscanStartIndex;
var rowStopIndex = overscanRowIndices.overscanStopIndex;
- var renderedCells = [], renderedKeys = [];
+ //算区间size
+ var minRowDatum = this._rowSizeAndPositionManager.getSizeAndPositionOfCell(rowStartIndex);
+ var minColumnDatum = this._columnSizeAndPositionManager.getSizeAndPositionOfCell(columnStartIndex);
+ var maxRowDatum = this._rowSizeAndPositionManager.getSizeAndPositionOfCell(rowStopIndex);
+ var maxColumnDatum = this._columnSizeAndPositionManager.getSizeAndPositionOfCell(columnStopIndex);
+ var top = minRowDatum.offset + verticalOffsetAdjustment;
+ var left = minColumnDatum.offset + horizontalOffsetAdjustment;
+ var bottom = maxRowDatum.offset + verticalOffsetAdjustment + maxRowDatum.size;
+ var right = maxColumnDatum.offset + horizontalOffsetAdjustment + maxColumnDatum.size;
+ //如果滚动的区间并没有超出渲染的范围
+ if (top >= this.renderRange.minY && bottom <= this.renderRange.maxY && left >= this.renderRange.minX && right <= this.renderRange.maxX) {
+ return;
+ }
+ var renderedCells = [], renderedKeys = [];
+ var minX = this._getMaxScrollLeft(), minY = this._getMaxScrollTop(), maxX = 0, maxY = 0;
for (var rowIndex = rowStartIndex; rowIndex <= rowStopIndex; rowIndex++) {
var rowDatum = this._rowSizeAndPositionManager.getSizeAndPositionOfCell(rowIndex);
@@ -14731,6 +14809,10 @@ BI.Grid = BI.inherit(BI.Widget, {
_height: rowDatum.size
});
}
+ minX = Math.min(minX, columnDatum.offset + horizontalOffsetAdjustment);
+ maxX = Math.max(maxX, columnDatum.offset + horizontalOffsetAdjustment + columnDatum.size);
+ minY = Math.min(minY, rowDatum.offset + verticalOffsetAdjustment);
+ maxY = Math.max(maxY, rowDatum.offset + verticalOffsetAdjustment + rowDatum.size);
renderedKeys.push(key);
}
}
@@ -14762,6 +14844,7 @@ BI.Grid = BI.inherit(BI.Widget, {
this.container.addItems(addedItems);
this.renderedCells = renderedCells;
this.renderedKeys = renderedKeys;
+ this.renderRange = {minX: minX, minY: minY, maxX: maxX, maxY: maxY};
}
},
@@ -14865,6 +14948,7 @@ BI.Grid = BI.inherit(BI.Widget, {
});
this.renderedCells = [];
this.renderedKeys = [];
+ this.renderRange = {};
this._scrollLock = false;
},
@@ -29036,26 +29120,54 @@ BI.QuickCollectionTable = BI.inherit(BI.CollectionTable, {
mounted: function () {
BI.QuickCollectionTable.superclass.mounted.apply(this, arguments);
var self = this;
- this._leftWheelHandler = new BI.WheelHandler(
- BI.bind(this._onWheelY, this),
- BI.bind(this._shouldHandleX, this),
+ this._topLeftWheelHandler = new BI.WheelHandler(
+ BI.bind(this._onWheelLeft, this),
+ BI.bind(this._shouldHandleLeftX, this),
BI.bind(this._shouldHandleY, this)
);
- this._rightWheelHandler = new BI.WheelHandler(
- BI.bind(this._onWheelY, this),
- BI.bind(this._shouldHandleX, this),
+ this._topRightWheelHandler = new BI.WheelHandler(
+ BI.bind(this._onWheelRight, this),
+ BI.bind(this._shouldHandleRightX, this),
+ BI.bind(this._shouldHandleY, this)
+ );
+ this._bottomLeftWheelHandler = new BI.WheelHandler(
+ BI.bind(this._onWheelLeft, this),
+ BI.bind(this._shouldHandleLeftX, this),
BI.bind(this._shouldHandleY, this)
);
+ this._bottomRightWheelHandler = new BI.WheelHandler(
+ BI.bind(this._onWheelRight, this),
+ BI.bind(this._shouldHandleRightX, this),
+ BI.bind(this._shouldHandleY, this)
+ );
+ this.topLeftCollection.element.mousewheel(function (e) {
+ self._topLeftWheelHandler.onWheel(e.originalEvent);
+ });
+ this.topRightCollection.element.mousewheel(function (e) {
+ self._topRightWheelHandler.onWheel(e.originalEvent);
+ });
this.bottomLeftCollection.element.mousewheel(function (e) {
- self._leftWheelHandler.onWheel(e.originalEvent);
+ self._bottomLeftWheelHandler.onWheel(e.originalEvent);
});
this.bottomRightCollection.element.mousewheel(function (e) {
- self._rightWheelHandler.onWheel(e.originalEvent);
+ self._bottomRightWheelHandler.onWheel(e.originalEvent);
});
},
- _shouldHandleX: function (delta) {
- return false;
+ _shouldHandleLeftX: function (delta) {
+ if (delta > 0) {
+ return this.bottomLeftCollection.getScrollLeft() < this.bottomLeftCollection.getMaxScrollLeft();
+ } else {
+ return this.bottomLeftCollection.getScrollLeft() > 0;
+ }
+ },
+
+ _shouldHandleRightX: function (delta) {
+ if (delta > 0) {
+ return this.bottomRightCollection.getScrollLeft() < this.bottomRightCollection.getMaxScrollLeft();
+ } else {
+ return this.bottomRightCollection.getScrollLeft() > 0;
+ }
},
_shouldHandleY: function (delta) {
@@ -29066,19 +29178,38 @@ BI.QuickCollectionTable = BI.inherit(BI.CollectionTable, {
}
},
- _onWheelY: function (deltaX, deltaY) {
+ _onWheelLeft: function (deltaX, deltaY) {
+ var self = this;
+ var scrollTop = this.bottomLeftCollection.getScrollTop();
+ var scrollLeft = this.bottomLeftCollection.getScrollLeft();
+ scrollTop += deltaY;
+ scrollLeft += deltaX;
+ this.bottomLeftCollection.setScrollTop(scrollTop);
+ this.bottomRightCollection.setScrollTop(scrollTop);
+ this.topLeftCollection.setScrollLeft(scrollLeft);
+ this.bottomLeftCollection.setScrollLeft(scrollLeft);
+ self._populateScrollbar();
+ this.fireEvent(BI.Table.EVENT_TABLE_SCROLL, arguments);
+ },
+
+ _onWheelRight: function (deltaX, deltaY) {
var self = this;
var scrollTop = this.bottomRightCollection.getScrollTop();
+ var scrollLeft = this.bottomRightCollection.getScrollLeft();
scrollTop += deltaY;
+ scrollLeft += deltaX;
this.bottomLeftCollection.setScrollTop(scrollTop);
this.bottomRightCollection.setScrollTop(scrollTop);
+ this.topRightCollection.setScrollLeft(scrollLeft);
+ this.bottomRightCollection.setScrollLeft(scrollLeft);
self._populateScrollbar();
this.fireEvent(BI.Table.EVENT_TABLE_SCROLL, arguments);
},
_populateTable: function () {
var self = this, o = this.options;
- var regionSize = this.getRegionSize(), totalLeftColumnSize = 0, totalRightColumnSize = 0, totalColumnSize = 0, summaryColumnSizeArray = [], totalRowSize = o.items.length * o.rowSize;
+ var regionSize = this.getRegionSize(), totalLeftColumnSize = 0, totalRightColumnSize = 0, totalColumnSize = 0,
+ summaryColumnSizeArray = [], totalRowSize = o.items.length * o.rowSize;
var freezeColLength = this._getFreezeColLength();
BI.each(o.columnSize, function (i, size) {
if (o.isNeedFreeze === true && o.freezeCols.contains(i)) {
@@ -29691,26 +29822,54 @@ BI.QuickGridTable = BI.inherit(BI.GridTable, {
mounted: function () {
BI.QuickGridTable.superclass.mounted.apply(this, arguments);
var self = this;
- this._leftWheelHandler = new BI.WheelHandler(
- BI.bind(this._onWheelY, this),
- BI.bind(this._shouldHandleX, this),
+ this._topLeftWheelHandler = new BI.WheelHandler(
+ BI.bind(this._onWheelLeft, this),
+ BI.bind(this._shouldHandleLeftX, this),
BI.bind(this._shouldHandleY, this)
);
- this._rightWheelHandler = new BI.WheelHandler(
- BI.bind(this._onWheelY, this),
- BI.bind(this._shouldHandleX, this),
+ this._topRightWheelHandler = new BI.WheelHandler(
+ BI.bind(this._onWheelRight, this),
+ BI.bind(this._shouldHandleRightX, this),
+ BI.bind(this._shouldHandleY, this)
+ );
+ this._bottomLeftWheelHandler = new BI.WheelHandler(
+ BI.bind(this._onWheelLeft, this),
+ BI.bind(this._shouldHandleLeftX, this),
BI.bind(this._shouldHandleY, this)
);
+ this._bottomRightWheelHandler = new BI.WheelHandler(
+ BI.bind(this._onWheelRight, this),
+ BI.bind(this._shouldHandleRightX, this),
+ BI.bind(this._shouldHandleY, this)
+ );
+ this.topLeftGrid.element.mousewheel(function (e) {
+ self._topLeftWheelHandler.onWheel(e.originalEvent);
+ });
+ this.topRightGrid.element.mousewheel(function (e) {
+ self._topRightWheelHandler.onWheel(e.originalEvent);
+ });
this.bottomLeftGrid.element.mousewheel(function (e) {
- self._leftWheelHandler.onWheel(e.originalEvent);
+ self._bottomLeftWheelHandler.onWheel(e.originalEvent);
});
this.bottomRightGrid.element.mousewheel(function (e) {
- self._rightWheelHandler.onWheel(e.originalEvent);
+ self._bottomRightWheelHandler.onWheel(e.originalEvent);
});
},
- _shouldHandleX: function (delta) {
- return false;
+ _shouldHandleLeftX: function (delta) {
+ if (delta > 0) {
+ return this.bottomLeftGrid.getScrollLeft() < this.bottomLeftGrid.getMaxScrollLeft();
+ } else {
+ return this.bottomLeftGrid.getScrollLeft() > 0;
+ }
+ },
+
+ _shouldHandleRightX: function (delta) {
+ if (delta > 0) {
+ return this.bottomRightGrid.getScrollLeft() < this.bottomRightGrid.getMaxScrollLeft();
+ } else {
+ return this.bottomRightGrid.getScrollLeft() > 0;
+ }
},
_shouldHandleY: function (delta) {
@@ -29721,12 +29880,30 @@ BI.QuickGridTable = BI.inherit(BI.GridTable, {
}
},
- _onWheelY: function (deltaX, deltaY) {
+ _onWheelLeft: function (deltaX, deltaY) {
+ var self = this;
+ var scrollTop = this.bottomLeftGrid.getScrollTop();
+ var scrollLeft = this.bottomLeftGrid.getScrollLeft();
+ scrollTop += deltaY;
+ scrollLeft += deltaX;
+ this.bottomLeftGrid.setScrollTop(scrollTop);
+ this.bottomRightGrid.setScrollTop(scrollTop);
+ this.topLeftGrid.setScrollLeft(scrollLeft);
+ this.bottomLeftGrid.setScrollLeft(scrollLeft);
+ self._populateScrollbar();
+ this.fireEvent(BI.Table.EVENT_TABLE_SCROLL, arguments);
+ },
+
+ _onWheelRight: function (deltaX, deltaY) {
var self = this;
var scrollTop = this.bottomRightGrid.getScrollTop();
+ var scrollLeft = this.bottomRightGrid.getScrollLeft();
scrollTop += deltaY;
+ scrollLeft += deltaX;
this.bottomLeftGrid.setScrollTop(scrollTop);
this.bottomRightGrid.setScrollTop(scrollTop);
+ this.topRightGrid.setScrollLeft(scrollLeft);
+ this.bottomRightGrid.setScrollLeft(scrollLeft);
self._populateScrollbar();
this.fireEvent(BI.Table.EVENT_TABLE_SCROLL, arguments);
},
diff --git a/bi/case.js b/bi/case.js
index 7b4c962e3..163ac141d 100644
--- a/bi/case.js
+++ b/bi/case.js
@@ -9118,18 +9118,18 @@ BI.DynamicSummaryLayerTreeTable = BI.inherit(BI.Widget, {
var vDeep = this._getVDeep();
var header = this._createHeader(vDeep);
var data = this._formatItems(o.items, header, deep);
- // var columnSize = o.columnSize.slice();
- // var minColumnSize = o.minColumnSize.slice();
- // var maxColumnSize = o.maxColumnSize.slice();
- // BI.removeAt(columnSize, data.deletedCols);
- // BI.removeAt(minColumnSize, data.deletedCols);
- // BI.removeAt(maxColumnSize, data.deletedCols);
+ var columnSize = o.columnSize.slice();
+ var minColumnSize = o.minColumnSize.slice();
+ var maxColumnSize = o.maxColumnSize.slice();
+ BI.removeAt(columnSize, data.deletedCols);
+ BI.removeAt(minColumnSize, data.deletedCols);
+ BI.removeAt(maxColumnSize, data.deletedCols);
return {
header: data.header,
items: data.items,
- columnSize: this._formatColumnSize(o.columnSize, deep),
- minColumnSize: this._formatColumns(o.minColumnSize, deep),
- maxColumnSize: this._formatColumns(o.maxColumnSize, deep),
+ columnSize: this._formatColumnSize(columnSize, deep),
+ minColumnSize: this._formatColumns(minColumnSize, deep),
+ maxColumnSize: this._formatColumns(maxColumnSize, deep),
freezeCols: this._formatFreezeCols()
}
},
diff --git a/bi/chart.js b/bi/chart.js
index 4130d7a7a..b095fe2bb 100644
--- a/bi/chart.js
+++ b/bi/chart.js
@@ -19,7 +19,9 @@ BI.Chart = BI.inherit(BI.Pane, {
this.vanCharts = VanCharts.init(self.element[0]);
this._resizer = BI.debounce(function () {
- self.vanCharts.resize();
+ if (self.element.width() > 0 && self.element.height() > 0) {
+ self.vanCharts.resize();
+ }
}, 30);
BI.ResizeDetector.addResizeListener(this, function (e) {
self._resizer();
diff --git a/bi/core.js b/bi/core.js
index 8d24e0f0e..95228d4cf 100644
--- a/bi/core.js
+++ b/bi/core.js
@@ -2163,6 +2163,29 @@ if (!window.BI) {
return true;
},
+ backFindKey: function (obj, predicate, context) {
+ predicate = BI.iteratee(predicate, context);
+ var keys = _.keys(obj), key;
+ for (var i = keys.length - 1; i >= 0; i--) {
+ key = keys[i];
+ if (predicate(obj[key], key, obj)) {
+ return key;
+ }
+ }
+ },
+
+ backFind: function (obj, predicate, context) {
+ var key;
+ if (BI.isArray(obj)) {
+ key = BI.findLastIndex(obj, predicate, context);
+ } else {
+ key = BI.backFindKey(obj, predicate, context);
+ }
+ if (key !== void 0 && key !== -1) {
+ return obj[key];
+ }
+ },
+
remove: function (obj, target, context) {
var isFunction = BI.isFunction(target);
target = isFunction || BI.isArray(target) ? target : [target];
@@ -5820,34 +5843,6 @@ $.extend(Array.prototype, {
contains: function (o) {
return this.indexOf(o) > -1;
},
- /**
- * 检查指定的值是否在数组中
- * @param {Object} o 要检查的值
- * @return {Number} o在数组中的索引(如果不在数组中则返回-1)
- */
- indexOf: function (o) {
- for (var i = 0, len = this.length; i < len; i++) {
- if (_.isEqual(o, this[i])) {
- return i;
- }
- }
- return -1;
- },
-
- /**
- * 检查指定的值是否在数组中
- * ie67不支持数组的这个方法
- * @param {Object} o 要检查的值
- * @return {Number} o在数组中的索引(如果不在数组中则返回-1)
- */
- lastIndexOf: function (o) {
- for (var len = this.length, i = len - 1; i >= 0; i--) {
- if (_.isEqual(o, this[i])) {
- return i;
- }
- }
- return -1;
- },
/**
* 从数组中移除指定的值,如果值不在数组中,则不产生任何效果
@@ -5856,265 +5851,29 @@ $.extend(Array.prototype, {
*/
remove: function (o) {
var index = this.indexOf(o);
- if (index != -1) {
+ if (index !== -1) {
this.splice(index, 1);
}
return this;
},
- /**
- * 移除数组中的所有元素
- */
- clear: function () {
- while (this.length > 0) {
- this.pop();
- }
- }
-});
-/**
- * Array原型拓展
- * Created by wang on 15/6/23.
- */
-!function () {
- Array.prototype.pushArray = function (array) {
+ pushArray: function (array) {
for (var i = 0; i < array.length; i++) {
this.push(array[i]);
}
- };
- Array.prototype.pushDistinct = function (obj) {
+ },
+ pushDistinct: function (obj) {
if (!this.contains(obj)) {
this.push(obj);
}
- };
- Array.prototype.pushDistinctArray = function (array) {
+ },
+ pushDistinctArray: function (array) {
for (var i = 0, len = array.length; i < len; i++) {
this.pushDistinct(array[i]);
}
- };
-}();
-
-/**
- * 规定bi的数组分为两种,其中,value和type值为key值
- * 1、[{"text":1,"value":2,"children":[]}]
- * 2、[{"name":1,"type":2,"children":[]}]
- * guy
- * 对数组的操作
- * @type {{}}
- */
-ArrayUtils = {};
-
-$.extend(ArrayUtils, {
- /**
- * 遍历方法
- * @param array
- * @param back
- */
- traversal: function (array, back) {
- if (BI.isNull(array)) {
- return;
- }
- var self = this;
- BI.each(array, function (i, item) {
- if (back(i, item) === BI.Status.END) {
- return false;
- }
- self.traversal(item.children, back);
- })
- },
-
- getAllChildNames: function (array) {
- var names = [];
- this.traversal(array, function (i, item) {
- if (BI.isNotEmptyArray(item.children)) {
- return BI.Status.RUNNING;
- }
- names.push(item.text || item.name);
- });
- return names;
- },
-
- /**
- * 获取第一个子节点
- * @param array
- */
- getFirstChild: function (array) {
- var first = {};
- this.traversal(array, function (i, item) {
- if (BI.isNotEmptyArray(item.children)) {
- return;
- }
- first = item;
- return BI.Status.END;
- })
- return first;
- },
-
- /**
- * 获取最后一个子节点
- * @param array
- */
- getLastChild: function (array) {
- var first = {};
- this.traversal(array, function (i, item) {
- if (item.children && item.children.length > 0) {
- return;
- }
- first = item;
- })
- return first;
- },
-
- getTextByValue: function (array, value) {
- if (!array) {
- return value;
- }
- var text = "";
- this.traversal(array, function (i, item) {
- if (BI.isEqual(item.value, value)) {
- text = item.text;
- return BI.Status.END;
- }
- });
- return text;
- },
-
- getNameByType: function (array, type) {
- if (!array) {
- return type;
- }
- var name = "";
- this.traversal(array, function (i, item) {
- if (BI.isEqual(item.type, type)) {
- name = item.name;
- return BI.Status.END;
- }
- });
- return name;
- },
-
- getItemByText: function (array, text) {
- var res = void 0;
- this.traversal(array, function (i, item) {
- if (BI.isCapitalEqual(item.text, text)) {
- res = item;
- return BI.Status.END;
- }
- });
- return res;
- },
-
- getIndexByText: function (array, text) {
- var res = -1;
- this.traversal(array, function (i, item) {
- if (BI.isCapitalEqual(item.text, text)) {
- res = i;
- return BI.Status.END;
- }
- });
- return res;
- },
-
- getItemByValue: function (array, value) {
- var res = void 0;
- this.traversal(array, function (i, item) {
- if (BI.isEqual(item.value, value)) {
- res = item;
- return BI.Status.END;
- }
- });
- return res;
- },
-
- getIndexByValue: function (array, value) {
- var res = -1;
- this.traversal(array, function (i, item) {
- if (BI.isEqual(item.value, value)) {
- res = i;
- return BI.Status.END;
- }
- });
- return res;
- },
-
- getItemByName: function (array, name) {
- var res = void 0;
- this.traversal(array, function (i, item) {
- if (BI.isCapitalEqual(item.name, name)) {
- res = item;
- return BI.Status.END;
- }
- });
- return res;
- },
-
- getIndexByName: function (array, name) {
- var res = -1;
- this.traversal(array, function (i, item) {
- if (BI.isCapitalEqual(item.name, name)) {
- res = i;
- return BI.Status.END;
- }
- });
- return res;
- },
-
- getItemByType: function (array, type) {
- var res = void 0;
- this.traversal(array, function (i, item) {
- if (BI.isEqual(item.type, type)) {
- res = item;
- return BI.Status.END;
- }
- });
- return res;
- },
-
- getIndexByType: function (array, type) {
- var res = -1;
- this.traversal(array, function (i, item) {
- if (BI.isEqual(item.type, type)) {
- res = i;
- return BI.Status.END;
- }
- });
- return res;
- },
-
- deleteItemByType: function (array, type) {
- var item = this.getItemByType(array, type);
- array.remove(item);
- },
-
- deleteItemByName: function (array, name) {
- var item = this.getItemByName(array, name);
- array.remove(item);
- },
-
- deleteItemByValue: function (array, value) {
- var item = this.getItemByValue(array, value);
- array.remove(item);
- }
-});/*
- * 前端缓存
- */
-window.localStorage || (window.localStorage = {
- items: {},
- setItem: function (k, v) {
- BI.Cache.addCookie(k, v);
- },
- getItem: function (k) {
- return BI.Cache.getCookie(k);
- },
- removeItem: function (k) {
- BI.Cache.deleteCookie(k);
- },
- key: function () {
-
- },
- clear: function () {
- this.items = {};
}
});
+
BI.Cache = {
_prefix: "bi",
setUsername: function (username) {
@@ -6249,7 +6008,6 @@ Date._QN = ["", BI.i18nText("BI-Quarter_1"),
BI.i18nText("BI-Quarter_4")];
-
/** Adds the number of days array to the Date object. */
Date._MD = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
@@ -6284,12 +6042,19 @@ Date.prototype.getDayOfYear = function () {
/** Returns the number of the week in year, as defined in ISO 8601. */
Date.prototype.getWeekNumber = function () {
var d = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0);
- var DoW = d.getDay();
- d.setDate(d.getDate() - (DoW + 6) % 7 + 3); // Nearest Thu
+ var week = d.getDay();
+ if (this.getMonth() === 0 && this.getDate() <= week) {
+ return 1;
+ }
+ d.setDate(this.getDate() - week);
var ms = d.valueOf(); // GMT
d.setMonth(0);
- d.setDate(4); // Thu in Week 1
- return Math.round((ms - d.valueOf()) / (7 * 864e5)) + 1;
+ d.setDate(1);
+ var offset = Math.floor((ms - d.valueOf()) / (7 * 864e5)) + 1;
+ if (d.getDay() > 0) {
+ offset++;
+ }
+ return offset;
};
//离当前时间多少天的时间
@@ -6381,7 +6146,7 @@ Date.prototype.getOffsetMonth = function (n) {
var dt = new Date(this.getTime());
var day = dt.getDate();
var monthDay = new Date(dt.getFullYear(), dt.getMonth() + parseInt(n), 1).getMonthDays();
- if(day > monthDay){
+ if (day > monthDay) {
day = monthDay;
}
dt.setDate(day);
@@ -7065,50 +6830,6 @@ function accDiv(arg1, arg2) {
Number.prototype.div = function (arg) {
return accDiv(this, arg);
};/**
- * 特殊情况
- * Created by wang on 15/6/23.
- */
-//解决console未定义问题 guy
-window.console = window.console || (function () {
- var c = {};
- c.log = c.warn = c.debug = c.info = c.error = c.time = c.dir = c.profile
- = c.clear = c.exception = c.trace = c.assert = function () {
- };
- return c;
- })();
-
-
-//修复ie9下sort方法的bug
-!function (window) {
- var ua = window.navigator.userAgent.toLowerCase(),
- reg = /msie|applewebkit.+safari/;
- if (reg.test(ua)) {
- var _sort = Array.prototype.sort;
- Array.prototype.sort = function (fn) {
- if (!!fn && typeof fn === 'function') {
- if (this.length < 2) {
- return this;
- }
- var i = 0, j = i + 1, l = this.length, tmp, r = false, t = 0;
- for (; i < l; i++) {
- for (j = i + 1; j < l; j++) {
- t = fn.call(this, this[i], this[j]);
- r = (typeof t === 'number' ? t :
- !!t ? 1 : 0) > 0;
- if (r === true) {
- tmp = this[i];
- this[i] = this[j];
- this[j] = tmp;
- }
- }
- }
- return this;
- } else {
- return _sort.call(this);
- }
- };
- }
-}(window);/**
* 对字符串对象的扩展
* @class String
*/
diff --git a/demo.html b/demo.html
deleted file mode 100644
index dcbb03ef1..000000000
--- a/demo.html
+++ /dev/null
@@ -1,34 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/docs/base.js b/docs/base.js
index 888d21cba..9476b3d85 100644
--- a/docs/base.js
+++ b/docs/base.js
@@ -2539,10 +2539,11 @@ BI.Collection = BI.inherit(BI.Widget, {
var self = this, o = this.options;
this.renderedCells = [];
this.renderedKeys = [];
+ this.renderRange = {};
this._scrollLock = false;
this._debounceRelease = BI.debounce(function () {
self._scrollLock = false;
- }, 150);
+ }, 1000 / 60);
this.container = BI.createWidget({
type: "bi.absolute"
});
@@ -2588,12 +2589,10 @@ BI.Collection = BI.inherit(BI.Widget, {
for (var index = 0, len = o.items.length; index < len; index++) {
var cellMetadatum = o.cellSizeAndPositionGetter(index);
- if (
- cellMetadatum.height == null || isNaN(cellMetadatum.height) ||
+ if (cellMetadatum.height == null || isNaN(cellMetadatum.height) ||
cellMetadatum.width == null || isNaN(cellMetadatum.width) ||
cellMetadatum.x == null || isNaN(cellMetadatum.x) ||
- cellMetadatum.y == null || isNaN(cellMetadatum.y)
- ) {
+ cellMetadatum.y == null || isNaN(cellMetadatum.y)) {
throw Error();
}
@@ -2634,75 +2633,134 @@ BI.Collection = BI.inherit(BI.Widget, {
var top = Math.max(0, scrollTop - o.verticalOverscanSize);
var right = Math.min(this._width, scrollLeft + o.width + o.horizontalOverscanSize);
var bottom = Math.min(this._height, scrollTop + o.height + o.verticalOverscanSize);
- var childrenToDisplay = this._cellRenderers(bottom - top, right - left, left, top);
- var renderedCells = [], renderedKeys = [];
- for (var i = 0, len = childrenToDisplay.length; i < len; i++) {
- var datum = childrenToDisplay[i];
- var index = BI.deepIndexOf(this.renderedKeys, datum.index);
- if (index > -1) {
- if (datum.width !== this.renderedCells[index]._width) {
- this.renderedCells[index]._width = datum.width;
- this.renderedCells[index].el.setWidth(datum.width);
+ if (right > 0 && bottom > 0) {
+ //如果滚动的区间并没有超出渲染的范围
+ if (top >= this.renderRange.minY && bottom <= this.renderRange.maxY && left >= this.renderRange.minX && right <= this.renderRange.maxX) {
+ return;
+ }
+ var childrenToDisplay = this._cellRenderers(bottom - top, right - left, left, top);
+ var renderedCells = [], renderedKeys = [];
+ //存储所有的left和top
+ var lefts = {}, tops = {};
+ for (var i = 0, len = childrenToDisplay.length; i < len; i++) {
+ var datum = childrenToDisplay[i];
+ lefts[datum.x] = datum.x;
+ lefts[datum.x + datum.width] = datum.x + datum.width;
+ tops[datum.y] = datum.y;
+ tops[datum.y + datum.height] = datum.y + datum.height;
+ }
+ lefts = BI.toArray(lefts);
+ tops = BI.toArray(tops);
+ var leftMap = BI.invert(lefts);
+ var topMap = BI.invert(tops);
+ //存储上下左右四个边界
+ var leftBorder = {}, rightBorder = {}, topBorder = {}, bottomBorder = {};
+ var assertMinBorder = function (border, offset) {
+ if (border[offset] == null) {
+ border[offset] = Number.MAX_VALUE;
+ }
+ };
+ var assertMaxBorder = function (border, offset) {
+ if (border[offset] == null) {
+ border[offset] = 0;
}
- if (datum.height !== this.renderedCells[index]._height) {
- this.renderedCells[index]._height = datum.height;
- this.renderedCells[index].el.setHeight(datum.height);
+ };
+ for (var i = 0, len = childrenToDisplay.length; i < len; i++) {
+ var datum = childrenToDisplay[i];
+ var index = BI.deepIndexOf(this.renderedKeys, datum.index);
+ if (index > -1) {
+ if (datum.width !== this.renderedCells[index]._width) {
+ this.renderedCells[index]._width = datum.width;
+ this.renderedCells[index].el.setWidth(datum.width);
+ }
+ if (datum.height !== this.renderedCells[index]._height) {
+ this.renderedCells[index]._height = datum.height;
+ this.renderedCells[index].el.setHeight(datum.height);
+ }
+ if (this.renderedCells[index].left !== datum.x) {
+ this.renderedCells[index].el.element.css("left", datum.x + "px");
+ }
+ if (this.renderedCells[index].top !== datum.y) {
+ this.renderedCells[index].el.element.css("top", datum.y + "px");
+ }
+ renderedCells.push(this.renderedCells[index]);
+ } else {
+ var child = BI.createWidget(BI.extend({
+ type: "bi.label",
+ width: datum.width,
+ height: datum.height
+ }, o.items[datum.index], {
+ cls: (o.items[datum.index].cls || "") + " container-cell" + (datum.y === 0 ? " first-row" : "") + (datum.x === 0 ? " first-col" : ""),
+ _left: datum.x,
+ _top: datum.y
+ }));
+ renderedCells.push({
+ el: child,
+ left: datum.x,
+ top: datum.y,
+ _width: datum.width,
+ _height: datum.height
+ });
}
- if (this.renderedCells[index].left !== datum.x) {
- this.renderedCells[index].el.element.css("left", datum.x + "px");
+ var startTopIndex = topMap[datum.y] | 0;
+ var endTopIndex = topMap[datum.y + datum.height] | 0;
+ for (var k = startTopIndex; k <= endTopIndex; k++) {
+ var t = tops[k];
+ assertMinBorder(leftBorder, t);
+ assertMaxBorder(rightBorder, t);
+ leftBorder[t] = Math.min(leftBorder[t], datum.x);
+ rightBorder[t] = Math.max(rightBorder[t], datum.x + datum.width);
}
- if (this.renderedCells[index].top !== datum.y) {
- this.renderedCells[index].el.element.css("top", datum.y + "px");
+ var startLeftIndex = leftMap[datum.x] | 0;
+ var endLeftIndex = leftMap[datum.x + datum.width] | 0;
+ for (var k = startLeftIndex; k <= endLeftIndex; k++) {
+ var l = lefts[k];
+ assertMinBorder(topBorder, l);
+ assertMaxBorder(bottomBorder, l);
+ topBorder[l] = Math.min(topBorder[l], datum.y);
+ bottomBorder[l] = Math.max(bottomBorder[l], datum.y + datum.height);
}
- renderedCells.push(this.renderedCells[index]);
- } else {
- var child = BI.createWidget(BI.extend({
- type: "bi.label",
- width: datum.width,
- height: datum.height
- }, o.items[datum.index], {
- cls: (o.items[datum.index].cls || "") + " container-cell" + (datum.y === 0 ? " first-row" : "") + (datum.x === 0 ? " first-col" : ""),
- _left: datum.x,
- _top: datum.y
- }));
- renderedCells.push({
- el: child,
- left: datum.x,
- top: datum.y,
- _width: datum.width,
- _height: datum.height
- });
+
+ renderedKeys.push(datum.index);
}
- renderedKeys.push(datum.index);
+ //已存在的, 需要添加的和需要删除的
+ var existSet = {}, addSet = {}, deleteArray = [];
+ BI.each(renderedKeys, function (i, key) {
+ if (BI.deepContains(self.renderedKeys, key)) {
+ existSet[i] = key;
+ } else {
+ addSet[i] = key;
+ }
+ });
+ BI.each(this.renderedKeys, function (i, key) {
+ if (BI.deepContains(existSet, key)) {
+ return;
+ }
+ if (BI.deepContains(addSet, key)) {
+ return;
+ }
+ deleteArray.push(i);
+ });
+ BI.each(deleteArray, function (i, index) {
+ self.renderedCells[index].el.destroy();
+ });
+ var addedItems = [];
+ BI.each(addSet, function (index) {
+ addedItems.push(renderedCells[index])
+ });
+ this.container.addItems(addedItems);
+ this.renderedCells = renderedCells;
+ this.renderedKeys = renderedKeys;
+
+ //Todo 左右比较特殊
+ var minX = BI.min(leftBorder);
+ var maxX = BI.max(rightBorder);
+
+ var minY = BI.max(topBorder);
+ var maxY = BI.min(bottomBorder);
+
+ this.renderRange = {minX: minX, minY: minY, maxX: maxX, maxY: maxY};
}
- //已存在的, 需要添加的和需要删除的
- var existSet = {}, addSet = {}, deleteArray = [];
- BI.each(renderedKeys, function (i, key) {
- if (BI.deepContains(self.renderedKeys, key)) {
- existSet[i] = key;
- } else {
- addSet[i] = key;
- }
- });
- BI.each(this.renderedKeys, function (i, key) {
- if (BI.deepContains(existSet, key)) {
- return;
- }
- if (BI.deepContains(addSet, key)) {
- return;
- }
- deleteArray.push(i);
- });
- BI.each(deleteArray, function (i, index) {
- self.renderedCells[index].el.destroy();
- });
- var addedItems = [];
- BI.each(addSet, function (index) {
- addedItems.push(renderedCells[index])
- });
- this.container.addItems(addedItems);
- this.renderedCells = renderedCells;
- this.renderedKeys = renderedKeys;
},
_getMaxScrollLeft: function () {
@@ -2789,6 +2847,7 @@ BI.Collection = BI.inherit(BI.Widget, {
});
this.renderedCells = [];
this.renderedKeys = [];
+ this.renderRange = {};
this._scrollLock = false;
},
@@ -14613,10 +14672,11 @@ BI.Grid = BI.inherit(BI.Widget, {
var self = this, o = this.options;
this.renderedCells = [];
this.renderedKeys = [];
+ this.renderRange = {};
this._scrollLock = false;
this._debounceRelease = BI.debounce(function () {
self._scrollLock = false;
- }, 150);
+ }, 1000 / 60);
this.container = BI.createWidget({
type: "bi.absolute"
});
@@ -14661,13 +14721,17 @@ BI.Grid = BI.inherit(BI.Widget, {
_calculateChildrenToRender: function () {
var self = this, o = this.options;
- var width = o.width, height = o.height, scrollLeft = BI.clamp(o.scrollLeft, 0, this._getMaxScrollLeft()), scrollTop = BI.clamp(o.scrollTop, 0, this._getMaxScrollTop()),
+ var width = o.width, height = o.height, scrollLeft = BI.clamp(o.scrollLeft, 0, this._getMaxScrollLeft()),
+ scrollTop = BI.clamp(o.scrollTop, 0, this._getMaxScrollTop()),
overscanColumnCount = o.overscanColumnCount, overscanRowCount = o.overscanRowCount;
if (height > 0 && width > 0) {
var visibleColumnIndices = this._columnSizeAndPositionManager.getVisibleCellRange(width, scrollLeft);
var visibleRowIndices = this._rowSizeAndPositionManager.getVisibleCellRange(height, scrollTop);
+ if (BI.isEmpty(visibleColumnIndices) || BI.isEmpty(visibleRowIndices)) {
+ return;
+ }
var horizontalOffsetAdjustment = this._columnSizeAndPositionManager.getOffsetAdjustment(width, scrollLeft);
var verticalOffsetAdjustment = this._rowSizeAndPositionManager.getOffsetAdjustment(height, scrollTop);
@@ -14685,8 +14749,22 @@ BI.Grid = BI.inherit(BI.Widget, {
var rowStartIndex = overscanRowIndices.overscanStartIndex;
var rowStopIndex = overscanRowIndices.overscanStopIndex;
- var renderedCells = [], renderedKeys = [];
+ //算区间size
+ var minRowDatum = this._rowSizeAndPositionManager.getSizeAndPositionOfCell(rowStartIndex);
+ var minColumnDatum = this._columnSizeAndPositionManager.getSizeAndPositionOfCell(columnStartIndex);
+ var maxRowDatum = this._rowSizeAndPositionManager.getSizeAndPositionOfCell(rowStopIndex);
+ var maxColumnDatum = this._columnSizeAndPositionManager.getSizeAndPositionOfCell(columnStopIndex);
+ var top = minRowDatum.offset + verticalOffsetAdjustment;
+ var left = minColumnDatum.offset + horizontalOffsetAdjustment;
+ var bottom = maxRowDatum.offset + verticalOffsetAdjustment + maxRowDatum.size;
+ var right = maxColumnDatum.offset + horizontalOffsetAdjustment + maxColumnDatum.size;
+ //如果滚动的区间并没有超出渲染的范围
+ if (top >= this.renderRange.minY && bottom <= this.renderRange.maxY && left >= this.renderRange.minX && right <= this.renderRange.maxX) {
+ return;
+ }
+ var renderedCells = [], renderedKeys = [];
+ var minX = this._getMaxScrollLeft(), minY = this._getMaxScrollTop(), maxX = 0, maxY = 0;
for (var rowIndex = rowStartIndex; rowIndex <= rowStopIndex; rowIndex++) {
var rowDatum = this._rowSizeAndPositionManager.getSizeAndPositionOfCell(rowIndex);
@@ -14731,6 +14809,10 @@ BI.Grid = BI.inherit(BI.Widget, {
_height: rowDatum.size
});
}
+ minX = Math.min(minX, columnDatum.offset + horizontalOffsetAdjustment);
+ maxX = Math.max(maxX, columnDatum.offset + horizontalOffsetAdjustment + columnDatum.size);
+ minY = Math.min(minY, rowDatum.offset + verticalOffsetAdjustment);
+ maxY = Math.max(maxY, rowDatum.offset + verticalOffsetAdjustment + rowDatum.size);
renderedKeys.push(key);
}
}
@@ -14762,6 +14844,7 @@ BI.Grid = BI.inherit(BI.Widget, {
this.container.addItems(addedItems);
this.renderedCells = renderedCells;
this.renderedKeys = renderedKeys;
+ this.renderRange = {minX: minX, minY: minY, maxX: maxX, maxY: maxY};
}
},
@@ -14865,6 +14948,7 @@ BI.Grid = BI.inherit(BI.Widget, {
});
this.renderedCells = [];
this.renderedKeys = [];
+ this.renderRange = {};
this._scrollLock = false;
},
@@ -29036,26 +29120,54 @@ BI.QuickCollectionTable = BI.inherit(BI.CollectionTable, {
mounted: function () {
BI.QuickCollectionTable.superclass.mounted.apply(this, arguments);
var self = this;
- this._leftWheelHandler = new BI.WheelHandler(
- BI.bind(this._onWheelY, this),
- BI.bind(this._shouldHandleX, this),
+ this._topLeftWheelHandler = new BI.WheelHandler(
+ BI.bind(this._onWheelLeft, this),
+ BI.bind(this._shouldHandleLeftX, this),
BI.bind(this._shouldHandleY, this)
);
- this._rightWheelHandler = new BI.WheelHandler(
- BI.bind(this._onWheelY, this),
- BI.bind(this._shouldHandleX, this),
+ this._topRightWheelHandler = new BI.WheelHandler(
+ BI.bind(this._onWheelRight, this),
+ BI.bind(this._shouldHandleRightX, this),
+ BI.bind(this._shouldHandleY, this)
+ );
+ this._bottomLeftWheelHandler = new BI.WheelHandler(
+ BI.bind(this._onWheelLeft, this),
+ BI.bind(this._shouldHandleLeftX, this),
BI.bind(this._shouldHandleY, this)
);
+ this._bottomRightWheelHandler = new BI.WheelHandler(
+ BI.bind(this._onWheelRight, this),
+ BI.bind(this._shouldHandleRightX, this),
+ BI.bind(this._shouldHandleY, this)
+ );
+ this.topLeftCollection.element.mousewheel(function (e) {
+ self._topLeftWheelHandler.onWheel(e.originalEvent);
+ });
+ this.topRightCollection.element.mousewheel(function (e) {
+ self._topRightWheelHandler.onWheel(e.originalEvent);
+ });
this.bottomLeftCollection.element.mousewheel(function (e) {
- self._leftWheelHandler.onWheel(e.originalEvent);
+ self._bottomLeftWheelHandler.onWheel(e.originalEvent);
});
this.bottomRightCollection.element.mousewheel(function (e) {
- self._rightWheelHandler.onWheel(e.originalEvent);
+ self._bottomRightWheelHandler.onWheel(e.originalEvent);
});
},
- _shouldHandleX: function (delta) {
- return false;
+ _shouldHandleLeftX: function (delta) {
+ if (delta > 0) {
+ return this.bottomLeftCollection.getScrollLeft() < this.bottomLeftCollection.getMaxScrollLeft();
+ } else {
+ return this.bottomLeftCollection.getScrollLeft() > 0;
+ }
+ },
+
+ _shouldHandleRightX: function (delta) {
+ if (delta > 0) {
+ return this.bottomRightCollection.getScrollLeft() < this.bottomRightCollection.getMaxScrollLeft();
+ } else {
+ return this.bottomRightCollection.getScrollLeft() > 0;
+ }
},
_shouldHandleY: function (delta) {
@@ -29066,19 +29178,38 @@ BI.QuickCollectionTable = BI.inherit(BI.CollectionTable, {
}
},
- _onWheelY: function (deltaX, deltaY) {
+ _onWheelLeft: function (deltaX, deltaY) {
+ var self = this;
+ var scrollTop = this.bottomLeftCollection.getScrollTop();
+ var scrollLeft = this.bottomLeftCollection.getScrollLeft();
+ scrollTop += deltaY;
+ scrollLeft += deltaX;
+ this.bottomLeftCollection.setScrollTop(scrollTop);
+ this.bottomRightCollection.setScrollTop(scrollTop);
+ this.topLeftCollection.setScrollLeft(scrollLeft);
+ this.bottomLeftCollection.setScrollLeft(scrollLeft);
+ self._populateScrollbar();
+ this.fireEvent(BI.Table.EVENT_TABLE_SCROLL, arguments);
+ },
+
+ _onWheelRight: function (deltaX, deltaY) {
var self = this;
var scrollTop = this.bottomRightCollection.getScrollTop();
+ var scrollLeft = this.bottomRightCollection.getScrollLeft();
scrollTop += deltaY;
+ scrollLeft += deltaX;
this.bottomLeftCollection.setScrollTop(scrollTop);
this.bottomRightCollection.setScrollTop(scrollTop);
+ this.topRightCollection.setScrollLeft(scrollLeft);
+ this.bottomRightCollection.setScrollLeft(scrollLeft);
self._populateScrollbar();
this.fireEvent(BI.Table.EVENT_TABLE_SCROLL, arguments);
},
_populateTable: function () {
var self = this, o = this.options;
- var regionSize = this.getRegionSize(), totalLeftColumnSize = 0, totalRightColumnSize = 0, totalColumnSize = 0, summaryColumnSizeArray = [], totalRowSize = o.items.length * o.rowSize;
+ var regionSize = this.getRegionSize(), totalLeftColumnSize = 0, totalRightColumnSize = 0, totalColumnSize = 0,
+ summaryColumnSizeArray = [], totalRowSize = o.items.length * o.rowSize;
var freezeColLength = this._getFreezeColLength();
BI.each(o.columnSize, function (i, size) {
if (o.isNeedFreeze === true && o.freezeCols.contains(i)) {
@@ -29691,26 +29822,54 @@ BI.QuickGridTable = BI.inherit(BI.GridTable, {
mounted: function () {
BI.QuickGridTable.superclass.mounted.apply(this, arguments);
var self = this;
- this._leftWheelHandler = new BI.WheelHandler(
- BI.bind(this._onWheelY, this),
- BI.bind(this._shouldHandleX, this),
+ this._topLeftWheelHandler = new BI.WheelHandler(
+ BI.bind(this._onWheelLeft, this),
+ BI.bind(this._shouldHandleLeftX, this),
BI.bind(this._shouldHandleY, this)
);
- this._rightWheelHandler = new BI.WheelHandler(
- BI.bind(this._onWheelY, this),
- BI.bind(this._shouldHandleX, this),
+ this._topRightWheelHandler = new BI.WheelHandler(
+ BI.bind(this._onWheelRight, this),
+ BI.bind(this._shouldHandleRightX, this),
+ BI.bind(this._shouldHandleY, this)
+ );
+ this._bottomLeftWheelHandler = new BI.WheelHandler(
+ BI.bind(this._onWheelLeft, this),
+ BI.bind(this._shouldHandleLeftX, this),
BI.bind(this._shouldHandleY, this)
);
+ this._bottomRightWheelHandler = new BI.WheelHandler(
+ BI.bind(this._onWheelRight, this),
+ BI.bind(this._shouldHandleRightX, this),
+ BI.bind(this._shouldHandleY, this)
+ );
+ this.topLeftGrid.element.mousewheel(function (e) {
+ self._topLeftWheelHandler.onWheel(e.originalEvent);
+ });
+ this.topRightGrid.element.mousewheel(function (e) {
+ self._topRightWheelHandler.onWheel(e.originalEvent);
+ });
this.bottomLeftGrid.element.mousewheel(function (e) {
- self._leftWheelHandler.onWheel(e.originalEvent);
+ self._bottomLeftWheelHandler.onWheel(e.originalEvent);
});
this.bottomRightGrid.element.mousewheel(function (e) {
- self._rightWheelHandler.onWheel(e.originalEvent);
+ self._bottomRightWheelHandler.onWheel(e.originalEvent);
});
},
- _shouldHandleX: function (delta) {
- return false;
+ _shouldHandleLeftX: function (delta) {
+ if (delta > 0) {
+ return this.bottomLeftGrid.getScrollLeft() < this.bottomLeftGrid.getMaxScrollLeft();
+ } else {
+ return this.bottomLeftGrid.getScrollLeft() > 0;
+ }
+ },
+
+ _shouldHandleRightX: function (delta) {
+ if (delta > 0) {
+ return this.bottomRightGrid.getScrollLeft() < this.bottomRightGrid.getMaxScrollLeft();
+ } else {
+ return this.bottomRightGrid.getScrollLeft() > 0;
+ }
},
_shouldHandleY: function (delta) {
@@ -29721,12 +29880,30 @@ BI.QuickGridTable = BI.inherit(BI.GridTable, {
}
},
- _onWheelY: function (deltaX, deltaY) {
+ _onWheelLeft: function (deltaX, deltaY) {
+ var self = this;
+ var scrollTop = this.bottomLeftGrid.getScrollTop();
+ var scrollLeft = this.bottomLeftGrid.getScrollLeft();
+ scrollTop += deltaY;
+ scrollLeft += deltaX;
+ this.bottomLeftGrid.setScrollTop(scrollTop);
+ this.bottomRightGrid.setScrollTop(scrollTop);
+ this.topLeftGrid.setScrollLeft(scrollLeft);
+ this.bottomLeftGrid.setScrollLeft(scrollLeft);
+ self._populateScrollbar();
+ this.fireEvent(BI.Table.EVENT_TABLE_SCROLL, arguments);
+ },
+
+ _onWheelRight: function (deltaX, deltaY) {
var self = this;
var scrollTop = this.bottomRightGrid.getScrollTop();
+ var scrollLeft = this.bottomRightGrid.getScrollLeft();
scrollTop += deltaY;
+ scrollLeft += deltaX;
this.bottomLeftGrid.setScrollTop(scrollTop);
this.bottomRightGrid.setScrollTop(scrollTop);
+ this.topRightGrid.setScrollLeft(scrollLeft);
+ this.bottomRightGrid.setScrollLeft(scrollLeft);
self._populateScrollbar();
this.fireEvent(BI.Table.EVENT_TABLE_SCROLL, arguments);
},
diff --git a/docs/case.js b/docs/case.js
index 7b4c962e3..163ac141d 100644
--- a/docs/case.js
+++ b/docs/case.js
@@ -9118,18 +9118,18 @@ BI.DynamicSummaryLayerTreeTable = BI.inherit(BI.Widget, {
var vDeep = this._getVDeep();
var header = this._createHeader(vDeep);
var data = this._formatItems(o.items, header, deep);
- // var columnSize = o.columnSize.slice();
- // var minColumnSize = o.minColumnSize.slice();
- // var maxColumnSize = o.maxColumnSize.slice();
- // BI.removeAt(columnSize, data.deletedCols);
- // BI.removeAt(minColumnSize, data.deletedCols);
- // BI.removeAt(maxColumnSize, data.deletedCols);
+ var columnSize = o.columnSize.slice();
+ var minColumnSize = o.minColumnSize.slice();
+ var maxColumnSize = o.maxColumnSize.slice();
+ BI.removeAt(columnSize, data.deletedCols);
+ BI.removeAt(minColumnSize, data.deletedCols);
+ BI.removeAt(maxColumnSize, data.deletedCols);
return {
header: data.header,
items: data.items,
- columnSize: this._formatColumnSize(o.columnSize, deep),
- minColumnSize: this._formatColumns(o.minColumnSize, deep),
- maxColumnSize: this._formatColumns(o.maxColumnSize, deep),
+ columnSize: this._formatColumnSize(columnSize, deep),
+ minColumnSize: this._formatColumns(minColumnSize, deep),
+ maxColumnSize: this._formatColumns(maxColumnSize, deep),
freezeCols: this._formatFreezeCols()
}
},
diff --git a/docs/chart.js b/docs/chart.js
index 4130d7a7a..b095fe2bb 100644
--- a/docs/chart.js
+++ b/docs/chart.js
@@ -19,7 +19,9 @@ BI.Chart = BI.inherit(BI.Pane, {
this.vanCharts = VanCharts.init(self.element[0]);
this._resizer = BI.debounce(function () {
- self.vanCharts.resize();
+ if (self.element.width() > 0 && self.element.height() > 0) {
+ self.vanCharts.resize();
+ }
}, 30);
BI.ResizeDetector.addResizeListener(this, function (e) {
self._resizer();
diff --git a/docs/core.js b/docs/core.js
index 3c3a69807..39cd1299f 100644
--- a/docs/core.js
+++ b/docs/core.js
@@ -13305,6 +13305,29 @@ if (!window.BI) {
return true;
},
+ backFindKey: function (obj, predicate, context) {
+ predicate = BI.iteratee(predicate, context);
+ var keys = _.keys(obj), key;
+ for (var i = keys.length - 1; i >= 0; i--) {
+ key = keys[i];
+ if (predicate(obj[key], key, obj)) {
+ return key;
+ }
+ }
+ },
+
+ backFind: function (obj, predicate, context) {
+ var key;
+ if (BI.isArray(obj)) {
+ key = BI.findLastIndex(obj, predicate, context);
+ } else {
+ key = BI.backFindKey(obj, predicate, context);
+ }
+ if (key !== void 0 && key !== -1) {
+ return obj[key];
+ }
+ },
+
remove: function (obj, target, context) {
var isFunction = BI.isFunction(target);
target = isFunction || BI.isArray(target) ? target : [target];
@@ -23303,34 +23326,6 @@ $.extend(Array.prototype, {
contains: function (o) {
return this.indexOf(o) > -1;
},
- /**
- * 检查指定的值是否在数组中
- * @param {Object} o 要检查的值
- * @return {Number} o在数组中的索引(如果不在数组中则返回-1)
- */
- indexOf: function (o) {
- for (var i = 0, len = this.length; i < len; i++) {
- if (_.isEqual(o, this[i])) {
- return i;
- }
- }
- return -1;
- },
-
- /**
- * 检查指定的值是否在数组中
- * ie67不支持数组的这个方法
- * @param {Object} o 要检查的值
- * @return {Number} o在数组中的索引(如果不在数组中则返回-1)
- */
- lastIndexOf: function (o) {
- for (var len = this.length, i = len - 1; i >= 0; i--) {
- if (_.isEqual(o, this[i])) {
- return i;
- }
- }
- return -1;
- },
/**
* 从数组中移除指定的值,如果值不在数组中,则不产生任何效果
@@ -23339,265 +23334,29 @@ $.extend(Array.prototype, {
*/
remove: function (o) {
var index = this.indexOf(o);
- if (index != -1) {
+ if (index !== -1) {
this.splice(index, 1);
}
return this;
},
- /**
- * 移除数组中的所有元素
- */
- clear: function () {
- while (this.length > 0) {
- this.pop();
- }
- }
-});
-/**
- * Array原型拓展
- * Created by wang on 15/6/23.
- */
-!function () {
- Array.prototype.pushArray = function (array) {
+ pushArray: function (array) {
for (var i = 0; i < array.length; i++) {
this.push(array[i]);
}
- };
- Array.prototype.pushDistinct = function (obj) {
+ },
+ pushDistinct: function (obj) {
if (!this.contains(obj)) {
this.push(obj);
}
- };
- Array.prototype.pushDistinctArray = function (array) {
+ },
+ pushDistinctArray: function (array) {
for (var i = 0, len = array.length; i < len; i++) {
this.pushDistinct(array[i]);
}
- };
-}();
-
-/**
- * 规定bi的数组分为两种,其中,value和type值为key值
- * 1、[{"text":1,"value":2,"children":[]}]
- * 2、[{"name":1,"type":2,"children":[]}]
- * guy
- * 对数组的操作
- * @type {{}}
- */
-ArrayUtils = {};
-
-$.extend(ArrayUtils, {
- /**
- * 遍历方法
- * @param array
- * @param back
- */
- traversal: function (array, back) {
- if (BI.isNull(array)) {
- return;
- }
- var self = this;
- BI.each(array, function (i, item) {
- if (back(i, item) === BI.Status.END) {
- return false;
- }
- self.traversal(item.children, back);
- })
- },
-
- getAllChildNames: function (array) {
- var names = [];
- this.traversal(array, function (i, item) {
- if (BI.isNotEmptyArray(item.children)) {
- return BI.Status.RUNNING;
- }
- names.push(item.text || item.name);
- });
- return names;
- },
-
- /**
- * 获取第一个子节点
- * @param array
- */
- getFirstChild: function (array) {
- var first = {};
- this.traversal(array, function (i, item) {
- if (BI.isNotEmptyArray(item.children)) {
- return;
- }
- first = item;
- return BI.Status.END;
- })
- return first;
- },
-
- /**
- * 获取最后一个子节点
- * @param array
- */
- getLastChild: function (array) {
- var first = {};
- this.traversal(array, function (i, item) {
- if (item.children && item.children.length > 0) {
- return;
- }
- first = item;
- })
- return first;
- },
-
- getTextByValue: function (array, value) {
- if (!array) {
- return value;
- }
- var text = "";
- this.traversal(array, function (i, item) {
- if (BI.isEqual(item.value, value)) {
- text = item.text;
- return BI.Status.END;
- }
- });
- return text;
- },
-
- getNameByType: function (array, type) {
- if (!array) {
- return type;
- }
- var name = "";
- this.traversal(array, function (i, item) {
- if (BI.isEqual(item.type, type)) {
- name = item.name;
- return BI.Status.END;
- }
- });
- return name;
- },
-
- getItemByText: function (array, text) {
- var res = void 0;
- this.traversal(array, function (i, item) {
- if (BI.isCapitalEqual(item.text, text)) {
- res = item;
- return BI.Status.END;
- }
- });
- return res;
- },
-
- getIndexByText: function (array, text) {
- var res = -1;
- this.traversal(array, function (i, item) {
- if (BI.isCapitalEqual(item.text, text)) {
- res = i;
- return BI.Status.END;
- }
- });
- return res;
- },
-
- getItemByValue: function (array, value) {
- var res = void 0;
- this.traversal(array, function (i, item) {
- if (BI.isEqual(item.value, value)) {
- res = item;
- return BI.Status.END;
- }
- });
- return res;
- },
-
- getIndexByValue: function (array, value) {
- var res = -1;
- this.traversal(array, function (i, item) {
- if (BI.isEqual(item.value, value)) {
- res = i;
- return BI.Status.END;
- }
- });
- return res;
- },
-
- getItemByName: function (array, name) {
- var res = void 0;
- this.traversal(array, function (i, item) {
- if (BI.isCapitalEqual(item.name, name)) {
- res = item;
- return BI.Status.END;
- }
- });
- return res;
- },
-
- getIndexByName: function (array, name) {
- var res = -1;
- this.traversal(array, function (i, item) {
- if (BI.isCapitalEqual(item.name, name)) {
- res = i;
- return BI.Status.END;
- }
- });
- return res;
- },
-
- getItemByType: function (array, type) {
- var res = void 0;
- this.traversal(array, function (i, item) {
- if (BI.isEqual(item.type, type)) {
- res = item;
- return BI.Status.END;
- }
- });
- return res;
- },
-
- getIndexByType: function (array, type) {
- var res = -1;
- this.traversal(array, function (i, item) {
- if (BI.isEqual(item.type, type)) {
- res = i;
- return BI.Status.END;
- }
- });
- return res;
- },
-
- deleteItemByType: function (array, type) {
- var item = this.getItemByType(array, type);
- array.remove(item);
- },
-
- deleteItemByName: function (array, name) {
- var item = this.getItemByName(array, name);
- array.remove(item);
- },
-
- deleteItemByValue: function (array, value) {
- var item = this.getItemByValue(array, value);
- array.remove(item);
- }
-});/*
- * 前端缓存
- */
-window.localStorage || (window.localStorage = {
- items: {},
- setItem: function (k, v) {
- BI.Cache.addCookie(k, v);
- },
- getItem: function (k) {
- return BI.Cache.getCookie(k);
- },
- removeItem: function (k) {
- BI.Cache.deleteCookie(k);
- },
- key: function () {
-
- },
- clear: function () {
- this.items = {};
}
});
+
BI.Cache = {
_prefix: "bi",
setUsername: function (username) {
@@ -23732,7 +23491,6 @@ Date._QN = ["", BI.i18nText("BI-Quarter_1"),
BI.i18nText("BI-Quarter_4")];
-
/** Adds the number of days array to the Date object. */
Date._MD = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
@@ -23767,12 +23525,19 @@ Date.prototype.getDayOfYear = function () {
/** Returns the number of the week in year, as defined in ISO 8601. */
Date.prototype.getWeekNumber = function () {
var d = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0);
- var DoW = d.getDay();
- d.setDate(d.getDate() - (DoW + 6) % 7 + 3); // Nearest Thu
+ var week = d.getDay();
+ if (this.getMonth() === 0 && this.getDate() <= week) {
+ return 1;
+ }
+ d.setDate(this.getDate() - week);
var ms = d.valueOf(); // GMT
d.setMonth(0);
- d.setDate(4); // Thu in Week 1
- return Math.round((ms - d.valueOf()) / (7 * 864e5)) + 1;
+ d.setDate(1);
+ var offset = Math.floor((ms - d.valueOf()) / (7 * 864e5)) + 1;
+ if (d.getDay() > 0) {
+ offset++;
+ }
+ return offset;
};
//离当前时间多少天的时间
@@ -23864,7 +23629,7 @@ Date.prototype.getOffsetMonth = function (n) {
var dt = new Date(this.getTime());
var day = dt.getDate();
var monthDay = new Date(dt.getFullYear(), dt.getMonth() + parseInt(n), 1).getMonthDays();
- if(day > monthDay){
+ if (day > monthDay) {
day = monthDay;
}
dt.setDate(day);
@@ -24548,50 +24313,6 @@ function accDiv(arg1, arg2) {
Number.prototype.div = function (arg) {
return accDiv(this, arg);
};/**
- * 特殊情况
- * Created by wang on 15/6/23.
- */
-//解决console未定义问题 guy
-window.console = window.console || (function () {
- var c = {};
- c.log = c.warn = c.debug = c.info = c.error = c.time = c.dir = c.profile
- = c.clear = c.exception = c.trace = c.assert = function () {
- };
- return c;
- })();
-
-
-//修复ie9下sort方法的bug
-!function (window) {
- var ua = window.navigator.userAgent.toLowerCase(),
- reg = /msie|applewebkit.+safari/;
- if (reg.test(ua)) {
- var _sort = Array.prototype.sort;
- Array.prototype.sort = function (fn) {
- if (!!fn && typeof fn === 'function') {
- if (this.length < 2) {
- return this;
- }
- var i = 0, j = i + 1, l = this.length, tmp, r = false, t = 0;
- for (; i < l; i++) {
- for (j = i + 1; j < l; j++) {
- t = fn.call(this, this[i], this[j]);
- r = (typeof t === 'number' ? t :
- !!t ? 1 : 0) > 0;
- if (r === true) {
- tmp = this[i];
- this[i] = this[j];
- this[j] = tmp;
- }
- }
- }
- return this;
- } else {
- return _sort.call(this);
- }
- };
- }
-}(window);/**
* 对字符串对象的扩展
* @class String
*/
diff --git a/docs/index.html b/docs/index.html
index c9c8367f8..0db30acc5 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -15,6 +15,7 @@
+
diff --git a/server.js b/server.js
index 8bce8676a..dd4840982 100644
--- a/server.js
+++ b/server.js
@@ -9,5 +9,5 @@ const port = 3000;
app.use(express.static("./"));
app.listen(port, function() {
console.log("server start");
- open('http://localhost:' + port + '/demo.html');
+ open('http://localhost:' + port + '/docs/index.html');
});
diff --git a/src/addons/chart/chart.js b/src/addons/chart/chart.js
index 7cb475339..cadcca0bc 100644
--- a/src/addons/chart/chart.js
+++ b/src/addons/chart/chart.js
@@ -19,7 +19,9 @@ BI.Chart = BI.inherit(BI.Pane, {
this.vanCharts = VanCharts.init(self.element[0]);
this._resizer = BI.debounce(function () {
- self.vanCharts.resize();
+ if (self.element.width() > 0 && self.element.height() > 0) {
+ self.vanCharts.resize();
+ }
}, 30);
BI.ResizeDetector.addResizeListener(this, function (e) {
self._resizer();
diff --git a/src/base/collection/collection.js b/src/base/collection/collection.js
index 62481e0f0..f830cb050 100644
--- a/src/base/collection/collection.js
+++ b/src/base/collection/collection.js
@@ -27,10 +27,11 @@ BI.Collection = BI.inherit(BI.Widget, {
var self = this, o = this.options;
this.renderedCells = [];
this.renderedKeys = [];
+ this.renderRange = {};
this._scrollLock = false;
this._debounceRelease = BI.debounce(function () {
self._scrollLock = false;
- }, 150);
+ }, 1000 / 60);
this.container = BI.createWidget({
type: "bi.absolute"
});
@@ -76,12 +77,10 @@ BI.Collection = BI.inherit(BI.Widget, {
for (var index = 0, len = o.items.length; index < len; index++) {
var cellMetadatum = o.cellSizeAndPositionGetter(index);
- if (
- cellMetadatum.height == null || isNaN(cellMetadatum.height) ||
+ if (cellMetadatum.height == null || isNaN(cellMetadatum.height) ||
cellMetadatum.width == null || isNaN(cellMetadatum.width) ||
cellMetadatum.x == null || isNaN(cellMetadatum.x) ||
- cellMetadatum.y == null || isNaN(cellMetadatum.y)
- ) {
+ cellMetadatum.y == null || isNaN(cellMetadatum.y)) {
throw Error();
}
@@ -122,75 +121,134 @@ BI.Collection = BI.inherit(BI.Widget, {
var top = Math.max(0, scrollTop - o.verticalOverscanSize);
var right = Math.min(this._width, scrollLeft + o.width + o.horizontalOverscanSize);
var bottom = Math.min(this._height, scrollTop + o.height + o.verticalOverscanSize);
- var childrenToDisplay = this._cellRenderers(bottom - top, right - left, left, top);
- var renderedCells = [], renderedKeys = [];
- for (var i = 0, len = childrenToDisplay.length; i < len; i++) {
- var datum = childrenToDisplay[i];
- var index = BI.deepIndexOf(this.renderedKeys, datum.index);
- if (index > -1) {
- if (datum.width !== this.renderedCells[index]._width) {
- this.renderedCells[index]._width = datum.width;
- this.renderedCells[index].el.setWidth(datum.width);
+ if (right > 0 && bottom > 0) {
+ //如果滚动的区间并没有超出渲染的范围
+ if (top >= this.renderRange.minY && bottom <= this.renderRange.maxY && left >= this.renderRange.minX && right <= this.renderRange.maxX) {
+ return;
+ }
+ var childrenToDisplay = this._cellRenderers(bottom - top, right - left, left, top);
+ var renderedCells = [], renderedKeys = [];
+ //存储所有的left和top
+ var lefts = {}, tops = {};
+ for (var i = 0, len = childrenToDisplay.length; i < len; i++) {
+ var datum = childrenToDisplay[i];
+ lefts[datum.x] = datum.x;
+ lefts[datum.x + datum.width] = datum.x + datum.width;
+ tops[datum.y] = datum.y;
+ tops[datum.y + datum.height] = datum.y + datum.height;
+ }
+ lefts = BI.toArray(lefts);
+ tops = BI.toArray(tops);
+ var leftMap = BI.invert(lefts);
+ var topMap = BI.invert(tops);
+ //存储上下左右四个边界
+ var leftBorder = {}, rightBorder = {}, topBorder = {}, bottomBorder = {};
+ var assertMinBorder = function (border, offset) {
+ if (border[offset] == null) {
+ border[offset] = Number.MAX_VALUE;
}
- if (datum.height !== this.renderedCells[index]._height) {
- this.renderedCells[index]._height = datum.height;
- this.renderedCells[index].el.setHeight(datum.height);
+ };
+ var assertMaxBorder = function (border, offset) {
+ if (border[offset] == null) {
+ border[offset] = 0;
}
- if (this.renderedCells[index].left !== datum.x) {
- this.renderedCells[index].el.element.css("left", datum.x + "px");
+ };
+ for (var i = 0, len = childrenToDisplay.length; i < len; i++) {
+ var datum = childrenToDisplay[i];
+ var index = BI.deepIndexOf(this.renderedKeys, datum.index);
+ if (index > -1) {
+ if (datum.width !== this.renderedCells[index]._width) {
+ this.renderedCells[index]._width = datum.width;
+ this.renderedCells[index].el.setWidth(datum.width);
+ }
+ if (datum.height !== this.renderedCells[index]._height) {
+ this.renderedCells[index]._height = datum.height;
+ this.renderedCells[index].el.setHeight(datum.height);
+ }
+ if (this.renderedCells[index].left !== datum.x) {
+ this.renderedCells[index].el.element.css("left", datum.x + "px");
+ }
+ if (this.renderedCells[index].top !== datum.y) {
+ this.renderedCells[index].el.element.css("top", datum.y + "px");
+ }
+ renderedCells.push(this.renderedCells[index]);
+ } else {
+ var child = BI.createWidget(BI.extend({
+ type: "bi.label",
+ width: datum.width,
+ height: datum.height
+ }, o.items[datum.index], {
+ cls: (o.items[datum.index].cls || "") + " container-cell" + (datum.y === 0 ? " first-row" : "") + (datum.x === 0 ? " first-col" : ""),
+ _left: datum.x,
+ _top: datum.y
+ }));
+ renderedCells.push({
+ el: child,
+ left: datum.x,
+ top: datum.y,
+ _width: datum.width,
+ _height: datum.height
+ });
}
- if (this.renderedCells[index].top !== datum.y) {
- this.renderedCells[index].el.element.css("top", datum.y + "px");
+ var startTopIndex = topMap[datum.y] | 0;
+ var endTopIndex = topMap[datum.y + datum.height] | 0;
+ for (var k = startTopIndex; k <= endTopIndex; k++) {
+ var t = tops[k];
+ assertMinBorder(leftBorder, t);
+ assertMaxBorder(rightBorder, t);
+ leftBorder[t] = Math.min(leftBorder[t], datum.x);
+ rightBorder[t] = Math.max(rightBorder[t], datum.x + datum.width);
}
- renderedCells.push(this.renderedCells[index]);
- } else {
- var child = BI.createWidget(BI.extend({
- type: "bi.label",
- width: datum.width,
- height: datum.height
- }, o.items[datum.index], {
- cls: (o.items[datum.index].cls || "") + " container-cell" + (datum.y === 0 ? " first-row" : "") + (datum.x === 0 ? " first-col" : ""),
- _left: datum.x,
- _top: datum.y
- }));
- renderedCells.push({
- el: child,
- left: datum.x,
- top: datum.y,
- _width: datum.width,
- _height: datum.height
- });
+ var startLeftIndex = leftMap[datum.x] | 0;
+ var endLeftIndex = leftMap[datum.x + datum.width] | 0;
+ for (var k = startLeftIndex; k <= endLeftIndex; k++) {
+ var l = lefts[k];
+ assertMinBorder(topBorder, l);
+ assertMaxBorder(bottomBorder, l);
+ topBorder[l] = Math.min(topBorder[l], datum.y);
+ bottomBorder[l] = Math.max(bottomBorder[l], datum.y + datum.height);
+ }
+
+ renderedKeys.push(datum.index);
}
- renderedKeys.push(datum.index);
+ //已存在的, 需要添加的和需要删除的
+ var existSet = {}, addSet = {}, deleteArray = [];
+ BI.each(renderedKeys, function (i, key) {
+ if (BI.deepContains(self.renderedKeys, key)) {
+ existSet[i] = key;
+ } else {
+ addSet[i] = key;
+ }
+ });
+ BI.each(this.renderedKeys, function (i, key) {
+ if (BI.deepContains(existSet, key)) {
+ return;
+ }
+ if (BI.deepContains(addSet, key)) {
+ return;
+ }
+ deleteArray.push(i);
+ });
+ BI.each(deleteArray, function (i, index) {
+ self.renderedCells[index].el.destroy();
+ });
+ var addedItems = [];
+ BI.each(addSet, function (index) {
+ addedItems.push(renderedCells[index])
+ });
+ this.container.addItems(addedItems);
+ this.renderedCells = renderedCells;
+ this.renderedKeys = renderedKeys;
+
+ //Todo 左右比较特殊
+ var minX = BI.min(leftBorder);
+ var maxX = BI.max(rightBorder);
+
+ var minY = BI.max(topBorder);
+ var maxY = BI.min(bottomBorder);
+
+ this.renderRange = {minX: minX, minY: minY, maxX: maxX, maxY: maxY};
}
- //已存在的, 需要添加的和需要删除的
- var existSet = {}, addSet = {}, deleteArray = [];
- BI.each(renderedKeys, function (i, key) {
- if (BI.deepContains(self.renderedKeys, key)) {
- existSet[i] = key;
- } else {
- addSet[i] = key;
- }
- });
- BI.each(this.renderedKeys, function (i, key) {
- if (BI.deepContains(existSet, key)) {
- return;
- }
- if (BI.deepContains(addSet, key)) {
- return;
- }
- deleteArray.push(i);
- });
- BI.each(deleteArray, function (i, index) {
- self.renderedCells[index].el.destroy();
- });
- var addedItems = [];
- BI.each(addSet, function (index) {
- addedItems.push(renderedCells[index])
- });
- this.container.addItems(addedItems);
- this.renderedCells = renderedCells;
- this.renderedKeys = renderedKeys;
},
_getMaxScrollLeft: function () {
@@ -277,6 +335,7 @@ BI.Collection = BI.inherit(BI.Widget, {
});
this.renderedCells = [];
this.renderedKeys = [];
+ this.renderRange = {};
this._scrollLock = false;
},
diff --git a/src/base/grid/grid.js b/src/base/grid/grid.js
index fdce627c3..43fa51746 100644
--- a/src/base/grid/grid.js
+++ b/src/base/grid/grid.js
@@ -30,10 +30,11 @@ BI.Grid = BI.inherit(BI.Widget, {
var self = this, o = this.options;
this.renderedCells = [];
this.renderedKeys = [];
+ this.renderRange = {};
this._scrollLock = false;
this._debounceRelease = BI.debounce(function () {
self._scrollLock = false;
- }, 150);
+ }, 1000 / 60);
this.container = BI.createWidget({
type: "bi.absolute"
});
@@ -78,13 +79,17 @@ BI.Grid = BI.inherit(BI.Widget, {
_calculateChildrenToRender: function () {
var self = this, o = this.options;
- var width = o.width, height = o.height, scrollLeft = BI.clamp(o.scrollLeft, 0, this._getMaxScrollLeft()), scrollTop = BI.clamp(o.scrollTop, 0, this._getMaxScrollTop()),
+ var width = o.width, height = o.height, scrollLeft = BI.clamp(o.scrollLeft, 0, this._getMaxScrollLeft()),
+ scrollTop = BI.clamp(o.scrollTop, 0, this._getMaxScrollTop()),
overscanColumnCount = o.overscanColumnCount, overscanRowCount = o.overscanRowCount;
if (height > 0 && width > 0) {
var visibleColumnIndices = this._columnSizeAndPositionManager.getVisibleCellRange(width, scrollLeft);
var visibleRowIndices = this._rowSizeAndPositionManager.getVisibleCellRange(height, scrollTop);
+ if (BI.isEmpty(visibleColumnIndices) || BI.isEmpty(visibleRowIndices)) {
+ return;
+ }
var horizontalOffsetAdjustment = this._columnSizeAndPositionManager.getOffsetAdjustment(width, scrollLeft);
var verticalOffsetAdjustment = this._rowSizeAndPositionManager.getOffsetAdjustment(height, scrollTop);
@@ -102,8 +107,22 @@ BI.Grid = BI.inherit(BI.Widget, {
var rowStartIndex = overscanRowIndices.overscanStartIndex;
var rowStopIndex = overscanRowIndices.overscanStopIndex;
- var renderedCells = [], renderedKeys = [];
+ //算区间size
+ var minRowDatum = this._rowSizeAndPositionManager.getSizeAndPositionOfCell(rowStartIndex);
+ var minColumnDatum = this._columnSizeAndPositionManager.getSizeAndPositionOfCell(columnStartIndex);
+ var maxRowDatum = this._rowSizeAndPositionManager.getSizeAndPositionOfCell(rowStopIndex);
+ var maxColumnDatum = this._columnSizeAndPositionManager.getSizeAndPositionOfCell(columnStopIndex);
+ var top = minRowDatum.offset + verticalOffsetAdjustment;
+ var left = minColumnDatum.offset + horizontalOffsetAdjustment;
+ var bottom = maxRowDatum.offset + verticalOffsetAdjustment + maxRowDatum.size;
+ var right = maxColumnDatum.offset + horizontalOffsetAdjustment + maxColumnDatum.size;
+ //如果滚动的区间并没有超出渲染的范围
+ if (top >= this.renderRange.minY && bottom <= this.renderRange.maxY && left >= this.renderRange.minX && right <= this.renderRange.maxX) {
+ return;
+ }
+ var renderedCells = [], renderedKeys = [];
+ var minX = this._getMaxScrollLeft(), minY = this._getMaxScrollTop(), maxX = 0, maxY = 0;
for (var rowIndex = rowStartIndex; rowIndex <= rowStopIndex; rowIndex++) {
var rowDatum = this._rowSizeAndPositionManager.getSizeAndPositionOfCell(rowIndex);
@@ -148,6 +167,10 @@ BI.Grid = BI.inherit(BI.Widget, {
_height: rowDatum.size
});
}
+ minX = Math.min(minX, columnDatum.offset + horizontalOffsetAdjustment);
+ maxX = Math.max(maxX, columnDatum.offset + horizontalOffsetAdjustment + columnDatum.size);
+ minY = Math.min(minY, rowDatum.offset + verticalOffsetAdjustment);
+ maxY = Math.max(maxY, rowDatum.offset + verticalOffsetAdjustment + rowDatum.size);
renderedKeys.push(key);
}
}
@@ -179,6 +202,7 @@ BI.Grid = BI.inherit(BI.Widget, {
this.container.addItems(addedItems);
this.renderedCells = renderedCells;
this.renderedKeys = renderedKeys;
+ this.renderRange = {minX: minX, minY: minY, maxX: maxX, maxY: maxY};
}
},
@@ -282,6 +306,7 @@ BI.Grid = BI.inherit(BI.Widget, {
});
this.renderedCells = [];
this.renderedKeys = [];
+ this.renderRange = {};
this._scrollLock = false;
},
diff --git a/src/base/table/table.collection.quick.js b/src/base/table/table.collection.quick.js
index ab1cd926f..1e9565860 100644
--- a/src/base/table/table.collection.quick.js
+++ b/src/base/table/table.collection.quick.js
@@ -28,26 +28,54 @@ BI.QuickCollectionTable = BI.inherit(BI.CollectionTable, {
mounted: function () {
BI.QuickCollectionTable.superclass.mounted.apply(this, arguments);
var self = this;
- this._leftWheelHandler = new BI.WheelHandler(
- BI.bind(this._onWheelY, this),
- BI.bind(this._shouldHandleX, this),
+ this._topLeftWheelHandler = new BI.WheelHandler(
+ BI.bind(this._onWheelLeft, this),
+ BI.bind(this._shouldHandleLeftX, this),
BI.bind(this._shouldHandleY, this)
);
- this._rightWheelHandler = new BI.WheelHandler(
- BI.bind(this._onWheelY, this),
- BI.bind(this._shouldHandleX, this),
+ this._topRightWheelHandler = new BI.WheelHandler(
+ BI.bind(this._onWheelRight, this),
+ BI.bind(this._shouldHandleRightX, this),
BI.bind(this._shouldHandleY, this)
);
+ this._bottomLeftWheelHandler = new BI.WheelHandler(
+ BI.bind(this._onWheelLeft, this),
+ BI.bind(this._shouldHandleLeftX, this),
+ BI.bind(this._shouldHandleY, this)
+ );
+ this._bottomRightWheelHandler = new BI.WheelHandler(
+ BI.bind(this._onWheelRight, this),
+ BI.bind(this._shouldHandleRightX, this),
+ BI.bind(this._shouldHandleY, this)
+ );
+ this.topLeftCollection.element.mousewheel(function (e) {
+ self._topLeftWheelHandler.onWheel(e.originalEvent);
+ });
+ this.topRightCollection.element.mousewheel(function (e) {
+ self._topRightWheelHandler.onWheel(e.originalEvent);
+ });
this.bottomLeftCollection.element.mousewheel(function (e) {
- self._leftWheelHandler.onWheel(e.originalEvent);
+ self._bottomLeftWheelHandler.onWheel(e.originalEvent);
});
this.bottomRightCollection.element.mousewheel(function (e) {
- self._rightWheelHandler.onWheel(e.originalEvent);
+ self._bottomRightWheelHandler.onWheel(e.originalEvent);
});
},
- _shouldHandleX: function (delta) {
- return false;
+ _shouldHandleLeftX: function (delta) {
+ if (delta > 0) {
+ return this.bottomLeftCollection.getScrollLeft() < this.bottomLeftCollection.getMaxScrollLeft();
+ } else {
+ return this.bottomLeftCollection.getScrollLeft() > 0;
+ }
+ },
+
+ _shouldHandleRightX: function (delta) {
+ if (delta > 0) {
+ return this.bottomRightCollection.getScrollLeft() < this.bottomRightCollection.getMaxScrollLeft();
+ } else {
+ return this.bottomRightCollection.getScrollLeft() > 0;
+ }
},
_shouldHandleY: function (delta) {
@@ -58,19 +86,38 @@ BI.QuickCollectionTable = BI.inherit(BI.CollectionTable, {
}
},
- _onWheelY: function (deltaX, deltaY) {
+ _onWheelLeft: function (deltaX, deltaY) {
+ var self = this;
+ var scrollTop = this.bottomLeftCollection.getScrollTop();
+ var scrollLeft = this.bottomLeftCollection.getScrollLeft();
+ scrollTop += deltaY;
+ scrollLeft += deltaX;
+ this.bottomLeftCollection.setScrollTop(scrollTop);
+ this.bottomRightCollection.setScrollTop(scrollTop);
+ this.topLeftCollection.setScrollLeft(scrollLeft);
+ this.bottomLeftCollection.setScrollLeft(scrollLeft);
+ self._populateScrollbar();
+ this.fireEvent(BI.Table.EVENT_TABLE_SCROLL, arguments);
+ },
+
+ _onWheelRight: function (deltaX, deltaY) {
var self = this;
var scrollTop = this.bottomRightCollection.getScrollTop();
+ var scrollLeft = this.bottomRightCollection.getScrollLeft();
scrollTop += deltaY;
+ scrollLeft += deltaX;
this.bottomLeftCollection.setScrollTop(scrollTop);
this.bottomRightCollection.setScrollTop(scrollTop);
+ this.topRightCollection.setScrollLeft(scrollLeft);
+ this.bottomRightCollection.setScrollLeft(scrollLeft);
self._populateScrollbar();
this.fireEvent(BI.Table.EVENT_TABLE_SCROLL, arguments);
},
_populateTable: function () {
var self = this, o = this.options;
- var regionSize = this.getRegionSize(), totalLeftColumnSize = 0, totalRightColumnSize = 0, totalColumnSize = 0, summaryColumnSizeArray = [], totalRowSize = o.items.length * o.rowSize;
+ var regionSize = this.getRegionSize(), totalLeftColumnSize = 0, totalRightColumnSize = 0, totalColumnSize = 0,
+ summaryColumnSizeArray = [], totalRowSize = o.items.length * o.rowSize;
var freezeColLength = this._getFreezeColLength();
BI.each(o.columnSize, function (i, size) {
if (o.isNeedFreeze === true && o.freezeCols.contains(i)) {
diff --git a/src/base/table/table.grid.quick.js b/src/base/table/table.grid.quick.js
index 62e4a4a7e..8bd73149d 100644
--- a/src/base/table/table.grid.quick.js
+++ b/src/base/table/table.grid.quick.js
@@ -28,26 +28,54 @@ BI.QuickGridTable = BI.inherit(BI.GridTable, {
mounted: function () {
BI.QuickGridTable.superclass.mounted.apply(this, arguments);
var self = this;
- this._leftWheelHandler = new BI.WheelHandler(
- BI.bind(this._onWheelY, this),
- BI.bind(this._shouldHandleX, this),
+ this._topLeftWheelHandler = new BI.WheelHandler(
+ BI.bind(this._onWheelLeft, this),
+ BI.bind(this._shouldHandleLeftX, this),
BI.bind(this._shouldHandleY, this)
);
- this._rightWheelHandler = new BI.WheelHandler(
- BI.bind(this._onWheelY, this),
- BI.bind(this._shouldHandleX, this),
+ this._topRightWheelHandler = new BI.WheelHandler(
+ BI.bind(this._onWheelRight, this),
+ BI.bind(this._shouldHandleRightX, this),
BI.bind(this._shouldHandleY, this)
);
+ this._bottomLeftWheelHandler = new BI.WheelHandler(
+ BI.bind(this._onWheelLeft, this),
+ BI.bind(this._shouldHandleLeftX, this),
+ BI.bind(this._shouldHandleY, this)
+ );
+ this._bottomRightWheelHandler = new BI.WheelHandler(
+ BI.bind(this._onWheelRight, this),
+ BI.bind(this._shouldHandleRightX, this),
+ BI.bind(this._shouldHandleY, this)
+ );
+ this.topLeftGrid.element.mousewheel(function (e) {
+ self._topLeftWheelHandler.onWheel(e.originalEvent);
+ });
+ this.topRightGrid.element.mousewheel(function (e) {
+ self._topRightWheelHandler.onWheel(e.originalEvent);
+ });
this.bottomLeftGrid.element.mousewheel(function (e) {
- self._leftWheelHandler.onWheel(e.originalEvent);
+ self._bottomLeftWheelHandler.onWheel(e.originalEvent);
});
this.bottomRightGrid.element.mousewheel(function (e) {
- self._rightWheelHandler.onWheel(e.originalEvent);
+ self._bottomRightWheelHandler.onWheel(e.originalEvent);
});
},
- _shouldHandleX: function (delta) {
- return false;
+ _shouldHandleLeftX: function (delta) {
+ if (delta > 0) {
+ return this.bottomLeftGrid.getScrollLeft() < this.bottomLeftGrid.getMaxScrollLeft();
+ } else {
+ return this.bottomLeftGrid.getScrollLeft() > 0;
+ }
+ },
+
+ _shouldHandleRightX: function (delta) {
+ if (delta > 0) {
+ return this.bottomRightGrid.getScrollLeft() < this.bottomRightGrid.getMaxScrollLeft();
+ } else {
+ return this.bottomRightGrid.getScrollLeft() > 0;
+ }
},
_shouldHandleY: function (delta) {
@@ -58,12 +86,30 @@ BI.QuickGridTable = BI.inherit(BI.GridTable, {
}
},
- _onWheelY: function (deltaX, deltaY) {
+ _onWheelLeft: function (deltaX, deltaY) {
+ var self = this;
+ var scrollTop = this.bottomLeftGrid.getScrollTop();
+ var scrollLeft = this.bottomLeftGrid.getScrollLeft();
+ scrollTop += deltaY;
+ scrollLeft += deltaX;
+ this.bottomLeftGrid.setScrollTop(scrollTop);
+ this.bottomRightGrid.setScrollTop(scrollTop);
+ this.topLeftGrid.setScrollLeft(scrollLeft);
+ this.bottomLeftGrid.setScrollLeft(scrollLeft);
+ self._populateScrollbar();
+ this.fireEvent(BI.Table.EVENT_TABLE_SCROLL, arguments);
+ },
+
+ _onWheelRight: function (deltaX, deltaY) {
var self = this;
var scrollTop = this.bottomRightGrid.getScrollTop();
+ var scrollLeft = this.bottomRightGrid.getScrollLeft();
scrollTop += deltaY;
+ scrollLeft += deltaX;
this.bottomLeftGrid.setScrollTop(scrollTop);
this.bottomRightGrid.setScrollTop(scrollTop);
+ this.topRightGrid.setScrollLeft(scrollLeft);
+ this.bottomRightGrid.setScrollLeft(scrollLeft);
self._populateScrollbar();
this.fireEvent(BI.Table.EVENT_TABLE_SCROLL, arguments);
},
diff --git a/src/core/base.js b/src/core/base.js
index d291ca5c7..96438a27e 100644
--- a/src/core/base.js
+++ b/src/core/base.js
@@ -268,6 +268,29 @@ if (!window.BI) {
return true;
},
+ backFindKey: function (obj, predicate, context) {
+ predicate = BI.iteratee(predicate, context);
+ var keys = _.keys(obj), key;
+ for (var i = keys.length - 1; i >= 0; i--) {
+ key = keys[i];
+ if (predicate(obj[key], key, obj)) {
+ return key;
+ }
+ }
+ },
+
+ backFind: function (obj, predicate, context) {
+ var key;
+ if (BI.isArray(obj)) {
+ key = BI.findLastIndex(obj, predicate, context);
+ } else {
+ key = BI.backFindKey(obj, predicate, context);
+ }
+ if (key !== void 0 && key !== -1) {
+ return obj[key];
+ }
+ },
+
remove: function (obj, target, context) {
var isFunction = BI.isFunction(target);
target = isFunction || BI.isArray(target) ? target : [target];
diff --git a/src/core/proto/array.js b/src/core/proto/array.js
index fc1c3b977..5bf8cc3c3 100644
--- a/src/core/proto/array.js
+++ b/src/core/proto/array.js
@@ -6,34 +6,6 @@ $.extend(Array.prototype, {
contains: function (o) {
return this.indexOf(o) > -1;
},
- /**
- * 检查指定的值是否在数组中
- * @param {Object} o 要检查的值
- * @return {Number} o在数组中的索引(如果不在数组中则返回-1)
- */
- indexOf: function (o) {
- for (var i = 0, len = this.length; i < len; i++) {
- if (_.isEqual(o, this[i])) {
- return i;
- }
- }
- return -1;
- },
-
- /**
- * 检查指定的值是否在数组中
- * ie67不支持数组的这个方法
- * @param {Object} o 要检查的值
- * @return {Number} o在数组中的索引(如果不在数组中则返回-1)
- */
- lastIndexOf: function (o) {
- for (var len = this.length, i = len - 1; i >= 0; i--) {
- if (_.isEqual(o, this[i])) {
- return i;
- }
- }
- return -1;
- },
/**
* 从数组中移除指定的值,如果值不在数组中,则不产生任何效果
@@ -42,242 +14,25 @@ $.extend(Array.prototype, {
*/
remove: function (o) {
var index = this.indexOf(o);
- if (index != -1) {
+ if (index !== -1) {
this.splice(index, 1);
}
return this;
},
- /**
- * 移除数组中的所有元素
- */
- clear: function () {
- while (this.length > 0) {
- this.pop();
- }
- }
-});
-/**
- * Array原型拓展
- * Created by wang on 15/6/23.
- */
-!function () {
- Array.prototype.pushArray = function (array) {
+ pushArray: function (array) {
for (var i = 0; i < array.length; i++) {
this.push(array[i]);
}
- };
- Array.prototype.pushDistinct = function (obj) {
+ },
+ pushDistinct: function (obj) {
if (!this.contains(obj)) {
this.push(obj);
}
- };
- Array.prototype.pushDistinctArray = function (array) {
+ },
+ pushDistinctArray: function (array) {
for (var i = 0, len = array.length; i < len; i++) {
this.pushDistinct(array[i]);
}
- };
-}();
-
-/**
- * 规定bi的数组分为两种,其中,value和type值为key值
- * 1、[{"text":1,"value":2,"children":[]}]
- * 2、[{"name":1,"type":2,"children":[]}]
- * guy
- * 对数组的操作
- * @type {{}}
- */
-ArrayUtils = {};
-
-$.extend(ArrayUtils, {
- /**
- * 遍历方法
- * @param array
- * @param back
- */
- traversal: function (array, back) {
- if (BI.isNull(array)) {
- return;
- }
- var self = this;
- BI.each(array, function (i, item) {
- if (back(i, item) === BI.Status.END) {
- return false;
- }
- self.traversal(item.children, back);
- })
- },
-
- getAllChildNames: function (array) {
- var names = [];
- this.traversal(array, function (i, item) {
- if (BI.isNotEmptyArray(item.children)) {
- return BI.Status.RUNNING;
- }
- names.push(item.text || item.name);
- });
- return names;
- },
-
- /**
- * 获取第一个子节点
- * @param array
- */
- getFirstChild: function (array) {
- var first = {};
- this.traversal(array, function (i, item) {
- if (BI.isNotEmptyArray(item.children)) {
- return;
- }
- first = item;
- return BI.Status.END;
- })
- return first;
- },
-
- /**
- * 获取最后一个子节点
- * @param array
- */
- getLastChild: function (array) {
- var first = {};
- this.traversal(array, function (i, item) {
- if (item.children && item.children.length > 0) {
- return;
- }
- first = item;
- })
- return first;
- },
-
- getTextByValue: function (array, value) {
- if (!array) {
- return value;
- }
- var text = "";
- this.traversal(array, function (i, item) {
- if (BI.isEqual(item.value, value)) {
- text = item.text;
- return BI.Status.END;
- }
- });
- return text;
- },
-
- getNameByType: function (array, type) {
- if (!array) {
- return type;
- }
- var name = "";
- this.traversal(array, function (i, item) {
- if (BI.isEqual(item.type, type)) {
- name = item.name;
- return BI.Status.END;
- }
- });
- return name;
- },
-
- getItemByText: function (array, text) {
- var res = void 0;
- this.traversal(array, function (i, item) {
- if (BI.isCapitalEqual(item.text, text)) {
- res = item;
- return BI.Status.END;
- }
- });
- return res;
- },
-
- getIndexByText: function (array, text) {
- var res = -1;
- this.traversal(array, function (i, item) {
- if (BI.isCapitalEqual(item.text, text)) {
- res = i;
- return BI.Status.END;
- }
- });
- return res;
- },
-
- getItemByValue: function (array, value) {
- var res = void 0;
- this.traversal(array, function (i, item) {
- if (BI.isEqual(item.value, value)) {
- res = item;
- return BI.Status.END;
- }
- });
- return res;
- },
-
- getIndexByValue: function (array, value) {
- var res = -1;
- this.traversal(array, function (i, item) {
- if (BI.isEqual(item.value, value)) {
- res = i;
- return BI.Status.END;
- }
- });
- return res;
- },
-
- getItemByName: function (array, name) {
- var res = void 0;
- this.traversal(array, function (i, item) {
- if (BI.isCapitalEqual(item.name, name)) {
- res = item;
- return BI.Status.END;
- }
- });
- return res;
- },
-
- getIndexByName: function (array, name) {
- var res = -1;
- this.traversal(array, function (i, item) {
- if (BI.isCapitalEqual(item.name, name)) {
- res = i;
- return BI.Status.END;
- }
- });
- return res;
- },
-
- getItemByType: function (array, type) {
- var res = void 0;
- this.traversal(array, function (i, item) {
- if (BI.isEqual(item.type, type)) {
- res = item;
- return BI.Status.END;
- }
- });
- return res;
- },
-
- getIndexByType: function (array, type) {
- var res = -1;
- this.traversal(array, function (i, item) {
- if (BI.isEqual(item.type, type)) {
- res = i;
- return BI.Status.END;
- }
- });
- return res;
- },
-
- deleteItemByType: function (array, type) {
- var item = this.getItemByType(array, type);
- array.remove(item);
- },
-
- deleteItemByName: function (array, name) {
- var item = this.getItemByName(array, name);
- array.remove(item);
- },
-
- deleteItemByValue: function (array, value) {
- var item = this.getItemByValue(array, value);
- array.remove(item);
}
-});
\ No newline at end of file
+});
diff --git a/src/core/proto/cache.js b/src/core/proto/cache.js
index b529bfeee..5e0668138 100644
--- a/src/core/proto/cache.js
+++ b/src/core/proto/cache.js
@@ -1,24 +1,4 @@
-/*
- * 前端缓存
- */
-window.localStorage || (window.localStorage = {
- items: {},
- setItem: function (k, v) {
- BI.Cache.addCookie(k, v);
- },
- getItem: function (k) {
- return BI.Cache.getCookie(k);
- },
- removeItem: function (k) {
- BI.Cache.deleteCookie(k);
- },
- key: function () {
- },
- clear: function () {
- this.items = {};
- }
-});
BI.Cache = {
_prefix: "bi",
setUsername: function (username) {
diff --git a/src/core/proto/date.js b/src/core/proto/date.js
index b25c92d15..36197df93 100644
--- a/src/core/proto/date.js
+++ b/src/core/proto/date.js
@@ -56,7 +56,6 @@ Date._QN = ["", BI.i18nText("BI-Quarter_1"),
BI.i18nText("BI-Quarter_4")];
-
/** Adds the number of days array to the Date object. */
Date._MD = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
@@ -91,12 +90,19 @@ Date.prototype.getDayOfYear = function () {
/** Returns the number of the week in year, as defined in ISO 8601. */
Date.prototype.getWeekNumber = function () {
var d = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0);
- var DoW = d.getDay();
- d.setDate(d.getDate() - (DoW + 6) % 7 + 3); // Nearest Thu
+ var week = d.getDay();
+ if (this.getMonth() === 0 && this.getDate() <= week) {
+ return 1;
+ }
+ d.setDate(this.getDate() - week);
var ms = d.valueOf(); // GMT
d.setMonth(0);
- d.setDate(4); // Thu in Week 1
- return Math.round((ms - d.valueOf()) / (7 * 864e5)) + 1;
+ d.setDate(1);
+ var offset = Math.floor((ms - d.valueOf()) / (7 * 864e5)) + 1;
+ if (d.getDay() > 0) {
+ offset++;
+ }
+ return offset;
};
//离当前时间多少天的时间
@@ -188,7 +194,7 @@ Date.prototype.getOffsetMonth = function (n) {
var dt = new Date(this.getTime());
var day = dt.getDate();
var monthDay = new Date(dt.getFullYear(), dt.getMonth() + parseInt(n), 1).getMonthDays();
- if(day > monthDay){
+ if (day > monthDay) {
day = monthDay;
}
dt.setDate(day);
diff --git a/src/polyfill/array.js b/src/polyfill/array.js
new file mode 100644
index 000000000..65f018588
--- /dev/null
+++ b/src/polyfill/array.js
@@ -0,0 +1,31 @@
+if(![].indexOf){
+ /**
+ * 检查指定的值是否在数组中
+ * @param {Object} o 要检查的值
+ * @return {Number} o在数组中的索引(如果不在数组中则返回-1)
+ */
+ [].indexOf = function (o) {
+ for (var i = 0, len = this.length; i < len; i++) {
+ if (_.isEqual(o, this[i])) {
+ return i;
+ }
+ }
+ return -1;
+ }
+}
+if(![].lastIndexOf){
+ /**
+ * 检查指定的值是否在数组中
+ * ie67不支持数组的这个方法
+ * @param {Object} o 要检查的值
+ * @return {Number} o在数组中的索引(如果不在数组中则返回-1)
+ */
+ [].lastIndexOf = function (o) {
+ for (var len = this.length, i = len - 1; i >= 0; i--) {
+ if (_.isEqual(o, this[i])) {
+ return i;
+ }
+ }
+ return -1;
+ }
+}
\ No newline at end of file
diff --git a/src/polyfill/console.js b/src/polyfill/console.js
new file mode 100644
index 000000000..a1c017c06
--- /dev/null
+++ b/src/polyfill/console.js
@@ -0,0 +1,12 @@
+/**
+ * 特殊情况
+ * Created by wang on 15/6/23.
+ */
+//解决console未定义问题 guy
+window.console = window.console || (function () {
+ var c = {};
+ c.log = c.warn = c.debug = c.info = c.error = c.time = c.dir = c.profile
+ = c.clear = c.exception = c.trace = c.assert = function () {
+ };
+ return c;
+ })();
diff --git a/src/polyfill/localStorage.js b/src/polyfill/localStorage.js
new file mode 100644
index 000000000..12036d743
--- /dev/null
+++ b/src/polyfill/localStorage.js
@@ -0,0 +1,21 @@
+/*
+ * 前端缓存
+ */
+window.localStorage || (window.localStorage = {
+ items: {},
+ setItem: function (k, v) {
+ BI.Cache.addCookie(k, v);
+ },
+ getItem: function (k) {
+ return BI.Cache.getCookie(k);
+ },
+ removeItem: function (k) {
+ BI.Cache.deleteCookie(k);
+ },
+ key: function () {
+
+ },
+ clear: function () {
+ this.items = {};
+ }
+});
\ No newline at end of file
diff --git a/src/core/proto/special.js b/src/polyfill/sort.js
similarity index 75%
rename from src/core/proto/special.js
rename to src/polyfill/sort.js
index 2ea79ffb8..6ad73ba9c 100644
--- a/src/core/proto/special.js
+++ b/src/polyfill/sort.js
@@ -1,17 +1,3 @@
-/**
- * 特殊情况
- * Created by wang on 15/6/23.
- */
-//解决console未定义问题 guy
-window.console = window.console || (function () {
- var c = {};
- c.log = c.warn = c.debug = c.info = c.error = c.time = c.dir = c.profile
- = c.clear = c.exception = c.trace = c.assert = function () {
- };
- return c;
- })();
-
-
//修复ie9下sort方法的bug
!function (window) {
var ua = window.navigator.userAgent.toLowerCase(),