;(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);