fineui是帆软报表和BI产品线所使用的前端框架。
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

234 lines
7.3 KiB

/**
* 自适应宽度的表格
*
* Created by GUY on 2016/2/3.
* @class BI.AdaptiveTable
* @extends BI.Widget
*/
BI.AdaptiveTable = BI.inherit(BI.Widget, {
_const: {
perColumnSize: 100
},
_defaultConfig: function () {
return BI.extend(BI.AdaptiveTable.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-adaptive-table",
el: {
type: "bi.resizable_table"
},
isNeedResize: true,
isNeedFreeze: false, // 是否需要冻结单元格
freezeCols: [], // 冻结的列号,从0开始,isNeedFreeze为true时生效
isNeedMerge: false, // 是否需要合并单元格
mergeCols: [], // 合并的单元格列号
mergeRule: BI.emptyFn,
columnSize: [],
minColumnSize: [],
maxColumnSize: [],
headerRowSize: 25,
rowSize: 25,
regionColumnSize: [],
header: [],
items: [], // 二维数组
// 交叉表头
crossHeader: [],
crossItems: []
});
},
_init: function () {
BI.AdaptiveTable.superclass._init.apply(this, arguments);
var self = this, o = this.options;
var data = this._digest();
this.table = BI.createWidget(o.el, {
type: "bi.resizable_table",
element: this,
width: o.width,
height: o.height,
isNeedResize: o.isNeedResize,
isResizeAdapt: false,
isNeedFreeze: o.isNeedFreeze,
freezeCols: data.freezeCols,
isNeedMerge: o.isNeedMerge,
mergeCols: o.mergeCols,
mergeRule: o.mergeRule,
columnSize: data.columnSize,
headerRowSize: o.headerRowSize,
rowSize: o.rowSize,
regionColumnSize: data.regionColumnSize,
header: o.header,
items: o.items,
// 交叉表头
crossHeader: o.crossHeader,
crossItems: o.crossItems
});
this.table.on(BI.Table.EVENT_TABLE_SCROLL, function () {
self.fireEvent(BI.Table.EVENT_TABLE_SCROLL, arguments);
});
this.table.on(BI.Table.EVENT_TABLE_AFTER_REGION_RESIZE, function () {
o.regionColumnSize = this.getRegionColumnSize();
self._populate();
self.table.populate();
self.fireEvent(BI.Table.EVENT_TABLE_AFTER_REGION_RESIZE, arguments);
});
this.table.on(BI.Table.EVENT_TABLE_AFTER_COLUMN_RESIZE, function () {
o.columnSize = this.getColumnSize();
self._populate();
self.table.populate();
self.fireEvent(BI.Table.EVENT_TABLE_AFTER_COLUMN_RESIZE, arguments);
});
},
_getFreezeColLength: function () {
var o = this.options;
return o.isNeedFreeze === true ? BI.clamp(o.freezeCols.length, 0, o.columnSize.length) : 0;
},
_digest: function () {
var o = this.options;
var columnSize = o.columnSize.slice();
var regionColumnSize = o.regionColumnSize.slice();
var freezeCols = o.freezeCols.slice();
var regionSize = o.regionColumnSize[0];
var freezeColLength = this._getFreezeColLength();
if (!regionSize || regionSize > o.width - 10 || regionSize < 10) {
var rs = BI.sum(columnSize, function (i, size) {
if (i < freezeColLength) {
return size;
}
return 0;
});
regionSize = BI.clamp(rs, 1 / 5 * o.width, 4 / 5 * o.width);
}
if (freezeColLength === 0) {
regionSize = 0;
}
if (freezeCols.length >= columnSize.length) {
freezeCols = [];
}
if (!BI.isNumber(columnSize[0])) {
columnSize = o.minColumnSize.slice();
}
var summaryFreezeColumnSize = 0, summaryColumnSize = 0;
BI.each(columnSize, function (i, size) {
if (i < freezeColLength) {
summaryFreezeColumnSize += size;
}
summaryColumnSize += size;
});
if (freezeColLength > 0) {
columnSize[freezeColLength - 1] = BI.clamp(regionSize - (summaryFreezeColumnSize - columnSize[freezeColLength - 1]),
o.minColumnSize[freezeColLength - 1] || 10, o.maxColumnSize[freezeColLength - 1] || Number.MAX_VALUE);
}
if (columnSize.length > 0) {
columnSize[columnSize.length - 1] = BI.clamp(o.width - BI.GridTableScrollbar.SIZE - regionSize - (summaryColumnSize - summaryFreezeColumnSize - columnSize[columnSize.length - 1]),
o.minColumnSize[columnSize.length - 1] || 10, o.maxColumnSize[columnSize.length - 1] || Number.MAX_VALUE);
}
regionColumnSize[0] = regionSize;
return {
freezeCols: freezeCols,
columnSize: columnSize,
regionColumnSize: regionColumnSize
};
},
_populate: function () {
var o = this.options;
var data = this._digest();
o.regionColumnSize = data.regionColumnSize;
o.columnSize = data.columnSize;
this.table.setColumnSize(data.columnSize);
this.table.setRegionColumnSize(data.regionColumnSize);
this.table.attr("freezeCols", data.freezeCols);
},
setWidth: function (width) {
BI.AdaptiveTable.superclass.setWidth.apply(this, arguments);
this.table.setWidth(width);
},
setHeight: function (height) {
BI.AdaptiveTable.superclass.setHeight.apply(this, arguments);
this.table.setHeight(height);
},
setColumnSize: function (columnSize) {
this.options.columnSize = columnSize;
},
getColumnSize: function () {
return this.table.getColumnSize();
},
setRegionColumnSize: function (regionColumnSize) {
this.options.regionColumnSize = regionColumnSize;
},
getRegionColumnSize: function () {
return this.table.getRegionColumnSize();
},
setVerticalScroll: function (scrollTop) {
this.table.setVerticalScroll(scrollTop);
},
setLeftHorizontalScroll: function (scrollLeft) {
this.table.setLeftHorizontalScroll(scrollLeft);
},
setRightHorizontalScroll: function (scrollLeft) {
this.table.setRightHorizontalScroll(scrollLeft);
},
getVerticalScroll: function () {
return this.table.getVerticalScroll();
},
getLeftHorizontalScroll: function () {
return this.table.getLeftHorizontalScroll();
},
getRightHorizontalScroll: function () {
return this.table.getRightHorizontalScroll();
},
attr: function (key, value) {
var v = BI.AdaptiveTable.superclass.attr.apply(this, arguments);
if (key === "freezeCols") {
return v;
}
return this.table.attr.apply(this.table, arguments);
},
restore: function () {
this.table.restore();
},
populate: function (items) {
var self = this, o = this.options;
this._populate();
this.table.populate.apply(this.table, arguments);
},
destroy: function () {
this.table.destroy();
BI.AdaptiveTable.superclass.destroy.apply(this, arguments);
}
});
BI.shortcut("bi.adaptive_table", BI.AdaptiveTable);