forked from fanruan/fineui
guy
8 years ago
18 changed files with 1475 additions and 72 deletions
@ -0,0 +1,233 @@
|
||||
Demo.Func = BI.inherit(BI.Widget, { |
||||
props: { |
||||
baseCls: "demo-func" |
||||
}, |
||||
|
||||
render: function () { |
||||
var items = [[{ |
||||
text: "第一行第一列" |
||||
}, { |
||||
text: "第一行第二列" |
||||
}, { |
||||
text: "第一行第三列" |
||||
}], [{ |
||||
text: "第二行第一列" |
||||
}, { |
||||
text: "第二行第二列" |
||||
}, { |
||||
text: "第二行第三列" |
||||
}], [{ |
||||
text: "第二行第一列" |
||||
}, { |
||||
text: "第三行第二列" |
||||
}, { |
||||
text: "第三行第三列" |
||||
}], [{ |
||||
text: "第二行第一列" |
||||
}, { |
||||
text: "第四行第二列" |
||||
}, { |
||||
text: "第四行第三列" |
||||
}], [{ |
||||
text: "第五行第一列" |
||||
}, { |
||||
text: "第五行第二列" |
||||
}, { |
||||
text: "第五行第三列" |
||||
}], [{ |
||||
text: "第六行第一列" |
||||
}, { |
||||
text: "第六行第二列" |
||||
}, { |
||||
text: "第六行第三列" |
||||
}], [{ |
||||
text: "第七行第一列" |
||||
}, { |
||||
text: "第七行第二列" |
||||
}, { |
||||
text: "第七行第三列" |
||||
}], [{ |
||||
text: "第八行第一列" |
||||
}, { |
||||
text: "第八行第二列" |
||||
}, { |
||||
text: "第八行第三列" |
||||
}], [{ |
||||
text: "第九行第一列" |
||||
}, { |
||||
text: "第九行第二列" |
||||
}, { |
||||
text: "第九行第三列" |
||||
}], [{ |
||||
text: "第十行第一列" |
||||
}, { |
||||
text: "第十行第二列" |
||||
}, { |
||||
text: "第十行第三列" |
||||
}], [{ |
||||
text: "第十一行第一列" |
||||
}, { |
||||
text: "第十一行第二列" |
||||
}, { |
||||
text: "第十一行第三列" |
||||
}], [{ |
||||
text: "第十二行第一列" |
||||
}, { |
||||
text: "第十二行第二列" |
||||
}, { |
||||
text: "第十二行第三列" |
||||
}], [{ |
||||
text: "第十三行第一列" |
||||
}, { |
||||
text: "第十三行第二列" |
||||
}, { |
||||
text: "第十三行第三列" |
||||
}], [{ |
||||
text: "第十四行第一列" |
||||
}, { |
||||
text: "第十四行第二列" |
||||
}, { |
||||
text: "第十四行第三列" |
||||
}], [{ |
||||
text: "第十五行第一列" |
||||
}, { |
||||
text: "第十五行第二列" |
||||
}, { |
||||
text: "第十五行第三列" |
||||
}], [{ |
||||
text: "第十六行第一列" |
||||
}, { |
||||
text: "第十六行第二列" |
||||
}, { |
||||
text: "第十六行第三列" |
||||
}], [{ |
||||
text: "第十七行第一列" |
||||
}, { |
||||
text: "第十七行第二列" |
||||
}, { |
||||
text: "第十七行第三列" |
||||
}], [{ |
||||
text: "第十八行第一列" |
||||
}, { |
||||
text: "第十八行第二列" |
||||
}, { |
||||
text: "第十八行第三列" |
||||
}]]; |
||||
|
||||
var header = [[{ |
||||
text: "表头1" |
||||
}, { |
||||
text: "表头2" |
||||
}, { |
||||
text: "表头3" |
||||
}]]; |
||||
|
||||
var table1 = BI.createWidget({ |
||||
type: "bi.preview_table", |
||||
columnSize: ["", "", ""], |
||||
header: header, |
||||
items: items |
||||
}); |
||||
var table2 = BI.createWidget({ |
||||
type: "bi.preview_table", |
||||
header: header, |
||||
columnSize: [100, "", 50], |
||||
items: items |
||||
}); |
||||
var table3 = BI.createWidget({ |
||||
type: "bi.preview_table", |
||||
header: header, |
||||
columnSize: [0.2, 0.4, 0.4], |
||||
headerRowSize: 30, |
||||
items: items |
||||
}); |
||||
var table4 = BI.createWidget({ |
||||
type: "bi.preview_table", |
||||
header: header, |
||||
isNeedFreeze: true, |
||||
freezeCols: [0, 1], |
||||
columnSize: [0.2, "", 0.4], |
||||
items: items |
||||
}); |
||||
var table5 = BI.createWidget({ |
||||
type: "bi.preview_table", |
||||
header: header, |
||||
isNeedFreeze: true, |
||||
freezeCols: [0, 1], |
||||
columnSize: [200, 100, ""], |
||||
items: items |
||||
}); |
||||
BI.createWidget({ |
||||
type: "bi.absolute", |
||||
element: this, |
||||
items: [{ |
||||
el: { |
||||
type: "bi.grid", |
||||
columns: 3, |
||||
rows: 2, |
||||
items: [[{ |
||||
el: { |
||||
type: "bi.absolute", |
||||
items: [{ |
||||
el: table1, |
||||
left: 5, |
||||
right: 5, |
||||
top: 5, |
||||
bottom: 5 |
||||
}] |
||||
} |
||||
}, { |
||||
el: { |
||||
type: "bi.absolute", |
||||
items: [{ |
||||
el: table2, |
||||
left: 5, |
||||
right: 5, |
||||
top: 5, |
||||
bottom: 5 |
||||
}] |
||||
} |
||||
}, { |
||||
el: { |
||||
type: "bi.absolute", |
||||
items: [{ |
||||
el: table3, |
||||
left: 5, |
||||
right: 5, |
||||
top: 5, |
||||
bottom: 5 |
||||
}] |
||||
} |
||||
}], [{ |
||||
el: { |
||||
type: "bi.absolute", |
||||
items: [{ |
||||
el: table4, |
||||
left: 5, |
||||
right: 5, |
||||
top: 5, |
||||
bottom: 5 |
||||
}] |
||||
} |
||||
}, { |
||||
el: { |
||||
type: "bi.absolute", |
||||
items: [{ |
||||
el: table5, |
||||
left: 5, |
||||
right: 5, |
||||
top: 5, |
||||
bottom: 5 |
||||
}] |
||||
} |
||||
}]] |
||||
}, |
||||
left: 10, |
||||
right: 10, |
||||
top: 10, |
||||
bottom: 10 |
||||
}] |
||||
}) |
||||
} |
||||
}); |
||||
BI.shortcut("demo.preview_table", Demo.Func); |
@ -0,0 +1,8 @@
|
||||
/****添加计算宽度的--运算符直接需要space****/ |
||||
/****** common color(常用颜色,可用于普遍场景) *****/ |
||||
/**** custom color(自定义颜色,用于特定场景) ****/ |
||||
.bi-responsive-table > div.bottom-left > div > div > table > * > * > td.last-col, |
||||
.bi-responsive-table > div.bottom-right > div > div > table > * > * > td.last-col, |
||||
.bi-responsive-table > div > div > table > * > * > td.last-col { |
||||
min-width: 80px; |
||||
} |
@ -0,0 +1,11 @@
|
||||
@import "../../bibase"; |
||||
|
||||
.bi-responsive-table { |
||||
& > div.bottom-left > div > div > table, & > div.bottom-right > div > div > table, > div > div > table { |
||||
& > * > * > td { |
||||
&.last-col { |
||||
min-width: 80px; |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,363 @@
|
||||
/** |
||||
* 自适应宽度的表格 |
||||
* |
||||
* Created by GUY on 2016/2/3. |
||||
* @class BI.ResponisveTable |
||||
* @extends BI.Widget |
||||
*/ |
||||
BI.ResponisveTable = BI.inherit(BI.Widget, { |
||||
|
||||
_const: { |
||||
perColumnSize: 100 |
||||
}, |
||||
|
||||
_defaultConfig: function () { |
||||
return BI.extend(BI.ResponisveTable.superclass._defaultConfig.apply(this, arguments), { |
||||
baseCls: "bi-responsive-table", |
||||
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: [], //二维数组
|
||||
|
||||
//交叉表头
|
||||
crossHeader: [], |
||||
crossItems: [] |
||||
}); |
||||
}, |
||||
|
||||
_init: function () { |
||||
BI.ResponisveTable.superclass._init.apply(this, arguments); |
||||
var self = this, o = this.options; |
||||
|
||||
this.table = BI.createWidget({ |
||||
type: "bi.table_view", |
||||
element: this, |
||||
|
||||
isNeedFreeze: o.isNeedFreeze, |
||||
freezeCols: o.freezeCols, |
||||
|
||||
isNeedMerge: o.isNeedMerge, |
||||
mergeCols: o.mergeCols, |
||||
mergeRule: o.mergeRule, |
||||
|
||||
columnSize: o.columnSize, |
||||
headerRowSize: o.headerRowSize, |
||||
footerRowSize: o.footerRowSize, |
||||
rowSize: o.rowSize, |
||||
|
||||
regionColumnSize: o.regionColumnSize, |
||||
|
||||
header: o.header, |
||||
footer: o.footer, |
||||
items: o.items, |
||||
//交叉表头
|
||||
crossHeader: o.crossHeader, |
||||
crossItems: o.crossItems |
||||
}); |
||||
this.table.on(BI.Table.EVENT_TABLE_AFTER_INIT, function () { |
||||
self._initRegionSize(); |
||||
self.table.resize(); |
||||
self._resizeHeader(); |
||||
self.fireEvent(BI.Table.EVENT_TABLE_AFTER_INIT, arguments); |
||||
}); |
||||
this.table.on(BI.Table.EVENT_TABLE_RESIZE, function () { |
||||
self._resizeRegion(); |
||||
self._resizeHeader(); |
||||
self.fireEvent(BI.Table.EVENT_TABLE_RESIZE, arguments); |
||||
}); |
||||
this.table.on(BI.Table.EVENT_TABLE_SCROLL, function () { |
||||
self.fireEvent(BI.Table.EVENT_TABLE_SCROLL, arguments); |
||||
}); |
||||
this.table.on(BI.Table.EVENT_TABLE_BEFORE_REGION_RESIZE, function () { |
||||
self.fireEvent(BI.Table.EVENT_TABLE_BEFORE_REGION_RESIZE, arguments); |
||||
}); |
||||
this.table.on(BI.Table.EVENT_TABLE_REGION_RESIZE, function () { |
||||
//important:在冻结并自适应列宽的情况下要随时变更表头宽度
|
||||
if (o.isNeedResize === true && self._isAdaptiveColumn()) { |
||||
self._resizeHeader(); |
||||
} |
||||
self.fireEvent(BI.Table.EVENT_TABLE_REGION_RESIZE, arguments); |
||||
}); |
||||
this.table.on(BI.Table.EVENT_TABLE_AFTER_REGION_RESIZE, function () { |
||||
self._resizeHeader(); |
||||
self.fireEvent(BI.Table.EVENT_TABLE_AFTER_REGION_RESIZE, arguments); |
||||
}); |
||||
|
||||
this.table.on(BI.Table.EVENT_TABLE_BEFORE_COLUMN_RESIZE, function () { |
||||
self._resizeBody(); |
||||
self.fireEvent(BI.Table.EVENT_TABLE_BEFORE_COLUMN_RESIZE, arguments); |
||||
}); |
||||
this.table.on(BI.Table.EVENT_TABLE_COLUMN_RESIZE, function () { |
||||
self.fireEvent(BI.Table.EVENT_TABLE_COLUMN_RESIZE, arguments); |
||||
}); |
||||
this.table.on(BI.Table.EVENT_TABLE_AFTER_COLUMN_RESIZE, function () { |
||||
self._resizeRegion(); |
||||
self._resizeHeader(); |
||||
self.fireEvent(BI.Table.EVENT_TABLE_AFTER_COLUMN_RESIZE, arguments); |
||||
}); |
||||
}, |
||||
|
||||
_initRegionSize: function () { |
||||
var o = this.options; |
||||
if (o.isNeedFreeze === true) { |
||||
var regionColumnSize = this.table.getRegionColumnSize(); |
||||
var maxWidth = this.table.element.width(); |
||||
if (!regionColumnSize[0] || (regionColumnSize[0] === 'fill') || regionColumnSize[0] > maxWidth || regionColumnSize[1] > maxWidth) { |
||||
var freezeCols = o.freezeCols; |
||||
if (freezeCols.length === 0) { |
||||
this.table.setRegionColumnSize([0, "fill"]); |
||||
} else if (freezeCols.length > 0 && freezeCols.length < o.columnSize.length) { |
||||
var size = maxWidth / 3; |
||||
if (freezeCols.length > o.columnSize.length / 2) { |
||||
size = maxWidth * 2 / 3; |
||||
} |
||||
this.table.setRegionColumnSize([size, "fill"]); |
||||
} else { |
||||
this.table.setRegionColumnSize(["fill", 0]); |
||||
} |
||||
} |
||||
} |
||||
}, |
||||
|
||||
_getBlockSize: function () { |
||||
var o = this.options; |
||||
var columnSize = this.table.getCalculateColumnSize(); |
||||
if (o.isNeedFreeze === true) { |
||||
var columnSizeLeft = [], columnSizeRight = []; |
||||
BI.each(columnSize, function (i, size) { |
||||
if (o.freezeCols.contains(i)) { |
||||
columnSizeLeft.push(size); |
||||
} else { |
||||
columnSizeRight.push(size); |
||||
} |
||||
}); |
||||
//因为有边框,所以加上数组长度的参数调整
|
||||
var sumLeft = BI.sum(columnSizeLeft) + columnSizeLeft.length, sumRight = BI.sum(columnSizeRight) + columnSizeRight.length; |
||||
return { |
||||
sumLeft: sumLeft, |
||||
sumRight: sumRight, |
||||
left: columnSizeLeft, |
||||
right: columnSizeRight |
||||
} |
||||
} |
||||
return { |
||||
size: columnSize, |
||||
sum: BI.sum(columnSize) + columnSize.length |
||||
}; |
||||
}, |
||||
|
||||
_isAdaptiveColumn: function (columnSize) { |
||||
return !(BI.last(columnSize || this.table.getColumnSize()) > 1.05); |
||||
}, |
||||
|
||||
_resizeHeader: function () { |
||||
var self = this, o = this.options; |
||||
if (o.isNeedFreeze === true) { |
||||
//若是当前处于自适应调节阶段
|
||||
if (this._isAdaptiveColumn()) { |
||||
var columnSize = this.table.getCalculateColumnSize(); |
||||
this.table.setHeaderColumnSize(columnSize); |
||||
} else { |
||||
var regionColumnSize = this.table.getClientRegionColumnSize(); |
||||
var block = this._getBlockSize(); |
||||
var sumLeft = block.sumLeft, sumRight = block.sumRight; |
||||
var columnSizeLeft = block.left, columnSizeRight = block.right; |
||||
columnSizeLeft[columnSizeLeft.length - 1] += regionColumnSize[0] - sumLeft; |
||||
columnSizeRight[columnSizeRight.length - 1] += regionColumnSize[1] - sumRight; |
||||
|
||||
var newLeft = BI.clone(columnSizeLeft), newRight = BI.clone(columnSizeRight); |
||||
newLeft[newLeft.length - 1] = ""; |
||||
newRight[newRight.length - 1] = ""; |
||||
this.table.setColumnSize(newLeft.concat(newRight)); |
||||
|
||||
block = self._getBlockSize(); |
||||
if (columnSizeLeft[columnSizeLeft.length - 1] < block.left[block.left.length - 1]) { |
||||
columnSizeLeft[columnSizeLeft.length - 1] = block.left[block.left.length - 1] |
||||
} |
||||
if (columnSizeRight[columnSizeRight.length - 1] < block.right[block.right.length - 1]) { |
||||
columnSizeRight[columnSizeRight.length - 1] = block.right[block.right.length - 1] |
||||
} |
||||
|
||||
self.table.setColumnSize(columnSizeLeft.concat(columnSizeRight)); |
||||
} |
||||
} else { |
||||
if (!this._isAdaptiveColumn()) { |
||||
var regionColumnSize = this.table.getClientRegionColumnSize(); |
||||
var block = this._getBlockSize(); |
||||
var sum = block.sum; |
||||
var size = block.size; |
||||
|
||||
size[size.length - 1] += regionColumnSize[0] - sum; |
||||
|
||||
var newSize = BI.clone(size); |
||||
newSize[newSize.length - 1] = ""; |
||||
this.table.setColumnSize(newSize); |
||||
block = this._getBlockSize(); |
||||
|
||||
if (size[size.length - 1] < block.size[block.size.length - 1]) { |
||||
size[size.length - 1] = block.size[block.size.length - 1] |
||||
} |
||||
this.table.setColumnSize(size); |
||||
} |
||||
} |
||||
}, |
||||
|
||||
_resizeBody: function () { |
||||
if (this._isAdaptiveColumn()) { |
||||
var columnSize = this.table.getCalculateColumnSize(); |
||||
this.setColumnSize(columnSize); |
||||
} |
||||
}, |
||||
|
||||
_adjustRegion: function () { |
||||
var o = this.options; |
||||
var regionColumnSize = this.table.getCalculateRegionColumnSize(); |
||||
if (o.isNeedFreeze === true && o.freezeCols.length > 0 && o.freezeCols.length < o.columnSize.length) { |
||||
var block = this._getBlockSize(); |
||||
var sumLeft = block.sumLeft, sumRight = block.sumRight; |
||||
if (sumLeft < regionColumnSize[0] || regionColumnSize[0] >= (sumLeft + sumRight)) { |
||||
this.table.setRegionColumnSize([sumLeft, "fill"]); |
||||
} |
||||
this._resizeRegion(); |
||||
} |
||||
}, |
||||
|
||||
_resizeRegion: function () { |
||||
var o = this.options; |
||||
var regionColumnSize = this.table.getCalculateRegionColumnSize(); |
||||
if (o.isNeedFreeze === true && o.freezeCols.length > 0 && o.freezeCols.length < o.columnSize.length) { |
||||
var maxWidth = this.table.element.width(); |
||||
if (regionColumnSize[0] < 15 || regionColumnSize[1] < 15) { |
||||
var freezeCols = o.freezeCols; |
||||
var size = maxWidth / 3; |
||||
if (freezeCols.length > o.columnSize.length / 2) { |
||||
size = maxWidth * 2 / 3; |
||||
} |
||||
this.table.setRegionColumnSize([size, "fill"]); |
||||
} |
||||
} |
||||
}, |
||||
|
||||
|
||||
resize: function () { |
||||
this.table.resize(); |
||||
this._resizeRegion(); |
||||
this._resizeHeader(); |
||||
}, |
||||
|
||||
setColumnSize: function (columnSize) { |
||||
this.table.setColumnSize(columnSize); |
||||
this._adjustRegion(); |
||||
this._resizeHeader(); |
||||
}, |
||||
|
||||
getColumnSize: function () { |
||||
return this.table.getColumnSize(); |
||||
}, |
||||
|
||||
getCalculateColumnSize: function () { |
||||
return this.table.getCalculateColumnSize(); |
||||
}, |
||||
|
||||
setHeaderColumnSize: function (columnSize) { |
||||
this.table.setHeaderColumnSize(columnSize); |
||||
this._adjustRegion(); |
||||
this._resizeHeader(); |
||||
}, |
||||
|
||||
setRegionColumnSize: function (columnSize) { |
||||
this.table.setRegionColumnSize(columnSize); |
||||
this._resizeHeader(); |
||||
}, |
||||
|
||||
getRegionColumnSize: function () { |
||||
return this.table.getRegionColumnSize(); |
||||
}, |
||||
|
||||
getCalculateRegionColumnSize: function () { |
||||
return this.table.getCalculateRegionColumnSize(); |
||||
}, |
||||
|
||||
getCalculateRegionRowSize: function () { |
||||
return this.table.getCalculateRegionRowSize(); |
||||
}, |
||||
|
||||
getClientRegionColumnSize: function () { |
||||
return this.table.getClientRegionColumnSize(); |
||||
}, |
||||
|
||||
getScrollRegionColumnSize: function () { |
||||
return this.table.getScrollRegionColumnSize(); |
||||
}, |
||||
|
||||
getScrollRegionRowSize: function () { |
||||
return this.table.getScrollRegionRowSize(); |
||||
}, |
||||
|
||||
hasVerticalScroll: function () { |
||||
return this.table.hasVerticalScroll(); |
||||
}, |
||||
|
||||
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(); |
||||
}, |
||||
|
||||
getColumns: function () { |
||||
return this.table.getColumns(); |
||||
}, |
||||
|
||||
attr: function () { |
||||
BI.ResponisveTable.superclass.attr.apply(this, arguments); |
||||
this.table.attr.apply(this.table, arguments); |
||||
}, |
||||
|
||||
populate: function (items) { |
||||
var self = this, o = this.options; |
||||
this.table.populate.apply(this.table, arguments); |
||||
if (o.isNeedFreeze === true) { |
||||
BI.nextTick(function () { |
||||
if (self.element.is(":visible")) { |
||||
self._initRegionSize(); |
||||
self.table.resize(); |
||||
self._resizeHeader(); |
||||
} |
||||
}); |
||||
} |
||||
} |
||||
}); |
||||
BI.shortcut('bi.responsive_table', BI.ResponisveTable); |
Loading…
Reference in new issue