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.
 
 
 

1615 lines
67 KiB

/**
*
* 表格
*
* 能处理静态宽度以及动态宽度的表, 百分比宽度的表请使用PreviewTable
*
* Created by GUY on 2015/9/22.
* @class BI.Table
* @extends BI.Widget
*/
BI.Table = BI.inherit(BI.Widget, {
_defaultConfig: function () {
return BI.extend(BI.Table.superclass._defaultConfig.apply(this, arguments), {
baseCls: "bi-table",
logic: { // 冻结的页面布局逻辑
dynamic: false
},
isNeedFreeze: false, // 是否需要冻结单元格
freezeCols: [], // 冻结的列号,从0开始,isNeedFreeze为true时生效
isNeedMerge: false, // 是否需要合并单元格
mergeCols: [], // 合并的单元格列号
mergeRule: function (row1, row2) { // 合并规则, 默认相等时合并
return BI.isEqual(row1, row2);
},
columnSize: [],
headerRowSize: 25,
footerRowSize: 25,
rowSize: 25,
regionColumnSize: false,
header: [],
footer: false,
items: [] // 二维数组
});
},
_calculateWidth: function (width) {
if (!width || width === "0") {
return "";
}
width = BI.parseFloat(width);
if (width < 0) {
width = 0;
}
return width > 1.01 ? width : (width * 100 + "%");
},
_calculateHeight: function (height) {
return height ? height : "";
},
_isRightFreeze: function () {
return BI.isNotEmptyArray(this.options.freezeCols) && BI.first(this.options.freezeCols) !== 0;
},
_createTopLeft: function () {
var o = this.options, isRight = this._isRightFreeze();
this.topLeftColGroupTds = {};
this.topLeftBodyTds = {};
this.topLeftBodyItems = {};
var table = this._table();
var colgroup = this._createColGroup(this.columnLeft, this.topLeftColGroupTds);
var body = this.topLeftBody = this._body();
body.element.append(this._createHeaderCells(this.topLeftItems, this.columnLeft, this.mergeLeft, this.topLeftBodyTds, this.topLeftBodyItems));
BI.createWidget({
type: "bi.adaptive",
element: table,
items: [colgroup, body]
});
if (isRight) {
var w = 0;
BI.each(o.columnSize, function (i, col) {
if (!o.freezeCols.contains(i)) {
w += col;
}
});
if (BI.isNumeric(w) && w > 1) {
w = BI.parseFloat(w) + o.columnSize.length - o.freezeCols.length;
}
}
return (this.topLeftContainer = BI.createWidget({
type: "bi.adaptive",
width: this._calculateWidth(w),
items: [table]
}));
},
_createTopRight: function () {
var o = this.options, isRight = this._isRightFreeze();
this.topRightColGroupTds = {};
this.topRightBodyTds = {};
this.topRightBodyItems = {};
var table = this._table();
var colgroup = this._createColGroup(this.columnRight, this.topRightColGroupTds);
var body = this.topRightBody = this._body();
body.element.append(this._createHeaderCells(this.topRightItems, this.columnRight, this.mergeRight, this.topRightBodyTds, this.topRightBodyItems, this.columnLeft.length));
BI.createWidget({
type: "bi.adaptive",
element: table,
items: [colgroup, body]
});
if (!isRight) {
var w = 0;
BI.each(o.columnSize, function (i, col) {
if (!o.freezeCols.contains(i)) {
w += col;
}
});
if (BI.isNumeric(w)) {
w = BI.parseFloat(w) + o.columnSize.length - o.freezeCols.length;
}
}
return (this.topRightContainer = BI.createWidget({
type: "bi.adaptive",
width: w || undefined,
items: [table]
}));
},
_createBottomLeft: function () {
var o = this.options, isRight = this._isRightFreeze();
this.bottomLeftColGroupTds = {};
this.bottomLeftBodyTds = {};
this.bottomLeftBodyItems = {};
var table = this._table();
var colgroup = this._createColGroup(this.columnLeft, this.bottomLeftColGroupTds);
var body = this._createBottomLeftBody();
BI.createWidget({
type: "bi.adaptive",
element: table,
items: [colgroup, body]
});
if (isRight) {
var w = 0;
BI.each(o.columnSize, function (i, col) {
if (!o.freezeCols.contains(i)) {
w += col;
}
});
if (BI.isNumeric(w) && w > 1) {
w = BI.parseFloat(w) + o.columnSize.length - o.freezeCols.length;
}
}
return (this.bottomLeftContainer = BI.createWidget({
type: "bi.adaptive",
width: this._calculateWidth(w),
items: [table]
}));
},
_createBottomLeftBody: function () {
var body = this.bottomLeftBody = this._body();
body.element.append(this._createCells(this.bottomLeftItems, this.columnLeft, this.mergeLeft, this.bottomLeftBodyTds, this.bottomLeftBodyItems));
return body;
},
_createBottomRight: function () {
var o = this.options, isRight = this._isRightFreeze();
this.bottomRightColGroupTds = {};
this.bottomRightBodyTds = {};
this.bottomRightBodyItems = {};
var table = this._table();
var colgroup = this._createColGroup(this.columnRight, this.bottomRightColGroupTds);
var body = this._createBottomRightBody();
BI.createWidget({
type: "bi.adaptive",
element: table,
items: [colgroup, body]
});
if (!isRight) {
var w = 0;
BI.each(o.columnSize, function (i, col) {
if (!o.freezeCols.contains(i)) {
w += col;
}
});
if (BI.isNumeric(w) && w > 1) {
w = BI.parseFloat(w) + o.columnSize.length - o.freezeCols.length;
}
}
return (this.bottomRightContainer = BI.createWidget({
type: "bi.adaptive",
width: this._calculateWidth(w),
items: [table]
}));
},
_createBottomRightBody: function () {
var body = this.bottomRightBody = this._body();
body.element.append(this._createCells(this.bottomRightItems, this.columnRight, this.mergeRight, this.bottomRightBodyTds, this.bottomRightBodyItems, this.columnLeft.length));
return body;
},
_createFreezeTable: function () {
var self = this, o = this.options;
var isRight = this._isRightFreeze();
var split = this._split(o.header);
this.topLeftItems = split.left;
this.topRightItems = split.right;
split = this._split(o.items);
this.bottomLeftItems = split.left;
this.bottomRightItems = split.right;
this.columnLeft = [];
this.columnRight = [];
BI.each(o.columnSize, function (i, size) {
if (o.freezeCols.contains(i)) {
self[isRight ? "columnRight" : "columnLeft"].push(size);
} else {
self[isRight ? "columnLeft" : "columnRight"].push(size);
}
});
this.mergeLeft = [];
this.mergeRight = [];
BI.each(o.mergeCols, function (i, col) {
if (o.freezeCols.contains(col)) {
self[isRight ? "mergeRight" : "mergeLeft"].push(col);
} else {
self[isRight ? "mergeLeft" : "mergeRight"].push(col);
}
});
var topLeft = this._createTopLeft();
var topRight = this._createTopRight();
var bottomLeft = this._createBottomLeft();
var bottomRight = this._createBottomRight();
this.scrollTopLeft = BI.createWidget({
type: "bi.adaptive",
cls: "scroll-top-left",
width: "100%",
height: "100%",
scrollable: false,
items: [topLeft]
});
this.scrollTopRight = BI.createWidget({
type: "bi.adaptive",
cls: "scroll-top-right",
width: "100%",
height: "100%",
scrollable: false,
items: [topRight]
});
this.scrollBottomLeft = BI.createWidget({
type: "bi.adaptive",
cls: "scroll-bottom-left",
width: "100%",
height: "100%",
scrollable: isRight || null,
scrollx: !isRight,
items: [bottomLeft]
});
this.scrollBottomRight = BI.createWidget({
type: "bi.adaptive",
cls: "scroll-bottom-right",
width: "100%",
height: "100%",
scrollable: !isRight || null,
scrollx: isRight,
items: [bottomRight]
});
this.topLeft = BI.createWidget({
type: "bi.adaptive",
cls: "top-left",
scrollable: false,
items: [this.scrollTopLeft]
});
this.topRight = BI.createWidget({
type: "bi.adaptive",
cls: "top-right",
scrollable: false,
items: [this.scrollTopRight]
});
this.bottomLeft = BI.createWidget({
type: "bi.adaptive",
cls: "bottom-left",
// scrollable: false,
items: [this.scrollBottomLeft]
});
this.bottomRight = BI.createWidget({
type: "bi.adaptive",
cls: "bottom-right",
scrollable: false,
items: [this.scrollBottomRight]
});
var headerHeight = o.header.length * ((o.headerRowSize || o.rowSize) + 1) + 1;
var leftWidth = BI.sum(o.freezeCols, function (i, col) {
return o.columnSize[col] > 1 ? o.columnSize[col] + 1 : o.columnSize[col];
});
this._resize = function () {
if (self.scrollBottomLeft.element.is(":visible")) {
self.scrollBottomLeft.element.css({"overflow-x": "auto"});
self.scrollBottomRight.element.css({"overflow-x": "auto"});
self.setColumnSize(o.columnSize);
if (isRight) {
self.scrollBottomLeft.element.css({"overflow-y": "auto"});
} else {
self.scrollBottomRight.element.css({"overflow-y": "auto"});
}
if (self.scrollBottomLeft.element.hasHorizonScroll() || self.scrollBottomRight.element.hasHorizonScroll()) {
self.scrollBottomLeft.element.css("overflow-x", "scroll");
self.scrollBottomRight.element.css("overflow-x", "scroll");
}
if (self.scrollBottomRight.element.hasVerticalScroll()) {
self.scrollTopRight.element.css("overflow-y", "scroll");
} else {
self.scrollTopRight.element.css("overflow-y", "hidden");
}
if (self.scrollBottomLeft.element.hasVerticalScroll()) {
self.scrollTopLeft.element.css("overflow-y", "scroll");
} else {
self.scrollTopLeft.element.css("overflow-y", "hidden");
}
self.scrollTopLeft.element[0].scrollLeft = self.scrollBottomLeft.element[0].scrollLeft;
self.scrollTopRight.element[0].scrollLeft = self.scrollBottomRight.element[0].scrollLeft;
self.scrollBottomLeft.element[0].scrollTop = self.scrollBottomRight.element[0].scrollTop;
}
};
var regionColumnSize = o.regionColumnSize;
if (o.freezeCols.length === 0) {
regionColumnSize = isRight ? ["fill", 0] : [0, "fill"];
} else if (o.freezeCols.length >= o.columnSize.length) {
regionColumnSize = isRight ? [0, "fill"] : ["fill", 0];
}
this.partitions = BI.createWidget(BI.extend({
element: this
}, BI.LogicFactory.createLogic("table", BI.extend({}, o.logic, {
rows: 2,
columns: 2,
columnSize: regionColumnSize || (isRight ? ["fill", leftWidth] : [leftWidth, "fill"]),
rowSize: [headerHeight, "fill"],
items: [[{
el: this.topLeft
}, {
el: this.topRight
}], [{
el: this.bottomLeft
}, {
el: this.bottomRight
}]]
}))));
this._initFreezeScroll();
BI.ResizeDetector.addResizeListener(this, function () {
self._resize();
self.fireEvent(BI.Table.EVENT_TABLE_RESIZE);
});
},
mounted: function () {
this._resize && this._resize();
this.fireEvent(BI.Table.EVENT_TABLE_AFTER_INIT);
},
_initFreezeScroll: function () {
var self = this, o = this.options;
scroll(this.scrollBottomRight.element, this.scrollTopRight.element, this.scrollBottomLeft.element);
// scroll(this.scrollBottomLeft.element, this.scrollTopLeft.element, this.scrollBottomRight.element);
function scroll (scrollElement, scrollTopElement, otherElement) {
scrollElement.scroll(function (e) {
otherElement.scrollTop(scrollElement.scrollTop());
scrollTopElement.scrollLeft(scrollElement.scrollLeft());
self.fireEvent(BI.Table.EVENT_TABLE_SCROLL);
});
}
},
resize: function () {
this._resize && this._resize();
},
_createCells: function (items, columnSize, mergeCols, TDs, Ws, start, rowSize) {
var self = this, o = this.options, preCol = {}, preRow = {}, preRW = {}, preCW = {}, map = {};
columnSize = columnSize || o.columnSize;
mergeCols = mergeCols || o.mergeCols;
TDs = TDs || {};
Ws = Ws || {};
start = start || 0;
rowSize || (rowSize = o.rowSize);
var frag = document.createDocumentFragment();
BI.each(items, function (i, rows) {
var tr = $("<tr>").addClass((i & 1) === 0 ? "odd" : "even");
BI.each(rows, function (j, row) {
if (!map[i]) {
map[i] = {};
}
if (!TDs[i]) {
TDs[i] = {};
}
if (!Ws[i]) {
Ws[i] = {};
}
map[i][j] = row;
if (o.isNeedMerge && mergeCols.contains(j)) {
if (i === 0 && j === 0) {
createOneEl(0, 0);
} else if (j === 0 && i > 0) {
var isNeedMergeRow = o.mergeRule(map[i][j], map[i - 1][j]);
if (isNeedMergeRow === true) {
mergeRow(i, j);
preRow[i] = preCol[j];
preRW[i] = preCW[j];
} else {
createOneEl(i, j);
}
} else if (i === 0 && j > 0) {
var isNeedMergeCol = o.mergeRule(map[i][j], map[i][j - 1]);
if (isNeedMergeCol === true) {
mergeCol(i, j);
preCol[j] = preRow[i];
preCW[j] = preRW[i];
} else {
createOneEl(i, j);
}
} else {
var isNeedMergeRow = o.mergeRule(map[i][j], map[i - 1][j]);
var isNeedMergeCol = o.mergeRule(map[i][j], map[i][j - 1]);
if (isNeedMergeCol && isNeedMergeRow) {
return;
}
if (isNeedMergeCol) {
mergeCol(i, j);
}
if (isNeedMergeRow) {
mergeRow(i, j);
}
if (!isNeedMergeCol && !isNeedMergeRow) {
createOneEl(i, j);
}
}
} else {
createOneEl(i, j);
}
});
function mergeRow (i, j) {
var height = (preCol[j].attr("height") | 0) + rowSize + 1;
preCol[j].attr("height", height).css("height", height);
// preCW[j].element.css("height", height);
var rowspan = ((preCol[j].attr("rowspan") || 1) | 0) + 1;
preCol[j].attr("rowspan", rowspan);
preCol[j].__mergeRows.pushDistinct(i);
TDs[i][j] = preCol[j];
Ws[i][j] = preCW[j];
}
function mergeCol (i, j) {
if (columnSize[j]) {
var width = preRow[i].attr("width") | 0;
if (width > 1.05 && columnSize[j]) {
width = width + columnSize[j] + 1;
if (j === columnSize.length - 1) {
width--;
}
} else {
width = width + columnSize[j];
}
width = self._calculateWidth(width);
preRow[i].attr("width", width).css("width", width);
preRW[i].element.width(width);
}
var colspan = ((preRow[i].attr("colspan") || 1) | 0) + 1;
preRow[i].attr("colspan", colspan);
preRow[i].__mergeCols.pushDistinct(j);
TDs[i][j] = preRow[i];
Ws[i][j] = preRW[i];
}
function createOneEl (r, c) {
var width = self._calculateWidth(columnSize[c]);
if (width > 1.05 && c === columnSize.length - 1) {
width--;
}
var height = self._calculateHeight(rowSize);
var td = $("<td>").attr("height", height)
.attr("width", width).css({width: width, height: height, position: "relative"})
.addClass((c & 1) === 0 ? "odd-col" : "even-col")
.addClass(r === 0 ? "first-row" : "")
.addClass(c === 0 ? "first-col" : "")
.addClass(c === rows.length - 1 ? "last-col" : "");
var w = BI.createWidget(map[r][c], {
type: "bi.table_cell",
textAlign: "left",
width: BI.isNumeric(width) ? width : "",
height: BI.isNumeric(height) ? height : "",
_row: r,
_col: c + start
});
self.addWidget(w.getName(), w);
w._mount();
w.element.css("position", "relative");
td.append(w.element);
tr.append(td);
preCol[c] = td;
preCol[c].__mergeRows = [r];
preCW[c] = w;
preRow[r] = td;
preRow[r].__mergeCols = [c];
preRW[r] = w;
TDs[r][c] = td;
Ws[r][c] = w;
}
frag.appendChild(tr[0]);
});
return frag;
},
_createColGroupCells: function (columnSize, store) {
var self = this, o = this.options;
columnSize = columnSize || o.columnSize;
store = store || {};
var frag = document.createDocumentFragment();
BI.each(columnSize, function (i, size) {
var width = self._calculateWidth(size);
var col = $("<col>").attr("width", width).css("width", width);
store[i] = col;
frag.appendChild(col[0]);
});
return frag;
},
_createHeaderCells: function (items, columnSize, mergeCols, TDs, Ws, start) {
var self = this, o = this.options;
start || (start = 0);
var frag = this._createCells(items, columnSize, BI.range(o.columnSize.length), TDs, Ws, start, o.headerRowSize || o.rowSize);
return frag;
},
_createFooterCells: function (items, columnSize, TDs, Ws) {
var o = this.options;
var frag = this._createCells(items, columnSize, [], TDs, Ws, 0);
return frag;
},
_createColGroup: function (columnSize, store, widgets) {
var self = this, o = this.options;
this.colgroup = this._colgroup();
this.colgroup.element.append(this._createColGroupCells(columnSize, store, widgets));
return this.colgroup;
},
_createHeader: function () {
var self = this, o = this.options;
if (o.header === false) {
return;
}
this.header = this._header();
this.header.element.append(this._createHeaderCells(o.header, null, null, this.headerTds, this.headerItems));
return this.header;
},
_createFooter: function (columnSize, store, widgets) {
var self = this, o = this.options;
if (o.footer === false) {
return;
}
this.footer = this._footer();
this.footer.element.append(this._createFooterCells(o.footer, null, this.footerTds, this.footerItems));
return this.footer;
},
_createBody: function () {
var self = this, o = this.options;
this.body = this._body();
this.body.element.append(this._createCells(o.items, null, null, this.bodyTds, this.bodyItems));
return this.body;
},
_createNormalTable: function () {
var self = this, o = this.options, table = this._table();
this.colgroupTds = {};
this.headerTds = {};
this.footerTds = {};
this.bodyTds = {};
this.headerItems = {};
this.footerItems = {};
this.bodyItems = {};
var colgroup = this._createColGroup(null, this.colgroupTds);
var header = this._createHeader();
var footer = this._createFooter();
var body = this._createBody();
BI.createWidget({
type: "bi.adaptive",
element: table,
items: [colgroup, header, footer, body]
});
var w = BI.sum(this.options.columnSize) || undefined;
w = this._calculateWidth(w);
if (BI.isNumeric(w) && w > 1) {
w += o.columnSize.length;
}
this.tableContainer = BI.createWidget({
type: "bi.adaptive",
width: this._calculateWidth(w),
items: [table]
});
this.scrollBottomRight = BI.createWidget({
type: "bi.adaptive",
width: "100%",
height: "100%",
cls: "scroll-bottom-right",
scrollable: true,
items: [this.tableContainer]
});
BI.createWidget({
type: "bi.adaptive",
cls: "bottom-right",
element: this,
scrollable: false,
items: [this.scrollBottomRight]
});
this._initNormalScroll();
BI.nextTick(function () {
if (self.element.is(":visible")) {
self.fireEvent(BI.Table.EVENT_TABLE_AFTER_INIT);
}
});
},
_initNormalScroll: function () {
var self = this;
this.scrollBottomRight.element.scroll(function (e) {
self.fireEvent(BI.Table.EVENT_TABLE_SCROLL);
});
},
_split: function (items) {
var o = this.options, left = [], right = [], isRight = this._isRightFreeze();
BI.each(items, function (i, rows) {
left.push([]);
right.push([]);
BI.each(rows, function (j, cell) {
if (o.freezeCols.contains(j)) {
(isRight ? right : left)[i].push(cell);
} else {
(isRight ? left : right)[i].push(cell);
}
});
});
return {
left: left,
right: right
};
},
_table: function () {
return BI.createWidget({
type: "bi.layout",
tagName: "table",
cls: "table",
attribute: {cellspacing: 0, cellpadding: 0}
});
},
_header: function () {
return BI.createWidget({
type: "bi.layout",
cls: "header",
tagName: "thead"
});
},
_footer: function () {
return BI.createWidget({
type: "bi.layout",
cls: "footer",
tagName: "tfoot"
});
},
_body: function () {
return BI.createWidget({
type: "bi.layout",
tagName: "tbody",
cls: "body"
});
},
_colgroup: function () {
return BI.createWidget({
type: "bi.layout",
tagName: "colgroup"
});
},
render: function () {
this.populate(this.options.items);
},
setColumnSize: function (columnSize) {
var self = this, o = this.options;
var isRight = this._isRightFreeze();
o.columnSize = columnSize || [];
if (o.isNeedFreeze) {
var columnLeft = [];
var columnRight = [];
BI.each(o.columnSize, function (i, size) {
if (o.freezeCols.contains(i)) {
isRight ? columnRight.push(size) : columnLeft.push(size);
} else {
isRight ? columnLeft.push(size) : columnRight.push(size);
}
});
var topleft = 0, topright = 1, bottomleft = 2, bottomright = 3;
var run = function (direction) {
var colgroupTds, bodyTds, bodyItems, sizes;
switch (direction) {
case topleft:
colgroupTds = self.topLeftColGroupTds;
bodyTds = self.topLeftBodyTds;
bodyItems = self.topLeftBodyItems;
sizes = columnLeft;
break;
case topright:
colgroupTds = self.topRightColGroupTds;
bodyTds = self.topRightBodyTds;
bodyItems = self.topRightBodyItems;
sizes = columnRight;
break;
case bottomleft:
colgroupTds = self.bottomLeftColGroupTds;
bodyTds = self.bottomLeftBodyTds;
bodyItems = self.bottomLeftBodyItems;
sizes = columnLeft;
break;
case bottomright:
colgroupTds = self.bottomRightColGroupTds;
bodyTds = self.bottomRightBodyTds;
bodyItems = self.bottomRightBodyItems;
sizes = columnRight;
break;
}
BI.each(colgroupTds, function (i, colgroup) {
var width = colgroup.attr("width") | 0;
if (sizes[i] !== "" && width !== sizes[i]) {
var w = self._calculateWidth(sizes[i]);
colgroup.attr("width", w).css("width", w);
BI.each(bodyTds, function (j, items) {
if (items[i]) {
if (items[i].__mergeCols.length > 1) {
var wid = 0;
BI.each(sizes, function (t, s) {
if (items[i].__mergeCols.contains(t)) {
wid += s;
}
});
wid = self._calculateWidth(wid);
if (wid > 1) {
wid += items[i].__mergeCols.length - 1;
}
if (BI.isNumeric(wid)) {
if (i == BI.size(items) - 1) {
items[i].attr("width", wid - 1).css("width", wid - 1);
} else {
items[i].attr("width", wid).css("width", wid);
}
} else {
items[i].attr("width", "").css("width", "");
}
} else {
if (i == BI.size(items) - 1) {
items[i].attr("width", w - 1).css("width", w - 1);
} else {
items[i].attr("width", w).css("width", w);
}
}
}
});
BI.each(bodyItems, function (j, items) {
if (items[i]) {
if (bodyTds[j][i].__mergeCols.length > 1) {
var wid = 0;
BI.each(sizes, function (t, s) {
if (bodyTds[j][i].__mergeCols.contains(t)) {
wid += s;
}
});
wid = self._calculateWidth(wid);
if (wid > 1) {
wid += bodyTds[j][i].__mergeCols.length - 1;
}
if (BI.isNumeric(wid)) {
if (i == BI.size(items) - 1) {
items[i].element.attr("width", wid - 1).css("width", wid - 1);
} else {
items[i].element.attr("width", wid).css("width", wid);
}
} else {
items[i].element.attr("width", "").css("width", "");
}
} else {
if (BI.isNumeric(w)) {
if (i == BI.size(items) - 1) {
items[i].element.attr("width", w - 1).css("width", w - 1);
} else {
items[i].element.attr("width", w).css("width", w);
}
} else {
items[i].element.attr("width", "").css("width", "");
}
}
}
});
}
});
};
run(topleft);
run(topright);
run(bottomleft);
run(bottomright);
var lw = 0, rw = 0;
this.columnLeft = [];
this.columnRight = [];
BI.each(o.columnSize, function (i, size) {
if (o.freezeCols.contains(i)) {
lw += size;
self[isRight ? "columnRight" : "columnLeft"].push(size);
} else {
rw += size;
self[isRight ? "columnLeft" : "columnRight"].push(size);
}
});
lw = this._calculateWidth(lw);
rw = this._calculateWidth(rw);
if (BI.isNumeric(lw)) {
lw = BI.parseFloat(lw) + o.freezeCols.length;
}
if (BI.isNumeric(rw)) {
rw = BI.parseFloat(rw) + o.columnSize.length - o.freezeCols.length;
}
this.topLeftContainer.element.width(isRight ? rw : lw);
this.bottomLeftContainer.element.width(isRight ? rw : lw);
this.topRightContainer.element.width(isRight ? lw : rw);
this.bottomRightContainer.element.width(isRight ? lw : rw);
this.scrollTopLeft.element[0].scrollLeft = this.scrollBottomLeft.element[0].scrollLeft;
this.scrollTopRight.element[0].scrollLeft = this.scrollBottomRight.element[0].scrollLeft;
} else {
BI.each(this.colgroupTds, function (i, colgroup) {
var width = colgroup.attr("width") | 0;
if (o.columnSize[i] !== "" && width !== o.columnSize[i]) {
var w = self._calculateWidth(o.columnSize[i]);
colgroup.attr("width", w).css("width", w);
BI.each(self.bodyTds, function (j, items) {
if (items[i]) {
if (items[i].__mergeCols.length > 1) {
var wid = 0;
BI.each(o.columnSize, function (t, s) {
if (items[i].__mergeCols.contains(t)) {
wid += s;
}
});
wid = self._calculateWidth(wid);
if (wid > 1) {
wid += items[i].__mergeCols.length - 1;
}
if (BI.isNumeric(wid)) {
if (i == BI.size(items) - 1) {
items[i].attr("width", w - 1).css("width", w - 1);
} else {
items[i].attr("width", w).css("width", w);
}
} else {
items[i].attr("width", "").css("width", "");
}
} else {
if (i == BI.size(items) - 1) {
items[i].attr("width", w - 1).css("width", w - 1);
} else {
items[i].attr("width", w).css("width", w);
}
}
}
});
BI.each(self.headerTds, function (j, items) {
if (items[i]) {
if (items[i].__mergeCols.length > 1) {
var wid = 0;
BI.each(o.columnSize, function (t, s) {
if (items[i].__mergeCols.contains(t)) {
wid += s;
}
});
wid = self._calculateWidth(wid);
if (wid > 1) {
wid += items[i].__mergeCols.length - 1;
}
if (BI.isNumeric(wid)) {
if (i == BI.size(items) - 1) {
items[i].attr("width", w - 1).css("width", w - 1);
} else {
items[i].attr("width", w).css("width", w);
}
} else {
items[i].attr("width", "").css("width", "");
}
} else {
if (i == BI.size(items) - 1) {
items[i].attr("width", w - 1).css("width", w - 1);
} else {
items[i].attr("width", w).css("width", w);
}
}
}
});
BI.each(self.footerTds, function (j, items) {
if (items[i]) {
if (items[i].__mergeCols.length > 1) {
var wid = 0;
BI.each(o.columnSize, function (t, s) {
if (items[i].__mergeCols.contains(t)) {
wid += s;
}
});
wid = self._calculateWidth(wid);
if (wid > 1) {
wid += items[i].__mergeCols.length - 1;
}
if (BI.isNumeric(wid)) {
if (i == BI.size(items) - 1) {
items[i].attr("width", w - 1).css("width", w - 1);
} else {
items[i].attr("width", w).css("width", w);
}
} else {
items[i].attr("width", "").css("width", "");
}
} else {
if (i == BI.size(items) - 1) {
items[i].attr("width", w - 1).css("width", w - 1);
} else {
items[i].attr("width", w).css("width", w);
}
}
}
});
BI.each(self.bodyItems, function (j, items) {
if (items[i]) {
if (self.bodyTds[j][i].__mergeCols.length > 1) {
var wid = 0;
BI.each(o.columnSize, function (t, s) {
if (self.bodyTds[j][i].__mergeCols.contains(t)) {
wid += s;
}
});
wid = self._calculateWidth(wid);
if (wid > 1) {
wid += self.bodyTds[j][i].__mergeCols.length - 1;
}
if (BI.isNumeric(wid)) {
if (i == BI.size(items) - 1) {
items[i].element.attr("width", wid - 1).css("width", wid - 1);
} else {
items[i].element.attr("width", wid).css("width", wid);
}
} else {
items[i].element.attr("width", "").css("width", "");
}
} else {
if (BI.isNumeric(w)) {
if (i == BI.size(items) - 1) {
items[i].element.attr("width", w - 1).css("width", w - 1);
} else {
items[i].element.attr("width", w).css("width", w);
}
} else {
items[i].element.attr("width", "").css("width", "");
}
}
}
});
BI.each(self.headerItems, function (j, items) {
if (items[i]) {
if (self.headerTds[j][i].__mergeCols.length > 1) {
var wid = 0;
BI.each(o.columnSize, function (t, s) {
if (self.headerTds[j][i].__mergeCols.contains(t)) {
wid += s;
}
});
wid = self._calculateWidth(wid);
if (wid > 1) {
wid += self.headerTds[j][i].__mergeCols.length - 1;
}
if (BI.isNumeric(wid)) {
if (i == BI.size(items) - 1) {
items[i].element.attr("width", wid - 1).css("width", wid - 1);
} else {
items[i].element.attr("width", wid).css("width", wid);
}
} else {
items[i].element.attr("width", "").css("width", "");
}
} else {
if (BI.isNumeric(w)) {
if (i == BI.size(items) - 1) {
items[i].element.attr("width", w - 1).css("width", w - 1);
} else {
items[i].element.attr("width", w).css("width", w);
}
} else {
items[i].element.attr("width", "").css("width", "");
}
}
}
});
BI.each(self.footerItems, function (j, items) {
if (items[i]) {
if (self.footerTds[j][i].__mergeCols.length > 1) {
var wid = 0;
BI.each(o.columnSize, function (t, s) {
if (self.footerTds[j][i].__mergeCols.contains(t)) {
wid += s;
}
});
wid = self._calculateWidth(wid);
if (wid > 1) {
wid += self.footerTds[j][i].__mergeCols.length - 1;
}
if (BI.isNumeric(wid)) {
if (i == BI.size(items) - 1) {
items[i].element.attr("width", wid - 1).css("width", wid - 1);
} else {
items[i].element.attr("width", wid).css("width", wid);
}
} else {
items[i].element.attr("width", "").css("width", "");
}
} else {
if (BI.isNumeric(w)) {
if (i == BI.size(items) - 1) {
items[i].element.attr("width", w - 1).css("width", w - 1);
} else {
items[i].element.attr("width", w).css("width", w);
}
} else {
items[i].element.attr("width", "").css("width", "");
}
}
}
});
}
});
var w = this._calculateWidth(BI.sum(o.columnSize));
if (w > 1.05) {
w += o.columnSize.length;
}
if (w > 1.05) {
this.tableContainer.element.width(w);
}
}
},
getColumnSize: function () {
return this.options.columnSize;
},
getCalculateColumnSize: function () {
var self = this, o = this.options;
var columnSize = [];
if (o.isNeedFreeze === true) {
if (BI.size(this.bottomLeftBodyTds) > 0 || BI.size(this.bottomRightBodyTds) > 0) {
if (!BI.any(this.bottomLeftBodyTds, function (i, tds) {
if (!BI.any(tds, function (i, item) {
if (item.__mergeCols.length > 1) {
return true;
}
})) {
BI.each(tds, function (i, item) {
var width = item.width() / item.__mergeCols.length;
if (i == BI.size(tds) - 1) {
width++;
}
columnSize.push(width);
});
return true;
}
})) {
BI.each(this.bottomLeftBodyTds[0], function (i, item) {
var width = item.width() / item.__mergeCols.length;
if (i == BI.size(self.bottomLeftBodyTds[0]) - 1) {
width++;
}
columnSize.push(width);
});
}
if (!BI.any(this.bottomRightBodyTds, function (i, tds) {
if (!BI.any(tds, function (i, item) {
if (item.__mergeCols.length > 1) {
return true;
}
})) {
BI.each(tds, function (i, item) {
var width = item.width() / item.__mergeCols.length;
if (i == BI.size(tds) - 1) {
width++;
}
columnSize.push(width);
});
return true;
}
})) {
BI.each(this.bottomRightBodyTds[0], function (i, item) {
var width = item.width() / item.__mergeCols.length;
if (i == BI.size(self.bottomRightBodyTds[0]) - 1) {
width++;
}
columnSize.push(width);
});
}
return columnSize;
}
if (!BI.any(this.topLeftBodyTds, function (i, tds) {
if (!BI.any(tds, function (i, item) {
if (item.__mergeCols.length > 1) {
return true;
}
})) {
BI.each(tds, function (i, item) {
var width = item.width() / item.__mergeCols.length;
if (i == BI.size(tds) - 1) {
width++;
}
columnSize.push(width);
});
return true;
}
})) {
BI.each(this.topLeftBodyTds[BI.size(this.topLeftBodyTds) - 1], function (i, item) {
var width = item.width() / item.__mergeCols.length;
if (i == BI.size(self.topLeftBodyTds[BI.size(self.topLeftBodyTds) - 1]) - 1) {
width++;
}
columnSize.push(width);
});
}
if (!BI.any(this.topRightBodyTds, function (i, tds) {
if (!BI.any(tds, function (i, item) {
if (item.__mergeCols.length > 1) {
return true;
}
})) {
BI.each(tds, function (i, item) {
var width = item.width() / item.__mergeCols.length;
if (i == BI.size(tds) - 1) {
width++;
}
columnSize.push(width);
});
return true;
}
})) {
BI.each(this.topRightBodyTds[BI.size(this.topRightBodyTds) - 1], function (i, item) {
var width = item.width() / item.__mergeCols.length;
if (i == BI.size(self.topRightBodyTds[BI.size(self.topRightBodyTds) - 1]) - 1) {
width++;
}
columnSize.push(width);
});
}
} else {
BI.each(this.headerTds[BI.size(this.headerTds) - 1], function (i, item) {
var width = item.width() / item.__mergeCols.length;
if (i == BI.size(self.headerTds[BI.size(self.headerTds) - 1]) - 1) {
width++;
}
columnSize.push(width);
});
}
return columnSize;
},
setHeaderColumnSize: function (columnSize) {
var self = this, o = this.options;
var isRight = this._isRightFreeze();
if (o.isNeedFreeze) {
var columnLeft = [];
var columnRight = [];
BI.each(columnSize, function (i, size) {
if (o.freezeCols.contains(i)) {
isRight ? columnRight.push(size) : columnLeft.push(size);
} else {
isRight ? columnLeft.push(size) : columnRight.push(size);
}
});
var topleft = 0, topright = 1;
var run = function (direction) {
var colgroupTds, bodyTds, bodyItems, sizes;
switch (direction) {
case topleft:
colgroupTds = self.topLeftColGroupTds;
bodyTds = self.topLeftBodyTds;
bodyItems = self.topLeftBodyItems;
sizes = columnLeft;
break;
case topright:
colgroupTds = self.topRightColGroupTds;
bodyTds = self.topRightBodyTds;
bodyItems = self.topRightBodyItems;
sizes = columnRight;
break;
}
BI.each(colgroupTds, function (i, colgroup) {
var width = colgroup.attr("width") | 0;
if (width !== sizes[i]) {
var w = self._calculateWidth(sizes[i]);
colgroup.attr("width", w).css("width", w);
BI.each(bodyTds, function (j, items) {
if (items[i]) {
if (items[i].__mergeCols.length > 1) {
var wid = 0;
BI.each(sizes, function (t, s) {
if (items[i].__mergeCols.contains(t)) {
wid += s;
}
});
wid = self._calculateWidth(wid);
if (wid > 1) {
wid += items[i].__mergeCols.length - 1;
}
if (BI.isNumeric(wid)) {
if (i == BI.size(items) - 1) {
items[i].attr("width", wid - 1).css("width", wid - 1);
} else {
items[i].attr("width", wid).css("width", wid);
}
} else {
items[i].attr("width", "").css("width", "");
}
} else {
if (i == BI.size(items) - 1) {
items[i].attr("width", w - 1).css("width", w - 1);
} else {
items[i].attr("width", w).css("width", w);
}
}
}
});
BI.each(bodyItems, function (j, items) {
if (items[i]) {
if (bodyTds[j][i].__mergeCols.length > 1) {
var wid = 0;
BI.each(sizes, function (t, s) {
if (bodyTds[j][i].__mergeCols.contains(t)) {
wid += s;
}
});
wid = self._calculateWidth(wid);
if (wid > 1) {
wid += bodyTds[j][i].__mergeCols.length - 1;
}
if (BI.isNumeric(wid)) {
if (i == BI.size(items) - 1) {
items[i].element.attr("width", wid - 1).css("width", wid - 1);
} else {
items[i].element.attr("width", wid).css("width", wid);
}
} else {
items[i].element.attr("width", "").css("width", "");
}
} else {
if (BI.isNumeric(w)) {
if (i == BI.size(items) - 1) {
items[i].element.attr("width", w - 1).css("width", w - 1);
} else {
items[i].element.attr("width", w).css("width", w);
}
} else {
items[i].element.attr("width", "").css("width", "");
}
}
}
});
}
});
};
run(topleft);
run(topright);
var lw = 0, rw = 0;
BI.each(columnSize, function (i, size) {
if (o.freezeCols.contains(i)) {
lw += size;
} else {
rw += size;
}
});
lw = this._calculateWidth(lw);
rw = this._calculateWidth(rw);
if (BI.isNumeric(lw)) {
lw = BI.parseFloat(lw) + o.freezeCols.length;
}
if (BI.isNumeric(rw)) {
rw = BI.parseFloat(rw) + columnSize.length - o.freezeCols.length;
}
this.topLeftContainer.element.width(isRight ? rw : lw);
this.topRightContainer.element.width(isRight ? lw : rw);
this.scrollTopLeft.element[0].scrollLeft = this.scrollBottomLeft.element[0].scrollLeft;
this.scrollTopRight.element[0].scrollLeft = this.scrollBottomRight.element[0].scrollLeft;
} else {
BI.each(this.colgroupTds, function (i, colgroup) {
var width = colgroup.attr("width") | 0;
if (width !== columnSize[i]) {
var w = self._calculateWidth(columnSize[i]);
colgroup.attr("width", w).css("width", w);
BI.each(self.headerTds, function (j, items) {
if (items[i]) {
if (items[i].__mergeCols.length > 1) {
var wid = 0;
BI.each(columnSize, function (t, s) {
if (items[i].__mergeCols.contains(t)) {
wid += s;
}
});
wid = self._calculateWidth(wid);
if (wid > 1) {
wid += items[i].__mergeCols.length - 1;
}
if (BI.isNumeric(wid)) {
if (i == BI.size(items) - 1) {
items[i].element.attr("width", wid - 1).css("width", wid - 1);
} else {
items[i].element.attr("width", wid).css("width", wid);
}
} else {
items[i].attr("width", "").css("width", "");
}
} else {
if (i == BI.size(items) - 1) {
items[i].attr("width", w - 1).css("width", w - 1);
} else {
items[i].attr("width", w).css("width", w);
}
}
}
});
BI.each(self.headerItems, function (j, items) {
if (items[i]) {
if (self.headerTds[j][i].__mergeCols.length > 1) {
var wid = 0;
BI.each(columnSize, function (t, s) {
if (self.headerTds[j][i].__mergeCols.contains(t)) {
wid += s;
}
});
wid = self._calculateWidth(wid);
if (wid > 1) {
wid += self.headerTds[j][i].__mergeCols.length - 1;
}
if (BI.isNumeric(wid)) {
if (i == BI.size(items) - 1) {
items[i].element.attr("width", wid - 1).css("width", wid - 1);
} else {
items[i].element.attr("width", wid).css("width", wid);
}
} else {
items[i].element.attr("width", "").css("width", "");
}
} else {
if (BI.isNumeric(w)) {
if (i == BI.size(items) - 1) {
items[i].element.attr("width", w - 1).css("width", w - 1);
} else {
items[i].element.attr("width", w).css("width", w);
}
} else {
items[i].element.attr("width", "").css("width", "");
}
}
}
});
}
});
var cW = this._calculateWidth(BI.sum(columnSize));
if (cW > 1.05) {
cW = cW + columnSize.length;
}
this.tableContainer.element.width(cW);
}
},
setRegionColumnSize: function (columnSize) {
var self = this, o = this.options;
o.regionColumnSize = columnSize;
if (o.freezeCols.length === 0) {
if (o.isNeedFreeze) {
this.partitions.attr("columnSize", this._isRightFreeze() ? ["fill", 0] : [0, "fill"]);
this.partitions.resize();
} else {
this.tableContainer.element.width(columnSize[0]);
}
} else if (o.freezeCols.length > 0 && o.freezeCols.length < o.columnSize.length) {
if (o.isNeedFreeze) {
this.partitions.attr("columnSize", columnSize);
this.partitions.resize();
} else {
this.tableContainer.element.width(columnSize[0]);
}
} else {
if (o.isNeedFreeze) {
this.partitions.attr("columnSize", this._isRightFreeze() ? [0, "fill"] : ["fill", 0]);
this.partitions.resize();
} else {
this.tableContainer.element.width(columnSize[0]);
}
}
},
getRegionColumnSize: function () {
return this.options.regionColumnSize;
},
getCalculateRegionColumnSize: function () {
var o = this.options;
if (o.isNeedFreeze) {
return [this.scrollBottomLeft.element.width(), this.scrollBottomRight.element.width()];
}
return [this.scrollBottomRight.element.width()];
},
getCalculateRegionRowSize: function () {
var o = this.options;
if (o.isNeedFreeze) {
return [this.scrollTopRight.element.height(), this.scrollBottomRight.element.height()];
}
return [this.scrollBottomRight.element.height()];
},
getClientRegionColumnSize: function () {
var o = this.options;
if (o.isNeedFreeze) {
return [this.scrollBottomLeft.element[0].clientWidth, this.scrollBottomRight.element[0].clientWidth];
}
return [this.scrollBottomRight.element[0].clientWidth];
},
getClientRegionRowSize: function () {
var o = this.options;
if (o.isNeedFreeze) {
return [this.scrollBottomLeft.element[0].clientHeight, this.scrollBottomRight.element[0].clientHeight];
}
return [this.scrollBottomRight.element[0].clientHeight];
},
getScrollRegionColumnSize: function () {
var o = this.options;
if (o.isNeedFreeze) {
return [this.scrollBottomLeft.element[0].scrollWidth, this.scrollBottomRight.element[0].scrollWidth];
}
return [this.scrollBottomRight.element[0].scrollWidth];
},
getScrollRegionRowSize: function () {
var o = this.options;
if (o.isNeedFreeze) {
if (o.freezeCols.length < o.columnSize.length) {
return [this.scrollTopRight.element[0].scrollHeight, this.scrollBottomRight.element[0].scrollHeight];
}
return [this.scrollTopLeft.element[0].scrollHeight, this.scrollBottomLeft.element[0].scrollHeight];
}
return [this.scrollBottomRight.element[0].scrollHeight];
},
hasVerticalScroll: function () {
var o = this.options;
if (o.isNeedFreeze) {
return this.scrollBottomRight.element.hasVerticalScroll() || this.scrollBottomLeft.element.hasVerticalScroll();
}
return this.scrollBottomRight.element.hasVerticalScroll();
},
setVerticalScroll: function (scrollTop) {
var o = this.options;
if (o.isNeedFreeze) {
if (this.scrollBottomRight.element[0].scrollTop !== scrollTop) {
this.scrollBottomRight.element[0].scrollTop = scrollTop;
}
if (this.scrollBottomLeft.element[0].scrollTop !== scrollTop) {
this.scrollBottomLeft.element[0].scrollTop = scrollTop;
}
} else {
if (this.scrollBottomRight.element[0].scrollTop !== scrollTop) {
this.scrollBottomRight.element[0].scrollTop = scrollTop;
}
}
},
setLeftHorizontalScroll: function (scrollLeft) {
var o = this.options;
if (o.isNeedFreeze) {
if (this.scrollBottomLeft.element[0].scrollLeft !== scrollLeft) {
this.scrollBottomLeft.element[0].scrollLeft = scrollLeft;
}
if (this.scrollTopLeft.element[0].scrollLeft !== scrollLeft) {
this.scrollTopLeft.element[0].scrollLeft = scrollLeft;
}
} else {
if (this.scrollBottomRight.element[0].scrollLeft !== scrollLeft) {
this.scrollBottomRight.element[0].scrollLeft = scrollLeft;
}
}
},
setRightHorizontalScroll: function (scrollLeft) {
var o = this.options;
if (o.isNeedFreeze) {
if (this.scrollBottomRight.element[0].scrollLeft !== scrollLeft) {
this.scrollBottomRight.element[0].scrollLeft = scrollLeft;
}
if (this.scrollTopRight.element[0].scrollLeft !== scrollLeft) {
this.scrollTopRight.element[0].scrollLeft = scrollLeft;
}
} else {
if (this.scrollBottomRight.element[0].scrollLeft !== scrollLeft) {
this.scrollBottomRight.element[0].scrollLeft = scrollLeft;
}
}
},
getVerticalScroll: function () {
var o = this.options;
if (o.isNeedFreeze) {
return this.scrollBottomRight.element[0].scrollTop || this.scrollBottomLeft.element[0].scrollTop;
}
return this.scrollBottomRight.element[0].scrollTop;
},
getLeftHorizontalScroll: function () {
var o = this.options;
if (o.isNeedFreeze) {
return this.scrollBottomLeft.element[0].scrollLeft;
}
return this.scrollBottomRight.element[0].scrollLeft;
},
getRightHorizontalScroll: function () {
var o = this.options;
if (o.isNeedFreeze) {
return this.scrollBottomRight.element[0].scrollLeft;
}
return this.scrollBottomRight.element[0].scrollLeft;
},
getColumns: function () {
var o = this.options;
if (o.isNeedFreeze) {
return {
topLeft: this.topLeftBodyItems,
topRight: this.topRightBodyItems,
bottomLeft: this.bottomLeftBodyItems,
bottomRight: this.bottomRightBodyItems
};
}
return {
header: this.headerItems,
body: this.bodyItems,
footer: this.footerItems
};
},
_empty: function () {
this.scrollBottomRight && this.scrollBottomRight.destroy();
this.topLeft && this.topLeft.destroy();
this.topRight && this.topRight.destroy();
this.bottomLeft && this.bottomLeft.destroy();
this.bottomRight && this.bottomRight.destroy();
},
populate: function (items, header) {
this.options.items = items || [];
if (header) {
this.options.header = header;
}
this._empty();
if (this.options.isNeedFreeze) {
this._createFreezeTable();
} else {
this._createNormalTable();
}
}
})
;
BI.Table.EVENT_TABLE_AFTER_INIT = "EVENT_TABLE_AFTER_INIT";
BI.Table.EVENT_TABLE_RESIZE = "EVENT_TABLE_RESIZE";
BI.Table.EVENT_TABLE_SCROLL = "EVENT_TABLE_SCROLL";
BI.Table.EVENT_TABLE_BEFORE_COLUMN_RESIZE = "EVENT_TABLE_BEFORE_COLUMN_RESIZE";
BI.Table.EVENT_TABLE_COLUMN_RESIZE = "EVENT_TABLE_COLUMN_RESIZE";
BI.Table.EVENT_TABLE_AFTER_COLUMN_RESIZE = "EVENT_TABLE_AFTER_COLUMN_RESIZE";
BI.Table.EVENT_TABLE_BEFORE_REGION_RESIZE = "EVENT_TABLE_BEFORE_REGION_RESIZE";
BI.Table.EVENT_TABLE_REGION_RESIZE = "EVENT_TABLE_REGION_RESIZE";
BI.Table.EVENT_TABLE_AFTER_REGION_RESIZE = "EVENT_TABLE_AFTER_REGION_RESIZE";
BI.shortcut("bi.table_view", BI.Table);