;(function ($) {
/**
* 报表块组件,是组成表单的一种组件
* @class FR.Elementcase
* @extends FR.BaseEditor
*/
FR.Elementcase = FR.extend(FR.BaseEditor, {
_init: function () {
FR.Elementcase.superclass._init.apply(this, arguments);
this.$toolbar = $("<div class='x-toolbar' style='height:21px'></div>");
this.$inner = $("<div class='reportContent'></div>");
//frozen hidden, else auto
this.$inner.css('overflow', 'auto');
/**
* @property {Number} 总页数
*/
this.totalPage = -1;
/**
* @property {Number} 当前页索引
*/
this.currentPage = 1;
var self = this;
this.initPane();
this.gotoPage(1);
this._init4Style();
this._init4Margin();
},
/**
* 初始化报表块样式,包括背景,边框,圆角
* @private
*/
_init4Style: function () {
this._initBackGround();
var border = this.options.border;
if (border) {
this.element.css('border-style', border.type);
this.element.css('border-color', border.color);
this.element.css('border-width', border.width);
}
},
_initBackGround: function () {
//设置控件背景
if (!this.options.widgetBackground) {
return;
}
var alpha = this.options.widgetOpacity;
if(!alpha){
FR.setBackground(this.element, this.options.widgetBackground, this.element.height());
return;
}
//因为有透明度, 如果直接设置opacity属性, 会被子层div继承, 因此平级放一个背景div
this.$background = $("<div class='widgetBackground'></div>");
//IE
this.$background.css('filter', 'alpha(opacity=' + alpha * 100 +')');
//Chrome ff
this.$background.css('opacity', alpha);
FR.setBackground(this.$background, this.options.widgetBackground, this.element.height());
this.$background.prependTo(this.element);
},
/**
* 初始化报表块的内边距
* @private
*/
_init4Margin: function () {
// 考虑显示工具栏
var report ;
for (var i=0; i < this.element.children().length; i++) {
var child = $(this.element.children()[i]);
if (child.attr('class') == 'reportContent') {
report = child;
}
}
if (!report) {
return;
}
if (this.options.marginTop) {
report.css('marginTop', this.options.marginTop);
this.marginHeight = (this.marginHeight || 0) + parseInt(this.options.marginTop);
}
if (this.options.marginLeft) {
report.css('marginLeft', this.options.marginLeft);
this.marginWidth = (this.marginWidth || 0) + parseInt(this.options.marginLeft);
}
if (this.options.marginBottom) {
report.css('marginBottom', this.options.marginBottom);
this.marginHeight = (this.marginHeight || 0) + parseInt(this.options.marginBottom);
}
if (this.options.marginRight) {
report.css('marginRight', this.options.marginRight);
this.marginWidth = (this.marginWidth || 0) + parseInt(this.options.marginRight);
}
},
encodePara : function(para){
if(!para){
return '';
}
//不确定过来的是一个json对象还是一个字符串, 因为可以被自定义调用
if(typeof para === 'string'){
para = FR.jsonDecode(para);
}
$.each(para, function (pName, pValue) {
if (typeof pValue === 'string') {
//如果参数写出abc"efg, 转化为abc\"efg;
para[pName] = encodeURIComponent(FR.cjkDecode(pValue.replaceAll('"', '\\"')));
}
});
return para;
},
/**
* 跳转到指定页(可以用于刷新当前报表块)
* @param {Number} pn 要跳转的页,从1开始
* @param {JSON} para 跳转页面是携带的参数
* @param {Boolean} noCache 不是用缓存,强制取新的数据
*/
gotoPage : function(pn, para, noCache) {
var self = this;
FR.ajax({
url: FR.servletURL,
type: 'POST',
data: {
op: 'fr_form',
cmd: 'load_report_content',
sessionID: this.options.form.sessionID,
widgetName: this.options.widgetName,
__parameters__: FR.encodePara(para),
noCache : noCache || '',
pageIndex: pn,
_: new Date().getTime(),
__boxModel__: $.support.boxModel
},
beforeSend: function () {
self.$inner.__loading_elementcase__(true);
},
async: true,
complete: function (res, status) {
if (status == 'success') {
var items = FR.jsonDecode(res.responseText);
if(items.length === 0){
self.$inner.html(res.responseText);
return;
}
self.totalPage = items['totalPage'] ? items['totalPage'] : 1;
if(self.options.showToolbar){
self.numberLabel.setValue(' /' + self.totalPage);
self.inputField.setValue(pn);
}
self.$inner.html(items['htmlTag']);
//neil: 图表
self.$inner.asComponent({type : "fr_form", selector : 'td[widget]'});
self.currentPage = pn;
self.changeColWidth();
self.changeHeight();
//边框丢了
$('.x-table', self.$inner).css('overflow','visible');
var overflow = $(".frozen-page", self.$inner).length > 0 ? 'hidden' : 'auto';
self.$inner.__loading_elementcase__(false, overflow);
}
}
});
},
isFit : function () {
var form = this.options.form;
return form.options && form.options.__FIT__;
},
changeHeight : function () {
var $frozenPage = $(".frozen-page", this.$inner);
if($frozenPage.length > 0){
var $pageblock = $('.page-block', this.$inner);
var $west = $('.frozen-west', $frozenPage);
var $north = $('.frozen-north', $frozenPage);
var $center = $('.frozen-center', $frozenPage);
var toolBarHeight = $('.x-toolbar').height();
// 报表块内边距为正文div,背景为报表块区域的
var pageHeight = this.options.height - toolBarHeight - (this.marginHeight || 0);
$center.height(pageHeight - $north.height());
$west.height(pageHeight - $north.height());
$pageblock.height(pageHeight + 'px');
$center.scroll(function () {
$north.scrollLeft($center.scrollLeft());
$west.scrollTop($center.scrollTop());
}.createDelegate(this));
}
if(this.$background){
this.$background.css('height', this.options.height);
}
},
changeColWidth : function () {
var $frozenPage = $(".frozen-page", this.$inner);
var $pageblock = $('.page-block', this.$inner);
if($frozenPage.length > 0){
this.doForzen($frozenPage, $pageblock);
}else{
var widgetName = this.options.widgetName;
var array = $('.' + widgetName + 'col');
var table = $('.' + widgetName + 'table');
//如果Table高度比控件大, 说明会出现纵向滚动条, 因此要-20
var width = table.height() > this.options.height ? this.options.width - 20 : this.options.width - 2;
var config = {
array : array,
table : table,
width : width - (this.marginWidth || 0)
}
if(!this.isFit()) {
this.changeTableW(config);
}
$pageblock.width(table.width() + 'px');
}
if(this.$background){
this.$background.css('width', this.options.width);
}
},
doForzen : function ($frozenPage, $pageblock) {
//屏蔽掉自身的滚动条, 用冻结div的
this.$inner.css('overflow', 'hidden');
var oldTotal = $frozenPage.width();
var $corner = $('.frozen-corner', $frozenPage);
var $west = $('.frozen-west', $frozenPage);
var $north = $('.frozen-north', $frozenPage);
var $center = $('.frozen-center', $frozenPage);
var allTable = {
cornerTable : $('.x-table', $corner),
westTable : $('.x-table', $west),
northTable : $('.x-table', $north),
centerTable : $('.x-table', $center)
}
if(!this.isFit()) {
this.changeFrozenTable(allTable, oldTotal);
}
var westTableWidth = $('.x-table', $west).width();
var newWidth = this.options.width - westTableWidth - (this.marginWidth || 0);
$corner.width(westTableWidth);
$west.width(westTableWidth);
$center.width(newWidth);
$north.width(newWidth);
},
changeFrozenTable : function(allTable, oldTotal){
var cornerTable = allTable.cornerTable;
var westTable = allTable.westTable;
var northTable = allTable.northTable;
var centerTable = allTable.centerTable;
//只算一边, 另一边再算会出现误差, 直接减出来
var leftWidth = (westTable.width() / oldTotal) * this.options.width;
var scrollWidth = 20;
var rightWidth = this.options.width - leftWidth - scrollWidth - (this.marginWidth || 0);
var cornerCols = $('col', cornerTable);
var westCols = $('col', westTable);
var northCols = $('col', northTable);
var centerCols = $('col', centerTable);
var startColumn = this.getCornerStartColumn(centerCols, northCols);
var cornerConfig = {
array : cornerCols,
table : cornerTable,
width : leftWidth,
start : 0
}
var westConfig = {
array : westCols,
table : westTable,
width : leftWidth,
start : 0
}
var northConfig = {
array : northCols,
table : northTable,
width : rightWidth,
start : startColumn
}
var centerConfig = {
array : centerCols,
table : centerTable,
width : rightWidth,
start : startColumn
}
this.changeTableW(cornerConfig);
this.changeTableW(westConfig);
this.changeTableW(northConfig);
this.changeTableW(centerConfig);
},
getCornerStartColumn : function(centerCols, northCols){
if(centerCols.length > 0){
//取第一列的col值, 因为前面可能有隐藏列,取length不准
return parseInt($(centerCols[0]).attr('col'));
}
return Math.max(centerCols.length, northCols.length);
},
changeTableW : function(config) {
var array = config.array;
var table = config.table;
var totalWidth = config.width;
if(array.length === 0 || table.length === 0){
return;
}
var oldWidth = table.width();
var scale = totalWidth / oldWidth;
var delta = 0;
for(var i = 0; i < array.length; i++){
var currentCol = $(array[i]);
var oldColWidth = currentCol.width();
var calRes = this.calNewWidth(currentCol, delta, scale);
var newWidth = calRes.newWidth;
delta = calRes.delta;
currentCol.width(newWidth + 'px');
this.calCellFrozenTableWidth(i, config.start, table, newWidth, oldColWidth, scale);
}
table.width(totalWidth + 'px')
},
calCellFrozenTableWidth : function (i, start, table, newWidth, oldColWidth, scale){
//冻结的话, 需要把每一列的冻结格子的table都拉宽, 不然居中居左无效.
if(parseInt(start) >= 0){
var colClsName = 'table.col'+(i + parseInt(start));
var $currentCellFrozenTable = $(colClsName, table);
var len = $currentCellFrozenTable.length;
if(len === 0){
return;
}
if($($currentCellFrozenTable[i]).width() === 0){
//隐藏列跳过
this.calCellFrozenTableWidth(i, ++start, table, newWidth, oldColWidth, scale);
return;
}
for(var i = 0; i < len; i++){
var _tempWidth = newWidth;
//当前格子是合并单元格, 直接拉伸处理
if($($currentCellFrozenTable[i]).width() > oldColWidth){
_tempWidth = ( $($currentCellFrozenTable[i]).width() + 5 ) * scale;
}
//左右padding+边框
$($currentCellFrozenTable[i]).width((_tempWidth - 5) + 'px');
}
}
},
calNewWidth : function (currentCol, delta, scale) {
var currentWidth = currentCol.width();
var minWidth = parseInt(currentCol.css('min-width'));
//缩放后的大小
var scaleWidth = currentWidth * scale;
//缩放后, 并减去负债后的大小
var deltaWidth = scaleWidth - delta;
var newWidth = 0;
if(minWidth <= deltaWidth){
//当前格子还得起, 那么就把债务清空
newWidth = deltaWidth;
delta = 0;
}else{
//如果当前格子本身不欠债, 但还不了债, 那么就把债务顺延, 并减轻部分债务
if(minWidth <= scaleWidth){
delta -= (scaleWidth - minWidth)
}else{
//不仅还不起, 本身还欠, 那么把债务累加, 传递给下个格子
delta = minWidth - scaleWidth;
}
newWidth = minWidth;
}
var result = {
newWidth : newWidth,
delta : delta
}
return result;
},
initToolbar : function () {
var self = this;
var prevBtn = new FR.Button({
icon: "css:x-emb-formpre",
width: 25,
height:20,
render:false,
renderEl:$('<div/>').appendTo($('<div style="float:left;"></div>').appendTo(self.$toolbar)),
handler:function () {
if(self.currentPage - 1 > 0){
self.gotoPage(self.currentPage - 1);
self.currentPage--;
}
}
});
self.inputField = new FR.NumberEditor({
renderEl:$('<div/>').appendTo($('<div style="float:left;padding-left:2px;"></div>').appendTo(self.$toolbar)),
width:30,
height:20,
allowDecimals: true,
allowNegative: true,
style:"text-align:center"
});
self.inputField.on(FR.Events.AFTEREDIT, function (e) {
if(e.keyCode == FR.keyCode.ENTER){
self.gotoPage(this.getValue());
}
});
self.numberLabel = new FR.Label({
renderEl:$('<div/>').appendTo($('<div style="float:left;padding-left:2px;"></div>').appendTo(self.$toolbar)),
width : 38,
height : 20
});
var nextBtn = new FR.Button({
icon: "css:x-emb-formnext",
width:25,
height:20,
render:false,
renderEl:$('<div/>').appendTo($('<div style="float:left;"></div>').appendTo(self.$toolbar)),
handler:function () {
if(self.currentPage + 1 <= self.totalPage){
self.gotoPage(self.currentPage + 1);
self.currentPage++;
}
}
});
},
initPane : function(){
var self = this;
var items = [];
if(self.options.showToolbar){
self.initToolbar();
items.push({
region: 'north',
el: self.$toolbar
});
}
items.push({
region: 'center',
el: self.$inner
});
var borderLayout = new FR.BorderLayout({
items: items,
renderEl: self.element
});
borderLayout.doLayout();
$(window).resize(function() {
borderLayout.doLayout();
});
},
doResize : function(give){
if (!FR.Browser.isIE8Before() && this.options.border) {
this.element.parent().css('box-shadow', this.options.border.borderStyle);
}
var newWidth = give.width;
if(give.width && give.width != this.options.width){
this.options.width = give.width;
this.changeColWidth();
}
if(give.height && give.height != this.options.height){
this.options.height = give.height;
this.changeHeight();
}
}
});
$.shortcut("elementcase", FR.Elementcase);
})(jQuery);